From cbad88dfb26c55f00bd82aa5aac8f6a98b40f7a7 Mon Sep 17 00:00:00 2001 From: Felix Wolf <60103963+Felalolf@users.noreply.github.com> Date: Mon, 3 Oct 2022 17:57:24 +0200 Subject: [PATCH 001/296] Use let expressions in encoding to reduce redundancy (#535) * added some let expressions in the encoding * Update src/main/scala/viper/gobra/translator/util/ViperUtil.scala --- .../gobra/translator/context/Context.scala | 2 + .../encodings/combinators/TypeEncoding.scala | 16 ++++++ .../structs/SharedStructComponent.scala | 18 +++++-- .../encodings/structs/StructEncoding.scala | 45 +++++++++++------ .../typeless/AssertionEncoding.scala | 2 +- .../library/outlines/OutlinesImpl.scala | 5 +- .../gobra/translator/util/ViperUtil.scala | 49 +++++++++++++++++++ .../gobra/translator/util/ViperWriter.scala | 39 +++++++++++---- 8 files changed, 144 insertions(+), 32 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/context/Context.scala b/src/main/scala/viper/gobra/translator/context/Context.scala index 8486924e3..202c7d710 100644 --- a/src/main/scala/viper/gobra/translator/context/Context.scala +++ b/src/main/scala/viper/gobra/translator/context/Context.scala @@ -95,6 +95,8 @@ trait Context { def reference(x: in.Location): CodeWriter[vpr.Exp] = typeEncoding.reference(this)(x) + def value(x: in.Expr): CodeWriter[vpr.Exp] = typeEncoding.value(this)(x) + def footprint(x: in.Location, perm: in.Expr): CodeWriter[vpr.Exp] = typeEncoding.addressFootprint(this)(x, perm) def isComparable(x: in.Expr): Either[Boolean, CodeWriter[vpr.Exp]] = typeEncoding.isComparable(this)(x) diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala index ede5d7669..32ecd72d1 100644 --- a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala @@ -272,6 +272,22 @@ trait TypeEncoding extends Generator { unit(vprExpr) } + /** + * Encodes an expression such that substitution is possible. + * For an expression `e` and a context `K`, the encoding of K[e] is semantically equal to K[x] with x := Value[e]. + * + * Value[ e: T° ] = [e] + * Value[ loc: T@ ] = R[loc] + * + * */ + final def value(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = { + val liftedResult: in.Expr => Option[CodeWriter[vpr.Exp]] = { + case (l: in.Location) :: _ / Shared => reference(ctx).lift(l) + case e => finalExpression(ctx).lift(e) + } + liftedResult.unlift + } + /** * Encodes the permissions for all addresses of a shared type, * i.e. all permissions involved in converting the shared location to an exclusive r-value. diff --git a/src/main/scala/viper/gobra/translator/encodings/structs/SharedStructComponent.scala b/src/main/scala/viper/gobra/translator/encodings/structs/SharedStructComponent.scala index 58f41447f..7d7e9a7ea 100644 --- a/src/main/scala/viper/gobra/translator/encodings/structs/SharedStructComponent.scala +++ b/src/main/scala/viper/gobra/translator/encodings/structs/SharedStructComponent.scala @@ -37,8 +37,13 @@ trait SharedStructComponent extends Generator { loc match { case _ :: ctx.Struct(fs) / Shared => val vti = cptParam(fs)(ctx) - val locFAs = fs.map(f => in.FieldRef(loc, f)(loc.info)) - sequence(locFAs.map(fa => ctx.expression(fa))).map(ex.create(_, vti)(loc)(ctx)) + pure( + for { + x <- bind(loc)(ctx) + locFAs = fs.map(f => in.FieldRef(x, f)(loc.info)) + args <- sequence(locFAs.map(fa => ctx.expression(fa))) + } yield ex.create(args, vti)(loc)(ctx) + )(ctx) case _ :: t => Violation.violation(s"expected struct, but got $t") } @@ -56,8 +61,13 @@ trait SharedStructComponent extends Generator { loc match { case _ :: ctx.Struct(fs) / Shared => val (pos, info, errT) = loc.vprMeta - val locFAs = fs.map(f => in.FieldRef(loc, f)(loc.info)) - sequence(locFAs.map(fa => ctx.footprint(fa, perm))).map(VU.bigAnd(_)(pos, info, errT)) + pure( + for { + x <- bind(loc)(ctx) + locFAs = fs.map(f => in.FieldRef(x, f)(loc.info)) + parts <- sequence(locFAs.map(fa => ctx.footprint(fa, perm))) + } yield VU.bigAnd(parts)(pos, info, errT) + )(ctx) case _ :: t => Violation.violation(s"expected struct, but got $t") } diff --git a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala index 180661fb1..c4ad369c6 100644 --- a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala @@ -76,7 +76,10 @@ class StructEncoding extends TypeEncoding { */ override def initialization(ctx: Context): in.Location ==> CodeWriter[vpr.Stmt] = { case l :: ctx.Struct(fs) => - seqns(fieldAccesses(l, fs).map(x => ctx.initialization(x))) + for { + x <- bind(l)(ctx) + res <- seqns(fieldAccesses(x, fs).map(x => ctx.initialization(x))) + } yield res } /** @@ -102,9 +105,13 @@ class StructEncoding extends TypeEncoding { ctx.assignment(in.Assignee(fa.recv), in.StructUpdate(fa.recv, fa.field, rhs)(src.info))(src) case (in.Assignee(lhs :: ctx.Struct(lhsFs) / Shared), rhs :: ctx.Struct(rhsFs), src) => - val lhsFAs = fieldAccesses(lhs, lhsFs).map(in.Assignee.Field) - val rhsFAs = fieldAccesses(rhs, rhsFs) - seqns((lhsFAs zip rhsFAs).map{ case (lhsFA, rhsFA) => ctx.assignment(lhsFA, rhsFA)(src) }) + for { + x <- bind(lhs)(ctx) + y <- bind(rhs)(ctx) + lhsFAs = fieldAccesses(x, lhsFs).map(in.Assignee.Field) + rhsFAs = fieldAccesses(y, rhsFs) + res <- seqns((lhsFAs zip rhsFAs).map { case (lhsFA, rhsFA) => ctx.assignment(lhsFA, rhsFA)(src) }) + } yield res } /** @@ -125,11 +132,16 @@ class StructEncoding extends TypeEncoding { */ override def equal(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = { case (lhs :: ctx.Struct(lhsFs), rhs :: ctx.Struct(rhsFs), src) => - val lhsFAccs = fieldAccesses(lhs, lhsFs) - val rhsFAccs = fieldAccesses(rhs, rhsFs) - val equalFields = sequence((lhsFAccs zip rhsFAccs).map{ case (lhsFA, rhsFA) => ctx.equal(lhsFA, rhsFA)(src) }) val (pos, info, errT) = src.vprMeta - equalFields.map(VU.bigAnd(_)(pos, info, errT)) + pure( + for { + x <- bind(lhs)(ctx) + y <- bind(rhs)(ctx) + lhsFAccs = fieldAccesses(x, lhsFs) + rhsFAccs = fieldAccesses(y, rhsFs) + equalFields <- sequence((lhsFAccs zip rhsFAccs).map { case (lhsFA, rhsFA) => ctx.equal(lhsFA, rhsFA)(src) }) + } yield VU.bigAnd(equalFields)(pos, info, errT) + )(ctx) case (lhs :: ctx.*(ctx.Struct(lhsFs)) / Exclusive, rhs :: ctx.*(ctx.Struct(_)), src) => if (lhsFs.isEmpty) { @@ -221,13 +233,16 @@ class StructEncoding extends TypeEncoding { super.isComparable(ctx)(exp).map{ _ => // if executed, then for all fields f, isComb[exp.f] != Left(false) val (pos, info, errT) = exp.vprMeta - // fields that are not ghost and with dynamic comparability - val fsAccs = fieldAccesses(exp, fs.filter(f => !f.ghost)) - val fsComp = fsAccs map ctx.isComparable - // Left(true) can be removed. - for { - args <- sequence(fsComp collect { case Right(e) => e }) - } yield VU.bigAnd(args)(pos, info, errT) + pure( + for { + x <- bind(exp)(ctx) + // fields that are not ghost and with dynamic comparability + fsAccs = fieldAccesses(x, fs.filter(f => !f.ghost)) + fsComp = fsAccs map ctx.isComparable + // Left(true) can be removed. + args <- sequence(fsComp collect { case Right(e) => e }) + } yield VU.bigAnd(args)(pos, info, errT) + )(ctx) } } diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala index 448dc0fbc..d2fdec5b9 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala @@ -67,7 +67,7 @@ class AssertionEncoding extends Encoding { val (pos, info, errT) = n.vprMeta for { newTriggers <- sequence(triggers map (trigger(_)(ctx))) - newBody <- ctx.assertion(body) + newBody <- pure(ctx.assertion(body))(ctx) newForall = vpr.Forall(newVars, newTriggers, newBody)(pos, info, errT) desugaredForall = vpr.utility.QuantifiedPermissions.desugarSourceQuantifiedPermissionSyntax(newForall) triggeredForall = desugaredForall.map(_.autoTrigger) diff --git a/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala b/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala index fa3e6cfac..d19f1117a 100644 --- a/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala +++ b/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala @@ -7,12 +7,11 @@ package viper.gobra.translator.library.outlines import viper.gobra.translator.util.ViperUtil -import viper.silver.ast.Member import viper.silver.{ast => vpr} class OutlinesImpl extends Outlines { - override def finalize(addMemberFn: Member => Unit): Unit = { + override def finalize(addMemberFn: vpr.Member => Unit): Unit = { generatedMembers foreach addMemberFn } private var generatedMembers: List[vpr.Member] = List.empty @@ -62,7 +61,7 @@ class OutlinesImpl extends Outlines { )(pos : vpr.Position, info : vpr.Info, errT : vpr.ErrorTrafo) : vpr.Stmt = { val (arguments, results) = { - val bodyFree = body.undeclLocalVars.toSet + val bodyFree = ViperUtil.undeclLocalVarsGobraCopy(body).toSet val preFree = pres .map(e => vpr.utility.Expressions.freeVariables(e).collect{ case x: vpr.LocalVar => x }) .foldLeft(Set.empty[vpr.LocalVar]){ case (l,r) => l ++ r } diff --git a/src/main/scala/viper/gobra/translator/util/ViperUtil.scala b/src/main/scala/viper/gobra/translator/util/ViperUtil.scala index 42441b9df..447f891e3 100644 --- a/src/main/scala/viper/gobra/translator/util/ViperUtil.scala +++ b/src/main/scala/viper/gobra/translator/util/ViperUtil.scala @@ -46,4 +46,53 @@ object ViperUtil { case _ => Violation.violation(s"expected vpr variable or field access, but got $left") } } + + /** + * TODO: should be removed once the corresponding silver function is fixed, see /silver/issues/610. + * + * Returns a list of all undeclared local variables used in this statement. + * If the same local variable is used with different + * types, an exception is thrown. + */ + def undeclLocalVarsGobraCopy(s: Stmt): Seq[LocalVar] = { + def extractLocal(n: Node, decls: Seq[LocalVarDecl]) = + n match { + case l: LocalVar => decls.find(_.name == l.name) match { + case None => List(l) + case Some(d) if d.typ != l.typ => + sys.error(s"Local variable ${l.name} is declared with type ${d.typ} but used with type ${l.typ}.") + case _ => Nil + } + case _ => Nil + } + + def combineLists(s1: Seq[LocalVar], s2: Seq[LocalVar]) = { + for (l1 <- s1; l2 <- s2) { + if (l1.name == l2.name && l1.typ != l2.typ) { + sys.error(s"Local variable ${l1.name} is used with different types ${l1.typ} and ${l2.typ}.") + } + } + (s1 ++ s2).distinct + } + + def addDecls(n: Node, decls: Seq[LocalVarDecl]) = n match { + case QuantifiedExp(variables, _) => + // add quantified variables + decls ++ variables + case Seqn(_, scoped) => + // add variables defined in scope + decls ++ scoped.collect { case variable: LocalVarDecl => variable } + case Let(variable, _, _) => + // add defined variable + decls ++ Seq(variable) + case _ => + decls + } + + def combineResults(n: Node, decls: Seq[LocalVarDecl], locals: Seq[Seq[LocalVar]]) = { + locals.fold(extractLocal(n, decls))(combineLists) + } + + s.reduceWithContext(Nil, addDecls, combineResults) + } } diff --git a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala index d874cc7c5..de0f8bc67 100644 --- a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala +++ b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala @@ -8,6 +8,7 @@ package viper.gobra.translator.util import viper.gobra.reporting.BackTranslator.{ErrorTransformer, ReasonTransformer, RichErrorMessage} import viper.silver.{ast => vpr} +import viper.gobra.ast.{internal => in} import viper.gobra.reporting.{DefaultErrorBackTranslator, Source, VerificationError} import viper.gobra.translator.context.Context import viper.gobra.translator.util.{ViperUtil => vu} @@ -366,6 +367,35 @@ object ViperWriter { def bind(lhs: vpr.LocalVar, rhs: vpr.Exp): Writer[Unit] = create(Vector(Binding(lhs, rhs)), ()) + /** + * Can be used in expressions. + * When using this method in the encoding of expressions, + * make sure to use [[pure]] to avoid that the generated let bindings leave the context. + * */ + def bind(r: vpr.Exp)(ctx: Context): CodeWriter[vpr.LocalVar] = { + val z = vpr.LocalVar(ctx.freshNames.next(), r.typ)(r.pos, r.info, r.errT) + for { + _ <- local(vu.toVarDecl(z)) + _ <- bind(z, r) + } yield z + } + + /** + * Can be used in expressions. + * When using this method in the encoding of expressions, + * make sure to use [[pure]] to avoid that the generated let bindings leave the context. + * */ + def bind(e: in.Expr)(ctx: Context): CodeWriter[in.LocalVar] = { + val src = e.info + val z = in.LocalVar(ctx.freshNames.next(), e.typ)(src) + val vprZ = ctx.variable(z) + for { + rhs <- ctx.value(e) + _ <- local(vprZ) + _ <- bind(vprZ.localVar, rhs) + } yield z + } + /* Can be used in expressions. */ def assert(cond: vpr.Exp, exp: vpr.Exp, reasonT: (Source.Verifier.Info, ErrorReason) => VerificationError)(ctx: Context): Writer[vpr.Exp] = { // In the future, this might do something more sophisticated @@ -440,15 +470,6 @@ object ViperWriter { /* Collects data. */ def collect(collectibles: Collectible*): Writer[Unit] = create(collectibles.toVector, ()) - - /* Can be used in expressions. */ - def copyResult(r: vpr.Exp)(ctx: Context): CodeWriter[vpr.LocalVar] = { - val z = vpr.LocalVar(ctx.freshNames.next(), r.typ)(r.pos, r.info, r.errT) - for { - _ <- local(vu.toVarDecl(z)) - _ <- bind(z, r) - } yield z - } } type CodeWriter[+R] = CodeLevel.Writer[R] From a1c35a1e28437dd973d231367c590775a2d9fee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Tue, 4 Oct 2022 10:06:14 +0200 Subject: [PATCH 002/296] Fixes conversion to interfaces and interfaces in struct literals (#537) * Add bug witness * Add fix * Add comment * Add extra test * Simplify client3 --- .../viper/gobra/ast/internal/Program.scala | 5 ++++ .../scala/viper/gobra/frontend/Desugar.scala | 23 +++++++++++------ .../features/structs/literals2.gobra | 25 +++++++++++++++++++ 3 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 src/test/resources/regressions/features/structs/literals2.gobra diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index 879334392..2ef54b7bd 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -1063,6 +1063,11 @@ case class ShiftRight(left: Expr, right: Expr)(val info: Source.Parser.Info) ext } case class BitNeg(op: Expr)(val info: Source.Parser.Info) extends IntOperation +/* + * Convert 'expr' to non-interface type 'newType'. If 'newType' is + * an interface type, then 'ToInterface' should be used instead. + */ + // TODO: maybe unify with ToInterface at some point case class Conversion(newType: Type, expr: Expr)(val info: Source.Parser.Info) extends Expr { override def typ: Type = newType } diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 2f7e4a07d..16bc3297e 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -2541,6 +2541,11 @@ object Desugar { conv: in.EffectfulConversion = in.EffectfulConversion(target, resT, dArg)(src) _ <- write(conv) } yield target + case (t: InterfaceT, _) => + for { + exp <- exprD(ctx, info)(arg) + tD = typeD(t, exp.typ.addressability)(src) + } yield in.ToInterface(exp, tD)(exp.info) case _ => val desugaredTyp = typeD(typType, info.addressability(expr))(src) for { expr <- exprD(ctx, info)(arg) } yield in.Conversion(desugaredTyp, expr)(src) @@ -2728,10 +2733,13 @@ object Desugar { if (lit.elems.exists(_.key.isEmpty)) { // all elements are not keyed - val wArgs = fields.zip(lit.elems).map { case (f, PKeyedElement(_, exp)) => exp match { - case PExpCompositeVal(ev) => exprD(ctx, info)(ev) - case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f.typ) - }} + val wArgs = fields.zip(lit.elems).map { case (f, PKeyedElement(_, exp)) => + val wv = exp match { + case PExpCompositeVal(ev) => exprD(ctx, info)(ev) + case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f.typ) + } + wv.map{ v => implicitConversion(v.typ, f.typ, v) } + } for { args <- sequence(wArgs) @@ -2744,10 +2752,11 @@ object Desugar { val vMap = lit.elems.map { case PKeyedElement(Some(PIdentifierKey(key)), exp) => val f = fMap(key.name) - exp match { - case PExpCompositeVal(ev) => f -> exprD(ctx, info)(ev) - case PLitCompositeVal(lv) => f -> literalValD(ctx, info)(lv, f.typ) + val wv = exp match { + case PExpCompositeVal(ev) => exprD(ctx, info)(ev) + case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f.typ) } + f -> wv.map{ v => implicitConversion(v.typ, f.typ, v) } case _ => Violation.violation("expected identifier as a key") }.toMap diff --git a/src/test/resources/regressions/features/structs/literals2.gobra b/src/test/resources/regressions/features/structs/literals2.gobra new file mode 100644 index 000000000..ee8d26a3d --- /dev/null +++ b/src/test/resources/regressions/features/structs/literals2.gobra @@ -0,0 +1,25 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type Element struct { + Next *Element + Value any +} + +func client1() { + e := &Element{Value: interface{}(1)} +} + +func client2() { + e := &Element{Value: 1} +} + +type T interface { m() int } +type X struct{} +func (x X) m() int + +func client3() { + T(X{}).m() +} \ No newline at end of file From d679a34807864706176d2892be08460fffd87f94 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 4 Oct 2022 15:51:41 +0200 Subject: [PATCH 003/296] writes gobrafied input files to disk if is enabled --- .gitignore | 1 + src/main/scala/viper/gobra/frontend/Parser.scala | 4 ++++ src/main/scala/viper/gobra/reporting/Reporter.scala | 1 + 3 files changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index cc684a669..c82d49c83 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ tmp/ sync/ logger.log +.DS_Store *.go.* *.gobra.* diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 43b3b2227..b02a7b327 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -44,6 +44,10 @@ object Parser { def parse(input: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean = false)(config: Config): Either[Vector[VerifierError], PPackage] = { val sources = input .map(Gobrafier.gobrafy) + .map(s => { + config.reporter report PreprocessedInputMessage(s.name, () => s.content) + s + }) for { parseAst <- parseSources(sources, pkgInfo, specOnly)(config) postprocessedAst <- new ImportPostprocessor(parseAst.positions.positions).postprocess(parseAst)(config) diff --git a/src/main/scala/viper/gobra/reporting/Reporter.scala b/src/main/scala/viper/gobra/reporting/Reporter.scala index ca66179a5..b296b74ca 100644 --- a/src/main/scala/viper/gobra/reporting/Reporter.scala +++ b/src/main/scala/viper/gobra/reporting/Reporter.scala @@ -47,6 +47,7 @@ case class FileWriterReporter(name: String = "filewriter_reporter", Logger(LoggerFactory.getLogger(getClass.getName)) override def report(msg: GobraMessage): Unit = msg match { + case PreprocessedInputMessage(input, content) if unparse => write(input, "gobrafied", content()) case ParsedInputMessage(input, program) if unparse => write(input, "unparsed", program().formatted) case TypeCheckSuccessMessage(inputs, _, _, _, erasedGhostCode, goifiedGhostCode) => if (eraseGhost) write(inputs, "ghostLess", erasedGhostCode()) From 0ca0a700ae9bb359d392debc3c416c330c63e5b0 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 4 Oct 2022 16:05:45 +0200 Subject: [PATCH 004/296] adds CI to updated ViperServer submodule --- .github/workflows/update-submodules.yml | 59 +++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .github/workflows/update-submodules.yml diff --git a/.github/workflows/update-submodules.yml b/.github/workflows/update-submodules.yml new file mode 100644 index 000000000..9493f4aec --- /dev/null +++ b/.github/workflows/update-submodules.yml @@ -0,0 +1,59 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# Copyright (c) 2011-2022 ETH Zurich. + +name: Update Submodules + +on: + workflow_dispatch: # allow to manually trigger this workflow + schedule: + - cron: '0 6 1 * *' # run on the first day of each month at 06:00 UTC + +jobs: + # Update the submodules and create a PR if there are any changes + update: + runs-on: ubuntu-latest + steps: + - name: Check out the repo + uses: actions/checkout@v2 + with: + submodules: true + + - name: Get current commits + run: | + echo "PREV_VIPERSERVER_REF=$(git -C viperserver rev-parse HEAD)" >> $GITHUB_ENV + + - name: Update ViperServer submodule + run: git checkout master && git pull + working-directory: viperserver + + - name: Get new commits + run: | + echo "CUR_VIPERSERVER_REF=$(git -C viperserver rev-parse HEAD)" >> $GITHUB_ENV + + - name: Open a pull request + id: pr + uses: peter-evans/create-pull-request@v3 + if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF + with: + # Use viper-admin's token to workaround a restriction of GitHub. + # See: https://github.com/peter-evans/create-pull-request/issues/48 + token: ${{ secrets.VIPER_ADMIN_TOKEN }} + commit-message: Updates submodules + title: Update Submodules + branch: auto-update-submodules + delete-branch: true + labels: | + automated pr + body: | + * Updates ViperServer from `${{ env.PREV_VIPERSERVER_REF }}` to `${{ env.CUR_VIPERSERVER_REF }}`. + + - name: Enable auto-merge of PR + uses: peter-evans/create-or-update-comment@v2 + if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF + with: + token: ${{ secrets.VIPER_ADMIN_TOKEN }} + issue-number: ${{ steps.pr.outputs.pull-request-number }} + body: bors merge From 8893eabc4fb8be86691a1e6f04230a13c83d62f7 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 4 Oct 2022 16:45:11 +0200 Subject: [PATCH 005/296] adds an option for disabling global variables --- .../scala/viper/gobra/frontend/Config.scala | 13 +++++ .../implementation/typing/ImportTyping.scala | 10 +++- .../implementation/typing/MemberTyping.scala | 28 +++++---- .../implementation/typing/ProgramTyping.scala | 50 ++++++++-------- .../globals/globals-disabled-fail01.gobra | 58 +++++++++++++++++++ 5 files changed, 121 insertions(+), 38 deletions(-) create mode 100644 src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 118f9a1ec..11584b430 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -62,6 +62,7 @@ object ConfigDefaults { lazy val DefaultAssumeInjectivityOnInhale: Boolean = true lazy val DefaultParallelizeBranches: Boolean = false lazy val DefaultDisableMoreCompleteExhale: Boolean = false + lazy val DefaultDisableGlobalVars: Boolean = false } case class Config( @@ -109,6 +110,7 @@ case class Config( // branches will be verified in parallel parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, + disableGlobalVars: Boolean = ConfigDefaults.DefaultDisableGlobalVars, ) { def merge(other: Config): Config = { @@ -150,6 +152,7 @@ case class Config( assumeInjectivityOnInhale = assumeInjectivityOnInhale || other.assumeInjectivityOnInhale, parallelizeBranches = parallelizeBranches, disableMoreCompleteExhale = disableMoreCompleteExhale, + disableGlobalVars = disableGlobalVars || other.disableGlobalVars, ) } @@ -192,6 +195,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector assumeInjectivityOnInhale: Boolean = ConfigDefaults.DefaultAssumeInjectivityOnInhale, parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, + disableGlobalVars: Boolean = ConfigDefaults.DefaultDisableGlobalVars, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -242,6 +246,7 @@ trait RawConfig { assumeInjectivityOnInhale = baseConfig.assumeInjectivityOnInhale, parallelizeBranches = baseConfig.parallelizeBranches, disableMoreCompleteExhale = baseConfig.disableMoreCompleteExhale, + disableGlobalVars = baseConfig.disableGlobalVars, ) } @@ -583,6 +588,13 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) + val disableGlobalVars: ScallopOption[Boolean] = opt[Boolean]( + name = "disableGlobalVars", + descr = "Disables the support for global variables and thus does not require that the sources of all transitively included packages can be located by Gobra.", + default = Some(ConfigDefaults.DefaultDisableGlobalVars), + noshort = true, + ) + /** * Exception handling */ @@ -715,5 +727,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals assumeInjectivityOnInhale = assumeInjectivityOnInhale(), parallelizeBranches = parallelizeBranches(), disableMoreCompleteExhale = disableMoreCompleteExhale(), + disableGlobalVars = disableGlobalVars(), ) } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala index 57c45ed75..3b2acdcd8 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala @@ -14,13 +14,17 @@ import viper.gobra.frontend.info.implementation.TypeInfoImpl trait ImportTyping extends BaseTyping { this: TypeInfoImpl => lazy val wellDefImport: WellDefinedness[PImport] = createWellDef { imp => - forceNonLazyImport(imp.importPath, imp) - imp match { + (if (config.disableGlobalVars) { + imp.importPres.flatMap(importPre => message(importPre, s"Support for global variables has been disabled but an import precondition has been found")) + } else { + forceNonLazyImport(imp.importPath, imp) + noMessages + }) ++ (imp match { case _: PExplicitQualifiedImport => noMessages case _: PUnqualifiedImport => noMessages // this case should never occur as these nodes should get converted in the parse postprocessing step case n: PImplicitQualifiedImport => message(n, s"Explicit qualifier could not be derived") - } + }) } // This method forces a package to be processed non-lazily - every import can cause side effects, diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala index 13c051b43..6adeb5d9e 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala @@ -26,19 +26,23 @@ trait MemberTyping extends BaseTyping { this: TypeInfoImpl => case b: PConstDecl => b.specs.flatMap(wellDefConstSpec) case g: PVarDecl if isGlobalVarDeclaration(g) => - // HACK: without this explicit check, Gobra does not find repeated declarations - // of global variables. This has to do with the changes introduced in PR #186. - // We need this check nonetheless because the checks performed in the "true" branch - // assume that the ids are well-defined. - val idsOkMsgs = g.left.flatMap(l => wellDefID(l).out) - if (idsOkMsgs.isEmpty) { - val isGhost = isEnclosingGhost(g) - g.right.flatMap(isExpr(_).out) ++ - declarableTo.errors(g.right map exprType, g.typ map typeSymbType, g.left map idType)(g) ++ - error(g, s"Currently, global variables cannot be made ghost", isGhost) ++ - acyclicGlobalDeclaration.errors(g)(g) + if (config.disableGlobalVars) { + error(g, s"Support for global variables has been disabled but a global variable has been found") } else { - idsOkMsgs + // HACK: without this explicit check, Gobra does not find repeated declarations + // of global variables. This has to do with the changes introduced in PR #186. + // We need this check nonetheless because the checks performed in the "true" branch + // assume that the ids are well-defined. + val idsOkMsgs = g.left.flatMap(l => wellDefID(l).out) + if (idsOkMsgs.isEmpty) { + val isGhost = isEnclosingGhost(g) + g.right.flatMap(isExpr(_).out) ++ + declarableTo.errors(g.right map exprType, g.typ map typeSymbType, g.left map idType)(g) ++ + error(g, s"Currently, global variables cannot be made ghost", isGhost) ++ + acyclicGlobalDeclaration.errors(g)(g) + } else { + idsOkMsgs + } } case s: PActualStatement => wellDefStmt(s).out diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala index 6758b7696..1ee10cbf0 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala @@ -7,7 +7,7 @@ package viper.gobra.frontend.info.implementation.typing import org.bitbucket.inkytonik.kiama.util.Entity -import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error} +import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, message} import viper.gobra.ast.frontend.{PExpression, POld, PPackage, PProgram, PVarDecl} import viper.gobra.frontend.info.base.{SymbolTable => st} import viper.gobra.frontend.info.implementation.TypeInfoImpl @@ -18,30 +18,34 @@ trait ProgramTyping extends BaseTyping { this: TypeInfoImpl => lazy val wellDefProgram: WellDefinedness[PProgram] = createWellDef { case PProgram(_, posts, imports, members) => - // Obtains global variable declarations sorted by the order in which they appear in the file - val sortedByPosDecls: Vector[PVarDecl] = { - val unsortedDecls: Vector[PVarDecl] = members.collect{ case d: PVarDecl => d } - // we require a package to be able to obtain position information - val pkgOpt: Option[PPackage] = unsortedDecls.headOption.flatMap(tryEnclosingPackage) - // sort declarations by the order in which they appear in the program - unsortedDecls.sortBy{ decl => - pkgOpt.get.positions.positions.getStart(decl) match { - case Some(pos) => (pos.line, pos.column) - case _ => Violation.violation(s"Could not find position information of $decl.") + if (config.disableGlobalVars) { + posts.flatMap(post => message(post, s"Support for global variables has been disabled but an init postcondition has been found")) + } else { + // Obtains global variable declarations sorted by the order in which they appear in the file + val sortedByPosDecls: Vector[PVarDecl] = { + val unsortedDecls: Vector[PVarDecl] = members.collect{ case d: PVarDecl => d } + // we require a package to be able to obtain position information + val pkgOpt: Option[PPackage] = unsortedDecls.headOption.flatMap(tryEnclosingPackage) + // sort declarations by the order in which they appear in the program + unsortedDecls.sortBy{ decl => + pkgOpt.get.positions.positions.getStart(decl) match { + case Some(pos) => (pos.line, pos.column) + case _ => Violation.violation(s"Could not find position information of $decl.") + } } } - } - // HACK: without this explicit check, Gobra does not find repeated declarations - // of global variables. This has to do with the changes introduced in PR #186. - // We need this check nonetheless because the checks performed in the "true" branch - // assume that the ids are well-defined. - val idsOkMsgs = sortedByPosDecls.flatMap(d => d.left).flatMap(l => wellDefID(l).out) - if (idsOkMsgs.isEmpty) { - globalDeclSatisfiesDepOrder(sortedByPosDecls) ++ - hasOldExpression(posts) ++ - hasOldExpression(imports.flatMap(_.importPres)) - } else { - idsOkMsgs + // HACK: without this explicit check, Gobra does not find repeated declarations + // of global variables. This has to do with the changes introduced in PR #186. + // We need this check nonetheless because the checks performed in the "true" branch + // assume that the ids are well-defined. + val idsOkMsgs = sortedByPosDecls.flatMap(d => d.left).flatMap(l => wellDefID(l).out) + if (idsOkMsgs.isEmpty) { + globalDeclSatisfiesDepOrder(sortedByPosDecls) ++ + hasOldExpression(posts) ++ + hasOldExpression(imports.flatMap(_.importPres)) + } else { + idsOkMsgs + } } } diff --git a/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra new file mode 100644 index 000000000..dc33bec29 --- /dev/null +++ b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra @@ -0,0 +1,58 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// this is the same file as `globals-simple01.gobra` but additionally provides the `--disableGlobalVars` flag to Gobra. +// ##(--disableGlobalVars) + +//:: ExpectedOutput(type_error) +initEnsures acc(&A) && acc(&B) && acc(&C, 1/2) +package pkg + +//:: ExpectedOutput(type_error) +importRequires true +import "fmt" + +import ( + //:: ExpectedOutput(type_error) + importRequires true + //:: ExpectedOutput(type_error) + importRequires true + "bytes" + //:: ExpectedOutput(type_error) + importRequires true + "sync" +) + + +//:: ExpectedOutput(type_error) +var A int = 0 +//:: ExpectedOutput(type_error) +var B, C = f() +//:: ExpectedOutput(type_error) +var _ = g() +//:: ExpectedOutput(type_error) +var D struct{} + +decreases +func f() (int, bool) + +decreases +func g() interface{} + +requires acc(&A, 1/2) && A == 1 +ensures acc(&A, 1/2) +func testRead() { + var v1 int = A + assert v1 == 1 +} + +requires acc(&C) && C +func testWrite() { + C = false +} + +// Variable hiding works correctly, as in Go +func tesVarHiding() { + var A int = 0 + assert A == 0 +} From 065c5005b1ec5e4dd9cd5964c7707fad9a54adbf Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 4 Oct 2022 17:09:58 +0200 Subject: [PATCH 006/296] implements PR suggestions by Joao --- .github/workflows/update-submodules.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/update-submodules.yml b/.github/workflows/update-submodules.yml index 9493f4aec..d505ddb92 100644 --- a/.github/workflows/update-submodules.yml +++ b/.github/workflows/update-submodules.yml @@ -50,10 +50,10 @@ jobs: body: | * Updates ViperServer from `${{ env.PREV_VIPERSERVER_REF }}` to `${{ env.CUR_VIPERSERVER_REF }}`. - - name: Enable auto-merge of PR - uses: peter-evans/create-or-update-comment@v2 - if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF - with: - token: ${{ secrets.VIPER_ADMIN_TOKEN }} - issue-number: ${{ steps.pr.outputs.pull-request-number }} - body: bors merge + # - name: Enable auto-merge of PR + # uses: peter-evans/create-or-update-comment@v2 + # if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF + # with: + # token: ${{ secrets.VIPER_ADMIN_TOKEN }} + # issue-number: ${{ steps.pr.outputs.pull-request-number }} + # body: bors merge From da24f81c3a9ba9db406ea5604d0cb9ea9d524012 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 4 Oct 2022 17:13:51 +0200 Subject: [PATCH 007/296] fixes desugarer to support lazy imports when global variables are disabled --- src/main/scala/viper/gobra/frontend/Desugar.scala | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 16bc3297e..3cd4cdfd3 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -3063,7 +3063,13 @@ object Desugar { // As for imported methods, imported packages are not checked to satisfy their specification. In particular, // Gobra does not check that the package postconditions are established by the initialization code. Instead, // this is assumed. We only generate the proof obligations for the initialization code in the main package. - registerPackage(mainPkg, specCollector, generateInitProof = true)(config) + registerPackage(mainPkg, specCollector, generateInitProof = !config.disableGlobalVars)(config) + + if (config.disableGlobalVars) { + // early return to not add any proof obligations because we have made sure that + // there aren't any global variables and/or init postcondition or import preconditions + return + } // check that the postconditions of every package are enough to satisfy all of their imports' preconditions val src = meta(mainPkg, info) @@ -3121,8 +3127,9 @@ object Desugar { info.context.getTypeInfo(RegularImport(imp.importPath))(config) match { case Some(Right(tI)) => val desugaredPre = imp.importPres.map(specificationD(FunctionContext.empty(), info)) + Violation.violation(!config.disableGlobalVars || desugaredPre.isEmpty, "Import preconditions require support for global variables") specCollector.addImportPres(tI.getTypeInfo.tree.originalRoot, desugaredPre) - case e => Violation.violation(s"Unexpected value found $e while importing ${imp.importPath}") + case e => Violation.violation(config.disableGlobalVars, s"Unexpected value found $e while importing ${imp.importPath}") } } From 45d84c92985649d07d65f5164ae4cd162c11c987 Mon Sep 17 00:00:00 2001 From: ArquintL Date: Tue, 4 Oct 2022 18:48:44 +0000 Subject: [PATCH 008/296] Updates submodules --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 87089e6c5..c2622f973 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 87089e6c56a3f5b5ef7258fcd258af42bc870775 +Subproject commit c2622f973135f8a25cd0680ae6f18e74530d9135 From d01474dbd1e6dbee44f5e2d0cfcd84d7f96a9ff7 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 6 Oct 2022 08:57:10 +0200 Subject: [PATCH 009/296] implements CR suggestions by Joao --- .../scala/viper/gobra/frontend/Config.scala | 26 +++++++++++-------- .../scala/viper/gobra/frontend/Desugar.scala | 18 ++++++++----- .../implementation/typing/ImportTyping.scala | 6 +++-- .../implementation/typing/MemberTyping.scala | 10 ++++--- .../implementation/typing/ProgramTyping.scala | 6 +++-- 5 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 11584b430..98d79d8ca 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -21,6 +21,7 @@ import viper.gobra.util.{TypeBounds, Violation} import viper.silver.ast.SourcePosition import scala.concurrent.duration.Duration +import scala.util.matching.Regex object LoggerDefaults { val DefaultLevel: Level = Level.INFO @@ -62,7 +63,7 @@ object ConfigDefaults { lazy val DefaultAssumeInjectivityOnInhale: Boolean = true lazy val DefaultParallelizeBranches: Boolean = false lazy val DefaultDisableMoreCompleteExhale: Boolean = false - lazy val DefaultDisableGlobalVars: Boolean = false + lazy val DefaultEnableLazyImports: Boolean = false } case class Config( @@ -110,7 +111,7 @@ case class Config( // branches will be verified in parallel parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, - disableGlobalVars: Boolean = ConfigDefaults.DefaultDisableGlobalVars, + enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, ) { def merge(other: Config): Config = { @@ -152,7 +153,7 @@ case class Config( assumeInjectivityOnInhale = assumeInjectivityOnInhale || other.assumeInjectivityOnInhale, parallelizeBranches = parallelizeBranches, disableMoreCompleteExhale = disableMoreCompleteExhale, - disableGlobalVars = disableGlobalVars || other.disableGlobalVars, + enableLazyImports = enableLazyImports || other.enableLazyImports, ) } @@ -166,10 +167,13 @@ case class Config( object Config { // the header signals that a file should be considered when running on "header-only" mode - val header = """\/\/\s*\+gobra""".r + val header: Regex = """\/\/\s*\+gobra""".r val prettyPrintedHeader = "// +gobra" require(header.matches(prettyPrintedHeader)) def sourceHasHeader(s: Source): Boolean = header.findFirstIn(s.content).nonEmpty + + val enableLazyImportOptionName = "enableLazyImport" + val enableLazyImportOptionPrettyPrinted = s"--$enableLazyImportOptionName" } // have a look at `Config` to see an inline description of some of these parameters @@ -195,7 +199,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector assumeInjectivityOnInhale: Boolean = ConfigDefaults.DefaultAssumeInjectivityOnInhale, parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, - disableGlobalVars: Boolean = ConfigDefaults.DefaultDisableGlobalVars, + enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -246,7 +250,7 @@ trait RawConfig { assumeInjectivityOnInhale = baseConfig.assumeInjectivityOnInhale, parallelizeBranches = baseConfig.parallelizeBranches, disableMoreCompleteExhale = baseConfig.disableMoreCompleteExhale, - disableGlobalVars = baseConfig.disableGlobalVars, + enableLazyImports = baseConfig.enableLazyImports, ) } @@ -588,10 +592,10 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) - val disableGlobalVars: ScallopOption[Boolean] = opt[Boolean]( - name = "disableGlobalVars", - descr = "Disables the support for global variables and thus does not require that the sources of all transitively included packages can be located by Gobra.", - default = Some(ConfigDefaults.DefaultDisableGlobalVars), + val enableLazyImports: ScallopOption[Boolean] = opt[Boolean]( + name = Config.enableLazyImportOptionName, + descr = s"Enforces that ${GoVerifier.name} parses depending packages only when necessary. Note that this disables certain language features such as global variables.", + default = Some(ConfigDefaults.DefaultEnableLazyImports), noshort = true, ) @@ -727,6 +731,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals assumeInjectivityOnInhale = assumeInjectivityOnInhale(), parallelizeBranches = parallelizeBranches(), disableMoreCompleteExhale = disableMoreCompleteExhale(), - disableGlobalVars = disableGlobalVars(), + enableLazyImports = enableLazyImports(), ) } diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 3cd4cdfd3..262d201d3 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -3063,11 +3063,15 @@ object Desugar { // As for imported methods, imported packages are not checked to satisfy their specification. In particular, // Gobra does not check that the package postconditions are established by the initialization code. Instead, // this is assumed. We only generate the proof obligations for the initialization code in the main package. - registerPackage(mainPkg, specCollector, generateInitProof = !config.disableGlobalVars)(config) - - if (config.disableGlobalVars) { - // early return to not add any proof obligations because we have made sure that - // there aren't any global variables and/or init postcondition or import preconditions + // Note that `config.enableLazyImports` disables init blocks, global variables, import preconditions, and init + // postconditions in the type checker, which means that we do not have to generate an init proof. + registerPackage(mainPkg, specCollector, generateInitProof = !config.enableLazyImports)(config) + + if (config.enableLazyImports) { + // early return to not add any proof obligations because we have made sure in the type checker that + // there aren't any global variables, init blocks, init postconditions, and import preconditions (in the + // packages that have been parsed). Note that packages that have been skipped because of the laziness might + // still contain such features. return } @@ -3127,9 +3131,9 @@ object Desugar { info.context.getTypeInfo(RegularImport(imp.importPath))(config) match { case Some(Right(tI)) => val desugaredPre = imp.importPres.map(specificationD(FunctionContext.empty(), info)) - Violation.violation(!config.disableGlobalVars || desugaredPre.isEmpty, "Import preconditions require support for global variables") + Violation.violation(!config.enableLazyImports || desugaredPre.isEmpty, s"Import precondition found despite running with ${Config.enableLazyImportOptionPrettyPrinted}") specCollector.addImportPres(tI.getTypeInfo.tree.originalRoot, desugaredPre) - case e => Violation.violation(config.disableGlobalVars, s"Unexpected value found $e while importing ${imp.importPath}") + case e => Violation.violation(config.enableLazyImports, s"Unexpected value found $e while importing ${imp.importPath} - type information is assumed to be available for all packages when Gobra is executed with lazy imports disabled") } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala index 3b2acdcd8..ec2b7541b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ImportTyping.scala @@ -7,15 +7,17 @@ package viper.gobra.frontend.info.implementation.typing import org.bitbucket.inkytonik.kiama.util.Messaging.{message, noMessages} +import viper.gobra.GoVerifier import viper.gobra.ast.frontend.{PExplicitQualifiedImport, PImplicitQualifiedImport, PImport, PNode, PUnqualifiedImport} +import viper.gobra.frontend.Config import viper.gobra.frontend.PackageResolver.RegularImport import viper.gobra.frontend.info.implementation.TypeInfoImpl trait ImportTyping extends BaseTyping { this: TypeInfoImpl => lazy val wellDefImport: WellDefinedness[PImport] = createWellDef { imp => - (if (config.disableGlobalVars) { - imp.importPres.flatMap(importPre => message(importPre, s"Support for global variables has been disabled but an import precondition has been found")) + (if (config.enableLazyImports) { + imp.importPres.flatMap(importPre => message(importPre, s"Import preconditions are not allowed when executing ${GoVerifier.name} with ${Config.enableLazyImportOptionPrettyPrinted}")) } else { forceNonLazyImport(imp.importPath, imp) noMessages diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala index 6adeb5d9e..0fcf977b9 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala @@ -7,7 +7,9 @@ package viper.gobra.frontend.info.implementation.typing import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages} +import viper.gobra.GoVerifier import viper.gobra.ast.frontend._ +import viper.gobra.frontend.Config import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.Constants @@ -26,8 +28,8 @@ trait MemberTyping extends BaseTyping { this: TypeInfoImpl => case b: PConstDecl => b.specs.flatMap(wellDefConstSpec) case g: PVarDecl if isGlobalVarDeclaration(g) => - if (config.disableGlobalVars) { - error(g, s"Support for global variables has been disabled but a global variable has been found") + if (config.enableLazyImports) { + error(g, s"Global variables are not allowed when executing ${GoVerifier.name} with ${Config.enableLazyImportOptionPrettyPrinted}") } else { // HACK: without this explicit check, Gobra does not find repeated declarations // of global variables. This has to do with the changes introduced in PR #186. @@ -72,7 +74,9 @@ trait MemberTyping extends BaseTyping { this: TypeInfoImpl => private def wellDefIfInitBlock(n: PFunctionDecl): Messages = { val isInitFunc = n.id.name == Constants.INIT_FUNC_NAME - if (isInitFunc) { + if (isInitFunc && config.enableLazyImports) { + error(n, s"Init functions are not supported when executing ${GoVerifier.name} with ${Config.enableLazyImportOptionPrettyPrinted}") + } else if (isInitFunc) { val errorMsgEmptySpec = s"Currently, ${Constants.INIT_FUNC_NAME} blocks cannot have specification. Instead, use package postconditions and import preconditions." val errorMsgNoInOut = s"func ${Constants.INIT_FUNC_NAME} must have no arguments and no return values" diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala index 1ee10cbf0..f0641c73e 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ProgramTyping.scala @@ -8,7 +8,9 @@ package viper.gobra.frontend.info.implementation.typing import org.bitbucket.inkytonik.kiama.util.Entity import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, message} +import viper.gobra.GoVerifier import viper.gobra.ast.frontend.{PExpression, POld, PPackage, PProgram, PVarDecl} +import viper.gobra.frontend.Config import viper.gobra.frontend.info.base.{SymbolTable => st} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.property.{AssignMode, StrictAssignMode} @@ -18,8 +20,8 @@ trait ProgramTyping extends BaseTyping { this: TypeInfoImpl => lazy val wellDefProgram: WellDefinedness[PProgram] = createWellDef { case PProgram(_, posts, imports, members) => - if (config.disableGlobalVars) { - posts.flatMap(post => message(post, s"Support for global variables has been disabled but an init postcondition has been found")) + if (config.enableLazyImports) { + posts.flatMap(post => message(post, s"Init postconditions are not allowed when executing ${GoVerifier.name} with ${Config.enableLazyImportOptionPrettyPrinted}")) } else { // Obtains global variable declarations sorted by the order in which they appear in the file val sortedByPosDecls: Vector[PVarDecl] = { From 4380796d169f86b5e60935ebd74b7fcde73b5032 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 6 Oct 2022 09:58:14 +0200 Subject: [PATCH 010/296] fixes unit test --- .../regressions/features/globals/globals-disabled-fail01.gobra | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra index dc33bec29..ffb0e916f 100644 --- a/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra +++ b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra @@ -2,7 +2,7 @@ // http://creativecommons.org/publicdomain/zero/1.0/ // this is the same file as `globals-simple01.gobra` but additionally provides the `--disableGlobalVars` flag to Gobra. -// ##(--disableGlobalVars) +// ##(--enableLazyImport) //:: ExpectedOutput(type_error) initEnsures acc(&A) && acc(&B) && acc(&C, 1/2) From 81a6b5f5bdafe7e9cf41d3ff169bb3dc0e20ba28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Sun, 9 Oct 2022 10:23:38 +0200 Subject: [PATCH 011/296] Constant propagation (#538) * Test constant propagation * Clean-up * Clean-up * Update src/main/scala/viper/gobra/Gobra.scala --- src/main/scala/viper/gobra/Gobra.scala | 7 ++- .../viper/gobra/ast/internal/Program.scala | 18 ++++---- .../transform/ConstantPropagation.scala | 45 +++++++++++++++++++ 3 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 src/main/scala/viper/gobra/ast/internal/transform/ConstantPropagation.scala diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index 95ac43533..54de7422a 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -14,7 +14,7 @@ import com.typesafe.scalalogging.StrictLogging import org.slf4j.LoggerFactory import viper.gobra.ast.frontend.PPackage import viper.gobra.ast.internal.Program -import viper.gobra.ast.internal.transform.{CGEdgesTerminationTransform, InternalTransform, OverflowChecksTransform} +import viper.gobra.ast.internal.transform.{CGEdgesTerminationTransform, ConstantPropagation, InternalTransform, OverflowChecksTransform} import viper.gobra.backend.BackendVerifier import viper.gobra.frontend.info.{Info, TypeInfo} import viper.gobra.frontend.{Config, Desugar, PackageInfo, Parser, ScallopGobraConfig} @@ -266,7 +266,10 @@ class Gobra extends GoVerifier with GoIdeVerifier { * be easily extended to perform more transformations */ private def performInternalTransformations(program: Program, config: Config, pkgInfo: PackageInfo): Either[Vector[VerifierError], Program] = { - var transformations: Vector[InternalTransform] = Vector(CGEdgesTerminationTransform) + // constant propagation does not cause duplication of verification errors caused + // by overflow checks (if enabled) because all overflows in constant declarations + // can be found by the well-formedness checks. + var transformations: Vector[InternalTransform] = Vector(CGEdgesTerminationTransform, ConstantPropagation) if (config.checkOverflows) { transformations :+= OverflowChecksTransform } diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index 2ef54b7bd..5ae635350 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -31,24 +31,24 @@ case class Program( } class LookupTable( - private val definedTypes: Map[(String, Addressability), Type] = Map.empty, - private val definedMethods: Map[MethodProxy, MethodLikeMember] = Map.empty, - private val definedFunctions: Map[FunctionProxy, FunctionLikeMember] = Map.empty, - private val definedMPredicates: Map[MPredicateProxy, MPredicateLikeMember] = Map.empty, - private val definedFPredicates: Map[FPredicateProxy, FPredicateLikeMember] = Map.empty, - private val definedFuncLiterals: Map[FunctionLitProxy, FunctionLitLike] = Map.empty, + private[internal] val definedTypes: Map[(String, Addressability), Type] = Map.empty, + private[internal] val definedMethods: Map[MethodProxy, MethodLikeMember] = Map.empty, + private[internal] val definedFunctions: Map[FunctionProxy, FunctionLikeMember] = Map.empty, + private[internal] val definedMPredicates: Map[MPredicateProxy, MPredicateLikeMember] = Map.empty, + private[internal] val definedFPredicates: Map[FPredicateProxy, FPredicateLikeMember] = Map.empty, + private[internal] val definedFuncLiterals: Map[FunctionLitProxy, FunctionLitLike] = Map.empty, /** * only has to be defined on types that implement an interface // might change depending on how embedding support changes * SortedSet is used to achieve a consistent ordering of members across runs of Gobra */ - private val directMemberProxies: Map[Type, SortedSet[MemberProxy]] = Map.empty, + private[internal] val directMemberProxies: Map[Type, SortedSet[MemberProxy]] = Map.empty, /** * empty interface does not have to be included * SortedSet is used to achieve a consistent ordering of members across runs of Gobra */ - private val directInterfaceImplementations: Map[InterfaceT, SortedSet[Type]] = Map.empty, - private val implementationProofPredicateAliases: Map[(Type, InterfaceT, String), FPredicateProxy] = Map.empty, + private[internal] val directInterfaceImplementations: Map[InterfaceT, SortedSet[Type]] = Map.empty, + private[internal] val implementationProofPredicateAliases: Map[(Type, InterfaceT, String), FPredicateProxy] = Map.empty, ) { def lookup(t: DefinedT): Type = definedTypes(t.name, t.addressability) def lookup(m: MethodProxy): MethodLikeMember = definedMethods(m) diff --git a/src/main/scala/viper/gobra/ast/internal/transform/ConstantPropagation.scala b/src/main/scala/viper/gobra/ast/internal/transform/ConstantPropagation.scala new file mode 100644 index 000000000..f8f960b5e --- /dev/null +++ b/src/main/scala/viper/gobra/ast/internal/transform/ConstantPropagation.scala @@ -0,0 +1,45 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2021 ETH Zurich. + +package viper.gobra.ast.internal.transform + +import viper.gobra.ast.{internal => in} +import viper.gobra.util.Violation + +object ConstantPropagation extends InternalTransform { + override def name(): String = "constant_propagation" + + override def transform(p: in.Program): in.Program = { + val (constDecls, noConstDecls) = p.members.partition(_.isInstanceOf[in.GlobalConstDecl]) + def propagate[T <: in.Node](n: T): T = n.transform{ + case c: in.GlobalConst => + val litOpt = constDecls collectFirst { case in.GlobalConstDecl(l, r) if l == c => r.withInfo(c.info) } + litOpt match { + case Some(l) => l + case _ => Violation.violation(s"Did not find declaration of constant $c") + } + } + + // TODO: duplicated work can be avoided - currently, propagate is applied twice per member + val newTable = new in.LookupTable( + definedTypes = p.table.definedTypes, + definedMethods = p.table.definedMethods.view.mapValues(propagate).toMap, + definedFunctions = p.table.definedFunctions.view.mapValues(propagate).toMap, + definedMPredicates = p.table.definedMPredicates.view.mapValues(propagate).toMap, + definedFPredicates = p.table.definedFPredicates.view.mapValues(propagate).toMap, + definedFuncLiterals = p.table.definedFuncLiterals.view.mapValues(propagate).toMap, + directMemberProxies = p.table.directMemberProxies, + directInterfaceImplementations = p.table.directInterfaceImplementations, + implementationProofPredicateAliases = p.table.implementationProofPredicateAliases, + ) + + in.Program( + types = p.types, + members = noConstDecls.map(propagate), // does not emit constant declarations + table = newTable, + )(p.info) + } +} \ No newline at end of file From 46ca5f0a9d27d080234dcc104cef65357a33e864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 10 Oct 2022 14:55:50 +0200 Subject: [PATCH 012/296] Fix #544 (#545) * Add fix and tests * Fix test * Fix test --- .../viper/gobra/frontend/Gobrafier.scala | 8 +- .../gobra/parsing/GobrafyUnitTests.scala | 298 +++++++++++++++++- 2 files changed, 301 insertions(+), 5 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Gobrafier.scala b/src/main/scala/viper/gobra/frontend/Gobrafier.scala index fc3286406..a492fe18c 100644 --- a/src/main/scala/viper/gobra/frontend/Gobrafier.scala +++ b/src/main/scala/viper/gobra/frontend/Gobrafier.scala @@ -14,8 +14,8 @@ import scala.util.matching.Regex object Gobrafier { - private def multilineComment(str: String): String = s"/\\*@\\s*$str\\s*@\\*/" - private def singlelineComment(str: String): String = s"//@\\s*$str\\s*" + private def multilineComment(str: String): String = s"/\\*\\s?@\\s*$str\\s*@\\s?\\*/" + private def singlelineComment(str: String): String = s"//\\s?@\\s*$str\\s*" /** * Keywords used in Goified files. @@ -67,7 +67,7 @@ object Gobrafier { * Remove the remaining goifying comments in the file. */ private def removeGoifyingComments(fileContent: String): String = - fileContent.replaceAll(s"//@\\s*", "").replaceAll(s"/\\*@$non_newline*", "").replaceAll(s"(?m)$non_newline*@\\*/", "") + fileContent.replaceAll(s"//\\s?@\\s*", "").replaceAll(s"/\\*\\s?@$non_newline*", "").replaceAll(s"(?m)$non_newline*@\\s?\\*/", "") @@ -198,7 +198,7 @@ object Gobrafier { actualRhs + (if (actualRhs == null || actualRhs == "" || ghostRhs == "" || ghostRhs == null) "" else ", ") + (if (ghostRhs == "" || ghostRhs == null) "" else ghostRhs) + - (if (comment == "" || comment == null) "" else "//@ " + comment) + (if (comment == "" || comment == null) "" else "// @ " + comment) }) /** diff --git a/src/test/scala/viper/gobra/parsing/GobrafyUnitTests.scala b/src/test/scala/viper/gobra/parsing/GobrafyUnitTests.scala index 15454552a..db8aa6c76 100644 --- a/src/test/scala/viper/gobra/parsing/GobrafyUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/GobrafyUnitTests.scala @@ -29,6 +29,21 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("function with ghost args (post Go 1.19)") { + val input = + """ + |// @ ghost-parameters: b int, c int + |// @ requires a >= 0 && b >= 0 + |func foo(a int) {} + |""".stripMargin + val expected = + """ + |requires a >= 0 && b >= 0 + |func foo(a int, ghost b int, ghost c int) {} + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("function with ghost results") { val input = """ @@ -46,6 +61,23 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("function with ghost results (post Go 1.19)") { + val input = + """ + |// @ ghost-results: b int, c int + |// @ requires a >= 0 + |// @ ensures a == b && b == c + |func foo(a int) {} + |""".stripMargin + val expected = + """ + |requires a >= 0 + |ensures a == b && b == c + |func foo(a int) (ghost b int, ghost c int) {} + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("pure interface function should stay pure") { val input = """ @@ -76,6 +108,36 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("pure interface function should stay pure (post Go 1.19)") { + val input = + """ + |type stream interface { + | // @ pred mem() + | + | // @ requires acc(mem(), 1/2) + | // @ pure + | hasNext() bool + | + | // @ requires mem() && hasNext() + | // @ ensures mem() + | next() interface{} + |}""".stripMargin + val expected = + """ + |type stream interface { + | pred mem() + | + | requires acc(mem(), 1/2) + | pure + | hasNext() bool + | + | requires mem() && hasNext() + | ensures mem() + | next() interface{} + |}""".stripMargin + frontend.gobrafy(input, expected) + } + test("pure interface function should stay pure even with provided implementation") { val input = """ @@ -126,6 +188,56 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("pure interface function should stay pure even with provided implementation (post Go 1.19)") { + val input = + """ + |package presentation + | + |type stream interface { + | // @ pred mem() + | + | // @ requires acc(mem(), 1/2) + | // @ pure + | hasNext() bool + |} + | + |/** Implementation **/ + | + |type counter struct{ f, max int } + | + |// @ requires acc(x, 1/2) + |// @ pure + |func (x *counter) hasNext() bool { + | return x.f < x.max + |} + | + |""".stripMargin + val expected = + """ + |package presentation + | + |type stream interface { + | pred mem() + | + | requires acc(mem(), 1/2) + | pure + | hasNext() bool + |} + | + |/** Implementation **/ + | + |type counter struct{ f, max int } + | + |requires acc(x, 1/2) + |pure + |func (x *counter) hasNext() bool { + | return x.f < x.max + |} + | + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("assignment with ghost variables") { val input = """ @@ -138,6 +250,18 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("assignment with ghost variables (post Go 1.19)") { + val input = + """ + |a, b, c = d, e, f // @ with: g, h = i, j + |""".stripMargin + val expected = + """ + |a, b, c, g, h = d, e, f, i, j + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("short variable declaration with ghost variables") { val input = """ @@ -150,7 +274,19 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } - test("short variable declaration with ghost variables and addressability") { + test("short variable declaration with ghost variables (post Go 1.19)") { + val input = + """ + |a, b, c := d, e, f // @ with: g, h := i, j + |""".stripMargin + val expected = + """ + |a, b, c, g, h := d, e, f, i, j + |""".stripMargin + frontend.gobrafy(input, expected) + } + + test("short variable declaration with ghost variables and addressability") { val input = """ |a, b, c := d, e, f //@ with: g, h := i, j; addressable: b, g @@ -162,6 +298,18 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("short variable declaration with ghost variables and addressability (post Go 1.19)") { + val input = + """ + |a, b, c := d, e, f // @ with: g, h := i, j; addressable: b, g + |""".stripMargin + val expected = + """ + |a, b@, c, g@, h := d, e, f, i, j + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("ghost return mixed") { val input = """ @@ -174,6 +322,19 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("ghost return mixed (post Go 1.19)") { + val input = + """ + |return a, b // @ with: c, d + |""".stripMargin + val expected = + """ + |return a, b, c, d + |""".stripMargin + frontend.gobrafy(input, expected) + } + + test("ghost return only actual") { val input = """ @@ -186,6 +347,18 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("ghost return only actual (post Go 1.19)") { + val input = + """ + |return a, b // @ with: + |""".stripMargin + val expected = + """ + |return a, b + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("ghost return only ghost") { val input = """ @@ -198,6 +371,18 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("ghost return only ghost (post Go 1.19)") { + val input = + """ + |return // @ with: a, b + |""".stripMargin + val expected = + """ + |return a, b + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("call with only actual arguments") { val input = """ @@ -212,6 +397,22 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("call with only actual arguments (post Go 1.19)") { + val input = { + // also testing with the now supported "/* @" annotation, even though Go does not enforce it + """ + |foo(a, b) /* @ with: @ */ + |foo(c, d) // @ with: + |""".stripMargin + } + val expected = + """ + |foo(a, b) + |foo(c, d) + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("call with only ghost arguments") { val input = """ @@ -226,6 +427,21 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("call with only ghost arguments (post Go 1.19)") { + // also testing with the now supported "/* @" annotation, even though Go does not enforce it + val input = + """ + |foo() // @ with: a, b + |foo() /* @ with: c, d @ */ + |""".stripMargin + val expected = + """ + |foo(a, b) + |foo(c, d) + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("call with mix arguments") { val input = """ @@ -240,6 +456,21 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("call with mix arguments (post Go 1.19)") { + // also testing with the now supported "/* @" annotation, even though Go does not enforce it + val input = + """ + |foo(a, b) /* @ with: c, d @ */ + |foo(e, f) // @ with: g, h + |""".stripMargin + val expected = + """ + |foo(a, b, c, d) + |foo(e, f, g, h) + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("call with spec, with only actual arguments") { val input = """ @@ -260,6 +491,27 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("call with spec, with only actual arguments (post Go 1.19)") { + // also testing with the now supported "/* @" annotation, even though Go does not enforce it + val input = + """ + |cl(a, b) /* @ as foo{}@ */ + |cl(c, d) /* @ as foo{} @ *//* @ with: @ */ + |cl(c, d) /* @ as foo{1, 2} @ *//* @ with: @ */ + |cl(c, d) /* @ as foo{x: 1, y: 2} @ *//* @ with: @ */ + |cl(e, f) /* @ as foo{} @ */// @ with: + |""".stripMargin + val expected = + """ + |cl(a, b) as foo{} + |cl(c, d) as foo{} + |cl(c, d) as foo{1, 2} + |cl(c, d) as foo{x: 1, y: 2} + |cl(e, f) as foo{} + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("call with spec, with only ghost arguments") { val input = """ @@ -278,6 +530,24 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("call with spec, with only ghost arguments (post Go 1.19)") { + val input = + """ + |cl() /* @ as foo{} @ *//* @ with: a, b @ */ + |cl() /* @ as foo{} @ */// @ with: c, d + |cl() /* @ as foo{1, 2} @ */// @ with: c, d + |cl() /* @ as foo{x: 1, y: 2} @ */// @ with: c, d + |""".stripMargin + val expected = + """ + |cl(a, b) as foo{} + |cl(c, d) as foo{} + |cl(c, d) as foo{1, 2} + |cl(c, d) as foo{x: 1, y: 2} + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("call with spec, with mixed arguments") { val input = """ @@ -292,6 +562,20 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("call with spec, with mixed arguments (post Go 1.19) ") { + val input = + """ + |cl(a, b) /* @ as foo{} @ *//* @ with: c, d @ */ + |cl(e, f) /* @ as foo{} @ */// @ with: g, h + |""".stripMargin + val expected = + """ + |cl(a, b, c, d) as foo{} + |cl(e, f, g, h) as foo{} + |""".stripMargin + frontend.gobrafy(input, expected) + } + test("unfolding predicate instance") { val input = """ @@ -304,6 +588,18 @@ class GobrafyUnitTests extends AnyFunSuite with Matchers with Inside { frontend.gobrafy(input, expected) } + test("unfolding predicate instance (post Go 1.19)") { + val input = + """ + |v := /* @ unfolding: list(n) @ */ n.val + |""".stripMargin + val expected = + """ + |v := unfolding list(n) in n.val + |""".stripMargin + frontend.gobrafy(input, expected) + } + /* ** Stubs, mocks and other test setup */ From 6185b2b28f02240901ba73dd6be2d9fa09002cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Tue, 11 Oct 2022 15:04:03 +0200 Subject: [PATCH 013/296] Fix lazy generation of the string domain (#547) --- .../viper/gobra/translator/encodings/StringEncoding.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala index 6a5d5596d..f9f0bf2be 100644 --- a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala @@ -129,7 +129,7 @@ class StringEncoding extends LeafTypeEncoding { override def finalize(addMemberFn: vpr.Member => Unit): Unit = { if (isUsed) { addMemberFn(genDomain()) - addMemberFn(strSlice) + if (strSliceIsUsed) { addMemberFn(strSlice) } byteSliceToStrFuncGenerator.finalize(addMemberFn) } } @@ -184,7 +184,9 @@ class StringEncoding extends LeafTypeEncoding { * where s is a string id and l and r are the lower and upper bounds of the slice */ private val strSliceName: String = "strSlice" - val strSlice: vpr.Function = { + private var strSliceIsUsed = false + lazy val strSlice: vpr.Function = { + strSliceIsUsed = true val argS = vpr.LocalVarDecl("s", stringType)() val argL = vpr.LocalVarDecl("l", vpr.Int)() val argH = vpr.LocalVarDecl("h", vpr.Int)() From e186b1b36014ad112be5b19794a38a2c141abcdb Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 12 Oct 2022 16:21:58 +0200 Subject: [PATCH 014/296] decides based on the types of termination measures which axioms to import and emits the Viper encoding before applying Viper-to-Viper transformations --- .../scala/viper/gobra/reporting/Message.scala | 2 +- .../viper/gobra/translator/Translator.scala | 37 +++++++++++++++++-- .../transformers/TerminationTransformer.scala | 32 ++++++++++++++-- 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/main/scala/viper/gobra/reporting/Message.scala b/src/main/scala/viper/gobra/reporting/Message.scala index 5b9157e6d..61530d91b 100644 --- a/src/main/scala/viper/gobra/reporting/Message.scala +++ b/src/main/scala/viper/gobra/reporting/Message.scala @@ -166,7 +166,7 @@ case class GeneratedViperMessage(taskName: String, inputs: Vector[String], vprAs override val name: String = s"generated_viper_message" override def toString: String = s"generated_viper_message(" + - s"taskName=$taskName" + s"taskName=$taskName" + s"files=$inputs, " + s"vprFormated=$vprAstFormatted)" diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala index a142a67d8..d84983a93 100644 --- a/src/main/scala/viper/gobra/translator/Translator.scala +++ b/src/main/scala/viper/gobra/translator/Translator.scala @@ -15,6 +15,8 @@ import viper.gobra.translator.context.DfltTranslatorConfig import viper.gobra.translator.encodings.programs.ProgramsImpl import viper.gobra.translator.transformers.{AssumeTransformer, TerminationTransformer, ViperTransformer} import viper.gobra.util.Violation +import viper.silver.ast.pretty.FastPrettyPrinter +import viper.silver.{ast => vpr} object Translator { @@ -22,6 +24,8 @@ object Translator { val translationConfig = new DfltTranslatorConfig() val programTranslator = new ProgramsImpl() val task = programTranslator.translate(program)(translationConfig) + // we report the un-transformed program as this is much more readable + config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => sortAst(task.program), () => task.backtrack) if (config.checkConsistency) { val errors = task.program.checkTransitively @@ -33,12 +37,37 @@ object Translator { new TerminationTransformer ) - val transformedTask = transformers.foldLeft(task) { + transformers.foldLeft(task) { case (t, transformer) => transformer.transform(t) } - - config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => transformedTask.program, () => transformedTask.backtrack) - transformedTask } + def sortAst(program: vpr.Program): vpr.Program = { + implicit def domainOrdering: Ordering[vpr.Domain] = Ordering.by(_.name) + implicit def domainFnOrdering: Ordering[vpr.DomainFunc] = Ordering.by(_.name) + implicit def domainAxOrdering: Ordering[vpr.DomainAxiom] = Ordering.by(FastPrettyPrinter.pretty(_)) + implicit def fieldOrdering: Ordering[vpr.Field] = Ordering.by(_.name) + implicit def functionOrdering: Ordering[vpr.Function] = Ordering.by(_.name) + implicit def predicateOrdering: Ordering[vpr.Predicate] = Ordering.by(_.name) + implicit def methodOrdering: Ordering[vpr.Method] = Ordering.by(_.name) + implicit def extensionOrdering: Ordering[vpr.ExtensionMember] = Ordering.by(_.name) + + def sortDomain(domain: vpr.Domain): vpr.Domain = { + vpr.Domain( + domain.name, + domain.functions.sorted, + domain.axioms.sorted, + domain.typVars + )(domain.pos, domain.info, domain.errT) + } + + vpr.Program( + program.domains.map(sortDomain).sorted, + program.fields.sorted, + program.functions.sorted, + program.predicates.sorted, + program.methods.sorted, + program.extensions.sorted, + )(program.pos, program.info, program.errT) + } } diff --git a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala index 1809fa0c7..50465895c 100644 --- a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala +++ b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala @@ -6,13 +6,13 @@ package viper.gobra.translator.transformers import java.nio.file.Path - import viper.gobra.backend.BackendVerifier import viper.gobra.util.Violation import viper.silicon.Silicon import viper.silver.{ast => vpr} import viper.silver.frontend.{DefaultStates, ViperAstProvider} -import viper.silver.plugin.standard.termination.TerminationPlugin +import viper.silver.plugin.standard.predicateinstance.PredicateInstance.PredicateInstanceDomainName +import viper.silver.plugin.standard.termination.{DecreasesTuple, TerminationPlugin} import viper.silver.reporter.{NoopReporter, Reporter} import viper.silver.plugin.standard.predicateinstance.PredicateInstancePlugin @@ -26,9 +26,33 @@ class TerminationTransformer extends ViperTransformer { // constructs a separate Viper program (as a string) that should be parsed // after parsing this separate Viper program, the resulting AST is combined with `task` + val allImport = "decreases/all.vpr" + def type2Import(typ: vpr.Type): String = typ match { + case vpr.Bool => "decreases/bool.vpr" + case vpr.Int => "decreases/int.vpr" + case vpr.MultisetType(_) => "decreases/multiset.vpr" + case vpr.Perm => "decreases/rational.vpr" + case vpr.Ref => "decreases/ref.vpr" + case vpr.SeqType(_) => "decreases/seq.vpr" + case vpr.SetType(_) => "decreases/set.vpr" + case vpr.DomainType(name, _) if name == PredicateInstanceDomainName => "decreases/predicate_instance.vpr" + case _ => allImport // fallback + } + + // find the types of all expressions used as decreases measues + val measureTypes = task.program.deepCollect { + case DecreasesTuple(tupleExpressions, _) => tupleExpressions.map(_.typ) + }.flatten.distinct + // map these types to the respective files that should be imported + val imports = measureTypes + .map(type2Import) + .distinct + // if `allImport` is in the list of files that should be imported, we can ignore all others and instead only import + // `allImport` + val importsAll = imports.contains(allImport) /** list of Viper standard imports that should be parsed */ - val imports = Seq("decreases/all.vpr") - val progWithImports = imports.map(p => s"import <${p}>").mkString("\n") + val filteredImports = if (importsAll) Seq(allImport) else imports + val progWithImports = filteredImports.map(p => s"import <${p}>").mkString("\n") val vprProgram = parseVpr(progWithImports) combine(task, vprProgram) } From d7cbcfdfef25afbddcac02f96d4c65d8d1d69c5d Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 12 Oct 2022 17:29:06 +0200 Subject: [PATCH 015/296] reverts emitting the Viper encoding before performing the Viper-to-Viper transformations because termination measures are printed in invalid syntax --- src/main/scala/viper/gobra/translator/Translator.scala | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala index d84983a93..993a4c3d8 100644 --- a/src/main/scala/viper/gobra/translator/Translator.scala +++ b/src/main/scala/viper/gobra/translator/Translator.scala @@ -24,8 +24,6 @@ object Translator { val translationConfig = new DfltTranslatorConfig() val programTranslator = new ProgramsImpl() val task = programTranslator.translate(program)(translationConfig) - // we report the un-transformed program as this is much more readable - config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => sortAst(task.program), () => task.backtrack) if (config.checkConsistency) { val errors = task.program.checkTransitively @@ -37,9 +35,12 @@ object Translator { new TerminationTransformer ) - transformers.foldLeft(task) { + val transformedTask = transformers.foldLeft(task) { case (t, transformer) => transformer.transform(t) } + + config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => sortAst(transformedTask.program), () => transformedTask.backtrack) + transformedTask } def sortAst(program: vpr.Program): vpr.Program = { From 07a80d11ad16273f2cc8794edc6368655acc151f Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 13 Oct 2022 09:01:45 +0200 Subject: [PATCH 016/296] Updates submodules (#549) Co-authored-by: ArquintL --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index c2622f973..2e4743769 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit c2622f973135f8a25cd0680ae6f18e74530d9135 +Subproject commit 2e47437693fcdc32f8f18b7c923550c1143013d7 From 69df77694f5c14e5e035324dd1a09fd061817957 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 13 Oct 2022 11:18:00 +0200 Subject: [PATCH 017/296] implements CR suggestions by Joao --- .../viper/gobra/translator/Translator.scala | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala index 993a4c3d8..8cb2a1fab 100644 --- a/src/main/scala/viper/gobra/translator/Translator.scala +++ b/src/main/scala/viper/gobra/translator/Translator.scala @@ -43,15 +43,13 @@ object Translator { transformedTask } + /** + * sorts AST members alphabetically to ease the comparison of (similar) Viper ASTs + */ def sortAst(program: vpr.Program): vpr.Program = { - implicit def domainOrdering: Ordering[vpr.Domain] = Ordering.by(_.name) - implicit def domainFnOrdering: Ordering[vpr.DomainFunc] = Ordering.by(_.name) - implicit def domainAxOrdering: Ordering[vpr.DomainAxiom] = Ordering.by(FastPrettyPrinter.pretty(_)) - implicit def fieldOrdering: Ordering[vpr.Field] = Ordering.by(_.name) - implicit def functionOrdering: Ordering[vpr.Function] = Ordering.by(_.name) - implicit def predicateOrdering: Ordering[vpr.Predicate] = Ordering.by(_.name) - implicit def methodOrdering: Ordering[vpr.Method] = Ordering.by(_.name) - implicit def extensionOrdering: Ordering[vpr.ExtensionMember] = Ordering.by(_.name) + lazy val memberOrdering: Ordering[vpr.Member] = Ordering.by(_.name) + implicit lazy val domainFnOrdering: Ordering[vpr.DomainFunc] = Ordering.by(_.name) + implicit lazy val domainAxOrdering: Ordering[vpr.DomainAxiom] = Ordering.by(FastPrettyPrinter.pretty(_)) def sortDomain(domain: vpr.Domain): vpr.Domain = { vpr.Domain( @@ -63,12 +61,12 @@ object Translator { } vpr.Program( - program.domains.map(sortDomain).sorted, - program.fields.sorted, - program.functions.sorted, - program.predicates.sorted, - program.methods.sorted, - program.extensions.sorted, + program.domains.map(sortDomain).sorted(memberOrdering), + program.fields.sorted(memberOrdering), + program.functions.sorted(memberOrdering), + program.predicates.sorted(memberOrdering), + program.methods.sorted(memberOrdering), + program.extensions.sorted(memberOrdering), )(program.pos, program.info, program.errT) } } From d3a7682d9ad1f1b7b5092a76b18e751ede14bb48 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 13 Oct 2022 11:51:00 +0200 Subject: [PATCH 018/296] assigns expression in expression statement to a fresh variable to ensure that the expression does not get lost in the internal representation --- .../scala/viper/gobra/frontend/Desugar.scala | 10 +++++++-- .../features/purefuncs/unused-result.gobra | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/regressions/features/purefuncs/unused-result.gobra diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 262d201d3..f31ec1351 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -1032,8 +1032,14 @@ object Desugar { )) case PExpressionStmt(e) => - val w = goE(e) - create(stmts = w.stmts, decls = w.decls, res = in.Seqn(Vector.empty)(src)) + // assign the expression's value to a temporary variable because the expression can result in proof obligations + // (e.g. checking the precondition for a pure function call) + val tempVar = freshExclusiveVar(typeD(info.typ(e), Addressability.exclusiveVariable)(src), stmt, info)(src) + for { + _ <- declare(tempVar) + dE <- goE(e) + _ <- write(singleAss(in.Assignee.Var(tempVar), dE)(src)) + } yield in.Seqn(Vector.empty)(src) case PAssignment(right, left) => if (left.size == right.size) { diff --git a/src/test/resources/regressions/features/purefuncs/unused-result.gobra b/src/test/resources/regressions/features/purefuncs/unused-result.gobra new file mode 100644 index 000000000..14606ad4a --- /dev/null +++ b/src/test/resources/regressions/features/purefuncs/unused-result.gobra @@ -0,0 +1,22 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// checks that pure functions are correctly encoded even if there result is not used + +package functions + +requires false +pure func foo() bool { + return true +} + +func test1() { + //:: ExpectedOutput(precondition_error) + res := foo() + assert res +} + +func test2() { + //:: ExpectedOutput(precondition_error) + foo() +} From c468c36e42e8642ba708d498cb987d4d5de4118e Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 13 Oct 2022 17:34:20 +0200 Subject: [PATCH 019/296] fixes desugaring of expression stmts to support expressions returning a tuple of zero or more results --- .../scala/viper/gobra/frontend/Desugar.scala | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index f31ec1351..3316b2989 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -1032,14 +1032,36 @@ object Desugar { )) case PExpressionStmt(e) => - // assign the expression's value to a temporary variable because the expression can result in proof obligations - // (e.g. checking the precondition for a pure function call) - val tempVar = freshExclusiveVar(typeD(info.typ(e), Addressability.exclusiveVariable)(src), stmt, info)(src) - for { - _ <- declare(tempVar) - dE <- goE(e) - _ <- write(singleAss(in.Assignee.Var(tempVar), dE)(src)) - } yield in.Seqn(Vector.empty)(src) + def justLocalVars(e: in.Expr): Boolean = e match { + case _: in.LocalVar => true + case in.Tuple(args) if args.forall(justLocalVars) => true + case _ => false + } + + val w = goE(e) + // note that `w.res` might contain expressions that cause proof obligations + // thus, we can not simply drop them and go forward just with the writer's declarations & statements + if (justLocalVars(w.res)) { + // this is an optimization because it does not make sense to add additional temporary local variables + // just to assign them the local variables in `w.res`: + create(stmts = w.stmts, decls = w.decls, res = in.Seqn(Vector.empty)(src)) + } else { + // create temporary local variables to assign them the expression in `w.res` + val targetTypes = info.typ(e) match { + case InternalTupleT(ts) => ts + case t => Vector(t) + } + val targets = targetTypes.map(typ => freshExclusiveVar(typeD(typ, Addressability.exclusiveVariable)(src), stmt, info)(src)) + for { + _ <- declare(targets: _*) + dE <- w + _ <- targets match { + case Vector() => unit(()) // NOP + case Vector(target) => write(singleAss(in.Assignee.Var(target), dE)(src)) + case _ => write(multiassD(targets.map(in.Assignee.Var(_)), dE, stmt)(src)) + } + } yield in.Seqn(Vector.empty)(src) + } case PAssignment(right, left) => if (left.size == right.size) { From a573322d167a36c81b5d1af48425450048f88ee8 Mon Sep 17 00:00:00 2001 From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com> Date: Wed, 19 Oct 2022 19:45:57 +0200 Subject: [PATCH 020/296] Range (#551) * map range changes * range for maps and arrays/sclices * corrected parser and parser tests * removed shit and added some comments to the desugarer * made with clause optional * some feedback incorporation * more feedback * supporting for range * more feedback --- genparser.sh | 0 src/main/antlr4/GobraLexer.g4 | 1 + src/main/antlr4/GobraParser.g4 | 7 + .../java/viper/gobra/frontend/GobraLexer.java | 1387 +++++----- .../viper/gobra/frontend/GobraParser.java | 2397 +++++++++-------- .../frontend/GobraParserBaseVisitor.java | 18 +- .../gobra/frontend/GobraParserVisitor.java | 16 +- .../scala/viper/gobra/ast/frontend/Ast.scala | 4 +- .../gobra/ast/frontend/PrettyPrinter.scala | 9 +- .../scala/viper/gobra/frontend/Desugar.scala | 893 +++--- .../gobra/frontend/ParseTreeTranslator.scala | 21 +- .../frontend/info/base/SymbolTable.scala | 5 + .../resolution/NameResolution.scala | 4 +- .../info/implementation/typing/IdTyping.scala | 16 +- .../implementation/typing/MiscTyping.scala | 8 +- .../implementation/typing/StmtTyping.scala | 21 +- .../DefaultErrorBackTranslator.scala | 11 +- .../scala/viper/gobra/reporting/Source.scala | 3 +- .../viper/gobra/reporting/VerifierError.scala | 7 +- .../features/loops/range-fail1.gobra | 2 +- .../features/loops/range-fail2.gobra | 2 +- .../features/loops/range-fail3.gobra | 2 +- .../features/loops/range-fail4.gobra | 2 +- .../features/loops/range-fail5.gobra | 2 +- .../features/loops/range-fail6.gobra | 2 +- .../features/loops/range-fail7.gobra | 2 +- .../features/loops/range-fail8.gobra | 4 +- .../regressions/features/loops/range1.gobra | 27 +- .../regressions/features/loops/range2.gobra | 17 +- .../regressions/features/loops/range3.gobra | 29 + .../features/loops/range_maps-fail1.gobra | 13 + .../features/loops/range_maps1.gobra | 55 + 32 files changed, 2659 insertions(+), 2328 deletions(-) mode change 100644 => 100755 genparser.sh create mode 100644 src/test/resources/regressions/features/loops/range3.gobra create mode 100644 src/test/resources/regressions/features/loops/range_maps-fail1.gobra create mode 100644 src/test/resources/regressions/features/loops/range_maps1.gobra diff --git a/genparser.sh b/genparser.sh old mode 100644 new mode 100755 diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4 index 7db1c0e1f..db44fc749 100644 --- a/src/main/antlr4/GobraLexer.g4 +++ b/src/main/antlr4/GobraLexer.g4 @@ -85,3 +85,4 @@ IMPORT_PRE : 'importRequires'; PROOF : 'proof'; GHOST_EQUALS : '==='; GHOST_NOT_EQUALS : '!=='; +WITH : 'with'; diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 632f06bdd..5b1a4fe8d 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -434,3 +434,10 @@ assign_op: ass_op=( | AMPERSAND | BIT_CLEAR )? ASSIGN; + +// Add permission argument to range + +rangeClause: ( + expressionList ASSIGN + | maybeAddressableIdentifierList DECLARE_ASSIGN + )? RANGE expression (WITH IDENTIFIER?)?; diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 9eee0a38d..9f1810987 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,4 +1,4 @@ -// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraLexer.g4 by ANTLR 4.9.2 +// Generated from /main/antlr4/GobraLexer.g4 by ANTLR 4.9.1 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -11,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class GobraLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -27,21 +27,21 @@ public class GobraLexer extends Lexer { PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58, SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64, OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70, - BREAK=71, DEFAULT=72, FUNC=73, INTERFACE=74, SELECT=75, CASE=76, DEFER=77, - GO=78, MAP=79, STRUCT=80, CHAN=81, ELSE=82, GOTO=83, PACKAGE=84, SWITCH=85, - CONST=86, FALLTHROUGH=87, IF=88, RANGE=89, TYPE=90, CONTINUE=91, FOR=92, - IMPORT=93, RETURN=94, VAR=95, NIL_LIT=96, IDENTIFIER=97, L_PAREN=98, R_PAREN=99, - L_CURLY=100, R_CURLY=101, L_BRACKET=102, R_BRACKET=103, ASSIGN=104, COMMA=105, - SEMI=106, COLON=107, DOT=108, PLUS_PLUS=109, MINUS_MINUS=110, DECLARE_ASSIGN=111, - ELLIPSIS=112, LOGICAL_OR=113, LOGICAL_AND=114, EQUALS=115, NOT_EQUALS=116, - LESS=117, LESS_OR_EQUALS=118, GREATER=119, GREATER_OR_EQUALS=120, OR=121, - DIV=122, MOD=123, LSHIFT=124, RSHIFT=125, BIT_CLEAR=126, EXCLAMATION=127, - PLUS=128, MINUS=129, CARET=130, STAR=131, AMPERSAND=132, RECEIVE=133, - DECIMAL_LIT=134, BINARY_LIT=135, OCTAL_LIT=136, HEX_LIT=137, HEX_FLOAT_LIT=138, - IMAGINARY_LIT=139, RUNE_LIT=140, BYTE_VALUE=141, OCTAL_BYTE_VALUE=142, - HEX_BYTE_VALUE=143, LITTLE_U_VALUE=144, BIG_U_VALUE=145, RAW_STRING_LIT=146, - INTERPRETED_STRING_LIT=147, WS=148, COMMENT=149, TERMINATOR=150, LINE_COMMENT=151, - WS_NLSEMI=152, COMMENT_NLSEMI=153, LINE_COMMENT_NLSEMI=154, EOS=155, OTHER=156; + WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77, + DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85, + SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92, + FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99, + R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105, + COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111, + DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116, + NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121, + OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128, + PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134, + DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139, + IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143, + HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147, + INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152, + WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157; public static final int NLSEMI=1; public static String[] channelNames = { @@ -63,9 +63,9 @@ private static String[] makeRuleNames() { "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", - "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", - "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", - "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", + "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", + "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", @@ -96,15 +96,15 @@ private static String[] makeLiteralNames() { "'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", - "'importRequires'", "'proof'", "'==='", "'!=='", "'break'", "'default'", - "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", - "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", - "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", - "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", - "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", - "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", - "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", - "'^'", "'*'", "'&'", "'<-'" + "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'", + "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", + "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'", + "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", + "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, + "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", + "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", + "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", + "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -119,9 +119,9 @@ private static String[] makeSymbolicNames() { "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", - "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", - "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", - "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", + "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", + "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", @@ -213,7 +213,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u009e\u05bc\b\1\b"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u009f\u05c3\b\1\b"+ "\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n"+ "\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21"+ "\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30"+ @@ -236,665 +236,668 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+ "\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+ "\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+ - "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\3\2\3\2\5\2\u0159\n\2\3\2\3\2\3\3\3\3"+ - "\3\3\3\3\5\3\u0161\n\3\3\3\5\3\u0164\n\3\3\3\5\3\u0167\n\3\3\3\3\3\3\3"+ - "\3\3\5\3\u016d\n\3\5\3\u016f\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3"+ - "\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7"+ - "\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3"+ - "\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+ - "\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r"+ - "\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+ - "\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3"+ - "\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3"+ - "\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3"+ - "\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+ - "\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3"+ - "\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+ - "\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\36\3\36\3\36\3"+ - "\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 "+ - "\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3"+ - "#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3("+ - "\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,"+ - "\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/"+ - "\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3"+ - "\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3"+ - "\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3"+ - "\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\38\38\38\38\39\39"+ - "\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3="+ - "\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?"+ - "\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A"+ - "\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3D\3D\3D"+ - "\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3G"+ - "\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J"+ - "\3J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M"+ - "\3N\3N\3N\3N\3N\3N\3O\3O\3O\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R"+ - "\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V"+ - "\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X"+ - "\3X\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\"+ - "\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3"+ - "_\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3b\3b\3b\7b\u0407\nb\fb\16b\u040a"+ - "\13b\3b\3b\3c\3c\3d\3d\3d\3d\3e\3e\3f\3f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3"+ - "i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3p\3p\3p\3q\3"+ - "q\3q\3q\3r\3r\3r\3s\3s\3s\3t\3t\3t\3u\3u\3u\3v\3v\3w\3w\3w\3x\3x\3y\3"+ - "y\3y\3z\3z\3{\3{\3|\3|\3}\3}\3}\3~\3~\3~\3\177\3\177\3\177\3\u0080\3\u0080"+ - "\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085"+ - "\3\u0085\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u0472"+ - "\n\u0087\3\u0087\7\u0087\u0475\n\u0087\f\u0087\16\u0087\u0478\13\u0087"+ - "\5\u0087\u047a\n\u0087\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088"+ - "\u0481\n\u0088\3\u0088\6\u0088\u0484\n\u0088\r\u0088\16\u0088\u0485\3"+ - "\u0088\3\u0088\3\u0089\3\u0089\5\u0089\u048c\n\u0089\3\u0089\5\u0089\u048f"+ - "\n\u0089\3\u0089\6\u0089\u0492\n\u0089\r\u0089\16\u0089\u0493\3\u0089"+ - "\3\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u049b\n\u008a\3\u008a\6\u008a"+ - "\u049e\n\u008a\r\u008a\16\u008a\u049f\3\u008a\3\u008a\3\u008b\3\u008b"+ - "\3\u008b\3\u008b\3\u008b\3\u008c\5\u008c\u04aa\n\u008c\3\u008c\6\u008c"+ - "\u04ad\n\u008c\r\u008c\16\u008c\u04ae\3\u008c\3\u008c\5\u008c\u04b3\n"+ - "\u008c\3\u008c\7\u008c\u04b6\n\u008c\f\u008c\16\u008c\u04b9\13\u008c\5"+ - "\u008c\u04bb\n\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u04c0\n\u008c\3\u008c"+ - "\7\u008c\u04c3\n\u008c\f\u008c\16\u008c\u04c6\13\u008c\5\u008c\u04c8\n"+ - "\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e\3\u008e"+ - "\3\u008e\5\u008e\u04d3\n\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f"+ - "\3\u008f\3\u008f\5\u008f\u04dc\n\u008f\3\u008f\3\u008f\3\u0090\3\u0090"+ - "\3\u0090\3\u0090\3\u0091\3\u0091\5\u0091\u04e6\n\u0091\3\u0092\3\u0092"+ - "\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094"+ - "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095"+ - "\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0096"+ - "\3\u0096\7\u0096\u0506\n\u0096\f\u0096\16\u0096\u0509\13\u0096\3\u0096"+ - "\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\7\u0097\u0512\n\u0097"+ - "\f\u0097\16\u0097\u0515\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098"+ - "\6\u0098\u051c\n\u0098\r\u0098\16\u0098\u051d\3\u0098\3\u0098\3\u0099"+ - "\3\u0099\3\u0099\3\u0099\7\u0099\u0526\n\u0099\f\u0099\16\u0099\u0529"+ - "\13\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u009a\6\u009a\u0531"+ - "\n\u009a\r\u009a\16\u009a\u0532\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b"+ - "\3\u009b\7\u009b\u053b\n\u009b\f\u009b\16\u009b\u053e\13\u009b\3\u009b"+ - "\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u0546\n\u009c\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\5\u009d\u0562"+ - "\n\u009d\3\u009e\3\u009e\5\u009e\u0566\n\u009e\3\u009e\7\u009e\u0569\n"+ - "\u009e\f\u009e\16\u009e\u056c\13\u009e\3\u009f\3\u009f\3\u00a0\3\u00a0"+ - "\3\u00a1\3\u00a1\3\u00a2\3\u00a2\5\u00a2\u0576\n\u00a2\3\u00a2\3\u00a2"+ - "\3\u00a3\3\u00a3\5\u00a3\u057c\n\u00a3\3\u00a4\3\u00a4\3\u00a5\3\u00a5"+ - "\3\u00a6\6\u00a6\u0583\n\u00a6\r\u00a6\16\u00a6\u0584\3\u00a6\3\u00a6"+ - "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u058d\n\u00a7\f\u00a7\16\u00a7"+ - "\u0590\13\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8"+ - "\3\u00a8\3\u00a8\7\u00a8\u059b\n\u00a8\f\u00a8\16\u00a8\u059e\13\u00a8"+ - "\3\u00a8\3\u00a8\3\u00a9\6\u00a9\u05a3\n\u00a9\r\u00a9\16\u00a9\u05a4"+ - "\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9\u05ac\n\u00a9\f\u00a9"+ - "\16\u00a9\u05af\13\u00a9\3\u00a9\3\u00a9\3\u00a9\5\u00a9\u05b4\n\u00a9"+ - "\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u0527\u058e"+ - "\u05ad\2\u00ab\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16"+ - "\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\34"+ - "8\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65"+ - "j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008c"+ - "G\u008eH\u0090I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0"+ - "Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4"+ - "[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8"+ - "e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dc"+ - "o\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0"+ - "y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081"+ - "\u0102\u0082\u0104\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087"+ - "\u010e\u0088\u0110\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\2\u011a"+ - "\2\u011c\u008d\u011e\2\u0120\u008e\u0122\u008f\u0124\u0090\u0126\u0091"+ - "\u0128\u0092\u012a\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097"+ - "\u0134\u0098\u0136\u0099\u0138\2\u013a\2\u013c\2\u013e\2\u0140\2\u0142"+ - "\2\u0144\2\u0146\2\u0148\2\u014a\2\u014c\u009a\u014e\u009b\u0150\u009c"+ - "\u0152\u009d\u0154\u009e\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2"+ - "ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f"+ - "\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg"+ - "\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2"+ - "\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71"+ - "\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8"+ - "\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b"+ - "\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2"+ - "\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb"+ - "\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902"+ - "\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb"+ - "\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138"+ - "\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db"+ - "\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52"+ - "\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801"+ - "\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7"+ - "\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8"+ - "\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376"+ - "\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a"+ - "\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483"+ - "\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2"+ - "\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5"+ - "\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701"+ - "\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3"+ - "\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c"+ - "\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c"+ - "\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952"+ - "\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992"+ - "\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf"+ - "\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3"+ - "\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c"+ - "\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e"+ - "\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95"+ - "\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf"+ - "\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11"+ - "\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b"+ - "\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85"+ - "\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c"+ - "\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0"+ - "\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a"+ - "\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82"+ - "\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5"+ - "\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3"+ - "\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f"+ - "\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87"+ - "\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8"+ - "\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86"+ - "\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99"+ - "\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac"+ - "\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6"+ - "\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b"+ - "\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057"+ - "\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077"+ - "\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf"+ - "\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a"+ - "\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2"+ - "\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca"+ - "\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391"+ - "\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683"+ - "\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713"+ - "\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782"+ - "\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886"+ - "\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952"+ - "\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18"+ - "\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85"+ - "\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51"+ - "\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7"+ - "\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47"+ - "\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f"+ - "\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0"+ - "\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2"+ - "\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081"+ - "\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117"+ - "\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a"+ - "\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150"+ - "\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6"+ - "\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f"+ - "\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8"+ - "\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca"+ - "\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008"+ - "\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3"+ - "\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc"+ - "\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2"+ - "\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670"+ - "\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d"+ - "\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c"+ - "\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd"+ - "\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e"+ - "\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc"+ - "\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78"+ - "\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb"+ - "\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec"+ - "\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22"+ - "\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4"+ - "\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72"+ - "\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a"+ - "\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45"+ - "\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9"+ - "\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43"+ - "\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9"+ - "\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc"+ - "\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344"+ - "\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1"+ - "\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532"+ - "\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807"+ - "\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841"+ - "\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7"+ - "\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02"+ - "\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e"+ - "\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42"+ - "\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4"+ - "\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105"+ - "\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6"+ - "\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282"+ - "\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa"+ - "\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c"+ - "\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352"+ - "\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6"+ - "\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631"+ - "\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901"+ - "\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52"+ - "\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c"+ - "\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b"+ - "\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002"+ - "\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef"+ - "\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02"+ - "\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee"+ - "\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72"+ - "\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e"+ - "\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0"+ - "\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c"+ - "\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542"+ - "\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2"+ - "\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738"+ - "\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4"+ - "\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07"+ - "\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34"+ - "\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49"+ - "\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54"+ - "\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f"+ - "\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c"+ - "\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82"+ - "\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd"+ - "\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4"+ - "\uebe2\4\uf802\4\ufa1f\4\u05e7\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n"+ - "\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2"+ - "\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2"+ - " \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3"+ - "\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2"+ - "\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D"+ - "\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2"+ - "\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2"+ - "\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2"+ - "j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3"+ - "\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082"+ - "\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2"+ - "\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094"+ - "\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2"+ - "\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6"+ - "\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2"+ - "\2\2\u00b0\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8"+ - "\3\2\2\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2"+ - "\2\2\u00c2\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca"+ - "\3\2\2\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2"+ - "\2\2\u00d4\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc"+ - "\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2"+ - "\2\2\u00e6\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee"+ - "\3\2\2\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2"+ - "\2\2\u00f8\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100"+ - "\3\2\2\2\2\u0102\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2"+ - "\2\2\u010a\3\2\2\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112"+ - "\3\2\2\2\2\u0114\3\2\2\2\2\u0116\3\2\2\2\2\u011c\3\2\2\2\2\u0120\3\2\2"+ - "\2\2\u0122\3\2\2\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a"+ - "\3\2\2\2\2\u012c\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2"+ - "\2\2\u0134\3\2\2\2\2\u0136\3\2\2\2\3\u014c\3\2\2\2\3\u014e\3\2\2\2\3\u0150"+ - "\3\2\2\2\3\u0152\3\2\2\2\3\u0154\3\2\2\2\4\u0158\3\2\2\2\6\u016e\3\2\2"+ - "\2\b\u0170\3\2\2\2\n\u0177\3\2\2\2\f\u017f\3\2\2\2\16\u0186\3\2\2\2\20"+ - "\u018d\3\2\2\2\22\u0194\3\2\2\2\24\u019b\3\2\2\2\26\u01a4\3\2\2\2\30\u01ae"+ - "\3\2\2\2\32\u01b6\3\2\2\2\34\u01c0\3\2\2\2\36\u01cc\3\2\2\2 \u01d3\3\2"+ - "\2\2\"\u01de\3\2\2\2$\u01e1\3\2\2\2&\u01e7\3\2\2\2(\u01f0\3\2\2\2*\u01f5"+ - "\3\2\2\2,\u01fc\3\2\2\2.\u0203\3\2\2\2\60\u0209\3\2\2\2\62\u020e\3\2\2"+ - "\2\64\u0215\3\2\2\2\66\u021f\3\2\2\28\u0225\3\2\2\2:\u0228\3\2\2\2<\u022a"+ - "\3\2\2\2>\u0231\3\2\2\2@\u0237\3\2\2\2B\u0244\3\2\2\2D\u024d\3\2\2\2F"+ - "\u0251\3\2\2\2H\u0255\3\2\2\2J\u025b\3\2\2\2L\u025d\3\2\2\2N\u0260\3\2"+ - "\2\2P\u0265\3\2\2\2R\u026b\3\2\2\2T\u0271\3\2\2\2V\u0278\3\2\2\2X\u027f"+ - "\3\2\2\2Z\u0288\3\2\2\2\\\u028e\3\2\2\2^\u0294\3\2\2\2`\u029b\3\2\2\2"+ - "b\u02a1\3\2\2\2d\u02a8\3\2\2\2f\u02ae\3\2\2\2h\u02b7\3\2\2\2j\u02bf\3"+ - "\2\2\2l\u02c6\3\2\2\2n\u02cb\3\2\2\2p\u02d4\3\2\2\2r\u02e3\3\2\2\2t\u02e9"+ - "\3\2\2\2v\u02ed\3\2\2\2x\u02f0\3\2\2\2z\u02f7\3\2\2\2|\u0301\3\2\2\2~"+ - "\u030b\3\2\2\2\u0080\u0317\3\2\2\2\u0082\u0320\3\2\2\2\u0084\u032a\3\2"+ - "\2\2\u0086\u0332\3\2\2\2\u0088\u033e\3\2\2\2\u008a\u034d\3\2\2\2\u008c"+ - "\u0353\3\2\2\2\u008e\u0357\3\2\2\2\u0090\u035b\3\2\2\2\u0092\u0363\3\2"+ - "\2\2\u0094\u036b\3\2\2\2\u0096\u0370\3\2\2\2\u0098\u037a\3\2\2\2\u009a"+ - "\u0381\3\2\2\2\u009c\u0386\3\2\2\2\u009e\u038c\3\2\2\2\u00a0\u038f\3\2"+ - "\2\2\u00a2\u0393\3\2\2\2\u00a4\u039a\3\2\2\2\u00a6\u039f\3\2\2\2\u00a8"+ - "\u03a4\3\2\2\2\u00aa\u03a9\3\2\2\2\u00ac\u03b1\3\2\2\2\u00ae\u03b8\3\2"+ - "\2\2\u00b0\u03be\3\2\2\2\u00b2\u03cc\3\2\2\2\u00b4\u03cf\3\2\2\2\u00b6"+ - "\u03d5\3\2\2\2\u00b8\u03da\3\2\2\2\u00ba\u03e5\3\2\2\2\u00bc\u03e9\3\2"+ - "\2\2\u00be\u03f0\3\2\2\2\u00c0\u03f9\3\2\2\2\u00c2\u03fd\3\2\2\2\u00c4"+ - "\u0403\3\2\2\2\u00c6\u040d\3\2\2\2\u00c8\u040f\3\2\2\2\u00ca\u0413\3\2"+ - "\2\2\u00cc\u0415\3\2\2\2\u00ce\u0419\3\2\2\2\u00d0\u041b\3\2\2\2\u00d2"+ - "\u041f\3\2\2\2\u00d4\u0421\3\2\2\2\u00d6\u0423\3\2\2\2\u00d8\u0425\3\2"+ - "\2\2\u00da\u0427\3\2\2\2\u00dc\u0429\3\2\2\2\u00de\u042e\3\2\2\2\u00e0"+ - "\u0433\3\2\2\2\u00e2\u0436\3\2\2\2\u00e4\u043a\3\2\2\2\u00e6\u043d\3\2"+ - "\2\2\u00e8\u0440\3\2\2\2\u00ea\u0443\3\2\2\2\u00ec\u0446\3\2\2\2\u00ee"+ - "\u0448\3\2\2\2\u00f0\u044b\3\2\2\2\u00f2\u044d\3\2\2\2\u00f4\u0450\3\2"+ - "\2\2\u00f6\u0452\3\2\2\2\u00f8\u0454\3\2\2\2\u00fa\u0456\3\2\2\2\u00fc"+ - "\u0459\3\2\2\2\u00fe\u045c\3\2\2\2\u0100\u045f\3\2\2\2\u0102\u0461\3\2"+ - "\2\2\u0104\u0463\3\2\2\2\u0106\u0465\3\2\2\2\u0108\u0467\3\2\2\2\u010a"+ - "\u0469\3\2\2\2\u010c\u046b\3\2\2\2\u010e\u0479\3\2\2\2\u0110\u047d\3\2"+ - "\2\2\u0112\u0489\3\2\2\2\u0114\u0497\3\2\2\2\u0116\u04a3\3\2\2\2\u0118"+ - "\u04c7\3\2\2\2\u011a\u04c9\3\2\2\2\u011c\u04d2\3\2\2\2\u011e\u04d8\3\2"+ - "\2\2\u0120\u04df\3\2\2\2\u0122\u04e5\3\2\2\2\u0124\u04e7\3\2\2\2\u0126"+ - "\u04ec\3\2\2\2\u0128\u04f1\3\2\2\2\u012a\u04f8\3\2\2\2\u012c\u0503\3\2"+ - "\2\2\u012e\u050e\3\2\2\2\u0130\u051b\3\2\2\2\u0132\u0521\3\2\2\2\u0134"+ - "\u0530\3\2\2\2\u0136\u0536\3\2\2\2\u0138\u0545\3\2\2\2\u013a\u0547\3\2"+ - "\2\2\u013c\u0563\3\2\2\2\u013e\u056d\3\2\2\2\u0140\u056f\3\2\2\2\u0142"+ - "\u0571\3\2\2\2\u0144\u0573\3\2\2\2\u0146\u057b\3\2\2\2\u0148\u057d\3\2"+ - "\2\2\u014a\u057f\3\2\2\2\u014c\u0582\3\2\2\2\u014e\u0588\3\2\2\2\u0150"+ - "\u0596\3\2\2\2\u0152\u05b3\3\2\2\2\u0154\u05b7\3\2\2\2\u0156\u0159\5\6"+ - "\3\2\u0157\u0159\5\u0116\u008b\2\u0158\u0156\3\2\2\2\u0158\u0157\3\2\2"+ - "\2\u0159\u015a\3\2\2\2\u015a\u015b\b\2\2\2\u015b\5\3\2\2\2\u015c\u0166"+ - "\5\u013c\u009e\2\u015d\u015e\7\60\2\2\u015e\u0160\6\3\2\2\u015f\u0161"+ - "\5\u013c\u009e\2\u0160\u015f\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u0163\3"+ - "\2\2\2\u0162\u0164\5\u0144\u00a2\2\u0163\u0162\3\2\2\2\u0163\u0164\3\2"+ - "\2\2\u0164\u0167\3\2\2\2\u0165\u0167\5\u0144\u00a2\2\u0166\u015d\3\2\2"+ - "\2\u0166\u0165\3\2\2\2\u0167\u016f\3\2\2\2\u0168\u0169\7\60\2\2\u0169"+ - "\u016a\6\3\3\2\u016a\u016c\5\u013c\u009e\2\u016b\u016d\5\u0144\u00a2\2"+ - "\u016c\u016b\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u016f\3\2\2\2\u016e\u015c"+ - "\3\2\2\2\u016e\u0168\3\2\2\2\u016f\7\3\2\2\2\u0170\u0171\7v\2\2\u0171"+ - "\u0172\7t\2\2\u0172\u0173\7w\2\2\u0173\u0174\7g\2\2\u0174\u0175\3\2\2"+ - "\2\u0175\u0176\b\4\2\2\u0176\t\3\2\2\2\u0177\u0178\7h\2\2\u0178\u0179"+ - "\7c\2\2\u0179\u017a\7n\2\2\u017a\u017b\7u\2\2\u017b\u017c\7g\2\2\u017c"+ - "\u017d\3\2\2\2\u017d\u017e\b\5\2\2\u017e\13\3\2\2\2\u017f\u0180\7c\2\2"+ - "\u0180\u0181\7u\2\2\u0181\u0182\7u\2\2\u0182\u0183\7g\2\2\u0183\u0184"+ - "\7t\2\2\u0184\u0185\7v\2\2\u0185\r\3\2\2\2\u0186\u0187\7c\2\2\u0187\u0188"+ - "\7u\2\2\u0188\u0189\7u\2\2\u0189\u018a\7w\2\2\u018a\u018b\7o\2\2\u018b"+ - "\u018c\7g\2\2\u018c\17\3\2\2\2\u018d\u018e\7k\2\2\u018e\u018f\7p\2\2\u018f"+ - "\u0190\7j\2\2\u0190\u0191\7c\2\2\u0191\u0192\7n\2\2\u0192\u0193\7g\2\2"+ - "\u0193\21\3\2\2\2\u0194\u0195\7g\2\2\u0195\u0196\7z\2\2\u0196\u0197\7"+ - "j\2\2\u0197\u0198\7c\2\2\u0198\u0199\7n\2\2\u0199\u019a\7g\2\2\u019a\23"+ - "\3\2\2\2\u019b\u019c\7t\2\2\u019c\u019d\7g\2\2\u019d\u019e\7s\2\2\u019e"+ - "\u019f\7w\2\2\u019f\u01a0\7k\2\2\u01a0\u01a1\7t\2\2\u01a1\u01a2\7g\2\2"+ - "\u01a2\u01a3\7u\2\2\u01a3\25\3\2\2\2\u01a4\u01a5\7r\2\2\u01a5\u01a6\7"+ - "t\2\2\u01a6\u01a7\7g\2\2\u01a7\u01a8\7u\2\2\u01a8\u01a9\7g\2\2\u01a9\u01aa"+ - "\7t\2\2\u01aa\u01ab\7x\2\2\u01ab\u01ac\7g\2\2\u01ac\u01ad\7u\2\2\u01ad"+ - "\27\3\2\2\2\u01ae\u01af\7g\2\2\u01af\u01b0\7p\2\2\u01b0\u01b1\7u\2\2\u01b1"+ - "\u01b2\7w\2\2\u01b2\u01b3\7t\2\2\u01b3\u01b4\7g\2\2\u01b4\u01b5\7u\2\2"+ - "\u01b5\31\3\2\2\2\u01b6\u01b7\7k\2\2\u01b7\u01b8\7p\2\2\u01b8\u01b9\7"+ - "x\2\2\u01b9\u01ba\7c\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7k\2\2\u01bc\u01bd"+ - "\7c\2\2\u01bd\u01be\7p\2\2\u01be\u01bf\7v\2\2\u01bf\33\3\2\2\2\u01c0\u01c1"+ - "\7f\2\2\u01c1\u01c2\7g\2\2\u01c2\u01c3\7e\2\2\u01c3\u01c4\7t\2\2\u01c4"+ - "\u01c5\7g\2\2\u01c5\u01c6\7c\2\2\u01c6\u01c7\7u\2\2\u01c7\u01c8\7g\2\2"+ - "\u01c8\u01c9\7u\2\2\u01c9\u01ca\3\2\2\2\u01ca\u01cb\b\16\2\2\u01cb\35"+ - "\3\2\2\2\u01cc\u01cd\7r\2\2\u01cd\u01ce\7w\2\2\u01ce\u01cf\7t\2\2\u01cf"+ - "\u01d0\7g\2\2\u01d0\u01d1\3\2\2\2\u01d1\u01d2\b\17\2\2\u01d2\37\3\2\2"+ - "\2\u01d3\u01d4\7k\2\2\u01d4\u01d5\7o\2\2\u01d5\u01d6\7r\2\2\u01d6\u01d7"+ - "\7n\2\2\u01d7\u01d8\7g\2\2\u01d8\u01d9\7o\2\2\u01d9\u01da\7g\2\2\u01da"+ - "\u01db\7p\2\2\u01db\u01dc\7v\2\2\u01dc\u01dd\7u\2\2\u01dd!\3\2\2\2\u01de"+ - "\u01df\7c\2\2\u01df\u01e0\7u\2\2\u01e0#\3\2\2\2\u01e1\u01e2\7q\2\2\u01e2"+ - "\u01e3\7n\2\2\u01e3\u01e4\7f\2\2\u01e4\u01e5\3\2\2\2\u01e5\u01e6\b\22"+ - "\2\2\u01e6%\3\2\2\2\u01e7\u01e8\7d\2\2\u01e8\u01e9\7g\2\2\u01e9\u01ea"+ - "\7h\2\2\u01ea\u01eb\7q\2\2\u01eb\u01ec\7t\2\2\u01ec\u01ed\7g\2\2\u01ed"+ - "\u01ee\3\2\2\2\u01ee\u01ef\b\23\2\2\u01ef\'\3\2\2\2\u01f0\u01f1\7%\2\2"+ - "\u01f1\u01f2\7n\2\2\u01f2\u01f3\7j\2\2\u01f3\u01f4\7u\2\2\u01f4)\3\2\2"+ - "\2\u01f5\u01f6\7h\2\2\u01f6\u01f7\7q\2\2\u01f7\u01f8\7t\2\2\u01f8\u01f9"+ - "\7c\2\2\u01f9\u01fa\7n\2\2\u01fa\u01fb\7n\2\2\u01fb+\3\2\2\2\u01fc\u01fd"+ - "\7g\2\2\u01fd\u01fe\7z\2\2\u01fe\u01ff\7k\2\2\u01ff\u0200\7u\2\2\u0200"+ - "\u0201\7v\2\2\u0201\u0202\7u\2\2\u0202-\3\2\2\2\u0203\u0204\7c\2\2\u0204"+ - "\u0205\7e\2\2\u0205\u0206\7e\2\2\u0206\u0207\3\2\2\2\u0207\u0208\b\27"+ - "\2\2\u0208/\3\2\2\2\u0209\u020a\7h\2\2\u020a\u020b\7q\2\2\u020b\u020c"+ - "\7n\2\2\u020c\u020d\7f\2\2\u020d\61\3\2\2\2\u020e\u020f\7w\2\2\u020f\u0210"+ - "\7p\2\2\u0210\u0211\7h\2\2\u0211\u0212\7q\2\2\u0212\u0213\7n\2\2\u0213"+ - "\u0214\7f\2\2\u0214\63\3\2\2\2\u0215\u0216\7w\2\2\u0216\u0217\7p\2\2\u0217"+ - "\u0218\7h\2\2\u0218\u0219\7q\2\2\u0219\u021a\7n\2\2\u021a\u021b\7f\2\2"+ - "\u021b\u021c\7k\2\2\u021c\u021d\7p\2\2\u021d\u021e\7i\2\2\u021e\65\3\2"+ - "\2\2\u021f\u0220\7i\2\2\u0220\u0221\7j\2\2\u0221\u0222\7q\2\2\u0222\u0223"+ - "\7u\2\2\u0223\u0224\7v\2\2\u0224\67\3\2\2\2\u0225\u0226\7k\2\2\u0226\u0227"+ - "\7p\2\2\u02279\3\2\2\2\u0228\u0229\7%\2\2\u0229;\3\2\2\2\u022a\u022b\7"+ - "u\2\2\u022b\u022c\7w\2\2\u022c\u022d\7d\2\2\u022d\u022e\7u\2\2\u022e\u022f"+ - "\7g\2\2\u022f\u0230\7v\2\2\u0230=\3\2\2\2\u0231\u0232\7w\2\2\u0232\u0233"+ - "\7p\2\2\u0233\u0234\7k\2\2\u0234\u0235\7q\2\2\u0235\u0236\7p\2\2\u0236"+ - "?\3\2\2\2\u0237\u0238\7k\2\2\u0238\u0239\7p\2\2\u0239\u023a\7v\2\2\u023a"+ - "\u023b\7g\2\2\u023b\u023c\7t\2\2\u023c\u023d\7u\2\2\u023d\u023e\7g\2\2"+ - "\u023e\u023f\7e\2\2\u023f\u0240\7v\2\2\u0240\u0241\7k\2\2\u0241\u0242"+ - "\7q\2\2\u0242\u0243\7p\2\2\u0243A\3\2\2\2\u0244\u0245\7u\2\2\u0245\u0246"+ - "\7g\2\2\u0246\u0247\7v\2\2\u0247\u0248\7o\2\2\u0248\u0249\7k\2\2\u0249"+ - "\u024a\7p\2\2\u024a\u024b\7w\2\2\u024b\u024c\7u\2\2\u024cC\3\2\2\2\u024d"+ - "\u024e\7?\2\2\u024e\u024f\7?\2\2\u024f\u0250\7@\2\2\u0250E\3\2\2\2\u0251"+ - "\u0252\7/\2\2\u0252\u0253\7/\2\2\u0253\u0254\7,\2\2\u0254G\3\2\2\2\u0255"+ - "\u0256\7c\2\2\u0256\u0257\7r\2\2\u0257\u0258\7r\2\2\u0258\u0259\7n\2\2"+ - "\u0259\u025a\7{\2\2\u025aI\3\2\2\2\u025b\u025c\7A\2\2\u025cK\3\2\2\2\u025d"+ - "\u025e\7#\2\2\u025e\u025f\7>\2\2\u025fM\3\2\2\2\u0260\u0261\7#\2\2\u0261"+ - "\u0262\7@\2\2\u0262\u0263\3\2\2\2\u0263\u0264\b\'\2\2\u0264O\3\2\2\2\u0265"+ - "\u0266\7u\2\2\u0266\u0267\7g\2\2\u0267\u0268\7s\2\2\u0268\u0269\3\2\2"+ - "\2\u0269\u026a\b(\2\2\u026aQ\3\2\2\2\u026b\u026c\7u\2\2\u026c\u026d\7"+ - "g\2\2\u026d\u026e\7v\2\2\u026e\u026f\3\2\2\2\u026f\u0270\b)\2\2\u0270"+ - "S\3\2\2\2\u0271\u0272\7o\2\2\u0272\u0273\7u\2\2\u0273\u0274\7g\2\2\u0274"+ - "\u0275\7v\2\2\u0275\u0276\3\2\2\2\u0276\u0277\b*\2\2\u0277U\3\2\2\2\u0278"+ - "\u0279\7f\2\2\u0279\u027a\7k\2\2\u027a\u027b\7e\2\2\u027b\u027c\7v\2\2"+ - "\u027c\u027d\3\2\2\2\u027d\u027e\b+\2\2\u027eW\3\2\2\2\u027f\u0280\7q"+ - "\2\2\u0280\u0281\7r\2\2\u0281\u0282\7v\2\2\u0282\u0283\7k\2\2\u0283\u0284"+ - "\7q\2\2\u0284\u0285\7p\2\2\u0285\u0286\3\2\2\2\u0286\u0287\b,\2\2\u0287"+ - "Y\3\2\2\2\u0288\u0289\7n\2\2\u0289\u028a\7g\2\2\u028a\u028b\7p\2\2\u028b"+ - "\u028c\3\2\2\2\u028c\u028d\b-\2\2\u028d[\3\2\2\2\u028e\u028f\7p\2\2\u028f"+ - "\u0290\7g\2\2\u0290\u0291\7y\2\2\u0291\u0292\3\2\2\2\u0292\u0293\b.\2"+ - "\2\u0293]\3\2\2\2\u0294\u0295\7o\2\2\u0295\u0296\7c\2\2\u0296\u0297\7"+ - "m\2\2\u0297\u0298\7g\2\2\u0298\u0299\3\2\2\2\u0299\u029a\b/\2\2\u029a"+ - "_\3\2\2\2\u029b\u029c\7e\2\2\u029c\u029d\7c\2\2\u029d\u029e\7r\2\2\u029e"+ - "\u029f\3\2\2\2\u029f\u02a0\b\60\2\2\u02a0a\3\2\2\2\u02a1\u02a2\7u\2\2"+ - "\u02a2\u02a3\7q\2\2\u02a3\u02a4\7o\2\2\u02a4\u02a5\7g\2\2\u02a5\u02a6"+ - "\3\2\2\2\u02a6\u02a7\b\61\2\2\u02a7c\3\2\2\2\u02a8\u02a9\7i\2\2\u02a9"+ - "\u02aa\7g\2\2\u02aa\u02ab\7v\2\2\u02ab\u02ac\3\2\2\2\u02ac\u02ad\b\62"+ - "\2\2\u02ade\3\2\2\2\u02ae\u02af\7f\2\2\u02af\u02b0\7q\2\2\u02b0\u02b1"+ - "\7o\2\2\u02b1\u02b2\7c\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b4\7p\2\2\u02b4"+ - "\u02b5\3\2\2\2\u02b5\u02b6\b\63\2\2\u02b6g\3\2\2\2\u02b7\u02b8\7c\2\2"+ - "\u02b8\u02b9\7z\2\2\u02b9\u02ba\7k\2\2\u02ba\u02bb\7q\2\2\u02bb\u02bc"+ - "\7o\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02be\b\64\2\2\u02bei\3\2\2\2\u02bf"+ - "\u02c0\7p\2\2\u02c0\u02c1\7q\2\2\u02c1\u02c2\7p\2\2\u02c2\u02c3\7g\2\2"+ - "\u02c3\u02c4\3\2\2\2\u02c4\u02c5\b\65\2\2\u02c5k\3\2\2\2\u02c6\u02c7\7"+ - "r\2\2\u02c7\u02c8\7t\2\2\u02c8\u02c9\7g\2\2\u02c9\u02ca\7f\2\2\u02cam"+ - "\3\2\2\2\u02cb\u02cc\7v\2\2\u02cc\u02cd\7{\2\2\u02cd\u02ce\7r\2\2\u02ce"+ - "\u02cf\7g\2\2\u02cf\u02d0\7Q\2\2\u02d0\u02d1\7h\2\2\u02d1\u02d2\3\2\2"+ - "\2\u02d2\u02d3\b\67\2\2\u02d3o\3\2\2\2\u02d4\u02d5\7k\2\2\u02d5\u02d6"+ - "\7u\2\2\u02d6\u02d7\7E\2\2\u02d7\u02d8\7q\2\2\u02d8\u02d9\7o\2\2\u02d9"+ - "\u02da\7r\2\2\u02da\u02db\7c\2\2\u02db\u02dc\7t\2\2\u02dc\u02dd\7c\2\2"+ - "\u02dd\u02de\7d\2\2\u02de\u02df\7n\2\2\u02df\u02e0\7g\2\2\u02e0\u02e1"+ - "\3\2\2\2\u02e1\u02e2\b8\2\2\u02e2q\3\2\2\2\u02e3\u02e4\7u\2\2\u02e4\u02e5"+ - "\7j\2\2\u02e5\u02e6\7c\2\2\u02e6\u02e7\7t\2\2\u02e7\u02e8\7g\2\2\u02e8"+ - "s\3\2\2\2\u02e9\u02ea\7B\2\2\u02ea\u02eb\3\2\2\2\u02eb\u02ec\b:\2\2\u02ec"+ - "u\3\2\2\2\u02ed\u02ee\7\60\2\2\u02ee\u02ef\7\60\2\2\u02efw\3\2\2\2\u02f0"+ - "\u02f1\7u\2\2\u02f1\u02f2\7j\2\2\u02f2\u02f3\7c\2\2\u02f3\u02f4\7t\2\2"+ - "\u02f4\u02f5\7g\2\2\u02f5\u02f6\7f\2\2\u02f6y\3\2\2\2\u02f7\u02f8\7g\2"+ - "\2\u02f8\u02f9\7z\2\2\u02f9\u02fa\7e\2\2\u02fa\u02fb\7n\2\2\u02fb\u02fc"+ - "\7w\2\2\u02fc\u02fd\7u\2\2\u02fd\u02fe\7k\2\2\u02fe\u02ff\7x\2\2\u02ff"+ - "\u0300\7g\2\2\u0300{\3\2\2\2\u0301\u0302\7r\2\2\u0302\u0303\7t\2\2\u0303"+ - "\u0304\7g\2\2\u0304\u0305\7f\2\2\u0305\u0306\7k\2\2\u0306\u0307\7e\2\2"+ - "\u0307\u0308\7c\2\2\u0308\u0309\7v\2\2\u0309\u030a\7g\2\2\u030a}\3\2\2"+ - "\2\u030b\u030c\7y\2\2\u030c\u030d\7t\2\2\u030d\u030e\7k\2\2\u030e\u030f"+ - "\7v\2\2\u030f\u0310\7g\2\2\u0310\u0311\7R\2\2\u0311\u0312\7g\2\2\u0312"+ - "\u0313\7t\2\2\u0313\u0314\7o\2\2\u0314\u0315\3\2\2\2\u0315\u0316\b?\2"+ - "\2\u0316\177\3\2\2\2\u0317\u0318\7p\2\2\u0318\u0319\7q\2\2\u0319\u031a"+ - "\7R\2\2\u031a\u031b\7g\2\2\u031b\u031c\7t\2\2\u031c\u031d\7o\2\2\u031d"+ - "\u031e\3\2\2\2\u031e\u031f\b@\2\2\u031f\u0081\3\2\2\2\u0320\u0321\7v\2"+ - "\2\u0321\u0322\7t\2\2\u0322\u0323\7w\2\2\u0323\u0324\7u\2\2\u0324\u0325"+ - "\7v\2\2\u0325\u0326\7g\2\2\u0326\u0327\7f\2\2\u0327\u0328\3\2\2\2\u0328"+ - "\u0329\bA\2\2\u0329\u0083\3\2\2\2\u032a\u032b\7q\2\2\u032b\u032c\7w\2"+ - "\2\u032c\u032d\7v\2\2\u032d\u032e\7n\2\2\u032e\u032f\7k\2\2\u032f\u0330"+ - "\7p\2\2\u0330\u0331\7g\2\2\u0331\u0085\3\2\2\2\u0332\u0333\7k\2\2\u0333"+ - "\u0334\7p\2\2\u0334\u0335\7k\2\2\u0335\u0336\7v\2\2\u0336\u0337\7G\2\2"+ - "\u0337\u0338\7p\2\2\u0338\u0339\7u\2\2\u0339\u033a\7w\2\2\u033a\u033b"+ - "\7t\2\2\u033b\u033c\7g\2\2\u033c\u033d\7u\2\2\u033d\u0087\3\2\2\2\u033e"+ - "\u033f\7k\2\2\u033f\u0340\7o\2\2\u0340\u0341\7r\2\2\u0341\u0342\7q\2\2"+ - "\u0342\u0343\7t\2\2\u0343\u0344\7v\2\2\u0344\u0345\7T\2\2\u0345\u0346"+ - "\7g\2\2\u0346\u0347\7s\2\2\u0347\u0348\7w\2\2\u0348\u0349\7k\2\2\u0349"+ - "\u034a\7t\2\2\u034a\u034b\7g\2\2\u034b\u034c\7u\2\2\u034c\u0089\3\2\2"+ - "\2\u034d\u034e\7r\2\2\u034e\u034f\7t\2\2\u034f\u0350\7q\2\2\u0350\u0351"+ - "\7q\2\2\u0351\u0352\7h\2\2\u0352\u008b\3\2\2\2\u0353\u0354\7?\2\2\u0354"+ - "\u0355\7?\2\2\u0355\u0356\7?\2\2\u0356\u008d\3\2\2\2\u0357\u0358\7#\2"+ - "\2\u0358\u0359\7?\2\2\u0359\u035a\7?\2\2\u035a\u008f\3\2\2\2\u035b\u035c"+ - "\7d\2\2\u035c\u035d\7t\2\2\u035d\u035e\7g\2\2\u035e\u035f\7c\2\2\u035f"+ - "\u0360\7m\2\2\u0360\u0361\3\2\2\2\u0361\u0362\bH\2\2\u0362\u0091\3\2\2"+ - "\2\u0363\u0364\7f\2\2\u0364\u0365\7g\2\2\u0365\u0366\7h\2\2\u0366\u0367"+ - "\7c\2\2\u0367\u0368\7w\2\2\u0368\u0369\7n\2\2\u0369\u036a\7v\2\2\u036a"+ - "\u0093\3\2\2\2\u036b\u036c\7h\2\2\u036c\u036d\7w\2\2\u036d\u036e\7p\2"+ - "\2\u036e\u036f\7e\2\2\u036f\u0095\3\2\2\2\u0370\u0371\7k\2\2\u0371\u0372"+ - "\7p\2\2\u0372\u0373\7v\2\2\u0373\u0374\7g\2\2\u0374\u0375\7t\2\2\u0375"+ - "\u0376\7h\2\2\u0376\u0377\7c\2\2\u0377\u0378\7e\2\2\u0378\u0379\7g\2\2"+ - "\u0379\u0097\3\2\2\2\u037a\u037b\7u\2\2\u037b\u037c\7g\2\2\u037c\u037d"+ - "\7n\2\2\u037d\u037e\7g\2\2\u037e\u037f\7e\2\2\u037f\u0380\7v\2\2\u0380"+ - "\u0099\3\2\2\2\u0381\u0382\7e\2\2\u0382\u0383\7c\2\2\u0383\u0384\7u\2"+ - "\2\u0384\u0385\7g\2\2\u0385\u009b\3\2\2\2\u0386\u0387\7f\2\2\u0387\u0388"+ - "\7g\2\2\u0388\u0389\7h\2\2\u0389\u038a\7g\2\2\u038a\u038b\7t\2\2\u038b"+ - "\u009d\3\2\2\2\u038c\u038d\7i\2\2\u038d\u038e\7q\2\2\u038e\u009f\3\2\2"+ - "\2\u038f\u0390\7o\2\2\u0390\u0391\7c\2\2\u0391\u0392\7r\2\2\u0392\u00a1"+ - "\3\2\2\2\u0393\u0394\7u\2\2\u0394\u0395\7v\2\2\u0395\u0396\7t\2\2\u0396"+ - "\u0397\7w\2\2\u0397\u0398\7e\2\2\u0398\u0399\7v\2\2\u0399\u00a3\3\2\2"+ - "\2\u039a\u039b\7e\2\2\u039b\u039c\7j\2\2\u039c\u039d\7c\2\2\u039d\u039e"+ - "\7p\2\2\u039e\u00a5\3\2\2\2\u039f\u03a0\7g\2\2\u03a0\u03a1\7n\2\2\u03a1"+ - "\u03a2\7u\2\2\u03a2\u03a3\7g\2\2\u03a3\u00a7\3\2\2\2\u03a4\u03a5\7i\2"+ - "\2\u03a5\u03a6\7q\2\2\u03a6\u03a7\7v\2\2\u03a7\u03a8\7q\2\2\u03a8\u00a9"+ - "\3\2\2\2\u03a9\u03aa\7r\2\2\u03aa\u03ab\7c\2\2\u03ab\u03ac\7e\2\2\u03ac"+ - "\u03ad\7m\2\2\u03ad\u03ae\7c\2\2\u03ae\u03af\7i\2\2\u03af\u03b0\7g\2\2"+ - "\u03b0\u00ab\3\2\2\2\u03b1\u03b2\7u\2\2\u03b2\u03b3\7y\2\2\u03b3\u03b4"+ - "\7k\2\2\u03b4\u03b5\7v\2\2\u03b5\u03b6\7e\2\2\u03b6\u03b7\7j\2\2\u03b7"+ - "\u00ad\3\2\2\2\u03b8\u03b9\7e\2\2\u03b9\u03ba\7q\2\2\u03ba\u03bb\7p\2"+ - "\2\u03bb\u03bc\7u\2\2\u03bc\u03bd\7v\2\2\u03bd\u00af\3\2\2\2\u03be\u03bf"+ - "\7h\2\2\u03bf\u03c0\7c\2\2\u03c0\u03c1\7n\2\2\u03c1\u03c2\7n\2\2\u03c2"+ - "\u03c3\7v\2\2\u03c3\u03c4\7j\2\2\u03c4\u03c5\7t\2\2\u03c5\u03c6\7q\2\2"+ - "\u03c6\u03c7\7w\2\2\u03c7\u03c8\7i\2\2\u03c8\u03c9\7j\2\2\u03c9\u03ca"+ - "\3\2\2\2\u03ca\u03cb\bX\2\2\u03cb\u00b1\3\2\2\2\u03cc\u03cd\7k\2\2\u03cd"+ - "\u03ce\7h\2\2\u03ce\u00b3\3\2\2\2\u03cf\u03d0\7t\2\2\u03d0\u03d1\7c\2"+ - "\2\u03d1\u03d2\7p\2\2\u03d2\u03d3\7i\2\2\u03d3\u03d4\7g\2\2\u03d4\u00b5"+ - "\3\2\2\2\u03d5\u03d6\7v\2\2\u03d6\u03d7\7{\2\2\u03d7\u03d8\7r\2\2\u03d8"+ - "\u03d9\7g\2\2\u03d9\u00b7\3\2\2\2\u03da\u03db\7e\2\2\u03db\u03dc\7q\2"+ - "\2\u03dc\u03dd\7p\2\2\u03dd\u03de\7v\2\2\u03de\u03df\7k\2\2\u03df\u03e0"+ - "\7p\2\2\u03e0\u03e1\7w\2\2\u03e1\u03e2\7g\2\2\u03e2\u03e3\3\2\2\2\u03e3"+ - "\u03e4\b\\\2\2\u03e4\u00b9\3\2\2\2\u03e5\u03e6\7h\2\2\u03e6\u03e7\7q\2"+ - "\2\u03e7\u03e8\7t\2\2\u03e8\u00bb\3\2\2\2\u03e9\u03ea\7k\2\2\u03ea\u03eb"+ - "\7o\2\2\u03eb\u03ec\7r\2\2\u03ec\u03ed\7q\2\2\u03ed\u03ee\7t\2\2\u03ee"+ - "\u03ef\7v\2\2\u03ef\u00bd\3\2\2\2\u03f0\u03f1\7t\2\2\u03f1\u03f2\7g\2"+ - "\2\u03f2\u03f3\7v\2\2\u03f3\u03f4\7w\2\2\u03f4\u03f5\7t\2\2\u03f5\u03f6"+ - "\7p\2\2\u03f6\u03f7\3\2\2\2\u03f7\u03f8\b_\2\2\u03f8\u00bf\3\2\2\2\u03f9"+ - "\u03fa\7x\2\2\u03fa\u03fb\7c\2\2\u03fb\u03fc\7t\2\2\u03fc\u00c1\3\2\2"+ - "\2\u03fd\u03fe\7p\2\2\u03fe\u03ff\7k\2\2\u03ff\u0400\7n\2\2\u0400\u0401"+ - "\3\2\2\2\u0401\u0402\ba\2\2\u0402\u00c3\3\2\2\2\u0403\u0408\5\u0146\u00a3"+ - "\2\u0404\u0407\5\u0146\u00a3\2\u0405\u0407\5\u0148\u00a4\2\u0406\u0404"+ - "\3\2\2\2\u0406\u0405\3\2\2\2\u0407\u040a\3\2\2\2\u0408\u0406\3\2\2\2\u0408"+ - "\u0409\3\2\2\2\u0409\u040b\3\2\2\2\u040a\u0408\3\2\2\2\u040b\u040c\bb"+ - "\2\2\u040c\u00c5\3\2\2\2\u040d\u040e\7*\2\2\u040e\u00c7\3\2\2\2\u040f"+ - "\u0410\7+\2\2\u0410\u0411\3\2\2\2\u0411\u0412\bd\2\2\u0412\u00c9\3\2\2"+ - "\2\u0413\u0414\7}\2\2\u0414\u00cb\3\2\2\2\u0415\u0416\7\177\2\2\u0416"+ - "\u0417\3\2\2\2\u0417\u0418\bf\2\2\u0418\u00cd\3\2\2\2\u0419\u041a\7]\2"+ - "\2\u041a\u00cf\3\2\2\2\u041b\u041c\7_\2\2\u041c\u041d\3\2\2\2\u041d\u041e"+ - "\bh\2\2\u041e\u00d1\3\2\2\2\u041f\u0420\7?\2\2\u0420\u00d3\3\2\2\2\u0421"+ - "\u0422\7.\2\2\u0422\u00d5\3\2\2\2\u0423\u0424\7=\2\2\u0424\u00d7\3\2\2"+ - "\2\u0425\u0426\7<\2\2\u0426\u00d9\3\2\2\2\u0427\u0428\7\60\2\2\u0428\u00db"+ - "\3\2\2\2\u0429\u042a\7-\2\2\u042a\u042b\7-\2\2\u042b\u042c\3\2\2\2\u042c"+ - "\u042d\bn\2\2\u042d\u00dd\3\2\2\2\u042e\u042f\7/\2\2\u042f\u0430\7/\2"+ - "\2\u0430\u0431\3\2\2\2\u0431\u0432\bo\2\2\u0432\u00df\3\2\2\2\u0433\u0434"+ - "\7<\2\2\u0434\u0435\7?\2\2\u0435\u00e1\3\2\2\2\u0436\u0437\7\60\2\2\u0437"+ - "\u0438\7\60\2\2\u0438\u0439\7\60\2\2\u0439\u00e3\3\2\2\2\u043a\u043b\7"+ - "~\2\2\u043b\u043c\7~\2\2\u043c\u00e5\3\2\2\2\u043d\u043e\7(\2\2\u043e"+ - "\u043f\7(\2\2\u043f\u00e7\3\2\2\2\u0440\u0441\7?\2\2\u0441\u0442\7?\2"+ - "\2\u0442\u00e9\3\2\2\2\u0443\u0444\7#\2\2\u0444\u0445\7?\2\2\u0445\u00eb"+ - "\3\2\2\2\u0446\u0447\7>\2\2\u0447\u00ed\3\2\2\2\u0448\u0449\7>\2\2\u0449"+ - "\u044a\7?\2\2\u044a\u00ef\3\2\2\2\u044b\u044c\7@\2\2\u044c\u00f1\3\2\2"+ - "\2\u044d\u044e\7@\2\2\u044e\u044f\7?\2\2\u044f\u00f3\3\2\2\2\u0450\u0451"+ - "\7~\2\2\u0451\u00f5\3\2\2\2\u0452\u0453\7\61\2\2\u0453\u00f7\3\2\2\2\u0454"+ - "\u0455\7\'\2\2\u0455\u00f9\3\2\2\2\u0456\u0457\7>\2\2\u0457\u0458\7>\2"+ - "\2\u0458\u00fb\3\2\2\2\u0459\u045a\7@\2\2\u045a\u045b\7@\2\2\u045b\u00fd"+ - "\3\2\2\2\u045c\u045d\7(\2\2\u045d\u045e\7`\2\2\u045e\u00ff\3\2\2\2\u045f"+ - "\u0460\7#\2\2\u0460\u0101\3\2\2\2\u0461\u0462\7-\2\2\u0462\u0103\3\2\2"+ - "\2\u0463\u0464\7/\2\2\u0464\u0105\3\2\2\2\u0465\u0466\7`\2\2\u0466\u0107"+ - "\3\2\2\2\u0467\u0468\7,\2\2\u0468\u0109\3\2\2\2\u0469\u046a\7(\2\2\u046a"+ - "\u010b\3\2\2\2\u046b\u046c\7>\2\2\u046c\u046d\7/\2\2\u046d\u010d\3\2\2"+ - "\2\u046e\u047a\7\62\2\2\u046f\u0476\t\2\2\2\u0470\u0472\7a\2\2\u0471\u0470"+ - "\3\2\2\2\u0471\u0472\3\2\2\2\u0472\u0473\3\2\2\2\u0473\u0475\t\3\2\2\u0474"+ - "\u0471\3\2\2\2\u0475\u0478\3\2\2\2\u0476\u0474\3\2\2\2\u0476\u0477\3\2"+ - "\2\2\u0477\u047a\3\2\2\2\u0478\u0476\3\2\2\2\u0479\u046e\3\2\2\2\u0479"+ - "\u046f\3\2\2\2\u047a\u047b\3\2\2\2\u047b\u047c\b\u0087\2\2\u047c\u010f"+ - "\3\2\2\2\u047d\u047e\7\62\2\2\u047e\u0483\t\4\2\2\u047f\u0481\7a\2\2\u0480"+ - "\u047f\3\2\2\2\u0480\u0481\3\2\2\2\u0481\u0482\3\2\2\2\u0482\u0484\5\u0142"+ - "\u00a1\2\u0483\u0480\3\2\2\2\u0484\u0485\3\2\2\2\u0485\u0483\3\2\2\2\u0485"+ - "\u0486\3\2\2\2\u0486\u0487\3\2\2\2\u0487\u0488\b\u0088\2\2\u0488\u0111"+ - "\3\2\2\2\u0489\u048b\7\62\2\2\u048a\u048c\t\5\2\2\u048b\u048a\3\2\2\2"+ - "\u048b\u048c\3\2\2\2\u048c\u0491\3\2\2\2\u048d\u048f\7a\2\2\u048e\u048d"+ - "\3\2\2\2\u048e\u048f\3\2\2\2\u048f\u0490\3\2\2\2\u0490\u0492\5\u013e\u009f"+ - "\2\u0491\u048e\3\2\2\2\u0492\u0493\3\2\2\2\u0493\u0491\3\2\2\2\u0493\u0494"+ - "\3\2\2\2\u0494\u0495\3\2\2\2\u0495\u0496\b\u0089\2\2\u0496\u0113\3\2\2"+ - "\2\u0497\u0498\7\62\2\2\u0498\u049d\t\6\2\2\u0499\u049b\7a\2\2\u049a\u0499"+ - "\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u049c\3\2\2\2\u049c\u049e\5\u0140\u00a0"+ - "\2\u049d\u049a\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u049d\3\2\2\2\u049f\u04a0"+ - "\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\b\u008a\2\2\u04a2\u0115\3\2\2"+ - "\2\u04a3\u04a4\7\62\2\2\u04a4\u04a5\t\6\2\2\u04a5\u04a6\5\u0118\u008c"+ - "\2\u04a6\u04a7\5\u011a\u008d\2\u04a7\u0117\3\2\2\2\u04a8\u04aa\7a\2\2"+ - "\u04a9\u04a8\3\2\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ad"+ - "\5\u0140\u00a0\2\u04ac\u04a9\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04ac\3"+ - "\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04ba\3\2\2\2\u04b0\u04b7\7\60\2\2\u04b1"+ - "\u04b3\7a\2\2\u04b2\u04b1\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3\u04b4\3\2"+ - "\2\2\u04b4\u04b6\5\u0140\u00a0\2\u04b5\u04b2\3\2\2\2\u04b6\u04b9\3\2\2"+ - "\2\u04b7\u04b5\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04bb\3\2\2\2\u04b9\u04b7"+ - "\3\2\2\2\u04ba\u04b0\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04c8\3\2\2\2\u04bc"+ - "\u04bd\7\60\2\2\u04bd\u04c4\5\u0140\u00a0\2\u04be\u04c0\7a\2\2\u04bf\u04be"+ - "\3\2\2\2\u04bf\u04c0\3\2\2\2\u04c0\u04c1\3\2\2\2\u04c1\u04c3\5\u0140\u00a0"+ - "\2\u04c2\u04bf\3\2\2\2\u04c3\u04c6\3\2\2\2\u04c4\u04c2\3\2\2\2\u04c4\u04c5"+ - "\3\2\2\2\u04c5\u04c8\3\2\2\2\u04c6\u04c4\3\2\2\2\u04c7\u04ac\3\2\2\2\u04c7"+ - "\u04bc\3\2\2\2\u04c8\u0119\3\2\2\2\u04c9\u04ca\t\7\2\2\u04ca\u04cb\t\b"+ - "\2\2\u04cb\u04cc\5\u013c\u009e\2\u04cc\u011b\3\2\2\2\u04cd\u04d3\5\u010e"+ - "\u0087\2\u04ce\u04d3\5\u0110\u0088\2\u04cf\u04d3\5\u0112\u0089\2\u04d0"+ - "\u04d3\5\u0114\u008a\2\u04d1\u04d3\5\4\2\2\u04d2\u04cd\3\2\2\2\u04d2\u04ce"+ - "\3\2\2\2\u04d2\u04cf\3\2\2\2\u04d2\u04d0\3\2\2\2\u04d2\u04d1\3\2\2\2\u04d3"+ - "\u04d4\3\2\2\2\u04d4\u04d5\7k\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d7\b\u008e"+ - "\2\2\u04d7\u011d\3\2\2\2\u04d8\u04db\7)\2\2\u04d9\u04dc\5\u0138\u009c"+ - "\2\u04da\u04dc\5\u0122\u0091\2\u04db\u04d9\3\2\2\2\u04db\u04da\3\2\2\2"+ - "\u04dc\u04dd\3\2\2\2\u04dd\u04de\7)\2\2\u04de\u011f\3\2\2\2\u04df\u04e0"+ - "\5\u011e\u008f\2\u04e0\u04e1\3\2\2\2\u04e1\u04e2\b\u0090\2\2\u04e2\u0121"+ - "\3\2\2\2\u04e3\u04e6\5\u0124\u0092\2\u04e4\u04e6\5\u0126\u0093\2\u04e5"+ - "\u04e3\3\2\2\2\u04e5\u04e4\3\2\2\2\u04e6\u0123\3\2\2\2\u04e7\u04e8\7^"+ - "\2\2\u04e8\u04e9\5\u013e\u009f\2\u04e9\u04ea\5\u013e\u009f\2\u04ea\u04eb"+ - "\5\u013e\u009f\2\u04eb\u0125\3\2\2\2\u04ec\u04ed\7^\2\2\u04ed\u04ee\7"+ - "z\2\2\u04ee\u04ef\5\u0140\u00a0\2\u04ef\u04f0\5\u0140\u00a0\2\u04f0\u0127"+ - "\3\2\2\2\u04f1\u04f2\7^\2\2\u04f2\u04f3\7w\2\2\u04f3\u04f4\5\u0140\u00a0"+ - "\2\u04f4\u04f5\5\u0140\u00a0\2\u04f5\u04f6\5\u0140\u00a0\2\u04f6\u04f7"+ - "\5\u0140\u00a0\2\u04f7\u0129\3\2\2\2\u04f8\u04f9\7^\2\2\u04f9\u04fa\7"+ - "W\2\2\u04fa\u04fb\5\u0140\u00a0\2\u04fb\u04fc\5\u0140\u00a0\2\u04fc\u04fd"+ - "\5\u0140\u00a0\2\u04fd\u04fe\5\u0140\u00a0\2\u04fe\u04ff\5\u0140\u00a0"+ - "\2\u04ff\u0500\5\u0140\u00a0\2\u0500\u0501\5\u0140\u00a0\2\u0501\u0502"+ - "\5\u0140\u00a0\2\u0502\u012b\3\2\2\2\u0503\u0507\7b\2\2\u0504\u0506\n"+ - "\t\2\2\u0505\u0504\3\2\2\2\u0506\u0509\3\2\2\2\u0507\u0505\3\2\2\2\u0507"+ - "\u0508\3\2\2\2\u0508\u050a\3\2\2\2\u0509\u0507\3\2\2\2\u050a\u050b\7b"+ - "\2\2\u050b\u050c\3\2\2\2\u050c\u050d\b\u0096\2\2\u050d\u012d\3\2\2\2\u050e"+ - "\u0513\7$\2\2\u050f\u0512\n\n\2\2\u0510\u0512\5\u013a\u009d\2\u0511\u050f"+ - "\3\2\2\2\u0511\u0510\3\2\2\2\u0512\u0515\3\2\2\2\u0513\u0511\3\2\2\2\u0513"+ - "\u0514\3\2\2\2\u0514\u0516\3\2\2\2\u0515\u0513\3\2\2\2\u0516\u0517\7$"+ - "\2\2\u0517\u0518\3\2\2\2\u0518\u0519\b\u0097\2\2\u0519\u012f\3\2\2\2\u051a"+ - "\u051c\t\13\2\2\u051b\u051a\3\2\2\2\u051c\u051d\3\2\2\2\u051d\u051b\3"+ - "\2\2\2\u051d\u051e\3\2\2\2\u051e\u051f\3\2\2\2\u051f\u0520\b\u0098\3\2"+ - "\u0520\u0131\3\2\2\2\u0521\u0522\7\61\2\2\u0522\u0523\7,\2\2\u0523\u0527"+ - "\3\2\2\2\u0524\u0526\13\2\2\2\u0525\u0524\3\2\2\2\u0526\u0529\3\2\2\2"+ - "\u0527\u0528\3\2\2\2\u0527\u0525\3\2\2\2\u0528\u052a\3\2\2\2\u0529\u0527"+ - "\3\2\2\2\u052a\u052b\7,\2\2\u052b\u052c\7\61\2\2\u052c\u052d\3\2\2\2\u052d"+ - "\u052e\b\u0099\3\2\u052e\u0133\3\2\2\2\u052f\u0531\t\f\2\2\u0530\u052f"+ - "\3\2\2\2\u0531\u0532\3\2\2\2\u0532\u0530\3\2\2\2\u0532\u0533\3\2\2\2\u0533"+ - "\u0534\3\2\2\2\u0534\u0535\b\u009a\3\2\u0535\u0135\3\2\2\2\u0536\u0537"+ - "\7\61\2\2\u0537\u0538\7\61\2\2\u0538\u053c\3\2\2\2\u0539\u053b\n\f\2\2"+ - "\u053a\u0539\3\2\2\2\u053b\u053e\3\2\2\2\u053c\u053a\3\2\2\2\u053c\u053d"+ - "\3\2\2\2\u053d\u053f\3\2\2\2\u053e\u053c\3\2\2\2\u053f\u0540\b\u009b\3"+ - "\2\u0540\u0137\3\2\2\2\u0541\u0546\n\r\2\2\u0542\u0546\5\u0128\u0094\2"+ - "\u0543\u0546\5\u012a\u0095\2\u0544\u0546\5\u013a\u009d\2\u0545\u0541\3"+ - "\2\2\2\u0545\u0542\3\2\2\2\u0545\u0543\3\2\2\2\u0545\u0544\3\2\2\2\u0546"+ - "\u0139\3\2\2\2\u0547\u0561\7^\2\2\u0548\u0549\7w\2\2\u0549\u054a\5\u0140"+ - "\u00a0\2\u054a\u054b\5\u0140\u00a0\2\u054b\u054c\5\u0140\u00a0\2\u054c"+ - "\u054d\5\u0140\u00a0\2\u054d\u0562\3\2\2\2\u054e\u054f\7W\2\2\u054f\u0550"+ - "\5\u0140\u00a0\2\u0550\u0551\5\u0140\u00a0\2\u0551\u0552\5\u0140\u00a0"+ - "\2\u0552\u0553\5\u0140\u00a0\2\u0553\u0554\5\u0140\u00a0\2\u0554\u0555"+ - "\5\u0140\u00a0\2\u0555\u0556\5\u0140\u00a0\2\u0556\u0557\5\u0140\u00a0"+ - "\2\u0557\u0562\3\2\2\2\u0558\u0562\t\16\2\2\u0559\u055a\5\u013e\u009f"+ - "\2\u055a\u055b\5\u013e\u009f\2\u055b\u055c\5\u013e\u009f\2\u055c\u0562"+ - "\3\2\2\2\u055d\u055e\7z\2\2\u055e\u055f\5\u0140\u00a0\2\u055f\u0560\5"+ - "\u0140\u00a0\2\u0560\u0562\3\2\2\2\u0561\u0548\3\2\2\2\u0561\u054e\3\2"+ - "\2\2\u0561\u0558\3\2\2\2\u0561\u0559\3\2\2\2\u0561\u055d\3\2\2\2\u0562"+ - "\u013b\3\2\2\2\u0563\u056a\t\3\2\2\u0564\u0566\7a\2\2\u0565\u0564\3\2"+ - "\2\2\u0565\u0566\3\2\2\2\u0566\u0567\3\2\2\2\u0567\u0569\t\3\2\2\u0568"+ - "\u0565\3\2\2\2\u0569\u056c\3\2\2\2\u056a\u0568\3\2\2\2\u056a\u056b\3\2"+ - "\2\2\u056b\u013d\3\2\2\2\u056c\u056a\3\2\2\2\u056d\u056e\t\17\2\2\u056e"+ - "\u013f\3\2\2\2\u056f\u0570\t\20\2\2\u0570\u0141\3\2\2\2\u0571\u0572\t"+ - "\21\2\2\u0572\u0143\3\2\2\2\u0573\u0575\t\22\2\2\u0574\u0576\t\b\2\2\u0575"+ - "\u0574\3\2\2\2\u0575\u0576\3\2\2\2\u0576\u0577\3\2\2\2\u0577\u0578\5\u013c"+ - "\u009e\2\u0578\u0145\3\2\2\2\u0579\u057c\5\u014a\u00a5\2\u057a\u057c\7"+ - "a\2\2\u057b\u0579\3\2\2\2\u057b\u057a\3\2\2\2\u057c\u0147\3\2\2\2\u057d"+ - "\u057e\t\23\2\2\u057e\u0149\3\2\2\2\u057f\u0580\t\24\2\2\u0580\u014b\3"+ - "\2\2\2\u0581\u0583\t\13\2\2\u0582\u0581\3\2\2\2\u0583\u0584\3\2\2\2\u0584"+ - "\u0582\3\2\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0587\b\u00a6"+ - "\3\2\u0587\u014d\3\2\2\2\u0588\u0589\7\61\2\2\u0589\u058a\7,\2\2\u058a"+ - "\u058e\3\2\2\2\u058b\u058d\n\f\2\2\u058c\u058b\3\2\2\2\u058d\u0590\3\2"+ - "\2\2\u058e\u058f\3\2\2\2\u058e\u058c\3\2\2\2\u058f\u0591\3\2\2\2\u0590"+ - "\u058e\3\2\2\2\u0591\u0592\7,\2\2\u0592\u0593\7\61\2\2\u0593\u0594\3\2"+ - "\2\2\u0594\u0595\b\u00a7\3\2\u0595\u014f\3\2\2\2\u0596\u0597\7\61\2\2"+ - "\u0597\u0598\7\61\2\2\u0598\u059c\3\2\2\2\u0599\u059b\n\f\2\2\u059a\u0599"+ - "\3\2\2\2\u059b\u059e\3\2\2\2\u059c\u059a\3\2\2\2\u059c\u059d\3\2\2\2\u059d"+ - "\u059f\3\2\2\2\u059e\u059c\3\2\2\2\u059f\u05a0\b\u00a8\3\2\u05a0\u0151"+ - "\3\2\2\2\u05a1\u05a3\t\f\2\2\u05a2\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4"+ - "\u05a2\3\2\2\2\u05a4\u05a5\3\2\2\2\u05a5\u05b4\3\2\2\2\u05a6\u05b4\7="+ - "\2\2\u05a7\u05a8\7\61\2\2\u05a8\u05a9\7,\2\2\u05a9\u05ad\3\2\2\2\u05aa"+ - "\u05ac\13\2\2\2\u05ab\u05aa\3\2\2\2\u05ac\u05af\3\2\2\2\u05ad\u05ae\3"+ - "\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05b0\3\2\2\2\u05af\u05ad\3\2\2\2\u05b0"+ - "\u05b1\7,\2\2\u05b1\u05b4\7\61\2\2\u05b2\u05b4\7\2\2\3\u05b3\u05a2\3\2"+ - "\2\2\u05b3\u05a6\3\2\2\2\u05b3\u05a7\3\2\2\2\u05b3\u05b2\3\2\2\2\u05b4"+ - "\u05b5\3\2\2\2\u05b5\u05b6\b\u00a9\4\2\u05b6\u0153\3\2\2\2\u05b7\u05b8"+ - "\3\2\2\2\u05b8\u05b9\3\2\2\2\u05b9\u05ba\b\u00aa\4\2\u05ba\u05bb\b\u00aa"+ - "\3\2\u05bb\u0155\3\2\2\2\64\2\3\u0158\u0160\u0163\u0166\u016c\u016e\u0406"+ - "\u0408\u0471\u0476\u0479\u0480\u0485\u048b\u048e\u0493\u049a\u049f\u04a9"+ - "\u04ae\u04b2\u04b7\u04ba\u04bf\u04c4\u04c7\u04d2\u04db\u04e5\u0507\u0511"+ - "\u0513\u051d\u0527\u0532\u053c\u0545\u0561\u0565\u056a\u0575\u057b\u0584"+ - "\u058e\u059c\u05a4\u05ad\u05b3\5\4\3\2\2\3\2\4\2\2"; + "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\3\2\3\2\5\2\u015b\n\2"+ + "\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0163\n\3\3\3\5\3\u0166\n\3\3\3\5\3\u0169"+ + "\n\3\3\3\3\3\3\3\3\3\5\3\u016f\n\3\5\3\u0171\n\3\3\4\3\4\3\4\3\4\3\4\3"+ + "\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7"+ + "\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3"+ + "\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13"+ + "\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r"+ + "\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+ + "\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3"+ + "\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3"+ + "\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3"+ + "\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3"+ + "\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3"+ + "\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+ + "\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3"+ + "\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 "+ + "\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3"+ + "\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3\'\3\'\3\'\3\'\3"+ + "\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3"+ + "+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3"+ + ".\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61"+ + "\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63"+ + "\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65"+ + "\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67"+ + "\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\38\38"+ + "\38\38\39\39\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3="+ + "\3=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?"+ + "\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A"+ + "\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C"+ + "\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F"+ + "\3F\3F\3F\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J"+ + "\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M"+ + "\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3Q\3R"+ + "\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V"+ + "\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y"+ + "\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\"+ + "\3\\\3\\\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3_\3_\3"+ + "_\3_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3c\3c\3"+ + "c\7c\u040e\nc\fc\16c\u0411\13c\3c\3c\3d\3d\3e\3e\3e\3e\3f\3f\3g\3g\3g"+ + "\3g\3h\3h\3i\3i\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3o\3o\3o\3p"+ + "\3p\3p\3p\3p\3q\3q\3q\3r\3r\3r\3r\3s\3s\3s\3t\3t\3t\3u\3u\3u\3v\3v\3v"+ + "\3w\3w\3x\3x\3x\3y\3y\3z\3z\3z\3{\3{\3|\3|\3}\3}\3~\3~\3~\3\177\3\177"+ + "\3\177\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083"+ + "\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0087\3\u0087"+ + "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u0479\n\u0088\3\u0088\7\u0088"+ + "\u047c\n\u0088\f\u0088\16\u0088\u047f\13\u0088\5\u0088\u0481\n\u0088\3"+ + "\u0088\3\u0088\3\u0089\3\u0089\3\u0089\5\u0089\u0488\n\u0089\3\u0089\6"+ + "\u0089\u048b\n\u0089\r\u0089\16\u0089\u048c\3\u0089\3\u0089\3\u008a\3"+ + "\u008a\5\u008a\u0493\n\u008a\3\u008a\5\u008a\u0496\n\u008a\3\u008a\6\u008a"+ + "\u0499\n\u008a\r\u008a\16\u008a\u049a\3\u008a\3\u008a\3\u008b\3\u008b"+ + "\3\u008b\5\u008b\u04a2\n\u008b\3\u008b\6\u008b\u04a5\n\u008b\r\u008b\16"+ + "\u008b\u04a6\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3"+ + "\u008d\5\u008d\u04b1\n\u008d\3\u008d\6\u008d\u04b4\n\u008d\r\u008d\16"+ + "\u008d\u04b5\3\u008d\3\u008d\5\u008d\u04ba\n\u008d\3\u008d\7\u008d\u04bd"+ + "\n\u008d\f\u008d\16\u008d\u04c0\13\u008d\5\u008d\u04c2\n\u008d\3\u008d"+ + "\3\u008d\3\u008d\5\u008d\u04c7\n\u008d\3\u008d\7\u008d\u04ca\n\u008d\f"+ + "\u008d\16\u008d\u04cd\13\u008d\5\u008d\u04cf\n\u008d\3\u008e\3\u008e\3"+ + "\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u04da\n"+ + "\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\5\u0090"+ + "\u04e3\n\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0092"+ + "\3\u0092\5\u0092\u04ed\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093"+ + "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095\3\u0095"+ + "\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+ + "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\7\u0097\u050d"+ + "\n\u0097\f\u0097\16\u0097\u0510\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+ + "\3\u0098\3\u0098\3\u0098\7\u0098\u0519\n\u0098\f\u0098\16\u0098\u051c"+ + "\13\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\6\u0099\u0523\n\u0099"+ + "\r\u0099\16\u0099\u0524\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a"+ + "\7\u009a\u052d\n\u009a\f\u009a\16\u009a\u0530\13\u009a\3\u009a\3\u009a"+ + "\3\u009a\3\u009a\3\u009a\3\u009b\6\u009b\u0538\n\u009b\r\u009b\16\u009b"+ + "\u0539\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\7\u009c\u0542\n"+ + "\u009c\f\u009c\16\u009c\u0545\13\u009c\3\u009c\3\u009c\3\u009d\3\u009d"+ + "\3\u009d\3\u009d\5\u009d\u054d\n\u009d\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u0569\n\u009e\3\u009f\3\u009f"+ + "\5\u009f\u056d\n\u009f\3\u009f\7\u009f\u0570\n\u009f\f\u009f\16\u009f"+ + "\u0573\13\u009f\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a3"+ + "\3\u00a3\5\u00a3\u057d\n\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\5\u00a4"+ + "\u0583\n\u00a4\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a7\6\u00a7\u058a\n"+ + "\u00a7\r\u00a7\16\u00a7\u058b\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8"+ + "\3\u00a8\7\u00a8\u0594\n\u00a8\f\u00a8\16\u00a8\u0597\13\u00a8\3\u00a8"+ + "\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9"+ + "\u05a2\n\u00a9\f\u00a9\16\u00a9\u05a5\13\u00a9\3\u00a9\3\u00a9\3\u00aa"+ + "\6\u00aa\u05aa\n\u00aa\r\u00aa\16\u00aa\u05ab\3\u00aa\3\u00aa\3\u00aa"+ + "\3\u00aa\3\u00aa\7\u00aa\u05b3\n\u00aa\f\u00aa\16\u00aa\u05b6\13\u00aa"+ + "\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u05bb\n\u00aa\3\u00aa\3\u00aa\3\u00ab"+ + "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\5\u052e\u0595\u05b4\2\u00ac\4\3\6\4\b"+ + "\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$"+ + "\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F"+ + "$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I"+ + "\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4"+ + "S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8"+ + "]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00cc"+ + "g\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0"+ + "q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4"+ + "{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104"+ + "\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110"+ + "\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d\u011a\2\u011c\2"+ + "\u011e\u008e\u0120\2\u0122\u008f\u0124\u0090\u0126\u0091\u0128\u0092\u012a"+ + "\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136"+ + "\u0099\u0138\u009a\u013a\2\u013c\2\u013e\2\u0140\2\u0142\2\u0144\2\u0146"+ + "\2\u0148\2\u014a\2\u014c\2\u014e\u009b\u0150\u009c\u0152\u009d\u0154\u009e"+ + "\u0156\u009f\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr"+ + "\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13"+ + "\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;"+ + "\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8"+ + "\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1"+ + "\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52"+ + "\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b"+ + "\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82"+ + "\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b"+ + "\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2"+ + "\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b"+ + "\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2"+ + "\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b"+ + "\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52"+ + "\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b"+ + "\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc"+ + "\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2"+ + "\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379"+ + "\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e"+ + "\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531"+ + "\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2"+ + "\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7"+ + "\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712"+ + "\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec"+ + "\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826"+ + "\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6"+ + "\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a"+ + "\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa"+ + "\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0"+ + "\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe"+ + "\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34"+ + "\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60"+ + "\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac"+ + "\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2"+ + "\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15"+ + "\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f"+ + "\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87"+ + "\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e"+ + "\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2"+ + "\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b"+ + "\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87"+ + "\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb"+ + "\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07"+ + "\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50"+ + "\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c"+ + "\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32"+ + "\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89"+ + "\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1"+ + "\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf"+ + "\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8"+ + "\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a"+ + "\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f"+ + "\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090"+ + "\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc"+ + "\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c"+ + "\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7"+ + "\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da"+ + "\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7"+ + "\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2"+ + "\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733"+ + "\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9"+ + "\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa"+ + "\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972"+ + "\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56"+ + "\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0"+ + "\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f"+ + "\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02"+ + "\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f"+ + "\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61"+ + "\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6"+ + "\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4"+ + "\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e"+ + "\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b"+ + "\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f"+ + "\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185"+ + "\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0"+ + "\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32"+ + "\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0"+ + "\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2"+ + "\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037"+ + "\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe"+ + "\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201"+ + "\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502"+ + "\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f"+ + "\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2"+ + "\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824"+ + "\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff"+ + "\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4"+ + "\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02"+ + "\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c"+ + "\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2"+ + "\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6"+ + "\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a"+ + "\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5"+ + "\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02"+ + "\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38"+ + "\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48"+ + "\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd"+ + "\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68"+ + "\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde"+ + "\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e"+ + "\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352"+ + "\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f"+ + "\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602"+ + "\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a"+ + "\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862"+ + "\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917"+ + "\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12"+ + "\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e"+ + "\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62"+ + "\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4"+ + "\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152"+ + "\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc"+ + "\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a"+ + "\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0"+ + "\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334"+ + "\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363"+ + "\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9"+ + "\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646"+ + "\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02"+ + "\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85"+ + "\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42"+ + "\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32"+ + "\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402"+ + "\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31"+ + "\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52"+ + "\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4"+ + "\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82"+ + "\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1"+ + "\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd"+ + "\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516"+ + "\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548"+ + "\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc"+ + "\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752"+ + "\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd"+ + "\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23"+ + "\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39"+ + "\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b"+ + "\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56"+ + "\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61"+ + "\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74"+ + "\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d"+ + "\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4"+ + "\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802"+ + "\4\ufa1f\4\u05ee\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3"+ + "\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2"+ + "\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\""+ + "\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2"+ + "\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2"+ + ":\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3"+ + "\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2"+ + "\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2"+ + "\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l"+ + "\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2"+ + "\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2"+ + "\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c"+ + "\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2"+ + "\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e"+ + "\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2"+ + "\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0"+ + "\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2"+ + "\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2"+ + "\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2"+ + "\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4"+ + "\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2"+ + "\2\2\u00de\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6"+ + "\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2"+ + "\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8"+ + "\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2"+ + "\2\2\u0102\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a"+ + "\3\2\2\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2"+ + "\2\2\u0114\3\2\2\2\2\u0116\3\2\2\2\2\u0118\3\2\2\2\2\u011e\3\2\2\2\2\u0122"+ + "\3\2\2\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2"+ + "\2\2\u012c\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134"+ + "\3\2\2\2\2\u0136\3\2\2\2\2\u0138\3\2\2\2\3\u014e\3\2\2\2\3\u0150\3\2\2"+ + "\2\3\u0152\3\2\2\2\3\u0154\3\2\2\2\3\u0156\3\2\2\2\4\u015a\3\2\2\2\6\u0170"+ + "\3\2\2\2\b\u0172\3\2\2\2\n\u0179\3\2\2\2\f\u0181\3\2\2\2\16\u0188\3\2"+ + "\2\2\20\u018f\3\2\2\2\22\u0196\3\2\2\2\24\u019d\3\2\2\2\26\u01a6\3\2\2"+ + "\2\30\u01b0\3\2\2\2\32\u01b8\3\2\2\2\34\u01c2\3\2\2\2\36\u01ce\3\2\2\2"+ + " \u01d5\3\2\2\2\"\u01e0\3\2\2\2$\u01e3\3\2\2\2&\u01e9\3\2\2\2(\u01f2\3"+ + "\2\2\2*\u01f7\3\2\2\2,\u01fe\3\2\2\2.\u0205\3\2\2\2\60\u020b\3\2\2\2\62"+ + "\u0210\3\2\2\2\64\u0217\3\2\2\2\66\u0221\3\2\2\28\u0227\3\2\2\2:\u022a"+ + "\3\2\2\2<\u022c\3\2\2\2>\u0233\3\2\2\2@\u0239\3\2\2\2B\u0246\3\2\2\2D"+ + "\u024f\3\2\2\2F\u0253\3\2\2\2H\u0257\3\2\2\2J\u025d\3\2\2\2L\u025f\3\2"+ + "\2\2N\u0262\3\2\2\2P\u0267\3\2\2\2R\u026d\3\2\2\2T\u0273\3\2\2\2V\u027a"+ + "\3\2\2\2X\u0281\3\2\2\2Z\u028a\3\2\2\2\\\u0290\3\2\2\2^\u0296\3\2\2\2"+ + "`\u029d\3\2\2\2b\u02a3\3\2\2\2d\u02aa\3\2\2\2f\u02b0\3\2\2\2h\u02b9\3"+ + "\2\2\2j\u02c1\3\2\2\2l\u02c8\3\2\2\2n\u02cd\3\2\2\2p\u02d6\3\2\2\2r\u02e5"+ + "\3\2\2\2t\u02eb\3\2\2\2v\u02ef\3\2\2\2x\u02f2\3\2\2\2z\u02f9\3\2\2\2|"+ + "\u0303\3\2\2\2~\u030d\3\2\2\2\u0080\u0319\3\2\2\2\u0082\u0322\3\2\2\2"+ + "\u0084\u032c\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u0340\3\2\2\2\u008a\u034f"+ + "\3\2\2\2\u008c\u0355\3\2\2\2\u008e\u0359\3\2\2\2\u0090\u035d\3\2\2\2\u0092"+ + "\u0362\3\2\2\2\u0094\u036a\3\2\2\2\u0096\u0372\3\2\2\2\u0098\u0377\3\2"+ + "\2\2\u009a\u0381\3\2\2\2\u009c\u0388\3\2\2\2\u009e\u038d\3\2\2\2\u00a0"+ + "\u0393\3\2\2\2\u00a2\u0396\3\2\2\2\u00a4\u039a\3\2\2\2\u00a6\u03a1\3\2"+ + "\2\2\u00a8\u03a6\3\2\2\2\u00aa\u03ab\3\2\2\2\u00ac\u03b0\3\2\2\2\u00ae"+ + "\u03b8\3\2\2\2\u00b0\u03bf\3\2\2\2\u00b2\u03c5\3\2\2\2\u00b4\u03d3\3\2"+ + "\2\2\u00b6\u03d6\3\2\2\2\u00b8\u03dc\3\2\2\2\u00ba\u03e1\3\2\2\2\u00bc"+ + "\u03ec\3\2\2\2\u00be\u03f0\3\2\2\2\u00c0\u03f7\3\2\2\2\u00c2\u0400\3\2"+ + "\2\2\u00c4\u0404\3\2\2\2\u00c6\u040a\3\2\2\2\u00c8\u0414\3\2\2\2\u00ca"+ + "\u0416\3\2\2\2\u00cc\u041a\3\2\2\2\u00ce\u041c\3\2\2\2\u00d0\u0420\3\2"+ + "\2\2\u00d2\u0422\3\2\2\2\u00d4\u0426\3\2\2\2\u00d6\u0428\3\2\2\2\u00d8"+ + "\u042a\3\2\2\2\u00da\u042c\3\2\2\2\u00dc\u042e\3\2\2\2\u00de\u0430\3\2"+ + "\2\2\u00e0\u0435\3\2\2\2\u00e2\u043a\3\2\2\2\u00e4\u043d\3\2\2\2\u00e6"+ + "\u0441\3\2\2\2\u00e8\u0444\3\2\2\2\u00ea\u0447\3\2\2\2\u00ec\u044a\3\2"+ + "\2\2\u00ee\u044d\3\2\2\2\u00f0\u044f\3\2\2\2\u00f2\u0452\3\2\2\2\u00f4"+ + "\u0454\3\2\2\2\u00f6\u0457\3\2\2\2\u00f8\u0459\3\2\2\2\u00fa\u045b\3\2"+ + "\2\2\u00fc\u045d\3\2\2\2\u00fe\u0460\3\2\2\2\u0100\u0463\3\2\2\2\u0102"+ + "\u0466\3\2\2\2\u0104\u0468\3\2\2\2\u0106\u046a\3\2\2\2\u0108\u046c\3\2"+ + "\2\2\u010a\u046e\3\2\2\2\u010c\u0470\3\2\2\2\u010e\u0472\3\2\2\2\u0110"+ + "\u0480\3\2\2\2\u0112\u0484\3\2\2\2\u0114\u0490\3\2\2\2\u0116\u049e\3\2"+ + "\2\2\u0118\u04aa\3\2\2\2\u011a\u04ce\3\2\2\2\u011c\u04d0\3\2\2\2\u011e"+ + "\u04d9\3\2\2\2\u0120\u04df\3\2\2\2\u0122\u04e6\3\2\2\2\u0124\u04ec\3\2"+ + "\2\2\u0126\u04ee\3\2\2\2\u0128\u04f3\3\2\2\2\u012a\u04f8\3\2\2\2\u012c"+ + "\u04ff\3\2\2\2\u012e\u050a\3\2\2\2\u0130\u0515\3\2\2\2\u0132\u0522\3\2"+ + "\2\2\u0134\u0528\3\2\2\2\u0136\u0537\3\2\2\2\u0138\u053d\3\2\2\2\u013a"+ + "\u054c\3\2\2\2\u013c\u054e\3\2\2\2\u013e\u056a\3\2\2\2\u0140\u0574\3\2"+ + "\2\2\u0142\u0576\3\2\2\2\u0144\u0578\3\2\2\2\u0146\u057a\3\2\2\2\u0148"+ + "\u0582\3\2\2\2\u014a\u0584\3\2\2\2\u014c\u0586\3\2\2\2\u014e\u0589\3\2"+ + "\2\2\u0150\u058f\3\2\2\2\u0152\u059d\3\2\2\2\u0154\u05ba\3\2\2\2\u0156"+ + "\u05be\3\2\2\2\u0158\u015b\5\6\3\2\u0159\u015b\5\u0118\u008c\2\u015a\u0158"+ + "\3\2\2\2\u015a\u0159\3\2\2\2\u015b\u015c\3\2\2\2\u015c\u015d\b\2\2\2\u015d"+ + "\5\3\2\2\2\u015e\u0168\5\u013e\u009f\2\u015f\u0160\7\60\2\2\u0160\u0162"+ + "\6\3\2\2\u0161\u0163\5\u013e\u009f\2\u0162\u0161\3\2\2\2\u0162\u0163\3"+ + "\2\2\2\u0163\u0165\3\2\2\2\u0164\u0166\5\u0146\u00a3\2\u0165\u0164\3\2"+ + "\2\2\u0165\u0166\3\2\2\2\u0166\u0169\3\2\2\2\u0167\u0169\5\u0146\u00a3"+ + "\2\u0168\u015f\3\2\2\2\u0168\u0167\3\2\2\2\u0169\u0171\3\2\2\2\u016a\u016b"+ + "\7\60\2\2\u016b\u016c\6\3\3\2\u016c\u016e\5\u013e\u009f\2\u016d\u016f"+ + "\5\u0146\u00a3\2\u016e\u016d\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0171\3"+ + "\2\2\2\u0170\u015e\3\2\2\2\u0170\u016a\3\2\2\2\u0171\7\3\2\2\2\u0172\u0173"+ + "\7v\2\2\u0173\u0174\7t\2\2\u0174\u0175\7w\2\2\u0175\u0176\7g\2\2\u0176"+ + "\u0177\3\2\2\2\u0177\u0178\b\4\2\2\u0178\t\3\2\2\2\u0179\u017a\7h\2\2"+ + "\u017a\u017b\7c\2\2\u017b\u017c\7n\2\2\u017c\u017d\7u\2\2\u017d\u017e"+ + "\7g\2\2\u017e\u017f\3\2\2\2\u017f\u0180\b\5\2\2\u0180\13\3\2\2\2\u0181"+ + "\u0182\7c\2\2\u0182\u0183\7u\2\2\u0183\u0184\7u\2\2\u0184\u0185\7g\2\2"+ + "\u0185\u0186\7t\2\2\u0186\u0187\7v\2\2\u0187\r\3\2\2\2\u0188\u0189\7c"+ + "\2\2\u0189\u018a\7u\2\2\u018a\u018b\7u\2\2\u018b\u018c\7w\2\2\u018c\u018d"+ + "\7o\2\2\u018d\u018e\7g\2\2\u018e\17\3\2\2\2\u018f\u0190\7k\2\2\u0190\u0191"+ + "\7p\2\2\u0191\u0192\7j\2\2\u0192\u0193\7c\2\2\u0193\u0194\7n\2\2\u0194"+ + "\u0195\7g\2\2\u0195\21\3\2\2\2\u0196\u0197\7g\2\2\u0197\u0198\7z\2\2\u0198"+ + "\u0199\7j\2\2\u0199\u019a\7c\2\2\u019a\u019b\7n\2\2\u019b\u019c\7g\2\2"+ + "\u019c\23\3\2\2\2\u019d\u019e\7t\2\2\u019e\u019f\7g\2\2\u019f\u01a0\7"+ + "s\2\2\u01a0\u01a1\7w\2\2\u01a1\u01a2\7k\2\2\u01a2\u01a3\7t\2\2\u01a3\u01a4"+ + "\7g\2\2\u01a4\u01a5\7u\2\2\u01a5\25\3\2\2\2\u01a6\u01a7\7r\2\2\u01a7\u01a8"+ + "\7t\2\2\u01a8\u01a9\7g\2\2\u01a9\u01aa\7u\2\2\u01aa\u01ab\7g\2\2\u01ab"+ + "\u01ac\7t\2\2\u01ac\u01ad\7x\2\2\u01ad\u01ae\7g\2\2\u01ae\u01af\7u\2\2"+ + "\u01af\27\3\2\2\2\u01b0\u01b1\7g\2\2\u01b1\u01b2\7p\2\2\u01b2\u01b3\7"+ + "u\2\2\u01b3\u01b4\7w\2\2\u01b4\u01b5\7t\2\2\u01b5\u01b6\7g\2\2\u01b6\u01b7"+ + "\7u\2\2\u01b7\31\3\2\2\2\u01b8\u01b9\7k\2\2\u01b9\u01ba\7p\2\2\u01ba\u01bb"+ + "\7x\2\2\u01bb\u01bc\7c\2\2\u01bc\u01bd\7t\2\2\u01bd\u01be\7k\2\2\u01be"+ + "\u01bf\7c\2\2\u01bf\u01c0\7p\2\2\u01c0\u01c1\7v\2\2\u01c1\33\3\2\2\2\u01c2"+ + "\u01c3\7f\2\2\u01c3\u01c4\7g\2\2\u01c4\u01c5\7e\2\2\u01c5\u01c6\7t\2\2"+ + "\u01c6\u01c7\7g\2\2\u01c7\u01c8\7c\2\2\u01c8\u01c9\7u\2\2\u01c9\u01ca"+ + "\7g\2\2\u01ca\u01cb\7u\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd\b\16\2\2\u01cd"+ + "\35\3\2\2\2\u01ce\u01cf\7r\2\2\u01cf\u01d0\7w\2\2\u01d0\u01d1\7t\2\2\u01d1"+ + "\u01d2\7g\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\b\17\2\2\u01d4\37\3\2\2"+ + "\2\u01d5\u01d6\7k\2\2\u01d6\u01d7\7o\2\2\u01d7\u01d8\7r\2\2\u01d8\u01d9"+ + "\7n\2\2\u01d9\u01da\7g\2\2\u01da\u01db\7o\2\2\u01db\u01dc\7g\2\2\u01dc"+ + "\u01dd\7p\2\2\u01dd\u01de\7v\2\2\u01de\u01df\7u\2\2\u01df!\3\2\2\2\u01e0"+ + "\u01e1\7c\2\2\u01e1\u01e2\7u\2\2\u01e2#\3\2\2\2\u01e3\u01e4\7q\2\2\u01e4"+ + "\u01e5\7n\2\2\u01e5\u01e6\7f\2\2\u01e6\u01e7\3\2\2\2\u01e7\u01e8\b\22"+ + "\2\2\u01e8%\3\2\2\2\u01e9\u01ea\7d\2\2\u01ea\u01eb\7g\2\2\u01eb\u01ec"+ + "\7h\2\2\u01ec\u01ed\7q\2\2\u01ed\u01ee\7t\2\2\u01ee\u01ef\7g\2\2\u01ef"+ + "\u01f0\3\2\2\2\u01f0\u01f1\b\23\2\2\u01f1\'\3\2\2\2\u01f2\u01f3\7%\2\2"+ + "\u01f3\u01f4\7n\2\2\u01f4\u01f5\7j\2\2\u01f5\u01f6\7u\2\2\u01f6)\3\2\2"+ + "\2\u01f7\u01f8\7h\2\2\u01f8\u01f9\7q\2\2\u01f9\u01fa\7t\2\2\u01fa\u01fb"+ + "\7c\2\2\u01fb\u01fc\7n\2\2\u01fc\u01fd\7n\2\2\u01fd+\3\2\2\2\u01fe\u01ff"+ + "\7g\2\2\u01ff\u0200\7z\2\2\u0200\u0201\7k\2\2\u0201\u0202\7u\2\2\u0202"+ + "\u0203\7v\2\2\u0203\u0204\7u\2\2\u0204-\3\2\2\2\u0205\u0206\7c\2\2\u0206"+ + "\u0207\7e\2\2\u0207\u0208\7e\2\2\u0208\u0209\3\2\2\2\u0209\u020a\b\27"+ + "\2\2\u020a/\3\2\2\2\u020b\u020c\7h\2\2\u020c\u020d\7q\2\2\u020d\u020e"+ + "\7n\2\2\u020e\u020f\7f\2\2\u020f\61\3\2\2\2\u0210\u0211\7w\2\2\u0211\u0212"+ + "\7p\2\2\u0212\u0213\7h\2\2\u0213\u0214\7q\2\2\u0214\u0215\7n\2\2\u0215"+ + "\u0216\7f\2\2\u0216\63\3\2\2\2\u0217\u0218\7w\2\2\u0218\u0219\7p\2\2\u0219"+ + "\u021a\7h\2\2\u021a\u021b\7q\2\2\u021b\u021c\7n\2\2\u021c\u021d\7f\2\2"+ + "\u021d\u021e\7k\2\2\u021e\u021f\7p\2\2\u021f\u0220\7i\2\2\u0220\65\3\2"+ + "\2\2\u0221\u0222\7i\2\2\u0222\u0223\7j\2\2\u0223\u0224\7q\2\2\u0224\u0225"+ + "\7u\2\2\u0225\u0226\7v\2\2\u0226\67\3\2\2\2\u0227\u0228\7k\2\2\u0228\u0229"+ + "\7p\2\2\u02299\3\2\2\2\u022a\u022b\7%\2\2\u022b;\3\2\2\2\u022c\u022d\7"+ + "u\2\2\u022d\u022e\7w\2\2\u022e\u022f\7d\2\2\u022f\u0230\7u\2\2\u0230\u0231"+ + "\7g\2\2\u0231\u0232\7v\2\2\u0232=\3\2\2\2\u0233\u0234\7w\2\2\u0234\u0235"+ + "\7p\2\2\u0235\u0236\7k\2\2\u0236\u0237\7q\2\2\u0237\u0238\7p\2\2\u0238"+ + "?\3\2\2\2\u0239\u023a\7k\2\2\u023a\u023b\7p\2\2\u023b\u023c\7v\2\2\u023c"+ + "\u023d\7g\2\2\u023d\u023e\7t\2\2\u023e\u023f\7u\2\2\u023f\u0240\7g\2\2"+ + "\u0240\u0241\7e\2\2\u0241\u0242\7v\2\2\u0242\u0243\7k\2\2\u0243\u0244"+ + "\7q\2\2\u0244\u0245\7p\2\2\u0245A\3\2\2\2\u0246\u0247\7u\2\2\u0247\u0248"+ + "\7g\2\2\u0248\u0249\7v\2\2\u0249\u024a\7o\2\2\u024a\u024b\7k\2\2\u024b"+ + "\u024c\7p\2\2\u024c\u024d\7w\2\2\u024d\u024e\7u\2\2\u024eC\3\2\2\2\u024f"+ + "\u0250\7?\2\2\u0250\u0251\7?\2\2\u0251\u0252\7@\2\2\u0252E\3\2\2\2\u0253"+ + "\u0254\7/\2\2\u0254\u0255\7/\2\2\u0255\u0256\7,\2\2\u0256G\3\2\2\2\u0257"+ + "\u0258\7c\2\2\u0258\u0259\7r\2\2\u0259\u025a\7r\2\2\u025a\u025b\7n\2\2"+ + "\u025b\u025c\7{\2\2\u025cI\3\2\2\2\u025d\u025e\7A\2\2\u025eK\3\2\2\2\u025f"+ + "\u0260\7#\2\2\u0260\u0261\7>\2\2\u0261M\3\2\2\2\u0262\u0263\7#\2\2\u0263"+ + "\u0264\7@\2\2\u0264\u0265\3\2\2\2\u0265\u0266\b\'\2\2\u0266O\3\2\2\2\u0267"+ + "\u0268\7u\2\2\u0268\u0269\7g\2\2\u0269\u026a\7s\2\2\u026a\u026b\3\2\2"+ + "\2\u026b\u026c\b(\2\2\u026cQ\3\2\2\2\u026d\u026e\7u\2\2\u026e\u026f\7"+ + "g\2\2\u026f\u0270\7v\2\2\u0270\u0271\3\2\2\2\u0271\u0272\b)\2\2\u0272"+ + "S\3\2\2\2\u0273\u0274\7o\2\2\u0274\u0275\7u\2\2\u0275\u0276\7g\2\2\u0276"+ + "\u0277\7v\2\2\u0277\u0278\3\2\2\2\u0278\u0279\b*\2\2\u0279U\3\2\2\2\u027a"+ + "\u027b\7f\2\2\u027b\u027c\7k\2\2\u027c\u027d\7e\2\2\u027d\u027e\7v\2\2"+ + "\u027e\u027f\3\2\2\2\u027f\u0280\b+\2\2\u0280W\3\2\2\2\u0281\u0282\7q"+ + "\2\2\u0282\u0283\7r\2\2\u0283\u0284\7v\2\2\u0284\u0285\7k\2\2\u0285\u0286"+ + "\7q\2\2\u0286\u0287\7p\2\2\u0287\u0288\3\2\2\2\u0288\u0289\b,\2\2\u0289"+ + "Y\3\2\2\2\u028a\u028b\7n\2\2\u028b\u028c\7g\2\2\u028c\u028d\7p\2\2\u028d"+ + "\u028e\3\2\2\2\u028e\u028f\b-\2\2\u028f[\3\2\2\2\u0290\u0291\7p\2\2\u0291"+ + "\u0292\7g\2\2\u0292\u0293\7y\2\2\u0293\u0294\3\2\2\2\u0294\u0295\b.\2"+ + "\2\u0295]\3\2\2\2\u0296\u0297\7o\2\2\u0297\u0298\7c\2\2\u0298\u0299\7"+ + "m\2\2\u0299\u029a\7g\2\2\u029a\u029b\3\2\2\2\u029b\u029c\b/\2\2\u029c"+ + "_\3\2\2\2\u029d\u029e\7e\2\2\u029e\u029f\7c\2\2\u029f\u02a0\7r\2\2\u02a0"+ + "\u02a1\3\2\2\2\u02a1\u02a2\b\60\2\2\u02a2a\3\2\2\2\u02a3\u02a4\7u\2\2"+ + "\u02a4\u02a5\7q\2\2\u02a5\u02a6\7o\2\2\u02a6\u02a7\7g\2\2\u02a7\u02a8"+ + "\3\2\2\2\u02a8\u02a9\b\61\2\2\u02a9c\3\2\2\2\u02aa\u02ab\7i\2\2\u02ab"+ + "\u02ac\7g\2\2\u02ac\u02ad\7v\2\2\u02ad\u02ae\3\2\2\2\u02ae\u02af\b\62"+ + "\2\2\u02afe\3\2\2\2\u02b0\u02b1\7f\2\2\u02b1\u02b2\7q\2\2\u02b2\u02b3"+ + "\7o\2\2\u02b3\u02b4\7c\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b6\7p\2\2\u02b6"+ + "\u02b7\3\2\2\2\u02b7\u02b8\b\63\2\2\u02b8g\3\2\2\2\u02b9\u02ba\7c\2\2"+ + "\u02ba\u02bb\7z\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7q\2\2\u02bd\u02be"+ + "\7o\2\2\u02be\u02bf\3\2\2\2\u02bf\u02c0\b\64\2\2\u02c0i\3\2\2\2\u02c1"+ + "\u02c2\7p\2\2\u02c2\u02c3\7q\2\2\u02c3\u02c4\7p\2\2\u02c4\u02c5\7g\2\2"+ + "\u02c5\u02c6\3\2\2\2\u02c6\u02c7\b\65\2\2\u02c7k\3\2\2\2\u02c8\u02c9\7"+ + "r\2\2\u02c9\u02ca\7t\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7f\2\2\u02ccm"+ + "\3\2\2\2\u02cd\u02ce\7v\2\2\u02ce\u02cf\7{\2\2\u02cf\u02d0\7r\2\2\u02d0"+ + "\u02d1\7g\2\2\u02d1\u02d2\7Q\2\2\u02d2\u02d3\7h\2\2\u02d3\u02d4\3\2\2"+ + "\2\u02d4\u02d5\b\67\2\2\u02d5o\3\2\2\2\u02d6\u02d7\7k\2\2\u02d7\u02d8"+ + "\7u\2\2\u02d8\u02d9\7E\2\2\u02d9\u02da\7q\2\2\u02da\u02db\7o\2\2\u02db"+ + "\u02dc\7r\2\2\u02dc\u02dd\7c\2\2\u02dd\u02de\7t\2\2\u02de\u02df\7c\2\2"+ + "\u02df\u02e0\7d\2\2\u02e0\u02e1\7n\2\2\u02e1\u02e2\7g\2\2\u02e2\u02e3"+ + "\3\2\2\2\u02e3\u02e4\b8\2\2\u02e4q\3\2\2\2\u02e5\u02e6\7u\2\2\u02e6\u02e7"+ + "\7j\2\2\u02e7\u02e8\7c\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7g\2\2\u02ea"+ + "s\3\2\2\2\u02eb\u02ec\7B\2\2\u02ec\u02ed\3\2\2\2\u02ed\u02ee\b:\2\2\u02ee"+ + "u\3\2\2\2\u02ef\u02f0\7\60\2\2\u02f0\u02f1\7\60\2\2\u02f1w\3\2\2\2\u02f2"+ + "\u02f3\7u\2\2\u02f3\u02f4\7j\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7t\2\2"+ + "\u02f6\u02f7\7g\2\2\u02f7\u02f8\7f\2\2\u02f8y\3\2\2\2\u02f9\u02fa\7g\2"+ + "\2\u02fa\u02fb\7z\2\2\u02fb\u02fc\7e\2\2\u02fc\u02fd\7n\2\2\u02fd\u02fe"+ + "\7w\2\2\u02fe\u02ff\7u\2\2\u02ff\u0300\7k\2\2\u0300\u0301\7x\2\2\u0301"+ + "\u0302\7g\2\2\u0302{\3\2\2\2\u0303\u0304\7r\2\2\u0304\u0305\7t\2\2\u0305"+ + "\u0306\7g\2\2\u0306\u0307\7f\2\2\u0307\u0308\7k\2\2\u0308\u0309\7e\2\2"+ + "\u0309\u030a\7c\2\2\u030a\u030b\7v\2\2\u030b\u030c\7g\2\2\u030c}\3\2\2"+ + "\2\u030d\u030e\7y\2\2\u030e\u030f\7t\2\2\u030f\u0310\7k\2\2\u0310\u0311"+ + "\7v\2\2\u0311\u0312\7g\2\2\u0312\u0313\7R\2\2\u0313\u0314\7g\2\2\u0314"+ + "\u0315\7t\2\2\u0315\u0316\7o\2\2\u0316\u0317\3\2\2\2\u0317\u0318\b?\2"+ + "\2\u0318\177\3\2\2\2\u0319\u031a\7p\2\2\u031a\u031b\7q\2\2\u031b\u031c"+ + "\7R\2\2\u031c\u031d\7g\2\2\u031d\u031e\7t\2\2\u031e\u031f\7o\2\2\u031f"+ + "\u0320\3\2\2\2\u0320\u0321\b@\2\2\u0321\u0081\3\2\2\2\u0322\u0323\7v\2"+ + "\2\u0323\u0324\7t\2\2\u0324\u0325\7w\2\2\u0325\u0326\7u\2\2\u0326\u0327"+ + "\7v\2\2\u0327\u0328\7g\2\2\u0328\u0329\7f\2\2\u0329\u032a\3\2\2\2\u032a"+ + "\u032b\bA\2\2\u032b\u0083\3\2\2\2\u032c\u032d\7q\2\2\u032d\u032e\7w\2"+ + "\2\u032e\u032f\7v\2\2\u032f\u0330\7n\2\2\u0330\u0331\7k\2\2\u0331\u0332"+ + "\7p\2\2\u0332\u0333\7g\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7k\2\2\u0335"+ + "\u0336\7p\2\2\u0336\u0337\7k\2\2\u0337\u0338\7v\2\2\u0338\u0339\7G\2\2"+ + "\u0339\u033a\7p\2\2\u033a\u033b\7u\2\2\u033b\u033c\7w\2\2\u033c\u033d"+ + "\7t\2\2\u033d\u033e\7g\2\2\u033e\u033f\7u\2\2\u033f\u0087\3\2\2\2\u0340"+ + "\u0341\7k\2\2\u0341\u0342\7o\2\2\u0342\u0343\7r\2\2\u0343\u0344\7q\2\2"+ + "\u0344\u0345\7t\2\2\u0345\u0346\7v\2\2\u0346\u0347\7T\2\2\u0347\u0348"+ + "\7g\2\2\u0348\u0349\7s\2\2\u0349\u034a\7w\2\2\u034a\u034b\7k\2\2\u034b"+ + "\u034c\7t\2\2\u034c\u034d\7g\2\2\u034d\u034e\7u\2\2\u034e\u0089\3\2\2"+ + "\2\u034f\u0350\7r\2\2\u0350\u0351\7t\2\2\u0351\u0352\7q\2\2\u0352\u0353"+ + "\7q\2\2\u0353\u0354\7h\2\2\u0354\u008b\3\2\2\2\u0355\u0356\7?\2\2\u0356"+ + "\u0357\7?\2\2\u0357\u0358\7?\2\2\u0358\u008d\3\2\2\2\u0359\u035a\7#\2"+ + "\2\u035a\u035b\7?\2\2\u035b\u035c\7?\2\2\u035c\u008f\3\2\2\2\u035d\u035e"+ + "\7y\2\2\u035e\u035f\7k\2\2\u035f\u0360\7v\2\2\u0360\u0361\7j\2\2\u0361"+ + "\u0091\3\2\2\2\u0362\u0363\7d\2\2\u0363\u0364\7t\2\2\u0364\u0365\7g\2"+ + "\2\u0365\u0366\7c\2\2\u0366\u0367\7m\2\2\u0367\u0368\3\2\2\2\u0368\u0369"+ + "\bI\2\2\u0369\u0093\3\2\2\2\u036a\u036b\7f\2\2\u036b\u036c\7g\2\2\u036c"+ + "\u036d\7h\2\2\u036d\u036e\7c\2\2\u036e\u036f\7w\2\2\u036f\u0370\7n\2\2"+ + "\u0370\u0371\7v\2\2\u0371\u0095\3\2\2\2\u0372\u0373\7h\2\2\u0373\u0374"+ + "\7w\2\2\u0374\u0375\7p\2\2\u0375\u0376\7e\2\2\u0376\u0097\3\2\2\2\u0377"+ + "\u0378\7k\2\2\u0378\u0379\7p\2\2\u0379\u037a\7v\2\2\u037a\u037b\7g\2\2"+ + "\u037b\u037c\7t\2\2\u037c\u037d\7h\2\2\u037d\u037e\7c\2\2\u037e\u037f"+ + "\7e\2\2\u037f\u0380\7g\2\2\u0380\u0099\3\2\2\2\u0381\u0382\7u\2\2\u0382"+ + "\u0383\7g\2\2\u0383\u0384\7n\2\2\u0384\u0385\7g\2\2\u0385\u0386\7e\2\2"+ + "\u0386\u0387\7v\2\2\u0387\u009b\3\2\2\2\u0388\u0389\7e\2\2\u0389\u038a"+ + "\7c\2\2\u038a\u038b\7u\2\2\u038b\u038c\7g\2\2\u038c\u009d\3\2\2\2\u038d"+ + "\u038e\7f\2\2\u038e\u038f\7g\2\2\u038f\u0390\7h\2\2\u0390\u0391\7g\2\2"+ + "\u0391\u0392\7t\2\2\u0392\u009f\3\2\2\2\u0393\u0394\7i\2\2\u0394\u0395"+ + "\7q\2\2\u0395\u00a1\3\2\2\2\u0396\u0397\7o\2\2\u0397\u0398\7c\2\2\u0398"+ + "\u0399\7r\2\2\u0399\u00a3\3\2\2\2\u039a\u039b\7u\2\2\u039b\u039c\7v\2"+ + "\2\u039c\u039d\7t\2\2\u039d\u039e\7w\2\2\u039e\u039f\7e\2\2\u039f\u03a0"+ + "\7v\2\2\u03a0\u00a5\3\2\2\2\u03a1\u03a2\7e\2\2\u03a2\u03a3\7j\2\2\u03a3"+ + "\u03a4\7c\2\2\u03a4\u03a5\7p\2\2\u03a5\u00a7\3\2\2\2\u03a6\u03a7\7g\2"+ + "\2\u03a7\u03a8\7n\2\2\u03a8\u03a9\7u\2\2\u03a9\u03aa\7g\2\2\u03aa\u00a9"+ + "\3\2\2\2\u03ab\u03ac\7i\2\2\u03ac\u03ad\7q\2\2\u03ad\u03ae\7v\2\2\u03ae"+ + "\u03af\7q\2\2\u03af\u00ab\3\2\2\2\u03b0\u03b1\7r\2\2\u03b1\u03b2\7c\2"+ + "\2\u03b2\u03b3\7e\2\2\u03b3\u03b4\7m\2\2\u03b4\u03b5\7c\2\2\u03b5\u03b6"+ + "\7i\2\2\u03b6\u03b7\7g\2\2\u03b7\u00ad\3\2\2\2\u03b8\u03b9\7u\2\2\u03b9"+ + "\u03ba\7y\2\2\u03ba\u03bb\7k\2\2\u03bb\u03bc\7v\2\2\u03bc\u03bd\7e\2\2"+ + "\u03bd\u03be\7j\2\2\u03be\u00af\3\2\2\2\u03bf\u03c0\7e\2\2\u03c0\u03c1"+ + "\7q\2\2\u03c1\u03c2\7p\2\2\u03c2\u03c3\7u\2\2\u03c3\u03c4\7v\2\2\u03c4"+ + "\u00b1\3\2\2\2\u03c5\u03c6\7h\2\2\u03c6\u03c7\7c\2\2\u03c7\u03c8\7n\2"+ + "\2\u03c8\u03c9\7n\2\2\u03c9\u03ca\7v\2\2\u03ca\u03cb\7j\2\2\u03cb\u03cc"+ + "\7t\2\2\u03cc\u03cd\7q\2\2\u03cd\u03ce\7w\2\2\u03ce\u03cf\7i\2\2\u03cf"+ + "\u03d0\7j\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d2\bY\2\2\u03d2\u00b3\3\2\2"+ + "\2\u03d3\u03d4\7k\2\2\u03d4\u03d5\7h\2\2\u03d5\u00b5\3\2\2\2\u03d6\u03d7"+ + "\7t\2\2\u03d7\u03d8\7c\2\2\u03d8\u03d9\7p\2\2\u03d9\u03da\7i\2\2\u03da"+ + "\u03db\7g\2\2\u03db\u00b7\3\2\2\2\u03dc\u03dd\7v\2\2\u03dd\u03de\7{\2"+ + "\2\u03de\u03df\7r\2\2\u03df\u03e0\7g\2\2\u03e0\u00b9\3\2\2\2\u03e1\u03e2"+ + "\7e\2\2\u03e2\u03e3\7q\2\2\u03e3\u03e4\7p\2\2\u03e4\u03e5\7v\2\2\u03e5"+ + "\u03e6\7k\2\2\u03e6\u03e7\7p\2\2\u03e7\u03e8\7w\2\2\u03e8\u03e9\7g\2\2"+ + "\u03e9\u03ea\3\2\2\2\u03ea\u03eb\b]\2\2\u03eb\u00bb\3\2\2\2\u03ec\u03ed"+ + "\7h\2\2\u03ed\u03ee\7q\2\2\u03ee\u03ef\7t\2\2\u03ef\u00bd\3\2\2\2\u03f0"+ + "\u03f1\7k\2\2\u03f1\u03f2\7o\2\2\u03f2\u03f3\7r\2\2\u03f3\u03f4\7q\2\2"+ + "\u03f4\u03f5\7t\2\2\u03f5\u03f6\7v\2\2\u03f6\u00bf\3\2\2\2\u03f7\u03f8"+ + "\7t\2\2\u03f8\u03f9\7g\2\2\u03f9\u03fa\7v\2\2\u03fa\u03fb\7w\2\2\u03fb"+ + "\u03fc\7t\2\2\u03fc\u03fd\7p\2\2\u03fd\u03fe\3\2\2\2\u03fe\u03ff\b`\2"+ + "\2\u03ff\u00c1\3\2\2\2\u0400\u0401\7x\2\2\u0401\u0402\7c\2\2\u0402\u0403"+ + "\7t\2\2\u0403\u00c3\3\2\2\2\u0404\u0405\7p\2\2\u0405\u0406\7k\2\2\u0406"+ + "\u0407\7n\2\2\u0407\u0408\3\2\2\2\u0408\u0409\bb\2\2\u0409\u00c5\3\2\2"+ + "\2\u040a\u040f\5\u0148\u00a4\2\u040b\u040e\5\u0148\u00a4\2\u040c\u040e"+ + "\5\u014a\u00a5\2\u040d\u040b\3\2\2\2\u040d\u040c\3\2\2\2\u040e\u0411\3"+ + "\2\2\2\u040f\u040d\3\2\2\2\u040f\u0410\3\2\2\2\u0410\u0412\3\2\2\2\u0411"+ + "\u040f\3\2\2\2\u0412\u0413\bc\2\2\u0413\u00c7\3\2\2\2\u0414\u0415\7*\2"+ + "\2\u0415\u00c9\3\2\2\2\u0416\u0417\7+\2\2\u0417\u0418\3\2\2\2\u0418\u0419"+ + "\be\2\2\u0419\u00cb\3\2\2\2\u041a\u041b\7}\2\2\u041b\u00cd\3\2\2\2\u041c"+ + "\u041d\7\177\2\2\u041d\u041e\3\2\2\2\u041e\u041f\bg\2\2\u041f\u00cf\3"+ + "\2\2\2\u0420\u0421\7]\2\2\u0421\u00d1\3\2\2\2\u0422\u0423\7_\2\2\u0423"+ + "\u0424\3\2\2\2\u0424\u0425\bi\2\2\u0425\u00d3\3\2\2\2\u0426\u0427\7?\2"+ + "\2\u0427\u00d5\3\2\2\2\u0428\u0429\7.\2\2\u0429\u00d7\3\2\2\2\u042a\u042b"+ + "\7=\2\2\u042b\u00d9\3\2\2\2\u042c\u042d\7<\2\2\u042d\u00db\3\2\2\2\u042e"+ + "\u042f\7\60\2\2\u042f\u00dd\3\2\2\2\u0430\u0431\7-\2\2\u0431\u0432\7-"+ + "\2\2\u0432\u0433\3\2\2\2\u0433\u0434\bo\2\2\u0434\u00df\3\2\2\2\u0435"+ + "\u0436\7/\2\2\u0436\u0437\7/\2\2\u0437\u0438\3\2\2\2\u0438\u0439\bp\2"+ + "\2\u0439\u00e1\3\2\2\2\u043a\u043b\7<\2\2\u043b\u043c\7?\2\2\u043c\u00e3"+ + "\3\2\2\2\u043d\u043e\7\60\2\2\u043e\u043f\7\60\2\2\u043f\u0440\7\60\2"+ + "\2\u0440\u00e5\3\2\2\2\u0441\u0442\7~\2\2\u0442\u0443\7~\2\2\u0443\u00e7"+ + "\3\2\2\2\u0444\u0445\7(\2\2\u0445\u0446\7(\2\2\u0446\u00e9\3\2\2\2\u0447"+ + "\u0448\7?\2\2\u0448\u0449\7?\2\2\u0449\u00eb\3\2\2\2\u044a\u044b\7#\2"+ + "\2\u044b\u044c\7?\2\2\u044c\u00ed\3\2\2\2\u044d\u044e\7>\2\2\u044e\u00ef"+ + "\3\2\2\2\u044f\u0450\7>\2\2\u0450\u0451\7?\2\2\u0451\u00f1\3\2\2\2\u0452"+ + "\u0453\7@\2\2\u0453\u00f3\3\2\2\2\u0454\u0455\7@\2\2\u0455\u0456\7?\2"+ + "\2\u0456\u00f5\3\2\2\2\u0457\u0458\7~\2\2\u0458\u00f7\3\2\2\2\u0459\u045a"+ + "\7\61\2\2\u045a\u00f9\3\2\2\2\u045b\u045c\7\'\2\2\u045c\u00fb\3\2\2\2"+ + "\u045d\u045e\7>\2\2\u045e\u045f\7>\2\2\u045f\u00fd\3\2\2\2\u0460\u0461"+ + "\7@\2\2\u0461\u0462\7@\2\2\u0462\u00ff\3\2\2\2\u0463\u0464\7(\2\2\u0464"+ + "\u0465\7`\2\2\u0465\u0101\3\2\2\2\u0466\u0467\7#\2\2\u0467\u0103\3\2\2"+ + "\2\u0468\u0469\7-\2\2\u0469\u0105\3\2\2\2\u046a\u046b\7/\2\2\u046b\u0107"+ + "\3\2\2\2\u046c\u046d\7`\2\2\u046d\u0109\3\2\2\2\u046e\u046f\7,\2\2\u046f"+ + "\u010b\3\2\2\2\u0470\u0471\7(\2\2\u0471\u010d\3\2\2\2\u0472\u0473\7>\2"+ + "\2\u0473\u0474\7/\2\2\u0474\u010f\3\2\2\2\u0475\u0481\7\62\2\2\u0476\u047d"+ + "\t\2\2\2\u0477\u0479\7a\2\2\u0478\u0477\3\2\2\2\u0478\u0479\3\2\2\2\u0479"+ + "\u047a\3\2\2\2\u047a\u047c\t\3\2\2\u047b\u0478\3\2\2\2\u047c\u047f\3\2"+ + "\2\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u0481\3\2\2\2\u047f"+ + "\u047d\3\2\2\2\u0480\u0475\3\2\2\2\u0480\u0476\3\2\2\2\u0481\u0482\3\2"+ + "\2\2\u0482\u0483\b\u0088\2\2\u0483\u0111\3\2\2\2\u0484\u0485\7\62\2\2"+ + "\u0485\u048a\t\4\2\2\u0486\u0488\7a\2\2\u0487\u0486\3\2\2\2\u0487\u0488"+ + "\3\2\2\2\u0488\u0489\3\2\2\2\u0489\u048b\5\u0144\u00a2\2\u048a\u0487\3"+ + "\2\2\2\u048b\u048c\3\2\2\2\u048c\u048a\3\2\2\2\u048c\u048d\3\2\2\2\u048d"+ + "\u048e\3\2\2\2\u048e\u048f\b\u0089\2\2\u048f\u0113\3\2\2\2\u0490\u0492"+ + "\7\62\2\2\u0491\u0493\t\5\2\2\u0492\u0491\3\2\2\2\u0492\u0493\3\2\2\2"+ + "\u0493\u0498\3\2\2\2\u0494\u0496\7a\2\2\u0495\u0494\3\2\2\2\u0495\u0496"+ + "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0499\5\u0140\u00a0\2\u0498\u0495\3"+ + "\2\2\2\u0499\u049a\3\2\2\2\u049a\u0498\3\2\2\2\u049a\u049b\3\2\2\2\u049b"+ + "\u049c\3\2\2\2\u049c\u049d\b\u008a\2\2\u049d\u0115\3\2\2\2\u049e\u049f"+ + "\7\62\2\2\u049f\u04a4\t\6\2\2\u04a0\u04a2\7a\2\2\u04a1\u04a0\3\2\2\2\u04a1"+ + "\u04a2\3\2\2\2\u04a2\u04a3\3\2\2\2\u04a3\u04a5\5\u0142\u00a1\2\u04a4\u04a1"+ + "\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a4\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7"+ + "\u04a8\3\2\2\2\u04a8\u04a9\b\u008b\2\2\u04a9\u0117\3\2\2\2\u04aa\u04ab"+ + "\7\62\2\2\u04ab\u04ac\t\6\2\2\u04ac\u04ad\5\u011a\u008d\2\u04ad\u04ae"+ + "\5\u011c\u008e\2\u04ae\u0119\3\2\2\2\u04af\u04b1\7a\2\2\u04b0\u04af\3"+ + "\2\2\2\u04b0\u04b1\3\2\2\2\u04b1\u04b2\3\2\2\2\u04b2\u04b4\5\u0142\u00a1"+ + "\2\u04b3\u04b0\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b3\3\2\2\2\u04b5\u04b6"+ + "\3\2\2\2\u04b6\u04c1\3\2\2\2\u04b7\u04be\7\60\2\2\u04b8\u04ba\7a\2\2\u04b9"+ + "\u04b8\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bd\5\u0142"+ + "\u00a1\2\u04bc\u04b9\3\2\2\2\u04bd\u04c0\3\2\2\2\u04be\u04bc\3\2\2\2\u04be"+ + "\u04bf\3\2\2\2\u04bf\u04c2\3\2\2\2\u04c0\u04be\3\2\2\2\u04c1\u04b7\3\2"+ + "\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04cf\3\2\2\2\u04c3\u04c4\7\60\2\2\u04c4"+ + "\u04cb\5\u0142\u00a1\2\u04c5\u04c7\7a\2\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7"+ + "\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04ca\5\u0142\u00a1\2\u04c9\u04c6\3"+ + "\2\2\2\u04ca\u04cd\3\2\2\2\u04cb\u04c9\3\2\2\2\u04cb\u04cc\3\2\2\2\u04cc"+ + "\u04cf\3\2\2\2\u04cd\u04cb\3\2\2\2\u04ce\u04b3\3\2\2\2\u04ce\u04c3\3\2"+ + "\2\2\u04cf\u011b\3\2\2\2\u04d0\u04d1\t\7\2\2\u04d1\u04d2\t\b\2\2\u04d2"+ + "\u04d3\5\u013e\u009f\2\u04d3\u011d\3\2\2\2\u04d4\u04da\5\u0110\u0088\2"+ + "\u04d5\u04da\5\u0112\u0089\2\u04d6\u04da\5\u0114\u008a\2\u04d7\u04da\5"+ + "\u0116\u008b\2\u04d8\u04da\5\4\2\2\u04d9\u04d4\3\2\2\2\u04d9\u04d5\3\2"+ + "\2\2\u04d9\u04d6\3\2\2\2\u04d9\u04d7\3\2\2\2\u04d9\u04d8\3\2\2\2\u04da"+ + "\u04db\3\2\2\2\u04db\u04dc\7k\2\2\u04dc\u04dd\3\2\2\2\u04dd\u04de\b\u008f"+ + "\2\2\u04de\u011f\3\2\2\2\u04df\u04e2\7)\2\2\u04e0\u04e3\5\u013a\u009d"+ + "\2\u04e1\u04e3\5\u0124\u0092\2\u04e2\u04e0\3\2\2\2\u04e2\u04e1\3\2\2\2"+ + "\u04e3\u04e4\3\2\2\2\u04e4\u04e5\7)\2\2\u04e5\u0121\3\2\2\2\u04e6\u04e7"+ + "\5\u0120\u0090\2\u04e7\u04e8\3\2\2\2\u04e8\u04e9\b\u0091\2\2\u04e9\u0123"+ + "\3\2\2\2\u04ea\u04ed\5\u0126\u0093\2\u04eb\u04ed\5\u0128\u0094\2\u04ec"+ + "\u04ea\3\2\2\2\u04ec\u04eb\3\2\2\2\u04ed\u0125\3\2\2\2\u04ee\u04ef\7^"+ + "\2\2\u04ef\u04f0\5\u0140\u00a0\2\u04f0\u04f1\5\u0140\u00a0\2\u04f1\u04f2"+ + "\5\u0140\u00a0\2\u04f2\u0127\3\2\2\2\u04f3\u04f4\7^\2\2\u04f4\u04f5\7"+ + "z\2\2\u04f5\u04f6\5\u0142\u00a1\2\u04f6\u04f7\5\u0142\u00a1\2\u04f7\u0129"+ + "\3\2\2\2\u04f8\u04f9\7^\2\2\u04f9\u04fa\7w\2\2\u04fa\u04fb\5\u0142\u00a1"+ + "\2\u04fb\u04fc\5\u0142\u00a1\2\u04fc\u04fd\5\u0142\u00a1\2\u04fd\u04fe"+ + "\5\u0142\u00a1\2\u04fe\u012b\3\2\2\2\u04ff\u0500\7^\2\2\u0500\u0501\7"+ + "W\2\2\u0501\u0502\5\u0142\u00a1\2\u0502\u0503\5\u0142\u00a1\2\u0503\u0504"+ + "\5\u0142\u00a1\2\u0504\u0505\5\u0142\u00a1\2\u0505\u0506\5\u0142\u00a1"+ + "\2\u0506\u0507\5\u0142\u00a1\2\u0507\u0508\5\u0142\u00a1\2\u0508\u0509"+ + "\5\u0142\u00a1\2\u0509\u012d\3\2\2\2\u050a\u050e\7b\2\2\u050b\u050d\n"+ + "\t\2\2\u050c\u050b\3\2\2\2\u050d\u0510\3\2\2\2\u050e\u050c\3\2\2\2\u050e"+ + "\u050f\3\2\2\2\u050f\u0511\3\2\2\2\u0510\u050e\3\2\2\2\u0511\u0512\7b"+ + "\2\2\u0512\u0513\3\2\2\2\u0513\u0514\b\u0097\2\2\u0514\u012f\3\2\2\2\u0515"+ + "\u051a\7$\2\2\u0516\u0519\n\n\2\2\u0517\u0519\5\u013c\u009e\2\u0518\u0516"+ + "\3\2\2\2\u0518\u0517\3\2\2\2\u0519\u051c\3\2\2\2\u051a\u0518\3\2\2\2\u051a"+ + "\u051b\3\2\2\2\u051b\u051d\3\2\2\2\u051c\u051a\3\2\2\2\u051d\u051e\7$"+ + "\2\2\u051e\u051f\3\2\2\2\u051f\u0520\b\u0098\2\2\u0520\u0131\3\2\2\2\u0521"+ + "\u0523\t\13\2\2\u0522\u0521\3\2\2\2\u0523\u0524\3\2\2\2\u0524\u0522\3"+ + "\2\2\2\u0524\u0525\3\2\2\2\u0525\u0526\3\2\2\2\u0526\u0527\b\u0099\3\2"+ + "\u0527\u0133\3\2\2\2\u0528\u0529\7\61\2\2\u0529\u052a\7,\2\2\u052a\u052e"+ + "\3\2\2\2\u052b\u052d\13\2\2\2\u052c\u052b\3\2\2\2\u052d\u0530\3\2\2\2"+ + "\u052e\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0531\3\2\2\2\u0530\u052e"+ + "\3\2\2\2\u0531\u0532\7,\2\2\u0532\u0533\7\61\2\2\u0533\u0534\3\2\2\2\u0534"+ + "\u0535\b\u009a\3\2\u0535\u0135\3\2\2\2\u0536\u0538\t\f\2\2\u0537\u0536"+ + "\3\2\2\2\u0538\u0539\3\2\2\2\u0539\u0537\3\2\2\2\u0539\u053a\3\2\2\2\u053a"+ + "\u053b\3\2\2\2\u053b\u053c\b\u009b\3\2\u053c\u0137\3\2\2\2\u053d\u053e"+ + "\7\61\2\2\u053e\u053f\7\61\2\2\u053f\u0543\3\2\2\2\u0540\u0542\n\f\2\2"+ + "\u0541\u0540\3\2\2\2\u0542\u0545\3\2\2\2\u0543\u0541\3\2\2\2\u0543\u0544"+ + "\3\2\2\2\u0544\u0546\3\2\2\2\u0545\u0543\3\2\2\2\u0546\u0547\b\u009c\3"+ + "\2\u0547\u0139\3\2\2\2\u0548\u054d\n\r\2\2\u0549\u054d\5\u012a\u0095\2"+ + "\u054a\u054d\5\u012c\u0096\2\u054b\u054d\5\u013c\u009e\2\u054c\u0548\3"+ + "\2\2\2\u054c\u0549\3\2\2\2\u054c\u054a\3\2\2\2\u054c\u054b\3\2\2\2\u054d"+ + "\u013b\3\2\2\2\u054e\u0568\7^\2\2\u054f\u0550\7w\2\2\u0550\u0551\5\u0142"+ + "\u00a1\2\u0551\u0552\5\u0142\u00a1\2\u0552\u0553\5\u0142\u00a1\2\u0553"+ + "\u0554\5\u0142\u00a1\2\u0554\u0569\3\2\2\2\u0555\u0556\7W\2\2\u0556\u0557"+ + "\5\u0142\u00a1\2\u0557\u0558\5\u0142\u00a1\2\u0558\u0559\5\u0142\u00a1"+ + "\2\u0559\u055a\5\u0142\u00a1\2\u055a\u055b\5\u0142\u00a1\2\u055b\u055c"+ + "\5\u0142\u00a1\2\u055c\u055d\5\u0142\u00a1\2\u055d\u055e\5\u0142\u00a1"+ + "\2\u055e\u0569\3\2\2\2\u055f\u0569\t\16\2\2\u0560\u0561\5\u0140\u00a0"+ + "\2\u0561\u0562\5\u0140\u00a0\2\u0562\u0563\5\u0140\u00a0\2\u0563\u0569"+ + "\3\2\2\2\u0564\u0565\7z\2\2\u0565\u0566\5\u0142\u00a1\2\u0566\u0567\5"+ + "\u0142\u00a1\2\u0567\u0569\3\2\2\2\u0568\u054f\3\2\2\2\u0568\u0555\3\2"+ + "\2\2\u0568\u055f\3\2\2\2\u0568\u0560\3\2\2\2\u0568\u0564\3\2\2\2\u0569"+ + "\u013d\3\2\2\2\u056a\u0571\t\3\2\2\u056b\u056d\7a\2\2\u056c\u056b\3\2"+ + "\2\2\u056c\u056d\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u0570\t\3\2\2\u056f"+ + "\u056c\3\2\2\2\u0570\u0573\3\2\2\2\u0571\u056f\3\2\2\2\u0571\u0572\3\2"+ + "\2\2\u0572\u013f\3\2\2\2\u0573\u0571\3\2\2\2\u0574\u0575\t\17\2\2\u0575"+ + "\u0141\3\2\2\2\u0576\u0577\t\20\2\2\u0577\u0143\3\2\2\2\u0578\u0579\t"+ + "\21\2\2\u0579\u0145\3\2\2\2\u057a\u057c\t\22\2\2\u057b\u057d\t\b\2\2\u057c"+ + "\u057b\3\2\2\2\u057c\u057d\3\2\2\2\u057d\u057e\3\2\2\2\u057e\u057f\5\u013e"+ + "\u009f\2\u057f\u0147\3\2\2\2\u0580\u0583\5\u014c\u00a6\2\u0581\u0583\7"+ + "a\2\2\u0582\u0580\3\2\2\2\u0582\u0581\3\2\2\2\u0583\u0149\3\2\2\2\u0584"+ + "\u0585\t\23\2\2\u0585\u014b\3\2\2\2\u0586\u0587\t\24\2\2\u0587\u014d\3"+ + "\2\2\2\u0588\u058a\t\13\2\2\u0589\u0588\3\2\2\2\u058a\u058b\3\2\2\2\u058b"+ + "\u0589\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058d\3\2\2\2\u058d\u058e\b\u00a7"+ + "\3\2\u058e\u014f\3\2\2\2\u058f\u0590\7\61\2\2\u0590\u0591\7,\2\2\u0591"+ + "\u0595\3\2\2\2\u0592\u0594\n\f\2\2\u0593\u0592\3\2\2\2\u0594\u0597\3\2"+ + "\2\2\u0595\u0596\3\2\2\2\u0595\u0593\3\2\2\2\u0596\u0598\3\2\2\2\u0597"+ + "\u0595\3\2\2\2\u0598\u0599\7,\2\2\u0599\u059a\7\61\2\2\u059a\u059b\3\2"+ + "\2\2\u059b\u059c\b\u00a8\3\2\u059c\u0151\3\2\2\2\u059d\u059e\7\61\2\2"+ + "\u059e\u059f\7\61\2\2\u059f\u05a3\3\2\2\2\u05a0\u05a2\n\f\2\2\u05a1\u05a0"+ + "\3\2\2\2\u05a2\u05a5\3\2\2\2\u05a3\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4"+ + "\u05a6\3\2\2\2\u05a5\u05a3\3\2\2\2\u05a6\u05a7\b\u00a9\3\2\u05a7\u0153"+ + "\3\2\2\2\u05a8\u05aa\t\f\2\2\u05a9\u05a8\3\2\2\2\u05aa\u05ab\3\2\2\2\u05ab"+ + "\u05a9\3\2\2\2\u05ab\u05ac\3\2\2\2\u05ac\u05bb\3\2\2\2\u05ad\u05bb\7="+ + "\2\2\u05ae\u05af\7\61\2\2\u05af\u05b0\7,\2\2\u05b0\u05b4\3\2\2\2\u05b1"+ + "\u05b3\13\2\2\2\u05b2\u05b1\3\2\2\2\u05b3\u05b6\3\2\2\2\u05b4\u05b5\3"+ + "\2\2\2\u05b4\u05b2\3\2\2\2\u05b5\u05b7\3\2\2\2\u05b6\u05b4\3\2\2\2\u05b7"+ + "\u05b8\7,\2\2\u05b8\u05bb\7\61\2\2\u05b9\u05bb\7\2\2\3\u05ba\u05a9\3\2"+ + "\2\2\u05ba\u05ad\3\2\2\2\u05ba\u05ae\3\2\2\2\u05ba\u05b9\3\2\2\2\u05bb"+ + "\u05bc\3\2\2\2\u05bc\u05bd\b\u00aa\4\2\u05bd\u0155\3\2\2\2\u05be\u05bf"+ + "\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c1\b\u00ab\4\2\u05c1\u05c2\b\u00ab"+ + "\3\2\u05c2\u0157\3\2\2\2\64\2\3\u015a\u0162\u0165\u0168\u016e\u0170\u040d"+ + "\u040f\u0478\u047d\u0480\u0487\u048c\u0492\u0495\u049a\u04a1\u04a6\u04b0"+ + "\u04b5\u04b9\u04be\u04c1\u04c6\u04cb\u04ce\u04d9\u04e2\u04ec\u050e\u0518"+ + "\u051a\u0524\u052e\u0539\u0543\u054c\u0568\u056c\u0571\u057c\u0582\u058b"+ + "\u0595\u05a3\u05ab\u05b4\u05ba\5\4\3\2\2\3\2\4\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 3031c6145..045338bf7 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,4 +1,4 @@ -// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 +// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -11,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class GobraParser extends GobraParserBase { - static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -27,21 +27,21 @@ public class GobraParser extends GobraParserBase { PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58, SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64, OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70, - BREAK=71, DEFAULT=72, FUNC=73, INTERFACE=74, SELECT=75, CASE=76, DEFER=77, - GO=78, MAP=79, STRUCT=80, CHAN=81, ELSE=82, GOTO=83, PACKAGE=84, SWITCH=85, - CONST=86, FALLTHROUGH=87, IF=88, RANGE=89, TYPE=90, CONTINUE=91, FOR=92, - IMPORT=93, RETURN=94, VAR=95, NIL_LIT=96, IDENTIFIER=97, L_PAREN=98, R_PAREN=99, - L_CURLY=100, R_CURLY=101, L_BRACKET=102, R_BRACKET=103, ASSIGN=104, COMMA=105, - SEMI=106, COLON=107, DOT=108, PLUS_PLUS=109, MINUS_MINUS=110, DECLARE_ASSIGN=111, - ELLIPSIS=112, LOGICAL_OR=113, LOGICAL_AND=114, EQUALS=115, NOT_EQUALS=116, - LESS=117, LESS_OR_EQUALS=118, GREATER=119, GREATER_OR_EQUALS=120, OR=121, - DIV=122, MOD=123, LSHIFT=124, RSHIFT=125, BIT_CLEAR=126, EXCLAMATION=127, - PLUS=128, MINUS=129, CARET=130, STAR=131, AMPERSAND=132, RECEIVE=133, - DECIMAL_LIT=134, BINARY_LIT=135, OCTAL_LIT=136, HEX_LIT=137, HEX_FLOAT_LIT=138, - IMAGINARY_LIT=139, RUNE_LIT=140, BYTE_VALUE=141, OCTAL_BYTE_VALUE=142, - HEX_BYTE_VALUE=143, LITTLE_U_VALUE=144, BIG_U_VALUE=145, RAW_STRING_LIT=146, - INTERPRETED_STRING_LIT=147, WS=148, COMMENT=149, TERMINATOR=150, LINE_COMMENT=151, - WS_NLSEMI=152, COMMENT_NLSEMI=153, LINE_COMMENT_NLSEMI=154, EOS=155, OTHER=156; + WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77, + DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85, + SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92, + FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99, + R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105, + COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111, + DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116, + NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121, + OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128, + PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134, + DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139, + IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143, + HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147, + INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152, + WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157; public static final int RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3, RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_initPost = 6, @@ -70,29 +70,29 @@ public class GobraParser extends GobraParserBase { RULE_interfaceType = 84, RULE_predicateSpec = 85, RULE_methodSpec = 86, RULE_type_ = 87, RULE_typeLit = 88, RULE_predType = 89, RULE_predTypeParams = 90, RULE_literalType = 91, RULE_implicitArray = 92, RULE_slice_ = 93, RULE_low = 94, - RULE_high = 95, RULE_cap = 96, RULE_assign_op = 97, RULE_packageClause = 98, - RULE_importPath = 99, RULE_declaration = 100, RULE_constDecl = 101, RULE_constSpec = 102, - RULE_identifierList = 103, RULE_expressionList = 104, RULE_typeDecl = 105, - RULE_typeSpec = 106, RULE_varDecl = 107, RULE_block = 108, RULE_statementList = 109, - RULE_simpleStmt = 110, RULE_expressionStmt = 111, RULE_sendStmt = 112, - RULE_incDecStmt = 113, RULE_assignment = 114, RULE_emptyStmt = 115, RULE_labeledStmt = 116, - RULE_returnStmt = 117, RULE_breakStmt = 118, RULE_continueStmt = 119, - RULE_gotoStmt = 120, RULE_fallthroughStmt = 121, RULE_ifStmt = 122, RULE_switchStmt = 123, - RULE_exprSwitchStmt = 124, RULE_exprCaseClause = 125, RULE_exprSwitchCase = 126, - RULE_typeSwitchStmt = 127, RULE_typeSwitchGuard = 128, RULE_typeCaseClause = 129, - RULE_typeSwitchCase = 130, RULE_typeList = 131, RULE_selectStmt = 132, - RULE_commClause = 133, RULE_commCase = 134, RULE_recvStmt = 135, RULE_forStmt = 136, - RULE_forClause = 137, RULE_rangeClause = 138, RULE_goStmt = 139, RULE_typeName = 140, - RULE_arrayType = 141, RULE_arrayLength = 142, RULE_elementType = 143, - RULE_pointerType = 144, RULE_sliceType = 145, RULE_mapType = 146, RULE_channelType = 147, - RULE_functionType = 148, RULE_signature = 149, RULE_result = 150, RULE_parameters = 151, - RULE_conversion = 152, RULE_nonNamedType = 153, RULE_operand = 154, RULE_literal = 155, - RULE_integer = 156, RULE_operandName = 157, RULE_qualifiedIdent = 158, - RULE_compositeLit = 159, RULE_literalValue = 160, RULE_elementList = 161, - RULE_keyedElement = 162, RULE_key = 163, RULE_element = 164, RULE_structType = 165, - RULE_fieldDecl = 166, RULE_string_ = 167, RULE_embeddedField = 168, RULE_index = 169, - RULE_typeAssertion = 170, RULE_arguments = 171, RULE_methodExpr = 172, - RULE_receiverType = 173, RULE_eos = 174; + RULE_high = 95, RULE_cap = 96, RULE_assign_op = 97, RULE_rangeClause = 98, + RULE_packageClause = 99, RULE_importPath = 100, RULE_declaration = 101, + RULE_constDecl = 102, RULE_constSpec = 103, RULE_identifierList = 104, + RULE_expressionList = 105, RULE_typeDecl = 106, RULE_typeSpec = 107, RULE_varDecl = 108, + RULE_block = 109, RULE_statementList = 110, RULE_simpleStmt = 111, RULE_expressionStmt = 112, + RULE_sendStmt = 113, RULE_incDecStmt = 114, RULE_assignment = 115, RULE_emptyStmt = 116, + RULE_labeledStmt = 117, RULE_returnStmt = 118, RULE_breakStmt = 119, RULE_continueStmt = 120, + RULE_gotoStmt = 121, RULE_fallthroughStmt = 122, RULE_ifStmt = 123, RULE_switchStmt = 124, + RULE_exprSwitchStmt = 125, RULE_exprCaseClause = 126, RULE_exprSwitchCase = 127, + RULE_typeSwitchStmt = 128, RULE_typeSwitchGuard = 129, RULE_typeCaseClause = 130, + RULE_typeSwitchCase = 131, RULE_typeList = 132, RULE_selectStmt = 133, + RULE_commClause = 134, RULE_commCase = 135, RULE_recvStmt = 136, RULE_forStmt = 137, + RULE_forClause = 138, RULE_goStmt = 139, RULE_typeName = 140, RULE_arrayType = 141, + RULE_arrayLength = 142, RULE_elementType = 143, RULE_pointerType = 144, + RULE_sliceType = 145, RULE_mapType = 146, RULE_channelType = 147, RULE_functionType = 148, + RULE_signature = 149, RULE_result = 150, RULE_parameters = 151, RULE_conversion = 152, + RULE_nonNamedType = 153, RULE_operand = 154, RULE_literal = 155, RULE_integer = 156, + RULE_operandName = 157, RULE_qualifiedIdent = 158, RULE_compositeLit = 159, + RULE_literalValue = 160, RULE_elementList = 161, RULE_keyedElement = 162, + RULE_key = 163, RULE_element = 164, RULE_structType = 165, RULE_fieldDecl = 166, + RULE_string_ = 167, RULE_embeddedField = 168, RULE_index = 169, RULE_typeAssertion = 170, + RULE_arguments = 171, RULE_methodExpr = 172, RULE_receiverType = 173, + RULE_eos = 174; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", @@ -114,15 +114,15 @@ private static String[] makeRuleNames() { "specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", "closureDecl", "predConstructArgs", "interfaceType", "predicateSpec", "methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType", - "implicitArray", "slice_", "low", "high", "cap", "assign_op", "packageClause", - "importPath", "declaration", "constDecl", "constSpec", "identifierList", - "expressionList", "typeDecl", "typeSpec", "varDecl", "block", "statementList", - "simpleStmt", "expressionStmt", "sendStmt", "incDecStmt", "assignment", - "emptyStmt", "labeledStmt", "returnStmt", "breakStmt", "continueStmt", - "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt", - "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard", - "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", "commClause", - "commCase", "recvStmt", "forStmt", "forClause", "rangeClause", "goStmt", + "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause", + "packageClause", "importPath", "declaration", "constDecl", "constSpec", + "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl", + "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt", + "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt", + "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt", + "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", + "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", + "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt", "typeName", "arrayType", "arrayLength", "elementType", "pointerType", "sliceType", "mapType", "channelType", "functionType", "signature", "result", "parameters", "conversion", "nonNamedType", "operand", "literal", "integer", @@ -146,15 +146,15 @@ private static String[] makeLiteralNames() { "'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", - "'importRequires'", "'proof'", "'==='", "'!=='", "'break'", "'default'", - "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", - "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", - "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", - "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", - "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", - "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", - "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", - "'^'", "'*'", "'&'", "'<-'" + "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'", + "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", + "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'", + "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", + "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, + "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", + "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", + "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", + "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -169,9 +169,9 @@ private static String[] makeSymbolicNames() { "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", - "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", - "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", - "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", + "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", + "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", @@ -559,7 +559,7 @@ public final SourceFileContext sourceFile() throws RecognitionException { setState(398); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (CONST - 73)) | (1L << (TYPE - 73)) | (1L << (VAR - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) { + while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (CONST - 74)) | (1L << (TYPE - 74)) | (1L << (VAR - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { { { setState(392); @@ -3240,7 +3240,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition setState(720); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { setState(716); closureSpecParams(); @@ -5016,7 +5016,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(901); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & ((1L << (EXCLAMATION - 127)) | (1L << (PLUS - 127)) | (1L << (MINUS - 127)) | (1L << (CARET - 127)) | (1L << (STAR - 127)) | (1L << (AMPERSAND - 127)) | (1L << (RECEIVE - 127)))) != 0)) ) { + if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)))) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -5101,7 +5101,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(919); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) ) { + if ( !(((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -5122,7 +5122,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(922); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 109)) & ~0x3f) == 0 && ((1L << (_la - 109)) & ((1L << (PLUS_PLUS - 109)) | (1L << (OR - 109)) | (1L << (PLUS - 109)) | (1L << (MINUS - 109)) | (1L << (CARET - 109)))) != 0)) ) { + if ( !(_la==WAND || ((((_la - 110)) & ~0x3f) == 0 && ((1L << (_la - 110)) & ((1L << (PLUS_PLUS - 110)) | (1L << (OR - 110)) | (1L << (PLUS - 110)) | (1L << (MINUS - 110)) | (1L << (CARET - 110)))) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -6472,7 +6472,7 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce setState(1073); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { setState(1072); expressionList(); @@ -7027,7 +7027,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException setState(1152); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { { setState(1141); type_(); @@ -7268,7 +7268,7 @@ public final Slice_Context slice_() throws RecognitionException { setState(1172); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { setState(1171); low(); @@ -7280,7 +7280,7 @@ public final Slice_Context slice_() throws RecognitionException { setState(1176); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { setState(1175); high(); @@ -7294,7 +7294,7 @@ public final Slice_Context slice_() throws RecognitionException { setState(1179); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { setState(1178); low(); @@ -7470,12 +7470,12 @@ public final Assign_opContext assign_op() throws RecognitionException { setState(1197); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 121)) & ~0x3f) == 0 && ((1L << (_la - 121)) & ((1L << (OR - 121)) | (1L << (DIV - 121)) | (1L << (MOD - 121)) | (1L << (LSHIFT - 121)) | (1L << (RSHIFT - 121)) | (1L << (BIT_CLEAR - 121)) | (1L << (PLUS - 121)) | (1L << (MINUS - 121)) | (1L << (CARET - 121)) | (1L << (STAR - 121)) | (1L << (AMPERSAND - 121)))) != 0)) { + if (((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) { { setState(1196); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 121)) & ~0x3f) == 0 && ((1L << (_la - 121)) & ((1L << (OR - 121)) | (1L << (DIV - 121)) | (1L << (MOD - 121)) | (1L << (LSHIFT - 121)) | (1L << (RSHIFT - 121)) | (1L << (BIT_CLEAR - 121)) | (1L << (PLUS - 121)) | (1L << (MINUS - 121)) | (1L << (CARET - 121)) | (1L << (STAR - 121)) | (1L << (AMPERSAND - 121)))) != 0)) ) { + if ( !(((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -7501,6 +7501,96 @@ public final Assign_opContext assign_op() throws RecognitionException { return _localctx; } + public static class RangeClauseContext extends ParserRuleContext { + public TerminalNode RANGE() { return getToken(GobraParser.RANGE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ExpressionListContext expressionList() { + return getRuleContext(ExpressionListContext.class,0); + } + public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); } + public MaybeAddressableIdentifierListContext maybeAddressableIdentifierList() { + return getRuleContext(MaybeAddressableIdentifierListContext.class,0); + } + public TerminalNode DECLARE_ASSIGN() { return getToken(GobraParser.DECLARE_ASSIGN, 0); } + public TerminalNode WITH() { return getToken(GobraParser.WITH, 0); } + public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } + public RangeClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_rangeClause; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitRangeClause(this); + else return visitor.visitChildren(this); + } + } + + public final RangeClauseContext rangeClause() throws RecognitionException { + RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); + enterRule(_localctx, 196, RULE_rangeClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1207); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + case 1: + { + setState(1201); + expressionList(); + setState(1202); + match(ASSIGN); + } + break; + case 2: + { + setState(1204); + maybeAddressableIdentifierList(); + setState(1205); + match(DECLARE_ASSIGN); + } + break; + } + setState(1209); + match(RANGE); + setState(1210); + expression(0); + setState(1215); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WITH) { + { + setState(1211); + match(WITH); + setState(1213); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IDENTIFIER) { + { + setState(1212); + match(IDENTIFIER); + } + } + + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class PackageClauseContext extends ParserRuleContext { public Token packageName; public TerminalNode PACKAGE() { return getToken(GobraParser.PACKAGE, 0); } @@ -7518,13 +7608,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_packageClause); + enterRule(_localctx, 198, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1201); + setState(1217); match(PACKAGE); - setState(1202); + setState(1218); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -7556,11 +7646,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_importPath); + enterRule(_localctx, 200, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1204); + setState(1220); string_(); } } @@ -7598,29 +7688,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_declaration); + enterRule(_localctx, 202, RULE_declaration); try { - setState(1209); + setState(1225); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1206); + setState(1222); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1207); + setState(1223); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1208); + setState(1224); varDecl(); } break; @@ -7668,43 +7758,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_constDecl); + enterRule(_localctx, 204, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1211); + setState(1227); match(CONST); - setState(1223); + setState(1239); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1212); + setState(1228); constSpec(); } break; case L_PAREN: { - setState(1213); + setState(1229); match(L_PAREN); - setState(1219); + setState(1235); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1214); + setState(1230); constSpec(); - setState(1215); + setState(1231); eos(); } } - setState(1221); + setState(1237); _errHandler.sync(this); _la = _input.LA(1); } - setState(1222); + setState(1238); match(R_PAREN); } break; @@ -7748,31 +7838,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 204, RULE_constSpec); + enterRule(_localctx, 206, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1225); + setState(1241); identifierList(); - setState(1231); + setState(1247); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: { - setState(1227); + setState(1243); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { { - setState(1226); + setState(1242); type_(); } } - setState(1229); + setState(1245); match(ASSIGN); - setState(1230); + setState(1246); expressionList(); } break; @@ -7812,30 +7902,30 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_identifierList); + enterRule(_localctx, 208, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1233); + setState(1249); match(IDENTIFIER); - setState(1238); + setState(1254); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,104,_ctx); + _alt = getInterpreter().adaptivePredict(_input,107,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1234); + setState(1250); match(COMMA); - setState(1235); + setState(1251); match(IDENTIFIER); } } } - setState(1240); + setState(1256); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,104,_ctx); + _alt = getInterpreter().adaptivePredict(_input,107,_ctx); } } } @@ -7874,30 +7964,30 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 208, RULE_expressionList); + enterRule(_localctx, 210, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1241); + setState(1257); expression(0); - setState(1246); + setState(1262); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,105,_ctx); + _alt = getInterpreter().adaptivePredict(_input,108,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1242); + setState(1258); match(COMMA); - setState(1243); + setState(1259); expression(0); } } } - setState(1248); + setState(1264); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,105,_ctx); + _alt = getInterpreter().adaptivePredict(_input,108,_ctx); } } } @@ -7941,43 +8031,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_typeDecl); + enterRule(_localctx, 212, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1249); + setState(1265); match(TYPE); - setState(1261); + setState(1277); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1250); + setState(1266); typeSpec(); } break; case L_PAREN: { - setState(1251); + setState(1267); match(L_PAREN); - setState(1257); + setState(1273); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1252); + setState(1268); typeSpec(); - setState(1253); + setState(1269); eos(); } } - setState(1259); + setState(1275); _errHandler.sync(this); _la = _input.LA(1); } - setState(1260); + setState(1276); match(R_PAREN); } break; @@ -8016,24 +8106,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_typeSpec); + enterRule(_localctx, 214, RULE_typeSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1263); + setState(1279); match(IDENTIFIER); - setState(1265); + setState(1281); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1264); + setState(1280); match(ASSIGN); } } - setState(1267); + setState(1283); type_(); } } @@ -8077,43 +8167,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_varDecl); + enterRule(_localctx, 216, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1269); + setState(1285); match(VAR); - setState(1281); + setState(1297); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1270); + setState(1286); varSpec(); } break; case L_PAREN: { - setState(1271); + setState(1287); match(L_PAREN); - setState(1277); + setState(1293); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1272); + setState(1288); varSpec(); - setState(1273); + setState(1289); eos(); } } - setState(1279); + setState(1295); _errHandler.sync(this); _la = _input.LA(1); } - setState(1280); + setState(1296); match(R_PAREN); } break; @@ -8152,23 +8242,23 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_block); + enterRule(_localctx, 218, RULE_block); try { enterOuterAlt(_localctx, 1); { - setState(1283); + setState(1299); match(L_CURLY); - setState(1285); + setState(1301); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,111,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) { case 1: { - setState(1284); + setState(1300); statementList(); } break; } - setState(1287); + setState(1303); match(R_CURLY); } } @@ -8209,12 +8299,12 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_statementList); + enterRule(_localctx, 220, RULE_statementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1295); + setState(1311); _errHandler.sync(this); _alt = 1; do { @@ -8222,19 +8312,19 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1290); + setState(1306); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) { case 1: { - setState(1289); + setState(1305); eos(); } break; } - setState(1292); + setState(1308); statement(); - setState(1293); + setState(1309); eos(); } } @@ -8242,9 +8332,9 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1297); + setState(1313); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,113,_ctx); + _alt = getInterpreter().adaptivePredict(_input,116,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -8288,43 +8378,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_simpleStmt); + enterRule(_localctx, 222, RULE_simpleStmt); try { - setState(1304); + setState(1320); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1299); + setState(1315); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1300); + setState(1316); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1301); + setState(1317); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1302); + setState(1318); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1303); + setState(1319); shortVarDecl(); } break; @@ -8358,11 +8448,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_expressionStmt); + enterRule(_localctx, 224, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1306); + setState(1322); expression(0); } } @@ -8399,15 +8489,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_sendStmt); + enterRule(_localctx, 226, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1308); + setState(1324); ((SendStmtContext)_localctx).channel = expression(0); - setState(1309); + setState(1325); match(RECEIVE); - setState(1310); + setState(1326); expression(0); } } @@ -8441,14 +8531,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_incDecStmt); + enterRule(_localctx, 228, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1312); + setState(1328); expression(0); - setState(1313); + setState(1329); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -8494,15 +8584,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_assignment); + enterRule(_localctx, 230, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1315); + setState(1331); expressionList(); - setState(1316); + setState(1332); assign_op(); - setState(1317); + setState(1333); expressionList(); } } @@ -8533,12 +8623,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_emptyStmt); + enterRule(_localctx, 232, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1319); + setState(1335); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -8580,20 +8670,20 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_labeledStmt); + enterRule(_localctx, 234, RULE_labeledStmt); try { enterOuterAlt(_localctx, 1); { - setState(1321); + setState(1337); match(IDENTIFIER); - setState(1322); + setState(1338); match(COLON); - setState(1324); + setState(1340); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) { case 1: { - setState(1323); + setState(1339); statement(); } break; @@ -8629,18 +8719,18 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_returnStmt); + enterRule(_localctx, 236, RULE_returnStmt); try { enterOuterAlt(_localctx, 1); { - setState(1326); + setState(1342); match(RETURN); - setState(1328); + setState(1344); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { case 1: { - setState(1327); + setState(1343); expressionList(); } break; @@ -8674,18 +8764,18 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_breakStmt); + enterRule(_localctx, 238, RULE_breakStmt); try { enterOuterAlt(_localctx, 1); { - setState(1330); + setState(1346); match(BREAK); - setState(1332); + setState(1348); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { case 1: { - setState(1331); + setState(1347); match(IDENTIFIER); } break; @@ -8719,18 +8809,18 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_continueStmt); + enterRule(_localctx, 240, RULE_continueStmt); try { enterOuterAlt(_localctx, 1); { - setState(1334); + setState(1350); match(CONTINUE); - setState(1336); + setState(1352); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { case 1: { - setState(1335); + setState(1351); match(IDENTIFIER); } break; @@ -8764,13 +8854,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_gotoStmt); + enterRule(_localctx, 242, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1338); + setState(1354); match(GOTO); - setState(1339); + setState(1355); match(IDENTIFIER); } } @@ -8800,11 +8890,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_fallthroughStmt); + enterRule(_localctx, 244, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1341); + setState(1357); match(FALLTHROUGH); } } @@ -8853,61 +8943,61 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_ifStmt); + enterRule(_localctx, 246, RULE_ifStmt); try { enterOuterAlt(_localctx, 1); { - setState(1343); + setState(1359); match(IF); - setState(1352); + setState(1368); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) { case 1: { - setState(1344); + setState(1360); expression(0); } break; case 2: { - setState(1345); + setState(1361); eos(); - setState(1346); + setState(1362); expression(0); } break; case 3: { - setState(1348); + setState(1364); simpleStmt(); - setState(1349); + setState(1365); eos(); - setState(1350); + setState(1366); expression(0); } break; } - setState(1354); + setState(1370); block(); - setState(1360); + setState(1376); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { case 1: { - setState(1355); + setState(1371); match(ELSE); - setState(1358); + setState(1374); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1356); + setState(1372); ifStmt(); } break; case L_CURLY: { - setState(1357); + setState(1373); block(); } break; @@ -8950,22 +9040,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_switchStmt); + enterRule(_localctx, 248, RULE_switchStmt); try { - setState(1364); + setState(1380); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1362); + setState(1378); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1363); + setState(1379); typeSwitchStmt(); } break; @@ -9014,24 +9104,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_exprSwitchStmt); + enterRule(_localctx, 250, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1366); + setState(1382); match(SWITCH); - setState(1377); + setState(1393); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: { - setState(1368); + setState(1384); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { - setState(1367); + setState(1383); expression(0); } } @@ -9040,24 +9130,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1371); + setState(1387); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: { - setState(1370); + setState(1386); simpleStmt(); } break; } - setState(1373); + setState(1389); eos(); - setState(1375); + setState(1391); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { - setState(1374); + setState(1390); expression(0); } } @@ -9065,23 +9155,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1379); + setState(1395); match(L_CURLY); - setState(1383); + setState(1399); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1380); + setState(1396); exprCaseClause(); } } - setState(1385); + setState(1401); _errHandler.sync(this); _la = _input.LA(1); } - setState(1386); + setState(1402); match(R_CURLY); } } @@ -9117,20 +9207,20 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_exprCaseClause); + enterRule(_localctx, 252, RULE_exprCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1388); + setState(1404); exprSwitchCase(); - setState(1389); + setState(1405); match(COLON); - setState(1391); + setState(1407); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { case 1: { - setState(1390); + setState(1406); statementList(); } break; @@ -9167,24 +9257,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_exprSwitchCase); + enterRule(_localctx, 254, RULE_exprSwitchCase); try { - setState(1396); + setState(1412); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1393); + setState(1409); match(CASE); - setState(1394); + setState(1410); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1395); + setState(1411); match(DEFAULT); } break; @@ -9235,58 +9325,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_typeSwitchStmt); + enterRule(_localctx, 256, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1398); + setState(1414); match(SWITCH); - setState(1407); + setState(1423); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { case 1: { - setState(1399); + setState(1415); typeSwitchGuard(); } break; case 2: { - setState(1400); + setState(1416); eos(); - setState(1401); + setState(1417); typeSwitchGuard(); } break; case 3: { - setState(1403); + setState(1419); simpleStmt(); - setState(1404); + setState(1420); eos(); - setState(1405); + setState(1421); typeSwitchGuard(); } break; } - setState(1409); + setState(1425); match(L_CURLY); - setState(1413); + setState(1429); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1410); + setState(1426); typeCaseClause(); } } - setState(1415); + setState(1431); _errHandler.sync(this); _la = _input.LA(1); } - setState(1416); + setState(1432); match(R_CURLY); } } @@ -9324,31 +9414,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_typeSwitchGuard); + enterRule(_localctx, 258, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1420); + setState(1436); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: { - setState(1418); + setState(1434); match(IDENTIFIER); - setState(1419); + setState(1435); match(DECLARE_ASSIGN); } break; } - setState(1422); + setState(1438); primaryExpr(0); - setState(1423); + setState(1439); match(DOT); - setState(1424); + setState(1440); match(L_PAREN); - setState(1425); + setState(1441); match(TYPE); - setState(1426); + setState(1442); match(R_PAREN); } } @@ -9384,20 +9474,20 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_typeCaseClause); + enterRule(_localctx, 260, RULE_typeCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1428); + setState(1444); typeSwitchCase(); - setState(1429); + setState(1445); match(COLON); - setState(1431); + setState(1447); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { case 1: { - setState(1430); + setState(1446); statementList(); } break; @@ -9434,24 +9524,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_typeSwitchCase); + enterRule(_localctx, 262, RULE_typeSwitchCase); try { - setState(1436); + setState(1452); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1433); + setState(1449); match(CASE); - setState(1434); + setState(1450); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1435); + setState(1451); match(DEFAULT); } break; @@ -9498,12 +9588,12 @@ public T accept(ParseTreeVisitor visitor) { public final TypeListContext typeList() throws RecognitionException { TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_typeList); + enterRule(_localctx, 264, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1440); + setState(1456); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -9525,28 +9615,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1438); + setState(1454); type_(); } break; case NIL_LIT: { - setState(1439); + setState(1455); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1449); + setState(1465); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1442); + setState(1458); match(COMMA); - setState(1445); + setState(1461); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -9568,13 +9658,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1443); + setState(1459); type_(); } break; case NIL_LIT: { - setState(1444); + setState(1460); match(NIL_LIT); } break; @@ -9583,7 +9673,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1451); + setState(1467); _errHandler.sync(this); _la = _input.LA(1); } @@ -9623,30 +9713,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_selectStmt); + enterRule(_localctx, 266, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1452); + setState(1468); match(SELECT); - setState(1453); + setState(1469); match(L_CURLY); - setState(1457); + setState(1473); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1454); + setState(1470); commClause(); } } - setState(1459); + setState(1475); _errHandler.sync(this); _la = _input.LA(1); } - setState(1460); + setState(1476); match(R_CURLY); } } @@ -9682,20 +9772,20 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_commClause); + enterRule(_localctx, 268, RULE_commClause); try { enterOuterAlt(_localctx, 1); { - setState(1462); + setState(1478); commCase(); - setState(1463); + setState(1479); match(COLON); - setState(1465); + setState(1481); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1464); + setState(1480); statementList(); } break; @@ -9735,28 +9825,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_commCase); + enterRule(_localctx, 270, RULE_commCase); try { - setState(1473); + setState(1489); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1467); + setState(1483); match(CASE); - setState(1470); + setState(1486); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: { - setState(1468); + setState(1484); sendStmt(); } break; case 2: { - setState(1469); + setState(1485); recvStmt(); } break; @@ -9766,7 +9856,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1472); + setState(1488); match(DEFAULT); } break; @@ -9811,31 +9901,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_recvStmt); + enterRule(_localctx, 272, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1481); + setState(1497); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1475); + setState(1491); expressionList(); - setState(1476); + setState(1492); match(ASSIGN); } break; case 2: { - setState(1478); + setState(1494); identifierList(); - setState(1479); + setState(1495); match(DECLARE_ASSIGN); } break; } - setState(1483); + setState(1499); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -9877,35 +9967,35 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_forStmt); + enterRule(_localctx, 274, RULE_forStmt); try { enterOuterAlt(_localctx, 1); { - setState(1485); + setState(1501); match(FOR); - setState(1489); + setState(1505); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1486); + setState(1502); expression(0); } break; case 2: { - setState(1487); + setState(1503); forClause(); } break; case 3: { - setState(1488); + setState(1504); rangeClause(); } break; } - setState(1491); + setState(1507); block(); } } @@ -9951,41 +10041,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_forClause); + enterRule(_localctx, 276, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1494); + setState(1510); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { case 1: { - setState(1493); + setState(1509); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1496); + setState(1512); eos(); - setState(1498); + setState(1514); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1497); + setState(1513); expression(0); } break; } - setState(1500); + setState(1516); eos(); - setState(1502); + setState(1518); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { - setState(1501); + setState(1517); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -10003,73 +10093,6 @@ public final ForClauseContext forClause() throws RecognitionException { return _localctx; } - public static class RangeClauseContext extends ParserRuleContext { - public TerminalNode RANGE() { return getToken(GobraParser.RANGE, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public ExpressionListContext expressionList() { - return getRuleContext(ExpressionListContext.class,0); - } - public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); } - public IdentifierListContext identifierList() { - return getRuleContext(IdentifierListContext.class,0); - } - public TerminalNode DECLARE_ASSIGN() { return getToken(GobraParser.DECLARE_ASSIGN, 0); } - public RangeClauseContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_rangeClause; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitRangeClause(this); - else return visitor.visitChildren(this); - } - } - - public final RangeClauseContext rangeClause() throws RecognitionException { - RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_rangeClause); - try { - enterOuterAlt(_localctx, 1); - { - setState(1510); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { - case 1: - { - setState(1504); - expressionList(); - setState(1505); - match(ASSIGN); - } - break; - case 2: - { - setState(1507); - identifierList(); - setState(1508); - match(DECLARE_ASSIGN); - } - break; - } - setState(1512); - match(RANGE); - setState(1513); - expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - public static class GoStmtContext extends ParserRuleContext { public TerminalNode GO() { return getToken(GobraParser.GO, 0); } public ExpressionContext expression() { @@ -10092,9 +10115,9 @@ public final GoStmtContext goStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1515); + setState(1520); match(GO); - setState(1516); + setState(1521); expression(0); } } @@ -10129,20 +10152,20 @@ public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); enterRule(_localctx, 280, RULE_typeName); try { - setState(1520); + setState(1525); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1518); + setState(1523); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1519); + setState(1524); match(IDENTIFIER); } break; @@ -10185,13 +10208,13 @@ public final ArrayTypeContext arrayType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1522); + setState(1527); match(L_BRACKET); - setState(1523); + setState(1528); arrayLength(); - setState(1524); + setState(1529); match(R_BRACKET); - setState(1525); + setState(1530); elementType(); } } @@ -10227,7 +10250,7 @@ public final ArrayLengthContext arrayLength() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1527); + setState(1532); expression(0); } } @@ -10263,7 +10286,7 @@ public final ElementTypeContext elementType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1529); + setState(1534); type_(); } } @@ -10300,9 +10323,9 @@ public final PointerTypeContext pointerType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1531); + setState(1536); match(STAR); - setState(1532); + setState(1537); type_(); } } @@ -10340,11 +10363,11 @@ public final SliceTypeContext sliceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1534); + setState(1539); match(L_BRACKET); - setState(1535); + setState(1540); match(R_BRACKET); - setState(1536); + setState(1541); elementType(); } } @@ -10386,15 +10409,15 @@ public final MapTypeContext mapType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1538); + setState(1543); match(MAP); - setState(1539); + setState(1544); match(L_BRACKET); - setState(1540); + setState(1545); type_(); - setState(1541); + setState(1546); match(R_BRACKET); - setState(1542); + setState(1547); elementType(); } } @@ -10432,33 +10455,33 @@ public final ChannelTypeContext channelType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1549); + setState(1554); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { case 1: { - setState(1544); + setState(1549); match(CHAN); } break; case 2: { - setState(1545); + setState(1550); match(CHAN); - setState(1546); + setState(1551); match(RECEIVE); } break; case 3: { - setState(1547); + setState(1552); match(RECEIVE); - setState(1548); + setState(1553); match(CHAN); } break; } - setState(1551); + setState(1556); elementType(); } } @@ -10495,9 +10518,9 @@ public final FunctionTypeContext functionType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1553); + setState(1558); match(FUNC); - setState(1554); + setState(1559); signature(); } } @@ -10534,22 +10557,22 @@ public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); enterRule(_localctx, 298, RULE_signature); try { - setState(1560); + setState(1565); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1556); + setState(1561); parameters(); - setState(1557); + setState(1562); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1559); + setState(1564); parameters(); } break; @@ -10588,20 +10611,20 @@ public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); enterRule(_localctx, 300, RULE_result); try { - setState(1564); + setState(1569); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1562); + setState(1567); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1563); + setState(1568); type_(); } break; @@ -10650,39 +10673,39 @@ public final ParametersContext parameters() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1566); + setState(1571); match(L_PAREN); - setState(1578); + setState(1583); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (ELLIPSIS - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (ELLIPSIS - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { { - setState(1567); - parameterDecl(); setState(1572); + parameterDecl(); + setState(1577); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,152,_ctx); + _alt = getInterpreter().adaptivePredict(_input,154,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1568); + setState(1573); match(COMMA); - setState(1569); + setState(1574); parameterDecl(); } } } - setState(1574); + setState(1579); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,152,_ctx); + _alt = getInterpreter().adaptivePredict(_input,154,_ctx); } - setState(1576); + setState(1581); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1575); + setState(1580); match(COMMA); } } @@ -10690,7 +10713,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1580); + setState(1585); match(R_PAREN); } } @@ -10733,23 +10756,23 @@ public final ConversionContext conversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1582); + setState(1587); nonNamedType(); - setState(1583); + setState(1588); match(L_PAREN); - setState(1584); + setState(1589); expression(0); - setState(1586); + setState(1591); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1585); + setState(1590); match(COMMA); } } - setState(1588); + setState(1593); match(R_PAREN); } } @@ -10788,7 +10811,7 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); enterRule(_localctx, 306, RULE_nonNamedType); try { - setState(1595); + setState(1600); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -10802,18 +10825,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1590); + setState(1595); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1591); + setState(1596); match(L_PAREN); - setState(1592); + setState(1597); nonNamedType(); - setState(1593); + setState(1598); match(R_PAREN); } break; @@ -10859,31 +10882,31 @@ public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); enterRule(_localctx, 308, RULE_operand); try { - setState(1603); + setState(1608); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1597); + setState(1602); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1598); + setState(1603); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1599); + setState(1604); match(L_PAREN); - setState(1600); + setState(1605); expression(0); - setState(1601); + setState(1606); match(R_PAREN); } break; @@ -10925,7 +10948,7 @@ public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); enterRule(_localctx, 310, RULE_literal); try { - setState(1608); + setState(1613); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -10942,7 +10965,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1605); + setState(1610); basicLit(); } break; @@ -10959,7 +10982,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1606); + setState(1611); compositeLit(); } break; @@ -10972,7 +10995,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1607); + setState(1612); functionLit(); } break; @@ -11016,9 +11039,9 @@ public final IntegerContext integer() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1610); + setState(1615); _la = _input.LA(1); - if ( !(((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & ((1L << (DECIMAL_LIT - 134)) | (1L << (BINARY_LIT - 134)) | (1L << (OCTAL_LIT - 134)) | (1L << (HEX_LIT - 134)) | (1L << (IMAGINARY_LIT - 134)) | (1L << (RUNE_LIT - 134)))) != 0)) ) { + if ( !(((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & ((1L << (DECIMAL_LIT - 135)) | (1L << (BINARY_LIT - 135)) | (1L << (OCTAL_LIT - 135)) | (1L << (HEX_LIT - 135)) | (1L << (IMAGINARY_LIT - 135)) | (1L << (RUNE_LIT - 135)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -11058,7 +11081,7 @@ public final OperandNameContext operandName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1612); + setState(1617); match(IDENTIFIER); } } @@ -11096,11 +11119,11 @@ public final QualifiedIdentContext qualifiedIdent() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1614); + setState(1619); match(IDENTIFIER); - setState(1615); + setState(1620); match(DOT); - setState(1616); + setState(1621); match(IDENTIFIER); } } @@ -11139,9 +11162,9 @@ public final CompositeLitContext compositeLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1618); + setState(1623); literalType(); - setState(1619); + setState(1624); literalValue(); } } @@ -11181,21 +11204,21 @@ public final LiteralValueContext literalValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1621); - match(L_CURLY); setState(1626); + match(L_CURLY); + setState(1631); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { - setState(1622); + setState(1627); elementList(); - setState(1624); + setState(1629); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1623); + setState(1628); match(COMMA); } } @@ -11203,7 +11226,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1628); + setState(1633); match(R_CURLY); } } @@ -11247,25 +11270,25 @@ public final ElementListContext elementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1630); - keyedElement(); setState(1635); + keyedElement(); + setState(1640); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,161,_ctx); + _alt = getInterpreter().adaptivePredict(_input,163,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1631); + setState(1636); match(COMMA); - setState(1632); + setState(1637); keyedElement(); } } } - setState(1637); + setState(1642); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,161,_ctx); + _alt = getInterpreter().adaptivePredict(_input,163,_ctx); } } } @@ -11305,19 +11328,19 @@ public final KeyedElementContext keyedElement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1641); + setState(1646); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { case 1: { - setState(1638); + setState(1643); key(); - setState(1639); + setState(1644); match(COLON); } break; } - setState(1643); + setState(1648); element(); } } @@ -11354,7 +11377,7 @@ public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); enterRule(_localctx, 326, RULE_key); try { - setState(1647); + setState(1652); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11419,14 +11442,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1645); + setState(1650); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1646); + setState(1651); literalValue(); } break; @@ -11467,7 +11490,7 @@ public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); enterRule(_localctx, 328, RULE_element); try { - setState(1651); + setState(1656); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11532,14 +11555,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1649); + setState(1654); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1650); + setState(1655); literalValue(); } break; @@ -11592,27 +11615,27 @@ public final StructTypeContext structType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1653); + setState(1658); match(STRUCT); - setState(1654); + setState(1659); match(L_CURLY); - setState(1660); + setState(1665); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1655); + setState(1660); fieldDecl(); - setState(1656); + setState(1661); eos(); } } - setState(1662); + setState(1667); _errHandler.sync(this); _la = _input.LA(1); } - setState(1663); + setState(1668); match(R_CURLY); } } @@ -11658,30 +11681,30 @@ public final FieldDeclContext fieldDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1669); + setState(1674); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { case 1: { - setState(1665); + setState(1670); identifierList(); - setState(1666); + setState(1671); type_(); } break; case 2: { - setState(1668); + setState(1673); embeddedField(); } break; } - setState(1672); + setState(1677); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: { - setState(1671); + setState(1676); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -11720,7 +11743,7 @@ public final String_Context string_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1674); + setState(1679); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -11766,17 +11789,17 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1677); + setState(1682); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1676); + setState(1681); match(STAR); } } - setState(1679); + setState(1684); typeName(); } } @@ -11814,11 +11837,11 @@ public final IndexContext index() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1681); + setState(1686); match(L_BRACKET); - setState(1682); + setState(1687); expression(0); - setState(1683); + setState(1688); match(R_BRACKET); } } @@ -11857,13 +11880,13 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1685); + setState(1690); match(DOT); - setState(1686); + setState(1691); match(L_PAREN); - setState(1687); + setState(1692); type_(); - setState(1688); + setState(1693); match(R_PAREN); } } @@ -11910,34 +11933,34 @@ public final ArgumentsContext arguments() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1690); + setState(1695); match(L_PAREN); - setState(1705); + setState(1710); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { - setState(1697); + setState(1702); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) { case 1: { - setState(1691); + setState(1696); expressionList(); } break; case 2: { - setState(1692); + setState(1697); nonNamedType(); - setState(1695); + setState(1700); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) { case 1: { - setState(1693); + setState(1698); match(COMMA); - setState(1694); + setState(1699); expressionList(); } break; @@ -11945,22 +11968,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1700); + setState(1705); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1699); + setState(1704); match(ELLIPSIS); } } - setState(1703); + setState(1708); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1702); + setState(1707); match(COMMA); } } @@ -11968,7 +11991,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1707); + setState(1712); match(R_PAREN); } } @@ -12006,11 +12029,11 @@ public final MethodExprContext methodExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1709); + setState(1714); nonNamedType(); - setState(1710); + setState(1715); match(DOT); - setState(1711); + setState(1716); match(IDENTIFIER); } } @@ -12046,7 +12069,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1713); + setState(1718); type_(); } } @@ -12080,34 +12103,34 @@ public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); enterRule(_localctx, 348, RULE_eos); try { - setState(1719); + setState(1724); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1715); + setState(1720); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1716); + setState(1721); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1717); + setState(1722); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1718); + setState(1723); if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()"); } break; @@ -12190,7 +12213,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009e\u06bc\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009f\u06c1\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -12270,613 +12293,615 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u047e\13\\\3\\\5\\\u0481\n\\\5\\\u0483\n\\\3\\\3\\\3]\3]\3]\3]\3]\3]"+ "\3]\5]\u048e\n]\3^\3^\3^\3^\3^\3_\3_\5_\u0497\n_\3_\3_\5_\u049b\n_\3_"+ "\5_\u049e\n_\3_\3_\3_\3_\3_\5_\u04a5\n_\3_\3_\3`\3`\3a\3a\3b\3b\3c\5c"+ - "\u04b0\nc\3c\3c\3d\3d\3d\3e\3e\3f\3f\3f\5f\u04bc\nf\3g\3g\3g\3g\3g\3g"+ - "\7g\u04c4\ng\fg\16g\u04c7\13g\3g\5g\u04ca\ng\3h\3h\5h\u04ce\nh\3h\3h\5"+ - "h\u04d2\nh\3i\3i\3i\7i\u04d7\ni\fi\16i\u04da\13i\3j\3j\3j\7j\u04df\nj"+ - "\fj\16j\u04e2\13j\3k\3k\3k\3k\3k\3k\7k\u04ea\nk\fk\16k\u04ed\13k\3k\5"+ - "k\u04f0\nk\3l\3l\5l\u04f4\nl\3l\3l\3m\3m\3m\3m\3m\3m\7m\u04fe\nm\fm\16"+ - "m\u0501\13m\3m\5m\u0504\nm\3n\3n\5n\u0508\nn\3n\3n\3o\5o\u050d\no\3o\3"+ - "o\3o\6o\u0512\no\ro\16o\u0513\3p\3p\3p\3p\3p\5p\u051b\np\3q\3q\3r\3r\3"+ - "r\3r\3s\3s\3s\3t\3t\3t\3t\3u\3u\3v\3v\3v\5v\u052f\nv\3w\3w\5w\u0533\n"+ - "w\3x\3x\5x\u0537\nx\3y\3y\5y\u053b\ny\3z\3z\3z\3{\3{\3|\3|\3|\3|\3|\3"+ - "|\3|\3|\3|\5|\u054b\n|\3|\3|\3|\3|\5|\u0551\n|\5|\u0553\n|\3}\3}\5}\u0557"+ - "\n}\3~\3~\5~\u055b\n~\3~\5~\u055e\n~\3~\3~\5~\u0562\n~\5~\u0564\n~\3~"+ - "\3~\7~\u0568\n~\f~\16~\u056b\13~\3~\3~\3\177\3\177\3\177\5\177\u0572\n"+ - "\177\3\u0080\3\u0080\3\u0080\5\u0080\u0577\n\u0080\3\u0081\3\u0081\3\u0081"+ - "\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\5\u0081\u0582\n\u0081"+ - "\3\u0081\3\u0081\7\u0081\u0586\n\u0081\f\u0081\16\u0081\u0589\13\u0081"+ - "\3\u0081\3\u0081\3\u0082\3\u0082\5\u0082\u058f\n\u0082\3\u0082\3\u0082"+ - "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\5\u0083\u059a"+ - "\n\u0083\3\u0084\3\u0084\3\u0084\5\u0084\u059f\n\u0084\3\u0085\3\u0085"+ - "\5\u0085\u05a3\n\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u05a8\n\u0085\7"+ - "\u0085\u05aa\n\u0085\f\u0085\16\u0085\u05ad\13\u0085\3\u0086\3\u0086\3"+ - "\u0086\7\u0086\u05b2\n\u0086\f\u0086\16\u0086\u05b5\13\u0086\3\u0086\3"+ - "\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u05bc\n\u0087\3\u0088\3\u0088\3"+ - "\u0088\5\u0088\u05c1\n\u0088\3\u0088\5\u0088\u05c4\n\u0088\3\u0089\3\u0089"+ - "\3\u0089\3\u0089\3\u0089\3\u0089\5\u0089\u05cc\n\u0089\3\u0089\3\u0089"+ - "\3\u008a\3\u008a\3\u008a\3\u008a\5\u008a\u05d4\n\u008a\3\u008a\3\u008a"+ - "\3\u008b\5\u008b\u05d9\n\u008b\3\u008b\3\u008b\5\u008b\u05dd\n\u008b\3"+ - "\u008b\3\u008b\5\u008b\u05e1\n\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3"+ - "\u008c\3\u008c\5\u008c\u05e9\n\u008c\3\u008c\3\u008c\3\u008c\3\u008d\3"+ - "\u008d\3\u008d\3\u008e\3\u008e\5\u008e\u05f3\n\u008e\3\u008f\3\u008f\3"+ - "\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092"+ - "\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094"+ - "\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\5\u0095\u0610"+ - "\n\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097"+ - "\3\u0097\5\u0097\u061b\n\u0097\3\u0098\3\u0098\5\u0098\u061f\n\u0098\3"+ - "\u0099\3\u0099\3\u0099\3\u0099\7\u0099\u0625\n\u0099\f\u0099\16\u0099"+ - "\u0628\13\u0099\3\u0099\5\u0099\u062b\n\u0099\5\u0099\u062d\n\u0099\3"+ - "\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u0635\n\u009a\3"+ - "\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\5\u009b\u063e\n"+ - "\u009b\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u0646\n"+ - "\u009c\3\u009d\3\u009d\3\u009d\5\u009d\u064b\n\u009d\3\u009e\3\u009e\3"+ - "\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a2\3\u00a2\3\u00a2\5\u00a2\u065b\n\u00a2\5\u00a2\u065d\n\u00a2\3"+ - "\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\7\u00a3\u0664\n\u00a3\f\u00a3\16"+ - "\u00a3\u0667\13\u00a3\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u066c\n\u00a4\3"+ - "\u00a4\3\u00a4\3\u00a5\3\u00a5\5\u00a5\u0672\n\u00a5\3\u00a6\3\u00a6\5"+ - "\u00a6\u0676\n\u00a6\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u067d"+ - "\n\u00a7\f\u00a7\16\u00a7\u0680\13\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8"+ - "\3\u00a8\3\u00a8\5\u00a8\u0688\n\u00a8\3\u00a8\5\u00a8\u068b\n\u00a8\3"+ - "\u00a9\3\u00a9\3\u00aa\5\u00aa\u0690\n\u00aa\3\u00aa\3\u00aa\3\u00ab\3"+ - "\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad"+ - "\3\u00ad\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u06a2\n\u00ad\5\u00ad\u06a4\n"+ - "\u00ad\3\u00ad\5\u00ad\u06a7\n\u00ad\3\u00ad\5\u00ad\u06aa\n\u00ad\5\u00ad"+ - "\u06ac\n\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af"+ - "\3\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\5\u00b0\u06ba\n\u00b0\3\u00b0"+ - "\3\u02a1\4\u0092\u00a2\u00b1\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \""+ - "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084"+ - "\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c"+ - "\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4"+ - "\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc"+ - "\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4"+ - "\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc"+ - "\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114"+ - "\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c"+ - "\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144"+ - "\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c"+ - "\u015e\2\25\4\2ccnn\3\2\31\32\3\2\7\n\3\2@A\3\2)+\4\2)+--\3\2\u0081\u0087"+ - "\3\2\26\27\4\2|\u0080\u0085\u0086\6\2$$oo{{\u0082\u0084\3\2 \"\3\2\35"+ - "\37\4\2GHuz\6\2..\61\61\64\64[[\4\2{\u0080\u0082\u0086\3\2op\4\2ll\u009d"+ - "\u009d\4\2\u0088\u008b\u008d\u008e\3\2\u0094\u0095\2\u0718\2\u0160\3\2"+ - "\2\2\4\u0163\3\2\2\2\6\u0166\3\2\2\2\b\u0169\3\2\2\2\n\u0171\3\2\2\2\f"+ - "\u017a\3\2\2\2\16\u0195\3\2\2\2\20\u0198\3\2\2\2\22\u01a0\3\2\2\2\24\u01ad"+ - "\3\2\2\2\26\u01c3\3\2\2\2\30\u01cb\3\2\2\2\32\u01cd\3\2\2\2\34\u01cf\3"+ - "\2\2\2\36\u01d2\3\2\2\2 \u01e5\3\2\2\2\"\u01e7\3\2\2\2$\u01e9\3\2\2\2"+ - "&\u01ee\3\2\2\2(\u01f9\3\2\2\2*\u0206\3\2\2\2,\u0209\3\2\2\2.\u0214\3"+ - "\2\2\2\60\u0216\3\2\2\2\62\u021b\3\2\2\2\64\u0220\3\2\2\2\66\u0225\3\2"+ - "\2\28\u022a\3\2\2\2:\u0237\3\2\2\2<\u0239\3\2\2\2>\u023b\3\2\2\2@\u0240"+ - "\3\2\2\2B\u0245\3\2\2\2D\u024a\3\2\2\2F\u0253\3\2\2\2H\u025a\3\2\2\2J"+ - "\u0265\3\2\2\2L\u026c\3\2\2\2N\u026e\3\2\2\2P\u0283\3\2\2\2R\u0285\3\2"+ - "\2\2T\u0295\3\2\2\2V\u02a1\3\2\2\2X\u02b0\3\2\2\2Z\u02b3\3\2\2\2\\\u02bb"+ - "\3\2\2\2^\u02bd\3\2\2\2`\u02cb\3\2\2\2b\u02d7\3\2\2\2d\u02e1\3\2\2\2f"+ - "\u02e5\3\2\2\2h\u02eb\3\2\2\2j\u0303\3\2\2\2l\u030b\3\2\2\2n\u031a\3\2"+ - "\2\2p\u031c\3\2\2\2r\u0323\3\2\2\2t\u032c\3\2\2\2v\u0331\3\2\2\2x\u0336"+ - "\3\2\2\2z\u033c\3\2\2\2|\u0343\3\2\2\2~\u0348\3\2\2\2\u0080\u034e\3\2"+ - "\2\2\u0082\u0353\3\2\2\2\u0084\u035a\3\2\2\2\u0086\u0364\3\2\2\2\u0088"+ - "\u0368\3\2\2\2\u008a\u0374\3\2\2\2\u008c\u0377\3\2\2\2\u008e\u037b\3\2"+ - "\2\2\u0090\u0382\3\2\2\2\u0092\u0396\3\2\2\2\u0094\u03d2\3\2\2\2\u0096"+ - "\u03d4\3\2\2\2\u0098\u03d7\3\2\2\2\u009a\u03dc\3\2\2\2\u009c\u03e5\3\2"+ - "\2\2\u009e\u03f3\3\2\2\2\u00a0\u03fd\3\2\2\2\u00a2\u040b\3\2\2\2\u00a4"+ - "\u0426\3\2\2\2\u00a6\u0429\3\2\2\2\u00a8\u0431\3\2\2\2\u00aa\u043a\3\2"+ - "\2\2\u00ac\u044a\3\2\2\2\u00ae\u045d\3\2\2\2\u00b0\u0466\3\2\2\2\u00b2"+ - "\u0471\3\2\2\2\u00b4\u0473\3\2\2\2\u00b6\u0476\3\2\2\2\u00b8\u048d\3\2"+ - "\2\2\u00ba\u048f\3\2\2\2\u00bc\u0494\3\2\2\2\u00be\u04a8\3\2\2\2\u00c0"+ - "\u04aa\3\2\2\2\u00c2\u04ac\3\2\2\2\u00c4\u04af\3\2\2\2\u00c6\u04b3\3\2"+ - "\2\2\u00c8\u04b6\3\2\2\2\u00ca\u04bb\3\2\2\2\u00cc\u04bd\3\2\2\2\u00ce"+ - "\u04cb\3\2\2\2\u00d0\u04d3\3\2\2\2\u00d2\u04db\3\2\2\2\u00d4\u04e3\3\2"+ - "\2\2\u00d6\u04f1\3\2\2\2\u00d8\u04f7\3\2\2\2\u00da\u0505\3\2\2\2\u00dc"+ - "\u0511\3\2\2\2\u00de\u051a\3\2\2\2\u00e0\u051c\3\2\2\2\u00e2\u051e\3\2"+ - "\2\2\u00e4\u0522\3\2\2\2\u00e6\u0525\3\2\2\2\u00e8\u0529\3\2\2\2\u00ea"+ - "\u052b\3\2\2\2\u00ec\u0530\3\2\2\2\u00ee\u0534\3\2\2\2\u00f0\u0538\3\2"+ - "\2\2\u00f2\u053c\3\2\2\2\u00f4\u053f\3\2\2\2\u00f6\u0541\3\2\2\2\u00f8"+ - "\u0556\3\2\2\2\u00fa\u0558\3\2\2\2\u00fc\u056e\3\2\2\2\u00fe\u0576\3\2"+ - "\2\2\u0100\u0578\3\2\2\2\u0102\u058e\3\2\2\2\u0104\u0596\3\2\2\2\u0106"+ - "\u059e\3\2\2\2\u0108\u05a2\3\2\2\2\u010a\u05ae\3\2\2\2\u010c\u05b8\3\2"+ - "\2\2\u010e\u05c3\3\2\2\2\u0110\u05cb\3\2\2\2\u0112\u05cf\3\2\2\2\u0114"+ - "\u05d8\3\2\2\2\u0116\u05e8\3\2\2\2\u0118\u05ed\3\2\2\2\u011a\u05f2\3\2"+ - "\2\2\u011c\u05f4\3\2\2\2\u011e\u05f9\3\2\2\2\u0120\u05fb\3\2\2\2\u0122"+ - "\u05fd\3\2\2\2\u0124\u0600\3\2\2\2\u0126\u0604\3\2\2\2\u0128\u060f\3\2"+ - "\2\2\u012a\u0613\3\2\2\2\u012c\u061a\3\2\2\2\u012e\u061e\3\2\2\2\u0130"+ - "\u0620\3\2\2\2\u0132\u0630\3\2\2\2\u0134\u063d\3\2\2\2\u0136\u0645\3\2"+ - "\2\2\u0138\u064a\3\2\2\2\u013a\u064c\3\2\2\2\u013c\u064e\3\2\2\2\u013e"+ - "\u0650\3\2\2\2\u0140\u0654\3\2\2\2\u0142\u0657\3\2\2\2\u0144\u0660\3\2"+ - "\2\2\u0146\u066b\3\2\2\2\u0148\u0671\3\2\2\2\u014a\u0675\3\2\2\2\u014c"+ - "\u0677\3\2\2\2\u014e\u0687\3\2\2\2\u0150\u068c\3\2\2\2\u0152\u068f\3\2"+ - "\2\2\u0154\u0693\3\2\2\2\u0156\u0697\3\2\2\2\u0158\u069c\3\2\2\2\u015a"+ - "\u06af\3\2\2\2\u015c\u06b3\3\2\2\2\u015e\u06b9\3\2\2\2\u0160\u0161\5\u0092"+ - "J\2\u0161\u0162\7\2\2\3\u0162\3\3\2\2\2\u0163\u0164\5\u0094K\2\u0164\u0165"+ - "\7\2\2\3\u0165\5\3\2\2\2\u0166\u0167\5\u00b0Y\2\u0167\u0168\7\2\2\3\u0168"+ - "\7\3\2\2\2\u0169\u016e\5\n\6\2\u016a\u016b\7k\2\2\u016b\u016d\5\n\6\2"+ - "\u016c\u016a\3\2\2\2\u016d\u0170\3\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f"+ - "\3\2\2\2\u016f\t\3\2\2\2\u0170\u016e\3\2\2\2\u0171\u0173\7c\2\2\u0172"+ - "\u0174\7;\2\2\u0173\u0172\3\2\2\2\u0173\u0174\3\2\2\2\u0174\13\3\2\2\2"+ - "\u0175\u0176\5\16\b\2\u0176\u0177\5\u015e\u00b0\2\u0177\u0179\3\2\2\2"+ - "\u0178\u0175\3\2\2\2\u0179\u017c\3\2\2\2\u017a\u0178\3\2\2\2\u017a\u017b"+ - "\3\2\2\2\u017b\u017d\3\2\2\2\u017c\u017a\3\2\2\2\u017d\u017e\5\u00c6d"+ - "\2\u017e\u0184\5\u015e\u00b0\2\u017f\u0180\5\24\13\2\u0180\u0181\5\u015e"+ - "\u00b0\2\u0181\u0183\3\2\2\2\u0182\u017f\3\2\2\2\u0183\u0186\3\2\2\2\u0184"+ - "\u0182\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0190\3\2\2\2\u0186\u0184\3\2"+ - "\2\2\u0187\u018b\5v<\2\u0188\u018b\5\u00caf\2\u0189\u018b\5\26\f\2\u018a"+ - "\u0187\3\2\2\2\u018a\u0188\3\2\2\2\u018a\u0189\3\2\2\2\u018b\u018c\3\2"+ - "\2\2\u018c\u018d\5\u015e\u00b0\2\u018d\u018f\3\2\2\2\u018e\u018a\3\2\2"+ - "\2\u018f\u0192\3\2\2\2\u0190\u018e\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0193"+ - "\3\2\2\2\u0192\u0190\3\2\2\2\u0193\u0194\7\2\2\3\u0194\r\3\2\2\2\u0195"+ - "\u0196\7D\2\2\u0196\u0197\5\u0092J\2\u0197\17\3\2\2\2\u0198\u0199\7E\2"+ - "\2\u0199\u019a\5\u0092J\2\u019a\21\3\2\2\2\u019b\u019c\5\20\t\2\u019c"+ - "\u019d\5\u015e\u00b0\2\u019d\u019f\3\2\2\2\u019e\u019b\3\2\2\2\u019f\u01a2"+ - "\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2"+ - "\u01a0\3\2\2\2\u01a3\u01a5\t\2\2\2\u01a4\u01a3\3\2\2\2\u01a4\u01a5\3\2"+ - "\2\2\u01a5\u01a6\3\2\2\2\u01a6\u01a7\5\u00c8e\2\u01a7\23\3\2\2\2\u01a8"+ - "\u01a9\5\20\t\2\u01a9\u01aa\5\u015e\u00b0\2\u01aa\u01ac\3\2\2\2\u01ab"+ - "\u01a8\3\2\2\2\u01ac\u01af\3\2\2\2\u01ad\u01ab\3\2\2\2\u01ad\u01ae\3\2"+ - "\2\2\u01ae\u01bd\3\2\2\2\u01af\u01ad\3\2\2\2\u01b0\u01b1\7_\2\2\u01b1"+ - "\u01be\5\22\n\2\u01b2\u01b3\7_\2\2\u01b3\u01b9\7d\2\2\u01b4\u01b5\5\22"+ - "\n\2\u01b5\u01b6\5\u015e\u00b0\2\u01b6\u01b8\3\2\2\2\u01b7\u01b4\3\2\2"+ - "\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc"+ - "\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc\u01be\7e\2\2\u01bd\u01b0\3\2\2\2\u01bd"+ - "\u01b2\3\2\2\2\u01be\25\3\2\2\2\u01bf\u01c4\5h\65\2\u01c0\u01c4\5~@\2"+ - "\u01c1\u01c4\5\u0082B\2\u01c2\u01c4\5|?\2\u01c3\u01bf\3\2\2\2\u01c3\u01c0"+ - "\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c3\u01c2\3\2\2\2\u01c4\27\3\2\2\2\u01c5"+ - "\u01c6\7\34\2\2\u01c6\u01cc\5\u0094K\2\u01c7\u01c8\t\3\2\2\u01c8\u01cc"+ - "\5.\30\2\u01c9\u01ca\t\4\2\2\u01ca\u01cc\5\u0092J\2\u01cb\u01c5\3\2\2"+ - "\2\u01cb\u01c7\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cc\31\3\2\2\2\u01cd\u01ce"+ - "\5\34\17\2\u01ce\33\3\2\2\2\u01cf\u01d0\5V,\2\u01d0\u01d1\5\36\20\2\u01d1"+ - "\35\3\2\2\2\u01d2\u01d3\7C\2\2\u01d3\u01d5\7d\2\2\u01d4\u01d6\5\u00dc"+ - "o\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7"+ - "\u01d8\7e\2\2\u01d8\37\3\2\2\2\u01d9\u01e6\5F$\2\u01da\u01e6\5D#\2\u01db"+ - "\u01e6\5B\"\2\u01dc\u01e6\5$\23\2\u01dd\u01e6\5@!\2\u01de\u01e6\58\35"+ - "\2\u01df\u01e6\5> \2\u01e0\u01e6\5\66\34\2\u01e1\u01e6\5\62\32\2\u01e2"+ - "\u01e6\5\60\31\2\u01e3\u01e6\5\64\33\2\u01e4\u01e6\5\"\22\2\u01e5\u01d9"+ - "\3\2\2\2\u01e5\u01da\3\2\2\2\u01e5\u01db\3\2\2\2\u01e5\u01dc\3\2\2\2\u01e5"+ - "\u01dd\3\2\2\2\u01e5\u01de\3\2\2\2\u01e5\u01df\3\2\2\2\u01e5\u01e0\3\2"+ - "\2\2\u01e5\u01e1\3\2\2\2\u01e5\u01e2\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5"+ - "\u01e4\3\2\2\2\u01e6!\3\2\2\2\u01e7\u01e8\t\5\2\2\u01e8#\3\2\2\2\u01e9"+ - "\u01ea\7\\\2\2\u01ea\u01eb\7h\2\2\u01eb\u01ec\5\u00b0Y\2\u01ec\u01ed\7"+ - "i\2\2\u01ed%\3\2\2\2\u01ee\u01f3\5(\25\2\u01ef\u01f0\7k\2\2\u01f0\u01f2"+ - "\5(\25\2\u01f1\u01ef\3\2\2\2\u01f2\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2\u01f3"+ - "\u01f4\3\2\2\2\u01f4\u01f7\3\2\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f8\7k"+ - "\2\2\u01f7\u01f6\3\2\2\2\u01f7\u01f8\3\2\2\2\u01f8\'\3\2\2\2\u01f9\u01fe"+ - "\7c\2\2\u01fa\u01fb\7k\2\2\u01fb\u01fd\7c\2\2\u01fc\u01fa\3\2\2\2\u01fd"+ - "\u0200\3\2\2\2\u01fe\u01fc\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\3\2"+ - "\2\2\u0200\u01fe\3\2\2\2\u0201\u0202\5\u0120\u0091\2\u0202)\3\2\2\2\u0203"+ - "\u0205\5,\27\2\u0204\u0203\3\2\2\2\u0205\u0208\3\2\2\2\u0206\u0204\3\2"+ - "\2\2\u0206\u0207\3\2\2\2\u0207+\3\2\2\2\u0208\u0206\3\2\2\2\u0209\u020a"+ - "\7f\2\2\u020a\u020f\5\u0092J\2\u020b\u020c\7k\2\2\u020c\u020e\5\u0092"+ - "J\2\u020d\u020b\3\2\2\2\u020e\u0211\3\2\2\2\u020f\u020d\3\2\2\2\u020f"+ - "\u0210\3\2\2\2\u0210\u0212\3\2\2\2\u0211\u020f\3\2\2\2\u0212\u0213\7g"+ - "\2\2\u0213-\3\2\2\2\u0214\u0215\5\u00a2R\2\u0215/\3\2\2\2\u0216\u0217"+ - "\7\62\2\2\u0217\u0218\7d\2\2\u0218\u0219\5\u0092J\2\u0219\u021a\7e\2\2"+ - "\u021a\61\3\2\2\2\u021b\u021c\7\66\2\2\u021c\u021d\7h\2\2\u021d\u021e"+ - "\5\u00b0Y\2\u021e\u021f\7i\2\2\u021f\63\3\2\2\2\u0220\u0221\7\63\2\2\u0221"+ - "\u0222\7d\2\2\u0222\u0223\5\u0092J\2\u0223\u0224\7e\2\2\u0224\65\3\2\2"+ - "\2\u0225\u0226\t\6\2\2\u0226\u0227\7d\2\2\u0227\u0228\5\u0092J\2\u0228"+ - "\u0229\7e\2\2\u0229\67\3\2\2\2\u022a\u022f\7\23\2\2\u022b\u022c\7h\2\2"+ - "\u022c\u022d\5:\36\2\u022d\u022e\7i\2\2\u022e\u0230\3\2\2\2\u022f\u022b"+ - "\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\3\2\2\2\u0231\u0232\7d\2\2\u0232"+ - "\u0233\5\u0092J\2\u0233\u0234\7e\2\2\u02349\3\2\2\2\u0235\u0238\5<\37"+ - "\2\u0236\u0238\7\25\2\2\u0237\u0235\3\2\2\2\u0237\u0236\3\2\2\2\u0238"+ - ";\3\2\2\2\u0239\u023a\7c\2\2\u023a=\3\2\2\2\u023b\u023c\7\24\2\2\u023c"+ - "\u023d\7d\2\2\u023d\u023e\5\u0092J\2\u023e\u023f\7e\2\2\u023f?\3\2\2\2"+ - "\u0240\u0241\79\2\2\u0241\u0242\7d\2\2\u0242\u0243\5\u0092J\2\u0243\u0244"+ - "\7e\2\2\u0244A\3\2\2\2\u0245\u0246\78\2\2\u0246\u0247\7d\2\2\u0247\u0248"+ - "\5\u0092J\2\u0248\u0249\7e\2\2\u0249C\3\2\2\2\u024a\u024b\7\30\2\2\u024b"+ - "\u024c\7d\2\2\u024c\u024f\5\u0092J\2\u024d\u024e\7k\2\2\u024e\u0250\5"+ - "\u0092J\2\u024f\u024d\3\2\2\2\u024f\u0250\3\2\2\2\u0250\u0251\3\2\2\2"+ - "\u0251\u0252\7e\2\2\u0252E\3\2\2\2\u0253\u0254\t\6\2\2\u0254\u0255\7h"+ - "\2\2\u0255\u0256\5\u0092J\2\u0256\u0257\7<\2\2\u0257\u0258\5\u0092J\2"+ - "\u0258\u0259\7i\2\2\u0259G\3\2\2\2\u025a\u025b\7h\2\2\u025b\u0260\5J&"+ - "\2\u025c\u025d\7k\2\2\u025d\u025f\5J&\2\u025e\u025c\3\2\2\2\u025f\u0262"+ - "\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261\u0263\3\2\2\2\u0262"+ - "\u0260\3\2\2\2\u0263\u0264\7i\2\2\u0264I\3\2\2\2\u0265\u0266\5\u0092J"+ - "\2\u0266\u0267\7j\2\2\u0267\u0268\5\u0092J\2\u0268K\3\2\2\2\u0269\u026d"+ - "\5T+\2\u026a\u026d\5R*\2\u026b\u026d\5N(\2\u026c\u0269\3\2\2\2\u026c\u026a"+ - "\3\2\2\2\u026c\u026b\3\2\2\2\u026dM\3\2\2\2\u026e\u026f\7\64\2\2\u026f"+ - "\u0275\7f\2\2\u0270\u0271\5P)\2\u0271\u0272\5\u015e\u00b0\2\u0272\u0274"+ - "\3\2\2\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275\u0273\3\2\2\2\u0275"+ - "\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2\2\2\u0278\u0279\7g"+ - "\2\2\u0279O\3\2\2\2\u027a\u027b\7K\2\2\u027b\u027c\7c\2\2\u027c\u0284"+ - "\5\u012c\u0097\2\u027d\u027e\7\65\2\2\u027e\u027f\7f\2\2\u027f\u0280\5"+ - "\u0092J\2\u0280\u0281\5\u015e\u00b0\2\u0281\u0282\7g\2\2\u0282\u0284\3"+ - "\2\2\2\u0283\u027a\3\2\2\2\u0283\u027d\3\2\2\2\u0284Q\3\2\2\2\u0285\u0286"+ - "\7\34\2\2\u0286\u0287\7h\2\2\u0287\u0288\7i\2\2\u0288\u0289\5\u0120\u0091"+ - "\2\u0289S\3\2\2\2\u028a\u028b\t\7\2\2\u028b\u028c\7h\2\2\u028c\u028d\5"+ - "\u00b0Y\2\u028d\u028e\7i\2\2\u028e\u0296\3\2\2\2\u028f\u0290\7,\2\2\u0290"+ - "\u0291\7h\2\2\u0291\u0292\5\u00b0Y\2\u0292\u0293\7i\2\2\u0293\u0294\5"+ - "\u00b0Y\2\u0294\u0296\3\2\2\2\u0295\u028a\3\2\2\2\u0295\u028f\3\2\2\2"+ - "\u0296U\3\2\2\2\u0297\u029d\5X-\2\u0298\u0299\7\20\2\2\u0299\u029d\b,"+ - "\1\2\u029a\u029b\7B\2\2\u029b\u029d\b,\1\2\u029c\u0297\3\2\2\2\u029c\u0298"+ - "\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e\3\2\2\2\u029e\u02a0\5\u015e\u00b0"+ - "\2\u029f\u029c\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a1\u029f"+ - "\3\2\2\2\u02a2\u02a6\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4\u02a5\7\20\2\2"+ - "\u02a5\u02a7\b,\1\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7\3\2\2\2\u02a7W\3\2"+ - "\2\2\u02a8\u02a9\7\13\2\2\u02a9\u02b1\5\\/\2\u02aa\u02ab\7\f\2\2\u02ab"+ - "\u02b1\5\\/\2\u02ac\u02ad\7\r\2\2\u02ad\u02b1\5\\/\2\u02ae\u02af\7\17"+ - "\2\2\u02af\u02b1\5Z.\2\u02b0\u02a8\3\2\2\2\u02b0\u02aa\3\2\2\2\u02b0\u02ac"+ - "\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b1Y\3\2\2\2\u02b2\u02b4\5\u00d2j\2\u02b3"+ - "\u02b2\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b7\3\2\2\2\u02b5\u02b6\7Z"+ - "\2\2\u02b6\u02b8\5\u0092J\2\u02b7\u02b5\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8"+ - "[\3\2\2\2\u02b9\u02bc\3\2\2\2\u02ba\u02bc\5\u0092J\2\u02bb\u02b9\3\2\2"+ - "\2\u02bb\u02ba\3\2\2\2\u02bc]\3\2\2\2\u02bd\u02c2\7f\2\2\u02be\u02bf\7"+ - ":\2\2\u02bf\u02c0\5\u00d0i\2\u02c0\u02c1\5\u015e\u00b0\2\u02c1\u02c3\3"+ - "\2\2\2\u02c2\u02be\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3\u02c5\3\2\2\2\u02c4"+ - "\u02c6\5\u00dco\2\u02c5\u02c4\3\2\2\2\u02c5\u02c6\3\2\2\2\u02c6\u02c7"+ - "\3\2\2\2\u02c7\u02c8\7g\2\2\u02c8_\3\2\2\2\u02c9\u02cc\5\u013e\u00a0\2"+ - "\u02ca\u02cc\7c\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02ca\3\2\2\2\u02cc\u02d5"+ - "\3\2\2\2\u02cd\u02d2\7f\2\2\u02ce\u02d0\5b\62\2\u02cf\u02d1\7k\2\2\u02d0"+ - "\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02ce\3\2"+ - "\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4\u02d6\7g\2\2\u02d5"+ - "\u02cd\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6a\3\2\2\2\u02d7\u02dc\5d\63\2"+ - "\u02d8\u02d9\7k\2\2\u02d9\u02db\5d\63\2\u02da\u02d8\3\2\2\2\u02db\u02de"+ - "\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02ddc\3\2\2\2\u02de"+ - "\u02dc\3\2\2\2\u02df\u02e0\7c\2\2\u02e0\u02e2\7m\2\2\u02e1\u02df\3\2\2"+ - "\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5\u0092J\2\u02e4"+ - "e\3\2\2\2\u02e5\u02e6\7F\2\2\u02e6\u02e7\5\u0092J\2\u02e7\u02e8\7\21\2"+ - "\2\u02e8\u02e9\5`\61\2\u02e9\u02ea\5\u00dan\2\u02eag\3\2\2\2\u02eb\u02ec"+ - "\5\u00b0Y\2\u02ec\u02ed\7\21\2\2\u02ed\u0300\5\u00b0Y\2\u02ee\u02f4\7"+ - "f\2\2\u02ef\u02f0\5p9\2\u02f0\u02f1\5\u015e\u00b0\2\u02f1\u02f3\3\2\2"+ - "\2\u02f2\u02ef\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f4\u02f5"+ - "\3\2\2\2\u02f5\u02fc\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f7\u02f8\5j\66\2\u02f8"+ - "\u02f9\5\u015e\u00b0\2\u02f9\u02fb\3\2\2\2\u02fa\u02f7\3\2\2\2\u02fb\u02fe"+ - "\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02ff\3\2\2\2\u02fe"+ - "\u02fc\3\2\2\2\u02ff\u0301\7g\2\2\u0300\u02ee\3\2\2\2\u0300\u0301\3\2"+ - "\2\2\u0301i\3\2\2\2\u0302\u0304\7\20\2\2\u0303\u0302\3\2\2\2\u0303\u0304"+ - "\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306\5l\67\2\u0306\u0307\7c\2\2\u0307"+ - "\u0309\5\u012c\u0097\2\u0308\u030a\5\u00dan\2\u0309\u0308\3\2\2\2\u0309"+ - "\u030a\3\2\2\2\u030ak\3\2\2\2\u030b\u030d\7d\2\2\u030c\u030e\7c\2\2\u030d"+ - "\u030c\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0310\3\2\2\2\u030f\u0311\7\u0085"+ - "\2\2\u0310\u030f\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u0312\3\2\2\2\u0312"+ - "\u0313\5\u011a\u008e\2\u0313\u0314\7e\2\2\u0314m\3\2\2\2\u0315\u031b\5"+ - "\u00a2R\2\u0316\u0317\5\u00b0Y\2\u0317\u0318\7n\2\2\u0318\u0319\7c\2\2"+ - "\u0319\u031b\3\2\2\2\u031a\u0315\3\2\2\2\u031a\u0316\3\2\2\2\u031bo\3"+ - "\2\2\2\u031c\u031d\7\67\2\2\u031d\u031e\7c\2\2\u031e\u0321\7q\2\2\u031f"+ - "\u0322\5n8\2\u0320\u0322\5\u013c\u009f\2\u0321\u031f\3\2\2\2\u0321\u0320"+ - "\3\2\2\2\u0322q\3\2\2\2\u0323\u0324\7\60\2\2\u0324\u0325\7d\2\2\u0325"+ - "\u0328\5\u00b0Y\2\u0326\u0327\7k\2\2\u0327\u0329\5\u00d2j\2\u0328\u0326"+ - "\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u032a\3\2\2\2\u032a\u032b\7e\2\2\u032b"+ - "s\3\2\2\2\u032c\u032d\7/\2\2\u032d\u032e\7d\2\2\u032e\u032f\5\u00b0Y\2"+ - "\u032f\u0330\7e\2\2\u0330u\3\2\2\2\u0331\u0334\5V,\2\u0332\u0335\5x=\2"+ - "\u0333\u0335\5z>\2\u0334\u0332\3\2\2\2\u0334\u0333\3\2\2\2\u0335w\3\2"+ - "\2\2\u0336\u0337\7K\2\2\u0337\u0338\7c\2\2\u0338\u033a\5\u012c\u0097\2"+ - "\u0339\u033b\5^\60\2\u033a\u0339\3\2\2\2\u033a\u033b\3\2\2\2\u033by\3"+ - "\2\2\2\u033c\u033d\7K\2\2\u033d\u033e\5\u0088E\2\u033e\u033f\7c\2\2\u033f"+ - "\u0341\5\u012c\u0097\2\u0340\u0342\5^\60\2\u0341\u0340\3\2\2\2\u0341\u0342"+ - "\3\2\2\2\u0342{\3\2\2\2\u0343\u0346\7\34\2\2\u0344\u0347\5v<\2\u0345\u0347"+ - "\5\u00caf\2\u0346\u0344\3\2\2\2\u0346\u0345\3\2\2\2\u0347}\3\2\2\2\u0348"+ - "\u0349\7\67\2\2\u0349\u034a\7c\2\2\u034a\u034c\5\u0130\u0099\2\u034b\u034d"+ - "\5\u0080A\2\u034c\u034b\3\2\2\2\u034c\u034d\3\2\2\2\u034d\177\3\2\2\2"+ - "\u034e\u034f\7f\2\2\u034f\u0350\5\u0092J\2\u0350\u0351\5\u015e\u00b0\2"+ - "\u0351\u0352\7g\2\2\u0352\u0081\3\2\2\2\u0353\u0354\7\67\2\2\u0354\u0355"+ - "\5\u0088E\2\u0355\u0356\7c\2\2\u0356\u0358\5\u0130\u0099\2\u0357\u0359"+ - "\5\u0080A\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2\2\u0359\u0083\3\2\2"+ - "\2\u035a\u0362\5\b\5\2\u035b\u035e\5\u00b0Y\2\u035c\u035d\7j\2\2\u035d"+ - "\u035f\5\u00d2j\2\u035e\u035c\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0363"+ - "\3\2\2\2\u0360\u0361\7j\2\2\u0361\u0363\5\u00d2j\2\u0362\u035b\3\2\2\2"+ - "\u0362\u0360\3\2\2\2\u0363\u0085\3\2\2\2\u0364\u0365\5\b\5\2\u0365\u0366"+ - "\7q\2\2\u0366\u0367\5\u00d2j\2\u0367\u0087\3\2\2\2\u0368\u036a\7d\2\2"+ - "\u0369\u036b\5\n\6\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2\2\2\u036b\u036c"+ - "\3\2\2\2\u036c\u036e\5\u00b0Y\2\u036d\u036f\7k\2\2\u036e\u036d\3\2\2\2"+ - "\u036e\u036f\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u0371\7e\2\2\u0371\u0089"+ - "\3\2\2\2\u0372\u0375\5\u008cG\2\u0373\u0375\5\u008eH\2\u0374\u0372\3\2"+ - "\2\2\u0374\u0373\3\2\2\2\u0375\u008b\3\2\2\2\u0376\u0378\5\u00d0i\2\u0377"+ - "\u0376\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u0379\3\2\2\2\u0379\u037a\5\u0090"+ - "I\2\u037a\u008d\3\2\2\2\u037b\u037d\7\34\2\2\u037c\u037e\5\u00d0i\2\u037d"+ - "\u037c\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f\3\2\2\2\u037f\u0380\5\u0090"+ - "I\2\u0380\u008f\3\2\2\2\u0381\u0383\7r\2\2\u0382\u0381\3\2\2\2\u0382\u0383"+ - "\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385\5\u00b0Y\2\u0385\u0091\3\2\2"+ - "\2\u0386\u0387\bJ\1\2\u0387\u0388\t\b\2\2\u0388\u0397\5\u0092J\20\u0389"+ - "\u0397\5\u00a2R\2\u038a\u038b\7\33\2\2\u038b\u038c\5.\30\2\u038c\u038d"+ - "\7\35\2\2\u038d\u038e\5\u0092J\4\u038e\u0397\3\2\2\2\u038f\u0390\t\t\2"+ - "\2\u0390\u0391\5&\24\2\u0391\u0392\7m\2\2\u0392\u0393\7m\2\2\u0393\u0394"+ - "\5*\26\2\u0394\u0395\5\u0092J\3\u0395\u0397\3\2\2\2\u0396\u0386\3\2\2"+ - "\2\u0396\u0389\3\2\2\2\u0396\u038a\3\2\2\2\u0396\u038f\3\2\2\2\u0397\u03bb"+ - "\3\2\2\2\u0398\u0399\f\16\2\2\u0399\u039a\t\n\2\2\u039a\u03ba\5\u0092"+ - "J\17\u039b\u039c\f\r\2\2\u039c\u039d\t\13\2\2\u039d\u03ba\5\u0092J\16"+ - "\u039e\u039f\f\f\2\2\u039f\u03a0\t\f\2\2\u03a0\u03ba\5\u0092J\r\u03a1"+ - "\u03a2\f\13\2\2\u03a2\u03a3\t\r\2\2\u03a3\u03ba\5\u0092J\f\u03a4\u03a5"+ - "\f\n\2\2\u03a5\u03a6\t\16\2\2\u03a6\u03ba\5\u0092J\13\u03a7\u03a8\f\b"+ - "\2\2\u03a8\u03a9\7t\2\2\u03a9\u03ba\5\u0092J\t\u03aa\u03ab\f\7\2\2\u03ab"+ - "\u03ac\7s\2\2\u03ac\u03ba\5\u0092J\b\u03ad\u03ae\f\6\2\2\u03ae\u03af\7"+ - "#\2\2\u03af\u03ba\5\u0092J\6\u03b0\u03b1\f\5\2\2\u03b1\u03b2\7&\2\2\u03b2"+ - "\u03b3\5\u0092J\2\u03b3\u03b4\7m\2\2\u03b4\u03b5\5\u0092J\5\u03b5\u03ba"+ - "\3\2\2\2\u03b6\u03b7\f\t\2\2\u03b7\u03b8\7\21\2\2\u03b8\u03ba\5`\61\2"+ - "\u03b9\u0398\3\2\2\2\u03b9\u039b\3\2\2\2\u03b9\u039e\3\2\2\2\u03b9\u03a1"+ - "\3\2\2\2\u03b9\u03a4\3\2\2\2\u03b9\u03a7\3\2\2\2\u03b9\u03aa\3\2\2\2\u03b9"+ - "\u03ad\3\2\2\2\u03b9\u03b0\3\2\2\2\u03b9\u03b6\3\2\2\2\u03ba\u03bd\3\2"+ - "\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u0093\3\2\2\2\u03bd"+ - "\u03bb\3\2\2\2\u03be\u03d3\5\30\r\2\u03bf\u03d3\5\32\16\2\u03c0\u03d3"+ - "\5\u0098M\2\u03c1\u03d3\5\u0096L\2\u03c2\u03d3\5\u00caf\2\u03c3\u03d3"+ - "\5\u00eav\2\u03c4\u03d3\5\u00dep\2\u03c5\u03d3\5\u0118\u008d\2\u03c6\u03d3"+ - "\5\u00ecw\2\u03c7\u03d3\5\u00eex\2\u03c8\u03d3\5\u00f0y\2\u03c9\u03d3"+ - "\5\u00f2z\2\u03ca\u03d3\5\u00f4{\2\u03cb\u03d3\5\u00dan\2\u03cc\u03d3"+ - "\5\u00f6|\2\u03cd\u03d3\5\u00f8}\2\u03ce\u03d3\5\u010a\u0086\2\u03cf\u03d3"+ - "\5\u009aN\2\u03d0\u03d3\5\u009eP\2\u03d1\u03d3\5f\64\2\u03d2\u03be\3\2"+ - "\2\2\u03d2\u03bf\3\2\2\2\u03d2\u03c0\3\2\2\2\u03d2\u03c1\3\2\2\2\u03d2"+ - "\u03c2\3\2\2\2\u03d2\u03c3\3\2\2\2\u03d2\u03c4\3\2\2\2\u03d2\u03c5\3\2"+ - "\2\2\u03d2\u03c6\3\2\2\2\u03d2\u03c7\3\2\2\2\u03d2\u03c8\3\2\2\2\u03d2"+ - "\u03c9\3\2\2\2\u03d2\u03ca\3\2\2\2\u03d2\u03cb\3\2\2\2\u03d2\u03cc\3\2"+ - "\2\2\u03d2\u03cd\3\2\2\2\u03d2\u03ce\3\2\2\2\u03d2\u03cf\3\2\2\2\u03d2"+ - "\u03d0\3\2\2\2\u03d2\u03d1\3\2\2\2\u03d3\u0095\3\2\2\2\u03d4\u03d5\7%"+ - "\2\2\u03d5\u03d6\5\u0092J\2\u03d6\u0097\3\2\2\2\u03d7\u03d8\7V\2\2\u03d8"+ - "\u03da\5\u0092J\2\u03d9\u03db\5\u00dan\2\u03da\u03d9\3\2\2\2\u03da\u03db"+ - "\3\2\2\2\u03db\u0099\3\2\2\2\u03dc\u03dd\5\u009cO\2\u03dd\u03de\5\u0112"+ - "\u008a\2\u03de\u009b\3\2\2\2\u03df\u03e0\7\16\2\2\u03e0\u03e1\5\u0092"+ - "J\2\u03e1\u03e2\5\u015e\u00b0\2\u03e2\u03e4\3\2\2\2\u03e3\u03df\3\2\2"+ - "\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5\u03e6\3\2\2\2\u03e6\u03ec"+ - "\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7\17\2\2\u03e9\u03ea\5Z.\2\u03ea"+ - "\u03eb\5\u015e\u00b0\2\u03eb\u03ed\3\2\2\2\u03ec\u03e8\3\2\2\2\u03ec\u03ed"+ - "\3\2\2\2\u03ed\u009d\3\2\2\2\u03ee\u03ef\7O\2\2\u03ef\u03f4\5\u0092J\2"+ - "\u03f0\u03f1\7O\2\2\u03f1\u03f2\t\3\2\2\u03f2\u03f4\5.\30\2\u03f3\u03ee"+ - "\3\2\2\2\u03f3\u03f0\3\2\2\2\u03f4\u009f\3\2\2\2\u03f5\u03fe\7\5\2\2\u03f6"+ - "\u03fe\7\6\2\2\u03f7\u03fe\7b\2\2\u03f8\u03fe\5\u013a\u009e\2\u03f9\u03fe"+ - "\5\u0150\u00a9\2\u03fa\u03fe\7\3\2\2\u03fb\u03fe\7\u008d\2\2\u03fc\u03fe"+ - "\7\u008e\2\2\u03fd\u03f5\3\2\2\2\u03fd\u03f6\3\2\2\2\u03fd\u03f7\3\2\2"+ - "\2\u03fd\u03f8\3\2\2\2\u03fd\u03f9\3\2\2\2\u03fd\u03fa\3\2\2\2\u03fd\u03fb"+ - "\3\2\2\2\u03fd\u03fc\3\2\2\2\u03fe\u00a1\3\2\2\2\u03ff\u0400\bR\1\2\u0400"+ - "\u040c\5\u0136\u009c\2\u0401\u040c\5\u0132\u009a\2\u0402\u040c\5\u015a"+ - "\u00ae\2\u0403\u040c\5 \21\2\u0404\u040c\5t;\2\u0405\u040c\5r:\2\u0406"+ - "\u0407\t\17\2\2\u0407\u0408\7d\2\2\u0408\u0409\5\u0092J\2\u0409\u040a"+ - "\7e\2\2\u040a\u040c\3\2\2\2\u040b\u03ff\3\2\2\2\u040b\u0401\3\2\2\2\u040b"+ - "\u0402\3\2\2\2\u040b\u0403\3\2\2\2\u040b\u0404\3\2\2\2\u040b\u0405\3\2"+ - "\2\2\u040b\u0406\3\2\2\2\u040c\u0423\3\2\2\2\u040d\u040e\f\13\2\2\u040e"+ - "\u040f\7n\2\2\u040f\u0422\7c\2\2\u0410\u0411\f\n\2\2\u0411\u0422\5\u0154"+ - "\u00ab\2\u0412\u0413\f\t\2\2\u0413\u0422\5\u00bc_\2\u0414\u0415\f\b\2"+ - "\2\u0415\u0422\5H%\2\u0416\u0417\f\7\2\2\u0417\u0422\5\u0156\u00ac\2\u0418"+ - "\u0419\f\6\2\2\u0419\u0422\5\u0158\u00ad\2\u041a\u041b\f\5\2\2\u041b\u041c"+ - "\5\u0158\u00ad\2\u041c\u041d\7\22\2\2\u041d\u041e\5`\61\2\u041e\u0422"+ - "\3\2\2\2\u041f\u0420\f\4\2\2\u0420\u0422\5\u00a8U\2\u0421\u040d\3\2\2"+ - "\2\u0421\u0410\3\2\2\2\u0421\u0412\3\2\2\2\u0421\u0414\3\2\2\2\u0421\u0416"+ - "\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041a\3\2\2\2\u0421\u041f\3\2\2\2\u0422"+ - "\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u00a3\3\2"+ - "\2\2\u0425\u0423\3\2\2\2\u0426\u0427\5V,\2\u0427\u0428\5\u00a6T\2\u0428"+ - "\u00a5\3\2\2\2\u0429\u042b\7K\2\2\u042a\u042c\7c\2\2\u042b\u042a\3\2\2"+ - "\2\u042b\u042c\3\2\2\2\u042c\u042d\3\2\2\2\u042d\u042f\5\u012c\u0097\2"+ - "\u042e\u0430\5^\60\2\u042f\u042e\3\2\2\2\u042f\u0430\3\2\2\2\u0430\u00a7"+ - "\3\2\2\2\u0431\u0433\7\'\2\2\u0432\u0434\5\u00d2j\2\u0433\u0432\3\2\2"+ - "\2\u0433\u0434\3\2\2\2\u0434\u0436\3\2\2\2\u0435\u0437\7k\2\2\u0436\u0435"+ - "\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u0439\7(\2\2\u0439"+ - "\u00a9\3\2\2\2\u043a\u043b\7L\2\2\u043b\u0445\7f\2\2\u043c\u0440\5\u00ae"+ - "X\2\u043d\u0440\5\u011a\u008e\2\u043e\u0440\5\u00acW\2\u043f\u043c\3\2"+ - "\2\2\u043f\u043d\3\2\2\2\u043f\u043e\3\2\2\2\u0440\u0441\3\2\2\2\u0441"+ - "\u0442\5\u015e\u00b0\2\u0442\u0444\3\2\2\2\u0443\u043f\3\2\2\2\u0444\u0447"+ - "\3\2\2\2\u0445\u0443\3\2\2\2\u0445\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447"+ - "\u0445\3\2\2\2\u0448\u0449\7g\2\2\u0449\u00ab\3\2\2\2\u044a\u044b\7\67"+ - "\2\2\u044b\u044c\7c\2\2\u044c\u044d\5\u0130\u0099\2\u044d\u00ad\3\2\2"+ - "\2\u044e\u0450\7\34\2\2\u044f\u044e\3\2\2\2\u044f\u0450\3\2\2\2\u0450"+ - "\u0451\3\2\2\2\u0451\u0452\5V,\2\u0452\u0453\7c\2\2\u0453\u0454\5\u0130"+ - "\u0099\2\u0454\u0455\5\u012e\u0098\2\u0455\u045e\3\2\2\2\u0456\u0458\7"+ - "\34\2\2\u0457\u0456\3\2\2\2\u0457\u0458\3\2\2\2\u0458\u0459\3\2\2\2\u0459"+ - "\u045a\5V,\2\u045a\u045b\7c\2\2\u045b\u045c\5\u0130\u0099\2\u045c\u045e"+ - "\3\2\2\2\u045d\u044f\3\2\2\2\u045d\u0457\3\2\2\2\u045e\u00af\3\2\2\2\u045f"+ - "\u0467\5\u011a\u008e\2\u0460\u0467\5\u00b2Z\2\u0461\u0467\5L\'\2\u0462"+ - "\u0463\7d\2\2\u0463\u0464\5\u00b0Y\2\u0464\u0465\7e\2\2\u0465\u0467\3"+ - "\2\2\2\u0466\u045f\3\2\2\2\u0466\u0460\3\2\2\2\u0466\u0461\3\2\2\2\u0466"+ - "\u0462\3\2\2\2\u0467\u00b1\3\2\2\2\u0468\u0472\5\u011c\u008f\2\u0469\u0472"+ - "\5\u014c\u00a7\2\u046a\u0472\5\u0122\u0092\2\u046b\u0472\5\u012a\u0096"+ - "\2\u046c\u0472\5\u00aaV\2\u046d\u0472\5\u0124\u0093\2\u046e\u0472\5\u0126"+ - "\u0094\2\u046f\u0472\5\u0128\u0095\2\u0470\u0472\5\u00b4[\2\u0471\u0468"+ - "\3\2\2\2\u0471\u0469\3\2\2\2\u0471\u046a\3\2\2\2\u0471\u046b\3\2\2\2\u0471"+ - "\u046c\3\2\2\2\u0471\u046d\3\2\2\2\u0471\u046e\3\2\2\2\u0471\u046f\3\2"+ - "\2\2\u0471\u0470\3\2\2\2\u0472\u00b3\3\2\2\2\u0473\u0474\7\67\2\2\u0474"+ - "\u0475\5\u00b6\\\2\u0475\u00b5\3\2\2\2\u0476\u0482\7d\2\2\u0477\u047c"+ - "\5\u00b0Y\2\u0478\u0479\7k\2\2\u0479\u047b\5\u00b0Y\2\u047a\u0478\3\2"+ - "\2\2\u047b\u047e\3\2\2\2\u047c\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d"+ - "\u0480\3\2\2\2\u047e\u047c\3\2\2\2\u047f\u0481\7k\2\2\u0480\u047f\3\2"+ - "\2\2\u0480\u0481\3\2\2\2\u0481\u0483\3\2\2\2\u0482\u0477\3\2\2\2\u0482"+ - "\u0483\3\2\2\2\u0483\u0484\3\2\2\2\u0484\u0485\7e\2\2\u0485\u00b7\3\2"+ - "\2\2\u0486\u048e\5\u014c\u00a7\2\u0487\u048e\5\u011c\u008f\2\u0488\u048e"+ - "\5\u00ba^\2\u0489\u048e\5\u0124\u0093\2\u048a\u048e\5\u0126\u0094\2\u048b"+ - "\u048e\5L\'\2\u048c\u048e\5\u011a\u008e\2\u048d\u0486\3\2\2\2\u048d\u0487"+ - "\3\2\2\2\u048d\u0488\3\2\2\2\u048d\u0489\3\2\2\2\u048d\u048a\3\2\2\2\u048d"+ - "\u048b\3\2\2\2\u048d\u048c\3\2\2\2\u048e\u00b9\3\2\2\2\u048f\u0490\7h"+ - "\2\2\u0490\u0491\7r\2\2\u0491\u0492\7i\2\2\u0492\u0493\5\u0120\u0091\2"+ - "\u0493\u00bb\3\2\2\2\u0494\u04a4\7h\2\2\u0495\u0497\5\u00be`\2\u0496\u0495"+ - "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u049a\7m\2\2\u0499"+ + "\u04b0\nc\3c\3c\3d\3d\3d\3d\3d\3d\5d\u04ba\nd\3d\3d\3d\3d\5d\u04c0\nd"+ + "\5d\u04c2\nd\3e\3e\3e\3f\3f\3g\3g\3g\5g\u04cc\ng\3h\3h\3h\3h\3h\3h\7h"+ + "\u04d4\nh\fh\16h\u04d7\13h\3h\5h\u04da\nh\3i\3i\5i\u04de\ni\3i\3i\5i\u04e2"+ + "\ni\3j\3j\3j\7j\u04e7\nj\fj\16j\u04ea\13j\3k\3k\3k\7k\u04ef\nk\fk\16k"+ + "\u04f2\13k\3l\3l\3l\3l\3l\3l\7l\u04fa\nl\fl\16l\u04fd\13l\3l\5l\u0500"+ + "\nl\3m\3m\5m\u0504\nm\3m\3m\3n\3n\3n\3n\3n\3n\7n\u050e\nn\fn\16n\u0511"+ + "\13n\3n\5n\u0514\nn\3o\3o\5o\u0518\no\3o\3o\3p\5p\u051d\np\3p\3p\3p\6"+ + "p\u0522\np\rp\16p\u0523\3q\3q\3q\3q\3q\5q\u052b\nq\3r\3r\3s\3s\3s\3s\3"+ + "t\3t\3t\3u\3u\3u\3u\3v\3v\3w\3w\3w\5w\u053f\nw\3x\3x\5x\u0543\nx\3y\3"+ + "y\5y\u0547\ny\3z\3z\5z\u054b\nz\3{\3{\3{\3|\3|\3}\3}\3}\3}\3}\3}\3}\3"+ + "}\3}\5}\u055b\n}\3}\3}\3}\3}\5}\u0561\n}\5}\u0563\n}\3~\3~\5~\u0567\n"+ + "~\3\177\3\177\5\177\u056b\n\177\3\177\5\177\u056e\n\177\3\177\3\177\5"+ + "\177\u0572\n\177\5\177\u0574\n\177\3\177\3\177\7\177\u0578\n\177\f\177"+ + "\16\177\u057b\13\177\3\177\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u0582"+ + "\n\u0080\3\u0081\3\u0081\3\u0081\5\u0081\u0587\n\u0081\3\u0082\3\u0082"+ + "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\5\u0082\u0592"+ + "\n\u0082\3\u0082\3\u0082\7\u0082\u0596\n\u0082\f\u0082\16\u0082\u0599"+ + "\13\u0082\3\u0082\3\u0082\3\u0083\3\u0083\5\u0083\u059f\n\u0083\3\u0083"+ + "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\5\u0084"+ + "\u05aa\n\u0084\3\u0085\3\u0085\3\u0085\5\u0085\u05af\n\u0085\3\u0086\3"+ + "\u0086\5\u0086\u05b3\n\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u05b8\n\u0086"+ + "\7\u0086\u05ba\n\u0086\f\u0086\16\u0086\u05bd\13\u0086\3\u0087\3\u0087"+ + "\3\u0087\7\u0087\u05c2\n\u0087\f\u0087\16\u0087\u05c5\13\u0087\3\u0087"+ + "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u05cc\n\u0088\3\u0089\3\u0089"+ + "\3\u0089\5\u0089\u05d1\n\u0089\3\u0089\5\u0089\u05d4\n\u0089\3\u008a\3"+ + "\u008a\3\u008a\3\u008a\3\u008a\3\u008a\5\u008a\u05dc\n\u008a\3\u008a\3"+ + "\u008a\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u05e4\n\u008b\3\u008b\3"+ + "\u008b\3\u008c\5\u008c\u05e9\n\u008c\3\u008c\3\u008c\5\u008c\u05ed\n\u008c"+ + "\3\u008c\3\u008c\5\u008c\u05f1\n\u008c\3\u008d\3\u008d\3\u008d\3\u008e"+ + "\3\u008e\5\u008e\u05f8\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f"+ + "\3\u0090\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+ + "\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095"+ + "\3\u0095\3\u0095\3\u0095\3\u0095\5\u0095\u0615\n\u0095\3\u0095\3\u0095"+ + "\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u0620"+ + "\n\u0097\3\u0098\3\u0098\5\u0098\u0624\n\u0098\3\u0099\3\u0099\3\u0099"+ + "\3\u0099\7\u0099\u062a\n\u0099\f\u0099\16\u0099\u062d\13\u0099\3\u0099"+ + "\5\u0099\u0630\n\u0099\5\u0099\u0632\n\u0099\3\u0099\3\u0099\3\u009a\3"+ + "\u009a\3\u009a\3\u009a\5\u009a\u063a\n\u009a\3\u009a\3\u009a\3\u009b\3"+ + "\u009b\3\u009b\3\u009b\3\u009b\5\u009b\u0643\n\u009b\3\u009c\3\u009c\3"+ + "\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u064b\n\u009c\3\u009d\3\u009d\3"+ + "\u009d\5\u009d\u0650\n\u009d\3\u009e\3\u009e\3\u009f\3\u009f\3\u00a0\3"+ + "\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2"+ + "\5\u00a2\u0660\n\u00a2\5\u00a2\u0662\n\u00a2\3\u00a2\3\u00a2\3\u00a3\3"+ + "\u00a3\3\u00a3\7\u00a3\u0669\n\u00a3\f\u00a3\16\u00a3\u066c\13\u00a3\3"+ + "\u00a4\3\u00a4\3\u00a4\5\u00a4\u0671\n\u00a4\3\u00a4\3\u00a4\3\u00a5\3"+ + "\u00a5\5\u00a5\u0677\n\u00a5\3\u00a6\3\u00a6\5\u00a6\u067b\n\u00a6\3\u00a7"+ + "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u0682\n\u00a7\f\u00a7\16\u00a7"+ + "\u0685\13\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\3\u00a8\5\u00a8"+ + "\u068d\n\u00a8\3\u00a8\5\u00a8\u0690\n\u00a8\3\u00a9\3\u00a9\3\u00aa\5"+ + "\u00aa\u0695\n\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3"+ + "\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad"+ + "\3\u00ad\5\u00ad\u06a7\n\u00ad\5\u00ad\u06a9\n\u00ad\3\u00ad\5\u00ad\u06ac"+ + "\n\u00ad\3\u00ad\5\u00ad\u06af\n\u00ad\5\u00ad\u06b1\n\u00ad\3\u00ad\3"+ + "\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00b0\3\u00b0"+ + "\3\u00b0\3\u00b0\5\u00b0\u06bf\n\u00b0\3\u00b0\3\u02a1\4\u0092\u00a2\u00b1"+ + "\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFH"+ + "JLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c"+ + "\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4"+ + "\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc"+ + "\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4"+ + "\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec"+ + "\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104"+ + "\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c"+ + "\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134"+ + "\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c"+ + "\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\2\25\4\2ddoo\3"+ + "\2\31\32\3\2\7\n\3\2@A\3\2)+\4\2)+--\3\2\u0082\u0088\3\2\26\27\4\2}\u0081"+ + "\u0086\u0087\6\2$$pp||\u0083\u0085\3\2 \"\3\2\35\37\4\2GHv{\6\2..\61\61"+ + "\64\64\\\\\4\2|\u0081\u0083\u0087\3\2pq\4\2mm\u009e\u009e\4\2\u0089\u008c"+ + "\u008e\u008f\3\2\u0095\u0096\2\u071f\2\u0160\3\2\2\2\4\u0163\3\2\2\2\6"+ + "\u0166\3\2\2\2\b\u0169\3\2\2\2\n\u0171\3\2\2\2\f\u017a\3\2\2\2\16\u0195"+ + "\3\2\2\2\20\u0198\3\2\2\2\22\u01a0\3\2\2\2\24\u01ad\3\2\2\2\26\u01c3\3"+ + "\2\2\2\30\u01cb\3\2\2\2\32\u01cd\3\2\2\2\34\u01cf\3\2\2\2\36\u01d2\3\2"+ + "\2\2 \u01e5\3\2\2\2\"\u01e7\3\2\2\2$\u01e9\3\2\2\2&\u01ee\3\2\2\2(\u01f9"+ + "\3\2\2\2*\u0206\3\2\2\2,\u0209\3\2\2\2.\u0214\3\2\2\2\60\u0216\3\2\2\2"+ + "\62\u021b\3\2\2\2\64\u0220\3\2\2\2\66\u0225\3\2\2\28\u022a\3\2\2\2:\u0237"+ + "\3\2\2\2<\u0239\3\2\2\2>\u023b\3\2\2\2@\u0240\3\2\2\2B\u0245\3\2\2\2D"+ + "\u024a\3\2\2\2F\u0253\3\2\2\2H\u025a\3\2\2\2J\u0265\3\2\2\2L\u026c\3\2"+ + "\2\2N\u026e\3\2\2\2P\u0283\3\2\2\2R\u0285\3\2\2\2T\u0295\3\2\2\2V\u02a1"+ + "\3\2\2\2X\u02b0\3\2\2\2Z\u02b3\3\2\2\2\\\u02bb\3\2\2\2^\u02bd\3\2\2\2"+ + "`\u02cb\3\2\2\2b\u02d7\3\2\2\2d\u02e1\3\2\2\2f\u02e5\3\2\2\2h\u02eb\3"+ + "\2\2\2j\u0303\3\2\2\2l\u030b\3\2\2\2n\u031a\3\2\2\2p\u031c\3\2\2\2r\u0323"+ + "\3\2\2\2t\u032c\3\2\2\2v\u0331\3\2\2\2x\u0336\3\2\2\2z\u033c\3\2\2\2|"+ + "\u0343\3\2\2\2~\u0348\3\2\2\2\u0080\u034e\3\2\2\2\u0082\u0353\3\2\2\2"+ + "\u0084\u035a\3\2\2\2\u0086\u0364\3\2\2\2\u0088\u0368\3\2\2\2\u008a\u0374"+ + "\3\2\2\2\u008c\u0377\3\2\2\2\u008e\u037b\3\2\2\2\u0090\u0382\3\2\2\2\u0092"+ + "\u0396\3\2\2\2\u0094\u03d2\3\2\2\2\u0096\u03d4\3\2\2\2\u0098\u03d7\3\2"+ + "\2\2\u009a\u03dc\3\2\2\2\u009c\u03e5\3\2\2\2\u009e\u03f3\3\2\2\2\u00a0"+ + "\u03fd\3\2\2\2\u00a2\u040b\3\2\2\2\u00a4\u0426\3\2\2\2\u00a6\u0429\3\2"+ + "\2\2\u00a8\u0431\3\2\2\2\u00aa\u043a\3\2\2\2\u00ac\u044a\3\2\2\2\u00ae"+ + "\u045d\3\2\2\2\u00b0\u0466\3\2\2\2\u00b2\u0471\3\2\2\2\u00b4\u0473\3\2"+ + "\2\2\u00b6\u0476\3\2\2\2\u00b8\u048d\3\2\2\2\u00ba\u048f\3\2\2\2\u00bc"+ + "\u0494\3\2\2\2\u00be\u04a8\3\2\2\2\u00c0\u04aa\3\2\2\2\u00c2\u04ac\3\2"+ + "\2\2\u00c4\u04af\3\2\2\2\u00c6\u04b9\3\2\2\2\u00c8\u04c3\3\2\2\2\u00ca"+ + "\u04c6\3\2\2\2\u00cc\u04cb\3\2\2\2\u00ce\u04cd\3\2\2\2\u00d0\u04db\3\2"+ + "\2\2\u00d2\u04e3\3\2\2\2\u00d4\u04eb\3\2\2\2\u00d6\u04f3\3\2\2\2\u00d8"+ + "\u0501\3\2\2\2\u00da\u0507\3\2\2\2\u00dc\u0515\3\2\2\2\u00de\u0521\3\2"+ + "\2\2\u00e0\u052a\3\2\2\2\u00e2\u052c\3\2\2\2\u00e4\u052e\3\2\2\2\u00e6"+ + "\u0532\3\2\2\2\u00e8\u0535\3\2\2\2\u00ea\u0539\3\2\2\2\u00ec\u053b\3\2"+ + "\2\2\u00ee\u0540\3\2\2\2\u00f0\u0544\3\2\2\2\u00f2\u0548\3\2\2\2\u00f4"+ + "\u054c\3\2\2\2\u00f6\u054f\3\2\2\2\u00f8\u0551\3\2\2\2\u00fa\u0566\3\2"+ + "\2\2\u00fc\u0568\3\2\2\2\u00fe\u057e\3\2\2\2\u0100\u0586\3\2\2\2\u0102"+ + "\u0588\3\2\2\2\u0104\u059e\3\2\2\2\u0106\u05a6\3\2\2\2\u0108\u05ae\3\2"+ + "\2\2\u010a\u05b2\3\2\2\2\u010c\u05be\3\2\2\2\u010e\u05c8\3\2\2\2\u0110"+ + "\u05d3\3\2\2\2\u0112\u05db\3\2\2\2\u0114\u05df\3\2\2\2\u0116\u05e8\3\2"+ + "\2\2\u0118\u05f2\3\2\2\2\u011a\u05f7\3\2\2\2\u011c\u05f9\3\2\2\2\u011e"+ + "\u05fe\3\2\2\2\u0120\u0600\3\2\2\2\u0122\u0602\3\2\2\2\u0124\u0605\3\2"+ + "\2\2\u0126\u0609\3\2\2\2\u0128\u0614\3\2\2\2\u012a\u0618\3\2\2\2\u012c"+ + "\u061f\3\2\2\2\u012e\u0623\3\2\2\2\u0130\u0625\3\2\2\2\u0132\u0635\3\2"+ + "\2\2\u0134\u0642\3\2\2\2\u0136\u064a\3\2\2\2\u0138\u064f\3\2\2\2\u013a"+ + "\u0651\3\2\2\2\u013c\u0653\3\2\2\2\u013e\u0655\3\2\2\2\u0140\u0659\3\2"+ + "\2\2\u0142\u065c\3\2\2\2\u0144\u0665\3\2\2\2\u0146\u0670\3\2\2\2\u0148"+ + "\u0676\3\2\2\2\u014a\u067a\3\2\2\2\u014c\u067c\3\2\2\2\u014e\u068c\3\2"+ + "\2\2\u0150\u0691\3\2\2\2\u0152\u0694\3\2\2\2\u0154\u0698\3\2\2\2\u0156"+ + "\u069c\3\2\2\2\u0158\u06a1\3\2\2\2\u015a\u06b4\3\2\2\2\u015c\u06b8\3\2"+ + "\2\2\u015e\u06be\3\2\2\2\u0160\u0161\5\u0092J\2\u0161\u0162\7\2\2\3\u0162"+ + "\3\3\2\2\2\u0163\u0164\5\u0094K\2\u0164\u0165\7\2\2\3\u0165\5\3\2\2\2"+ + "\u0166\u0167\5\u00b0Y\2\u0167\u0168\7\2\2\3\u0168\7\3\2\2\2\u0169\u016e"+ + "\5\n\6\2\u016a\u016b\7l\2\2\u016b\u016d\5\n\6\2\u016c\u016a\3\2\2\2\u016d"+ + "\u0170\3\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f\3\2\2\2\u016f\t\3\2\2\2"+ + "\u0170\u016e\3\2\2\2\u0171\u0173\7d\2\2\u0172\u0174\7;\2\2\u0173\u0172"+ + "\3\2\2\2\u0173\u0174\3\2\2\2\u0174\13\3\2\2\2\u0175\u0176\5\16\b\2\u0176"+ + "\u0177\5\u015e\u00b0\2\u0177\u0179\3\2\2\2\u0178\u0175\3\2\2\2\u0179\u017c"+ + "\3\2\2\2\u017a\u0178\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u017d\3\2\2\2\u017c"+ + "\u017a\3\2\2\2\u017d\u017e\5\u00c8e\2\u017e\u0184\5\u015e\u00b0\2\u017f"+ + "\u0180\5\24\13\2\u0180\u0181\5\u015e\u00b0\2\u0181\u0183\3\2\2\2\u0182"+ + "\u017f\3\2\2\2\u0183\u0186\3\2\2\2\u0184\u0182\3\2\2\2\u0184\u0185\3\2"+ + "\2\2\u0185\u0190\3\2\2\2\u0186\u0184\3\2\2\2\u0187\u018b\5v<\2\u0188\u018b"+ + "\5\u00ccg\2\u0189\u018b\5\26\f\2\u018a\u0187\3\2\2\2\u018a\u0188\3\2\2"+ + "\2\u018a\u0189\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018d\5\u015e\u00b0\2"+ + "\u018d\u018f\3\2\2\2\u018e\u018a\3\2\2\2\u018f\u0192\3\2\2\2\u0190\u018e"+ + "\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0193\3\2\2\2\u0192\u0190\3\2\2\2\u0193"+ + "\u0194\7\2\2\3\u0194\r\3\2\2\2\u0195\u0196\7D\2\2\u0196\u0197\5\u0092"+ + "J\2\u0197\17\3\2\2\2\u0198\u0199\7E\2\2\u0199\u019a\5\u0092J\2\u019a\21"+ + "\3\2\2\2\u019b\u019c\5\20\t\2\u019c\u019d\5\u015e\u00b0\2\u019d\u019f"+ + "\3\2\2\2\u019e\u019b\3\2\2\2\u019f\u01a2\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0"+ + "\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0\3\2\2\2\u01a3\u01a5\t\2"+ + "\2\2\u01a4\u01a3\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6"+ + "\u01a7\5\u00caf\2\u01a7\23\3\2\2\2\u01a8\u01a9\5\20\t\2\u01a9\u01aa\5"+ + "\u015e\u00b0\2\u01aa\u01ac\3\2\2\2\u01ab\u01a8\3\2\2\2\u01ac\u01af\3\2"+ + "\2\2\u01ad\u01ab\3\2\2\2\u01ad\u01ae\3\2\2\2\u01ae\u01bd\3\2\2\2\u01af"+ + "\u01ad\3\2\2\2\u01b0\u01b1\7`\2\2\u01b1\u01be\5\22\n\2\u01b2\u01b3\7`"+ + "\2\2\u01b3\u01b9\7e\2\2\u01b4\u01b5\5\22\n\2\u01b5\u01b6\5\u015e\u00b0"+ + "\2\u01b6\u01b8\3\2\2\2\u01b7\u01b4\3\2\2\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7"+ + "\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc"+ + "\u01be\7f\2\2\u01bd\u01b0\3\2\2\2\u01bd\u01b2\3\2\2\2\u01be\25\3\2\2\2"+ + "\u01bf\u01c4\5h\65\2\u01c0\u01c4\5~@\2\u01c1\u01c4\5\u0082B\2\u01c2\u01c4"+ + "\5|?\2\u01c3\u01bf\3\2\2\2\u01c3\u01c0\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c3"+ + "\u01c2\3\2\2\2\u01c4\27\3\2\2\2\u01c5\u01c6\7\34\2\2\u01c6\u01cc\5\u0094"+ + "K\2\u01c7\u01c8\t\3\2\2\u01c8\u01cc\5.\30\2\u01c9\u01ca\t\4\2\2\u01ca"+ + "\u01cc\5\u0092J\2\u01cb\u01c5\3\2\2\2\u01cb\u01c7\3\2\2\2\u01cb\u01c9"+ + "\3\2\2\2\u01cc\31\3\2\2\2\u01cd\u01ce\5\34\17\2\u01ce\33\3\2\2\2\u01cf"+ + "\u01d0\5V,\2\u01d0\u01d1\5\36\20\2\u01d1\35\3\2\2\2\u01d2\u01d3\7C\2\2"+ + "\u01d3\u01d5\7e\2\2\u01d4\u01d6\5\u00dep\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6"+ + "\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\7f\2\2\u01d8\37\3\2\2\2\u01d9"+ + "\u01e6\5F$\2\u01da\u01e6\5D#\2\u01db\u01e6\5B\"\2\u01dc\u01e6\5$\23\2"+ + "\u01dd\u01e6\5@!\2\u01de\u01e6\58\35\2\u01df\u01e6\5> \2\u01e0\u01e6\5"+ + "\66\34\2\u01e1\u01e6\5\62\32\2\u01e2\u01e6\5\60\31\2\u01e3\u01e6\5\64"+ + "\33\2\u01e4\u01e6\5\"\22\2\u01e5\u01d9\3\2\2\2\u01e5\u01da\3\2\2\2\u01e5"+ + "\u01db\3\2\2\2\u01e5\u01dc\3\2\2\2\u01e5\u01dd\3\2\2\2\u01e5\u01de\3\2"+ + "\2\2\u01e5\u01df\3\2\2\2\u01e5\u01e0\3\2\2\2\u01e5\u01e1\3\2\2\2\u01e5"+ + "\u01e2\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5\u01e4\3\2\2\2\u01e6!\3\2\2\2"+ + "\u01e7\u01e8\t\5\2\2\u01e8#\3\2\2\2\u01e9\u01ea\7]\2\2\u01ea\u01eb\7i"+ + "\2\2\u01eb\u01ec\5\u00b0Y\2\u01ec\u01ed\7j\2\2\u01ed%\3\2\2\2\u01ee\u01f3"+ + "\5(\25\2\u01ef\u01f0\7l\2\2\u01f0\u01f2\5(\25\2\u01f1\u01ef\3\2\2\2\u01f2"+ + "\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f7\3\2"+ + "\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f8\7l\2\2\u01f7\u01f6\3\2\2\2\u01f7"+ + "\u01f8\3\2\2\2\u01f8\'\3\2\2\2\u01f9\u01fe\7d\2\2\u01fa\u01fb\7l\2\2\u01fb"+ + "\u01fd\7d\2\2\u01fc\u01fa\3\2\2\2\u01fd\u0200\3\2\2\2\u01fe\u01fc\3\2"+ + "\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\3\2\2\2\u0200\u01fe\3\2\2\2\u0201"+ + "\u0202\5\u0120\u0091\2\u0202)\3\2\2\2\u0203\u0205\5,\27\2\u0204\u0203"+ + "\3\2\2\2\u0205\u0208\3\2\2\2\u0206\u0204\3\2\2\2\u0206\u0207\3\2\2\2\u0207"+ + "+\3\2\2\2\u0208\u0206\3\2\2\2\u0209\u020a\7g\2\2\u020a\u020f\5\u0092J"+ + "\2\u020b\u020c\7l\2\2\u020c\u020e\5\u0092J\2\u020d\u020b\3\2\2\2\u020e"+ + "\u0211\3\2\2\2\u020f\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u0212\3\2"+ + "\2\2\u0211\u020f\3\2\2\2\u0212\u0213\7h\2\2\u0213-\3\2\2\2\u0214\u0215"+ + "\5\u00a2R\2\u0215/\3\2\2\2\u0216\u0217\7\62\2\2\u0217\u0218\7e\2\2\u0218"+ + "\u0219\5\u0092J\2\u0219\u021a\7f\2\2\u021a\61\3\2\2\2\u021b\u021c\7\66"+ + "\2\2\u021c\u021d\7i\2\2\u021d\u021e\5\u00b0Y\2\u021e\u021f\7j\2\2\u021f"+ + "\63\3\2\2\2\u0220\u0221\7\63\2\2\u0221\u0222\7e\2\2\u0222\u0223\5\u0092"+ + "J\2\u0223\u0224\7f\2\2\u0224\65\3\2\2\2\u0225\u0226\t\6\2\2\u0226\u0227"+ + "\7e\2\2\u0227\u0228\5\u0092J\2\u0228\u0229\7f\2\2\u0229\67\3\2\2\2\u022a"+ + "\u022f\7\23\2\2\u022b\u022c\7i\2\2\u022c\u022d\5:\36\2\u022d\u022e\7j"+ + "\2\2\u022e\u0230\3\2\2\2\u022f\u022b\3\2\2\2\u022f\u0230\3\2\2\2\u0230"+ + "\u0231\3\2\2\2\u0231\u0232\7e\2\2\u0232\u0233\5\u0092J\2\u0233\u0234\7"+ + "f\2\2\u02349\3\2\2\2\u0235\u0238\5<\37\2\u0236\u0238\7\25\2\2\u0237\u0235"+ + "\3\2\2\2\u0237\u0236\3\2\2\2\u0238;\3\2\2\2\u0239\u023a\7d\2\2\u023a="+ + "\3\2\2\2\u023b\u023c\7\24\2\2\u023c\u023d\7e\2\2\u023d\u023e\5\u0092J"+ + "\2\u023e\u023f\7f\2\2\u023f?\3\2\2\2\u0240\u0241\79\2\2\u0241\u0242\7"+ + "e\2\2\u0242\u0243\5\u0092J\2\u0243\u0244\7f\2\2\u0244A\3\2\2\2\u0245\u0246"+ + "\78\2\2\u0246\u0247\7e\2\2\u0247\u0248\5\u0092J\2\u0248\u0249\7f\2\2\u0249"+ + "C\3\2\2\2\u024a\u024b\7\30\2\2\u024b\u024c\7e\2\2\u024c\u024f\5\u0092"+ + "J\2\u024d\u024e\7l\2\2\u024e\u0250\5\u0092J\2\u024f\u024d\3\2\2\2\u024f"+ + "\u0250\3\2\2\2\u0250\u0251\3\2\2\2\u0251\u0252\7f\2\2\u0252E\3\2\2\2\u0253"+ + "\u0254\t\6\2\2\u0254\u0255\7i\2\2\u0255\u0256\5\u0092J\2\u0256\u0257\7"+ + "<\2\2\u0257\u0258\5\u0092J\2\u0258\u0259\7j\2\2\u0259G\3\2\2\2\u025a\u025b"+ + "\7i\2\2\u025b\u0260\5J&\2\u025c\u025d\7l\2\2\u025d\u025f\5J&\2\u025e\u025c"+ + "\3\2\2\2\u025f\u0262\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261"+ + "\u0263\3\2\2\2\u0262\u0260\3\2\2\2\u0263\u0264\7j\2\2\u0264I\3\2\2\2\u0265"+ + "\u0266\5\u0092J\2\u0266\u0267\7k\2\2\u0267\u0268\5\u0092J\2\u0268K\3\2"+ + "\2\2\u0269\u026d\5T+\2\u026a\u026d\5R*\2\u026b\u026d\5N(\2\u026c\u0269"+ + "\3\2\2\2\u026c\u026a\3\2\2\2\u026c\u026b\3\2\2\2\u026dM\3\2\2\2\u026e"+ + "\u026f\7\64\2\2\u026f\u0275\7g\2\2\u0270\u0271\5P)\2\u0271\u0272\5\u015e"+ + "\u00b0\2\u0272\u0274\3\2\2\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275"+ + "\u0273\3\2\2\2\u0275\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2"+ + "\2\2\u0278\u0279\7h\2\2\u0279O\3\2\2\2\u027a\u027b\7L\2\2\u027b\u027c"+ + "\7d\2\2\u027c\u0284\5\u012c\u0097\2\u027d\u027e\7\65\2\2\u027e\u027f\7"+ + "g\2\2\u027f\u0280\5\u0092J\2\u0280\u0281\5\u015e\u00b0\2\u0281\u0282\7"+ + "h\2\2\u0282\u0284\3\2\2\2\u0283\u027a\3\2\2\2\u0283\u027d\3\2\2\2\u0284"+ + "Q\3\2\2\2\u0285\u0286\7\34\2\2\u0286\u0287\7i\2\2\u0287\u0288\7j\2\2\u0288"+ + "\u0289\5\u0120\u0091\2\u0289S\3\2\2\2\u028a\u028b\t\7\2\2\u028b\u028c"+ + "\7i\2\2\u028c\u028d\5\u00b0Y\2\u028d\u028e\7j\2\2\u028e\u0296\3\2\2\2"+ + "\u028f\u0290\7,\2\2\u0290\u0291\7i\2\2\u0291\u0292\5\u00b0Y\2\u0292\u0293"+ + "\7j\2\2\u0293\u0294\5\u00b0Y\2\u0294\u0296\3\2\2\2\u0295\u028a\3\2\2\2"+ + "\u0295\u028f\3\2\2\2\u0296U\3\2\2\2\u0297\u029d\5X-\2\u0298\u0299\7\20"+ + "\2\2\u0299\u029d\b,\1\2\u029a\u029b\7B\2\2\u029b\u029d\b,\1\2\u029c\u0297"+ + "\3\2\2\2\u029c\u0298\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e\3\2\2\2\u029e"+ + "\u02a0\5\u015e\u00b0\2\u029f\u029c\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u02a2"+ + "\3\2\2\2\u02a1\u029f\3\2\2\2\u02a2\u02a6\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4"+ + "\u02a5\7\20\2\2\u02a5\u02a7\b,\1\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7\3\2"+ + "\2\2\u02a7W\3\2\2\2\u02a8\u02a9\7\13\2\2\u02a9\u02b1\5\\/\2\u02aa\u02ab"+ + "\7\f\2\2\u02ab\u02b1\5\\/\2\u02ac\u02ad\7\r\2\2\u02ad\u02b1\5\\/\2\u02ae"+ + "\u02af\7\17\2\2\u02af\u02b1\5Z.\2\u02b0\u02a8\3\2\2\2\u02b0\u02aa\3\2"+ + "\2\2\u02b0\u02ac\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b1Y\3\2\2\2\u02b2\u02b4"+ + "\5\u00d4k\2\u02b3\u02b2\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b7\3\2\2"+ + "\2\u02b5\u02b6\7[\2\2\u02b6\u02b8\5\u0092J\2\u02b7\u02b5\3\2\2\2\u02b7"+ + "\u02b8\3\2\2\2\u02b8[\3\2\2\2\u02b9\u02bc\3\2\2\2\u02ba\u02bc\5\u0092"+ + "J\2\u02bb\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bc]\3\2\2\2\u02bd\u02c2"+ + "\7g\2\2\u02be\u02bf\7:\2\2\u02bf\u02c0\5\u00d2j\2\u02c0\u02c1\5\u015e"+ + "\u00b0\2\u02c1\u02c3\3\2\2\2\u02c2\u02be\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3"+ + "\u02c5\3\2\2\2\u02c4\u02c6\5\u00dep\2\u02c5\u02c4\3\2\2\2\u02c5\u02c6"+ + "\3\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c8\7h\2\2\u02c8_\3\2\2\2\u02c9\u02cc"+ + "\5\u013e\u00a0\2\u02ca\u02cc\7d\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02ca\3"+ + "\2\2\2\u02cc\u02d5\3\2\2\2\u02cd\u02d2\7g\2\2\u02ce\u02d0\5b\62\2\u02cf"+ + "\u02d1\7l\2\2\u02d0\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d3\3\2"+ + "\2\2\u02d2\u02ce\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4"+ + "\u02d6\7h\2\2\u02d5\u02cd\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6a\3\2\2\2\u02d7"+ + "\u02dc\5d\63\2\u02d8\u02d9\7l\2\2\u02d9\u02db\5d\63\2\u02da\u02d8\3\2"+ + "\2\2\u02db\u02de\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02dd"+ + "c\3\2\2\2\u02de\u02dc\3\2\2\2\u02df\u02e0\7d\2\2\u02e0\u02e2\7n\2\2\u02e1"+ + "\u02df\3\2\2\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5\u0092"+ + "J\2\u02e4e\3\2\2\2\u02e5\u02e6\7F\2\2\u02e6\u02e7\5\u0092J\2\u02e7\u02e8"+ + "\7\21\2\2\u02e8\u02e9\5`\61\2\u02e9\u02ea\5\u00dco\2\u02eag\3\2\2\2\u02eb"+ + "\u02ec\5\u00b0Y\2\u02ec\u02ed\7\21\2\2\u02ed\u0300\5\u00b0Y\2\u02ee\u02f4"+ + "\7g\2\2\u02ef\u02f0\5p9\2\u02f0\u02f1\5\u015e\u00b0\2\u02f1\u02f3\3\2"+ + "\2\2\u02f2\u02ef\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f4"+ + "\u02f5\3\2\2\2\u02f5\u02fc\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f7\u02f8\5j"+ + "\66\2\u02f8\u02f9\5\u015e\u00b0\2\u02f9\u02fb\3\2\2\2\u02fa\u02f7\3\2"+ + "\2\2\u02fb\u02fe\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd"+ + "\u02ff\3\2\2\2\u02fe\u02fc\3\2\2\2\u02ff\u0301\7h\2\2\u0300\u02ee\3\2"+ + "\2\2\u0300\u0301\3\2\2\2\u0301i\3\2\2\2\u0302\u0304\7\20\2\2\u0303\u0302"+ + "\3\2\2\2\u0303\u0304\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306\5l\67\2\u0306"+ + "\u0307\7d\2\2\u0307\u0309\5\u012c\u0097\2\u0308\u030a\5\u00dco\2\u0309"+ + "\u0308\3\2\2\2\u0309\u030a\3\2\2\2\u030ak\3\2\2\2\u030b\u030d\7e\2\2\u030c"+ + "\u030e\7d\2\2\u030d\u030c\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0310\3\2"+ + "\2\2\u030f\u0311\7\u0086\2\2\u0310\u030f\3\2\2\2\u0310\u0311\3\2\2\2\u0311"+ + "\u0312\3\2\2\2\u0312\u0313\5\u011a\u008e\2\u0313\u0314\7f\2\2\u0314m\3"+ + "\2\2\2\u0315\u031b\5\u00a2R\2\u0316\u0317\5\u00b0Y\2\u0317\u0318\7o\2"+ + "\2\u0318\u0319\7d\2\2\u0319\u031b\3\2\2\2\u031a\u0315\3\2\2\2\u031a\u0316"+ + "\3\2\2\2\u031bo\3\2\2\2\u031c\u031d\7\67\2\2\u031d\u031e\7d\2\2\u031e"+ + "\u0321\7r\2\2\u031f\u0322\5n8\2\u0320\u0322\5\u013c\u009f\2\u0321\u031f"+ + "\3\2\2\2\u0321\u0320\3\2\2\2\u0322q\3\2\2\2\u0323\u0324\7\60\2\2\u0324"+ + "\u0325\7e\2\2\u0325\u0328\5\u00b0Y\2\u0326\u0327\7l\2\2\u0327\u0329\5"+ + "\u00d4k\2\u0328\u0326\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u032a\3\2\2\2"+ + "\u032a\u032b\7f\2\2\u032bs\3\2\2\2\u032c\u032d\7/\2\2\u032d\u032e\7e\2"+ + "\2\u032e\u032f\5\u00b0Y\2\u032f\u0330\7f\2\2\u0330u\3\2\2\2\u0331\u0334"+ + "\5V,\2\u0332\u0335\5x=\2\u0333\u0335\5z>\2\u0334\u0332\3\2\2\2\u0334\u0333"+ + "\3\2\2\2\u0335w\3\2\2\2\u0336\u0337\7L\2\2\u0337\u0338\7d\2\2\u0338\u033a"+ + "\5\u012c\u0097\2\u0339\u033b\5^\60\2\u033a\u0339\3\2\2\2\u033a\u033b\3"+ + "\2\2\2\u033by\3\2\2\2\u033c\u033d\7L\2\2\u033d\u033e\5\u0088E\2\u033e"+ + "\u033f\7d\2\2\u033f\u0341\5\u012c\u0097\2\u0340\u0342\5^\60\2\u0341\u0340"+ + "\3\2\2\2\u0341\u0342\3\2\2\2\u0342{\3\2\2\2\u0343\u0346\7\34\2\2\u0344"+ + "\u0347\5v<\2\u0345\u0347\5\u00ccg\2\u0346\u0344\3\2\2\2\u0346\u0345\3"+ + "\2\2\2\u0347}\3\2\2\2\u0348\u0349\7\67\2\2\u0349\u034a\7d\2\2\u034a\u034c"+ + "\5\u0130\u0099\2\u034b\u034d\5\u0080A\2\u034c\u034b\3\2\2\2\u034c\u034d"+ + "\3\2\2\2\u034d\177\3\2\2\2\u034e\u034f\7g\2\2\u034f\u0350\5\u0092J\2\u0350"+ + "\u0351\5\u015e\u00b0\2\u0351\u0352\7h\2\2\u0352\u0081\3\2\2\2\u0353\u0354"+ + "\7\67\2\2\u0354\u0355\5\u0088E\2\u0355\u0356\7d\2\2\u0356\u0358\5\u0130"+ + "\u0099\2\u0357\u0359\5\u0080A\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2"+ + "\2\u0359\u0083\3\2\2\2\u035a\u0362\5\b\5\2\u035b\u035e\5\u00b0Y\2\u035c"+ + "\u035d\7k\2\2\u035d\u035f\5\u00d4k\2\u035e\u035c\3\2\2\2\u035e\u035f\3"+ + "\2\2\2\u035f\u0363\3\2\2\2\u0360\u0361\7k\2\2\u0361\u0363\5\u00d4k\2\u0362"+ + "\u035b\3\2\2\2\u0362\u0360\3\2\2\2\u0363\u0085\3\2\2\2\u0364\u0365\5\b"+ + "\5\2\u0365\u0366\7r\2\2\u0366\u0367\5\u00d4k\2\u0367\u0087\3\2\2\2\u0368"+ + "\u036a\7e\2\2\u0369\u036b\5\n\6\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2"+ + "\2\2\u036b\u036c\3\2\2\2\u036c\u036e\5\u00b0Y\2\u036d\u036f\7l\2\2\u036e"+ + "\u036d\3\2\2\2\u036e\u036f\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u0371\7f"+ + "\2\2\u0371\u0089\3\2\2\2\u0372\u0375\5\u008cG\2\u0373\u0375\5\u008eH\2"+ + "\u0374\u0372\3\2\2\2\u0374\u0373\3\2\2\2\u0375\u008b\3\2\2\2\u0376\u0378"+ + "\5\u00d2j\2\u0377\u0376\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u0379\3\2\2"+ + "\2\u0379\u037a\5\u0090I\2\u037a\u008d\3\2\2\2\u037b\u037d\7\34\2\2\u037c"+ + "\u037e\5\u00d2j\2\u037d\u037c\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f"+ + "\3\2\2\2\u037f\u0380\5\u0090I\2\u0380\u008f\3\2\2\2\u0381\u0383\7s\2\2"+ + "\u0382\u0381\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385"+ + "\5\u00b0Y\2\u0385\u0091\3\2\2\2\u0386\u0387\bJ\1\2\u0387\u0388\t\b\2\2"+ + "\u0388\u0397\5\u0092J\20\u0389\u0397\5\u00a2R\2\u038a\u038b\7\33\2\2\u038b"+ + "\u038c\5.\30\2\u038c\u038d\7\35\2\2\u038d\u038e\5\u0092J\4\u038e\u0397"+ + "\3\2\2\2\u038f\u0390\t\t\2\2\u0390\u0391\5&\24\2\u0391\u0392\7n\2\2\u0392"+ + "\u0393\7n\2\2\u0393\u0394\5*\26\2\u0394\u0395\5\u0092J\3\u0395\u0397\3"+ + "\2\2\2\u0396\u0386\3\2\2\2\u0396\u0389\3\2\2\2\u0396\u038a\3\2\2\2\u0396"+ + "\u038f\3\2\2\2\u0397\u03bb\3\2\2\2\u0398\u0399\f\16\2\2\u0399\u039a\t"+ + "\n\2\2\u039a\u03ba\5\u0092J\17\u039b\u039c\f\r\2\2\u039c\u039d\t\13\2"+ + "\2\u039d\u03ba\5\u0092J\16\u039e\u039f\f\f\2\2\u039f\u03a0\t\f\2\2\u03a0"+ + "\u03ba\5\u0092J\r\u03a1\u03a2\f\13\2\2\u03a2\u03a3\t\r\2\2\u03a3\u03ba"+ + "\5\u0092J\f\u03a4\u03a5\f\n\2\2\u03a5\u03a6\t\16\2\2\u03a6\u03ba\5\u0092"+ + "J\13\u03a7\u03a8\f\b\2\2\u03a8\u03a9\7u\2\2\u03a9\u03ba\5\u0092J\t\u03aa"+ + "\u03ab\f\7\2\2\u03ab\u03ac\7t\2\2\u03ac\u03ba\5\u0092J\b\u03ad\u03ae\f"+ + "\6\2\2\u03ae\u03af\7#\2\2\u03af\u03ba\5\u0092J\6\u03b0\u03b1\f\5\2\2\u03b1"+ + "\u03b2\7&\2\2\u03b2\u03b3\5\u0092J\2\u03b3\u03b4\7n\2\2\u03b4\u03b5\5"+ + "\u0092J\5\u03b5\u03ba\3\2\2\2\u03b6\u03b7\f\t\2\2\u03b7\u03b8\7\21\2\2"+ + "\u03b8\u03ba\5`\61\2\u03b9\u0398\3\2\2\2\u03b9\u039b\3\2\2\2\u03b9\u039e"+ + "\3\2\2\2\u03b9\u03a1\3\2\2\2\u03b9\u03a4\3\2\2\2\u03b9\u03a7\3\2\2\2\u03b9"+ + "\u03aa\3\2\2\2\u03b9\u03ad\3\2\2\2\u03b9\u03b0\3\2\2\2\u03b9\u03b6\3\2"+ + "\2\2\u03ba\u03bd\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc"+ + "\u0093\3\2\2\2\u03bd\u03bb\3\2\2\2\u03be\u03d3\5\30\r\2\u03bf\u03d3\5"+ + "\32\16\2\u03c0\u03d3\5\u0098M\2\u03c1\u03d3\5\u0096L\2\u03c2\u03d3\5\u00cc"+ + "g\2\u03c3\u03d3\5\u00ecw\2\u03c4\u03d3\5\u00e0q\2\u03c5\u03d3\5\u0118"+ + "\u008d\2\u03c6\u03d3\5\u00eex\2\u03c7\u03d3\5\u00f0y\2\u03c8\u03d3\5\u00f2"+ + "z\2\u03c9\u03d3\5\u00f4{\2\u03ca\u03d3\5\u00f6|\2\u03cb\u03d3\5\u00dc"+ + "o\2\u03cc\u03d3\5\u00f8}\2\u03cd\u03d3\5\u00fa~\2\u03ce\u03d3\5\u010c"+ + "\u0087\2\u03cf\u03d3\5\u009aN\2\u03d0\u03d3\5\u009eP\2\u03d1\u03d3\5f"+ + "\64\2\u03d2\u03be\3\2\2\2\u03d2\u03bf\3\2\2\2\u03d2\u03c0\3\2\2\2\u03d2"+ + "\u03c1\3\2\2\2\u03d2\u03c2\3\2\2\2\u03d2\u03c3\3\2\2\2\u03d2\u03c4\3\2"+ + "\2\2\u03d2\u03c5\3\2\2\2\u03d2\u03c6\3\2\2\2\u03d2\u03c7\3\2\2\2\u03d2"+ + "\u03c8\3\2\2\2\u03d2\u03c9\3\2\2\2\u03d2\u03ca\3\2\2\2\u03d2\u03cb\3\2"+ + "\2\2\u03d2\u03cc\3\2\2\2\u03d2\u03cd\3\2\2\2\u03d2\u03ce\3\2\2\2\u03d2"+ + "\u03cf\3\2\2\2\u03d2\u03d0\3\2\2\2\u03d2\u03d1\3\2\2\2\u03d3\u0095\3\2"+ + "\2\2\u03d4\u03d5\7%\2\2\u03d5\u03d6\5\u0092J\2\u03d6\u0097\3\2\2\2\u03d7"+ + "\u03d8\7W\2\2\u03d8\u03da\5\u0092J\2\u03d9\u03db\5\u00dco\2\u03da\u03d9"+ + "\3\2\2\2\u03da\u03db\3\2\2\2\u03db\u0099\3\2\2\2\u03dc\u03dd\5\u009cO"+ + "\2\u03dd\u03de\5\u0114\u008b\2\u03de\u009b\3\2\2\2\u03df\u03e0\7\16\2"+ + "\2\u03e0\u03e1\5\u0092J\2\u03e1\u03e2\5\u015e\u00b0\2\u03e2\u03e4\3\2"+ + "\2\2\u03e3\u03df\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5"+ + "\u03e6\3\2\2\2\u03e6\u03ec\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7\17"+ + "\2\2\u03e9\u03ea\5Z.\2\u03ea\u03eb\5\u015e\u00b0\2\u03eb\u03ed\3\2\2\2"+ + "\u03ec\u03e8\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u009d\3\2\2\2\u03ee\u03ef"+ + "\7P\2\2\u03ef\u03f4\5\u0092J\2\u03f0\u03f1\7P\2\2\u03f1\u03f2\t\3\2\2"+ + "\u03f2\u03f4\5.\30\2\u03f3\u03ee\3\2\2\2\u03f3\u03f0\3\2\2\2\u03f4\u009f"+ + "\3\2\2\2\u03f5\u03fe\7\5\2\2\u03f6\u03fe\7\6\2\2\u03f7\u03fe\7c\2\2\u03f8"+ + "\u03fe\5\u013a\u009e\2\u03f9\u03fe\5\u0150\u00a9\2\u03fa\u03fe\7\3\2\2"+ + "\u03fb\u03fe\7\u008e\2\2\u03fc\u03fe\7\u008f\2\2\u03fd\u03f5\3\2\2\2\u03fd"+ + "\u03f6\3\2\2\2\u03fd\u03f7\3\2\2\2\u03fd\u03f8\3\2\2\2\u03fd\u03f9\3\2"+ + "\2\2\u03fd\u03fa\3\2\2\2\u03fd\u03fb\3\2\2\2\u03fd\u03fc\3\2\2\2\u03fe"+ + "\u00a1\3\2\2\2\u03ff\u0400\bR\1\2\u0400\u040c\5\u0136\u009c\2\u0401\u040c"+ + "\5\u0132\u009a\2\u0402\u040c\5\u015a\u00ae\2\u0403\u040c\5 \21\2\u0404"+ + "\u040c\5t;\2\u0405\u040c\5r:\2\u0406\u0407\t\17\2\2\u0407\u0408\7e\2\2"+ + "\u0408\u0409\5\u0092J\2\u0409\u040a\7f\2\2\u040a\u040c\3\2\2\2\u040b\u03ff"+ + "\3\2\2\2\u040b\u0401\3\2\2\2\u040b\u0402\3\2\2\2\u040b\u0403\3\2\2\2\u040b"+ + "\u0404\3\2\2\2\u040b\u0405\3\2\2\2\u040b\u0406\3\2\2\2\u040c\u0423\3\2"+ + "\2\2\u040d\u040e\f\13\2\2\u040e\u040f\7o\2\2\u040f\u0422\7d\2\2\u0410"+ + "\u0411\f\n\2\2\u0411\u0422\5\u0154\u00ab\2\u0412\u0413\f\t\2\2\u0413\u0422"+ + "\5\u00bc_\2\u0414\u0415\f\b\2\2\u0415\u0422\5H%\2\u0416\u0417\f\7\2\2"+ + "\u0417\u0422\5\u0156\u00ac\2\u0418\u0419\f\6\2\2\u0419\u0422\5\u0158\u00ad"+ + "\2\u041a\u041b\f\5\2\2\u041b\u041c\5\u0158\u00ad\2\u041c\u041d\7\22\2"+ + "\2\u041d\u041e\5`\61\2\u041e\u0422\3\2\2\2\u041f\u0420\f\4\2\2\u0420\u0422"+ + "\5\u00a8U\2\u0421\u040d\3\2\2\2\u0421\u0410\3\2\2\2\u0421\u0412\3\2\2"+ + "\2\u0421\u0414\3\2\2\2\u0421\u0416\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041a"+ + "\3\2\2\2\u0421\u041f\3\2\2\2\u0422\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423"+ + "\u0424\3\2\2\2\u0424\u00a3\3\2\2\2\u0425\u0423\3\2\2\2\u0426\u0427\5V"+ + ",\2\u0427\u0428\5\u00a6T\2\u0428\u00a5\3\2\2\2\u0429\u042b\7L\2\2\u042a"+ + "\u042c\7d\2\2\u042b\u042a\3\2\2\2\u042b\u042c\3\2\2\2\u042c\u042d\3\2"+ + "\2\2\u042d\u042f\5\u012c\u0097\2\u042e\u0430\5^\60\2\u042f\u042e\3\2\2"+ + "\2\u042f\u0430\3\2\2\2\u0430\u00a7\3\2\2\2\u0431\u0433\7\'\2\2\u0432\u0434"+ + "\5\u00d4k\2\u0433\u0432\3\2\2\2\u0433\u0434\3\2\2\2\u0434\u0436\3\2\2"+ + "\2\u0435\u0437\7l\2\2\u0436\u0435\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0438"+ + "\3\2\2\2\u0438\u0439\7(\2\2\u0439\u00a9\3\2\2\2\u043a\u043b\7M\2\2\u043b"+ + "\u0445\7g\2\2\u043c\u0440\5\u00aeX\2\u043d\u0440\5\u011a\u008e\2\u043e"+ + "\u0440\5\u00acW\2\u043f\u043c\3\2\2\2\u043f\u043d\3\2\2\2\u043f\u043e"+ + "\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u0442\5\u015e\u00b0\2\u0442\u0444\3"+ + "\2\2\2\u0443\u043f\3\2\2\2\u0444\u0447\3\2\2\2\u0445\u0443\3\2\2\2\u0445"+ + "\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447\u0445\3\2\2\2\u0448\u0449\7h"+ + "\2\2\u0449\u00ab\3\2\2\2\u044a\u044b\7\67\2\2\u044b\u044c\7d\2\2\u044c"+ + "\u044d\5\u0130\u0099\2\u044d\u00ad\3\2\2\2\u044e\u0450\7\34\2\2\u044f"+ + "\u044e\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u0451\3\2\2\2\u0451\u0452\5V"+ + ",\2\u0452\u0453\7d\2\2\u0453\u0454\5\u0130\u0099\2\u0454\u0455\5\u012e"+ + "\u0098\2\u0455\u045e\3\2\2\2\u0456\u0458\7\34\2\2\u0457\u0456\3\2\2\2"+ + "\u0457\u0458\3\2\2\2\u0458\u0459\3\2\2\2\u0459\u045a\5V,\2\u045a\u045b"+ + "\7d\2\2\u045b\u045c\5\u0130\u0099\2\u045c\u045e\3\2\2\2\u045d\u044f\3"+ + "\2\2\2\u045d\u0457\3\2\2\2\u045e\u00af\3\2\2\2\u045f\u0467\5\u011a\u008e"+ + "\2\u0460\u0467\5\u00b2Z\2\u0461\u0467\5L\'\2\u0462\u0463\7e\2\2\u0463"+ + "\u0464\5\u00b0Y\2\u0464\u0465\7f\2\2\u0465\u0467\3\2\2\2\u0466\u045f\3"+ + "\2\2\2\u0466\u0460\3\2\2\2\u0466\u0461\3\2\2\2\u0466\u0462\3\2\2\2\u0467"+ + "\u00b1\3\2\2\2\u0468\u0472\5\u011c\u008f\2\u0469\u0472\5\u014c\u00a7\2"+ + "\u046a\u0472\5\u0122\u0092\2\u046b\u0472\5\u012a\u0096\2\u046c\u0472\5"+ + "\u00aaV\2\u046d\u0472\5\u0124\u0093\2\u046e\u0472\5\u0126\u0094\2\u046f"+ + "\u0472\5\u0128\u0095\2\u0470\u0472\5\u00b4[\2\u0471\u0468\3\2\2\2\u0471"+ + "\u0469\3\2\2\2\u0471\u046a\3\2\2\2\u0471\u046b\3\2\2\2\u0471\u046c\3\2"+ + "\2\2\u0471\u046d\3\2\2\2\u0471\u046e\3\2\2\2\u0471\u046f\3\2\2\2\u0471"+ + "\u0470\3\2\2\2\u0472\u00b3\3\2\2\2\u0473\u0474\7\67\2\2\u0474\u0475\5"+ + "\u00b6\\\2\u0475\u00b5\3\2\2\2\u0476\u0482\7e\2\2\u0477\u047c\5\u00b0"+ + "Y\2\u0478\u0479\7l\2\2\u0479\u047b\5\u00b0Y\2\u047a\u0478\3\2\2\2\u047b"+ + "\u047e\3\2\2\2\u047c\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d\u0480\3\2"+ + "\2\2\u047e\u047c\3\2\2\2\u047f\u0481\7l\2\2\u0480\u047f\3\2\2\2\u0480"+ + "\u0481\3\2\2\2\u0481\u0483\3\2\2\2\u0482\u0477\3\2\2\2\u0482\u0483\3\2"+ + "\2\2\u0483\u0484\3\2\2\2\u0484\u0485\7f\2\2\u0485\u00b7\3\2\2\2\u0486"+ + "\u048e\5\u014c\u00a7\2\u0487\u048e\5\u011c\u008f\2\u0488\u048e\5\u00ba"+ + "^\2\u0489\u048e\5\u0124\u0093\2\u048a\u048e\5\u0126\u0094\2\u048b\u048e"+ + "\5L\'\2\u048c\u048e\5\u011a\u008e\2\u048d\u0486\3\2\2\2\u048d\u0487\3"+ + "\2\2\2\u048d\u0488\3\2\2\2\u048d\u0489\3\2\2\2\u048d\u048a\3\2\2\2\u048d"+ + "\u048b\3\2\2\2\u048d\u048c\3\2\2\2\u048e\u00b9\3\2\2\2\u048f\u0490\7i"+ + "\2\2\u0490\u0491\7s\2\2\u0491\u0492\7j\2\2\u0492\u0493\5\u0120\u0091\2"+ + "\u0493\u00bb\3\2\2\2\u0494\u04a4\7i\2\2\u0495\u0497\5\u00be`\2\u0496\u0495"+ + "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u049a\7n\2\2\u0499"+ "\u049b\5\u00c0a\2\u049a\u0499\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u04a5"+ "\3\2\2\2\u049c\u049e\5\u00be`\2\u049d\u049c\3\2\2\2\u049d\u049e\3\2\2"+ - "\2\u049e\u049f\3\2\2\2\u049f\u04a0\7m\2\2\u04a0\u04a1\5\u00c0a\2\u04a1"+ - "\u04a2\7m\2\2\u04a2\u04a3\5\u00c2b\2\u04a3\u04a5\3\2\2\2\u04a4\u0496\3"+ - "\2\2\2\u04a4\u049d\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\7i\2\2\u04a7"+ + "\2\u049e\u049f\3\2\2\2\u049f\u04a0\7n\2\2\u04a0\u04a1\5\u00c0a\2\u04a1"+ + "\u04a2\7n\2\2\u04a2\u04a3\5\u00c2b\2\u04a3\u04a5\3\2\2\2\u04a4\u0496\3"+ + "\2\2\2\u04a4\u049d\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\7j\2\2\u04a7"+ "\u00bd\3\2\2\2\u04a8\u04a9\5\u0092J\2\u04a9\u00bf\3\2\2\2\u04aa\u04ab"+ "\5\u0092J\2\u04ab\u00c1\3\2\2\2\u04ac\u04ad\5\u0092J\2\u04ad\u00c3\3\2"+ "\2\2\u04ae\u04b0\t\20\2\2\u04af\u04ae\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0"+ - "\u04b1\3\2\2\2\u04b1\u04b2\7j\2\2\u04b2\u00c5\3\2\2\2\u04b3\u04b4\7V\2"+ - "\2\u04b4\u04b5\7c\2\2\u04b5\u00c7\3\2\2\2\u04b6\u04b7\5\u0150\u00a9\2"+ - "\u04b7\u00c9\3\2\2\2\u04b8\u04bc\5\u00ccg\2\u04b9\u04bc\5\u00d4k\2\u04ba"+ - "\u04bc\5\u00d8m\2\u04bb\u04b8\3\2\2\2\u04bb\u04b9\3\2\2\2\u04bb\u04ba"+ - "\3\2\2\2\u04bc\u00cb\3\2\2\2\u04bd\u04c9\7X\2\2\u04be\u04ca\5\u00ceh\2"+ - "\u04bf\u04c5\7d\2\2\u04c0\u04c1\5\u00ceh\2\u04c1\u04c2\5\u015e\u00b0\2"+ - "\u04c2\u04c4\3\2\2\2\u04c3\u04c0\3\2\2\2\u04c4\u04c7\3\2\2\2\u04c5\u04c3"+ - "\3\2\2\2\u04c5\u04c6\3\2\2\2\u04c6\u04c8\3\2\2\2\u04c7\u04c5\3\2\2\2\u04c8"+ - "\u04ca\7e\2\2\u04c9\u04be\3\2\2\2\u04c9\u04bf\3\2\2\2\u04ca\u00cd\3\2"+ - "\2\2\u04cb\u04d1\5\u00d0i\2\u04cc\u04ce\5\u00b0Y\2\u04cd\u04cc\3\2\2\2"+ - "\u04cd\u04ce\3\2\2\2\u04ce\u04cf\3\2\2\2\u04cf\u04d0\7j\2\2\u04d0\u04d2"+ - "\5\u00d2j\2\u04d1\u04cd\3\2\2\2\u04d1\u04d2\3\2\2\2\u04d2\u00cf\3\2\2"+ - "\2\u04d3\u04d8\7c\2\2\u04d4\u04d5\7k\2\2\u04d5\u04d7\7c\2\2\u04d6\u04d4"+ - "\3\2\2\2\u04d7\u04da\3\2\2\2\u04d8\u04d6\3\2\2\2\u04d8\u04d9\3\2\2\2\u04d9"+ - "\u00d1\3\2\2\2\u04da\u04d8\3\2\2\2\u04db\u04e0\5\u0092J\2\u04dc\u04dd"+ - "\7k\2\2\u04dd\u04df\5\u0092J\2\u04de\u04dc\3\2\2\2\u04df\u04e2\3\2\2\2"+ - "\u04e0\u04de\3\2\2\2\u04e0\u04e1\3\2\2\2\u04e1\u00d3\3\2\2\2\u04e2\u04e0"+ - "\3\2\2\2\u04e3\u04ef\7\\\2\2\u04e4\u04f0\5\u00d6l\2\u04e5\u04eb\7d\2\2"+ - "\u04e6\u04e7\5\u00d6l\2\u04e7\u04e8\5\u015e\u00b0\2\u04e8\u04ea\3\2\2"+ - "\2\u04e9\u04e6\3\2\2\2\u04ea\u04ed\3\2\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ec"+ - "\3\2\2\2\u04ec\u04ee\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ee\u04f0\7e\2\2\u04ef"+ - "\u04e4\3\2\2\2\u04ef\u04e5\3\2\2\2\u04f0\u00d5\3\2\2\2\u04f1\u04f3\7c"+ - "\2\2\u04f2\u04f4\7j\2\2\u04f3\u04f2\3\2\2\2\u04f3\u04f4\3\2\2\2\u04f4"+ - "\u04f5\3\2\2\2\u04f5\u04f6\5\u00b0Y\2\u04f6\u00d7\3\2\2\2\u04f7\u0503"+ - "\7a\2\2\u04f8\u0504\5\u0084C\2\u04f9\u04ff\7d\2\2\u04fa\u04fb\5\u0084"+ - "C\2\u04fb\u04fc\5\u015e\u00b0\2\u04fc\u04fe\3\2\2\2\u04fd\u04fa\3\2\2"+ - "\2\u04fe\u0501\3\2\2\2\u04ff\u04fd\3\2\2\2\u04ff\u0500\3\2\2\2\u0500\u0502"+ - "\3\2\2\2\u0501\u04ff\3\2\2\2\u0502\u0504\7e\2\2\u0503\u04f8\3\2\2\2\u0503"+ - "\u04f9\3\2\2\2\u0504\u00d9\3\2\2\2\u0505\u0507\7f\2\2\u0506\u0508\5\u00dc"+ - "o\2\u0507\u0506\3\2\2\2\u0507\u0508\3\2\2\2\u0508\u0509\3\2\2\2\u0509"+ - "\u050a\7g\2\2\u050a\u00db\3\2\2\2\u050b\u050d\5\u015e\u00b0\2\u050c\u050b"+ - "\3\2\2\2\u050c\u050d\3\2\2\2\u050d\u050e\3\2\2\2\u050e\u050f\5\u0094K"+ - "\2\u050f\u0510\5\u015e\u00b0\2\u0510\u0512\3\2\2\2\u0511\u050c\3\2\2\2"+ - "\u0512\u0513\3\2\2\2\u0513\u0511\3\2\2\2\u0513\u0514\3\2\2\2\u0514\u00dd"+ - "\3\2\2\2\u0515\u051b\5\u00e2r\2\u0516\u051b\5\u00e4s\2\u0517\u051b\5\u00e6"+ - "t\2\u0518\u051b\5\u00e0q\2\u0519\u051b\5\u0086D\2\u051a\u0515\3\2\2\2"+ - "\u051a\u0516\3\2\2\2\u051a\u0517\3\2\2\2\u051a\u0518\3\2\2\2\u051a\u0519"+ - "\3\2\2\2\u051b\u00df\3\2\2\2\u051c\u051d\5\u0092J\2\u051d\u00e1\3\2\2"+ - "\2\u051e\u051f\5\u0092J\2\u051f\u0520\7\u0087\2\2\u0520\u0521\5\u0092"+ - "J\2\u0521\u00e3\3\2\2\2\u0522\u0523\5\u0092J\2\u0523\u0524\t\21\2\2\u0524"+ - "\u00e5\3\2\2\2\u0525\u0526\5\u00d2j\2\u0526\u0527\5\u00c4c\2\u0527\u0528"+ - "\5\u00d2j\2\u0528\u00e7\3\2\2\2\u0529\u052a\t\22\2\2\u052a\u00e9\3\2\2"+ - "\2\u052b\u052c\7c\2\2\u052c\u052e\7m\2\2\u052d\u052f\5\u0094K\2\u052e"+ - "\u052d\3\2\2\2\u052e\u052f\3\2\2\2\u052f\u00eb\3\2\2\2\u0530\u0532\7`"+ - "\2\2\u0531\u0533\5\u00d2j\2\u0532\u0531\3\2\2\2\u0532\u0533\3\2\2\2\u0533"+ - "\u00ed\3\2\2\2\u0534\u0536\7I\2\2\u0535\u0537\7c\2\2\u0536\u0535\3\2\2"+ - "\2\u0536\u0537\3\2\2\2\u0537\u00ef\3\2\2\2\u0538\u053a\7]\2\2\u0539\u053b"+ - "\7c\2\2\u053a\u0539\3\2\2\2\u053a\u053b\3\2\2\2\u053b\u00f1\3\2\2\2\u053c"+ - "\u053d\7U\2\2\u053d\u053e\7c\2\2\u053e\u00f3\3\2\2\2\u053f\u0540\7Y\2"+ - "\2\u0540\u00f5\3\2\2\2\u0541\u054a\7Z\2\2\u0542\u054b\5\u0092J\2\u0543"+ - "\u0544\5\u015e\u00b0\2\u0544\u0545\5\u0092J\2\u0545\u054b\3\2\2\2\u0546"+ - "\u0547\5\u00dep\2\u0547\u0548\5\u015e\u00b0\2\u0548\u0549\5\u0092J\2\u0549"+ - "\u054b\3\2\2\2\u054a\u0542\3\2\2\2\u054a\u0543\3\2\2\2\u054a\u0546\3\2"+ - "\2\2\u054b\u054c\3\2\2\2\u054c\u0552\5\u00dan\2\u054d\u0550\7T\2\2\u054e"+ - "\u0551\5\u00f6|\2\u054f\u0551\5\u00dan\2\u0550\u054e\3\2\2\2\u0550\u054f"+ - "\3\2\2\2\u0551\u0553\3\2\2\2\u0552\u054d\3\2\2\2\u0552\u0553\3\2\2\2\u0553"+ - "\u00f7\3\2\2\2\u0554\u0557\5\u00fa~\2\u0555\u0557\5\u0100\u0081\2\u0556"+ - "\u0554\3\2\2\2\u0556\u0555\3\2\2\2\u0557\u00f9\3\2\2\2\u0558\u0563\7W"+ - "\2\2\u0559\u055b\5\u0092J\2\u055a\u0559\3\2\2\2\u055a\u055b\3\2\2\2\u055b"+ - "\u0564\3\2\2\2\u055c\u055e\5\u00dep\2\u055d\u055c\3\2\2\2\u055d\u055e"+ - "\3\2\2\2\u055e\u055f\3\2\2\2\u055f\u0561\5\u015e\u00b0\2\u0560\u0562\5"+ - "\u0092J\2\u0561\u0560\3\2\2\2\u0561\u0562\3\2\2\2\u0562\u0564\3\2\2\2"+ - "\u0563\u055a\3\2\2\2\u0563\u055d\3\2\2\2\u0564\u0565\3\2\2\2\u0565\u0569"+ - "\7f\2\2\u0566\u0568\5\u00fc\177\2\u0567\u0566\3\2\2\2\u0568\u056b\3\2"+ - "\2\2\u0569\u0567\3\2\2\2\u0569\u056a\3\2\2\2\u056a\u056c\3\2\2\2\u056b"+ - "\u0569\3\2\2\2\u056c\u056d\7g\2\2\u056d\u00fb\3\2\2\2\u056e\u056f\5\u00fe"+ - "\u0080\2\u056f\u0571\7m\2\2\u0570\u0572\5\u00dco\2\u0571\u0570\3\2\2\2"+ - "\u0571\u0572\3\2\2\2\u0572\u00fd\3\2\2\2\u0573\u0574\7N\2\2\u0574\u0577"+ - "\5\u00d2j\2\u0575\u0577\7J\2\2\u0576\u0573\3\2\2\2\u0576\u0575\3\2\2\2"+ - "\u0577\u00ff\3\2\2\2\u0578\u0581\7W\2\2\u0579\u0582\5\u0102\u0082\2\u057a"+ - "\u057b\5\u015e\u00b0\2\u057b\u057c\5\u0102\u0082\2\u057c\u0582\3\2\2\2"+ - "\u057d\u057e\5\u00dep\2\u057e\u057f\5\u015e\u00b0\2\u057f\u0580\5\u0102"+ - "\u0082\2\u0580\u0582\3\2\2\2\u0581\u0579\3\2\2\2\u0581\u057a\3\2\2\2\u0581"+ - "\u057d\3\2\2\2\u0582\u0583\3\2\2\2\u0583\u0587\7f\2\2\u0584\u0586\5\u0104"+ - "\u0083\2\u0585\u0584\3\2\2\2\u0586\u0589\3\2\2\2\u0587\u0585\3\2\2\2\u0587"+ - "\u0588\3\2\2\2\u0588\u058a\3\2\2\2\u0589\u0587\3\2\2\2\u058a\u058b\7g"+ - "\2\2\u058b\u0101\3\2\2\2\u058c\u058d\7c\2\2\u058d\u058f\7q\2\2\u058e\u058c"+ - "\3\2\2\2\u058e\u058f\3\2\2\2\u058f\u0590\3\2\2\2\u0590\u0591\5\u00a2R"+ - "\2\u0591\u0592\7n\2\2\u0592\u0593\7d\2\2\u0593\u0594\7\\\2\2\u0594\u0595"+ - "\7e\2\2\u0595\u0103\3\2\2\2\u0596\u0597\5\u0106\u0084\2\u0597\u0599\7"+ - "m\2\2\u0598\u059a\5\u00dco\2\u0599\u0598\3\2\2\2\u0599\u059a\3\2\2\2\u059a"+ - "\u0105\3\2\2\2\u059b\u059c\7N\2\2\u059c\u059f\5\u0108\u0085\2\u059d\u059f"+ - "\7J\2\2\u059e\u059b\3\2\2\2\u059e\u059d\3\2\2\2\u059f\u0107\3\2\2\2\u05a0"+ - "\u05a3\5\u00b0Y\2\u05a1\u05a3\7b\2\2\u05a2\u05a0\3\2\2\2\u05a2\u05a1\3"+ - "\2\2\2\u05a3\u05ab\3\2\2\2\u05a4\u05a7\7k\2\2\u05a5\u05a8\5\u00b0Y\2\u05a6"+ - "\u05a8\7b\2\2\u05a7\u05a5\3\2\2\2\u05a7\u05a6\3\2\2\2\u05a8\u05aa\3\2"+ - "\2\2\u05a9\u05a4\3\2\2\2\u05aa\u05ad\3\2\2\2\u05ab\u05a9\3\2\2\2\u05ab"+ - "\u05ac\3\2\2\2\u05ac\u0109\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05af\7M"+ - "\2\2\u05af\u05b3\7f\2\2\u05b0\u05b2\5\u010c\u0087\2\u05b1\u05b0\3\2\2"+ - "\2\u05b2\u05b5\3\2\2\2\u05b3\u05b1\3\2\2\2\u05b3\u05b4\3\2\2\2\u05b4\u05b6"+ - "\3\2\2\2\u05b5\u05b3\3\2\2\2\u05b6\u05b7\7g\2\2\u05b7\u010b\3\2\2\2\u05b8"+ - "\u05b9\5\u010e\u0088\2\u05b9\u05bb\7m\2\2\u05ba\u05bc\5\u00dco\2\u05bb"+ - "\u05ba\3\2\2\2\u05bb\u05bc\3\2\2\2\u05bc\u010d\3\2\2\2\u05bd\u05c0\7N"+ - "\2\2\u05be\u05c1\5\u00e2r\2\u05bf\u05c1\5\u0110\u0089\2\u05c0\u05be\3"+ - "\2\2\2\u05c0\u05bf\3\2\2\2\u05c1\u05c4\3\2\2\2\u05c2\u05c4\7J\2\2\u05c3"+ - "\u05bd\3\2\2\2\u05c3\u05c2\3\2\2\2\u05c4\u010f\3\2\2\2\u05c5\u05c6\5\u00d2"+ - "j\2\u05c6\u05c7\7j\2\2\u05c7\u05cc\3\2\2\2\u05c8\u05c9\5\u00d0i\2\u05c9"+ - "\u05ca\7q\2\2\u05ca\u05cc\3\2\2\2\u05cb\u05c5\3\2\2\2\u05cb\u05c8\3\2"+ - "\2\2\u05cb\u05cc\3\2\2\2\u05cc\u05cd\3\2\2\2\u05cd\u05ce\5\u0092J\2\u05ce"+ - "\u0111\3\2\2\2\u05cf\u05d3\7^\2\2\u05d0\u05d4\5\u0092J\2\u05d1\u05d4\5"+ - "\u0114\u008b\2\u05d2\u05d4\5\u0116\u008c\2\u05d3\u05d0\3\2\2\2\u05d3\u05d1"+ - "\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d3\u05d4\3\2\2\2\u05d4\u05d5\3\2\2\2\u05d5"+ - "\u05d6\5\u00dan\2\u05d6\u0113\3\2\2\2\u05d7\u05d9\5\u00dep\2\u05d8\u05d7"+ - "\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05dc\5\u015e\u00b0"+ - "\2\u05db\u05dd\5\u0092J\2\u05dc\u05db\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd"+ - "\u05de\3\2\2\2\u05de\u05e0\5\u015e\u00b0\2\u05df\u05e1\5\u00dep\2\u05e0"+ - "\u05df\3\2\2\2\u05e0\u05e1\3\2\2\2\u05e1\u0115\3\2\2\2\u05e2\u05e3\5\u00d2"+ - "j\2\u05e3\u05e4\7j\2\2\u05e4\u05e9\3\2\2\2\u05e5\u05e6\5\u00d0i\2\u05e6"+ - "\u05e7\7q\2\2\u05e7\u05e9\3\2\2\2\u05e8\u05e2\3\2\2\2\u05e8\u05e5\3\2"+ - "\2\2\u05e8\u05e9\3\2\2\2\u05e9\u05ea\3\2\2\2\u05ea\u05eb\7[\2\2\u05eb"+ - "\u05ec\5\u0092J\2\u05ec\u0117\3\2\2\2\u05ed\u05ee\7P\2\2\u05ee\u05ef\5"+ - "\u0092J\2\u05ef\u0119\3\2\2\2\u05f0\u05f3\5\u013e\u00a0\2\u05f1\u05f3"+ - "\7c\2\2\u05f2\u05f0\3\2\2\2\u05f2\u05f1\3\2\2\2\u05f3\u011b\3\2\2\2\u05f4"+ - "\u05f5\7h\2\2\u05f5\u05f6\5\u011e\u0090\2\u05f6\u05f7\7i\2\2\u05f7\u05f8"+ - "\5\u0120\u0091\2\u05f8\u011d\3\2\2\2\u05f9\u05fa\5\u0092J\2\u05fa\u011f"+ - "\3\2\2\2\u05fb\u05fc\5\u00b0Y\2\u05fc\u0121\3\2\2\2\u05fd\u05fe\7\u0085"+ - "\2\2\u05fe\u05ff\5\u00b0Y\2\u05ff\u0123\3\2\2\2\u0600\u0601\7h\2\2\u0601"+ - "\u0602\7i\2\2\u0602\u0603\5\u0120\u0091\2\u0603\u0125\3\2\2\2\u0604\u0605"+ - "\7Q\2\2\u0605\u0606\7h\2\2\u0606\u0607\5\u00b0Y\2\u0607\u0608\7i\2\2\u0608"+ - "\u0609\5\u0120\u0091\2\u0609\u0127\3\2\2\2\u060a\u0610\7S\2\2\u060b\u060c"+ - "\7S\2\2\u060c\u0610\7\u0087\2\2\u060d\u060e\7\u0087\2\2\u060e\u0610\7"+ - "S\2\2\u060f\u060a\3\2\2\2\u060f\u060b\3\2\2\2\u060f\u060d\3\2\2\2\u0610"+ - "\u0611\3\2\2\2\u0611\u0612\5\u0120\u0091\2\u0612\u0129\3\2\2\2\u0613\u0614"+ - "\7K\2\2\u0614\u0615\5\u012c\u0097\2\u0615\u012b\3\2\2\2\u0616\u0617\5"+ - "\u0130\u0099\2\u0617\u0618\5\u012e\u0098\2\u0618\u061b\3\2\2\2\u0619\u061b"+ - "\5\u0130\u0099\2\u061a\u0616\3\2\2\2\u061a\u0619\3\2\2\2\u061b\u012d\3"+ - "\2\2\2\u061c\u061f\5\u0130\u0099\2\u061d\u061f\5\u00b0Y\2\u061e\u061c"+ - "\3\2\2\2\u061e\u061d\3\2\2\2\u061f\u012f\3\2\2\2\u0620\u062c\7d\2\2\u0621"+ - "\u0626\5\u008aF\2\u0622\u0623\7k\2\2\u0623\u0625\5\u008aF\2\u0624\u0622"+ - "\3\2\2\2\u0625\u0628\3\2\2\2\u0626\u0624\3\2\2\2\u0626\u0627\3\2\2\2\u0627"+ - "\u062a\3\2\2\2\u0628\u0626\3\2\2\2\u0629\u062b\7k\2\2\u062a\u0629\3\2"+ - "\2\2\u062a\u062b\3\2\2\2\u062b\u062d\3\2\2\2\u062c\u0621\3\2\2\2\u062c"+ - "\u062d\3\2\2\2\u062d\u062e\3\2\2\2\u062e\u062f\7e\2\2\u062f\u0131\3\2"+ - "\2\2\u0630\u0631\5\u0134\u009b\2\u0631\u0632\7d\2\2\u0632\u0634\5\u0092"+ - "J\2\u0633\u0635\7k\2\2\u0634\u0633\3\2\2\2\u0634\u0635\3\2\2\2\u0635\u0636"+ - "\3\2\2\2\u0636\u0637\7e\2\2\u0637\u0133\3\2\2\2\u0638\u063e\5\u00b2Z\2"+ - "\u0639\u063a\7d\2\2\u063a\u063b\5\u0134\u009b\2\u063b\u063c\7e\2\2\u063c"+ - "\u063e\3\2\2\2\u063d\u0638\3\2\2\2\u063d\u0639\3\2\2\2\u063e\u0135\3\2"+ - "\2\2\u063f\u0646\5\u0138\u009d\2\u0640\u0646\5\u013c\u009f\2\u0641\u0642"+ - "\7d\2\2\u0642\u0643\5\u0092J\2\u0643\u0644\7e\2\2\u0644\u0646\3\2\2\2"+ - "\u0645\u063f\3\2\2\2\u0645\u0640\3\2\2\2\u0645\u0641\3\2\2\2\u0646\u0137"+ - "\3\2\2\2\u0647\u064b\5\u00a0Q\2\u0648\u064b\5\u0140\u00a1\2\u0649\u064b"+ - "\5\u00a4S\2\u064a\u0647\3\2\2\2\u064a\u0648\3\2\2\2\u064a\u0649\3\2\2"+ - "\2\u064b\u0139\3\2\2\2\u064c\u064d\t\23\2\2\u064d\u013b\3\2\2\2\u064e"+ - "\u064f\7c\2\2\u064f\u013d\3\2\2\2\u0650\u0651\7c\2\2\u0651\u0652\7n\2"+ - "\2\u0652\u0653\7c\2\2\u0653\u013f\3\2\2\2\u0654\u0655\5\u00b8]\2\u0655"+ - "\u0656\5\u0142\u00a2\2\u0656\u0141\3\2\2\2\u0657\u065c\7f\2\2\u0658\u065a"+ - "\5\u0144\u00a3\2\u0659\u065b\7k\2\2\u065a\u0659\3\2\2\2\u065a\u065b\3"+ - "\2\2\2\u065b\u065d\3\2\2\2\u065c\u0658\3\2\2\2\u065c\u065d\3\2\2\2\u065d"+ - "\u065e\3\2\2\2\u065e\u065f\7g\2\2\u065f\u0143\3\2\2\2\u0660\u0665\5\u0146"+ - "\u00a4\2\u0661\u0662\7k\2\2\u0662\u0664\5\u0146\u00a4\2\u0663\u0661\3"+ - "\2\2\2\u0664\u0667\3\2\2\2\u0665\u0663\3\2\2\2\u0665\u0666\3\2\2\2\u0666"+ - "\u0145\3\2\2\2\u0667\u0665\3\2\2\2\u0668\u0669\5\u0148\u00a5\2\u0669\u066a"+ - "\7m\2\2\u066a\u066c\3\2\2\2\u066b\u0668\3\2\2\2\u066b\u066c\3\2\2\2\u066c"+ - "\u066d\3\2\2\2\u066d\u066e\5\u014a\u00a6\2\u066e\u0147\3\2\2\2\u066f\u0672"+ - "\5\u0092J\2\u0670\u0672\5\u0142\u00a2\2\u0671\u066f\3\2\2\2\u0671\u0670"+ - "\3\2\2\2\u0672\u0149\3\2\2\2\u0673\u0676\5\u0092J\2\u0674\u0676\5\u0142"+ - "\u00a2\2\u0675\u0673\3\2\2\2\u0675\u0674\3\2\2\2\u0676\u014b\3\2\2\2\u0677"+ - "\u0678\7R\2\2\u0678\u067e\7f\2\2\u0679\u067a\5\u014e\u00a8\2\u067a\u067b"+ - "\5\u015e\u00b0\2\u067b\u067d\3\2\2\2\u067c\u0679\3\2\2\2\u067d\u0680\3"+ - "\2\2\2\u067e\u067c\3\2\2\2\u067e\u067f\3\2\2\2\u067f\u0681\3\2\2\2\u0680"+ - "\u067e\3\2\2\2\u0681\u0682\7g\2\2\u0682\u014d\3\2\2\2\u0683\u0684\5\u00d0"+ - "i\2\u0684\u0685\5\u00b0Y\2\u0685\u0688\3\2\2\2\u0686\u0688\5\u0152\u00aa"+ - "\2\u0687\u0683\3\2\2\2\u0687\u0686\3\2\2\2\u0688\u068a\3\2\2\2\u0689\u068b"+ - "\5\u0150\u00a9\2\u068a\u0689\3\2\2\2\u068a\u068b\3\2\2\2\u068b\u014f\3"+ - "\2\2\2\u068c\u068d\t\24\2\2\u068d\u0151\3\2\2\2\u068e\u0690\7\u0085\2"+ - "\2\u068f\u068e\3\2\2\2\u068f\u0690\3\2\2\2\u0690\u0691\3\2\2\2\u0691\u0692"+ - "\5\u011a\u008e\2\u0692\u0153\3\2\2\2\u0693\u0694\7h\2\2\u0694\u0695\5"+ - "\u0092J\2\u0695\u0696\7i\2\2\u0696\u0155\3\2\2\2\u0697\u0698\7n\2\2\u0698"+ - "\u0699\7d\2\2\u0699\u069a\5\u00b0Y\2\u069a\u069b\7e\2\2\u069b\u0157\3"+ - "\2\2\2\u069c\u06ab\7d\2\2\u069d\u06a4\5\u00d2j\2\u069e\u06a1\5\u0134\u009b"+ - "\2\u069f\u06a0\7k\2\2\u06a0\u06a2\5\u00d2j\2\u06a1\u069f\3\2\2\2\u06a1"+ - "\u06a2\3\2\2\2\u06a2\u06a4\3\2\2\2\u06a3\u069d\3\2\2\2\u06a3\u069e\3\2"+ - "\2\2\u06a4\u06a6\3\2\2\2\u06a5\u06a7\7r\2\2\u06a6\u06a5\3\2\2\2\u06a6"+ - "\u06a7\3\2\2\2\u06a7\u06a9\3\2\2\2\u06a8\u06aa\7k\2\2\u06a9\u06a8\3\2"+ - "\2\2\u06a9\u06aa\3\2\2\2\u06aa\u06ac\3\2\2\2\u06ab\u06a3\3\2\2\2\u06ab"+ - "\u06ac\3\2\2\2\u06ac\u06ad\3\2\2\2\u06ad\u06ae\7e\2\2\u06ae\u0159\3\2"+ - "\2\2\u06af\u06b0\5\u0134\u009b\2\u06b0\u06b1\7n\2\2\u06b1\u06b2\7c\2\2"+ - "\u06b2\u015b\3\2\2\2\u06b3\u06b4\5\u00b0Y\2\u06b4\u015d\3\2\2\2\u06b5"+ - "\u06ba\7l\2\2\u06b6\u06ba\7\2\2\3\u06b7\u06ba\7\u009d\2\2\u06b8\u06ba"+ - "\6\u00b0\24\2\u06b9\u06b5\3\2\2\2\u06b9\u06b6\3\2\2\2\u06b9\u06b7\3\2"+ - "\2\2\u06b9\u06b8\3\2\2\2\u06ba\u015f\3\2\2\2\u00b1\u016e\u0173\u017a\u0184"+ - "\u018a\u0190\u01a0\u01a4\u01ad\u01b9\u01bd\u01c3\u01cb\u01d5\u01e5\u01f3"+ - "\u01f7\u01fe\u0206\u020f\u022f\u0237\u024f\u0260\u026c\u0275\u0283\u0295"+ - "\u029c\u02a1\u02a6\u02b0\u02b3\u02b7\u02bb\u02c2\u02c5\u02cb\u02d0\u02d2"+ - "\u02d5\u02dc\u02e1\u02f4\u02fc\u0300\u0303\u0309\u030d\u0310\u031a\u0321"+ - "\u0328\u0334\u033a\u0341\u0346\u034c\u0358\u035e\u0362\u036a\u036e\u0374"+ - "\u0377\u037d\u0382\u0396\u03b9\u03bb\u03d2\u03da\u03e5\u03ec\u03f3\u03fd"+ - "\u040b\u0421\u0423\u042b\u042f\u0433\u0436\u043f\u0445\u044f\u0457\u045d"+ - "\u0466\u0471\u047c\u0480\u0482\u048d\u0496\u049a\u049d\u04a4\u04af\u04bb"+ - "\u04c5\u04c9\u04cd\u04d1\u04d8\u04e0\u04eb\u04ef\u04f3\u04ff\u0503\u0507"+ - "\u050c\u0513\u051a\u052e\u0532\u0536\u053a\u054a\u0550\u0552\u0556\u055a"+ - "\u055d\u0561\u0563\u0569\u0571\u0576\u0581\u0587\u058e\u0599\u059e\u05a2"+ - "\u05a7\u05ab\u05b3\u05bb\u05c0\u05c3\u05cb\u05d3\u05d8\u05dc\u05e0\u05e8"+ - "\u05f2\u060f\u061a\u061e\u0626\u062a\u062c\u0634\u063d\u0645\u064a\u065a"+ - "\u065c\u0665\u066b\u0671\u0675\u067e\u0687\u068a\u068f\u06a1\u06a3\u06a6"+ - "\u06a9\u06ab\u06b9"; + "\u04b1\3\2\2\2\u04b1\u04b2\7k\2\2\u04b2\u00c5\3\2\2\2\u04b3\u04b4\5\u00d4"+ + "k\2\u04b4\u04b5\7k\2\2\u04b5\u04ba\3\2\2\2\u04b6\u04b7\5\b\5\2\u04b7\u04b8"+ + "\7r\2\2\u04b8\u04ba\3\2\2\2\u04b9\u04b3\3\2\2\2\u04b9\u04b6\3\2\2\2\u04b9"+ + "\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bc\7\\\2\2\u04bc\u04c1\5\u0092"+ + "J\2\u04bd\u04bf\7I\2\2\u04be\u04c0\7d\2\2\u04bf\u04be\3\2\2\2\u04bf\u04c0"+ + "\3\2\2\2\u04c0\u04c2\3\2\2\2\u04c1\u04bd\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2"+ + "\u00c7\3\2\2\2\u04c3\u04c4\7W\2\2\u04c4\u04c5\7d\2\2\u04c5\u00c9\3\2\2"+ + "\2\u04c6\u04c7\5\u0150\u00a9\2\u04c7\u00cb\3\2\2\2\u04c8\u04cc\5\u00ce"+ + "h\2\u04c9\u04cc\5\u00d6l\2\u04ca\u04cc\5\u00dan\2\u04cb\u04c8\3\2\2\2"+ + "\u04cb\u04c9\3\2\2\2\u04cb\u04ca\3\2\2\2\u04cc\u00cd\3\2\2\2\u04cd\u04d9"+ + "\7Y\2\2\u04ce\u04da\5\u00d0i\2\u04cf\u04d5\7e\2\2\u04d0\u04d1\5\u00d0"+ + "i\2\u04d1\u04d2\5\u015e\u00b0\2\u04d2\u04d4\3\2\2\2\u04d3\u04d0\3\2\2"+ + "\2\u04d4\u04d7\3\2\2\2\u04d5\u04d3\3\2\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d8"+ + "\3\2\2\2\u04d7\u04d5\3\2\2\2\u04d8\u04da\7f\2\2\u04d9\u04ce\3\2\2\2\u04d9"+ + "\u04cf\3\2\2\2\u04da\u00cf\3\2\2\2\u04db\u04e1\5\u00d2j\2\u04dc\u04de"+ + "\5\u00b0Y\2\u04dd\u04dc\3\2\2\2\u04dd\u04de\3\2\2\2\u04de\u04df\3\2\2"+ + "\2\u04df\u04e0\7k\2\2\u04e0\u04e2\5\u00d4k\2\u04e1\u04dd\3\2\2\2\u04e1"+ + "\u04e2\3\2\2\2\u04e2\u00d1\3\2\2\2\u04e3\u04e8\7d\2\2\u04e4\u04e5\7l\2"+ + "\2\u04e5\u04e7\7d\2\2\u04e6\u04e4\3\2\2\2\u04e7\u04ea\3\2\2\2\u04e8\u04e6"+ + "\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9\u00d3\3\2\2\2\u04ea\u04e8\3\2\2\2\u04eb"+ + "\u04f0\5\u0092J\2\u04ec\u04ed\7l\2\2\u04ed\u04ef\5\u0092J\2\u04ee\u04ec"+ + "\3\2\2\2\u04ef\u04f2\3\2\2\2\u04f0\u04ee\3\2\2\2\u04f0\u04f1\3\2\2\2\u04f1"+ + "\u00d5\3\2\2\2\u04f2\u04f0\3\2\2\2\u04f3\u04ff\7]\2\2\u04f4\u0500\5\u00d8"+ + "m\2\u04f5\u04fb\7e\2\2\u04f6\u04f7\5\u00d8m\2\u04f7\u04f8\5\u015e\u00b0"+ + "\2\u04f8\u04fa\3\2\2\2\u04f9\u04f6\3\2\2\2\u04fa\u04fd\3\2\2\2\u04fb\u04f9"+ + "\3\2\2\2\u04fb\u04fc\3\2\2\2\u04fc\u04fe\3\2\2\2\u04fd\u04fb\3\2\2\2\u04fe"+ + "\u0500\7f\2\2\u04ff\u04f4\3\2\2\2\u04ff\u04f5\3\2\2\2\u0500\u00d7\3\2"+ + "\2\2\u0501\u0503\7d\2\2\u0502\u0504\7k\2\2\u0503\u0502\3\2\2\2\u0503\u0504"+ + "\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u0506\5\u00b0Y\2\u0506\u00d9\3\2\2"+ + "\2\u0507\u0513\7b\2\2\u0508\u0514\5\u0084C\2\u0509\u050f\7e\2\2\u050a"+ + "\u050b\5\u0084C\2\u050b\u050c\5\u015e\u00b0\2\u050c\u050e\3\2\2\2\u050d"+ + "\u050a\3\2\2\2\u050e\u0511\3\2\2\2\u050f\u050d\3\2\2\2\u050f\u0510\3\2"+ + "\2\2\u0510\u0512\3\2\2\2\u0511\u050f\3\2\2\2\u0512\u0514\7f\2\2\u0513"+ + "\u0508\3\2\2\2\u0513\u0509\3\2\2\2\u0514\u00db\3\2\2\2\u0515\u0517\7g"+ + "\2\2\u0516\u0518\5\u00dep\2\u0517\u0516\3\2\2\2\u0517\u0518\3\2\2\2\u0518"+ + "\u0519\3\2\2\2\u0519\u051a\7h\2\2\u051a\u00dd\3\2\2\2\u051b\u051d\5\u015e"+ + "\u00b0\2\u051c\u051b\3\2\2\2\u051c\u051d\3\2\2\2\u051d\u051e\3\2\2\2\u051e"+ + "\u051f\5\u0094K\2\u051f\u0520\5\u015e\u00b0\2\u0520\u0522\3\2\2\2\u0521"+ + "\u051c\3\2\2\2\u0522\u0523\3\2\2\2\u0523\u0521\3\2\2\2\u0523\u0524\3\2"+ + "\2\2\u0524\u00df\3\2\2\2\u0525\u052b\5\u00e4s\2\u0526\u052b\5\u00e6t\2"+ + "\u0527\u052b\5\u00e8u\2\u0528\u052b\5\u00e2r\2\u0529\u052b\5\u0086D\2"+ + "\u052a\u0525\3\2\2\2\u052a\u0526\3\2\2\2\u052a\u0527\3\2\2\2\u052a\u0528"+ + "\3\2\2\2\u052a\u0529\3\2\2\2\u052b\u00e1\3\2\2\2\u052c\u052d\5\u0092J"+ + "\2\u052d\u00e3\3\2\2\2\u052e\u052f\5\u0092J\2\u052f\u0530\7\u0088\2\2"+ + "\u0530\u0531\5\u0092J\2\u0531\u00e5\3\2\2\2\u0532\u0533\5\u0092J\2\u0533"+ + "\u0534\t\21\2\2\u0534\u00e7\3\2\2\2\u0535\u0536\5\u00d4k\2\u0536\u0537"+ + "\5\u00c4c\2\u0537\u0538\5\u00d4k\2\u0538\u00e9\3\2\2\2\u0539\u053a\t\22"+ + "\2\2\u053a\u00eb\3\2\2\2\u053b\u053c\7d\2\2\u053c\u053e\7n\2\2\u053d\u053f"+ + "\5\u0094K\2\u053e\u053d\3\2\2\2\u053e\u053f\3\2\2\2\u053f\u00ed\3\2\2"+ + "\2\u0540\u0542\7a\2\2\u0541\u0543\5\u00d4k\2\u0542\u0541\3\2\2\2\u0542"+ + "\u0543\3\2\2\2\u0543\u00ef\3\2\2\2\u0544\u0546\7J\2\2\u0545\u0547\7d\2"+ + "\2\u0546\u0545\3\2\2\2\u0546\u0547\3\2\2\2\u0547\u00f1\3\2\2\2\u0548\u054a"+ + "\7^\2\2\u0549\u054b\7d\2\2\u054a\u0549\3\2\2\2\u054a\u054b\3\2\2\2\u054b"+ + "\u00f3\3\2\2\2\u054c\u054d\7V\2\2\u054d\u054e\7d\2\2\u054e\u00f5\3\2\2"+ + "\2\u054f\u0550\7Z\2\2\u0550\u00f7\3\2\2\2\u0551\u055a\7[\2\2\u0552\u055b"+ + "\5\u0092J\2\u0553\u0554\5\u015e\u00b0\2\u0554\u0555\5\u0092J\2\u0555\u055b"+ + "\3\2\2\2\u0556\u0557\5\u00e0q\2\u0557\u0558\5\u015e\u00b0\2\u0558\u0559"+ + "\5\u0092J\2\u0559\u055b\3\2\2\2\u055a\u0552\3\2\2\2\u055a\u0553\3\2\2"+ + "\2\u055a\u0556\3\2\2\2\u055b\u055c\3\2\2\2\u055c\u0562\5\u00dco\2\u055d"+ + "\u0560\7U\2\2\u055e\u0561\5\u00f8}\2\u055f\u0561\5\u00dco\2\u0560\u055e"+ + "\3\2\2\2\u0560\u055f\3\2\2\2\u0561\u0563\3\2\2\2\u0562\u055d\3\2\2\2\u0562"+ + "\u0563\3\2\2\2\u0563\u00f9\3\2\2\2\u0564\u0567\5\u00fc\177\2\u0565\u0567"+ + "\5\u0102\u0082\2\u0566\u0564\3\2\2\2\u0566\u0565\3\2\2\2\u0567\u00fb\3"+ + "\2\2\2\u0568\u0573\7X\2\2\u0569\u056b\5\u0092J\2\u056a\u0569\3\2\2\2\u056a"+ + "\u056b\3\2\2\2\u056b\u0574\3\2\2\2\u056c\u056e\5\u00e0q\2\u056d\u056c"+ + "\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u056f\3\2\2\2\u056f\u0571\5\u015e\u00b0"+ + "\2\u0570\u0572\5\u0092J\2\u0571\u0570\3\2\2\2\u0571\u0572\3\2\2\2\u0572"+ + "\u0574\3\2\2\2\u0573\u056a\3\2\2\2\u0573\u056d\3\2\2\2\u0574\u0575\3\2"+ + "\2\2\u0575\u0579\7g\2\2\u0576\u0578\5\u00fe\u0080\2\u0577\u0576\3\2\2"+ + "\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2\2\2\u057a\u057c"+ + "\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057d\7h\2\2\u057d\u00fd\3\2\2\2\u057e"+ + "\u057f\5\u0100\u0081\2\u057f\u0581\7n\2\2\u0580\u0582\5\u00dep\2\u0581"+ + "\u0580\3\2\2\2\u0581\u0582\3\2\2\2\u0582\u00ff\3\2\2\2\u0583\u0584\7O"+ + "\2\2\u0584\u0587\5\u00d4k\2\u0585\u0587\7K\2\2\u0586\u0583\3\2\2\2\u0586"+ + "\u0585\3\2\2\2\u0587\u0101\3\2\2\2\u0588\u0591\7X\2\2\u0589\u0592\5\u0104"+ + "\u0083\2\u058a\u058b\5\u015e\u00b0\2\u058b\u058c\5\u0104\u0083\2\u058c"+ + "\u0592\3\2\2\2\u058d\u058e\5\u00e0q\2\u058e\u058f\5\u015e\u00b0\2\u058f"+ + "\u0590\5\u0104\u0083\2\u0590\u0592\3\2\2\2\u0591\u0589\3\2\2\2\u0591\u058a"+ + "\3\2\2\2\u0591\u058d\3\2\2\2\u0592\u0593\3\2\2\2\u0593\u0597\7g\2\2\u0594"+ + "\u0596\5\u0106\u0084\2\u0595\u0594\3\2\2\2\u0596\u0599\3\2\2\2\u0597\u0595"+ + "\3\2\2\2\u0597\u0598\3\2\2\2\u0598\u059a\3\2\2\2\u0599\u0597\3\2\2\2\u059a"+ + "\u059b\7h\2\2\u059b\u0103\3\2\2\2\u059c\u059d\7d\2\2\u059d\u059f\7r\2"+ + "\2\u059e\u059c\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u05a0\3\2\2\2\u05a0\u05a1"+ + "\5\u00a2R\2\u05a1\u05a2\7o\2\2\u05a2\u05a3\7e\2\2\u05a3\u05a4\7]\2\2\u05a4"+ + "\u05a5\7f\2\2\u05a5\u0105\3\2\2\2\u05a6\u05a7\5\u0108\u0085\2\u05a7\u05a9"+ + "\7n\2\2\u05a8\u05aa\5\u00dep\2\u05a9\u05a8\3\2\2\2\u05a9\u05aa\3\2\2\2"+ + "\u05aa\u0107\3\2\2\2\u05ab\u05ac\7O\2\2\u05ac\u05af\5\u010a\u0086\2\u05ad"+ + "\u05af\7K\2\2\u05ae\u05ab\3\2\2\2\u05ae\u05ad\3\2\2\2\u05af\u0109\3\2"+ + "\2\2\u05b0\u05b3\5\u00b0Y\2\u05b1\u05b3\7c\2\2\u05b2\u05b0\3\2\2\2\u05b2"+ + "\u05b1\3\2\2\2\u05b3\u05bb\3\2\2\2\u05b4\u05b7\7l\2\2\u05b5\u05b8\5\u00b0"+ + "Y\2\u05b6\u05b8\7c\2\2\u05b7\u05b5\3\2\2\2\u05b7\u05b6\3\2\2\2\u05b8\u05ba"+ + "\3\2\2\2\u05b9\u05b4\3\2\2\2\u05ba\u05bd\3\2\2\2\u05bb\u05b9\3\2\2\2\u05bb"+ + "\u05bc\3\2\2\2\u05bc\u010b\3\2\2\2\u05bd\u05bb\3\2\2\2\u05be\u05bf\7N"+ + "\2\2\u05bf\u05c3\7g\2\2\u05c0\u05c2\5\u010e\u0088\2\u05c1\u05c0\3\2\2"+ + "\2\u05c2\u05c5\3\2\2\2\u05c3\u05c1\3\2\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05c6"+ + "\3\2\2\2\u05c5\u05c3\3\2\2\2\u05c6\u05c7\7h\2\2\u05c7\u010d\3\2\2\2\u05c8"+ + "\u05c9\5\u0110\u0089\2\u05c9\u05cb\7n\2\2\u05ca\u05cc\5\u00dep\2\u05cb"+ + "\u05ca\3\2\2\2\u05cb\u05cc\3\2\2\2\u05cc\u010f\3\2\2\2\u05cd\u05d0\7O"+ + "\2\2\u05ce\u05d1\5\u00e4s\2\u05cf\u05d1\5\u0112\u008a\2\u05d0\u05ce\3"+ + "\2\2\2\u05d0\u05cf\3\2\2\2\u05d1\u05d4\3\2\2\2\u05d2\u05d4\7K\2\2\u05d3"+ + "\u05cd\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d4\u0111\3\2\2\2\u05d5\u05d6\5\u00d4"+ + "k\2\u05d6\u05d7\7k\2\2\u05d7\u05dc\3\2\2\2\u05d8\u05d9\5\u00d2j\2\u05d9"+ + "\u05da\7r\2\2\u05da\u05dc\3\2\2\2\u05db\u05d5\3\2\2\2\u05db\u05d8\3\2"+ + "\2\2\u05db\u05dc\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd\u05de\5\u0092J\2\u05de"+ + "\u0113\3\2\2\2\u05df\u05e3\7_\2\2\u05e0\u05e4\5\u0092J\2\u05e1\u05e4\5"+ + "\u0116\u008c\2\u05e2\u05e4\5\u00c6d\2\u05e3\u05e0\3\2\2\2\u05e3\u05e1"+ + "\3\2\2\2\u05e3\u05e2\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4\u05e5\3\2\2\2\u05e5"+ + "\u05e6\5\u00dco\2\u05e6\u0115\3\2\2\2\u05e7\u05e9\5\u00e0q\2\u05e8\u05e7"+ + "\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9\u05ea\3\2\2\2\u05ea\u05ec\5\u015e\u00b0"+ + "\2\u05eb\u05ed\5\u0092J\2\u05ec\u05eb\3\2\2\2\u05ec\u05ed\3\2\2\2\u05ed"+ + "\u05ee\3\2\2\2\u05ee\u05f0\5\u015e\u00b0\2\u05ef\u05f1\5\u00e0q\2\u05f0"+ + "\u05ef\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u0117\3\2\2\2\u05f2\u05f3\7Q"+ + "\2\2\u05f3\u05f4\5\u0092J\2\u05f4\u0119\3\2\2\2\u05f5\u05f8\5\u013e\u00a0"+ + "\2\u05f6\u05f8\7d\2\2\u05f7\u05f5\3\2\2\2\u05f7\u05f6\3\2\2\2\u05f8\u011b"+ + "\3\2\2\2\u05f9\u05fa\7i\2\2\u05fa\u05fb\5\u011e\u0090\2\u05fb\u05fc\7"+ + "j\2\2\u05fc\u05fd\5\u0120\u0091\2\u05fd\u011d\3\2\2\2\u05fe\u05ff\5\u0092"+ + "J\2\u05ff\u011f\3\2\2\2\u0600\u0601\5\u00b0Y\2\u0601\u0121\3\2\2\2\u0602"+ + "\u0603\7\u0086\2\2\u0603\u0604\5\u00b0Y\2\u0604\u0123\3\2\2\2\u0605\u0606"+ + "\7i\2\2\u0606\u0607\7j\2\2\u0607\u0608\5\u0120\u0091\2\u0608\u0125\3\2"+ + "\2\2\u0609\u060a\7R\2\2\u060a\u060b\7i\2\2\u060b\u060c\5\u00b0Y\2\u060c"+ + "\u060d\7j\2\2\u060d\u060e\5\u0120\u0091\2\u060e\u0127\3\2\2\2\u060f\u0615"+ + "\7T\2\2\u0610\u0611\7T\2\2\u0611\u0615\7\u0088\2\2\u0612\u0613\7\u0088"+ + "\2\2\u0613\u0615\7T\2\2\u0614\u060f\3\2\2\2\u0614\u0610\3\2\2\2\u0614"+ + "\u0612\3\2\2\2\u0615\u0616\3\2\2\2\u0616\u0617\5\u0120\u0091\2\u0617\u0129"+ + "\3\2\2\2\u0618\u0619\7L\2\2\u0619\u061a\5\u012c\u0097\2\u061a\u012b\3"+ + "\2\2\2\u061b\u061c\5\u0130\u0099\2\u061c\u061d\5\u012e\u0098\2\u061d\u0620"+ + "\3\2\2\2\u061e\u0620\5\u0130\u0099\2\u061f\u061b\3\2\2\2\u061f\u061e\3"+ + "\2\2\2\u0620\u012d\3\2\2\2\u0621\u0624\5\u0130\u0099\2\u0622\u0624\5\u00b0"+ + "Y\2\u0623\u0621\3\2\2\2\u0623\u0622\3\2\2\2\u0624\u012f\3\2\2\2\u0625"+ + "\u0631\7e\2\2\u0626\u062b\5\u008aF\2\u0627\u0628\7l\2\2\u0628\u062a\5"+ + "\u008aF\2\u0629\u0627\3\2\2\2\u062a\u062d\3\2\2\2\u062b\u0629\3\2\2\2"+ + "\u062b\u062c\3\2\2\2\u062c\u062f\3\2\2\2\u062d\u062b\3\2\2\2\u062e\u0630"+ + "\7l\2\2\u062f\u062e\3\2\2\2\u062f\u0630\3\2\2\2\u0630\u0632\3\2\2\2\u0631"+ + "\u0626\3\2\2\2\u0631\u0632\3\2\2\2\u0632\u0633\3\2\2\2\u0633\u0634\7f"+ + "\2\2\u0634\u0131\3\2\2\2\u0635\u0636\5\u0134\u009b\2\u0636\u0637\7e\2"+ + "\2\u0637\u0639\5\u0092J\2\u0638\u063a\7l\2\2\u0639\u0638\3\2\2\2\u0639"+ + "\u063a\3\2\2\2\u063a\u063b\3\2\2\2\u063b\u063c\7f\2\2\u063c\u0133\3\2"+ + "\2\2\u063d\u0643\5\u00b2Z\2\u063e\u063f\7e\2\2\u063f\u0640\5\u0134\u009b"+ + "\2\u0640\u0641\7f\2\2\u0641\u0643\3\2\2\2\u0642\u063d\3\2\2\2\u0642\u063e"+ + "\3\2\2\2\u0643\u0135\3\2\2\2\u0644\u064b\5\u0138\u009d\2\u0645\u064b\5"+ + "\u013c\u009f\2\u0646\u0647\7e\2\2\u0647\u0648\5\u0092J\2\u0648\u0649\7"+ + "f\2\2\u0649\u064b\3\2\2\2\u064a\u0644\3\2\2\2\u064a\u0645\3\2\2\2\u064a"+ + "\u0646\3\2\2\2\u064b\u0137\3\2\2\2\u064c\u0650\5\u00a0Q\2\u064d\u0650"+ + "\5\u0140\u00a1\2\u064e\u0650\5\u00a4S\2\u064f\u064c\3\2\2\2\u064f\u064d"+ + "\3\2\2\2\u064f\u064e\3\2\2\2\u0650\u0139\3\2\2\2\u0651\u0652\t\23\2\2"+ + "\u0652\u013b\3\2\2\2\u0653\u0654\7d\2\2\u0654\u013d\3\2\2\2\u0655\u0656"+ + "\7d\2\2\u0656\u0657\7o\2\2\u0657\u0658\7d\2\2\u0658\u013f\3\2\2\2\u0659"+ + "\u065a\5\u00b8]\2\u065a\u065b\5\u0142\u00a2\2\u065b\u0141\3\2\2\2\u065c"+ + "\u0661\7g\2\2\u065d\u065f\5\u0144\u00a3\2\u065e\u0660\7l\2\2\u065f\u065e"+ + "\3\2\2\2\u065f\u0660\3\2\2\2\u0660\u0662\3\2\2\2\u0661\u065d\3\2\2\2\u0661"+ + "\u0662\3\2\2\2\u0662\u0663\3\2\2\2\u0663\u0664\7h\2\2\u0664\u0143\3\2"+ + "\2\2\u0665\u066a\5\u0146\u00a4\2\u0666\u0667\7l\2\2\u0667\u0669\5\u0146"+ + "\u00a4\2\u0668\u0666\3\2\2\2\u0669\u066c\3\2\2\2\u066a\u0668\3\2\2\2\u066a"+ + "\u066b\3\2\2\2\u066b\u0145\3\2\2\2\u066c\u066a\3\2\2\2\u066d\u066e\5\u0148"+ + "\u00a5\2\u066e\u066f\7n\2\2\u066f\u0671\3\2\2\2\u0670\u066d\3\2\2\2\u0670"+ + "\u0671\3\2\2\2\u0671\u0672\3\2\2\2\u0672\u0673\5\u014a\u00a6\2\u0673\u0147"+ + "\3\2\2\2\u0674\u0677\5\u0092J\2\u0675\u0677\5\u0142\u00a2\2\u0676\u0674"+ + "\3\2\2\2\u0676\u0675\3\2\2\2\u0677\u0149\3\2\2\2\u0678\u067b\5\u0092J"+ + "\2\u0679\u067b\5\u0142\u00a2\2\u067a\u0678\3\2\2\2\u067a\u0679\3\2\2\2"+ + "\u067b\u014b\3\2\2\2\u067c\u067d\7S\2\2\u067d\u0683\7g\2\2\u067e\u067f"+ + "\5\u014e\u00a8\2\u067f\u0680\5\u015e\u00b0\2\u0680\u0682\3\2\2\2\u0681"+ + "\u067e\3\2\2\2\u0682\u0685\3\2\2\2\u0683\u0681\3\2\2\2\u0683\u0684\3\2"+ + "\2\2\u0684\u0686\3\2\2\2\u0685\u0683\3\2\2\2\u0686\u0687\7h\2\2\u0687"+ + "\u014d\3\2\2\2\u0688\u0689\5\u00d2j\2\u0689\u068a\5\u00b0Y\2\u068a\u068d"+ + "\3\2\2\2\u068b\u068d\5\u0152\u00aa\2\u068c\u0688\3\2\2\2\u068c\u068b\3"+ + "\2\2\2\u068d\u068f\3\2\2\2\u068e\u0690\5\u0150\u00a9\2\u068f\u068e\3\2"+ + "\2\2\u068f\u0690\3\2\2\2\u0690\u014f\3\2\2\2\u0691\u0692\t\24\2\2\u0692"+ + "\u0151\3\2\2\2\u0693\u0695\7\u0086\2\2\u0694\u0693\3\2\2\2\u0694\u0695"+ + "\3\2\2\2\u0695\u0696\3\2\2\2\u0696\u0697\5\u011a\u008e\2\u0697\u0153\3"+ + "\2\2\2\u0698\u0699\7i\2\2\u0699\u069a\5\u0092J\2\u069a\u069b\7j\2\2\u069b"+ + "\u0155\3\2\2\2\u069c\u069d\7o\2\2\u069d\u069e\7e\2\2\u069e\u069f\5\u00b0"+ + "Y\2\u069f\u06a0\7f\2\2\u06a0\u0157\3\2\2\2\u06a1\u06b0\7e\2\2\u06a2\u06a9"+ + "\5\u00d4k\2\u06a3\u06a6\5\u0134\u009b\2\u06a4\u06a5\7l\2\2\u06a5\u06a7"+ + "\5\u00d4k\2\u06a6\u06a4\3\2\2\2\u06a6\u06a7\3\2\2\2\u06a7\u06a9\3\2\2"+ + "\2\u06a8\u06a2\3\2\2\2\u06a8\u06a3\3\2\2\2\u06a9\u06ab\3\2\2\2\u06aa\u06ac"+ + "\7s\2\2\u06ab\u06aa\3\2\2\2\u06ab\u06ac\3\2\2\2\u06ac\u06ae\3\2\2\2\u06ad"+ + "\u06af\7l\2\2\u06ae\u06ad\3\2\2\2\u06ae\u06af\3\2\2\2\u06af\u06b1\3\2"+ + "\2\2\u06b0\u06a8\3\2\2\2\u06b0\u06b1\3\2\2\2\u06b1\u06b2\3\2\2\2\u06b2"+ + "\u06b3\7f\2\2\u06b3\u0159\3\2\2\2\u06b4\u06b5\5\u0134\u009b\2\u06b5\u06b6"+ + "\7o\2\2\u06b6\u06b7\7d\2\2\u06b7\u015b\3\2\2\2\u06b8\u06b9\5\u00b0Y\2"+ + "\u06b9\u015d\3\2\2\2\u06ba\u06bf\7m\2\2\u06bb\u06bf\7\2\2\3\u06bc\u06bf"+ + "\7\u009e\2\2\u06bd\u06bf\6\u00b0\24\2\u06be\u06ba\3\2\2\2\u06be\u06bb"+ + "\3\2\2\2\u06be\u06bc\3\2\2\2\u06be\u06bd\3\2\2\2\u06bf\u015f\3\2\2\2\u00b3"+ + "\u016e\u0173\u017a\u0184\u018a\u0190\u01a0\u01a4\u01ad\u01b9\u01bd\u01c3"+ + "\u01cb\u01d5\u01e5\u01f3\u01f7\u01fe\u0206\u020f\u022f\u0237\u024f\u0260"+ + "\u026c\u0275\u0283\u0295\u029c\u02a1\u02a6\u02b0\u02b3\u02b7\u02bb\u02c2"+ + "\u02c5\u02cb\u02d0\u02d2\u02d5\u02dc\u02e1\u02f4\u02fc\u0300\u0303\u0309"+ + "\u030d\u0310\u031a\u0321\u0328\u0334\u033a\u0341\u0346\u034c\u0358\u035e"+ + "\u0362\u036a\u036e\u0374\u0377\u037d\u0382\u0396\u03b9\u03bb\u03d2\u03da"+ + "\u03e5\u03ec\u03f3\u03fd\u040b\u0421\u0423\u042b\u042f\u0433\u0436\u043f"+ + "\u0445\u044f\u0457\u045d\u0466\u0471\u047c\u0480\u0482\u048d\u0496\u049a"+ + "\u049d\u04a4\u04af\u04b9\u04bf\u04c1\u04cb\u04d5\u04d9\u04dd\u04e1\u04e8"+ + "\u04f0\u04fb\u04ff\u0503\u050f\u0513\u0517\u051c\u0523\u052a\u053e\u0542"+ + "\u0546\u054a\u055a\u0560\u0562\u0566\u056a\u056d\u0571\u0573\u0579\u0581"+ + "\u0586\u0591\u0597\u059e\u05a9\u05ae\u05b2\u05b7\u05bb\u05c3\u05cb\u05d0"+ + "\u05d3\u05db\u05e3\u05e8\u05ec\u05f0\u05f7\u0614\u061f\u0623\u062b\u062f"+ + "\u0631\u0639\u0642\u064a\u064f\u065f\u0661\u066a\u0670\u0676\u067a\u0683"+ + "\u068c\u068f\u0694\u06a6\u06a8\u06ab\u06ae\u06b0\u06be"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { @@ -12885,4 +12910,4 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); } } -} \ No newline at end of file +} diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index 212418151..17069a23c 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 +// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -900,6 +900,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitAssign_op(GobraParser.Assign_opContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRangeClause(GobraParser.RangeClauseContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1180,13 +1187,6 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitForClause(GobraParser.ForClauseContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitRangeClause(GobraParser.RangeClauseContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1439,4 +1439,4 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitEos(GobraParser.EosContext ctx) { return visitChildren(ctx); } -} \ No newline at end of file +} diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 7d77b604a..20b91c3b6 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,4 +1,4 @@ -// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 +// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -804,6 +804,12 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitAssign_op(GobraParser.Assign_opContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#rangeClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRangeClause(GobraParser.RangeClauseContext ctx); /** * Visit a parse tree produced by {@link GobraParser#packageClause}. * @param ctx the parse tree @@ -1044,12 +1050,6 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitForClause(GobraParser.ForClauseContext ctx); - /** - * Visit a parse tree produced by {@link GobraParser#rangeClause}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitRangeClause(GobraParser.RangeClauseContext ctx); /** * Visit a parse tree produced by {@link GobraParser#goStmt}. * @param ctx the parse tree @@ -1266,4 +1266,4 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitEos(GobraParser.EosContext ctx); -} \ No newline at end of file +} diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index ff4571cf5..bfa306d11 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -269,7 +269,7 @@ case class PForStmt(pre: Option[PSimpleStmt], cond: PExpression, post: Option[PS case class PAssForRange(range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement -case class PShortForRange(range: PRange, shorts: Vector[PIdnUnk], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement +case class PShortForRange(range: PRange, shorts: Vector[PUnkLikeId], addressable: Vector[Boolean], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement case class PGoStmt(exp: PExpression) extends PActualStatement @@ -797,7 +797,7 @@ sealed trait PMisc extends PNode sealed trait PActualMisc extends PMisc -case class PRange(exp: PExpression) extends PActualMisc +case class PRange(exp: PExpression, enumerated: PUnkLikeId) extends PActualMisc sealed trait PParameter extends PMisc { def typ: PType diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index d6e5074be..a87260f33 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -245,8 +245,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter }) case PAssForRange(range, ass, spec, body) => showSpec(spec) <> "for" <+> showExprList(ass) <+> "=" <+> showRange(range) <+> block(showStmt(body)) - case PShortForRange(range, shorts, spec, body) => - showSpec(spec) <> "for" <+> showIdList(shorts) <+> ":=" <+> showRange(range) <+> block(showStmt(body)) + case PShortForRange(range, shorts, addressable, spec, body) => + showSpec(spec) <> "for" <+> showList(shorts zip addressable){ case (l, a) => showAddressable(a, l) } <+> ":=" <+> showRange(range) <+> block(showStmt(body)) case PGoStmt(exp) => "go" <+> showExpr(exp) case PSelectStmt(send, rec, aRec, sRec, dflt) => "select" <+> block( @@ -324,7 +324,10 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter "case" <+> showIdList(shorts) <+> "=" <+> showExpr(recv) <> ":" <> showNestedStmtList(body.stmts) } - def showRange(n: PRange): Doc = "range" <+> showExpr(n.exp) + def showRange(n: PRange): Doc = n.enumerated match { + case _: PWildcard => "range" <+> showExpr(n.exp) + case _ => "range" <+> showExpr(n.exp) <+> "with" <+> showId(n.enumerated) + } // expressions diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 3316b2989..5ddf9653a 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -172,6 +172,8 @@ object Desugar { private val nm = new NameManager + private val MapExhalePermDenom = 1000000 + type Identity = (Meta, TypeInfo) private def abstraction(id: PIdnNode, info: TypeInfo): Identity = { @@ -970,6 +972,514 @@ object Desugar { } } + def leftOfAssignmentNoInit(idn: PIdnNode, info: TypeInfo)(t: in.Type): in.LocalVar = { + idn match { + case _: PWildcard => in.LocalVar(nm.fresh(idn, info), t)(meta(idn, info)) + + case _ => + assignableVarD(ctx, info)(idn) match { + case Left(v) => v.asInstanceOf[in.LocalVar] + case Right(v) => violation(s"Expected an assignable variable, but got $v instead") + } + } + } + + /** + * This case handles for loops with a range clause of the form: + * + * + * // i0 here is an int variable starting from 0 and used at the + * // encoded loop condition + * for i, j := range x with i0 { + * body + * } + * + * In the case where x is a slice or array the following code is produced. Note + * that everything is in a new block so it can shadow variables with the same + * name declared outside. This is also the go behaviour. + * + * c := x // save the value of the slice/array since changing it doesn't change the iteration + * length := len(x) + * + * if (length == 0) { + * havoc i + * assume i0 == i + * havoc j // [v] + * assert + * } else { + * var i int = 0 + * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0 + * var j T = c[0] // [v] + * invariant 0 <= i0 && i0 <= len(c) + * invariant i0 < len(c) ==> i0 == i && j == c[i0] // [v] just the j == c[i0] part + * + * for i0 < length { + * + * i0 += 1 + * if i0 < len(c) { i = i0 ; j = c[i] /* [v] */ } + * } + * } + * + * In the case where the value variable 'j' is missing all the code annotated with [v] + * is omitted + */ + def desugarArrSliceShortRange(n: PShortForRange, range: PRange, shorts: Vector[PUnkLikeId], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for { + exp <- goE(range.exp) + + (elemType, typ) = underlyingType(exp.typ) match { + case s: in.SliceT => (s.elems, s) + case a: in.ArrayT => (a.elems, a) + case _ => violation("Expected slice or array in for-range statement") + } + + rangeExpSrc = meta(range.exp, info) + iSrc = meta(shorts(0), info) + + hasValue = shorts.length > 1 && !(shorts(1).isInstanceOf[PWildcard]) + + jSrc = if (hasValue) meta(shorts(1), info) else src + + c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(rangeExpSrc) + length <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc) + + i = leftOfAssignmentNoInit(shorts(0), info)(in.IntT(Addressability.exclusiveVariable)) + _ <- declare(i) + j = if (hasValue) leftOfAssignmentNoInit(shorts(1), info)(elemType) else i + + _ <- if (hasValue) declare(j) else unit(in.Seqn(Vector())(src)) + i0 = leftOfAssignmentNoInit(range.enumerated, info)(in.IntT(Addressability.exclusiveVariable)) + _ <- declare(i0) + + (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) + (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) + addedInvariantsBefore = Vector( + in.ExprAssertion(in.And( + in.AtMostCmp(in.IntLit(0)(src), i0)(src), + in.AtMostCmp(i0, in.Length(c)(src))(src))(src))(src), + in.Implication( + in.LessCmp(i0, in.Length(c)(src))(src), + in.ExprAssertion(in.EqCmp(i0, i)(src))(src))(src) + ) + indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) + addedInvariantsAfter = (if (hasValue) Vector( + in.Implication( + in.LessCmp(i0, in.Length(c)(src))(src), + in.ExprAssertion(in.EqCmp(j, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc)) + else + Vector()) + + dBody = blockD(ctx, info)(body) + + // handle break and continue labels + continueLabelName = nm.continueLabel(n, info) + continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) + continueLoopLabel = in.Label(continueLoopLabelProxy)(src) + + breakLabelName = nm.breakLabel(n, info) + breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) + _ <- declare(breakLoopLabelProxy) + breakLoopLabel = in.Label(breakLoopLabelProxy)(src) + + enc = in.Seqn(Vector( + // c := x + singleAss(in.Assignee.Var(c), exp)(rangeExpSrc), + // length := len(c) to save for later since it can change + singleAss(in.Assignee.Var(length), in.Length(c)(src))(src), + in.If( + in.EqCmp(length, in.IntLit(0)(src))(src), + in.Seqn(Vector( + // assume i == i0 + in.Assume(in.ExprAssertion(in.EqCmp(i, i0)(src))(src))(src) + ) ++ + // assert + (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src), + in.Seqn(Vector( + // i = 0 + in.Initialization(i)(src), + singleAss(in.Assignee.Var(i), in.IntLit(0)(src))(iSrc), + // i0 = 0 + in.Initialization(i0)(src), + singleAss(in.Assignee.Var(i0), in.IntLit(0)(src))(src)) ++ + // j = c[0] + (if (hasValue) + Vector(in.Initialization(j)(src), singleAss(in.Assignee.Var(j), in.IndexedExp(c, in.IntLit(0)(src), typ)(src))(jSrc)) + else Vector()) ++ + dInvPre ++ dTerPre ++ Vector( + in.While( + in.LessCmp(i0, length)(src), + addedInvariantsBefore ++ dInv ++ addedInvariantsAfter, + dTer, + in.Block(Vector(continueLoopLabelProxy), + Vector( + dBody, + continueLoopLabel, + //i0 += 1 + singleAss(in.Assignee.Var(i0), in.Add(i0, in.IntLit(1)(src))(src))(src), + // if i0 < len(c) { i = i0; j = c[i] } + in.If( + in.LessCmp(i0, length)(src), + in.Seqn(Vector(singleAss(in.Assignee.Var(i), i0)(src)) ++ + (if (hasValue) Vector(singleAss(in.Assignee.Var(j), in.IndexedExp(c, i, typ)(src))(src)) else Vector()))(src), + in.Seqn(Vector())(src))(src) + ) ++ + dInvPre ++ + dTerPre + )(src))(src), breakLoopLabel + ) + )(src) + )(src)))(src) + } yield enc)) + + /** + * This case handles for loops with a range clause of the form: + * + * + * for i, j = range x with i0 { + * body + * } + * + * In the case where x is a slice or array the following code is produced. Note + * that everything is in a new block so it can shadow variables with the same + * name declared outside. This is also the go behaviour. + * + * c := x // save the value of the slice/array since changing it doesn't change the iteration + * length := len(c) + * + * if (length == 0) { + * havoc i + * assume i0 == i + * havoc j // [v] + * assert + * } else { + * var i int = 0 + * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0 + * var j T = c[0] // [v] + * invariant 0 <= i0 && i0 <= len(c) + * invariant i0 < len(c) ==> i0 == i && j == c[i0] // [v] just the j == c[i0] part + * + * for i0 < length { + * + * i0 += 1 + * if i0 < len(c) { i = i0 ; j = c[i] /* [v] */ } + * } + * } + * + * In the case where the value variable 'j' is missing all the code annotated with [v] + * is omitted + */ + def desugarArrSliceAssRange(n: PAssForRange, range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for { + exp <- goE(range.exp) + + (elemType, typ) = underlyingType(exp.typ) match { + case s: in.SliceT => (s.elems, s) + case a: in.ArrayT => (a.elems, a) + case _ => violation("Expected slice or array in for-range statement") + } + + rangeExpSrc = meta(range.exp, info) + + hasValue = ass.length > 1 && !(ass(1).isInstanceOf[PBlankIdentifier]) + + c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(rangeExpSrc) + length <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc) + + i <- goL(ass(0)) + j <- if (hasValue) goL(ass(1)) else unit(in.Assignee.Var(c)) + + i0 = leftOfAssignmentNoInit(range.enumerated, info)(in.IntT(Addressability.exclusiveVariable)) + _ <- declare(i0) + + (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) + (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) + addedInvariantsBefore = Vector( + in.ExprAssertion(in.And( + in.AtMostCmp(in.IntLit(0)(src), i0)(src), + in.AtMostCmp(i0, in.Length(c)(src))(src))(src))(src) + ) + indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) + addedInvariantsAfter = (if (hasValue) Vector( + in.Implication( + in.LessCmp(i0, in.Length(c)(src))(src), + in.ExprAssertion(in.EqCmp(i0, i.op)(src))(src))(src), + in.Implication( + in.LessCmp(i0, in.Length(c)(src))(src), + in.ExprAssertion(in.EqCmp(j.op, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc)) + else + Vector( + in.Implication( + in.LessCmp(i0, in.Length(c)(src))(src), + in.ExprAssertion(in.EqCmp(i0, i.op)(src))(src))(src))) + + dBody = blockD(ctx, info)(body) + + // handle break and continue labels + continueLabelName = nm.continueLabel(n, info) + continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) + continueLoopLabel = in.Label(continueLoopLabelProxy)(src) + + breakLabelName = nm.breakLabel(n, info) + breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) + _ <- declare(breakLoopLabelProxy) + breakLoopLabel = in.Label(breakLoopLabelProxy)(src) + + enc = in.Seqn(Vector( + // c := x + singleAss(in.Assignee.Var(c), exp)(rangeExpSrc), + // length := len(c) to save for later since it can change + singleAss(in.Assignee.Var(length), in.Length(c)(src))(src), + in.If( + in.EqCmp(length, in.IntLit(0)(src))(src), + in.Seqn( + // assert + (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src), + in.Seqn(Vector( + // c := x + singleAss(in.Assignee.Var(c), exp)(rangeExpSrc), + // i = 0 + singleAss(i, in.IntLit(0)(src))(src), + // i0 = 0 + singleAss(in.Assignee.Var(i0), in.IntLit(0)(src))(src)) ++ + // j = c[0] + (if (hasValue) + Vector(singleAss(j, in.IndexedExp(c, in.IntLit(0)(src), typ)(src))(src)) + else Vector()) ++ + dInvPre ++ dTerPre ++ Vector( + in.While( + in.LessCmp(i0, length)(src), + addedInvariantsBefore ++ dInv ++ addedInvariantsAfter, + dTer, + in.Block(Vector(continueLoopLabelProxy), + Vector( + dBody, + continueLoopLabel, + //i0 += 1 + singleAss(in.Assignee.Var(i0), in.Add(i0, in.IntLit(1)(src))(src))(src), + // if i0 < len(c) { i = i0; j = c[i] } + in.If( + in.LessCmp(i0, length)(src), + in.Seqn(Vector(singleAss(i, i0)(src)) ++ + (if (hasValue) Vector(singleAss(j, in.IndexedExp(c, i.op, typ)(src))(src)) else Vector()))(src), + in.Seqn(Vector())(src))(src) + ) ++ + dInvPre ++ + dTerPre + )(src))(src), breakLoopLabel + ) + )(src) + )(src)))(src) + } yield enc)) + + /** + * This case handles for loops with a range clause of a map expression of the form: + * + * + * // visited here is a set containing the already visited keys in the map + * for k, v := range x with visited { + * body + * } + * + * The following code is produced. Note + * that everything is in a new block so it can shadow variables with the same + * name declared outside. This is also the go behaviour. + * + * c := x + * + * if (|c| == 0) { + * var k : T1 + * var v : T2 // [v] + * var visited : Set[T1] + * assert + * } + * else { + * var k : T1 + * var v : T2 // [v] + * inhale k in domain(c) + * v := c[k] // [v] + * var visited : Set[T1] := Set() + * assert 0 / 1 < per // check if permission provided by user is valid + * while (|visited| < |domain(c)|) + * invariant |visited| < |domain(c)| ==> k in domain(x) && v == c[k] // [v] + * invariant |visited| <= |domain(c)| + * invariant visited subset domain(c) + * + * { + * var key : T1 + * inhale key in domain(c) && !(key in visited) + * k := key + * v := x[k] // [v] + * exhale acc(x, 1/100000) + * + * inhale acc(x, 1/100000) + * visited := visited union Set(k) + * + * In the case where the value variable 'v' is missing all the code annotated with [v] + * is omitted + */ + def desugarMapShortRange(n: PShortForRange, range: PRange, shorts: Vector[PUnkLikeId], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for { + exp <- goE(range.exp) + + c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(src) + + (keyType, valType) = underlyingType(exp.typ) match { + case in.MapT(k, v, _) => (k.withAddressability(Addressability.exclusiveVariable), v.withAddressability(Addressability.exclusiveVariable)) + case _ => violation("unexpected type of range expression") + } + visType = in.SetT(keyType, Addressability.exclusiveVariable) + + domain = in.MapKeys(c, underlyingType(exp.typ))(src) + + visited <- leftOfAssignmentD(range.enumerated, info)(in.SetT(keyType, Addressability.exclusiveVariable)) + + perm <- freshDeclaredExclusiveVar(in.PermissionT(Addressability.exclusiveVariable), n, info)(src) + + initPerm = singleAss(in.Assignee.Var(perm), in.PermLit(1, MapExhalePermDenom)(src))(src) + + exhSrc = meta(range.exp, info).createAnnotatedInfo(Source.InsufficientPermissionToRangeExpressionAnnotation()) + + // exhale acc(x, p) + exhalePerm = in.Exhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(exhSrc) + inhalePerm = in.Inhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(src) + + hasValue = shorts.length > 1 && !(shorts(1).isInstanceOf[PWildcard]) + + (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) + (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) + indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) + addedInvariants = Vector( + in.ExprAssertion(in.AtMostCmp(in.Length(visited.op)(src), in.Length(c)(src))(src))(src), + in.ExprAssertion(in.Subset(visited.op, domain)(src))(src)) + + dBody = blockD(ctx, info)(body) + + // handle break and continue labels + continueLabelName = nm.continueLabel(n, info) + continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) + continueLoopLabel = in.Label(continueLoopLabelProxy)(src) + + breakLabelName = nm.breakLabel(n, info) + breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) + _ <- declare(breakLoopLabelProxy) + breakLoopLabel = in.Label(breakLoopLabelProxy)(src) + + visitedEqDomain = in.Assert(in.ExprAssertion(in.EqCmp( + in.SetMinus(visited.op, domain)(src), + in.SetLit(keyType, Vector.empty)(src) + )(src))(src))(src) + + k = leftOfAssignmentNoInit(shorts(0), info)(keyType) + v = if (hasValue) leftOfAssignmentNoInit(shorts(1), info)(valType) else k + + updateKeyVal = in.Seqn(Vector( + in.Inhale(in.ExprAssertion(in.And( + in.Contains(k, domain)(src), + in.Negation(in.Contains(k, visited.op)(src))(src))(src))(src))(src) + ) ++ (if (hasValue) Vector(in.Initialization(v)(src), singleAss(in.Assignee.Var(v), in.IndexedExp(c, k, underlyingType(exp.typ))(src))(src)) else Vector()))(src) + + updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k))(src))(src))(src) + + enc = in.Seqn(Vector( + singleAss(in.Assignee.Var(c), exp)(src), + in.If( + in.EqCmp(in.Length(c)(src), in.IntLit(0)(src))(src), + in.Seqn( + // assert + (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src), + in.Seqn( + dInvPre ++ dTerPre ++ Vector( + initPerm, + in.While( + in.LessCmp(in.Length(visited.op)(src), in.Length(c)(src))(src), + dInv ++ addedInvariants, dTer, in.Block(Vector(continueLoopLabelProxy, k) ++ (if (hasValue) Vector(v) else Vector()), + Vector(exhalePerm, updateKeyVal, dBody, continueLoopLabel, inhalePerm, updateVisited) ++ dInvPre ++ dTerPre + )(src))(src), visitedEqDomain, breakLoopLabel + ))(src) + )(src)))(src) + + } yield enc)) + + def desugarMapAssRange(n: PAssForRange, range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for { + exp <- goE(range.exp) + + (keyType, valType) = underlyingType(exp.typ) match { + case in.MapT(k, v, _) => (k.withAddressability(Addressability.exclusiveVariable), v.withAddressability(Addressability.exclusiveVariable)) + case _ => violation("unexpected type of range expression") + } + visType = in.SetT(keyType, Addressability.exclusiveVariable) + + c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(src) + + domain = in.MapKeys(c, underlyingType(exp.typ))(src) + + visited <- leftOfAssignmentD(range.enumerated, info)(in.SetT(keyType, Addressability.exclusiveVariable)) + + perm <- freshDeclaredExclusiveVar(in.PermissionT(Addressability.exclusiveVariable), n, info)(src) + + initPerm = singleAss(in.Assignee.Var(perm), in.PermLit(1, MapExhalePermDenom)(src))(src) + + exhSrc = meta(range.exp, info).createAnnotatedInfo(Source.InsufficientPermissionToRangeExpressionAnnotation()) + + // exhale acc(x, p) + exhalePerm = in.Exhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(exhSrc) + inhalePerm = in.Inhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(src) + + hasValue = ass.length > 1 && !(ass(1).isInstanceOf[PBlankIdentifier]) + + (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) + (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) + indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) + addedInvariants = Vector( + in.ExprAssertion(in.AtMostCmp(in.Length(visited.op)(src), in.Length(c)(src))(src))(src), + in.ExprAssertion(in.Subset(visited.op, domain)(src))(src)) + + dBody = blockD(ctx, info)(body) + + // handle break and continue labels + continueLabelName = nm.continueLabel(n, info) + continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) + continueLoopLabel = in.Label(continueLoopLabelProxy)(src) + + breakLabelName = nm.breakLabel(n, info) + breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) + _ <- declare(breakLoopLabelProxy) + breakLoopLabel = in.Label(breakLoopLabelProxy)(src) + + visitedEqDomain = in.Assert(in.ExprAssertion(in.EqCmp( + in.SetMinus(visited.op, domain)(src), + in.SetLit(keyType, Vector.empty)(src) + )(src))(src))(src) + + tempk = in.LocalVar(nm.fresh(n, info), keyType)(src) + k <- goL(ass(0)) + v <- if (hasValue) goL(ass(1)) else unit(in.Assignee.Var(perm)) + + updateKeyVal = in.Seqn(Vector( + in.Inhale(in.ExprAssertion(in.And( + in.Contains(tempk, domain)(src), + in.Negation(in.Contains(tempk, visited.op)(src))(src))(src))(src))(src), + singleAss(k, tempk)(src) + ) ++ (if (hasValue) Vector(singleAss(v, in.IndexedExp(c, k.op, underlyingType(exp.typ))(src))(src)) else Vector()))(src) + + updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k.op))(src))(src))(src) + + enc = in.Seqn(Vector( + singleAss(in.Assignee.Var(c), exp)(src), + in.If( + in.EqCmp(in.Length(c)(src), in.IntLit(0)(src))(src), + in.Seqn( + // assert + (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src), + in.Seqn( + dInvPre ++ dTerPre ++ Vector( + initPerm, + in.While( + in.LessCmp(in.Length(visited.op)(src), in.Length(c)(src))(src), + dInv ++ addedInvariants, dTer, in.Block(Vector(continueLoopLabelProxy, tempk), + Vector(exhalePerm, updateKeyVal, dBody, continueLoopLabel, inhalePerm, updateVisited) ++ dInvPre ++ dTerPre + )(src))(src), visitedEqDomain, breakLoopLabel + ))(src) + )(src)))(src) + } yield enc)) + val result = stmt match { case NoGhost(noGhost) => noGhost match { case _: PEmptyStmt => unit(in.Seqn(Vector.empty)(src)) @@ -1312,328 +1822,19 @@ object Desugar { case n@PBreak(label) => unit(in.Break(label.map(x => x.name), nm.fetchBreakLabel(n, info))(src)) - /** - * This case handles for loops with a range clause of the form: - * - * - * for i, j := range x { - * body - * } - * - * In the case where x is a slice or array the following code is produced. Note - * that everything is in a new block so it can shadow variables with the same - * name declared outside. This is also the go behaviour. - * - * var i int = 0 - * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0 - * var j elem(x) // [v] the type of the elements of x - * - * c := x // save the value of the slice/array since changing it doesn't change the iteration - * - * if (0 <= i && i < len(c)) { // [v] - * j = c[i] - * } - * - * invariant len(c) > 0 ==> 0 <= i0 && i0 <= len(c) // these invariants do not - * invariant len(c) > 0 ==> i == i0 // require access to anything so they - * invariant len(c) > 0 ==> 0 <= i && i <= len(c) // are added before the user invariants - * 0) and j with f(j, len(c) > 0)> - * invariant len(c) > 0 ==> (0 <= i && i < len(c) ==> j == c[i]) // [v] - * for i < len(c) { - * - * i0 += 1 - * i = i0 - * if (0 <= i && i < len(c)) { // [v] - * j = c[i] - * } - * } - * - * In the case where the value variable 'j' is missing all the code annotated with [v] - * is omitted - * - * Function f is the identity function regarding its first argument with a precondition - * stating that the second argument must be true. - * - * requires b - * decreases _ - * pure func f(x: , b: bool) { x } - * - * It is needed because in the occation of empty slices or arrays, i and j should not exist. - * Replacing them with the call to this function will cause its precondition to fail for - * empty slices or arrays and thus produce the error which is then transformed to the - * desirable one. - */ - case n@PShortForRange(range, shorts, spec, body) => - // is a block as it introduces new variables - unit(block(for { - exp <- goE(range.exp) - (elems, typ) = underlyingType(exp.typ) match { - case slice : in.SliceT => (slice.elems, slice) - case array : in.ArrayT => (array.elems, array) - case _ : in.MapT => violation("Maps are not supported yet in range") - case _ : in.StringT => violation("Strings are not supported yet in range") - case t => violation(s"Range not applicable to type $t") - } + case n@PShortForRange(range, shorts, _, spec, body) => + underlyingType(info.typ(range.exp)) match { + case _: SliceT | _: ArrayT => desugarArrSliceShortRange(n, range, shorts, spec, body)(src) + case _: MapT => desugarMapShortRange(n, range, shorts, spec, body)(src) + case t => violation(s"Type $t not supported as a range expression") + } - // index is the place where we store the indices of the range expression - rangeSrc = meta(range, info) - rangeExpSrc = meta(range.exp, info) - indexSrc = meta(shorts(0), info) - - indexLeft <- leftOfAssignmentD(shorts(0), info)(in.IntT(Addressability.exclusiveVariable)) - copiedIndexVar <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc) - copyIndexAss = singleAss(in.Assignee.Var(copiedIndexVar), in.IntLit(0)(indexSrc))(rangeExpSrc) - incrCopiedIndex = singleAss(in.Assignee.Var(copiedIndexVar), in.Add(copiedIndexVar, in.IntLit(1)(indexSrc))(indexSrc))(indexSrc) - - indexVar = in.Assignee.Var(indexLeft.op.asInstanceOf[in.AssignableVar]) - incrIndex = singleAss(indexVar, copiedIndexVar)(indexSrc) - indexAss = singleAss(indexVar, in.IntLit(0)(rangeSrc))(indexSrc) - - // in go the range expression is only computed once before the iteration begins - // we do that by storing it in copiedVar - // this also ensures that the elements iterated through do not change - // even if the range expression is modified in the loop body - copiedVar <- freshDeclaredExclusiveVar(exp.typ, n, info)(rangeExpSrc) - copyAss = singleAss(in.Assignee.Var(copiedVar), exp)(rangeExpSrc) - - // get the length of the expression - length = in.Length(copiedVar)(rangeSrc) - cond = in.LessCmp(indexLeft.op, length)(rangeSrc) - - // this invariant states that the index variable has the same value as the hidden index variable always - copiedIndexEqualsIndexInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.EqCmp(indexLeft.op, copiedIndexVar)(rangeSrc))(rangeSrc))(rangeSrc) - - // this invariant states that the hidden index stays within 0 and the length of the array/slice (both inclusive) - copiedIndexBoundsInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.And( - in.AtMostCmp(in.IntLit(0)(rangeSrc), copiedIndexVar)(rangeSrc), - in.AtMostCmp(copiedIndexVar, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc) - - // this invariant states that the index is between 0 and the length of the array/slice (both inclusive) - indexBoundsInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.And( - in.AtMostCmp(in.IntLit(0)(rangeSrc), indexLeft.op)(rangeSrc), - in.AtMostCmp(indexLeft.op, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc) - - (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) - - dBody = blockD(ctx, info)(body) - - continueLabelName = nm.continueLabel(n, info) - continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) - continueLoopLabel = in.Label(continueLoopLabelProxy)(src) - - breakLabelName = nm.breakLabel(n, info) - breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) - _ <- declare(breakLoopLabelProxy) - breakLoopLabel = in.Label(breakLoopLabelProxy)(src) - - wh = if (shorts.length == 2) { - // in this case we know that the loop looks like this: - // for i, j := range x { ... - // until now we have only created the variable i since it is not mandatory for j to exist - // if it does, we have to declare it and add the code that will update it in each iteration - // which looks like this: - // if (0 <= i && i < length(x)) { j = x[i] } - // note that this will happen after we have incremented i - val valueSrc = meta(shorts(1), info) - val valueLeft = assignableVarD(ctx, info)(shorts(1)) match { - case Left(n) => n - case Right(n) => n - } - val valueVar = in.Assignee.Var(valueLeft.asInstanceOf[in.AssignableVar]) - val valueAss = singleAss(valueVar, in.IndexedExp(copiedVar, indexLeft.op, typ)(valueSrc))(valueSrc) - val updateValue = in.If(in.And(cond, in.AtLeastCmp(indexLeft.op, in.IntLit(0)(valueSrc))(valueSrc))(valueSrc), valueAss, in.Seqn(Vector())(valueSrc))(valueSrc) - - val invCtx = ctx.copyWithExpD{ - case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(0).name => - val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString())) - Some(unit(conditionalId(indexLeft.op, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), in.IntT(Addressability.exclusiveVariable))(invSrc))) - case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(1).name => - val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString())) - Some(unit(conditionalId(valueLeft, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), elems)(invSrc))) - case _ => None - } - val (dInvPre, dInv) = prelude(sequence(spec.invariants map assertionD(invCtx, info))).res - // we also need an invariant that states that - // for index i and value j and range expression x - // invariant len(c) > 0 ==> 0 <= i && i < len(x) ==> j == x[i] - val indexValueSrc = meta(range, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) - val indexValueEq = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.Implication( - in.And( - in.AtMostCmp(in.IntLit(0)(indexSrc), indexLeft.op)(indexSrc), - in.LessCmp(indexLeft.op, length)(indexSrc))(indexSrc), - in.ExprAssertion(in.EqCmp(in.IndexedExp(copiedVar, indexLeft.op, typ)(rangeExpSrc), valueLeft)(rangeExpSrc))(rangeExpSrc) - )(rangeSrc))(indexValueSrc) - in.Block( - Vector(valueLeft.asInstanceOf[in.LocalVar]), - Vector(copyAss, indexAss, copyIndexAss, updateValue) ++ dInvPre ++ dTerPre ++ Vector( - in.While(cond, Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv) ++ dInv ++ Vector(indexValueEq), dTer, in.Block(Vector(continueLoopLabelProxy), - Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex, updateValue) ++ dInvPre ++ dTerPre - )(src))(src), breakLoopLabel - ) - )(src) - } else { - // else we do not have a value variable and the while loop has only - // the index in bounds invariant added - // the loop in this case looks like this: - // for i := range x { ... - val invCtx = ctx.copyWithExpD{ - case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(0).name => - val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString())) - Some(unit(conditionalId(indexLeft.op, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), in.IntT(Addressability.exclusiveVariable))(invSrc))) - case _ => None - } - val (dInvPre, dInv) = prelude(sequence(spec.invariants map assertionD(invCtx, info))).res - in.Seqn( - Vector(copyAss, indexAss, copyIndexAss) ++ dInvPre ++ dTerPre ++ Vector( - in.While(cond, Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv) ++ dInv, dTer, in.Block(Vector(continueLoopLabelProxy), - Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex) ++ dInvPre ++ dTerPre - )(src))(src), breakLoopLabel - ) - )(src) - } - } yield wh)) - - /** - * This case handles for loops with a range clause of the form: - * - * - * for expIndex, expValue = range x { - * body - * } - * - * In the case where x is a slice or array the following code is produced. - * - * var i0 int = 0 // since 'expIndex' can change in the iteration we store the true index in i0 - * - * c := x // save the value of the slice/array since changing it doesn't change the iteration - * - * if (len(c) > 0) { - * expIndex = 0 - * } - * - * if (0 <= expIndex && expIndex < len(c)) { // [v] - * expValue = c[expIndex] - * } - * - * 0) and j with f(j, len(c) > 0)> - * invariant len(c) > 0 ==> 0 <= i0 && i0 <= len(c) // these invariants might require access to something - * invariant len(c) > 0 ==> expIndex == i0 // as expIndex can be an indexing operation for example - * invariant len(c) > 0 ==> 0 <= expIndex && expIndex <= len(c) // so they are added after the user invariants - * invariant len(c) > 0 ==> (0 <= expIndex && expIndex < len(c) ==> expValue == c[expIndex]) // [v] - * for expIndex < len(c) { - * - * i0 += 1 - * expIndex = i0 - * if (0 <= expIndex && expIndex < len(c)) { // [v] - * expValue = c[i] - * } - * } - * - * In the case where the value expression 'expValue' is missing all the code annotated with [v] - * is omitted - */ case n@PAssForRange(range, ass, spec, body) => - unit(block(for { - exp <- goE(range.exp) - typ = underlyingType(exp.typ) match { - case slice : in.SliceT => slice - case array : in.ArrayT => array - case _ : in.MapT => violation("Maps are not supported yet in range") - case _ : in.StringT => violation("Strings are not supported yet in range") - case t => violation(s"Range not applicable to type $t") - } - indexLeft <- goL(ass(0)) - rangeSrc = meta(range, info) - indexSrc = meta(ass(0), info) - rangeExpSrc = meta(range.exp, info) - - copiedVar <- freshDeclaredExclusiveVar(exp.typ, n, info)(rangeExpSrc) - copyAss = singleAss(in.Assignee.Var(copiedVar), exp)(rangeExpSrc) - length = in.Length(copiedVar)(rangeSrc) - - copiedIndexVar <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc) - copyIndexAss = singleAss(in.Assignee.Var(copiedIndexVar), in.IntLit(0)(indexSrc))(rangeExpSrc) - incrCopiedIndex = singleAss(in.Assignee.Var(copiedIndexVar), in.Add(copiedIndexVar, in.IntLit(1)(indexSrc))(indexSrc))(indexSrc) - - indexAss = in.If(in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), singleAss(indexLeft, in.IntLit(0)(rangeSrc))(indexSrc), in.Seqn(Vector())(indexSrc))(indexSrc) - incrIndex = singleAss(indexLeft, copiedIndexVar)(indexSrc) - - cond = in.LessCmp(indexLeft.op, length)(rangeSrc) - - copiedIndexEqualsIndexInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.EqCmp(indexLeft.op, copiedIndexVar)(rangeSrc))(rangeSrc))(rangeSrc) - - copiedIndexBoundsInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.And( - in.AtMostCmp(in.IntLit(0)(rangeSrc), copiedIndexVar)(rangeSrc), - in.AtMostCmp(copiedIndexVar, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc) - - indexBoundsInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.And( - in.AtMostCmp(in.IntLit(0)(rangeSrc), indexLeft.op)(rangeSrc), - in.AtMostCmp(indexLeft.op, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc) - - (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) - (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) - - dBody = blockD(ctx, info)(body) - - continueLabelName = nm.continueLabel(n, info) - continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) - continueLoopLabel = in.Label(continueLoopLabelProxy)(src) - - breakLabelName = nm.breakLabel(n, info) - breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) - _ <- declare(breakLoopLabelProxy) - breakLoopLabel = in.Label(breakLoopLabelProxy)(src) - - wh = if (ass.length == 2) { - val valueLeft = goL(ass(1)).res - val decls = ass(1) match { - case _: PBlankIdentifier => Vector(valueLeft.asInstanceOf[in.Assignee.Var].op.asInstanceOf[in.LocalVar]) - case _ => Vector.empty - } - val valueSrc = meta(ass(1), info) - val valueAss = singleAss(valueLeft, in.IndexedExp(copiedVar, indexLeft.op, typ)(valueSrc))(valueSrc) - val updateValue = in.If(in.And(cond, in.AtLeastCmp(indexLeft.op, in.IntLit(0)(valueSrc))(valueSrc))(valueSrc), valueAss, in.Seqn(Vector())(valueSrc))(valueSrc) - - val indexValueEq = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.Implication( - in.And( - in.AtMostCmp(in.IntLit(0)(indexSrc), indexLeft.op)(indexSrc), - in.LessCmp(indexLeft.op, length)(indexSrc))(indexSrc), - in.ExprAssertion(in.EqCmp(in.IndexedExp(copiedVar, indexLeft.op, typ)(rangeExpSrc), valueLeft.op)(rangeExpSrc))(rangeExpSrc) - )(rangeSrc))(rangeSrc) - in.Block( - decls, - Vector(copyAss, indexAss, copyIndexAss, updateValue) ++ dInvPre ++ dTerPre ++ Vector( - in.While(cond, dInv ++ Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv, indexValueEq), dTer, in.Block(Vector(continueLoopLabelProxy), - Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex, updateValue) ++ dInvPre ++ dTerPre - )(src))(src), breakLoopLabel - ) - )(src) - } else { - in.Seqn( - Vector(copyAss, indexAss, copyIndexAss) ++ dInvPre ++ dTerPre ++ Vector( - in.While(cond, dInv ++ Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv), dTer, in.Block(Vector(continueLoopLabelProxy), - Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex) ++ dInvPre ++ dTerPre - )(src))(src), breakLoopLabel - ) - )(src) - } - } yield wh)) + underlyingType(info.typ(range.exp)) match { + case _: SliceT | _: ArrayT => desugarArrSliceAssRange(n, range, ass, spec, body)(src) + case _: MapT => desugarMapAssRange(n, range, ass, spec, body)(src) + case t => violation(s"Type $t not supported as a range expression") + } case _ => ??? } @@ -3341,58 +3542,6 @@ object Desugar { fPred } - /** - * Holds types for which conditionalId functions have been declared for. - * This way conditionalId functions do not get declared twice for the same - * type. - */ - private var hasConditionalIdForType : Set[in.Type] = Set.empty - - /** - * If it doesn't exist it generates a function: - * - * function $conditionalId(value: , cond: Bool): Int - * requires cond - * { - * value - * } - * - * where type is the underlying type of param generalType - * - * @param valueVar - * @param condVar - * @param generalType - * @param src - * @return a call to the $conditionalId function with arguments valueVar and condVar - */ - private def conditionalId(valueVar: in.Expr, condVar: in.Expr, generalType: in.Type)(src: Meta): in.PureFunctionCall = { - val typ = underlyingType(generalType) - val name = in.FunctionProxy("$" + s"conditionalId${Names.serializeType(typ)}")(Source.Parser.Internal) - if (!hasConditionalIdForType(typ)) { - hasConditionalIdForType += typ - val value = in.Parameter.In("value", typ.withAddressability(Addressability.inParameter))(Source.Parser.Internal) - val cond = in.Parameter.In("cond", in.BoolT(Addressability.inParameter))(Source.Parser.Internal) - val res = in.Parameter.Out("res", typ.withAddressability(Addressability.outParameter))(Source.Parser.Internal) - val args = Vector(value, cond) - val results = Vector(res) - val pres = Vector(in.ExprAssertion(cond)(Source.Parser.Internal)) - val posts = Vector[in.Assertion]() - val terminationMeasures = Vector(in.WildcardMeasure(None)(Source.Parser.Internal)) - val body = Some(value) - AdditionalMembers.addMember( - in.PureFunction( - name, - args, - results, - pres, - posts, - terminationMeasures, - body)(Source.Parser.Internal) - ) - } - in.PureFunctionCall(name, Vector(valueVar, condVar), in.IntT(Addressability.callResult))(src) - } - /** Desugar the function literal and add it to the map. */ private def registerFunctionLit(ctx: FunctionContext, info: TypeInfo)(lit: PFunctionLit): Writer[in.Expr] = { val fLit = if (lit.spec.isPure) pureFunctionLitD(ctx, info)(lit) else functionLitD(ctx)(lit) diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 88c31a6ba..5745091ec 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -1821,18 +1821,25 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole val post = visitNodeOrNone[PSimpleStmt](ctx.forClause().postStmt) PForStmt(pre, cond, post, spec, block).at(specCtx) } else if (has(ctx.rangeClause())) { - // for ? range - val expr = visitNode[PExpression](ctx.rangeClause().expression()) - val range = PRange(expr).at(ctx.rangeClause()) + // for ? range (with enumerated)? + val expr = visitNode[PExpression](ctx.rangeClause().expression()).at(ctx.rangeClause()) + // enumerated will be used no matter what, so we just make it a wildcard if it is not + // present in the range clause + val enumerated = visitChildren(ctx.rangeClause()) match { + case Vector(_, _, "range", _, "with", i) if i.toString() == "_" => PWildcard().at(ctx.rangeClause().IDENTIFIER()) + case Vector("range", _, "with", i) if i.toString() == "_" => PWildcard().at(ctx.rangeClause().IDENTIFIER()) + case Vector(_, _, "range", _) | Vector("range", _) => PWildcard().at(ctx.rangeClause()) + case _ => idnUnk.get(ctx.rangeClause().IDENTIFIER()).at(ctx.rangeClause.IDENTIFIER()) + } + val range = PRange(expr, enumerated).at(ctx.rangeClause()) if (has(ctx.rangeClause().DECLARE_ASSIGN())) { // := - // identifiers should include the blank identifier, but this is currently not supported by PShortForRange - val goIdnUnkList(idList) = visitIdentifierList(ctx.rangeClause().identifierList()) - PShortForRange(range, idList, spec, block).at(specCtx) + val (idnUnkLikeList(vars), addressable) = visitMaybeAddressableIdentifierList(ctx.rangeClause().maybeAddressableIdentifierList()) + PShortForRange(range, vars, addressable, spec, block).at(specCtx) } else { // = val assignees = visitAssigneeList(ctx.rangeClause().expressionList()) match { - case v : Vector[PAssignee] => v + case v : Vector[PAssignee] => if (v.length > 0 ) v else Vector(PBlankIdentifier().at(ctx.rangeClause())) case _ => fail(ctx) } PAssForRange(range, assignees, spec, block).at(specCtx) diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala index fc350c4c5..2b30e5e43 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala @@ -142,6 +142,11 @@ object SymbolTable extends Environments[Entity] { override def rep: PNode = exp } + case class RangeEnumerateVariable(exp: PRange, ghost: Boolean, context: ExternalTypeInfo) extends ActualVariable { + override def addressable: Boolean = false + override def rep: PNode = exp + } + sealed trait TypeEntity extends Regular sealed trait ActualTypeEntity extends TypeEntity with ActualRegular { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index d2adce9ac..743cfd2b7 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -115,7 +115,7 @@ trait NameResolution { case decl: PShortForRange => val idx = decl.shorts.zipWithIndex.find(_._1 == id).get._2 - RangeVariable(idx, decl.range, isGhost, addressable = false, this) // TODO: check if range variables are addressable in Go + RangeVariable(idx, decl.range, isGhost, addressable = decl.addressable(idx), this) case decl: PSelectShortRecv => val idx = decl.shorts.zipWithIndex.find(_._1 == id).get._2 @@ -126,6 +126,8 @@ trait NameResolution { case AssignMode.Multi => MultiLocalVariable(idx, decl.recv, isGhost, addressable = false, this) case _ => UnknownEntity() } + case decl: PRange => + RangeEnumerateVariable(decl, isGhost, this) case _ => violation("unexpected parent of unknown id") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala index f09caf7fe..513c3eb89 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala @@ -128,6 +128,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => } }) + case _:RangeEnumerateVariable => LocalMessages(noMessages) + case Field(PFieldDecl(_, typ), _, _) => unsafeMessage(! { wellDefAndType.valid(typ) }) @@ -231,6 +233,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"expected tuple but got $t") } + case RangeEnumerateVariable(range, _, context) => rangeEnumeratorType(underlyingType(context.typ(range.exp))) + case Field(PFieldDecl(_, typ), _, context) => context.symbType(typ) case Embbed(PEmbeddedDecl(typ, _), _, context) => context.typ(typ) @@ -269,7 +273,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => def getBlankAssigneeTypeRange(n: PNode, left: Vector[PNode], range: PRange): Type = { require(n.isInstanceOf[PIdnNode] || n.isInstanceOf[PBlankIdentifier]) val pos = left indexWhere (n eq _) - exprType(range.exp) match { + violation(pos >= 0, "did not find expression corresponding to " + n) + underlyingType(exprType(range.exp)) match { case ChannelT(elem, ChannelModus.Recv | ChannelModus.Bi) => elem case _ => miscType(range).asInstanceOf[InternalSingleMulti].mul.ts(pos) } @@ -281,9 +286,18 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case PShortVarDecl(right, left, _) => getBlankAssigneeType(w, left, right) case PVarDecl(typ, right, left, _) => typ.map(symbType).getOrElse(getBlankAssigneeType(w, left, right)) case PConstSpec(typ, right, left) => typ.map(symbType).getOrElse(getBlankAssigneeType(w, left, right)) + case PShortForRange(range, shorts, _, _, _) => getBlankAssigneeTypeRange(w, shorts, range) + case PRange(exp, enumerated) => if (w eq enumerated) rangeEnumeratorType(underlyingType(exprType(exp))) + else violation("did not find expression corresponding to " + w) case _ => ??? } case _ => ??? } } + + def rangeEnumeratorType(typ: Type) : Type = typ match { + case _: SliceT | _: ArrayT => IntT(config.typeBounds.Int) + case MapT(key, _) => SetT(key) + case t => violation(s"type $t is not supported for range") + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala index 639b5d74a..059966248 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala @@ -24,9 +24,9 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def wellDefActualMisc(misc: PActualMisc): Messages = misc match { - case n@PRange(exp) => isExpr(exp).out ++ (underlyingType(exprType(exp)) match { - case _: ArrayT | PointerT(_: ArrayT) | _: SliceT | _: GhostSliceT | - _: MapT | ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages + case n@PRange(exp, _) => isExpr(exp).out ++ (underlyingType(exprType(exp)) match { + case _: ArrayT | PointerT(_: ArrayT) | _: SliceT | _: GhostSliceT | _: MapT | + ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages case t => message(n, s"type error: got $t but expected rangeable type") }) @@ -50,7 +50,7 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def actualMiscType(misc: PActualMisc): Type = misc match { - case PRange(exp) => underlyingType(exprType(exp)) match { + case PRange(exp, _) => underlyingType(exprType(exp)) match { case ArrayT(_, elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) case PointerT(ArrayT(_, elem)) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) case SliceT(elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala index c008753a7..ad6c39039 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala @@ -8,7 +8,7 @@ package viper.gobra.frontend.info.implementation.typing import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages} import viper.gobra.ast.frontend._ -import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelModus, ChannelT, FunctionT, InterfaceT, InternalTupleT, Type} +import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelModus, ChannelT, FunctionT, InterfaceT, InternalTupleT, Type, ArrayT, SliceT, MapT, SetT} import viper.gobra.frontend.info.implementation.TypeInfoImpl trait StmtTyping extends BaseTyping { this: TypeInfoImpl => @@ -101,11 +101,22 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl => case n@PForStmt(_, cond, _, _, _) => isExpr(cond).out ++ comparableTypes.errors(exprType(cond), BooleanT)(n) - case _@PShortForRange(range, shorts, _, _) => - multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range) + case PShortForRange(range, shorts, _, _, _) => + underlyingType(exprType(range.exp)) match { + case _ : ArrayT | _ : SliceT => + multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range) ++ + assignableTo.errors(miscType(range), idType(range.enumerated))(range) + case MapT(key, _) => multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range) ++ + assignableTo.errors((SetT(key), idType(range.enumerated)))(range) + case t => error(range, s"range not supported for type $t") + } - case _@PAssForRange(range, ass, _, _) => - multiAssignableTo.errors(Vector(miscType(range)), ass map exprType)(range) + case PAssForRange(range, ass, _, _) => + underlyingType(exprType(range.exp)) match { + case _ : ArrayT | _ : SliceT | _ : MapT => + multiAssignableTo.errors(Vector(miscType(range)), ass map exprType)(range) + case t => error(range, s"range not supported for type $t") + } case n@PGoStmt(exp) => isExpr(exp).out ++ isExecutable.errors(exp)(n) diff --git a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala index 57bed8f49..2cc79ddc3 100644 --- a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala +++ b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala @@ -6,7 +6,7 @@ package viper.gobra.reporting -import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, MainPreNotEstablished, OverflowCheckAnnotation, ReceiverNotNilCheckAnnotation, RangeVariableMightNotExistAnnotation} +import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, MainPreNotEstablished, OverflowCheckAnnotation, ReceiverNotNilCheckAnnotation, InsufficientPermissionToRangeExpressionAnnotation, LoopInvariantNotEstablishedAnnotation} import viper.gobra.reporting.Source.Verifier./ import viper.silver @@ -86,7 +86,6 @@ object DefaultErrorBackTranslator { val transformVerificationErrorReason: VerificationErrorReason => VerificationErrorReason = { case AssertionFalseError(info / OverflowCheckAnnotation) => OverflowErrorReason(info) case AssertionFalseError(info / ReceiverNotNilCheckAnnotation) => InterfaceReceiverIsNilReason(info) - case AssertionFalseError(info / RangeVariableMightNotExistAnnotation(_)) => AssertionFalseError(info) case x => x } @@ -170,8 +169,6 @@ class DefaultErrorBackTranslator( case _ / AutoImplProofAnnotation(subT, superT) => GeneratedImplementationProofError(subT, superT, x) - case _ / RangeVariableMightNotExistAnnotation(rangeExpr) => - x.reasons.foldLeft(RangeVariableMightNotExistError(x.info)(rangeExpr): VerificationError){ case (err, reason) => err dueTo reason } case _ / MainPreNotEstablished => x.reasons.foldLeft(MainPreconditionNotEstablished(x.info): VerificationError){ case (err, reason) => err dueTo reason @@ -182,6 +179,12 @@ class DefaultErrorBackTranslator( case (err, reason) => err dueTo reason } + case _ / InsufficientPermissionToRangeExpressionAnnotation() => + x.reasons.foldLeft(InsufficientPermissionToRangeExpressionError(x.info): VerificationError){ case (err, reason) => err dueTo reason } + + case _ / LoopInvariantNotEstablishedAnnotation => + x.reasons.foldLeft(LoopInvariantEstablishmentError(x.info): VerificationError) { case (err, reason) => err dueTo reason } + case _ => x } diff --git a/src/main/scala/viper/gobra/reporting/Source.scala b/src/main/scala/viper/gobra/reporting/Source.scala index 269eae872..6204aa50d 100644 --- a/src/main/scala/viper/gobra/reporting/Source.scala +++ b/src/main/scala/viper/gobra/reporting/Source.scala @@ -29,8 +29,9 @@ object Source { case object ReceiverNotNilCheckAnnotation extends Annotation case object ImportPreNotEstablished extends Annotation case object MainPreNotEstablished extends Annotation + case object LoopInvariantNotEstablishedAnnotation extends Annotation case class NoPermissionToRangeExpressionAnnotation() extends Annotation - case class RangeVariableMightNotExistAnnotation(rangeExpr: String) extends Annotation + case class InsufficientPermissionToRangeExpressionAnnotation() extends Annotation case class AutoImplProofAnnotation(subT: String, superT: String) extends Annotation object Parser { diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala index 3e79d20dc..87bc18724 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierError.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala @@ -286,7 +286,12 @@ case class RangeVariableMightNotExistError(info: Source.Verifier.Info)(rangeExpr case class NoPermissionToRangeExpressionError(info: Source.Verifier.Info) extends VerificationError { override def localId: String = "no_permission_to_range_expression" - override def localMessage: String = s"Might not have read permissions to range expression" + override def localMessage: String = s"Might not have read permission to range expression" +} + +case class InsufficientPermissionToRangeExpressionError(info: Source.Verifier.Info) extends VerificationError { + override def localId: String = "insufficient_permission_to_range_expression" + override def localMessage: String = s"Range expression should be immutable inside the loop body" } case class MapMakePreconditionError(info: Source.Verifier.Info) extends VerificationError { diff --git a/src/test/resources/regressions/features/loops/range-fail1.gobra b/src/test/resources/regressions/features/loops/range-fail1.gobra index 1529584b4..6bc8e2c97 100644 --- a/src/test/resources/regressions/features/loops/range-fail1.gobra +++ b/src/test/resources/regressions/features/loops/range-fail1.gobra @@ -6,6 +6,6 @@ package pkg func foo_arr() { x := [4]uint{1, 2, 3, 4} //:: ExpectedOutput(type_error) - for i, j, k := range x { + for i, j, k := range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail2.gobra b/src/test/resources/regressions/features/loops/range-fail2.gobra index f202fa721..f215873b0 100644 --- a/src/test/resources/regressions/features/loops/range-fail2.gobra +++ b/src/test/resources/regressions/features/loops/range-fail2.gobra @@ -6,6 +6,6 @@ package pkg func foo_arr() { x := []uint{1, 2, 3, 4} //:: ExpectedOutput(no_permission_to_range_expression) - for i, j := range x { + for i, j := range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail3.gobra b/src/test/resources/regressions/features/loops/range-fail3.gobra index f2ea52d51..4a2aaf470 100644 --- a/src/test/resources/regressions/features/loops/range-fail3.gobra +++ b/src/test/resources/regressions/features/loops/range-fail3.gobra @@ -8,6 +8,6 @@ func foo_arr() { var i int var j int //:: ExpectedOutput(type_error) - for i, j = range x { + for i, j = range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail4.gobra b/src/test/resources/regressions/features/loops/range-fail4.gobra index 82becb70f..fe4f2a129 100644 --- a/src/test/resources/regressions/features/loops/range-fail4.gobra +++ b/src/test/resources/regressions/features/loops/range-fail4.gobra @@ -8,6 +8,6 @@ func foo_arr() { var i uint var j uint //:: ExpectedOutput(type_error) - for i, j = range x { + for i, j = range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail5.gobra b/src/test/resources/regressions/features/loops/range-fail5.gobra index 836095d32..d4e05c3fc 100644 --- a/src/test/resources/regressions/features/loops/range-fail5.gobra +++ b/src/test/resources/regressions/features/loops/range-fail5.gobra @@ -9,6 +9,6 @@ func foo_arr() { var j uint var k int //:: ExpectedOutput(type_error) - for i, j, k = range x { + for i, j, k = range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail6.gobra b/src/test/resources/regressions/features/loops/range-fail6.gobra index 3fdacf5b8..37b2b4f0a 100644 --- a/src/test/resources/regressions/features/loops/range-fail6.gobra +++ b/src/test/resources/regressions/features/loops/range-fail6.gobra @@ -6,6 +6,6 @@ package pkg func foo_arr() { x := 0 //:: ExpectedOutput(type_error) - for i, j := range x { + for i, j := range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail7.gobra b/src/test/resources/regressions/features/loops/range-fail7.gobra index 02aaa778b..a3a1473c8 100644 --- a/src/test/resources/regressions/features/loops/range-fail7.gobra +++ b/src/test/resources/regressions/features/loops/range-fail7.gobra @@ -7,6 +7,6 @@ func foo() { x := [0]int{} //:: ExpectedOutput(invariant_establishment_error) invariant false - for i, j := range x { + for i, j := range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail8.gobra b/src/test/resources/regressions/features/loops/range-fail8.gobra index f71ffffaf..1decd510e 100644 --- a/src/test/resources/regressions/features/loops/range-fail8.gobra +++ b/src/test/resources/regressions/features/loops/range-fail8.gobra @@ -6,8 +6,8 @@ package pkg func foo_arr() { x := []uint{} invariant acc(x) - //:: ExpectedOutput(range_variable_might_not_exist:assertion_error) + //:: ExpectedOutput(invariant_establishment_error) invariant i == 0 - for i, j := range x { + for i, j := range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range1.gobra b/src/test/resources/regressions/features/loops/range1.gobra index fa290797b..24d426be5 100644 --- a/src/test/resources/regressions/features/loops/range1.gobra +++ b/src/test/resources/regressions/features/loops/range1.gobra @@ -12,9 +12,9 @@ func foo(x []uint) (max uint) { max = x[0] invariant acc(x) invariant 0 <= i && i <= len(x) - invariant forall k int :: 0 <= k && k < i ==> max >= x[k] - decreases len(x) - i - for i, j := range x { + invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k] + decreases len(x) - i0 + for i, j := range x with i0 { if j > max { max = j } @@ -25,8 +25,8 @@ func foo_arr() { x := [4]uint{1, 2, 3, 4} max := x[0] invariant 0 <= i && i <= len(x) - invariant forall k int :: 0 <= k && k < i ==> max >= x[k] - for i, j := range x { + invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k] + for i, j := range x with i0 { if j > max { max = j } @@ -45,10 +45,9 @@ func bar2() { x := []int{1, 2, 3, 4, 5} sum := 0 invariant acc(x) - invariant 0 <= i && i <= len(x) - invariant sum == i * (i - 1) / 2 - decreases len(x) - i - for i := range x { + invariant sum == i0 * (i0 - 1) / 2 + decreases len(x) - i0 + for i := range x with i0 { sum += i } assert sum == len(x) * (len(x) - 1) / 2 @@ -60,24 +59,24 @@ func foo2() { for _, j := range x { } invariant acc(x) - for i, _ := range x { + for i, _ := range x with i0 { } invariant acc(x) for _, _ := range x { } invariant acc(x) - for _ := range x { + for _ := range x with _ { } } func foo3() { x := [0]int{} - for i, j := range x { + for i, j := range x with i0 { } y := []int{} - for i, j := range x { + for i, j := range x with i0 { } - for i,j := range x { + for i, j := range x { continue break } diff --git a/src/test/resources/regressions/features/loops/range2.gobra b/src/test/resources/regressions/features/loops/range2.gobra index b49f5b800..f81c0c52c 100644 --- a/src/test/resources/regressions/features/loops/range2.gobra +++ b/src/test/resources/regressions/features/loops/range2.gobra @@ -15,10 +15,9 @@ func foo() { // this invariant is also automatically generated but // only after the next one which causes the next one to fail // in such a case, the user must provide it himself - invariant 0 <= z[1] && z[1] <= len(x) - invariant forall k int :: 0 <= k && k < z[1] ==> max >= x[k] - decreases len(x) - z[1] - for z[1], y[2] = range x { + invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k] + decreases len(x) - i0 + for z[1], y[2] = range x with i0 { if y[2] > max { max = y[2] } @@ -32,20 +31,20 @@ func foo2() { var i uint var j int invariant acc(x) - decreases len(x) - j - for j, _ = range x { + decreases len(x) - i0 + for j, _ = range x with i0 { } invariant acc(x) - for _ = range x { + for _ = range x with _ { } invariant acc(x) for _, i = range x { } invariant acc(x) - for j = range x { + for j = range x with i0 { } invariant acc(x) - for _ = range x { + for _ = range x with i0 { continue break } diff --git a/src/test/resources/regressions/features/loops/range3.gobra b/src/test/resources/regressions/features/loops/range3.gobra new file mode 100644 index 000000000..39ea0e1e3 --- /dev/null +++ b/src/test/resources/regressions/features/loops/range3.gobra @@ -0,0 +1,29 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +func foo() { + x := []int{1,2,3} + invariant acc(&info) + invariant acc(x) + for _, info@ := range x with i { + bar(&info) + } +} + +func foo1() { + x := []int{1,2,3} + info@ := 0 + invariant acc(&info) + invariant acc(x) + for _, info = range x with i { + bar(&info) + } +} + +requires acc(i) +ensures acc(i) +func bar(i *int) { + *i = 3 +} diff --git a/src/test/resources/regressions/features/loops/range_maps-fail1.gobra b/src/test/resources/regressions/features/loops/range_maps-fail1.gobra new file mode 100644 index 000000000..0d8030366 --- /dev/null +++ b/src/test/resources/regressions/features/loops/range_maps-fail1.gobra @@ -0,0 +1,13 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +func foo() { + x := map[uint]int{1:1, 2:3} + var i int + var j int + //:: ExpectedOutput(type_error) + for i, j = range x with i0 { + } +} diff --git a/src/test/resources/regressions/features/loops/range_maps1.gobra b/src/test/resources/regressions/features/loops/range_maps1.gobra new file mode 100644 index 000000000..f065e5c1e --- /dev/null +++ b/src/test/resources/regressions/features/loops/range_maps1.gobra @@ -0,0 +1,55 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + + +requires acc(x) +requires len(x) > 0 +ensures acc(x) +ensures forall k uint :: k in domain(x) ==> max >= k +decreases +func foo(x map[uint]int) (max uint) { + max = 0 + invariant acc(x) + invariant forall i uint :: i in visited ==> max >= i + decreases len(domain(x)) - len(visited) + for k, v := range x with visited { + if k > max { + max = k + } + } +} + +decreases +func bar() { + x := map[uint]int{1:1, 2:2, 3:3} + m := foo(x) + assert forall i uint :: i in domain(x) ==> m >= i +} + +requires acc(x) +requires len(x) > 0 +ensures acc(x) +ensures forall k int :: k in domain(x) ==> max >= x[k] +decreases +func foo1(x map[int]uint) (max uint) { + max = 0 + var k int + var v uint + invariant acc(x) + invariant forall i int :: i in visited ==> max >= x[i] + decreases len(domain(x)) - len(visited) + for k, v = range x with visited { + if v > max { + max = v + } + } +} + +decreases +func bar1() { + x := map[int]uint{1:1, 2:2, 3:3} + m := foo1(x) + assert forall i int :: i in domain(x) ==> m >= x[i] +} From 501565c49f0a5a6cbdd3c892034b6de0e3208654 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 20 Oct 2022 17:10:10 +0200 Subject: [PATCH 021/296] Updates submodules (#552) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 2e4743769..346cc60f3 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 2e47437693fcdc32f8f18b7c923550c1143013d7 +Subproject commit 346cc60f30950ed5c75870fe7820d04670e0f940 From 28b312ad7fab86a06a68bc5f40f9547abd5219c7 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 11 Oct 2022 10:11:06 +0200 Subject: [PATCH 022/296] assumes termination measure for imported (pure) methods & functions such that no proof obligations will be emitted --- .../gobra/frontend/ParseTreeTranslator.scala | 20 ++++++++--- .../termination-import/foo/foo.gobra | 34 +++++++++++++++++++ .../termination/termination-import/main.gobra | 18 ++++++++++ 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra create mode 100644 src/test/resources/regressions/features/termination/termination-import/main.gobra diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 5745091ec..635724cca 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -1858,14 +1858,24 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link #visitChildren} on {@code ctx}.

*/ override def visitTerminationMeasure(ctx: TerminationMeasureContext): PTerminationMeasure = { + // when parsing imported packages (`specOnly` will be true), we trust the annotations of imported members + // therefore, e.g. bodies of non-pure functions & methods will be ignored. However, the body of pure + // functions & methods is retained. To avoid that Viper will generate proof obligations for checking termination + // of imported pure functions & methods, we simply translate tuple termination measures into wildcard measures (for + // a given condition). Therefore, no proof obligations will be created for checking termination of imported members. + // This is technically not necessary for imported non-pure functions & methods because they are abstract + // anyway but we apply the same transformation for simplicity as we do not have to perform a case distinction on + // whether the termination measure is part of a pure or non-pure member. val cond = visitNodeOrNone[PExpression](ctx.expression()) visitExpressionList(ctx.expressionList()) match { case Vector(PBlankIdentifier()) => PWildcardMeasure(cond).at(ctx) - case exprs if exprs.nonEmpty => PTupleTerminationMeasure(exprs, cond).at(ctx) - case Vector() => PTupleTerminationMeasure(Vector.empty, cond).at(ctx.parent match { - case s : SpecStatementContext => s.DEC() - case l : LoopSpecContext => l.DEC() - }) + case exprs if exprs.nonEmpty => if (specOnly) PWildcardMeasure(cond).at(ctx) else PTupleTerminationMeasure(exprs, cond).at(ctx) + case Vector() => + val parentCtx = ctx.parent match { + case s : SpecStatementContext => s.DEC() + case l : LoopSpecContext => l.DEC() + } + if (specOnly) PWildcardMeasure(cond).at(parentCtx) else PTupleTerminationMeasure(Vector.empty, cond).at(parentCtx) case _ => unexpected(ctx) } } diff --git a/src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra b/src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra new file mode 100644 index 000000000..0f954ffbf --- /dev/null +++ b/src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra @@ -0,0 +1,34 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// all functions & methods in this package violate their termination annotations and thus fail to verify. +// however, importing and calling these functions & methods in different packages is supposed to be fine because +// we simply trust the annotations + +package foo + +type Foo struct{} + +decreases +pure func pure_foo_function() bool { + //:: ExpectedOutput(function_termination_error) + return pure_foo_function() +} + +decreases +pure func (foo Foo) pure_foo_method() bool { + //:: ExpectedOutput(function_termination_error) + return foo.pure_foo_method() +} + +decreases +func foo_function() bool { + //:: ExpectedOutput(function_termination_error) + return foo_function() +} + +decreases +func (foo Foo) foo_method() bool { + //:: ExpectedOutput(function_termination_error) + return foo.foo_method() +} diff --git a/src/test/resources/regressions/features/termination/termination-import/main.gobra b/src/test/resources/regressions/features/termination/termination-import/main.gobra new file mode 100644 index 000000000..d70c06812 --- /dev/null +++ b/src/test/resources/regressions/features/termination/termination-import/main.gobra @@ -0,0 +1,18 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// checks whether termination of imported members is assumed instead of re-checked + +package termination + +// ##(-I ./) +import f "foo" + +decreases +func test() { + foo := f.Foo{} + f.pure_foo_function() + foo.pure_foo_method() + f.foo_function() + foo.foo_method() +} From e07e52072c4bb342fdf04cb682ce7fe6d9083366 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 11 Oct 2022 14:03:41 +0200 Subject: [PATCH 023/296] fixes an unsoundness pointed out by Joao --- .../gobra/frontend/ParseTreeTranslator.scala | 20 ++---- .../scala/viper/gobra/frontend/Parser.scala | 69 ++++++++++++++++++- .../foo/foo.gobra | 28 ++++++++ .../termination-import-interface/main.gobra | 26 +++++++ .../foo/foo.gobra | 4 +- .../main.gobra | 0 6 files changed, 128 insertions(+), 19 deletions(-) create mode 100644 src/test/resources/regressions/features/termination/termination-import-interface/foo/foo.gobra create mode 100644 src/test/resources/regressions/features/termination/termination-import-interface/main.gobra rename src/test/resources/regressions/features/termination/{termination-import => termination-import-members}/foo/foo.gobra (87%) rename src/test/resources/regressions/features/termination/{termination-import => termination-import-members}/main.gobra (100%) diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 635724cca..5745091ec 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -1858,24 +1858,14 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link #visitChildren} on {@code ctx}.

*/ override def visitTerminationMeasure(ctx: TerminationMeasureContext): PTerminationMeasure = { - // when parsing imported packages (`specOnly` will be true), we trust the annotations of imported members - // therefore, e.g. bodies of non-pure functions & methods will be ignored. However, the body of pure - // functions & methods is retained. To avoid that Viper will generate proof obligations for checking termination - // of imported pure functions & methods, we simply translate tuple termination measures into wildcard measures (for - // a given condition). Therefore, no proof obligations will be created for checking termination of imported members. - // This is technically not necessary for imported non-pure functions & methods because they are abstract - // anyway but we apply the same transformation for simplicity as we do not have to perform a case distinction on - // whether the termination measure is part of a pure or non-pure member. val cond = visitNodeOrNone[PExpression](ctx.expression()) visitExpressionList(ctx.expressionList()) match { case Vector(PBlankIdentifier()) => PWildcardMeasure(cond).at(ctx) - case exprs if exprs.nonEmpty => if (specOnly) PWildcardMeasure(cond).at(ctx) else PTupleTerminationMeasure(exprs, cond).at(ctx) - case Vector() => - val parentCtx = ctx.parent match { - case s : SpecStatementContext => s.DEC() - case l : LoopSpecContext => l.DEC() - } - if (specOnly) PWildcardMeasure(cond).at(parentCtx) else PTupleTerminationMeasure(Vector.empty, cond).at(parentCtx) + case exprs if exprs.nonEmpty => PTupleTerminationMeasure(exprs, cond).at(ctx) + case Vector() => PTupleTerminationMeasure(Vector.empty, cond).at(ctx.parent match { + case s : SpecStatementContext => s.DEC() + case l : LoopSpecContext => l.DEC() + }) case _ => unexpected(ctx) } } diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index b02a7b327..697a2d401 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -50,7 +50,14 @@ object Parser { }) for { parseAst <- parseSources(sources, pkgInfo, specOnly)(config) - postprocessedAst <- new ImportPostprocessor(parseAst.positions.positions).postprocess(parseAst)(config) + postprocessors = Seq( + new ImportPostprocessor(parseAst.positions.positions), + new TerminationMeasurePostprocessor(parseAst.positions.positions, specOnly), + ) + postprocessedAst <- postprocessors.foldLeft[Either[Vector[VerifierError], PPackage]](Right(parseAst)) { + case (Right(ast), postprocessor) => postprocessor.postprocess(ast)(config) + case (e, _) => e + } } yield postprocessedAst } @@ -214,8 +221,11 @@ object Parser { } + trait Postprocessor extends PositionedRewriter { + def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] + } - private class ImportPostprocessor(override val positions: Positions) extends PositionedRewriter { + private class ImportPostprocessor(override val positions: Positions) extends Postprocessor { /** * Replaces all PQualifiedWoQualifierImport by PQualifiedImport nodes */ @@ -266,7 +276,62 @@ object Parser { } } + private class TerminationMeasurePostprocessor(override val positions: Positions, specOnly: Boolean) extends Postprocessor { + /** + * if `specOnly` is set to true, this postprocessor replaces all tuple termination measures specified for functions + * or methods by wildcard termination measures while maintaining their condition (if any). Note that termination + * measures specified for interface methods remain untouched. + * + * // when parsing imported packages (`specOnly` will be true), we trust the annotations of imported members + // therefore, e.g. bodies of (non-pure) functions & methods will be ignored. However, the body of pure + // functions & methods is retained. To avoid that Viper will generate proof obligations for checking termination + // of pure functions & methods, we simply translate tuple termination measures into wildcard measures (for a given + // condition). Therefore, no proof obligations will be created for checking termination of imported members. + // This is technically not necessary for imported (non-pure) functions & methods because they are abstract + // anyway but for pure functions & methods the following transformation ensures that no proof obligations will + // be created by Viper: + */ + def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = { + if (specOnly) replaceTerminationMeasures(pkg) else Right(pkg) + } + private def replaceTerminationMeasures(pkg: PPackage): Either[Vector[VerifierError], PPackage] = { + def replace(spec: PFunctionSpec): PFunctionSpec = { + val replacedMeasures = spec.terminationMeasures.map { + case n@PTupleTerminationMeasure(_, cond) => + val newMeasure = PWildcardMeasure(cond) + // copy positional information as the strategy only makes sure that positional information is correctly set + // for the resulting function or method declaration + pkg.positions.positions.dupPos(n, newMeasure) + newMeasure + case t => t + } + PFunctionSpec(spec.pres, spec.preserves, spec.posts, replacedMeasures, spec.isPure, spec.isTrusted) + } + + val replaceTerminationMeasuresForFunctionsAndMethods: Strategy = + strategyWithName[Any]("replaceTerminationMeasuresForFunctionsAndMethods", { + // apply transformation only to the specification of function or method declaration (in particular, do not + // apply the transformation to method signatures in interface declarations) + case n: PFunctionDecl => Some(PFunctionDecl(n.id, n.args, n.result, replace(n.spec), n.body)) + case n: PMethodDecl => Some(PMethodDecl(n.id, n.receiver, n.args, n.result, replace(n.spec), n.body)) + case n: PMember => Some(n) + }) + + // apply strategy only to import nodes in each program + val updatedProgs = pkg.programs.map(prog => { + // apply the replaceTerminationMeasuresForFunctionsAndMethods to declarations until the strategy has succeeded + // (i.e. has reached PMember nodes) and stop then + val updatedDecls = rewrite(alltd(replaceTerminationMeasuresForFunctionsAndMethods))(prog.declarations) + val updatedProg = PProgram(prog.packageClause, prog.initPosts, prog.imports, updatedDecls) + pkg.positions.positions.dupPos(prog, updatedProg) + }) + // create a new package node with the updated programs + val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info) + pkg.positions.positions.dupPos(pkg, updatedPkg) + Right(updatedPkg) + } + } private class SyntaxAnalyzer[Rule <: ParserRuleContext, Node <: AnyRef](tokens: CommonTokenStream, source: Source, errors: ListBuffer[ParserError], pom: PositionManager, specOnly: Boolean = false) extends GobraParser(tokens){ diff --git a/src/test/resources/regressions/features/termination/termination-import-interface/foo/foo.gobra b/src/test/resources/regressions/features/termination/termination-import-interface/foo/foo.gobra new file mode 100644 index 000000000..1c8c1e713 --- /dev/null +++ b/src/test/resources/regressions/features/termination/termination-import-interface/foo/foo.gobra @@ -0,0 +1,28 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package foo + +type Foo interface { + decreases + pure PureFn() bool + + decreases + Fn() bool +} + +type FooImpl struct{} + +//:: ExpectedOutput(generated_implementation_proof:pure_function_termination_error) +pure func (foo FooImpl) PureFn() bool { + return true +} + +//:: ExpectedOutput(generated_implementation_proof:function_termination_error) +func (foo FooImpl) Fn() bool { + return true +} + +func triggerSubtype() Foo { + return FooImpl{} +} diff --git a/src/test/resources/regressions/features/termination/termination-import-interface/main.gobra b/src/test/resources/regressions/features/termination/termination-import-interface/main.gobra new file mode 100644 index 000000000..b7e877f65 --- /dev/null +++ b/src/test/resources/regressions/features/termination/termination-import-interface/main.gobra @@ -0,0 +1,26 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +// this testcase checks whether the correct proof obligations are used for checking behavioral subtyping of an imported +// interface that specifies termination measures for the interface members. + +// ##(-I ./) +import f "foo" + +type FooImpl2 struct{} + +//:: ExpectedOutput(generated_implementation_proof:pure_function_termination_error) +pure func (foo FooImpl2) PureFn() bool { + return true +} + +//:: ExpectedOutput(generated_implementation_proof:function_termination_error) +func (foo FooImpl2) Fn() bool { + return true +} + +func triggerSubtype() f.Foo { + return FooImpl2{} +} diff --git a/src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra b/src/test/resources/regressions/features/termination/termination-import-members/foo/foo.gobra similarity index 87% rename from src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra rename to src/test/resources/regressions/features/termination/termination-import-members/foo/foo.gobra index 0f954ffbf..dd0a5bbdd 100644 --- a/src/test/resources/regressions/features/termination/termination-import/foo/foo.gobra +++ b/src/test/resources/regressions/features/termination/termination-import-members/foo/foo.gobra @@ -11,13 +11,13 @@ type Foo struct{} decreases pure func pure_foo_function() bool { - //:: ExpectedOutput(function_termination_error) + //:: ExpectedOutput(pure_function_termination_error) return pure_foo_function() } decreases pure func (foo Foo) pure_foo_method() bool { - //:: ExpectedOutput(function_termination_error) + //:: ExpectedOutput(pure_function_termination_error) return foo.pure_foo_method() } diff --git a/src/test/resources/regressions/features/termination/termination-import/main.gobra b/src/test/resources/regressions/features/termination/termination-import-members/main.gobra similarity index 100% rename from src/test/resources/regressions/features/termination/termination-import/main.gobra rename to src/test/resources/regressions/features/termination/termination-import-members/main.gobra From dd41140a58faf83ee022e9d5866d4455bddd4f75 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 11 Oct 2022 17:16:10 +0200 Subject: [PATCH 024/296] implements suggestion by Joao --- .../scala/viper/gobra/frontend/Parser.scala | 125 ++++++++++++++---- 1 file changed, 100 insertions(+), 25 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 697a2d401..0a42dce47 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -22,6 +22,7 @@ import viper.silver.ast.SourcePosition import scala.collection.mutable.ListBuffer import java.security.MessageDigest +import scala.annotation.tailrec object Parser { @@ -278,47 +279,119 @@ object Parser { private class TerminationMeasurePostprocessor(override val positions: Positions, specOnly: Boolean) extends Postprocessor { /** - * if `specOnly` is set to true, this postprocessor replaces all tuple termination measures specified for functions - * or methods by wildcard termination measures while maintaining their condition (if any). Note that termination + * if `specOnly` is set to true, this postprocessor replaces all tuple termination measures specified for pure functions + * or pure methods by wildcard termination measures while maintaining their condition (if any). Note that termination * measures specified for interface methods remain untouched. + * Furthermore, pure functions and pure methods are made abstract by turning their bodies into an additional + * postcondition. * - * // when parsing imported packages (`specOnly` will be true), we trust the annotations of imported members - // therefore, e.g. bodies of (non-pure) functions & methods will be ignored. However, the body of pure - // functions & methods is retained. To avoid that Viper will generate proof obligations for checking termination - // of pure functions & methods, we simply translate tuple termination measures into wildcard measures (for a given - // condition). Therefore, no proof obligations will be created for checking termination of imported members. - // This is technically not necessary for imported (non-pure) functions & methods because they are abstract - // anyway but for pure functions & methods the following transformation ensures that no proof obligations will - // be created by Viper: + * These steps ensure that imported pure functions and pure methods do not result in proof obligations as their + * postconditions and termination (in case a decreases measure has been provided) is simply assumed. */ def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = { if (specOnly) replaceTerminationMeasures(pkg) else Right(pkg) } private def replaceTerminationMeasures(pkg: PPackage): Either[Vector[VerifierError], PPackage] = { - def replace(spec: PFunctionSpec): PFunctionSpec = { - val replacedMeasures = spec.terminationMeasures.map { - case n@PTupleTerminationMeasure(_, cond) => - val newMeasure = PWildcardMeasure(cond) - // copy positional information as the strategy only makes sure that positional information is correctly set - // for the resulting function or method declaration - pkg.positions.positions.dupPos(n, newMeasure) - newMeasure - case t => t - } - PFunctionSpec(spec.pres, spec.preserves, spec.posts, replacedMeasures, spec.isPure, spec.isTrusted) + def createError(n: PNode, errorMsg: String): Vector[VerifierError] = + pkg.positions.translate(message(n, errorMsg), ParserError) + + // unfortunately Kiama does not seem to offer a way to report errors while applying the strategy + // hence, we keep ourselves track of errors + var failedNodes: Vector[VerifierError] = Vector() + + /** + * checks whether the body is either empty or consists of a single return statement and returns the corresponding expression + */ + def getBodyExpr(body: Option[(PBodyParameterInfo, PBlock)]): Option[PExpression] = body match { + case Some((_, block)) => + block.nonEmptyStmts match { + case Vector(PReturn(Vector(expr))) => Some(expr) + case _ => + failedNodes = failedNodes ++ createError(block, s"the imported pure function's or method's body is expected to contain only a return statement") + None + } + case None => None + } + + /** + * returns the name parameter if `param` is a named parameter or creates a new named parameter with the same type + */ + @tailrec + def getNamedOutParam(param: PParameter): Option[PNamedParameter] = param match { + case p: PNamedParameter => Some(p) + case p @ PUnnamedParameter(t) => + val idnDef = PIdnDef("res$") // '$' is appended to make it an invalid identifier and thus avoid the situation that an input parameter has already the same name + pkg.positions.positions.dupPos(p, idnDef) + val namedParam = PNamedParameter(idnDef, t) + pkg.positions.positions.dupPos(p, namedParam) + Some(namedParam) + case PExplicitGhostParameter(actual) => getNamedOutParam(actual) + } + + /** + * checks that there is exactly a single parameter and turns into into a named parameter in case it isn't yet a + * named parameter + */ + def getOutParam(result: PResult): Option[PNamedParameter] = result.outs match { + case Vector(out) => getNamedOutParam(out) + case _ => + failedNodes = failedNodes ++ createError(result, s"the imported pure function or method does not have exactly one result argument") + None + } + + /** + * performs the following operations: + * - makes the out parameter a named parameter if it's not the case yet + * - adds a postcondition stating that the named out parameter is equal to the body (the body can thus be dropped) + * - turns the decreases measures into wildcards while retaining the conditions under which they have been specified + * returns the modified result and spec + */ + def turnBodyIntoPostcondition(result: PResult, spec: PFunctionSpec, body: Option[(PBodyParameterInfo, PBlock)]): Option[(PResult, PFunctionSpec)] = { + for { + body <- getBodyExpr(body) + outParam <- getOutParam(result) + modifiedResult = PResult(Vector(outParam)) + _ = pkg.positions.positions.dupPos(result, modifiedResult) + outIdnUse = PIdnUse(outParam.id.name) + _ = pkg.positions.positions.dupPos(body, outIdnUse) + outOperand = PNamedOperand(outIdnUse) + _ = pkg.positions.positions.dupPos(body, outOperand) + additionalPostcondition = PEquals(outOperand, body) + _ = pkg.positions.positions.dupPos(body, additionalPostcondition) + // turning the body into a postcondition is not enough because Viper checks termination also for postconditions + // therefore, we turn termination measure tuples into wildcards to assume termination instead of checking it + modifiedTerminationMeasures = spec.terminationMeasures.map { + case n@PTupleTerminationMeasure(_, cond) => + val newMeasure = PWildcardMeasure(cond) + pkg.positions.positions.dupPos(n, newMeasure) + newMeasure + case t => t + } + modifiedSpec = PFunctionSpec(spec.pres, spec.preserves, spec.posts :+ additionalPostcondition, modifiedTerminationMeasures, spec.isPure, spec.isTrusted) + _ = pkg.positions.positions.dupPos(spec, modifiedSpec) + } yield (modifiedResult, modifiedSpec) } val replaceTerminationMeasuresForFunctionsAndMethods: Strategy = strategyWithName[Any]("replaceTerminationMeasuresForFunctionsAndMethods", { // apply transformation only to the specification of function or method declaration (in particular, do not // apply the transformation to method signatures in interface declarations) - case n: PFunctionDecl => Some(PFunctionDecl(n.id, n.args, n.result, replace(n.spec), n.body)) - case n: PMethodDecl => Some(PMethodDecl(n.id, n.receiver, n.args, n.result, replace(n.spec), n.body)) + case n: PFunctionDecl if n.spec.isPure => + for { + (modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body) + modifiedDecl = PFunctionDecl(n.id, n.args, modifiedResult, modifiedSpec, None) + _ = pkg.positions.positions.dupPos(n, modifiedDecl) + } yield modifiedDecl + case n: PMethodDecl if n.spec.isPure => + for { + (modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body) + modifiedDecl = PMethodDecl(n.id, n.receiver, n.args, modifiedResult, modifiedSpec, None) + _ = pkg.positions.positions.dupPos(n, modifiedDecl) + } yield modifiedDecl case n: PMember => Some(n) }) - // apply strategy only to import nodes in each program val updatedProgs = pkg.programs.map(prog => { // apply the replaceTerminationMeasuresForFunctionsAndMethods to declarations until the strategy has succeeded // (i.e. has reached PMember nodes) and stop then @@ -329,7 +402,9 @@ object Parser { // create a new package node with the updated programs val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info) pkg.positions.positions.dupPos(pkg, updatedPkg) - Right(updatedPkg) + // check whether an error has occurred + if (failedNodes.isEmpty) Right(updatedPkg) + else Left(failedNodes) } } From 204d047ded1ff5c88ab4026334a6b5df593a20dd Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 12 Oct 2022 09:26:18 +0200 Subject: [PATCH 025/296] simplifies code and uses ghost equality instead of regular equality --- .../scala/viper/gobra/frontend/Parser.scala | 60 ++++++++----------- 1 file changed, 25 insertions(+), 35 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 0a42dce47..562fe01bf 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -18,6 +18,7 @@ import org.antlr.v4.runtime.{CharStreams, CommonTokenStream, DefaultErrorStrateg import org.antlr.v4.runtime.atn.PredictionMode import org.antlr.v4.runtime.misc.ParseCancellationException import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} +import viper.gobra.util.Violation.violation import viper.silver.ast.SourcePosition import scala.collection.mutable.ListBuffer @@ -223,6 +224,13 @@ object Parser { trait Postprocessor extends PositionedRewriter { + /** this PositionedAstNode contains a subset of the utility functions found in ParseTreeTranslator.PositionedAstNode */ + implicit class PositionedAstNode[N <: AnyRef](node: N) { + def at(other: PNode): N = { + positions.dupPos(other, node) + } + } + def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] } @@ -244,8 +252,7 @@ object Parser { qualifierName <- PackageResolver.getQualifier(n)(config) // create a new PIdnDef node and set its positions according to the old node (PositionedRewriter ensures that // the same happens for the newly created PExplicitQualifiedImport) - idnDef = PIdnDef(qualifierName) - _ = pkg.positions.positions.dupPos(n, idnDef) + idnDef = PIdnDef(qualifierName).at(n) } yield PExplicitQualifiedImport(idnDef, n.importPath, n.importPres) // record errors: qualifier.left.foreach(errorMsg => failedNodes = failedNodes ++ createError(n, errorMsg)) @@ -265,12 +272,10 @@ object Parser { // note that the resolveImports strategy could be embedded in e.g. a logfail strategy to report a // failed strategy application val updatedImports = rewrite(topdown(attempt(resolveImports)))(prog.imports) - val updatedProg = PProgram(prog.packageClause, prog.initPosts, updatedImports, prog.declarations) - pkg.positions.positions.dupPos(prog, updatedProg) + PProgram(prog.packageClause, prog.initPosts, updatedImports, prog.declarations).at(prog) }) // create a new package node with the updated programs - val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info) - pkg.positions.positions.dupPos(pkg, updatedPkg) + val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info).at(pkg) // check whether an error has occurred if (failedNodes.isEmpty) Right(updatedPkg) else Left(failedNodes) @@ -321,11 +326,8 @@ object Parser { def getNamedOutParam(param: PParameter): Option[PNamedParameter] = param match { case p: PNamedParameter => Some(p) case p @ PUnnamedParameter(t) => - val idnDef = PIdnDef("res$") // '$' is appended to make it an invalid identifier and thus avoid the situation that an input parameter has already the same name - pkg.positions.positions.dupPos(p, idnDef) - val namedParam = PNamedParameter(idnDef, t) - pkg.positions.positions.dupPos(p, namedParam) - Some(namedParam) + val idnDef = PIdnDef("res$").at(p) // '$' is appended to make it an invalid identifier and thus avoid the situation that an input parameter has already the same name + Some(PNamedParameter(idnDef, t).at(p)) case PExplicitGhostParameter(actual) => getNamedOutParam(actual) } @@ -351,25 +353,19 @@ object Parser { for { body <- getBodyExpr(body) outParam <- getOutParam(result) - modifiedResult = PResult(Vector(outParam)) - _ = pkg.positions.positions.dupPos(result, modifiedResult) - outIdnUse = PIdnUse(outParam.id.name) - _ = pkg.positions.positions.dupPos(body, outIdnUse) - outOperand = PNamedOperand(outIdnUse) - _ = pkg.positions.positions.dupPos(body, outOperand) - additionalPostcondition = PEquals(outOperand, body) - _ = pkg.positions.positions.dupPos(body, additionalPostcondition) + modifiedResult = PResult(Vector(outParam)).at(result) + outIdnUse = PIdnUse(outParam.id.name).at(body) + outOperand = PNamedOperand(outIdnUse).at(body) + // we use ghost equals here to ensure that no additional checks are being added depending on the expression's type + // (e.g. that the returned interface is comparable) + additionalPostcondition = PGhostEquals(outOperand, body).at(body) // turning the body into a postcondition is not enough because Viper checks termination also for postconditions // therefore, we turn termination measure tuples into wildcards to assume termination instead of checking it modifiedTerminationMeasures = spec.terminationMeasures.map { - case n@PTupleTerminationMeasure(_, cond) => - val newMeasure = PWildcardMeasure(cond) - pkg.positions.positions.dupPos(n, newMeasure) - newMeasure + case n@PTupleTerminationMeasure(_, cond) => PWildcardMeasure(cond).at(n) case t => t } - modifiedSpec = PFunctionSpec(spec.pres, spec.preserves, spec.posts :+ additionalPostcondition, modifiedTerminationMeasures, spec.isPure, spec.isTrusted) - _ = pkg.positions.positions.dupPos(spec, modifiedSpec) + modifiedSpec = PFunctionSpec(spec.pres, spec.preserves, additionalPostcondition +: spec.posts, modifiedTerminationMeasures, spec.isPure, spec.isTrusted).at(spec) } yield (modifiedResult, modifiedSpec) } @@ -380,15 +376,11 @@ object Parser { case n: PFunctionDecl if n.spec.isPure => for { (modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body) - modifiedDecl = PFunctionDecl(n.id, n.args, modifiedResult, modifiedSpec, None) - _ = pkg.positions.positions.dupPos(n, modifiedDecl) - } yield modifiedDecl + } yield PFunctionDecl(n.id, n.args, modifiedResult, modifiedSpec, None).at(n) case n: PMethodDecl if n.spec.isPure => for { (modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body) - modifiedDecl = PMethodDecl(n.id, n.receiver, n.args, modifiedResult, modifiedSpec, None) - _ = pkg.positions.positions.dupPos(n, modifiedDecl) - } yield modifiedDecl + } yield PMethodDecl(n.id, n.receiver, n.args, modifiedResult, modifiedSpec, None).at(n) case n: PMember => Some(n) }) @@ -396,12 +388,10 @@ object Parser { // apply the replaceTerminationMeasuresForFunctionsAndMethods to declarations until the strategy has succeeded // (i.e. has reached PMember nodes) and stop then val updatedDecls = rewrite(alltd(replaceTerminationMeasuresForFunctionsAndMethods))(prog.declarations) - val updatedProg = PProgram(prog.packageClause, prog.initPosts, prog.imports, updatedDecls) - pkg.positions.positions.dupPos(prog, updatedProg) + PProgram(prog.packageClause, prog.initPosts, prog.imports, updatedDecls).at(prog) }) // create a new package node with the updated programs - val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info) - pkg.positions.positions.dupPos(pkg, updatedPkg) + val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info).at(pkg) // check whether an error has occurred if (failedNodes.isEmpty) Right(updatedPkg) else Left(failedNodes) From bc32a786928d07ef8bb78e47fa0d0a6a56cafcdb Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 12 Oct 2022 09:32:33 +0200 Subject: [PATCH 026/296] removes unused import --- src/main/scala/viper/gobra/frontend/Parser.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 562fe01bf..313bb15ac 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -18,7 +18,6 @@ import org.antlr.v4.runtime.{CharStreams, CommonTokenStream, DefaultErrorStrateg import org.antlr.v4.runtime.atn.PredictionMode import org.antlr.v4.runtime.misc.ParseCancellationException import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} -import viper.gobra.util.Violation.violation import viper.silver.ast.SourcePosition import scala.collection.mutable.ListBuffer From a5a37636712e3f5905f65bd41133faef9588a3db Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 17 Oct 2022 15:37:35 +0200 Subject: [PATCH 027/296] only change decreases measure to wildcard and leave bodies of pure functions and methods untouched --- .../scala/viper/gobra/frontend/Parser.scala | 100 +++--------------- 1 file changed, 14 insertions(+), 86 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 313bb15ac..6fcefc649 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -22,7 +22,6 @@ import viper.silver.ast.SourcePosition import scala.collection.mutable.ListBuffer import java.security.MessageDigest -import scala.annotation.tailrec object Parser { @@ -286,100 +285,32 @@ object Parser { * if `specOnly` is set to true, this postprocessor replaces all tuple termination measures specified for pure functions * or pure methods by wildcard termination measures while maintaining their condition (if any). Note that termination * measures specified for interface methods remain untouched. - * Furthermore, pure functions and pure methods are made abstract by turning their bodies into an additional - * postcondition. * - * These steps ensure that imported pure functions and pure methods do not result in proof obligations as their - * postconditions and termination (in case a decreases measure has been provided) is simply assumed. + * These steps ensure that termination of imported pure functions and pure methods is not checked again (in case + * a decreases measure has been provided) and instead gets simply assumed. + * + * Note that we do not transform the body of pure functions and pure methods (e.g. by turning the body into a + * postcondition) because this would result in a matching loop for recursive functions. */ def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = { if (specOnly) replaceTerminationMeasures(pkg) else Right(pkg) } private def replaceTerminationMeasures(pkg: PPackage): Either[Vector[VerifierError], PPackage] = { - def createError(n: PNode, errorMsg: String): Vector[VerifierError] = - pkg.positions.translate(message(n, errorMsg), ParserError) - - // unfortunately Kiama does not seem to offer a way to report errors while applying the strategy - // hence, we keep ourselves track of errors - var failedNodes: Vector[VerifierError] = Vector() - - /** - * checks whether the body is either empty or consists of a single return statement and returns the corresponding expression - */ - def getBodyExpr(body: Option[(PBodyParameterInfo, PBlock)]): Option[PExpression] = body match { - case Some((_, block)) => - block.nonEmptyStmts match { - case Vector(PReturn(Vector(expr))) => Some(expr) - case _ => - failedNodes = failedNodes ++ createError(block, s"the imported pure function's or method's body is expected to contain only a return statement") - None - } - case None => None - } - - /** - * returns the name parameter if `param` is a named parameter or creates a new named parameter with the same type - */ - @tailrec - def getNamedOutParam(param: PParameter): Option[PNamedParameter] = param match { - case p: PNamedParameter => Some(p) - case p @ PUnnamedParameter(t) => - val idnDef = PIdnDef("res$").at(p) // '$' is appended to make it an invalid identifier and thus avoid the situation that an input parameter has already the same name - Some(PNamedParameter(idnDef, t).at(p)) - case PExplicitGhostParameter(actual) => getNamedOutParam(actual) - } - - /** - * checks that there is exactly a single parameter and turns into into a named parameter in case it isn't yet a - * named parameter - */ - def getOutParam(result: PResult): Option[PNamedParameter] = result.outs match { - case Vector(out) => getNamedOutParam(out) - case _ => - failedNodes = failedNodes ++ createError(result, s"the imported pure function or method does not have exactly one result argument") - None - } - - /** - * performs the following operations: - * - makes the out parameter a named parameter if it's not the case yet - * - adds a postcondition stating that the named out parameter is equal to the body (the body can thus be dropped) - * - turns the decreases measures into wildcards while retaining the conditions under which they have been specified - * returns the modified result and spec - */ - def turnBodyIntoPostcondition(result: PResult, spec: PFunctionSpec, body: Option[(PBodyParameterInfo, PBlock)]): Option[(PResult, PFunctionSpec)] = { - for { - body <- getBodyExpr(body) - outParam <- getOutParam(result) - modifiedResult = PResult(Vector(outParam)).at(result) - outIdnUse = PIdnUse(outParam.id.name).at(body) - outOperand = PNamedOperand(outIdnUse).at(body) - // we use ghost equals here to ensure that no additional checks are being added depending on the expression's type - // (e.g. that the returned interface is comparable) - additionalPostcondition = PGhostEquals(outOperand, body).at(body) - // turning the body into a postcondition is not enough because Viper checks termination also for postconditions - // therefore, we turn termination measure tuples into wildcards to assume termination instead of checking it - modifiedTerminationMeasures = spec.terminationMeasures.map { - case n@PTupleTerminationMeasure(_, cond) => PWildcardMeasure(cond).at(n) - case t => t - } - modifiedSpec = PFunctionSpec(spec.pres, spec.preserves, additionalPostcondition +: spec.posts, modifiedTerminationMeasures, spec.isPure, spec.isTrusted).at(spec) - } yield (modifiedResult, modifiedSpec) + def replace(spec: PFunctionSpec): PFunctionSpec = { + val replacedMeasures = spec.terminationMeasures.map { + case n@PTupleTerminationMeasure(_, cond) => PWildcardMeasure(cond).at(n) + case t => t + } + PFunctionSpec(spec.pres, spec.preserves, spec.posts, replacedMeasures, spec.isPure, spec.isTrusted) } val replaceTerminationMeasuresForFunctionsAndMethods: Strategy = strategyWithName[Any]("replaceTerminationMeasuresForFunctionsAndMethods", { // apply transformation only to the specification of function or method declaration (in particular, do not // apply the transformation to method signatures in interface declarations) - case n: PFunctionDecl if n.spec.isPure => - for { - (modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body) - } yield PFunctionDecl(n.id, n.args, modifiedResult, modifiedSpec, None).at(n) - case n: PMethodDecl if n.spec.isPure => - for { - (modifiedResult, modifiedSpec) <- turnBodyIntoPostcondition(n.result, n.spec, n.body) - } yield PMethodDecl(n.id, n.receiver, n.args, modifiedResult, modifiedSpec, None).at(n) + case n: PFunctionDecl => Some(PFunctionDecl(n.id, n.args, n.result, replace(n.spec), n.body)) + case n: PMethodDecl => Some(PMethodDecl(n.id, n.receiver, n.args, n.result, replace(n.spec), n.body)) case n: PMember => Some(n) }) @@ -390,10 +321,7 @@ object Parser { PProgram(prog.packageClause, prog.initPosts, prog.imports, updatedDecls).at(prog) }) // create a new package node with the updated programs - val updatedPkg = PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info).at(pkg) - // check whether an error has occurred - if (failedNodes.isEmpty) Right(updatedPkg) - else Left(failedNodes) + Right(PPackage(pkg.packageClause, updatedProgs, pkg.positions, pkg.info).at(pkg)) } } From 6bf3198cfed7ff959167abffcef9def7f9ba5d10 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 18 Oct 2022 09:28:23 +0200 Subject: [PATCH 028/296] makes sure not to swallow errors from silver plugins and fixes the termination plugin's integration to emit the wellfounded order domain if at least one decreases tuple occurs in the program --- .../viper/gobra/translator/Translator.scala | 1 + .../transformers/AssumeTransformer.scala | 5 +- .../transformers/TerminationTransformer.scala | 63 +++++++++++++------ .../transformers/ViperTransformer.scala | 3 +- 4 files changed, 50 insertions(+), 22 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala index 8cb2a1fab..823862088 100644 --- a/src/main/scala/viper/gobra/translator/Translator.scala +++ b/src/main/scala/viper/gobra/translator/Translator.scala @@ -37,6 +37,7 @@ object Translator { val transformedTask = transformers.foldLeft(task) { case (t, transformer) => transformer.transform(t) + .fold(errs => Violation.violation(s"Applying transformer ${transformer.getClass.getSimpleName} resulted in errors: ${errs.toString}"), identity) } config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => sortAst(transformedTask.program), () => transformedTask.backtrack) diff --git a/src/main/scala/viper/gobra/translator/transformers/AssumeTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/AssumeTransformer.scala index 8ccfc97a0..2e5dee96a 100644 --- a/src/main/scala/viper/gobra/translator/transformers/AssumeTransformer.scala +++ b/src/main/scala/viper/gobra/translator/transformers/AssumeTransformer.scala @@ -7,10 +7,11 @@ package viper.gobra.translator.transformers import viper.gobra.backend.BackendVerifier import viper.silver.ast.utility.ImpureAssumeRewriter +import viper.silver.verifier.AbstractError import viper.silver.{ast => vpr} class AssumeTransformer extends ViperTransformer { - override def transform(task: BackendVerifier.Task): BackendVerifier.Task = { + override def transform(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = { val progWithoutAssumes = { val uncleanProg = ImpureAssumeRewriter.rewriteAssumes(task.program) // FIXME: required due to inconvenient silver assume rewriter @@ -21,6 +22,6 @@ class AssumeTransformer extends ViperTransformer { uncleanProg.copy(domains = cleanedDomains)(uncleanProg.pos, uncleanProg.info, uncleanProg.errT) } - task.copy(program = progWithoutAssumes) + Right(task.copy(program = progWithoutAssumes)) } } diff --git a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala index 50465895c..c140dd988 100644 --- a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala +++ b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala @@ -7,25 +7,30 @@ package viper.gobra.translator.transformers import java.nio.file.Path import viper.gobra.backend.BackendVerifier -import viper.gobra.util.Violation import viper.silicon.Silicon import viper.silver.{ast => vpr} import viper.silver.frontend.{DefaultStates, ViperAstProvider} +import viper.silver.plugin.SilverPlugin import viper.silver.plugin.standard.predicateinstance.PredicateInstance.PredicateInstanceDomainName import viper.silver.plugin.standard.termination.{DecreasesTuple, TerminationPlugin} import viper.silver.reporter.{NoopReporter, Reporter} import viper.silver.plugin.standard.predicateinstance.PredicateInstancePlugin +import viper.silver.verifier.AbstractError class TerminationTransformer extends ViperTransformer { - override def transform(task: BackendVerifier.Task): BackendVerifier.Task = { - (addDecreasesDomains _ andThen executeTerminationPlugin)(task) + override def transform(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = { + for { + progWithDecreasesDomains <- addDecreasesDomains(task) + transformedProg <- executeTerminationPlugin(progWithDecreasesDomains) + } yield transformedProg } - private def addDecreasesDomains(task: BackendVerifier.Task): BackendVerifier.Task = { + private def addDecreasesDomains(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = { // constructs a separate Viper program (as a string) that should be parsed // after parsing this separate Viper program, the resulting AST is combined with `task` + val declarationImport = "decreases/declaration.vpr" val allImport = "decreases/all.vpr" def type2Import(typ: vpr.Type): String = typ match { case vpr.Bool => "decreases/bool.vpr" @@ -39,31 +44,41 @@ class TerminationTransformer extends ViperTransformer { case _ => allImport // fallback } - // find the types of all expressions used as decreases measues + // find the types of all expressions used as decreases measures val measureTypes = task.program.deepCollect { case DecreasesTuple(tupleExpressions, _) => tupleExpressions.map(_.typ) - }.flatten.distinct + } + // does program contain any (possibly empty) decreases tuples? + val containsTerminationChecks: Boolean = measureTypes.nonEmpty + val distinctMeasureTypes = measureTypes.flatten.distinct // map these types to the respective files that should be imported - val imports = measureTypes + val importsForMeasureTypes = distinctMeasureTypes .map(type2Import) .distinct + // we need at least `declarationImport` if there is any tuple decreases measure. However, we do not need to import + // this file if we already import any other file with the domain for a particular type + val imports = if (importsForMeasureTypes.nonEmpty) importsForMeasureTypes + else if (containsTerminationChecks) Seq(declarationImport) + else Seq.empty // if `allImport` is in the list of files that should be imported, we can ignore all others and instead only import // `allImport` val importsAll = imports.contains(allImport) /** list of Viper standard imports that should be parsed */ val filteredImports = if (importsAll) Seq(allImport) else imports val progWithImports = filteredImports.map(p => s"import <${p}>").mkString("\n") - val vprProgram = parseVpr(progWithImports) - combine(task, vprProgram) + for { + vprProgram <- parseVpr(progWithImports) + } yield combine(task, vprProgram) } - private def parseVpr(program: String): vpr.Program = { + private def parseVpr(program: String): Either[Seq[AbstractError], vpr.Program] = { val frontend = new StringViperAstProvider(program) frontend.execute() - if (frontend.errors.nonEmpty) { - Violation.violation(s"errors while parsing Viper program ${program}: ${frontend.errors}") + if (frontend.errors.isEmpty) { + Right(frontend.translationResult) + } else { + Left(frontend.errors) } - frontend.translationResult } private def combine(task: BackendVerifier.Task, other: vpr.Program): BackendVerifier.Task = { @@ -79,12 +94,23 @@ class TerminationTransformer extends ViperTransformer { task.copy(program = newProg) } - private def executeTerminationPlugin(task: BackendVerifier.Task): BackendVerifier.Task = { - val plugin = new TerminationPlugin(null, null, null, null) + private def executeTerminationPlugin(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = { + def applyPlugin(plugin: SilverPlugin, prog : vpr.Program): Either[Seq[AbstractError], vpr.Program] = { + val transformedProgram = plugin.beforeVerify(prog) + if (plugin.errors.isEmpty) { + Right(transformedProgram) + } else { + Left(plugin.errors) + } + } + + val terminationPlugin = new TerminationPlugin(null, null, null, null) val predInstancePlugin = new PredicateInstancePlugin(null, null, null, null) - val transformedProgram = plugin.beforeVerify(task.program) - val programWithoutPredicateInstances = predInstancePlugin.beforeVerify(transformedProgram) - task.copy(program = programWithoutPredicateInstances) + + for { + transformedProgram <- applyPlugin(terminationPlugin, task.program) + programWithoutPredicateInstances <- applyPlugin(predInstancePlugin, transformedProgram) + } yield task.copy(program = programWithoutPredicateInstances) } /** @@ -113,4 +139,3 @@ class TerminationTransformer extends ViperTransformer { } } } - diff --git a/src/main/scala/viper/gobra/translator/transformers/ViperTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/ViperTransformer.scala index 28efd43bb..6ddeca0b9 100644 --- a/src/main/scala/viper/gobra/translator/transformers/ViperTransformer.scala +++ b/src/main/scala/viper/gobra/translator/transformers/ViperTransformer.scala @@ -7,11 +7,12 @@ package viper.gobra.translator.transformers import viper.gobra.backend.BackendVerifier.Task +import viper.silver.verifier.AbstractError /** * Trait for a Viper-to-Viper transformation. The Viper AST in the task as well as the associated backtracking * information can be transformed by classes implementing this trait. */ trait ViperTransformer { - def transform(task: Task): Task + def transform(task: Task): Either[Seq[AbstractError], Task] } From 8915a65d24f5dcb9d3d308e3ca3168c677bdcd85 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 24 Oct 2022 16:54:01 +0200 Subject: [PATCH 029/296] updates ViperServer to latest commit --- project/build.properties | 2 +- viperserver | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/project/build.properties b/project/build.properties index 25792e1f1..11ca82dfc 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1,4 +1,4 @@ # Any copyright is dedicated to the Public Domain. # http://creativecommons.org/publicdomain/zero/1.0/ -sbt.version = 1.5.7 +sbt.version = 1.7.2 diff --git a/viperserver b/viperserver index 346cc60f3..91fc8e378 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 346cc60f30950ed5c75870fe7820d04670e0f940 +Subproject commit 91fc8e3781a357d98ca6b2b9fb91037e9dff1fb2 From 916fd4367770ea12a8e837846912a88842b8b2fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 31 Oct 2022 22:54:11 +0100 Subject: [PATCH 030/296] Fix issue 553 (#557) * No heap dependent triggers * Uncover yet another heap-dependent trigger --- .../translator/encodings/StringEncoding.scala | 9 ++++---- .../encodings/typeless/BuiltInEncoding.scala | 22 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala index f9f0bf2be..c5416a789 100644 --- a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala @@ -88,7 +88,7 @@ class StringEncoding extends LeafTypeEncoding { * [ target = []byte(str) ] -> * [ * var s []byte - * inhale forall i Int :: 0 <= i && i < len(s) ==> acc(&s[i]) + * inhale forall i Int :: { &s[i] } 0 <= i && i < len(s) ==> acc(&s[i]) * target = s * ] */ @@ -108,7 +108,7 @@ class StringEncoding extends LeafTypeEncoding { val qtfVar = in.BoundVar("i", in.IntT(Addressability.boundVariable))(conv.info) val post = in.SepForall( vars = Vector(qtfVar), - triggers = Vector(in.Trigger(Vector(in.IndexedExp(slice, qtfVar, sliceT)(conv.info)))(conv.info)), + triggers = Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(slice, qtfVar, sliceT)(conv.info))(conv.info)))(conv.info)), body = in.Implication( in.And(in.AtMostCmp(in.IntLit(BigInt(0))(conv.info), qtfVar)(conv.info), in.LessCmp(qtfVar, in.Length(slice)(conv.info))(conv.info))(conv.info), in.Access(in.Accessible.Address(in.IndexedExp(slice, qtfVar, sliceT)(conv.info)), in.FullPerm(conv.info))(conv.info) @@ -269,7 +269,7 @@ class StringEncoding extends LeafTypeEncoding { } /** Generates the function - * requires forall i int :: 0 <= i && i < len(s) ==> acc(&s[i], _) + * requires forall i int :: { &s[i] } 0 <= i && i < len(s) ==> acc(&s[i], _) * decreases _ * pure func byteSliceToStrFunc(s []byte) string */ @@ -281,9 +281,10 @@ class StringEncoding extends LeafTypeEncoding { val param = in.Parameter.In("s", paramT)(info) val res = in.Parameter.Out("res", in.StringT(Addressability.outParameter))(info) val qtfVar = in.BoundVar("i", in.IntT(Addressability.boundVariable))(info) + val trigger = in.Trigger(Vector(in.Ref(in.IndexedExp(param, qtfVar, paramT)(info))(info)))(info) val pre = in.SepForall( vars = Vector(qtfVar), - triggers = Vector(in.Trigger(Vector(in.IndexedExp(param, qtfVar, paramT)(info)))(info)), + triggers = Vector(trigger), body = in.Implication( in.And(in.AtMostCmp(in.IntLit(BigInt(0))(info), qtfVar)(info), in.LessCmp(qtfVar, in.Length(param)(info))(info))(info), in.Access(in.Accessible.Address(in.IndexedExp(param, qtfVar, paramT)(info)), in.WildcardPerm(info))(info) diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala index 5bef40ac0..c47efa18e 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala @@ -505,14 +505,14 @@ class BuiltInEncoding extends Encoding { case (CopyFunctionTag, Vector(t1, t2, _)) => /** * requires 0 < p - * requires forall i int :: { dst[i] } (0 <= i && i < len(dst)) ==> acc(&dst[i], write) - * requires forall i int :: { src[i] } (0 <= i && i < len(src)) ==> acc(&src[i], p) + * requires forall i int :: { &dst[i] } (0 <= i && i < len(dst)) ==> acc(&dst[i], write) + * requires forall i int :: { &src[i] } (0 <= i && i < len(src)) ==> acc(&src[i], p) * ensures len(dst) <= len(src) ==> res == len(dst) * ensures len(src) < len(dst) ==> res == len(src) - * ensures forall i int :: { dst[i] } 0 <= i && i < len(dst) ==> acc(&dst[i], write) - * ensures forall i int :: { src[i] } 0 <= i && i < len(src) ==> acc(&src[i], p) - * ensures forall i int :: { dst[i] } (0 <= i && i < len(src) && i < len(dst)) ==> dst[i] == old(src[i]) - * ensures forall i int :: { dst[i] } (len(src) <= i && i < len(dst)) ==> dst[i] == old(dst[i]) + * ensures forall i int :: { &dst[i] } 0 <= i && i < len(dst) ==> acc(&dst[i], write) + * ensures forall i int :: { &src[i] } 0 <= i && i < len(src) ==> acc(&src[i], p) + * ensures forall i int :: { &dst[i] } (0 <= i && i < len(src) && i < len(dst)) ==> dst[i] == old(src[i]) + * ensures forall i int :: { &dst[i] } (len(src) <= i && i < len(dst)) ==> dst[i] == old(dst[i]) * func copy(dst, src []int, ghost p perm) (res int) */ @@ -542,14 +542,16 @@ class BuiltInEncoding extends Encoding { // preconditions val pPre = in.ExprAssertion(in.LessCmp(in.NoPerm(src), pParam)(src))(src) val preDst = quantify( - trigger = { i => Vector(in.Trigger(Vector(in.IndexedExp(dstParam, i, dstUnderlyingType)(src)))(src)) }, + trigger = { i => + Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(dstParam, i, dstUnderlyingType)(src))(src)))(src)) + }, range = { i => inRange(i, in.IntLit(0)(src), in.Length(dstParam)(src)) }, body = { i => in.Access(in.Accessible.Address(in.IndexedExp(dstParam, i, dstUnderlyingType)(src)), in.FullPerm(src))(src) } ) val preSrc = quantify( - trigger = { i => Vector(in.Trigger(Vector(in.IndexedExp(srcParam, i, srcUnderlyingType)(src)))(src)) }, + trigger = { i => Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(srcParam, i, srcUnderlyingType)(src))(src)))(src)) }, range = { i => inRange(i, in.IntLit(0)(src), in.Length(srcParam)(src)) }, body = { i => in.Access(in.Accessible.Address(in.IndexedExp(srcParam, i, srcUnderlyingType)(src)), pParam)(src) } ) @@ -571,7 +573,7 @@ class BuiltInEncoding extends Encoding { val postDst = preDst val postSrc = preSrc val postUpdate = quantify( - trigger = { i => Vector(in.Trigger(Vector(in.IndexedExp(dstParam, i, dstUnderlyingType)(src)))(src)) }, + trigger = { i => Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(dstParam, i, dstUnderlyingType)(src))(src)))(src)) }, range = { i => in.And( inRange(i, in.IntLit(0)(src), in.Length(srcParam)(src)), @@ -588,7 +590,7 @@ class BuiltInEncoding extends Encoding { } ) val postSame = quantify( - trigger = { i => Vector(in.Trigger(Vector(in.IndexedExp(dstParam, i, dstUnderlyingType)(src)))(src)) }, + trigger = { i => Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(dstParam, i, dstUnderlyingType)(src))(src)))(src)) }, range = { i => inRange(i, in.Length(srcParam)(src), in.Length(dstParam)(src)) }, body = { i => in.ExprAssertion( From 79ec25d3e9fcf8752242fd9afff8611454f7c8b2 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 31 Oct 2022 16:25:17 +0100 Subject: [PATCH 031/296] adds option to BaseConfig to skip verification --- src/main/scala/viper/gobra/frontend/Config.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 98d79d8ca..3fb3f7c4d 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -43,6 +43,7 @@ object ConfigDefaults { lazy val DefaultLogLevel: Level = LoggerDefaults.DefaultLevel lazy val DefaultCacheFile: Option[File] = None lazy val DefaultParseOnly: Boolean = false + lazy val DefaultStopAfterEncoding: Boolean = false lazy val DefaultCheckOverflows: Boolean = false lazy val DefaultCheckConsistency: Boolean = false lazy val DefaultShouldChop: Boolean = false @@ -191,6 +192,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector logLevel: Level = ConfigDefaults.DefaultLogLevel, cacheFile: Option[Path] = ConfigDefaults.DefaultCacheFile.map(_.toPath), shouldParseOnly: Boolean = ConfigDefaults.DefaultParseOnly, + stopAfterEncoding: Boolean = ConfigDefaults.DefaultStopAfterEncoding, checkOverflows: Boolean = ConfigDefaults.DefaultCheckOverflows, checkConsistency: Boolean = ConfigDefaults.DefaultCheckConsistency, int32bit: Boolean = ConfigDefaults.DefaultInt32bit, @@ -205,7 +207,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector def shouldTypeCheck: Boolean = !shouldParseOnly def shouldDesugar: Boolean = shouldTypeCheck def shouldViperEncode: Boolean = shouldDesugar - def shouldVerify: Boolean = shouldViperEncode + def shouldVerify: Boolean = shouldViperEncode && !stopAfterEncoding def shouldChop: Boolean = choppingUpperBound > 1 || isolated.exists(_.nonEmpty) lazy val isolated: Option[Vector[SourcePosition]] = { val positions = isolate.flatMap{ case (path, idxs) => idxs.map(idx => SourcePosition(path, idx, 0)) } From df6aa4bac80e2802c449b4ce2a774579b881e7a9 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Tue, 1 Nov 2022 23:13:34 +0100 Subject: [PATCH 032/296] Updates submodules (#561) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 91fc8e378..31d57cdcc 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 91fc8e3781a357d98ca6b2b9fb91037e9dff1fb2 +Subproject commit 31d57cdcc638bb9a77d16b59a821144ea4a33f08 From e23c8c991ef7676a8c6d5576fe2a1aaaa9808f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Thu, 3 Nov 2022 11:11:04 +0100 Subject: [PATCH 033/296] Disable problematic tests (#563) * disable tests * disable tests --- .../regressions/examples/evaluation/dense_sparse_matrix.gobra | 2 ++ .../resources/regressions/examples/evaluation/heapsort.gobra | 2 ++ .../regressions/examples/evaluation/impl_errors/heapsort.gobra | 2 ++ .../evaluation/impl_errors/parallel_search_replace.gobra | 2 ++ .../regressions/examples/evaluation/spec_errors/heapsort.gobra | 2 ++ 5 files changed, 10 insertions(+) diff --git a/src/test/resources/regressions/examples/evaluation/dense_sparse_matrix.gobra b/src/test/resources/regressions/examples/evaluation/dense_sparse_matrix.gobra index 5e1935a23..f4ae82b14 100644 --- a/src/test/resources/regressions/examples/evaluation/dense_sparse_matrix.gobra +++ b/src/test/resources/regressions/examples/evaluation/dense_sparse_matrix.gobra @@ -1,6 +1,8 @@ // Any copyright is dedicated to the Public Domain. // http://creativecommons.org/publicdomain/zero/1.0/ +//:: IgnoreFile(/gobra/issue/234/) + // ported verified operations on dense and sparse matrices from Viper package main diff --git a/src/test/resources/regressions/examples/evaluation/heapsort.gobra b/src/test/resources/regressions/examples/evaluation/heapsort.gobra index c0ea31dbf..d46cba6bf 100644 --- a/src/test/resources/regressions/examples/evaluation/heapsort.gobra +++ b/src/test/resources/regressions/examples/evaluation/heapsort.gobra @@ -1,6 +1,8 @@ // Any copyright is dedicated to the Public Domain. // http://creativecommons.org/publicdomain/zero/1.0/ +//:: IgnoreFile(/gobra/issue/234/) + package pkg pure func parent (i int) int { diff --git a/src/test/resources/regressions/examples/evaluation/impl_errors/heapsort.gobra b/src/test/resources/regressions/examples/evaluation/impl_errors/heapsort.gobra index 135436677..8173a10b6 100644 --- a/src/test/resources/regressions/examples/evaluation/impl_errors/heapsort.gobra +++ b/src/test/resources/regressions/examples/evaluation/impl_errors/heapsort.gobra @@ -1,6 +1,8 @@ // Any copyright is dedicated to the Public Domain. // http://creativecommons.org/publicdomain/zero/1.0/ +//:: IgnoreFile(/gobra/issue/234/) + package pkg pure func parent (i int) int { diff --git a/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_search_replace.gobra b/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_search_replace.gobra index 6b6161d92..19e3048a1 100644 --- a/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_search_replace.gobra +++ b/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_search_replace.gobra @@ -1,6 +1,8 @@ // Any copyright is dedicated to the Public Domain. // http://creativecommons.org/publicdomain/zero/1.0/ +//:: IgnoreFile(/gobra/issue/234/) + package pkg import "sync" diff --git a/src/test/resources/regressions/examples/evaluation/spec_errors/heapsort.gobra b/src/test/resources/regressions/examples/evaluation/spec_errors/heapsort.gobra index 7020f54a7..b1bc1511f 100644 --- a/src/test/resources/regressions/examples/evaluation/spec_errors/heapsort.gobra +++ b/src/test/resources/regressions/examples/evaluation/spec_errors/heapsort.gobra @@ -1,6 +1,8 @@ // Any copyright is dedicated to the Public Domain. // http://creativecommons.org/publicdomain/zero/1.0/ +//:: IgnoreFile(/gobra/issue/234/) + package pkg pure func parent (i int) int { From fda2c1fc68cb014071a34ef6aa07b35fd7e5a562 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 3 Nov 2022 13:41:57 +0100 Subject: [PATCH 034/296] Updates submodules (#562) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: jcp19 Co-authored-by: JoĂ£o Pereira --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 31d57cdcc..431ec0d40 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 31d57cdcc638bb9a77d16b59a821144ea4a33f08 +Subproject commit 431ec0d40be4082c7e57456d0ebcae3fd327b7d2 From f565a0cc0e8ce98b5b529e5ed35abbcb8713f82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Thu, 3 Nov 2022 16:59:49 +0100 Subject: [PATCH 035/296] Add distinction between shared and exclusive global variables (#560) * Start working on this * Clean-up * Adapt old tests * Better comment * Fix tests * Fix all tests * Add test case * Add test cases * Fix test * Fix test * Fix tests * Fix bug with arrays * feedback from Felix * Undo error in test --- .../scala/viper/gobra/frontend/Desugar.scala | 34 ++++++++++++++----- .../frontend/info/base/SymbolTable.scala | 2 +- .../property/Addressability.scala | 4 +-- .../property/Assignability.scala | 11 ++++++ .../resolution/NameResolution.scala | 6 ++-- .../info/implementation/typing/IdTyping.scala | 8 ++--- .../viper/gobra/theory/Addressability.scala | 2 +- .../encodings/combinators/TypeEncoding.scala | 12 +++++-- .../defaults/DefaultGlobalVarEncoding.scala | 5 +-- .../globals/globals-disabled-fail01.gobra | 6 ++-- .../globals/globals-exclusive-simple01.gobra | 19 +++++++++++ .../globals-exclusive-type-fail01.gobra | 29 ++++++++++++++++ .../features/globals/globals-fail01.gobra | 4 +-- .../features/globals/globals-simple01.gobra | 6 ++-- .../globals/globals-type-fail01.gobra | 24 ++++++++++++- .../features/globals/imports/path/path.go | 24 ++++++------- .../same_package/import-fail01/bar/bar.gobra | 6 ++-- .../same_package/import-success/bar/bar.gobra | 6 ++-- .../shareProgramDecls/prog1.gobra | 2 +- .../shareProgramDecls/prog2.gobra | 2 +- 20 files changed, 158 insertions(+), 54 deletions(-) create mode 100644 src/test/resources/regressions/features/globals/globals-exclusive-simple01.gobra create mode 100644 src/test/resources/regressions/features/globals/globals-exclusive-type-fail01.gobra diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 5ddf9653a..20f342eb2 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -434,7 +434,8 @@ object Desugar { val gvars = decl.left.map(info.regular) map { case g: st.GlobalVariable => globalVarD(g)(src) case w: st.Wildcard => - val typ = typeD(info.typ(w.decl), Addressability.globalVariable)(src) + // wildcards are considered exclusive as they cannot be referenced anywhere else + val typ = typeD(info.typ(w.decl), Addressability.wildcard)(src) val scope = info.codeRoot(decl).asInstanceOf[PPackage] freshGlobalVar(typ, scope, w.context)(src) case e => Violation.violation(s"Expected a global variable or wildcard, but instead got $e") @@ -443,7 +444,12 @@ object Desugar { if (decl.right.isEmpty) { // assign to all variables its default value: val assignsToDefault = - gvars.map{ v => singleAss(in.Assignee.Var(v), in.DfltVal(v.typ.withAddressability(Addressability.Exclusive))(src))(src) } + gvars.map{ + case v if v.typ.addressability.isShared => + singleAss(in.Assignee.Var(v), in.DfltVal(v.typ.withAddressability(Addressability.Exclusive))(src))(src) + case v => + in.Assume(in.ExprAssertion(in.GhostEqCmp(v, in.DfltVal(v.typ)(src))(src))(src))(src) + } in.GlobalVarDecl(gvars, assignsToDefault)(src) } else if (decl.right.length == 1 && decl.right.length != decl.left.length) { // multi-assign mode: @@ -452,20 +458,29 @@ object Desugar { case t: in.Tuple if t.args.length == gvars.length => in.Block( decls = Vector(), - stmts = gvars.zip(t.args).map{ case (l, r) => singleAss(in.Assignee.Var(l), r)(src) } + stmts = gvars.zip(t.args).map{ + case (l, r) if l.typ.addressability.isShared => singleAss(in.Assignee.Var(l), r)(src) + case (l, r) => in.Assume(in.ExprAssertion(in.GhostEqCmp(l,r)(src))(src))(src) + } )(src) case c => violation(s"Expected this case to be unreachable, but found $c instead.") }) in.GlobalVarDecl(gvars, Vector(assigns))(src) } else { // single-assign mode: - val assigns = gvars.zip(exps).map{ case (l, wr) => block(for { r <- wr } yield singleAss(in.Assignee.Var(l), r)(src)) } + val assigns = gvars.zip(exps).map{ + case (l, wr) if l.typ.addressability.isShared => + block(for { r <- wr } yield singleAss(in.Assignee.Var(l), r)(src)) + case (l, wr) => + block(for { r <- wr } yield in.Assume(in.ExprAssertion(in.GhostEqCmp(l,r)(src))(src))(src)) + } in.GlobalVarDecl(gvars, assigns)(src) } } def globalVarD(v: st.GlobalVariable)(src: Meta): in.GlobalVar = { - val typ = typeD(v.context.typ(v.id), Addressability.globalVariable)(src) + val addr = if (v.addressable) Addressability.Shared else Addressability.Exclusive + val typ = typeD(v.context.typ(v.id), addr)(src) val proxy = globalVarProxyD(v) in.GlobalVar(proxy, typ)(src) } @@ -3468,9 +3483,13 @@ object Desugar { postprocessing = Vector(), seqn = in.MethodBodySeqn{ // init all global variables declared in the file (not all declarations in the package!) - val initDeclaredGlobs: Vector[in.Initialization] = sortedGlobVarDecls.flatMap(_.left.map(gVar => + val initDeclaredGlobs: Vector[in.Initialization] = sortedGlobVarDecls.flatMap(_.left).filter { + // do not initialize Exclusive variables to avoid unsoundnesses with the assumptions. + // TODO(another optimization) do not generate initialization code for variables with RHS. + _.typ.addressability.isShared + }.map{ gVar => in.Initialization(gVar)(gVar.info) - )) + } // execute the declaration statements for variables in order of declaration, while satisfying the // dependency relation /** @@ -3695,7 +3714,6 @@ object Desugar { } def freshGlobalVar(typ: in.Type, scope: PPackage, ctx: ExternalTypeInfo)(info: Source.Parser.Info): in.GlobalVar = { - require(typ.addressability == Addressability.globalVariable) val name = nm.fresh(scope, ctx) val uniqName = nm.global(name, ctx) val proxy = in.GlobalVarProxy(name, uniqName)(meta(scope, ctx.getTypeInfo)) diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala index 2b30e5e43..52af9697f 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala @@ -110,13 +110,13 @@ object SymbolTable extends Environments[Entity] { expOpt: Option[PExpression], typOpt: Option[PType], ghost: Boolean, + override val addressable: Boolean, isSingleModeDecl: Boolean, context: ExternalTypeInfo ) extends ActualVariable { require(expOpt.isDefined || typOpt.isDefined) require(0 <= idx && idx < decl.left.length) override def rep: PNode = decl - override def addressable: Boolean = true def id: PDefLikeId = decl.left(idx) } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala index 288cac91e..62d755305 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala @@ -73,7 +73,7 @@ trait Addressability extends BaseProperty { this: TypeInfoImpl => case Some(_: ap.ReceivedMethod | _: ap.MethodExpr | _: ap.ReceivedPredicate | _: ap.PredicateExpr ) => AddrMod.rValue case Some(_: ap.NamedType | _: ap.BuiltInType | _: ap.Function | _: ap.Predicate | _: ap.DomainFunction) => AddrMod.rValue case Some(_: ap.ImplicitlyReceivedInterfaceMethod | _: ap.ImplicitlyReceivedInterfacePredicate) => AddrMod.rValue - case Some(_: ap.GlobalVariable) => AddrMod.globalVariable + case Some(g: ap.GlobalVariable) => if (g.symb.addressable) AddrMod.Shared else AddrMod.Exclusive case p => Violation.violation(s"Unexpected dot resolve, got $p") } case _: PLiteral => AddrMod.literal @@ -126,7 +126,7 @@ trait Addressability extends BaseProperty { this: TypeInfoImpl => private lazy val addressableVarAttr: PIdnNode => AddrMod = attr[PIdnNode, AddrMod] { n => regular(n) match { - case _: GlobalVariable => AddrMod.globalVariable + case g: GlobalVariable => if (g.addressable) AddrMod.sharedVariable else AddrMod.exclusiveVariable case v: Variable => if (v.addressable) AddrMod.sharedVariable else AddrMod.exclusiveVariable case _: Constant => AddrMod.constant case _: Wildcard => AddrMod.defaultValue diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index aa38e0f22..dd67bfa57 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala @@ -7,6 +7,7 @@ package viper.gobra.frontend.info.implementation.property import viper.gobra.ast.frontend._ +import viper.gobra.ast.frontend.{AstPattern => ap} import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.TypeBounds.BoundedIntegerKind @@ -107,6 +108,7 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => } lazy val assignable: Property[PExpression] = createBinaryProperty("assignable") { + case e if !isMutable(e) => false case PIndexedExp(b, _) => underlyingType(exprType(b)) match { case _: ArrayT => assignable(b) case _: SliceT | _: GhostSliceT => assignable(b) @@ -302,4 +304,13 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => case (_, i) => BigInt(i) } } + + private def isMutable: Property[PExpression] = createBinaryProperty("mutable") { e => + resolve(e) match { + case Some(g: ap.GlobalVariable) => g.symb.addressable + case Some(i: ap.IndexedExp) => isMutable(i.base) + case Some(f: ap.FieldSelection) => isMutable(f.base) + case _ => true + } + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index 743cfd2b7..54f3f8460 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -47,9 +47,9 @@ trait NameResolution { case decl: PVarDecl if isGlobalVarDeclaration(decl) => val idx = decl.left.zipWithIndex.find(_._1 == id).get._2 StrictAssignMode(decl.left.size, decl.right.size) match { - case AssignMode.Single => GlobalVariable(decl, idx, Some(decl.right(idx)), decl.typ, isGhost, isSingleModeDecl = true, this) - case AssignMode.Multi => GlobalVariable(decl, idx, decl.right.headOption, decl.typ, isGhost, isSingleModeDecl = false, this) - case _ if decl.right.isEmpty => GlobalVariable(decl, idx, None, decl.typ, isGhost, isSingleModeDecl = true, this) + case AssignMode.Single => GlobalVariable(decl, idx, Some(decl.right(idx)), decl.typ, isGhost, decl.addressable(idx), isSingleModeDecl = true, this) + case AssignMode.Multi => GlobalVariable(decl, idx, decl.right.headOption, decl.typ, isGhost, decl.addressable(idx), isSingleModeDecl = false, this) + case _ if decl.right.isEmpty => GlobalVariable(decl, idx, None, decl.typ, isGhost, decl.addressable(idx), isSingleModeDecl = true, this) case _ => UnknownEntity() } case decl: PVarDecl => diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala index 513c3eb89..ce5a456b9 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala @@ -72,12 +72,12 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => }) }) - case GlobalVariable(_, _, expOpt, typOpt, _, isSingleModeDecl, _) if isSingleModeDecl => unsafeMessage(! { + case GlobalVariable(_, _, expOpt, typOpt, _, _, isSingleModeDecl, _) if isSingleModeDecl => unsafeMessage(! { typOpt.exists(wellDefAndType.valid) || expOpt.exists(e => wellDefAndExpr.valid(e) && Single.unapply(exprType(e)).nonEmpty) }) - case GlobalVariable(_, idx, expOpt, _, _, _, _) => + case GlobalVariable(_, idx, expOpt, _, _, _, _, _) => // in this case, mv must occur in a declaration in AssignMode.Multi unsafeMessage(! { expOpt.forall{ exp => wellDefAndExpr.valid(exp) && @@ -185,13 +185,13 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"expected tuple but got $t") } - case GlobalVariable(_, _, expOpt, typOpt, _, isSingleModeDecl, context) if isSingleModeDecl => typOpt.map(context.symbType) + case GlobalVariable(_, _, expOpt, typOpt, _, _, isSingleModeDecl, context) if isSingleModeDecl => typOpt.map(context.symbType) .getOrElse(context.typ(expOpt.get) match { case Single(t) => t case t => violation(s"expected single Type but got $t") }) - case GlobalVariable(_, idx, expOpt, typOpt, _, _, context) => typOpt.map(context.symbType) + case GlobalVariable(_, idx, expOpt, typOpt, _, _, _, context) => typOpt.map(context.symbType) // in this case, mv must occur in a declaration in AssignMode.Multi .getOrElse(context.typ(expOpt.get) match { case Assign(InternalTupleT(ts)) if idx < ts.size => ts(idx) diff --git a/src/main/scala/viper/gobra/theory/Addressability.scala b/src/main/scala/viper/gobra/theory/Addressability.scala index 6aac1e48f..ad1458317 100644 --- a/src/main/scala/viper/gobra/theory/Addressability.scala +++ b/src/main/scala/viper/gobra/theory/Addressability.scala @@ -93,7 +93,7 @@ object Addressability { val boundVariable: Addressability = rValue val constant: Addressability = rValue - val globalVariable: Addressability = sharedVariable + val wildcard: Addressability = rValue val dereference: Addressability = pointerBase def fieldLookup(receiver: Addressability): Addressability = field(receiver) diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala index 32ecd72d1..9e09922b2 100644 --- a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala @@ -195,12 +195,20 @@ trait TypeEncoding extends Generator { * To avoid conflicts with other encodings, an encoding for type T should be defined at: * (1) exclusive operations on T, which includes literals and default values * (2) shared expression of type T - * The default implements exclusive variables and constants with [[variable]] and [[globalVar]], respectively. - * Furthermore, the default implements [T(e: T)] -> [e] + * The default implements exclusive local variables and constants with [[variable]] and [[Fixpoint::get]], respectively. + * Furthermore, the default implements global exclusive variables and conversions as [T(e: T)] -> [e]. */ def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = { case v: in.GlobalConst if typ(ctx) isDefinedAt v.typ => unit(ctx.fixpoint.get(v)(ctx)) case (v: in.BodyVar) :: t / Exclusive if typ(ctx).isDefinedAt(t) => unit(variable(ctx)(v).localVar) + case (v: in.GlobalVar) :: t / Exclusive if typ(ctx).isDefinedAt(t) => + val (pos, info, errT) = v.vprMeta + val typ = ctx.typ(v.typ) + val vprExpr = vpr.FuncApp( + funcname = v.name.uniqueName, + args = Seq.empty + )(pos, info, typ, errT) + unit(vprExpr) case in.Conversion(t2, expr :: t) if typ(ctx).isDefinedAt(t) && typ(ctx).isDefinedAt(t2) => ctx.expression(expr) } diff --git a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala index 80e13ef89..213f5a48a 100644 --- a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala @@ -8,12 +8,10 @@ package viper.gobra.translator.encodings.defaults import org.bitbucket.inkytonik.kiama.==> import viper.gobra.ast.{internal => in} -import viper.gobra.theory.Addressability import viper.gobra.translator.context.Context import viper.gobra.translator.encodings.combinators.Encoding import viper.gobra.translator.util.ViperWriter.MemberLevel.unit import viper.gobra.translator.util.ViperWriter.MemberWriter -import viper.gobra.util.Violation import viper.silver.{ast => vpr} import viper.silver.plugin.standard.termination @@ -28,13 +26,12 @@ class DefaultGlobalVarEncoding extends Encoding { * global variable declarations are encoded as pure functions that return a pointer * to the variable. * [ var x T = exp ] -> - * function x(): [ T@ ] + * function x(): [ T ] */ val termMeasure = synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate") unit( decl.left map { l => val (pos, info, errTrafo) = l.vprMeta - Violation.violation(l.typ.addressability == Addressability.Shared, "Expected type with Shared addressability") val typ = ctx.typ(l.typ) vpr.Function( name = l.name.uniqueName, diff --git a/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra index ffb0e916f..109b84b02 100644 --- a/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra +++ b/src/test/resources/regressions/features/globals/globals-disabled-fail01.gobra @@ -25,13 +25,13 @@ import ( //:: ExpectedOutput(type_error) -var A int = 0 +var A@ int = 0 //:: ExpectedOutput(type_error) -var B, C = f() +var B@, C@ = f() //:: ExpectedOutput(type_error) var _ = g() //:: ExpectedOutput(type_error) -var D struct{} +var D@ struct{} decreases func f() (int, bool) diff --git a/src/test/resources/regressions/features/globals/globals-exclusive-simple01.gobra b/src/test/resources/regressions/features/globals/globals-exclusive-simple01.gobra new file mode 100644 index 000000000..74ae352ec --- /dev/null +++ b/src/test/resources/regressions/features/globals/globals-exclusive-simple01.gobra @@ -0,0 +1,19 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package test + +var f@ int = 1 +var g int = test() + +func init() { + assert g == 1 + //:: ExpectedOutput(assert_error) + assert false +} + +ensures res == 1 +decreases +func test() (res int) { + return 1 +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/globals/globals-exclusive-type-fail01.gobra b/src/test/resources/regressions/features/globals/globals-exclusive-type-fail01.gobra new file mode 100644 index 000000000..346659b76 --- /dev/null +++ b/src/test/resources/regressions/features/globals/globals-exclusive-type-fail01.gobra @@ -0,0 +1,29 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +var A int = 0 +var B [3]int + +func test1() { + // A cannot be assigned to, it is exclusive. + //:: ExpectedOutput(type_error) + A = 1 +} + +func test2() { + // Cannot take the address of an exclusive global variable. + //:: ExpectedOutput(type_error) + assert acc(&A) +} + +func test3() { + //:: ExpectedOutput(type_error) + assert acc(&B[0]) +} + +func test4() { + //:: ExpectedOutput(type_error) + B[0] = 1 +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/globals/globals-fail01.gobra b/src/test/resources/regressions/features/globals/globals-fail01.gobra index 5ff7195fa..77300045b 100644 --- a/src/test/resources/regressions/features/globals/globals-fail01.gobra +++ b/src/test/resources/regressions/features/globals/globals-fail01.gobra @@ -5,10 +5,10 @@ package pkg import "fmt" -var A = 1 +var A@ = 1 // Code executed during initialization must terminate //:: ExpectedOutput(function_termination_error) -var _, B = f() +var _, B@ = f() func f() (int, bool) diff --git a/src/test/resources/regressions/features/globals/globals-simple01.gobra b/src/test/resources/regressions/features/globals/globals-simple01.gobra index d398783dd..bf84ca8f3 100644 --- a/src/test/resources/regressions/features/globals/globals-simple01.gobra +++ b/src/test/resources/regressions/features/globals/globals-simple01.gobra @@ -15,10 +15,10 @@ import ( "sync" ) -var A int = 0 -var B, C = f() +var A@ int = 0 +var B@, C@ = f() var _ = g() -var D struct{} +var D@ struct{} decreases func f() (int, bool) diff --git a/src/test/resources/regressions/features/globals/globals-type-fail01.gobra b/src/test/resources/regressions/features/globals/globals-type-fail01.gobra index 0be875794..36532691a 100644 --- a/src/test/resources/regressions/features/globals/globals-type-fail01.gobra +++ b/src/test/resources/regressions/features/globals/globals-type-fail01.gobra @@ -7,4 +7,26 @@ package pkg //:: ExpectedOutput(type_error) var B, C, _ = f() -func f() (int, bool) \ No newline at end of file +func f() (int, bool) + +type T struct { + f int +} + +var x *T = &T{} + +// This is currently more restrictive than it needs to be but we +// expect to support this in the future. +func test1() { + // Rejected because x is not mutable, even though it does not need to be + // in this case. + //:: ExpectedOutput(type_error) + x.f = 2 +} + +var y T = T{} + +func test2() { + //:: ExpectedOutput(type_error) + y.f = 2 +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/globals/imports/path/path.go b/src/test/resources/regressions/features/globals/imports/path/path.go index 72a907149..fefae5a70 100644 --- a/src/test/resources/regressions/features/globals/imports/path/path.go +++ b/src/test/resources/regressions/features/globals/imports/path/path.go @@ -1,8 +1,8 @@ // Any copyright is dedicated to the Public Domain. // http://creativecommons.org/publicdomain/zero/1.0/ -//@ initEnsures PackageMem() -//@ initEnsures forall t Type :: 0 <= t && t < MaxType ==> !Registered(t) +// @ initEnsures PackageMem() +// @ initEnsures forall t Type :: 0 <= t && t < MaxType ==> !Registered(t) package path /*@ @@ -12,8 +12,8 @@ ghost const MaxType = 256 var ( // the original code uses an array of length 256, // but arrays of custom types are not yet supported - registeredPaths []Metadata - strictDecoding bool = true + registeredPaths/*@@@*/ []Metadata + strictDecoding/*@@@*/ bool = true ) type Type uint8 @@ -59,14 +59,14 @@ func init() { // RegisterPath registers a new path type globally. // The type passed in must be unique, or a runtime panic will occur. -//@ requires 0 <= pathMeta.Typ && pathMeta.Typ < MaxType -//@ requires PackageMem() -//@ requires !Registered(pathMeta.Typ) -//@ ensures PackageMem() -//@ ensures forall t Type :: 0 <= t && t < MaxType ==> -//@ t != pathMeta.Typ ==> old(Registered(t)) == Registered(t) -//@ ensures Registered(pathMeta.Typ) -//@ decreases +// @ requires 0 <= pathMeta.Typ && pathMeta.Typ < MaxType +// @ requires PackageMem() +// @ requires !Registered(pathMeta.Typ) +// @ ensures PackageMem() +// @ ensures forall t Type :: 0 <= t && t < MaxType ==> +// @ t != pathMeta.Typ ==> old(Registered(t)) == Registered(t) +// @ ensures Registered(pathMeta.Typ) +// @ decreases func RegisterPath(pathMeta Metadata) { //@ unfold PackageMem() pm := registeredPaths[pathMeta.Typ] diff --git a/src/test/resources/same_package/import-fail01/bar/bar.gobra b/src/test/resources/same_package/import-fail01/bar/bar.gobra index 3e38424a6..52da3e684 100644 --- a/src/test/resources/same_package/import-fail01/bar/bar.gobra +++ b/src/test/resources/same_package/import-fail01/bar/bar.gobra @@ -4,6 +4,6 @@ initEnsures acc(&A) && acc(&B) && acc(&C) package bar -var A int = 1 -var B int = 2 -var C int = 3 +var A@ int = 1 +var B@ int = 2 +var C@ int = 3 diff --git a/src/test/resources/same_package/import-success/bar/bar.gobra b/src/test/resources/same_package/import-success/bar/bar.gobra index 3e38424a6..52da3e684 100644 --- a/src/test/resources/same_package/import-success/bar/bar.gobra +++ b/src/test/resources/same_package/import-success/bar/bar.gobra @@ -4,6 +4,6 @@ initEnsures acc(&A) && acc(&B) && acc(&C) package bar -var A int = 1 -var B int = 2 -var C int = 3 +var A@ int = 1 +var B@ int = 2 +var C@ int = 3 diff --git a/src/test/resources/same_package/shareProgramDecls/prog1.gobra b/src/test/resources/same_package/shareProgramDecls/prog1.gobra index 775b5791c..517f0c8d9 100644 --- a/src/test/resources/same_package/shareProgramDecls/prog1.gobra +++ b/src/test/resources/same_package/shareProgramDecls/prog1.gobra @@ -3,7 +3,7 @@ package main -var A = 1 +var A@ = 1 func init() { // the initialization of variables declared in one file cannot access diff --git a/src/test/resources/same_package/shareProgramDecls/prog2.gobra b/src/test/resources/same_package/shareProgramDecls/prog2.gobra index 4e2109038..c9288d11f 100644 --- a/src/test/resources/same_package/shareProgramDecls/prog2.gobra +++ b/src/test/resources/same_package/shareProgramDecls/prog2.gobra @@ -3,4 +3,4 @@ package main -var B = 2 \ No newline at end of file +var B@ = 2 \ No newline at end of file From 23aa003468cbf11171a062a5b1037ac732b174a9 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Fri, 4 Nov 2022 13:06:13 +0100 Subject: [PATCH 036/296] Updates submodules (#564) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 431ec0d40..192cb84f6 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 431ec0d40be4082c7e57456d0ebcae3fd327b7d2 +Subproject commit 192cb84f69f926cc8cbbf74500afcb58271a18f9 From 72df4aedba64c89b47ed907e97cf8a8ecbb473cd Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Tue, 8 Nov 2022 13:31:08 +0100 Subject: [PATCH 037/296] Updates submodules (#566) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 192cb84f6..bbc7ecaf1 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 192cb84f69f926cc8cbbf74500afcb58271a18f9 +Subproject commit bbc7ecaf1265d171c287e21062ed7477eccc575f From 3b24c4413bd47e4dcf2670f765f9c5f973ebee50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Tue, 8 Nov 2022 19:42:34 +0100 Subject: [PATCH 038/296] Simplify encoding of `NewSliceLit` (#567) * Dirty test * Clean-up --- .../gobra/translator/context/Context.scala | 2 ++ .../encodings/combinators/TypeEncoding.scala | 21 +++++++++++++++++++ .../encodings/slices/SliceEncoding.scala | 10 +++++---- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/context/Context.scala b/src/main/scala/viper/gobra/translator/context/Context.scala index 202c7d710..259598ebb 100644 --- a/src/main/scala/viper/gobra/translator/context/Context.scala +++ b/src/main/scala/viper/gobra/translator/context/Context.scala @@ -77,6 +77,8 @@ trait Context { def initialization(x: in.Location): CodeWriter[vpr.Stmt] = typeEncoding.initialization(this)(x) + def allocation(x: in.Location): CodeWriter[vpr.Stmt] = typeEncoding.allocate(this)(x) + def assignment(x: in.Assignee, rhs: in.Expr)(src: in.Node): CodeWriter[vpr.Stmt] = typeEncoding.assignment(this)(x, rhs, src) def equal(lhs: in.Expr, rhs: in.Expr)(src: in.Node): CodeWriter[vpr.Exp] = typeEncoding.equal(this)(lhs, rhs, src) diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala index 9e09922b2..a64938693 100644 --- a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala @@ -125,6 +125,27 @@ trait TypeEncoding extends Generator { } yield vpr.Inhale(vpr.And(footprint, vpr.And(eq1, vpr.Not(eq2)(pos, info, errT))(pos, info, errT))(pos, info, errT))(pos, info, errT) } + /** + * Returns the allocation code for a declared location with the scope of a body. + * The initialization code has to guarantee that all permissions for the declared variables are owned afterwards + * + * The default implements: + * Allocate[loc: T°] -> EmptyStmt + * Allocate[loc: T@] -> inhale Footprint[loc]; assume [&loc != nil(*T)] + */ + def allocate(ctx: Context): in.Location ==> CodeWriter[vpr.Stmt] = { + case loc :: t / Exclusive if typ(ctx).isDefinedAt(t) => + val (pos, info, errT) = loc.vprMeta + unit(vpr.Seqn(Seq(), Seq())(pos, info, errT)) + + case loc :: t / Shared if typ(ctx).isDefinedAt(t) => + val (pos, info, errT) = loc.vprMeta + for { + footprint <- addressFootprint(ctx)(loc, in.FullPerm(loc.info)) + eq <- ctx.equal(in.Ref(loc)(loc.info), in.NilLit(in.PointerT(t, Exclusive))(loc.info))(loc) + } yield vpr.Inhale(vpr.And(footprint, vpr.Not(eq)(pos, info, errT))(pos, info, errT))(pos, info, errT) + } + /** * Encodes an assignment. * The first and second argument is the left-hand side and right-hand side, respectively. diff --git a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala index 1f4e3e8cf..9d3b8c4b0 100644 --- a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala @@ -193,23 +193,25 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { ) case lit: in.NewSliceLit => + val (pos, info, errT) = lit.vprMeta val litA = lit.asArrayLit val tmp = in.LocalVar(ctx.freshNames.next(), litA.typ.withAddressability(Addressability.pointerBase))(lit.info) val tmpT = ctx.variable(tmp) val underlyingTyp = underlyingType(lit.typ)(ctx) for { - initT <- ctx.initialization(tmp) - assignT <- ctx.assignment(in.Assignee.Var(tmp), litA)(lit) _ <- local(tmpT) + initT <- ctx.allocation(tmp) _ <- write(initT) - _ <- write(assignT) + eq <- ctx.equal(tmp, litA)(lit) + inhale = vpr.Inhale(eq)(pos, info, errT) + _ <- write(inhale) ass <- ctx.assignment( in.Assignee.Var(lit.target), in.Slice(tmp, in.IntLit(0)(lit.info), in.IntLit(litA.length)(lit.info), None, underlyingTyp)(lit.info) )(lit) } yield ass + } } - } /** * Obtains permission to all cells of a slice From 04e5c2b57d2d32549ba7ae88ff6e29bff9c788ec Mon Sep 17 00:00:00 2001 From: Felix Wolf <60103963+Felalolf@users.noreply.github.com> Date: Tue, 8 Nov 2022 19:43:22 +0100 Subject: [PATCH 039/296] made field names more specific (#568) --- .../gobra/translator/library/fields/FieldsImpl.scala | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/library/fields/FieldsImpl.scala b/src/main/scala/viper/gobra/translator/library/fields/FieldsImpl.scala index 90dc5d328..50e922263 100644 --- a/src/main/scala/viper/gobra/translator/library/fields/FieldsImpl.scala +++ b/src/main/scala/viper/gobra/translator/library/fields/FieldsImpl.scala @@ -16,13 +16,14 @@ class FieldsImpl extends Fields { override def finalize(addMemberFn: vpr.Member => Unit): Unit = _fieldGenerator.finalize(addMemberFn) - private val _fieldGenerator: PrimitiveGenerator.PrimitiveGenerator[vpr.Type, vpr.Field] = + private val _fieldGenerator: PrimitiveGenerator.PrimitiveGenerator[(String, vpr.Type), vpr.Field] = PrimitiveGenerator.simpleGenerator( - (t: vpr.Type) => { - val f = vpr.Field(name = Names.pointerField(t), typ = t)(vpr.NoPosition, vpr.NoInfo, vpr.NoTrafos) + (st: (String, vpr.Type)) => { + val f = vpr.Field(name = st._1, typ = st._2)(vpr.NoPosition, vpr.NoInfo, vpr.NoTrafos) (f, Vector(f)) } ) - override def field(t: in.Type)(ctx: Context): vpr.Field = _fieldGenerator(ctx.typ(t)) + override def field(t: in.Type)(ctx: Context): vpr.Field = + _fieldGenerator(Names.serializeType(t), ctx.typ(t)) } From 00f3661fcb6542d4ef9c760964647a75c35ae541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Thu, 10 Nov 2022 18:42:55 +0100 Subject: [PATCH 040/296] Optimize map encoding (#570) * Experiment * Backup * Backup * Apply suggestions from code review Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> --- .../encodings/maps/MapEncoding.scala | 133 +++++++----------- 1 file changed, 47 insertions(+), 86 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala index 23463eb21..f8e9116ca 100644 --- a/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala @@ -16,6 +16,7 @@ import viper.gobra.translator.Names import viper.gobra.translator.encodings.combinators.LeafTypeEncoding import viper.gobra.translator.encodings.maps.MapEncoding.{checkKeyComparability, comparabilityErrorT, repeatedKeyErrorT} import viper.gobra.translator.context.Context +import viper.gobra.translator.util.PrimitiveGenerator import viper.gobra.translator.util.ViperWriter.CodeLevel._ import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.util.Violation @@ -38,21 +39,16 @@ import viper.silver.{ast => vpr} class MapEncoding extends LeafTypeEncoding { import viper.gobra.translator.util.TypePatterns._ - private val domainName: String = Names.mapsDomain - /** * Translates a type into a Viper type. * Both Exclusive and Shared maps are encoded as vpr.Ref because nil is an admissible value for maps */ - override def typ(ctx : Context) : in.Type ==> vpr.Type = { + override def typ(ctx: Context): in.Type ==> vpr.Type = { case ctx.Map(_, _) / Exclusive => mapType case ctx.Map(_, _) / Shared => vpr.Ref } - private lazy val mapType: vpr.Type = { - isUsed = true - vpr.Ref - } + private val mapType: vpr.Type = vpr.Ref /** * Encodes expressions as values that do not occupy some identifiable location in memory. @@ -63,8 +59,9 @@ class MapEncoding extends LeafTypeEncoding { * R[ keySet(e: map[K]V) ] -> [e] == null? 0 : MapDomain(getCorrespondingMap(e)) * R[ valueSet(e: map[K]V) ] -> [e] == null? 0 : MapRange(getCorrespondingMap(e)) */ - override def expression(ctx : Context) : in.Expr ==> CodeWriter[vpr.Exp] = { + override def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = { def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) + def goT(t: in.Type): vpr.Type = ctx.typ(t) default(super.expression(ctx)) { @@ -72,7 +69,7 @@ class MapEncoding extends LeafTypeEncoding { case (exp: in.NilLit) :: ctx.Map(_, _) / Exclusive => unit(withSrc(vpr.NullLit(), exp)) - case l@ in.Length(exp :: ctx.Map(keys, values)) => + case l@in.Length(exp :: ctx.Map(keys, values)) => val (pos, info, errT) = l.vprMeta // Encodes // [ len(m) ] -> [ m ] == null? 0 : | getCorrespondingMap([m]) | @@ -86,9 +83,9 @@ class MapEncoding extends LeafTypeEncoding { )(pos, info, errT) } yield res - case l@in.IndexedExp(_ :: ctx.Map(_, _), _, _) => for { (res, _) <- goMapLookup(l)(ctx) } yield res + case l@in.IndexedExp(_ :: ctx.Map(_, _), _, _) => for {(res, _) <- goMapLookup(l)(ctx)} yield res - case k@ in.MapKeys(mapExp :: ctx.Map(keys, values), _) => + case k@in.MapKeys(mapExp :: ctx.Map(keys, values), _) => for { vprMap <- goE(mapExp) correspondingMap <- getCorrespondingMap(mapExp, keys, values)(ctx) @@ -100,7 +97,7 @@ class MapEncoding extends LeafTypeEncoding { ), k) } yield res - case v@ in.MapValues(mapExp:: ctx.Map(keys, values), _) => + case v@in.MapValues(mapExp :: ctx.Map(keys, values), _) => for { vprMap <- goE(mapExp) correspondingMap <- getCorrespondingMap(mapExp, keys, values)(ctx) @@ -165,13 +162,13 @@ class MapEncoding extends LeafTypeEncoding { _ <- local(mapVarVpr) correspondingMap <- getCorrespondingMap(mapVar, keys, values)(ctx) - _ <- write(vpr.NewStmt(mapVarVpr.localVar, Seq(underlyingMapField))(pos, info, errT)) + _ <- write(vpr.NewStmt(mapVarVpr.localVar, Seq(underlyingMapField(ctx)(keys, values)))(pos, info, errT)) _ <- write(vpr.Inhale(vpr.EqCmp(correspondingMap, vpr.EmptyMap(goT(keys), goT(values))(pos, info, errT))(pos, info, errT))(pos, info, errT)) ass <- ctx.assignment(in.Assignee.Var(target), mapVar)(makeStmt) } yield ass ) - case l@ in.SafeMapLookup(resTarget, successTarget, indexedExp@ in.IndexedExp(_, _, _)) => + case l@in.SafeMapLookup(resTarget, successTarget, indexedExp@in.IndexedExp(_, _, _)) => val (pos, info, errT) = l.vprMeta val res = in.LocalVar(ctx.freshNames.next(), indexedExp.typ.withAddressability(Addressability.Exclusive))(l.info) val vprRes = ctx.variable(res) @@ -194,7 +191,7 @@ class MapEncoding extends LeafTypeEncoding { okAss <- ctx.assignment(in.Assignee.Var(successTarget), ok)(l) } yield okAss - ) + ) case lit: in.NewMapLit => val (pos, info, errT) = lit.vprMeta @@ -229,7 +226,7 @@ class MapEncoding extends LeafTypeEncoding { _ <- write( vpr.Inhale( vpr.FieldAccessPredicate( - vpr.FieldAccess(vRes.localVar, underlyingMapField)(pos, info, errT), + vpr.FieldAccess(vRes.localVar, underlyingMapField(ctx)(lit.keys, lit.values))(pos, info, errT), vpr.FullPerm()(pos, info, errT))(pos, info, errT))(pos, info, errT)) // inhale getCorrespondingMap(res) == underlyingMap; recall that underlyingMap == ExplicitMap(mapletList) _ <- write(vpr.Inhale(vpr.EqCmp(underlyingMap, correspondingMap)(pos, info, errT))(pos, info, errT)) @@ -248,42 +245,23 @@ class MapEncoding extends LeafTypeEncoding { /** * Encodes an assignment. * [ mapExp[idx] = newVal ] -> - * var res: Ref * var m: Map[ [k], [v] ] - * m = getCorrespondingMap(mapExp) - * inhale getMap(res) == m[ [idx] = [newVal] ] - * m.underlyingField = res + * m = [mapExp].underlyingMapField + * [mapExp].underlyingMapField := m[ [idx] = [newVal] ] */ override def assignment(ctx: Context): (in.Assignee, in.Expr, in.Node) ==> CodeWriter[vpr.Stmt] = { - def goT(t: in.Type): vpr.Type = ctx.typ(t) - default(super.assignment(ctx)){ + default(super.assignment(ctx)) { case (in.Assignee(in.IndexedExp(m :: ctx.Map(keys, values), idx, _)), rhs, src) => val (pos, info, errT) = src.vprMeta - val res = in.LocalVar(ctx.freshNames.next(), in.IntT(Exclusive))(m.info) - val vRes = ctx.variable(res) seqn( for { isCompKey <- MapEncoding.checkKeyComparability(idx)(ctx) _ <- assert(isCompKey, comparabilityErrorT) // key must be comparable - vRhs <- ctx.expression(rhs) - vM <- ctx.expression(m) vIdx <- ctx.expression(idx) - _ <- local(vRes) - correspondingMapM <- getCorrespondingMap(m, keys, values)(ctx) - - // cannot be replaced by `getCorrespondingMap(vRes, goT(k), goT(v)`, there is no field access to the underlyingMapField - correspondingMapRes = vpr.DomainFuncApp( - func = getMapFunc, - args = Seq(vRes.localVar), - typVarMap = Map(keyParam -> goT(keys), valueParam -> goT(values)) - )(pos, info, errT) - - inhale = vpr.Inhale(vpr.EqCmp(correspondingMapRes, vpr.MapUpdate(correspondingMapM, vIdx, vRhs)(pos, info, errT))(pos, info, errT))(pos, info, errT) - _ <- write(inhale) - } yield vpr.FieldAssign(vpr.FieldAccess(vM, underlyingMapField)(pos, info, errT), vRes.localVar)(pos, info, errT) + } yield vpr.FieldAssign(correspondingMapM, vpr.MapUpdate(correspondingMapM, vIdx, vRhs)(pos, info, errT))(pos, info, errT) ) } } @@ -296,69 +274,28 @@ class MapEncoding extends LeafTypeEncoding { def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) default(super.assertion(ctx)) { - case n@ in.Access(in.Accessible.ExprAccess(exp :: ctx.Map(_, _)), perm) => + case n@in.Access(in.Accessible.ExprAccess(exp :: ctx.Map(keys, values)), perm) => val (pos, info, errT) = n.vprMeta for { vE <- goE(exp) vP <- goE(perm) - } yield vpr.FieldAccessPredicate(vpr.FieldAccess(vE, underlyingMapField)(pos, info, errT), vP)(pos, info, errT) + } yield vpr.FieldAccessPredicate(vpr.FieldAccess(vE, underlyingMapField(ctx)(keys, values))(pos, info, errT), vP)(pos, info, errT) } } override def finalize(addMemberFn: vpr.Member => Unit): Unit = { - if (isUsed) { - addMemberFn(genDomain()) - addMemberFn(underlyingMapField) - } + underlyingMapFieldGenerator.finalize(addMemberFn) } - private var isUsed: Boolean = false - - private val keyParam = vpr.TypeVar("K") - private val valueParam = vpr.TypeVar("V") - /** - * Generates - * domain GobraMap[K,V] { - * function getMap(addr: Int): Map[K,V] - * } + * Builds the expression `[exp].underlyingMapField` */ - private def genDomain(): vpr.Domain = { - vpr.Domain( - name = domainName, - functions = Seq(getMapFunc), - axioms = Seq(), - typVars = Seq(keyParam, valueParam) - )() - } - - private val getMapFuncName: String = "getMap" - private val getMapFunc: vpr.DomainFunc = vpr.DomainFunc( - name = getMapFuncName, - formalArgs = Seq(vpr.LocalVarDecl("id", vpr.Int)()), - typ = vpr.MapType(keyParam, valueParam), - )(domainName = domainName) - - /** - * Field of the corresponding map id - */ - private val underlyingMapFieldName: String = "underlyingMapField" - private def underlyingMapField: vpr.Field = vpr.Field(underlyingMapFieldName, vpr.Int)() - - /** - * Builds the expression `getMap([exp].underlyingMapField)` - */ - private def getCorrespondingMap(exp: in.Expr, keys: in.Type, values: in.Type)(ctx: Context): CodeWriter[vpr.Exp] = { + private def getCorrespondingMap(exp: in.Expr, keys: in.Type, values: in.Type)(ctx: Context): CodeWriter[vpr.FieldAccess] = { def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) - def goT(t: in.Type): vpr.Type = ctx.typ(t) for { vExp <- goE(exp) - res = withSrc(vpr.DomainFuncApp( - func = getMapFunc, - args = Seq(withSrc(vpr.FieldAccess(vExp, underlyingMapField), exp)), - typVarMap = Map(keyParam -> goT(keys), valueParam -> goT(values)) - ), exp) + res = withSrc(vpr.FieldAccess(vExp, underlyingMapField(ctx)(keys, values)), exp) } yield res } @@ -394,6 +331,30 @@ class MapEncoding extends LeafTypeEncoding { case _ => Violation.violation(s"unexpected case reached") } } + + private def internalMemberName(prefix: String, k: in.Type, v: in.Type): String = { + val kN = Names.serializeType(k) + val vN = Names.serializeType(v) + s"$prefix$$$kN$$$vN" + } + + /** + * Field of the corresponding map type + */ + private val underlyingMapFieldPrefix: String = "underlyingMapField" + private def underlyingMapField(ctx: Context)(k: in.Type, v: in.Type): vpr.Field = { + val name = internalMemberName(underlyingMapFieldPrefix, k, v) + val vprK = ctx.typ(k) + val vprV = ctx.typ(v) + underlyingMapFieldGenerator(name, vprK, vprV) + } + + private val underlyingMapFieldGenerator: PrimitiveGenerator.PrimitiveGenerator[(String, vpr.Type, vpr.Type), vpr.Field] = + PrimitiveGenerator.simpleGenerator { + case (name: String, k: vpr.Type, v: vpr.Type) => + val f = vpr.Field(name = name, typ = vpr.MapType(k, v))() + (f, Vector(f)) + } } object MapEncoding { From 715345a947bb90e1ce47217ccf2c528beff66439 Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Thu, 10 Nov 2022 23:58:56 +0100 Subject: [PATCH 041/296] safety commit --- .../scala/viper/gobra/ast/frontend/Ast.scala | 34 ++ .../viper/gobra/ast/frontend/AstPattern.scala | 2 + .../gobra/ast/frontend/PrettyPrinter.scala | 30 ++ .../gobra/ast/internal/PrettyPrinter.scala | 34 ++ .../viper/gobra/ast/internal/Program.scala | 54 ++ .../ast/internal/theory/Comparability.scala | 2 + .../gobra/ast/internal/theory/TypeHead.scala | 8 + .../transform/OverflowChecksTransform.scala | 2 +- .../frontend/info/base/SymbolTable.scala | 29 ++ .../viper/gobra/frontend/info/base/Type.scala | 7 +- .../property/Addressability.scala | 3 +- .../property/Assignability.scala | 26 + .../property/TypeIdentity.scala | 2 + .../implementation/property/TypeMerging.scala | 4 +- .../resolution/AdvancedMemberSet.scala | 2 + .../resolution/AmbiguityResolution.scala | 2 + .../resolution/MemberResolution.scala | 270 ++++++---- .../resolution/NameResolution.scala | 215 ++++---- .../implementation/typing/ExprTyping.scala | 16 +- .../info/implementation/typing/IdTyping.scala | 6 + .../implementation/typing/TypeTyping.scala | 6 + .../typing/ghost/GhostExprTyping.scala | 22 +- .../typing/ghost/GhostIdTyping.scala | 34 +- .../typing/ghost/GhostMiscTyping.scala | 66 ++- .../typing/ghost/GhostStmtTyping.scala | 4 + .../typing/ghost/GhostTypeTyping.scala | 2 + .../viper/gobra/reporting/VerifierError.scala | 5 + .../scala/viper/gobra/translator/Names.scala | 6 + .../encodings/adts/AdtEncoding.scala | 469 ++++++++++++++++++ .../interfaces/TypeComponentImpl.scala | 2 + .../gobra/translator/util/TypePatterns.scala | 14 + 31 files changed, 1171 insertions(+), 207 deletions(-) create mode 100644 src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index bfa306d11..c5b207027 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -949,6 +949,35 @@ case class PPackageWand(wand: PMagicWand, proofScript: Option[PBlock]) extends P case class PApplyWand(wand: PMagicWand) extends PGhostStatement +case class PMatchStatement(exp: PExpression, clauses: Vector[PMatchStmtCase], strict: Boolean = true) extends PGhostStatement + +case class PMatchStmtCase(pattern: PMatchPattern, stmt: Vector[PStatement], default: Boolean = false) extends PGhostMisc with PScope + +case class PMatchExp(exp: PExpression, clauses: Vector[PMatchExpClause]) extends PGhostExpression { + val caseClauses: Vector[PMatchExpCase] = clauses collect {case c: PMatchExpCase => c} + val defaultClauses: Vector[PMatchExpDefault] = clauses collect {case c: PMatchExpDefault => c} + val hasDefault: Boolean = defaultClauses.length == 1 + val hasNoDefault: Boolean = defaultClauses.isEmpty +} + +sealed trait PMatchExpClause extends PGhostMisc with PScope { + def exp: PExpression +} + +case class PMatchExpCase(pattern: PMatchPattern, exp: PExpression) extends PMatchExpClause + +case class PMatchExpDefault(exp: PExpression) extends PMatchExpClause + +sealed trait PMatchPattern extends PGhostMisc + +case class PMatchValue(lit: PExpression) extends PMatchPattern + +case class PMatchBindVar(idn: PIdnDef) extends PMatchPattern + +case class PMatchAdt(clause: PType, fields: Vector[PMatchPattern]) extends PMatchPattern + +case class PMatchWildcard() extends PMatchPattern + /** * Ghost Expressions and Assertions */ @@ -1200,6 +1229,11 @@ case class PMathematicalMapType(keys: PType, values: PType) extends PGhostLitera /** The type of option types. */ case class POptionType(elem : PType) extends PGhostLiteralType +/** The type of ADT types */ +case class PAdtType(clauses: Vector[PAdtClause]) extends PGhostLiteralType with PUnorderedScope + +case class PAdtClause(id: PIdnDef, args: Vector[PFieldDecls]) extends PGhostMisc with PUnorderedScope + case class PGhostSliceType(elem: PType) extends PGhostLiteralType case class PDomainType(funcs: Vector[PDomainFunction], axioms: Vector[PDomainAxiom]) extends PGhostLiteralType with PUnorderedScope diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala index 31704ffb5..dfb5b5d7d 100644 --- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala +++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala @@ -22,6 +22,7 @@ object AstPattern { case class NamedType(id: PIdnUse, symb: st.ActualTypeEntity) extends Type with Symbolic case class PointerType(base: PType) extends Type + case class QualifiedAdtType(base: PType, symb: st.AdtClause) extends Type with Symbolic // TODO: rename case class BuiltInType(id: PIdnUse, symb: st.BuiltInType) extends Type with Symbolic @@ -32,6 +33,7 @@ object AstPattern { case class GlobalVariable(id: PIdnUse, symb: st.GlobalVariable) extends Expr with Symbolic case class Deref(base: PExpression) extends Expr case class FieldSelection(base: PExpression, id: PIdnUse, path: Vector[MemberPath], symb: st.StructMember) extends Expr with Symbolic + case class AdtField(base: PExpression, id: PIdnUse, symb: st.AdtMember) extends Expr with Symbolic // TODO: maybe rename case class Conversion(typ: PType, arg: PExpression) extends Expr sealed trait FunctionLikeCall extends Expr { diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index a87260f33..05a005354 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -276,6 +276,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PFold(exp) => "fold" <+> showExpr(exp) case PPackageWand(wand, blockOpt) => "package" <+> showExpr(wand) <+> opt(blockOpt)(showStmt) case PApplyWand(wand) => "apply" <+> showExpr(wand) + case PMatchStatement(exp, clauses, _) => "match" <+> + showExpr(exp) <+> block(ssep(clauses map showMatchClauseStatement, line)) case PClosureImplProof(impl, PBlock(stmts)) => "proof" <+> showExpr(impl) <> block(showStmtList(stmts)) } } @@ -329,6 +331,20 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case _ => "range" <+> showExpr(n.exp) <+> "with" <+> showId(n.enumerated) } + def showMatchClauseStatement(n: PMatchStmtCase): Doc = "case" <+> showMatchPattern(n.pattern) <> ":" <+> nest(line <> ssep(n.stmt map showStmt, line)) + + def showMatchPattern(exp: PMatchPattern): Doc = exp match { + case PMatchWildcard() => "_" + case PMatchBindVar(idn) => showId(idn) + case PMatchAdt(clause, fields) => showType(clause) <> "{" <> ssep(fields map showMatchPattern, ", ") <> "}" + case PMatchValue(lit) => "`" <> showExpr(lit) <> "`" + } + + def showMatchExpClause(c: PMatchExpClause): Doc = c match { + case PMatchExpDefault(_) => "default:" + case PMatchExpCase(pattern, _) => "case" <+> showMatchPattern(pattern) <> ":" + } + // expressions def showExprOrType(expr: PExpressionOrType): Doc = expr match { @@ -503,6 +519,9 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case POptionSome(e) => "some" <> parens(showExpr(e)) case POptionGet(e) => "get" <> parens(showExpr(e)) + case PMatchExp(exp, clauses) => "match" <+> showExpr(exp) <+> block( + ssep(clauses map { c => showMatchExpClause(c) <+> showExpr(c.exp) }, line)) + case expr : PGhostCollectionExp => expr match { case PIn(left, right) => showSubExpr(expr, left) <+> "in" <+> showSubExpr(expr, right) case PMultiplicity(left, right) => showSubExpr(expr, left) <+> "#" <+> showSubExpr(expr, right) @@ -620,6 +639,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter "domain" <+> block( ssep((funcs ++ axioms) map showMisc, line) ) + case PAdtType(clauses) => "adt" <> block(ssep(clauses map showMisc, line)) } def showStructClause(c: PStructClause): Doc = c match { @@ -683,6 +703,16 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter opt(mip.body)(b => space <> showBodyParameterInfoWithBlock(b._1, b._2)) case ipa: PImplementationProofPredicateAlias => "pred" <+> showId(ipa.left) <+> ":=" <+> showExprOrType(ipa.right) + case PAdtClause(id, args) => + showId(id) <+> block( + ssep(args map (decl => { + val fields = decl.fields + showIdList(fields map (_.id)) <+> showType(fields.head.typ) + }), line)) + case clause: PMatchStmtCase => showMatchClauseStatement(clause) + case expr: PMatchPattern => showMatchPattern(expr) + case c: PMatchExpDefault => showMatchExpClause(c) + case c: PMatchExpCase => showMatchExpClause(c) } } diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index 94aa4225a..e31b21de3 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -132,6 +132,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case n: GlobalConstDecl => showGlobalConstDecl(n) case n: GlobalVarDecl => showGlobalVarDecl(n) case n: BuiltInMember => showBuiltInMember(n) + case n: AdtDefinition => showAdtDefinition(n) }) def showTerminationMeasure(measure: TerminationMeasure): Doc = { @@ -237,6 +238,14 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case DomainAxiom(expr) => "axiom" <+> block(showExpr(expr)) }) + def showAdtDefinition(n: AdtDefinition): Doc = updatePositionStore(n) <> ( + n.name <+> block(ssep(n.clauses map showAdtClause, line)) + ) + + def showAdtClause(clause: AdtClause): Doc = updatePositionStore(clause) <> (clause match { + case AdtClause(name, args) => name.name <+> block(ssep(args map showField, line)) + }) + def showTypeDecl(t: DefinedT): Doc = "type" <+> t.name <+> "..." <> line @@ -332,6 +341,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case Unfold(acc) => "unfold" <+> showAss(acc) case PackageWand(wand, block) => "package" <+> showAss(wand) <+> opt(block)(showStmt) case ApplyWand(wand) => "apply" <+> showAss(wand) + case PatternMatchStmt(exp, cases, _) => "match" <+> + showExpr(exp) <+> block(ssep(cases map showPatternMatchCaseStmt, line)) case Send(channel, msg, _, _, _) => showExpr(channel) <+> "<-" <+> showExpr(msg) case SafeReceive(resTarget, successTarget, channel, _, _, _, _) => showVar(resTarget) <> "," <+> showVar(successTarget) <+> "=" <+> "<-" <+> showExpr(channel) @@ -354,6 +365,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case FPredicateProxy(name) => name case MPredicateProxy(name, _) => name case FunctionLitProxy(name) => name + case AdtClauseProxy(name, _) => name case l: LabelProxy => l.name }) @@ -398,6 +410,17 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case Assignee.Index(e) => showExpr(e) }) + def showPatternMatchCaseStmt(c: PatternMatchCaseStmt): Doc = "case" <+> showMatchPattern(c.mExp) <> ":" <+> nest(showStmt(c.body)) + + def showPatternMatchCaseExp(c: PatternMatchCaseExp): Doc = "case" <+> showMatchPattern(c.mExp) <> ":" <+> showExpr(c.exp) + + def showMatchPattern(expr: MatchPattern): Doc = expr match { + case MatchBindVar(name, _) => name + case MatchAdt(clause, expr) => clause.name <+> "{" <> ssep(expr map showMatchPattern, ",") <> "}" + case MatchValue(exp) => "`" <> showExpr(exp) <> "`" + case MatchWildcard() => "_" + } + // assertions def showAss(a: Assertion): Doc = updatePositionStore(a) <> (a match { case SepAnd(left, right) => showAss(left) <+> "&&" <+> showAss(right) @@ -492,6 +515,11 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case OptionSome(exp) => "some" <> parens(showExpr(exp)) case OptionGet(exp) => "get" <> parens(showExpr(exp)) + case AdtDiscriminator(base, clause) => showExpr(base) <> "." <> showProxy(clause) + case AdtDestructor(base, field) => showExpr(base) <> "." <> showField(field) + case PatternMatchExp(exp, _, cases, default) => "match" <+> showExpr(exp) <+> + block(ssep(cases map showPatternMatchCaseExp, line) <> (if (default.isDefined) line <> "default:" <+> showExpr(default.get) else "")) + case Slice(exp, low, high, max, _) => { val maxD = max.map(e => ":" <> showExpr(e)).getOrElse(emptyDoc) showExpr(exp) <> brackets(showExpr(low) <> ":" <> showExpr(high) <> maxD) @@ -591,6 +619,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case lit@MathMapLit(_, _, entries) => val entriesDoc = showList(entries){ case (x,y) => showExpr(x) <> ":" <+> showExpr(y) } showType(lit.typ) <+> braces(space <> entriesDoc <> (if (entries.nonEmpty) space else emptyDoc)) + + case AdtConstructorLit(typ, _, args) => showType(typ) <> braces(showExprList(args)) } // variables @@ -639,6 +669,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case MultisetT(elem, _) => "mset" <> brackets(showType(elem)) case MathMapT(keys, values, _) => "dict" <> brackets(showType(keys)) <> showType(values) case OptionT(elem, _) => "option" <> brackets(showType(elem)) + case AdtT(name, _, _) => "adt" <> parens(name) + case AdtClauseT(name, adtT, _, _) => showType(adtT) <+> "::" <+> name case SliceT(elem, _) => "[]" <> showType(elem) case MapT(keys, values, _) => "map" <> brackets(showType(keys)) <> showType(values) } @@ -762,6 +794,8 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter { case Unfold(acc) => "unfold" <+> showAss(acc) case PackageWand(wand, _) => "package" <+> showAss(wand) case ApplyWand(wand) => "apply" <+> showAss(wand) + case PatternMatchStmt(exp, cases, strict) => (if (strict) "!" else "") <> "match" <+> + showExpr(exp) <+> block(ssep(cases map showPatternMatchCaseStmt, line)) case Send(channel, msg, _, _, _) => showExpr(channel) <+> "<-" <+> showExpr(msg) case SafeReceive(resTarget, successTarget, channel, _, _, _, _) => showVar(resTarget) <> "," <+> showVar(successTarget) <+> "=" <+> "<-" <+> showExpr(channel) diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index 5ae635350..970a1e250 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -315,6 +315,9 @@ case class DomainFunc( results: Parameter.Out )(val info: Source.Parser.Info) extends Node +case class AdtDefinition(name: String, clauses: Vector[AdtClause])(val info: Source.Parser.Info) extends Member +case class AdtClause(name: AdtClauseProxy, args: Vector[Field])(val info: Source.Parser.Info) extends Node + sealed trait Stmt extends Node /** This node serves as a target of encoding extensions. See [[viper.gobra.translator.encodings.combinators.TypeEncoding.Extension]]*/ @@ -464,6 +467,23 @@ case class SafeReceive(resTarget: LocalVar, successTarget: LocalVar, channel: Ex */ case class SafeMapLookup(resTarget: LocalVar, successTarget: LocalVar, mapLookup: IndexedExp)(val info: Source.Parser.Info) extends Stmt +case class PatternMatchExp(exp: Expr, typ: Type, cases: Vector[PatternMatchCaseExp], default: Option[Expr])(val info: Source.Parser.Info) extends Expr + +case class PatternMatchCaseExp(mExp: MatchPattern, exp: Expr)(val info: Source.Parser.Info) extends Node + +case class PatternMatchStmt(exp: Expr, cases: Vector[PatternMatchCaseStmt], strict: Boolean)(val info: Source.Parser.Info) extends Stmt + +case class PatternMatchCaseStmt(mExp: MatchPattern, body: Stmt)(val info: Source.Parser.Info) extends Node + +sealed trait MatchPattern extends Node + +case class MatchValue(exp: Expr)(val info: Source.Parser.Info) extends MatchPattern + +case class MatchBindVar(name: String, typ: Type)(val info: Source.Parser.Info) extends MatchPattern + +case class MatchAdt(clause: AdtClauseT, expr: Vector[MatchPattern])(val info: Source.Parser.Info) extends MatchPattern + +case class MatchWildcard()(val info: Source.Parser.Info) extends MatchPattern sealed trait Assertion extends Node @@ -991,6 +1011,14 @@ case class StructUpdate(base: Expr, field: Field, newVal: Expr)(val info: Source override val typ: Type = base.typ } +case class AdtDestructor(base: Expr, field: Field)(val info: Source.Parser.Info) extends Expr { + override def typ: Type = field.typ +} + +case class AdtDiscriminator(base: Expr, clause: AdtClauseProxy)(val info: Source.Parser.Info) extends Expr { + override def typ: Type = BoolT(Addressability.literal) +} + sealed trait BoolOperation extends Expr { override val typ: Type = BoolT(Addressability.rValue) } @@ -1193,6 +1221,8 @@ case class NewMapLit(target: LocalVar, keys: Type, values: Type, entries: Seq[(E val typ : Type = MapT(keys, values, Addressability.literal) } +case class AdtConstructorLit(typ: Type, clause: AdtClauseProxy, args: Vector[Expr])(val info: Source.Parser.Info) extends CompositeLit + sealed trait Declaration extends Node /** Everything that is defined with the scope of a code block. */ @@ -1535,6 +1565,28 @@ case class DomainT(name: String, addressability: Addressability) extends PrettyT DomainT(name, newAddressability) } +// TODO: check why `clauseToTag` is necessary +case class AdtT(name: String, addressability: Addressability, clauseToTag: Map[String, BigInt]) extends Type with TopType { + override def equalsWithoutMod(t: Type): Boolean = t match { + case o: AdtT => name == o.name + case _ => false + } + + override def withAddressability(newAddressability: Addressability): Type = + AdtT(name, newAddressability, clauseToTag) +} + +case class AdtClauseT(name: String, adtT: AdtT, fields: Vector[Field], addressability: Addressability) extends Type { + /** Returns whether 'this' is equals to 't' without considering the addressability modifier of the types. */ + override def equalsWithoutMod(t: Type): Boolean = t match { + case o: AdtClauseT => name == o.name && adtT == o.adtT + case _ => false + } + + override def withAddressability(newAddressability: Addressability): Type = + AdtClauseT(name, adtT, fields, newAddressability) +} + case class ChannelT(elem: Type, addressability: Addressability) extends PrettyType(s"chan $elem") { override def equalsWithoutMod(t: Type): Boolean = t match { case o: ChannelT => elem == o.elem @@ -1569,6 +1621,8 @@ case class FunctionProxy(override val name: String)(val info: Source.Parser.Info case class MethodProxy(name: String, uniqueName: String)(val info: Source.Parser.Info) extends MemberProxy with CallProxy case class DomainFuncProxy(name: String, domainName: String)(val info: Source.Parser.Info) extends Proxy +case class AdtClauseProxy(name: String, adtName: String)(val info: Source.Parser.Info) extends Proxy + case class FunctionLitProxy(override val name: String)(val info: Source.Parser.Info) extends FunctionMemberOrLitProxy sealed trait PredicateProxy extends Proxy diff --git a/src/main/scala/viper/gobra/ast/internal/theory/Comparability.scala b/src/main/scala/viper/gobra/ast/internal/theory/Comparability.scala index 6c8d02db8..0ea896aa5 100644 --- a/src/main/scala/viper/gobra/ast/internal/theory/Comparability.scala +++ b/src/main/scala/viper/gobra/ast/internal/theory/Comparability.scala @@ -58,6 +58,8 @@ object Comparability { case TypeHead.MathMapHD => Kind.Recursive case TypeHead.OptionHD => Kind.Recursive case _: TypeHead.TupleHD => Kind.Recursive + case _: TypeHead.AdtHD => Kind.Comparable + case _: TypeHead.AdtClauseHD => Kind.Comparable case _: TypeHead.PredHD => Kind.Comparable } diff --git a/src/main/scala/viper/gobra/ast/internal/theory/TypeHead.scala b/src/main/scala/viper/gobra/ast/internal/theory/TypeHead.scala index 921d218ab..27bae7961 100644 --- a/src/main/scala/viper/gobra/ast/internal/theory/TypeHead.scala +++ b/src/main/scala/viper/gobra/ast/internal/theory/TypeHead.scala @@ -43,6 +43,8 @@ object TypeHead { case object MathMapHD extends TypeHead case object OptionHD extends TypeHead case class TupleHD(arity: Int) extends TypeHead + case class AdtHD(name: String) extends TypeHead + case class AdtClauseHD(name: String) extends TypeHead case class PredHD(arity: Int) extends TypeHead val emptyInterfaceHD: InterfaceHD = InterfaceHD(Names.emptyInterface) @@ -81,6 +83,8 @@ object TypeHead { case _: MathMapT => MathMapHD case _: OptionT => OptionHD case t: TupleT => TupleHD(t.ts.size) + case t: AdtT => AdtHD(t.name) + case t: AdtClauseT => AdtClauseHD(t.name) case t: PredT => PredHD(t.args.size) } @@ -110,6 +114,8 @@ object TypeHead { case t: MathMapT => Vector(t.keys, t.values) case t: OptionT => Vector(t.t) case t: TupleT => t.ts + case _: AdtT => Vector.empty + case _: AdtClauseT => Vector.empty case t: PredT => t.args } @@ -184,6 +190,8 @@ object TypeHead { case MathMapHD => 2 case OptionHD => 1 case t: TupleHD => t.arity + case _: AdtHD => 0 + case _: AdtClauseHD => 0 case t: PredHD => t.arity } diff --git a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala index 83122b35b..883d861b6 100644 --- a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala +++ b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala @@ -137,7 +137,7 @@ object OverflowChecksTransform extends InternalTransform { // explicitly matches remaining statements to detect non-exhaustive pattern matching if a new statement is added case x@(_: Inhale | _: Exhale | _: Assert | _: Assume | _: Return | _: Fold | _: Unfold | _: PredExprFold | _: PredExprUnfold | _: Outline - | _: SafeTypeAssertion | _: SafeReceive | _: Label | _: Initialization ) => x + | _: SafeTypeAssertion | _: SafeReceive | _: Label | _: Initialization | _: PatternMatchStmt) => x case _ => violation("Unexpected case reached.") } diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala index 52af9697f..d5b905bd9 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala @@ -255,6 +255,35 @@ object SymbolTable extends Environments[Entity] { override val result: PResult = decl.result } + case class MatchVariable(decl: PMatchBindVar, p: PNode, context: ExternalTypeInfo) extends GhostVariable { + override def rep: PNode = decl + + override def addressable: Boolean = false + } + + case class AdtClause(decl: PAdtClause, adtDecl: PAdtType, context: ExternalTypeInfo) extends GhostRegular { + override def rep: PNode = decl + + def getName: String = decl.id.name + + val fields: Vector[PFieldDecl] = decl.args.flatMap(f => f.fields) + } + + sealed trait AdtMember extends GhostTypeMember { + def getName: String + } + + case class AdtDestructor(decl: PFieldDecl, adtType: PAdtType, context: ExternalTypeInfo) extends AdtMember { + override def rep: PNode = decl + + override def getName: String = decl.id.name + } + + case class AdtDiscriminator(decl: PAdtClause, adtType: PAdtType, context: ExternalTypeInfo) extends AdtMember { + override def rep: PNode = decl + + override def getName: String = s"is${decl.id.name}" + } /** * entities for built-in members diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala index 671f7dc97..a467e5462 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -8,7 +8,7 @@ package viper.gobra.frontend.info.base import org.bitbucket.inkytonik.kiama.==> import org.bitbucket.inkytonik.kiama.util.Messaging.Messages -import viper.gobra.ast.frontend.{PDomainType, PImport, PInterfaceType, PNode, PStructType, PTypeDecl} +import viper.gobra.ast.frontend.{PAdtClause, PAdtType, PDomainType, PImport, PInterfaceType, PNode, PStructType, PTypeDecl} import viper.gobra.frontend.info.ExternalTypeInfo import viper.gobra.util.TypeBounds @@ -56,6 +56,11 @@ object Type { case class DomainT(decl: PDomainType, context: ExternalTypeInfo) extends PrettyType("domain{...}") with ContextualType + case class AdtT(decl: PAdtType, context: ExternalTypeInfo) extends Type + + // TODO: rename `clauses` to `fields` + case class AdtClauseT(clauses: Map[String, Type], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends Type + case class MapT(key: Type, elem: Type) extends PrettyType(s"map[$key]$elem") case class PointerT(elem: Type) extends PrettyType(s"*$elem") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala index 62d755305..30ade529b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala @@ -70,7 +70,7 @@ trait Addressability extends BaseProperty { this: TypeInfoImpl => case n: PDot => resolve(n) match { case Some(s: ap.FieldSelection) => AddrMod.fieldLookup(addressabilityMemberPath(addressability(s.base), s.path)) case Some(_: ap.Constant) => AddrMod.constant - case Some(_: ap.ReceivedMethod | _: ap.MethodExpr | _: ap.ReceivedPredicate | _: ap.PredicateExpr ) => AddrMod.rValue + case Some(_: ap.ReceivedMethod | _: ap.MethodExpr | _: ap.ReceivedPredicate | _: ap.PredicateExpr | _: ap.AdtField) => AddrMod.rValue case Some(_: ap.NamedType | _: ap.BuiltInType | _: ap.Function | _: ap.Predicate | _: ap.DomainFunction) => AddrMod.rValue case Some(_: ap.ImplicitlyReceivedInterfaceMethod | _: ap.ImplicitlyReceivedInterfacePredicate) => AddrMod.rValue case Some(g: ap.GlobalVariable) => if (g.symb.addressable) AddrMod.Shared else AddrMod.Exclusive @@ -107,6 +107,7 @@ trait Addressability extends BaseProperty { this: TypeInfoImpl => _: PGhostCollectionExp | _: PRangeSequence | _: PUnion | _: PIntersection | _: PSetMinus | _: PSubset | _: PMapKeys | _: PMapValues => AddrMod.rValue case _: POptionNone | _: POptionSome | _: POptionGet => AddrMod.rValue + case _: PMatchExp => AddrMod.rValue case _: PMake | _: PNew => AddrMod.make case _: PUnpackSlice => AddrMod.rValue } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index dd67bfa57..96436ab94 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala @@ -100,6 +100,7 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => case (MultisetT(l), MultisetT(r)) => assignableTo.result(l,r) case (OptionT(l), OptionT(r)) => assignableTo.result(l, r) case (IntT(_), PermissionT) => successProp + case (c: AdtClauseT, t: AdtT) if c.context == t.context && c.adtT == t.decl => successProp // conservative choice case _ => errorProp() @@ -181,6 +182,31 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => failedProp("number of arguments does not match structure") } + case a: AdtClauseT => // analogous to struct + if (elems.isEmpty) { + successProp + } else if (elems.exists(_.key.nonEmpty)) { + val tmap: Map[String, Type] = a.clauses + + failedProp("for adt literals either all or none elements must be keyed", + !elems.forall(_.key.nonEmpty)) and + propForall(elems, createProperty[PKeyedElement] { e => + e.key.map { + case PIdentifierKey(id) if tmap.contains(id.name) => + compositeValAssignableTo.result(e.exp, tmap(id.name)) + + case v => failedProp(s"got $v but expected field name") + }.getOrElse(successProp) + }) + } else if (elems.size == a.clauses.size) { + propForall( + elems.map(_.exp).zip(a.clauses.values), + compositeValAssignableTo + ) + } else { + failedProp("number of arguments does not match adt constructor") + } + case ArrayT(len, t) => areAllKeysConstant(elems) and areAllKeysDisjoint(elems) and diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala index 7210ac506..7cb06f7ae 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala @@ -66,6 +66,8 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl => case (VoidType, VoidType) => true + case (l: AdtT, r: AdtT) => l == r + case _ => false } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala index c6aa9d8b6..abeea0c05 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala @@ -6,7 +6,7 @@ package viper.gobra.frontend.info.implementation.property -import viper.gobra.frontend.info.base.Type.{ArrayT, ChannelT, GhostSliceT, IntT, InternalSingleMulti, InternalTupleT, MapT, MultisetT, PermissionT, PointerT, SequenceT, SetT, Single, SliceT, Type} +import viper.gobra.frontend.info.base.Type.{AdtClauseT, AdtT, ArrayT, ChannelT, GhostSliceT, IntT, InternalSingleMulti, InternalTupleT, MapT, MultisetT, PermissionT, PointerT, SequenceT, SetT, Single, SliceT, Type} import viper.gobra.frontend.info.implementation.TypeInfoImpl trait TypeMerging extends BaseProperty { this: TypeInfoImpl => @@ -44,6 +44,8 @@ trait TypeMerging extends BaseProperty { this: TypeInfoImpl => sin <- typeMerge(sin1, sin2) multi <- typeMerge(multi1, multi2) } yield InternalSingleMulti(sin, multi.asInstanceOf[InternalTupleT]) + case (l: AdtClauseT, r: AdtClauseT) + if l.context == r.context && l.adtT == r.adtT => Some(AdtT(l.adtT, l.context)) case _ => None } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala index be7fe3724..a517bf33f 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala @@ -96,6 +96,8 @@ object AdvancedMemberSet { case n: MPredicateSpec => n.decl.id.name case Field(m, _, _) => m.id.name case Embbed(m, _, _) => m.id.name + case t: AdtMember => t.getName + case t: AdtClause => t.getName case ml: BuiltInMethodLike => ml.tag.identifier } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala index 62f4823ac..384718732 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala @@ -83,9 +83,11 @@ trait AmbiguityResolution { this: TypeInfoImpl => case (Left(base), Some((s: st.StructMember, path))) => Some(ap.FieldSelection(base, n.id, path, s)) case (Left(base), Some((s: st.Method, path))) => Some(ap.ReceivedMethod(base, n.id, path, s)) case (Left(base), Some((s: st.MPredicate, path))) => Some(ap.ReceivedPredicate(base, n.id, path, s)) + case (Left(base), Some((s: st.AdtMember, _))) => Some(ap.AdtField(base, n.id, s)) case (Right(base), Some((s: st.Method, path))) => Some(ap.MethodExpr(base, n.id, path, s)) case (Right(base), Some((s: st.MPredicate, path))) => Some(ap.PredicateExpr(base, n.id, path, s)) + case (Right(base), Some((s: st.AdtClause, _))) => Some(ap.QualifiedAdtType(base, s)) // imported members case (Right(_), Some((s: st.ActualTypeEntity, _))) => Some(ap.NamedType(n.id, s)) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index ae608f75d..ce05c169a 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -44,6 +44,81 @@ trait MemberResolution { this: TypeInfoImpl => override def createMPredSpec(spec: PMPredicateSig): MPredicateSpec = defEntity(spec.id).asInstanceOf[MPredicateSpec] + // Struct Fields + + private val fieldSuffix: Type => AdvancedMemberSet[StructMember] = { + + def go(pastDeref: Boolean): Type => AdvancedMemberSet[StructMember] = attr[Type, AdvancedMemberSet[StructMember]] { + + case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface + case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref + + case s: StructT => + val (es, fs) = (s.decl.embedded, s.decl.fields) + AdvancedMemberSet.init[StructMember](fs map s.context.createField) union AdvancedMemberSet.init(es map s.context.createEmbbed) + + case _ => AdvancedMemberSet.empty + } + + go(pastDeref = false) + } + + val structMemberSet: Type => AdvancedMemberSet[StructMember] = + attr[Type, AdvancedMemberSet[StructMember]] { + case Single(t) => fieldSuffix(t) union pastPromotions(fieldSuffix)(t) + case _ => AdvancedMemberSet.empty + } + + // ADT + + /** Destructors and discriminator induced by adt clause */ + private def adtClauseMemberSet(decl: PAdtClause, adtDecl: PAdtType, ctx: ExternalTypeInfo): AdvancedMemberSet[AdtMember] = { + val fields = decl.args.flatMap(_.fields).map(f => AdtDestructor(f, adtDecl, ctx)) + val discriminator = AdtDiscriminator(decl, adtDecl, ctx) + AdvancedMemberSet.init[AdtMember](discriminator +: fields) + } + + /** + * Destructors and discriminators induced by adt clauses of adt types. + * The implementation is the same as [[fieldSuffix]], except the case for ADTs. + **/ + private val adtSuffix: Type => AdvancedMemberSet[AdtMember] = { + + def go(pastDeref: Boolean): Type => AdvancedMemberSet[AdtMember] = attr[Type, AdvancedMemberSet[AdtMember]] { + + case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface + case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref + + case t: AdtT => + val clauseMemberSets = t.decl.clauses.map(adtClauseMemberSet(_, t.decl, t.context)) + AdvancedMemberSet.union(clauseMemberSets) + + case t: AdtClauseT => + val fields = t.decl.args.flatMap(_.fields).map(f => AdtDestructor(f, t.adtT, t.context)) + val discriminator = AdtDiscriminator(t.decl, t.adtT, t.context) + AdvancedMemberSet.init[AdtMember](discriminator +: fields) + + case _ => AdvancedMemberSet.empty + } + + go(pastDeref = false) + } + + val adtMemberSet: Type => AdvancedMemberSet[AdtMember] = + attr[Type, AdvancedMemberSet[AdtMember]] { + case Single(t) => adtSuffix(t) union pastPromotions(adtSuffix)(t) + case _ => AdvancedMemberSet.empty + } + + val adtConstructorSet: Type => AdvancedMemberSet[AdtClause] = + attr[Type, AdvancedMemberSet[AdtClause]] { + case DeclaredT(decl, context) => adtConstructorSet(context.symbType(decl.right)).surface + case t: AdtT => + AdvancedMemberSet.init[AdtClause](t.decl.clauses.map(c => AdtClause(c, t.decl, this))) + } + + // Methods + private lazy val receiverMethodSetMap: Map[Type, AdvancedMemberSet[TypeMember]] = { tree.root.declarations .collect { @@ -71,6 +146,8 @@ trait MemberResolution { this: TypeInfoImpl => receiverMethodSetMap.getOrElse(recv, AdvancedMemberSet.empty) union builtInReceiverMethodSet(recv) + // Predicates + private lazy val receiverPredicateSetMap: Map[Type, AdvancedMemberSet[TypeMember]] = { tree.root.declarations .collect { case m: PMPredicateDecl => createMPredImpl(m) } @@ -95,9 +172,13 @@ trait MemberResolution { this: TypeInfoImpl => receiverPredicateSetMap.getOrElse(recv, AdvancedMemberSet.empty) union builtInReceiverPredicateSet(recv) + // Methods + Predicates + lazy val receiverSet: Type => AdvancedMemberSet[TypeMember] = attr[Type, AdvancedMemberSet[TypeMember]] (t => receiverMethodSet(t) union receiverPredicateSet(t)) + // Interfaces + lazy val interfaceMethodSet: InterfaceT => AdvancedMemberSet[TypeMember] = attr[InterfaceT, AdvancedMemberSet[TypeMember]] { case InterfaceT(PInterfaceType(es, methSpecs, predSpecs), ctxt) => @@ -114,6 +195,7 @@ trait MemberResolution { this: TypeInfoImpl => } } + // Promotion private def pastPromotions[M <: TypeMember](cont: Type => AdvancedMemberSet[M]): Type => AdvancedMemberSet[M] = { @@ -136,33 +218,12 @@ trait MemberResolution { this: TypeInfoImpl => go(pastDeref = false) } - private val fieldSuffix: Type => AdvancedMemberSet[StructMember] = { - - def go(pastDeref: Boolean): Type => AdvancedMemberSet[StructMember] = attr[Type, AdvancedMemberSet[StructMember]] { - - case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface - case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref - - case s: StructT => - val (es, fs) = (s.decl.embedded, s.decl.fields) - AdvancedMemberSet.init[StructMember](fs map s.context.createField) union AdvancedMemberSet.init(es map s.context.createEmbbed) - - case _ => AdvancedMemberSet.empty - } - - go(pastDeref = false) - } - - val structMemberSet: Type => AdvancedMemberSet[StructMember] = - attr[Type, AdvancedMemberSet[StructMember]] { - case Single(t) => fieldSuffix(t) union pastPromotions(fieldSuffix)(t) - case _ => AdvancedMemberSet.empty - } + // Methodsets private val pastPromotionsMethodSuffix: Type => AdvancedMemberSet[TypeMember] = attr[Type, AdvancedMemberSet[TypeMember]] { case t: InterfaceT => interfaceMethodSet(t) - case pt@ PointerT(t) => receiverSet(pt) union receiverSet(t).ref + case pt@PointerT(t) => receiverSet(pt) union receiverSet(t).ref case t => receiverSet(t) union receiverSet(PointerT(t)).deref } @@ -186,18 +247,35 @@ trait MemberResolution { this: TypeInfoImpl => case _ => AdvancedMemberSet.empty } + /** + * Returns the memberset of type `t` within the specific context. + * The purpose of this method is that typecheckers of other packages access it to compute [[memberSet]]. + **/ override def localMemberSet(t: Type): AdvancedMemberSet[TypeMember] = { nonAddressableMethodSet(t) } + /** Returns the memberset of type `t`. */ override def memberSet(t: Type): AdvancedMemberSet[TypeMember] = { val context = getMethodReceiverContext(t) context.localMemberSet(t) } + // Lookups + def tryFieldLookup(t: Type, id: PIdnUse): Option[(StructMember, Vector[MemberPath])] = structMemberSet(t).lookupWithPath(id.name) + def tryAdtMemberLookup(t: Type, id: PIdnUse): Option[(AdtMember, Vector[MemberPath])] = + adtMemberSet(t).lookupWithPath(id.name) + + def tryAdtConstructorLookup(t: Type, id: PIdnUse): Option[(AdtClause, Vector[MemberPath])] = + adtConstructorSet(t).lookupWithPath(id.name) + + /** Resolves `e`.`id`. + * @return _1: Methods accessible if e is addressable. + * _2: Methods accessible if e is not addressable. + **/ def tryMethodLikeLookup(e: PExpression, id: PIdnUse): (Option[(TypeMember, Vector[MemberPath])], Option[(TypeMember, Vector[MemberPath])]) = { // check whether e is well-defined: @@ -213,6 +291,8 @@ trait MemberResolution { this: TypeInfoImpl => context.tryNonAddressableMethodLikeLookup(e, id) } + def tryMethodLikeLookup(e: PType, id: PIdnUse): Option[(Entity, Vector[MemberPath])] = tryMethodLikeLookup(typeSymbType(e), id) + @tailrec private def getMethodReceiverContext(t: Type): ExternalTypeInfo = { Single.unapply(t) match { @@ -222,69 +302,19 @@ trait MemberResolution { this: TypeInfoImpl => } } - def tryMethodLikeLookup(e: PType, id: PIdnUse): Option[(Entity, Vector[MemberPath])] = tryMethodLikeLookup(typeSymbType(e), id) - - def tryPackageLookup(importTarget: AbstractImport, id: PIdnUse, errNode: PNode): Option[(Entity, Vector[MemberPath])] = { - val foreignPkgResult = for { - typeChecker <- getTypeChecker(importTarget, errNode) - entity = typeChecker.externalRegular(id) - } yield entity - foreignPkgResult.fold( - msgs => Some((ErrorMsgEntity(msgs), Vector())), - m => m.flatMap(m => Some((m, Vector()))) - ) - } - - private def parseAndTypeCheck(importTarget: AbstractImport): Either[Vector[VerifierError], ExternalTypeInfo] = { - val pkgSources = PackageResolver.resolveSources(importTarget)(config) - .getOrElse(Vector()) - .map(_.source) - val res = for { - nonEmptyPkgSources <- if (pkgSources.isEmpty) - Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) - else Right(pkgSources) - parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) - // TODO maybe don't check whole file but only members that are actually used/imported - // By parsing only declarations and their specification, there shouldn't be much left to type check anyways - // Info.check would probably need some restructuring to type check only certain members - info <- Info.check(parsedProgram, nonEmptyPkgSources, context)(config) - } yield info - res.fold( - errs => context.addErrenousPackage(importTarget, errs)(config), - info => context.addPackage(importTarget, info)(config) - ) - res - } - - def getTypeChecker(importTarget: AbstractImport, errNode: PNode): Either[Messages, ExternalTypeInfo] = { - def createImportError(errs: Vector[VerifierError]): Messages = { - // create an error message located at the import statement to indicate errors in the imported package - // we distinguish between parse and type errors, cyclic imports, and packages whose source files could not be found - val notFoundErr = errs.collectFirst { case e: NotFoundError => e } - // alternativeErr is a function to compute the message only when needed - val alternativeErr = () => context.getImportCycle(importTarget) match { - case Some(cycle) => message(errNode, s"Package '$importTarget' is part of this import cycle: ${cycle.mkString("[", ", ", "]")}") - case _ => message(errNode, s"Package '$importTarget' contains errors: $errs") - } - notFoundErr.map(e => message(errNode, e.message)) - .getOrElse(alternativeErr()) - } - - // check if package was already parsed, otherwise do parsing and type checking: - val cachedInfo = context.getTypeInfo(importTarget)(config) - cachedInfo.getOrElse(parseAndTypeCheck(importTarget)).left.map(createImportError) - } - + /** resolve `b`.`id` */ def tryDotLookup(b: PExpressionOrType, id: PIdnUse): Option[(Entity, Vector[MemberPath])] = { exprOrType(b) match { - case Left(expr) => + case Left(expr) => // base is an expression val (addr, nonAddr) = tryMethodLikeLookup(expr, id) lazy val isGoEffAddressable = goEffAddressable(expr) lazy val isEffAddressable = effAddressable(expr) if (addr.isEmpty && nonAddr.isEmpty) { // could not find the corresponding member - tryFieldLookup(exprType(expr), id) + val rcvTyp = exprType(expr) + tryFieldLookup(rcvTyp, id) // try to resolve id as struct field + .orElse(tryAdtMemberLookup(rcvTyp, id)) // try to resolve id as adt field or discriminator } else if (isEffAddressable && addr.nonEmpty) { addr } else if (!isEffAddressable && nonAddr.nonEmpty) { @@ -301,12 +331,13 @@ trait MemberResolution { this: TypeInfoImpl => } else { Violation.violation(s"unexpected case reached: $expr") } - case Right(typ) => - val methodLikeAttempt = tryMethodLikeLookup(typ, id) - if (methodLikeAttempt.isDefined) methodLikeAttempt - else typeSymbType(typ) match { + case Right(typ) => // base is a type + typeSymbType(typ) match { case pkg: ImportT => tryPackageLookup(RegularImport(pkg.decl.importPath), id, pkg.decl) - case _ => None + case t => + tryMethodLikeLookup(t, id) + // Constructors are not part of membersets because they are not promoted + .orElse(tryAdtConstructorLookup(t, id)) } } } @@ -344,6 +375,18 @@ trait MemberResolution { this: TypeInfoImpl => tryPackageLookup(BuiltInImport, id, id).map(_._1) def tryUnqualifiedRegularPackageLookup(id: PIdnUse): Entity = { + + def transitiveClosure[T](t: T, onestep: T => Vector[T]): Relation[T, T] = { + // fromOneStep creates a new relation in which all links from t to the root are contained in + val links = Relation.fromOneStep(t, onestep) + // create a new relation that consists of the image of links but only has t as its domain: + val relation = new Relation[T, T] + for (pair <- links.pairs) { + relation.put(t, pair._2) + } + relation + } + val transitiveParent = transitiveClosure(id, tree.parent(_)) val entities = for { // get enclosing PProgram for this PIdnUse node @@ -360,20 +403,57 @@ trait MemberResolution { this: TypeInfoImpl => } } - def transitiveClosure[T](t : T, onestep : T => Vector[T]): Relation[T, T] = { - // fromOneStep creates a new relation in which all links from t to the root are contained in - val links = Relation.fromOneStep(t, onestep) - // create a new relation that consists of the image of links but only has t as its domain: - val relation = new Relation[T, T] - for (pair <- links.pairs) { - relation.put(t, pair._2) - } - relation - } + /** lookup `id` in package `importTarget`. `errNode` is used as offending node. */ + def tryPackageLookup(importTarget: AbstractImport, id: PIdnUse, errNode: PNode): Option[(Entity, Vector[MemberPath])] = { + val foreignPkgResult = for { + typeChecker <- getTypeChecker(importTarget, errNode) + entity = typeChecker.externalRegular(id) + } yield entity + foreignPkgResult.fold( + msgs => Some((ErrorMsgEntity(msgs), Vector())), + m => m.flatMap(m => Some((m, Vector()))) + ) + } - def findField(t: Type, id: PIdnUse): Option[StructMember] = - structMemberSet(t).lookup(id.name) + // TODO: move this method to another file + def getTypeChecker(importTarget: AbstractImport, errNode: PNode): Either[Messages, ExternalTypeInfo] = { + def parseAndTypeCheck(importTarget: AbstractImport): Either[Vector[VerifierError], ExternalTypeInfo] = { + val pkgSources = PackageResolver.resolveSources(importTarget)(config) + .getOrElse(Vector()) + .map(_.source) + val res = for { + nonEmptyPkgSources <- if (pkgSources.isEmpty) + Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) + else Right(pkgSources) + parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) + // TODO maybe don't check whole file but only members that are actually used/imported + // By parsing only declarations and their specification, there shouldn't be much left to type check anyways + // Info.check would probably need some restructuring to type check only certain members + info <- Info.check(parsedProgram, nonEmptyPkgSources, context)(config) + } yield info + res.fold( + errs => context.addErrenousPackage(importTarget, errs)(config), + info => context.addPackage(importTarget, info)(config) + ) + res + } + def createImportError(errs: Vector[VerifierError]): Messages = { + // create an error message located at the import statement to indicate errors in the imported package + // we distinguish between parse and type errors, cyclic imports, and packages whose source files could not be found + val notFoundErr = errs.collectFirst { case e: NotFoundError => e } + // alternativeErr is a function to compute the message only when needed + val alternativeErr = () => context.getImportCycle(importTarget) match { + case Some(cycle) => message(errNode, s"Package '$importTarget' is part of this import cycle: ${cycle.mkString("[", ", ", "]")}") + case _ => message(errNode, s"Package '$importTarget' contains errors: $errs") + } + notFoundErr.map(e => message(errNode, e.message)) + .getOrElse(alternativeErr()) + } + // check if package was already parsed, otherwise do parsing and type checking: + val cachedInfo = context.getTypeInfo(importTarget)(config) + cachedInfo.getOrElse(parseAndTypeCheck(importTarget)).left.map(createImportError) + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index 54f3f8460..613989abc 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -11,7 +11,7 @@ import viper.gobra.frontend.PackageResolver.RegularImport import viper.gobra.frontend.info.base.BuiltInMemberTag import viper.gobra.frontend.info.base.BuiltInMemberTag.{BuiltInFPredicateTag, BuiltInFunctionTag, BuiltInMPredicateTag, BuiltInMethodTag, BuiltInTypeTag} import viper.gobra.frontend.info.base.SymbolTable._ -import viper.gobra.frontend.info.base.Type.{InterfaceT, StructT} +import viper.gobra.frontend.info.base.Type.{AdtClauseT, InterfaceT, StructT} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.property.{AssignMode, StrictAssignMode} import viper.gobra.util.Violation @@ -92,6 +92,12 @@ trait NameResolution { case tree.parent.pair(decl: PDomainFunction, domain: PDomainType) => DomainFunction(decl, domain, this) + case tree.parent.pair(decl: PAdtClause, adtDecl: PAdtType) => AdtClause(decl, adtDecl, this) + + case tree.parent.pair(decl: PMatchBindVar, adt: PMatchAdt) => MatchVariable(decl, adt, this) + case tree.parent.pair(decl: PMatchBindVar, tree.parent.pair(_: PMatchStmtCase, matchE: PMatchStatement)) => + MatchVariable(decl, matchE.exp, this) + case c => Violation.violation(s"This case should be unreachable, but got $c") } case c => Violation.violation(s"Only the root has no parent, but got $c") @@ -183,6 +189,27 @@ trait NameResolution { leave(out(scope)) } + private def addUnorderedDefToEnv(env: Environment)(n: PUnorderedScope): Environment = { + addToEnv(env)(definitionsForScope(n).filter(doesAddEntry)) + } + + private lazy val dependentDefenv: PUnorderedScope => Environment = + attr[PUnorderedScope, Environment] { + n: PUnorderedScope => addToEnv(rootenv())(definitionsForScope(n).filterNot(doesAddEntry)) + } + + private def addToEnv(env: Environment)(identifiers: Vector[PIdnDef]): Environment = { + identifiers.foldLeft(env) { + case (e, id) => + defineIfNew(e, serialize(id), MultipleEntity(), defEntity(id)) + } + } + + private def isUnorderedDef(id: PIdnDef): Boolean = id match { + case tree.parent(tree.parent(c)) => enclosingScope(c).isInstanceOf[PUnorderedScope] + case c => Violation.violation(s"Only the root has no parent, but got $c") + } + /** * Returns true iff the identifier declares an entity that is added to the symbol lookup table */ @@ -192,6 +219,28 @@ trait NameResolution { case _ => true } + /** returns usable definitions visible from within the unordered scope. */ + private lazy val definitionsForScope: PUnorderedScope => Vector[PIdnDef] = + attr[PUnorderedScope, Vector[PIdnDef]] { + case n: PPackage => n.declarations flatMap packageLevelDefinitions + + // imports do not belong to the root environment but are file/program specific (instead of package specific): + case n: PProgram => n.imports flatMap { + case PExplicitQualifiedImport(id: PIdnDef, _, _) => Vector(id) + case _ => Vector.empty + } + + case n: PInterfaceType => + n.methSpecs.map(_.id) ++ n.predSpecs.map(_.id) + + // domain members are added at the package level + case _: PDomainType => Vector.empty + + // They have visible definitions, but currently we do not have constructs that reference them + // from within the unordered scope. Therefore, we do not include them. + case _: PStructType | _: PAdtType | _: PAdtClause => Vector.empty + } + /** * returns the (package-level) identifiers defined by a member */ @@ -218,62 +267,10 @@ trait NameResolution { } } - private lazy val definitionsForScope: PUnorderedScope => Vector[PIdnDef] = - attr[PUnorderedScope, Vector[PIdnDef]] { - case n: PPackage => n.declarations flatMap packageLevelDefinitions - - // imports do not belong to the root environment but are file/program specific (instead of package specific): - case n: PProgram => n.imports flatMap { - case PExplicitQualifiedImport(id: PIdnDef, _, _) => Vector(id) - case _ => Vector.empty - } - - // note that the identifiers returned for PStructType will be filtered out before creating corresponding - // symbol table entries - case n: PStructType => n.clauses.flatMap { c => - def collectStructIds(clause: PActualStructClause): Vector[PIdnDef] = clause match { - case d: PFieldDecls => d.fields map (_.id) - case d: PEmbeddedDecl => Vector(d.id) - } - - c match { - case clause: PActualStructClause => collectStructIds(clause) - case PExplicitGhostStructClause(clause) => collectStructIds(clause) - } - } - - case n: PInterfaceType => - n.methSpecs.map(_.id) ++ n.predSpecs.map(_.id) - - // domain members are added at the package level - case _: PDomainType => Vector.empty - } - - private def addUnorderedDefToEnv(env: Environment)(n: PUnorderedScope): Environment = { - addToEnv(env)(definitionsForScope(n).filter(doesAddEntry)) - } - - private lazy val dependentDefenv: PUnorderedScope => Environment = - attr[PUnorderedScope, Environment] { - n: PUnorderedScope => addToEnv(rootenv())(definitionsForScope(n).filterNot(doesAddEntry)) - } - - private def addToEnv(env: Environment)(identifiers: Vector[PIdnDef]): Environment = { - identifiers.foldLeft(env) { - case (e, id) => - defineIfNew(e, serialize(id), MultipleEntity(), defEntity(id)) - } - } - - private def isUnorderedDef(id: PIdnDef): Boolean = id match { - case tree.parent(tree.parent(c)) => enclosingScope(c).isInstanceOf[PUnorderedScope] - case c => Violation.violation(s"Only the root has no parent, but got $c") - } - /** returns whether or not identified `id` is defined at node `n`. */ def isDefinedAt(id: PIdnNode, n: PNode): Boolean = isDefinedInScope(sequentialDefenv.in(n), serialize(id)) - def tryLookupAt(id: PIdnNode, n: PNode): Option[Entity] = tryLookup(sequentialDefenv.in(n), serialize(id)) + /** @@ -298,29 +295,44 @@ trait NameResolution { attr[PIdnNode, Entity] { case w@PWildcard() => Wildcard(w, this) + // Argument is the id of a dot expression. case tree.parent.pair(id: PIdnUse, n: PDot) => tryDotLookup(n.base, id).map(_._1).getOrElse(UnknownEntity()) + // Argument is an id definition that depends on some receiver type (e.g. method, mpredicate, field). + // These id definitions are not placed in the symbol table since they are not resolved without their receiver. + case tree.parent.pair(id: PIdnDef, _: PDependentDef) => defEntity(id) + + // Argument is the name of a method in a method implementation proof. + // We define that the argument references the method of the super type. case tree.parent.pair(id: PIdnUse, tree.parent.pair(_: PMethodImplementationProof, ip: PImplementationProof)) => - tryMethodLikeLookup(ip.superT, id).map(_._1).getOrElse(UnknownEntity()) // reference method of the super type + tryMethodLikeLookup(ip.superT, id).map(_._1).getOrElse(UnknownEntity()) // lookup method of the super type + // Argument is the name of a predicate in a predicate alias declaration of an implementation proof. + // We define that the argument references the predicate of the super type. case tree.parent.pair(id: PIdnUse, tree.parent.pair(alias: PImplementationProofPredicateAlias, ip: PImplementationProof)) if alias.left == id => - tryMethodLikeLookup(ip.superT, id).map(_._1).getOrElse(UnknownEntity()) // reference predicate of the super type - - case tree.parent.pair(id: PIdnDef, _: PDependentDef) => defEntity(id) // PIdnDef that depend on a receiver or type are not placed in the symbol table + tryMethodLikeLookup(ip.superT, id).map(_._1).getOrElse(UnknownEntity()) // lookup predicate of the super type + // Argument is the key of a literal value. case n@ tree.parent.pair(id: PIdnUse, tree.parent.pair(_: PIdentifierKey, tree.parent(lv: PLiteralValue))) => - val litType = expectedMiscType(lv) - if (underlyingType(litType).isInstanceOf[StructT]) { // if the enclosing literal is a struct then id is a field - findField(litType, id).getOrElse(UnknownEntity()) - } else symbTableLookup(n) // otherwise it is just a variable + underlyingType(expectedMiscType(lv)) match { + // if the enclosing literal is a struct then id is a field + case t: StructT => tryFieldLookup(t, id).map(_._1).getOrElse(UnknownEntity()) + // if the enclosing literal is an adt clause then id is an adt field + case t: AdtClauseT => tryAdtMemberLookup(t, id).map(_._1).getOrElse(UnknownEntity()) + // otherwise it is just a variable + case _ => symbTableLookup(n) + } + // Argument is the key of a closure spec instance. case tree.parent.pair(id: PIdnUse, tree.parent.pair(_: PIdentifierKey, tree.parent(spec: PClosureSpecInstance))) => lookupFunctionMemberOrLit(spec.func).flatMap(func => lookupParamForClosureSpec(id, func)) match { case Some(p: InParameter) => p case _ => UnknownEntity() // only in-parameter names can be used as keys } + // Argument is in an closure implementation proof. + // For now, this case should be the last case before the symbol table lookup. case n: PIdnUse if tryEnclosingClosureImplementationProof(n).nonEmpty => val proof = tryEnclosingClosureImplementationProof(n).get lookupFunctionMemberOrLit(proof.impl.spec.func).flatMap(func => lookupParamForClosureSpec(n, func)) match { @@ -332,43 +344,6 @@ trait NameResolution { case n => symbTableLookup(n) } - private def lookupParamForClosureSpec(id: PIdnUse, func: ActualDataEntity with WithArguments with WithResult): Option[ActualVariable] = { - def namedParam(p: PParameter): Option[PNamedParameter] = p match { - case p: PNamedParameter => Some(p) - case PExplicitGhostParameter(p: PNamedParameter) => Some(p) - case _ => None - } - - // Within a spec implementation proof or closure instance, consider all arguments of the spec non-ghost and all results ghost. - // This is to be as permissive as possible at this point, since all ghostness-related checks are done later on. - val inParam = func.args.flatMap(namedParam) - .find(_.id.name == id.name) - .map(InParameter(_, ghost = false, addressable = false, func.context)) - - inParam.orElse{ - func.result.outs.flatMap(namedParam) - .find(_.id.name == id.name) - .map(OutParameter(_, ghost = true, addressable = false, func.context)) - } - } - - private def lookupFunctionMemberOrLit(name: PNameOrDot): Option[ActualDataEntity with WithArguments with WithResult] = name match { - case PNamedOperand(id) => symbTableLookup(id) match { - case f: Function => Some(f) - case c: Closure => Some(c) - case _ => None - } - case PDot(base: PNamedOperand, id) => symbTableLookup(base.id) match { - case pkg: Import => - tryPackageLookup(RegularImport(pkg.decl.importPath), id, pkg.decl) match { - case Some((f: Function, _)) => Some(f) - case _ => None - } - case _ => None - } - case _ => None - } - private def symbTableLookup(n: PIdnNode): Entity = { type Level = PIdnNode => Option[Entity] @@ -414,6 +389,11 @@ trait NameResolution { levels.iterator.map(_(n)).find(_.isDefined).flatten.getOrElse(UnknownEntity()) } + /** + * Performs a lookup of `i` in the environment at `n`. Returns the associated entity or `None` if no entity has been found + */ + def tryLookupAt(id: PIdnNode, n: PNode): Option[Entity] = tryLookup(sequentialDefenv.in(n), serialize(id)) + /** * Performs a lookup of `i` in environment `inv`. Returns the associated entity or `None` if no entity has been found */ @@ -423,4 +403,41 @@ trait NameResolution { case e => Some(e) } } + + private def lookupParamForClosureSpec(id: PIdnUse, func: ActualDataEntity with WithArguments with WithResult): Option[ActualVariable] = { + def namedParam(p: PParameter): Option[PNamedParameter] = p match { + case p: PNamedParameter => Some(p) + case PExplicitGhostParameter(p: PNamedParameter) => Some(p) + case _ => None + } + + // Within a spec implementation proof or closure instance, consider all arguments of the spec non-ghost and all results ghost. + // This is to be as permissive as possible at this point, since all ghostness-related checks are done later on. + val inParam = func.args.flatMap(namedParam) + .find(_.id.name == id.name) + .map(InParameter(_, ghost = false, addressable = false, func.context)) + + inParam.orElse { + func.result.outs.flatMap(namedParam) + .find(_.id.name == id.name) + .map(OutParameter(_, ghost = true, addressable = false, func.context)) + } + } + + private def lookupFunctionMemberOrLit(name: PNameOrDot): Option[ActualDataEntity with WithArguments with WithResult] = name match { + case PNamedOperand(id) => symbTableLookup(id) match { + case f: Function => Some(f) + case c: Closure => Some(c) + case _ => None + } + case PDot(base: PNamedOperand, id) => symbTableLookup(base.id) match { + case pkg: Import => + tryPackageLookup(RegularImport(pkg.decl.importPath), id, pkg.decl) match { + case Some((f: Function, _)) => Some(f) + case _ => None + } + case _ => None + } + case _ => None + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 97f67d697..c3cdc500a 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -8,7 +8,7 @@ package viper.gobra.frontend.info.implementation.typing import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, check, error, noMessages} import viper.gobra.ast.frontend.{AstPattern => ap, _} -import viper.gobra.frontend.info.base.SymbolTable.{GlobalVariable, SingleConstant} +import viper.gobra.frontend.info.base.SymbolTable.{AdtDestructor, AdtDiscriminator, GlobalVariable, SingleConstant} import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.TypeBounds.{BoundedIntegerKind, UnboundedInteger} @@ -67,6 +67,9 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(_: ap.BuiltInType) => noMessages case Some(_: ap.Predicate) => noMessages case Some(_: ap.DomainFunction) => noMessages + case Some(_: ap.QualifiedAdtType) => noMessages + case Some(_: ap.AdtField) => noMessages + // TODO: fully supporting packages results in further options: global variable // built-in members case Some(p: ap.BuiltInReceivedMethod) => memberType(p.symb) match { @@ -86,7 +89,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case t => error(n, s"expected an AbstractType for built-in mpredicate but got $t") } - case _ => error(n, s"expected field selection, method or predicate with a receiver, method expression, predicate expression, an imported member or a built-in member, but got $n") + case _ => error(n, s"expected field selection, method or predicate with a receiver, method expression, predicate expression, adt constructor or discriminator or destructor, an imported member or a built-in member, but got $n") } } @@ -141,6 +144,15 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(p: ap.Predicate) => FunctionT(p.symb.args map p.symb.context.typ, AssertionT) case Some(p: ap.DomainFunction) => FunctionT(p.symb.args map p.symb.context.typ, p.symb.context.typ(p.symb.result)) + case Some(p: ap.QualifiedAdtType) => + val fields = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)).toMap + AdtClauseT(fields, p.symb.decl, p.symb.adtDecl, this) + case Some(p: ap.AdtField) => + p.symb match { + case AdtDestructor(decl, _, context) => context.symbType(decl.typ) + case AdtDiscriminator(_, _, _) => BooleanT + } + // TODO: fully supporting packages results in further options: global variable // built-in members diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala index ce5a456b9..0f1b234fd 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala @@ -154,6 +154,12 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case NamedType(decl, _, context) => DeclaredT(decl, context) case TypeAlias(decl, _, context) => context.symbType(decl.right) case Import(decl, _) => ImportT(decl) + + // ADT clause is special since it is a type with a name that is not a named type + case a: AdtClause => + val types = a.fields.map(f => f.id.name -> a.context.symbType(f.typ)).toMap + AdtClauseT(types, a.decl, a.adtDecl, this) + case BuiltInType(tag, _, _) => tag.typ case _ => violation(s"expected type, but got $id") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index 3e3f49d84..5e3830aa8 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -152,6 +152,12 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case n: PDot => resolve(n) match { case Some(p: ap.NamedType) => DeclaredT(p.symb.decl, p.symb.context) + + // ADT clause is special since it is a type with a name that is not a named type + case Some(p: ap.QualifiedAdtType) => + val types = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)).toMap + AdtClauseT(types, p.symb.decl, p.symb.adtDecl, p.symb.context) + case _ => violation(s"expected type, but got $n") } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index b14cfa2b0..0054d003b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -8,7 +8,7 @@ package viper.gobra.frontend.info.implementation.typing.ghost import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages} import viper.gobra.ast.frontend._ -import viper.gobra.frontend.info.base.SymbolTable.{BuiltInFPredicate, BuiltInFunction, BuiltInMPredicate, BuiltInMethod, Closure, Constant, DomainFunction, Embbed, Field, Function, Label, Method, Predicate, Variable, WandLhsLabel} +import viper.gobra.frontend.info.base.SymbolTable.{AdtMember, BuiltInFPredicate, BuiltInFunction, BuiltInMPredicate, BuiltInMethod, Closure, Constant, DomainFunction, Embbed, Field, Function, Label, Method, Predicate, Variable, WandLhsLabel} import viper.gobra.frontend.info.base.Type.{ArrayT, AssertionT, BooleanT, GhostCollectionType, GhostUnorderedCollectionType, IntT, MultisetT, OptionT, PermissionT, SequenceT, SetT, Single, SortT, Type} import viper.gobra.ast.frontend.{AstPattern => ap} import viper.gobra.frontend.info.base.Type @@ -122,10 +122,23 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => error(e, s"expected an option type, but got $t", !t.isInstanceOf[OptionT]) } + case m@PMatchExp(exp, clauses) => + val types: Vector[Type] = clauses map { c => exprType(c.exp) } + val sameTypeE = error(exp, s"All clauses has to be of the same type but got $types", !types.foldLeft(true)({ case (acc, next) => acc && assignableTo(next, types.head) })) + val patternE = m.caseClauses.flatMap(c => c.pattern match { + case PMatchAdt(clause, _) => assignableTo.errors(symbType(clause), exprType(exp))(c) + case _ => comparableTypes.errors((miscType(c.pattern), exprType(exp)))(c) + }) + val pureExpE = error(exp, "Expression has to be pure", !isPure(exp)(strong = false)) + val pureClauses = clauses flatMap { c => error(c.exp, "Expressions of cases have to be pure", !isPure(c.exp)(strong = false)) } + val moreThanOneDfltE = error(m, "Match Expression can only have one default case", m.defaultClauses.length > 1) + sameTypeE ++ patternE ++ error(clauses, "Cases cannot be empty", clauses.isEmpty) ++ pureExpE ++ moreThanOneDfltE ++ pureClauses + case expr : PGhostCollectionExp => expr match { case PIn(left, right) => isExpr(left).out ++ isExpr(right).out ++ { underlyingType(exprType(right)) match { case t : GhostCollectionType => ghostComparableTypes.errors(exprType(left), t.elem)(expr) + case _ : AdtT => noMessages case t => error(right, s"expected a ghost collection, but got $t") } } @@ -137,7 +150,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => } } - case PGhostCollectionUpdate(seq, clauses) => isExpr(seq).out ++ (exprType(seq) match { + case PGhostCollectionUpdate(seq, clauses) => isExpr(seq).out ++ (underlyingType(exprType(seq)) match { case SequenceT(t) => clauses.flatMap(wellDefSeqUpdClause(t, _)) case MathMapT(k, v) => clauses.flatMap(wellDefMapUpdClause(k, v, _)) case t => error(seq, s"expected a sequence or mathematical map, but got $t") @@ -241,6 +254,8 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"expected an option type, but got $t") } + case m: PMatchExp => if (m.clauses.isEmpty) exprType(m.defaultClauses.head.exp) else exprType(m.caseClauses.head.exp) + case expr : PGhostCollectionExp => expr match { // The result of integer ghost expressions is unbounded (UntypedConst) case PMultiplicity(_, _) => IntT(config.typeBounds.UntypedConst) @@ -443,6 +458,8 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case POptionSome(e) => go(e) case POptionGet(e) => go(e) + case PMatchExp(e, clauses) => go(e) && clauses.forall(c => go(c.exp)) + case PSliceExp(base, low, high, cap) => go(base) && Seq(low, high, cap).flatten.forall(go) @@ -481,6 +498,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case m: BuiltInMethod => m.isPure case _: Predicate | _: BuiltInFPredicate | _: BuiltInMPredicate => !strong case _: DomainFunction => true + case _: AdtMember => true case _ => false } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala index d801e9c0f..5e2d996ac 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala @@ -7,9 +7,9 @@ package viper.gobra.frontend.info.implementation.typing.ghost import org.bitbucket.inkytonik.kiama.util.Messaging.noMessages -import viper.gobra.ast.frontend.PIdnNode -import viper.gobra.frontend.info.base.SymbolTable.{BoundVariable, BuiltInFPredicate, BuiltInMPredicate, DomainFunction, GhostRegular, Predicate} -import viper.gobra.frontend.info.base.Type.{AssertionT, FunctionT, Type} +import viper.gobra.ast.frontend.{PExpression, PFieldDecl, PIdnNode, PMatchAdt} +import viper.gobra.frontend.info.base.SymbolTable.{AdtClause, AdtDestructor, AdtDiscriminator, BoundVariable, BuiltInFPredicate, BuiltInMPredicate, DomainFunction, GhostRegular, MatchVariable, Predicate} +import viper.gobra.frontend.info.base.Type.{AdtClauseT, AssertionT, FunctionT, Type} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.Violation.violation @@ -25,6 +25,12 @@ trait GhostIdTyping { this: TypeInfoImpl => case f: DomainFunction => unsafeMessage(! { f.result.outs.size == 1 && f.args.forall(wellDefMisc.valid) && wellDefMisc.valid(f.result) }) + case c: AdtClause => unsafeMessage(! { + c.decl.args.forall(decls => decls.fields.forall { case PFieldDecl(_, typ) => wellDefAndType.valid(typ) }) + }) + case c: AdtDestructor => wellDefAndType(c.decl.typ) + case _: AdtDiscriminator => LocalMessages(noMessages) + case _: MatchVariable => LocalMessages(noMessages) case _: BuiltInFPredicate | _: BuiltInMPredicate => LocalMessages(noMessages) } @@ -33,8 +39,28 @@ trait GhostIdTyping { this: TypeInfoImpl => case x: BoundVariable => typeSymbType(x.decl.typ) case predicate: Predicate => FunctionT(predicate.args map predicate.context.typ, AssertionT) case func: DomainFunction => FunctionT(func.args map func.context.typ, func.context.typ(func.result.outs.head)) + + case AdtClause(decl, adtDecl, context) => + AdtClauseT( + decl.args.flatMap(_.fields).map(f => f.id.name -> context.symbType(f.typ)).toMap, + decl, + adtDecl, + context + ) + + case MatchVariable(decl, p, context) => p match { + case PMatchAdt(clause, fields) => + val argTypeWithIndex = context.symbType(clause).asInstanceOf[AdtClauseT].decl.args.flatMap(_.fields).map(_.typ).zipWithIndex + val fieldsWithIndex = fields.zipWithIndex + val fieldIndex = fieldsWithIndex.iterator.find(e => e._1 == decl).get._2 + context.symbType(argTypeWithIndex.iterator.find(e => e._2 == fieldIndex).get._1) + + case e: PExpression => context.typ(e) + case _ => violation("untypeable") + } + case BuiltInFPredicate(tag, _, _) => typ(tag) case BuiltInMPredicate(tag, _, _) => typ(tag) - case _ => violation("untypable") + case _ => violation("untypeable") } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala index 31c81c8b3..405163e20 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala @@ -10,7 +10,7 @@ import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, message, n import viper.gobra.ast.frontend._ import viper.gobra.frontend.info.base.SymbolTable import viper.gobra.frontend.info.base.SymbolTable.{BuiltInMPredicate, GhostTypeMember, MPredicateImpl, MPredicateSpec, MethodSpec} -import viper.gobra.frontend.info.base.Type.{AssertionT, BooleanT, FunctionT, PredT, Type, UnknownType} +import viper.gobra.frontend.info.base.Type.{AdtClauseT, AssertionT, BooleanT, FunctionT, PredT, Type, UnknownType} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.BaseTyping import viper.gobra.ast.frontend.{AstPattern => ap} @@ -49,6 +49,24 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => error(f, s"Uninterpreted functions must have exactly one return argument", f.result.outs.size != 1) ++ nonVariadicArguments(f.args) + case _: PAdtClause => noMessages + + case m: PMatchPattern => m match { + case PMatchAdt(clause, fields) => symbType(clause) match { + case t: AdtClauseT => + val fieldTypes = fields map typ + val clauseFieldTypes = t.decl.args.flatMap(f => f.fields).map(f => symbType(f.typ)) + fieldTypes.zip(clauseFieldTypes).flatMap(a => assignableTo.errors(a)(m)) + case _ => violation("Pattern matching only works on ADT Literals") + } + case PMatchValue(lit) => isPureExpr(lit) + case _ => noMessages + } + + case _: PMatchStmtCase => noMessages + case _: PMatchExpCase => noMessages + case _: PMatchExpDefault => noMessages + case n: PImplementationProofPredicateAlias => n match { case tree.parent(ip: PImplementationProof) => @@ -168,6 +186,18 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case PFPredBase(id) => idType(id) } case _: PDomainAxiom | _: PDomainFunction => UnknownType + + case _: PAdtClause => UnknownType + case exp: PMatchPattern => exp match { + case PMatchBindVar(idn) => idType(idn) + case PMatchAdt(clause, _) => symbType(clause) + case PMatchValue(lit) => typ(lit) + case w: PMatchWildcard => wildcardMatchType(w) + } + case _: PMatchStmtCase => UnknownType + case _: PMatchExpCase => UnknownType + case _: PMatchExpDefault => UnknownType + case _: PMethodImplementationProof => UnknownType case _: PImplementationProofPredicateAlias => UnknownType } @@ -176,6 +206,8 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case MPredicateImpl(decl, ctx) => FunctionT(decl.args map ctx.typ, AssertionT) case MPredicateSpec(decl, _, ctx) => FunctionT(decl.args map ctx.typ, AssertionT) case _: SymbolTable.GhostStructMember => ??? + case SymbolTable.AdtDestructor(decl, _, ctx) => ctx.symbType(decl.typ) + case _: SymbolTable.AdtDiscriminator => BooleanT case BuiltInMPredicate(tag, _, _) => typ(tag) } @@ -249,4 +281,36 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case _ => noMessages } } + + /** Returns the type matched by the wildcard `w`. */ + private def wildcardMatchType(w: PMatchWildcard): Type = { + w match { + case tree.parent(p) => p match { + case PMatchAdt(c, fields) => + val index = fields indexWhere { w eq _ } + val adtClauseT = underlyingType(typeSymbType(c)).asInstanceOf[AdtClauseT] + val field = adtClauseT.decl.args.flatMap(f => f.fields)(index) + typeSymbType(field.typ) + + case p: PMatchExpCase => p match { + case tree.parent(pa) => pa match { + case PMatchExp(e, _) => exprType(e) + case _ => ??? + } + case _ => ??? + } + + case p: PMatchStmtCase => p match { + case tree.parent(pa) => pa match { + case PMatchStatement(e, _, _) => exprType(e) + case _ => ??? + } + case _ => ??? + } + case _ => ??? + } + + case _ => ??? + } + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala index 013dcda8e..cceeb8f22 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala @@ -28,6 +28,10 @@ trait GhostStmtTyping extends BaseTyping { this: TypeInfoImpl => case n@PPackageWand(wand, optBlock) => assignableToSpec(wand) ++ error(n, "ghost error: expected ghostifiable statement", !optBlock.forall(_.isInstanceOf[PGhostifiableStatement])) case PApplyWand(wand) => assignableToSpec(wand) + case PMatchStatement(exp, clauses, _) => clauses.flatMap(c => c.pattern match { + case PMatchAdt(clause, _) => assignableTo.errors(symbType(clause), exprType(exp))(c) + case _ => comparableTypes.errors((miscType(c.pattern), exprType(exp)))(c) + }) ++ isPureExpr(exp) case p: PClosureImplProof => wellDefClosureImplProof(p) } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala index cef39df87..1c09b2279 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala @@ -23,6 +23,7 @@ trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl => case n: PGhostSliceType => isType(n.elem).out case _: PDomainType => noMessages + case _: PAdtType => noMessages } private[typing] def ghostTypeSymbType(typ : PGhostType) : Type = typ match { @@ -33,5 +34,6 @@ trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl => case POptionType(elem) => OptionT(typeSymbType(elem)) case PGhostSliceType(elem) => GhostSliceT(typeSymbType(elem)) case t: PDomainType => DomainT(t, this) + case a: PAdtType => AdtT(a, this) } } diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala index 87bc18724..858c2f2ae 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierError.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala @@ -279,6 +279,11 @@ case class ChannelMakePreconditionError(info: Source.Verifier.Info) extends Veri override def localMessage: String = s"The provided length to ${info.origin.tag.trim} might be negative" } +case class MatchError(info: Source.Verifier.Info) extends VerificationError { + override def localId: String = "match_error" + override def localMessage: String = s"The patterns might not match the expression" +} + case class RangeVariableMightNotExistError(info: Source.Verifier.Info)(rangeExpr: String) extends VerificationError { override def localId: String = "range_variable_might_not_exist" override def localMessage: String = s"Length of range expression '$rangeExpr' might be 0" diff --git a/src/main/scala/viper/gobra/translator/Names.scala b/src/main/scala/viper/gobra/translator/Names.scala index b253ebb3d..7d5b83cfc 100644 --- a/src/main/scala/viper/gobra/translator/Names.scala +++ b/src/main/scala/viper/gobra/translator/Names.scala @@ -166,6 +166,12 @@ object Names { // domain def dfltDomainValue(domainName: String): String = s"dflt$domainName" + // adt + def dfltAdtValue(adtName: String): String = s"adtDflt_$adtName" + def tagAdtFunction(adtName: String): String = s"adtTag_$adtName" + def destructorAdtName(adtName: String, argumentName: String) = s"get_${adtName}_$argumentName" + def constructorAdtName(adtName: String, clause: String) = s"${adtName}_$clause" + // unknown values def unknownValuesDomain: String = "UnknownValueDomain" def unknownValueFunc: String = "unknownValue" diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala new file mode 100644 index 000000000..1c94c628c --- /dev/null +++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala @@ -0,0 +1,469 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2022 ETH Zurich. + +package viper.gobra.translator.encodings.adts + +import org.bitbucket.inkytonik.kiama.==> +import viper.gobra.ast.{internal => in} +import viper.gobra.reporting.BackTranslator.{ErrorTransformer, RichErrorMessage} +import viper.gobra.reporting.{MatchError, Source} +import viper.gobra.theory.Addressability.{Exclusive, Shared} +import viper.gobra.translator.Names +import viper.gobra.translator.context.Context +import viper.gobra.translator.encodings.combinators.LeafTypeEncoding +import viper.gobra.translator.util.ViperWriter.{CodeWriter, MemberWriter} +import viper.silver.{ast => vpr} + +class AdtEncoding extends LeafTypeEncoding { + + import viper.gobra.translator.util.TypePatterns._ + import viper.gobra.translator.util.ViperWriter.CodeLevel._ + import viper.gobra.translator.util.ViperWriter.{MemberLevel => ml} + import viper.silver.verifier.{errors => err} + + override def typ(ctx: Context): in.Type ==> vpr.Type = { + case ctx.Adt(adt) / m => + m match { + case Exclusive => adtType(adt.name) + case Shared => vpr.Ref + } + case ctx.AdtClause(t) / m => + m match { + case Exclusive => adtType(t.adtT.name) + case Shared => vpr.Ref + } + } + + private def adtType(adtName: String): vpr.DomainType = vpr.DomainType(adtName, Map.empty)(Seq.empty) + + override def member(ctx: Context): in.Member ==> MemberWriter[Vector[vpr.Member]] = { + case adt: in.AdtDefinition => + val adtName = adt.name + val (aPos, aInfo, aErrT) = adt.vprMeta + + def localVarTDecl = vpr.LocalVarDecl("t", adtType(adtName))(_, _, _) + + def localVarT = vpr.LocalVar("t", adtType(adtName))(_, _, _) + + def tagF = getTag(adt.clauses)(_) + + def destructorsClause(clause: in.AdtClause): Vector[vpr.DomainFunc] = + clause.args.map(a => { + val (argPos, argInfo, argErrT) = a.vprMeta + vpr.DomainFunc( + Names.destructorAdtName(adtName, a.name), + Seq(localVarTDecl(argPos, argInfo, argErrT)), + ctx.typ(a.typ) + )(argPos, argInfo, adtName, argErrT) + }) + + + def clauseArgsAsLocalVarExp(c: in.AdtClause): Vector[vpr.LocalVar] = { + val (cPos, cInfo, cErrT) = c.vprMeta + c.args map { a => + val typ = ctx.typ(a.typ) + val name = a.name + vpr.LocalVar(name, typ)(cPos, cInfo, cErrT) + } + } + + def tagApp(arg: vpr.Exp) = { + vpr.DomainFuncApp( + Names.tagAdtFunction(adtName), + Seq(arg), + Map.empty + )(_, _, vpr.Int, adtName, _) + } + + def deconstructorCall(field: String, arg: vpr.Exp, retTyp: vpr.Type) = { + vpr.DomainFuncApp( + Names.destructorAdtName(adtName, field), + Seq(arg), + Map.empty + )(_, _, retTyp, adtName, _) + } + + val clauses = adt.clauses map { c => + val (cPos, cInfo, cErrT) = c.vprMeta + val args = clauseArgsAsLocalVarDecl(c)(ctx) + vpr.DomainFunc(Names.constructorAdtName(adtName, c.name.name), args, adtType(adtName))(cPos, cInfo, adtName, cErrT) + } + + val defaultFunc = vpr.DomainFunc( + Names.dfltAdtValue(adtName), + Seq.empty, + adtType(adtName) + )(aPos, aInfo, adtName, aErrT) + + val tagFunc = vpr.DomainFunc( + Names.tagAdtFunction(adtName), + Seq(localVarTDecl(aPos, aInfo, aErrT)), + vpr.Int + )(aPos, aInfo, adtName, aErrT) + + val destructors: Vector[vpr.DomainFunc] = adt.clauses.flatMap(destructorsClause) + + val tagAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.map(c => { + val (cPos, cInfo, cErrT) = c.vprMeta + val args: Seq[vpr.Exp] = clauseArgsAsLocalVarExp(c) + val triggerVars: Seq[vpr.LocalVarDecl] = clauseArgsAsLocalVarDecl(c)(ctx) + val construct = constructorCall(c, args)(cPos, cInfo, cErrT) + val trigger = vpr.Trigger(Seq(construct))(cPos, cInfo, cErrT) + val lhs: vpr.Exp = tagApp(construct)(cPos, cInfo, cErrT) + val clauseTag = vpr.IntLit(tagF(c))(cPos, cInfo, cErrT) + + val destructors = c.args.map(a => + deconstructorCall(a.name, construct, ctx.typ(a.typ))(cPos, cInfo, cErrT) + ) + + if (c.args.nonEmpty) { + val destructOverConstruct: vpr.Exp = (destructors.zip(args).map { + case (d, a) => vpr.EqCmp( + d, a + )(cPos, cInfo, cErrT): vpr.Exp + }: Seq[vpr.Exp]).reduceLeft { + (l: vpr.Exp, r: vpr.Exp) => vpr.And(l, r)(cPos, cInfo, cErrT): vpr.Exp + } + + vpr.AnonymousDomainAxiom(vpr.Forall(triggerVars, Seq(trigger), vpr.And( + vpr.EqCmp(lhs, clauseTag)(cPos, cInfo, cErrT), + destructOverConstruct + )(cPos, cInfo, cErrT) + )(cPos, cInfo, cErrT))(cPos, cInfo, adtName, cErrT) + } else { + vpr.AnonymousDomainAxiom(vpr.EqCmp(lhs, clauseTag)(cPos, cInfo, cErrT))(cPos, cInfo, adtName, cErrT) + } + }) + + val destructorAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.filter(c => c.args.nonEmpty).map(c => { + val (cPos, cInfo, cErrT) = c.vprMeta + val variable = localVarTDecl(cPos, cInfo, cErrT) + val localVar = localVarT(cPos, cInfo, cErrT) + + val destructors = c.args.map(a => + deconstructorCall(a.name, localVar, ctx.typ(a.typ))(cPos, cInfo, cErrT) + ) + + val trigger = destructors.map(d => vpr.Trigger(Seq(d))(cPos, cInfo, cErrT)) + val clauseTag = vpr.IntLit(tagF(c))(cPos, cInfo, cErrT) + val triggerTagApp = tagApp(localVar)(cPos, cInfo, cErrT) + val implicationLhs = vpr.EqCmp(triggerTagApp, clauseTag)(aPos, aInfo, aErrT) + val implicationRhs = vpr.EqCmp( + localVar, + constructorCall(c, destructors)(cPos, cInfo, cErrT) + )(cPos, cInfo, cErrT) + + val implication = vpr.Implies(implicationLhs, implicationRhs)(cPos, cInfo, cErrT) + + vpr.AnonymousDomainAxiom(vpr.Forall(Seq(variable), trigger, implication)(cPos, cInfo, cErrT))(cPos, + cInfo, adtName, cErrT) + }) + + val exclusiveAxiom = { + val variableDecl = localVarTDecl(aPos, aInfo, aErrT) + val variable = localVarT(aPos, aInfo, aErrT) + val triggerExpression = tagApp(variable)(aPos, aInfo, aErrT) + val trigger = vpr.Trigger(Seq(triggerExpression))(aPos, aInfo, aErrT) + + def destructors(clause: in.AdtClause) = clause.args map (a => { + val (argPos, argInfo, argErrT) = a.vprMeta + deconstructorCall(a.name, variable, ctx.typ(a.typ))(argPos, argInfo, argErrT) + }) + + val equalities = adt.clauses.map(c => { + val (cPos, cInfo, cErrT) = c.vprMeta + constructorCall(c, destructors(c))(cPos, cInfo, cErrT) + }) + .map(c => { + vpr.EqCmp(variable, c)(c.pos, c.info, c.errT) + }) + .foldLeft(vpr.FalseLit()(aPos, aInfo, aErrT): vpr.Exp)({ (acc, next) => vpr.Or(acc, next)(aPos, aInfo, aErrT): vpr.Exp }) + + vpr.AnonymousDomainAxiom( + vpr.Forall(Seq(variableDecl), Seq(trigger), equalities)(aPos, aInfo, aErrT) + )(aPos, aInfo, adtName, aErrT) + } + + val axioms = (tagAxioms ++ destructorAxioms) :+ exclusiveAxiom + val funcs = (clauses ++ destructors) :+ defaultFunc :+ tagFunc + + ml.unit(Vector(vpr.Domain(adtName, functions = funcs, axioms = axioms)(pos = aPos, info = aInfo, errT = aErrT))) + } + + override def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = { + + def defaultVal(e: in.DfltVal, a: in.AdtT) = { + val (pos, info, errT) = e.vprMeta + unit( + vpr.DomainFuncApp( + funcname = Names.dfltAdtValue(a.name), + Seq.empty, + Map.empty + )(pos, info, adtType(a.name), a.name, errT): vpr.Exp + ) + } + + default(super.expression(ctx)) { + case (e: in.DfltVal) :: ctx.Adt(a) / Exclusive => defaultVal(e, a) + case (e: in.DfltVal) :: ctx.AdtClause(a) / Exclusive => defaultVal(e, a.adtT) + case ac: in.AdtConstructorLit => adtConstructor(ac, ctx) + case ad: in.AdtDiscriminator => adtDiscriminator(ad, ctx) + case ad: in.AdtDestructor => adtDestructor(ad, ctx) + case p: in.PatternMatchExp => translatePatternMatchExp(ctx)(p) + // case c@in.Contains(_, _ :: ctx.Adt(_)) => translateContains(c)(ctx) + } + } + + override def statement(ctx: Context): in.Stmt ==> CodeWriter[vpr.Stmt] = { + default(super.statement(ctx)) { + case p: in.PatternMatchStmt => translatePatternMatch(ctx)(p) + } + } + + private def adtConstructor(ac: in.AdtConstructorLit, ctx: Context): Writer[vpr.Exp] = { + def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) + + val (pos, info, errT) = ac.vprMeta + for { + args <- sequence(ac.args map goE) + } yield vpr.DomainFuncApp( + funcname = Names.constructorAdtName(ac.clause.adtName, ac.clause.name), + args, + Map.empty + )(pos, info, adtType(ac.clause.adtName), ac.clause.adtName, errT) + } + + private def adtDiscriminator(ac: in.AdtDiscriminator, ctx: Context): Writer[vpr.Exp] = { + def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) + + val adtType = underlyingType(ac.base.typ)(ctx).asInstanceOf[in.AdtT] + val (pos, info, errT) = ac.vprMeta + for { + value <- goE(ac.base) + } yield vpr.EqCmp(vpr.DomainFuncApp( + Names.tagAdtFunction(adtType.name), + Seq(value), Map.empty)(pos, info, vpr.Int, adtType.name, errT), + vpr.IntLit(adtType.clauseToTag(ac.clause.name))(pos, info, errT) + )(pos, info, errT) + } + + private def adtDestructor(ac: in.AdtDestructor, ctx: Context): Writer[vpr.Exp] = { + def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) + + val adtType = underlyingType(ac.base.typ)(ctx).asInstanceOf[in.AdtT] + val (pos, info, errT) = ac.vprMeta + for { + value <- goE(ac.base) + } yield vpr.DomainFuncApp( + Names.destructorAdtName(adtType.name, ac.field.name), + Seq(value), Map.empty)(pos, info, ctx.typ(ac.field.typ), adtType.name, errT) + } + + + private def getTag(clauses: Vector[in.AdtClause])(clause: in.AdtClause): BigInt = { + val sorted = clauses.sortBy(_.name.name) + BigInt(sorted.indexOf(clause)) + } + + private def constructorCall(clause: in.AdtClause, args: Seq[vpr.Exp])(pos: vpr.Position = vpr.NoPosition, info: vpr.Info = vpr.NoInfo, errT: vpr.ErrorTrafo = vpr.NoTrafos): vpr.DomainFuncApp = { + val adtName = clause.name.adtName + vpr.DomainFuncApp( + Names.constructorAdtName(adtName, clause.name.name), + args, + Map.empty + )(pos, info, adtType(adtName), adtName, errT) + } + + private def clauseArgsAsLocalVarDecl(c: in.AdtClause)(ctx: Context): Vector[vpr.LocalVarDecl] = { + val (cPos, cInfo, cErrT) = c.vprMeta + c.args map { a => + val typ = ctx.typ(a.typ) + val name = a.name + vpr.LocalVarDecl(name, typ)(cPos, cInfo, cErrT) + } + } + + def declareIn(ctx: Context)(e: in.Expr, p: in.MatchPattern, z: vpr.Exp): CodeWriter[vpr.Exp] = { + val (pos, info, errT) = p.vprMeta + + p match { + case in.MatchValue(_) | in.MatchWildcard() => unit(z) + case in.MatchBindVar(name, typ) => + for { + eV <- ctx.expression(e) + } yield vpr.Let( + vpr.LocalVarDecl(name, ctx.typ(typ))(pos, info, errT), + eV, + z + )(pos, info, errT) + case in.MatchAdt(clause, expr) => + val inDeconstructors = clause.fields.map(f => in.AdtDestructor(e, f)(e.info)) + val zipWithPattern = inDeconstructors.zip(expr) + zipWithPattern.foldRight(unit(z))((des, acc) => for { + v <- acc + d <- declareIn(ctx)(des._1, des._2, v) + } yield d) + } + } + + def translatePatternMatchExp(ctx: Context)(e: in.PatternMatchExp): CodeWriter[vpr.Exp] = { + + def translateCases(cases: Vector[in.PatternMatchCaseExp], dflt: in.Expr): CodeWriter[vpr.Exp] = { + + val (ePos, eInfo, eErrT) = if (cases.isEmpty) dflt.vprMeta else cases.head.vprMeta + + if (cases.isEmpty) { + ctx.expression(dflt) + } else { + val c = cases.head + for { + check <- translateMatchPatternCheck(ctx)(e.exp, c.mExp) + body <- ctx.expression(c.exp) + decl <- declareIn(ctx)(e.exp, c.mExp, body) + el <- translateCases(cases.tail, dflt) + } yield vpr.CondExp(check, decl, el)(ePos, eInfo, eErrT) + } + } + + if (e.default.isDefined) { + translateCases(e.cases, e.default.get) + } else { + + val (pos, info, errT) = e.vprMeta + + val allChecks = e.cases + .map(c => translateMatchPatternCheck(ctx)(e.exp, c.mExp)) + .foldLeft(unit(vpr.FalseLit()() : vpr.Exp))((acc, next) => + for { + a <- acc + n <- next + } yield vpr.Or(a,n)(pos, info, errT)) + + + for { + dummy <- ctx.expression(in.DfltVal(e.typ)(e.info)) + cond <- translateCases(e.cases, in.DfltVal(e.typ)(e.info)) + checks <- allChecks + (checkFunc, errCheck) = ctx.condition.assert(checks, (info, _) => MatchError(info)) + _ <- errorT(errCheck) + } yield vpr.CondExp(checkFunc, cond, dummy)(pos, info, errT) + } + + + } + + def translateMatchPatternCheck(ctx: Context)(expr: in.Expr, pattern: in.MatchPattern): CodeWriter[vpr.Exp] = { + def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) + val (pos, info, errT) = pattern.vprMeta + + def matchSimpleExp(exp: in.Expr): Writer[vpr.Exp] = for { + e1 <- goE(exp) + e2 <- goE(expr) + } yield vpr.EqCmp(e1, e2)(pos, info, errT) + + val (mPos, mInfo, mErr) = pattern.vprMeta + + pattern match { + case in.MatchValue(exp) => matchSimpleExp(exp) + case in.MatchBindVar(_, _) | in.MatchWildcard() => unit(vpr.TrueLit()(pos,info,errT)) + case in.MatchAdt(clause, exp) => + val tagFunction = Names.tagAdtFunction(clause.adtT.name) + val tag = vpr.IntLit(clause.adtT.clauseToTag(clause.name))(mPos, mInfo, mErr) + val inDeconstructors = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info)) + for { + e1 <- goE(expr) + tF = vpr.DomainFuncApp(tagFunction, Vector(e1), Map.empty)(mPos, mInfo, vpr.Int, clause.adtT.name, mErr) + checkTag = vpr.EqCmp(tF, tag)(mPos) + rec <- sequence(inDeconstructors.zip(exp) map {case (e, p) => translateMatchPatternCheck(ctx)(e,p)}) + } yield rec.foldLeft(checkTag:vpr.Exp)({case (acc, next) => vpr.And(acc, next)(mPos, mInfo, mErr)}) + } + } + + def translateMatchPatternDeclarations(ctx: Context)(expr: in.Expr, pattern: in.MatchPattern): Option[CodeWriter[vpr.Seqn]] = { + val (mPos, mInfo, mErrT) = pattern.vprMeta + def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) + pattern match { + case in.MatchBindVar(name, typ) => + val t = ctx.typ(typ) + + val writer = for { + e <- goE(expr) + v = vpr.LocalVarDecl(name, t)(mPos, mInfo, mErrT) + a = vpr.LocalVarAssign(vpr.LocalVar(name, t)(mPos, mInfo, mErrT), e)(mPos, mInfo, mErrT) + } yield vpr.Seqn(Seq(a), Seq(v))(mPos, mInfo, mErrT) + + Some(writer) + + case in.MatchAdt(clause, exprs) => + val inDeconstructors = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info)) + val recAss: Vector[CodeWriter[vpr.Seqn]] = + inDeconstructors.zip(exprs) map {case (e, p) => translateMatchPatternDeclarations(ctx)(e,p)} collect {case Some(s) => s} + val assignments: Vector[vpr.Seqn] = recAss map {a => a.res} + val reduced = assignments.foldLeft(vpr.Seqn(Seq(), Seq())(mPos, mInfo, mErrT))( + {case (l, r) => vpr.Seqn(l.ss ++ r .ss, l.scopedDecls ++ r.scopedDecls)(mPos, mInfo, mErrT)} + ) + Some(unit(reduced)) + + case _ : in.MatchValue | _: in.MatchWildcard => None + } + } + + def translatePatternMatch(ctx: Context)(s: in.PatternMatchStmt): CodeWriter[vpr.Stmt] = { + val expr = s.exp + val cases = s.cases + + val (sPos, sInfo, sErrT) = s.vprMeta + + val checkExVarDecl = vpr.LocalVarDecl(ctx.freshNames.next(), vpr.Bool)(sPos, sInfo, sErrT) + val checkExVar = checkExVarDecl.localVar + val initialExVar = unit(vpr.LocalVarAssign(checkExVar, vpr.FalseLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT)) + def exErr(ass: vpr.Stmt): ErrorTransformer = { + case e@err.AssertFailed(Source(info), _, _) if e causedBy ass => MatchError(info) + } + + val assertWithError = for { + a <- unit(vpr.Assert(vpr.EqCmp(checkExVar, vpr.TrueLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT))(sPos, sInfo, sErrT)) + _ <- errorT(exErr(a)) + } yield a + + def setExVar(p: vpr.Position, i: vpr.Info, e: vpr.ErrorTrafo) = + unit(vpr.LocalVarAssign(checkExVar, vpr.TrueLit()(p,i,e))(p,i,e)) + + def translateCase(c: in.PatternMatchCaseStmt): CodeWriter[vpr.Stmt] = { + val (cPos, cInfo, cErrT) = c.vprMeta + + val assignments = translateMatchPatternDeclarations(ctx)(expr, c.mExp) + + val (ass: Seq[vpr.Stmt], decls: Seq[vpr.Declaration]) = + if (assignments.isDefined) { + val w = assignments.get.res + (w.ss, w.scopedDecls) + } else { + (Seq(), Seq()) + } + for { + check <- translateMatchPatternCheck(ctx)(expr, c.mExp) + exVar <- setExVar(cPos, cInfo, cErrT) + body <- seqn(ctx.statement(c.body)) + } yield vpr.If(vpr.And(check, vpr.Not(checkExVar)(cPos, cInfo, cErrT))(cPos, cInfo, cErrT), + vpr.Seqn(exVar +: (ass :+ body), decls)(cPos, cInfo, cErrT), vpr.Seqn(Seq(), Seq())(cPos, cInfo, cErrT))(cPos, cInfo, cErrT) + } + + if (s.strict) { + for { + init <- initialExVar + cs <- sequence(cases map translateCase) + a <- assertWithError + } yield vpr.Seqn(init +: cs :+ a, Seq(checkExVarDecl))(sPos, sInfo, sErrT) + } else { + for { + init <- initialExVar + cs <- sequence(cases map translateCase) + } yield vpr.Seqn(init +: cs, Seq(checkExVarDecl))(sPos, sInfo, sErrT) + } + } + +} diff --git a/src/main/scala/viper/gobra/translator/encodings/interfaces/TypeComponentImpl.scala b/src/main/scala/viper/gobra/translator/encodings/interfaces/TypeComponentImpl.scala index 62c72be96..10fd1d691 100644 --- a/src/main/scala/viper/gobra/translator/encodings/interfaces/TypeComponentImpl.scala +++ b/src/main/scala/viper/gobra/translator/encodings/interfaces/TypeComponentImpl.scala @@ -53,6 +53,8 @@ class TypeComponentImpl extends TypeComponent { case t: TypeHead.DefinedHD => t.name case t: TypeHead.InterfaceHD => t.name case t: TypeHead.DomainHD => t.name + case t: TypeHead.AdtHD => t.name + case t: TypeHead.AdtClauseHD => t.name case t: TypeHead.IntHD => // For identical types a representative is picked diff --git a/src/main/scala/viper/gobra/translator/util/TypePatterns.scala b/src/main/scala/viper/gobra/translator/util/TypePatterns.scala index 9d1092c88..dec73f083 100644 --- a/src/main/scala/viper/gobra/translator/util/TypePatterns.scala +++ b/src/main/scala/viper/gobra/translator/util/TypePatterns.scala @@ -161,6 +161,20 @@ object TypePatterns { } } + object Adt { + def unapply(arg: in.Type): Option[in.AdtT] = underlyingType(arg)(ctx) match { + case t: in.AdtT => Some(t) + case _ => None + } + } + + object AdtClause { + def unapply(arg: in.Type): Option[in.AdtClauseT] = underlyingType(arg)(ctx) match { + case t: in.AdtClauseT => Some(t) + case _ => None + } + } + object Pointer { def unapply(arg: in.Type): Option[in.Type] = underlyingType(arg)(ctx) match { case t : in.PointerT => Some(t.t) From 4f32be90298949f640a96d5b629a86946d69291a Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Fri, 11 Nov 2022 00:29:33 +0100 Subject: [PATCH 042/296] safety commit --- .../viper/gobra/ast/internal/Program.scala | 1 + .../scala/viper/gobra/frontend/Desugar.scala | 209 +++++++++++++++++- .../context/DfltTranslatorConfig.scala | 3 +- 3 files changed, 210 insertions(+), 3 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index 970a1e250..c9f58c9c2 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -1576,6 +1576,7 @@ case class AdtT(name: String, addressability: Addressability, clauseToTag: Map[S AdtT(name, newAddressability, clauseToTag) } +// TODO: maybe remove this type as it is not necessary anymore case class AdtClauseT(name: String, adtT: AdtT, fields: Vector[Field], addressability: Addressability) extends Type { /** Returns whether 'this' is equals to 't' without considering the addressability modifier of the types. */ override def equalsWithoutMod(t: Type): Boolean = t match { diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 20f342eb2..0aea2888c 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -214,6 +214,11 @@ object Desugar { } } + def adtClauseProxy(adtName: String, clause: PAdtClause, context: TypeInfo): in.AdtClauseProxy = { + val name = idName(clause.id, context) + in.AdtClauseProxy(name, adtName)(meta(clause, context)) + } + def methodProxy(id: PIdnUse, context: TypeInfo): in.MethodProxy = { val name = idName(id, context) in.MethodProxy(id.name, name)(meta(id, context)) @@ -1981,6 +1986,29 @@ object Desugar { } yield in.FieldRef(base, f)(src) } + def adtSelectionD(ctx: FunctionContext, info: TypeInfo)(p: ap.AdtField)(src: Meta): Writer[in.Expr] = { + for { + base <- exprD(ctx, info)(p.base) + } yield p.symb match { + case st.AdtDestructor(decl, adtDecl, context) => + val adtT: AdtT = context.symbType(adtDecl).asInstanceOf[AdtT] + in.AdtDestructor(base, in.Field( + nm.adtField(decl.id.name, adtT), + typeD(context.symbType(decl.typ), Addressability.mathDataStructureElement)(src), + ghost = true + )(src))(src) + + case st.AdtDiscriminator(decl, adtDecl, context) => + val adtT: AdtT = context.symbType(adtDecl).asInstanceOf[AdtT] + in.AdtDiscriminator( + base, + adtClauseProxy(nm.adt(adtT), decl, context.getTypeInfo) + )(src) + + case _ => violation("Expected AdtDiscriminator or AdtDestructor") + } + } + def functionLikeCallD(ctx: FunctionContext, info: TypeInfo)(p: ap.FunctionLikeCall, expr: PInvoke)(src: Meta): Writer[in.Expr] = { functionLikeCallDAux(ctx, info)(p, expr)(src) flatMap { case Right(exp) => unit(exp) @@ -2458,6 +2486,7 @@ object Desugar { case n: PDot => info.resolve(n) match { case Some(p: ap.FieldSelection) => fieldSelectionD(ctx, info)(p)(src) + case Some(p: ap.AdtField) => adtSelectionD(ctx, info)(p)(src) case Some(p: ap.Constant) => unit[in.Expr](globalConstD(p.symb)(src)) case Some(p: ap.GlobalVariable) => unit[in.Expr](globalVarD(p.symb)(src)) case Some(_: ap.NamedType) => @@ -2922,6 +2951,7 @@ object Desugar { case class Map(t : in.MapT) extends CompositeKind case class MathematicalMap(t : in.MathMapT) extends CompositeKind case class Struct(t: in.Type, st: in.StructT) extends CompositeKind + case class Adt(t: in.AdtClauseT) extends CompositeKind } def compositeTypeD(t : in.Type) : CompositeKind = underlyingType(t) match { @@ -2933,6 +2963,7 @@ object Desugar { case t: in.MultisetT => CompositeKind.Multiset(t) case t: in.MapT => CompositeKind.Map(t) case t: in.MathMapT => CompositeKind.MathematicalMap(t) + case t: in.AdtClauseT => CompositeKind.Adt(t) case _ => Violation.violation(s"expected composite type but got $t") } @@ -2972,7 +3003,7 @@ object Desugar { compositeTypeD(t) match { - case CompositeKind.Struct(it, ist) => { + case CompositeKind.Struct(it, ist) => val fields = ist.fields if (lit.elems.exists(_.key.isEmpty)) { @@ -3014,7 +3045,45 @@ object Desugar { args <- sequence(wArgs) } yield in.StructLit(it, args)(src) } - } + + case CompositeKind.Adt(t) => + val fields = t.fields + val proxy = in.AdtClauseProxy(t.name, t.adtT.name)(src) + + if (lit.elems.exists(_.key.isEmpty)) { + //All elements are unkeyed + + val wArgs = fields.zip(lit.elems).map { case (f, PKeyedElement(_, exp)) => exp match { + case PExpCompositeVal(ev) => exprD(ctx, info)(ev) + case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f.typ) + }} + + for { + args <- sequence(wArgs) + } yield in.AdtConstructorLit(t.adtT, proxy, args)(src) + } else { + val fMap = fields.map({ f => nm.inverse(f.name) -> f }).toMap + + val vMap = lit.elems.map { + case PKeyedElement(Some(PIdentifierKey(key)), exp) => + val f = fMap(key.name) + exp match { + case PExpCompositeVal(ev) => f -> exprD(ctx, info)(ev) + case PLitCompositeVal(lv) => f -> literalValD(ctx, info)(lv, f.typ) + } + + case _ => Violation.violation("expected identifier as a key") + }.toMap + + val wArgs = fields.map { + case f if vMap.isDefinedAt(f) => vMap(f) + case f => unit(in.DfltVal(f.typ)(src)) + } + + for { + args <- sequence(wArgs) + } yield in.AdtConstructorLit(t.adtT, proxy, args)(src) + } case CompositeKind.Array(in.ArrayT(len, typ, addressability)) => Violation.violation(addressability == Addressability.literal, "Literals have to be exclusive") @@ -3568,6 +3637,47 @@ object Desugar { unit(fLit) } + var registeredAdts: Set[String] = Set.empty + + def fieldDeclAdtD(decl: PFieldDecl, context: ExternalTypeInfo, adt: AdtT)(src: Meta): in.Field = { + val fieldName = nm.adtField(decl.id.name, adt) + val typ = typeD(context.symbType(decl.typ), Addressability.mathDataStructureElement)(src) + in.Field(fieldName, typ, true)(src) + } + + def registerAdt(t: Type.AdtT, aT: in.AdtT): Unit = { + if (!registeredAdts.contains(aT.name) && info == t.context.getTypeInfo) { + registeredAdts += aT.name + + AdditionalMembers.addFinalizingComputation { () => + val xInfo = t.context.getTypeInfo + + val clauses = t.decl.clauses.map { c => + val src = meta(c, xInfo) + val proxy = adtClauseProxy(aT.name, c, xInfo) + val fields = c.args.flatMap(_.fields).map(f => fieldDeclAdtD(f, t.context, t)(src)) + + in.AdtClause(proxy, fields)(src) + } + + AdditionalMembers.addMember( + in.AdtDefinition(aT.name, clauses)(meta(t.decl, xInfo)) + ) + } + } + } + + def getAdtClauseTagMap(t: Type.AdtT): Map[String, BigInt] = { + t.decl.clauses + .map(c => idName(c.id, t.context.getTypeInfo)) + .sortBy(s => s) + .zipWithIndex + .map { + case (s, i) => s -> BigInt(i) + } + .toMap + } + def embeddedTypeD(t: PEmbeddedType, addrMod: Addressability)(src: Meta): in.Type = t match { case PEmbeddedName(typ) => typeD(info.symbType(typ), addrMod)(src) case PEmbeddedPointer(typ) => @@ -3604,6 +3714,21 @@ object Desugar { val inFields: Vector[in.Field] = structD(t, addrMod)(src) registerType(in.StructT(inFields, addrMod)) + case t: Type.AdtT => + val adtName = nm.adt(t) + val res = registerType(in.AdtT(adtName, addrMod, getAdtClauseTagMap(t))) + registerAdt(t, res) + res + + case t: Type.AdtClauseT => + val tAdt = Type.AdtT(t.adtT, t.context) + val adt: in.AdtT = in.AdtT(nm.adt(tAdt), addrMod, getAdtClauseTagMap(tAdt)) + val fields: Vector[in.Field] = (t.clauses map { case (key: String, typ: Type) => + in.Field(nm.adtField(key, tAdt), typeD(typ, Addressability.mathDataStructureElement)(src), true)(src) + }).toVector + + in.AdtClauseT(idName(t.decl.id, t.context.getTypeInfo), adt, fields, addrMod) + case Type.PredT(args) => in.PredT(args.map(typeD(_, Addressability.rValue)(src)), Addressability.rValue) case Type.FunctionT(args, result) => @@ -3657,6 +3782,7 @@ object Desugar { case sc: st.SingleConstant => nm.global(id.name, sc.context) case st.Embbed(_, _, _) | st.Field(_, _, _) => violation(s"expected that fields and embedded field are desugared by using embeddedDeclD resp. fieldDeclD but idName was called with $id") case n: st.NamedType => nm.typ(id.name, n.context) + case a: st.AdtClause => nm.function(id.name, a.context) case _ => ??? } @@ -3907,10 +4033,56 @@ object Desugar { } case p: PClosureImplProof => closureImplProofD(ctx)(p) case PExplicitGhostStatement(actual) => stmtD(ctx, info)(actual) + + case PMatchStatement(exp, clauses, strict) => { + def goC(clause: PMatchStmtCase): Writer[in.PatternMatchCaseStmt] = { + + val body = block( + for { + s <- sequence(clause.stmt map { s => seqn(stmtD(ctx, info)(s)) }) + } yield in.Seqn(s)(src) + ) + + for { + eM <- matchPatternD(ctx, info)(clause.pattern) + } yield in.PatternMatchCaseStmt(eM, body)(src) + + } + + for { + e <- exprD(ctx, info)(exp) + c <- sequence(clauses map goC) + } yield in.PatternMatchStmt(e, c, strict)(src) + } + case _ => ??? } } + def matchPatternD(ctx: FunctionContext, info: TypeInfo)(expr: PMatchPattern): Writer[in.MatchPattern] = { + + def goM(m: PMatchPattern) = matchPatternD(ctx, info)(m) + + val src = meta(expr, info) + + expr match { + case PMatchValue(lit) => for { + e <- exprD(ctx, info)(lit) + } yield in.MatchValue(e)(src) + + case PMatchBindVar(idn) => + unit(in.MatchBindVar(idName(idn, info.getTypeInfo), typeD(info.typ(idn), Addressability.Exclusive)(src))(src)) + + case PMatchAdt(clause, fields) => + val clauseType = typeD(info.symbType(clause), Addressability.Exclusive)(src) + for { + fieldsD <- sequence(fields map goM) + } yield in.MatchAdt(clauseType.asInstanceOf[in.AdtClauseT], fieldsD)(src) + + case PMatchWildcard() => unit(in.MatchWildcard()(src)) + } + } + /** * Desugar a specification entailment proof (proof c implements spec{params} { BODY }), as follows: * - Declare a fresh variable for all the arguments and results of spec. @@ -4167,6 +4339,26 @@ object Desugar { dop <- go(op) } yield in.OptionGet(dop)(src) + case m@PMatchExp(exp, _) => + val defaultD: Writer[Option[in.Expr]] = if (m.hasDefault) { + for { + e <- exprD(ctx, info)(m.defaultClauses.head.exp) + } yield Some(e) + } else { + unit(None) + } + + def caseD(c: PMatchExpCase): Writer[in.PatternMatchCaseExp] = for { + p <- matchPatternD(ctx, info)(c.pattern) + e <- exprD(ctx, info)(c.exp) + } yield in.PatternMatchCaseExp(p, e)(src) + + for { + e <- exprD(ctx, info)(exp) + cs <- sequence(m.caseClauses map caseD) + de <- defaultD + } yield in.PatternMatchExp(e, typ, cs, de)(src) + case PMapKeys(exp) => for { e <- go(exp) t = underlyingType(e.typ) @@ -4540,6 +4732,8 @@ object Desugar { private val MAIN_FUNC_OBLIGATIONS_PREFIX = "$CHECKMAIN" private val INTERFACE_PREFIX = "Y" private val DOMAIN_PREFIX = "D" + private val ADT_PREFIX = "ADT" + private val ADT_CLAUSE_PREFIX = "P" private val LABEL_PREFIX = "L" private val GLOBAL_PREFIX = "G" private val BUILTIN_PREFIX = "B" @@ -4716,6 +4910,17 @@ object Desugar { s"$DOMAIN_PREFIX$$${topLevelName("")(hash, s.context)}" } + def adt(a: AdtT): String = { + val pom = a.context.getTypeInfo.tree.originalRoot.positions + val start = pom.positions.getStart(a.decl).get + val finish = pom.positions.getFinish(a.decl).get + val pos = pom.translate(start, finish) + val adtName = pos.toString.replace(".", "$") + s"$ADT_PREFIX$$$adtName" + } + + def adtField(n: String, s: AdtT): String = s"$ADT_CLAUSE_PREFIX$$${topLevelName("")(adt(s), s.context)}" + def label(n: String): String = n match { case "#lhs" => "lhs" case _ => s"${n}_$LABEL_PREFIX" diff --git a/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala b/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala index 910dcffcd..4361f570a 100644 --- a/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala +++ b/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala @@ -9,6 +9,7 @@ package viper.gobra.translator.context import viper.gobra.ast.internal.GlobalVarDecl import viper.gobra.ast.{internal => in} import viper.gobra.translator.encodings._ +import viper.gobra.translator.encodings.adts.AdtEncoding import viper.gobra.translator.encodings.arrays.ArrayEncoding import viper.gobra.translator.encodings.channels.ChannelEncoding import viper.gobra.translator.encodings.closures.ClosureEncoding @@ -65,7 +66,7 @@ class DfltTranslatorConfig( new SafeTypeEncodingCombiner(Vector( new BoolEncoding, new IntEncoding, new PermissionEncoding, new PointerEncoding, new StructEncoding, arrayEncoding, new ClosureEncoding, new InterfaceEncoding, - new SequenceEncoding, new SetEncoding, new OptionEncoding, new DomainEncoding, + new SequenceEncoding, new SetEncoding, new OptionEncoding, new DomainEncoding, new AdtEncoding, new SliceEncoding(arrayEncoding), new PredEncoding, new ChannelEncoding, new StringEncoding, new MapEncoding, new MathematicalMapEncoding, new FloatEncoding, new AssertionEncoding, new CallEncoding, new MemoryEncoding, new ControlEncoding, From 800f1f9f3b91d32ceee205cc6c96a5fee4107e1f Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Fri, 11 Nov 2022 12:09:53 +0100 Subject: [PATCH 043/296] safety commit --- src/main/antlr4/GobraLexer.g4 | 1 + src/main/antlr4/GobraParser.g4 | 6 +- .../java/viper/gobra/frontend/GobraLexer.java | 1384 +++--- .../viper/gobra/frontend/GobraParser.java | 4141 +++++++++-------- .../frontend/GobraParserBaseVisitor.java | 18 +- .../gobra/frontend/GobraParserVisitor.java | 16 +- .../scala/viper/gobra/ast/frontend/Ast.scala | 2 +- .../scala/viper/gobra/frontend/Desugar.scala | 2 +- .../gobra/frontend/ParseTreeTranslator.scala | 16 + .../resolution/MemberResolution.scala | 16 +- .../encodings/adts/AdtEncoding.scala | 2 +- 11 files changed, 2912 insertions(+), 2692 deletions(-) diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4 index db44fc749..313f215f0 100644 --- a/src/main/antlr4/GobraLexer.g4 +++ b/src/main/antlr4/GobraLexer.g4 @@ -66,6 +66,7 @@ SOME : 'some'-> mode(NLSEMI); GET : 'get'-> mode(NLSEMI); DOM : 'domain'-> mode(NLSEMI); AXIOM : 'axiom'-> mode(NLSEMI); +ADT : 'adt' -> mode(NLSEMI); NONE : 'none' -> mode(NLSEMI); PRED : 'pred'; TYPE_OF : 'typeOf'-> mode(NLSEMI); diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 5b1a4fe8d..ca107ed37 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -132,12 +132,16 @@ seqUpdClause: expression ASSIGN expression; // Ghost Type Literals -ghostTypeLit: sqType | ghostSliceType | domainType; +ghostTypeLit: sqType | ghostSliceType | domainType | adtType; domainType: DOM L_CURLY (domainClause eos)* R_CURLY; domainClause: FUNC IDENTIFIER signature | AXIOM L_CURLY expression eos R_CURLY; +adtType: ADT L_CURLY (adtClause eos)* R_CURLY; + +adtClause: IDENTIFIER L_CURLY (fieldDecl eos)* R_CURLY; + ghostSliceType: GHOST L_BRACKET R_BRACKET elementType; sqType: (kind=(SEQ | SET | MSET | OPT) L_BRACKET type_ R_BRACKET) diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 9f1810987..6d4d8220a 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,4 +1,4 @@ -// Generated from /main/antlr4/GobraLexer.g4 by ANTLR 4.9.1 +// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -11,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class GobraLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -23,25 +23,26 @@ public class GobraLexer extends Lexer { FOLD=23, UNFOLD=24, UNFOLDING=25, GHOST=26, IN=27, MULTI=28, SUBSET=29, UNION=30, INTERSECTION=31, SETMINUS=32, IMPLIES=33, WAND=34, APPLY=35, QMARK=36, L_PRED=37, R_PRED=38, SEQ=39, SET=40, MSET=41, DICT=42, OPT=43, - LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, NONE=52, - PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58, - SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64, - OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70, - WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77, - DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85, - SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92, - FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99, - R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105, - COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111, - DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116, - NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121, - OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128, - PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134, - DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139, - IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143, - HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147, - INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152, - WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157; + LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, ADT=52, + NONE=53, PRED=54, TYPE_OF=55, IS_COMPARABLE=56, SHARE=57, ADDR_MOD=58, + DOT_DOT=59, SHARED=60, EXCLUSIVE=61, PREDICATE=62, WRITEPERM=63, NOPERM=64, + TRUSTED=65, OUTLINE=66, INIT_POST=67, IMPORT_PRE=68, PROOF=69, GHOST_EQUALS=70, + GHOST_NOT_EQUALS=71, WITH=72, BREAK=73, DEFAULT=74, FUNC=75, INTERFACE=76, + SELECT=77, CASE=78, DEFER=79, GO=80, MAP=81, STRUCT=82, CHAN=83, ELSE=84, + GOTO=85, PACKAGE=86, SWITCH=87, CONST=88, FALLTHROUGH=89, IF=90, RANGE=91, + TYPE=92, CONTINUE=93, FOR=94, IMPORT=95, RETURN=96, VAR=97, NIL_LIT=98, + IDENTIFIER=99, L_PAREN=100, R_PAREN=101, L_CURLY=102, R_CURLY=103, L_BRACKET=104, + R_BRACKET=105, ASSIGN=106, COMMA=107, SEMI=108, COLON=109, DOT=110, PLUS_PLUS=111, + MINUS_MINUS=112, DECLARE_ASSIGN=113, ELLIPSIS=114, LOGICAL_OR=115, LOGICAL_AND=116, + EQUALS=117, NOT_EQUALS=118, LESS=119, LESS_OR_EQUALS=120, GREATER=121, + GREATER_OR_EQUALS=122, OR=123, DIV=124, MOD=125, LSHIFT=126, RSHIFT=127, + BIT_CLEAR=128, EXCLAMATION=129, PLUS=130, MINUS=131, CARET=132, STAR=133, + AMPERSAND=134, RECEIVE=135, DECIMAL_LIT=136, BINARY_LIT=137, OCTAL_LIT=138, + HEX_LIT=139, HEX_FLOAT_LIT=140, IMAGINARY_LIT=141, RUNE_LIT=142, BYTE_VALUE=143, + OCTAL_BYTE_VALUE=144, HEX_BYTE_VALUE=145, LITTLE_U_VALUE=146, BIG_U_VALUE=147, + RAW_STRING_LIT=148, INTERPRETED_STRING_LIT=149, WS=150, COMMENT=151, TERMINATOR=152, + LINE_COMMENT=153, WS_NLSEMI=154, COMMENT_NLSEMI=155, LINE_COMMENT_NLSEMI=156, + EOS=157, OTHER=158; public static final int NLSEMI=1; public static String[] channelNames = { @@ -60,8 +61,8 @@ private static String[] makeRuleNames() { "UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", - "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", - "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", + "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", + "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", @@ -93,8 +94,8 @@ private static String[] makeLiteralNames() { "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'", "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'", "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'", - "'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'", - "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", + "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'none'", "'pred'", + "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", @@ -116,8 +117,8 @@ private static String[] makeSymbolicNames() { "UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", - "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", - "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", + "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", + "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", @@ -213,7 +214,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u009f\u05c3\b\1\b"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a0\u05cb\b\1\b"+ "\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n"+ "\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21"+ "\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30"+ @@ -236,668 +237,671 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+ "\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+ "\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+ - "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\3\2\3\2\5\2\u015b\n\2"+ - "\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0163\n\3\3\3\5\3\u0166\n\3\3\3\5\3\u0169"+ - "\n\3\3\3\3\3\3\3\3\3\5\3\u016f\n\3\5\3\u0171\n\3\3\4\3\4\3\4\3\4\3\4\3"+ - "\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7"+ - "\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3"+ - "\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13"+ - "\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r"+ - "\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+ - "\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3"+ - "\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3"+ - "\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3"+ - "\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3"+ - "\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3"+ - "\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+ - "\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3"+ - "\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 "+ - "\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3"+ - "\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3\'\3\'\3\'\3\'\3"+ - "\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3"+ - "+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3"+ - ".\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61"+ - "\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63"+ - "\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65"+ - "\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67"+ - "\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\38\38"+ - "\38\38\39\39\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3="+ - "\3=\3=\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?"+ - "\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A"+ - "\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C"+ - "\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F"+ - "\3F\3F\3F\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J"+ - "\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M"+ - "\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3Q\3R"+ - "\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V"+ - "\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y"+ - "\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\"+ - "\3\\\3\\\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3_\3_\3"+ - "_\3_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3c\3c\3"+ - "c\7c\u040e\nc\fc\16c\u0411\13c\3c\3c\3d\3d\3e\3e\3e\3e\3f\3f\3g\3g\3g"+ - "\3g\3h\3h\3i\3i\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3o\3o\3o\3p"+ - "\3p\3p\3p\3p\3q\3q\3q\3r\3r\3r\3r\3s\3s\3s\3t\3t\3t\3u\3u\3u\3v\3v\3v"+ - "\3w\3w\3x\3x\3x\3y\3y\3z\3z\3z\3{\3{\3|\3|\3}\3}\3~\3~\3~\3\177\3\177"+ - "\3\177\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083"+ - "\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0087\3\u0087"+ - "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u0479\n\u0088\3\u0088\7\u0088"+ - "\u047c\n\u0088\f\u0088\16\u0088\u047f\13\u0088\5\u0088\u0481\n\u0088\3"+ - "\u0088\3\u0088\3\u0089\3\u0089\3\u0089\5\u0089\u0488\n\u0089\3\u0089\6"+ - "\u0089\u048b\n\u0089\r\u0089\16\u0089\u048c\3\u0089\3\u0089\3\u008a\3"+ - "\u008a\5\u008a\u0493\n\u008a\3\u008a\5\u008a\u0496\n\u008a\3\u008a\6\u008a"+ - "\u0499\n\u008a\r\u008a\16\u008a\u049a\3\u008a\3\u008a\3\u008b\3\u008b"+ - "\3\u008b\5\u008b\u04a2\n\u008b\3\u008b\6\u008b\u04a5\n\u008b\r\u008b\16"+ - "\u008b\u04a6\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3"+ - "\u008d\5\u008d\u04b1\n\u008d\3\u008d\6\u008d\u04b4\n\u008d\r\u008d\16"+ - "\u008d\u04b5\3\u008d\3\u008d\5\u008d\u04ba\n\u008d\3\u008d\7\u008d\u04bd"+ - "\n\u008d\f\u008d\16\u008d\u04c0\13\u008d\5\u008d\u04c2\n\u008d\3\u008d"+ - "\3\u008d\3\u008d\5\u008d\u04c7\n\u008d\3\u008d\7\u008d\u04ca\n\u008d\f"+ - "\u008d\16\u008d\u04cd\13\u008d\5\u008d\u04cf\n\u008d\3\u008e\3\u008e\3"+ - "\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u04da\n"+ - "\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\5\u0090"+ - "\u04e3\n\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0092"+ - "\3\u0092\5\u0092\u04ed\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093"+ - "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095\3\u0095"+ - "\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+ - "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\7\u0097\u050d"+ - "\n\u0097\f\u0097\16\u0097\u0510\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+ - "\3\u0098\3\u0098\3\u0098\7\u0098\u0519\n\u0098\f\u0098\16\u0098\u051c"+ - "\13\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\6\u0099\u0523\n\u0099"+ - "\r\u0099\16\u0099\u0524\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a"+ - "\7\u009a\u052d\n\u009a\f\u009a\16\u009a\u0530\13\u009a\3\u009a\3\u009a"+ - "\3\u009a\3\u009a\3\u009a\3\u009b\6\u009b\u0538\n\u009b\r\u009b\16\u009b"+ - "\u0539\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\7\u009c\u0542\n"+ - "\u009c\f\u009c\16\u009c\u0545\13\u009c\3\u009c\3\u009c\3\u009d\3\u009d"+ - "\3\u009d\3\u009d\5\u009d\u054d\n\u009d\3\u009e\3\u009e\3\u009e\3\u009e"+ - "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ - "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ - "\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u0569\n\u009e\3\u009f\3\u009f"+ - "\5\u009f\u056d\n\u009f\3\u009f\7\u009f\u0570\n\u009f\f\u009f\16\u009f"+ - "\u0573\13\u009f\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a3"+ - "\3\u00a3\5\u00a3\u057d\n\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\5\u00a4"+ - "\u0583\n\u00a4\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a7\6\u00a7\u058a\n"+ - "\u00a7\r\u00a7\16\u00a7\u058b\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8"+ - "\3\u00a8\7\u00a8\u0594\n\u00a8\f\u00a8\16\u00a8\u0597\13\u00a8\3\u00a8"+ - "\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9"+ - "\u05a2\n\u00a9\f\u00a9\16\u00a9\u05a5\13\u00a9\3\u00a9\3\u00a9\3\u00aa"+ - "\6\u00aa\u05aa\n\u00aa\r\u00aa\16\u00aa\u05ab\3\u00aa\3\u00aa\3\u00aa"+ - "\3\u00aa\3\u00aa\7\u00aa\u05b3\n\u00aa\f\u00aa\16\u00aa\u05b6\13\u00aa"+ - "\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u05bb\n\u00aa\3\u00aa\3\u00aa\3\u00ab"+ - "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\5\u052e\u0595\u05b4\2\u00ac\4\3\6\4\b"+ - "\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$"+ - "\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F"+ - "$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I"+ - "\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4"+ - "S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8"+ - "]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00cc"+ - "g\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0"+ - "q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4"+ - "{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104"+ - "\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110"+ - "\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d\u011a\2\u011c\2"+ - "\u011e\u008e\u0120\2\u0122\u008f\u0124\u0090\u0126\u0091\u0128\u0092\u012a"+ - "\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136"+ - "\u0099\u0138\u009a\u013a\2\u013c\2\u013e\2\u0140\2\u0142\2\u0144\2\u0146"+ - "\2\u0148\2\u014a\2\u014c\2\u014e\u009b\u0150\u009c\u0152\u009d\u0154\u009e"+ - "\u0156\u009f\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr"+ - "\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13"+ - "\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;"+ - "\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8"+ - "\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1"+ - "\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52"+ - "\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b"+ - "\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82"+ - "\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b"+ - "\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2"+ - "\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b"+ - "\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2"+ - "\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b"+ - "\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52"+ - "\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b"+ - "\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc"+ - "\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2"+ - "\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379"+ - "\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e"+ - "\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531"+ - "\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2"+ - "\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7"+ - "\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712"+ - "\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec"+ - "\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826"+ - "\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6"+ - "\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a"+ - "\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa"+ - "\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0"+ - "\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe"+ - "\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34"+ - "\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60"+ - "\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac"+ - "\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2"+ - "\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15"+ - "\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f"+ - "\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87"+ - "\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e"+ - "\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2"+ - "\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b"+ - "\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87"+ - "\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb"+ - "\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07"+ - "\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50"+ - "\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c"+ - "\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32"+ - "\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89"+ - "\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1"+ - "\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf"+ - "\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8"+ - "\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a"+ - "\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f"+ - "\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090"+ - "\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc"+ - "\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c"+ - "\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7"+ - "\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da"+ - "\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7"+ - "\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2"+ - "\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733"+ - "\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9"+ - "\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa"+ - "\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972"+ - "\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56"+ - "\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0"+ - "\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f"+ - "\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02"+ - "\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f"+ - "\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61"+ - "\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6"+ - "\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4"+ - "\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e"+ - "\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b"+ - "\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f"+ - "\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185"+ - "\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0"+ - "\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32"+ - "\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0"+ - "\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2"+ - "\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037"+ - "\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe"+ - "\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201"+ - "\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502"+ - "\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f"+ - "\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2"+ - "\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824"+ - "\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff"+ - "\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4"+ - "\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02"+ - "\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c"+ - "\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2"+ - "\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6"+ - "\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a"+ - "\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5"+ - "\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02"+ - "\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38"+ - "\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48"+ - "\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd"+ - "\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68"+ - "\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde"+ - "\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e"+ - "\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352"+ - "\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f"+ - "\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602"+ - "\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a"+ - "\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862"+ - "\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917"+ - "\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12"+ - "\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e"+ - "\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62"+ - "\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4"+ - "\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152"+ - "\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc"+ - "\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a"+ - "\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0"+ - "\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334"+ - "\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363"+ - "\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9"+ - "\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646"+ - "\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02"+ - "\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85"+ - "\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42"+ - "\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32"+ - "\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402"+ - "\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31"+ - "\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52"+ - "\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4"+ - "\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82"+ - "\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1"+ - "\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd"+ - "\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516"+ - "\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548"+ - "\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc"+ - "\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752"+ - "\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd"+ - "\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23"+ - "\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39"+ - "\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b"+ - "\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56"+ - "\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61"+ - "\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74"+ - "\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d"+ - "\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4"+ - "\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802"+ - "\4\ufa1f\4\u05ee\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3"+ - "\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2"+ - "\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\""+ - "\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2"+ - "\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2"+ - ":\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3"+ - "\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2"+ - "\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2"+ - "\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l"+ - "\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2"+ - "\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2"+ - "\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c"+ - "\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2"+ - "\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e"+ - "\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2"+ - "\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0"+ - "\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2"+ - "\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2"+ - "\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2"+ - "\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4"+ - "\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2"+ - "\2\2\u00de\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6"+ - "\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2"+ - "\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8"+ - "\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2"+ - "\2\2\u0102\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a"+ - "\3\2\2\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2"+ - "\2\2\u0114\3\2\2\2\2\u0116\3\2\2\2\2\u0118\3\2\2\2\2\u011e\3\2\2\2\2\u0122"+ - "\3\2\2\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2"+ - "\2\2\u012c\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134"+ - "\3\2\2\2\2\u0136\3\2\2\2\2\u0138\3\2\2\2\3\u014e\3\2\2\2\3\u0150\3\2\2"+ - "\2\3\u0152\3\2\2\2\3\u0154\3\2\2\2\3\u0156\3\2\2\2\4\u015a\3\2\2\2\6\u0170"+ - "\3\2\2\2\b\u0172\3\2\2\2\n\u0179\3\2\2\2\f\u0181\3\2\2\2\16\u0188\3\2"+ - "\2\2\20\u018f\3\2\2\2\22\u0196\3\2\2\2\24\u019d\3\2\2\2\26\u01a6\3\2\2"+ - "\2\30\u01b0\3\2\2\2\32\u01b8\3\2\2\2\34\u01c2\3\2\2\2\36\u01ce\3\2\2\2"+ - " \u01d5\3\2\2\2\"\u01e0\3\2\2\2$\u01e3\3\2\2\2&\u01e9\3\2\2\2(\u01f2\3"+ - "\2\2\2*\u01f7\3\2\2\2,\u01fe\3\2\2\2.\u0205\3\2\2\2\60\u020b\3\2\2\2\62"+ - "\u0210\3\2\2\2\64\u0217\3\2\2\2\66\u0221\3\2\2\28\u0227\3\2\2\2:\u022a"+ - "\3\2\2\2<\u022c\3\2\2\2>\u0233\3\2\2\2@\u0239\3\2\2\2B\u0246\3\2\2\2D"+ - "\u024f\3\2\2\2F\u0253\3\2\2\2H\u0257\3\2\2\2J\u025d\3\2\2\2L\u025f\3\2"+ - "\2\2N\u0262\3\2\2\2P\u0267\3\2\2\2R\u026d\3\2\2\2T\u0273\3\2\2\2V\u027a"+ - "\3\2\2\2X\u0281\3\2\2\2Z\u028a\3\2\2\2\\\u0290\3\2\2\2^\u0296\3\2\2\2"+ - "`\u029d\3\2\2\2b\u02a3\3\2\2\2d\u02aa\3\2\2\2f\u02b0\3\2\2\2h\u02b9\3"+ - "\2\2\2j\u02c1\3\2\2\2l\u02c8\3\2\2\2n\u02cd\3\2\2\2p\u02d6\3\2\2\2r\u02e5"+ - "\3\2\2\2t\u02eb\3\2\2\2v\u02ef\3\2\2\2x\u02f2\3\2\2\2z\u02f9\3\2\2\2|"+ - "\u0303\3\2\2\2~\u030d\3\2\2\2\u0080\u0319\3\2\2\2\u0082\u0322\3\2\2\2"+ - "\u0084\u032c\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u0340\3\2\2\2\u008a\u034f"+ - "\3\2\2\2\u008c\u0355\3\2\2\2\u008e\u0359\3\2\2\2\u0090\u035d\3\2\2\2\u0092"+ - "\u0362\3\2\2\2\u0094\u036a\3\2\2\2\u0096\u0372\3\2\2\2\u0098\u0377\3\2"+ - "\2\2\u009a\u0381\3\2\2\2\u009c\u0388\3\2\2\2\u009e\u038d\3\2\2\2\u00a0"+ - "\u0393\3\2\2\2\u00a2\u0396\3\2\2\2\u00a4\u039a\3\2\2\2\u00a6\u03a1\3\2"+ - "\2\2\u00a8\u03a6\3\2\2\2\u00aa\u03ab\3\2\2\2\u00ac\u03b0\3\2\2\2\u00ae"+ - "\u03b8\3\2\2\2\u00b0\u03bf\3\2\2\2\u00b2\u03c5\3\2\2\2\u00b4\u03d3\3\2"+ - "\2\2\u00b6\u03d6\3\2\2\2\u00b8\u03dc\3\2\2\2\u00ba\u03e1\3\2\2\2\u00bc"+ - "\u03ec\3\2\2\2\u00be\u03f0\3\2\2\2\u00c0\u03f7\3\2\2\2\u00c2\u0400\3\2"+ - "\2\2\u00c4\u0404\3\2\2\2\u00c6\u040a\3\2\2\2\u00c8\u0414\3\2\2\2\u00ca"+ - "\u0416\3\2\2\2\u00cc\u041a\3\2\2\2\u00ce\u041c\3\2\2\2\u00d0\u0420\3\2"+ - "\2\2\u00d2\u0422\3\2\2\2\u00d4\u0426\3\2\2\2\u00d6\u0428\3\2\2\2\u00d8"+ - "\u042a\3\2\2\2\u00da\u042c\3\2\2\2\u00dc\u042e\3\2\2\2\u00de\u0430\3\2"+ - "\2\2\u00e0\u0435\3\2\2\2\u00e2\u043a\3\2\2\2\u00e4\u043d\3\2\2\2\u00e6"+ - "\u0441\3\2\2\2\u00e8\u0444\3\2\2\2\u00ea\u0447\3\2\2\2\u00ec\u044a\3\2"+ - "\2\2\u00ee\u044d\3\2\2\2\u00f0\u044f\3\2\2\2\u00f2\u0452\3\2\2\2\u00f4"+ - "\u0454\3\2\2\2\u00f6\u0457\3\2\2\2\u00f8\u0459\3\2\2\2\u00fa\u045b\3\2"+ - "\2\2\u00fc\u045d\3\2\2\2\u00fe\u0460\3\2\2\2\u0100\u0463\3\2\2\2\u0102"+ - "\u0466\3\2\2\2\u0104\u0468\3\2\2\2\u0106\u046a\3\2\2\2\u0108\u046c\3\2"+ - "\2\2\u010a\u046e\3\2\2\2\u010c\u0470\3\2\2\2\u010e\u0472\3\2\2\2\u0110"+ - "\u0480\3\2\2\2\u0112\u0484\3\2\2\2\u0114\u0490\3\2\2\2\u0116\u049e\3\2"+ - "\2\2\u0118\u04aa\3\2\2\2\u011a\u04ce\3\2\2\2\u011c\u04d0\3\2\2\2\u011e"+ - "\u04d9\3\2\2\2\u0120\u04df\3\2\2\2\u0122\u04e6\3\2\2\2\u0124\u04ec\3\2"+ - "\2\2\u0126\u04ee\3\2\2\2\u0128\u04f3\3\2\2\2\u012a\u04f8\3\2\2\2\u012c"+ - "\u04ff\3\2\2\2\u012e\u050a\3\2\2\2\u0130\u0515\3\2\2\2\u0132\u0522\3\2"+ - "\2\2\u0134\u0528\3\2\2\2\u0136\u0537\3\2\2\2\u0138\u053d\3\2\2\2\u013a"+ - "\u054c\3\2\2\2\u013c\u054e\3\2\2\2\u013e\u056a\3\2\2\2\u0140\u0574\3\2"+ - "\2\2\u0142\u0576\3\2\2\2\u0144\u0578\3\2\2\2\u0146\u057a\3\2\2\2\u0148"+ - "\u0582\3\2\2\2\u014a\u0584\3\2\2\2\u014c\u0586\3\2\2\2\u014e\u0589\3\2"+ - "\2\2\u0150\u058f\3\2\2\2\u0152\u059d\3\2\2\2\u0154\u05ba\3\2\2\2\u0156"+ - "\u05be\3\2\2\2\u0158\u015b\5\6\3\2\u0159\u015b\5\u0118\u008c\2\u015a\u0158"+ - "\3\2\2\2\u015a\u0159\3\2\2\2\u015b\u015c\3\2\2\2\u015c\u015d\b\2\2\2\u015d"+ - "\5\3\2\2\2\u015e\u0168\5\u013e\u009f\2\u015f\u0160\7\60\2\2\u0160\u0162"+ - "\6\3\2\2\u0161\u0163\5\u013e\u009f\2\u0162\u0161\3\2\2\2\u0162\u0163\3"+ - "\2\2\2\u0163\u0165\3\2\2\2\u0164\u0166\5\u0146\u00a3\2\u0165\u0164\3\2"+ - "\2\2\u0165\u0166\3\2\2\2\u0166\u0169\3\2\2\2\u0167\u0169\5\u0146\u00a3"+ - "\2\u0168\u015f\3\2\2\2\u0168\u0167\3\2\2\2\u0169\u0171\3\2\2\2\u016a\u016b"+ - "\7\60\2\2\u016b\u016c\6\3\3\2\u016c\u016e\5\u013e\u009f\2\u016d\u016f"+ - "\5\u0146\u00a3\2\u016e\u016d\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0171\3"+ - "\2\2\2\u0170\u015e\3\2\2\2\u0170\u016a\3\2\2\2\u0171\7\3\2\2\2\u0172\u0173"+ - "\7v\2\2\u0173\u0174\7t\2\2\u0174\u0175\7w\2\2\u0175\u0176\7g\2\2\u0176"+ - "\u0177\3\2\2\2\u0177\u0178\b\4\2\2\u0178\t\3\2\2\2\u0179\u017a\7h\2\2"+ - "\u017a\u017b\7c\2\2\u017b\u017c\7n\2\2\u017c\u017d\7u\2\2\u017d\u017e"+ - "\7g\2\2\u017e\u017f\3\2\2\2\u017f\u0180\b\5\2\2\u0180\13\3\2\2\2\u0181"+ - "\u0182\7c\2\2\u0182\u0183\7u\2\2\u0183\u0184\7u\2\2\u0184\u0185\7g\2\2"+ - "\u0185\u0186\7t\2\2\u0186\u0187\7v\2\2\u0187\r\3\2\2\2\u0188\u0189\7c"+ - "\2\2\u0189\u018a\7u\2\2\u018a\u018b\7u\2\2\u018b\u018c\7w\2\2\u018c\u018d"+ - "\7o\2\2\u018d\u018e\7g\2\2\u018e\17\3\2\2\2\u018f\u0190\7k\2\2\u0190\u0191"+ - "\7p\2\2\u0191\u0192\7j\2\2\u0192\u0193\7c\2\2\u0193\u0194\7n\2\2\u0194"+ - "\u0195\7g\2\2\u0195\21\3\2\2\2\u0196\u0197\7g\2\2\u0197\u0198\7z\2\2\u0198"+ - "\u0199\7j\2\2\u0199\u019a\7c\2\2\u019a\u019b\7n\2\2\u019b\u019c\7g\2\2"+ - "\u019c\23\3\2\2\2\u019d\u019e\7t\2\2\u019e\u019f\7g\2\2\u019f\u01a0\7"+ - "s\2\2\u01a0\u01a1\7w\2\2\u01a1\u01a2\7k\2\2\u01a2\u01a3\7t\2\2\u01a3\u01a4"+ - "\7g\2\2\u01a4\u01a5\7u\2\2\u01a5\25\3\2\2\2\u01a6\u01a7\7r\2\2\u01a7\u01a8"+ - "\7t\2\2\u01a8\u01a9\7g\2\2\u01a9\u01aa\7u\2\2\u01aa\u01ab\7g\2\2\u01ab"+ - "\u01ac\7t\2\2\u01ac\u01ad\7x\2\2\u01ad\u01ae\7g\2\2\u01ae\u01af\7u\2\2"+ - "\u01af\27\3\2\2\2\u01b0\u01b1\7g\2\2\u01b1\u01b2\7p\2\2\u01b2\u01b3\7"+ - "u\2\2\u01b3\u01b4\7w\2\2\u01b4\u01b5\7t\2\2\u01b5\u01b6\7g\2\2\u01b6\u01b7"+ - "\7u\2\2\u01b7\31\3\2\2\2\u01b8\u01b9\7k\2\2\u01b9\u01ba\7p\2\2\u01ba\u01bb"+ - "\7x\2\2\u01bb\u01bc\7c\2\2\u01bc\u01bd\7t\2\2\u01bd\u01be\7k\2\2\u01be"+ - "\u01bf\7c\2\2\u01bf\u01c0\7p\2\2\u01c0\u01c1\7v\2\2\u01c1\33\3\2\2\2\u01c2"+ - "\u01c3\7f\2\2\u01c3\u01c4\7g\2\2\u01c4\u01c5\7e\2\2\u01c5\u01c6\7t\2\2"+ - "\u01c6\u01c7\7g\2\2\u01c7\u01c8\7c\2\2\u01c8\u01c9\7u\2\2\u01c9\u01ca"+ - "\7g\2\2\u01ca\u01cb\7u\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd\b\16\2\2\u01cd"+ - "\35\3\2\2\2\u01ce\u01cf\7r\2\2\u01cf\u01d0\7w\2\2\u01d0\u01d1\7t\2\2\u01d1"+ - "\u01d2\7g\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\b\17\2\2\u01d4\37\3\2\2"+ - "\2\u01d5\u01d6\7k\2\2\u01d6\u01d7\7o\2\2\u01d7\u01d8\7r\2\2\u01d8\u01d9"+ - "\7n\2\2\u01d9\u01da\7g\2\2\u01da\u01db\7o\2\2\u01db\u01dc\7g\2\2\u01dc"+ - "\u01dd\7p\2\2\u01dd\u01de\7v\2\2\u01de\u01df\7u\2\2\u01df!\3\2\2\2\u01e0"+ - "\u01e1\7c\2\2\u01e1\u01e2\7u\2\2\u01e2#\3\2\2\2\u01e3\u01e4\7q\2\2\u01e4"+ - "\u01e5\7n\2\2\u01e5\u01e6\7f\2\2\u01e6\u01e7\3\2\2\2\u01e7\u01e8\b\22"+ - "\2\2\u01e8%\3\2\2\2\u01e9\u01ea\7d\2\2\u01ea\u01eb\7g\2\2\u01eb\u01ec"+ - "\7h\2\2\u01ec\u01ed\7q\2\2\u01ed\u01ee\7t\2\2\u01ee\u01ef\7g\2\2\u01ef"+ - "\u01f0\3\2\2\2\u01f0\u01f1\b\23\2\2\u01f1\'\3\2\2\2\u01f2\u01f3\7%\2\2"+ - "\u01f3\u01f4\7n\2\2\u01f4\u01f5\7j\2\2\u01f5\u01f6\7u\2\2\u01f6)\3\2\2"+ - "\2\u01f7\u01f8\7h\2\2\u01f8\u01f9\7q\2\2\u01f9\u01fa\7t\2\2\u01fa\u01fb"+ - "\7c\2\2\u01fb\u01fc\7n\2\2\u01fc\u01fd\7n\2\2\u01fd+\3\2\2\2\u01fe\u01ff"+ - "\7g\2\2\u01ff\u0200\7z\2\2\u0200\u0201\7k\2\2\u0201\u0202\7u\2\2\u0202"+ - "\u0203\7v\2\2\u0203\u0204\7u\2\2\u0204-\3\2\2\2\u0205\u0206\7c\2\2\u0206"+ - "\u0207\7e\2\2\u0207\u0208\7e\2\2\u0208\u0209\3\2\2\2\u0209\u020a\b\27"+ - "\2\2\u020a/\3\2\2\2\u020b\u020c\7h\2\2\u020c\u020d\7q\2\2\u020d\u020e"+ - "\7n\2\2\u020e\u020f\7f\2\2\u020f\61\3\2\2\2\u0210\u0211\7w\2\2\u0211\u0212"+ - "\7p\2\2\u0212\u0213\7h\2\2\u0213\u0214\7q\2\2\u0214\u0215\7n\2\2\u0215"+ - "\u0216\7f\2\2\u0216\63\3\2\2\2\u0217\u0218\7w\2\2\u0218\u0219\7p\2\2\u0219"+ - "\u021a\7h\2\2\u021a\u021b\7q\2\2\u021b\u021c\7n\2\2\u021c\u021d\7f\2\2"+ - "\u021d\u021e\7k\2\2\u021e\u021f\7p\2\2\u021f\u0220\7i\2\2\u0220\65\3\2"+ - "\2\2\u0221\u0222\7i\2\2\u0222\u0223\7j\2\2\u0223\u0224\7q\2\2\u0224\u0225"+ - "\7u\2\2\u0225\u0226\7v\2\2\u0226\67\3\2\2\2\u0227\u0228\7k\2\2\u0228\u0229"+ - "\7p\2\2\u02299\3\2\2\2\u022a\u022b\7%\2\2\u022b;\3\2\2\2\u022c\u022d\7"+ - "u\2\2\u022d\u022e\7w\2\2\u022e\u022f\7d\2\2\u022f\u0230\7u\2\2\u0230\u0231"+ - "\7g\2\2\u0231\u0232\7v\2\2\u0232=\3\2\2\2\u0233\u0234\7w\2\2\u0234\u0235"+ - "\7p\2\2\u0235\u0236\7k\2\2\u0236\u0237\7q\2\2\u0237\u0238\7p\2\2\u0238"+ - "?\3\2\2\2\u0239\u023a\7k\2\2\u023a\u023b\7p\2\2\u023b\u023c\7v\2\2\u023c"+ - "\u023d\7g\2\2\u023d\u023e\7t\2\2\u023e\u023f\7u\2\2\u023f\u0240\7g\2\2"+ - "\u0240\u0241\7e\2\2\u0241\u0242\7v\2\2\u0242\u0243\7k\2\2\u0243\u0244"+ - "\7q\2\2\u0244\u0245\7p\2\2\u0245A\3\2\2\2\u0246\u0247\7u\2\2\u0247\u0248"+ - "\7g\2\2\u0248\u0249\7v\2\2\u0249\u024a\7o\2\2\u024a\u024b\7k\2\2\u024b"+ - "\u024c\7p\2\2\u024c\u024d\7w\2\2\u024d\u024e\7u\2\2\u024eC\3\2\2\2\u024f"+ - "\u0250\7?\2\2\u0250\u0251\7?\2\2\u0251\u0252\7@\2\2\u0252E\3\2\2\2\u0253"+ - "\u0254\7/\2\2\u0254\u0255\7/\2\2\u0255\u0256\7,\2\2\u0256G\3\2\2\2\u0257"+ - "\u0258\7c\2\2\u0258\u0259\7r\2\2\u0259\u025a\7r\2\2\u025a\u025b\7n\2\2"+ - "\u025b\u025c\7{\2\2\u025cI\3\2\2\2\u025d\u025e\7A\2\2\u025eK\3\2\2\2\u025f"+ - "\u0260\7#\2\2\u0260\u0261\7>\2\2\u0261M\3\2\2\2\u0262\u0263\7#\2\2\u0263"+ - "\u0264\7@\2\2\u0264\u0265\3\2\2\2\u0265\u0266\b\'\2\2\u0266O\3\2\2\2\u0267"+ - "\u0268\7u\2\2\u0268\u0269\7g\2\2\u0269\u026a\7s\2\2\u026a\u026b\3\2\2"+ - "\2\u026b\u026c\b(\2\2\u026cQ\3\2\2\2\u026d\u026e\7u\2\2\u026e\u026f\7"+ - "g\2\2\u026f\u0270\7v\2\2\u0270\u0271\3\2\2\2\u0271\u0272\b)\2\2\u0272"+ - "S\3\2\2\2\u0273\u0274\7o\2\2\u0274\u0275\7u\2\2\u0275\u0276\7g\2\2\u0276"+ - "\u0277\7v\2\2\u0277\u0278\3\2\2\2\u0278\u0279\b*\2\2\u0279U\3\2\2\2\u027a"+ - "\u027b\7f\2\2\u027b\u027c\7k\2\2\u027c\u027d\7e\2\2\u027d\u027e\7v\2\2"+ - "\u027e\u027f\3\2\2\2\u027f\u0280\b+\2\2\u0280W\3\2\2\2\u0281\u0282\7q"+ - "\2\2\u0282\u0283\7r\2\2\u0283\u0284\7v\2\2\u0284\u0285\7k\2\2\u0285\u0286"+ - "\7q\2\2\u0286\u0287\7p\2\2\u0287\u0288\3\2\2\2\u0288\u0289\b,\2\2\u0289"+ - "Y\3\2\2\2\u028a\u028b\7n\2\2\u028b\u028c\7g\2\2\u028c\u028d\7p\2\2\u028d"+ - "\u028e\3\2\2\2\u028e\u028f\b-\2\2\u028f[\3\2\2\2\u0290\u0291\7p\2\2\u0291"+ - "\u0292\7g\2\2\u0292\u0293\7y\2\2\u0293\u0294\3\2\2\2\u0294\u0295\b.\2"+ - "\2\u0295]\3\2\2\2\u0296\u0297\7o\2\2\u0297\u0298\7c\2\2\u0298\u0299\7"+ - "m\2\2\u0299\u029a\7g\2\2\u029a\u029b\3\2\2\2\u029b\u029c\b/\2\2\u029c"+ - "_\3\2\2\2\u029d\u029e\7e\2\2\u029e\u029f\7c\2\2\u029f\u02a0\7r\2\2\u02a0"+ - "\u02a1\3\2\2\2\u02a1\u02a2\b\60\2\2\u02a2a\3\2\2\2\u02a3\u02a4\7u\2\2"+ - "\u02a4\u02a5\7q\2\2\u02a5\u02a6\7o\2\2\u02a6\u02a7\7g\2\2\u02a7\u02a8"+ - "\3\2\2\2\u02a8\u02a9\b\61\2\2\u02a9c\3\2\2\2\u02aa\u02ab\7i\2\2\u02ab"+ - "\u02ac\7g\2\2\u02ac\u02ad\7v\2\2\u02ad\u02ae\3\2\2\2\u02ae\u02af\b\62"+ - "\2\2\u02afe\3\2\2\2\u02b0\u02b1\7f\2\2\u02b1\u02b2\7q\2\2\u02b2\u02b3"+ - "\7o\2\2\u02b3\u02b4\7c\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b6\7p\2\2\u02b6"+ - "\u02b7\3\2\2\2\u02b7\u02b8\b\63\2\2\u02b8g\3\2\2\2\u02b9\u02ba\7c\2\2"+ - "\u02ba\u02bb\7z\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7q\2\2\u02bd\u02be"+ - "\7o\2\2\u02be\u02bf\3\2\2\2\u02bf\u02c0\b\64\2\2\u02c0i\3\2\2\2\u02c1"+ - "\u02c2\7p\2\2\u02c2\u02c3\7q\2\2\u02c3\u02c4\7p\2\2\u02c4\u02c5\7g\2\2"+ - "\u02c5\u02c6\3\2\2\2\u02c6\u02c7\b\65\2\2\u02c7k\3\2\2\2\u02c8\u02c9\7"+ - "r\2\2\u02c9\u02ca\7t\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7f\2\2\u02ccm"+ - "\3\2\2\2\u02cd\u02ce\7v\2\2\u02ce\u02cf\7{\2\2\u02cf\u02d0\7r\2\2\u02d0"+ - "\u02d1\7g\2\2\u02d1\u02d2\7Q\2\2\u02d2\u02d3\7h\2\2\u02d3\u02d4\3\2\2"+ - "\2\u02d4\u02d5\b\67\2\2\u02d5o\3\2\2\2\u02d6\u02d7\7k\2\2\u02d7\u02d8"+ - "\7u\2\2\u02d8\u02d9\7E\2\2\u02d9\u02da\7q\2\2\u02da\u02db\7o\2\2\u02db"+ - "\u02dc\7r\2\2\u02dc\u02dd\7c\2\2\u02dd\u02de\7t\2\2\u02de\u02df\7c\2\2"+ - "\u02df\u02e0\7d\2\2\u02e0\u02e1\7n\2\2\u02e1\u02e2\7g\2\2\u02e2\u02e3"+ - "\3\2\2\2\u02e3\u02e4\b8\2\2\u02e4q\3\2\2\2\u02e5\u02e6\7u\2\2\u02e6\u02e7"+ - "\7j\2\2\u02e7\u02e8\7c\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7g\2\2\u02ea"+ - "s\3\2\2\2\u02eb\u02ec\7B\2\2\u02ec\u02ed\3\2\2\2\u02ed\u02ee\b:\2\2\u02ee"+ - "u\3\2\2\2\u02ef\u02f0\7\60\2\2\u02f0\u02f1\7\60\2\2\u02f1w\3\2\2\2\u02f2"+ - "\u02f3\7u\2\2\u02f3\u02f4\7j\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7t\2\2"+ - "\u02f6\u02f7\7g\2\2\u02f7\u02f8\7f\2\2\u02f8y\3\2\2\2\u02f9\u02fa\7g\2"+ - "\2\u02fa\u02fb\7z\2\2\u02fb\u02fc\7e\2\2\u02fc\u02fd\7n\2\2\u02fd\u02fe"+ - "\7w\2\2\u02fe\u02ff\7u\2\2\u02ff\u0300\7k\2\2\u0300\u0301\7x\2\2\u0301"+ - "\u0302\7g\2\2\u0302{\3\2\2\2\u0303\u0304\7r\2\2\u0304\u0305\7t\2\2\u0305"+ - "\u0306\7g\2\2\u0306\u0307\7f\2\2\u0307\u0308\7k\2\2\u0308\u0309\7e\2\2"+ - "\u0309\u030a\7c\2\2\u030a\u030b\7v\2\2\u030b\u030c\7g\2\2\u030c}\3\2\2"+ - "\2\u030d\u030e\7y\2\2\u030e\u030f\7t\2\2\u030f\u0310\7k\2\2\u0310\u0311"+ - "\7v\2\2\u0311\u0312\7g\2\2\u0312\u0313\7R\2\2\u0313\u0314\7g\2\2\u0314"+ - "\u0315\7t\2\2\u0315\u0316\7o\2\2\u0316\u0317\3\2\2\2\u0317\u0318\b?\2"+ - "\2\u0318\177\3\2\2\2\u0319\u031a\7p\2\2\u031a\u031b\7q\2\2\u031b\u031c"+ - "\7R\2\2\u031c\u031d\7g\2\2\u031d\u031e\7t\2\2\u031e\u031f\7o\2\2\u031f"+ - "\u0320\3\2\2\2\u0320\u0321\b@\2\2\u0321\u0081\3\2\2\2\u0322\u0323\7v\2"+ - "\2\u0323\u0324\7t\2\2\u0324\u0325\7w\2\2\u0325\u0326\7u\2\2\u0326\u0327"+ - "\7v\2\2\u0327\u0328\7g\2\2\u0328\u0329\7f\2\2\u0329\u032a\3\2\2\2\u032a"+ - "\u032b\bA\2\2\u032b\u0083\3\2\2\2\u032c\u032d\7q\2\2\u032d\u032e\7w\2"+ - "\2\u032e\u032f\7v\2\2\u032f\u0330\7n\2\2\u0330\u0331\7k\2\2\u0331\u0332"+ - "\7p\2\2\u0332\u0333\7g\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7k\2\2\u0335"+ - "\u0336\7p\2\2\u0336\u0337\7k\2\2\u0337\u0338\7v\2\2\u0338\u0339\7G\2\2"+ - "\u0339\u033a\7p\2\2\u033a\u033b\7u\2\2\u033b\u033c\7w\2\2\u033c\u033d"+ - "\7t\2\2\u033d\u033e\7g\2\2\u033e\u033f\7u\2\2\u033f\u0087\3\2\2\2\u0340"+ - "\u0341\7k\2\2\u0341\u0342\7o\2\2\u0342\u0343\7r\2\2\u0343\u0344\7q\2\2"+ - "\u0344\u0345\7t\2\2\u0345\u0346\7v\2\2\u0346\u0347\7T\2\2\u0347\u0348"+ - "\7g\2\2\u0348\u0349\7s\2\2\u0349\u034a\7w\2\2\u034a\u034b\7k\2\2\u034b"+ - "\u034c\7t\2\2\u034c\u034d\7g\2\2\u034d\u034e\7u\2\2\u034e\u0089\3\2\2"+ - "\2\u034f\u0350\7r\2\2\u0350\u0351\7t\2\2\u0351\u0352\7q\2\2\u0352\u0353"+ - "\7q\2\2\u0353\u0354\7h\2\2\u0354\u008b\3\2\2\2\u0355\u0356\7?\2\2\u0356"+ - "\u0357\7?\2\2\u0357\u0358\7?\2\2\u0358\u008d\3\2\2\2\u0359\u035a\7#\2"+ - "\2\u035a\u035b\7?\2\2\u035b\u035c\7?\2\2\u035c\u008f\3\2\2\2\u035d\u035e"+ - "\7y\2\2\u035e\u035f\7k\2\2\u035f\u0360\7v\2\2\u0360\u0361\7j\2\2\u0361"+ - "\u0091\3\2\2\2\u0362\u0363\7d\2\2\u0363\u0364\7t\2\2\u0364\u0365\7g\2"+ - "\2\u0365\u0366\7c\2\2\u0366\u0367\7m\2\2\u0367\u0368\3\2\2\2\u0368\u0369"+ - "\bI\2\2\u0369\u0093\3\2\2\2\u036a\u036b\7f\2\2\u036b\u036c\7g\2\2\u036c"+ - "\u036d\7h\2\2\u036d\u036e\7c\2\2\u036e\u036f\7w\2\2\u036f\u0370\7n\2\2"+ - "\u0370\u0371\7v\2\2\u0371\u0095\3\2\2\2\u0372\u0373\7h\2\2\u0373\u0374"+ - "\7w\2\2\u0374\u0375\7p\2\2\u0375\u0376\7e\2\2\u0376\u0097\3\2\2\2\u0377"+ - "\u0378\7k\2\2\u0378\u0379\7p\2\2\u0379\u037a\7v\2\2\u037a\u037b\7g\2\2"+ - "\u037b\u037c\7t\2\2\u037c\u037d\7h\2\2\u037d\u037e\7c\2\2\u037e\u037f"+ - "\7e\2\2\u037f\u0380\7g\2\2\u0380\u0099\3\2\2\2\u0381\u0382\7u\2\2\u0382"+ - "\u0383\7g\2\2\u0383\u0384\7n\2\2\u0384\u0385\7g\2\2\u0385\u0386\7e\2\2"+ - "\u0386\u0387\7v\2\2\u0387\u009b\3\2\2\2\u0388\u0389\7e\2\2\u0389\u038a"+ - "\7c\2\2\u038a\u038b\7u\2\2\u038b\u038c\7g\2\2\u038c\u009d\3\2\2\2\u038d"+ - "\u038e\7f\2\2\u038e\u038f\7g\2\2\u038f\u0390\7h\2\2\u0390\u0391\7g\2\2"+ - "\u0391\u0392\7t\2\2\u0392\u009f\3\2\2\2\u0393\u0394\7i\2\2\u0394\u0395"+ - "\7q\2\2\u0395\u00a1\3\2\2\2\u0396\u0397\7o\2\2\u0397\u0398\7c\2\2\u0398"+ - "\u0399\7r\2\2\u0399\u00a3\3\2\2\2\u039a\u039b\7u\2\2\u039b\u039c\7v\2"+ - "\2\u039c\u039d\7t\2\2\u039d\u039e\7w\2\2\u039e\u039f\7e\2\2\u039f\u03a0"+ - "\7v\2\2\u03a0\u00a5\3\2\2\2\u03a1\u03a2\7e\2\2\u03a2\u03a3\7j\2\2\u03a3"+ - "\u03a4\7c\2\2\u03a4\u03a5\7p\2\2\u03a5\u00a7\3\2\2\2\u03a6\u03a7\7g\2"+ - "\2\u03a7\u03a8\7n\2\2\u03a8\u03a9\7u\2\2\u03a9\u03aa\7g\2\2\u03aa\u00a9"+ - "\3\2\2\2\u03ab\u03ac\7i\2\2\u03ac\u03ad\7q\2\2\u03ad\u03ae\7v\2\2\u03ae"+ - "\u03af\7q\2\2\u03af\u00ab\3\2\2\2\u03b0\u03b1\7r\2\2\u03b1\u03b2\7c\2"+ - "\2\u03b2\u03b3\7e\2\2\u03b3\u03b4\7m\2\2\u03b4\u03b5\7c\2\2\u03b5\u03b6"+ - "\7i\2\2\u03b6\u03b7\7g\2\2\u03b7\u00ad\3\2\2\2\u03b8\u03b9\7u\2\2\u03b9"+ - "\u03ba\7y\2\2\u03ba\u03bb\7k\2\2\u03bb\u03bc\7v\2\2\u03bc\u03bd\7e\2\2"+ - "\u03bd\u03be\7j\2\2\u03be\u00af\3\2\2\2\u03bf\u03c0\7e\2\2\u03c0\u03c1"+ - "\7q\2\2\u03c1\u03c2\7p\2\2\u03c2\u03c3\7u\2\2\u03c3\u03c4\7v\2\2\u03c4"+ - "\u00b1\3\2\2\2\u03c5\u03c6\7h\2\2\u03c6\u03c7\7c\2\2\u03c7\u03c8\7n\2"+ - "\2\u03c8\u03c9\7n\2\2\u03c9\u03ca\7v\2\2\u03ca\u03cb\7j\2\2\u03cb\u03cc"+ - "\7t\2\2\u03cc\u03cd\7q\2\2\u03cd\u03ce\7w\2\2\u03ce\u03cf\7i\2\2\u03cf"+ - "\u03d0\7j\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d2\bY\2\2\u03d2\u00b3\3\2\2"+ - "\2\u03d3\u03d4\7k\2\2\u03d4\u03d5\7h\2\2\u03d5\u00b5\3\2\2\2\u03d6\u03d7"+ - "\7t\2\2\u03d7\u03d8\7c\2\2\u03d8\u03d9\7p\2\2\u03d9\u03da\7i\2\2\u03da"+ - "\u03db\7g\2\2\u03db\u00b7\3\2\2\2\u03dc\u03dd\7v\2\2\u03dd\u03de\7{\2"+ - "\2\u03de\u03df\7r\2\2\u03df\u03e0\7g\2\2\u03e0\u00b9\3\2\2\2\u03e1\u03e2"+ - "\7e\2\2\u03e2\u03e3\7q\2\2\u03e3\u03e4\7p\2\2\u03e4\u03e5\7v\2\2\u03e5"+ - "\u03e6\7k\2\2\u03e6\u03e7\7p\2\2\u03e7\u03e8\7w\2\2\u03e8\u03e9\7g\2\2"+ - "\u03e9\u03ea\3\2\2\2\u03ea\u03eb\b]\2\2\u03eb\u00bb\3\2\2\2\u03ec\u03ed"+ - "\7h\2\2\u03ed\u03ee\7q\2\2\u03ee\u03ef\7t\2\2\u03ef\u00bd\3\2\2\2\u03f0"+ - "\u03f1\7k\2\2\u03f1\u03f2\7o\2\2\u03f2\u03f3\7r\2\2\u03f3\u03f4\7q\2\2"+ - "\u03f4\u03f5\7t\2\2\u03f5\u03f6\7v\2\2\u03f6\u00bf\3\2\2\2\u03f7\u03f8"+ - "\7t\2\2\u03f8\u03f9\7g\2\2\u03f9\u03fa\7v\2\2\u03fa\u03fb\7w\2\2\u03fb"+ - "\u03fc\7t\2\2\u03fc\u03fd\7p\2\2\u03fd\u03fe\3\2\2\2\u03fe\u03ff\b`\2"+ - "\2\u03ff\u00c1\3\2\2\2\u0400\u0401\7x\2\2\u0401\u0402\7c\2\2\u0402\u0403"+ - "\7t\2\2\u0403\u00c3\3\2\2\2\u0404\u0405\7p\2\2\u0405\u0406\7k\2\2\u0406"+ - "\u0407\7n\2\2\u0407\u0408\3\2\2\2\u0408\u0409\bb\2\2\u0409\u00c5\3\2\2"+ - "\2\u040a\u040f\5\u0148\u00a4\2\u040b\u040e\5\u0148\u00a4\2\u040c\u040e"+ - "\5\u014a\u00a5\2\u040d\u040b\3\2\2\2\u040d\u040c\3\2\2\2\u040e\u0411\3"+ - "\2\2\2\u040f\u040d\3\2\2\2\u040f\u0410\3\2\2\2\u0410\u0412\3\2\2\2\u0411"+ - "\u040f\3\2\2\2\u0412\u0413\bc\2\2\u0413\u00c7\3\2\2\2\u0414\u0415\7*\2"+ - "\2\u0415\u00c9\3\2\2\2\u0416\u0417\7+\2\2\u0417\u0418\3\2\2\2\u0418\u0419"+ - "\be\2\2\u0419\u00cb\3\2\2\2\u041a\u041b\7}\2\2\u041b\u00cd\3\2\2\2\u041c"+ - "\u041d\7\177\2\2\u041d\u041e\3\2\2\2\u041e\u041f\bg\2\2\u041f\u00cf\3"+ - "\2\2\2\u0420\u0421\7]\2\2\u0421\u00d1\3\2\2\2\u0422\u0423\7_\2\2\u0423"+ - "\u0424\3\2\2\2\u0424\u0425\bi\2\2\u0425\u00d3\3\2\2\2\u0426\u0427\7?\2"+ - "\2\u0427\u00d5\3\2\2\2\u0428\u0429\7.\2\2\u0429\u00d7\3\2\2\2\u042a\u042b"+ - "\7=\2\2\u042b\u00d9\3\2\2\2\u042c\u042d\7<\2\2\u042d\u00db\3\2\2\2\u042e"+ - "\u042f\7\60\2\2\u042f\u00dd\3\2\2\2\u0430\u0431\7-\2\2\u0431\u0432\7-"+ - "\2\2\u0432\u0433\3\2\2\2\u0433\u0434\bo\2\2\u0434\u00df\3\2\2\2\u0435"+ - "\u0436\7/\2\2\u0436\u0437\7/\2\2\u0437\u0438\3\2\2\2\u0438\u0439\bp\2"+ - "\2\u0439\u00e1\3\2\2\2\u043a\u043b\7<\2\2\u043b\u043c\7?\2\2\u043c\u00e3"+ - "\3\2\2\2\u043d\u043e\7\60\2\2\u043e\u043f\7\60\2\2\u043f\u0440\7\60\2"+ - "\2\u0440\u00e5\3\2\2\2\u0441\u0442\7~\2\2\u0442\u0443\7~\2\2\u0443\u00e7"+ - "\3\2\2\2\u0444\u0445\7(\2\2\u0445\u0446\7(\2\2\u0446\u00e9\3\2\2\2\u0447"+ - "\u0448\7?\2\2\u0448\u0449\7?\2\2\u0449\u00eb\3\2\2\2\u044a\u044b\7#\2"+ - "\2\u044b\u044c\7?\2\2\u044c\u00ed\3\2\2\2\u044d\u044e\7>\2\2\u044e\u00ef"+ - "\3\2\2\2\u044f\u0450\7>\2\2\u0450\u0451\7?\2\2\u0451\u00f1\3\2\2\2\u0452"+ - "\u0453\7@\2\2\u0453\u00f3\3\2\2\2\u0454\u0455\7@\2\2\u0455\u0456\7?\2"+ - "\2\u0456\u00f5\3\2\2\2\u0457\u0458\7~\2\2\u0458\u00f7\3\2\2\2\u0459\u045a"+ - "\7\61\2\2\u045a\u00f9\3\2\2\2\u045b\u045c\7\'\2\2\u045c\u00fb\3\2\2\2"+ - "\u045d\u045e\7>\2\2\u045e\u045f\7>\2\2\u045f\u00fd\3\2\2\2\u0460\u0461"+ - "\7@\2\2\u0461\u0462\7@\2\2\u0462\u00ff\3\2\2\2\u0463\u0464\7(\2\2\u0464"+ - "\u0465\7`\2\2\u0465\u0101\3\2\2\2\u0466\u0467\7#\2\2\u0467\u0103\3\2\2"+ - "\2\u0468\u0469\7-\2\2\u0469\u0105\3\2\2\2\u046a\u046b\7/\2\2\u046b\u0107"+ - "\3\2\2\2\u046c\u046d\7`\2\2\u046d\u0109\3\2\2\2\u046e\u046f\7,\2\2\u046f"+ - "\u010b\3\2\2\2\u0470\u0471\7(\2\2\u0471\u010d\3\2\2\2\u0472\u0473\7>\2"+ - "\2\u0473\u0474\7/\2\2\u0474\u010f\3\2\2\2\u0475\u0481\7\62\2\2\u0476\u047d"+ - "\t\2\2\2\u0477\u0479\7a\2\2\u0478\u0477\3\2\2\2\u0478\u0479\3\2\2\2\u0479"+ - "\u047a\3\2\2\2\u047a\u047c\t\3\2\2\u047b\u0478\3\2\2\2\u047c\u047f\3\2"+ - "\2\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u0481\3\2\2\2\u047f"+ - "\u047d\3\2\2\2\u0480\u0475\3\2\2\2\u0480\u0476\3\2\2\2\u0481\u0482\3\2"+ - "\2\2\u0482\u0483\b\u0088\2\2\u0483\u0111\3\2\2\2\u0484\u0485\7\62\2\2"+ - "\u0485\u048a\t\4\2\2\u0486\u0488\7a\2\2\u0487\u0486\3\2\2\2\u0487\u0488"+ - "\3\2\2\2\u0488\u0489\3\2\2\2\u0489\u048b\5\u0144\u00a2\2\u048a\u0487\3"+ - "\2\2\2\u048b\u048c\3\2\2\2\u048c\u048a\3\2\2\2\u048c\u048d\3\2\2\2\u048d"+ - "\u048e\3\2\2\2\u048e\u048f\b\u0089\2\2\u048f\u0113\3\2\2\2\u0490\u0492"+ - "\7\62\2\2\u0491\u0493\t\5\2\2\u0492\u0491\3\2\2\2\u0492\u0493\3\2\2\2"+ - "\u0493\u0498\3\2\2\2\u0494\u0496\7a\2\2\u0495\u0494\3\2\2\2\u0495\u0496"+ - "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0499\5\u0140\u00a0\2\u0498\u0495\3"+ - "\2\2\2\u0499\u049a\3\2\2\2\u049a\u0498\3\2\2\2\u049a\u049b\3\2\2\2\u049b"+ - "\u049c\3\2\2\2\u049c\u049d\b\u008a\2\2\u049d\u0115\3\2\2\2\u049e\u049f"+ - "\7\62\2\2\u049f\u04a4\t\6\2\2\u04a0\u04a2\7a\2\2\u04a1\u04a0\3\2\2\2\u04a1"+ - "\u04a2\3\2\2\2\u04a2\u04a3\3\2\2\2\u04a3\u04a5\5\u0142\u00a1\2\u04a4\u04a1"+ - "\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a4\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7"+ - "\u04a8\3\2\2\2\u04a8\u04a9\b\u008b\2\2\u04a9\u0117\3\2\2\2\u04aa\u04ab"+ - "\7\62\2\2\u04ab\u04ac\t\6\2\2\u04ac\u04ad\5\u011a\u008d\2\u04ad\u04ae"+ - "\5\u011c\u008e\2\u04ae\u0119\3\2\2\2\u04af\u04b1\7a\2\2\u04b0\u04af\3"+ - "\2\2\2\u04b0\u04b1\3\2\2\2\u04b1\u04b2\3\2\2\2\u04b2\u04b4\5\u0142\u00a1"+ - "\2\u04b3\u04b0\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b3\3\2\2\2\u04b5\u04b6"+ - "\3\2\2\2\u04b6\u04c1\3\2\2\2\u04b7\u04be\7\60\2\2\u04b8\u04ba\7a\2\2\u04b9"+ - "\u04b8\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bd\5\u0142"+ - "\u00a1\2\u04bc\u04b9\3\2\2\2\u04bd\u04c0\3\2\2\2\u04be\u04bc\3\2\2\2\u04be"+ - "\u04bf\3\2\2\2\u04bf\u04c2\3\2\2\2\u04c0\u04be\3\2\2\2\u04c1\u04b7\3\2"+ - "\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04cf\3\2\2\2\u04c3\u04c4\7\60\2\2\u04c4"+ - "\u04cb\5\u0142\u00a1\2\u04c5\u04c7\7a\2\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7"+ - "\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04ca\5\u0142\u00a1\2\u04c9\u04c6\3"+ - "\2\2\2\u04ca\u04cd\3\2\2\2\u04cb\u04c9\3\2\2\2\u04cb\u04cc\3\2\2\2\u04cc"+ - "\u04cf\3\2\2\2\u04cd\u04cb\3\2\2\2\u04ce\u04b3\3\2\2\2\u04ce\u04c3\3\2"+ - "\2\2\u04cf\u011b\3\2\2\2\u04d0\u04d1\t\7\2\2\u04d1\u04d2\t\b\2\2\u04d2"+ - "\u04d3\5\u013e\u009f\2\u04d3\u011d\3\2\2\2\u04d4\u04da\5\u0110\u0088\2"+ - "\u04d5\u04da\5\u0112\u0089\2\u04d6\u04da\5\u0114\u008a\2\u04d7\u04da\5"+ - "\u0116\u008b\2\u04d8\u04da\5\4\2\2\u04d9\u04d4\3\2\2\2\u04d9\u04d5\3\2"+ - "\2\2\u04d9\u04d6\3\2\2\2\u04d9\u04d7\3\2\2\2\u04d9\u04d8\3\2\2\2\u04da"+ - "\u04db\3\2\2\2\u04db\u04dc\7k\2\2\u04dc\u04dd\3\2\2\2\u04dd\u04de\b\u008f"+ - "\2\2\u04de\u011f\3\2\2\2\u04df\u04e2\7)\2\2\u04e0\u04e3\5\u013a\u009d"+ - "\2\u04e1\u04e3\5\u0124\u0092\2\u04e2\u04e0\3\2\2\2\u04e2\u04e1\3\2\2\2"+ - "\u04e3\u04e4\3\2\2\2\u04e4\u04e5\7)\2\2\u04e5\u0121\3\2\2\2\u04e6\u04e7"+ - "\5\u0120\u0090\2\u04e7\u04e8\3\2\2\2\u04e8\u04e9\b\u0091\2\2\u04e9\u0123"+ - "\3\2\2\2\u04ea\u04ed\5\u0126\u0093\2\u04eb\u04ed\5\u0128\u0094\2\u04ec"+ - "\u04ea\3\2\2\2\u04ec\u04eb\3\2\2\2\u04ed\u0125\3\2\2\2\u04ee\u04ef\7^"+ - "\2\2\u04ef\u04f0\5\u0140\u00a0\2\u04f0\u04f1\5\u0140\u00a0\2\u04f1\u04f2"+ - "\5\u0140\u00a0\2\u04f2\u0127\3\2\2\2\u04f3\u04f4\7^\2\2\u04f4\u04f5\7"+ - "z\2\2\u04f5\u04f6\5\u0142\u00a1\2\u04f6\u04f7\5\u0142\u00a1\2\u04f7\u0129"+ - "\3\2\2\2\u04f8\u04f9\7^\2\2\u04f9\u04fa\7w\2\2\u04fa\u04fb\5\u0142\u00a1"+ - "\2\u04fb\u04fc\5\u0142\u00a1\2\u04fc\u04fd\5\u0142\u00a1\2\u04fd\u04fe"+ - "\5\u0142\u00a1\2\u04fe\u012b\3\2\2\2\u04ff\u0500\7^\2\2\u0500\u0501\7"+ - "W\2\2\u0501\u0502\5\u0142\u00a1\2\u0502\u0503\5\u0142\u00a1\2\u0503\u0504"+ - "\5\u0142\u00a1\2\u0504\u0505\5\u0142\u00a1\2\u0505\u0506\5\u0142\u00a1"+ - "\2\u0506\u0507\5\u0142\u00a1\2\u0507\u0508\5\u0142\u00a1\2\u0508\u0509"+ - "\5\u0142\u00a1\2\u0509\u012d\3\2\2\2\u050a\u050e\7b\2\2\u050b\u050d\n"+ - "\t\2\2\u050c\u050b\3\2\2\2\u050d\u0510\3\2\2\2\u050e\u050c\3\2\2\2\u050e"+ - "\u050f\3\2\2\2\u050f\u0511\3\2\2\2\u0510\u050e\3\2\2\2\u0511\u0512\7b"+ - "\2\2\u0512\u0513\3\2\2\2\u0513\u0514\b\u0097\2\2\u0514\u012f\3\2\2\2\u0515"+ - "\u051a\7$\2\2\u0516\u0519\n\n\2\2\u0517\u0519\5\u013c\u009e\2\u0518\u0516"+ - "\3\2\2\2\u0518\u0517\3\2\2\2\u0519\u051c\3\2\2\2\u051a\u0518\3\2\2\2\u051a"+ - "\u051b\3\2\2\2\u051b\u051d\3\2\2\2\u051c\u051a\3\2\2\2\u051d\u051e\7$"+ - "\2\2\u051e\u051f\3\2\2\2\u051f\u0520\b\u0098\2\2\u0520\u0131\3\2\2\2\u0521"+ - "\u0523\t\13\2\2\u0522\u0521\3\2\2\2\u0523\u0524\3\2\2\2\u0524\u0522\3"+ - "\2\2\2\u0524\u0525\3\2\2\2\u0525\u0526\3\2\2\2\u0526\u0527\b\u0099\3\2"+ - "\u0527\u0133\3\2\2\2\u0528\u0529\7\61\2\2\u0529\u052a\7,\2\2\u052a\u052e"+ - "\3\2\2\2\u052b\u052d\13\2\2\2\u052c\u052b\3\2\2\2\u052d\u0530\3\2\2\2"+ - "\u052e\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0531\3\2\2\2\u0530\u052e"+ - "\3\2\2\2\u0531\u0532\7,\2\2\u0532\u0533\7\61\2\2\u0533\u0534\3\2\2\2\u0534"+ - "\u0535\b\u009a\3\2\u0535\u0135\3\2\2\2\u0536\u0538\t\f\2\2\u0537\u0536"+ - "\3\2\2\2\u0538\u0539\3\2\2\2\u0539\u0537\3\2\2\2\u0539\u053a\3\2\2\2\u053a"+ - "\u053b\3\2\2\2\u053b\u053c\b\u009b\3\2\u053c\u0137\3\2\2\2\u053d\u053e"+ - "\7\61\2\2\u053e\u053f\7\61\2\2\u053f\u0543\3\2\2\2\u0540\u0542\n\f\2\2"+ - "\u0541\u0540\3\2\2\2\u0542\u0545\3\2\2\2\u0543\u0541\3\2\2\2\u0543\u0544"+ - "\3\2\2\2\u0544\u0546\3\2\2\2\u0545\u0543\3\2\2\2\u0546\u0547\b\u009c\3"+ - "\2\u0547\u0139\3\2\2\2\u0548\u054d\n\r\2\2\u0549\u054d\5\u012a\u0095\2"+ - "\u054a\u054d\5\u012c\u0096\2\u054b\u054d\5\u013c\u009e\2\u054c\u0548\3"+ - "\2\2\2\u054c\u0549\3\2\2\2\u054c\u054a\3\2\2\2\u054c\u054b\3\2\2\2\u054d"+ - "\u013b\3\2\2\2\u054e\u0568\7^\2\2\u054f\u0550\7w\2\2\u0550\u0551\5\u0142"+ - "\u00a1\2\u0551\u0552\5\u0142\u00a1\2\u0552\u0553\5\u0142\u00a1\2\u0553"+ - "\u0554\5\u0142\u00a1\2\u0554\u0569\3\2\2\2\u0555\u0556\7W\2\2\u0556\u0557"+ - "\5\u0142\u00a1\2\u0557\u0558\5\u0142\u00a1\2\u0558\u0559\5\u0142\u00a1"+ - "\2\u0559\u055a\5\u0142\u00a1\2\u055a\u055b\5\u0142\u00a1\2\u055b\u055c"+ - "\5\u0142\u00a1\2\u055c\u055d\5\u0142\u00a1\2\u055d\u055e\5\u0142\u00a1"+ - "\2\u055e\u0569\3\2\2\2\u055f\u0569\t\16\2\2\u0560\u0561\5\u0140\u00a0"+ - "\2\u0561\u0562\5\u0140\u00a0\2\u0562\u0563\5\u0140\u00a0\2\u0563\u0569"+ - "\3\2\2\2\u0564\u0565\7z\2\2\u0565\u0566\5\u0142\u00a1\2\u0566\u0567\5"+ - "\u0142\u00a1\2\u0567\u0569\3\2\2\2\u0568\u054f\3\2\2\2\u0568\u0555\3\2"+ - "\2\2\u0568\u055f\3\2\2\2\u0568\u0560\3\2\2\2\u0568\u0564\3\2\2\2\u0569"+ - "\u013d\3\2\2\2\u056a\u0571\t\3\2\2\u056b\u056d\7a\2\2\u056c\u056b\3\2"+ - "\2\2\u056c\u056d\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u0570\t\3\2\2\u056f"+ - "\u056c\3\2\2\2\u0570\u0573\3\2\2\2\u0571\u056f\3\2\2\2\u0571\u0572\3\2"+ - "\2\2\u0572\u013f\3\2\2\2\u0573\u0571\3\2\2\2\u0574\u0575\t\17\2\2\u0575"+ - "\u0141\3\2\2\2\u0576\u0577\t\20\2\2\u0577\u0143\3\2\2\2\u0578\u0579\t"+ - "\21\2\2\u0579\u0145\3\2\2\2\u057a\u057c\t\22\2\2\u057b\u057d\t\b\2\2\u057c"+ - "\u057b\3\2\2\2\u057c\u057d\3\2\2\2\u057d\u057e\3\2\2\2\u057e\u057f\5\u013e"+ - "\u009f\2\u057f\u0147\3\2\2\2\u0580\u0583\5\u014c\u00a6\2\u0581\u0583\7"+ - "a\2\2\u0582\u0580\3\2\2\2\u0582\u0581\3\2\2\2\u0583\u0149\3\2\2\2\u0584"+ - "\u0585\t\23\2\2\u0585\u014b\3\2\2\2\u0586\u0587\t\24\2\2\u0587\u014d\3"+ - "\2\2\2\u0588\u058a\t\13\2\2\u0589\u0588\3\2\2\2\u058a\u058b\3\2\2\2\u058b"+ - "\u0589\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058d\3\2\2\2\u058d\u058e\b\u00a7"+ - "\3\2\u058e\u014f\3\2\2\2\u058f\u0590\7\61\2\2\u0590\u0591\7,\2\2\u0591"+ - "\u0595\3\2\2\2\u0592\u0594\n\f\2\2\u0593\u0592\3\2\2\2\u0594\u0597\3\2"+ - "\2\2\u0595\u0596\3\2\2\2\u0595\u0593\3\2\2\2\u0596\u0598\3\2\2\2\u0597"+ - "\u0595\3\2\2\2\u0598\u0599\7,\2\2\u0599\u059a\7\61\2\2\u059a\u059b\3\2"+ - "\2\2\u059b\u059c\b\u00a8\3\2\u059c\u0151\3\2\2\2\u059d\u059e\7\61\2\2"+ - "\u059e\u059f\7\61\2\2\u059f\u05a3\3\2\2\2\u05a0\u05a2\n\f\2\2\u05a1\u05a0"+ - "\3\2\2\2\u05a2\u05a5\3\2\2\2\u05a3\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4"+ - "\u05a6\3\2\2\2\u05a5\u05a3\3\2\2\2\u05a6\u05a7\b\u00a9\3\2\u05a7\u0153"+ - "\3\2\2\2\u05a8\u05aa\t\f\2\2\u05a9\u05a8\3\2\2\2\u05aa\u05ab\3\2\2\2\u05ab"+ - "\u05a9\3\2\2\2\u05ab\u05ac\3\2\2\2\u05ac\u05bb\3\2\2\2\u05ad\u05bb\7="+ - "\2\2\u05ae\u05af\7\61\2\2\u05af\u05b0\7,\2\2\u05b0\u05b4\3\2\2\2\u05b1"+ - "\u05b3\13\2\2\2\u05b2\u05b1\3\2\2\2\u05b3\u05b6\3\2\2\2\u05b4\u05b5\3"+ - "\2\2\2\u05b4\u05b2\3\2\2\2\u05b5\u05b7\3\2\2\2\u05b6\u05b4\3\2\2\2\u05b7"+ - "\u05b8\7,\2\2\u05b8\u05bb\7\61\2\2\u05b9\u05bb\7\2\2\3\u05ba\u05a9\3\2"+ - "\2\2\u05ba\u05ad\3\2\2\2\u05ba\u05ae\3\2\2\2\u05ba\u05b9\3\2\2\2\u05bb"+ - "\u05bc\3\2\2\2\u05bc\u05bd\b\u00aa\4\2\u05bd\u0155\3\2\2\2\u05be\u05bf"+ - "\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c1\b\u00ab\4\2\u05c1\u05c2\b\u00ab"+ - "\3\2\u05c2\u0157\3\2\2\2\64\2\3\u015a\u0162\u0165\u0168\u016e\u0170\u040d"+ - "\u040f\u0478\u047d\u0480\u0487\u048c\u0492\u0495\u049a\u04a1\u04a6\u04b0"+ - "\u04b5\u04b9\u04be\u04c1\u04c6\u04cb\u04ce\u04d9\u04e2\u04ec\u050e\u0518"+ - "\u051a\u0524\u052e\u0539\u0543\u054c\u0568\u056c\u0571\u057c\u0582\u058b"+ - "\u0595\u05a3\u05ab\u05b4\u05ba\5\4\3\2\2\3\2\4\2\2"; + "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\3\2\3"+ + "\2\5\2\u015d\n\2\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0165\n\3\3\3\5\3\u0168\n"+ + "\3\3\3\5\3\u016b\n\3\3\3\3\3\3\3\3\3\5\3\u0171\n\3\5\3\u0173\n\3\3\4\3"+ + "\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6"+ + "\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+ + "\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3"+ + "\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3"+ + "\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16"+ + "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+ + "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21"+ + "\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+ + "\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26"+ + "\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30"+ + "\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32"+ + "\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34"+ + "\3\34\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37"+ + "\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3"+ + "!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3"+ + "\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*"+ + "\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-"+ + "\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3"+ + "\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3"+ + "\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3"+ + "\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3"+ + "\66\3\66\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\39\39\39"+ + "\39\39\39\39\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3<"+ + "\3<\3<\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?"+ + "\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A"+ + "\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3D"+ + "\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E"+ + "\3E\3E\3E\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3H\3H\3H\3H\3I\3I\3I\3I\3I\3J"+ + "\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3M\3M\3M"+ + "\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P"+ + "\3P\3P\3Q\3Q\3Q\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U"+ + "\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X"+ + "\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3["+ + "\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^"+ + "\3^\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b"+ + "\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\7d\u0416\nd\fd\16d\u0419\13d\3d\3d\3"+ + "e\3e\3f\3f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3i\3j\3j\3j\3j\3k\3k\3l\3l\3m\3"+ + "m\3n\3n\3o\3o\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3r\3r\3r\3s\3s\3s\3s\3t\3"+ + "t\3t\3u\3u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3y\3y\3y\3z\3z\3{\3{\3{\3|\3|\3"+ + "}\3}\3~\3~\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3"+ + "\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085"+ + "\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+ + "\3\u0089\5\u0089\u0481\n\u0089\3\u0089\7\u0089\u0484\n\u0089\f\u0089\16"+ + "\u0089\u0487\13\u0089\5\u0089\u0489\n\u0089\3\u0089\3\u0089\3\u008a\3"+ + "\u008a\3\u008a\5\u008a\u0490\n\u008a\3\u008a\6\u008a\u0493\n\u008a\r\u008a"+ + "\16\u008a\u0494\3\u008a\3\u008a\3\u008b\3\u008b\5\u008b\u049b\n\u008b"+ + "\3\u008b\5\u008b\u049e\n\u008b\3\u008b\6\u008b\u04a1\n\u008b\r\u008b\16"+ + "\u008b\u04a2\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\5\u008c\u04aa\n\u008c"+ + "\3\u008c\6\u008c\u04ad\n\u008c\r\u008c\16\u008c\u04ae\3\u008c\3\u008c"+ + "\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\5\u008e\u04b9\n\u008e"+ + "\3\u008e\6\u008e\u04bc\n\u008e\r\u008e\16\u008e\u04bd\3\u008e\3\u008e"+ + "\5\u008e\u04c2\n\u008e\3\u008e\7\u008e\u04c5\n\u008e\f\u008e\16\u008e"+ + "\u04c8\13\u008e\5\u008e\u04ca\n\u008e\3\u008e\3\u008e\3\u008e\5\u008e"+ + "\u04cf\n\u008e\3\u008e\7\u008e\u04d2\n\u008e\f\u008e\16\u008e\u04d5\13"+ + "\u008e\5\u008e\u04d7\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3"+ + "\u0090\3\u0090\3\u0090\3\u0090\5\u0090\u04e2\n\u0090\3\u0090\3\u0090\3"+ + "\u0090\3\u0090\3\u0091\3\u0091\3\u0091\5\u0091\u04eb\n\u0091\3\u0091\3"+ + "\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\5\u0093\u04f5\n"+ + "\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095"+ + "\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+ + "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+ + "\3\u0097\3\u0097\3\u0098\3\u0098\7\u0098\u0515\n\u0098\f\u0098\16\u0098"+ + "\u0518\13\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099"+ + "\7\u0099\u0521\n\u0099\f\u0099\16\u0099\u0524\13\u0099\3\u0099\3\u0099"+ + "\3\u0099\3\u0099\3\u009a\6\u009a\u052b\n\u009a\r\u009a\16\u009a\u052c"+ + "\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\7\u009b\u0535\n\u009b"+ + "\f\u009b\16\u009b\u0538\13\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b"+ + "\3\u009c\6\u009c\u0540\n\u009c\r\u009c\16\u009c\u0541\3\u009c\3\u009c"+ + "\3\u009d\3\u009d\3\u009d\3\u009d\7\u009d\u054a\n\u009d\f\u009d\16\u009d"+ + "\u054d\13\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e"+ + "\u0555\n\u009e\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+ + "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+ + "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+ + "\3\u009f\5\u009f\u0571\n\u009f\3\u00a0\3\u00a0\5\u00a0\u0575\n\u00a0\3"+ + "\u00a0\7\u00a0\u0578\n\u00a0\f\u00a0\16\u00a0\u057b\13\u00a0\3\u00a1\3"+ + "\u00a1\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\5\u00a4\u0585\n"+ + "\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\5\u00a5\u058b\n\u00a5\3\u00a6\3"+ + "\u00a6\3\u00a7\3\u00a7\3\u00a8\6\u00a8\u0592\n\u00a8\r\u00a8\16\u00a8"+ + "\u0593\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9\u059c\n"+ + "\u00a9\f\u00a9\16\u00a9\u059f\13\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9"+ + "\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\7\u00aa\u05aa\n\u00aa\f\u00aa"+ + "\16\u00aa\u05ad\13\u00aa\3\u00aa\3\u00aa\3\u00ab\6\u00ab\u05b2\n\u00ab"+ + "\r\u00ab\16\u00ab\u05b3\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\7\u00ab"+ + "\u05bb\n\u00ab\f\u00ab\16\u00ab\u05be\13\u00ab\3\u00ab\3\u00ab\3\u00ab"+ + "\5\u00ab\u05c3\n\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac"+ + "\3\u00ac\5\u0536\u059d\u05bc\2\u00ad\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22"+ + "\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30"+ + "\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\"+ + "/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084"+ + "C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I\u0092J\u0094K\u0096L\u0098"+ + "M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00ac"+ + "W\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0"+ + "a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4"+ + "k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8"+ + "u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc"+ + "\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104\u0083\u0106\u0084\u0108"+ + "\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110\u0089\u0112\u008a\u0114"+ + "\u008b\u0116\u008c\u0118\u008d\u011a\u008e\u011c\2\u011e\2\u0120\u008f"+ + "\u0122\2\u0124\u0090\u0126\u0091\u0128\u0092\u012a\u0093\u012c\u0094\u012e"+ + "\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136\u0099\u0138\u009a\u013a"+ + "\u009b\u013c\2\u013e\2\u0140\2\u0142\2\u0144\2\u0146\2\u0148\2\u014a\2"+ + "\u014c\2\u014e\2\u0150\u009c\u0152\u009d\u0154\u009e\u0156\u009f\u0158"+ + "\u00a0\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--"+ + "//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13\2$$))"+ + "^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;\2\u0662"+ + "\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8\2\u09f1"+ + "\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1\2\u0c68"+ + "\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52\2\u0e5b"+ + "\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b\2\u17e2"+ + "\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82\2\u1a8b"+ + "\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b\2\u1c52"+ + "\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2\2\ua9db"+ + "\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b\2\u04a2"+ + "\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2\3\u11db"+ + "\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b\3\u16c2"+ + "\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52\3\u1d5b"+ + "\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b\3\u024b"+ + "\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc\2\u00c2"+ + "\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2\2\u02e6"+ + "\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379\2\u037c"+ + "\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e\2\u038e"+ + "\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531\2\u0533"+ + "\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2\2\u05f4"+ + "\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7\2\u06e7"+ + "\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712\2\u0712"+ + "\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec\2\u07f6"+ + "\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826\2\u0826"+ + "\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6\2\u08b8"+ + "\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a\2\u0963"+ + "\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa\2\u09ac"+ + "\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0\2\u09d0"+ + "\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe\2\u0a07"+ + "\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34\2\u0a35"+ + "\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60\2\u0a74"+ + "\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac\2\u0ab2"+ + "\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2\2\u0ae2"+ + "\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15\2\u0b2a"+ + "\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f\2\u0b5e"+ + "\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87\2\u0b8c"+ + "\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e\2\u0ba0"+ + "\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2\2\u0bd2"+ + "\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b\2\u0c3f"+ + "\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87\2\u0c8e"+ + "\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb\2\u0cbf"+ + "\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07\2\u0d0e"+ + "\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50\2\u0d56"+ + "\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c\2\u0db3"+ + "\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32\2\u0e34"+ + "\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89\2\u0e8a"+ + "\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1\2\u0ea3"+ + "\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf\2\u0eb2"+ + "\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8\2\u0ede"+ + "\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a\2\u0f8e"+ + "\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f\2\u1063"+ + "\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090\2\u1090"+ + "\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc\2\u10fe"+ + "\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c\2\u125f"+ + "\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7\2\u12ba"+ + "\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da\2\u1312"+ + "\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7\2\u13fa"+ + "\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2\2\u16ec"+ + "\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733\2\u1742"+ + "\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9\2\u17d9"+ + "\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa\2\u18ac"+ + "\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972\2\u1976"+ + "\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56\2\u1aa9"+ + "\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0\2\u1bb1"+ + "\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f\2\u1c82"+ + "\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02\2\u1dc1"+ + "\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f\2\u1f52"+ + "\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61\2\u1f7f"+ + "\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6\2\u1fc8"+ + "\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4\2\u1ff6"+ + "\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e\2\u2104"+ + "\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b\2\u211f"+ + "\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f\2\u2131"+ + "\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185\2\u2186"+ + "\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0\2\u2cf4"+ + "\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32\2\u2d69"+ + "\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0\2\u2db2"+ + "\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2\2\u2dd8"+ + "\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037\2\u303d"+ + "\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe\2\u3101"+ + "\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201\2\u3402"+ + "\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502\2\ua60e"+ + "\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f\2\ua6a2"+ + "\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2\2\ua7b9"+ + "\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824\2\ua842"+ + "\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff\2\ua8ff"+ + "\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4\2\ua9d1"+ + "\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02\2\uaa2a"+ + "\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c\2\uaa80"+ + "\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2\2\uaac2"+ + "\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6\2\uab03"+ + "\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a\2\uab30"+ + "\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5\2\ud7b2"+ + "\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02\2\ufb08"+ + "\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38\2\ufb3a"+ + "\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48\2\ufbb3"+ + "\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd\2\ufe72"+ + "\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68\2\uffc0"+ + "\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde\2\2\3"+ + "\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e\3\u02a2"+ + "\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352\3\u0377"+ + "\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f\3\u04b2"+ + "\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602\3\u0738"+ + "\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a\3\u080c"+ + "\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862\3\u0878"+ + "\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917\3\u0922"+ + "\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12\3\u0a15"+ + "\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e\3\u0ac2"+ + "\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62\3\u0b74"+ + "\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4\3\u1005"+ + "\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152\3\u1174"+ + "\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc\3\u11de"+ + "\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a\3\u128a"+ + "\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0\3\u1307"+ + "\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334\3\u1335"+ + "\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363\3\u1402"+ + "\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9\3\u14c9"+ + "\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646\3\u1682"+ + "\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02\3\u1a02"+ + "\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85\3\u1a88"+ + "\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42\3\u1c42"+ + "\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32\3\u1d48"+ + "\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402\3\u4648"+ + "\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31\3\u6b42"+ + "\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52\3\u6f52"+ + "\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4\3\ub002"+ + "\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82\3\ubc8a"+ + "\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1\3\ud4a4"+ + "\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd\3\ud4bd"+ + "\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516\3\ud518"+ + "\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548\3\ud548"+ + "\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc\3\ud6de"+ + "\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752\3\ud770"+ + "\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd\3\ue802"+ + "\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23\3\uee24"+ + "\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39\3\uee3b"+ + "\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b\3\uee4b"+ + "\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56\3\uee59"+ + "\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61\3\uee61"+ + "\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74\3\uee76"+ + "\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d\3\uee9d"+ + "\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4\ua702\4"+ + "\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802\4\ufa1f"+ + "\4\u05f6\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2"+ + "\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3"+ + "\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2"+ + "$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60"+ + "\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2"+ + "\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H"+ + "\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2"+ + "\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2"+ + "\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2"+ + "n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3"+ + "\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3"+ + "\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2"+ + "\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2\2\2\u0096"+ + "\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2"+ + "\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8"+ + "\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0\3\2\2"+ + "\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2\2\2\u00ba"+ + "\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2\3\2\2"+ + "\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2\2\2\u00cc"+ + "\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4\3\2\2"+ + "\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2\2\2\u00de"+ + "\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6\3\2\2"+ + "\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2\2\2\u00f0"+ + "\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8\3\2\2"+ + "\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2\2\2\u0102"+ + "\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a\3\2\2"+ + "\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2\2\2\u0114"+ + "\3\2\2\2\2\u0116\3\2\2\2\2\u0118\3\2\2\2\2\u011a\3\2\2\2\2\u0120\3\2\2"+ + "\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2\2\2\u012c"+ + "\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134\3\2\2"+ + "\2\2\u0136\3\2\2\2\2\u0138\3\2\2\2\2\u013a\3\2\2\2\3\u0150\3\2\2\2\3\u0152"+ + "\3\2\2\2\3\u0154\3\2\2\2\3\u0156\3\2\2\2\3\u0158\3\2\2\2\4\u015c\3\2\2"+ + "\2\6\u0172\3\2\2\2\b\u0174\3\2\2\2\n\u017b\3\2\2\2\f\u0183\3\2\2\2\16"+ + "\u018a\3\2\2\2\20\u0191\3\2\2\2\22\u0198\3\2\2\2\24\u019f\3\2\2\2\26\u01a8"+ + "\3\2\2\2\30\u01b2\3\2\2\2\32\u01ba\3\2\2\2\34\u01c4\3\2\2\2\36\u01d0\3"+ + "\2\2\2 \u01d7\3\2\2\2\"\u01e2\3\2\2\2$\u01e5\3\2\2\2&\u01eb\3\2\2\2(\u01f4"+ + "\3\2\2\2*\u01f9\3\2\2\2,\u0200\3\2\2\2.\u0207\3\2\2\2\60\u020d\3\2\2\2"+ + "\62\u0212\3\2\2\2\64\u0219\3\2\2\2\66\u0223\3\2\2\28\u0229\3\2\2\2:\u022c"+ + "\3\2\2\2<\u022e\3\2\2\2>\u0235\3\2\2\2@\u023b\3\2\2\2B\u0248\3\2\2\2D"+ + "\u0251\3\2\2\2F\u0255\3\2\2\2H\u0259\3\2\2\2J\u025f\3\2\2\2L\u0261\3\2"+ + "\2\2N\u0264\3\2\2\2P\u0269\3\2\2\2R\u026f\3\2\2\2T\u0275\3\2\2\2V\u027c"+ + "\3\2\2\2X\u0283\3\2\2\2Z\u028c\3\2\2\2\\\u0292\3\2\2\2^\u0298\3\2\2\2"+ + "`\u029f\3\2\2\2b\u02a5\3\2\2\2d\u02ac\3\2\2\2f\u02b2\3\2\2\2h\u02bb\3"+ + "\2\2\2j\u02c3\3\2\2\2l\u02c9\3\2\2\2n\u02d0\3\2\2\2p\u02d5\3\2\2\2r\u02de"+ + "\3\2\2\2t\u02ed\3\2\2\2v\u02f3\3\2\2\2x\u02f7\3\2\2\2z\u02fa\3\2\2\2|"+ + "\u0301\3\2\2\2~\u030b\3\2\2\2\u0080\u0315\3\2\2\2\u0082\u0321\3\2\2\2"+ + "\u0084\u032a\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u033c\3\2\2\2\u008a\u0348"+ + "\3\2\2\2\u008c\u0357\3\2\2\2\u008e\u035d\3\2\2\2\u0090\u0361\3\2\2\2\u0092"+ + "\u0365\3\2\2\2\u0094\u036a\3\2\2\2\u0096\u0372\3\2\2\2\u0098\u037a\3\2"+ + "\2\2\u009a\u037f\3\2\2\2\u009c\u0389\3\2\2\2\u009e\u0390\3\2\2\2\u00a0"+ + "\u0395\3\2\2\2\u00a2\u039b\3\2\2\2\u00a4\u039e\3\2\2\2\u00a6\u03a2\3\2"+ + "\2\2\u00a8\u03a9\3\2\2\2\u00aa\u03ae\3\2\2\2\u00ac\u03b3\3\2\2\2\u00ae"+ + "\u03b8\3\2\2\2\u00b0\u03c0\3\2\2\2\u00b2\u03c7\3\2\2\2\u00b4\u03cd\3\2"+ + "\2\2\u00b6\u03db\3\2\2\2\u00b8\u03de\3\2\2\2\u00ba\u03e4\3\2\2\2\u00bc"+ + "\u03e9\3\2\2\2\u00be\u03f4\3\2\2\2\u00c0\u03f8\3\2\2\2\u00c2\u03ff\3\2"+ + "\2\2\u00c4\u0408\3\2\2\2\u00c6\u040c\3\2\2\2\u00c8\u0412\3\2\2\2\u00ca"+ + "\u041c\3\2\2\2\u00cc\u041e\3\2\2\2\u00ce\u0422\3\2\2\2\u00d0\u0424\3\2"+ + "\2\2\u00d2\u0428\3\2\2\2\u00d4\u042a\3\2\2\2\u00d6\u042e\3\2\2\2\u00d8"+ + "\u0430\3\2\2\2\u00da\u0432\3\2\2\2\u00dc\u0434\3\2\2\2\u00de\u0436\3\2"+ + "\2\2\u00e0\u0438\3\2\2\2\u00e2\u043d\3\2\2\2\u00e4\u0442\3\2\2\2\u00e6"+ + "\u0445\3\2\2\2\u00e8\u0449\3\2\2\2\u00ea\u044c\3\2\2\2\u00ec\u044f\3\2"+ + "\2\2\u00ee\u0452\3\2\2\2\u00f0\u0455\3\2\2\2\u00f2\u0457\3\2\2\2\u00f4"+ + "\u045a\3\2\2\2\u00f6\u045c\3\2\2\2\u00f8\u045f\3\2\2\2\u00fa\u0461\3\2"+ + "\2\2\u00fc\u0463\3\2\2\2\u00fe\u0465\3\2\2\2\u0100\u0468\3\2\2\2\u0102"+ + "\u046b\3\2\2\2\u0104\u046e\3\2\2\2\u0106\u0470\3\2\2\2\u0108\u0472\3\2"+ + "\2\2\u010a\u0474\3\2\2\2\u010c\u0476\3\2\2\2\u010e\u0478\3\2\2\2\u0110"+ + "\u047a\3\2\2\2\u0112\u0488\3\2\2\2\u0114\u048c\3\2\2\2\u0116\u0498\3\2"+ + "\2\2\u0118\u04a6\3\2\2\2\u011a\u04b2\3\2\2\2\u011c\u04d6\3\2\2\2\u011e"+ + "\u04d8\3\2\2\2\u0120\u04e1\3\2\2\2\u0122\u04e7\3\2\2\2\u0124\u04ee\3\2"+ + "\2\2\u0126\u04f4\3\2\2\2\u0128\u04f6\3\2\2\2\u012a\u04fb\3\2\2\2\u012c"+ + "\u0500\3\2\2\2\u012e\u0507\3\2\2\2\u0130\u0512\3\2\2\2\u0132\u051d\3\2"+ + "\2\2\u0134\u052a\3\2\2\2\u0136\u0530\3\2\2\2\u0138\u053f\3\2\2\2\u013a"+ + "\u0545\3\2\2\2\u013c\u0554\3\2\2\2\u013e\u0556\3\2\2\2\u0140\u0572\3\2"+ + "\2\2\u0142\u057c\3\2\2\2\u0144\u057e\3\2\2\2\u0146\u0580\3\2\2\2\u0148"+ + "\u0582\3\2\2\2\u014a\u058a\3\2\2\2\u014c\u058c\3\2\2\2\u014e\u058e\3\2"+ + "\2\2\u0150\u0591\3\2\2\2\u0152\u0597\3\2\2\2\u0154\u05a5\3\2\2\2\u0156"+ + "\u05c2\3\2\2\2\u0158\u05c6\3\2\2\2\u015a\u015d\5\6\3\2\u015b\u015d\5\u011a"+ + "\u008d\2\u015c\u015a\3\2\2\2\u015c\u015b\3\2\2\2\u015d\u015e\3\2\2\2\u015e"+ + "\u015f\b\2\2\2\u015f\5\3\2\2\2\u0160\u016a\5\u0140\u00a0\2\u0161\u0162"+ + "\7\60\2\2\u0162\u0164\6\3\2\2\u0163\u0165\5\u0140\u00a0\2\u0164\u0163"+ + "\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0167\3\2\2\2\u0166\u0168\5\u0148\u00a4"+ + "\2\u0167\u0166\3\2\2\2\u0167\u0168\3\2\2\2\u0168\u016b\3\2\2\2\u0169\u016b"+ + "\5\u0148\u00a4\2\u016a\u0161\3\2\2\2\u016a\u0169\3\2\2\2\u016b\u0173\3"+ + "\2\2\2\u016c\u016d\7\60\2\2\u016d\u016e\6\3\3\2\u016e\u0170\5\u0140\u00a0"+ + "\2\u016f\u0171\5\u0148\u00a4\2\u0170\u016f\3\2\2\2\u0170\u0171\3\2\2\2"+ + "\u0171\u0173\3\2\2\2\u0172\u0160\3\2\2\2\u0172\u016c\3\2\2\2\u0173\7\3"+ + "\2\2\2\u0174\u0175\7v\2\2\u0175\u0176\7t\2\2\u0176\u0177\7w\2\2\u0177"+ + "\u0178\7g\2\2\u0178\u0179\3\2\2\2\u0179\u017a\b\4\2\2\u017a\t\3\2\2\2"+ + "\u017b\u017c\7h\2\2\u017c\u017d\7c\2\2\u017d\u017e\7n\2\2\u017e\u017f"+ + "\7u\2\2\u017f\u0180\7g\2\2\u0180\u0181\3\2\2\2\u0181\u0182\b\5\2\2\u0182"+ + "\13\3\2\2\2\u0183\u0184\7c\2\2\u0184\u0185\7u\2\2\u0185\u0186\7u\2\2\u0186"+ + "\u0187\7g\2\2\u0187\u0188\7t\2\2\u0188\u0189\7v\2\2\u0189\r\3\2\2\2\u018a"+ + "\u018b\7c\2\2\u018b\u018c\7u\2\2\u018c\u018d\7u\2\2\u018d\u018e\7w\2\2"+ + "\u018e\u018f\7o\2\2\u018f\u0190\7g\2\2\u0190\17\3\2\2\2\u0191\u0192\7"+ + "k\2\2\u0192\u0193\7p\2\2\u0193\u0194\7j\2\2\u0194\u0195\7c\2\2\u0195\u0196"+ + "\7n\2\2\u0196\u0197\7g\2\2\u0197\21\3\2\2\2\u0198\u0199\7g\2\2\u0199\u019a"+ + "\7z\2\2\u019a\u019b\7j\2\2\u019b\u019c\7c\2\2\u019c\u019d\7n\2\2\u019d"+ + "\u019e\7g\2\2\u019e\23\3\2\2\2\u019f\u01a0\7t\2\2\u01a0\u01a1\7g\2\2\u01a1"+ + "\u01a2\7s\2\2\u01a2\u01a3\7w\2\2\u01a3\u01a4\7k\2\2\u01a4\u01a5\7t\2\2"+ + "\u01a5\u01a6\7g\2\2\u01a6\u01a7\7u\2\2\u01a7\25\3\2\2\2\u01a8\u01a9\7"+ + "r\2\2\u01a9\u01aa\7t\2\2\u01aa\u01ab\7g\2\2\u01ab\u01ac\7u\2\2\u01ac\u01ad"+ + "\7g\2\2\u01ad\u01ae\7t\2\2\u01ae\u01af\7x\2\2\u01af\u01b0\7g\2\2\u01b0"+ + "\u01b1\7u\2\2\u01b1\27\3\2\2\2\u01b2\u01b3\7g\2\2\u01b3\u01b4\7p\2\2\u01b4"+ + "\u01b5\7u\2\2\u01b5\u01b6\7w\2\2\u01b6\u01b7\7t\2\2\u01b7\u01b8\7g\2\2"+ + "\u01b8\u01b9\7u\2\2\u01b9\31\3\2\2\2\u01ba\u01bb\7k\2\2\u01bb\u01bc\7"+ + "p\2\2\u01bc\u01bd\7x\2\2\u01bd\u01be\7c\2\2\u01be\u01bf\7t\2\2\u01bf\u01c0"+ + "\7k\2\2\u01c0\u01c1\7c\2\2\u01c1\u01c2\7p\2\2\u01c2\u01c3\7v\2\2\u01c3"+ + "\33\3\2\2\2\u01c4\u01c5\7f\2\2\u01c5\u01c6\7g\2\2\u01c6\u01c7\7e\2\2\u01c7"+ + "\u01c8\7t\2\2\u01c8\u01c9\7g\2\2\u01c9\u01ca\7c\2\2\u01ca\u01cb\7u\2\2"+ + "\u01cb\u01cc\7g\2\2\u01cc\u01cd\7u\2\2\u01cd\u01ce\3\2\2\2\u01ce\u01cf"+ + "\b\16\2\2\u01cf\35\3\2\2\2\u01d0\u01d1\7r\2\2\u01d1\u01d2\7w\2\2\u01d2"+ + "\u01d3\7t\2\2\u01d3\u01d4\7g\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d6\b\17"+ + "\2\2\u01d6\37\3\2\2\2\u01d7\u01d8\7k\2\2\u01d8\u01d9\7o\2\2\u01d9\u01da"+ + "\7r\2\2\u01da\u01db\7n\2\2\u01db\u01dc\7g\2\2\u01dc\u01dd\7o\2\2\u01dd"+ + "\u01de\7g\2\2\u01de\u01df\7p\2\2\u01df\u01e0\7v\2\2\u01e0\u01e1\7u\2\2"+ + "\u01e1!\3\2\2\2\u01e2\u01e3\7c\2\2\u01e3\u01e4\7u\2\2\u01e4#\3\2\2\2\u01e5"+ + "\u01e6\7q\2\2\u01e6\u01e7\7n\2\2\u01e7\u01e8\7f\2\2\u01e8\u01e9\3\2\2"+ + "\2\u01e9\u01ea\b\22\2\2\u01ea%\3\2\2\2\u01eb\u01ec\7d\2\2\u01ec\u01ed"+ + "\7g\2\2\u01ed\u01ee\7h\2\2\u01ee\u01ef\7q\2\2\u01ef\u01f0\7t\2\2\u01f0"+ + "\u01f1\7g\2\2\u01f1\u01f2\3\2\2\2\u01f2\u01f3\b\23\2\2\u01f3\'\3\2\2\2"+ + "\u01f4\u01f5\7%\2\2\u01f5\u01f6\7n\2\2\u01f6\u01f7\7j\2\2\u01f7\u01f8"+ + "\7u\2\2\u01f8)\3\2\2\2\u01f9\u01fa\7h\2\2\u01fa\u01fb\7q\2\2\u01fb\u01fc"+ + "\7t\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe\7n\2\2\u01fe\u01ff\7n\2\2\u01ff"+ + "+\3\2\2\2\u0200\u0201\7g\2\2\u0201\u0202\7z\2\2\u0202\u0203\7k\2\2\u0203"+ + "\u0204\7u\2\2\u0204\u0205\7v\2\2\u0205\u0206\7u\2\2\u0206-\3\2\2\2\u0207"+ + "\u0208\7c\2\2\u0208\u0209\7e\2\2\u0209\u020a\7e\2\2\u020a\u020b\3\2\2"+ + "\2\u020b\u020c\b\27\2\2\u020c/\3\2\2\2\u020d\u020e\7h\2\2\u020e\u020f"+ + "\7q\2\2\u020f\u0210\7n\2\2\u0210\u0211\7f\2\2\u0211\61\3\2\2\2\u0212\u0213"+ + "\7w\2\2\u0213\u0214\7p\2\2\u0214\u0215\7h\2\2\u0215\u0216\7q\2\2\u0216"+ + "\u0217\7n\2\2\u0217\u0218\7f\2\2\u0218\63\3\2\2\2\u0219\u021a\7w\2\2\u021a"+ + "\u021b\7p\2\2\u021b\u021c\7h\2\2\u021c\u021d\7q\2\2\u021d\u021e\7n\2\2"+ + "\u021e\u021f\7f\2\2\u021f\u0220\7k\2\2\u0220\u0221\7p\2\2\u0221\u0222"+ + "\7i\2\2\u0222\65\3\2\2\2\u0223\u0224\7i\2\2\u0224\u0225\7j\2\2\u0225\u0226"+ + "\7q\2\2\u0226\u0227\7u\2\2\u0227\u0228\7v\2\2\u0228\67\3\2\2\2\u0229\u022a"+ + "\7k\2\2\u022a\u022b\7p\2\2\u022b9\3\2\2\2\u022c\u022d\7%\2\2\u022d;\3"+ + "\2\2\2\u022e\u022f\7u\2\2\u022f\u0230\7w\2\2\u0230\u0231\7d\2\2\u0231"+ + "\u0232\7u\2\2\u0232\u0233\7g\2\2\u0233\u0234\7v\2\2\u0234=\3\2\2\2\u0235"+ + "\u0236\7w\2\2\u0236\u0237\7p\2\2\u0237\u0238\7k\2\2\u0238\u0239\7q\2\2"+ + "\u0239\u023a\7p\2\2\u023a?\3\2\2\2\u023b\u023c\7k\2\2\u023c\u023d\7p\2"+ + "\2\u023d\u023e\7v\2\2\u023e\u023f\7g\2\2\u023f\u0240\7t\2\2\u0240\u0241"+ + "\7u\2\2\u0241\u0242\7g\2\2\u0242\u0243\7e\2\2\u0243\u0244\7v\2\2\u0244"+ + "\u0245\7k\2\2\u0245\u0246\7q\2\2\u0246\u0247\7p\2\2\u0247A\3\2\2\2\u0248"+ + "\u0249\7u\2\2\u0249\u024a\7g\2\2\u024a\u024b\7v\2\2\u024b\u024c\7o\2\2"+ + "\u024c\u024d\7k\2\2\u024d\u024e\7p\2\2\u024e\u024f\7w\2\2\u024f\u0250"+ + "\7u\2\2\u0250C\3\2\2\2\u0251\u0252\7?\2\2\u0252\u0253\7?\2\2\u0253\u0254"+ + "\7@\2\2\u0254E\3\2\2\2\u0255\u0256\7/\2\2\u0256\u0257\7/\2\2\u0257\u0258"+ + "\7,\2\2\u0258G\3\2\2\2\u0259\u025a\7c\2\2\u025a\u025b\7r\2\2\u025b\u025c"+ + "\7r\2\2\u025c\u025d\7n\2\2\u025d\u025e\7{\2\2\u025eI\3\2\2\2\u025f\u0260"+ + "\7A\2\2\u0260K\3\2\2\2\u0261\u0262\7#\2\2\u0262\u0263\7>\2\2\u0263M\3"+ + "\2\2\2\u0264\u0265\7#\2\2\u0265\u0266\7@\2\2\u0266\u0267\3\2\2\2\u0267"+ + "\u0268\b\'\2\2\u0268O\3\2\2\2\u0269\u026a\7u\2\2\u026a\u026b\7g\2\2\u026b"+ + "\u026c\7s\2\2\u026c\u026d\3\2\2\2\u026d\u026e\b(\2\2\u026eQ\3\2\2\2\u026f"+ + "\u0270\7u\2\2\u0270\u0271\7g\2\2\u0271\u0272\7v\2\2\u0272\u0273\3\2\2"+ + "\2\u0273\u0274\b)\2\2\u0274S\3\2\2\2\u0275\u0276\7o\2\2\u0276\u0277\7"+ + "u\2\2\u0277\u0278\7g\2\2\u0278\u0279\7v\2\2\u0279\u027a\3\2\2\2\u027a"+ + "\u027b\b*\2\2\u027bU\3\2\2\2\u027c\u027d\7f\2\2\u027d\u027e\7k\2\2\u027e"+ + "\u027f\7e\2\2\u027f\u0280\7v\2\2\u0280\u0281\3\2\2\2\u0281\u0282\b+\2"+ + "\2\u0282W\3\2\2\2\u0283\u0284\7q\2\2\u0284\u0285\7r\2\2\u0285\u0286\7"+ + "v\2\2\u0286\u0287\7k\2\2\u0287\u0288\7q\2\2\u0288\u0289\7p\2\2\u0289\u028a"+ + "\3\2\2\2\u028a\u028b\b,\2\2\u028bY\3\2\2\2\u028c\u028d\7n\2\2\u028d\u028e"+ + "\7g\2\2\u028e\u028f\7p\2\2\u028f\u0290\3\2\2\2\u0290\u0291\b-\2\2\u0291"+ + "[\3\2\2\2\u0292\u0293\7p\2\2\u0293\u0294\7g\2\2\u0294\u0295\7y\2\2\u0295"+ + "\u0296\3\2\2\2\u0296\u0297\b.\2\2\u0297]\3\2\2\2\u0298\u0299\7o\2\2\u0299"+ + "\u029a\7c\2\2\u029a\u029b\7m\2\2\u029b\u029c\7g\2\2\u029c\u029d\3\2\2"+ + "\2\u029d\u029e\b/\2\2\u029e_\3\2\2\2\u029f\u02a0\7e\2\2\u02a0\u02a1\7"+ + "c\2\2\u02a1\u02a2\7r\2\2\u02a2\u02a3\3\2\2\2\u02a3\u02a4\b\60\2\2\u02a4"+ + "a\3\2\2\2\u02a5\u02a6\7u\2\2\u02a6\u02a7\7q\2\2\u02a7\u02a8\7o\2\2\u02a8"+ + "\u02a9\7g\2\2\u02a9\u02aa\3\2\2\2\u02aa\u02ab\b\61\2\2\u02abc\3\2\2\2"+ + "\u02ac\u02ad\7i\2\2\u02ad\u02ae\7g\2\2\u02ae\u02af\7v\2\2\u02af\u02b0"+ + "\3\2\2\2\u02b0\u02b1\b\62\2\2\u02b1e\3\2\2\2\u02b2\u02b3\7f\2\2\u02b3"+ + "\u02b4\7q\2\2\u02b4\u02b5\7o\2\2\u02b5\u02b6\7c\2\2\u02b6\u02b7\7k\2\2"+ + "\u02b7\u02b8\7p\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02ba\b\63\2\2\u02bag\3"+ + "\2\2\2\u02bb\u02bc\7c\2\2\u02bc\u02bd\7z\2\2\u02bd\u02be\7k\2\2\u02be"+ + "\u02bf\7q\2\2\u02bf\u02c0\7o\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\b\64"+ + "\2\2\u02c2i\3\2\2\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7f\2\2\u02c5\u02c6"+ + "\7v\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c8\b\65\2\2\u02c8k\3\2\2\2\u02c9"+ + "\u02ca\7p\2\2\u02ca\u02cb\7q\2\2\u02cb\u02cc\7p\2\2\u02cc\u02cd\7g\2\2"+ + "\u02cd\u02ce\3\2\2\2\u02ce\u02cf\b\66\2\2\u02cfm\3\2\2\2\u02d0\u02d1\7"+ + "r\2\2\u02d1\u02d2\7t\2\2\u02d2\u02d3\7g\2\2\u02d3\u02d4\7f\2\2\u02d4o"+ + "\3\2\2\2\u02d5\u02d6\7v\2\2\u02d6\u02d7\7{\2\2\u02d7\u02d8\7r\2\2\u02d8"+ + "\u02d9\7g\2\2\u02d9\u02da\7Q\2\2\u02da\u02db\7h\2\2\u02db\u02dc\3\2\2"+ + "\2\u02dc\u02dd\b8\2\2\u02ddq\3\2\2\2\u02de\u02df\7k\2\2\u02df\u02e0\7"+ + "u\2\2\u02e0\u02e1\7E\2\2\u02e1\u02e2\7q\2\2\u02e2\u02e3\7o\2\2\u02e3\u02e4"+ + "\7r\2\2\u02e4\u02e5\7c\2\2\u02e5\u02e6\7t\2\2\u02e6\u02e7\7c\2\2\u02e7"+ + "\u02e8\7d\2\2\u02e8\u02e9\7n\2\2\u02e9\u02ea\7g\2\2\u02ea\u02eb\3\2\2"+ + "\2\u02eb\u02ec\b9\2\2\u02ecs\3\2\2\2\u02ed\u02ee\7u\2\2\u02ee\u02ef\7"+ + "j\2\2\u02ef\u02f0\7c\2\2\u02f0\u02f1\7t\2\2\u02f1\u02f2\7g\2\2\u02f2u"+ + "\3\2\2\2\u02f3\u02f4\7B\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f6\b;\2\2\u02f6"+ + "w\3\2\2\2\u02f7\u02f8\7\60\2\2\u02f8\u02f9\7\60\2\2\u02f9y\3\2\2\2\u02fa"+ + "\u02fb\7u\2\2\u02fb\u02fc\7j\2\2\u02fc\u02fd\7c\2\2\u02fd\u02fe\7t\2\2"+ + "\u02fe\u02ff\7g\2\2\u02ff\u0300\7f\2\2\u0300{\3\2\2\2\u0301\u0302\7g\2"+ + "\2\u0302\u0303\7z\2\2\u0303\u0304\7e\2\2\u0304\u0305\7n\2\2\u0305\u0306"+ + "\7w\2\2\u0306\u0307\7u\2\2\u0307\u0308\7k\2\2\u0308\u0309\7x\2\2\u0309"+ + "\u030a\7g\2\2\u030a}\3\2\2\2\u030b\u030c\7r\2\2\u030c\u030d\7t\2\2\u030d"+ + "\u030e\7g\2\2\u030e\u030f\7f\2\2\u030f\u0310\7k\2\2\u0310\u0311\7e\2\2"+ + "\u0311\u0312\7c\2\2\u0312\u0313\7v\2\2\u0313\u0314\7g\2\2\u0314\177\3"+ + "\2\2\2\u0315\u0316\7y\2\2\u0316\u0317\7t\2\2\u0317\u0318\7k\2\2\u0318"+ + "\u0319\7v\2\2\u0319\u031a\7g\2\2\u031a\u031b\7R\2\2\u031b\u031c\7g\2\2"+ + "\u031c\u031d\7t\2\2\u031d\u031e\7o\2\2\u031e\u031f\3\2\2\2\u031f\u0320"+ + "\b@\2\2\u0320\u0081\3\2\2\2\u0321\u0322\7p\2\2\u0322\u0323\7q\2\2\u0323"+ + "\u0324\7R\2\2\u0324\u0325\7g\2\2\u0325\u0326\7t\2\2\u0326\u0327\7o\2\2"+ + "\u0327\u0328\3\2\2\2\u0328\u0329\bA\2\2\u0329\u0083\3\2\2\2\u032a\u032b"+ + "\7v\2\2\u032b\u032c\7t\2\2\u032c\u032d\7w\2\2\u032d\u032e\7u\2\2\u032e"+ + "\u032f\7v\2\2\u032f\u0330\7g\2\2\u0330\u0331\7f\2\2\u0331\u0332\3\2\2"+ + "\2\u0332\u0333\bB\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7q\2\2\u0335\u0336"+ + "\7w\2\2\u0336\u0337\7v\2\2\u0337\u0338\7n\2\2\u0338\u0339\7k\2\2\u0339"+ + "\u033a\7p\2\2\u033a\u033b\7g\2\2\u033b\u0087\3\2\2\2\u033c\u033d\7k\2"+ + "\2\u033d\u033e\7p\2\2\u033e\u033f\7k\2\2\u033f\u0340\7v\2\2\u0340\u0341"+ + "\7G\2\2\u0341\u0342\7p\2\2\u0342\u0343\7u\2\2\u0343\u0344\7w\2\2\u0344"+ + "\u0345\7t\2\2\u0345\u0346\7g\2\2\u0346\u0347\7u\2\2\u0347\u0089\3\2\2"+ + "\2\u0348\u0349\7k\2\2\u0349\u034a\7o\2\2\u034a\u034b\7r\2\2\u034b\u034c"+ + "\7q\2\2\u034c\u034d\7t\2\2\u034d\u034e\7v\2\2\u034e\u034f\7T\2\2\u034f"+ + "\u0350\7g\2\2\u0350\u0351\7s\2\2\u0351\u0352\7w\2\2\u0352\u0353\7k\2\2"+ + "\u0353\u0354\7t\2\2\u0354\u0355\7g\2\2\u0355\u0356\7u\2\2\u0356\u008b"+ + "\3\2\2\2\u0357\u0358\7r\2\2\u0358\u0359\7t\2\2\u0359\u035a\7q\2\2\u035a"+ + "\u035b\7q\2\2\u035b\u035c\7h\2\2\u035c\u008d\3\2\2\2\u035d\u035e\7?\2"+ + "\2\u035e\u035f\7?\2\2\u035f\u0360\7?\2\2\u0360\u008f\3\2\2\2\u0361\u0362"+ + "\7#\2\2\u0362\u0363\7?\2\2\u0363\u0364\7?\2\2\u0364\u0091\3\2\2\2\u0365"+ + "\u0366\7y\2\2\u0366\u0367\7k\2\2\u0367\u0368\7v\2\2\u0368\u0369\7j\2\2"+ + "\u0369\u0093\3\2\2\2\u036a\u036b\7d\2\2\u036b\u036c\7t\2\2\u036c\u036d"+ + "\7g\2\2\u036d\u036e\7c\2\2\u036e\u036f\7m\2\2\u036f\u0370\3\2\2\2\u0370"+ + "\u0371\bJ\2\2\u0371\u0095\3\2\2\2\u0372\u0373\7f\2\2\u0373\u0374\7g\2"+ + "\2\u0374\u0375\7h\2\2\u0375\u0376\7c\2\2\u0376\u0377\7w\2\2\u0377\u0378"+ + "\7n\2\2\u0378\u0379\7v\2\2\u0379\u0097\3\2\2\2\u037a\u037b\7h\2\2\u037b"+ + "\u037c\7w\2\2\u037c\u037d\7p\2\2\u037d\u037e\7e\2\2\u037e\u0099\3\2\2"+ + "\2\u037f\u0380\7k\2\2\u0380\u0381\7p\2\2\u0381\u0382\7v\2\2\u0382\u0383"+ + "\7g\2\2\u0383\u0384\7t\2\2\u0384\u0385\7h\2\2\u0385\u0386\7c\2\2\u0386"+ + "\u0387\7e\2\2\u0387\u0388\7g\2\2\u0388\u009b\3\2\2\2\u0389\u038a\7u\2"+ + "\2\u038a\u038b\7g\2\2\u038b\u038c\7n\2\2\u038c\u038d\7g\2\2\u038d\u038e"+ + "\7e\2\2\u038e\u038f\7v\2\2\u038f\u009d\3\2\2\2\u0390\u0391\7e\2\2\u0391"+ + "\u0392\7c\2\2\u0392\u0393\7u\2\2\u0393\u0394\7g\2\2\u0394\u009f\3\2\2"+ + "\2\u0395\u0396\7f\2\2\u0396\u0397\7g\2\2\u0397\u0398\7h\2\2\u0398\u0399"+ + "\7g\2\2\u0399\u039a\7t\2\2\u039a\u00a1\3\2\2\2\u039b\u039c\7i\2\2\u039c"+ + "\u039d\7q\2\2\u039d\u00a3\3\2\2\2\u039e\u039f\7o\2\2\u039f\u03a0\7c\2"+ + "\2\u03a0\u03a1\7r\2\2\u03a1\u00a5\3\2\2\2\u03a2\u03a3\7u\2\2\u03a3\u03a4"+ + "\7v\2\2\u03a4\u03a5\7t\2\2\u03a5\u03a6\7w\2\2\u03a6\u03a7\7e\2\2\u03a7"+ + "\u03a8\7v\2\2\u03a8\u00a7\3\2\2\2\u03a9\u03aa\7e\2\2\u03aa\u03ab\7j\2"+ + "\2\u03ab\u03ac\7c\2\2\u03ac\u03ad\7p\2\2\u03ad\u00a9\3\2\2\2\u03ae\u03af"+ + "\7g\2\2\u03af\u03b0\7n\2\2\u03b0\u03b1\7u\2\2\u03b1\u03b2\7g\2\2\u03b2"+ + "\u00ab\3\2\2\2\u03b3\u03b4\7i\2\2\u03b4\u03b5\7q\2\2\u03b5\u03b6\7v\2"+ + "\2\u03b6\u03b7\7q\2\2\u03b7\u00ad\3\2\2\2\u03b8\u03b9\7r\2\2\u03b9\u03ba"+ + "\7c\2\2\u03ba\u03bb\7e\2\2\u03bb\u03bc\7m\2\2\u03bc\u03bd\7c\2\2\u03bd"+ + "\u03be\7i\2\2\u03be\u03bf\7g\2\2\u03bf\u00af\3\2\2\2\u03c0\u03c1\7u\2"+ + "\2\u03c1\u03c2\7y\2\2\u03c2\u03c3\7k\2\2\u03c3\u03c4\7v\2\2\u03c4\u03c5"+ + "\7e\2\2\u03c5\u03c6\7j\2\2\u03c6\u00b1\3\2\2\2\u03c7\u03c8\7e\2\2\u03c8"+ + "\u03c9\7q\2\2\u03c9\u03ca\7p\2\2\u03ca\u03cb\7u\2\2\u03cb\u03cc\7v\2\2"+ + "\u03cc\u00b3\3\2\2\2\u03cd\u03ce\7h\2\2\u03ce\u03cf\7c\2\2\u03cf\u03d0"+ + "\7n\2\2\u03d0\u03d1\7n\2\2\u03d1\u03d2\7v\2\2\u03d2\u03d3\7j\2\2\u03d3"+ + "\u03d4\7t\2\2\u03d4\u03d5\7q\2\2\u03d5\u03d6\7w\2\2\u03d6\u03d7\7i\2\2"+ + "\u03d7\u03d8\7j\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03da\bZ\2\2\u03da\u00b5"+ + "\3\2\2\2\u03db\u03dc\7k\2\2\u03dc\u03dd\7h\2\2\u03dd\u00b7\3\2\2\2\u03de"+ + "\u03df\7t\2\2\u03df\u03e0\7c\2\2\u03e0\u03e1\7p\2\2\u03e1\u03e2\7i\2\2"+ + "\u03e2\u03e3\7g\2\2\u03e3\u00b9\3\2\2\2\u03e4\u03e5\7v\2\2\u03e5\u03e6"+ + "\7{\2\2\u03e6\u03e7\7r\2\2\u03e7\u03e8\7g\2\2\u03e8\u00bb\3\2\2\2\u03e9"+ + "\u03ea\7e\2\2\u03ea\u03eb\7q\2\2\u03eb\u03ec\7p\2\2\u03ec\u03ed\7v\2\2"+ + "\u03ed\u03ee\7k\2\2\u03ee\u03ef\7p\2\2\u03ef\u03f0\7w\2\2\u03f0\u03f1"+ + "\7g\2\2\u03f1\u03f2\3\2\2\2\u03f2\u03f3\b^\2\2\u03f3\u00bd\3\2\2\2\u03f4"+ + "\u03f5\7h\2\2\u03f5\u03f6\7q\2\2\u03f6\u03f7\7t\2\2\u03f7\u00bf\3\2\2"+ + "\2\u03f8\u03f9\7k\2\2\u03f9\u03fa\7o\2\2\u03fa\u03fb\7r\2\2\u03fb\u03fc"+ + "\7q\2\2\u03fc\u03fd\7t\2\2\u03fd\u03fe\7v\2\2\u03fe\u00c1\3\2\2\2\u03ff"+ + "\u0400\7t\2\2\u0400\u0401\7g\2\2\u0401\u0402\7v\2\2\u0402\u0403\7w\2\2"+ + "\u0403\u0404\7t\2\2\u0404\u0405\7p\2\2\u0405\u0406\3\2\2\2\u0406\u0407"+ + "\ba\2\2\u0407\u00c3\3\2\2\2\u0408\u0409\7x\2\2\u0409\u040a\7c\2\2\u040a"+ + "\u040b\7t\2\2\u040b\u00c5\3\2\2\2\u040c\u040d\7p\2\2\u040d\u040e\7k\2"+ + "\2\u040e\u040f\7n\2\2\u040f\u0410\3\2\2\2\u0410\u0411\bc\2\2\u0411\u00c7"+ + "\3\2\2\2\u0412\u0417\5\u014a\u00a5\2\u0413\u0416\5\u014a\u00a5\2\u0414"+ + "\u0416\5\u014c\u00a6\2\u0415\u0413\3\2\2\2\u0415\u0414\3\2\2\2\u0416\u0419"+ + "\3\2\2\2\u0417\u0415\3\2\2\2\u0417\u0418\3\2\2\2\u0418\u041a\3\2\2\2\u0419"+ + "\u0417\3\2\2\2\u041a\u041b\bd\2\2\u041b\u00c9\3\2\2\2\u041c\u041d\7*\2"+ + "\2\u041d\u00cb\3\2\2\2\u041e\u041f\7+\2\2\u041f\u0420\3\2\2\2\u0420\u0421"+ + "\bf\2\2\u0421\u00cd\3\2\2\2\u0422\u0423\7}\2\2\u0423\u00cf\3\2\2\2\u0424"+ + "\u0425\7\177\2\2\u0425\u0426\3\2\2\2\u0426\u0427\bh\2\2\u0427\u00d1\3"+ + "\2\2\2\u0428\u0429\7]\2\2\u0429\u00d3\3\2\2\2\u042a\u042b\7_\2\2\u042b"+ + "\u042c\3\2\2\2\u042c\u042d\bj\2\2\u042d\u00d5\3\2\2\2\u042e\u042f\7?\2"+ + "\2\u042f\u00d7\3\2\2\2\u0430\u0431\7.\2\2\u0431\u00d9\3\2\2\2\u0432\u0433"+ + "\7=\2\2\u0433\u00db\3\2\2\2\u0434\u0435\7<\2\2\u0435\u00dd\3\2\2\2\u0436"+ + "\u0437\7\60\2\2\u0437\u00df\3\2\2\2\u0438\u0439\7-\2\2\u0439\u043a\7-"+ + "\2\2\u043a\u043b\3\2\2\2\u043b\u043c\bp\2\2\u043c\u00e1\3\2\2\2\u043d"+ + "\u043e\7/\2\2\u043e\u043f\7/\2\2\u043f\u0440\3\2\2\2\u0440\u0441\bq\2"+ + "\2\u0441\u00e3\3\2\2\2\u0442\u0443\7<\2\2\u0443\u0444\7?\2\2\u0444\u00e5"+ + "\3\2\2\2\u0445\u0446\7\60\2\2\u0446\u0447\7\60\2\2\u0447\u0448\7\60\2"+ + "\2\u0448\u00e7\3\2\2\2\u0449\u044a\7~\2\2\u044a\u044b\7~\2\2\u044b\u00e9"+ + "\3\2\2\2\u044c\u044d\7(\2\2\u044d\u044e\7(\2\2\u044e\u00eb\3\2\2\2\u044f"+ + "\u0450\7?\2\2\u0450\u0451\7?\2\2\u0451\u00ed\3\2\2\2\u0452\u0453\7#\2"+ + "\2\u0453\u0454\7?\2\2\u0454\u00ef\3\2\2\2\u0455\u0456\7>\2\2\u0456\u00f1"+ + "\3\2\2\2\u0457\u0458\7>\2\2\u0458\u0459\7?\2\2\u0459\u00f3\3\2\2\2\u045a"+ + "\u045b\7@\2\2\u045b\u00f5\3\2\2\2\u045c\u045d\7@\2\2\u045d\u045e\7?\2"+ + "\2\u045e\u00f7\3\2\2\2\u045f\u0460\7~\2\2\u0460\u00f9\3\2\2\2\u0461\u0462"+ + "\7\61\2\2\u0462\u00fb\3\2\2\2\u0463\u0464\7\'\2\2\u0464\u00fd\3\2\2\2"+ + "\u0465\u0466\7>\2\2\u0466\u0467\7>\2\2\u0467\u00ff\3\2\2\2\u0468\u0469"+ + "\7@\2\2\u0469\u046a\7@\2\2\u046a\u0101\3\2\2\2\u046b\u046c\7(\2\2\u046c"+ + "\u046d\7`\2\2\u046d\u0103\3\2\2\2\u046e\u046f\7#\2\2\u046f\u0105\3\2\2"+ + "\2\u0470\u0471\7-\2\2\u0471\u0107\3\2\2\2\u0472\u0473\7/\2\2\u0473\u0109"+ + "\3\2\2\2\u0474\u0475\7`\2\2\u0475\u010b\3\2\2\2\u0476\u0477\7,\2\2\u0477"+ + "\u010d\3\2\2\2\u0478\u0479\7(\2\2\u0479\u010f\3\2\2\2\u047a\u047b\7>\2"+ + "\2\u047b\u047c\7/\2\2\u047c\u0111\3\2\2\2\u047d\u0489\7\62\2\2\u047e\u0485"+ + "\t\2\2\2\u047f\u0481\7a\2\2\u0480\u047f\3\2\2\2\u0480\u0481\3\2\2\2\u0481"+ + "\u0482\3\2\2\2\u0482\u0484\t\3\2\2\u0483\u0480\3\2\2\2\u0484\u0487\3\2"+ + "\2\2\u0485\u0483\3\2\2\2\u0485\u0486\3\2\2\2\u0486\u0489\3\2\2\2\u0487"+ + "\u0485\3\2\2\2\u0488\u047d\3\2\2\2\u0488\u047e\3\2\2\2\u0489\u048a\3\2"+ + "\2\2\u048a\u048b\b\u0089\2\2\u048b\u0113\3\2\2\2\u048c\u048d\7\62\2\2"+ + "\u048d\u0492\t\4\2\2\u048e\u0490\7a\2\2\u048f\u048e\3\2\2\2\u048f\u0490"+ + "\3\2\2\2\u0490\u0491\3\2\2\2\u0491\u0493\5\u0146\u00a3\2\u0492\u048f\3"+ + "\2\2\2\u0493\u0494\3\2\2\2\u0494\u0492\3\2\2\2\u0494\u0495\3\2\2\2\u0495"+ + "\u0496\3\2\2\2\u0496\u0497\b\u008a\2\2\u0497\u0115\3\2\2\2\u0498\u049a"+ + "\7\62\2\2\u0499\u049b\t\5\2\2\u049a\u0499\3\2\2\2\u049a\u049b\3\2\2\2"+ + "\u049b\u04a0\3\2\2\2\u049c\u049e\7a\2\2\u049d\u049c\3\2\2\2\u049d\u049e"+ + "\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u04a1\5\u0142\u00a1\2\u04a0\u049d\3"+ + "\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a0\3\2\2\2\u04a2\u04a3\3\2\2\2\u04a3"+ + "\u04a4\3\2\2\2\u04a4\u04a5\b\u008b\2\2\u04a5\u0117\3\2\2\2\u04a6\u04a7"+ + "\7\62\2\2\u04a7\u04ac\t\6\2\2\u04a8\u04aa\7a\2\2\u04a9\u04a8\3\2\2\2\u04a9"+ + "\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ad\5\u0144\u00a2\2\u04ac\u04a9"+ + "\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04ac\3\2\2\2\u04ae\u04af\3\2\2\2\u04af"+ + "\u04b0\3\2\2\2\u04b0\u04b1\b\u008c\2\2\u04b1\u0119\3\2\2\2\u04b2\u04b3"+ + "\7\62\2\2\u04b3\u04b4\t\6\2\2\u04b4\u04b5\5\u011c\u008e\2\u04b5\u04b6"+ + "\5\u011e\u008f\2\u04b6\u011b\3\2\2\2\u04b7\u04b9\7a\2\2\u04b8\u04b7\3"+ + "\2\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bc\5\u0144\u00a2"+ + "\2\u04bb\u04b8\3\2\2\2\u04bc\u04bd\3\2\2\2\u04bd\u04bb\3\2\2\2\u04bd\u04be"+ + "\3\2\2\2\u04be\u04c9\3\2\2\2\u04bf\u04c6\7\60\2\2\u04c0\u04c2\7a\2\2\u04c1"+ + "\u04c0\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c3\u04c5\5\u0144"+ + "\u00a2\2\u04c4\u04c1\3\2\2\2\u04c5\u04c8\3\2\2\2\u04c6\u04c4\3\2\2\2\u04c6"+ + "\u04c7\3\2\2\2\u04c7\u04ca\3\2\2\2\u04c8\u04c6\3\2\2\2\u04c9\u04bf\3\2"+ + "\2\2\u04c9\u04ca\3\2\2\2\u04ca\u04d7\3\2\2\2\u04cb\u04cc\7\60\2\2\u04cc"+ + "\u04d3\5\u0144\u00a2\2\u04cd\u04cf\7a\2\2\u04ce\u04cd\3\2\2\2\u04ce\u04cf"+ + "\3\2\2\2\u04cf\u04d0\3\2\2\2\u04d0\u04d2\5\u0144\u00a2\2\u04d1\u04ce\3"+ + "\2\2\2\u04d2\u04d5\3\2\2\2\u04d3\u04d1\3\2\2\2\u04d3\u04d4\3\2\2\2\u04d4"+ + "\u04d7\3\2\2\2\u04d5\u04d3\3\2\2\2\u04d6\u04bb\3\2\2\2\u04d6\u04cb\3\2"+ + "\2\2\u04d7\u011d\3\2\2\2\u04d8\u04d9\t\7\2\2\u04d9\u04da\t\b\2\2\u04da"+ + "\u04db\5\u0140\u00a0\2\u04db\u011f\3\2\2\2\u04dc\u04e2\5\u0112\u0089\2"+ + "\u04dd\u04e2\5\u0114\u008a\2\u04de\u04e2\5\u0116\u008b\2\u04df\u04e2\5"+ + "\u0118\u008c\2\u04e0\u04e2\5\4\2\2\u04e1\u04dc\3\2\2\2\u04e1\u04dd\3\2"+ + "\2\2\u04e1\u04de\3\2\2\2\u04e1\u04df\3\2\2\2\u04e1\u04e0\3\2\2\2\u04e2"+ + "\u04e3\3\2\2\2\u04e3\u04e4\7k\2\2\u04e4\u04e5\3\2\2\2\u04e5\u04e6\b\u0090"+ + "\2\2\u04e6\u0121\3\2\2\2\u04e7\u04ea\7)\2\2\u04e8\u04eb\5\u013c\u009e"+ + "\2\u04e9\u04eb\5\u0126\u0093\2\u04ea\u04e8\3\2\2\2\u04ea\u04e9\3\2\2\2"+ + "\u04eb\u04ec\3\2\2\2\u04ec\u04ed\7)\2\2\u04ed\u0123\3\2\2\2\u04ee\u04ef"+ + "\5\u0122\u0091\2\u04ef\u04f0\3\2\2\2\u04f0\u04f1\b\u0092\2\2\u04f1\u0125"+ + "\3\2\2\2\u04f2\u04f5\5\u0128\u0094\2\u04f3\u04f5\5\u012a\u0095\2\u04f4"+ + "\u04f2\3\2\2\2\u04f4\u04f3\3\2\2\2\u04f5\u0127\3\2\2\2\u04f6\u04f7\7^"+ + "\2\2\u04f7\u04f8\5\u0142\u00a1\2\u04f8\u04f9\5\u0142\u00a1\2\u04f9\u04fa"+ + "\5\u0142\u00a1\2\u04fa\u0129\3\2\2\2\u04fb\u04fc\7^\2\2\u04fc\u04fd\7"+ + "z\2\2\u04fd\u04fe\5\u0144\u00a2\2\u04fe\u04ff\5\u0144\u00a2\2\u04ff\u012b"+ + "\3\2\2\2\u0500\u0501\7^\2\2\u0501\u0502\7w\2\2\u0502\u0503\5\u0144\u00a2"+ + "\2\u0503\u0504\5\u0144\u00a2\2\u0504\u0505\5\u0144\u00a2\2\u0505\u0506"+ + "\5\u0144\u00a2\2\u0506\u012d\3\2\2\2\u0507\u0508\7^\2\2\u0508\u0509\7"+ + "W\2\2\u0509\u050a\5\u0144\u00a2\2\u050a\u050b\5\u0144\u00a2\2\u050b\u050c"+ + "\5\u0144\u00a2\2\u050c\u050d\5\u0144\u00a2\2\u050d\u050e\5\u0144\u00a2"+ + "\2\u050e\u050f\5\u0144\u00a2\2\u050f\u0510\5\u0144\u00a2\2\u0510\u0511"+ + "\5\u0144\u00a2\2\u0511\u012f\3\2\2\2\u0512\u0516\7b\2\2\u0513\u0515\n"+ + "\t\2\2\u0514\u0513\3\2\2\2\u0515\u0518\3\2\2\2\u0516\u0514\3\2\2\2\u0516"+ + "\u0517\3\2\2\2\u0517\u0519\3\2\2\2\u0518\u0516\3\2\2\2\u0519\u051a\7b"+ + "\2\2\u051a\u051b\3\2\2\2\u051b\u051c\b\u0098\2\2\u051c\u0131\3\2\2\2\u051d"+ + "\u0522\7$\2\2\u051e\u0521\n\n\2\2\u051f\u0521\5\u013e\u009f\2\u0520\u051e"+ + "\3\2\2\2\u0520\u051f\3\2\2\2\u0521\u0524\3\2\2\2\u0522\u0520\3\2\2\2\u0522"+ + "\u0523\3\2\2\2\u0523\u0525\3\2\2\2\u0524\u0522\3\2\2\2\u0525\u0526\7$"+ + "\2\2\u0526\u0527\3\2\2\2\u0527\u0528\b\u0099\2\2\u0528\u0133\3\2\2\2\u0529"+ + "\u052b\t\13\2\2\u052a\u0529\3\2\2\2\u052b\u052c\3\2\2\2\u052c\u052a\3"+ + "\2\2\2\u052c\u052d\3\2\2\2\u052d\u052e\3\2\2\2\u052e\u052f\b\u009a\3\2"+ + "\u052f\u0135\3\2\2\2\u0530\u0531\7\61\2\2\u0531\u0532\7,\2\2\u0532\u0536"+ + "\3\2\2\2\u0533\u0535\13\2\2\2\u0534\u0533\3\2\2\2\u0535\u0538\3\2\2\2"+ + "\u0536\u0537\3\2\2\2\u0536\u0534\3\2\2\2\u0537\u0539\3\2\2\2\u0538\u0536"+ + "\3\2\2\2\u0539\u053a\7,\2\2\u053a\u053b\7\61\2\2\u053b\u053c\3\2\2\2\u053c"+ + "\u053d\b\u009b\3\2\u053d\u0137\3\2\2\2\u053e\u0540\t\f\2\2\u053f\u053e"+ + "\3\2\2\2\u0540\u0541\3\2\2\2\u0541\u053f\3\2\2\2\u0541\u0542\3\2\2\2\u0542"+ + "\u0543\3\2\2\2\u0543\u0544\b\u009c\3\2\u0544\u0139\3\2\2\2\u0545\u0546"+ + "\7\61\2\2\u0546\u0547\7\61\2\2\u0547\u054b\3\2\2\2\u0548\u054a\n\f\2\2"+ + "\u0549\u0548\3\2\2\2\u054a\u054d\3\2\2\2\u054b\u0549\3\2\2\2\u054b\u054c"+ + "\3\2\2\2\u054c\u054e\3\2\2\2\u054d\u054b\3\2\2\2\u054e\u054f\b\u009d\3"+ + "\2\u054f\u013b\3\2\2\2\u0550\u0555\n\r\2\2\u0551\u0555\5\u012c\u0096\2"+ + "\u0552\u0555\5\u012e\u0097\2\u0553\u0555\5\u013e\u009f\2\u0554\u0550\3"+ + "\2\2\2\u0554\u0551\3\2\2\2\u0554\u0552\3\2\2\2\u0554\u0553\3\2\2\2\u0555"+ + "\u013d\3\2\2\2\u0556\u0570\7^\2\2\u0557\u0558\7w\2\2\u0558\u0559\5\u0144"+ + "\u00a2\2\u0559\u055a\5\u0144\u00a2\2\u055a\u055b\5\u0144\u00a2\2\u055b"+ + "\u055c\5\u0144\u00a2\2\u055c\u0571\3\2\2\2\u055d\u055e\7W\2\2\u055e\u055f"+ + "\5\u0144\u00a2\2\u055f\u0560\5\u0144\u00a2\2\u0560\u0561\5\u0144\u00a2"+ + "\2\u0561\u0562\5\u0144\u00a2\2\u0562\u0563\5\u0144\u00a2\2\u0563\u0564"+ + "\5\u0144\u00a2\2\u0564\u0565\5\u0144\u00a2\2\u0565\u0566\5\u0144\u00a2"+ + "\2\u0566\u0571\3\2\2\2\u0567\u0571\t\16\2\2\u0568\u0569\5\u0142\u00a1"+ + "\2\u0569\u056a\5\u0142\u00a1\2\u056a\u056b\5\u0142\u00a1\2\u056b\u0571"+ + "\3\2\2\2\u056c\u056d\7z\2\2\u056d\u056e\5\u0144\u00a2\2\u056e\u056f\5"+ + "\u0144\u00a2\2\u056f\u0571\3\2\2\2\u0570\u0557\3\2\2\2\u0570\u055d\3\2"+ + "\2\2\u0570\u0567\3\2\2\2\u0570\u0568\3\2\2\2\u0570\u056c\3\2\2\2\u0571"+ + "\u013f\3\2\2\2\u0572\u0579\t\3\2\2\u0573\u0575\7a\2\2\u0574\u0573\3\2"+ + "\2\2\u0574\u0575\3\2\2\2\u0575\u0576\3\2\2\2\u0576\u0578\t\3\2\2\u0577"+ + "\u0574\3\2\2\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2"+ + "\2\2\u057a\u0141\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057d\t\17\2\2\u057d"+ + "\u0143\3\2\2\2\u057e\u057f\t\20\2\2\u057f\u0145\3\2\2\2\u0580\u0581\t"+ + "\21\2\2\u0581\u0147\3\2\2\2\u0582\u0584\t\22\2\2\u0583\u0585\t\b\2\2\u0584"+ + "\u0583\3\2\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0587\5\u0140"+ + "\u00a0\2\u0587\u0149\3\2\2\2\u0588\u058b\5\u014e\u00a7\2\u0589\u058b\7"+ + "a\2\2\u058a\u0588\3\2\2\2\u058a\u0589\3\2\2\2\u058b\u014b\3\2\2\2\u058c"+ + "\u058d\t\23\2\2\u058d\u014d\3\2\2\2\u058e\u058f\t\24\2\2\u058f\u014f\3"+ + "\2\2\2\u0590\u0592\t\13\2\2\u0591\u0590\3\2\2\2\u0592\u0593\3\2\2\2\u0593"+ + "\u0591\3\2\2\2\u0593\u0594\3\2\2\2\u0594\u0595\3\2\2\2\u0595\u0596\b\u00a8"+ + "\3\2\u0596\u0151\3\2\2\2\u0597\u0598\7\61\2\2\u0598\u0599\7,\2\2\u0599"+ + "\u059d\3\2\2\2\u059a\u059c\n\f\2\2\u059b\u059a\3\2\2\2\u059c\u059f\3\2"+ + "\2\2\u059d\u059e\3\2\2\2\u059d\u059b\3\2\2\2\u059e\u05a0\3\2\2\2\u059f"+ + "\u059d\3\2\2\2\u05a0\u05a1\7,\2\2\u05a1\u05a2\7\61\2\2\u05a2\u05a3\3\2"+ + "\2\2\u05a3\u05a4\b\u00a9\3\2\u05a4\u0153\3\2\2\2\u05a5\u05a6\7\61\2\2"+ + "\u05a6\u05a7\7\61\2\2\u05a7\u05ab\3\2\2\2\u05a8\u05aa\n\f\2\2\u05a9\u05a8"+ + "\3\2\2\2\u05aa\u05ad\3\2\2\2\u05ab\u05a9\3\2\2\2\u05ab\u05ac\3\2\2\2\u05ac"+ + "\u05ae\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05af\b\u00aa\3\2\u05af\u0155"+ + "\3\2\2\2\u05b0\u05b2\t\f\2\2\u05b1\u05b0\3\2\2\2\u05b2\u05b3\3\2\2\2\u05b3"+ + "\u05b1\3\2\2\2\u05b3\u05b4\3\2\2\2\u05b4\u05c3\3\2\2\2\u05b5\u05c3\7="+ + "\2\2\u05b6\u05b7\7\61\2\2\u05b7\u05b8\7,\2\2\u05b8\u05bc\3\2\2\2\u05b9"+ + "\u05bb\13\2\2\2\u05ba\u05b9\3\2\2\2\u05bb\u05be\3\2\2\2\u05bc\u05bd\3"+ + "\2\2\2\u05bc\u05ba\3\2\2\2\u05bd\u05bf\3\2\2\2\u05be\u05bc\3\2\2\2\u05bf"+ + "\u05c0\7,\2\2\u05c0\u05c3\7\61\2\2\u05c1\u05c3\7\2\2\3\u05c2\u05b1\3\2"+ + "\2\2\u05c2\u05b5\3\2\2\2\u05c2\u05b6\3\2\2\2\u05c2\u05c1\3\2\2\2\u05c3"+ + "\u05c4\3\2\2\2\u05c4\u05c5\b\u00ab\4\2\u05c5\u0157\3\2\2\2\u05c6\u05c7"+ + "\3\2\2\2\u05c7\u05c8\3\2\2\2\u05c8\u05c9\b\u00ac\4\2\u05c9\u05ca\b\u00ac"+ + "\3\2\u05ca\u0159\3\2\2\2\64\2\3\u015c\u0164\u0167\u016a\u0170\u0172\u0415"+ + "\u0417\u0480\u0485\u0488\u048f\u0494\u049a\u049d\u04a2\u04a9\u04ae\u04b8"+ + "\u04bd\u04c1\u04c6\u04c9\u04ce\u04d3\u04d6\u04e1\u04ea\u04f4\u0516\u0520"+ + "\u0522\u052c\u0536\u0541\u054b\u0554\u0570\u0574\u0579\u0584\u058a\u0593"+ + "\u059d\u05ab\u05b3\u05bc\u05c2\5\4\3\2\2\3\2\4\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 045338bf7..cfa628934 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,4 +1,4 @@ -// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -11,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class GobraParser extends GobraParserBase { - static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -23,25 +23,26 @@ public class GobraParser extends GobraParserBase { FOLD=23, UNFOLD=24, UNFOLDING=25, GHOST=26, IN=27, MULTI=28, SUBSET=29, UNION=30, INTERSECTION=31, SETMINUS=32, IMPLIES=33, WAND=34, APPLY=35, QMARK=36, L_PRED=37, R_PRED=38, SEQ=39, SET=40, MSET=41, DICT=42, OPT=43, - LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, NONE=52, - PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58, - SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64, - OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70, - WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77, - DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85, - SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92, - FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99, - R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105, - COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111, - DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116, - NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121, - OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128, - PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134, - DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139, - IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143, - HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147, - INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152, - WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157; + LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, ADT=52, + NONE=53, PRED=54, TYPE_OF=55, IS_COMPARABLE=56, SHARE=57, ADDR_MOD=58, + DOT_DOT=59, SHARED=60, EXCLUSIVE=61, PREDICATE=62, WRITEPERM=63, NOPERM=64, + TRUSTED=65, OUTLINE=66, INIT_POST=67, IMPORT_PRE=68, PROOF=69, GHOST_EQUALS=70, + GHOST_NOT_EQUALS=71, WITH=72, BREAK=73, DEFAULT=74, FUNC=75, INTERFACE=76, + SELECT=77, CASE=78, DEFER=79, GO=80, MAP=81, STRUCT=82, CHAN=83, ELSE=84, + GOTO=85, PACKAGE=86, SWITCH=87, CONST=88, FALLTHROUGH=89, IF=90, RANGE=91, + TYPE=92, CONTINUE=93, FOR=94, IMPORT=95, RETURN=96, VAR=97, NIL_LIT=98, + IDENTIFIER=99, L_PAREN=100, R_PAREN=101, L_CURLY=102, R_CURLY=103, L_BRACKET=104, + R_BRACKET=105, ASSIGN=106, COMMA=107, SEMI=108, COLON=109, DOT=110, PLUS_PLUS=111, + MINUS_MINUS=112, DECLARE_ASSIGN=113, ELLIPSIS=114, LOGICAL_OR=115, LOGICAL_AND=116, + EQUALS=117, NOT_EQUALS=118, LESS=119, LESS_OR_EQUALS=120, GREATER=121, + GREATER_OR_EQUALS=122, OR=123, DIV=124, MOD=125, LSHIFT=126, RSHIFT=127, + BIT_CLEAR=128, EXCLAMATION=129, PLUS=130, MINUS=131, CARET=132, STAR=133, + AMPERSAND=134, RECEIVE=135, DECIMAL_LIT=136, BINARY_LIT=137, OCTAL_LIT=138, + HEX_LIT=139, HEX_FLOAT_LIT=140, IMAGINARY_LIT=141, RUNE_LIT=142, BYTE_VALUE=143, + OCTAL_BYTE_VALUE=144, HEX_BYTE_VALUE=145, LITTLE_U_VALUE=146, BIG_U_VALUE=147, + RAW_STRING_LIT=148, INTERPRETED_STRING_LIT=149, WS=150, COMMENT=151, TERMINATOR=152, + LINE_COMMENT=153, WS_NLSEMI=154, COMMENT_NLSEMI=155, LINE_COMMENT_NLSEMI=156, + EOS=157, OTHER=158; public static final int RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3, RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_initPost = 6, @@ -54,45 +55,45 @@ public class GobraParser extends GobraParserBase { RULE_oldLabelUse = 28, RULE_labelUse = 29, RULE_before = 30, RULE_isComparable = 31, RULE_typeOf = 32, RULE_access = 33, RULE_range = 34, RULE_seqUpdExp = 35, RULE_seqUpdClause = 36, RULE_ghostTypeLit = 37, RULE_domainType = 38, - RULE_domainClause = 39, RULE_ghostSliceType = 40, RULE_sqType = 41, RULE_specification = 42, - RULE_specStatement = 43, RULE_terminationMeasure = 44, RULE_assertion = 45, - RULE_blockWithBodyParameterInfo = 46, RULE_closureSpecInstance = 47, RULE_closureSpecParams = 48, - RULE_closureSpecParam = 49, RULE_closureImplProofStmt = 50, RULE_implementationProof = 51, - RULE_methodImplementationProof = 52, RULE_nonLocalReceiver = 53, RULE_selection = 54, - RULE_implementationProofPredicateAlias = 55, RULE_make = 56, RULE_new_ = 57, - RULE_specMember = 58, RULE_functionDecl = 59, RULE_methodDecl = 60, RULE_explicitGhostMember = 61, - RULE_fpredicateDecl = 62, RULE_predicateBody = 63, RULE_mpredicateDecl = 64, - RULE_varSpec = 65, RULE_shortVarDecl = 66, RULE_receiver = 67, RULE_parameterDecl = 68, - RULE_actualParameterDecl = 69, RULE_ghostParameterDecl = 70, RULE_parameterType = 71, - RULE_expression = 72, RULE_statement = 73, RULE_applyStmt = 74, RULE_packageStmt = 75, - RULE_specForStmt = 76, RULE_loopSpec = 77, RULE_deferStmt = 78, RULE_basicLit = 79, - RULE_primaryExpr = 80, RULE_functionLit = 81, RULE_closureDecl = 82, RULE_predConstructArgs = 83, - RULE_interfaceType = 84, RULE_predicateSpec = 85, RULE_methodSpec = 86, - RULE_type_ = 87, RULE_typeLit = 88, RULE_predType = 89, RULE_predTypeParams = 90, - RULE_literalType = 91, RULE_implicitArray = 92, RULE_slice_ = 93, RULE_low = 94, - RULE_high = 95, RULE_cap = 96, RULE_assign_op = 97, RULE_rangeClause = 98, - RULE_packageClause = 99, RULE_importPath = 100, RULE_declaration = 101, - RULE_constDecl = 102, RULE_constSpec = 103, RULE_identifierList = 104, - RULE_expressionList = 105, RULE_typeDecl = 106, RULE_typeSpec = 107, RULE_varDecl = 108, - RULE_block = 109, RULE_statementList = 110, RULE_simpleStmt = 111, RULE_expressionStmt = 112, - RULE_sendStmt = 113, RULE_incDecStmt = 114, RULE_assignment = 115, RULE_emptyStmt = 116, - RULE_labeledStmt = 117, RULE_returnStmt = 118, RULE_breakStmt = 119, RULE_continueStmt = 120, - RULE_gotoStmt = 121, RULE_fallthroughStmt = 122, RULE_ifStmt = 123, RULE_switchStmt = 124, - RULE_exprSwitchStmt = 125, RULE_exprCaseClause = 126, RULE_exprSwitchCase = 127, - RULE_typeSwitchStmt = 128, RULE_typeSwitchGuard = 129, RULE_typeCaseClause = 130, - RULE_typeSwitchCase = 131, RULE_typeList = 132, RULE_selectStmt = 133, - RULE_commClause = 134, RULE_commCase = 135, RULE_recvStmt = 136, RULE_forStmt = 137, - RULE_forClause = 138, RULE_goStmt = 139, RULE_typeName = 140, RULE_arrayType = 141, - RULE_arrayLength = 142, RULE_elementType = 143, RULE_pointerType = 144, - RULE_sliceType = 145, RULE_mapType = 146, RULE_channelType = 147, RULE_functionType = 148, - RULE_signature = 149, RULE_result = 150, RULE_parameters = 151, RULE_conversion = 152, - RULE_nonNamedType = 153, RULE_operand = 154, RULE_literal = 155, RULE_integer = 156, - RULE_operandName = 157, RULE_qualifiedIdent = 158, RULE_compositeLit = 159, - RULE_literalValue = 160, RULE_elementList = 161, RULE_keyedElement = 162, - RULE_key = 163, RULE_element = 164, RULE_structType = 165, RULE_fieldDecl = 166, - RULE_string_ = 167, RULE_embeddedField = 168, RULE_index = 169, RULE_typeAssertion = 170, - RULE_arguments = 171, RULE_methodExpr = 172, RULE_receiverType = 173, - RULE_eos = 174; + RULE_domainClause = 39, RULE_adtType = 40, RULE_adtClause = 41, RULE_ghostSliceType = 42, + RULE_sqType = 43, RULE_specification = 44, RULE_specStatement = 45, RULE_terminationMeasure = 46, + RULE_assertion = 47, RULE_blockWithBodyParameterInfo = 48, RULE_closureSpecInstance = 49, + RULE_closureSpecParams = 50, RULE_closureSpecParam = 51, RULE_closureImplProofStmt = 52, + RULE_implementationProof = 53, RULE_methodImplementationProof = 54, RULE_nonLocalReceiver = 55, + RULE_selection = 56, RULE_implementationProofPredicateAlias = 57, RULE_make = 58, + RULE_new_ = 59, RULE_specMember = 60, RULE_functionDecl = 61, RULE_methodDecl = 62, + RULE_explicitGhostMember = 63, RULE_fpredicateDecl = 64, RULE_predicateBody = 65, + RULE_mpredicateDecl = 66, RULE_varSpec = 67, RULE_shortVarDecl = 68, RULE_receiver = 69, + RULE_parameterDecl = 70, RULE_actualParameterDecl = 71, RULE_ghostParameterDecl = 72, + RULE_parameterType = 73, RULE_expression = 74, RULE_statement = 75, RULE_applyStmt = 76, + RULE_packageStmt = 77, RULE_specForStmt = 78, RULE_loopSpec = 79, RULE_deferStmt = 80, + RULE_basicLit = 81, RULE_primaryExpr = 82, RULE_functionLit = 83, RULE_closureDecl = 84, + RULE_predConstructArgs = 85, RULE_interfaceType = 86, RULE_predicateSpec = 87, + RULE_methodSpec = 88, RULE_type_ = 89, RULE_typeLit = 90, RULE_predType = 91, + RULE_predTypeParams = 92, RULE_literalType = 93, RULE_implicitArray = 94, + RULE_slice_ = 95, RULE_low = 96, RULE_high = 97, RULE_cap = 98, RULE_assign_op = 99, + RULE_rangeClause = 100, RULE_packageClause = 101, RULE_importPath = 102, + RULE_declaration = 103, RULE_constDecl = 104, RULE_constSpec = 105, RULE_identifierList = 106, + RULE_expressionList = 107, RULE_typeDecl = 108, RULE_typeSpec = 109, RULE_varDecl = 110, + RULE_block = 111, RULE_statementList = 112, RULE_simpleStmt = 113, RULE_expressionStmt = 114, + RULE_sendStmt = 115, RULE_incDecStmt = 116, RULE_assignment = 117, RULE_emptyStmt = 118, + RULE_labeledStmt = 119, RULE_returnStmt = 120, RULE_breakStmt = 121, RULE_continueStmt = 122, + RULE_gotoStmt = 123, RULE_fallthroughStmt = 124, RULE_ifStmt = 125, RULE_switchStmt = 126, + RULE_exprSwitchStmt = 127, RULE_exprCaseClause = 128, RULE_exprSwitchCase = 129, + RULE_typeSwitchStmt = 130, RULE_typeSwitchGuard = 131, RULE_typeCaseClause = 132, + RULE_typeSwitchCase = 133, RULE_typeList = 134, RULE_selectStmt = 135, + RULE_commClause = 136, RULE_commCase = 137, RULE_recvStmt = 138, RULE_forStmt = 139, + RULE_forClause = 140, RULE_goStmt = 141, RULE_typeName = 142, RULE_arrayType = 143, + RULE_arrayLength = 144, RULE_elementType = 145, RULE_pointerType = 146, + RULE_sliceType = 147, RULE_mapType = 148, RULE_channelType = 149, RULE_functionType = 150, + RULE_signature = 151, RULE_result = 152, RULE_parameters = 153, RULE_conversion = 154, + RULE_nonNamedType = 155, RULE_operand = 156, RULE_literal = 157, RULE_integer = 158, + RULE_operandName = 159, RULE_qualifiedIdent = 160, RULE_compositeLit = 161, + RULE_literalValue = 162, RULE_elementList = 163, RULE_keyedElement = 164, + RULE_key = 165, RULE_element = 166, RULE_structType = 167, RULE_fieldDecl = 168, + RULE_string_ = 169, RULE_embeddedField = 170, RULE_index = 171, RULE_typeAssertion = 172, + RULE_arguments = 173, RULE_methodExpr = 174, RULE_receiverType = 175, + RULE_eos = 176; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", @@ -103,33 +104,34 @@ private static String[] makeRuleNames() { "predicateAccess", "optionSome", "optionNone", "optionGet", "sConversion", "old", "oldLabelUse", "labelUse", "before", "isComparable", "typeOf", "access", "range", "seqUpdExp", "seqUpdClause", "ghostTypeLit", "domainType", - "domainClause", "ghostSliceType", "sqType", "specification", "specStatement", - "terminationMeasure", "assertion", "blockWithBodyParameterInfo", "closureSpecInstance", - "closureSpecParams", "closureSpecParam", "closureImplProofStmt", "implementationProof", - "methodImplementationProof", "nonLocalReceiver", "selection", "implementationProofPredicateAlias", - "make", "new_", "specMember", "functionDecl", "methodDecl", "explicitGhostMember", - "fpredicateDecl", "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl", - "receiver", "parameterDecl", "actualParameterDecl", "ghostParameterDecl", - "parameterType", "expression", "statement", "applyStmt", "packageStmt", - "specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", - "closureDecl", "predConstructArgs", "interfaceType", "predicateSpec", - "methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType", - "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause", - "packageClause", "importPath", "declaration", "constDecl", "constSpec", - "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl", - "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt", - "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt", - "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt", - "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", - "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", - "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt", - "typeName", "arrayType", "arrayLength", "elementType", "pointerType", - "sliceType", "mapType", "channelType", "functionType", "signature", "result", - "parameters", "conversion", "nonNamedType", "operand", "literal", "integer", - "operandName", "qualifiedIdent", "compositeLit", "literalValue", "elementList", - "keyedElement", "key", "element", "structType", "fieldDecl", "string_", - "embeddedField", "index", "typeAssertion", "arguments", "methodExpr", - "receiverType", "eos" + "domainClause", "adtType", "adtClause", "ghostSliceType", "sqType", "specification", + "specStatement", "terminationMeasure", "assertion", "blockWithBodyParameterInfo", + "closureSpecInstance", "closureSpecParams", "closureSpecParam", "closureImplProofStmt", + "implementationProof", "methodImplementationProof", "nonLocalReceiver", + "selection", "implementationProofPredicateAlias", "make", "new_", "specMember", + "functionDecl", "methodDecl", "explicitGhostMember", "fpredicateDecl", + "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl", "receiver", + "parameterDecl", "actualParameterDecl", "ghostParameterDecl", "parameterType", + "expression", "statement", "applyStmt", "packageStmt", "specForStmt", + "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", "closureDecl", + "predConstructArgs", "interfaceType", "predicateSpec", "methodSpec", + "type_", "typeLit", "predType", "predTypeParams", "literalType", "implicitArray", + "slice_", "low", "high", "cap", "assign_op", "rangeClause", "packageClause", + "importPath", "declaration", "constDecl", "constSpec", "identifierList", + "expressionList", "typeDecl", "typeSpec", "varDecl", "block", "statementList", + "simpleStmt", "expressionStmt", "sendStmt", "incDecStmt", "assignment", + "emptyStmt", "labeledStmt", "returnStmt", "breakStmt", "continueStmt", + "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt", + "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard", + "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", "commClause", + "commCase", "recvStmt", "forStmt", "forClause", "goStmt", "typeName", + "arrayType", "arrayLength", "elementType", "pointerType", "sliceType", + "mapType", "channelType", "functionType", "signature", "result", "parameters", + "conversion", "nonNamedType", "operand", "literal", "integer", "operandName", + "qualifiedIdent", "compositeLit", "literalValue", "elementList", "keyedElement", + "key", "element", "structType", "fieldDecl", "string_", "embeddedField", + "index", "typeAssertion", "arguments", "methodExpr", "receiverType", + "eos" }; } public static final String[] ruleNames = makeRuleNames(); @@ -143,8 +145,8 @@ private static String[] makeLiteralNames() { "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'", "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'", "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'", - "'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'", - "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", + "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'none'", "'pred'", + "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", @@ -166,8 +168,8 @@ private static String[] makeSymbolicNames() { "UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", - "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", - "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", + "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", + "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", @@ -260,9 +262,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(350); + setState(354); expression(0); - setState(351); + setState(355); match(EOF); } } @@ -299,9 +301,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(353); + setState(357); statement(); - setState(354); + setState(358); match(EOF); } } @@ -338,9 +340,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(356); + setState(360); type_(); - setState(357); + setState(361); match(EOF); } } @@ -384,21 +386,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis try { enterOuterAlt(_localctx, 1); { - setState(359); + setState(363); maybeAddressableIdentifier(); - setState(364); + setState(368); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(360); + setState(364); match(COMMA); - setState(361); + setState(365); maybeAddressableIdentifier(); } } - setState(366); + setState(370); _errHandler.sync(this); _la = _input.LA(1); } @@ -436,14 +438,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro try { enterOuterAlt(_localctx, 1); { - setState(367); + setState(371); match(IDENTIFIER); - setState(369); + setState(373); _errHandler.sync(this); _la = _input.LA(1); if (_la==ADDR_MOD) { { - setState(368); + setState(372); match(ADDR_MOD); } } @@ -520,79 +522,79 @@ public final SourceFileContext sourceFile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(376); + setState(380); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(371); + setState(375); initPost(); - setState(372); + setState(376); eos(); } } - setState(378); + setState(382); _errHandler.sync(this); _la = _input.LA(1); } - setState(379); + setState(383); packageClause(); - setState(380); + setState(384); eos(); - setState(386); + setState(390); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(381); + setState(385); importDecl(); - setState(382); + setState(386); eos(); } } - setState(388); + setState(392); _errHandler.sync(this); _la = _input.LA(1); } - setState(398); + setState(402); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (CONST - 74)) | (1L << (TYPE - 74)) | (1L << (VAR - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { + while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (CONST - 75)) | (1L << (TYPE - 75)) | (1L << (VAR - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) { { { - setState(392); + setState(396); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: { - setState(389); + setState(393); specMember(); } break; case 2: { - setState(390); + setState(394); declaration(); } break; case 3: { - setState(391); + setState(395); ghostMember(); } break; } - setState(394); + setState(398); eos(); } } - setState(400); + setState(404); _errHandler.sync(this); _la = _input.LA(1); } - setState(401); + setState(405); match(EOF); } } @@ -629,9 +631,9 @@ public final InitPostContext initPost() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(403); + setState(407); match(INIT_POST); - setState(404); + setState(408); expression(0); } } @@ -668,9 +670,9 @@ public final ImportPreContext importPre() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(406); + setState(410); match(IMPORT_PRE); - setState(407); + setState(411); expression(0); } } @@ -722,28 +724,28 @@ public final ImportSpecContext importSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(414); + setState(418); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(409); + setState(413); importPre(); - setState(410); + setState(414); eos(); } } - setState(416); + setState(420); _errHandler.sync(this); _la = _input.LA(1); } - setState(418); + setState(422); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER || _la==DOT) { { - setState(417); + setState(421); ((ImportSpecContext)_localctx).alias = _input.LT(1); _la = _input.LA(1); if ( !(_la==IDENTIFIER || _la==DOT) ) { @@ -757,7 +759,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { } } - setState(420); + setState(424); importPath(); } } @@ -812,56 +814,56 @@ public final ImportDeclContext importDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(427); + setState(431); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(422); + setState(426); importPre(); - setState(423); + setState(427); eos(); } } - setState(429); + setState(433); _errHandler.sync(this); _la = _input.LA(1); } - setState(443); + setState(447); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: { - setState(430); + setState(434); match(IMPORT); - setState(431); + setState(435); importSpec(); } break; case 2: { - setState(432); + setState(436); match(IMPORT); - setState(433); + setState(437); match(L_PAREN); - setState(439); + setState(443); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (IMPORT_PRE - 67)) | (1L << (IDENTIFIER - 67)) | (1L << (DOT - 67)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { + while (((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (IMPORT_PRE - 68)) | (1L << (IDENTIFIER - 68)) | (1L << (DOT - 68)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { - setState(434); + setState(438); importSpec(); - setState(435); + setState(439); eos(); } } - setState(441); + setState(445); _errHandler.sync(this); _la = _input.LA(1); } - setState(442); + setState(446); match(R_PAREN); } break; @@ -907,34 +909,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException { GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState()); enterRule(_localctx, 20, RULE_ghostMember); try { - setState(449); + setState(453); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(445); + setState(449); implementationProof(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(446); + setState(450); fpredicateDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(447); + setState(451); mpredicateDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(448); + setState(452); explicitGhostMember(); } break; @@ -1010,16 +1012,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException enterRule(_localctx, 22, RULE_ghostStatement); int _la; try { - setState(457); + setState(461); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: _localctx = new ExplicitGhostStatementContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(451); + setState(455); match(GHOST); - setState(452); + setState(456); statement(); } break; @@ -1028,7 +1030,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new FoldStatementContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(453); + setState(457); ((FoldStatementContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -1039,7 +1041,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(454); + setState(458); predicateAccess(); } break; @@ -1050,7 +1052,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new ProofStatementContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(455); + setState(459); ((ProofStatementContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ASSERT) | (1L << ASSUME) | (1L << INHALE) | (1L << EXHALE))) != 0)) ) { @@ -1061,7 +1063,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(456); + setState(460); expression(0); } break; @@ -1101,7 +1103,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(459); + setState(463); statementWithSpec(); } } @@ -1141,10 +1143,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(461); + setState(465); ((StatementWithSpecContext)_localctx).specification = specification(); { - setState(462); + setState(466); outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure); } } @@ -1189,21 +1191,21 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu try { enterOuterAlt(_localctx, 1); { - setState(464); + setState(468); match(OUTLINE); - setState(465); + setState(469); match(L_PAREN); - setState(467); + setState(471); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: { - setState(466); + setState(470); statementList(); } break; } - setState(469); + setState(473); match(R_PAREN); } } @@ -1270,90 +1272,90 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState()); enterRule(_localctx, 30, RULE_ghostPrimaryExpr); try { - setState(483); + setState(487); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(471); + setState(475); range(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(472); + setState(476); access(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(473); + setState(477); typeOf(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(474); + setState(478); typeExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(475); + setState(479); isComparable(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(476); + setState(480); old(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(477); + setState(481); before(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(478); + setState(482); sConversion(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(479); + setState(483); optionNone(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(480); + setState(484); optionSome(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(481); + setState(485); optionGet(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(482); + setState(486); permission(); } break; @@ -1391,7 +1393,7 @@ public final PermissionContext permission() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(485); + setState(489); _la = _input.LA(1); if ( !(_la==WRITEPERM || _la==NOPERM) ) { _errHandler.recoverInline(this); @@ -1438,13 +1440,13 @@ public final TypeExprContext typeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(487); + setState(491); match(TYPE); - setState(488); + setState(492); match(L_BRACKET); - setState(489); + setState(493); type_(); - setState(490); + setState(494); match(R_BRACKET); } } @@ -1489,32 +1491,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(492); + setState(496); boundVariableDecl(); - setState(497); + setState(501); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(493); + setState(497); match(COMMA); - setState(494); + setState(498); boundVariableDecl(); } } } - setState(499); + setState(503); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); } - setState(501); + setState(505); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(500); + setState(504); match(COMMA); } } @@ -1562,25 +1564,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(503); + setState(507); match(IDENTIFIER); - setState(508); + setState(512); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(504); + setState(508); match(COMMA); - setState(505); + setState(509); match(IDENTIFIER); } } - setState(510); + setState(514); _errHandler.sync(this); _la = _input.LA(1); } - setState(511); + setState(515); elementType(); } } @@ -1620,17 +1622,17 @@ public final TriggersContext triggers() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(516); + setState(520); _errHandler.sync(this); _la = _input.LA(1); while (_la==L_CURLY) { { { - setState(513); + setState(517); trigger(); } } - setState(518); + setState(522); _errHandler.sync(this); _la = _input.LA(1); } @@ -1678,27 +1680,27 @@ public final TriggerContext trigger() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(519); + setState(523); match(L_CURLY); - setState(520); + setState(524); expression(0); - setState(525); + setState(529); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(521); + setState(525); match(COMMA); - setState(522); + setState(526); expression(0); } } - setState(527); + setState(531); _errHandler.sync(this); _la = _input.LA(1); } - setState(528); + setState(532); match(R_CURLY); } } @@ -1734,7 +1736,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(530); + setState(534); primaryExpr(0); } } @@ -1773,13 +1775,13 @@ public final OptionSomeContext optionSome() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(532); + setState(536); match(SOME); - setState(533); + setState(537); match(L_PAREN); - setState(534); + setState(538); expression(0); - setState(535); + setState(539); match(R_PAREN); } } @@ -1818,13 +1820,13 @@ public final OptionNoneContext optionNone() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(537); + setState(541); match(NONE); - setState(538); + setState(542); match(L_BRACKET); - setState(539); + setState(543); type_(); - setState(540); + setState(544); match(R_BRACKET); } } @@ -1863,13 +1865,13 @@ public final OptionGetContext optionGet() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(542); + setState(546); match(GET); - setState(543); + setState(547); match(L_PAREN); - setState(544); + setState(548); expression(0); - setState(545); + setState(549); match(R_PAREN); } } @@ -1912,7 +1914,7 @@ public final SConversionContext sConversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(547); + setState(551); ((SConversionContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) { @@ -1923,11 +1925,11 @@ public final SConversionContext sConversion() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(548); + setState(552); match(L_PAREN); - setState(549); + setState(553); expression(0); - setState(550); + setState(554); match(R_PAREN); } } @@ -1972,27 +1974,27 @@ public final OldContext old() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(552); + setState(556); match(OLD); - setState(557); + setState(561); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(553); + setState(557); match(L_BRACKET); - setState(554); + setState(558); oldLabelUse(); - setState(555); + setState(559); match(R_BRACKET); } } - setState(559); + setState(563); match(L_PAREN); - setState(560); + setState(564); expression(0); - setState(561); + setState(565); match(R_PAREN); } } @@ -2027,20 +2029,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException { OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState()); enterRule(_localctx, 56, RULE_oldLabelUse); try { - setState(565); + setState(569); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(563); + setState(567); labelUse(); } break; case LHS: enterOuterAlt(_localctx, 2); { - setState(564); + setState(568); match(LHS); } break; @@ -2078,7 +2080,7 @@ public final LabelUseContext labelUse() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(567); + setState(571); match(IDENTIFIER); } } @@ -2117,13 +2119,13 @@ public final BeforeContext before() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(569); + setState(573); match(BEFORE); - setState(570); + setState(574); match(L_PAREN); - setState(571); + setState(575); expression(0); - setState(572); + setState(576); match(R_PAREN); } } @@ -2162,13 +2164,13 @@ public final IsComparableContext isComparable() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(574); + setState(578); match(IS_COMPARABLE); - setState(575); + setState(579); match(L_PAREN); - setState(576); + setState(580); expression(0); - setState(577); + setState(581); match(R_PAREN); } } @@ -2207,13 +2209,13 @@ public final TypeOfContext typeOf() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(579); + setState(583); match(TYPE_OF); - setState(580); + setState(584); match(L_PAREN); - setState(581); + setState(585); expression(0); - setState(582); + setState(586); match(R_PAREN); } } @@ -2257,25 +2259,25 @@ public final AccessContext access() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(584); + setState(588); match(ACCESS); - setState(585); + setState(589); match(L_PAREN); - setState(586); + setState(590); expression(0); - setState(589); + setState(593); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(587); + setState(591); match(COMMA); - setState(588); + setState(592); expression(0); } } - setState(591); + setState(595); match(R_PAREN); } } @@ -2322,7 +2324,7 @@ public final RangeContext range() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(593); + setState(597); ((RangeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) { @@ -2333,15 +2335,15 @@ public final RangeContext range() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(594); + setState(598); match(L_BRACKET); - setState(595); + setState(599); expression(0); - setState(596); + setState(600); match(DOT_DOT); - setState(597); + setState(601); expression(0); - setState(598); + setState(602); match(R_BRACKET); } } @@ -2387,29 +2389,29 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(600); + setState(604); match(L_BRACKET); { - setState(601); + setState(605); seqUpdClause(); - setState(606); + setState(610); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(602); + setState(606); match(COMMA); - setState(603); + setState(607); seqUpdClause(); } } - setState(608); + setState(612); _errHandler.sync(this); _la = _input.LA(1); } } - setState(609); + setState(613); match(R_BRACKET); } } @@ -2449,11 +2451,11 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(611); + setState(615); expression(0); - setState(612); + setState(616); match(ASSIGN); - setState(613); + setState(617); expression(0); } } @@ -2478,6 +2480,9 @@ public GhostSliceTypeContext ghostSliceType() { public DomainTypeContext domainType() { return getRuleContext(DomainTypeContext.class,0); } + public AdtTypeContext adtType() { + return getRuleContext(AdtTypeContext.class,0); + } public GhostTypeLitContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -2493,7 +2498,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState()); enterRule(_localctx, 74, RULE_ghostTypeLit); try { - setState(618); + setState(623); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2503,24 +2508,31 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { case OPT: enterOuterAlt(_localctx, 1); { - setState(615); + setState(619); sqType(); } break; case GHOST: enterOuterAlt(_localctx, 2); { - setState(616); + setState(620); ghostSliceType(); } break; case DOM: enterOuterAlt(_localctx, 3); { - setState(617); + setState(621); domainType(); } break; + case ADT: + enterOuterAlt(_localctx, 4); + { + setState(622); + adtType(); + } + break; default: throw new NoViableAltException(this); } @@ -2570,27 +2582,27 @@ public final DomainTypeContext domainType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(620); + setState(625); match(DOM); - setState(621); + setState(626); match(L_CURLY); - setState(627); + setState(632); _errHandler.sync(this); _la = _input.LA(1); while (_la==AXIOM || _la==FUNC) { { { - setState(622); + setState(627); domainClause(); - setState(623); + setState(628); eos(); } } - setState(629); + setState(634); _errHandler.sync(this); _la = _input.LA(1); } - setState(630); + setState(635); match(R_CURLY); } } @@ -2635,32 +2647,32 @@ public final DomainClauseContext domainClause() throws RecognitionException { DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState()); enterRule(_localctx, 78, RULE_domainClause); try { - setState(641); + setState(646); _errHandler.sync(this); switch (_input.LA(1)) { case FUNC: enterOuterAlt(_localctx, 1); { - setState(632); + setState(637); match(FUNC); - setState(633); + setState(638); match(IDENTIFIER); - setState(634); + setState(639); signature(); } break; case AXIOM: enterOuterAlt(_localctx, 2); { - setState(635); + setState(640); match(AXIOM); - setState(636); + setState(641); match(L_CURLY); - setState(637); + setState(642); expression(0); - setState(638); + setState(643); eos(); - setState(639); + setState(644); match(R_CURLY); } break; @@ -2679,6 +2691,144 @@ public final DomainClauseContext domainClause() throws RecognitionException { return _localctx; } + public static class AdtTypeContext extends ParserRuleContext { + public TerminalNode ADT() { return getToken(GobraParser.ADT, 0); } + public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } + public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } + public List adtClause() { + return getRuleContexts(AdtClauseContext.class); + } + public AdtClauseContext adtClause(int i) { + return getRuleContext(AdtClauseContext.class,i); + } + public List eos() { + return getRuleContexts(EosContext.class); + } + public EosContext eos(int i) { + return getRuleContext(EosContext.class,i); + } + public AdtTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_adtType; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitAdtType(this); + else return visitor.visitChildren(this); + } + } + + public final AdtTypeContext adtType() throws RecognitionException { + AdtTypeContext _localctx = new AdtTypeContext(_ctx, getState()); + enterRule(_localctx, 80, RULE_adtType); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(648); + match(ADT); + setState(649); + match(L_CURLY); + setState(655); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==IDENTIFIER) { + { + { + setState(650); + adtClause(); + setState(651); + eos(); + } + } + setState(657); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(658); + match(R_CURLY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AdtClauseContext extends ParserRuleContext { + public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } + public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } + public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } + public List fieldDecl() { + return getRuleContexts(FieldDeclContext.class); + } + public FieldDeclContext fieldDecl(int i) { + return getRuleContext(FieldDeclContext.class,i); + } + public List eos() { + return getRuleContexts(EosContext.class); + } + public EosContext eos(int i) { + return getRuleContext(EosContext.class,i); + } + public AdtClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_adtClause; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitAdtClause(this); + else return visitor.visitChildren(this); + } + } + + public final AdtClauseContext adtClause() throws RecognitionException { + AdtClauseContext _localctx = new AdtClauseContext(_ctx, getState()); + enterRule(_localctx, 82, RULE_adtClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(660); + match(IDENTIFIER); + setState(661); + match(L_CURLY); + setState(667); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==IDENTIFIER || _la==STAR) { + { + { + setState(662); + fieldDecl(); + setState(663); + eos(); + } + } + setState(669); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(670); + match(R_CURLY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class GhostSliceTypeContext extends ParserRuleContext { public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -2699,17 +2849,17 @@ public T accept(ParseTreeVisitor visitor) { public final GhostSliceTypeContext ghostSliceType() throws RecognitionException { GhostSliceTypeContext _localctx = new GhostSliceTypeContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_ghostSliceType); + enterRule(_localctx, 84, RULE_ghostSliceType); try { enterOuterAlt(_localctx, 1); { - setState(643); + setState(672); match(GHOST); - setState(644); + setState(673); match(L_BRACKET); - setState(645); + setState(674); match(R_BRACKET); - setState(646); + setState(675); elementType(); } } @@ -2752,10 +2902,10 @@ public T accept(ParseTreeVisitor visitor) { public final SqTypeContext sqType() throws RecognitionException { SqTypeContext _localctx = new SqTypeContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_sqType); + enterRule(_localctx, 86, RULE_sqType); int _la; try { - setState(659); + setState(688); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2765,7 +2915,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(648); + setState(677); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << OPT))) != 0)) ) { @@ -2776,11 +2926,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(649); + setState(678); match(L_BRACKET); - setState(650); + setState(679); type_(); - setState(651); + setState(680); match(R_BRACKET); } } @@ -2788,15 +2938,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(653); + setState(682); ((SqTypeContext)_localctx).kind = match(DICT); - setState(654); + setState(683); match(L_BRACKET); - setState(655); + setState(684); type_(); - setState(656); + setState(685); match(R_BRACKET); - setState(657); + setState(686); type_(); } break; @@ -2851,20 +3001,20 @@ public T accept(ParseTreeVisitor visitor) { public final SpecificationContext specification() throws RecognitionException { SpecificationContext _localctx = new SpecificationContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_specification); + enterRule(_localctx, 88, RULE_specification); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(671); + setState(700); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,29,_ctx); + _alt = getInterpreter().adaptivePredict(_input,31,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(666); + setState(695); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -2872,20 +3022,20 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(661); + setState(690); specStatement(); } break; case PURE: { - setState(662); + setState(691); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(664); + setState(693); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -2893,21 +3043,21 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(668); + setState(697); eos(); } } } - setState(673); + setState(702); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,29,_ctx); + _alt = getInterpreter().adaptivePredict(_input,31,_ctx); } - setState(676); + setState(705); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(674); + setState(703); match(PURE); ((SpecificationContext)_localctx).pure = true; } @@ -2951,44 +3101,44 @@ public T accept(ParseTreeVisitor visitor) { public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_specStatement); + enterRule(_localctx, 90, RULE_specStatement); try { - setState(686); + setState(715); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(678); + setState(707); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(679); + setState(708); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(680); + setState(709); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(681); + setState(710); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(682); + setState(711); ((SpecStatementContext)_localctx).kind = match(POST); - setState(683); + setState(712); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(684); + setState(713); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(685); + setState(714); terminationMeasure(); } break; @@ -3028,28 +3178,28 @@ public T accept(ParseTreeVisitor visitor) { public final TerminationMeasureContext terminationMeasure() throws RecognitionException { TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_terminationMeasure); + enterRule(_localctx, 92, RULE_terminationMeasure); try { enterOuterAlt(_localctx, 1); { - setState(689); + setState(718); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) { case 1: { - setState(688); + setState(717); expressionList(); } break; } - setState(693); + setState(722); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { case 1: { - setState(691); + setState(720); match(IF); - setState(692); + setState(721); expression(0); } break; @@ -3084,11 +3234,11 @@ public T accept(ParseTreeVisitor visitor) { public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_assertion); + enterRule(_localctx, 94, RULE_assertion); try { - setState(697); + setState(726); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { @@ -3097,7 +3247,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(696); + setState(725); expression(0); } break; @@ -3140,37 +3290,37 @@ public T accept(ParseTreeVisitor visitor) { public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException { BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_blockWithBodyParameterInfo); + enterRule(_localctx, 96, RULE_blockWithBodyParameterInfo); try { enterOuterAlt(_localctx, 1); { - setState(699); + setState(728); match(L_CURLY); - setState(704); + setState(733); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: { - setState(700); + setState(729); match(SHARE); - setState(701); + setState(730); identifierList(); - setState(702); + setState(731); eos(); } break; } - setState(707); + setState(736); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { case 1: { - setState(706); + setState(735); statementList(); } break; } - setState(709); + setState(738); match(R_CURLY); } } @@ -3209,47 +3359,47 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecInstanceContext closureSpecInstance() throws RecognitionException { ClosureSpecInstanceContext _localctx = new ClosureSpecInstanceContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_closureSpecInstance); + enterRule(_localctx, 98, RULE_closureSpecInstance); int _la; try { enterOuterAlt(_localctx, 1); { - setState(713); + setState(742); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { - setState(711); + setState(740); qualifiedIdent(); } break; case 2: { - setState(712); + setState(741); match(IDENTIFIER); } break; } - setState(723); + setState(752); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { case 1: { - setState(715); + setState(744); match(L_CURLY); - setState(720); + setState(749); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { { - setState(716); + setState(745); closureSpecParams(); - setState(718); + setState(747); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(717); + setState(746); match(COMMA); } } @@ -3257,7 +3407,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(722); + setState(751); match(R_CURLY); } break; @@ -3299,30 +3449,30 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamsContext closureSpecParams() throws RecognitionException { ClosureSpecParamsContext _localctx = new ClosureSpecParamsContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_closureSpecParams); + enterRule(_localctx, 100, RULE_closureSpecParams); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(725); + setState(754); closureSpecParam(); - setState(730); + setState(759); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,41,_ctx); + _alt = getInterpreter().adaptivePredict(_input,43,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(726); + setState(755); match(COMMA); - setState(727); + setState(756); closureSpecParam(); } } } - setState(732); + setState(761); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,41,_ctx); + _alt = getInterpreter().adaptivePredict(_input,43,_ctx); } } } @@ -3356,23 +3506,23 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamContext closureSpecParam() throws RecognitionException { ClosureSpecParamContext _localctx = new ClosureSpecParamContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_closureSpecParam); + enterRule(_localctx, 102, RULE_closureSpecParam); try { enterOuterAlt(_localctx, 1); { - setState(735); + setState(764); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { case 1: { - setState(733); + setState(762); match(IDENTIFIER); - setState(734); + setState(763); match(COLON); } break; } - setState(737); + setState(766); expression(0); } } @@ -3412,19 +3562,19 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureImplProofStmtContext closureImplProofStmt() throws RecognitionException { ClosureImplProofStmtContext _localctx = new ClosureImplProofStmtContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_closureImplProofStmt); + enterRule(_localctx, 104, RULE_closureImplProofStmt); try { enterOuterAlt(_localctx, 1); { - setState(739); + setState(768); match(PROOF); - setState(740); + setState(769); expression(0); - setState(741); + setState(770); match(IMPL); - setState(742); + setState(771); closureSpecInstance(); - setState(743); + setState(772); block(); } } @@ -3480,57 +3630,57 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofContext implementationProof() throws RecognitionException { ImplementationProofContext _localctx = new ImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_implementationProof); + enterRule(_localctx, 106, RULE_implementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(745); + setState(774); type_(); - setState(746); + setState(775); match(IMPL); - setState(747); + setState(776); type_(); - setState(766); + setState(795); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(748); + setState(777); match(L_CURLY); - setState(754); + setState(783); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(749); + setState(778); implementationProofPredicateAlias(); - setState(750); + setState(779); eos(); } } - setState(756); + setState(785); _errHandler.sync(this); _la = _input.LA(1); } - setState(762); + setState(791); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(757); + setState(786); methodImplementationProof(); - setState(758); + setState(787); eos(); } } - setState(764); + setState(793); _errHandler.sync(this); _la = _input.LA(1); } - setState(765); + setState(794); match(R_CURLY); } break; @@ -3573,33 +3723,33 @@ public T accept(ParseTreeVisitor visitor) { public final MethodImplementationProofContext methodImplementationProof() throws RecognitionException { MethodImplementationProofContext _localctx = new MethodImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_methodImplementationProof); + enterRule(_localctx, 108, RULE_methodImplementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(769); + setState(798); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(768); + setState(797); match(PURE); } } - setState(771); + setState(800); nonLocalReceiver(); - setState(772); + setState(801); match(IDENTIFIER); - setState(773); + setState(802); signature(); - setState(775); + setState(804); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: { - setState(774); + setState(803); block(); } break; @@ -3638,36 +3788,36 @@ public T accept(ParseTreeVisitor visitor) { public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionException { NonLocalReceiverContext _localctx = new NonLocalReceiverContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_nonLocalReceiver); + enterRule(_localctx, 110, RULE_nonLocalReceiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(777); + setState(806); match(L_PAREN); - setState(779); + setState(808); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(778); + setState(807); match(IDENTIFIER); } break; } - setState(782); + setState(811); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(781); + setState(810); match(STAR); } } - setState(784); + setState(813); typeName(); - setState(785); + setState(814); match(R_PAREN); } } @@ -3704,26 +3854,26 @@ public T accept(ParseTreeVisitor visitor) { public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_selection); + enterRule(_localctx, 112, RULE_selection); try { - setState(792); + setState(821); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(787); + setState(816); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(788); + setState(817); type_(); - setState(789); + setState(818); match(DOT); - setState(790); + setState(819); match(IDENTIFIER); } break; @@ -3763,28 +3913,28 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofPredicateAliasContext implementationProofPredicateAlias() throws RecognitionException { ImplementationProofPredicateAliasContext _localctx = new ImplementationProofPredicateAliasContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_implementationProofPredicateAlias); + enterRule(_localctx, 114, RULE_implementationProofPredicateAlias); try { enterOuterAlt(_localctx, 1); { - setState(794); + setState(823); match(PRED); - setState(795); + setState(824); match(IDENTIFIER); - setState(796); + setState(825); match(DECLARE_ASSIGN); - setState(799); + setState(828); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: { - setState(797); + setState(826); selection(); } break; case 2: { - setState(798); + setState(827); operandName(); } break; @@ -3826,30 +3976,30 @@ public T accept(ParseTreeVisitor visitor) { public final MakeContext make() throws RecognitionException { MakeContext _localctx = new MakeContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_make); + enterRule(_localctx, 116, RULE_make); int _la; try { enterOuterAlt(_localctx, 1); { - setState(801); + setState(830); match(MAKE); - setState(802); + setState(831); match(L_PAREN); - setState(803); + setState(832); type_(); - setState(806); + setState(835); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(804); + setState(833); match(COMMA); - setState(805); + setState(834); expressionList(); } } - setState(808); + setState(837); match(R_PAREN); } } @@ -3884,17 +4034,17 @@ public T accept(ParseTreeVisitor visitor) { public final New_Context new_() throws RecognitionException { New_Context _localctx = new New_Context(_ctx, getState()); - enterRule(_localctx, 114, RULE_new_); + enterRule(_localctx, 118, RULE_new_); try { enterOuterAlt(_localctx, 1); { - setState(810); + setState(839); match(NEW); - setState(811); + setState(840); match(L_PAREN); - setState(812); + setState(841); type_(); - setState(813); + setState(842); match(R_PAREN); } } @@ -3933,24 +4083,24 @@ public T accept(ParseTreeVisitor visitor) { public final SpecMemberContext specMember() throws RecognitionException { SpecMemberContext _localctx = new SpecMemberContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_specMember); + enterRule(_localctx, 120, RULE_specMember); try { enterOuterAlt(_localctx, 1); { - setState(815); + setState(844); ((SpecMemberContext)_localctx).specification = specification(); - setState(818); + setState(847); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(816); + setState(845); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; case 2: { - setState(817); + setState(846); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; @@ -3995,23 +4145,23 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) throws RecognitionException { FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 118, RULE_functionDecl); + enterRule(_localctx, 122, RULE_functionDecl); try { enterOuterAlt(_localctx, 1); { - setState(820); + setState(849); match(FUNC); - setState(821); + setState(850); match(IDENTIFIER); { - setState(822); + setState(851); signature(); - setState(824); + setState(853); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { case 1: { - setState(823); + setState(852); blockWithBodyParameterInfo(); } break; @@ -4060,25 +4210,25 @@ public T accept(ParseTreeVisitor visitor) { public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws RecognitionException { MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 120, RULE_methodDecl); + enterRule(_localctx, 124, RULE_methodDecl); try { enterOuterAlt(_localctx, 1); { - setState(826); + setState(855); match(FUNC); - setState(827); + setState(856); receiver(); - setState(828); + setState(857); match(IDENTIFIER); { - setState(829); + setState(858); signature(); - setState(831); + setState(860); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(830); + setState(859); blockWithBodyParameterInfo(); } break; @@ -4118,13 +4268,13 @@ public T accept(ParseTreeVisitor visitor) { public final ExplicitGhostMemberContext explicitGhostMember() throws RecognitionException { ExplicitGhostMemberContext _localctx = new ExplicitGhostMemberContext(_ctx, getState()); - enterRule(_localctx, 122, RULE_explicitGhostMember); + enterRule(_localctx, 126, RULE_explicitGhostMember); try { enterOuterAlt(_localctx, 1); { - setState(833); + setState(862); match(GHOST); - setState(836); + setState(865); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -4135,7 +4285,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TRUSTED: case FUNC: { - setState(834); + setState(863); specMember(); } break; @@ -4143,7 +4293,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(835); + setState(864); declaration(); } break; @@ -4185,22 +4335,22 @@ public T accept(ParseTreeVisitor visitor) { public final FpredicateDeclContext fpredicateDecl() throws RecognitionException { FpredicateDeclContext _localctx = new FpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 124, RULE_fpredicateDecl); + enterRule(_localctx, 128, RULE_fpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(838); + setState(867); match(PRED); - setState(839); + setState(868); match(IDENTIFIER); - setState(840); + setState(869); parameters(); - setState(842); + setState(871); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { case 1: { - setState(841); + setState(870); predicateBody(); } break; @@ -4240,17 +4390,17 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateBodyContext predicateBody() throws RecognitionException { PredicateBodyContext _localctx = new PredicateBodyContext(_ctx, getState()); - enterRule(_localctx, 126, RULE_predicateBody); + enterRule(_localctx, 130, RULE_predicateBody); try { enterOuterAlt(_localctx, 1); { - setState(844); + setState(873); match(L_CURLY); - setState(845); + setState(874); expression(0); - setState(846); + setState(875); eos(); - setState(847); + setState(876); match(R_CURLY); } } @@ -4290,24 +4440,24 @@ public T accept(ParseTreeVisitor visitor) { public final MpredicateDeclContext mpredicateDecl() throws RecognitionException { MpredicateDeclContext _localctx = new MpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_mpredicateDecl); + enterRule(_localctx, 132, RULE_mpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(849); + setState(878); match(PRED); - setState(850); + setState(879); receiver(); - setState(851); + setState(880); match(IDENTIFIER); - setState(852); + setState(881); parameters(); - setState(854); + setState(883); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: { - setState(853); + setState(882); predicateBody(); } break; @@ -4349,13 +4499,13 @@ public T accept(ParseTreeVisitor visitor) { public final VarSpecContext varSpec() throws RecognitionException { VarSpecContext _localctx = new VarSpecContext(_ctx, getState()); - enterRule(_localctx, 130, RULE_varSpec); + enterRule(_localctx, 134, RULE_varSpec); try { enterOuterAlt(_localctx, 1); { - setState(856); + setState(885); maybeAddressableIdentifierList(); - setState(864); + setState(893); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -4365,6 +4515,7 @@ public final VarSpecContext varSpec() throws RecognitionException { case DICT: case OPT: case DOM: + case ADT: case PRED: case FUNC: case INTERFACE: @@ -4377,16 +4528,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(857); + setState(886); type_(); - setState(860); + setState(889); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(858); + setState(887); match(ASSIGN); - setState(859); + setState(888); expressionList(); } break; @@ -4395,9 +4546,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(862); + setState(891); match(ASSIGN); - setState(863); + setState(892); expressionList(); } break; @@ -4438,15 +4589,15 @@ public T accept(ParseTreeVisitor visitor) { public final ShortVarDeclContext shortVarDecl() throws RecognitionException { ShortVarDeclContext _localctx = new ShortVarDeclContext(_ctx, getState()); - enterRule(_localctx, 132, RULE_shortVarDecl); + enterRule(_localctx, 136, RULE_shortVarDecl); try { enterOuterAlt(_localctx, 1); { - setState(866); + setState(895); maybeAddressableIdentifierList(); - setState(867); + setState(896); match(DECLARE_ASSIGN); - setState(868); + setState(897); expressionList(); } } @@ -4484,36 +4635,36 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverContext receiver() throws RecognitionException { ReceiverContext _localctx = new ReceiverContext(_ctx, getState()); - enterRule(_localctx, 134, RULE_receiver); + enterRule(_localctx, 138, RULE_receiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(870); + setState(899); match(L_PAREN); - setState(872); + setState(901); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: { - setState(871); + setState(900); maybeAddressableIdentifier(); } break; } - setState(874); + setState(903); type_(); - setState(876); + setState(905); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(875); + setState(904); match(COMMA); } } - setState(878); + setState(907); match(R_PAREN); } } @@ -4548,22 +4699,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 136, RULE_parameterDecl); + enterRule(_localctx, 140, RULE_parameterDecl); try { - setState(882); + setState(911); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(880); + setState(909); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(881); + setState(910); ghostParameterDecl(); } break; @@ -4600,21 +4751,21 @@ public T accept(ParseTreeVisitor visitor) { public final ActualParameterDeclContext actualParameterDecl() throws RecognitionException { ActualParameterDeclContext _localctx = new ActualParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 138, RULE_actualParameterDecl); + enterRule(_localctx, 142, RULE_actualParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(885); + setState(914); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { case 1: { - setState(884); + setState(913); identifierList(); } break; } - setState(887); + setState(916); parameterType(); } } @@ -4650,23 +4801,23 @@ public T accept(ParseTreeVisitor visitor) { public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionException { GhostParameterDeclContext _localctx = new GhostParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 140, RULE_ghostParameterDecl); + enterRule(_localctx, 144, RULE_ghostParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(889); + setState(918); match(GHOST); - setState(891); + setState(920); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(890); + setState(919); identifierList(); } break; } - setState(893); + setState(922); parameterType(); } } @@ -4699,22 +4850,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterTypeContext parameterType() throws RecognitionException { ParameterTypeContext _localctx = new ParameterTypeContext(_ctx, getState()); - enterRule(_localctx, 142, RULE_parameterType); + enterRule(_localctx, 146, RULE_parameterType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(896); + setState(925); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(895); + setState(924); match(ELLIPSIS); } } - setState(898); + setState(927); type_(); } } @@ -4997,26 +5148,26 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _parentState = getState(); ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); ExpressionContext _prevctx = _localctx; - int _startState = 144; - enterRecursionRule(_localctx, 144, RULE_expression, _p); + int _startState = 148; + enterRecursionRule(_localctx, 148, RULE_expression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(916); + setState(945); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: { _localctx = new UnaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(901); + setState(930); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)))) != 0)) ) { + if ( !(((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)))) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -5024,7 +5175,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(902); + setState(931); expression(14); } break; @@ -5033,7 +5184,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(903); + setState(932); primaryExpr(0); } break; @@ -5042,13 +5193,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(904); + setState(933); match(UNFOLDING); - setState(905); + setState(934); predicateAccess(); - setState(906); + setState(935); match(IN); - setState(907); + setState(936); expression(2); } break; @@ -5057,7 +5208,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(909); + setState(938); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -5067,41 +5218,41 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(910); + setState(939); boundVariables(); - setState(911); + setState(940); match(COLON); - setState(912); + setState(941); match(COLON); - setState(913); + setState(942); triggers(); - setState(914); + setState(943); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(953); + setState(982); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,69,_ctx); + _alt = getInterpreter().adaptivePredict(_input,71,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(951); + setState(980); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(918); + setState(947); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(919); + setState(948); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) ) { + if ( !(((((_la - 124)) & ~0x3f) == 0 && ((1L << (_la - 124)) & ((1L << (DIV - 124)) | (1L << (MOD - 124)) | (1L << (LSHIFT - 124)) | (1L << (RSHIFT - 124)) | (1L << (BIT_CLEAR - 124)) | (1L << (STAR - 124)) | (1L << (AMPERSAND - 124)))) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -5109,7 +5260,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(920); + setState(949); expression(13); } break; @@ -5117,12 +5268,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(921); + setState(950); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(922); + setState(951); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 110)) & ~0x3f) == 0 && ((1L << (_la - 110)) & ((1L << (PLUS_PLUS - 110)) | (1L << (OR - 110)) | (1L << (PLUS - 110)) | (1L << (MINUS - 110)) | (1L << (CARET - 110)))) != 0)) ) { + if ( !(_la==WAND || ((((_la - 111)) & ~0x3f) == 0 && ((1L << (_la - 111)) & ((1L << (PLUS_PLUS - 111)) | (1L << (OR - 111)) | (1L << (PLUS - 111)) | (1L << (MINUS - 111)) | (1L << (CARET - 111)))) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -5130,7 +5281,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(923); + setState(952); expression(12); } break; @@ -5138,9 +5289,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(924); + setState(953); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(925); + setState(954); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << UNION) | (1L << INTERSECTION) | (1L << SETMINUS))) != 0)) ) { @@ -5151,7 +5302,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(926); + setState(955); expression(11); } break; @@ -5159,9 +5310,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(927); + setState(956); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(928); + setState(957); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << IN) | (1L << MULTI) | (1L << SUBSET))) != 0)) ) { @@ -5172,7 +5323,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(929); + setState(958); expression(10); } break; @@ -5180,12 +5331,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(930); + setState(959); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(931); + setState(960); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (GHOST_EQUALS - 69)) | (1L << (GHOST_NOT_EQUALS - 69)) | (1L << (EQUALS - 69)) | (1L << (NOT_EQUALS - 69)) | (1L << (LESS - 69)) | (1L << (LESS_OR_EQUALS - 69)) | (1L << (GREATER - 69)) | (1L << (GREATER_OR_EQUALS - 69)))) != 0)) ) { + if ( !(((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (GHOST_EQUALS - 70)) | (1L << (GHOST_NOT_EQUALS - 70)) | (1L << (EQUALS - 70)) | (1L << (NOT_EQUALS - 70)) | (1L << (LESS - 70)) | (1L << (LESS_OR_EQUALS - 70)) | (1L << (GREATER - 70)) | (1L << (GREATER_OR_EQUALS - 70)))) != 0)) ) { ((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this); } else { @@ -5193,7 +5344,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(932); + setState(961); expression(9); } break; @@ -5201,11 +5352,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(933); + setState(962); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(934); + setState(963); match(LOGICAL_AND); - setState(935); + setState(964); expression(7); } break; @@ -5213,11 +5364,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(936); + setState(965); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(937); + setState(966); match(LOGICAL_OR); - setState(938); + setState(967); expression(6); } break; @@ -5225,11 +5376,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(939); + setState(968); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(940); + setState(969); match(IMPLIES); - setState(941); + setState(970); expression(4); } break; @@ -5237,15 +5388,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(942); + setState(971); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(943); + setState(972); match(QMARK); - setState(944); + setState(973); expression(0); - setState(945); + setState(974); match(COLON); - setState(946); + setState(975); expression(3); } break; @@ -5253,20 +5404,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(948); + setState(977); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(949); + setState(978); match(IMPL); - setState(950); + setState(979); closureSpecInstance(); } break; } } } - setState(955); + setState(984); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,69,_ctx); + _alt = getInterpreter().adaptivePredict(_input,71,_ctx); } } } @@ -5355,148 +5506,148 @@ public T accept(ParseTreeVisitor visitor) { public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); - enterRule(_localctx, 146, RULE_statement); + enterRule(_localctx, 150, RULE_statement); try { - setState(976); + setState(1005); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(956); + setState(985); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(957); + setState(986); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(958); + setState(987); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(959); + setState(988); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(960); + setState(989); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(961); + setState(990); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(962); + setState(991); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(963); + setState(992); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(964); + setState(993); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(965); + setState(994); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(966); + setState(995); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(967); + setState(996); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(968); + setState(997); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(969); + setState(998); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(970); + setState(999); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(971); + setState(1000); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(972); + setState(1001); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(973); + setState(1002); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(974); + setState(1003); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(975); + setState(1004); closureImplProofStmt(); } break; @@ -5531,13 +5682,13 @@ public T accept(ParseTreeVisitor visitor) { public final ApplyStmtContext applyStmt() throws RecognitionException { ApplyStmtContext _localctx = new ApplyStmtContext(_ctx, getState()); - enterRule(_localctx, 148, RULE_applyStmt); + enterRule(_localctx, 152, RULE_applyStmt); try { enterOuterAlt(_localctx, 1); { - setState(978); + setState(1007); match(APPLY); - setState(979); + setState(1008); expression(0); } } @@ -5573,20 +5724,20 @@ public T accept(ParseTreeVisitor visitor) { public final PackageStmtContext packageStmt() throws RecognitionException { PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState()); - enterRule(_localctx, 150, RULE_packageStmt); + enterRule(_localctx, 154, RULE_packageStmt); try { enterOuterAlt(_localctx, 1); { - setState(981); + setState(1010); match(PACKAGE); - setState(982); + setState(1011); expression(0); - setState(984); + setState(1013); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: { - setState(983); + setState(1012); block(); } break; @@ -5624,13 +5775,13 @@ public T accept(ParseTreeVisitor visitor) { public final SpecForStmtContext specForStmt() throws RecognitionException { SpecForStmtContext _localctx = new SpecForStmtContext(_ctx, getState()); - enterRule(_localctx, 152, RULE_specForStmt); + enterRule(_localctx, 156, RULE_specForStmt); try { enterOuterAlt(_localctx, 1); { - setState(986); + setState(1015); loopSpec(); - setState(987); + setState(1016); forStmt(); } } @@ -5679,39 +5830,39 @@ public T accept(ParseTreeVisitor visitor) { public final LoopSpecContext loopSpec() throws RecognitionException { LoopSpecContext _localctx = new LoopSpecContext(_ctx, getState()); - enterRule(_localctx, 154, RULE_loopSpec); + enterRule(_localctx, 158, RULE_loopSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(995); + setState(1024); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(989); + setState(1018); match(INV); - setState(990); + setState(1019); expression(0); - setState(991); + setState(1020); eos(); } } - setState(997); + setState(1026); _errHandler.sync(this); _la = _input.LA(1); } - setState(1002); + setState(1031); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(998); + setState(1027); match(DEC); - setState(999); + setState(1028); terminationMeasure(); - setState(1000); + setState(1029); eos(); } } @@ -5753,27 +5904,27 @@ public T accept(ParseTreeVisitor visitor) { public final DeferStmtContext deferStmt() throws RecognitionException { DeferStmtContext _localctx = new DeferStmtContext(_ctx, getState()); - enterRule(_localctx, 156, RULE_deferStmt); + enterRule(_localctx, 160, RULE_deferStmt); int _la; try { - setState(1009); + setState(1038); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1004); + setState(1033); match(DEFER); - setState(1005); + setState(1034); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1006); + setState(1035); match(DEFER); - setState(1007); + setState(1036); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -5784,7 +5935,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1008); + setState(1037); predicateAccess(); } break; @@ -5827,64 +5978,64 @@ public T accept(ParseTreeVisitor visitor) { public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); - enterRule(_localctx, 158, RULE_basicLit); + enterRule(_localctx, 162, RULE_basicLit); try { - setState(1019); + setState(1048); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1011); + setState(1040); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1012); + setState(1041); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1013); + setState(1042); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1014); + setState(1043); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1015); + setState(1044); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1016); + setState(1045); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1017); + setState(1046); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1018); + setState(1047); match(RUNE_LIT); } break; @@ -6121,23 +6272,23 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _parentState = getState(); PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, _parentState); PrimaryExprContext _prevctx = _localctx; - int _startState = 160; - enterRecursionRule(_localctx, 160, RULE_primaryExpr, _p); + int _startState = 164; + enterRecursionRule(_localctx, 164, RULE_primaryExpr, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1033); + setState(1062); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { _localctx = new OperandPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1022); + setState(1051); operand(); } break; @@ -6146,7 +6297,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1023); + setState(1052); conversion(); } break; @@ -6155,7 +6306,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1024); + setState(1053); methodExpr(); } break; @@ -6164,7 +6315,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1025); + setState(1054); ghostPrimaryExpr(); } break; @@ -6173,7 +6324,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1026); + setState(1055); new_(); } break; @@ -6182,7 +6333,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1027); + setState(1056); make(); } break; @@ -6191,7 +6342,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1028); + setState(1057); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 44)) & ~0x3f) == 0 && ((1L << (_la - 44)) & ((1L << (LEN - 44)) | (1L << (CAP - 44)) | (1L << (DOM - 44)) | (1L << (RANGE - 44)))) != 0)) ) { @@ -6202,36 +6353,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1029); + setState(1058); match(L_PAREN); - setState(1030); + setState(1059); expression(0); - setState(1031); + setState(1060); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1057); + setState(1086); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,78,_ctx); + _alt = getInterpreter().adaptivePredict(_input,80,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1055); + setState(1084); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1035); + setState(1064); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1036); + setState(1065); match(DOT); - setState(1037); + setState(1066); match(IDENTIFIER); } break; @@ -6239,9 +6390,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1038); + setState(1067); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1039); + setState(1068); index(); } break; @@ -6249,9 +6400,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1040); + setState(1069); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1041); + setState(1070); slice_(); } break; @@ -6259,9 +6410,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1042); + setState(1071); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1043); + setState(1072); seqUpdExp(); } break; @@ -6269,9 +6420,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1044); + setState(1073); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1045); + setState(1074); typeAssertion(); } break; @@ -6279,9 +6430,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1046); + setState(1075); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1047); + setState(1076); arguments(); } break; @@ -6289,13 +6440,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1048); + setState(1077); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1049); + setState(1078); arguments(); - setState(1050); + setState(1079); match(AS); - setState(1051); + setState(1080); closureSpecInstance(); } break; @@ -6303,18 +6454,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1053); + setState(1082); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1054); + setState(1083); predConstructArgs(); } break; } } } - setState(1059); + setState(1088); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,78,_ctx); + _alt = getInterpreter().adaptivePredict(_input,80,_ctx); } } } @@ -6350,13 +6501,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionLitContext functionLit() throws RecognitionException { FunctionLitContext _localctx = new FunctionLitContext(_ctx, getState()); - enterRule(_localctx, 162, RULE_functionLit); + enterRule(_localctx, 166, RULE_functionLit); try { enterOuterAlt(_localctx, 1); { - setState(1060); + setState(1089); ((FunctionLitContext)_localctx).specification = specification(); - setState(1061); + setState(1090); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -6398,32 +6549,32 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws RecognitionException { ClosureDeclContext _localctx = new ClosureDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 164, RULE_closureDecl); + enterRule(_localctx, 168, RULE_closureDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1063); + setState(1092); match(FUNC); - setState(1065); + setState(1094); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1064); + setState(1093); match(IDENTIFIER); } } { - setState(1067); + setState(1096); signature(); - setState(1069); + setState(1098); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { case 1: { - setState(1068); + setState(1097); blockWithBodyParameterInfo(); } break; @@ -6462,34 +6613,34 @@ public T accept(ParseTreeVisitor visitor) { public final PredConstructArgsContext predConstructArgs() throws RecognitionException { PredConstructArgsContext _localctx = new PredConstructArgsContext(_ctx, getState()); - enterRule(_localctx, 166, RULE_predConstructArgs); + enterRule(_localctx, 170, RULE_predConstructArgs); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1071); + setState(1100); match(L_PRED); - setState(1073); + setState(1102); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { { - setState(1072); + setState(1101); expressionList(); } } - setState(1076); + setState(1105); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1075); + setState(1104); match(COMMA); } } - setState(1078); + setState(1107); match(R_PRED); } } @@ -6545,52 +6696,52 @@ public T accept(ParseTreeVisitor visitor) { public final InterfaceTypeContext interfaceType() throws RecognitionException { InterfaceTypeContext _localctx = new InterfaceTypeContext(_ctx, getState()); - enterRule(_localctx, 168, RULE_interfaceType); + enterRule(_localctx, 172, RULE_interfaceType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1080); + setState(1109); match(INTERFACE); - setState(1081); + setState(1110); match(L_CURLY); - setState(1091); + setState(1120); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << GHOST) | (1L << PRED))) != 0) || _la==TRUSTED || _la==IDENTIFIER) { { { - setState(1085); + setState(1114); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: { - setState(1082); + setState(1111); methodSpec(); } break; case 2: { - setState(1083); + setState(1112); typeName(); } break; case 3: { - setState(1084); + setState(1113); predicateSpec(); } break; } - setState(1087); + setState(1116); eos(); } } - setState(1093); + setState(1122); _errHandler.sync(this); _la = _input.LA(1); } - setState(1094); + setState(1123); match(R_CURLY); } } @@ -6624,15 +6775,15 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateSpecContext predicateSpec() throws RecognitionException { PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState()); - enterRule(_localctx, 170, RULE_predicateSpec); + enterRule(_localctx, 174, RULE_predicateSpec); try { enterOuterAlt(_localctx, 1); { - setState(1096); + setState(1125); match(PRED); - setState(1097); + setState(1126); match(IDENTIFIER); - setState(1098); + setState(1127); parameters(); } } @@ -6672,53 +6823,53 @@ public T accept(ParseTreeVisitor visitor) { public final MethodSpecContext methodSpec() throws RecognitionException { MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState()); - enterRule(_localctx, 172, RULE_methodSpec); + enterRule(_localctx, 176, RULE_methodSpec); int _la; try { - setState(1115); + setState(1144); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1101); + setState(1130); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1100); + setState(1129); match(GHOST); } } - setState(1103); + setState(1132); specification(); - setState(1104); + setState(1133); match(IDENTIFIER); - setState(1105); + setState(1134); parameters(); - setState(1106); + setState(1135); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1109); + setState(1138); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1108); + setState(1137); match(GHOST); } } - setState(1111); + setState(1140); specification(); - setState(1112); + setState(1141); match(IDENTIFIER); - setState(1113); + setState(1142); parameters(); } break; @@ -6763,15 +6914,15 @@ public T accept(ParseTreeVisitor visitor) { public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); - enterRule(_localctx, 174, RULE_type_); + enterRule(_localctx, 178, RULE_type_); try { - setState(1124); + setState(1153); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1117); + setState(1146); typeName(); } break; @@ -6786,7 +6937,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1118); + setState(1147); typeLit(); } break; @@ -6797,20 +6948,21 @@ public final Type_Context type_() throws RecognitionException { case DICT: case OPT: case DOM: + case ADT: enterOuterAlt(_localctx, 3); { - setState(1119); + setState(1148); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1120); + setState(1149); match(L_PAREN); - setState(1121); + setState(1150); type_(); - setState(1122); + setState(1151); match(R_PAREN); } break; @@ -6870,71 +7022,71 @@ public T accept(ParseTreeVisitor visitor) { public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); - enterRule(_localctx, 176, RULE_typeLit); + enterRule(_localctx, 180, RULE_typeLit); try { - setState(1135); + setState(1164); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1126); + setState(1155); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1127); + setState(1156); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1128); + setState(1157); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1129); + setState(1158); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1130); + setState(1159); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1131); + setState(1160); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1132); + setState(1161); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1133); + setState(1162); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1134); + setState(1163); predType(); } break; @@ -6969,13 +7121,13 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeContext predType() throws RecognitionException { PredTypeContext _localctx = new PredTypeContext(_ctx, getState()); - enterRule(_localctx, 178, RULE_predType); + enterRule(_localctx, 182, RULE_predType); try { enterOuterAlt(_localctx, 1); { - setState(1137); + setState(1166); match(PRED); - setState(1138); + setState(1167); predTypeParams(); } } @@ -7016,45 +7168,45 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeParamsContext predTypeParams() throws RecognitionException { PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState()); - enterRule(_localctx, 180, RULE_predTypeParams); + enterRule(_localctx, 184, RULE_predTypeParams); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1140); + setState(1169); match(L_PAREN); - setState(1152); + setState(1181); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) { { - setState(1141); + setState(1170); type_(); - setState(1146); + setState(1175); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,90,_ctx); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1142); + setState(1171); match(COMMA); - setState(1143); + setState(1172); type_(); } } } - setState(1148); + setState(1177); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,90,_ctx); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); } - setState(1150); + setState(1179); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1149); + setState(1178); match(COMMA); } } @@ -7062,7 +7214,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1154); + setState(1183); match(R_PAREN); } } @@ -7112,57 +7264,57 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); - enterRule(_localctx, 182, RULE_literalType); + enterRule(_localctx, 186, RULE_literalType); try { - setState(1163); + setState(1192); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1156); + setState(1185); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1157); + setState(1186); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1158); + setState(1187); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1159); + setState(1188); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1160); + setState(1189); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1161); + setState(1190); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1162); + setState(1191); typeName(); } break; @@ -7199,17 +7351,17 @@ public T accept(ParseTreeVisitor visitor) { public final ImplicitArrayContext implicitArray() throws RecognitionException { ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState()); - enterRule(_localctx, 184, RULE_implicitArray); + enterRule(_localctx, 188, RULE_implicitArray); try { enterOuterAlt(_localctx, 1); { - setState(1165); + setState(1194); match(L_BRACKET); - setState(1166); + setState(1195); match(ELLIPSIS); - setState(1167); + setState(1196); match(R_BRACKET); - setState(1168); + setState(1197); elementType(); } } @@ -7253,36 +7405,36 @@ public T accept(ParseTreeVisitor visitor) { public final Slice_Context slice_() throws RecognitionException { Slice_Context _localctx = new Slice_Context(_ctx, getState()); - enterRule(_localctx, 186, RULE_slice_); + enterRule(_localctx, 190, RULE_slice_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1170); + setState(1199); match(L_BRACKET); - setState(1186); + setState(1215); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: { - setState(1172); + setState(1201); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { { - setState(1171); + setState(1200); low(); } } - setState(1174); + setState(1203); match(COLON); - setState(1176); + setState(1205); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { { - setState(1175); + setState(1204); high(); } } @@ -7291,28 +7443,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1179); + setState(1208); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { { - setState(1178); + setState(1207); low(); } } - setState(1181); + setState(1210); match(COLON); - setState(1182); + setState(1211); high(); - setState(1183); + setState(1212); match(COLON); - setState(1184); + setState(1213); cap(); } break; } - setState(1188); + setState(1217); match(R_BRACKET); } } @@ -7344,11 +7496,11 @@ public T accept(ParseTreeVisitor visitor) { public final LowContext low() throws RecognitionException { LowContext _localctx = new LowContext(_ctx, getState()); - enterRule(_localctx, 188, RULE_low); + enterRule(_localctx, 192, RULE_low); try { enterOuterAlt(_localctx, 1); { - setState(1190); + setState(1219); expression(0); } } @@ -7380,11 +7532,11 @@ public T accept(ParseTreeVisitor visitor) { public final HighContext high() throws RecognitionException { HighContext _localctx = new HighContext(_ctx, getState()); - enterRule(_localctx, 190, RULE_high); + enterRule(_localctx, 194, RULE_high); try { enterOuterAlt(_localctx, 1); { - setState(1192); + setState(1221); expression(0); } } @@ -7416,11 +7568,11 @@ public T accept(ParseTreeVisitor visitor) { public final CapContext cap() throws RecognitionException { CapContext _localctx = new CapContext(_ctx, getState()); - enterRule(_localctx, 192, RULE_cap); + enterRule(_localctx, 196, RULE_cap); try { enterOuterAlt(_localctx, 1); { - setState(1194); + setState(1223); expression(0); } } @@ -7462,20 +7614,20 @@ public T accept(ParseTreeVisitor visitor) { public final Assign_opContext assign_op() throws RecognitionException { Assign_opContext _localctx = new Assign_opContext(_ctx, getState()); - enterRule(_localctx, 194, RULE_assign_op); + enterRule(_localctx, 198, RULE_assign_op); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1197); + setState(1226); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) { + if (((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (OR - 123)) | (1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (PLUS - 123)) | (1L << (MINUS - 123)) | (1L << (CARET - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) { { - setState(1196); + setState(1225); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) ) { + if ( !(((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (OR - 123)) | (1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (PLUS - 123)) | (1L << (MINUS - 123)) | (1L << (CARET - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -7486,7 +7638,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1199); + setState(1228); match(ASSIGN); } } @@ -7529,48 +7681,48 @@ public T accept(ParseTreeVisitor visitor) { public final RangeClauseContext rangeClause() throws RecognitionException { RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_rangeClause); + enterRule(_localctx, 200, RULE_rangeClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1207); + setState(1236); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { case 1: { - setState(1201); + setState(1230); expressionList(); - setState(1202); + setState(1231); match(ASSIGN); } break; case 2: { - setState(1204); + setState(1233); maybeAddressableIdentifierList(); - setState(1205); + setState(1234); match(DECLARE_ASSIGN); } break; } - setState(1209); + setState(1238); match(RANGE); - setState(1210); + setState(1239); expression(0); - setState(1215); + setState(1244); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1211); + setState(1240); match(WITH); - setState(1213); + setState(1242); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1212); + setState(1241); match(IDENTIFIER); } } @@ -7608,13 +7760,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_packageClause); + enterRule(_localctx, 202, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1217); + setState(1246); match(PACKAGE); - setState(1218); + setState(1247); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -7646,11 +7798,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_importPath); + enterRule(_localctx, 204, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1220); + setState(1249); string_(); } } @@ -7688,29 +7840,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_declaration); + enterRule(_localctx, 206, RULE_declaration); try { - setState(1225); + setState(1254); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1222); + setState(1251); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1223); + setState(1252); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1224); + setState(1253); varDecl(); } break; @@ -7758,43 +7910,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 204, RULE_constDecl); + enterRule(_localctx, 208, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1227); + setState(1256); match(CONST); - setState(1239); + setState(1268); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1228); + setState(1257); constSpec(); } break; case L_PAREN: { - setState(1229); + setState(1258); match(L_PAREN); - setState(1235); + setState(1264); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1230); + setState(1259); constSpec(); - setState(1231); + setState(1260); eos(); } } - setState(1237); + setState(1266); _errHandler.sync(this); _la = _input.LA(1); } - setState(1238); + setState(1267); match(R_PAREN); } break; @@ -7838,31 +7990,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_constSpec); + enterRule(_localctx, 210, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1241); + setState(1270); identifierList(); - setState(1247); + setState(1276); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) { case 1: { - setState(1243); + setState(1272); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) { { - setState(1242); + setState(1271); type_(); } } - setState(1245); + setState(1274); match(ASSIGN); - setState(1246); + setState(1275); expressionList(); } break; @@ -7902,30 +8054,30 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 208, RULE_identifierList); + enterRule(_localctx, 212, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1249); + setState(1278); match(IDENTIFIER); - setState(1254); + setState(1283); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,107,_ctx); + _alt = getInterpreter().adaptivePredict(_input,109,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1250); + setState(1279); match(COMMA); - setState(1251); + setState(1280); match(IDENTIFIER); } } } - setState(1256); + setState(1285); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,107,_ctx); + _alt = getInterpreter().adaptivePredict(_input,109,_ctx); } } } @@ -7964,30 +8116,30 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_expressionList); + enterRule(_localctx, 214, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1257); + setState(1286); expression(0); - setState(1262); + setState(1291); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,108,_ctx); + _alt = getInterpreter().adaptivePredict(_input,110,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1258); + setState(1287); match(COMMA); - setState(1259); + setState(1288); expression(0); } } } - setState(1264); + setState(1293); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,108,_ctx); + _alt = getInterpreter().adaptivePredict(_input,110,_ctx); } } } @@ -8031,43 +8183,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_typeDecl); + enterRule(_localctx, 216, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1265); + setState(1294); match(TYPE); - setState(1277); + setState(1306); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1266); + setState(1295); typeSpec(); } break; case L_PAREN: { - setState(1267); + setState(1296); match(L_PAREN); - setState(1273); + setState(1302); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1268); + setState(1297); typeSpec(); - setState(1269); + setState(1298); eos(); } } - setState(1275); + setState(1304); _errHandler.sync(this); _la = _input.LA(1); } - setState(1276); + setState(1305); match(R_PAREN); } break; @@ -8106,24 +8258,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_typeSpec); + enterRule(_localctx, 218, RULE_typeSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1279); + setState(1308); match(IDENTIFIER); - setState(1281); + setState(1310); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1280); + setState(1309); match(ASSIGN); } } - setState(1283); + setState(1312); type_(); } } @@ -8167,43 +8319,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_varDecl); + enterRule(_localctx, 220, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1285); + setState(1314); match(VAR); - setState(1297); + setState(1326); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1286); + setState(1315); varSpec(); } break; case L_PAREN: { - setState(1287); + setState(1316); match(L_PAREN); - setState(1293); + setState(1322); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1288); + setState(1317); varSpec(); - setState(1289); + setState(1318); eos(); } } - setState(1295); + setState(1324); _errHandler.sync(this); _la = _input.LA(1); } - setState(1296); + setState(1325); match(R_PAREN); } break; @@ -8242,23 +8394,23 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_block); + enterRule(_localctx, 222, RULE_block); try { enterOuterAlt(_localctx, 1); { - setState(1299); + setState(1328); match(L_CURLY); - setState(1301); + setState(1330); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { case 1: { - setState(1300); + setState(1329); statementList(); } break; } - setState(1303); + setState(1332); match(R_CURLY); } } @@ -8299,12 +8451,12 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_statementList); + enterRule(_localctx, 224, RULE_statementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1311); + setState(1340); _errHandler.sync(this); _alt = 1; do { @@ -8312,19 +8464,19 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1306); + setState(1335); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) { case 1: { - setState(1305); + setState(1334); eos(); } break; } - setState(1308); + setState(1337); statement(); - setState(1309); + setState(1338); eos(); } } @@ -8332,9 +8484,9 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1313); + setState(1342); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,116,_ctx); + _alt = getInterpreter().adaptivePredict(_input,118,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -8378,43 +8530,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_simpleStmt); + enterRule(_localctx, 226, RULE_simpleStmt); try { - setState(1320); + setState(1349); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1315); + setState(1344); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1316); + setState(1345); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1317); + setState(1346); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1318); + setState(1347); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1319); + setState(1348); shortVarDecl(); } break; @@ -8448,11 +8600,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_expressionStmt); + enterRule(_localctx, 228, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1322); + setState(1351); expression(0); } } @@ -8489,15 +8641,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_sendStmt); + enterRule(_localctx, 230, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1324); + setState(1353); ((SendStmtContext)_localctx).channel = expression(0); - setState(1325); + setState(1354); match(RECEIVE); - setState(1326); + setState(1355); expression(0); } } @@ -8531,14 +8683,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_incDecStmt); + enterRule(_localctx, 232, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1328); + setState(1357); expression(0); - setState(1329); + setState(1358); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -8584,15 +8736,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_assignment); + enterRule(_localctx, 234, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1331); + setState(1360); expressionList(); - setState(1332); + setState(1361); assign_op(); - setState(1333); + setState(1362); expressionList(); } } @@ -8623,12 +8775,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_emptyStmt); + enterRule(_localctx, 236, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1335); + setState(1364); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -8670,20 +8822,20 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_labeledStmt); + enterRule(_localctx, 238, RULE_labeledStmt); try { enterOuterAlt(_localctx, 1); { - setState(1337); + setState(1366); match(IDENTIFIER); - setState(1338); + setState(1367); match(COLON); - setState(1340); + setState(1369); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { case 1: { - setState(1339); + setState(1368); statement(); } break; @@ -8719,18 +8871,18 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_returnStmt); + enterRule(_localctx, 240, RULE_returnStmt); try { enterOuterAlt(_localctx, 1); { - setState(1342); + setState(1371); match(RETURN); - setState(1344); + setState(1373); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { case 1: { - setState(1343); + setState(1372); expressionList(); } break; @@ -8764,18 +8916,18 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_breakStmt); + enterRule(_localctx, 242, RULE_breakStmt); try { enterOuterAlt(_localctx, 1); { - setState(1346); + setState(1375); match(BREAK); - setState(1348); + setState(1377); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) { case 1: { - setState(1347); + setState(1376); match(IDENTIFIER); } break; @@ -8809,18 +8961,18 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_continueStmt); + enterRule(_localctx, 244, RULE_continueStmt); try { enterOuterAlt(_localctx, 1); { - setState(1350); + setState(1379); match(CONTINUE); - setState(1352); + setState(1381); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,123,_ctx) ) { case 1: { - setState(1351); + setState(1380); match(IDENTIFIER); } break; @@ -8854,13 +9006,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_gotoStmt); + enterRule(_localctx, 246, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1354); + setState(1383); match(GOTO); - setState(1355); + setState(1384); match(IDENTIFIER); } } @@ -8890,11 +9042,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_fallthroughStmt); + enterRule(_localctx, 248, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1357); + setState(1386); match(FALLTHROUGH); } } @@ -8943,61 +9095,61 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_ifStmt); + enterRule(_localctx, 250, RULE_ifStmt); try { enterOuterAlt(_localctx, 1); { - setState(1359); + setState(1388); match(IF); - setState(1368); + setState(1397); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { case 1: { - setState(1360); + setState(1389); expression(0); } break; case 2: { - setState(1361); + setState(1390); eos(); - setState(1362); + setState(1391); expression(0); } break; case 3: { - setState(1364); + setState(1393); simpleStmt(); - setState(1365); + setState(1394); eos(); - setState(1366); + setState(1395); expression(0); } break; } - setState(1370); + setState(1399); block(); - setState(1376); + setState(1405); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { case 1: { - setState(1371); + setState(1400); match(ELSE); - setState(1374); + setState(1403); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1372); + setState(1401); ifStmt(); } break; case L_CURLY: { - setState(1373); + setState(1402); block(); } break; @@ -9040,22 +9192,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_switchStmt); + enterRule(_localctx, 252, RULE_switchStmt); try { - setState(1380); + setState(1409); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1378); + setState(1407); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1379); + setState(1408); typeSwitchStmt(); } break; @@ -9104,24 +9256,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_exprSwitchStmt); + enterRule(_localctx, 254, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1382); + setState(1411); match(SWITCH); - setState(1393); + setState(1422); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { case 1: { - setState(1384); + setState(1413); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { { - setState(1383); + setState(1412); expression(0); } } @@ -9130,24 +9282,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1387); + setState(1416); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: { - setState(1386); + setState(1415); simpleStmt(); } break; } - setState(1389); + setState(1418); eos(); - setState(1391); + setState(1420); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { { - setState(1390); + setState(1419); expression(0); } } @@ -9155,23 +9307,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1395); + setState(1424); match(L_CURLY); - setState(1399); + setState(1428); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1396); + setState(1425); exprCaseClause(); } } - setState(1401); + setState(1430); _errHandler.sync(this); _la = _input.LA(1); } - setState(1402); + setState(1431); match(R_CURLY); } } @@ -9207,20 +9359,20 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_exprCaseClause); + enterRule(_localctx, 256, RULE_exprCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1404); + setState(1433); exprSwitchCase(); - setState(1405); + setState(1434); match(COLON); - setState(1407); + setState(1436); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { case 1: { - setState(1406); + setState(1435); statementList(); } break; @@ -9257,24 +9409,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_exprSwitchCase); + enterRule(_localctx, 258, RULE_exprSwitchCase); try { - setState(1412); + setState(1441); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1409); + setState(1438); match(CASE); - setState(1410); + setState(1439); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1411); + setState(1440); match(DEFAULT); } break; @@ -9325,58 +9477,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_typeSwitchStmt); + enterRule(_localctx, 260, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1414); + setState(1443); match(SWITCH); - setState(1423); + setState(1452); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: { - setState(1415); + setState(1444); typeSwitchGuard(); } break; case 2: { - setState(1416); + setState(1445); eos(); - setState(1417); + setState(1446); typeSwitchGuard(); } break; case 3: { - setState(1419); + setState(1448); simpleStmt(); - setState(1420); + setState(1449); eos(); - setState(1421); + setState(1450); typeSwitchGuard(); } break; } - setState(1425); + setState(1454); match(L_CURLY); - setState(1429); + setState(1458); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1426); + setState(1455); typeCaseClause(); } } - setState(1431); + setState(1460); _errHandler.sync(this); _la = _input.LA(1); } - setState(1432); + setState(1461); match(R_CURLY); } } @@ -9414,31 +9566,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_typeSwitchGuard); + enterRule(_localctx, 262, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1436); + setState(1465); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { case 1: { - setState(1434); + setState(1463); match(IDENTIFIER); - setState(1435); + setState(1464); match(DECLARE_ASSIGN); } break; } - setState(1438); + setState(1467); primaryExpr(0); - setState(1439); + setState(1468); match(DOT); - setState(1440); + setState(1469); match(L_PAREN); - setState(1441); + setState(1470); match(TYPE); - setState(1442); + setState(1471); match(R_PAREN); } } @@ -9474,20 +9626,20 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_typeCaseClause); + enterRule(_localctx, 264, RULE_typeCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1444); + setState(1473); typeSwitchCase(); - setState(1445); + setState(1474); match(COLON); - setState(1447); + setState(1476); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) { case 1: { - setState(1446); + setState(1475); statementList(); } break; @@ -9524,24 +9676,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_typeSwitchCase); + enterRule(_localctx, 266, RULE_typeSwitchCase); try { - setState(1452); + setState(1481); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1449); + setState(1478); match(CASE); - setState(1450); + setState(1479); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1451); + setState(1480); match(DEFAULT); } break; @@ -9588,12 +9740,12 @@ public T accept(ParseTreeVisitor visitor) { public final TypeListContext typeList() throws RecognitionException { TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_typeList); + enterRule(_localctx, 268, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1456); + setState(1485); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -9603,6 +9755,7 @@ public final TypeListContext typeList() throws RecognitionException { case DICT: case OPT: case DOM: + case ADT: case PRED: case FUNC: case INTERFACE: @@ -9615,28 +9768,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1454); + setState(1483); type_(); } break; case NIL_LIT: { - setState(1455); + setState(1484); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1465); + setState(1494); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1458); + setState(1487); match(COMMA); - setState(1461); + setState(1490); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -9646,6 +9799,7 @@ public final TypeListContext typeList() throws RecognitionException { case DICT: case OPT: case DOM: + case ADT: case PRED: case FUNC: case INTERFACE: @@ -9658,13 +9812,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1459); + setState(1488); type_(); } break; case NIL_LIT: { - setState(1460); + setState(1489); match(NIL_LIT); } break; @@ -9673,7 +9827,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1467); + setState(1496); _errHandler.sync(this); _la = _input.LA(1); } @@ -9713,30 +9867,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_selectStmt); + enterRule(_localctx, 270, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1468); + setState(1497); match(SELECT); - setState(1469); + setState(1498); match(L_CURLY); - setState(1473); + setState(1502); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1470); + setState(1499); commClause(); } } - setState(1475); + setState(1504); _errHandler.sync(this); _la = _input.LA(1); } - setState(1476); + setState(1505); match(R_CURLY); } } @@ -9772,20 +9926,20 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_commClause); + enterRule(_localctx, 272, RULE_commClause); try { enterOuterAlt(_localctx, 1); { - setState(1478); + setState(1507); commCase(); - setState(1479); + setState(1508); match(COLON); - setState(1481); + setState(1510); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { case 1: { - setState(1480); + setState(1509); statementList(); } break; @@ -9825,28 +9979,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_commCase); + enterRule(_localctx, 274, RULE_commCase); try { - setState(1489); + setState(1518); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1483); + setState(1512); match(CASE); - setState(1486); + setState(1515); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1484); + setState(1513); sendStmt(); } break; case 2: { - setState(1485); + setState(1514); recvStmt(); } break; @@ -9856,7 +10010,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1488); + setState(1517); match(DEFAULT); } break; @@ -9901,31 +10055,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_recvStmt); + enterRule(_localctx, 276, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1497); + setState(1526); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { case 1: { - setState(1491); + setState(1520); expressionList(); - setState(1492); + setState(1521); match(ASSIGN); } break; case 2: { - setState(1494); + setState(1523); identifierList(); - setState(1495); + setState(1524); match(DECLARE_ASSIGN); } break; } - setState(1499); + setState(1528); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -9967,35 +10121,35 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_forStmt); + enterRule(_localctx, 278, RULE_forStmt); try { enterOuterAlt(_localctx, 1); { - setState(1501); + setState(1530); match(FOR); - setState(1505); + setState(1534); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1502); + setState(1531); expression(0); } break; case 2: { - setState(1503); + setState(1532); forClause(); } break; case 3: { - setState(1504); + setState(1533); rangeClause(); } break; } - setState(1507); + setState(1536); block(); } } @@ -10041,41 +10195,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_forClause); + enterRule(_localctx, 280, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1510); + setState(1539); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { case 1: { - setState(1509); + setState(1538); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1512); + setState(1541); eos(); - setState(1514); + setState(1543); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { case 1: { - setState(1513); + setState(1542); expression(0); } break; } - setState(1516); + setState(1545); eos(); - setState(1518); + setState(1547); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { { - setState(1517); + setState(1546); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -10111,13 +10265,13 @@ public T accept(ParseTreeVisitor visitor) { public final GoStmtContext goStmt() throws RecognitionException { GoStmtContext _localctx = new GoStmtContext(_ctx, getState()); - enterRule(_localctx, 278, RULE_goStmt); + enterRule(_localctx, 282, RULE_goStmt); try { enterOuterAlt(_localctx, 1); { - setState(1520); + setState(1549); match(GO); - setState(1521); + setState(1550); expression(0); } } @@ -10150,22 +10304,22 @@ public T accept(ParseTreeVisitor visitor) { public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); - enterRule(_localctx, 280, RULE_typeName); + enterRule(_localctx, 284, RULE_typeName); try { - setState(1525); + setState(1554); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1523); + setState(1552); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1524); + setState(1553); match(IDENTIFIER); } break; @@ -10204,17 +10358,17 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayTypeContext arrayType() throws RecognitionException { ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 282, RULE_arrayType); + enterRule(_localctx, 286, RULE_arrayType); try { enterOuterAlt(_localctx, 1); { - setState(1527); + setState(1556); match(L_BRACKET); - setState(1528); + setState(1557); arrayLength(); - setState(1529); + setState(1558); match(R_BRACKET); - setState(1530); + setState(1559); elementType(); } } @@ -10246,11 +10400,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayLengthContext arrayLength() throws RecognitionException { ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); - enterRule(_localctx, 284, RULE_arrayLength); + enterRule(_localctx, 288, RULE_arrayLength); try { enterOuterAlt(_localctx, 1); { - setState(1532); + setState(1561); expression(0); } } @@ -10282,11 +10436,11 @@ public T accept(ParseTreeVisitor visitor) { public final ElementTypeContext elementType() throws RecognitionException { ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); - enterRule(_localctx, 286, RULE_elementType); + enterRule(_localctx, 290, RULE_elementType); try { enterOuterAlt(_localctx, 1); { - setState(1534); + setState(1563); type_(); } } @@ -10319,13 +10473,13 @@ public T accept(ParseTreeVisitor visitor) { public final PointerTypeContext pointerType() throws RecognitionException { PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_pointerType); + enterRule(_localctx, 292, RULE_pointerType); try { enterOuterAlt(_localctx, 1); { - setState(1536); + setState(1565); match(STAR); - setState(1537); + setState(1566); type_(); } } @@ -10359,15 +10513,15 @@ public T accept(ParseTreeVisitor visitor) { public final SliceTypeContext sliceType() throws RecognitionException { SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); - enterRule(_localctx, 290, RULE_sliceType); + enterRule(_localctx, 294, RULE_sliceType); try { enterOuterAlt(_localctx, 1); { - setState(1539); + setState(1568); match(L_BRACKET); - setState(1540); + setState(1569); match(R_BRACKET); - setState(1541); + setState(1570); elementType(); } } @@ -10405,19 +10559,19 @@ public T accept(ParseTreeVisitor visitor) { public final MapTypeContext mapType() throws RecognitionException { MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 292, RULE_mapType); + enterRule(_localctx, 296, RULE_mapType); try { enterOuterAlt(_localctx, 1); { - setState(1543); + setState(1572); match(MAP); - setState(1544); + setState(1573); match(L_BRACKET); - setState(1545); + setState(1574); type_(); - setState(1546); + setState(1575); match(R_BRACKET); - setState(1547); + setState(1576); elementType(); } } @@ -10451,37 +10605,37 @@ public T accept(ParseTreeVisitor visitor) { public final ChannelTypeContext channelType() throws RecognitionException { ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState()); - enterRule(_localctx, 294, RULE_channelType); + enterRule(_localctx, 298, RULE_channelType); try { enterOuterAlt(_localctx, 1); { - setState(1554); + setState(1583); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { case 1: { - setState(1549); + setState(1578); match(CHAN); } break; case 2: { - setState(1550); + setState(1579); match(CHAN); - setState(1551); + setState(1580); match(RECEIVE); } break; case 3: { - setState(1552); + setState(1581); match(RECEIVE); - setState(1553); + setState(1582); match(CHAN); } break; } - setState(1556); + setState(1585); elementType(); } } @@ -10514,13 +10668,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTypeContext functionType() throws RecognitionException { FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState()); - enterRule(_localctx, 296, RULE_functionType); + enterRule(_localctx, 300, RULE_functionType); try { enterOuterAlt(_localctx, 1); { - setState(1558); + setState(1587); match(FUNC); - setState(1559); + setState(1588); signature(); } } @@ -10555,24 +10709,24 @@ public T accept(ParseTreeVisitor visitor) { public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); - enterRule(_localctx, 298, RULE_signature); + enterRule(_localctx, 302, RULE_signature); try { - setState(1565); + setState(1594); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,154,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1561); + setState(1590); parameters(); - setState(1562); + setState(1591); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1564); + setState(1593); parameters(); } break; @@ -10609,22 +10763,22 @@ public T accept(ParseTreeVisitor visitor) { public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); - enterRule(_localctx, 300, RULE_result); + enterRule(_localctx, 304, RULE_result); try { - setState(1569); + setState(1598); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1567); + setState(1596); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1568); + setState(1597); type_(); } break; @@ -10667,45 +10821,45 @@ public T accept(ParseTreeVisitor visitor) { public final ParametersContext parameters() throws RecognitionException { ParametersContext _localctx = new ParametersContext(_ctx, getState()); - enterRule(_localctx, 302, RULE_parameters); + enterRule(_localctx, 306, RULE_parameters); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1571); + setState(1600); match(L_PAREN); - setState(1583); + setState(1612); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (ELLIPSIS - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (ELLIPSIS - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) { { - setState(1572); + setState(1601); parameterDecl(); - setState(1577); + setState(1606); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,154,_ctx); + _alt = getInterpreter().adaptivePredict(_input,156,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1573); + setState(1602); match(COMMA); - setState(1574); + setState(1603); parameterDecl(); } } } - setState(1579); + setState(1608); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,154,_ctx); + _alt = getInterpreter().adaptivePredict(_input,156,_ctx); } - setState(1581); + setState(1610); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1580); + setState(1609); match(COMMA); } } @@ -10713,7 +10867,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1585); + setState(1614); match(R_PAREN); } } @@ -10751,28 +10905,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConversionContext conversion() throws RecognitionException { ConversionContext _localctx = new ConversionContext(_ctx, getState()); - enterRule(_localctx, 304, RULE_conversion); + enterRule(_localctx, 308, RULE_conversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1587); + setState(1616); nonNamedType(); - setState(1588); + setState(1617); match(L_PAREN); - setState(1589); + setState(1618); expression(0); - setState(1591); + setState(1620); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1590); + setState(1619); match(COMMA); } } - setState(1593); + setState(1622); match(R_PAREN); } } @@ -10809,9 +10963,9 @@ public T accept(ParseTreeVisitor visitor) { public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_nonNamedType); + enterRule(_localctx, 310, RULE_nonNamedType); try { - setState(1600); + setState(1629); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -10825,18 +10979,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1595); + setState(1624); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1596); + setState(1625); match(L_PAREN); - setState(1597); + setState(1626); nonNamedType(); - setState(1598); + setState(1627); match(R_PAREN); } break; @@ -10880,33 +11034,33 @@ public T accept(ParseTreeVisitor visitor) { public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_operand); + enterRule(_localctx, 312, RULE_operand); try { - setState(1608); + setState(1637); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1602); + setState(1631); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1603); + setState(1632); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1604); + setState(1633); match(L_PAREN); - setState(1605); + setState(1634); expression(0); - setState(1606); + setState(1635); match(R_PAREN); } break; @@ -10946,9 +11100,9 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_literal); + enterRule(_localctx, 314, RULE_literal); try { - setState(1613); + setState(1642); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -10965,7 +11119,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1610); + setState(1639); basicLit(); } break; @@ -10976,13 +11130,14 @@ public final LiteralContext literal() throws RecognitionException { case DICT: case OPT: case DOM: + case ADT: case MAP: case STRUCT: case IDENTIFIER: case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1611); + setState(1640); compositeLit(); } break; @@ -10995,7 +11150,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1612); + setState(1641); functionLit(); } break; @@ -11034,14 +11189,14 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerContext integer() throws RecognitionException { IntegerContext _localctx = new IntegerContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_integer); + enterRule(_localctx, 316, RULE_integer); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1615); + setState(1644); _la = _input.LA(1); - if ( !(((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & ((1L << (DECIMAL_LIT - 135)) | (1L << (BINARY_LIT - 135)) | (1L << (OCTAL_LIT - 135)) | (1L << (HEX_LIT - 135)) | (1L << (IMAGINARY_LIT - 135)) | (1L << (RUNE_LIT - 135)))) != 0)) ) { + if ( !(((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & ((1L << (DECIMAL_LIT - 136)) | (1L << (BINARY_LIT - 136)) | (1L << (OCTAL_LIT - 136)) | (1L << (HEX_LIT - 136)) | (1L << (IMAGINARY_LIT - 136)) | (1L << (RUNE_LIT - 136)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -11077,11 +11232,11 @@ public T accept(ParseTreeVisitor visitor) { public final OperandNameContext operandName() throws RecognitionException { OperandNameContext _localctx = new OperandNameContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_operandName); + enterRule(_localctx, 318, RULE_operandName); try { enterOuterAlt(_localctx, 1); { - setState(1617); + setState(1646); match(IDENTIFIER); } } @@ -11115,15 +11270,15 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedIdentContext qualifiedIdent() throws RecognitionException { QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_qualifiedIdent); + enterRule(_localctx, 320, RULE_qualifiedIdent); try { enterOuterAlt(_localctx, 1); { - setState(1619); + setState(1648); match(IDENTIFIER); - setState(1620); + setState(1649); match(DOT); - setState(1621); + setState(1650); match(IDENTIFIER); } } @@ -11158,13 +11313,13 @@ public T accept(ParseTreeVisitor visitor) { public final CompositeLitContext compositeLit() throws RecognitionException { CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_compositeLit); + enterRule(_localctx, 322, RULE_compositeLit); try { enterOuterAlt(_localctx, 1); { - setState(1623); + setState(1652); literalType(); - setState(1624); + setState(1653); literalValue(); } } @@ -11199,26 +11354,26 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralValueContext literalValue() throws RecognitionException { LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_literalValue); + enterRule(_localctx, 324, RULE_literalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1626); + setState(1655); match(L_CURLY); - setState(1631); + setState(1660); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { { - setState(1627); + setState(1656); elementList(); - setState(1629); + setState(1658); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1628); + setState(1657); match(COMMA); } } @@ -11226,7 +11381,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1633); + setState(1662); match(R_CURLY); } } @@ -11265,30 +11420,30 @@ public T accept(ParseTreeVisitor visitor) { public final ElementListContext elementList() throws RecognitionException { ElementListContext _localctx = new ElementListContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_elementList); + enterRule(_localctx, 326, RULE_elementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1635); + setState(1664); keyedElement(); - setState(1640); + setState(1669); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,163,_ctx); + _alt = getInterpreter().adaptivePredict(_input,165,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1636); + setState(1665); match(COMMA); - setState(1637); + setState(1666); keyedElement(); } } } - setState(1642); + setState(1671); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,163,_ctx); + _alt = getInterpreter().adaptivePredict(_input,165,_ctx); } } } @@ -11324,23 +11479,23 @@ public T accept(ParseTreeVisitor visitor) { public final KeyedElementContext keyedElement() throws RecognitionException { KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_keyedElement); + enterRule(_localctx, 328, RULE_keyedElement); try { enterOuterAlt(_localctx, 1); { - setState(1646); + setState(1675); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { case 1: { - setState(1643); + setState(1672); key(); - setState(1644); + setState(1673); match(COLON); } break; } - setState(1648); + setState(1677); element(); } } @@ -11375,9 +11530,9 @@ public T accept(ParseTreeVisitor visitor) { public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_key); + enterRule(_localctx, 330, RULE_key); try { - setState(1652); + setState(1681); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11407,6 +11562,7 @@ public final KeyContext key() throws RecognitionException { case SOME: case GET: case DOM: + case ADT: case NONE: case PRED: case TYPE_OF: @@ -11442,14 +11598,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1650); + setState(1679); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1651); + setState(1680); literalValue(); } break; @@ -11488,9 +11644,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_element); + enterRule(_localctx, 332, RULE_element); try { - setState(1656); + setState(1685); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11520,6 +11676,7 @@ public final ElementContext element() throws RecognitionException { case SOME: case GET: case DOM: + case ADT: case NONE: case PRED: case TYPE_OF: @@ -11555,14 +11712,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1654); + setState(1683); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1655); + setState(1684); literalValue(); } break; @@ -11610,32 +11767,32 @@ public T accept(ParseTreeVisitor visitor) { public final StructTypeContext structType() throws RecognitionException { StructTypeContext _localctx = new StructTypeContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_structType); + enterRule(_localctx, 334, RULE_structType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1658); + setState(1687); match(STRUCT); - setState(1659); + setState(1688); match(L_CURLY); - setState(1665); + setState(1694); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1660); + setState(1689); fieldDecl(); - setState(1661); + setState(1690); eos(); } } - setState(1667); + setState(1696); _errHandler.sync(this); _la = _input.LA(1); } - setState(1668); + setState(1697); match(R_CURLY); } } @@ -11677,34 +11834,34 @@ public T accept(ParseTreeVisitor visitor) { public final FieldDeclContext fieldDecl() throws RecognitionException { FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_fieldDecl); + enterRule(_localctx, 336, RULE_fieldDecl); try { enterOuterAlt(_localctx, 1); { - setState(1674); + setState(1703); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { case 1: { - setState(1670); + setState(1699); identifierList(); - setState(1671); + setState(1700); type_(); } break; case 2: { - setState(1673); + setState(1702); embeddedField(); } break; } - setState(1677); + setState(1706); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) { case 1: { - setState(1676); + setState(1705); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -11738,12 +11895,12 @@ public T accept(ParseTreeVisitor visitor) { public final String_Context string_() throws RecognitionException { String_Context _localctx = new String_Context(_ctx, getState()); - enterRule(_localctx, 334, RULE_string_); + enterRule(_localctx, 338, RULE_string_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1679); + setState(1708); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -11784,22 +11941,22 @@ public T accept(ParseTreeVisitor visitor) { public final EmbeddedFieldContext embeddedField() throws RecognitionException { EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_embeddedField); + enterRule(_localctx, 340, RULE_embeddedField); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1682); + setState(1711); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1681); + setState(1710); match(STAR); } } - setState(1684); + setState(1713); typeName(); } } @@ -11833,15 +11990,15 @@ public T accept(ParseTreeVisitor visitor) { public final IndexContext index() throws RecognitionException { IndexContext _localctx = new IndexContext(_ctx, getState()); - enterRule(_localctx, 338, RULE_index); + enterRule(_localctx, 342, RULE_index); try { enterOuterAlt(_localctx, 1); { - setState(1686); + setState(1715); match(L_BRACKET); - setState(1687); + setState(1716); expression(0); - setState(1688); + setState(1717); match(R_BRACKET); } } @@ -11876,17 +12033,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeAssertionContext typeAssertion() throws RecognitionException { TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_typeAssertion); + enterRule(_localctx, 344, RULE_typeAssertion); try { enterOuterAlt(_localctx, 1); { - setState(1690); + setState(1719); match(DOT); - setState(1691); + setState(1720); match(L_PAREN); - setState(1692); + setState(1721); type_(); - setState(1693); + setState(1722); match(R_PAREN); } } @@ -11928,39 +12085,39 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentsContext arguments() throws RecognitionException { ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_arguments); + enterRule(_localctx, 346, RULE_arguments); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1695); + setState(1724); match(L_PAREN); - setState(1710); + setState(1739); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { { - setState(1702); + setState(1731); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { case 1: { - setState(1696); + setState(1725); expressionList(); } break; case 2: { - setState(1697); + setState(1726); nonNamedType(); - setState(1700); + setState(1729); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) { case 1: { - setState(1698); + setState(1727); match(COMMA); - setState(1699); + setState(1728); expressionList(); } break; @@ -11968,22 +12125,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1705); + setState(1734); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1704); + setState(1733); match(ELLIPSIS); } } - setState(1708); + setState(1737); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1707); + setState(1736); match(COMMA); } } @@ -11991,7 +12148,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1712); + setState(1741); match(R_PAREN); } } @@ -12025,15 +12182,15 @@ public T accept(ParseTreeVisitor visitor) { public final MethodExprContext methodExpr() throws RecognitionException { MethodExprContext _localctx = new MethodExprContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_methodExpr); + enterRule(_localctx, 348, RULE_methodExpr); try { enterOuterAlt(_localctx, 1); { - setState(1714); + setState(1743); nonNamedType(); - setState(1715); + setState(1744); match(DOT); - setState(1716); + setState(1745); match(IDENTIFIER); } } @@ -12065,11 +12222,11 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverTypeContext receiverType() throws RecognitionException { ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_receiverType); + enterRule(_localctx, 350, RULE_receiverType); try { enterOuterAlt(_localctx, 1); { - setState(1718); + setState(1747); type_(); } } @@ -12101,36 +12258,36 @@ public T accept(ParseTreeVisitor visitor) { public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_eos); + enterRule(_localctx, 352, RULE_eos); try { - setState(1724); + setState(1753); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1720); + setState(1749); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1721); + setState(1750); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1722); + setState(1751); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1723); + setState(1752); if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()"); } break; @@ -12149,11 +12306,11 @@ public final EosContext eos() throws RecognitionException { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 72: + case 74: return expression_sempred((ExpressionContext)_localctx, predIndex); - case 80: + case 82: return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex); - case 174: + case 176: return eos_sempred((EosContext)_localctx, predIndex); } return true; @@ -12213,7 +12370,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009f\u06c1\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a0\u06de\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -12237,117 +12394,120 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4\t\u00a4"+ "\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8\4\u00a9"+ "\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad"+ - "\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\3\2\3\2\3\2\3\3\3\3\3"+ - "\3\3\4\3\4\3\4\3\5\3\5\3\5\7\5\u016d\n\5\f\5\16\5\u0170\13\5\3\6\3\6\5"+ - "\6\u0174\n\6\3\7\3\7\3\7\7\7\u0179\n\7\f\7\16\7\u017c\13\7\3\7\3\7\3\7"+ - "\3\7\3\7\7\7\u0183\n\7\f\7\16\7\u0186\13\7\3\7\3\7\3\7\5\7\u018b\n\7\3"+ - "\7\3\7\7\7\u018f\n\7\f\7\16\7\u0192\13\7\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3"+ - "\t\3\n\3\n\3\n\7\n\u019f\n\n\f\n\16\n\u01a2\13\n\3\n\5\n\u01a5\n\n\3\n"+ - "\3\n\3\13\3\13\3\13\7\13\u01ac\n\13\f\13\16\13\u01af\13\13\3\13\3\13\3"+ - "\13\3\13\3\13\3\13\3\13\7\13\u01b8\n\13\f\13\16\13\u01bb\13\13\3\13\5"+ - "\13\u01be\n\13\3\f\3\f\3\f\3\f\5\f\u01c4\n\f\3\r\3\r\3\r\3\r\3\r\3\r\5"+ - "\r\u01cc\n\r\3\16\3\16\3\17\3\17\3\17\3\20\3\20\3\20\5\20\u01d6\n\20\3"+ - "\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\5"+ - "\21\u01e6\n\21\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\7\24"+ - "\u01f2\n\24\f\24\16\24\u01f5\13\24\3\24\5\24\u01f8\n\24\3\25\3\25\3\25"+ - "\7\25\u01fd\n\25\f\25\16\25\u0200\13\25\3\25\3\25\3\26\7\26\u0205\n\26"+ - "\f\26\16\26\u0208\13\26\3\27\3\27\3\27\3\27\7\27\u020e\n\27\f\27\16\27"+ - "\u0211\13\27\3\27\3\27\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3"+ - "\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\35\3"+ - "\35\3\35\3\35\3\35\5\35\u0230\n\35\3\35\3\35\3\35\3\35\3\36\3\36\5\36"+ - "\u0238\n\36\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3"+ - "\"\3#\3#\3#\3#\3#\5#\u0250\n#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\7"+ - "%\u025f\n%\f%\16%\u0262\13%\3%\3%\3&\3&\3&\3&\3\'\3\'\3\'\5\'\u026d\n"+ - "\'\3(\3(\3(\3(\3(\7(\u0274\n(\f(\16(\u0277\13(\3(\3(\3)\3)\3)\3)\3)\3"+ - ")\3)\3)\3)\5)\u0284\n)\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3"+ - "+\5+\u0296\n+\3,\3,\3,\3,\3,\5,\u029d\n,\3,\7,\u02a0\n,\f,\16,\u02a3\13"+ - ",\3,\3,\5,\u02a7\n,\3-\3-\3-\3-\3-\3-\3-\3-\5-\u02b1\n-\3.\5.\u02b4\n"+ - ".\3.\3.\5.\u02b8\n.\3/\3/\5/\u02bc\n/\3\60\3\60\3\60\3\60\3\60\5\60\u02c3"+ - "\n\60\3\60\5\60\u02c6\n\60\3\60\3\60\3\61\3\61\5\61\u02cc\n\61\3\61\3"+ - "\61\3\61\5\61\u02d1\n\61\5\61\u02d3\n\61\3\61\5\61\u02d6\n\61\3\62\3\62"+ - "\3\62\7\62\u02db\n\62\f\62\16\62\u02de\13\62\3\63\3\63\5\63\u02e2\n\63"+ - "\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65"+ - "\3\65\7\65\u02f3\n\65\f\65\16\65\u02f6\13\65\3\65\3\65\3\65\7\65\u02fb"+ - "\n\65\f\65\16\65\u02fe\13\65\3\65\5\65\u0301\n\65\3\66\5\66\u0304\n\66"+ - "\3\66\3\66\3\66\3\66\5\66\u030a\n\66\3\67\3\67\5\67\u030e\n\67\3\67\5"+ - "\67\u0311\n\67\3\67\3\67\3\67\38\38\38\38\38\58\u031b\n8\39\39\39\39\3"+ - "9\59\u0322\n9\3:\3:\3:\3:\3:\5:\u0329\n:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3"+ - "<\5<\u0335\n<\3=\3=\3=\3=\5=\u033b\n=\3>\3>\3>\3>\3>\5>\u0342\n>\3?\3"+ - "?\3?\5?\u0347\n?\3@\3@\3@\3@\5@\u034d\n@\3A\3A\3A\3A\3A\3B\3B\3B\3B\3"+ - "B\5B\u0359\nB\3C\3C\3C\3C\5C\u035f\nC\3C\3C\5C\u0363\nC\3D\3D\3D\3D\3"+ - "E\3E\5E\u036b\nE\3E\3E\5E\u036f\nE\3E\3E\3F\3F\5F\u0375\nF\3G\5G\u0378"+ - "\nG\3G\3G\3H\3H\5H\u037e\nH\3H\3H\3I\5I\u0383\nI\3I\3I\3J\3J\3J\3J\3J"+ - "\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\5J\u0397\nJ\3J\3J\3J\3J\3J\3J\3J\3J"+ - "\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J"+ - "\3J\3J\7J\u03ba\nJ\fJ\16J\u03bd\13J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3"+ - "K\3K\3K\3K\3K\3K\3K\3K\3K\5K\u03d3\nK\3L\3L\3L\3M\3M\3M\5M\u03db\nM\3"+ - "N\3N\3N\3O\3O\3O\3O\7O\u03e4\nO\fO\16O\u03e7\13O\3O\3O\3O\3O\5O\u03ed"+ - "\nO\3P\3P\3P\3P\3P\5P\u03f4\nP\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\5Q\u03fe\nQ\3R"+ - "\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\5R\u040c\nR\3R\3R\3R\3R\3R\3R\3R\3R"+ - "\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\7R\u0422\nR\fR\16R\u0425\13R\3S\3"+ - "S\3S\3T\3T\5T\u042c\nT\3T\3T\5T\u0430\nT\3U\3U\5U\u0434\nU\3U\5U\u0437"+ - "\nU\3U\3U\3V\3V\3V\3V\3V\5V\u0440\nV\3V\3V\7V\u0444\nV\fV\16V\u0447\13"+ - "V\3V\3V\3W\3W\3W\3W\3X\5X\u0450\nX\3X\3X\3X\3X\3X\3X\5X\u0458\nX\3X\3"+ - "X\3X\3X\5X\u045e\nX\3Y\3Y\3Y\3Y\3Y\3Y\3Y\5Y\u0467\nY\3Z\3Z\3Z\3Z\3Z\3"+ - "Z\3Z\3Z\3Z\5Z\u0472\nZ\3[\3[\3[\3\\\3\\\3\\\3\\\7\\\u047b\n\\\f\\\16\\"+ - "\u047e\13\\\3\\\5\\\u0481\n\\\5\\\u0483\n\\\3\\\3\\\3]\3]\3]\3]\3]\3]"+ - "\3]\5]\u048e\n]\3^\3^\3^\3^\3^\3_\3_\5_\u0497\n_\3_\3_\5_\u049b\n_\3_"+ - "\5_\u049e\n_\3_\3_\3_\3_\3_\5_\u04a5\n_\3_\3_\3`\3`\3a\3a\3b\3b\3c\5c"+ - "\u04b0\nc\3c\3c\3d\3d\3d\3d\3d\3d\5d\u04ba\nd\3d\3d\3d\3d\5d\u04c0\nd"+ - "\5d\u04c2\nd\3e\3e\3e\3f\3f\3g\3g\3g\5g\u04cc\ng\3h\3h\3h\3h\3h\3h\7h"+ - "\u04d4\nh\fh\16h\u04d7\13h\3h\5h\u04da\nh\3i\3i\5i\u04de\ni\3i\3i\5i\u04e2"+ - "\ni\3j\3j\3j\7j\u04e7\nj\fj\16j\u04ea\13j\3k\3k\3k\7k\u04ef\nk\fk\16k"+ - "\u04f2\13k\3l\3l\3l\3l\3l\3l\7l\u04fa\nl\fl\16l\u04fd\13l\3l\5l\u0500"+ - "\nl\3m\3m\5m\u0504\nm\3m\3m\3n\3n\3n\3n\3n\3n\7n\u050e\nn\fn\16n\u0511"+ - "\13n\3n\5n\u0514\nn\3o\3o\5o\u0518\no\3o\3o\3p\5p\u051d\np\3p\3p\3p\6"+ - "p\u0522\np\rp\16p\u0523\3q\3q\3q\3q\3q\5q\u052b\nq\3r\3r\3s\3s\3s\3s\3"+ - "t\3t\3t\3u\3u\3u\3u\3v\3v\3w\3w\3w\5w\u053f\nw\3x\3x\5x\u0543\nx\3y\3"+ - "y\5y\u0547\ny\3z\3z\5z\u054b\nz\3{\3{\3{\3|\3|\3}\3}\3}\3}\3}\3}\3}\3"+ - "}\3}\5}\u055b\n}\3}\3}\3}\3}\5}\u0561\n}\5}\u0563\n}\3~\3~\5~\u0567\n"+ - "~\3\177\3\177\5\177\u056b\n\177\3\177\5\177\u056e\n\177\3\177\3\177\5"+ - "\177\u0572\n\177\5\177\u0574\n\177\3\177\3\177\7\177\u0578\n\177\f\177"+ - "\16\177\u057b\13\177\3\177\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u0582"+ - "\n\u0080\3\u0081\3\u0081\3\u0081\5\u0081\u0587\n\u0081\3\u0082\3\u0082"+ - "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\5\u0082\u0592"+ - "\n\u0082\3\u0082\3\u0082\7\u0082\u0596\n\u0082\f\u0082\16\u0082\u0599"+ - "\13\u0082\3\u0082\3\u0082\3\u0083\3\u0083\5\u0083\u059f\n\u0083\3\u0083"+ - "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\5\u0084"+ - "\u05aa\n\u0084\3\u0085\3\u0085\3\u0085\5\u0085\u05af\n\u0085\3\u0086\3"+ - "\u0086\5\u0086\u05b3\n\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u05b8\n\u0086"+ - "\7\u0086\u05ba\n\u0086\f\u0086\16\u0086\u05bd\13\u0086\3\u0087\3\u0087"+ - "\3\u0087\7\u0087\u05c2\n\u0087\f\u0087\16\u0087\u05c5\13\u0087\3\u0087"+ - "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u05cc\n\u0088\3\u0089\3\u0089"+ - "\3\u0089\5\u0089\u05d1\n\u0089\3\u0089\5\u0089\u05d4\n\u0089\3\u008a\3"+ - "\u008a\3\u008a\3\u008a\3\u008a\3\u008a\5\u008a\u05dc\n\u008a\3\u008a\3"+ - "\u008a\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u05e4\n\u008b\3\u008b\3"+ - "\u008b\3\u008c\5\u008c\u05e9\n\u008c\3\u008c\3\u008c\5\u008c\u05ed\n\u008c"+ - "\3\u008c\3\u008c\5\u008c\u05f1\n\u008c\3\u008d\3\u008d\3\u008d\3\u008e"+ - "\3\u008e\5\u008e\u05f8\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f"+ - "\3\u0090\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+ - "\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095"+ - "\3\u0095\3\u0095\3\u0095\3\u0095\5\u0095\u0615\n\u0095\3\u0095\3\u0095"+ - "\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u0620"+ - "\n\u0097\3\u0098\3\u0098\5\u0098\u0624\n\u0098\3\u0099\3\u0099\3\u0099"+ - "\3\u0099\7\u0099\u062a\n\u0099\f\u0099\16\u0099\u062d\13\u0099\3\u0099"+ - "\5\u0099\u0630\n\u0099\5\u0099\u0632\n\u0099\3\u0099\3\u0099\3\u009a\3"+ - "\u009a\3\u009a\3\u009a\5\u009a\u063a\n\u009a\3\u009a\3\u009a\3\u009b\3"+ - "\u009b\3\u009b\3\u009b\3\u009b\5\u009b\u0643\n\u009b\3\u009c\3\u009c\3"+ - "\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u064b\n\u009c\3\u009d\3\u009d\3"+ - "\u009d\5\u009d\u0650\n\u009d\3\u009e\3\u009e\3\u009f\3\u009f\3\u00a0\3"+ - "\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2"+ - "\5\u00a2\u0660\n\u00a2\5\u00a2\u0662\n\u00a2\3\u00a2\3\u00a2\3\u00a3\3"+ - "\u00a3\3\u00a3\7\u00a3\u0669\n\u00a3\f\u00a3\16\u00a3\u066c\13\u00a3\3"+ - "\u00a4\3\u00a4\3\u00a4\5\u00a4\u0671\n\u00a4\3\u00a4\3\u00a4\3\u00a5\3"+ - "\u00a5\5\u00a5\u0677\n\u00a5\3\u00a6\3\u00a6\5\u00a6\u067b\n\u00a6\3\u00a7"+ - "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u0682\n\u00a7\f\u00a7\16\u00a7"+ - "\u0685\13\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\3\u00a8\5\u00a8"+ - "\u068d\n\u00a8\3\u00a8\5\u00a8\u0690\n\u00a8\3\u00a9\3\u00a9\3\u00aa\5"+ - "\u00aa\u0695\n\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3"+ - "\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad"+ - "\3\u00ad\5\u00ad\u06a7\n\u00ad\5\u00ad\u06a9\n\u00ad\3\u00ad\5\u00ad\u06ac"+ - "\n\u00ad\3\u00ad\5\u00ad\u06af\n\u00ad\5\u00ad\u06b1\n\u00ad\3\u00ad\3"+ - "\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00b0\3\u00b0"+ - "\3\u00b0\3\u00b0\5\u00b0\u06bf\n\u00b0\3\u00b0\3\u02a1\4\u0092\u00a2\u00b1"+ + "\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1\4\u00b2"+ + "\t\u00b2\3\2\3\2\3\2\3\3\3\3\3\3\3\4\3\4\3\4\3\5\3\5\3\5\7\5\u0171\n\5"+ + "\f\5\16\5\u0174\13\5\3\6\3\6\5\6\u0178\n\6\3\7\3\7\3\7\7\7\u017d\n\7\f"+ + "\7\16\7\u0180\13\7\3\7\3\7\3\7\3\7\3\7\7\7\u0187\n\7\f\7\16\7\u018a\13"+ + "\7\3\7\3\7\3\7\5\7\u018f\n\7\3\7\3\7\7\7\u0193\n\7\f\7\16\7\u0196\13\7"+ + "\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3\t\3\n\3\n\3\n\7\n\u01a3\n\n\f\n\16\n\u01a6"+ + "\13\n\3\n\5\n\u01a9\n\n\3\n\3\n\3\13\3\13\3\13\7\13\u01b0\n\13\f\13\16"+ + "\13\u01b3\13\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\7\13\u01bc\n\13\f\13"+ + "\16\13\u01bf\13\13\3\13\5\13\u01c2\n\13\3\f\3\f\3\f\3\f\5\f\u01c8\n\f"+ + "\3\r\3\r\3\r\3\r\3\r\3\r\5\r\u01d0\n\r\3\16\3\16\3\17\3\17\3\17\3\20\3"+ + "\20\3\20\5\20\u01da\n\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ + "\3\21\3\21\3\21\3\21\3\21\5\21\u01ea\n\21\3\22\3\22\3\23\3\23\3\23\3\23"+ + "\3\23\3\24\3\24\3\24\7\24\u01f6\n\24\f\24\16\24\u01f9\13\24\3\24\5\24"+ + "\u01fc\n\24\3\25\3\25\3\25\7\25\u0201\n\25\f\25\16\25\u0204\13\25\3\25"+ + "\3\25\3\26\7\26\u0209\n\26\f\26\16\26\u020c\13\26\3\27\3\27\3\27\3\27"+ + "\7\27\u0212\n\27\f\27\16\27\u0215\13\27\3\27\3\27\3\30\3\30\3\31\3\31"+ + "\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34"+ + "\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\5\35\u0234\n\35\3\35\3\35"+ + "\3\35\3\35\3\36\3\36\5\36\u023c\n\36\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3"+ + "!\3!\3!\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\5#\u0254\n#\3#\3#\3$\3$\3$"+ + "\3$\3$\3$\3$\3%\3%\3%\3%\7%\u0263\n%\f%\16%\u0266\13%\3%\3%\3&\3&\3&\3"+ + "&\3\'\3\'\3\'\3\'\5\'\u0272\n\'\3(\3(\3(\3(\3(\7(\u0279\n(\f(\16(\u027c"+ + "\13(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u0289\n)\3*\3*\3*\3*\3*\7*\u0290"+ + "\n*\f*\16*\u0293\13*\3*\3*\3+\3+\3+\3+\3+\7+\u029c\n+\f+\16+\u029f\13"+ + "+\3+\3+\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\5-\u02b3\n-\3"+ + ".\3.\3.\3.\3.\5.\u02ba\n.\3.\7.\u02bd\n.\f.\16.\u02c0\13.\3.\3.\5.\u02c4"+ + "\n.\3/\3/\3/\3/\3/\3/\3/\3/\5/\u02ce\n/\3\60\5\60\u02d1\n\60\3\60\3\60"+ + "\5\60\u02d5\n\60\3\61\3\61\5\61\u02d9\n\61\3\62\3\62\3\62\3\62\3\62\5"+ + "\62\u02e0\n\62\3\62\5\62\u02e3\n\62\3\62\3\62\3\63\3\63\5\63\u02e9\n\63"+ + "\3\63\3\63\3\63\5\63\u02ee\n\63\5\63\u02f0\n\63\3\63\5\63\u02f3\n\63\3"+ + "\64\3\64\3\64\7\64\u02f8\n\64\f\64\16\64\u02fb\13\64\3\65\3\65\5\65\u02ff"+ + "\n\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67"+ + "\3\67\3\67\7\67\u0310\n\67\f\67\16\67\u0313\13\67\3\67\3\67\3\67\7\67"+ + "\u0318\n\67\f\67\16\67\u031b\13\67\3\67\5\67\u031e\n\67\38\58\u0321\n"+ + "8\38\38\38\38\58\u0327\n8\39\39\59\u032b\n9\39\59\u032e\n9\39\39\39\3"+ + ":\3:\3:\3:\3:\5:\u0338\n:\3;\3;\3;\3;\3;\5;\u033f\n;\3<\3<\3<\3<\3<\5"+ + "<\u0346\n<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\5>\u0352\n>\3?\3?\3?\3?\5?\u0358"+ + "\n?\3@\3@\3@\3@\3@\5@\u035f\n@\3A\3A\3A\5A\u0364\nA\3B\3B\3B\3B\5B\u036a"+ + "\nB\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\5D\u0376\nD\3E\3E\3E\3E\5E\u037c\nE"+ + "\3E\3E\5E\u0380\nE\3F\3F\3F\3F\3G\3G\5G\u0388\nG\3G\3G\5G\u038c\nG\3G"+ + "\3G\3H\3H\5H\u0392\nH\3I\5I\u0395\nI\3I\3I\3J\3J\5J\u039b\nJ\3J\3J\3K"+ + "\5K\u03a0\nK\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\5L"+ + "\u03b4\nL\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L"+ + "\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\7L\u03d7\nL\fL\16L\u03da\13L\3"+ + "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\5M\u03f0\n"+ + "M\3N\3N\3N\3O\3O\3O\5O\u03f8\nO\3P\3P\3P\3Q\3Q\3Q\3Q\7Q\u0401\nQ\fQ\16"+ + "Q\u0404\13Q\3Q\3Q\3Q\3Q\5Q\u040a\nQ\3R\3R\3R\3R\3R\5R\u0411\nR\3S\3S\3"+ + "S\3S\3S\3S\3S\3S\5S\u041b\nS\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\5T\u0429"+ + "\nT\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\7T\u043f"+ + "\nT\fT\16T\u0442\13T\3U\3U\3U\3V\3V\5V\u0449\nV\3V\3V\5V\u044d\nV\3W\3"+ + "W\5W\u0451\nW\3W\5W\u0454\nW\3W\3W\3X\3X\3X\3X\3X\5X\u045d\nX\3X\3X\7"+ + "X\u0461\nX\fX\16X\u0464\13X\3X\3X\3Y\3Y\3Y\3Y\3Z\5Z\u046d\nZ\3Z\3Z\3Z"+ + "\3Z\3Z\3Z\5Z\u0475\nZ\3Z\3Z\3Z\3Z\5Z\u047b\nZ\3[\3[\3[\3[\3[\3[\3[\5["+ + "\u0484\n[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\5\\\u048f\n\\\3]\3]\3]\3"+ + "^\3^\3^\3^\7^\u0498\n^\f^\16^\u049b\13^\3^\5^\u049e\n^\5^\u04a0\n^\3^"+ + "\3^\3_\3_\3_\3_\3_\3_\3_\5_\u04ab\n_\3`\3`\3`\3`\3`\3a\3a\5a\u04b4\na"+ + "\3a\3a\5a\u04b8\na\3a\5a\u04bb\na\3a\3a\3a\3a\3a\5a\u04c2\na\3a\3a\3b"+ + "\3b\3c\3c\3d\3d\3e\5e\u04cd\ne\3e\3e\3f\3f\3f\3f\3f\3f\5f\u04d7\nf\3f"+ + "\3f\3f\3f\5f\u04dd\nf\5f\u04df\nf\3g\3g\3g\3h\3h\3i\3i\3i\5i\u04e9\ni"+ + "\3j\3j\3j\3j\3j\3j\7j\u04f1\nj\fj\16j\u04f4\13j\3j\5j\u04f7\nj\3k\3k\5"+ + "k\u04fb\nk\3k\3k\5k\u04ff\nk\3l\3l\3l\7l\u0504\nl\fl\16l\u0507\13l\3m"+ + "\3m\3m\7m\u050c\nm\fm\16m\u050f\13m\3n\3n\3n\3n\3n\3n\7n\u0517\nn\fn\16"+ + "n\u051a\13n\3n\5n\u051d\nn\3o\3o\5o\u0521\no\3o\3o\3p\3p\3p\3p\3p\3p\7"+ + "p\u052b\np\fp\16p\u052e\13p\3p\5p\u0531\np\3q\3q\5q\u0535\nq\3q\3q\3r"+ + "\5r\u053a\nr\3r\3r\3r\6r\u053f\nr\rr\16r\u0540\3s\3s\3s\3s\3s\5s\u0548"+ + "\ns\3t\3t\3u\3u\3u\3u\3v\3v\3v\3w\3w\3w\3w\3x\3x\3y\3y\3y\5y\u055c\ny"+ + "\3z\3z\5z\u0560\nz\3{\3{\5{\u0564\n{\3|\3|\5|\u0568\n|\3}\3}\3}\3~\3~"+ + "\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\5\177\u0578\n\177"+ + "\3\177\3\177\3\177\3\177\5\177\u057e\n\177\5\177\u0580\n\177\3\u0080\3"+ + "\u0080\5\u0080\u0584\n\u0080\3\u0081\3\u0081\5\u0081\u0588\n\u0081\3\u0081"+ + "\5\u0081\u058b\n\u0081\3\u0081\3\u0081\5\u0081\u058f\n\u0081\5\u0081\u0591"+ + "\n\u0081\3\u0081\3\u0081\7\u0081\u0595\n\u0081\f\u0081\16\u0081\u0598"+ + "\13\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082\5\u0082\u059f\n\u0082"+ + "\3\u0083\3\u0083\3\u0083\5\u0083\u05a4\n\u0083\3\u0084\3\u0084\3\u0084"+ + "\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\5\u0084\u05af\n\u0084"+ + "\3\u0084\3\u0084\7\u0084\u05b3\n\u0084\f\u0084\16\u0084\u05b6\13\u0084"+ + "\3\u0084\3\u0084\3\u0085\3\u0085\5\u0085\u05bc\n\u0085\3\u0085\3\u0085"+ + "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\5\u0086\u05c7"+ + "\n\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u05cc\n\u0087\3\u0088\3\u0088"+ + "\5\u0088\u05d0\n\u0088\3\u0088\3\u0088\3\u0088\5\u0088\u05d5\n\u0088\7"+ + "\u0088\u05d7\n\u0088\f\u0088\16\u0088\u05da\13\u0088\3\u0089\3\u0089\3"+ + "\u0089\7\u0089\u05df\n\u0089\f\u0089\16\u0089\u05e2\13\u0089\3\u0089\3"+ + "\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u05e9\n\u008a\3\u008b\3\u008b\3"+ + "\u008b\5\u008b\u05ee\n\u008b\3\u008b\5\u008b\u05f1\n\u008b\3\u008c\3\u008c"+ + "\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u05f9\n\u008c\3\u008c\3\u008c"+ + "\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u0601\n\u008d\3\u008d\3\u008d"+ + "\3\u008e\5\u008e\u0606\n\u008e\3\u008e\3\u008e\5\u008e\u060a\n\u008e\3"+ + "\u008e\3\u008e\5\u008e\u060e\n\u008e\3\u008f\3\u008f\3\u008f\3\u0090\3"+ + "\u0090\5\u0090\u0615\n\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3"+ + "\u0092\3\u0092\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095"+ + "\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097"+ + "\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u0632\n\u0097\3\u0097\3\u0097"+ + "\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\5\u0099\u063d"+ + "\n\u0099\3\u009a\3\u009a\5\u009a\u0641\n\u009a\3\u009b\3\u009b\3\u009b"+ + "\3\u009b\7\u009b\u0647\n\u009b\f\u009b\16\u009b\u064a\13\u009b\3\u009b"+ + "\5\u009b\u064d\n\u009b\5\u009b\u064f\n\u009b\3\u009b\3\u009b\3\u009c\3"+ + "\u009c\3\u009c\3\u009c\5\u009c\u0657\n\u009c\3\u009c\3\u009c\3\u009d\3"+ + "\u009d\3\u009d\3\u009d\3\u009d\5\u009d\u0660\n\u009d\3\u009e\3\u009e\3"+ + "\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u0668\n\u009e\3\u009f\3\u009f\3"+ + "\u009f\5\u009f\u066d\n\u009f\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a2\3"+ + "\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4"+ + "\5\u00a4\u067d\n\u00a4\5\u00a4\u067f\n\u00a4\3\u00a4\3\u00a4\3\u00a5\3"+ + "\u00a5\3\u00a5\7\u00a5\u0686\n\u00a5\f\u00a5\16\u00a5\u0689\13\u00a5\3"+ + "\u00a6\3\u00a6\3\u00a6\5\u00a6\u068e\n\u00a6\3\u00a6\3\u00a6\3\u00a7\3"+ + "\u00a7\5\u00a7\u0694\n\u00a7\3\u00a8\3\u00a8\5\u00a8\u0698\n\u00a8\3\u00a9"+ + "\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9\u069f\n\u00a9\f\u00a9\16\u00a9"+ + "\u06a2\13\u00a9\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa"+ + "\u06aa\n\u00aa\3\u00aa\5\u00aa\u06ad\n\u00aa\3\u00ab\3\u00ab\3\u00ac\5"+ + "\u00ac\u06b2\n\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3"+ + "\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af\3\u00af"+ + "\3\u00af\5\u00af\u06c4\n\u00af\5\u00af\u06c6\n\u00af\3\u00af\5\u00af\u06c9"+ + "\n\u00af\3\u00af\5\u00af\u06cc\n\u00af\5\u00af\u06ce\n\u00af\3\u00af\3"+ + "\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b2\3\u00b2"+ + "\3\u00b2\3\u00b2\5\u00b2\u06dc\n\u00b2\3\u00b2\3\u02be\4\u0096\u00a6\u00b3"+ "\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFH"+ "JLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c"+ "\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4"+ @@ -12358,550 +12518,559 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c"+ "\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134"+ "\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c"+ - "\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\2\25\4\2ddoo\3"+ - "\2\31\32\3\2\7\n\3\2@A\3\2)+\4\2)+--\3\2\u0082\u0088\3\2\26\27\4\2}\u0081"+ - "\u0086\u0087\6\2$$pp||\u0083\u0085\3\2 \"\3\2\35\37\4\2GHv{\6\2..\61\61"+ - "\64\64\\\\\4\2|\u0081\u0083\u0087\3\2pq\4\2mm\u009e\u009e\4\2\u0089\u008c"+ - "\u008e\u008f\3\2\u0095\u0096\2\u071f\2\u0160\3\2\2\2\4\u0163\3\2\2\2\6"+ - "\u0166\3\2\2\2\b\u0169\3\2\2\2\n\u0171\3\2\2\2\f\u017a\3\2\2\2\16\u0195"+ - "\3\2\2\2\20\u0198\3\2\2\2\22\u01a0\3\2\2\2\24\u01ad\3\2\2\2\26\u01c3\3"+ - "\2\2\2\30\u01cb\3\2\2\2\32\u01cd\3\2\2\2\34\u01cf\3\2\2\2\36\u01d2\3\2"+ - "\2\2 \u01e5\3\2\2\2\"\u01e7\3\2\2\2$\u01e9\3\2\2\2&\u01ee\3\2\2\2(\u01f9"+ - "\3\2\2\2*\u0206\3\2\2\2,\u0209\3\2\2\2.\u0214\3\2\2\2\60\u0216\3\2\2\2"+ - "\62\u021b\3\2\2\2\64\u0220\3\2\2\2\66\u0225\3\2\2\28\u022a\3\2\2\2:\u0237"+ - "\3\2\2\2<\u0239\3\2\2\2>\u023b\3\2\2\2@\u0240\3\2\2\2B\u0245\3\2\2\2D"+ - "\u024a\3\2\2\2F\u0253\3\2\2\2H\u025a\3\2\2\2J\u0265\3\2\2\2L\u026c\3\2"+ - "\2\2N\u026e\3\2\2\2P\u0283\3\2\2\2R\u0285\3\2\2\2T\u0295\3\2\2\2V\u02a1"+ - "\3\2\2\2X\u02b0\3\2\2\2Z\u02b3\3\2\2\2\\\u02bb\3\2\2\2^\u02bd\3\2\2\2"+ - "`\u02cb\3\2\2\2b\u02d7\3\2\2\2d\u02e1\3\2\2\2f\u02e5\3\2\2\2h\u02eb\3"+ - "\2\2\2j\u0303\3\2\2\2l\u030b\3\2\2\2n\u031a\3\2\2\2p\u031c\3\2\2\2r\u0323"+ - "\3\2\2\2t\u032c\3\2\2\2v\u0331\3\2\2\2x\u0336\3\2\2\2z\u033c\3\2\2\2|"+ - "\u0343\3\2\2\2~\u0348\3\2\2\2\u0080\u034e\3\2\2\2\u0082\u0353\3\2\2\2"+ - "\u0084\u035a\3\2\2\2\u0086\u0364\3\2\2\2\u0088\u0368\3\2\2\2\u008a\u0374"+ - "\3\2\2\2\u008c\u0377\3\2\2\2\u008e\u037b\3\2\2\2\u0090\u0382\3\2\2\2\u0092"+ - "\u0396\3\2\2\2\u0094\u03d2\3\2\2\2\u0096\u03d4\3\2\2\2\u0098\u03d7\3\2"+ - "\2\2\u009a\u03dc\3\2\2\2\u009c\u03e5\3\2\2\2\u009e\u03f3\3\2\2\2\u00a0"+ - "\u03fd\3\2\2\2\u00a2\u040b\3\2\2\2\u00a4\u0426\3\2\2\2\u00a6\u0429\3\2"+ - "\2\2\u00a8\u0431\3\2\2\2\u00aa\u043a\3\2\2\2\u00ac\u044a\3\2\2\2\u00ae"+ - "\u045d\3\2\2\2\u00b0\u0466\3\2\2\2\u00b2\u0471\3\2\2\2\u00b4\u0473\3\2"+ - "\2\2\u00b6\u0476\3\2\2\2\u00b8\u048d\3\2\2\2\u00ba\u048f\3\2\2\2\u00bc"+ - "\u0494\3\2\2\2\u00be\u04a8\3\2\2\2\u00c0\u04aa\3\2\2\2\u00c2\u04ac\3\2"+ - "\2\2\u00c4\u04af\3\2\2\2\u00c6\u04b9\3\2\2\2\u00c8\u04c3\3\2\2\2\u00ca"+ - "\u04c6\3\2\2\2\u00cc\u04cb\3\2\2\2\u00ce\u04cd\3\2\2\2\u00d0\u04db\3\2"+ - "\2\2\u00d2\u04e3\3\2\2\2\u00d4\u04eb\3\2\2\2\u00d6\u04f3\3\2\2\2\u00d8"+ - "\u0501\3\2\2\2\u00da\u0507\3\2\2\2\u00dc\u0515\3\2\2\2\u00de\u0521\3\2"+ - "\2\2\u00e0\u052a\3\2\2\2\u00e2\u052c\3\2\2\2\u00e4\u052e\3\2\2\2\u00e6"+ - "\u0532\3\2\2\2\u00e8\u0535\3\2\2\2\u00ea\u0539\3\2\2\2\u00ec\u053b\3\2"+ - "\2\2\u00ee\u0540\3\2\2\2\u00f0\u0544\3\2\2\2\u00f2\u0548\3\2\2\2\u00f4"+ - "\u054c\3\2\2\2\u00f6\u054f\3\2\2\2\u00f8\u0551\3\2\2\2\u00fa\u0566\3\2"+ - "\2\2\u00fc\u0568\3\2\2\2\u00fe\u057e\3\2\2\2\u0100\u0586\3\2\2\2\u0102"+ - "\u0588\3\2\2\2\u0104\u059e\3\2\2\2\u0106\u05a6\3\2\2\2\u0108\u05ae\3\2"+ - "\2\2\u010a\u05b2\3\2\2\2\u010c\u05be\3\2\2\2\u010e\u05c8\3\2\2\2\u0110"+ - "\u05d3\3\2\2\2\u0112\u05db\3\2\2\2\u0114\u05df\3\2\2\2\u0116\u05e8\3\2"+ - "\2\2\u0118\u05f2\3\2\2\2\u011a\u05f7\3\2\2\2\u011c\u05f9\3\2\2\2\u011e"+ - "\u05fe\3\2\2\2\u0120\u0600\3\2\2\2\u0122\u0602\3\2\2\2\u0124\u0605\3\2"+ - "\2\2\u0126\u0609\3\2\2\2\u0128\u0614\3\2\2\2\u012a\u0618\3\2\2\2\u012c"+ - "\u061f\3\2\2\2\u012e\u0623\3\2\2\2\u0130\u0625\3\2\2\2\u0132\u0635\3\2"+ - "\2\2\u0134\u0642\3\2\2\2\u0136\u064a\3\2\2\2\u0138\u064f\3\2\2\2\u013a"+ - "\u0651\3\2\2\2\u013c\u0653\3\2\2\2\u013e\u0655\3\2\2\2\u0140\u0659\3\2"+ - "\2\2\u0142\u065c\3\2\2\2\u0144\u0665\3\2\2\2\u0146\u0670\3\2\2\2\u0148"+ - "\u0676\3\2\2\2\u014a\u067a\3\2\2\2\u014c\u067c\3\2\2\2\u014e\u068c\3\2"+ - "\2\2\u0150\u0691\3\2\2\2\u0152\u0694\3\2\2\2\u0154\u0698\3\2\2\2\u0156"+ - "\u069c\3\2\2\2\u0158\u06a1\3\2\2\2\u015a\u06b4\3\2\2\2\u015c\u06b8\3\2"+ - "\2\2\u015e\u06be\3\2\2\2\u0160\u0161\5\u0092J\2\u0161\u0162\7\2\2\3\u0162"+ - "\3\3\2\2\2\u0163\u0164\5\u0094K\2\u0164\u0165\7\2\2\3\u0165\5\3\2\2\2"+ - "\u0166\u0167\5\u00b0Y\2\u0167\u0168\7\2\2\3\u0168\7\3\2\2\2\u0169\u016e"+ - "\5\n\6\2\u016a\u016b\7l\2\2\u016b\u016d\5\n\6\2\u016c\u016a\3\2\2\2\u016d"+ - "\u0170\3\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f\3\2\2\2\u016f\t\3\2\2\2"+ - "\u0170\u016e\3\2\2\2\u0171\u0173\7d\2\2\u0172\u0174\7;\2\2\u0173\u0172"+ - "\3\2\2\2\u0173\u0174\3\2\2\2\u0174\13\3\2\2\2\u0175\u0176\5\16\b\2\u0176"+ - "\u0177\5\u015e\u00b0\2\u0177\u0179\3\2\2\2\u0178\u0175\3\2\2\2\u0179\u017c"+ - "\3\2\2\2\u017a\u0178\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u017d\3\2\2\2\u017c"+ - "\u017a\3\2\2\2\u017d\u017e\5\u00c8e\2\u017e\u0184\5\u015e\u00b0\2\u017f"+ - "\u0180\5\24\13\2\u0180\u0181\5\u015e\u00b0\2\u0181\u0183\3\2\2\2\u0182"+ - "\u017f\3\2\2\2\u0183\u0186\3\2\2\2\u0184\u0182\3\2\2\2\u0184\u0185\3\2"+ - "\2\2\u0185\u0190\3\2\2\2\u0186\u0184\3\2\2\2\u0187\u018b\5v<\2\u0188\u018b"+ - "\5\u00ccg\2\u0189\u018b\5\26\f\2\u018a\u0187\3\2\2\2\u018a\u0188\3\2\2"+ - "\2\u018a\u0189\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018d\5\u015e\u00b0\2"+ - "\u018d\u018f\3\2\2\2\u018e\u018a\3\2\2\2\u018f\u0192\3\2\2\2\u0190\u018e"+ - "\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0193\3\2\2\2\u0192\u0190\3\2\2\2\u0193"+ - "\u0194\7\2\2\3\u0194\r\3\2\2\2\u0195\u0196\7D\2\2\u0196\u0197\5\u0092"+ - "J\2\u0197\17\3\2\2\2\u0198\u0199\7E\2\2\u0199\u019a\5\u0092J\2\u019a\21"+ - "\3\2\2\2\u019b\u019c\5\20\t\2\u019c\u019d\5\u015e\u00b0\2\u019d\u019f"+ - "\3\2\2\2\u019e\u019b\3\2\2\2\u019f\u01a2\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0"+ - "\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0\3\2\2\2\u01a3\u01a5\t\2"+ - "\2\2\u01a4\u01a3\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6"+ - "\u01a7\5\u00caf\2\u01a7\23\3\2\2\2\u01a8\u01a9\5\20\t\2\u01a9\u01aa\5"+ - "\u015e\u00b0\2\u01aa\u01ac\3\2\2\2\u01ab\u01a8\3\2\2\2\u01ac\u01af\3\2"+ - "\2\2\u01ad\u01ab\3\2\2\2\u01ad\u01ae\3\2\2\2\u01ae\u01bd\3\2\2\2\u01af"+ - "\u01ad\3\2\2\2\u01b0\u01b1\7`\2\2\u01b1\u01be\5\22\n\2\u01b2\u01b3\7`"+ - "\2\2\u01b3\u01b9\7e\2\2\u01b4\u01b5\5\22\n\2\u01b5\u01b6\5\u015e\u00b0"+ - "\2\u01b6\u01b8\3\2\2\2\u01b7\u01b4\3\2\2\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7"+ - "\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc"+ - "\u01be\7f\2\2\u01bd\u01b0\3\2\2\2\u01bd\u01b2\3\2\2\2\u01be\25\3\2\2\2"+ - "\u01bf\u01c4\5h\65\2\u01c0\u01c4\5~@\2\u01c1\u01c4\5\u0082B\2\u01c2\u01c4"+ - "\5|?\2\u01c3\u01bf\3\2\2\2\u01c3\u01c0\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c3"+ - "\u01c2\3\2\2\2\u01c4\27\3\2\2\2\u01c5\u01c6\7\34\2\2\u01c6\u01cc\5\u0094"+ - "K\2\u01c7\u01c8\t\3\2\2\u01c8\u01cc\5.\30\2\u01c9\u01ca\t\4\2\2\u01ca"+ - "\u01cc\5\u0092J\2\u01cb\u01c5\3\2\2\2\u01cb\u01c7\3\2\2\2\u01cb\u01c9"+ - "\3\2\2\2\u01cc\31\3\2\2\2\u01cd\u01ce\5\34\17\2\u01ce\33\3\2\2\2\u01cf"+ - "\u01d0\5V,\2\u01d0\u01d1\5\36\20\2\u01d1\35\3\2\2\2\u01d2\u01d3\7C\2\2"+ - "\u01d3\u01d5\7e\2\2\u01d4\u01d6\5\u00dep\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6"+ - "\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\7f\2\2\u01d8\37\3\2\2\2\u01d9"+ - "\u01e6\5F$\2\u01da\u01e6\5D#\2\u01db\u01e6\5B\"\2\u01dc\u01e6\5$\23\2"+ - "\u01dd\u01e6\5@!\2\u01de\u01e6\58\35\2\u01df\u01e6\5> \2\u01e0\u01e6\5"+ - "\66\34\2\u01e1\u01e6\5\62\32\2\u01e2\u01e6\5\60\31\2\u01e3\u01e6\5\64"+ - "\33\2\u01e4\u01e6\5\"\22\2\u01e5\u01d9\3\2\2\2\u01e5\u01da\3\2\2\2\u01e5"+ - "\u01db\3\2\2\2\u01e5\u01dc\3\2\2\2\u01e5\u01dd\3\2\2\2\u01e5\u01de\3\2"+ - "\2\2\u01e5\u01df\3\2\2\2\u01e5\u01e0\3\2\2\2\u01e5\u01e1\3\2\2\2\u01e5"+ - "\u01e2\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5\u01e4\3\2\2\2\u01e6!\3\2\2\2"+ - "\u01e7\u01e8\t\5\2\2\u01e8#\3\2\2\2\u01e9\u01ea\7]\2\2\u01ea\u01eb\7i"+ - "\2\2\u01eb\u01ec\5\u00b0Y\2\u01ec\u01ed\7j\2\2\u01ed%\3\2\2\2\u01ee\u01f3"+ - "\5(\25\2\u01ef\u01f0\7l\2\2\u01f0\u01f2\5(\25\2\u01f1\u01ef\3\2\2\2\u01f2"+ - "\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f7\3\2"+ - "\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f8\7l\2\2\u01f7\u01f6\3\2\2\2\u01f7"+ - "\u01f8\3\2\2\2\u01f8\'\3\2\2\2\u01f9\u01fe\7d\2\2\u01fa\u01fb\7l\2\2\u01fb"+ - "\u01fd\7d\2\2\u01fc\u01fa\3\2\2\2\u01fd\u0200\3\2\2\2\u01fe\u01fc\3\2"+ - "\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\3\2\2\2\u0200\u01fe\3\2\2\2\u0201"+ - "\u0202\5\u0120\u0091\2\u0202)\3\2\2\2\u0203\u0205\5,\27\2\u0204\u0203"+ - "\3\2\2\2\u0205\u0208\3\2\2\2\u0206\u0204\3\2\2\2\u0206\u0207\3\2\2\2\u0207"+ - "+\3\2\2\2\u0208\u0206\3\2\2\2\u0209\u020a\7g\2\2\u020a\u020f\5\u0092J"+ - "\2\u020b\u020c\7l\2\2\u020c\u020e\5\u0092J\2\u020d\u020b\3\2\2\2\u020e"+ - "\u0211\3\2\2\2\u020f\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u0212\3\2"+ - "\2\2\u0211\u020f\3\2\2\2\u0212\u0213\7h\2\2\u0213-\3\2\2\2\u0214\u0215"+ - "\5\u00a2R\2\u0215/\3\2\2\2\u0216\u0217\7\62\2\2\u0217\u0218\7e\2\2\u0218"+ - "\u0219\5\u0092J\2\u0219\u021a\7f\2\2\u021a\61\3\2\2\2\u021b\u021c\7\66"+ - "\2\2\u021c\u021d\7i\2\2\u021d\u021e\5\u00b0Y\2\u021e\u021f\7j\2\2\u021f"+ - "\63\3\2\2\2\u0220\u0221\7\63\2\2\u0221\u0222\7e\2\2\u0222\u0223\5\u0092"+ - "J\2\u0223\u0224\7f\2\2\u0224\65\3\2\2\2\u0225\u0226\t\6\2\2\u0226\u0227"+ - "\7e\2\2\u0227\u0228\5\u0092J\2\u0228\u0229\7f\2\2\u0229\67\3\2\2\2\u022a"+ - "\u022f\7\23\2\2\u022b\u022c\7i\2\2\u022c\u022d\5:\36\2\u022d\u022e\7j"+ - "\2\2\u022e\u0230\3\2\2\2\u022f\u022b\3\2\2\2\u022f\u0230\3\2\2\2\u0230"+ - "\u0231\3\2\2\2\u0231\u0232\7e\2\2\u0232\u0233\5\u0092J\2\u0233\u0234\7"+ - "f\2\2\u02349\3\2\2\2\u0235\u0238\5<\37\2\u0236\u0238\7\25\2\2\u0237\u0235"+ - "\3\2\2\2\u0237\u0236\3\2\2\2\u0238;\3\2\2\2\u0239\u023a\7d\2\2\u023a="+ - "\3\2\2\2\u023b\u023c\7\24\2\2\u023c\u023d\7e\2\2\u023d\u023e\5\u0092J"+ - "\2\u023e\u023f\7f\2\2\u023f?\3\2\2\2\u0240\u0241\79\2\2\u0241\u0242\7"+ - "e\2\2\u0242\u0243\5\u0092J\2\u0243\u0244\7f\2\2\u0244A\3\2\2\2\u0245\u0246"+ - "\78\2\2\u0246\u0247\7e\2\2\u0247\u0248\5\u0092J\2\u0248\u0249\7f\2\2\u0249"+ - "C\3\2\2\2\u024a\u024b\7\30\2\2\u024b\u024c\7e\2\2\u024c\u024f\5\u0092"+ - "J\2\u024d\u024e\7l\2\2\u024e\u0250\5\u0092J\2\u024f\u024d\3\2\2\2\u024f"+ - "\u0250\3\2\2\2\u0250\u0251\3\2\2\2\u0251\u0252\7f\2\2\u0252E\3\2\2\2\u0253"+ - "\u0254\t\6\2\2\u0254\u0255\7i\2\2\u0255\u0256\5\u0092J\2\u0256\u0257\7"+ - "<\2\2\u0257\u0258\5\u0092J\2\u0258\u0259\7j\2\2\u0259G\3\2\2\2\u025a\u025b"+ - "\7i\2\2\u025b\u0260\5J&\2\u025c\u025d\7l\2\2\u025d\u025f\5J&\2\u025e\u025c"+ - "\3\2\2\2\u025f\u0262\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261"+ - "\u0263\3\2\2\2\u0262\u0260\3\2\2\2\u0263\u0264\7j\2\2\u0264I\3\2\2\2\u0265"+ - "\u0266\5\u0092J\2\u0266\u0267\7k\2\2\u0267\u0268\5\u0092J\2\u0268K\3\2"+ - "\2\2\u0269\u026d\5T+\2\u026a\u026d\5R*\2\u026b\u026d\5N(\2\u026c\u0269"+ - "\3\2\2\2\u026c\u026a\3\2\2\2\u026c\u026b\3\2\2\2\u026dM\3\2\2\2\u026e"+ - "\u026f\7\64\2\2\u026f\u0275\7g\2\2\u0270\u0271\5P)\2\u0271\u0272\5\u015e"+ - "\u00b0\2\u0272\u0274\3\2\2\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275"+ - "\u0273\3\2\2\2\u0275\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2"+ - "\2\2\u0278\u0279\7h\2\2\u0279O\3\2\2\2\u027a\u027b\7L\2\2\u027b\u027c"+ - "\7d\2\2\u027c\u0284\5\u012c\u0097\2\u027d\u027e\7\65\2\2\u027e\u027f\7"+ - "g\2\2\u027f\u0280\5\u0092J\2\u0280\u0281\5\u015e\u00b0\2\u0281\u0282\7"+ - "h\2\2\u0282\u0284\3\2\2\2\u0283\u027a\3\2\2\2\u0283\u027d\3\2\2\2\u0284"+ - "Q\3\2\2\2\u0285\u0286\7\34\2\2\u0286\u0287\7i\2\2\u0287\u0288\7j\2\2\u0288"+ - "\u0289\5\u0120\u0091\2\u0289S\3\2\2\2\u028a\u028b\t\7\2\2\u028b\u028c"+ - "\7i\2\2\u028c\u028d\5\u00b0Y\2\u028d\u028e\7j\2\2\u028e\u0296\3\2\2\2"+ - "\u028f\u0290\7,\2\2\u0290\u0291\7i\2\2\u0291\u0292\5\u00b0Y\2\u0292\u0293"+ - "\7j\2\2\u0293\u0294\5\u00b0Y\2\u0294\u0296\3\2\2\2\u0295\u028a\3\2\2\2"+ - "\u0295\u028f\3\2\2\2\u0296U\3\2\2\2\u0297\u029d\5X-\2\u0298\u0299\7\20"+ - "\2\2\u0299\u029d\b,\1\2\u029a\u029b\7B\2\2\u029b\u029d\b,\1\2\u029c\u0297"+ - "\3\2\2\2\u029c\u0298\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e\3\2\2\2\u029e"+ - "\u02a0\5\u015e\u00b0\2\u029f\u029c\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u02a2"+ - "\3\2\2\2\u02a1\u029f\3\2\2\2\u02a2\u02a6\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4"+ - "\u02a5\7\20\2\2\u02a5\u02a7\b,\1\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7\3\2"+ - "\2\2\u02a7W\3\2\2\2\u02a8\u02a9\7\13\2\2\u02a9\u02b1\5\\/\2\u02aa\u02ab"+ - "\7\f\2\2\u02ab\u02b1\5\\/\2\u02ac\u02ad\7\r\2\2\u02ad\u02b1\5\\/\2\u02ae"+ - "\u02af\7\17\2\2\u02af\u02b1\5Z.\2\u02b0\u02a8\3\2\2\2\u02b0\u02aa\3\2"+ - "\2\2\u02b0\u02ac\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b1Y\3\2\2\2\u02b2\u02b4"+ - "\5\u00d4k\2\u02b3\u02b2\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b7\3\2\2"+ - "\2\u02b5\u02b6\7[\2\2\u02b6\u02b8\5\u0092J\2\u02b7\u02b5\3\2\2\2\u02b7"+ - "\u02b8\3\2\2\2\u02b8[\3\2\2\2\u02b9\u02bc\3\2\2\2\u02ba\u02bc\5\u0092"+ - "J\2\u02bb\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bc]\3\2\2\2\u02bd\u02c2"+ - "\7g\2\2\u02be\u02bf\7:\2\2\u02bf\u02c0\5\u00d2j\2\u02c0\u02c1\5\u015e"+ - "\u00b0\2\u02c1\u02c3\3\2\2\2\u02c2\u02be\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3"+ - "\u02c5\3\2\2\2\u02c4\u02c6\5\u00dep\2\u02c5\u02c4\3\2\2\2\u02c5\u02c6"+ - "\3\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c8\7h\2\2\u02c8_\3\2\2\2\u02c9\u02cc"+ - "\5\u013e\u00a0\2\u02ca\u02cc\7d\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02ca\3"+ - "\2\2\2\u02cc\u02d5\3\2\2\2\u02cd\u02d2\7g\2\2\u02ce\u02d0\5b\62\2\u02cf"+ - "\u02d1\7l\2\2\u02d0\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d3\3\2"+ - "\2\2\u02d2\u02ce\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4"+ - "\u02d6\7h\2\2\u02d5\u02cd\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6a\3\2\2\2\u02d7"+ - "\u02dc\5d\63\2\u02d8\u02d9\7l\2\2\u02d9\u02db\5d\63\2\u02da\u02d8\3\2"+ - "\2\2\u02db\u02de\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02dd"+ - "c\3\2\2\2\u02de\u02dc\3\2\2\2\u02df\u02e0\7d\2\2\u02e0\u02e2\7n\2\2\u02e1"+ - "\u02df\3\2\2\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5\u0092"+ - "J\2\u02e4e\3\2\2\2\u02e5\u02e6\7F\2\2\u02e6\u02e7\5\u0092J\2\u02e7\u02e8"+ - "\7\21\2\2\u02e8\u02e9\5`\61\2\u02e9\u02ea\5\u00dco\2\u02eag\3\2\2\2\u02eb"+ - "\u02ec\5\u00b0Y\2\u02ec\u02ed\7\21\2\2\u02ed\u0300\5\u00b0Y\2\u02ee\u02f4"+ - "\7g\2\2\u02ef\u02f0\5p9\2\u02f0\u02f1\5\u015e\u00b0\2\u02f1\u02f3\3\2"+ - "\2\2\u02f2\u02ef\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f4"+ - "\u02f5\3\2\2\2\u02f5\u02fc\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f7\u02f8\5j"+ - "\66\2\u02f8\u02f9\5\u015e\u00b0\2\u02f9\u02fb\3\2\2\2\u02fa\u02f7\3\2"+ - "\2\2\u02fb\u02fe\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd"+ - "\u02ff\3\2\2\2\u02fe\u02fc\3\2\2\2\u02ff\u0301\7h\2\2\u0300\u02ee\3\2"+ - "\2\2\u0300\u0301\3\2\2\2\u0301i\3\2\2\2\u0302\u0304\7\20\2\2\u0303\u0302"+ - "\3\2\2\2\u0303\u0304\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306\5l\67\2\u0306"+ - "\u0307\7d\2\2\u0307\u0309\5\u012c\u0097\2\u0308\u030a\5\u00dco\2\u0309"+ - "\u0308\3\2\2\2\u0309\u030a\3\2\2\2\u030ak\3\2\2\2\u030b\u030d\7e\2\2\u030c"+ - "\u030e\7d\2\2\u030d\u030c\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0310\3\2"+ - "\2\2\u030f\u0311\7\u0086\2\2\u0310\u030f\3\2\2\2\u0310\u0311\3\2\2\2\u0311"+ - "\u0312\3\2\2\2\u0312\u0313\5\u011a\u008e\2\u0313\u0314\7f\2\2\u0314m\3"+ - "\2\2\2\u0315\u031b\5\u00a2R\2\u0316\u0317\5\u00b0Y\2\u0317\u0318\7o\2"+ - "\2\u0318\u0319\7d\2\2\u0319\u031b\3\2\2\2\u031a\u0315\3\2\2\2\u031a\u0316"+ - "\3\2\2\2\u031bo\3\2\2\2\u031c\u031d\7\67\2\2\u031d\u031e\7d\2\2\u031e"+ - "\u0321\7r\2\2\u031f\u0322\5n8\2\u0320\u0322\5\u013c\u009f\2\u0321\u031f"+ - "\3\2\2\2\u0321\u0320\3\2\2\2\u0322q\3\2\2\2\u0323\u0324\7\60\2\2\u0324"+ - "\u0325\7e\2\2\u0325\u0328\5\u00b0Y\2\u0326\u0327\7l\2\2\u0327\u0329\5"+ - "\u00d4k\2\u0328\u0326\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u032a\3\2\2\2"+ - "\u032a\u032b\7f\2\2\u032bs\3\2\2\2\u032c\u032d\7/\2\2\u032d\u032e\7e\2"+ - "\2\u032e\u032f\5\u00b0Y\2\u032f\u0330\7f\2\2\u0330u\3\2\2\2\u0331\u0334"+ - "\5V,\2\u0332\u0335\5x=\2\u0333\u0335\5z>\2\u0334\u0332\3\2\2\2\u0334\u0333"+ - "\3\2\2\2\u0335w\3\2\2\2\u0336\u0337\7L\2\2\u0337\u0338\7d\2\2\u0338\u033a"+ - "\5\u012c\u0097\2\u0339\u033b\5^\60\2\u033a\u0339\3\2\2\2\u033a\u033b\3"+ - "\2\2\2\u033by\3\2\2\2\u033c\u033d\7L\2\2\u033d\u033e\5\u0088E\2\u033e"+ - "\u033f\7d\2\2\u033f\u0341\5\u012c\u0097\2\u0340\u0342\5^\60\2\u0341\u0340"+ - "\3\2\2\2\u0341\u0342\3\2\2\2\u0342{\3\2\2\2\u0343\u0346\7\34\2\2\u0344"+ - "\u0347\5v<\2\u0345\u0347\5\u00ccg\2\u0346\u0344\3\2\2\2\u0346\u0345\3"+ - "\2\2\2\u0347}\3\2\2\2\u0348\u0349\7\67\2\2\u0349\u034a\7d\2\2\u034a\u034c"+ - "\5\u0130\u0099\2\u034b\u034d\5\u0080A\2\u034c\u034b\3\2\2\2\u034c\u034d"+ - "\3\2\2\2\u034d\177\3\2\2\2\u034e\u034f\7g\2\2\u034f\u0350\5\u0092J\2\u0350"+ - "\u0351\5\u015e\u00b0\2\u0351\u0352\7h\2\2\u0352\u0081\3\2\2\2\u0353\u0354"+ - "\7\67\2\2\u0354\u0355\5\u0088E\2\u0355\u0356\7d\2\2\u0356\u0358\5\u0130"+ - "\u0099\2\u0357\u0359\5\u0080A\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2"+ - "\2\u0359\u0083\3\2\2\2\u035a\u0362\5\b\5\2\u035b\u035e\5\u00b0Y\2\u035c"+ - "\u035d\7k\2\2\u035d\u035f\5\u00d4k\2\u035e\u035c\3\2\2\2\u035e\u035f\3"+ - "\2\2\2\u035f\u0363\3\2\2\2\u0360\u0361\7k\2\2\u0361\u0363\5\u00d4k\2\u0362"+ - "\u035b\3\2\2\2\u0362\u0360\3\2\2\2\u0363\u0085\3\2\2\2\u0364\u0365\5\b"+ - "\5\2\u0365\u0366\7r\2\2\u0366\u0367\5\u00d4k\2\u0367\u0087\3\2\2\2\u0368"+ - "\u036a\7e\2\2\u0369\u036b\5\n\6\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2"+ - "\2\2\u036b\u036c\3\2\2\2\u036c\u036e\5\u00b0Y\2\u036d\u036f\7l\2\2\u036e"+ - "\u036d\3\2\2\2\u036e\u036f\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u0371\7f"+ - "\2\2\u0371\u0089\3\2\2\2\u0372\u0375\5\u008cG\2\u0373\u0375\5\u008eH\2"+ - "\u0374\u0372\3\2\2\2\u0374\u0373\3\2\2\2\u0375\u008b\3\2\2\2\u0376\u0378"+ - "\5\u00d2j\2\u0377\u0376\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u0379\3\2\2"+ - "\2\u0379\u037a\5\u0090I\2\u037a\u008d\3\2\2\2\u037b\u037d\7\34\2\2\u037c"+ - "\u037e\5\u00d2j\2\u037d\u037c\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f"+ - "\3\2\2\2\u037f\u0380\5\u0090I\2\u0380\u008f\3\2\2\2\u0381\u0383\7s\2\2"+ - "\u0382\u0381\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385"+ - "\5\u00b0Y\2\u0385\u0091\3\2\2\2\u0386\u0387\bJ\1\2\u0387\u0388\t\b\2\2"+ - "\u0388\u0397\5\u0092J\20\u0389\u0397\5\u00a2R\2\u038a\u038b\7\33\2\2\u038b"+ - "\u038c\5.\30\2\u038c\u038d\7\35\2\2\u038d\u038e\5\u0092J\4\u038e\u0397"+ - "\3\2\2\2\u038f\u0390\t\t\2\2\u0390\u0391\5&\24\2\u0391\u0392\7n\2\2\u0392"+ - "\u0393\7n\2\2\u0393\u0394\5*\26\2\u0394\u0395\5\u0092J\3\u0395\u0397\3"+ - "\2\2\2\u0396\u0386\3\2\2\2\u0396\u0389\3\2\2\2\u0396\u038a\3\2\2\2\u0396"+ - "\u038f\3\2\2\2\u0397\u03bb\3\2\2\2\u0398\u0399\f\16\2\2\u0399\u039a\t"+ - "\n\2\2\u039a\u03ba\5\u0092J\17\u039b\u039c\f\r\2\2\u039c\u039d\t\13\2"+ - "\2\u039d\u03ba\5\u0092J\16\u039e\u039f\f\f\2\2\u039f\u03a0\t\f\2\2\u03a0"+ - "\u03ba\5\u0092J\r\u03a1\u03a2\f\13\2\2\u03a2\u03a3\t\r\2\2\u03a3\u03ba"+ - "\5\u0092J\f\u03a4\u03a5\f\n\2\2\u03a5\u03a6\t\16\2\2\u03a6\u03ba\5\u0092"+ - "J\13\u03a7\u03a8\f\b\2\2\u03a8\u03a9\7u\2\2\u03a9\u03ba\5\u0092J\t\u03aa"+ - "\u03ab\f\7\2\2\u03ab\u03ac\7t\2\2\u03ac\u03ba\5\u0092J\b\u03ad\u03ae\f"+ - "\6\2\2\u03ae\u03af\7#\2\2\u03af\u03ba\5\u0092J\6\u03b0\u03b1\f\5\2\2\u03b1"+ - "\u03b2\7&\2\2\u03b2\u03b3\5\u0092J\2\u03b3\u03b4\7n\2\2\u03b4\u03b5\5"+ - "\u0092J\5\u03b5\u03ba\3\2\2\2\u03b6\u03b7\f\t\2\2\u03b7\u03b8\7\21\2\2"+ - "\u03b8\u03ba\5`\61\2\u03b9\u0398\3\2\2\2\u03b9\u039b\3\2\2\2\u03b9\u039e"+ - "\3\2\2\2\u03b9\u03a1\3\2\2\2\u03b9\u03a4\3\2\2\2\u03b9\u03a7\3\2\2\2\u03b9"+ - "\u03aa\3\2\2\2\u03b9\u03ad\3\2\2\2\u03b9\u03b0\3\2\2\2\u03b9\u03b6\3\2"+ - "\2\2\u03ba\u03bd\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc"+ - "\u0093\3\2\2\2\u03bd\u03bb\3\2\2\2\u03be\u03d3\5\30\r\2\u03bf\u03d3\5"+ - "\32\16\2\u03c0\u03d3\5\u0098M\2\u03c1\u03d3\5\u0096L\2\u03c2\u03d3\5\u00cc"+ - "g\2\u03c3\u03d3\5\u00ecw\2\u03c4\u03d3\5\u00e0q\2\u03c5\u03d3\5\u0118"+ - "\u008d\2\u03c6\u03d3\5\u00eex\2\u03c7\u03d3\5\u00f0y\2\u03c8\u03d3\5\u00f2"+ - "z\2\u03c9\u03d3\5\u00f4{\2\u03ca\u03d3\5\u00f6|\2\u03cb\u03d3\5\u00dc"+ - "o\2\u03cc\u03d3\5\u00f8}\2\u03cd\u03d3\5\u00fa~\2\u03ce\u03d3\5\u010c"+ - "\u0087\2\u03cf\u03d3\5\u009aN\2\u03d0\u03d3\5\u009eP\2\u03d1\u03d3\5f"+ - "\64\2\u03d2\u03be\3\2\2\2\u03d2\u03bf\3\2\2\2\u03d2\u03c0\3\2\2\2\u03d2"+ - "\u03c1\3\2\2\2\u03d2\u03c2\3\2\2\2\u03d2\u03c3\3\2\2\2\u03d2\u03c4\3\2"+ - "\2\2\u03d2\u03c5\3\2\2\2\u03d2\u03c6\3\2\2\2\u03d2\u03c7\3\2\2\2\u03d2"+ - "\u03c8\3\2\2\2\u03d2\u03c9\3\2\2\2\u03d2\u03ca\3\2\2\2\u03d2\u03cb\3\2"+ - "\2\2\u03d2\u03cc\3\2\2\2\u03d2\u03cd\3\2\2\2\u03d2\u03ce\3\2\2\2\u03d2"+ - "\u03cf\3\2\2\2\u03d2\u03d0\3\2\2\2\u03d2\u03d1\3\2\2\2\u03d3\u0095\3\2"+ - "\2\2\u03d4\u03d5\7%\2\2\u03d5\u03d6\5\u0092J\2\u03d6\u0097\3\2\2\2\u03d7"+ - "\u03d8\7W\2\2\u03d8\u03da\5\u0092J\2\u03d9\u03db\5\u00dco\2\u03da\u03d9"+ - "\3\2\2\2\u03da\u03db\3\2\2\2\u03db\u0099\3\2\2\2\u03dc\u03dd\5\u009cO"+ - "\2\u03dd\u03de\5\u0114\u008b\2\u03de\u009b\3\2\2\2\u03df\u03e0\7\16\2"+ - "\2\u03e0\u03e1\5\u0092J\2\u03e1\u03e2\5\u015e\u00b0\2\u03e2\u03e4\3\2"+ - "\2\2\u03e3\u03df\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5"+ - "\u03e6\3\2\2\2\u03e6\u03ec\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7\17"+ - "\2\2\u03e9\u03ea\5Z.\2\u03ea\u03eb\5\u015e\u00b0\2\u03eb\u03ed\3\2\2\2"+ - "\u03ec\u03e8\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u009d\3\2\2\2\u03ee\u03ef"+ - "\7P\2\2\u03ef\u03f4\5\u0092J\2\u03f0\u03f1\7P\2\2\u03f1\u03f2\t\3\2\2"+ - "\u03f2\u03f4\5.\30\2\u03f3\u03ee\3\2\2\2\u03f3\u03f0\3\2\2\2\u03f4\u009f"+ - "\3\2\2\2\u03f5\u03fe\7\5\2\2\u03f6\u03fe\7\6\2\2\u03f7\u03fe\7c\2\2\u03f8"+ - "\u03fe\5\u013a\u009e\2\u03f9\u03fe\5\u0150\u00a9\2\u03fa\u03fe\7\3\2\2"+ - "\u03fb\u03fe\7\u008e\2\2\u03fc\u03fe\7\u008f\2\2\u03fd\u03f5\3\2\2\2\u03fd"+ - "\u03f6\3\2\2\2\u03fd\u03f7\3\2\2\2\u03fd\u03f8\3\2\2\2\u03fd\u03f9\3\2"+ - "\2\2\u03fd\u03fa\3\2\2\2\u03fd\u03fb\3\2\2\2\u03fd\u03fc\3\2\2\2\u03fe"+ - "\u00a1\3\2\2\2\u03ff\u0400\bR\1\2\u0400\u040c\5\u0136\u009c\2\u0401\u040c"+ - "\5\u0132\u009a\2\u0402\u040c\5\u015a\u00ae\2\u0403\u040c\5 \21\2\u0404"+ - "\u040c\5t;\2\u0405\u040c\5r:\2\u0406\u0407\t\17\2\2\u0407\u0408\7e\2\2"+ - "\u0408\u0409\5\u0092J\2\u0409\u040a\7f\2\2\u040a\u040c\3\2\2\2\u040b\u03ff"+ - "\3\2\2\2\u040b\u0401\3\2\2\2\u040b\u0402\3\2\2\2\u040b\u0403\3\2\2\2\u040b"+ - "\u0404\3\2\2\2\u040b\u0405\3\2\2\2\u040b\u0406\3\2\2\2\u040c\u0423\3\2"+ - "\2\2\u040d\u040e\f\13\2\2\u040e\u040f\7o\2\2\u040f\u0422\7d\2\2\u0410"+ - "\u0411\f\n\2\2\u0411\u0422\5\u0154\u00ab\2\u0412\u0413\f\t\2\2\u0413\u0422"+ - "\5\u00bc_\2\u0414\u0415\f\b\2\2\u0415\u0422\5H%\2\u0416\u0417\f\7\2\2"+ - "\u0417\u0422\5\u0156\u00ac\2\u0418\u0419\f\6\2\2\u0419\u0422\5\u0158\u00ad"+ - "\2\u041a\u041b\f\5\2\2\u041b\u041c\5\u0158\u00ad\2\u041c\u041d\7\22\2"+ - "\2\u041d\u041e\5`\61\2\u041e\u0422\3\2\2\2\u041f\u0420\f\4\2\2\u0420\u0422"+ - "\5\u00a8U\2\u0421\u040d\3\2\2\2\u0421\u0410\3\2\2\2\u0421\u0412\3\2\2"+ - "\2\u0421\u0414\3\2\2\2\u0421\u0416\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041a"+ - "\3\2\2\2\u0421\u041f\3\2\2\2\u0422\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423"+ - "\u0424\3\2\2\2\u0424\u00a3\3\2\2\2\u0425\u0423\3\2\2\2\u0426\u0427\5V"+ - ",\2\u0427\u0428\5\u00a6T\2\u0428\u00a5\3\2\2\2\u0429\u042b\7L\2\2\u042a"+ - "\u042c\7d\2\2\u042b\u042a\3\2\2\2\u042b\u042c\3\2\2\2\u042c\u042d\3\2"+ - "\2\2\u042d\u042f\5\u012c\u0097\2\u042e\u0430\5^\60\2\u042f\u042e\3\2\2"+ - "\2\u042f\u0430\3\2\2\2\u0430\u00a7\3\2\2\2\u0431\u0433\7\'\2\2\u0432\u0434"+ - "\5\u00d4k\2\u0433\u0432\3\2\2\2\u0433\u0434\3\2\2\2\u0434\u0436\3\2\2"+ - "\2\u0435\u0437\7l\2\2\u0436\u0435\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0438"+ - "\3\2\2\2\u0438\u0439\7(\2\2\u0439\u00a9\3\2\2\2\u043a\u043b\7M\2\2\u043b"+ - "\u0445\7g\2\2\u043c\u0440\5\u00aeX\2\u043d\u0440\5\u011a\u008e\2\u043e"+ - "\u0440\5\u00acW\2\u043f\u043c\3\2\2\2\u043f\u043d\3\2\2\2\u043f\u043e"+ - "\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u0442\5\u015e\u00b0\2\u0442\u0444\3"+ - "\2\2\2\u0443\u043f\3\2\2\2\u0444\u0447\3\2\2\2\u0445\u0443\3\2\2\2\u0445"+ - "\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447\u0445\3\2\2\2\u0448\u0449\7h"+ - "\2\2\u0449\u00ab\3\2\2\2\u044a\u044b\7\67\2\2\u044b\u044c\7d\2\2\u044c"+ - "\u044d\5\u0130\u0099\2\u044d\u00ad\3\2\2\2\u044e\u0450\7\34\2\2\u044f"+ - "\u044e\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u0451\3\2\2\2\u0451\u0452\5V"+ - ",\2\u0452\u0453\7d\2\2\u0453\u0454\5\u0130\u0099\2\u0454\u0455\5\u012e"+ - "\u0098\2\u0455\u045e\3\2\2\2\u0456\u0458\7\34\2\2\u0457\u0456\3\2\2\2"+ - "\u0457\u0458\3\2\2\2\u0458\u0459\3\2\2\2\u0459\u045a\5V,\2\u045a\u045b"+ - "\7d\2\2\u045b\u045c\5\u0130\u0099\2\u045c\u045e\3\2\2\2\u045d\u044f\3"+ - "\2\2\2\u045d\u0457\3\2\2\2\u045e\u00af\3\2\2\2\u045f\u0467\5\u011a\u008e"+ - "\2\u0460\u0467\5\u00b2Z\2\u0461\u0467\5L\'\2\u0462\u0463\7e\2\2\u0463"+ - "\u0464\5\u00b0Y\2\u0464\u0465\7f\2\2\u0465\u0467\3\2\2\2\u0466\u045f\3"+ - "\2\2\2\u0466\u0460\3\2\2\2\u0466\u0461\3\2\2\2\u0466\u0462\3\2\2\2\u0467"+ - "\u00b1\3\2\2\2\u0468\u0472\5\u011c\u008f\2\u0469\u0472\5\u014c\u00a7\2"+ - "\u046a\u0472\5\u0122\u0092\2\u046b\u0472\5\u012a\u0096\2\u046c\u0472\5"+ - "\u00aaV\2\u046d\u0472\5\u0124\u0093\2\u046e\u0472\5\u0126\u0094\2\u046f"+ - "\u0472\5\u0128\u0095\2\u0470\u0472\5\u00b4[\2\u0471\u0468\3\2\2\2\u0471"+ - "\u0469\3\2\2\2\u0471\u046a\3\2\2\2\u0471\u046b\3\2\2\2\u0471\u046c\3\2"+ - "\2\2\u0471\u046d\3\2\2\2\u0471\u046e\3\2\2\2\u0471\u046f\3\2\2\2\u0471"+ - "\u0470\3\2\2\2\u0472\u00b3\3\2\2\2\u0473\u0474\7\67\2\2\u0474\u0475\5"+ - "\u00b6\\\2\u0475\u00b5\3\2\2\2\u0476\u0482\7e\2\2\u0477\u047c\5\u00b0"+ - "Y\2\u0478\u0479\7l\2\2\u0479\u047b\5\u00b0Y\2\u047a\u0478\3\2\2\2\u047b"+ - "\u047e\3\2\2\2\u047c\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d\u0480\3\2"+ - "\2\2\u047e\u047c\3\2\2\2\u047f\u0481\7l\2\2\u0480\u047f\3\2\2\2\u0480"+ - "\u0481\3\2\2\2\u0481\u0483\3\2\2\2\u0482\u0477\3\2\2\2\u0482\u0483\3\2"+ - "\2\2\u0483\u0484\3\2\2\2\u0484\u0485\7f\2\2\u0485\u00b7\3\2\2\2\u0486"+ - "\u048e\5\u014c\u00a7\2\u0487\u048e\5\u011c\u008f\2\u0488\u048e\5\u00ba"+ - "^\2\u0489\u048e\5\u0124\u0093\2\u048a\u048e\5\u0126\u0094\2\u048b\u048e"+ - "\5L\'\2\u048c\u048e\5\u011a\u008e\2\u048d\u0486\3\2\2\2\u048d\u0487\3"+ - "\2\2\2\u048d\u0488\3\2\2\2\u048d\u0489\3\2\2\2\u048d\u048a\3\2\2\2\u048d"+ - "\u048b\3\2\2\2\u048d\u048c\3\2\2\2\u048e\u00b9\3\2\2\2\u048f\u0490\7i"+ - "\2\2\u0490\u0491\7s\2\2\u0491\u0492\7j\2\2\u0492\u0493\5\u0120\u0091\2"+ - "\u0493\u00bb\3\2\2\2\u0494\u04a4\7i\2\2\u0495\u0497\5\u00be`\2\u0496\u0495"+ - "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u049a\7n\2\2\u0499"+ - "\u049b\5\u00c0a\2\u049a\u0499\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u04a5"+ - "\3\2\2\2\u049c\u049e\5\u00be`\2\u049d\u049c\3\2\2\2\u049d\u049e\3\2\2"+ - "\2\u049e\u049f\3\2\2\2\u049f\u04a0\7n\2\2\u04a0\u04a1\5\u00c0a\2\u04a1"+ - "\u04a2\7n\2\2\u04a2\u04a3\5\u00c2b\2\u04a3\u04a5\3\2\2\2\u04a4\u0496\3"+ - "\2\2\2\u04a4\u049d\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\7j\2\2\u04a7"+ - "\u00bd\3\2\2\2\u04a8\u04a9\5\u0092J\2\u04a9\u00bf\3\2\2\2\u04aa\u04ab"+ - "\5\u0092J\2\u04ab\u00c1\3\2\2\2\u04ac\u04ad\5\u0092J\2\u04ad\u00c3\3\2"+ - "\2\2\u04ae\u04b0\t\20\2\2\u04af\u04ae\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0"+ - "\u04b1\3\2\2\2\u04b1\u04b2\7k\2\2\u04b2\u00c5\3\2\2\2\u04b3\u04b4\5\u00d4"+ - "k\2\u04b4\u04b5\7k\2\2\u04b5\u04ba\3\2\2\2\u04b6\u04b7\5\b\5\2\u04b7\u04b8"+ - "\7r\2\2\u04b8\u04ba\3\2\2\2\u04b9\u04b3\3\2\2\2\u04b9\u04b6\3\2\2\2\u04b9"+ - "\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bc\7\\\2\2\u04bc\u04c1\5\u0092"+ - "J\2\u04bd\u04bf\7I\2\2\u04be\u04c0\7d\2\2\u04bf\u04be\3\2\2\2\u04bf\u04c0"+ - "\3\2\2\2\u04c0\u04c2\3\2\2\2\u04c1\u04bd\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2"+ - "\u00c7\3\2\2\2\u04c3\u04c4\7W\2\2\u04c4\u04c5\7d\2\2\u04c5\u00c9\3\2\2"+ - "\2\u04c6\u04c7\5\u0150\u00a9\2\u04c7\u00cb\3\2\2\2\u04c8\u04cc\5\u00ce"+ - "h\2\u04c9\u04cc\5\u00d6l\2\u04ca\u04cc\5\u00dan\2\u04cb\u04c8\3\2\2\2"+ - "\u04cb\u04c9\3\2\2\2\u04cb\u04ca\3\2\2\2\u04cc\u00cd\3\2\2\2\u04cd\u04d9"+ - "\7Y\2\2\u04ce\u04da\5\u00d0i\2\u04cf\u04d5\7e\2\2\u04d0\u04d1\5\u00d0"+ - "i\2\u04d1\u04d2\5\u015e\u00b0\2\u04d2\u04d4\3\2\2\2\u04d3\u04d0\3\2\2"+ - "\2\u04d4\u04d7\3\2\2\2\u04d5\u04d3\3\2\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d8"+ - "\3\2\2\2\u04d7\u04d5\3\2\2\2\u04d8\u04da\7f\2\2\u04d9\u04ce\3\2\2\2\u04d9"+ - "\u04cf\3\2\2\2\u04da\u00cf\3\2\2\2\u04db\u04e1\5\u00d2j\2\u04dc\u04de"+ - "\5\u00b0Y\2\u04dd\u04dc\3\2\2\2\u04dd\u04de\3\2\2\2\u04de\u04df\3\2\2"+ - "\2\u04df\u04e0\7k\2\2\u04e0\u04e2\5\u00d4k\2\u04e1\u04dd\3\2\2\2\u04e1"+ - "\u04e2\3\2\2\2\u04e2\u00d1\3\2\2\2\u04e3\u04e8\7d\2\2\u04e4\u04e5\7l\2"+ - "\2\u04e5\u04e7\7d\2\2\u04e6\u04e4\3\2\2\2\u04e7\u04ea\3\2\2\2\u04e8\u04e6"+ - "\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9\u00d3\3\2\2\2\u04ea\u04e8\3\2\2\2\u04eb"+ - "\u04f0\5\u0092J\2\u04ec\u04ed\7l\2\2\u04ed\u04ef\5\u0092J\2\u04ee\u04ec"+ - "\3\2\2\2\u04ef\u04f2\3\2\2\2\u04f0\u04ee\3\2\2\2\u04f0\u04f1\3\2\2\2\u04f1"+ - "\u00d5\3\2\2\2\u04f2\u04f0\3\2\2\2\u04f3\u04ff\7]\2\2\u04f4\u0500\5\u00d8"+ - "m\2\u04f5\u04fb\7e\2\2\u04f6\u04f7\5\u00d8m\2\u04f7\u04f8\5\u015e\u00b0"+ - "\2\u04f8\u04fa\3\2\2\2\u04f9\u04f6\3\2\2\2\u04fa\u04fd\3\2\2\2\u04fb\u04f9"+ - "\3\2\2\2\u04fb\u04fc\3\2\2\2\u04fc\u04fe\3\2\2\2\u04fd\u04fb\3\2\2\2\u04fe"+ - "\u0500\7f\2\2\u04ff\u04f4\3\2\2\2\u04ff\u04f5\3\2\2\2\u0500\u00d7\3\2"+ - "\2\2\u0501\u0503\7d\2\2\u0502\u0504\7k\2\2\u0503\u0502\3\2\2\2\u0503\u0504"+ - "\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u0506\5\u00b0Y\2\u0506\u00d9\3\2\2"+ - "\2\u0507\u0513\7b\2\2\u0508\u0514\5\u0084C\2\u0509\u050f\7e\2\2\u050a"+ - "\u050b\5\u0084C\2\u050b\u050c\5\u015e\u00b0\2\u050c\u050e\3\2\2\2\u050d"+ - "\u050a\3\2\2\2\u050e\u0511\3\2\2\2\u050f\u050d\3\2\2\2\u050f\u0510\3\2"+ - "\2\2\u0510\u0512\3\2\2\2\u0511\u050f\3\2\2\2\u0512\u0514\7f\2\2\u0513"+ - "\u0508\3\2\2\2\u0513\u0509\3\2\2\2\u0514\u00db\3\2\2\2\u0515\u0517\7g"+ - "\2\2\u0516\u0518\5\u00dep\2\u0517\u0516\3\2\2\2\u0517\u0518\3\2\2\2\u0518"+ - "\u0519\3\2\2\2\u0519\u051a\7h\2\2\u051a\u00dd\3\2\2\2\u051b\u051d\5\u015e"+ - "\u00b0\2\u051c\u051b\3\2\2\2\u051c\u051d\3\2\2\2\u051d\u051e\3\2\2\2\u051e"+ - "\u051f\5\u0094K\2\u051f\u0520\5\u015e\u00b0\2\u0520\u0522\3\2\2\2\u0521"+ - "\u051c\3\2\2\2\u0522\u0523\3\2\2\2\u0523\u0521\3\2\2\2\u0523\u0524\3\2"+ - "\2\2\u0524\u00df\3\2\2\2\u0525\u052b\5\u00e4s\2\u0526\u052b\5\u00e6t\2"+ - "\u0527\u052b\5\u00e8u\2\u0528\u052b\5\u00e2r\2\u0529\u052b\5\u0086D\2"+ - "\u052a\u0525\3\2\2\2\u052a\u0526\3\2\2\2\u052a\u0527\3\2\2\2\u052a\u0528"+ - "\3\2\2\2\u052a\u0529\3\2\2\2\u052b\u00e1\3\2\2\2\u052c\u052d\5\u0092J"+ - "\2\u052d\u00e3\3\2\2\2\u052e\u052f\5\u0092J\2\u052f\u0530\7\u0088\2\2"+ - "\u0530\u0531\5\u0092J\2\u0531\u00e5\3\2\2\2\u0532\u0533\5\u0092J\2\u0533"+ - "\u0534\t\21\2\2\u0534\u00e7\3\2\2\2\u0535\u0536\5\u00d4k\2\u0536\u0537"+ - "\5\u00c4c\2\u0537\u0538\5\u00d4k\2\u0538\u00e9\3\2\2\2\u0539\u053a\t\22"+ - "\2\2\u053a\u00eb\3\2\2\2\u053b\u053c\7d\2\2\u053c\u053e\7n\2\2\u053d\u053f"+ - "\5\u0094K\2\u053e\u053d\3\2\2\2\u053e\u053f\3\2\2\2\u053f\u00ed\3\2\2"+ - "\2\u0540\u0542\7a\2\2\u0541\u0543\5\u00d4k\2\u0542\u0541\3\2\2\2\u0542"+ - "\u0543\3\2\2\2\u0543\u00ef\3\2\2\2\u0544\u0546\7J\2\2\u0545\u0547\7d\2"+ - "\2\u0546\u0545\3\2\2\2\u0546\u0547\3\2\2\2\u0547\u00f1\3\2\2\2\u0548\u054a"+ - "\7^\2\2\u0549\u054b\7d\2\2\u054a\u0549\3\2\2\2\u054a\u054b\3\2\2\2\u054b"+ - "\u00f3\3\2\2\2\u054c\u054d\7V\2\2\u054d\u054e\7d\2\2\u054e\u00f5\3\2\2"+ - "\2\u054f\u0550\7Z\2\2\u0550\u00f7\3\2\2\2\u0551\u055a\7[\2\2\u0552\u055b"+ - "\5\u0092J\2\u0553\u0554\5\u015e\u00b0\2\u0554\u0555\5\u0092J\2\u0555\u055b"+ - "\3\2\2\2\u0556\u0557\5\u00e0q\2\u0557\u0558\5\u015e\u00b0\2\u0558\u0559"+ - "\5\u0092J\2\u0559\u055b\3\2\2\2\u055a\u0552\3\2\2\2\u055a\u0553\3\2\2"+ - "\2\u055a\u0556\3\2\2\2\u055b\u055c\3\2\2\2\u055c\u0562\5\u00dco\2\u055d"+ - "\u0560\7U\2\2\u055e\u0561\5\u00f8}\2\u055f\u0561\5\u00dco\2\u0560\u055e"+ - "\3\2\2\2\u0560\u055f\3\2\2\2\u0561\u0563\3\2\2\2\u0562\u055d\3\2\2\2\u0562"+ - "\u0563\3\2\2\2\u0563\u00f9\3\2\2\2\u0564\u0567\5\u00fc\177\2\u0565\u0567"+ - "\5\u0102\u0082\2\u0566\u0564\3\2\2\2\u0566\u0565\3\2\2\2\u0567\u00fb\3"+ - "\2\2\2\u0568\u0573\7X\2\2\u0569\u056b\5\u0092J\2\u056a\u0569\3\2\2\2\u056a"+ - "\u056b\3\2\2\2\u056b\u0574\3\2\2\2\u056c\u056e\5\u00e0q\2\u056d\u056c"+ - "\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u056f\3\2\2\2\u056f\u0571\5\u015e\u00b0"+ - "\2\u0570\u0572\5\u0092J\2\u0571\u0570\3\2\2\2\u0571\u0572\3\2\2\2\u0572"+ - "\u0574\3\2\2\2\u0573\u056a\3\2\2\2\u0573\u056d\3\2\2\2\u0574\u0575\3\2"+ - "\2\2\u0575\u0579\7g\2\2\u0576\u0578\5\u00fe\u0080\2\u0577\u0576\3\2\2"+ - "\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2\2\2\u057a\u057c"+ - "\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057d\7h\2\2\u057d\u00fd\3\2\2\2\u057e"+ - "\u057f\5\u0100\u0081\2\u057f\u0581\7n\2\2\u0580\u0582\5\u00dep\2\u0581"+ - "\u0580\3\2\2\2\u0581\u0582\3\2\2\2\u0582\u00ff\3\2\2\2\u0583\u0584\7O"+ - "\2\2\u0584\u0587\5\u00d4k\2\u0585\u0587\7K\2\2\u0586\u0583\3\2\2\2\u0586"+ - "\u0585\3\2\2\2\u0587\u0101\3\2\2\2\u0588\u0591\7X\2\2\u0589\u0592\5\u0104"+ - "\u0083\2\u058a\u058b\5\u015e\u00b0\2\u058b\u058c\5\u0104\u0083\2\u058c"+ - "\u0592\3\2\2\2\u058d\u058e\5\u00e0q\2\u058e\u058f\5\u015e\u00b0\2\u058f"+ - "\u0590\5\u0104\u0083\2\u0590\u0592\3\2\2\2\u0591\u0589\3\2\2\2\u0591\u058a"+ - "\3\2\2\2\u0591\u058d\3\2\2\2\u0592\u0593\3\2\2\2\u0593\u0597\7g\2\2\u0594"+ - "\u0596\5\u0106\u0084\2\u0595\u0594\3\2\2\2\u0596\u0599\3\2\2\2\u0597\u0595"+ - "\3\2\2\2\u0597\u0598\3\2\2\2\u0598\u059a\3\2\2\2\u0599\u0597\3\2\2\2\u059a"+ - "\u059b\7h\2\2\u059b\u0103\3\2\2\2\u059c\u059d\7d\2\2\u059d\u059f\7r\2"+ - "\2\u059e\u059c\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u05a0\3\2\2\2\u05a0\u05a1"+ - "\5\u00a2R\2\u05a1\u05a2\7o\2\2\u05a2\u05a3\7e\2\2\u05a3\u05a4\7]\2\2\u05a4"+ - "\u05a5\7f\2\2\u05a5\u0105\3\2\2\2\u05a6\u05a7\5\u0108\u0085\2\u05a7\u05a9"+ - "\7n\2\2\u05a8\u05aa\5\u00dep\2\u05a9\u05a8\3\2\2\2\u05a9\u05aa\3\2\2\2"+ - "\u05aa\u0107\3\2\2\2\u05ab\u05ac\7O\2\2\u05ac\u05af\5\u010a\u0086\2\u05ad"+ - "\u05af\7K\2\2\u05ae\u05ab\3\2\2\2\u05ae\u05ad\3\2\2\2\u05af\u0109\3\2"+ - "\2\2\u05b0\u05b3\5\u00b0Y\2\u05b1\u05b3\7c\2\2\u05b2\u05b0\3\2\2\2\u05b2"+ - "\u05b1\3\2\2\2\u05b3\u05bb\3\2\2\2\u05b4\u05b7\7l\2\2\u05b5\u05b8\5\u00b0"+ - "Y\2\u05b6\u05b8\7c\2\2\u05b7\u05b5\3\2\2\2\u05b7\u05b6\3\2\2\2\u05b8\u05ba"+ - "\3\2\2\2\u05b9\u05b4\3\2\2\2\u05ba\u05bd\3\2\2\2\u05bb\u05b9\3\2\2\2\u05bb"+ - "\u05bc\3\2\2\2\u05bc\u010b\3\2\2\2\u05bd\u05bb\3\2\2\2\u05be\u05bf\7N"+ - "\2\2\u05bf\u05c3\7g\2\2\u05c0\u05c2\5\u010e\u0088\2\u05c1\u05c0\3\2\2"+ - "\2\u05c2\u05c5\3\2\2\2\u05c3\u05c1\3\2\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05c6"+ - "\3\2\2\2\u05c5\u05c3\3\2\2\2\u05c6\u05c7\7h\2\2\u05c7\u010d\3\2\2\2\u05c8"+ - "\u05c9\5\u0110\u0089\2\u05c9\u05cb\7n\2\2\u05ca\u05cc\5\u00dep\2\u05cb"+ - "\u05ca\3\2\2\2\u05cb\u05cc\3\2\2\2\u05cc\u010f\3\2\2\2\u05cd\u05d0\7O"+ - "\2\2\u05ce\u05d1\5\u00e4s\2\u05cf\u05d1\5\u0112\u008a\2\u05d0\u05ce\3"+ - "\2\2\2\u05d0\u05cf\3\2\2\2\u05d1\u05d4\3\2\2\2\u05d2\u05d4\7K\2\2\u05d3"+ - "\u05cd\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d4\u0111\3\2\2\2\u05d5\u05d6\5\u00d4"+ - "k\2\u05d6\u05d7\7k\2\2\u05d7\u05dc\3\2\2\2\u05d8\u05d9\5\u00d2j\2\u05d9"+ - "\u05da\7r\2\2\u05da\u05dc\3\2\2\2\u05db\u05d5\3\2\2\2\u05db\u05d8\3\2"+ - "\2\2\u05db\u05dc\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd\u05de\5\u0092J\2\u05de"+ - "\u0113\3\2\2\2\u05df\u05e3\7_\2\2\u05e0\u05e4\5\u0092J\2\u05e1\u05e4\5"+ - "\u0116\u008c\2\u05e2\u05e4\5\u00c6d\2\u05e3\u05e0\3\2\2\2\u05e3\u05e1"+ - "\3\2\2\2\u05e3\u05e2\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4\u05e5\3\2\2\2\u05e5"+ - "\u05e6\5\u00dco\2\u05e6\u0115\3\2\2\2\u05e7\u05e9\5\u00e0q\2\u05e8\u05e7"+ - "\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9\u05ea\3\2\2\2\u05ea\u05ec\5\u015e\u00b0"+ - "\2\u05eb\u05ed\5\u0092J\2\u05ec\u05eb\3\2\2\2\u05ec\u05ed\3\2\2\2\u05ed"+ - "\u05ee\3\2\2\2\u05ee\u05f0\5\u015e\u00b0\2\u05ef\u05f1\5\u00e0q\2\u05f0"+ - "\u05ef\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u0117\3\2\2\2\u05f2\u05f3\7Q"+ - "\2\2\u05f3\u05f4\5\u0092J\2\u05f4\u0119\3\2\2\2\u05f5\u05f8\5\u013e\u00a0"+ - "\2\u05f6\u05f8\7d\2\2\u05f7\u05f5\3\2\2\2\u05f7\u05f6\3\2\2\2\u05f8\u011b"+ - "\3\2\2\2\u05f9\u05fa\7i\2\2\u05fa\u05fb\5\u011e\u0090\2\u05fb\u05fc\7"+ - "j\2\2\u05fc\u05fd\5\u0120\u0091\2\u05fd\u011d\3\2\2\2\u05fe\u05ff\5\u0092"+ - "J\2\u05ff\u011f\3\2\2\2\u0600\u0601\5\u00b0Y\2\u0601\u0121\3\2\2\2\u0602"+ - "\u0603\7\u0086\2\2\u0603\u0604\5\u00b0Y\2\u0604\u0123\3\2\2\2\u0605\u0606"+ - "\7i\2\2\u0606\u0607\7j\2\2\u0607\u0608\5\u0120\u0091\2\u0608\u0125\3\2"+ - "\2\2\u0609\u060a\7R\2\2\u060a\u060b\7i\2\2\u060b\u060c\5\u00b0Y\2\u060c"+ - "\u060d\7j\2\2\u060d\u060e\5\u0120\u0091\2\u060e\u0127\3\2\2\2\u060f\u0615"+ - "\7T\2\2\u0610\u0611\7T\2\2\u0611\u0615\7\u0088\2\2\u0612\u0613\7\u0088"+ - "\2\2\u0613\u0615\7T\2\2\u0614\u060f\3\2\2\2\u0614\u0610\3\2\2\2\u0614"+ - "\u0612\3\2\2\2\u0615\u0616\3\2\2\2\u0616\u0617\5\u0120\u0091\2\u0617\u0129"+ - "\3\2\2\2\u0618\u0619\7L\2\2\u0619\u061a\5\u012c\u0097\2\u061a\u012b\3"+ - "\2\2\2\u061b\u061c\5\u0130\u0099\2\u061c\u061d\5\u012e\u0098\2\u061d\u0620"+ - "\3\2\2\2\u061e\u0620\5\u0130\u0099\2\u061f\u061b\3\2\2\2\u061f\u061e\3"+ - "\2\2\2\u0620\u012d\3\2\2\2\u0621\u0624\5\u0130\u0099\2\u0622\u0624\5\u00b0"+ - "Y\2\u0623\u0621\3\2\2\2\u0623\u0622\3\2\2\2\u0624\u012f\3\2\2\2\u0625"+ - "\u0631\7e\2\2\u0626\u062b\5\u008aF\2\u0627\u0628\7l\2\2\u0628\u062a\5"+ - "\u008aF\2\u0629\u0627\3\2\2\2\u062a\u062d\3\2\2\2\u062b\u0629\3\2\2\2"+ - "\u062b\u062c\3\2\2\2\u062c\u062f\3\2\2\2\u062d\u062b\3\2\2\2\u062e\u0630"+ - "\7l\2\2\u062f\u062e\3\2\2\2\u062f\u0630\3\2\2\2\u0630\u0632\3\2\2\2\u0631"+ - "\u0626\3\2\2\2\u0631\u0632\3\2\2\2\u0632\u0633\3\2\2\2\u0633\u0634\7f"+ - "\2\2\u0634\u0131\3\2\2\2\u0635\u0636\5\u0134\u009b\2\u0636\u0637\7e\2"+ - "\2\u0637\u0639\5\u0092J\2\u0638\u063a\7l\2\2\u0639\u0638\3\2\2\2\u0639"+ - "\u063a\3\2\2\2\u063a\u063b\3\2\2\2\u063b\u063c\7f\2\2\u063c\u0133\3\2"+ - "\2\2\u063d\u0643\5\u00b2Z\2\u063e\u063f\7e\2\2\u063f\u0640\5\u0134\u009b"+ - "\2\u0640\u0641\7f\2\2\u0641\u0643\3\2\2\2\u0642\u063d\3\2\2\2\u0642\u063e"+ - "\3\2\2\2\u0643\u0135\3\2\2\2\u0644\u064b\5\u0138\u009d\2\u0645\u064b\5"+ - "\u013c\u009f\2\u0646\u0647\7e\2\2\u0647\u0648\5\u0092J\2\u0648\u0649\7"+ - "f\2\2\u0649\u064b\3\2\2\2\u064a\u0644\3\2\2\2\u064a\u0645\3\2\2\2\u064a"+ - "\u0646\3\2\2\2\u064b\u0137\3\2\2\2\u064c\u0650\5\u00a0Q\2\u064d\u0650"+ - "\5\u0140\u00a1\2\u064e\u0650\5\u00a4S\2\u064f\u064c\3\2\2\2\u064f\u064d"+ - "\3\2\2\2\u064f\u064e\3\2\2\2\u0650\u0139\3\2\2\2\u0651\u0652\t\23\2\2"+ - "\u0652\u013b\3\2\2\2\u0653\u0654\7d\2\2\u0654\u013d\3\2\2\2\u0655\u0656"+ - "\7d\2\2\u0656\u0657\7o\2\2\u0657\u0658\7d\2\2\u0658\u013f\3\2\2\2\u0659"+ - "\u065a\5\u00b8]\2\u065a\u065b\5\u0142\u00a2\2\u065b\u0141\3\2\2\2\u065c"+ - "\u0661\7g\2\2\u065d\u065f\5\u0144\u00a3\2\u065e\u0660\7l\2\2\u065f\u065e"+ - "\3\2\2\2\u065f\u0660\3\2\2\2\u0660\u0662\3\2\2\2\u0661\u065d\3\2\2\2\u0661"+ - "\u0662\3\2\2\2\u0662\u0663\3\2\2\2\u0663\u0664\7h\2\2\u0664\u0143\3\2"+ - "\2\2\u0665\u066a\5\u0146\u00a4\2\u0666\u0667\7l\2\2\u0667\u0669\5\u0146"+ - "\u00a4\2\u0668\u0666\3\2\2\2\u0669\u066c\3\2\2\2\u066a\u0668\3\2\2\2\u066a"+ - "\u066b\3\2\2\2\u066b\u0145\3\2\2\2\u066c\u066a\3\2\2\2\u066d\u066e\5\u0148"+ - "\u00a5\2\u066e\u066f\7n\2\2\u066f\u0671\3\2\2\2\u0670\u066d\3\2\2\2\u0670"+ - "\u0671\3\2\2\2\u0671\u0672\3\2\2\2\u0672\u0673\5\u014a\u00a6\2\u0673\u0147"+ - "\3\2\2\2\u0674\u0677\5\u0092J\2\u0675\u0677\5\u0142\u00a2\2\u0676\u0674"+ - "\3\2\2\2\u0676\u0675\3\2\2\2\u0677\u0149\3\2\2\2\u0678\u067b\5\u0092J"+ - "\2\u0679\u067b\5\u0142\u00a2\2\u067a\u0678\3\2\2\2\u067a\u0679\3\2\2\2"+ - "\u067b\u014b\3\2\2\2\u067c\u067d\7S\2\2\u067d\u0683\7g\2\2\u067e\u067f"+ - "\5\u014e\u00a8\2\u067f\u0680\5\u015e\u00b0\2\u0680\u0682\3\2\2\2\u0681"+ - "\u067e\3\2\2\2\u0682\u0685\3\2\2\2\u0683\u0681\3\2\2\2\u0683\u0684\3\2"+ - "\2\2\u0684\u0686\3\2\2\2\u0685\u0683\3\2\2\2\u0686\u0687\7h\2\2\u0687"+ - "\u014d\3\2\2\2\u0688\u0689\5\u00d2j\2\u0689\u068a\5\u00b0Y\2\u068a\u068d"+ - "\3\2\2\2\u068b\u068d\5\u0152\u00aa\2\u068c\u0688\3\2\2\2\u068c\u068b\3"+ - "\2\2\2\u068d\u068f\3\2\2\2\u068e\u0690\5\u0150\u00a9\2\u068f\u068e\3\2"+ - "\2\2\u068f\u0690\3\2\2\2\u0690\u014f\3\2\2\2\u0691\u0692\t\24\2\2\u0692"+ - "\u0151\3\2\2\2\u0693\u0695\7\u0086\2\2\u0694\u0693\3\2\2\2\u0694\u0695"+ - "\3\2\2\2\u0695\u0696\3\2\2\2\u0696\u0697\5\u011a\u008e\2\u0697\u0153\3"+ - "\2\2\2\u0698\u0699\7i\2\2\u0699\u069a\5\u0092J\2\u069a\u069b\7j\2\2\u069b"+ - "\u0155\3\2\2\2\u069c\u069d\7o\2\2\u069d\u069e\7e\2\2\u069e\u069f\5\u00b0"+ - "Y\2\u069f\u06a0\7f\2\2\u06a0\u0157\3\2\2\2\u06a1\u06b0\7e\2\2\u06a2\u06a9"+ - "\5\u00d4k\2\u06a3\u06a6\5\u0134\u009b\2\u06a4\u06a5\7l\2\2\u06a5\u06a7"+ - "\5\u00d4k\2\u06a6\u06a4\3\2\2\2\u06a6\u06a7\3\2\2\2\u06a7\u06a9\3\2\2"+ - "\2\u06a8\u06a2\3\2\2\2\u06a8\u06a3\3\2\2\2\u06a9\u06ab\3\2\2\2\u06aa\u06ac"+ - "\7s\2\2\u06ab\u06aa\3\2\2\2\u06ab\u06ac\3\2\2\2\u06ac\u06ae\3\2\2\2\u06ad"+ - "\u06af\7l\2\2\u06ae\u06ad\3\2\2\2\u06ae\u06af\3\2\2\2\u06af\u06b1\3\2"+ - "\2\2\u06b0\u06a8\3\2\2\2\u06b0\u06b1\3\2\2\2\u06b1\u06b2\3\2\2\2\u06b2"+ - "\u06b3\7f\2\2\u06b3\u0159\3\2\2\2\u06b4\u06b5\5\u0134\u009b\2\u06b5\u06b6"+ - "\7o\2\2\u06b6\u06b7\7d\2\2\u06b7\u015b\3\2\2\2\u06b8\u06b9\5\u00b0Y\2"+ - "\u06b9\u015d\3\2\2\2\u06ba\u06bf\7m\2\2\u06bb\u06bf\7\2\2\3\u06bc\u06bf"+ - "\7\u009e\2\2\u06bd\u06bf\6\u00b0\24\2\u06be\u06ba\3\2\2\2\u06be\u06bb"+ - "\3\2\2\2\u06be\u06bc\3\2\2\2\u06be\u06bd\3\2\2\2\u06bf\u015f\3\2\2\2\u00b3"+ - "\u016e\u0173\u017a\u0184\u018a\u0190\u01a0\u01a4\u01ad\u01b9\u01bd\u01c3"+ - "\u01cb\u01d5\u01e5\u01f3\u01f7\u01fe\u0206\u020f\u022f\u0237\u024f\u0260"+ - "\u026c\u0275\u0283\u0295\u029c\u02a1\u02a6\u02b0\u02b3\u02b7\u02bb\u02c2"+ - "\u02c5\u02cb\u02d0\u02d2\u02d5\u02dc\u02e1\u02f4\u02fc\u0300\u0303\u0309"+ - "\u030d\u0310\u031a\u0321\u0328\u0334\u033a\u0341\u0346\u034c\u0358\u035e"+ - "\u0362\u036a\u036e\u0374\u0377\u037d\u0382\u0396\u03b9\u03bb\u03d2\u03da"+ - "\u03e5\u03ec\u03f3\u03fd\u040b\u0421\u0423\u042b\u042f\u0433\u0436\u043f"+ - "\u0445\u044f\u0457\u045d\u0466\u0471\u047c\u0480\u0482\u048d\u0496\u049a"+ - "\u049d\u04a4\u04af\u04b9\u04bf\u04c1\u04cb\u04d5\u04d9\u04dd\u04e1\u04e8"+ - "\u04f0\u04fb\u04ff\u0503\u050f\u0513\u0517\u051c\u0523\u052a\u053e\u0542"+ - "\u0546\u054a\u055a\u0560\u0562\u0566\u056a\u056d\u0571\u0573\u0579\u0581"+ - "\u0586\u0591\u0597\u059e\u05a9\u05ae\u05b2\u05b7\u05bb\u05c3\u05cb\u05d0"+ - "\u05d3\u05db\u05e3\u05e8\u05ec\u05f0\u05f7\u0614\u061f\u0623\u062b\u062f"+ - "\u0631\u0639\u0642\u064a\u064f\u065f\u0661\u066a\u0670\u0676\u067a\u0683"+ - "\u068c\u068f\u0694\u06a6\u06a8\u06ab\u06ae\u06b0\u06be"; + "\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\2\25"+ + "\4\2eepp\3\2\31\32\3\2\7\n\3\2AB\3\2)+\4\2)+--\3\2\u0083\u0089\3\2\26"+ + "\27\4\2~\u0082\u0087\u0088\6\2$$qq}}\u0084\u0086\3\2 \"\3\2\35\37\4\2"+ + "HIw|\6\2..\61\61\64\64]]\4\2}\u0082\u0084\u0088\3\2qr\4\2nn\u009f\u009f"+ + "\4\2\u008a\u008d\u008f\u0090\3\2\u0096\u0097\2\u073d\2\u0164\3\2\2\2\4"+ + "\u0167\3\2\2\2\6\u016a\3\2\2\2\b\u016d\3\2\2\2\n\u0175\3\2\2\2\f\u017e"+ + "\3\2\2\2\16\u0199\3\2\2\2\20\u019c\3\2\2\2\22\u01a4\3\2\2\2\24\u01b1\3"+ + "\2\2\2\26\u01c7\3\2\2\2\30\u01cf\3\2\2\2\32\u01d1\3\2\2\2\34\u01d3\3\2"+ + "\2\2\36\u01d6\3\2\2\2 \u01e9\3\2\2\2\"\u01eb\3\2\2\2$\u01ed\3\2\2\2&\u01f2"+ + "\3\2\2\2(\u01fd\3\2\2\2*\u020a\3\2\2\2,\u020d\3\2\2\2.\u0218\3\2\2\2\60"+ + "\u021a\3\2\2\2\62\u021f\3\2\2\2\64\u0224\3\2\2\2\66\u0229\3\2\2\28\u022e"+ + "\3\2\2\2:\u023b\3\2\2\2<\u023d\3\2\2\2>\u023f\3\2\2\2@\u0244\3\2\2\2B"+ + "\u0249\3\2\2\2D\u024e\3\2\2\2F\u0257\3\2\2\2H\u025e\3\2\2\2J\u0269\3\2"+ + "\2\2L\u0271\3\2\2\2N\u0273\3\2\2\2P\u0288\3\2\2\2R\u028a\3\2\2\2T\u0296"+ + "\3\2\2\2V\u02a2\3\2\2\2X\u02b2\3\2\2\2Z\u02be\3\2\2\2\\\u02cd\3\2\2\2"+ + "^\u02d0\3\2\2\2`\u02d8\3\2\2\2b\u02da\3\2\2\2d\u02e8\3\2\2\2f\u02f4\3"+ + "\2\2\2h\u02fe\3\2\2\2j\u0302\3\2\2\2l\u0308\3\2\2\2n\u0320\3\2\2\2p\u0328"+ + "\3\2\2\2r\u0337\3\2\2\2t\u0339\3\2\2\2v\u0340\3\2\2\2x\u0349\3\2\2\2z"+ + "\u034e\3\2\2\2|\u0353\3\2\2\2~\u0359\3\2\2\2\u0080\u0360\3\2\2\2\u0082"+ + "\u0365\3\2\2\2\u0084\u036b\3\2\2\2\u0086\u0370\3\2\2\2\u0088\u0377\3\2"+ + "\2\2\u008a\u0381\3\2\2\2\u008c\u0385\3\2\2\2\u008e\u0391\3\2\2\2\u0090"+ + "\u0394\3\2\2\2\u0092\u0398\3\2\2\2\u0094\u039f\3\2\2\2\u0096\u03b3\3\2"+ + "\2\2\u0098\u03ef\3\2\2\2\u009a\u03f1\3\2\2\2\u009c\u03f4\3\2\2\2\u009e"+ + "\u03f9\3\2\2\2\u00a0\u0402\3\2\2\2\u00a2\u0410\3\2\2\2\u00a4\u041a\3\2"+ + "\2\2\u00a6\u0428\3\2\2\2\u00a8\u0443\3\2\2\2\u00aa\u0446\3\2\2\2\u00ac"+ + "\u044e\3\2\2\2\u00ae\u0457\3\2\2\2\u00b0\u0467\3\2\2\2\u00b2\u047a\3\2"+ + "\2\2\u00b4\u0483\3\2\2\2\u00b6\u048e\3\2\2\2\u00b8\u0490\3\2\2\2\u00ba"+ + "\u0493\3\2\2\2\u00bc\u04aa\3\2\2\2\u00be\u04ac\3\2\2\2\u00c0\u04b1\3\2"+ + "\2\2\u00c2\u04c5\3\2\2\2\u00c4\u04c7\3\2\2\2\u00c6\u04c9\3\2\2\2\u00c8"+ + "\u04cc\3\2\2\2\u00ca\u04d6\3\2\2\2\u00cc\u04e0\3\2\2\2\u00ce\u04e3\3\2"+ + "\2\2\u00d0\u04e8\3\2\2\2\u00d2\u04ea\3\2\2\2\u00d4\u04f8\3\2\2\2\u00d6"+ + "\u0500\3\2\2\2\u00d8\u0508\3\2\2\2\u00da\u0510\3\2\2\2\u00dc\u051e\3\2"+ + "\2\2\u00de\u0524\3\2\2\2\u00e0\u0532\3\2\2\2\u00e2\u053e\3\2\2\2\u00e4"+ + "\u0547\3\2\2\2\u00e6\u0549\3\2\2\2\u00e8\u054b\3\2\2\2\u00ea\u054f\3\2"+ + "\2\2\u00ec\u0552\3\2\2\2\u00ee\u0556\3\2\2\2\u00f0\u0558\3\2\2\2\u00f2"+ + "\u055d\3\2\2\2\u00f4\u0561\3\2\2\2\u00f6\u0565\3\2\2\2\u00f8\u0569\3\2"+ + "\2\2\u00fa\u056c\3\2\2\2\u00fc\u056e\3\2\2\2\u00fe\u0583\3\2\2\2\u0100"+ + "\u0585\3\2\2\2\u0102\u059b\3\2\2\2\u0104\u05a3\3\2\2\2\u0106\u05a5\3\2"+ + "\2\2\u0108\u05bb\3\2\2\2\u010a\u05c3\3\2\2\2\u010c\u05cb\3\2\2\2\u010e"+ + "\u05cf\3\2\2\2\u0110\u05db\3\2\2\2\u0112\u05e5\3\2\2\2\u0114\u05f0\3\2"+ + "\2\2\u0116\u05f8\3\2\2\2\u0118\u05fc\3\2\2\2\u011a\u0605\3\2\2\2\u011c"+ + "\u060f\3\2\2\2\u011e\u0614\3\2\2\2\u0120\u0616\3\2\2\2\u0122\u061b\3\2"+ + "\2\2\u0124\u061d\3\2\2\2\u0126\u061f\3\2\2\2\u0128\u0622\3\2\2\2\u012a"+ + "\u0626\3\2\2\2\u012c\u0631\3\2\2\2\u012e\u0635\3\2\2\2\u0130\u063c\3\2"+ + "\2\2\u0132\u0640\3\2\2\2\u0134\u0642\3\2\2\2\u0136\u0652\3\2\2\2\u0138"+ + "\u065f\3\2\2\2\u013a\u0667\3\2\2\2\u013c\u066c\3\2\2\2\u013e\u066e\3\2"+ + "\2\2\u0140\u0670\3\2\2\2\u0142\u0672\3\2\2\2\u0144\u0676\3\2\2\2\u0146"+ + "\u0679\3\2\2\2\u0148\u0682\3\2\2\2\u014a\u068d\3\2\2\2\u014c\u0693\3\2"+ + "\2\2\u014e\u0697\3\2\2\2\u0150\u0699\3\2\2\2\u0152\u06a9\3\2\2\2\u0154"+ + "\u06ae\3\2\2\2\u0156\u06b1\3\2\2\2\u0158\u06b5\3\2\2\2\u015a\u06b9\3\2"+ + "\2\2\u015c\u06be\3\2\2\2\u015e\u06d1\3\2\2\2\u0160\u06d5\3\2\2\2\u0162"+ + "\u06db\3\2\2\2\u0164\u0165\5\u0096L\2\u0165\u0166\7\2\2\3\u0166\3\3\2"+ + "\2\2\u0167\u0168\5\u0098M\2\u0168\u0169\7\2\2\3\u0169\5\3\2\2\2\u016a"+ + "\u016b\5\u00b4[\2\u016b\u016c\7\2\2\3\u016c\7\3\2\2\2\u016d\u0172\5\n"+ + "\6\2\u016e\u016f\7m\2\2\u016f\u0171\5\n\6\2\u0170\u016e\3\2\2\2\u0171"+ + "\u0174\3\2\2\2\u0172\u0170\3\2\2\2\u0172\u0173\3\2\2\2\u0173\t\3\2\2\2"+ + "\u0174\u0172\3\2\2\2\u0175\u0177\7e\2\2\u0176\u0178\7<\2\2\u0177\u0176"+ + "\3\2\2\2\u0177\u0178\3\2\2\2\u0178\13\3\2\2\2\u0179\u017a\5\16\b\2\u017a"+ + "\u017b\5\u0162\u00b2\2\u017b\u017d\3\2\2\2\u017c\u0179\3\2\2\2\u017d\u0180"+ + "\3\2\2\2\u017e\u017c\3\2\2\2\u017e\u017f\3\2\2\2\u017f\u0181\3\2\2\2\u0180"+ + "\u017e\3\2\2\2\u0181\u0182\5\u00ccg\2\u0182\u0188\5\u0162\u00b2\2\u0183"+ + "\u0184\5\24\13\2\u0184\u0185\5\u0162\u00b2\2\u0185\u0187\3\2\2\2\u0186"+ + "\u0183\3\2\2\2\u0187\u018a\3\2\2\2\u0188\u0186\3\2\2\2\u0188\u0189\3\2"+ + "\2\2\u0189\u0194\3\2\2\2\u018a\u0188\3\2\2\2\u018b\u018f\5z>\2\u018c\u018f"+ + "\5\u00d0i\2\u018d\u018f\5\26\f\2\u018e\u018b\3\2\2\2\u018e\u018c\3\2\2"+ + "\2\u018e\u018d\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191\5\u0162\u00b2\2"+ + "\u0191\u0193\3\2\2\2\u0192\u018e\3\2\2\2\u0193\u0196\3\2\2\2\u0194\u0192"+ + "\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u0197\3\2\2\2\u0196\u0194\3\2\2\2\u0197"+ + "\u0198\7\2\2\3\u0198\r\3\2\2\2\u0199\u019a\7E\2\2\u019a\u019b\5\u0096"+ + "L\2\u019b\17\3\2\2\2\u019c\u019d\7F\2\2\u019d\u019e\5\u0096L\2\u019e\21"+ + "\3\2\2\2\u019f\u01a0\5\20\t\2\u01a0\u01a1\5\u0162\u00b2\2\u01a1\u01a3"+ + "\3\2\2\2\u01a2\u019f\3\2\2\2\u01a3\u01a6\3\2\2\2\u01a4\u01a2\3\2\2\2\u01a4"+ + "\u01a5\3\2\2\2\u01a5\u01a8\3\2\2\2\u01a6\u01a4\3\2\2\2\u01a7\u01a9\t\2"+ + "\2\2\u01a8\u01a7\3\2\2\2\u01a8\u01a9\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aa"+ + "\u01ab\5\u00ceh\2\u01ab\23\3\2\2\2\u01ac\u01ad\5\20\t\2\u01ad\u01ae\5"+ + "\u0162\u00b2\2\u01ae\u01b0\3\2\2\2\u01af\u01ac\3\2\2\2\u01b0\u01b3\3\2"+ + "\2\2\u01b1\u01af\3\2\2\2\u01b1\u01b2\3\2\2\2\u01b2\u01c1\3\2\2\2\u01b3"+ + "\u01b1\3\2\2\2\u01b4\u01b5\7a\2\2\u01b5\u01c2\5\22\n\2\u01b6\u01b7\7a"+ + "\2\2\u01b7\u01bd\7f\2\2\u01b8\u01b9\5\22\n\2\u01b9\u01ba\5\u0162\u00b2"+ + "\2\u01ba\u01bc\3\2\2\2\u01bb\u01b8\3\2\2\2\u01bc\u01bf\3\2\2\2\u01bd\u01bb"+ + "\3\2\2\2\u01bd\u01be\3\2\2\2\u01be\u01c0\3\2\2\2\u01bf\u01bd\3\2\2\2\u01c0"+ + "\u01c2\7g\2\2\u01c1\u01b4\3\2\2\2\u01c1\u01b6\3\2\2\2\u01c2\25\3\2\2\2"+ + "\u01c3\u01c8\5l\67\2\u01c4\u01c8\5\u0082B\2\u01c5\u01c8\5\u0086D\2\u01c6"+ + "\u01c8\5\u0080A\2\u01c7\u01c3\3\2\2\2\u01c7\u01c4\3\2\2\2\u01c7\u01c5"+ + "\3\2\2\2\u01c7\u01c6\3\2\2\2\u01c8\27\3\2\2\2\u01c9\u01ca\7\34\2\2\u01ca"+ + "\u01d0\5\u0098M\2\u01cb\u01cc\t\3\2\2\u01cc\u01d0\5.\30\2\u01cd\u01ce"+ + "\t\4\2\2\u01ce\u01d0\5\u0096L\2\u01cf\u01c9\3\2\2\2\u01cf\u01cb\3\2\2"+ + "\2\u01cf\u01cd\3\2\2\2\u01d0\31\3\2\2\2\u01d1\u01d2\5\34\17\2\u01d2\33"+ + "\3\2\2\2\u01d3\u01d4\5Z.\2\u01d4\u01d5\5\36\20\2\u01d5\35\3\2\2\2\u01d6"+ + "\u01d7\7D\2\2\u01d7\u01d9\7f\2\2\u01d8\u01da\5\u00e2r\2\u01d9\u01d8\3"+ + "\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01db\3\2\2\2\u01db\u01dc\7g\2\2\u01dc"+ + "\37\3\2\2\2\u01dd\u01ea\5F$\2\u01de\u01ea\5D#\2\u01df\u01ea\5B\"\2\u01e0"+ + "\u01ea\5$\23\2\u01e1\u01ea\5@!\2\u01e2\u01ea\58\35\2\u01e3\u01ea\5> \2"+ + "\u01e4\u01ea\5\66\34\2\u01e5\u01ea\5\62\32\2\u01e6\u01ea\5\60\31\2\u01e7"+ + "\u01ea\5\64\33\2\u01e8\u01ea\5\"\22\2\u01e9\u01dd\3\2\2\2\u01e9\u01de"+ + "\3\2\2\2\u01e9\u01df\3\2\2\2\u01e9\u01e0\3\2\2\2\u01e9\u01e1\3\2\2\2\u01e9"+ + "\u01e2\3\2\2\2\u01e9\u01e3\3\2\2\2\u01e9\u01e4\3\2\2\2\u01e9\u01e5\3\2"+ + "\2\2\u01e9\u01e6\3\2\2\2\u01e9\u01e7\3\2\2\2\u01e9\u01e8\3\2\2\2\u01ea"+ + "!\3\2\2\2\u01eb\u01ec\t\5\2\2\u01ec#\3\2\2\2\u01ed\u01ee\7^\2\2\u01ee"+ + "\u01ef\7j\2\2\u01ef\u01f0\5\u00b4[\2\u01f0\u01f1\7k\2\2\u01f1%\3\2\2\2"+ + "\u01f2\u01f7\5(\25\2\u01f3\u01f4\7m\2\2\u01f4\u01f6\5(\25\2\u01f5\u01f3"+ + "\3\2\2\2\u01f6\u01f9\3\2\2\2\u01f7\u01f5\3\2\2\2\u01f7\u01f8\3\2\2\2\u01f8"+ + "\u01fb\3\2\2\2\u01f9\u01f7\3\2\2\2\u01fa\u01fc\7m\2\2\u01fb\u01fa\3\2"+ + "\2\2\u01fb\u01fc\3\2\2\2\u01fc\'\3\2\2\2\u01fd\u0202\7e\2\2\u01fe\u01ff"+ + "\7m\2\2\u01ff\u0201\7e\2\2\u0200\u01fe\3\2\2\2\u0201\u0204\3\2\2\2\u0202"+ + "\u0200\3\2\2\2\u0202\u0203\3\2\2\2\u0203\u0205\3\2\2\2\u0204\u0202\3\2"+ + "\2\2\u0205\u0206\5\u0124\u0093\2\u0206)\3\2\2\2\u0207\u0209\5,\27\2\u0208"+ + "\u0207\3\2\2\2\u0209\u020c\3\2\2\2\u020a\u0208\3\2\2\2\u020a\u020b\3\2"+ + "\2\2\u020b+\3\2\2\2\u020c\u020a\3\2\2\2\u020d\u020e\7h\2\2\u020e\u0213"+ + "\5\u0096L\2\u020f\u0210\7m\2\2\u0210\u0212\5\u0096L\2\u0211\u020f\3\2"+ + "\2\2\u0212\u0215\3\2\2\2\u0213\u0211\3\2\2\2\u0213\u0214\3\2\2\2\u0214"+ + "\u0216\3\2\2\2\u0215\u0213\3\2\2\2\u0216\u0217\7i\2\2\u0217-\3\2\2\2\u0218"+ + "\u0219\5\u00a6T\2\u0219/\3\2\2\2\u021a\u021b\7\62\2\2\u021b\u021c\7f\2"+ + "\2\u021c\u021d\5\u0096L\2\u021d\u021e\7g\2\2\u021e\61\3\2\2\2\u021f\u0220"+ + "\7\67\2\2\u0220\u0221\7j\2\2\u0221\u0222\5\u00b4[\2\u0222\u0223\7k\2\2"+ + "\u0223\63\3\2\2\2\u0224\u0225\7\63\2\2\u0225\u0226\7f\2\2\u0226\u0227"+ + "\5\u0096L\2\u0227\u0228\7g\2\2\u0228\65\3\2\2\2\u0229\u022a\t\6\2\2\u022a"+ + "\u022b\7f\2\2\u022b\u022c\5\u0096L\2\u022c\u022d\7g\2\2\u022d\67\3\2\2"+ + "\2\u022e\u0233\7\23\2\2\u022f\u0230\7j\2\2\u0230\u0231\5:\36\2\u0231\u0232"+ + "\7k\2\2\u0232\u0234\3\2\2\2\u0233\u022f\3\2\2\2\u0233\u0234\3\2\2\2\u0234"+ + "\u0235\3\2\2\2\u0235\u0236\7f\2\2\u0236\u0237\5\u0096L\2\u0237\u0238\7"+ + "g\2\2\u02389\3\2\2\2\u0239\u023c\5<\37\2\u023a\u023c\7\25\2\2\u023b\u0239"+ + "\3\2\2\2\u023b\u023a\3\2\2\2\u023c;\3\2\2\2\u023d\u023e\7e\2\2\u023e="+ + "\3\2\2\2\u023f\u0240\7\24\2\2\u0240\u0241\7f\2\2\u0241\u0242\5\u0096L"+ + "\2\u0242\u0243\7g\2\2\u0243?\3\2\2\2\u0244\u0245\7:\2\2\u0245\u0246\7"+ + "f\2\2\u0246\u0247\5\u0096L\2\u0247\u0248\7g\2\2\u0248A\3\2\2\2\u0249\u024a"+ + "\79\2\2\u024a\u024b\7f\2\2\u024b\u024c\5\u0096L\2\u024c\u024d\7g\2\2\u024d"+ + "C\3\2\2\2\u024e\u024f\7\30\2\2\u024f\u0250\7f\2\2\u0250\u0253\5\u0096"+ + "L\2\u0251\u0252\7m\2\2\u0252\u0254\5\u0096L\2\u0253\u0251\3\2\2\2\u0253"+ + "\u0254\3\2\2\2\u0254\u0255\3\2\2\2\u0255\u0256\7g\2\2\u0256E\3\2\2\2\u0257"+ + "\u0258\t\6\2\2\u0258\u0259\7j\2\2\u0259\u025a\5\u0096L\2\u025a\u025b\7"+ + "=\2\2\u025b\u025c\5\u0096L\2\u025c\u025d\7k\2\2\u025dG\3\2\2\2\u025e\u025f"+ + "\7j\2\2\u025f\u0264\5J&\2\u0260\u0261\7m\2\2\u0261\u0263\5J&\2\u0262\u0260"+ + "\3\2\2\2\u0263\u0266\3\2\2\2\u0264\u0262\3\2\2\2\u0264\u0265\3\2\2\2\u0265"+ + "\u0267\3\2\2\2\u0266\u0264\3\2\2\2\u0267\u0268\7k\2\2\u0268I\3\2\2\2\u0269"+ + "\u026a\5\u0096L\2\u026a\u026b\7l\2\2\u026b\u026c\5\u0096L\2\u026cK\3\2"+ + "\2\2\u026d\u0272\5X-\2\u026e\u0272\5V,\2\u026f\u0272\5N(\2\u0270\u0272"+ + "\5R*\2\u0271\u026d\3\2\2\2\u0271\u026e\3\2\2\2\u0271\u026f\3\2\2\2\u0271"+ + "\u0270\3\2\2\2\u0272M\3\2\2\2\u0273\u0274\7\64\2\2\u0274\u027a\7h\2\2"+ + "\u0275\u0276\5P)\2\u0276\u0277\5\u0162\u00b2\2\u0277\u0279\3\2\2\2\u0278"+ + "\u0275\3\2\2\2\u0279\u027c\3\2\2\2\u027a\u0278\3\2\2\2\u027a\u027b\3\2"+ + "\2\2\u027b\u027d\3\2\2\2\u027c\u027a\3\2\2\2\u027d\u027e\7i\2\2\u027e"+ + "O\3\2\2\2\u027f\u0280\7M\2\2\u0280\u0281\7e\2\2\u0281\u0289\5\u0130\u0099"+ + "\2\u0282\u0283\7\65\2\2\u0283\u0284\7h\2\2\u0284\u0285\5\u0096L\2\u0285"+ + "\u0286\5\u0162\u00b2\2\u0286\u0287\7i\2\2\u0287\u0289\3\2\2\2\u0288\u027f"+ + "\3\2\2\2\u0288\u0282\3\2\2\2\u0289Q\3\2\2\2\u028a\u028b\7\66\2\2\u028b"+ + "\u0291\7h\2\2\u028c\u028d\5T+\2\u028d\u028e\5\u0162\u00b2\2\u028e\u0290"+ + "\3\2\2\2\u028f\u028c\3\2\2\2\u0290\u0293\3\2\2\2\u0291\u028f\3\2\2\2\u0291"+ + "\u0292\3\2\2\2\u0292\u0294\3\2\2\2\u0293\u0291\3\2\2\2\u0294\u0295\7i"+ + "\2\2\u0295S\3\2\2\2\u0296\u0297\7e\2\2\u0297\u029d\7h\2\2\u0298\u0299"+ + "\5\u0152\u00aa\2\u0299\u029a\5\u0162\u00b2\2\u029a\u029c\3\2\2\2\u029b"+ + "\u0298\3\2\2\2\u029c\u029f\3\2\2\2\u029d\u029b\3\2\2\2\u029d\u029e\3\2"+ + "\2\2\u029e\u02a0\3\2\2\2\u029f\u029d\3\2\2\2\u02a0\u02a1\7i\2\2\u02a1"+ + "U\3\2\2\2\u02a2\u02a3\7\34\2\2\u02a3\u02a4\7j\2\2\u02a4\u02a5\7k\2\2\u02a5"+ + "\u02a6\5\u0124\u0093\2\u02a6W\3\2\2\2\u02a7\u02a8\t\7\2\2\u02a8\u02a9"+ + "\7j\2\2\u02a9\u02aa\5\u00b4[\2\u02aa\u02ab\7k\2\2\u02ab\u02b3\3\2\2\2"+ + "\u02ac\u02ad\7,\2\2\u02ad\u02ae\7j\2\2\u02ae\u02af\5\u00b4[\2\u02af\u02b0"+ + "\7k\2\2\u02b0\u02b1\5\u00b4[\2\u02b1\u02b3\3\2\2\2\u02b2\u02a7\3\2\2\2"+ + "\u02b2\u02ac\3\2\2\2\u02b3Y\3\2\2\2\u02b4\u02ba\5\\/\2\u02b5\u02b6\7\20"+ + "\2\2\u02b6\u02ba\b.\1\2\u02b7\u02b8\7C\2\2\u02b8\u02ba\b.\1\2\u02b9\u02b4"+ + "\3\2\2\2\u02b9\u02b5\3\2\2\2\u02b9\u02b7\3\2\2\2\u02ba\u02bb\3\2\2\2\u02bb"+ + "\u02bd\5\u0162\u00b2\2\u02bc\u02b9\3\2\2\2\u02bd\u02c0\3\2\2\2\u02be\u02bf"+ + "\3\2\2\2\u02be\u02bc\3\2\2\2\u02bf\u02c3\3\2\2\2\u02c0\u02be\3\2\2\2\u02c1"+ + "\u02c2\7\20\2\2\u02c2\u02c4\b.\1\2\u02c3\u02c1\3\2\2\2\u02c3\u02c4\3\2"+ + "\2\2\u02c4[\3\2\2\2\u02c5\u02c6\7\13\2\2\u02c6\u02ce\5`\61\2\u02c7\u02c8"+ + "\7\f\2\2\u02c8\u02ce\5`\61\2\u02c9\u02ca\7\r\2\2\u02ca\u02ce\5`\61\2\u02cb"+ + "\u02cc\7\17\2\2\u02cc\u02ce\5^\60\2\u02cd\u02c5\3\2\2\2\u02cd\u02c7\3"+ + "\2\2\2\u02cd\u02c9\3\2\2\2\u02cd\u02cb\3\2\2\2\u02ce]\3\2\2\2\u02cf\u02d1"+ + "\5\u00d8m\2\u02d0\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d4\3\2\2"+ + "\2\u02d2\u02d3\7\\\2\2\u02d3\u02d5\5\u0096L\2\u02d4\u02d2\3\2\2\2\u02d4"+ + "\u02d5\3\2\2\2\u02d5_\3\2\2\2\u02d6\u02d9\3\2\2\2\u02d7\u02d9\5\u0096"+ + "L\2\u02d8\u02d6\3\2\2\2\u02d8\u02d7\3\2\2\2\u02d9a\3\2\2\2\u02da\u02df"+ + "\7h\2\2\u02db\u02dc\7;\2\2\u02dc\u02dd\5\u00d6l\2\u02dd\u02de\5\u0162"+ + "\u00b2\2\u02de\u02e0\3\2\2\2\u02df\u02db\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0"+ + "\u02e2\3\2\2\2\u02e1\u02e3\5\u00e2r\2\u02e2\u02e1\3\2\2\2\u02e2\u02e3"+ + "\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02e5\7i\2\2\u02e5c\3\2\2\2\u02e6\u02e9"+ + "\5\u0142\u00a2\2\u02e7\u02e9\7e\2\2\u02e8\u02e6\3\2\2\2\u02e8\u02e7\3"+ + "\2\2\2\u02e9\u02f2\3\2\2\2\u02ea\u02ef\7h\2\2\u02eb\u02ed\5f\64\2\u02ec"+ + "\u02ee\7m\2\2\u02ed\u02ec\3\2\2\2\u02ed\u02ee\3\2\2\2\u02ee\u02f0\3\2"+ + "\2\2\u02ef\u02eb\3\2\2\2\u02ef\u02f0\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1"+ + "\u02f3\7i\2\2\u02f2\u02ea\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3e\3\2\2\2\u02f4"+ + "\u02f9\5h\65\2\u02f5\u02f6\7m\2\2\u02f6\u02f8\5h\65\2\u02f7\u02f5\3\2"+ + "\2\2\u02f8\u02fb\3\2\2\2\u02f9\u02f7\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa"+ + "g\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fc\u02fd\7e\2\2\u02fd\u02ff\7o\2\2\u02fe"+ + "\u02fc\3\2\2\2\u02fe\u02ff\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u0301\5\u0096"+ + "L\2\u0301i\3\2\2\2\u0302\u0303\7G\2\2\u0303\u0304\5\u0096L\2\u0304\u0305"+ + "\7\21\2\2\u0305\u0306\5d\63\2\u0306\u0307\5\u00e0q\2\u0307k\3\2\2\2\u0308"+ + "\u0309\5\u00b4[\2\u0309\u030a\7\21\2\2\u030a\u031d\5\u00b4[\2\u030b\u0311"+ + "\7h\2\2\u030c\u030d\5t;\2\u030d\u030e\5\u0162\u00b2\2\u030e\u0310\3\2"+ + "\2\2\u030f\u030c\3\2\2\2\u0310\u0313\3\2\2\2\u0311\u030f\3\2\2\2\u0311"+ + "\u0312\3\2\2\2\u0312\u0319\3\2\2\2\u0313\u0311\3\2\2\2\u0314\u0315\5n"+ + "8\2\u0315\u0316\5\u0162\u00b2\2\u0316\u0318\3\2\2\2\u0317\u0314\3\2\2"+ + "\2\u0318\u031b\3\2\2\2\u0319\u0317\3\2\2\2\u0319\u031a\3\2\2\2\u031a\u031c"+ + "\3\2\2\2\u031b\u0319\3\2\2\2\u031c\u031e\7i\2\2\u031d\u030b\3\2\2\2\u031d"+ + "\u031e\3\2\2\2\u031em\3\2\2\2\u031f\u0321\7\20\2\2\u0320\u031f\3\2\2\2"+ + "\u0320\u0321\3\2\2\2\u0321\u0322\3\2\2\2\u0322\u0323\5p9\2\u0323\u0324"+ + "\7e\2\2\u0324\u0326\5\u0130\u0099\2\u0325\u0327\5\u00e0q\2\u0326\u0325"+ + "\3\2\2\2\u0326\u0327\3\2\2\2\u0327o\3\2\2\2\u0328\u032a\7f\2\2\u0329\u032b"+ + "\7e\2\2\u032a\u0329\3\2\2\2\u032a\u032b\3\2\2\2\u032b\u032d\3\2\2\2\u032c"+ + "\u032e\7\u0087\2\2\u032d\u032c\3\2\2\2\u032d\u032e\3\2\2\2\u032e\u032f"+ + "\3\2\2\2\u032f\u0330\5\u011e\u0090\2\u0330\u0331\7g\2\2\u0331q\3\2\2\2"+ + "\u0332\u0338\5\u00a6T\2\u0333\u0334\5\u00b4[\2\u0334\u0335\7p\2\2\u0335"+ + "\u0336\7e\2\2\u0336\u0338\3\2\2\2\u0337\u0332\3\2\2\2\u0337\u0333\3\2"+ + "\2\2\u0338s\3\2\2\2\u0339\u033a\78\2\2\u033a\u033b\7e\2\2\u033b\u033e"+ + "\7s\2\2\u033c\u033f\5r:\2\u033d\u033f\5\u0140\u00a1\2\u033e\u033c\3\2"+ + "\2\2\u033e\u033d\3\2\2\2\u033fu\3\2\2\2\u0340\u0341\7\60\2\2\u0341\u0342"+ + "\7f\2\2\u0342\u0345\5\u00b4[\2\u0343\u0344\7m\2\2\u0344\u0346\5\u00d8"+ + "m\2\u0345\u0343\3\2\2\2\u0345\u0346\3\2\2\2\u0346\u0347\3\2\2\2\u0347"+ + "\u0348\7g\2\2\u0348w\3\2\2\2\u0349\u034a\7/\2\2\u034a\u034b\7f\2\2\u034b"+ + "\u034c\5\u00b4[\2\u034c\u034d\7g\2\2\u034dy\3\2\2\2\u034e\u0351\5Z.\2"+ + "\u034f\u0352\5|?\2\u0350\u0352\5~@\2\u0351\u034f\3\2\2\2\u0351\u0350\3"+ + "\2\2\2\u0352{\3\2\2\2\u0353\u0354\7M\2\2\u0354\u0355\7e\2\2\u0355\u0357"+ + "\5\u0130\u0099\2\u0356\u0358\5b\62\2\u0357\u0356\3\2\2\2\u0357\u0358\3"+ + "\2\2\2\u0358}\3\2\2\2\u0359\u035a\7M\2\2\u035a\u035b\5\u008cG\2\u035b"+ + "\u035c\7e\2\2\u035c\u035e\5\u0130\u0099\2\u035d\u035f\5b\62\2\u035e\u035d"+ + "\3\2\2\2\u035e\u035f\3\2\2\2\u035f\177\3\2\2\2\u0360\u0363\7\34\2\2\u0361"+ + "\u0364\5z>\2\u0362\u0364\5\u00d0i\2\u0363\u0361\3\2\2\2\u0363\u0362\3"+ + "\2\2\2\u0364\u0081\3\2\2\2\u0365\u0366\78\2\2\u0366\u0367\7e\2\2\u0367"+ + "\u0369\5\u0134\u009b\2\u0368\u036a\5\u0084C\2\u0369\u0368\3\2\2\2\u0369"+ + "\u036a\3\2\2\2\u036a\u0083\3\2\2\2\u036b\u036c\7h\2\2\u036c\u036d\5\u0096"+ + "L\2\u036d\u036e\5\u0162\u00b2\2\u036e\u036f\7i\2\2\u036f\u0085\3\2\2\2"+ + "\u0370\u0371\78\2\2\u0371\u0372\5\u008cG\2\u0372\u0373\7e\2\2\u0373\u0375"+ + "\5\u0134\u009b\2\u0374\u0376\5\u0084C\2\u0375\u0374\3\2\2\2\u0375\u0376"+ + "\3\2\2\2\u0376\u0087\3\2\2\2\u0377\u037f\5\b\5\2\u0378\u037b\5\u00b4["+ + "\2\u0379\u037a\7l\2\2\u037a\u037c\5\u00d8m\2\u037b\u0379\3\2\2\2\u037b"+ + "\u037c\3\2\2\2\u037c\u0380\3\2\2\2\u037d\u037e\7l\2\2\u037e\u0380\5\u00d8"+ + "m\2\u037f\u0378\3\2\2\2\u037f\u037d\3\2\2\2\u0380\u0089\3\2\2\2\u0381"+ + "\u0382\5\b\5\2\u0382\u0383\7s\2\2\u0383\u0384\5\u00d8m\2\u0384\u008b\3"+ + "\2\2\2\u0385\u0387\7f\2\2\u0386\u0388\5\n\6\2\u0387\u0386\3\2\2\2\u0387"+ + "\u0388\3\2\2\2\u0388\u0389\3\2\2\2\u0389\u038b\5\u00b4[\2\u038a\u038c"+ + "\7m\2\2\u038b\u038a\3\2\2\2\u038b\u038c\3\2\2\2\u038c\u038d\3\2\2\2\u038d"+ + "\u038e\7g\2\2\u038e\u008d\3\2\2\2\u038f\u0392\5\u0090I\2\u0390\u0392\5"+ + "\u0092J\2\u0391\u038f\3\2\2\2\u0391\u0390\3\2\2\2\u0392\u008f\3\2\2\2"+ + "\u0393\u0395\5\u00d6l\2\u0394\u0393\3\2\2\2\u0394\u0395\3\2\2\2\u0395"+ + "\u0396\3\2\2\2\u0396\u0397\5\u0094K\2\u0397\u0091\3\2\2\2\u0398\u039a"+ + "\7\34\2\2\u0399\u039b\5\u00d6l\2\u039a\u0399\3\2\2\2\u039a\u039b\3\2\2"+ + "\2\u039b\u039c\3\2\2\2\u039c\u039d\5\u0094K\2\u039d\u0093\3\2\2\2\u039e"+ + "\u03a0\7t\2\2\u039f\u039e\3\2\2\2\u039f\u03a0\3\2\2\2\u03a0\u03a1\3\2"+ + "\2\2\u03a1\u03a2\5\u00b4[\2\u03a2\u0095\3\2\2\2\u03a3\u03a4\bL\1\2\u03a4"+ + "\u03a5\t\b\2\2\u03a5\u03b4\5\u0096L\20\u03a6\u03b4\5\u00a6T\2\u03a7\u03a8"+ + "\7\33\2\2\u03a8\u03a9\5.\30\2\u03a9\u03aa\7\35\2\2\u03aa\u03ab\5\u0096"+ + "L\4\u03ab\u03b4\3\2\2\2\u03ac\u03ad\t\t\2\2\u03ad\u03ae\5&\24\2\u03ae"+ + "\u03af\7o\2\2\u03af\u03b0\7o\2\2\u03b0\u03b1\5*\26\2\u03b1\u03b2\5\u0096"+ + "L\3\u03b2\u03b4\3\2\2\2\u03b3\u03a3\3\2\2\2\u03b3\u03a6\3\2\2\2\u03b3"+ + "\u03a7\3\2\2\2\u03b3\u03ac\3\2\2\2\u03b4\u03d8\3\2\2\2\u03b5\u03b6\f\16"+ + "\2\2\u03b6\u03b7\t\n\2\2\u03b7\u03d7\5\u0096L\17\u03b8\u03b9\f\r\2\2\u03b9"+ + "\u03ba\t\13\2\2\u03ba\u03d7\5\u0096L\16\u03bb\u03bc\f\f\2\2\u03bc\u03bd"+ + "\t\f\2\2\u03bd\u03d7\5\u0096L\r\u03be\u03bf\f\13\2\2\u03bf\u03c0\t\r\2"+ + "\2\u03c0\u03d7\5\u0096L\f\u03c1\u03c2\f\n\2\2\u03c2\u03c3\t\16\2\2\u03c3"+ + "\u03d7\5\u0096L\13\u03c4\u03c5\f\b\2\2\u03c5\u03c6\7v\2\2\u03c6\u03d7"+ + "\5\u0096L\t\u03c7\u03c8\f\7\2\2\u03c8\u03c9\7u\2\2\u03c9\u03d7\5\u0096"+ + "L\b\u03ca\u03cb\f\6\2\2\u03cb\u03cc\7#\2\2\u03cc\u03d7\5\u0096L\6\u03cd"+ + "\u03ce\f\5\2\2\u03ce\u03cf\7&\2\2\u03cf\u03d0\5\u0096L\2\u03d0\u03d1\7"+ + "o\2\2\u03d1\u03d2\5\u0096L\5\u03d2\u03d7\3\2\2\2\u03d3\u03d4\f\t\2\2\u03d4"+ + "\u03d5\7\21\2\2\u03d5\u03d7\5d\63\2\u03d6\u03b5\3\2\2\2\u03d6\u03b8\3"+ + "\2\2\2\u03d6\u03bb\3\2\2\2\u03d6\u03be\3\2\2\2\u03d6\u03c1\3\2\2\2\u03d6"+ + "\u03c4\3\2\2\2\u03d6\u03c7\3\2\2\2\u03d6\u03ca\3\2\2\2\u03d6\u03cd\3\2"+ + "\2\2\u03d6\u03d3\3\2\2\2\u03d7\u03da\3\2\2\2\u03d8\u03d6\3\2\2\2\u03d8"+ + "\u03d9\3\2\2\2\u03d9\u0097\3\2\2\2\u03da\u03d8\3\2\2\2\u03db\u03f0\5\30"+ + "\r\2\u03dc\u03f0\5\32\16\2\u03dd\u03f0\5\u009cO\2\u03de\u03f0\5\u009a"+ + "N\2\u03df\u03f0\5\u00d0i\2\u03e0\u03f0\5\u00f0y\2\u03e1\u03f0\5\u00e4"+ + "s\2\u03e2\u03f0\5\u011c\u008f\2\u03e3\u03f0\5\u00f2z\2\u03e4\u03f0\5\u00f4"+ + "{\2\u03e5\u03f0\5\u00f6|\2\u03e6\u03f0\5\u00f8}\2\u03e7\u03f0\5\u00fa"+ + "~\2\u03e8\u03f0\5\u00e0q\2\u03e9\u03f0\5\u00fc\177\2\u03ea\u03f0\5\u00fe"+ + "\u0080\2\u03eb\u03f0\5\u0110\u0089\2\u03ec\u03f0\5\u009eP\2\u03ed\u03f0"+ + "\5\u00a2R\2\u03ee\u03f0\5j\66\2\u03ef\u03db\3\2\2\2\u03ef\u03dc\3\2\2"+ + "\2\u03ef\u03dd\3\2\2\2\u03ef\u03de\3\2\2\2\u03ef\u03df\3\2\2\2\u03ef\u03e0"+ + "\3\2\2\2\u03ef\u03e1\3\2\2\2\u03ef\u03e2\3\2\2\2\u03ef\u03e3\3\2\2\2\u03ef"+ + "\u03e4\3\2\2\2\u03ef\u03e5\3\2\2\2\u03ef\u03e6\3\2\2\2\u03ef\u03e7\3\2"+ + "\2\2\u03ef\u03e8\3\2\2\2\u03ef\u03e9\3\2\2\2\u03ef\u03ea\3\2\2\2\u03ef"+ + "\u03eb\3\2\2\2\u03ef\u03ec\3\2\2\2\u03ef\u03ed\3\2\2\2\u03ef\u03ee\3\2"+ + "\2\2\u03f0\u0099\3\2\2\2\u03f1\u03f2\7%\2\2\u03f2\u03f3\5\u0096L\2\u03f3"+ + "\u009b\3\2\2\2\u03f4\u03f5\7X\2\2\u03f5\u03f7\5\u0096L\2\u03f6\u03f8\5"+ + "\u00e0q\2\u03f7\u03f6\3\2\2\2\u03f7\u03f8\3\2\2\2\u03f8\u009d\3\2\2\2"+ + "\u03f9\u03fa\5\u00a0Q\2\u03fa\u03fb\5\u0118\u008d\2\u03fb\u009f\3\2\2"+ + "\2\u03fc\u03fd\7\16\2\2\u03fd\u03fe\5\u0096L\2\u03fe\u03ff\5\u0162\u00b2"+ + "\2\u03ff\u0401\3\2\2\2\u0400\u03fc\3\2\2\2\u0401\u0404\3\2\2\2\u0402\u0400"+ + "\3\2\2\2\u0402\u0403\3\2\2\2\u0403\u0409\3\2\2\2\u0404\u0402\3\2\2\2\u0405"+ + "\u0406\7\17\2\2\u0406\u0407\5^\60\2\u0407\u0408\5\u0162\u00b2\2\u0408"+ + "\u040a\3\2\2\2\u0409\u0405\3\2\2\2\u0409\u040a\3\2\2\2\u040a\u00a1\3\2"+ + "\2\2\u040b\u040c\7Q\2\2\u040c\u0411\5\u0096L\2\u040d\u040e\7Q\2\2\u040e"+ + "\u040f\t\3\2\2\u040f\u0411\5.\30\2\u0410\u040b\3\2\2\2\u0410\u040d\3\2"+ + "\2\2\u0411\u00a3\3\2\2\2\u0412\u041b\7\5\2\2\u0413\u041b\7\6\2\2\u0414"+ + "\u041b\7d\2\2\u0415\u041b\5\u013e\u00a0\2\u0416\u041b\5\u0154\u00ab\2"+ + "\u0417\u041b\7\3\2\2\u0418\u041b\7\u008f\2\2\u0419\u041b\7\u0090\2\2\u041a"+ + "\u0412\3\2\2\2\u041a\u0413\3\2\2\2\u041a\u0414\3\2\2\2\u041a\u0415\3\2"+ + "\2\2\u041a\u0416\3\2\2\2\u041a\u0417\3\2\2\2\u041a\u0418\3\2\2\2\u041a"+ + "\u0419\3\2\2\2\u041b\u00a5\3\2\2\2\u041c\u041d\bT\1\2\u041d\u0429\5\u013a"+ + "\u009e\2\u041e\u0429\5\u0136\u009c\2\u041f\u0429\5\u015e\u00b0\2\u0420"+ + "\u0429\5 \21\2\u0421\u0429\5x=\2\u0422\u0429\5v<\2\u0423\u0424\t\17\2"+ + "\2\u0424\u0425\7f\2\2\u0425\u0426\5\u0096L\2\u0426\u0427\7g\2\2\u0427"+ + "\u0429\3\2\2\2\u0428\u041c\3\2\2\2\u0428\u041e\3\2\2\2\u0428\u041f\3\2"+ + "\2\2\u0428\u0420\3\2\2\2\u0428\u0421\3\2\2\2\u0428\u0422\3\2\2\2\u0428"+ + "\u0423\3\2\2\2\u0429\u0440\3\2\2\2\u042a\u042b\f\13\2\2\u042b\u042c\7"+ + "p\2\2\u042c\u043f\7e\2\2\u042d\u042e\f\n\2\2\u042e\u043f\5\u0158\u00ad"+ + "\2\u042f\u0430\f\t\2\2\u0430\u043f\5\u00c0a\2\u0431\u0432\f\b\2\2\u0432"+ + "\u043f\5H%\2\u0433\u0434\f\7\2\2\u0434\u043f\5\u015a\u00ae\2\u0435\u0436"+ + "\f\6\2\2\u0436\u043f\5\u015c\u00af\2\u0437\u0438\f\5\2\2\u0438\u0439\5"+ + "\u015c\u00af\2\u0439\u043a\7\22\2\2\u043a\u043b\5d\63\2\u043b\u043f\3"+ + "\2\2\2\u043c\u043d\f\4\2\2\u043d\u043f\5\u00acW\2\u043e\u042a\3\2\2\2"+ + "\u043e\u042d\3\2\2\2\u043e\u042f\3\2\2\2\u043e\u0431\3\2\2\2\u043e\u0433"+ + "\3\2\2\2\u043e\u0435\3\2\2\2\u043e\u0437\3\2\2\2\u043e\u043c\3\2\2\2\u043f"+ + "\u0442\3\2\2\2\u0440\u043e\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u00a7\3\2"+ + "\2\2\u0442\u0440\3\2\2\2\u0443\u0444\5Z.\2\u0444\u0445\5\u00aaV\2\u0445"+ + "\u00a9\3\2\2\2\u0446\u0448\7M\2\2\u0447\u0449\7e\2\2\u0448\u0447\3\2\2"+ + "\2\u0448\u0449\3\2\2\2\u0449\u044a\3\2\2\2\u044a\u044c\5\u0130\u0099\2"+ + "\u044b\u044d\5b\62\2\u044c\u044b\3\2\2\2\u044c\u044d\3\2\2\2\u044d\u00ab"+ + "\3\2\2\2\u044e\u0450\7\'\2\2\u044f\u0451\5\u00d8m\2\u0450\u044f\3\2\2"+ + "\2\u0450\u0451\3\2\2\2\u0451\u0453\3\2\2\2\u0452\u0454\7m\2\2\u0453\u0452"+ + "\3\2\2\2\u0453\u0454\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u0456\7(\2\2\u0456"+ + "\u00ad\3\2\2\2\u0457\u0458\7N\2\2\u0458\u0462\7h\2\2\u0459\u045d\5\u00b2"+ + "Z\2\u045a\u045d\5\u011e\u0090\2\u045b\u045d\5\u00b0Y\2\u045c\u0459\3\2"+ + "\2\2\u045c\u045a\3\2\2\2\u045c\u045b\3\2\2\2\u045d\u045e\3\2\2\2\u045e"+ + "\u045f\5\u0162\u00b2\2\u045f\u0461\3\2\2\2\u0460\u045c\3\2\2\2\u0461\u0464"+ + "\3\2\2\2\u0462\u0460\3\2\2\2\u0462\u0463\3\2\2\2\u0463\u0465\3\2\2\2\u0464"+ + "\u0462\3\2\2\2\u0465\u0466\7i\2\2\u0466\u00af\3\2\2\2\u0467\u0468\78\2"+ + "\2\u0468\u0469\7e\2\2\u0469\u046a\5\u0134\u009b\2\u046a\u00b1\3\2\2\2"+ + "\u046b\u046d\7\34\2\2\u046c\u046b\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u046e"+ + "\3\2\2\2\u046e\u046f\5Z.\2\u046f\u0470\7e\2\2\u0470\u0471\5\u0134\u009b"+ + "\2\u0471\u0472\5\u0132\u009a\2\u0472\u047b\3\2\2\2\u0473\u0475\7\34\2"+ + "\2\u0474\u0473\3\2\2\2\u0474\u0475\3\2\2\2\u0475\u0476\3\2\2\2\u0476\u0477"+ + "\5Z.\2\u0477\u0478\7e\2\2\u0478\u0479\5\u0134\u009b\2\u0479\u047b\3\2"+ + "\2\2\u047a\u046c\3\2\2\2\u047a\u0474\3\2\2\2\u047b\u00b3\3\2\2\2\u047c"+ + "\u0484\5\u011e\u0090\2\u047d\u0484\5\u00b6\\\2\u047e\u0484\5L\'\2\u047f"+ + "\u0480\7f\2\2\u0480\u0481\5\u00b4[\2\u0481\u0482\7g\2\2\u0482\u0484\3"+ + "\2\2\2\u0483\u047c\3\2\2\2\u0483\u047d\3\2\2\2\u0483\u047e\3\2\2\2\u0483"+ + "\u047f\3\2\2\2\u0484\u00b5\3\2\2\2\u0485\u048f\5\u0120\u0091\2\u0486\u048f"+ + "\5\u0150\u00a9\2\u0487\u048f\5\u0126\u0094\2\u0488\u048f\5\u012e\u0098"+ + "\2\u0489\u048f\5\u00aeX\2\u048a\u048f\5\u0128\u0095\2\u048b\u048f\5\u012a"+ + "\u0096\2\u048c\u048f\5\u012c\u0097\2\u048d\u048f\5\u00b8]\2\u048e\u0485"+ + "\3\2\2\2\u048e\u0486\3\2\2\2\u048e\u0487\3\2\2\2\u048e\u0488\3\2\2\2\u048e"+ + "\u0489\3\2\2\2\u048e\u048a\3\2\2\2\u048e\u048b\3\2\2\2\u048e\u048c\3\2"+ + "\2\2\u048e\u048d\3\2\2\2\u048f\u00b7\3\2\2\2\u0490\u0491\78\2\2\u0491"+ + "\u0492\5\u00ba^\2\u0492\u00b9\3\2\2\2\u0493\u049f\7f\2\2\u0494\u0499\5"+ + "\u00b4[\2\u0495\u0496\7m\2\2\u0496\u0498\5\u00b4[\2\u0497\u0495\3\2\2"+ + "\2\u0498\u049b\3\2\2\2\u0499\u0497\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u049d"+ + "\3\2\2\2\u049b\u0499\3\2\2\2\u049c\u049e\7m\2\2\u049d\u049c\3\2\2\2\u049d"+ + "\u049e\3\2\2\2\u049e\u04a0\3\2\2\2\u049f\u0494\3\2\2\2\u049f\u04a0\3\2"+ + "\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\7g\2\2\u04a2\u00bb\3\2\2\2\u04a3"+ + "\u04ab\5\u0150\u00a9\2\u04a4\u04ab\5\u0120\u0091\2\u04a5\u04ab\5\u00be"+ + "`\2\u04a6\u04ab\5\u0128\u0095\2\u04a7\u04ab\5\u012a\u0096\2\u04a8\u04ab"+ + "\5L\'\2\u04a9\u04ab\5\u011e\u0090\2\u04aa\u04a3\3\2\2\2\u04aa\u04a4\3"+ + "\2\2\2\u04aa\u04a5\3\2\2\2\u04aa\u04a6\3\2\2\2\u04aa\u04a7\3\2\2\2\u04aa"+ + "\u04a8\3\2\2\2\u04aa\u04a9\3\2\2\2\u04ab\u00bd\3\2\2\2\u04ac\u04ad\7j"+ + "\2\2\u04ad\u04ae\7t\2\2\u04ae\u04af\7k\2\2\u04af\u04b0\5\u0124\u0093\2"+ + "\u04b0\u00bf\3\2\2\2\u04b1\u04c1\7j\2\2\u04b2\u04b4\5\u00c2b\2\u04b3\u04b2"+ + "\3\2\2\2\u04b3\u04b4\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b7\7o\2\2\u04b6"+ + "\u04b8\5\u00c4c\2\u04b7\u04b6\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04c2"+ + "\3\2\2\2\u04b9\u04bb\5\u00c2b\2\u04ba\u04b9\3\2\2\2\u04ba\u04bb\3\2\2"+ + "\2\u04bb\u04bc\3\2\2\2\u04bc\u04bd\7o\2\2\u04bd\u04be\5\u00c4c\2\u04be"+ + "\u04bf\7o\2\2\u04bf\u04c0\5\u00c6d\2\u04c0\u04c2\3\2\2\2\u04c1\u04b3\3"+ + "\2\2\2\u04c1\u04ba\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c3\u04c4\7k\2\2\u04c4"+ + "\u00c1\3\2\2\2\u04c5\u04c6\5\u0096L\2\u04c6\u00c3\3\2\2\2\u04c7\u04c8"+ + "\5\u0096L\2\u04c8\u00c5\3\2\2\2\u04c9\u04ca\5\u0096L\2\u04ca\u00c7\3\2"+ + "\2\2\u04cb\u04cd\t\20\2\2\u04cc\u04cb\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd"+ + "\u04ce\3\2\2\2\u04ce\u04cf\7l\2\2\u04cf\u00c9\3\2\2\2\u04d0\u04d1\5\u00d8"+ + "m\2\u04d1\u04d2\7l\2\2\u04d2\u04d7\3\2\2\2\u04d3\u04d4\5\b\5\2\u04d4\u04d5"+ + "\7s\2\2\u04d5\u04d7\3\2\2\2\u04d6\u04d0\3\2\2\2\u04d6\u04d3\3\2\2\2\u04d6"+ + "\u04d7\3\2\2\2\u04d7\u04d8\3\2\2\2\u04d8\u04d9\7]\2\2\u04d9\u04de\5\u0096"+ + "L\2\u04da\u04dc\7J\2\2\u04db\u04dd\7e\2\2\u04dc\u04db\3\2\2\2\u04dc\u04dd"+ + "\3\2\2\2\u04dd\u04df\3\2\2\2\u04de\u04da\3\2\2\2\u04de\u04df\3\2\2\2\u04df"+ + "\u00cb\3\2\2\2\u04e0\u04e1\7X\2\2\u04e1\u04e2\7e\2\2\u04e2\u00cd\3\2\2"+ + "\2\u04e3\u04e4\5\u0154\u00ab\2\u04e4\u00cf\3\2\2\2\u04e5\u04e9\5\u00d2"+ + "j\2\u04e6\u04e9\5\u00dan\2\u04e7\u04e9\5\u00dep\2\u04e8\u04e5\3\2\2\2"+ + "\u04e8\u04e6\3\2\2\2\u04e8\u04e7\3\2\2\2\u04e9\u00d1\3\2\2\2\u04ea\u04f6"+ + "\7Z\2\2\u04eb\u04f7\5\u00d4k\2\u04ec\u04f2\7f\2\2\u04ed\u04ee\5\u00d4"+ + "k\2\u04ee\u04ef\5\u0162\u00b2\2\u04ef\u04f1\3\2\2\2\u04f0\u04ed\3\2\2"+ + "\2\u04f1\u04f4\3\2\2\2\u04f2\u04f0\3\2\2\2\u04f2\u04f3\3\2\2\2\u04f3\u04f5"+ + "\3\2\2\2\u04f4\u04f2\3\2\2\2\u04f5\u04f7\7g\2\2\u04f6\u04eb\3\2\2\2\u04f6"+ + "\u04ec\3\2\2\2\u04f7\u00d3\3\2\2\2\u04f8\u04fe\5\u00d6l\2\u04f9\u04fb"+ + "\5\u00b4[\2\u04fa\u04f9\3\2\2\2\u04fa\u04fb\3\2\2\2\u04fb\u04fc\3\2\2"+ + "\2\u04fc\u04fd\7l\2\2\u04fd\u04ff\5\u00d8m\2\u04fe\u04fa\3\2\2\2\u04fe"+ + "\u04ff\3\2\2\2\u04ff\u00d5\3\2\2\2\u0500\u0505\7e\2\2\u0501\u0502\7m\2"+ + "\2\u0502\u0504\7e\2\2\u0503\u0501\3\2\2\2\u0504\u0507\3\2\2\2\u0505\u0503"+ + "\3\2\2\2\u0505\u0506\3\2\2\2\u0506\u00d7\3\2\2\2\u0507\u0505\3\2\2\2\u0508"+ + "\u050d\5\u0096L\2\u0509\u050a\7m\2\2\u050a\u050c\5\u0096L\2\u050b\u0509"+ + "\3\2\2\2\u050c\u050f\3\2\2\2\u050d\u050b\3\2\2\2\u050d\u050e\3\2\2\2\u050e"+ + "\u00d9\3\2\2\2\u050f\u050d\3\2\2\2\u0510\u051c\7^\2\2\u0511\u051d\5\u00dc"+ + "o\2\u0512\u0518\7f\2\2\u0513\u0514\5\u00dco\2\u0514\u0515\5\u0162\u00b2"+ + "\2\u0515\u0517\3\2\2\2\u0516\u0513\3\2\2\2\u0517\u051a\3\2\2\2\u0518\u0516"+ + "\3\2\2\2\u0518\u0519\3\2\2\2\u0519\u051b\3\2\2\2\u051a\u0518\3\2\2\2\u051b"+ + "\u051d\7g\2\2\u051c\u0511\3\2\2\2\u051c\u0512\3\2\2\2\u051d\u00db\3\2"+ + "\2\2\u051e\u0520\7e\2\2\u051f\u0521\7l\2\2\u0520\u051f\3\2\2\2\u0520\u0521"+ + "\3\2\2\2\u0521\u0522\3\2\2\2\u0522\u0523\5\u00b4[\2\u0523\u00dd\3\2\2"+ + "\2\u0524\u0530\7c\2\2\u0525\u0531\5\u0088E\2\u0526\u052c\7f\2\2\u0527"+ + "\u0528\5\u0088E\2\u0528\u0529\5\u0162\u00b2\2\u0529\u052b\3\2\2\2\u052a"+ + "\u0527\3\2\2\2\u052b\u052e\3\2\2\2\u052c\u052a\3\2\2\2\u052c\u052d\3\2"+ + "\2\2\u052d\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0531\7g\2\2\u0530"+ + "\u0525\3\2\2\2\u0530\u0526\3\2\2\2\u0531\u00df\3\2\2\2\u0532\u0534\7h"+ + "\2\2\u0533\u0535\5\u00e2r\2\u0534\u0533\3\2\2\2\u0534\u0535\3\2\2\2\u0535"+ + "\u0536\3\2\2\2\u0536\u0537\7i\2\2\u0537\u00e1\3\2\2\2\u0538\u053a\5\u0162"+ + "\u00b2\2\u0539\u0538\3\2\2\2\u0539\u053a\3\2\2\2\u053a\u053b\3\2\2\2\u053b"+ + "\u053c\5\u0098M\2\u053c\u053d\5\u0162\u00b2\2\u053d\u053f\3\2\2\2\u053e"+ + "\u0539\3\2\2\2\u053f\u0540\3\2\2\2\u0540\u053e\3\2\2\2\u0540\u0541\3\2"+ + "\2\2\u0541\u00e3\3\2\2\2\u0542\u0548\5\u00e8u\2\u0543\u0548\5\u00eav\2"+ + "\u0544\u0548\5\u00ecw\2\u0545\u0548\5\u00e6t\2\u0546\u0548\5\u008aF\2"+ + "\u0547\u0542\3\2\2\2\u0547\u0543\3\2\2\2\u0547\u0544\3\2\2\2\u0547\u0545"+ + "\3\2\2\2\u0547\u0546\3\2\2\2\u0548\u00e5\3\2\2\2\u0549\u054a\5\u0096L"+ + "\2\u054a\u00e7\3\2\2\2\u054b\u054c\5\u0096L\2\u054c\u054d\7\u0089\2\2"+ + "\u054d\u054e\5\u0096L\2\u054e\u00e9\3\2\2\2\u054f\u0550\5\u0096L\2\u0550"+ + "\u0551\t\21\2\2\u0551\u00eb\3\2\2\2\u0552\u0553\5\u00d8m\2\u0553\u0554"+ + "\5\u00c8e\2\u0554\u0555\5\u00d8m\2\u0555\u00ed\3\2\2\2\u0556\u0557\t\22"+ + "\2\2\u0557\u00ef\3\2\2\2\u0558\u0559\7e\2\2\u0559\u055b\7o\2\2\u055a\u055c"+ + "\5\u0098M\2\u055b\u055a\3\2\2\2\u055b\u055c\3\2\2\2\u055c\u00f1\3\2\2"+ + "\2\u055d\u055f\7b\2\2\u055e\u0560\5\u00d8m\2\u055f\u055e\3\2\2\2\u055f"+ + "\u0560\3\2\2\2\u0560\u00f3\3\2\2\2\u0561\u0563\7K\2\2\u0562\u0564\7e\2"+ + "\2\u0563\u0562\3\2\2\2\u0563\u0564\3\2\2\2\u0564\u00f5\3\2\2\2\u0565\u0567"+ + "\7_\2\2\u0566\u0568\7e\2\2\u0567\u0566\3\2\2\2\u0567\u0568\3\2\2\2\u0568"+ + "\u00f7\3\2\2\2\u0569\u056a\7W\2\2\u056a\u056b\7e\2\2\u056b\u00f9\3\2\2"+ + "\2\u056c\u056d\7[\2\2\u056d\u00fb\3\2\2\2\u056e\u0577\7\\\2\2\u056f\u0578"+ + "\5\u0096L\2\u0570\u0571\5\u0162\u00b2\2\u0571\u0572\5\u0096L\2\u0572\u0578"+ + "\3\2\2\2\u0573\u0574\5\u00e4s\2\u0574\u0575\5\u0162\u00b2\2\u0575\u0576"+ + "\5\u0096L\2\u0576\u0578\3\2\2\2\u0577\u056f\3\2\2\2\u0577\u0570\3\2\2"+ + "\2\u0577\u0573\3\2\2\2\u0578\u0579\3\2\2\2\u0579\u057f\5\u00e0q\2\u057a"+ + "\u057d\7V\2\2\u057b\u057e\5\u00fc\177\2\u057c\u057e\5\u00e0q\2\u057d\u057b"+ + "\3\2\2\2\u057d\u057c\3\2\2\2\u057e\u0580\3\2\2\2\u057f\u057a\3\2\2\2\u057f"+ + "\u0580\3\2\2\2\u0580\u00fd\3\2\2\2\u0581\u0584\5\u0100\u0081\2\u0582\u0584"+ + "\5\u0106\u0084\2\u0583\u0581\3\2\2\2\u0583\u0582\3\2\2\2\u0584\u00ff\3"+ + "\2\2\2\u0585\u0590\7Y\2\2\u0586\u0588\5\u0096L\2\u0587\u0586\3\2\2\2\u0587"+ + "\u0588\3\2\2\2\u0588\u0591\3\2\2\2\u0589\u058b\5\u00e4s\2\u058a\u0589"+ + "\3\2\2\2\u058a\u058b\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058e\5\u0162\u00b2"+ + "\2\u058d\u058f\5\u0096L\2\u058e\u058d\3\2\2\2\u058e\u058f\3\2\2\2\u058f"+ + "\u0591\3\2\2\2\u0590\u0587\3\2\2\2\u0590\u058a\3\2\2\2\u0591\u0592\3\2"+ + "\2\2\u0592\u0596\7h\2\2\u0593\u0595\5\u0102\u0082\2\u0594\u0593\3\2\2"+ + "\2\u0595\u0598\3\2\2\2\u0596\u0594\3\2\2\2\u0596\u0597\3\2\2\2\u0597\u0599"+ + "\3\2\2\2\u0598\u0596\3\2\2\2\u0599\u059a\7i\2\2\u059a\u0101\3\2\2\2\u059b"+ + "\u059c\5\u0104\u0083\2\u059c\u059e\7o\2\2\u059d\u059f\5\u00e2r\2\u059e"+ + "\u059d\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u0103\3\2\2\2\u05a0\u05a1\7P"+ + "\2\2\u05a1\u05a4\5\u00d8m\2\u05a2\u05a4\7L\2\2\u05a3\u05a0\3\2\2\2\u05a3"+ + "\u05a2\3\2\2\2\u05a4\u0105\3\2\2\2\u05a5\u05ae\7Y\2\2\u05a6\u05af\5\u0108"+ + "\u0085\2\u05a7\u05a8\5\u0162\u00b2\2\u05a8\u05a9\5\u0108\u0085\2\u05a9"+ + "\u05af\3\2\2\2\u05aa\u05ab\5\u00e4s\2\u05ab\u05ac\5\u0162\u00b2\2\u05ac"+ + "\u05ad\5\u0108\u0085\2\u05ad\u05af\3\2\2\2\u05ae\u05a6\3\2\2\2\u05ae\u05a7"+ + "\3\2\2\2\u05ae\u05aa\3\2\2\2\u05af\u05b0\3\2\2\2\u05b0\u05b4\7h\2\2\u05b1"+ + "\u05b3\5\u010a\u0086\2\u05b2\u05b1\3\2\2\2\u05b3\u05b6\3\2\2\2\u05b4\u05b2"+ + "\3\2\2\2\u05b4\u05b5\3\2\2\2\u05b5\u05b7\3\2\2\2\u05b6\u05b4\3\2\2\2\u05b7"+ + "\u05b8\7i\2\2\u05b8\u0107\3\2\2\2\u05b9\u05ba\7e\2\2\u05ba\u05bc\7s\2"+ + "\2\u05bb\u05b9\3\2\2\2\u05bb\u05bc\3\2\2\2\u05bc\u05bd\3\2\2\2\u05bd\u05be"+ + "\5\u00a6T\2\u05be\u05bf\7p\2\2\u05bf\u05c0\7f\2\2\u05c0\u05c1\7^\2\2\u05c1"+ + "\u05c2\7g\2\2\u05c2\u0109\3\2\2\2\u05c3\u05c4\5\u010c\u0087\2\u05c4\u05c6"+ + "\7o\2\2\u05c5\u05c7\5\u00e2r\2\u05c6\u05c5\3\2\2\2\u05c6\u05c7\3\2\2\2"+ + "\u05c7\u010b\3\2\2\2\u05c8\u05c9\7P\2\2\u05c9\u05cc\5\u010e\u0088\2\u05ca"+ + "\u05cc\7L\2\2\u05cb\u05c8\3\2\2\2\u05cb\u05ca\3\2\2\2\u05cc\u010d\3\2"+ + "\2\2\u05cd\u05d0\5\u00b4[\2\u05ce\u05d0\7d\2\2\u05cf\u05cd\3\2\2\2\u05cf"+ + "\u05ce\3\2\2\2\u05d0\u05d8\3\2\2\2\u05d1\u05d4\7m\2\2\u05d2\u05d5\5\u00b4"+ + "[\2\u05d3\u05d5\7d\2\2\u05d4\u05d2\3\2\2\2\u05d4\u05d3\3\2\2\2\u05d5\u05d7"+ + "\3\2\2\2\u05d6\u05d1\3\2\2\2\u05d7\u05da\3\2\2\2\u05d8\u05d6\3\2\2\2\u05d8"+ + "\u05d9\3\2\2\2\u05d9\u010f\3\2\2\2\u05da\u05d8\3\2\2\2\u05db\u05dc\7O"+ + "\2\2\u05dc\u05e0\7h\2\2\u05dd\u05df\5\u0112\u008a\2\u05de\u05dd\3\2\2"+ + "\2\u05df\u05e2\3\2\2\2\u05e0\u05de\3\2\2\2\u05e0\u05e1\3\2\2\2\u05e1\u05e3"+ + "\3\2\2\2\u05e2\u05e0\3\2\2\2\u05e3\u05e4\7i\2\2\u05e4\u0111\3\2\2\2\u05e5"+ + "\u05e6\5\u0114\u008b\2\u05e6\u05e8\7o\2\2\u05e7\u05e9\5\u00e2r\2\u05e8"+ + "\u05e7\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9\u0113\3\2\2\2\u05ea\u05ed\7P"+ + "\2\2\u05eb\u05ee\5\u00e8u\2\u05ec\u05ee\5\u0116\u008c\2\u05ed\u05eb\3"+ + "\2\2\2\u05ed\u05ec\3\2\2\2\u05ee\u05f1\3\2\2\2\u05ef\u05f1\7L\2\2\u05f0"+ + "\u05ea\3\2\2\2\u05f0\u05ef\3\2\2\2\u05f1\u0115\3\2\2\2\u05f2\u05f3\5\u00d8"+ + "m\2\u05f3\u05f4\7l\2\2\u05f4\u05f9\3\2\2\2\u05f5\u05f6\5\u00d6l\2\u05f6"+ + "\u05f7\7s\2\2\u05f7\u05f9\3\2\2\2\u05f8\u05f2\3\2\2\2\u05f8\u05f5\3\2"+ + "\2\2\u05f8\u05f9\3\2\2\2\u05f9\u05fa\3\2\2\2\u05fa\u05fb\5\u0096L\2\u05fb"+ + "\u0117\3\2\2\2\u05fc\u0600\7`\2\2\u05fd\u0601\5\u0096L\2\u05fe\u0601\5"+ + "\u011a\u008e\2\u05ff\u0601\5\u00caf\2\u0600\u05fd\3\2\2\2\u0600\u05fe"+ + "\3\2\2\2\u0600\u05ff\3\2\2\2\u0600\u0601\3\2\2\2\u0601\u0602\3\2\2\2\u0602"+ + "\u0603\5\u00e0q\2\u0603\u0119\3\2\2\2\u0604\u0606\5\u00e4s\2\u0605\u0604"+ + "\3\2\2\2\u0605\u0606\3\2\2\2\u0606\u0607\3\2\2\2\u0607\u0609\5\u0162\u00b2"+ + "\2\u0608\u060a\5\u0096L\2\u0609\u0608\3\2\2\2\u0609\u060a\3\2\2\2\u060a"+ + "\u060b\3\2\2\2\u060b\u060d\5\u0162\u00b2\2\u060c\u060e\5\u00e4s\2\u060d"+ + "\u060c\3\2\2\2\u060d\u060e\3\2\2\2\u060e\u011b\3\2\2\2\u060f\u0610\7R"+ + "\2\2\u0610\u0611\5\u0096L\2\u0611\u011d\3\2\2\2\u0612\u0615\5\u0142\u00a2"+ + "\2\u0613\u0615\7e\2\2\u0614\u0612\3\2\2\2\u0614\u0613\3\2\2\2\u0615\u011f"+ + "\3\2\2\2\u0616\u0617\7j\2\2\u0617\u0618\5\u0122\u0092\2\u0618\u0619\7"+ + "k\2\2\u0619\u061a\5\u0124\u0093\2\u061a\u0121\3\2\2\2\u061b\u061c\5\u0096"+ + "L\2\u061c\u0123\3\2\2\2\u061d\u061e\5\u00b4[\2\u061e\u0125\3\2\2\2\u061f"+ + "\u0620\7\u0087\2\2\u0620\u0621\5\u00b4[\2\u0621\u0127\3\2\2\2\u0622\u0623"+ + "\7j\2\2\u0623\u0624\7k\2\2\u0624\u0625\5\u0124\u0093\2\u0625\u0129\3\2"+ + "\2\2\u0626\u0627\7S\2\2\u0627\u0628\7j\2\2\u0628\u0629\5\u00b4[\2\u0629"+ + "\u062a\7k\2\2\u062a\u062b\5\u0124\u0093\2\u062b\u012b\3\2\2\2\u062c\u0632"+ + "\7U\2\2\u062d\u062e\7U\2\2\u062e\u0632\7\u0089\2\2\u062f\u0630\7\u0089"+ + "\2\2\u0630\u0632\7U\2\2\u0631\u062c\3\2\2\2\u0631\u062d\3\2\2\2\u0631"+ + "\u062f\3\2\2\2\u0632\u0633\3\2\2\2\u0633\u0634\5\u0124\u0093\2\u0634\u012d"+ + "\3\2\2\2\u0635\u0636\7M\2\2\u0636\u0637\5\u0130\u0099\2\u0637\u012f\3"+ + "\2\2\2\u0638\u0639\5\u0134\u009b\2\u0639\u063a\5\u0132\u009a\2\u063a\u063d"+ + "\3\2\2\2\u063b\u063d\5\u0134\u009b\2\u063c\u0638\3\2\2\2\u063c\u063b\3"+ + "\2\2\2\u063d\u0131\3\2\2\2\u063e\u0641\5\u0134\u009b\2\u063f\u0641\5\u00b4"+ + "[\2\u0640\u063e\3\2\2\2\u0640\u063f\3\2\2\2\u0641\u0133\3\2\2\2\u0642"+ + "\u064e\7f\2\2\u0643\u0648\5\u008eH\2\u0644\u0645\7m\2\2\u0645\u0647\5"+ + "\u008eH\2\u0646\u0644\3\2\2\2\u0647\u064a\3\2\2\2\u0648\u0646\3\2\2\2"+ + "\u0648\u0649\3\2\2\2\u0649\u064c\3\2\2\2\u064a\u0648\3\2\2\2\u064b\u064d"+ + "\7m\2\2\u064c\u064b\3\2\2\2\u064c\u064d\3\2\2\2\u064d\u064f\3\2\2\2\u064e"+ + "\u0643\3\2\2\2\u064e\u064f\3\2\2\2\u064f\u0650\3\2\2\2\u0650\u0651\7g"+ + "\2\2\u0651\u0135\3\2\2\2\u0652\u0653\5\u0138\u009d\2\u0653\u0654\7f\2"+ + "\2\u0654\u0656\5\u0096L\2\u0655\u0657\7m\2\2\u0656\u0655\3\2\2\2\u0656"+ + "\u0657\3\2\2\2\u0657\u0658\3\2\2\2\u0658\u0659\7g\2\2\u0659\u0137\3\2"+ + "\2\2\u065a\u0660\5\u00b6\\\2\u065b\u065c\7f\2\2\u065c\u065d\5\u0138\u009d"+ + "\2\u065d\u065e\7g\2\2\u065e\u0660\3\2\2\2\u065f\u065a\3\2\2\2\u065f\u065b"+ + "\3\2\2\2\u0660\u0139\3\2\2\2\u0661\u0668\5\u013c\u009f\2\u0662\u0668\5"+ + "\u0140\u00a1\2\u0663\u0664\7f\2\2\u0664\u0665\5\u0096L\2\u0665\u0666\7"+ + "g\2\2\u0666\u0668\3\2\2\2\u0667\u0661\3\2\2\2\u0667\u0662\3\2\2\2\u0667"+ + "\u0663\3\2\2\2\u0668\u013b\3\2\2\2\u0669\u066d\5\u00a4S\2\u066a\u066d"+ + "\5\u0144\u00a3\2\u066b\u066d\5\u00a8U\2\u066c\u0669\3\2\2\2\u066c\u066a"+ + "\3\2\2\2\u066c\u066b\3\2\2\2\u066d\u013d\3\2\2\2\u066e\u066f\t\23\2\2"+ + "\u066f\u013f\3\2\2\2\u0670\u0671\7e\2\2\u0671\u0141\3\2\2\2\u0672\u0673"+ + "\7e\2\2\u0673\u0674\7p\2\2\u0674\u0675\7e\2\2\u0675\u0143\3\2\2\2\u0676"+ + "\u0677\5\u00bc_\2\u0677\u0678\5\u0146\u00a4\2\u0678\u0145\3\2\2\2\u0679"+ + "\u067e\7h\2\2\u067a\u067c\5\u0148\u00a5\2\u067b\u067d\7m\2\2\u067c\u067b"+ + "\3\2\2\2\u067c\u067d\3\2\2\2\u067d\u067f\3\2\2\2\u067e\u067a\3\2\2\2\u067e"+ + "\u067f\3\2\2\2\u067f\u0680\3\2\2\2\u0680\u0681\7i\2\2\u0681\u0147\3\2"+ + "\2\2\u0682\u0687\5\u014a\u00a6\2\u0683\u0684\7m\2\2\u0684\u0686\5\u014a"+ + "\u00a6\2\u0685\u0683\3\2\2\2\u0686\u0689\3\2\2\2\u0687\u0685\3\2\2\2\u0687"+ + "\u0688\3\2\2\2\u0688\u0149\3\2\2\2\u0689\u0687\3\2\2\2\u068a\u068b\5\u014c"+ + "\u00a7\2\u068b\u068c\7o\2\2\u068c\u068e\3\2\2\2\u068d\u068a\3\2\2\2\u068d"+ + "\u068e\3\2\2\2\u068e\u068f\3\2\2\2\u068f\u0690\5\u014e\u00a8\2\u0690\u014b"+ + "\3\2\2\2\u0691\u0694\5\u0096L\2\u0692\u0694\5\u0146\u00a4\2\u0693\u0691"+ + "\3\2\2\2\u0693\u0692\3\2\2\2\u0694\u014d\3\2\2\2\u0695\u0698\5\u0096L"+ + "\2\u0696\u0698\5\u0146\u00a4\2\u0697\u0695\3\2\2\2\u0697\u0696\3\2\2\2"+ + "\u0698\u014f\3\2\2\2\u0699\u069a\7T\2\2\u069a\u06a0\7h\2\2\u069b\u069c"+ + "\5\u0152\u00aa\2\u069c\u069d\5\u0162\u00b2\2\u069d\u069f\3\2\2\2\u069e"+ + "\u069b\3\2\2\2\u069f\u06a2\3\2\2\2\u06a0\u069e\3\2\2\2\u06a0\u06a1\3\2"+ + "\2\2\u06a1\u06a3\3\2\2\2\u06a2\u06a0\3\2\2\2\u06a3\u06a4\7i\2\2\u06a4"+ + "\u0151\3\2\2\2\u06a5\u06a6\5\u00d6l\2\u06a6\u06a7\5\u00b4[\2\u06a7\u06aa"+ + "\3\2\2\2\u06a8\u06aa\5\u0156\u00ac\2\u06a9\u06a5\3\2\2\2\u06a9\u06a8\3"+ + "\2\2\2\u06aa\u06ac\3\2\2\2\u06ab\u06ad\5\u0154\u00ab\2\u06ac\u06ab\3\2"+ + "\2\2\u06ac\u06ad\3\2\2\2\u06ad\u0153\3\2\2\2\u06ae\u06af\t\24\2\2\u06af"+ + "\u0155\3\2\2\2\u06b0\u06b2\7\u0087\2\2\u06b1\u06b0\3\2\2\2\u06b1\u06b2"+ + "\3\2\2\2\u06b2\u06b3\3\2\2\2\u06b3\u06b4\5\u011e\u0090\2\u06b4\u0157\3"+ + "\2\2\2\u06b5\u06b6\7j\2\2\u06b6\u06b7\5\u0096L\2\u06b7\u06b8\7k\2\2\u06b8"+ + "\u0159\3\2\2\2\u06b9\u06ba\7p\2\2\u06ba\u06bb\7f\2\2\u06bb\u06bc\5\u00b4"+ + "[\2\u06bc\u06bd\7g\2\2\u06bd\u015b\3\2\2\2\u06be\u06cd\7f\2\2\u06bf\u06c6"+ + "\5\u00d8m\2\u06c0\u06c3\5\u0138\u009d\2\u06c1\u06c2\7m\2\2\u06c2\u06c4"+ + "\5\u00d8m\2\u06c3\u06c1\3\2\2\2\u06c3\u06c4\3\2\2\2\u06c4\u06c6\3\2\2"+ + "\2\u06c5\u06bf\3\2\2\2\u06c5\u06c0\3\2\2\2\u06c6\u06c8\3\2\2\2\u06c7\u06c9"+ + "\7t\2\2\u06c8\u06c7\3\2\2\2\u06c8\u06c9\3\2\2\2\u06c9\u06cb\3\2\2\2\u06ca"+ + "\u06cc\7m\2\2\u06cb\u06ca\3\2\2\2\u06cb\u06cc\3\2\2\2\u06cc\u06ce\3\2"+ + "\2\2\u06cd\u06c5\3\2\2\2\u06cd\u06ce\3\2\2\2\u06ce\u06cf\3\2\2\2\u06cf"+ + "\u06d0\7g\2\2\u06d0\u015d\3\2\2\2\u06d1\u06d2\5\u0138\u009d\2\u06d2\u06d3"+ + "\7p\2\2\u06d3\u06d4\7e\2\2\u06d4\u015f\3\2\2\2\u06d5\u06d6\5\u00b4[\2"+ + "\u06d6\u0161\3\2\2\2\u06d7\u06dc\7n\2\2\u06d8\u06dc\7\2\2\3\u06d9\u06dc"+ + "\7\u009f\2\2\u06da\u06dc\6\u00b2\24\2\u06db\u06d7\3\2\2\2\u06db\u06d8"+ + "\3\2\2\2\u06db\u06d9\3\2\2\2\u06db\u06da\3\2\2\2\u06dc\u0163\3\2\2\2\u00b5"+ + "\u0172\u0177\u017e\u0188\u018e\u0194\u01a4\u01a8\u01b1\u01bd\u01c1\u01c7"+ + "\u01cf\u01d9\u01e9\u01f7\u01fb\u0202\u020a\u0213\u0233\u023b\u0253\u0264"+ + "\u0271\u027a\u0288\u0291\u029d\u02b2\u02b9\u02be\u02c3\u02cd\u02d0\u02d4"+ + "\u02d8\u02df\u02e2\u02e8\u02ed\u02ef\u02f2\u02f9\u02fe\u0311\u0319\u031d"+ + "\u0320\u0326\u032a\u032d\u0337\u033e\u0345\u0351\u0357\u035e\u0363\u0369"+ + "\u0375\u037b\u037f\u0387\u038b\u0391\u0394\u039a\u039f\u03b3\u03d6\u03d8"+ + "\u03ef\u03f7\u0402\u0409\u0410\u041a\u0428\u043e\u0440\u0448\u044c\u0450"+ + "\u0453\u045c\u0462\u046c\u0474\u047a\u0483\u048e\u0499\u049d\u049f\u04aa"+ + "\u04b3\u04b7\u04ba\u04c1\u04cc\u04d6\u04dc\u04de\u04e8\u04f2\u04f6\u04fa"+ + "\u04fe\u0505\u050d\u0518\u051c\u0520\u052c\u0530\u0534\u0539\u0540\u0547"+ + "\u055b\u055f\u0563\u0567\u0577\u057d\u057f\u0583\u0587\u058a\u058e\u0590"+ + "\u0596\u059e\u05a3\u05ae\u05b4\u05bb\u05c6\u05cb\u05cf\u05d4\u05d8\u05e0"+ + "\u05e8\u05ed\u05f0\u05f8\u0600\u0605\u0609\u060d\u0614\u0631\u063c\u0640"+ + "\u0648\u064c\u064e\u0656\u065f\u0667\u066c\u067c\u067e\u0687\u068d\u0693"+ + "\u0697\u06a0\u06a9\u06ac\u06b1\u06c3\u06c5\u06c8\u06cb\u06cd\u06db"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { @@ -12910,4 +13079,4 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); } } -} +} \ No newline at end of file diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index 17069a23c..4214a5448 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -305,6 +305,20 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitDomainClause(GobraParser.DomainClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAdtType(GobraParser.AdtTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAdtClause(GobraParser.AdtClauseContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1439,4 +1453,4 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitEos(GobraParser.EosContext ctx) { return visitChildren(ctx); } -} +} \ No newline at end of file diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 20b91c3b6..e5db4b55a 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,4 +1,4 @@ -// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -265,6 +265,18 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitDomainClause(GobraParser.DomainClauseContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#adtType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAdtType(GobraParser.AdtTypeContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#adtClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAdtClause(GobraParser.AdtClauseContext ctx); /** * Visit a parse tree produced by {@link GobraParser#ghostSliceType}. * @param ctx the parse tree @@ -1266,4 +1278,4 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitEos(GobraParser.EosContext ctx); -} +} \ No newline at end of file diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index c5b207027..c6092cf83 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -1232,7 +1232,7 @@ case class POptionType(elem : PType) extends PGhostLiteralType /** The type of ADT types */ case class PAdtType(clauses: Vector[PAdtClause]) extends PGhostLiteralType with PUnorderedScope -case class PAdtClause(id: PIdnDef, args: Vector[PFieldDecls]) extends PGhostMisc with PUnorderedScope +case class PAdtClause(id: PIdnDef, args: Vector[PFieldDecls]) extends PGhostMisc with PUnorderedScope with PDependentDef case class PGhostSliceType(elem: PType) extends PGhostLiteralType diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 0aea2888c..d05a91ce3 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -4919,7 +4919,7 @@ object Desugar { s"$ADT_PREFIX$$$adtName" } - def adtField(n: String, s: AdtT): String = s"$ADT_CLAUSE_PREFIX$$${topLevelName("")(adt(s), s.context)}" + def adtField(n: String, s: AdtT): String = topLevelName(s"$ADT_CLAUSE_PREFIX$$${adt(s)}")(n, s.context) def label(n: String): String = n match { case "#lhs" => "lhs" diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 5745091ec..0d44beed1 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -521,6 +521,22 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole } } + override def visitAdtType(ctx: AdtTypeContext): PAdtType = { + val clauses = ctx.adtClause().asScala.toVector.map(visitAdtClause) + PAdtType(clauses).at(ctx) + } + + override def visitAdtClause(ctx: AdtClauseContext): PAdtClause = { + val id = idnDef.unapply(ctx.IDENTIFIER()) + val fieldClauses = ctx.fieldDecl().asScala.toVector.map(visitFieldDecl) + val args = fieldClauses.collect{ case x: PFieldDecls => x } + + // embedded fields and ghost struct clauses are not supported. + if (id.isEmpty || args.size != fieldClauses.size) fail(ctx) + + PAdtClause(id.get, args).at(ctx) + } + /** * {@inheritDoc } * diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index ce05c169a..4a11336de 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -110,11 +110,11 @@ trait MemberResolution { this: TypeInfoImpl => case _ => AdvancedMemberSet.empty } - val adtConstructorSet: Type => AdvancedMemberSet[AdtClause] = - attr[Type, AdvancedMemberSet[AdtClause]] { - case DeclaredT(decl, context) => adtConstructorSet(context.symbType(decl.right)).surface - case t: AdtT => - AdvancedMemberSet.init[AdtClause](t.decl.clauses.map(c => AdtClause(c, t.decl, this))) + val adtConstructorSet: Type => Set[AdtClause] = + attr[Type, Set[AdtClause]] { + case DeclaredT(decl, context) => adtConstructorSet(context.symbType(decl.right)) + case t: AdtT => t.decl.clauses.map(c => AdtClause(c, t.decl, this)).toSet + case _ => Set.empty } // Methods @@ -269,8 +269,8 @@ trait MemberResolution { this: TypeInfoImpl => def tryAdtMemberLookup(t: Type, id: PIdnUse): Option[(AdtMember, Vector[MemberPath])] = adtMemberSet(t).lookupWithPath(id.name) - def tryAdtConstructorLookup(t: Type, id: PIdnUse): Option[(AdtClause, Vector[MemberPath])] = - adtConstructorSet(t).lookupWithPath(id.name) + def tryAdtConstructorLookup(t: Type, id: PIdnUse): Option[AdtClause] = + adtConstructorSet(t).find(_.getName == id.name) /** Resolves `e`.`id`. * @return _1: Methods accessible if e is addressable. @@ -337,7 +337,7 @@ trait MemberResolution { this: TypeInfoImpl => case t => tryMethodLikeLookup(t, id) // Constructors are not part of membersets because they are not promoted - .orElse(tryAdtConstructorLookup(t, id)) + .orElse(tryAdtConstructorLookup(t, id).map((_, Vector.empty))) } } } diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala index 1c94c628c..451d56ab3 100644 --- a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala @@ -268,7 +268,7 @@ class AdtEncoding extends LeafTypeEncoding { BigInt(sorted.indexOf(clause)) } - private def constructorCall(clause: in.AdtClause, args: Seq[vpr.Exp])(pos: vpr.Position = vpr.NoPosition, info: vpr.Info = vpr.NoInfo, errT: vpr.ErrorTrafo = vpr.NoTrafos): vpr.DomainFuncApp = { + private def constructorCall(clause: in.AdtClause, args: Seq[vpr.Exp])(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.DomainFuncApp = { val adtName = clause.name.adtName vpr.DomainFuncApp( Names.constructorAdtName(adtName, clause.name.name), From 90b56ec249695e037b0db386fa7814bf7035b4a3 Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Fri, 11 Nov 2022 19:47:08 +0100 Subject: [PATCH 044/296] safety commit --- src/main/scala/viper/gobra/ast/frontend/Ast.scala | 2 +- .../viper/gobra/ast/frontend/AstPattern.scala | 2 +- src/main/scala/viper/gobra/frontend/Desugar.scala | 10 +++------- .../implementation/property/Assignability.scala | 4 +--- .../implementation/property/TypeIdentity.scala | 4 +++- .../implementation/property/UnderlyingType.scala | 4 ++++ .../resolution/AmbiguityResolution.scala | 2 +- .../resolution/MemberResolution.scala | 15 +-------------- .../resolution/NameResolution.scala | 3 ++- .../info/implementation/typing/ExprTyping.scala | 4 ++-- .../info/implementation/typing/TypeTyping.scala | 2 +- 11 files changed, 20 insertions(+), 32 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index c6092cf83..c5b207027 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -1232,7 +1232,7 @@ case class POptionType(elem : PType) extends PGhostLiteralType /** The type of ADT types */ case class PAdtType(clauses: Vector[PAdtClause]) extends PGhostLiteralType with PUnorderedScope -case class PAdtClause(id: PIdnDef, args: Vector[PFieldDecls]) extends PGhostMisc with PUnorderedScope with PDependentDef +case class PAdtClause(id: PIdnDef, args: Vector[PFieldDecls]) extends PGhostMisc with PUnorderedScope case class PGhostSliceType(elem: PType) extends PGhostLiteralType diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala index dfb5b5d7d..9f962b41d 100644 --- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala +++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala @@ -22,7 +22,7 @@ object AstPattern { case class NamedType(id: PIdnUse, symb: st.ActualTypeEntity) extends Type with Symbolic case class PointerType(base: PType) extends Type - case class QualifiedAdtType(base: PType, symb: st.AdtClause) extends Type with Symbolic // TODO: rename + case class AdtClause(id: PIdnUse, symb: st.AdtClause) extends Type with Symbolic case class BuiltInType(id: PIdnUse, symb: st.BuiltInType) extends Type with Symbolic diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index d05a91ce3..e5f1e3ed5 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -4733,7 +4733,6 @@ object Desugar { private val INTERFACE_PREFIX = "Y" private val DOMAIN_PREFIX = "D" private val ADT_PREFIX = "ADT" - private val ADT_CLAUSE_PREFIX = "P" private val LABEL_PREFIX = "L" private val GLOBAL_PREFIX = "G" private val BUILTIN_PREFIX = "B" @@ -4912,14 +4911,11 @@ object Desugar { def adt(a: AdtT): String = { val pom = a.context.getTypeInfo.tree.originalRoot.positions - val start = pom.positions.getStart(a.decl).get - val finish = pom.positions.getFinish(a.decl).get - val pos = pom.translate(start, finish) - val adtName = pos.toString.replace(".", "$") - s"$ADT_PREFIX$$$adtName" + val hash = srcTextName(pom, a.decl.clauses) + s"$ADT_PREFIX$$${topLevelName("")(hash, a.context)}" } - def adtField(n: String, s: AdtT): String = topLevelName(s"$ADT_CLAUSE_PREFIX$$${adt(s)}")(n, s.context) + def adtField(n: String, s: AdtT): String = s"${adt(s)}$$$n" def label(n: String): String = n match { case "#lhs" => "lhs" diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index 96436ab94..ac88a2ddd 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala @@ -93,14 +93,12 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => // for ghost types case (BooleanT, AssertionT) => successProp - case (SortT, SortT) => successProp - case (PermissionT, PermissionT) => successProp case (SequenceT(l), SequenceT(r)) => assignableTo.result(l,r) // implies that Sequences are covariant case (SetT(l), SetT(r)) => assignableTo.result(l,r) case (MultisetT(l), MultisetT(r)) => assignableTo.result(l,r) case (OptionT(l), OptionT(r)) => assignableTo.result(l, r) case (IntT(_), PermissionT) => successProp - case (c: AdtClauseT, t: AdtT) if c.context == t.context && c.adtT == t.decl => successProp + case (c: AdtClauseT, UnderlyingType(t: AdtT)) if c.context == t.context && c.adtT == t.decl => successProp // conservative choice case _ => errorProp() diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala index 7cb06f7ae..416c2bec8 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala @@ -38,6 +38,8 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl => case (MathMapT(k1, v1), MathMapT(k2, v2)) => identicalTypes(k1, k2) && identicalTypes(v1, v2) case (OptionT(l), OptionT(r)) => identicalTypes(l, r) case (l: DomainT, r: DomainT) => l == r + case (l: AdtT, r: AdtT) => l == r + case (l: AdtClauseT, r: AdtClauseT) => l == r case (StructT(clausesL, _, contextL), StructT(clausesR, _, contextR)) => contextL == contextR && clausesL.size == clausesR.size && clausesL.zip(clausesR).forall { @@ -66,7 +68,7 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl => case (VoidType, VoidType) => true - case (l: AdtT, r: AdtT) => l == r + case _ => false } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala index f33c17f8b..d9c47981b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala @@ -15,6 +15,10 @@ import viper.gobra.frontend.info.implementation.TypeInfoImpl trait UnderlyingType { this: TypeInfoImpl => + object UnderlyingType { + def unapply(t: Type): Option[Type] = Some(underlyingType(t)) + } + lazy val underlyingType: Type => Type = attr[Type, Type] { case Single(DeclaredT(t: PTypeDecl, context: ExternalTypeInfo)) => underlyingType(context.symbType(t.right)) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala index 384718732..64b51d831 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala @@ -87,7 +87,6 @@ trait AmbiguityResolution { this: TypeInfoImpl => case (Right(base), Some((s: st.Method, path))) => Some(ap.MethodExpr(base, n.id, path, s)) case (Right(base), Some((s: st.MPredicate, path))) => Some(ap.PredicateExpr(base, n.id, path, s)) - case (Right(base), Some((s: st.AdtClause, _))) => Some(ap.QualifiedAdtType(base, s)) // imported members case (Right(_), Some((s: st.ActualTypeEntity, _))) => Some(ap.NamedType(n.id, s)) @@ -96,6 +95,7 @@ trait AmbiguityResolution { this: TypeInfoImpl => case (Right(_), Some((s: st.Function, _))) => Some(ap.Function(n.id, s)) case (Right(_), Some((s: st.FPredicate, _))) => Some(ap.Predicate(n.id, s)) case (Right(_), Some((s: st.DomainFunction, _))) => Some(ap.DomainFunction(n.id, s)) + case (Right(_), Some((s: st.AdtClause, _))) => Some(ap.AdtClause(n.id, s)) // built-in members case (Left(base), Some((s: st.BuiltInMethod, path))) => Some(ap.BuiltInReceivedMethod(base, n.id, path, s)) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index 4a11336de..896553697 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -110,13 +110,6 @@ trait MemberResolution { this: TypeInfoImpl => case _ => AdvancedMemberSet.empty } - val adtConstructorSet: Type => Set[AdtClause] = - attr[Type, Set[AdtClause]] { - case DeclaredT(decl, context) => adtConstructorSet(context.symbType(decl.right)) - case t: AdtT => t.decl.clauses.map(c => AdtClause(c, t.decl, this)).toSet - case _ => Set.empty - } - // Methods private lazy val receiverMethodSetMap: Map[Type, AdvancedMemberSet[TypeMember]] = { @@ -269,9 +262,6 @@ trait MemberResolution { this: TypeInfoImpl => def tryAdtMemberLookup(t: Type, id: PIdnUse): Option[(AdtMember, Vector[MemberPath])] = adtMemberSet(t).lookupWithPath(id.name) - def tryAdtConstructorLookup(t: Type, id: PIdnUse): Option[AdtClause] = - adtConstructorSet(t).find(_.getName == id.name) - /** Resolves `e`.`id`. * @return _1: Methods accessible if e is addressable. * _2: Methods accessible if e is not addressable. @@ -334,10 +324,7 @@ trait MemberResolution { this: TypeInfoImpl => case Right(typ) => // base is a type typeSymbType(typ) match { case pkg: ImportT => tryPackageLookup(RegularImport(pkg.decl.importPath), id, pkg.decl) - case t => - tryMethodLikeLookup(t, id) - // Constructors are not part of membersets because they are not promoted - .orElse(tryAdtConstructorLookup(t, id).map((_, Vector.empty))) + case t => tryMethodLikeLookup(t, id) } } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index 613989abc..877cbfcb4 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -248,7 +248,8 @@ trait NameResolution { private def packageLevelDefinitions(m: PMember): Vector[PIdnDef] = { /* Returns identifier definitions with a package scope occurring in a type. */ def leakingIdentifier(t: PType): Vector[PIdnDef] = t match { - case t: PDomainType => t.funcs.map(_.id) + case t: PDomainType => t.funcs.map(_.id) // domain functions + case t: PAdtType => t.clauses.map(_.id) // adt constructors case _ => Vector.empty } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index c3cdc500a..09e357103 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -67,7 +67,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(_: ap.BuiltInType) => noMessages case Some(_: ap.Predicate) => noMessages case Some(_: ap.DomainFunction) => noMessages - case Some(_: ap.QualifiedAdtType) => noMessages + case Some(_: ap.AdtClause) => noMessages case Some(_: ap.AdtField) => noMessages // TODO: fully supporting packages results in further options: global variable @@ -144,7 +144,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(p: ap.Predicate) => FunctionT(p.symb.args map p.symb.context.typ, AssertionT) case Some(p: ap.DomainFunction) => FunctionT(p.symb.args map p.symb.context.typ, p.symb.context.typ(p.symb.result)) - case Some(p: ap.QualifiedAdtType) => + case Some(p: ap.AdtClause) => val fields = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)).toMap AdtClauseT(fields, p.symb.decl, p.symb.adtDecl, this) case Some(p: ap.AdtField) => diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index 5e3830aa8..15f131f3c 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -154,7 +154,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case Some(p: ap.NamedType) => DeclaredT(p.symb.decl, p.symb.context) // ADT clause is special since it is a type with a name that is not a named type - case Some(p: ap.QualifiedAdtType) => + case Some(p: ap.AdtClause) => val types = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)).toMap AdtClauseT(types, p.symb.decl, p.symb.adtDecl, p.symb.context) From 94c24bae040f6d4b86dd42b473bc025bd4cc2d0e Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Sun, 13 Nov 2022 16:00:54 +0100 Subject: [PATCH 045/296] safety commit --- .../gobra/ast/internal/PrettyPrinter.scala | 29 +- .../viper/gobra/ast/internal/Program.scala | 9 +- .../scala/viper/gobra/frontend/Desugar.scala | 8 +- .../resolution/AdvancedMemberSet.scala | 1 - .../scala/viper/gobra/translator/Names.scala | 7 +- .../encodings/adts/AdtEncoding.scala | 434 ++++++++++-------- .../gobra/translator/util/ViperUtil.scala | 11 +- 7 files changed, 267 insertions(+), 232 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index e31b21de3..fdd1bf978 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -646,38 +646,11 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter // types def showType(typ : Type) : Doc = typ match { - case BoolT(_) => "bool" - case IntT(_, kind) => kind.name - case StringT(_) => "string" - case Float32T(_) => "float32" - case Float64T(_) => "float64" - case VoidT => "void" - case FunctionT(args, res, _) => "func" <> parens(showTypeList(args)) <> parens(showTypeList(res)) - case PermissionT(_) => "perm" - case DefinedT(name, _) => name - case PointerT(t, _) => "*" <> showType(t) - case TupleT(ts, _) => parens(showTypeList(ts)) - case PredT(args, _) => "pred" <> parens(showTypeList(args)) - case struct: StructT => emptyDoc <> block(hcat(struct.fields map showField)) - case i: InterfaceT => "interface" <> parens("name is " <> i.name) - case _: DomainT => "domain" <> parens("...") - case ChannelT(elem, _) => "chan" <+> showType(elem) - case SortT => "sort" - case array : ArrayT => brackets(array.length.toString) <> showType(array.elems) - case SequenceT(elem, _) => "seq" <> brackets(showType(elem)) - case SetT(elem, _) => "set" <> brackets(showType(elem)) - case MultisetT(elem, _) => "mset" <> brackets(showType(elem)) case MathMapT(keys, values, _) => "dict" <> brackets(showType(keys)) <> showType(values) - case OptionT(elem, _) => "option" <> brackets(showType(elem)) - case AdtT(name, _, _) => "adt" <> parens(name) - case AdtClauseT(name, adtT, _, _) => showType(adtT) <+> "::" <+> name - case SliceT(elem, _) => "[]" <> showType(elem) case MapT(keys, values, _) => "map" <> brackets(showType(keys)) <> showType(values) + case t: PrettyType => t.toString } - private def showTypeList[T <: Type](list: Vector[T]): Doc = - showList(list)(showType) - def showList[T](list: Seq[T])(f: T => Doc): Doc = ssep(list map f, comma <> space) def showMap[K, V](map : Map[K, V])(f : K => Doc, g : V => Doc) : Doc = diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index c9f58c9c2..706072dcf 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -1565,20 +1565,17 @@ case class DomainT(name: String, addressability: Addressability) extends PrettyT DomainT(name, newAddressability) } -// TODO: check why `clauseToTag` is necessary -case class AdtT(name: String, addressability: Addressability, clauseToTag: Map[String, BigInt]) extends Type with TopType { +case class AdtT(name: String, addressability: Addressability) extends PrettyType(s"adt{ name is $name }") with TopType { override def equalsWithoutMod(t: Type): Boolean = t match { case o: AdtT => name == o.name case _ => false } override def withAddressability(newAddressability: Addressability): Type = - AdtT(name, newAddressability, clauseToTag) + AdtT(name, newAddressability) } -// TODO: maybe remove this type as it is not necessary anymore -case class AdtClauseT(name: String, adtT: AdtT, fields: Vector[Field], addressability: Addressability) extends Type { - /** Returns whether 'this' is equals to 't' without considering the addressability modifier of the types. */ +case class AdtClauseT(name: String, adtT: AdtT, fields: Vector[Field], addressability: Addressability) extends PrettyType(fields.mkString(s"$name{", ", ", "}")) { override def equalsWithoutMod(t: Type): Boolean = t match { case o: AdtClauseT => name == o.name && adtT == o.adtT case _ => false diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index e5f1e3ed5..1f87bd5f5 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -3716,17 +3716,16 @@ object Desugar { case t: Type.AdtT => val adtName = nm.adt(t) - val res = registerType(in.AdtT(adtName, addrMod, getAdtClauseTagMap(t))) + val res = registerType(in.AdtT(adtName, addrMod)) registerAdt(t, res) res case t: Type.AdtClauseT => val tAdt = Type.AdtT(t.adtT, t.context) - val adt: in.AdtT = in.AdtT(nm.adt(tAdt), addrMod, getAdtClauseTagMap(tAdt)) + val adt: in.AdtT = in.AdtT(nm.adt(tAdt), addrMod) val fields: Vector[in.Field] = (t.clauses map { case (key: String, typ: Type) => in.Field(nm.adtField(key, tAdt), typeD(typ, Addressability.mathDataStructureElement)(src), true)(src) }).toVector - in.AdtClauseT(idName(t.decl.id, t.context.getTypeInfo), adt, fields, addrMod) case Type.PredT(args) => in.PredT(args.map(typeD(_, Addressability.rValue)(src)), Addressability.rValue) @@ -4915,7 +4914,8 @@ object Desugar { s"$ADT_PREFIX$$${topLevelName("")(hash, a.context)}" } - def adtField(n: String, s: AdtT): String = s"${adt(s)}$$$n" + /** can be inversed with [[inverse]] */ + def adtField(n: String, @unused s: AdtT): String = s"$n$FIELD_PREFIX" def label(n: String): String = n match { case "#lhs" => "lhs" diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala index a517bf33f..b05b5b470 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala @@ -97,7 +97,6 @@ object AdvancedMemberSet { case Field(m, _, _) => m.id.name case Embbed(m, _, _) => m.id.name case t: AdtMember => t.getName - case t: AdtClause => t.getName case ml: BuiltInMethodLike => ml.tag.identifier } diff --git a/src/main/scala/viper/gobra/translator/Names.scala b/src/main/scala/viper/gobra/translator/Names.scala index 7d5b83cfc..8befa7395 100644 --- a/src/main/scala/viper/gobra/translator/Names.scala +++ b/src/main/scala/viper/gobra/translator/Names.scala @@ -167,10 +167,11 @@ object Names { def dfltDomainValue(domainName: String): String = s"dflt$domainName" // adt - def dfltAdtValue(adtName: String): String = s"adtDflt_$adtName" - def tagAdtFunction(adtName: String): String = s"adtTag_$adtName" - def destructorAdtName(adtName: String, argumentName: String) = s"get_${adtName}_$argumentName" + def dfltAdtValue(adtName: String): String = s"${adtName}_dflt" + def tagAdtFunction(adtName: String): String = s"${adtName}_tag" + def destructorAdtName(adtName: String, argumentName: String) = s"${adtName}_$argumentName" def constructorAdtName(adtName: String, clause: String) = s"${adtName}_$clause" + def adtClauseTagFunction(adtName: String, clause: String): String = s"${adtName}_${clause}_tag" // unknown values def unknownValuesDomain: String = "UnknownValueDomain" diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala index 451d56ab3..71ca07a13 100644 --- a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala @@ -15,6 +15,7 @@ import viper.gobra.translator.Names import viper.gobra.translator.context.Context import viper.gobra.translator.encodings.combinators.LeafTypeEncoding import viper.gobra.translator.util.ViperWriter.{CodeWriter, MemberWriter} +import viper.gobra.util.Violation.violation import viper.silver.{ast => vpr} class AdtEncoding extends LeafTypeEncoding { @@ -23,6 +24,7 @@ class AdtEncoding extends LeafTypeEncoding { import viper.gobra.translator.util.ViperWriter.CodeLevel._ import viper.gobra.translator.util.ViperWriter.{MemberLevel => ml} import viper.silver.verifier.{errors => err} + import viper.gobra.translator.util.{ViperUtil => vu} override def typ(ctx: Context): in.Type ==> vpr.Type = { case ctx.Adt(adt) / m => @@ -39,179 +41,229 @@ class AdtEncoding extends LeafTypeEncoding { private def adtType(adtName: String): vpr.DomainType = vpr.DomainType(adtName, Map.empty)(Seq.empty) + /** + * [type X adt{ clause1{F11, ...}; ...; clauseN{FN1, ...} }] -> + * + * domain X { + * + * // constructors + * X_clause1(Type(F11), ...): X + * ... + * + * // destructors + * X_F11(X): Type(F11) + * ... + * + * // default + * X_default(): X + * + * // tags + * X_tag(X): Int + * unique X_clause1_tag(): Int + * ... + * + * axiom { + * forall f11: F11, ... :: { X_clause1(f11, ...) } + * X_tag(X_clause1(f11, ...)) == X_clause1_tag() && X_F11(X_clause1(f11, ...)) )) == f11 && ... + * ... + * } + * + * axiom { + * forall t: X :: {X_clause1_f11(t)}...{X_clause1_f1N(t)} + * X_tag(t) == X_clause1_tag() ==> t == X_clause1(X_clause1_f11(t), ...) + * ... + * } + * + * axiom { + * forall t: X :: {X_tag(t)} t == X_clause1(X_clause1_f11(t), ...) || t == ... + * } + * + * } + */ override def member(ctx: Context): in.Member ==> MemberWriter[Vector[vpr.Member]] = { case adt: in.AdtDefinition => - val adtName = adt.name val (aPos, aInfo, aErrT) = adt.vprMeta + val adtName = adt.name // X + val adtT = adtType(adtName) - def localVarTDecl = vpr.LocalVarDecl("t", adtType(adtName))(_, _, _) + def adtDecl(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.LocalVarDecl = + vpr.LocalVarDecl("t", adtT)(pos, info, errT) - def localVarT = vpr.LocalVar("t", adtType(adtName))(_, _, _) - - def tagF = getTag(adt.clauses)(_) - - def destructorsClause(clause: in.AdtClause): Vector[vpr.DomainFunc] = - clause.args.map(a => { - val (argPos, argInfo, argErrT) = a.vprMeta - vpr.DomainFunc( - Names.destructorAdtName(adtName, a.name), - Seq(localVarTDecl(argPos, argInfo, argErrT)), - ctx.typ(a.typ) - )(argPos, argInfo, adtName, argErrT) - }) - - - def clauseArgsAsLocalVarExp(c: in.AdtClause): Vector[vpr.LocalVar] = { - val (cPos, cInfo, cErrT) = c.vprMeta - c.args map { a => - val typ = ctx.typ(a.typ) - val name = a.name - vpr.LocalVar(name, typ)(cPos, cInfo, cErrT) - } - } - - def tagApp(arg: vpr.Exp) = { - vpr.DomainFuncApp( - Names.tagAdtFunction(adtName), - Seq(arg), - Map.empty - )(_, _, vpr.Int, adtName, _) + def fieldDecls(clause: in.AdtClause): Vector[vpr.LocalVarDecl] = { + val (cPos, cInfo, cErrT) = clause.vprMeta + clause.args map { field => vpr.LocalVarDecl(field.name, ctx.typ(field.typ))(cPos, cInfo, cErrT) } } - def deconstructorCall(field: String, arg: vpr.Exp, retTyp: vpr.Type) = { - vpr.DomainFuncApp( - Names.destructorAdtName(adtName, field), - Seq(arg), - Map.empty - )(_, _, retTyp, adtName, _) + // constructors + val constructors = adt.clauses map { clause => + val (cPos, cInfo, cErrT) = clause.vprMeta + vpr.DomainFunc( + Names.constructorAdtName(adtName, clause.name.name), + fieldDecls(clause), + adtT, + )(cPos, cInfo, adtName, cErrT) } - val clauses = adt.clauses map { c => - val (cPos, cInfo, cErrT) = c.vprMeta - val args = clauseArgsAsLocalVarDecl(c)(ctx) - vpr.DomainFunc(Names.constructorAdtName(adtName, c.name.name), args, adtType(adtName))(cPos, cInfo, adtName, cErrT) + // destructors + val destructors = adt.clauses flatMap { clause => + clause.args.map { field => + val (fieldPos, fieldInfo, fieldErrT) = field.vprMeta + vpr.DomainFunc( + Names.destructorAdtName(adtName, field.name), + Seq(adtDecl(fieldPos, fieldInfo, fieldErrT)), + ctx.typ(field.typ) + )(fieldPos, fieldInfo, adtName, fieldErrT) + } } + // default val defaultFunc = vpr.DomainFunc( Names.dfltAdtValue(adtName), Seq.empty, - adtType(adtName) + adtT, )(aPos, aInfo, adtName, aErrT) + // tag val tagFunc = vpr.DomainFunc( Names.tagAdtFunction(adtName), - Seq(localVarTDecl(aPos, aInfo, aErrT)), + Seq(adtDecl(aPos, aInfo, aErrT)), vpr.Int )(aPos, aInfo, adtName, aErrT) - val destructors: Vector[vpr.DomainFunc] = adt.clauses.flatMap(destructorsClause) + val clauseTags = adt.clauses map { clause => + val (cPos, cInfo, cErrT) = clause.vprMeta + vpr.DomainFunc( + Names.adtClauseTagFunction(adtName, clause.name.name), + Seq.empty, + vpr.Int, + unique = true, + )(cPos, cInfo, adtName, cErrT) + } + - val tagAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.map(c => { - val (cPos, cInfo, cErrT) = c.vprMeta - val args: Seq[vpr.Exp] = clauseArgsAsLocalVarExp(c) - val triggerVars: Seq[vpr.LocalVarDecl] = clauseArgsAsLocalVarDecl(c)(ctx) - val construct = constructorCall(c, args)(cPos, cInfo, cErrT) - val trigger = vpr.Trigger(Seq(construct))(cPos, cInfo, cErrT) - val lhs: vpr.Exp = tagApp(construct)(cPos, cInfo, cErrT) - val clauseTag = vpr.IntLit(tagF(c))(cPos, cInfo, cErrT) + // axioms - val destructors = c.args.map(a => - deconstructorCall(a.name, construct, ctx.typ(a.typ))(cPos, cInfo, cErrT) + // forall fi1: Fi1, ... :: { X_clausei(fi1, ...) } + // X_tag(X_clausei(fi1, ...)) == X_clausei_tag() && X_Fi1(X_clausei(fi1, ...)) )) == fi1 && ... + val constructorAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.map(clause => { + val (cPos, cInfo, cErrT) = clause.vprMeta + val clauseFieldDecls = fieldDecls(clause) + val args = clauseFieldDecls.map(_.localVar) + val clauseName = clause.name.name + + val construct = constructor(clauseName, adtName, args)(cPos, cInfo, cErrT) + val trigger = vpr.Trigger(Seq(construct))(cPos, cInfo, cErrT) + val discriminatorOverConstructor = discriminator(clauseName, adtName, construct)(cPos, cInfo, cErrT) + val destructorsOverConstructor = clause.args.map( field => + destructor(field.name, adtName, construct, ctx.typ(field.typ))(cPos, cInfo, cErrT) ) - if (c.args.nonEmpty) { - val destructOverConstruct: vpr.Exp = (destructors.zip(args).map { - case (d, a) => vpr.EqCmp( - d, a - )(cPos, cInfo, cErrT): vpr.Exp - }: Seq[vpr.Exp]).reduceLeft { - (l: vpr.Exp, r: vpr.Exp) => vpr.And(l, r)(cPos, cInfo, cErrT): vpr.Exp + if (clause.args.nonEmpty) { + val destructorEqArg = (destructorsOverConstructor zip args) map { + case (destructApp, arg) => vpr.EqCmp(destructApp, arg)(cPos, cInfo, cErrT) } - vpr.AnonymousDomainAxiom(vpr.Forall(triggerVars, Seq(trigger), vpr.And( - vpr.EqCmp(lhs, clauseTag)(cPos, cInfo, cErrT), - destructOverConstruct - )(cPos, cInfo, cErrT) - )(cPos, cInfo, cErrT))(cPos, cInfo, adtName, cErrT) + vpr.AnonymousDomainAxiom( + vpr.Forall( + clauseFieldDecls, + Seq(trigger), + vu.bigAnd(discriminatorOverConstructor +: destructorEqArg)(cPos, cInfo, cErrT) + )(cPos, cInfo, cErrT) + )(cPos, cInfo, adtName, cErrT) } else { - vpr.AnonymousDomainAxiom(vpr.EqCmp(lhs, clauseTag)(cPos, cInfo, cErrT))(cPos, cInfo, adtName, cErrT) + vpr.AnonymousDomainAxiom(discriminatorOverConstructor)(cPos, cInfo, adtName, cErrT) } }) - val destructorAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.filter(c => c.args.nonEmpty).map(c => { - val (cPos, cInfo, cErrT) = c.vprMeta - val variable = localVarTDecl(cPos, cInfo, cErrT) - val localVar = localVarT(cPos, cInfo, cErrT) - - val destructors = c.args.map(a => - deconstructorCall(a.name, localVar, ctx.typ(a.typ))(cPos, cInfo, cErrT) + // forall t: X :: {X_clausei_fi1(t)}...{X_clausei_fiN(t)} + // X_tag(t) == X_clausei_tag() ==> t == X_clausei(X_clausei_fi1(t), ...) + val destructorAxioms: Vector[vpr.AnonymousDomainAxiom] = adt.clauses.filter(c => c.args.nonEmpty).map(clause => { + val (cPos, cInfo, cErrT) = clause.vprMeta + val clauseName = clause.name.name + val variableDecl = adtDecl(cPos, cInfo, cErrT) + val variable = variableDecl.localVar + val destructorsOverVar = clause.args.map(field => + destructor(field.name, adtName, variable, ctx.typ(field.typ))(cPos, cInfo, cErrT) ) - val trigger = destructors.map(d => vpr.Trigger(Seq(d))(cPos, cInfo, cErrT)) - val clauseTag = vpr.IntLit(tagF(c))(cPos, cInfo, cErrT) - val triggerTagApp = tagApp(localVar)(cPos, cInfo, cErrT) - val implicationLhs = vpr.EqCmp(triggerTagApp, clauseTag)(aPos, aInfo, aErrT) - val implicationRhs = vpr.EqCmp( - localVar, - constructorCall(c, destructors)(cPos, cInfo, cErrT) - )(cPos, cInfo, cErrT) - - val implication = vpr.Implies(implicationLhs, implicationRhs)(cPos, cInfo, cErrT) - - vpr.AnonymousDomainAxiom(vpr.Forall(Seq(variable), trigger, implication)(cPos, cInfo, cErrT))(cPos, - cInfo, adtName, cErrT) + vpr.AnonymousDomainAxiom( + vpr.Forall( + Seq(variableDecl), + destructorsOverVar.map(d => vpr.Trigger(Seq(d))(cPos, cInfo, cErrT)), + vpr.Implies( + discriminator(clauseName, adtName, variable)(cPos, cInfo, cErrT), + vpr.EqCmp( + variable, + constructor(clauseName, adtName, destructorsOverVar)(cPos, cInfo, cErrT) + )(cPos, cInfo, cErrT), + )(cPos, cInfo, cErrT), + )(cPos, cInfo, cErrT) + )(cPos, cInfo, adtName, cErrT) }) + // forall t: X :: {X_tag(t)} t == X_clause1(X_clause1_f11(t), ...) || t == ... val exclusiveAxiom = { - val variableDecl = localVarTDecl(aPos, aInfo, aErrT) - val variable = localVarT(aPos, aInfo, aErrT) - val triggerExpression = tagApp(variable)(aPos, aInfo, aErrT) - val trigger = vpr.Trigger(Seq(triggerExpression))(aPos, aInfo, aErrT) + val variableDecl = adtDecl(aPos, aInfo, aErrT) + val variable = variableDecl.localVar - def destructors(clause: in.AdtClause) = clause.args map (a => { - val (argPos, argInfo, argErrT) = a.vprMeta - deconstructorCall(a.name, variable, ctx.typ(a.typ))(argPos, argInfo, argErrT) - }) + val triggerExpression = tag(adtName, variable)(aPos, aInfo, aErrT) + val trigger = vpr.Trigger(Seq(triggerExpression))(aPos, aInfo, aErrT) - val equalities = adt.clauses.map(c => { - val (cPos, cInfo, cErrT) = c.vprMeta - constructorCall(c, destructors(c))(cPos, cInfo, cErrT) - }) - .map(c => { - vpr.EqCmp(variable, c)(c.pos, c.info, c.errT) - }) - .foldLeft(vpr.FalseLit()(aPos, aInfo, aErrT): vpr.Exp)({ (acc, next) => vpr.Or(acc, next)(aPos, aInfo, aErrT): vpr.Exp }) + val equalities = adt.clauses.map{clause => + val (cPos, cInfo, cErrT) = clause.vprMeta + val clauseName = clause.name.name + vpr.EqCmp( + variable, + constructor( + clauseName, + adtName, + clause.args map { field => + val (argPos, argInfo, argErrT) = field.vprMeta + destructor(field.name, adtName, variable, ctx.typ(field.typ))(argPos, argInfo, argErrT) + } + )(cPos, cInfo, cErrT) + )(cPos, cInfo, cErrT) + } vpr.AnonymousDomainAxiom( - vpr.Forall(Seq(variableDecl), Seq(trigger), equalities)(aPos, aInfo, aErrT) + vpr.Forall(Seq(variableDecl), Seq(trigger), vu.bigOr(equalities)(aPos, aInfo, aErrT))(aPos, aInfo, aErrT) )(aPos, aInfo, adtName, aErrT) } - - val axioms = (tagAxioms ++ destructorAxioms) :+ exclusiveAxiom - val funcs = (clauses ++ destructors) :+ defaultFunc :+ tagFunc - - ml.unit(Vector(vpr.Domain(adtName, functions = funcs, axioms = axioms)(pos = aPos, info = aInfo, errT = aErrT))) + ml.unit(Vector(vpr.Domain( + adtName, + functions = (defaultFunc +: tagFunc +: clauseTags) ++ constructors ++ destructors, + axioms = (exclusiveAxiom +: constructorAxioms) ++ destructorAxioms + )(pos = aPos, info = aInfo, errT = aErrT))) } + /** + * [ dflt(adt{N}) ] -> N_default() + * [ C{args}: adt{N} ] -> N_C([args]) + * [ (e: adt{N}).isC ] -> N_tag([e]) == N_C_tag() + * [ (e: adt{N}).f ] -> N_f([e]) + */ override def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = { - def defaultVal(e: in.DfltVal, a: in.AdtT) = { - val (pos, info, errT) = e.vprMeta - unit( - vpr.DomainFuncApp( - funcname = Names.dfltAdtValue(a.name), - Seq.empty, - Map.empty - )(pos, info, adtType(a.name), a.name, errT): vpr.Exp - ) - } - default(super.expression(ctx)) { - case (e: in.DfltVal) :: ctx.Adt(a) / Exclusive => defaultVal(e, a) - case (e: in.DfltVal) :: ctx.AdtClause(a) / Exclusive => defaultVal(e, a.adtT) - case ac: in.AdtConstructorLit => adtConstructor(ac, ctx) - case ad: in.AdtDiscriminator => adtDiscriminator(ad, ctx) - case ad: in.AdtDestructor => adtDestructor(ad, ctx) + case (e: in.DfltVal) :: ctx.Adt(a) / Exclusive => unit(withSrc(defaultVal(a.name), e)) + case (e: in.DfltVal) :: ctx.AdtClause(a) / Exclusive => unit(withSrc(defaultVal(a.adtT.name), e)) + + case ac: in.AdtConstructorLit => + for { + args <- sequence(ac.args map ctx.expression) + } yield withSrc(constructor(ac.clause.name, ac.clause.adtName, args), ac) + + case ad: in.AdtDiscriminator => + for { + value <- ctx.expression(ad.base) + } yield withSrc(discriminator(ad.clause.name, ad.clause.adtName, value), ad) + + case ad: in.AdtDestructor => + val adtType = underlyingAdtType(ad.base.typ)(ctx) + for { + value <- ctx.expression(ad.base) + } yield withSrc(destructor(ad.field.name, adtType.name, value, ctx.typ(ad.field.typ)), ad) + case p: in.PatternMatchExp => translatePatternMatchExp(ctx)(p) // case c@in.Contains(_, _ :: ctx.Adt(_)) => translateContains(c)(ctx) } @@ -223,68 +275,7 @@ class AdtEncoding extends LeafTypeEncoding { } } - private def adtConstructor(ac: in.AdtConstructorLit, ctx: Context): Writer[vpr.Exp] = { - def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) - - val (pos, info, errT) = ac.vprMeta - for { - args <- sequence(ac.args map goE) - } yield vpr.DomainFuncApp( - funcname = Names.constructorAdtName(ac.clause.adtName, ac.clause.name), - args, - Map.empty - )(pos, info, adtType(ac.clause.adtName), ac.clause.adtName, errT) - } - - private def adtDiscriminator(ac: in.AdtDiscriminator, ctx: Context): Writer[vpr.Exp] = { - def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) - - val adtType = underlyingType(ac.base.typ)(ctx).asInstanceOf[in.AdtT] - val (pos, info, errT) = ac.vprMeta - for { - value <- goE(ac.base) - } yield vpr.EqCmp(vpr.DomainFuncApp( - Names.tagAdtFunction(adtType.name), - Seq(value), Map.empty)(pos, info, vpr.Int, adtType.name, errT), - vpr.IntLit(adtType.clauseToTag(ac.clause.name))(pos, info, errT) - )(pos, info, errT) - } - - private def adtDestructor(ac: in.AdtDestructor, ctx: Context): Writer[vpr.Exp] = { - def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) - - val adtType = underlyingType(ac.base.typ)(ctx).asInstanceOf[in.AdtT] - val (pos, info, errT) = ac.vprMeta - for { - value <- goE(ac.base) - } yield vpr.DomainFuncApp( - Names.destructorAdtName(adtType.name, ac.field.name), - Seq(value), Map.empty)(pos, info, ctx.typ(ac.field.typ), adtType.name, errT) - } - - - private def getTag(clauses: Vector[in.AdtClause])(clause: in.AdtClause): BigInt = { - val sorted = clauses.sortBy(_.name.name) - BigInt(sorted.indexOf(clause)) - } - - private def constructorCall(clause: in.AdtClause, args: Seq[vpr.Exp])(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.DomainFuncApp = { - val adtName = clause.name.adtName - vpr.DomainFuncApp( - Names.constructorAdtName(adtName, clause.name.name), - args, - Map.empty - )(pos, info, adtType(adtName), adtName, errT) - } - - private def clauseArgsAsLocalVarDecl(c: in.AdtClause)(ctx: Context): Vector[vpr.LocalVarDecl] = { - val (cPos, cInfo, cErrT) = c.vprMeta - c.args map { a => - val typ = ctx.typ(a.typ) - val name = a.name - vpr.LocalVarDecl(name, typ)(cPos, cInfo, cErrT) - } - } + // pattern matching def declareIn(ctx: Context)(e: in.Expr, p: in.MatchPattern, z: vpr.Exp): CodeWriter[vpr.Exp] = { val (pos, info, errT) = p.vprMeta @@ -371,7 +362,7 @@ class AdtEncoding extends LeafTypeEncoding { case in.MatchBindVar(_, _) | in.MatchWildcard() => unit(vpr.TrueLit()(pos,info,errT)) case in.MatchAdt(clause, exp) => val tagFunction = Names.tagAdtFunction(clause.adtT.name) - val tag = vpr.IntLit(clause.adtT.clauseToTag(clause.name))(mPos, mInfo, mErr) + val tag = vpr.IntLit(???)(mPos, mInfo, mErr) val inDeconstructors = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info)) for { e1 <- goE(expr) @@ -466,4 +457,69 @@ class AdtEncoding extends LeafTypeEncoding { } } + + // constructor, destructor, discriminator, tag, default + + /** adtName_clauseName(args) */ + private def constructor(clauseName: String, adtName: String, args: Vector[vpr.Exp])(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = { + vpr.DomainFuncApp( + funcname = Names.constructorAdtName(adtName, clauseName), + args, + Map.empty + )(pos, info, adtType(adtName), adtName, errT) + } + + /** adtName_fieldName(arg) */ + private def destructor(fieldName: String, adtName: String, arg: vpr.Exp, fieldType: vpr.Type)(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = { + vpr.DomainFuncApp( + funcname = Names.destructorAdtName(adtName, fieldName), + Seq(arg), + Map.empty, + )(pos, info, fieldType, adtName, errT) + } + + /** adtName_tag(arg) == adtName_clauseName_tag() */ + private def discriminator(clauseName: String, adtName: String, arg: vpr.Exp)(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = { + vpr.EqCmp( + tag(adtName, arg)(pos, info, errT), + clauseTag(clauseName, adtName)(pos, info, errT), + )(pos, info, errT) + } + + /** adtName_tag(arg) */ + private def tag(adtName: String, arg: vpr.Exp)(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = { + vpr.DomainFuncApp( + funcname = Names.tagAdtFunction(adtName), + Seq(arg), + Map.empty, + )(pos, info, vpr.Int, adtName, errT) + } + + /** adtName_clauseName_tag() */ + private def clauseTag(clauseName: String, adtName: String)(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = { + vpr.DomainFuncApp( + funcname = Names.adtClauseTagFunction(adtName, clauseName), + Seq.empty, + Map.empty + )(pos, info, vpr.Int, adtName, errT) + } + + /** adtName_default() */ + def defaultVal(adtName: String)(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.Exp = { + vpr.DomainFuncApp( + funcname = Names.dfltAdtValue(adtName), + Seq.empty, + Map.empty + )(pos, info, adtType(adtName), adtName, errT) + } + + // auxiliary functions + + private def underlyingAdtType(t: in.Type)(ctx: Context): in.AdtT = { + underlyingType(t)(ctx) match { + case t: in.AdtT => t + case t: in.AdtClauseT => t.adtT + case t => violation(s"expected adt type, but got $t") + } + } } diff --git a/src/main/scala/viper/gobra/translator/util/ViperUtil.scala b/src/main/scala/viper/gobra/translator/util/ViperUtil.scala index 447f891e3..169911348 100644 --- a/src/main/scala/viper/gobra/translator/util/ViperUtil.scala +++ b/src/main/scala/viper/gobra/translator/util/ViperUtil.scala @@ -30,11 +30,20 @@ object ViperUtil { it.headOption match { case Some(hd) => val tl = it.tail - tl.foldLeft[Exp](hd){ case (accum, elem) => And(accum, elem)(pos, info, errT) } + tl.foldLeft[Exp](hd) { case (accum, elem) => And(accum, elem)(pos, info, errT) } case None => TrueLit()(pos, info, errT) } } + def bigOr(it: Iterable[Exp])(pos: Position, info: Info, errT: ErrorTrafo): Exp = { + it.headOption match { + case Some(hd) => + val tl = it.tail + tl.foldLeft[Exp](hd) { case (accum, elem) => Or(accum, elem)(pos, info, errT) } + case None => FalseLit()(pos, info, errT) + } + } + def seqn(ss: Vector[Stmt])(pos: Position, info: Info, errT: ErrorTrafo): Seqn = Seqn(ss, Vector.empty)(pos, info, errT) def nop(pos: Position, info: Info, errT: ErrorTrafo): Seqn = Seqn(Vector.empty, Vector.empty)(pos, info, errT) From dbfa14bc43efe0c8a10bf1aa1b1ef6b30cb7906b Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Sun, 13 Nov 2022 18:20:38 +0100 Subject: [PATCH 046/296] safety commit --- .../encodings/adts/AdtEncoding.scala | 280 +++++++++--------- 1 file changed, 140 insertions(+), 140 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala index 71ca07a13..910259799 100644 --- a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala @@ -8,8 +8,7 @@ package viper.gobra.translator.encodings.adts import org.bitbucket.inkytonik.kiama.==> import viper.gobra.ast.{internal => in} -import viper.gobra.reporting.BackTranslator.{ErrorTransformer, RichErrorMessage} -import viper.gobra.reporting.{MatchError, Source} +import viper.gobra.reporting.MatchError import viper.gobra.theory.Addressability.{Exclusive, Shared} import viper.gobra.translator.Names import viper.gobra.translator.context.Context @@ -23,7 +22,6 @@ class AdtEncoding extends LeafTypeEncoding { import viper.gobra.translator.util.TypePatterns._ import viper.gobra.translator.util.ViperWriter.CodeLevel._ import viper.gobra.translator.util.ViperWriter.{MemberLevel => ml} - import viper.silver.verifier.{errors => err} import viper.gobra.translator.util.{ViperUtil => vu} override def typ(ctx: Context): in.Type ==> vpr.Type = { @@ -264,196 +262,198 @@ class AdtEncoding extends LeafTypeEncoding { value <- ctx.expression(ad.base) } yield withSrc(destructor(ad.field.name, adtType.name, value, ctx.typ(ad.field.typ)), ad) - case p: in.PatternMatchExp => translatePatternMatchExp(ctx)(p) - // case c@in.Contains(_, _ :: ctx.Adt(_)) => translateContains(c)(ctx) + case p: in.PatternMatchExp => translatePatternMatchExp(p)(ctx) } } override def statement(ctx: Context): in.Stmt ==> CodeWriter[vpr.Stmt] = { default(super.statement(ctx)) { - case p: in.PatternMatchStmt => translatePatternMatch(ctx)(p) + case p: in.PatternMatchStmt => translatePatternMatch(p)(ctx) } } // pattern matching - def declareIn(ctx: Context)(e: in.Expr, p: in.MatchPattern, z: vpr.Exp): CodeWriter[vpr.Exp] = { - val (pos, info, errT) = p.vprMeta + /** + * [e match { case p1: s1; ... }] -> + * var b: Bool = false + * + * if Check(p1,e && !b) { + * b := true + * Assign(p1,e) + * [s1] + * } + * + * ... + * + * // if strict is true + * assert b + * + */ + def translatePatternMatch(s: in.PatternMatchStmt)(ctx: Context): CodeWriter[vpr.Stmt] = { + val (sPos, sInfo, sErrT) = s.vprMeta - p match { - case in.MatchValue(_) | in.MatchWildcard() => unit(z) - case in.MatchBindVar(name, typ) => - for { - eV <- ctx.expression(e) - } yield vpr.Let( - vpr.LocalVarDecl(name, ctx.typ(typ))(pos, info, errT), - eV, - z - )(pos, info, errT) - case in.MatchAdt(clause, expr) => - val inDeconstructors = clause.fields.map(f => in.AdtDestructor(e, f)(e.info)) - val zipWithPattern = inDeconstructors.zip(expr) - zipWithPattern.foldRight(unit(z))((des, acc) => for { - v <- acc - d <- declareIn(ctx)(des._1, des._2, v) - } yield d) + // var b: Bool + val checkExVarDecl = vpr.LocalVarDecl(ctx.freshNames.next(), vpr.Bool)(sPos, sInfo, sErrT) + val checkExVar = checkExVarDecl.localVar + + // b := false + val initialExVar = unit(vpr.LocalVarAssign(checkExVar, vpr.FalseLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT)) + + // b := true + def setExVar(p: vpr.Position, i: vpr.Info, e: vpr.ErrorTrafo): Writer[vpr.LocalVarAssign] = + unit(vpr.LocalVarAssign(checkExVar, vpr.TrueLit()(p, i, e))(p, i, e)) + + def translateCase(c: in.PatternMatchCaseStmt): CodeWriter[vpr.Stmt] = { + val (cPos, cInfo, cErrT) = c.vprMeta + for { + check <- translateMatchPatternCheck(s.exp, c.mExp)(ctx) + setExVarV <- setExVar(cPos, cInfo, cErrT) + ass <- translateMatchPatternDeclarations(s.exp, c.mExp)(ctx) + body <- seqn(ctx.statement(c.body)) + } yield vpr.If( + vpr.And(check, vpr.Not(checkExVar)(cPos, cInfo, cErrT))(cPos, cInfo, cErrT), // Check(pi, e) && !b + vpr.Seqn(Seq(setExVarV, ass, body), Seq.empty)(cPos, cInfo, cErrT), // b := true; Assign(pi, e); [si] + vpr.Seqn(Seq(), Seq())(cPos, cInfo, cErrT) // empty else + )(cPos, cInfo, cErrT) } + + for { + init <- initialExVar + cs <- sequence(s.cases map translateCase) + _ <- if (s.strict) { + assert(vpr.EqCmp(checkExVar, vpr.TrueLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT), (info, _) => MatchError(info)) + } else unit(()) + } yield vpr.Seqn(init +: cs, Seq(checkExVarDecl))(sPos, sInfo, sErrT) } - def translatePatternMatchExp(ctx: Context)(e: in.PatternMatchExp): CodeWriter[vpr.Exp] = { + /** + * [e match { case1 p1: e1; ...; caseN pN: eN }] -> + * asserting Check(p1, e) || ... || Check(pN, e) in Match(case1 p1: e1; ...; caseN pN: eN; default: dflt(T), e) + * [e match { case1 p1: e1; ...; caseN pN: eN; default: e_ }] -> + * Match(case1 p1: e1; ...; caseN pN: eN; default: e_, e) + * + * Match(default: e_, e) -> e_ + * Match(case1 p1: e1; ...; caseN pN: eN; default: e_, e) -> + * Check(p1, e) ? AssignIn(p1, e, [e1]) : Match(case p2: e2; ...; caseN pN: eN; default: e_, e) + * + */ + def translatePatternMatchExp(e: in.PatternMatchExp)(ctx: Context): CodeWriter[vpr.Exp] = { def translateCases(cases: Vector[in.PatternMatchCaseExp], dflt: in.Expr): CodeWriter[vpr.Exp] = { - val (ePos, eInfo, eErrT) = if (cases.isEmpty) dflt.vprMeta else cases.head.vprMeta - - if (cases.isEmpty) { - ctx.expression(dflt) - } else { - val c = cases.head - for { - check <- translateMatchPatternCheck(ctx)(e.exp, c.mExp) - body <- ctx.expression(c.exp) - decl <- declareIn(ctx)(e.exp, c.mExp, body) - el <- translateCases(cases.tail, dflt) - } yield vpr.CondExp(check, decl, el)(ePos, eInfo, eErrT) + cases match { + case c +: cs => + for { + check <- translateMatchPatternCheck(e.exp, c.mExp)(ctx) + body <- ctx.expression(c.exp) + decl <- declareIn(e.exp, c.mExp, body)(ctx) + el <- translateCases(cs, dflt) + } yield vpr.CondExp(check, decl, el)(ePos, eInfo, eErrT) + case _ => ctx.expression(dflt) } } if (e.default.isDefined) { translateCases(e.cases, e.default.get) } else { - val (pos, info, errT) = e.vprMeta - val allChecks = e.cases - .map(c => translateMatchPatternCheck(ctx)(e.exp, c.mExp)) - .foldLeft(unit(vpr.FalseLit()() : vpr.Exp))((acc, next) => - for { - a <- acc - n <- next - } yield vpr.Or(a,n)(pos, info, errT)) - + val checkExpressionMatchesOnePattern = + sequence(e.cases.map(c => translateMatchPatternCheck(e.exp, c.mExp)(ctx))).map(vu.bigOr(_)(pos, info, errT)) for { - dummy <- ctx.expression(in.DfltVal(e.typ)(e.info)) - cond <- translateCases(e.cases, in.DfltVal(e.typ)(e.info)) - checks <- allChecks - (checkFunc, errCheck) = ctx.condition.assert(checks, (info, _) => MatchError(info)) - _ <- errorT(errCheck) - } yield vpr.CondExp(checkFunc, cond, dummy)(pos, info, errT) + matching <- translateCases(e.cases, in.DfltVal(e.typ)(e.info)) + checks <- checkExpressionMatchesOnePattern + checkedMatching <- assert(checks, matching, (info, _) => MatchError(info))(ctx) + } yield checkedMatching } - - } - def translateMatchPatternCheck(ctx: Context)(expr: in.Expr, pattern: in.MatchPattern): CodeWriter[vpr.Exp] = { - def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) + /** + * Encodes the check whether `expr` matches pattern + * + * Check(_, e) -> true + * Check(x, e) -> true + * Check(`v`, e) -> [v] == [e] + * Check(C{f1: p1, ...}, e) -> [e.isC] && Check(p1, e.f1) && ... + * + */ + def translateMatchPatternCheck(expr: in.Expr, pattern: in.MatchPattern)(ctx: Context): CodeWriter[vpr.Exp] = { val (pos, info, errT) = pattern.vprMeta - def matchSimpleExp(exp: in.Expr): Writer[vpr.Exp] = for { - e1 <- goE(exp) - e2 <- goE(expr) - } yield vpr.EqCmp(e1, e2)(pos, info, errT) + pattern match { + case _: in.MatchBindVar | _: in.MatchWildcard => + unit(vpr.TrueLit()(pos,info,errT)) - val (mPos, mInfo, mErr) = pattern.vprMeta + case in.MatchValue(exp) => + for { + e1 <- ctx.expression(exp) + e2 <- ctx.expression(expr) + } yield vpr.EqCmp(e1, e2)(pos, info, errT) - pattern match { - case in.MatchValue(exp) => matchSimpleExp(exp) - case in.MatchBindVar(_, _) | in.MatchWildcard() => unit(vpr.TrueLit()(pos,info,errT)) - case in.MatchAdt(clause, exp) => - val tagFunction = Names.tagAdtFunction(clause.adtT.name) - val tag = vpr.IntLit(???)(mPos, mInfo, mErr) - val inDeconstructors = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info)) + case in.MatchAdt(clause, patternArgs) => + val destructorOverExp = clause.fields.map(f => in.AdtDestructor(expr, f)(expr.info)) for { - e1 <- goE(expr) - tF = vpr.DomainFuncApp(tagFunction, Vector(e1), Map.empty)(mPos, mInfo, vpr.Int, clause.adtT.name, mErr) - checkTag = vpr.EqCmp(tF, tag)(mPos) - rec <- sequence(inDeconstructors.zip(exp) map {case (e, p) => translateMatchPatternCheck(ctx)(e,p)}) - } yield rec.foldLeft(checkTag:vpr.Exp)({case (acc, next) => vpr.And(acc, next)(mPos, mInfo, mErr)}) + eV <- ctx.expression(expr) + discr = discriminator(clause.name, clause.adtT.name, eV)(pos, info, errT) + rec <- sequence((destructorOverExp zip patternArgs) map { case (e, p) => translateMatchPatternCheck(e,p)(ctx)} ) + } yield vu.bigAnd(discr +: rec)(pos, info, errT) } } - def translateMatchPatternDeclarations(ctx: Context)(expr: in.Expr, pattern: in.MatchPattern): Option[CodeWriter[vpr.Seqn]] = { + /** + * Assign(_, e) -> nop + * Assign(`v`, e) -> nop + * Assign(x, e) -> var x = [e] + * Assign(C{f1: p1, ...}, e) -> Assign(p1, e.f1); Assign(p2, e.f2); ... + * + */ + def translateMatchPatternDeclarations(expr: in.Expr, pattern: in.MatchPattern)(ctx: Context): CodeWriter[vpr.Seqn] = { val (mPos, mInfo, mErrT) = pattern.vprMeta - def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) + pattern match { + case _ : in.MatchValue | _: in.MatchWildcard => unit(vu.nop(mPos, mInfo, mErrT)) + case in.MatchBindVar(name, typ) => val t = ctx.typ(typ) - - val writer = for { - e <- goE(expr) + for { + e <- ctx.expression(expr) v = vpr.LocalVarDecl(name, t)(mPos, mInfo, mErrT) a = vpr.LocalVarAssign(vpr.LocalVar(name, t)(mPos, mInfo, mErrT), e)(mPos, mInfo, mErrT) } yield vpr.Seqn(Seq(a), Seq(v))(mPos, mInfo, mErrT) - Some(writer) case in.MatchAdt(clause, exprs) => - val inDeconstructors = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info)) - val recAss: Vector[CodeWriter[vpr.Seqn]] = - inDeconstructors.zip(exprs) map {case (e, p) => translateMatchPatternDeclarations(ctx)(e,p)} collect {case Some(s) => s} - val assignments: Vector[vpr.Seqn] = recAss map {a => a.res} - val reduced = assignments.foldLeft(vpr.Seqn(Seq(), Seq())(mPos, mInfo, mErrT))( - {case (l, r) => vpr.Seqn(l.ss ++ r .ss, l.scopedDecls ++ r.scopedDecls)(mPos, mInfo, mErrT)} - ) - Some(unit(reduced)) - - case _ : in.MatchValue | _: in.MatchWildcard => None + val destructorOverExp = clause.fields.map(f => in.AdtDestructor(expr, f)(pattern.info)) + val recAss = (destructorOverExp zip exprs) map { case (e, p) => translateMatchPatternDeclarations(e,p)(ctx) } + sequence(recAss).map(vpr.Seqn(_, Seq.empty)(mPos, mInfo, mErrT)) } } - def translatePatternMatch(ctx: Context)(s: in.PatternMatchStmt): CodeWriter[vpr.Stmt] = { - val expr = s.exp - val cases = s.cases - - val (sPos, sInfo, sErrT) = s.vprMeta - - val checkExVarDecl = vpr.LocalVarDecl(ctx.freshNames.next(), vpr.Bool)(sPos, sInfo, sErrT) - val checkExVar = checkExVarDecl.localVar - val initialExVar = unit(vpr.LocalVarAssign(checkExVar, vpr.FalseLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT)) - def exErr(ass: vpr.Stmt): ErrorTransformer = { - case e@err.AssertFailed(Source(info), _, _) if e causedBy ass => MatchError(info) - } - - val assertWithError = for { - a <- unit(vpr.Assert(vpr.EqCmp(checkExVar, vpr.TrueLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT))(sPos, sInfo, sErrT)) - _ <- errorT(exErr(a)) - } yield a - - def setExVar(p: vpr.Position, i: vpr.Info, e: vpr.ErrorTrafo) = - unit(vpr.LocalVarAssign(checkExVar, vpr.TrueLit()(p,i,e))(p,i,e)) - - def translateCase(c: in.PatternMatchCaseStmt): CodeWriter[vpr.Stmt] = { - val (cPos, cInfo, cErrT) = c.vprMeta - - val assignments = translateMatchPatternDeclarations(ctx)(expr, c.mExp) + /** + * AssignIn(_, e, z) -> z + * AssignIn(`v`, e, z) -> z + * AssignIn(x, e, z) -> let x == ([e]) in z + * AssignIn(C{f1: p1, ...}, e, z) -> AssignIn(p1, e.f1, AssignIn(p2, e.f2, ...z)) + * + */ + def declareIn(e: in.Expr, p: in.MatchPattern, z: vpr.Exp)(ctx: Context): CodeWriter[vpr.Exp] = { + val (pos, info, errT) = p.vprMeta - val (ass: Seq[vpr.Stmt], decls: Seq[vpr.Declaration]) = - if (assignments.isDefined) { - val w = assignments.get.res - (w.ss, w.scopedDecls) - } else { - (Seq(), Seq()) - } - for { - check <- translateMatchPatternCheck(ctx)(expr, c.mExp) - exVar <- setExVar(cPos, cInfo, cErrT) - body <- seqn(ctx.statement(c.body)) - } yield vpr.If(vpr.And(check, vpr.Not(checkExVar)(cPos, cInfo, cErrT))(cPos, cInfo, cErrT), - vpr.Seqn(exVar +: (ass :+ body), decls)(cPos, cInfo, cErrT), vpr.Seqn(Seq(), Seq())(cPos, cInfo, cErrT))(cPos, cInfo, cErrT) - } + p match { + case _: in.MatchValue | _: in.MatchWildcard => unit(z) + case in.MatchBindVar(name, typ) => + for { + eV <- ctx.expression(e) + } yield vpr.Let(vpr.LocalVarDecl(name, ctx.typ(typ))(pos, info, errT), eV, z)(pos, info, errT) - if (s.strict) { - for { - init <- initialExVar - cs <- sequence(cases map translateCase) - a <- assertWithError - } yield vpr.Seqn(init +: cs :+ a, Seq(checkExVarDecl))(sPos, sInfo, sErrT) - } else { - for { - init <- initialExVar - cs <- sequence(cases map translateCase) - } yield vpr.Seqn(init +: cs, Seq(checkExVarDecl))(sPos, sInfo, sErrT) + case in.MatchAdt(clause, expr) => + val destructorOverExp = clause.fields.map(f => in.AdtDestructor(e, f)(e.info)) + (destructorOverExp zip expr).foldRight(unit(z))((des, acc) => for { + v <- acc + d <- declareIn(des._1, des._2, v)(ctx) + } yield d) } } From 0d001df14a2b3d6a0c0772ad796adad2acb8edc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Sun, 13 Nov 2022 21:48:51 +0100 Subject: [PATCH 047/296] Add bug witness --- src/test/resources/regressions/issues/000573.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/test/resources/regressions/issues/000573.go diff --git a/src/test/resources/regressions/issues/000573.go b/src/test/resources/regressions/issues/000573.go new file mode 100644 index 000000000..b86e0ec12 --- /dev/null +++ b/src/test/resources/regressions/issues/000573.go @@ -0,0 +1,12 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +type X int + +func (s X) f() { + x := func /*@ g @*/ () { + return + } +} From d33ce23acd9659e0f43608d2a128f00ac9e1c7ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Sun, 13 Nov 2022 21:49:43 +0100 Subject: [PATCH 048/296] Add fix --- src/main/scala/viper/gobra/ast/frontend/Ast.scala | 8 ++++++-- src/main/scala/viper/gobra/frontend/Desugar.scala | 10 +++++----- .../viper/gobra/frontend/ParseTreeTranslator.scala | 2 -- .../viper/gobra/frontend/info/ExternalTypeInfo.scala | 5 ++++- .../frontend/info/implementation/TypeInfoImpl.scala | 2 ++ .../info/implementation/resolution/Enclosing.scala | 6 ++++++ .../scala/viper/gobra/reporting/StatsCollector.scala | 2 +- 7 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index bfa306d11..16e284c23 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -162,13 +162,17 @@ sealed trait PFunctionOrClosureDecl extends PScope { def body: Option[(PBodyParameterInfo, PBlock)] } +sealed trait PFunctionOrMethodDecl extends PNode with PScope { + def id: PIdnDef +} + case class PFunctionDecl( id: PIdnDef, args: Vector[PParameter], result: PResult, spec: PFunctionSpec, body: Option[(PBodyParameterInfo, PBlock)] - ) extends PFunctionOrClosureDecl with PActualMember with PCodeRootWithResult with PWithBody with PGhostifiableMember + ) extends PFunctionOrClosureDecl with PActualMember with PCodeRootWithResult with PWithBody with PGhostifiableMember with PFunctionOrMethodDecl case class PMethodDecl( id: PIdnDef, @@ -177,7 +181,7 @@ case class PMethodDecl( result: PResult, spec: PFunctionSpec, body: Option[(PBodyParameterInfo, PBlock)] - ) extends PActualMember with PDependentDef with PScope with PCodeRootWithResult with PWithBody with PGhostifiableMember + ) extends PActualMember with PDependentDef with PScope with PCodeRootWithResult with PWithBody with PGhostifiableMember with PFunctionOrMethodDecl sealed trait PTypeDecl extends PActualMember with PActualStatement with PGhostifiableStatement with PGhostifiableMember with PDeclaration { diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 20f342eb2..019164565 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -246,7 +246,7 @@ object Desugar { def functionLitProxyD(lit: PFunctionLit, context: TypeInfo): in.FunctionLitProxy = { // If the literal is nameless, generate a unique name - val name = if (lit.id.isEmpty) nm.anonFuncLit(context.enclosingFunction(lit).get, context) else idName(lit.id.get, context) + val name = if (lit.id.isEmpty) nm.anonFuncLit(context.enclosingFunctionOrMethod(lit).get, context) else idName(lit.id.get, context) val info = if (lit.id.isEmpty) meta(lit, context) else meta(lit.id.get, context) in.FunctionLitProxy(name)(info) } @@ -3653,7 +3653,7 @@ object Desugar { case _: st.GlobalVariable => nm.global(id.name, v.context) case _ => nm.variable(id.name, context.scope(id), v.context) } - case c: st.Closure => nm.funcLit(id.name, context.enclosingFunction(id).get, c.context) + case c: st.Closure => nm.funcLit(id.name, context.enclosingFunctionOrMethod(id).get, c.context) case sc: st.SingleConstant => nm.global(id.name, sc.context) case st.Embbed(_, _, _) | st.Field(_, _, _) => violation(s"expected that fields and embedded field are desugared by using embeddedDeclD resp. fieldDeclD but idName was called with $id") case n: st.NamedType => nm.typ(id.name, n.context) @@ -4582,7 +4582,7 @@ object Desugar { s"${n}_$postfix${scopeMap(s)}" // deterministic } - private def nameWithEnclosingFunction(postfix: String)(n: String, enclosing: PFunctionDecl, context: ExternalTypeInfo): String = { + private def nameWithEnclosingFunction(postfix: String)(n: String, enclosing: PFunctionOrMethodDecl, context: ExternalTypeInfo): String = { maybeRegister(enclosing, context) s"${n}_${enclosing.id.name}_${context.pkgInfo.viperId}_$postfix${scopeMap(enclosing)}" // deterministic } @@ -4608,8 +4608,8 @@ object Desugar { def mainFuncProofObligation(context: ExternalTypeInfo): String = topLevelName(MAIN_FUNC_OBLIGATIONS_PREFIX)(Constants.MAIN_FUNC_NAME, context) def variable(n: String, s: PScope, context: ExternalTypeInfo): String = name(VARIABLE_PREFIX)(n, s, context) - def funcLit(n: String, enclosing: PFunctionDecl, context: ExternalTypeInfo): String = nameWithEnclosingFunction(FUNCTION_PREFIX)(n, enclosing, context) - def anonFuncLit(enclosing: PFunctionDecl, context: ExternalTypeInfo): String = nameWithEnclosingFunction(FUNCTION_PREFIX)("func", enclosing, context) ++ s"_${fresh(enclosing, context)}" + def funcLit(n: String, enclosing: PFunctionOrMethodDecl, context: ExternalTypeInfo): String = nameWithEnclosingFunction(FUNCTION_PREFIX)(n, enclosing, context) + def anonFuncLit(enclosing: PFunctionOrMethodDecl, context: ExternalTypeInfo): String = nameWithEnclosingFunction(FUNCTION_PREFIX)("func", enclosing, context) ++ s"_${fresh(enclosing, context)}" def global (n: String, context: ExternalTypeInfo): String = topLevelName(GLOBAL_PREFIX)(n, context) def typ (n: String, context: ExternalTypeInfo): String = topLevelName(TYPE_PREFIX)(n, context) def field (n: String, @unused s: StructT): String = s"$n$FIELD_PREFIX" // Field names must preserve their equality from the Go level diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 5745091ec..8280614eb 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -135,8 +135,6 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole // They generate a unique PIdnNode whose name starts with "_" to not overlap any other identifiers private val goIdnDef = PIdnNodeEx(PIdnDef, term => Some(uniqueWildcard(PIdnDef, term).at(term))) private val goIdnDefList = PIdnNodeListEx(goIdnDef) - private val goIdnUnk = PIdnNodeEx(PIdnUnk, term => Some(uniqueWildcard(PIdnUnk, term).at(term))) - private val goIdnUnkList = PIdnNodeListEx(goIdnUnk) def uniqueWildcard[N](constructor : String => N, term : TerminalNode) : N = constructor("_"+term.getSymbol.getTokenIndex) //endregion diff --git a/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala b/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala index 3150dfaa1..57dc3c174 100644 --- a/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala +++ b/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala @@ -6,7 +6,7 @@ package viper.gobra.frontend.info -import viper.gobra.ast.frontend.{PCodeRoot, PEmbeddedDecl, PExpression, PFieldDecl, PGeneralForStmt, PFunctionDecl, PIdnNode, PIdnUse, PKeyedElement, PLabelUse, PMPredicateDecl, PMPredicateSig, PMember, PMethodDecl, PMethodSig, PMisc, PNode, PParameter, PPkgDef, PScope, PType} +import viper.gobra.ast.frontend.{PCodeRoot, PEmbeddedDecl, PExpression, PFieldDecl, PFunctionDecl, PFunctionOrMethodDecl, PGeneralForStmt, PIdnNode, PIdnUse, PKeyedElement, PLabelUse, PMPredicateDecl, PMPredicateSig, PMember, PMethodDecl, PMethodSig, PMisc, PNode, PParameter, PPkgDef, PScope, PType} import viper.gobra.frontend.PackageInfo import viper.gobra.frontend.info.base.BuiltInMemberTag.BuiltInMemberTag import viper.gobra.frontend.info.base.Type.{AbstractType, InterfaceT, StructT, Type} @@ -104,6 +104,9 @@ trait ExternalTypeInfo { /** if it exists, it returns the function that contains n */ def enclosingFunction(n: PNode): Option[PFunctionDecl] + /** if it exists, it returns the function or method that contains n */ + def enclosingFunctionOrMethod(n: PNode): Option[PFunctionOrMethodDecl] + /** if it exists, it returns the for loop node that contains 'n' with label 'label' */ def enclosingLabeledLoopNode(label: PLabelUse, n: PNode) : Option[PGeneralForStmt] diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala b/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala index d0ee22ccb..cc1a2863f 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala @@ -87,6 +87,8 @@ class TypeInfoImpl(final val tree: Info.GoTree, final val context: Info.Context, override def enclosingFunction(n: PNode): Option[PFunctionDecl] = tryEnclosingFunction(n) + override def enclosingFunctionOrMethod(n: PNode): Option[PFunctionOrMethodDecl] = tryEnclosingFunctionOrMethod(n) + override def enclosingLabeledLoopNode(label: PLabelUse, n: PNode) : Option[PGeneralForStmt] = enclosingLabeledLoop(label, n).toOption override def enclosingLoopNode(n: PNode) : Option[PGeneralForStmt] = enclosingLoopUntilOutline(n).toOption diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala index a6ab5bb46..46a2ea28a 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala @@ -72,6 +72,12 @@ trait Enclosing { this: TypeInfoImpl => lazy val tryEnclosingFunction: PNode => Option[PFunctionDecl] = down[Option[PFunctionDecl]](None) { case m: PFunctionDecl => Some(m) } + lazy val tryEnclosingFunctionOrMethod: PNode => Option[PFunctionOrMethodDecl] = + down[Option[PFunctionOrMethodDecl]](None) { + case f: PFunctionDecl => Some(f) + case m: PMethodDecl => Some(m) + } + lazy val tryEnclosingClosureImplementationProof: PNode => Option[PClosureImplProof] = down[Option[PClosureImplProof]](None) { case m: PClosureImplProof => Some(m) } diff --git a/src/main/scala/viper/gobra/reporting/StatsCollector.scala b/src/main/scala/viper/gobra/reporting/StatsCollector.scala index 887acae3b..c35fa4493 100644 --- a/src/main/scala/viper/gobra/reporting/StatsCollector.scala +++ b/src/main/scala/viper/gobra/reporting/StatsCollector.scala @@ -374,7 +374,7 @@ case class StatsCollector(reporter: GobraReporter) extends GobraReporter { isImported = isImported, isBuiltIn = isBuiltIn) // Consider the enclosing function, for closure declarations - case p: PClosureDecl => getMemberInformation(nodeTypeInfo.enclosingFunction(p).get, typeInfo, viperMember) + case p: PClosureDecl => getMemberInformation(nodeTypeInfo.enclosingFunctionOrMethod(p).get, typeInfo, viperMember) // Fallback to the node's code root if we can't match the node case p: PNode => getMemberInformation(nodeTypeInfo.codeRoot(p), typeInfo, viperMember) } From a2f10daaa650ff195fbc2824d04fb47acdd2da28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Sun, 13 Nov 2022 22:06:35 +0100 Subject: [PATCH 049/296] Linard's suggestion --- .../frontend/info/implementation/resolution/Enclosing.scala | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala index 46a2ea28a..c961885c2 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala @@ -73,10 +73,7 @@ trait Enclosing { this: TypeInfoImpl => down[Option[PFunctionDecl]](None) { case m: PFunctionDecl => Some(m) } lazy val tryEnclosingFunctionOrMethod: PNode => Option[PFunctionOrMethodDecl] = - down[Option[PFunctionOrMethodDecl]](None) { - case f: PFunctionDecl => Some(f) - case m: PMethodDecl => Some(m) - } + down[Option[PFunctionOrMethodDecl]](None) { case f: PFunctionOrMethodDecl => Some(f) } lazy val tryEnclosingClosureImplementationProof: PNode => Option[PClosureImplProof] = down[Option[PClosureImplProof]](None) { case m: PClosureImplProof => Some(m) } From a69b6cf0d0c3202ca489b9acd64ba721d14406f3 Mon Sep 17 00:00:00 2001 From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com> Date: Tue, 15 Nov 2022 15:19:31 +0100 Subject: [PATCH 050/296] reduce the exhale permissions from maps in range (#575) --- src/main/scala/viper/gobra/frontend/Desugar.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 019164565..0c0b590f2 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -172,7 +172,7 @@ object Desugar { private val nm = new NameManager - private val MapExhalePermDenom = 1000000 + private val MapExhalePermDenom = 200000000 type Identity = (Meta, TypeInfo) From 364277d6c114abf12e25e1ebe0bb570baa04c14e Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Tue, 15 Nov 2022 23:22:54 +0100 Subject: [PATCH 051/296] safety commit --- src/main/antlr4/GobraLexer.g4 | 1 + src/main/antlr4/GobraParser.g4 | 20 +- .../java/viper/gobra/frontend/GobraLexer.java | 1402 ++--- .../viper/gobra/frontend/GobraParser.java | 4675 +++++++++-------- .../frontend/GobraParserBaseVisitor.java | 70 + .../gobra/frontend/GobraParserVisitor.java | 64 + .../scala/viper/gobra/ast/frontend/Ast.scala | 1 - .../gobra/frontend/ParseTreeTranslator.scala | 68 +- .../encodings/adts/AdtEncoding.scala | 12 +- 9 files changed, 3531 insertions(+), 2782 deletions(-) diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4 index 313f215f0..03c45f0cb 100644 --- a/src/main/antlr4/GobraLexer.g4 +++ b/src/main/antlr4/GobraLexer.g4 @@ -67,6 +67,7 @@ GET : 'get'-> mode(NLSEMI); DOM : 'domain'-> mode(NLSEMI); AXIOM : 'axiom'-> mode(NLSEMI); ADT : 'adt' -> mode(NLSEMI); +MATCH : 'match' -> mode(NLSEMI); NONE : 'none' -> mode(NLSEMI); PRED : 'pred'; TYPE_OF : 'typeOf'-> mode(NLSEMI); diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index ca107ed37..1bc5a6d73 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -58,6 +58,7 @@ ghostStatement: GHOST statement #explicitGhostStatement | fold_stmt=(FOLD | UNFOLD) predicateAccess #foldStatement | kind=(ASSUME | ASSERT | INHALE | EXHALE) expression #proofStatement + | matchStmt #matchStmt_ ; // Auxiliary statements @@ -81,7 +82,9 @@ ghostPrimaryExpr: range | before | sConversion | optionNone | optionSome | optionGet - | permission; + | permission + | matchExpr + ; permission: WRITEPERM | NOPERM; @@ -125,6 +128,9 @@ access: ACCESS L_PAREN expression (COMMA expression)? R_PAREN; range: kind=(SEQ | SET | MSET) L_BRACKET expression DOT_DOT expression R_BRACKET; +matchExpr: MATCH expression L_CURLY matchExprClause* R_CURLY; +matchExprClause: matchCase COLON expression; + // Added directly to primaryExpr seqUpdExp: L_BRACKET (seqUpdClause (COMMA seqUpdClause)*) R_BRACKET; @@ -165,6 +171,18 @@ assertion: | expression ; +matchStmt: MATCH expression L_CURLY matchStmtClause* R_CURLY; +matchStmtClause: matchCase COLON statementList?; + +matchCase: CASE matchPattern | DEFAULT; +matchPattern + : QMARK IDENTIFIER #matchPatternBind + | literalType L_CURLY (matchPatternList COMMA?)? R_CURLY #matchPatternComposite + | expression #matchPatternValue + ; + +matchPatternList: matchPattern (COMMA matchPattern)*; + blockWithBodyParameterInfo: L_CURLY (SHARE identifierList eos)? statementList? R_CURLY; // Closures diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 6d4d8220a..de38da7fc 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -24,25 +24,25 @@ public class GobraLexer extends Lexer { UNION=30, INTERSECTION=31, SETMINUS=32, IMPLIES=33, WAND=34, APPLY=35, QMARK=36, L_PRED=37, R_PRED=38, SEQ=39, SET=40, MSET=41, DICT=42, OPT=43, LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, ADT=52, - NONE=53, PRED=54, TYPE_OF=55, IS_COMPARABLE=56, SHARE=57, ADDR_MOD=58, - DOT_DOT=59, SHARED=60, EXCLUSIVE=61, PREDICATE=62, WRITEPERM=63, NOPERM=64, - TRUSTED=65, OUTLINE=66, INIT_POST=67, IMPORT_PRE=68, PROOF=69, GHOST_EQUALS=70, - GHOST_NOT_EQUALS=71, WITH=72, BREAK=73, DEFAULT=74, FUNC=75, INTERFACE=76, - SELECT=77, CASE=78, DEFER=79, GO=80, MAP=81, STRUCT=82, CHAN=83, ELSE=84, - GOTO=85, PACKAGE=86, SWITCH=87, CONST=88, FALLTHROUGH=89, IF=90, RANGE=91, - TYPE=92, CONTINUE=93, FOR=94, IMPORT=95, RETURN=96, VAR=97, NIL_LIT=98, - IDENTIFIER=99, L_PAREN=100, R_PAREN=101, L_CURLY=102, R_CURLY=103, L_BRACKET=104, - R_BRACKET=105, ASSIGN=106, COMMA=107, SEMI=108, COLON=109, DOT=110, PLUS_PLUS=111, - MINUS_MINUS=112, DECLARE_ASSIGN=113, ELLIPSIS=114, LOGICAL_OR=115, LOGICAL_AND=116, - EQUALS=117, NOT_EQUALS=118, LESS=119, LESS_OR_EQUALS=120, GREATER=121, - GREATER_OR_EQUALS=122, OR=123, DIV=124, MOD=125, LSHIFT=126, RSHIFT=127, - BIT_CLEAR=128, EXCLAMATION=129, PLUS=130, MINUS=131, CARET=132, STAR=133, - AMPERSAND=134, RECEIVE=135, DECIMAL_LIT=136, BINARY_LIT=137, OCTAL_LIT=138, - HEX_LIT=139, HEX_FLOAT_LIT=140, IMAGINARY_LIT=141, RUNE_LIT=142, BYTE_VALUE=143, - OCTAL_BYTE_VALUE=144, HEX_BYTE_VALUE=145, LITTLE_U_VALUE=146, BIG_U_VALUE=147, - RAW_STRING_LIT=148, INTERPRETED_STRING_LIT=149, WS=150, COMMENT=151, TERMINATOR=152, - LINE_COMMENT=153, WS_NLSEMI=154, COMMENT_NLSEMI=155, LINE_COMMENT_NLSEMI=156, - EOS=157, OTHER=158; + MATCH=53, NONE=54, PRED=55, TYPE_OF=56, IS_COMPARABLE=57, SHARE=58, ADDR_MOD=59, + DOT_DOT=60, SHARED=61, EXCLUSIVE=62, PREDICATE=63, WRITEPERM=64, NOPERM=65, + TRUSTED=66, OUTLINE=67, INIT_POST=68, IMPORT_PRE=69, PROOF=70, GHOST_EQUALS=71, + GHOST_NOT_EQUALS=72, WITH=73, BREAK=74, DEFAULT=75, FUNC=76, INTERFACE=77, + SELECT=78, CASE=79, DEFER=80, GO=81, MAP=82, STRUCT=83, CHAN=84, ELSE=85, + GOTO=86, PACKAGE=87, SWITCH=88, CONST=89, FALLTHROUGH=90, IF=91, RANGE=92, + TYPE=93, CONTINUE=94, FOR=95, IMPORT=96, RETURN=97, VAR=98, NIL_LIT=99, + IDENTIFIER=100, L_PAREN=101, R_PAREN=102, L_CURLY=103, R_CURLY=104, L_BRACKET=105, + R_BRACKET=106, ASSIGN=107, COMMA=108, SEMI=109, COLON=110, DOT=111, PLUS_PLUS=112, + MINUS_MINUS=113, DECLARE_ASSIGN=114, ELLIPSIS=115, LOGICAL_OR=116, LOGICAL_AND=117, + EQUALS=118, NOT_EQUALS=119, LESS=120, LESS_OR_EQUALS=121, GREATER=122, + GREATER_OR_EQUALS=123, OR=124, DIV=125, MOD=126, LSHIFT=127, RSHIFT=128, + BIT_CLEAR=129, EXCLAMATION=130, PLUS=131, MINUS=132, CARET=133, STAR=134, + AMPERSAND=135, RECEIVE=136, DECIMAL_LIT=137, BINARY_LIT=138, OCTAL_LIT=139, + HEX_LIT=140, HEX_FLOAT_LIT=141, IMAGINARY_LIT=142, RUNE_LIT=143, BYTE_VALUE=144, + OCTAL_BYTE_VALUE=145, HEX_BYTE_VALUE=146, LITTLE_U_VALUE=147, BIG_U_VALUE=148, + RAW_STRING_LIT=149, INTERPRETED_STRING_LIT=150, WS=151, COMMENT=152, TERMINATOR=153, + LINE_COMMENT=154, WS_NLSEMI=155, COMMENT_NLSEMI=156, LINE_COMMENT_NLSEMI=157, + EOS=158, OTHER=159; public static final int NLSEMI=1; public static String[] channelNames = { @@ -61,7 +61,7 @@ private static String[] makeRuleNames() { "UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", - "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", + "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", @@ -94,18 +94,18 @@ private static String[] makeLiteralNames() { "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'", "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'", "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'", - "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'none'", "'pred'", - "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", - "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", - "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'", - "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", - "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'", - "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", - "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, - "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", - "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", - "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", - "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" + "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", "'none'", + "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", + "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", + "'outline'", "'initEnsures'", "'importRequires'", "'proof'", "'==='", + "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", "'select'", + "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", "'else'", + "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", "'if'", + "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'", + "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", + "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", + "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", + "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -117,7 +117,7 @@ private static String[] makeSymbolicNames() { "UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", - "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", + "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", @@ -214,7 +214,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a0\u05cb\b\1\b"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a1\u05d5\b\1\b"+ "\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n"+ "\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21"+ "\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30"+ @@ -237,671 +237,675 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+ "\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+ "\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+ - "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\3\2\3"+ - "\2\5\2\u015d\n\2\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0165\n\3\3\3\5\3\u0168\n"+ - "\3\3\3\5\3\u016b\n\3\3\3\3\3\3\3\3\3\5\3\u0171\n\3\5\3\u0173\n\3\3\4\3"+ - "\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6"+ - "\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+ - "\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3"+ - "\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3"+ - "\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16"+ - "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+ - "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21"+ - "\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+ - "\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26"+ - "\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30"+ - "\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32"+ - "\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34"+ - "\3\34\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37"+ - "\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3"+ - "!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3"+ - "\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*"+ - "\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-"+ - "\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3"+ - "\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3"+ - "\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3"+ - "\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3"+ - "\66\3\66\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\39\39\39"+ - "\39\39\39\39\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3<"+ - "\3<\3<\3=\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?"+ - "\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A"+ - "\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3D"+ - "\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E"+ - "\3E\3E\3E\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3H\3H\3H\3H\3I\3I\3I\3I\3I\3J"+ - "\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3M\3M\3M"+ - "\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P"+ - "\3P\3P\3Q\3Q\3Q\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U"+ - "\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X"+ - "\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3["+ - "\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3^\3^\3^\3^"+ - "\3^\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b"+ - "\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\7d\u0416\nd\fd\16d\u0419\13d\3d\3d\3"+ - "e\3e\3f\3f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3i\3j\3j\3j\3j\3k\3k\3l\3l\3m\3"+ - "m\3n\3n\3o\3o\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3r\3r\3r\3s\3s\3s\3s\3t\3"+ - "t\3t\3u\3u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3y\3y\3y\3z\3z\3{\3{\3{\3|\3|\3"+ - "}\3}\3~\3~\3\177\3\177\3\177\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3"+ - "\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085"+ - "\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+ - "\3\u0089\5\u0089\u0481\n\u0089\3\u0089\7\u0089\u0484\n\u0089\f\u0089\16"+ - "\u0089\u0487\13\u0089\5\u0089\u0489\n\u0089\3\u0089\3\u0089\3\u008a\3"+ - "\u008a\3\u008a\5\u008a\u0490\n\u008a\3\u008a\6\u008a\u0493\n\u008a\r\u008a"+ - "\16\u008a\u0494\3\u008a\3\u008a\3\u008b\3\u008b\5\u008b\u049b\n\u008b"+ - "\3\u008b\5\u008b\u049e\n\u008b\3\u008b\6\u008b\u04a1\n\u008b\r\u008b\16"+ - "\u008b\u04a2\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\5\u008c\u04aa\n\u008c"+ - "\3\u008c\6\u008c\u04ad\n\u008c\r\u008c\16\u008c\u04ae\3\u008c\3\u008c"+ - "\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\5\u008e\u04b9\n\u008e"+ - "\3\u008e\6\u008e\u04bc\n\u008e\r\u008e\16\u008e\u04bd\3\u008e\3\u008e"+ - "\5\u008e\u04c2\n\u008e\3\u008e\7\u008e\u04c5\n\u008e\f\u008e\16\u008e"+ - "\u04c8\13\u008e\5\u008e\u04ca\n\u008e\3\u008e\3\u008e\3\u008e\5\u008e"+ - "\u04cf\n\u008e\3\u008e\7\u008e\u04d2\n\u008e\f\u008e\16\u008e\u04d5\13"+ - "\u008e\5\u008e\u04d7\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3"+ - "\u0090\3\u0090\3\u0090\3\u0090\5\u0090\u04e2\n\u0090\3\u0090\3\u0090\3"+ - "\u0090\3\u0090\3\u0091\3\u0091\3\u0091\5\u0091\u04eb\n\u0091\3\u0091\3"+ - "\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\5\u0093\u04f5\n"+ - "\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095"+ - "\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+ - "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+ - "\3\u0097\3\u0097\3\u0098\3\u0098\7\u0098\u0515\n\u0098\f\u0098\16\u0098"+ - "\u0518\13\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099"+ - "\7\u0099\u0521\n\u0099\f\u0099\16\u0099\u0524\13\u0099\3\u0099\3\u0099"+ - "\3\u0099\3\u0099\3\u009a\6\u009a\u052b\n\u009a\r\u009a\16\u009a\u052c"+ - "\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\7\u009b\u0535\n\u009b"+ - "\f\u009b\16\u009b\u0538\13\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b"+ - "\3\u009c\6\u009c\u0540\n\u009c\r\u009c\16\u009c\u0541\3\u009c\3\u009c"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\7\u009d\u054a\n\u009d\f\u009d\16\u009d"+ - "\u054d\13\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e"+ - "\u0555\n\u009e\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+ - "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+ - "\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f\3\u009f"+ - "\3\u009f\5\u009f\u0571\n\u009f\3\u00a0\3\u00a0\5\u00a0\u0575\n\u00a0\3"+ - "\u00a0\7\u00a0\u0578\n\u00a0\f\u00a0\16\u00a0\u057b\13\u00a0\3\u00a1\3"+ - "\u00a1\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\5\u00a4\u0585\n"+ - "\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\5\u00a5\u058b\n\u00a5\3\u00a6\3"+ - "\u00a6\3\u00a7\3\u00a7\3\u00a8\6\u00a8\u0592\n\u00a8\r\u00a8\16\u00a8"+ - "\u0593\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9\u059c\n"+ - "\u00a9\f\u00a9\16\u00a9\u059f\13\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9"+ - "\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\7\u00aa\u05aa\n\u00aa\f\u00aa"+ - "\16\u00aa\u05ad\13\u00aa\3\u00aa\3\u00aa\3\u00ab\6\u00ab\u05b2\n\u00ab"+ - "\r\u00ab\16\u00ab\u05b3\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\7\u00ab"+ - "\u05bb\n\u00ab\f\u00ab\16\u00ab\u05be\13\u00ab\3\u00ab\3\u00ab\3\u00ab"+ - "\5\u00ab\u05c3\n\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac"+ - "\3\u00ac\5\u0536\u059d\u05bc\2\u00ad\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22"+ - "\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30"+ - "\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\"+ - "/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084"+ - "C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I\u0092J\u0094K\u0096L\u0098"+ - "M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00ac"+ - "W\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0"+ - "a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4"+ - "k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8"+ - "u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc"+ - "\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104\u0083\u0106\u0084\u0108"+ - "\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110\u0089\u0112\u008a\u0114"+ - "\u008b\u0116\u008c\u0118\u008d\u011a\u008e\u011c\2\u011e\2\u0120\u008f"+ - "\u0122\2\u0124\u0090\u0126\u0091\u0128\u0092\u012a\u0093\u012c\u0094\u012e"+ - "\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136\u0099\u0138\u009a\u013a"+ - "\u009b\u013c\2\u013e\2\u0140\2\u0142\2\u0144\2\u0146\2\u0148\2\u014a\2"+ - "\u014c\2\u014e\2\u0150\u009c\u0152\u009d\u0154\u009e\u0156\u009f\u0158"+ - "\u00a0\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--"+ - "//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13\2$$))"+ - "^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;\2\u0662"+ - "\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8\2\u09f1"+ - "\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1\2\u0c68"+ - "\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52\2\u0e5b"+ - "\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b\2\u17e2"+ - "\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82\2\u1a8b"+ - "\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b\2\u1c52"+ - "\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2\2\ua9db"+ - "\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b\2\u04a2"+ - "\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2\3\u11db"+ - "\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b\3\u16c2"+ - "\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52\3\u1d5b"+ - "\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b\3\u024b"+ - "\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc\2\u00c2"+ - "\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2\2\u02e6"+ - "\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379\2\u037c"+ - "\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e\2\u038e"+ - "\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531\2\u0533"+ - "\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2\2\u05f4"+ - "\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7\2\u06e7"+ - "\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712\2\u0712"+ - "\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec\2\u07f6"+ - "\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826\2\u0826"+ - "\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6\2\u08b8"+ - "\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a\2\u0963"+ - "\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa\2\u09ac"+ - "\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0\2\u09d0"+ - "\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe\2\u0a07"+ - "\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34\2\u0a35"+ - "\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60\2\u0a74"+ - "\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac\2\u0ab2"+ - "\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2\2\u0ae2"+ - "\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15\2\u0b2a"+ - "\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f\2\u0b5e"+ - "\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87\2\u0b8c"+ - "\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e\2\u0ba0"+ - "\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2\2\u0bd2"+ - "\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b\2\u0c3f"+ - "\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87\2\u0c8e"+ - "\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb\2\u0cbf"+ - "\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07\2\u0d0e"+ - "\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50\2\u0d56"+ - "\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c\2\u0db3"+ - "\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32\2\u0e34"+ - "\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89\2\u0e8a"+ - "\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1\2\u0ea3"+ - "\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf\2\u0eb2"+ - "\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8\2\u0ede"+ - "\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a\2\u0f8e"+ - "\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f\2\u1063"+ - "\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090\2\u1090"+ - "\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc\2\u10fe"+ - "\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c\2\u125f"+ - "\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7\2\u12ba"+ - "\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da\2\u1312"+ - "\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7\2\u13fa"+ - "\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2\2\u16ec"+ - "\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733\2\u1742"+ - "\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9\2\u17d9"+ - "\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa\2\u18ac"+ - "\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972\2\u1976"+ - "\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56\2\u1aa9"+ - "\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0\2\u1bb1"+ - "\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f\2\u1c82"+ - "\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02\2\u1dc1"+ - "\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f\2\u1f52"+ - "\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61\2\u1f7f"+ - "\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6\2\u1fc8"+ - "\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4\2\u1ff6"+ - "\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e\2\u2104"+ - "\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b\2\u211f"+ - "\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f\2\u2131"+ - "\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185\2\u2186"+ - "\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0\2\u2cf4"+ - "\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32\2\u2d69"+ - "\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0\2\u2db2"+ - "\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2\2\u2dd8"+ - "\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037\2\u303d"+ - "\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe\2\u3101"+ - "\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201\2\u3402"+ - "\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502\2\ua60e"+ - "\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f\2\ua6a2"+ - "\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2\2\ua7b9"+ - "\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824\2\ua842"+ - "\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff\2\ua8ff"+ - "\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4\2\ua9d1"+ - "\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02\2\uaa2a"+ - "\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c\2\uaa80"+ - "\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2\2\uaac2"+ - "\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6\2\uab03"+ - "\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a\2\uab30"+ - "\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5\2\ud7b2"+ - "\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02\2\ufb08"+ - "\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38\2\ufb3a"+ - "\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48\2\ufbb3"+ - "\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd\2\ufe72"+ - "\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68\2\uffc0"+ - "\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde\2\2\3"+ - "\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e\3\u02a2"+ - "\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352\3\u0377"+ - "\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f\3\u04b2"+ - "\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602\3\u0738"+ - "\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a\3\u080c"+ - "\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862\3\u0878"+ - "\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917\3\u0922"+ - "\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12\3\u0a15"+ - "\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e\3\u0ac2"+ - "\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62\3\u0b74"+ - "\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4\3\u1005"+ - "\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152\3\u1174"+ - "\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc\3\u11de"+ - "\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a\3\u128a"+ - "\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0\3\u1307"+ - "\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334\3\u1335"+ - "\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363\3\u1402"+ - "\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9\3\u14c9"+ - "\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646\3\u1682"+ - "\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02\3\u1a02"+ - "\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85\3\u1a88"+ - "\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42\3\u1c42"+ - "\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32\3\u1d48"+ - "\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402\3\u4648"+ - "\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31\3\u6b42"+ - "\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52\3\u6f52"+ - "\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4\3\ub002"+ - "\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82\3\ubc8a"+ - "\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1\3\ud4a4"+ - "\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd\3\ud4bd"+ - "\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516\3\ud518"+ - "\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548\3\ud548"+ - "\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc\3\ud6de"+ - "\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752\3\ud770"+ - "\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd\3\ue802"+ - "\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23\3\uee24"+ - "\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39\3\uee3b"+ - "\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b\3\uee4b"+ - "\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56\3\uee59"+ - "\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61\3\uee61"+ - "\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74\3\uee76"+ - "\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d\3\uee9d"+ - "\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4\ua702\4"+ - "\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802\4\ufa1f"+ - "\4\u05f6\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2"+ - "\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3"+ - "\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2"+ - "$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60"+ - "\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2"+ - "\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H"+ - "\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2"+ - "\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2"+ - "\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2"+ - "n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3"+ - "\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3"+ - "\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2"+ - "\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2\2\2\u0096"+ - "\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2"+ - "\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8"+ - "\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0\3\2\2"+ - "\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2\2\2\u00ba"+ - "\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2\3\2\2"+ - "\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2\2\2\u00cc"+ - "\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4\3\2\2"+ - "\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2\2\2\u00de"+ - "\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6\3\2\2"+ - "\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2\2\2\u00f0"+ - "\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8\3\2\2"+ - "\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2\2\2\u0102"+ - "\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a\3\2\2"+ - "\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2\2\2\u0114"+ - "\3\2\2\2\2\u0116\3\2\2\2\2\u0118\3\2\2\2\2\u011a\3\2\2\2\2\u0120\3\2\2"+ - "\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2\2\2\u012c"+ - "\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134\3\2\2"+ - "\2\2\u0136\3\2\2\2\2\u0138\3\2\2\2\2\u013a\3\2\2\2\3\u0150\3\2\2\2\3\u0152"+ - "\3\2\2\2\3\u0154\3\2\2\2\3\u0156\3\2\2\2\3\u0158\3\2\2\2\4\u015c\3\2\2"+ - "\2\6\u0172\3\2\2\2\b\u0174\3\2\2\2\n\u017b\3\2\2\2\f\u0183\3\2\2\2\16"+ - "\u018a\3\2\2\2\20\u0191\3\2\2\2\22\u0198\3\2\2\2\24\u019f\3\2\2\2\26\u01a8"+ - "\3\2\2\2\30\u01b2\3\2\2\2\32\u01ba\3\2\2\2\34\u01c4\3\2\2\2\36\u01d0\3"+ - "\2\2\2 \u01d7\3\2\2\2\"\u01e2\3\2\2\2$\u01e5\3\2\2\2&\u01eb\3\2\2\2(\u01f4"+ - "\3\2\2\2*\u01f9\3\2\2\2,\u0200\3\2\2\2.\u0207\3\2\2\2\60\u020d\3\2\2\2"+ - "\62\u0212\3\2\2\2\64\u0219\3\2\2\2\66\u0223\3\2\2\28\u0229\3\2\2\2:\u022c"+ - "\3\2\2\2<\u022e\3\2\2\2>\u0235\3\2\2\2@\u023b\3\2\2\2B\u0248\3\2\2\2D"+ - "\u0251\3\2\2\2F\u0255\3\2\2\2H\u0259\3\2\2\2J\u025f\3\2\2\2L\u0261\3\2"+ - "\2\2N\u0264\3\2\2\2P\u0269\3\2\2\2R\u026f\3\2\2\2T\u0275\3\2\2\2V\u027c"+ - "\3\2\2\2X\u0283\3\2\2\2Z\u028c\3\2\2\2\\\u0292\3\2\2\2^\u0298\3\2\2\2"+ - "`\u029f\3\2\2\2b\u02a5\3\2\2\2d\u02ac\3\2\2\2f\u02b2\3\2\2\2h\u02bb\3"+ - "\2\2\2j\u02c3\3\2\2\2l\u02c9\3\2\2\2n\u02d0\3\2\2\2p\u02d5\3\2\2\2r\u02de"+ - "\3\2\2\2t\u02ed\3\2\2\2v\u02f3\3\2\2\2x\u02f7\3\2\2\2z\u02fa\3\2\2\2|"+ - "\u0301\3\2\2\2~\u030b\3\2\2\2\u0080\u0315\3\2\2\2\u0082\u0321\3\2\2\2"+ - "\u0084\u032a\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u033c\3\2\2\2\u008a\u0348"+ - "\3\2\2\2\u008c\u0357\3\2\2\2\u008e\u035d\3\2\2\2\u0090\u0361\3\2\2\2\u0092"+ - "\u0365\3\2\2\2\u0094\u036a\3\2\2\2\u0096\u0372\3\2\2\2\u0098\u037a\3\2"+ - "\2\2\u009a\u037f\3\2\2\2\u009c\u0389\3\2\2\2\u009e\u0390\3\2\2\2\u00a0"+ - "\u0395\3\2\2\2\u00a2\u039b\3\2\2\2\u00a4\u039e\3\2\2\2\u00a6\u03a2\3\2"+ - "\2\2\u00a8\u03a9\3\2\2\2\u00aa\u03ae\3\2\2\2\u00ac\u03b3\3\2\2\2\u00ae"+ - "\u03b8\3\2\2\2\u00b0\u03c0\3\2\2\2\u00b2\u03c7\3\2\2\2\u00b4\u03cd\3\2"+ - "\2\2\u00b6\u03db\3\2\2\2\u00b8\u03de\3\2\2\2\u00ba\u03e4\3\2\2\2\u00bc"+ - "\u03e9\3\2\2\2\u00be\u03f4\3\2\2\2\u00c0\u03f8\3\2\2\2\u00c2\u03ff\3\2"+ - "\2\2\u00c4\u0408\3\2\2\2\u00c6\u040c\3\2\2\2\u00c8\u0412\3\2\2\2\u00ca"+ - "\u041c\3\2\2\2\u00cc\u041e\3\2\2\2\u00ce\u0422\3\2\2\2\u00d0\u0424\3\2"+ - "\2\2\u00d2\u0428\3\2\2\2\u00d4\u042a\3\2\2\2\u00d6\u042e\3\2\2\2\u00d8"+ - "\u0430\3\2\2\2\u00da\u0432\3\2\2\2\u00dc\u0434\3\2\2\2\u00de\u0436\3\2"+ - "\2\2\u00e0\u0438\3\2\2\2\u00e2\u043d\3\2\2\2\u00e4\u0442\3\2\2\2\u00e6"+ - "\u0445\3\2\2\2\u00e8\u0449\3\2\2\2\u00ea\u044c\3\2\2\2\u00ec\u044f\3\2"+ - "\2\2\u00ee\u0452\3\2\2\2\u00f0\u0455\3\2\2\2\u00f2\u0457\3\2\2\2\u00f4"+ - "\u045a\3\2\2\2\u00f6\u045c\3\2\2\2\u00f8\u045f\3\2\2\2\u00fa\u0461\3\2"+ - "\2\2\u00fc\u0463\3\2\2\2\u00fe\u0465\3\2\2\2\u0100\u0468\3\2\2\2\u0102"+ - "\u046b\3\2\2\2\u0104\u046e\3\2\2\2\u0106\u0470\3\2\2\2\u0108\u0472\3\2"+ - "\2\2\u010a\u0474\3\2\2\2\u010c\u0476\3\2\2\2\u010e\u0478\3\2\2\2\u0110"+ - "\u047a\3\2\2\2\u0112\u0488\3\2\2\2\u0114\u048c\3\2\2\2\u0116\u0498\3\2"+ - "\2\2\u0118\u04a6\3\2\2\2\u011a\u04b2\3\2\2\2\u011c\u04d6\3\2\2\2\u011e"+ - "\u04d8\3\2\2\2\u0120\u04e1\3\2\2\2\u0122\u04e7\3\2\2\2\u0124\u04ee\3\2"+ - "\2\2\u0126\u04f4\3\2\2\2\u0128\u04f6\3\2\2\2\u012a\u04fb\3\2\2\2\u012c"+ - "\u0500\3\2\2\2\u012e\u0507\3\2\2\2\u0130\u0512\3\2\2\2\u0132\u051d\3\2"+ - "\2\2\u0134\u052a\3\2\2\2\u0136\u0530\3\2\2\2\u0138\u053f\3\2\2\2\u013a"+ - "\u0545\3\2\2\2\u013c\u0554\3\2\2\2\u013e\u0556\3\2\2\2\u0140\u0572\3\2"+ - "\2\2\u0142\u057c\3\2\2\2\u0144\u057e\3\2\2\2\u0146\u0580\3\2\2\2\u0148"+ - "\u0582\3\2\2\2\u014a\u058a\3\2\2\2\u014c\u058c\3\2\2\2\u014e\u058e\3\2"+ - "\2\2\u0150\u0591\3\2\2\2\u0152\u0597\3\2\2\2\u0154\u05a5\3\2\2\2\u0156"+ - "\u05c2\3\2\2\2\u0158\u05c6\3\2\2\2\u015a\u015d\5\6\3\2\u015b\u015d\5\u011a"+ - "\u008d\2\u015c\u015a\3\2\2\2\u015c\u015b\3\2\2\2\u015d\u015e\3\2\2\2\u015e"+ - "\u015f\b\2\2\2\u015f\5\3\2\2\2\u0160\u016a\5\u0140\u00a0\2\u0161\u0162"+ - "\7\60\2\2\u0162\u0164\6\3\2\2\u0163\u0165\5\u0140\u00a0\2\u0164\u0163"+ - "\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0167\3\2\2\2\u0166\u0168\5\u0148\u00a4"+ - "\2\u0167\u0166\3\2\2\2\u0167\u0168\3\2\2\2\u0168\u016b\3\2\2\2\u0169\u016b"+ - "\5\u0148\u00a4\2\u016a\u0161\3\2\2\2\u016a\u0169\3\2\2\2\u016b\u0173\3"+ - "\2\2\2\u016c\u016d\7\60\2\2\u016d\u016e\6\3\3\2\u016e\u0170\5\u0140\u00a0"+ - "\2\u016f\u0171\5\u0148\u00a4\2\u0170\u016f\3\2\2\2\u0170\u0171\3\2\2\2"+ - "\u0171\u0173\3\2\2\2\u0172\u0160\3\2\2\2\u0172\u016c\3\2\2\2\u0173\7\3"+ - "\2\2\2\u0174\u0175\7v\2\2\u0175\u0176\7t\2\2\u0176\u0177\7w\2\2\u0177"+ - "\u0178\7g\2\2\u0178\u0179\3\2\2\2\u0179\u017a\b\4\2\2\u017a\t\3\2\2\2"+ - "\u017b\u017c\7h\2\2\u017c\u017d\7c\2\2\u017d\u017e\7n\2\2\u017e\u017f"+ - "\7u\2\2\u017f\u0180\7g\2\2\u0180\u0181\3\2\2\2\u0181\u0182\b\5\2\2\u0182"+ - "\13\3\2\2\2\u0183\u0184\7c\2\2\u0184\u0185\7u\2\2\u0185\u0186\7u\2\2\u0186"+ - "\u0187\7g\2\2\u0187\u0188\7t\2\2\u0188\u0189\7v\2\2\u0189\r\3\2\2\2\u018a"+ - "\u018b\7c\2\2\u018b\u018c\7u\2\2\u018c\u018d\7u\2\2\u018d\u018e\7w\2\2"+ - "\u018e\u018f\7o\2\2\u018f\u0190\7g\2\2\u0190\17\3\2\2\2\u0191\u0192\7"+ - "k\2\2\u0192\u0193\7p\2\2\u0193\u0194\7j\2\2\u0194\u0195\7c\2\2\u0195\u0196"+ - "\7n\2\2\u0196\u0197\7g\2\2\u0197\21\3\2\2\2\u0198\u0199\7g\2\2\u0199\u019a"+ - "\7z\2\2\u019a\u019b\7j\2\2\u019b\u019c\7c\2\2\u019c\u019d\7n\2\2\u019d"+ - "\u019e\7g\2\2\u019e\23\3\2\2\2\u019f\u01a0\7t\2\2\u01a0\u01a1\7g\2\2\u01a1"+ - "\u01a2\7s\2\2\u01a2\u01a3\7w\2\2\u01a3\u01a4\7k\2\2\u01a4\u01a5\7t\2\2"+ - "\u01a5\u01a6\7g\2\2\u01a6\u01a7\7u\2\2\u01a7\25\3\2\2\2\u01a8\u01a9\7"+ - "r\2\2\u01a9\u01aa\7t\2\2\u01aa\u01ab\7g\2\2\u01ab\u01ac\7u\2\2\u01ac\u01ad"+ - "\7g\2\2\u01ad\u01ae\7t\2\2\u01ae\u01af\7x\2\2\u01af\u01b0\7g\2\2\u01b0"+ - "\u01b1\7u\2\2\u01b1\27\3\2\2\2\u01b2\u01b3\7g\2\2\u01b3\u01b4\7p\2\2\u01b4"+ - "\u01b5\7u\2\2\u01b5\u01b6\7w\2\2\u01b6\u01b7\7t\2\2\u01b7\u01b8\7g\2\2"+ - "\u01b8\u01b9\7u\2\2\u01b9\31\3\2\2\2\u01ba\u01bb\7k\2\2\u01bb\u01bc\7"+ - "p\2\2\u01bc\u01bd\7x\2\2\u01bd\u01be\7c\2\2\u01be\u01bf\7t\2\2\u01bf\u01c0"+ - "\7k\2\2\u01c0\u01c1\7c\2\2\u01c1\u01c2\7p\2\2\u01c2\u01c3\7v\2\2\u01c3"+ - "\33\3\2\2\2\u01c4\u01c5\7f\2\2\u01c5\u01c6\7g\2\2\u01c6\u01c7\7e\2\2\u01c7"+ - "\u01c8\7t\2\2\u01c8\u01c9\7g\2\2\u01c9\u01ca\7c\2\2\u01ca\u01cb\7u\2\2"+ - "\u01cb\u01cc\7g\2\2\u01cc\u01cd\7u\2\2\u01cd\u01ce\3\2\2\2\u01ce\u01cf"+ - "\b\16\2\2\u01cf\35\3\2\2\2\u01d0\u01d1\7r\2\2\u01d1\u01d2\7w\2\2\u01d2"+ - "\u01d3\7t\2\2\u01d3\u01d4\7g\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d6\b\17"+ - "\2\2\u01d6\37\3\2\2\2\u01d7\u01d8\7k\2\2\u01d8\u01d9\7o\2\2\u01d9\u01da"+ - "\7r\2\2\u01da\u01db\7n\2\2\u01db\u01dc\7g\2\2\u01dc\u01dd\7o\2\2\u01dd"+ - "\u01de\7g\2\2\u01de\u01df\7p\2\2\u01df\u01e0\7v\2\2\u01e0\u01e1\7u\2\2"+ - "\u01e1!\3\2\2\2\u01e2\u01e3\7c\2\2\u01e3\u01e4\7u\2\2\u01e4#\3\2\2\2\u01e5"+ - "\u01e6\7q\2\2\u01e6\u01e7\7n\2\2\u01e7\u01e8\7f\2\2\u01e8\u01e9\3\2\2"+ - "\2\u01e9\u01ea\b\22\2\2\u01ea%\3\2\2\2\u01eb\u01ec\7d\2\2\u01ec\u01ed"+ - "\7g\2\2\u01ed\u01ee\7h\2\2\u01ee\u01ef\7q\2\2\u01ef\u01f0\7t\2\2\u01f0"+ - "\u01f1\7g\2\2\u01f1\u01f2\3\2\2\2\u01f2\u01f3\b\23\2\2\u01f3\'\3\2\2\2"+ - "\u01f4\u01f5\7%\2\2\u01f5\u01f6\7n\2\2\u01f6\u01f7\7j\2\2\u01f7\u01f8"+ - "\7u\2\2\u01f8)\3\2\2\2\u01f9\u01fa\7h\2\2\u01fa\u01fb\7q\2\2\u01fb\u01fc"+ - "\7t\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe\7n\2\2\u01fe\u01ff\7n\2\2\u01ff"+ - "+\3\2\2\2\u0200\u0201\7g\2\2\u0201\u0202\7z\2\2\u0202\u0203\7k\2\2\u0203"+ - "\u0204\7u\2\2\u0204\u0205\7v\2\2\u0205\u0206\7u\2\2\u0206-\3\2\2\2\u0207"+ - "\u0208\7c\2\2\u0208\u0209\7e\2\2\u0209\u020a\7e\2\2\u020a\u020b\3\2\2"+ - "\2\u020b\u020c\b\27\2\2\u020c/\3\2\2\2\u020d\u020e\7h\2\2\u020e\u020f"+ - "\7q\2\2\u020f\u0210\7n\2\2\u0210\u0211\7f\2\2\u0211\61\3\2\2\2\u0212\u0213"+ - "\7w\2\2\u0213\u0214\7p\2\2\u0214\u0215\7h\2\2\u0215\u0216\7q\2\2\u0216"+ - "\u0217\7n\2\2\u0217\u0218\7f\2\2\u0218\63\3\2\2\2\u0219\u021a\7w\2\2\u021a"+ - "\u021b\7p\2\2\u021b\u021c\7h\2\2\u021c\u021d\7q\2\2\u021d\u021e\7n\2\2"+ - "\u021e\u021f\7f\2\2\u021f\u0220\7k\2\2\u0220\u0221\7p\2\2\u0221\u0222"+ - "\7i\2\2\u0222\65\3\2\2\2\u0223\u0224\7i\2\2\u0224\u0225\7j\2\2\u0225\u0226"+ - "\7q\2\2\u0226\u0227\7u\2\2\u0227\u0228\7v\2\2\u0228\67\3\2\2\2\u0229\u022a"+ - "\7k\2\2\u022a\u022b\7p\2\2\u022b9\3\2\2\2\u022c\u022d\7%\2\2\u022d;\3"+ - "\2\2\2\u022e\u022f\7u\2\2\u022f\u0230\7w\2\2\u0230\u0231\7d\2\2\u0231"+ - "\u0232\7u\2\2\u0232\u0233\7g\2\2\u0233\u0234\7v\2\2\u0234=\3\2\2\2\u0235"+ - "\u0236\7w\2\2\u0236\u0237\7p\2\2\u0237\u0238\7k\2\2\u0238\u0239\7q\2\2"+ - "\u0239\u023a\7p\2\2\u023a?\3\2\2\2\u023b\u023c\7k\2\2\u023c\u023d\7p\2"+ - "\2\u023d\u023e\7v\2\2\u023e\u023f\7g\2\2\u023f\u0240\7t\2\2\u0240\u0241"+ - "\7u\2\2\u0241\u0242\7g\2\2\u0242\u0243\7e\2\2\u0243\u0244\7v\2\2\u0244"+ - "\u0245\7k\2\2\u0245\u0246\7q\2\2\u0246\u0247\7p\2\2\u0247A\3\2\2\2\u0248"+ - "\u0249\7u\2\2\u0249\u024a\7g\2\2\u024a\u024b\7v\2\2\u024b\u024c\7o\2\2"+ - "\u024c\u024d\7k\2\2\u024d\u024e\7p\2\2\u024e\u024f\7w\2\2\u024f\u0250"+ - "\7u\2\2\u0250C\3\2\2\2\u0251\u0252\7?\2\2\u0252\u0253\7?\2\2\u0253\u0254"+ - "\7@\2\2\u0254E\3\2\2\2\u0255\u0256\7/\2\2\u0256\u0257\7/\2\2\u0257\u0258"+ - "\7,\2\2\u0258G\3\2\2\2\u0259\u025a\7c\2\2\u025a\u025b\7r\2\2\u025b\u025c"+ - "\7r\2\2\u025c\u025d\7n\2\2\u025d\u025e\7{\2\2\u025eI\3\2\2\2\u025f\u0260"+ - "\7A\2\2\u0260K\3\2\2\2\u0261\u0262\7#\2\2\u0262\u0263\7>\2\2\u0263M\3"+ - "\2\2\2\u0264\u0265\7#\2\2\u0265\u0266\7@\2\2\u0266\u0267\3\2\2\2\u0267"+ - "\u0268\b\'\2\2\u0268O\3\2\2\2\u0269\u026a\7u\2\2\u026a\u026b\7g\2\2\u026b"+ - "\u026c\7s\2\2\u026c\u026d\3\2\2\2\u026d\u026e\b(\2\2\u026eQ\3\2\2\2\u026f"+ - "\u0270\7u\2\2\u0270\u0271\7g\2\2\u0271\u0272\7v\2\2\u0272\u0273\3\2\2"+ - "\2\u0273\u0274\b)\2\2\u0274S\3\2\2\2\u0275\u0276\7o\2\2\u0276\u0277\7"+ - "u\2\2\u0277\u0278\7g\2\2\u0278\u0279\7v\2\2\u0279\u027a\3\2\2\2\u027a"+ - "\u027b\b*\2\2\u027bU\3\2\2\2\u027c\u027d\7f\2\2\u027d\u027e\7k\2\2\u027e"+ - "\u027f\7e\2\2\u027f\u0280\7v\2\2\u0280\u0281\3\2\2\2\u0281\u0282\b+\2"+ - "\2\u0282W\3\2\2\2\u0283\u0284\7q\2\2\u0284\u0285\7r\2\2\u0285\u0286\7"+ - "v\2\2\u0286\u0287\7k\2\2\u0287\u0288\7q\2\2\u0288\u0289\7p\2\2\u0289\u028a"+ - "\3\2\2\2\u028a\u028b\b,\2\2\u028bY\3\2\2\2\u028c\u028d\7n\2\2\u028d\u028e"+ - "\7g\2\2\u028e\u028f\7p\2\2\u028f\u0290\3\2\2\2\u0290\u0291\b-\2\2\u0291"+ - "[\3\2\2\2\u0292\u0293\7p\2\2\u0293\u0294\7g\2\2\u0294\u0295\7y\2\2\u0295"+ - "\u0296\3\2\2\2\u0296\u0297\b.\2\2\u0297]\3\2\2\2\u0298\u0299\7o\2\2\u0299"+ - "\u029a\7c\2\2\u029a\u029b\7m\2\2\u029b\u029c\7g\2\2\u029c\u029d\3\2\2"+ - "\2\u029d\u029e\b/\2\2\u029e_\3\2\2\2\u029f\u02a0\7e\2\2\u02a0\u02a1\7"+ - "c\2\2\u02a1\u02a2\7r\2\2\u02a2\u02a3\3\2\2\2\u02a3\u02a4\b\60\2\2\u02a4"+ - "a\3\2\2\2\u02a5\u02a6\7u\2\2\u02a6\u02a7\7q\2\2\u02a7\u02a8\7o\2\2\u02a8"+ - "\u02a9\7g\2\2\u02a9\u02aa\3\2\2\2\u02aa\u02ab\b\61\2\2\u02abc\3\2\2\2"+ - "\u02ac\u02ad\7i\2\2\u02ad\u02ae\7g\2\2\u02ae\u02af\7v\2\2\u02af\u02b0"+ - "\3\2\2\2\u02b0\u02b1\b\62\2\2\u02b1e\3\2\2\2\u02b2\u02b3\7f\2\2\u02b3"+ - "\u02b4\7q\2\2\u02b4\u02b5\7o\2\2\u02b5\u02b6\7c\2\2\u02b6\u02b7\7k\2\2"+ - "\u02b7\u02b8\7p\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02ba\b\63\2\2\u02bag\3"+ - "\2\2\2\u02bb\u02bc\7c\2\2\u02bc\u02bd\7z\2\2\u02bd\u02be\7k\2\2\u02be"+ - "\u02bf\7q\2\2\u02bf\u02c0\7o\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\b\64"+ - "\2\2\u02c2i\3\2\2\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7f\2\2\u02c5\u02c6"+ - "\7v\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c8\b\65\2\2\u02c8k\3\2\2\2\u02c9"+ - "\u02ca\7p\2\2\u02ca\u02cb\7q\2\2\u02cb\u02cc\7p\2\2\u02cc\u02cd\7g\2\2"+ - "\u02cd\u02ce\3\2\2\2\u02ce\u02cf\b\66\2\2\u02cfm\3\2\2\2\u02d0\u02d1\7"+ - "r\2\2\u02d1\u02d2\7t\2\2\u02d2\u02d3\7g\2\2\u02d3\u02d4\7f\2\2\u02d4o"+ - "\3\2\2\2\u02d5\u02d6\7v\2\2\u02d6\u02d7\7{\2\2\u02d7\u02d8\7r\2\2\u02d8"+ - "\u02d9\7g\2\2\u02d9\u02da\7Q\2\2\u02da\u02db\7h\2\2\u02db\u02dc\3\2\2"+ - "\2\u02dc\u02dd\b8\2\2\u02ddq\3\2\2\2\u02de\u02df\7k\2\2\u02df\u02e0\7"+ - "u\2\2\u02e0\u02e1\7E\2\2\u02e1\u02e2\7q\2\2\u02e2\u02e3\7o\2\2\u02e3\u02e4"+ - "\7r\2\2\u02e4\u02e5\7c\2\2\u02e5\u02e6\7t\2\2\u02e6\u02e7\7c\2\2\u02e7"+ - "\u02e8\7d\2\2\u02e8\u02e9\7n\2\2\u02e9\u02ea\7g\2\2\u02ea\u02eb\3\2\2"+ - "\2\u02eb\u02ec\b9\2\2\u02ecs\3\2\2\2\u02ed\u02ee\7u\2\2\u02ee\u02ef\7"+ - "j\2\2\u02ef\u02f0\7c\2\2\u02f0\u02f1\7t\2\2\u02f1\u02f2\7g\2\2\u02f2u"+ - "\3\2\2\2\u02f3\u02f4\7B\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f6\b;\2\2\u02f6"+ - "w\3\2\2\2\u02f7\u02f8\7\60\2\2\u02f8\u02f9\7\60\2\2\u02f9y\3\2\2\2\u02fa"+ - "\u02fb\7u\2\2\u02fb\u02fc\7j\2\2\u02fc\u02fd\7c\2\2\u02fd\u02fe\7t\2\2"+ - "\u02fe\u02ff\7g\2\2\u02ff\u0300\7f\2\2\u0300{\3\2\2\2\u0301\u0302\7g\2"+ - "\2\u0302\u0303\7z\2\2\u0303\u0304\7e\2\2\u0304\u0305\7n\2\2\u0305\u0306"+ - "\7w\2\2\u0306\u0307\7u\2\2\u0307\u0308\7k\2\2\u0308\u0309\7x\2\2\u0309"+ - "\u030a\7g\2\2\u030a}\3\2\2\2\u030b\u030c\7r\2\2\u030c\u030d\7t\2\2\u030d"+ - "\u030e\7g\2\2\u030e\u030f\7f\2\2\u030f\u0310\7k\2\2\u0310\u0311\7e\2\2"+ - "\u0311\u0312\7c\2\2\u0312\u0313\7v\2\2\u0313\u0314\7g\2\2\u0314\177\3"+ - "\2\2\2\u0315\u0316\7y\2\2\u0316\u0317\7t\2\2\u0317\u0318\7k\2\2\u0318"+ - "\u0319\7v\2\2\u0319\u031a\7g\2\2\u031a\u031b\7R\2\2\u031b\u031c\7g\2\2"+ - "\u031c\u031d\7t\2\2\u031d\u031e\7o\2\2\u031e\u031f\3\2\2\2\u031f\u0320"+ - "\b@\2\2\u0320\u0081\3\2\2\2\u0321\u0322\7p\2\2\u0322\u0323\7q\2\2\u0323"+ - "\u0324\7R\2\2\u0324\u0325\7g\2\2\u0325\u0326\7t\2\2\u0326\u0327\7o\2\2"+ - "\u0327\u0328\3\2\2\2\u0328\u0329\bA\2\2\u0329\u0083\3\2\2\2\u032a\u032b"+ - "\7v\2\2\u032b\u032c\7t\2\2\u032c\u032d\7w\2\2\u032d\u032e\7u\2\2\u032e"+ - "\u032f\7v\2\2\u032f\u0330\7g\2\2\u0330\u0331\7f\2\2\u0331\u0332\3\2\2"+ - "\2\u0332\u0333\bB\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7q\2\2\u0335\u0336"+ - "\7w\2\2\u0336\u0337\7v\2\2\u0337\u0338\7n\2\2\u0338\u0339\7k\2\2\u0339"+ - "\u033a\7p\2\2\u033a\u033b\7g\2\2\u033b\u0087\3\2\2\2\u033c\u033d\7k\2"+ - "\2\u033d\u033e\7p\2\2\u033e\u033f\7k\2\2\u033f\u0340\7v\2\2\u0340\u0341"+ - "\7G\2\2\u0341\u0342\7p\2\2\u0342\u0343\7u\2\2\u0343\u0344\7w\2\2\u0344"+ - "\u0345\7t\2\2\u0345\u0346\7g\2\2\u0346\u0347\7u\2\2\u0347\u0089\3\2\2"+ - "\2\u0348\u0349\7k\2\2\u0349\u034a\7o\2\2\u034a\u034b\7r\2\2\u034b\u034c"+ - "\7q\2\2\u034c\u034d\7t\2\2\u034d\u034e\7v\2\2\u034e\u034f\7T\2\2\u034f"+ - "\u0350\7g\2\2\u0350\u0351\7s\2\2\u0351\u0352\7w\2\2\u0352\u0353\7k\2\2"+ - "\u0353\u0354\7t\2\2\u0354\u0355\7g\2\2\u0355\u0356\7u\2\2\u0356\u008b"+ - "\3\2\2\2\u0357\u0358\7r\2\2\u0358\u0359\7t\2\2\u0359\u035a\7q\2\2\u035a"+ - "\u035b\7q\2\2\u035b\u035c\7h\2\2\u035c\u008d\3\2\2\2\u035d\u035e\7?\2"+ - "\2\u035e\u035f\7?\2\2\u035f\u0360\7?\2\2\u0360\u008f\3\2\2\2\u0361\u0362"+ - "\7#\2\2\u0362\u0363\7?\2\2\u0363\u0364\7?\2\2\u0364\u0091\3\2\2\2\u0365"+ - "\u0366\7y\2\2\u0366\u0367\7k\2\2\u0367\u0368\7v\2\2\u0368\u0369\7j\2\2"+ - "\u0369\u0093\3\2\2\2\u036a\u036b\7d\2\2\u036b\u036c\7t\2\2\u036c\u036d"+ - "\7g\2\2\u036d\u036e\7c\2\2\u036e\u036f\7m\2\2\u036f\u0370\3\2\2\2\u0370"+ - "\u0371\bJ\2\2\u0371\u0095\3\2\2\2\u0372\u0373\7f\2\2\u0373\u0374\7g\2"+ - "\2\u0374\u0375\7h\2\2\u0375\u0376\7c\2\2\u0376\u0377\7w\2\2\u0377\u0378"+ - "\7n\2\2\u0378\u0379\7v\2\2\u0379\u0097\3\2\2\2\u037a\u037b\7h\2\2\u037b"+ - "\u037c\7w\2\2\u037c\u037d\7p\2\2\u037d\u037e\7e\2\2\u037e\u0099\3\2\2"+ - "\2\u037f\u0380\7k\2\2\u0380\u0381\7p\2\2\u0381\u0382\7v\2\2\u0382\u0383"+ - "\7g\2\2\u0383\u0384\7t\2\2\u0384\u0385\7h\2\2\u0385\u0386\7c\2\2\u0386"+ - "\u0387\7e\2\2\u0387\u0388\7g\2\2\u0388\u009b\3\2\2\2\u0389\u038a\7u\2"+ - "\2\u038a\u038b\7g\2\2\u038b\u038c\7n\2\2\u038c\u038d\7g\2\2\u038d\u038e"+ - "\7e\2\2\u038e\u038f\7v\2\2\u038f\u009d\3\2\2\2\u0390\u0391\7e\2\2\u0391"+ - "\u0392\7c\2\2\u0392\u0393\7u\2\2\u0393\u0394\7g\2\2\u0394\u009f\3\2\2"+ - "\2\u0395\u0396\7f\2\2\u0396\u0397\7g\2\2\u0397\u0398\7h\2\2\u0398\u0399"+ - "\7g\2\2\u0399\u039a\7t\2\2\u039a\u00a1\3\2\2\2\u039b\u039c\7i\2\2\u039c"+ - "\u039d\7q\2\2\u039d\u00a3\3\2\2\2\u039e\u039f\7o\2\2\u039f\u03a0\7c\2"+ - "\2\u03a0\u03a1\7r\2\2\u03a1\u00a5\3\2\2\2\u03a2\u03a3\7u\2\2\u03a3\u03a4"+ - "\7v\2\2\u03a4\u03a5\7t\2\2\u03a5\u03a6\7w\2\2\u03a6\u03a7\7e\2\2\u03a7"+ - "\u03a8\7v\2\2\u03a8\u00a7\3\2\2\2\u03a9\u03aa\7e\2\2\u03aa\u03ab\7j\2"+ - "\2\u03ab\u03ac\7c\2\2\u03ac\u03ad\7p\2\2\u03ad\u00a9\3\2\2\2\u03ae\u03af"+ - "\7g\2\2\u03af\u03b0\7n\2\2\u03b0\u03b1\7u\2\2\u03b1\u03b2\7g\2\2\u03b2"+ - "\u00ab\3\2\2\2\u03b3\u03b4\7i\2\2\u03b4\u03b5\7q\2\2\u03b5\u03b6\7v\2"+ - "\2\u03b6\u03b7\7q\2\2\u03b7\u00ad\3\2\2\2\u03b8\u03b9\7r\2\2\u03b9\u03ba"+ - "\7c\2\2\u03ba\u03bb\7e\2\2\u03bb\u03bc\7m\2\2\u03bc\u03bd\7c\2\2\u03bd"+ - "\u03be\7i\2\2\u03be\u03bf\7g\2\2\u03bf\u00af\3\2\2\2\u03c0\u03c1\7u\2"+ - "\2\u03c1\u03c2\7y\2\2\u03c2\u03c3\7k\2\2\u03c3\u03c4\7v\2\2\u03c4\u03c5"+ - "\7e\2\2\u03c5\u03c6\7j\2\2\u03c6\u00b1\3\2\2\2\u03c7\u03c8\7e\2\2\u03c8"+ - "\u03c9\7q\2\2\u03c9\u03ca\7p\2\2\u03ca\u03cb\7u\2\2\u03cb\u03cc\7v\2\2"+ - "\u03cc\u00b3\3\2\2\2\u03cd\u03ce\7h\2\2\u03ce\u03cf\7c\2\2\u03cf\u03d0"+ - "\7n\2\2\u03d0\u03d1\7n\2\2\u03d1\u03d2\7v\2\2\u03d2\u03d3\7j\2\2\u03d3"+ - "\u03d4\7t\2\2\u03d4\u03d5\7q\2\2\u03d5\u03d6\7w\2\2\u03d6\u03d7\7i\2\2"+ - "\u03d7\u03d8\7j\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03da\bZ\2\2\u03da\u00b5"+ - "\3\2\2\2\u03db\u03dc\7k\2\2\u03dc\u03dd\7h\2\2\u03dd\u00b7\3\2\2\2\u03de"+ - "\u03df\7t\2\2\u03df\u03e0\7c\2\2\u03e0\u03e1\7p\2\2\u03e1\u03e2\7i\2\2"+ - "\u03e2\u03e3\7g\2\2\u03e3\u00b9\3\2\2\2\u03e4\u03e5\7v\2\2\u03e5\u03e6"+ - "\7{\2\2\u03e6\u03e7\7r\2\2\u03e7\u03e8\7g\2\2\u03e8\u00bb\3\2\2\2\u03e9"+ - "\u03ea\7e\2\2\u03ea\u03eb\7q\2\2\u03eb\u03ec\7p\2\2\u03ec\u03ed\7v\2\2"+ - "\u03ed\u03ee\7k\2\2\u03ee\u03ef\7p\2\2\u03ef\u03f0\7w\2\2\u03f0\u03f1"+ - "\7g\2\2\u03f1\u03f2\3\2\2\2\u03f2\u03f3\b^\2\2\u03f3\u00bd\3\2\2\2\u03f4"+ - "\u03f5\7h\2\2\u03f5\u03f6\7q\2\2\u03f6\u03f7\7t\2\2\u03f7\u00bf\3\2\2"+ - "\2\u03f8\u03f9\7k\2\2\u03f9\u03fa\7o\2\2\u03fa\u03fb\7r\2\2\u03fb\u03fc"+ - "\7q\2\2\u03fc\u03fd\7t\2\2\u03fd\u03fe\7v\2\2\u03fe\u00c1\3\2\2\2\u03ff"+ - "\u0400\7t\2\2\u0400\u0401\7g\2\2\u0401\u0402\7v\2\2\u0402\u0403\7w\2\2"+ - "\u0403\u0404\7t\2\2\u0404\u0405\7p\2\2\u0405\u0406\3\2\2\2\u0406\u0407"+ - "\ba\2\2\u0407\u00c3\3\2\2\2\u0408\u0409\7x\2\2\u0409\u040a\7c\2\2\u040a"+ - "\u040b\7t\2\2\u040b\u00c5\3\2\2\2\u040c\u040d\7p\2\2\u040d\u040e\7k\2"+ - "\2\u040e\u040f\7n\2\2\u040f\u0410\3\2\2\2\u0410\u0411\bc\2\2\u0411\u00c7"+ - "\3\2\2\2\u0412\u0417\5\u014a\u00a5\2\u0413\u0416\5\u014a\u00a5\2\u0414"+ - "\u0416\5\u014c\u00a6\2\u0415\u0413\3\2\2\2\u0415\u0414\3\2\2\2\u0416\u0419"+ - "\3\2\2\2\u0417\u0415\3\2\2\2\u0417\u0418\3\2\2\2\u0418\u041a\3\2\2\2\u0419"+ - "\u0417\3\2\2\2\u041a\u041b\bd\2\2\u041b\u00c9\3\2\2\2\u041c\u041d\7*\2"+ - "\2\u041d\u00cb\3\2\2\2\u041e\u041f\7+\2\2\u041f\u0420\3\2\2\2\u0420\u0421"+ - "\bf\2\2\u0421\u00cd\3\2\2\2\u0422\u0423\7}\2\2\u0423\u00cf\3\2\2\2\u0424"+ - "\u0425\7\177\2\2\u0425\u0426\3\2\2\2\u0426\u0427\bh\2\2\u0427\u00d1\3"+ - "\2\2\2\u0428\u0429\7]\2\2\u0429\u00d3\3\2\2\2\u042a\u042b\7_\2\2\u042b"+ - "\u042c\3\2\2\2\u042c\u042d\bj\2\2\u042d\u00d5\3\2\2\2\u042e\u042f\7?\2"+ - "\2\u042f\u00d7\3\2\2\2\u0430\u0431\7.\2\2\u0431\u00d9\3\2\2\2\u0432\u0433"+ - "\7=\2\2\u0433\u00db\3\2\2\2\u0434\u0435\7<\2\2\u0435\u00dd\3\2\2\2\u0436"+ - "\u0437\7\60\2\2\u0437\u00df\3\2\2\2\u0438\u0439\7-\2\2\u0439\u043a\7-"+ - "\2\2\u043a\u043b\3\2\2\2\u043b\u043c\bp\2\2\u043c\u00e1\3\2\2\2\u043d"+ - "\u043e\7/\2\2\u043e\u043f\7/\2\2\u043f\u0440\3\2\2\2\u0440\u0441\bq\2"+ - "\2\u0441\u00e3\3\2\2\2\u0442\u0443\7<\2\2\u0443\u0444\7?\2\2\u0444\u00e5"+ - "\3\2\2\2\u0445\u0446\7\60\2\2\u0446\u0447\7\60\2\2\u0447\u0448\7\60\2"+ - "\2\u0448\u00e7\3\2\2\2\u0449\u044a\7~\2\2\u044a\u044b\7~\2\2\u044b\u00e9"+ - "\3\2\2\2\u044c\u044d\7(\2\2\u044d\u044e\7(\2\2\u044e\u00eb\3\2\2\2\u044f"+ - "\u0450\7?\2\2\u0450\u0451\7?\2\2\u0451\u00ed\3\2\2\2\u0452\u0453\7#\2"+ - "\2\u0453\u0454\7?\2\2\u0454\u00ef\3\2\2\2\u0455\u0456\7>\2\2\u0456\u00f1"+ - "\3\2\2\2\u0457\u0458\7>\2\2\u0458\u0459\7?\2\2\u0459\u00f3\3\2\2\2\u045a"+ - "\u045b\7@\2\2\u045b\u00f5\3\2\2\2\u045c\u045d\7@\2\2\u045d\u045e\7?\2"+ - "\2\u045e\u00f7\3\2\2\2\u045f\u0460\7~\2\2\u0460\u00f9\3\2\2\2\u0461\u0462"+ - "\7\61\2\2\u0462\u00fb\3\2\2\2\u0463\u0464\7\'\2\2\u0464\u00fd\3\2\2\2"+ - "\u0465\u0466\7>\2\2\u0466\u0467\7>\2\2\u0467\u00ff\3\2\2\2\u0468\u0469"+ - "\7@\2\2\u0469\u046a\7@\2\2\u046a\u0101\3\2\2\2\u046b\u046c\7(\2\2\u046c"+ - "\u046d\7`\2\2\u046d\u0103\3\2\2\2\u046e\u046f\7#\2\2\u046f\u0105\3\2\2"+ - "\2\u0470\u0471\7-\2\2\u0471\u0107\3\2\2\2\u0472\u0473\7/\2\2\u0473\u0109"+ - "\3\2\2\2\u0474\u0475\7`\2\2\u0475\u010b\3\2\2\2\u0476\u0477\7,\2\2\u0477"+ - "\u010d\3\2\2\2\u0478\u0479\7(\2\2\u0479\u010f\3\2\2\2\u047a\u047b\7>\2"+ - "\2\u047b\u047c\7/\2\2\u047c\u0111\3\2\2\2\u047d\u0489\7\62\2\2\u047e\u0485"+ - "\t\2\2\2\u047f\u0481\7a\2\2\u0480\u047f\3\2\2\2\u0480\u0481\3\2\2\2\u0481"+ - "\u0482\3\2\2\2\u0482\u0484\t\3\2\2\u0483\u0480\3\2\2\2\u0484\u0487\3\2"+ - "\2\2\u0485\u0483\3\2\2\2\u0485\u0486\3\2\2\2\u0486\u0489\3\2\2\2\u0487"+ - "\u0485\3\2\2\2\u0488\u047d\3\2\2\2\u0488\u047e\3\2\2\2\u0489\u048a\3\2"+ - "\2\2\u048a\u048b\b\u0089\2\2\u048b\u0113\3\2\2\2\u048c\u048d\7\62\2\2"+ - "\u048d\u0492\t\4\2\2\u048e\u0490\7a\2\2\u048f\u048e\3\2\2\2\u048f\u0490"+ - "\3\2\2\2\u0490\u0491\3\2\2\2\u0491\u0493\5\u0146\u00a3\2\u0492\u048f\3"+ - "\2\2\2\u0493\u0494\3\2\2\2\u0494\u0492\3\2\2\2\u0494\u0495\3\2\2\2\u0495"+ - "\u0496\3\2\2\2\u0496\u0497\b\u008a\2\2\u0497\u0115\3\2\2\2\u0498\u049a"+ - "\7\62\2\2\u0499\u049b\t\5\2\2\u049a\u0499\3\2\2\2\u049a\u049b\3\2\2\2"+ - "\u049b\u04a0\3\2\2\2\u049c\u049e\7a\2\2\u049d\u049c\3\2\2\2\u049d\u049e"+ - "\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u04a1\5\u0142\u00a1\2\u04a0\u049d\3"+ - "\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a0\3\2\2\2\u04a2\u04a3\3\2\2\2\u04a3"+ - "\u04a4\3\2\2\2\u04a4\u04a5\b\u008b\2\2\u04a5\u0117\3\2\2\2\u04a6\u04a7"+ - "\7\62\2\2\u04a7\u04ac\t\6\2\2\u04a8\u04aa\7a\2\2\u04a9\u04a8\3\2\2\2\u04a9"+ - "\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ad\5\u0144\u00a2\2\u04ac\u04a9"+ - "\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04ac\3\2\2\2\u04ae\u04af\3\2\2\2\u04af"+ - "\u04b0\3\2\2\2\u04b0\u04b1\b\u008c\2\2\u04b1\u0119\3\2\2\2\u04b2\u04b3"+ - "\7\62\2\2\u04b3\u04b4\t\6\2\2\u04b4\u04b5\5\u011c\u008e\2\u04b5\u04b6"+ - "\5\u011e\u008f\2\u04b6\u011b\3\2\2\2\u04b7\u04b9\7a\2\2\u04b8\u04b7\3"+ - "\2\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bc\5\u0144\u00a2"+ - "\2\u04bb\u04b8\3\2\2\2\u04bc\u04bd\3\2\2\2\u04bd\u04bb\3\2\2\2\u04bd\u04be"+ - "\3\2\2\2\u04be\u04c9\3\2\2\2\u04bf\u04c6\7\60\2\2\u04c0\u04c2\7a\2\2\u04c1"+ - "\u04c0\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c3\u04c5\5\u0144"+ - "\u00a2\2\u04c4\u04c1\3\2\2\2\u04c5\u04c8\3\2\2\2\u04c6\u04c4\3\2\2\2\u04c6"+ - "\u04c7\3\2\2\2\u04c7\u04ca\3\2\2\2\u04c8\u04c6\3\2\2\2\u04c9\u04bf\3\2"+ - "\2\2\u04c9\u04ca\3\2\2\2\u04ca\u04d7\3\2\2\2\u04cb\u04cc\7\60\2\2\u04cc"+ - "\u04d3\5\u0144\u00a2\2\u04cd\u04cf\7a\2\2\u04ce\u04cd\3\2\2\2\u04ce\u04cf"+ - "\3\2\2\2\u04cf\u04d0\3\2\2\2\u04d0\u04d2\5\u0144\u00a2\2\u04d1\u04ce\3"+ - "\2\2\2\u04d2\u04d5\3\2\2\2\u04d3\u04d1\3\2\2\2\u04d3\u04d4\3\2\2\2\u04d4"+ - "\u04d7\3\2\2\2\u04d5\u04d3\3\2\2\2\u04d6\u04bb\3\2\2\2\u04d6\u04cb\3\2"+ - "\2\2\u04d7\u011d\3\2\2\2\u04d8\u04d9\t\7\2\2\u04d9\u04da\t\b\2\2\u04da"+ - "\u04db\5\u0140\u00a0\2\u04db\u011f\3\2\2\2\u04dc\u04e2\5\u0112\u0089\2"+ - "\u04dd\u04e2\5\u0114\u008a\2\u04de\u04e2\5\u0116\u008b\2\u04df\u04e2\5"+ - "\u0118\u008c\2\u04e0\u04e2\5\4\2\2\u04e1\u04dc\3\2\2\2\u04e1\u04dd\3\2"+ - "\2\2\u04e1\u04de\3\2\2\2\u04e1\u04df\3\2\2\2\u04e1\u04e0\3\2\2\2\u04e2"+ - "\u04e3\3\2\2\2\u04e3\u04e4\7k\2\2\u04e4\u04e5\3\2\2\2\u04e5\u04e6\b\u0090"+ - "\2\2\u04e6\u0121\3\2\2\2\u04e7\u04ea\7)\2\2\u04e8\u04eb\5\u013c\u009e"+ - "\2\u04e9\u04eb\5\u0126\u0093\2\u04ea\u04e8\3\2\2\2\u04ea\u04e9\3\2\2\2"+ - "\u04eb\u04ec\3\2\2\2\u04ec\u04ed\7)\2\2\u04ed\u0123\3\2\2\2\u04ee\u04ef"+ - "\5\u0122\u0091\2\u04ef\u04f0\3\2\2\2\u04f0\u04f1\b\u0092\2\2\u04f1\u0125"+ - "\3\2\2\2\u04f2\u04f5\5\u0128\u0094\2\u04f3\u04f5\5\u012a\u0095\2\u04f4"+ - "\u04f2\3\2\2\2\u04f4\u04f3\3\2\2\2\u04f5\u0127\3\2\2\2\u04f6\u04f7\7^"+ - "\2\2\u04f7\u04f8\5\u0142\u00a1\2\u04f8\u04f9\5\u0142\u00a1\2\u04f9\u04fa"+ - "\5\u0142\u00a1\2\u04fa\u0129\3\2\2\2\u04fb\u04fc\7^\2\2\u04fc\u04fd\7"+ - "z\2\2\u04fd\u04fe\5\u0144\u00a2\2\u04fe\u04ff\5\u0144\u00a2\2\u04ff\u012b"+ - "\3\2\2\2\u0500\u0501\7^\2\2\u0501\u0502\7w\2\2\u0502\u0503\5\u0144\u00a2"+ - "\2\u0503\u0504\5\u0144\u00a2\2\u0504\u0505\5\u0144\u00a2\2\u0505\u0506"+ - "\5\u0144\u00a2\2\u0506\u012d\3\2\2\2\u0507\u0508\7^\2\2\u0508\u0509\7"+ - "W\2\2\u0509\u050a\5\u0144\u00a2\2\u050a\u050b\5\u0144\u00a2\2\u050b\u050c"+ - "\5\u0144\u00a2\2\u050c\u050d\5\u0144\u00a2\2\u050d\u050e\5\u0144\u00a2"+ - "\2\u050e\u050f\5\u0144\u00a2\2\u050f\u0510\5\u0144\u00a2\2\u0510\u0511"+ - "\5\u0144\u00a2\2\u0511\u012f\3\2\2\2\u0512\u0516\7b\2\2\u0513\u0515\n"+ - "\t\2\2\u0514\u0513\3\2\2\2\u0515\u0518\3\2\2\2\u0516\u0514\3\2\2\2\u0516"+ - "\u0517\3\2\2\2\u0517\u0519\3\2\2\2\u0518\u0516\3\2\2\2\u0519\u051a\7b"+ - "\2\2\u051a\u051b\3\2\2\2\u051b\u051c\b\u0098\2\2\u051c\u0131\3\2\2\2\u051d"+ - "\u0522\7$\2\2\u051e\u0521\n\n\2\2\u051f\u0521\5\u013e\u009f\2\u0520\u051e"+ - "\3\2\2\2\u0520\u051f\3\2\2\2\u0521\u0524\3\2\2\2\u0522\u0520\3\2\2\2\u0522"+ - "\u0523\3\2\2\2\u0523\u0525\3\2\2\2\u0524\u0522\3\2\2\2\u0525\u0526\7$"+ - "\2\2\u0526\u0527\3\2\2\2\u0527\u0528\b\u0099\2\2\u0528\u0133\3\2\2\2\u0529"+ - "\u052b\t\13\2\2\u052a\u0529\3\2\2\2\u052b\u052c\3\2\2\2\u052c\u052a\3"+ - "\2\2\2\u052c\u052d\3\2\2\2\u052d\u052e\3\2\2\2\u052e\u052f\b\u009a\3\2"+ - "\u052f\u0135\3\2\2\2\u0530\u0531\7\61\2\2\u0531\u0532\7,\2\2\u0532\u0536"+ - "\3\2\2\2\u0533\u0535\13\2\2\2\u0534\u0533\3\2\2\2\u0535\u0538\3\2\2\2"+ - "\u0536\u0537\3\2\2\2\u0536\u0534\3\2\2\2\u0537\u0539\3\2\2\2\u0538\u0536"+ - "\3\2\2\2\u0539\u053a\7,\2\2\u053a\u053b\7\61\2\2\u053b\u053c\3\2\2\2\u053c"+ - "\u053d\b\u009b\3\2\u053d\u0137\3\2\2\2\u053e\u0540\t\f\2\2\u053f\u053e"+ - "\3\2\2\2\u0540\u0541\3\2\2\2\u0541\u053f\3\2\2\2\u0541\u0542\3\2\2\2\u0542"+ - "\u0543\3\2\2\2\u0543\u0544\b\u009c\3\2\u0544\u0139\3\2\2\2\u0545\u0546"+ - "\7\61\2\2\u0546\u0547\7\61\2\2\u0547\u054b\3\2\2\2\u0548\u054a\n\f\2\2"+ - "\u0549\u0548\3\2\2\2\u054a\u054d\3\2\2\2\u054b\u0549\3\2\2\2\u054b\u054c"+ - "\3\2\2\2\u054c\u054e\3\2\2\2\u054d\u054b\3\2\2\2\u054e\u054f\b\u009d\3"+ - "\2\u054f\u013b\3\2\2\2\u0550\u0555\n\r\2\2\u0551\u0555\5\u012c\u0096\2"+ - "\u0552\u0555\5\u012e\u0097\2\u0553\u0555\5\u013e\u009f\2\u0554\u0550\3"+ - "\2\2\2\u0554\u0551\3\2\2\2\u0554\u0552\3\2\2\2\u0554\u0553\3\2\2\2\u0555"+ - "\u013d\3\2\2\2\u0556\u0570\7^\2\2\u0557\u0558\7w\2\2\u0558\u0559\5\u0144"+ - "\u00a2\2\u0559\u055a\5\u0144\u00a2\2\u055a\u055b\5\u0144\u00a2\2\u055b"+ - "\u055c\5\u0144\u00a2\2\u055c\u0571\3\2\2\2\u055d\u055e\7W\2\2\u055e\u055f"+ - "\5\u0144\u00a2\2\u055f\u0560\5\u0144\u00a2\2\u0560\u0561\5\u0144\u00a2"+ - "\2\u0561\u0562\5\u0144\u00a2\2\u0562\u0563\5\u0144\u00a2\2\u0563\u0564"+ - "\5\u0144\u00a2\2\u0564\u0565\5\u0144\u00a2\2\u0565\u0566\5\u0144\u00a2"+ - "\2\u0566\u0571\3\2\2\2\u0567\u0571\t\16\2\2\u0568\u0569\5\u0142\u00a1"+ - "\2\u0569\u056a\5\u0142\u00a1\2\u056a\u056b\5\u0142\u00a1\2\u056b\u0571"+ - "\3\2\2\2\u056c\u056d\7z\2\2\u056d\u056e\5\u0144\u00a2\2\u056e\u056f\5"+ - "\u0144\u00a2\2\u056f\u0571\3\2\2\2\u0570\u0557\3\2\2\2\u0570\u055d\3\2"+ - "\2\2\u0570\u0567\3\2\2\2\u0570\u0568\3\2\2\2\u0570\u056c\3\2\2\2\u0571"+ - "\u013f\3\2\2\2\u0572\u0579\t\3\2\2\u0573\u0575\7a\2\2\u0574\u0573\3\2"+ - "\2\2\u0574\u0575\3\2\2\2\u0575\u0576\3\2\2\2\u0576\u0578\t\3\2\2\u0577"+ - "\u0574\3\2\2\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2"+ - "\2\2\u057a\u0141\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057d\t\17\2\2\u057d"+ - "\u0143\3\2\2\2\u057e\u057f\t\20\2\2\u057f\u0145\3\2\2\2\u0580\u0581\t"+ - "\21\2\2\u0581\u0147\3\2\2\2\u0582\u0584\t\22\2\2\u0583\u0585\t\b\2\2\u0584"+ - "\u0583\3\2\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0587\5\u0140"+ - "\u00a0\2\u0587\u0149\3\2\2\2\u0588\u058b\5\u014e\u00a7\2\u0589\u058b\7"+ - "a\2\2\u058a\u0588\3\2\2\2\u058a\u0589\3\2\2\2\u058b\u014b\3\2\2\2\u058c"+ - "\u058d\t\23\2\2\u058d\u014d\3\2\2\2\u058e\u058f\t\24\2\2\u058f\u014f\3"+ - "\2\2\2\u0590\u0592\t\13\2\2\u0591\u0590\3\2\2\2\u0592\u0593\3\2\2\2\u0593"+ - "\u0591\3\2\2\2\u0593\u0594\3\2\2\2\u0594\u0595\3\2\2\2\u0595\u0596\b\u00a8"+ - "\3\2\u0596\u0151\3\2\2\2\u0597\u0598\7\61\2\2\u0598\u0599\7,\2\2\u0599"+ - "\u059d\3\2\2\2\u059a\u059c\n\f\2\2\u059b\u059a\3\2\2\2\u059c\u059f\3\2"+ - "\2\2\u059d\u059e\3\2\2\2\u059d\u059b\3\2\2\2\u059e\u05a0\3\2\2\2\u059f"+ - "\u059d\3\2\2\2\u05a0\u05a1\7,\2\2\u05a1\u05a2\7\61\2\2\u05a2\u05a3\3\2"+ - "\2\2\u05a3\u05a4\b\u00a9\3\2\u05a4\u0153\3\2\2\2\u05a5\u05a6\7\61\2\2"+ - "\u05a6\u05a7\7\61\2\2\u05a7\u05ab\3\2\2\2\u05a8\u05aa\n\f\2\2\u05a9\u05a8"+ - "\3\2\2\2\u05aa\u05ad\3\2\2\2\u05ab\u05a9\3\2\2\2\u05ab\u05ac\3\2\2\2\u05ac"+ - "\u05ae\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05af\b\u00aa\3\2\u05af\u0155"+ - "\3\2\2\2\u05b0\u05b2\t\f\2\2\u05b1\u05b0\3\2\2\2\u05b2\u05b3\3\2\2\2\u05b3"+ - "\u05b1\3\2\2\2\u05b3\u05b4\3\2\2\2\u05b4\u05c3\3\2\2\2\u05b5\u05c3\7="+ - "\2\2\u05b6\u05b7\7\61\2\2\u05b7\u05b8\7,\2\2\u05b8\u05bc\3\2\2\2\u05b9"+ - "\u05bb\13\2\2\2\u05ba\u05b9\3\2\2\2\u05bb\u05be\3\2\2\2\u05bc\u05bd\3"+ - "\2\2\2\u05bc\u05ba\3\2\2\2\u05bd\u05bf\3\2\2\2\u05be\u05bc\3\2\2\2\u05bf"+ - "\u05c0\7,\2\2\u05c0\u05c3\7\61\2\2\u05c1\u05c3\7\2\2\3\u05c2\u05b1\3\2"+ - "\2\2\u05c2\u05b5\3\2\2\2\u05c2\u05b6\3\2\2\2\u05c2\u05c1\3\2\2\2\u05c3"+ - "\u05c4\3\2\2\2\u05c4\u05c5\b\u00ab\4\2\u05c5\u0157\3\2\2\2\u05c6\u05c7"+ - "\3\2\2\2\u05c7\u05c8\3\2\2\2\u05c8\u05c9\b\u00ac\4\2\u05c9\u05ca\b\u00ac"+ - "\3\2\u05ca\u0159\3\2\2\2\64\2\3\u015c\u0164\u0167\u016a\u0170\u0172\u0415"+ - "\u0417\u0480\u0485\u0488\u048f\u0494\u049a\u049d\u04a2\u04a9\u04ae\u04b8"+ - "\u04bd\u04c1\u04c6\u04c9\u04ce\u04d3\u04d6\u04e1\u04ea\u04f4\u0516\u0520"+ - "\u0522\u052c\u0536\u0541\u054b\u0554\u0570\u0574\u0579\u0584\u058a\u0593"+ - "\u059d\u05ab\u05b3\u05bc\u05c2\5\4\3\2\2\3\2\4\2\2"; + "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad"+ + "\t\u00ad\3\2\3\2\5\2\u015f\n\2\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0167\n\3\3"+ + "\3\5\3\u016a\n\3\3\3\5\3\u016d\n\3\3\3\3\3\3\3\3\3\5\3\u0173\n\3\5\3\u0175"+ + "\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3"+ + "\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b"+ + "\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3"+ + "\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3"+ + "\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16"+ + "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17"+ + "\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21"+ + "\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23"+ + "\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25"+ + "\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27"+ + "\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32"+ + "\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33"+ + "\3\34\3\34\3\34\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37"+ + "\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3"+ + "!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3"+ + "&\3&\3&\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*"+ + "\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-"+ + "\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60"+ + "\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62"+ + "\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64"+ + "\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66"+ + "\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\3"+ + "8\39\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3"+ + ":\3:\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3"+ + "?\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3"+ + "A\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3"+ + "C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3"+ + "E\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3H\3"+ + "H\3H\3H\3I\3I\3I\3I\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3"+ + "L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3"+ + "O\3O\3O\3O\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3S\3S\3S\3S\3T\3"+ + "T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3X\3X\3"+ + "X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3"+ + "[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3]\3]\3]\3]\3]\3]\3^\3^\3^\3"+ + "^\3^\3_\3_\3_\3_\3_\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3"+ + "a\3b\3b\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3d\3d\3d\3d\3d\3d\3e\3e\3e\7"+ + "e\u0420\ne\fe\16e\u0423\13e\3e\3e\3f\3f\3g\3g\3g\3g\3h\3h\3i\3i\3i\3i"+ + "\3j\3j\3k\3k\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3p\3p\3q\3q\3q\3q\3q\3r\3r"+ + "\3r\3r\3r\3s\3s\3s\3t\3t\3t\3t\3u\3u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3x\3y"+ + "\3y\3z\3z\3z\3{\3{\3|\3|\3|\3}\3}\3~\3~\3\177\3\177\3\u0080\3\u0080\3"+ + "\u0080\3\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083"+ + "\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088"+ + "\3\u0088\3\u0089\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u048b"+ + "\n\u008a\3\u008a\7\u008a\u048e\n\u008a\f\u008a\16\u008a\u0491\13\u008a"+ + "\5\u008a\u0493\n\u008a\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\5\u008b"+ + "\u049a\n\u008b\3\u008b\6\u008b\u049d\n\u008b\r\u008b\16\u008b\u049e\3"+ + "\u008b\3\u008b\3\u008c\3\u008c\5\u008c\u04a5\n\u008c\3\u008c\5\u008c\u04a8"+ + "\n\u008c\3\u008c\6\u008c\u04ab\n\u008c\r\u008c\16\u008c\u04ac\3\u008c"+ + "\3\u008c\3\u008d\3\u008d\3\u008d\5\u008d\u04b4\n\u008d\3\u008d\6\u008d"+ + "\u04b7\n\u008d\r\u008d\16\u008d\u04b8\3\u008d\3\u008d\3\u008e\3\u008e"+ + "\3\u008e\3\u008e\3\u008e\3\u008f\5\u008f\u04c3\n\u008f\3\u008f\6\u008f"+ + "\u04c6\n\u008f\r\u008f\16\u008f\u04c7\3\u008f\3\u008f\5\u008f\u04cc\n"+ + "\u008f\3\u008f\7\u008f\u04cf\n\u008f\f\u008f\16\u008f\u04d2\13\u008f\5"+ + "\u008f\u04d4\n\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u04d9\n\u008f\3\u008f"+ + "\7\u008f\u04dc\n\u008f\f\u008f\16\u008f\u04df\13\u008f\5\u008f\u04e1\n"+ + "\u008f\3\u0090\3\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091"+ + "\3\u0091\5\u0091\u04ec\n\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0092"+ + "\3\u0092\3\u0092\5\u0092\u04f5\n\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+ + "\3\u0093\3\u0093\3\u0094\3\u0094\5\u0094\u04ff\n\u0094\3\u0095\3\u0095"+ + "\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097"+ + "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098"+ + "\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099"+ + "\3\u0099\7\u0099\u051f\n\u0099\f\u0099\16\u0099\u0522\13\u0099\3\u0099"+ + "\3\u0099\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\7\u009a\u052b\n\u009a"+ + "\f\u009a\16\u009a\u052e\13\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009b"+ + "\6\u009b\u0535\n\u009b\r\u009b\16\u009b\u0536\3\u009b\3\u009b\3\u009c"+ + "\3\u009c\3\u009c\3\u009c\7\u009c\u053f\n\u009c\f\u009c\16\u009c\u0542"+ + "\13\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d\6\u009d\u054a"+ + "\n\u009d\r\u009d\16\u009d\u054b\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\7\u009e\u0554\n\u009e\f\u009e\16\u009e\u0557\13\u009e\3\u009e"+ + "\3\u009e\3\u009f\3\u009f\3\u009f\3\u009f\5\u009f\u055f\n\u009f\3\u00a0"+ + "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+ + "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+ + "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u057b"+ + "\n\u00a0\3\u00a1\3\u00a1\5\u00a1\u057f\n\u00a1\3\u00a1\7\u00a1\u0582\n"+ + "\u00a1\f\u00a1\16\u00a1\u0585\13\u00a1\3\u00a2\3\u00a2\3\u00a3\3\u00a3"+ + "\3\u00a4\3\u00a4\3\u00a5\3\u00a5\5\u00a5\u058f\n\u00a5\3\u00a5\3\u00a5"+ + "\3\u00a6\3\u00a6\5\u00a6\u0595\n\u00a6\3\u00a7\3\u00a7\3\u00a8\3\u00a8"+ + "\3\u00a9\6\u00a9\u059c\n\u00a9\r\u00a9\16\u00a9\u059d\3\u00a9\3\u00a9"+ + "\3\u00aa\3\u00aa\3\u00aa\3\u00aa\7\u00aa\u05a6\n\u00aa\f\u00aa\16\u00aa"+ + "\u05a9\13\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab"+ + "\3\u00ab\3\u00ab\7\u00ab\u05b4\n\u00ab\f\u00ab\16\u00ab\u05b7\13\u00ab"+ + "\3\u00ab\3\u00ab\3\u00ac\6\u00ac\u05bc\n\u00ac\r\u00ac\16\u00ac\u05bd"+ + "\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\7\u00ac\u05c5\n\u00ac\f\u00ac"+ + "\16\u00ac\u05c8\13\u00ac\3\u00ac\3\u00ac\3\u00ac\5\u00ac\u05cd\n\u00ac"+ + "\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad\5\u0540\u05a7"+ + "\u05c6\2\u00ae\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16"+ + "\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\34"+ + "8\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65"+ + "j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008c"+ + "G\u008eH\u0090I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0"+ + "Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4"+ + "[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8"+ + "e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dc"+ + "o\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0"+ + "y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081"+ + "\u0102\u0082\u0104\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087"+ + "\u010e\u0088\u0110\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d"+ + "\u011a\u008e\u011c\u008f\u011e\2\u0120\2\u0122\u0090\u0124\2\u0126\u0091"+ + "\u0128\u0092\u012a\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097"+ + "\u0134\u0098\u0136\u0099\u0138\u009a\u013a\u009b\u013c\u009c\u013e\2\u0140"+ + "\2\u0142\2\u0144\2\u0146\2\u0148\2\u014a\2\u014c\2\u014e\2\u0150\2\u0152"+ + "\u009d\u0154\u009e\u0156\u009f\u0158\u00a0\u015a\u00a1\4\2\3\23\3\2\63"+ + ";\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13"+ + "\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5"+ + "\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb"+ + "\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8"+ + "\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1"+ + "\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22"+ + "\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b"+ + "\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52"+ + "\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b"+ + "\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52"+ + "\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071"+ + "\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452"+ + "\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b"+ + "\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52"+ + "\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac"+ + "\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8"+ + "\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0"+ + "\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381"+ + "\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5"+ + "\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b"+ + "\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670"+ + "\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1"+ + "\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f"+ + "\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc"+ + "\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842"+ + "\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b"+ + "\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987"+ + "\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4"+ + "\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1"+ + "\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12"+ + "\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a"+ + "\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f"+ + "\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7"+ + "\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb"+ + "\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34"+ + "\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63"+ + "\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94"+ + "\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6"+ + "\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10"+ + "\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c"+ + "\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94"+ + "\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0"+ + "\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14"+ + "\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63"+ + "\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf"+ + "\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48"+ + "\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f"+ + "\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7"+ + "\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf"+ + "\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02"+ + "\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041"+ + "\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068"+ + "\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9"+ + "\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f"+ + "\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c"+ + "\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2"+ + "\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a"+ + "\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e"+ + "\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702"+ + "\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e"+ + "\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822"+ + "\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7"+ + "\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2"+ + "\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35"+ + "\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02"+ + "\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee"+ + "\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a"+ + "\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b"+ + "\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8"+ + "\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5"+ + "\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073"+ + "\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109"+ + "\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128"+ + "\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141"+ + "\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32"+ + "\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27"+ + "\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82"+ + "\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0"+ + "\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31"+ + "\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098"+ + "\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133"+ + "\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec"+ + "\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c"+ + "\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721"+ + "\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805"+ + "\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5"+ + "\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932"+ + "\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6"+ + "\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46"+ + "\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3"+ + "\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd"+ + "\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10"+ + "\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e"+ + "\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd"+ + "\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f"+ + "\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40"+ + "\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52"+ + "\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe"+ + "\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc"+ + "\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3"+ + "A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321"+ + "\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2"+ + "\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd"+ + "\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762"+ + "\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a"+ + "\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2"+ + "\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9"+ + "\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b"+ + "\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6"+ + "\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02"+ + "\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1"+ + "\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185"+ + "\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213"+ + "\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291"+ + "\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312"+ + "\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f"+ + "\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c"+ + "\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da"+ + "\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b"+ + "\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c"+ + "\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa"+ + "\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02"+ + "\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b"+ + "\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42"+ + "\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79"+ + "\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2"+ + "\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd"+ + "\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402"+ + "\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8"+ + "\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7"+ + "\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b"+ + "\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554"+ + "\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716"+ + "\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c"+ + "\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945"+ + "\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29"+ + "\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d"+ + "\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f"+ + "\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b"+ + "\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66"+ + "\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e"+ + "\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7"+ + "\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4"+ + "\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802\4\ufa1f\4\u0600\2\4\3\2\2\2\2\6"+ + "\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2"+ + "\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34"+ + "\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2("+ + "\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2"+ + "\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2"+ + "@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3"+ + "\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2"+ + "\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2"+ + "\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r"+ + "\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2"+ + "\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2"+ + "\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090"+ + "\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2"+ + "\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2"+ + "\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2"+ + "\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4"+ + "\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2"+ + "\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6"+ + "\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2"+ + "\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8"+ + "\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2"+ + "\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea"+ + "\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2"+ + "\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc"+ + "\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2\2\2\u0102\3\2\2\2\2\u0104\3\2\2"+ + "\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a\3\2\2\2\2\u010c\3\2\2\2\2\u010e"+ + "\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2\2\2\u0114\3\2\2\2\2\u0116\3\2\2"+ + "\2\2\u0118\3\2\2\2\2\u011a\3\2\2\2\2\u011c\3\2\2\2\2\u0122\3\2\2\2\2\u0126"+ + "\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2\2\2\u012c\3\2\2\2\2\u012e\3\2\2"+ + "\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134\3\2\2\2\2\u0136\3\2\2\2\2\u0138"+ + "\3\2\2\2\2\u013a\3\2\2\2\2\u013c\3\2\2\2\3\u0152\3\2\2\2\3\u0154\3\2\2"+ + "\2\3\u0156\3\2\2\2\3\u0158\3\2\2\2\3\u015a\3\2\2\2\4\u015e\3\2\2\2\6\u0174"+ + "\3\2\2\2\b\u0176\3\2\2\2\n\u017d\3\2\2\2\f\u0185\3\2\2\2\16\u018c\3\2"+ + "\2\2\20\u0193\3\2\2\2\22\u019a\3\2\2\2\24\u01a1\3\2\2\2\26\u01aa\3\2\2"+ + "\2\30\u01b4\3\2\2\2\32\u01bc\3\2\2\2\34\u01c6\3\2\2\2\36\u01d2\3\2\2\2"+ + " \u01d9\3\2\2\2\"\u01e4\3\2\2\2$\u01e7\3\2\2\2&\u01ed\3\2\2\2(\u01f6\3"+ + "\2\2\2*\u01fb\3\2\2\2,\u0202\3\2\2\2.\u0209\3\2\2\2\60\u020f\3\2\2\2\62"+ + "\u0214\3\2\2\2\64\u021b\3\2\2\2\66\u0225\3\2\2\28\u022b\3\2\2\2:\u022e"+ + "\3\2\2\2<\u0230\3\2\2\2>\u0237\3\2\2\2@\u023d\3\2\2\2B\u024a\3\2\2\2D"+ + "\u0253\3\2\2\2F\u0257\3\2\2\2H\u025b\3\2\2\2J\u0261\3\2\2\2L\u0263\3\2"+ + "\2\2N\u0266\3\2\2\2P\u026b\3\2\2\2R\u0271\3\2\2\2T\u0277\3\2\2\2V\u027e"+ + "\3\2\2\2X\u0285\3\2\2\2Z\u028e\3\2\2\2\\\u0294\3\2\2\2^\u029a\3\2\2\2"+ + "`\u02a1\3\2\2\2b\u02a7\3\2\2\2d\u02ae\3\2\2\2f\u02b4\3\2\2\2h\u02bd\3"+ + "\2\2\2j\u02c5\3\2\2\2l\u02cb\3\2\2\2n\u02d3\3\2\2\2p\u02da\3\2\2\2r\u02df"+ + "\3\2\2\2t\u02e8\3\2\2\2v\u02f7\3\2\2\2x\u02fd\3\2\2\2z\u0301\3\2\2\2|"+ + "\u0304\3\2\2\2~\u030b\3\2\2\2\u0080\u0315\3\2\2\2\u0082\u031f\3\2\2\2"+ + "\u0084\u032b\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u033e\3\2\2\2\u008a\u0346"+ + "\3\2\2\2\u008c\u0352\3\2\2\2\u008e\u0361\3\2\2\2\u0090\u0367\3\2\2\2\u0092"+ + "\u036b\3\2\2\2\u0094\u036f\3\2\2\2\u0096\u0374\3\2\2\2\u0098\u037c\3\2"+ + "\2\2\u009a\u0384\3\2\2\2\u009c\u0389\3\2\2\2\u009e\u0393\3\2\2\2\u00a0"+ + "\u039a\3\2\2\2\u00a2\u039f\3\2\2\2\u00a4\u03a5\3\2\2\2\u00a6\u03a8\3\2"+ + "\2\2\u00a8\u03ac\3\2\2\2\u00aa\u03b3\3\2\2\2\u00ac\u03b8\3\2\2\2\u00ae"+ + "\u03bd\3\2\2\2\u00b0\u03c2\3\2\2\2\u00b2\u03ca\3\2\2\2\u00b4\u03d1\3\2"+ + "\2\2\u00b6\u03d7\3\2\2\2\u00b8\u03e5\3\2\2\2\u00ba\u03e8\3\2\2\2\u00bc"+ + "\u03ee\3\2\2\2\u00be\u03f3\3\2\2\2\u00c0\u03fe\3\2\2\2\u00c2\u0402\3\2"+ + "\2\2\u00c4\u0409\3\2\2\2\u00c6\u0412\3\2\2\2\u00c8\u0416\3\2\2\2\u00ca"+ + "\u041c\3\2\2\2\u00cc\u0426\3\2\2\2\u00ce\u0428\3\2\2\2\u00d0\u042c\3\2"+ + "\2\2\u00d2\u042e\3\2\2\2\u00d4\u0432\3\2\2\2\u00d6\u0434\3\2\2\2\u00d8"+ + "\u0438\3\2\2\2\u00da\u043a\3\2\2\2\u00dc\u043c\3\2\2\2\u00de\u043e\3\2"+ + "\2\2\u00e0\u0440\3\2\2\2\u00e2\u0442\3\2\2\2\u00e4\u0447\3\2\2\2\u00e6"+ + "\u044c\3\2\2\2\u00e8\u044f\3\2\2\2\u00ea\u0453\3\2\2\2\u00ec\u0456\3\2"+ + "\2\2\u00ee\u0459\3\2\2\2\u00f0\u045c\3\2\2\2\u00f2\u045f\3\2\2\2\u00f4"+ + "\u0461\3\2\2\2\u00f6\u0464\3\2\2\2\u00f8\u0466\3\2\2\2\u00fa\u0469\3\2"+ + "\2\2\u00fc\u046b\3\2\2\2\u00fe\u046d\3\2\2\2\u0100\u046f\3\2\2\2\u0102"+ + "\u0472\3\2\2\2\u0104\u0475\3\2\2\2\u0106\u0478\3\2\2\2\u0108\u047a\3\2"+ + "\2\2\u010a\u047c\3\2\2\2\u010c\u047e\3\2\2\2\u010e\u0480\3\2\2\2\u0110"+ + "\u0482\3\2\2\2\u0112\u0484\3\2\2\2\u0114\u0492\3\2\2\2\u0116\u0496\3\2"+ + "\2\2\u0118\u04a2\3\2\2\2\u011a\u04b0\3\2\2\2\u011c\u04bc\3\2\2\2\u011e"+ + "\u04e0\3\2\2\2\u0120\u04e2\3\2\2\2\u0122\u04eb\3\2\2\2\u0124\u04f1\3\2"+ + "\2\2\u0126\u04f8\3\2\2\2\u0128\u04fe\3\2\2\2\u012a\u0500\3\2\2\2\u012c"+ + "\u0505\3\2\2\2\u012e\u050a\3\2\2\2\u0130\u0511\3\2\2\2\u0132\u051c\3\2"+ + "\2\2\u0134\u0527\3\2\2\2\u0136\u0534\3\2\2\2\u0138\u053a\3\2\2\2\u013a"+ + "\u0549\3\2\2\2\u013c\u054f\3\2\2\2\u013e\u055e\3\2\2\2\u0140\u0560\3\2"+ + "\2\2\u0142\u057c\3\2\2\2\u0144\u0586\3\2\2\2\u0146\u0588\3\2\2\2\u0148"+ + "\u058a\3\2\2\2\u014a\u058c\3\2\2\2\u014c\u0594\3\2\2\2\u014e\u0596\3\2"+ + "\2\2\u0150\u0598\3\2\2\2\u0152\u059b\3\2\2\2\u0154\u05a1\3\2\2\2\u0156"+ + "\u05af\3\2\2\2\u0158\u05cc\3\2\2\2\u015a\u05d0\3\2\2\2\u015c\u015f\5\6"+ + "\3\2\u015d\u015f\5\u011c\u008e\2\u015e\u015c\3\2\2\2\u015e\u015d\3\2\2"+ + "\2\u015f\u0160\3\2\2\2\u0160\u0161\b\2\2\2\u0161\5\3\2\2\2\u0162\u016c"+ + "\5\u0142\u00a1\2\u0163\u0164\7\60\2\2\u0164\u0166\6\3\2\2\u0165\u0167"+ + "\5\u0142\u00a1\2\u0166\u0165\3\2\2\2\u0166\u0167\3\2\2\2\u0167\u0169\3"+ + "\2\2\2\u0168\u016a\5\u014a\u00a5\2\u0169\u0168\3\2\2\2\u0169\u016a\3\2"+ + "\2\2\u016a\u016d\3\2\2\2\u016b\u016d\5\u014a\u00a5\2\u016c\u0163\3\2\2"+ + "\2\u016c\u016b\3\2\2\2\u016d\u0175\3\2\2\2\u016e\u016f\7\60\2\2\u016f"+ + "\u0170\6\3\3\2\u0170\u0172\5\u0142\u00a1\2\u0171\u0173\5\u014a\u00a5\2"+ + "\u0172\u0171\3\2\2\2\u0172\u0173\3\2\2\2\u0173\u0175\3\2\2\2\u0174\u0162"+ + "\3\2\2\2\u0174\u016e\3\2\2\2\u0175\7\3\2\2\2\u0176\u0177\7v\2\2\u0177"+ + "\u0178\7t\2\2\u0178\u0179\7w\2\2\u0179\u017a\7g\2\2\u017a\u017b\3\2\2"+ + "\2\u017b\u017c\b\4\2\2\u017c\t\3\2\2\2\u017d\u017e\7h\2\2\u017e\u017f"+ + "\7c\2\2\u017f\u0180\7n\2\2\u0180\u0181\7u\2\2\u0181\u0182\7g\2\2\u0182"+ + "\u0183\3\2\2\2\u0183\u0184\b\5\2\2\u0184\13\3\2\2\2\u0185\u0186\7c\2\2"+ + "\u0186\u0187\7u\2\2\u0187\u0188\7u\2\2\u0188\u0189\7g\2\2\u0189\u018a"+ + "\7t\2\2\u018a\u018b\7v\2\2\u018b\r\3\2\2\2\u018c\u018d\7c\2\2\u018d\u018e"+ + "\7u\2\2\u018e\u018f\7u\2\2\u018f\u0190\7w\2\2\u0190\u0191\7o\2\2\u0191"+ + "\u0192\7g\2\2\u0192\17\3\2\2\2\u0193\u0194\7k\2\2\u0194\u0195\7p\2\2\u0195"+ + "\u0196\7j\2\2\u0196\u0197\7c\2\2\u0197\u0198\7n\2\2\u0198\u0199\7g\2\2"+ + "\u0199\21\3\2\2\2\u019a\u019b\7g\2\2\u019b\u019c\7z\2\2\u019c\u019d\7"+ + "j\2\2\u019d\u019e\7c\2\2\u019e\u019f\7n\2\2\u019f\u01a0\7g\2\2\u01a0\23"+ + "\3\2\2\2\u01a1\u01a2\7t\2\2\u01a2\u01a3\7g\2\2\u01a3\u01a4\7s\2\2\u01a4"+ + "\u01a5\7w\2\2\u01a5\u01a6\7k\2\2\u01a6\u01a7\7t\2\2\u01a7\u01a8\7g\2\2"+ + "\u01a8\u01a9\7u\2\2\u01a9\25\3\2\2\2\u01aa\u01ab\7r\2\2\u01ab\u01ac\7"+ + "t\2\2\u01ac\u01ad\7g\2\2\u01ad\u01ae\7u\2\2\u01ae\u01af\7g\2\2\u01af\u01b0"+ + "\7t\2\2\u01b0\u01b1\7x\2\2\u01b1\u01b2\7g\2\2\u01b2\u01b3\7u\2\2\u01b3"+ + "\27\3\2\2\2\u01b4\u01b5\7g\2\2\u01b5\u01b6\7p\2\2\u01b6\u01b7\7u\2\2\u01b7"+ + "\u01b8\7w\2\2\u01b8\u01b9\7t\2\2\u01b9\u01ba\7g\2\2\u01ba\u01bb\7u\2\2"+ + "\u01bb\31\3\2\2\2\u01bc\u01bd\7k\2\2\u01bd\u01be\7p\2\2\u01be\u01bf\7"+ + "x\2\2\u01bf\u01c0\7c\2\2\u01c0\u01c1\7t\2\2\u01c1\u01c2\7k\2\2\u01c2\u01c3"+ + "\7c\2\2\u01c3\u01c4\7p\2\2\u01c4\u01c5\7v\2\2\u01c5\33\3\2\2\2\u01c6\u01c7"+ + "\7f\2\2\u01c7\u01c8\7g\2\2\u01c8\u01c9\7e\2\2\u01c9\u01ca\7t\2\2\u01ca"+ + "\u01cb\7g\2\2\u01cb\u01cc\7c\2\2\u01cc\u01cd\7u\2\2\u01cd\u01ce\7g\2\2"+ + "\u01ce\u01cf\7u\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d1\b\16\2\2\u01d1\35"+ + "\3\2\2\2\u01d2\u01d3\7r\2\2\u01d3\u01d4\7w\2\2\u01d4\u01d5\7t\2\2\u01d5"+ + "\u01d6\7g\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\b\17\2\2\u01d8\37\3\2\2"+ + "\2\u01d9\u01da\7k\2\2\u01da\u01db\7o\2\2\u01db\u01dc\7r\2\2\u01dc\u01dd"+ + "\7n\2\2\u01dd\u01de\7g\2\2\u01de\u01df\7o\2\2\u01df\u01e0\7g\2\2\u01e0"+ + "\u01e1\7p\2\2\u01e1\u01e2\7v\2\2\u01e2\u01e3\7u\2\2\u01e3!\3\2\2\2\u01e4"+ + "\u01e5\7c\2\2\u01e5\u01e6\7u\2\2\u01e6#\3\2\2\2\u01e7\u01e8\7q\2\2\u01e8"+ + "\u01e9\7n\2\2\u01e9\u01ea\7f\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ec\b\22"+ + "\2\2\u01ec%\3\2\2\2\u01ed\u01ee\7d\2\2\u01ee\u01ef\7g\2\2\u01ef\u01f0"+ + "\7h\2\2\u01f0\u01f1\7q\2\2\u01f1\u01f2\7t\2\2\u01f2\u01f3\7g\2\2\u01f3"+ + "\u01f4\3\2\2\2\u01f4\u01f5\b\23\2\2\u01f5\'\3\2\2\2\u01f6\u01f7\7%\2\2"+ + "\u01f7\u01f8\7n\2\2\u01f8\u01f9\7j\2\2\u01f9\u01fa\7u\2\2\u01fa)\3\2\2"+ + "\2\u01fb\u01fc\7h\2\2\u01fc\u01fd\7q\2\2\u01fd\u01fe\7t\2\2\u01fe\u01ff"+ + "\7c\2\2\u01ff\u0200\7n\2\2\u0200\u0201\7n\2\2\u0201+\3\2\2\2\u0202\u0203"+ + "\7g\2\2\u0203\u0204\7z\2\2\u0204\u0205\7k\2\2\u0205\u0206\7u\2\2\u0206"+ + "\u0207\7v\2\2\u0207\u0208\7u\2\2\u0208-\3\2\2\2\u0209\u020a\7c\2\2\u020a"+ + "\u020b\7e\2\2\u020b\u020c\7e\2\2\u020c\u020d\3\2\2\2\u020d\u020e\b\27"+ + "\2\2\u020e/\3\2\2\2\u020f\u0210\7h\2\2\u0210\u0211\7q\2\2\u0211\u0212"+ + "\7n\2\2\u0212\u0213\7f\2\2\u0213\61\3\2\2\2\u0214\u0215\7w\2\2\u0215\u0216"+ + "\7p\2\2\u0216\u0217\7h\2\2\u0217\u0218\7q\2\2\u0218\u0219\7n\2\2\u0219"+ + "\u021a\7f\2\2\u021a\63\3\2\2\2\u021b\u021c\7w\2\2\u021c\u021d\7p\2\2\u021d"+ + "\u021e\7h\2\2\u021e\u021f\7q\2\2\u021f\u0220\7n\2\2\u0220\u0221\7f\2\2"+ + "\u0221\u0222\7k\2\2\u0222\u0223\7p\2\2\u0223\u0224\7i\2\2\u0224\65\3\2"+ + "\2\2\u0225\u0226\7i\2\2\u0226\u0227\7j\2\2\u0227\u0228\7q\2\2\u0228\u0229"+ + "\7u\2\2\u0229\u022a\7v\2\2\u022a\67\3\2\2\2\u022b\u022c\7k\2\2\u022c\u022d"+ + "\7p\2\2\u022d9\3\2\2\2\u022e\u022f\7%\2\2\u022f;\3\2\2\2\u0230\u0231\7"+ + "u\2\2\u0231\u0232\7w\2\2\u0232\u0233\7d\2\2\u0233\u0234\7u\2\2\u0234\u0235"+ + "\7g\2\2\u0235\u0236\7v\2\2\u0236=\3\2\2\2\u0237\u0238\7w\2\2\u0238\u0239"+ + "\7p\2\2\u0239\u023a\7k\2\2\u023a\u023b\7q\2\2\u023b\u023c\7p\2\2\u023c"+ + "?\3\2\2\2\u023d\u023e\7k\2\2\u023e\u023f\7p\2\2\u023f\u0240\7v\2\2\u0240"+ + "\u0241\7g\2\2\u0241\u0242\7t\2\2\u0242\u0243\7u\2\2\u0243\u0244\7g\2\2"+ + "\u0244\u0245\7e\2\2\u0245\u0246\7v\2\2\u0246\u0247\7k\2\2\u0247\u0248"+ + "\7q\2\2\u0248\u0249\7p\2\2\u0249A\3\2\2\2\u024a\u024b\7u\2\2\u024b\u024c"+ + "\7g\2\2\u024c\u024d\7v\2\2\u024d\u024e\7o\2\2\u024e\u024f\7k\2\2\u024f"+ + "\u0250\7p\2\2\u0250\u0251\7w\2\2\u0251\u0252\7u\2\2\u0252C\3\2\2\2\u0253"+ + "\u0254\7?\2\2\u0254\u0255\7?\2\2\u0255\u0256\7@\2\2\u0256E\3\2\2\2\u0257"+ + "\u0258\7/\2\2\u0258\u0259\7/\2\2\u0259\u025a\7,\2\2\u025aG\3\2\2\2\u025b"+ + "\u025c\7c\2\2\u025c\u025d\7r\2\2\u025d\u025e\7r\2\2\u025e\u025f\7n\2\2"+ + "\u025f\u0260\7{\2\2\u0260I\3\2\2\2\u0261\u0262\7A\2\2\u0262K\3\2\2\2\u0263"+ + "\u0264\7#\2\2\u0264\u0265\7>\2\2\u0265M\3\2\2\2\u0266\u0267\7#\2\2\u0267"+ + "\u0268\7@\2\2\u0268\u0269\3\2\2\2\u0269\u026a\b\'\2\2\u026aO\3\2\2\2\u026b"+ + "\u026c\7u\2\2\u026c\u026d\7g\2\2\u026d\u026e\7s\2\2\u026e\u026f\3\2\2"+ + "\2\u026f\u0270\b(\2\2\u0270Q\3\2\2\2\u0271\u0272\7u\2\2\u0272\u0273\7"+ + "g\2\2\u0273\u0274\7v\2\2\u0274\u0275\3\2\2\2\u0275\u0276\b)\2\2\u0276"+ + "S\3\2\2\2\u0277\u0278\7o\2\2\u0278\u0279\7u\2\2\u0279\u027a\7g\2\2\u027a"+ + "\u027b\7v\2\2\u027b\u027c\3\2\2\2\u027c\u027d\b*\2\2\u027dU\3\2\2\2\u027e"+ + "\u027f\7f\2\2\u027f\u0280\7k\2\2\u0280\u0281\7e\2\2\u0281\u0282\7v\2\2"+ + "\u0282\u0283\3\2\2\2\u0283\u0284\b+\2\2\u0284W\3\2\2\2\u0285\u0286\7q"+ + "\2\2\u0286\u0287\7r\2\2\u0287\u0288\7v\2\2\u0288\u0289\7k\2\2\u0289\u028a"+ + "\7q\2\2\u028a\u028b\7p\2\2\u028b\u028c\3\2\2\2\u028c\u028d\b,\2\2\u028d"+ + "Y\3\2\2\2\u028e\u028f\7n\2\2\u028f\u0290\7g\2\2\u0290\u0291\7p\2\2\u0291"+ + "\u0292\3\2\2\2\u0292\u0293\b-\2\2\u0293[\3\2\2\2\u0294\u0295\7p\2\2\u0295"+ + "\u0296\7g\2\2\u0296\u0297\7y\2\2\u0297\u0298\3\2\2\2\u0298\u0299\b.\2"+ + "\2\u0299]\3\2\2\2\u029a\u029b\7o\2\2\u029b\u029c\7c\2\2\u029c\u029d\7"+ + "m\2\2\u029d\u029e\7g\2\2\u029e\u029f\3\2\2\2\u029f\u02a0\b/\2\2\u02a0"+ + "_\3\2\2\2\u02a1\u02a2\7e\2\2\u02a2\u02a3\7c\2\2\u02a3\u02a4\7r\2\2\u02a4"+ + "\u02a5\3\2\2\2\u02a5\u02a6\b\60\2\2\u02a6a\3\2\2\2\u02a7\u02a8\7u\2\2"+ + "\u02a8\u02a9\7q\2\2\u02a9\u02aa\7o\2\2\u02aa\u02ab\7g\2\2\u02ab\u02ac"+ + "\3\2\2\2\u02ac\u02ad\b\61\2\2\u02adc\3\2\2\2\u02ae\u02af\7i\2\2\u02af"+ + "\u02b0\7g\2\2\u02b0\u02b1\7v\2\2\u02b1\u02b2\3\2\2\2\u02b2\u02b3\b\62"+ + "\2\2\u02b3e\3\2\2\2\u02b4\u02b5\7f\2\2\u02b5\u02b6\7q\2\2\u02b6\u02b7"+ + "\7o\2\2\u02b7\u02b8\7c\2\2\u02b8\u02b9\7k\2\2\u02b9\u02ba\7p\2\2\u02ba"+ + "\u02bb\3\2\2\2\u02bb\u02bc\b\63\2\2\u02bcg\3\2\2\2\u02bd\u02be\7c\2\2"+ + "\u02be\u02bf\7z\2\2\u02bf\u02c0\7k\2\2\u02c0\u02c1\7q\2\2\u02c1\u02c2"+ + "\7o\2\2\u02c2\u02c3\3\2\2\2\u02c3\u02c4\b\64\2\2\u02c4i\3\2\2\2\u02c5"+ + "\u02c6\7c\2\2\u02c6\u02c7\7f\2\2\u02c7\u02c8\7v\2\2\u02c8\u02c9\3\2\2"+ + "\2\u02c9\u02ca\b\65\2\2\u02cak\3\2\2\2\u02cb\u02cc\7o\2\2\u02cc\u02cd"+ + "\7c\2\2\u02cd\u02ce\7v\2\2\u02ce\u02cf\7e\2\2\u02cf\u02d0\7j\2\2\u02d0"+ + "\u02d1\3\2\2\2\u02d1\u02d2\b\66\2\2\u02d2m\3\2\2\2\u02d3\u02d4\7p\2\2"+ + "\u02d4\u02d5\7q\2\2\u02d5\u02d6\7p\2\2\u02d6\u02d7\7g\2\2\u02d7\u02d8"+ + "\3\2\2\2\u02d8\u02d9\b\67\2\2\u02d9o\3\2\2\2\u02da\u02db\7r\2\2\u02db"+ + "\u02dc\7t\2\2\u02dc\u02dd\7g\2\2\u02dd\u02de\7f\2\2\u02deq\3\2\2\2\u02df"+ + "\u02e0\7v\2\2\u02e0\u02e1\7{\2\2\u02e1\u02e2\7r\2\2\u02e2\u02e3\7g\2\2"+ + "\u02e3\u02e4\7Q\2\2\u02e4\u02e5\7h\2\2\u02e5\u02e6\3\2\2\2\u02e6\u02e7"+ + "\b9\2\2\u02e7s\3\2\2\2\u02e8\u02e9\7k\2\2\u02e9\u02ea\7u\2\2\u02ea\u02eb"+ + "\7E\2\2\u02eb\u02ec\7q\2\2\u02ec\u02ed\7o\2\2\u02ed\u02ee\7r\2\2\u02ee"+ + "\u02ef\7c\2\2\u02ef\u02f0\7t\2\2\u02f0\u02f1\7c\2\2\u02f1\u02f2\7d\2\2"+ + "\u02f2\u02f3\7n\2\2\u02f3\u02f4\7g\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f6"+ + "\b:\2\2\u02f6u\3\2\2\2\u02f7\u02f8\7u\2\2\u02f8\u02f9\7j\2\2\u02f9\u02fa"+ + "\7c\2\2\u02fa\u02fb\7t\2\2\u02fb\u02fc\7g\2\2\u02fcw\3\2\2\2\u02fd\u02fe"+ + "\7B\2\2\u02fe\u02ff\3\2\2\2\u02ff\u0300\b<\2\2\u0300y\3\2\2\2\u0301\u0302"+ + "\7\60\2\2\u0302\u0303\7\60\2\2\u0303{\3\2\2\2\u0304\u0305\7u\2\2\u0305"+ + "\u0306\7j\2\2\u0306\u0307\7c\2\2\u0307\u0308\7t\2\2\u0308\u0309\7g\2\2"+ + "\u0309\u030a\7f\2\2\u030a}\3\2\2\2\u030b\u030c\7g\2\2\u030c\u030d\7z\2"+ + "\2\u030d\u030e\7e\2\2\u030e\u030f\7n\2\2\u030f\u0310\7w\2\2\u0310\u0311"+ + "\7u\2\2\u0311\u0312\7k\2\2\u0312\u0313\7x\2\2\u0313\u0314\7g\2\2\u0314"+ + "\177\3\2\2\2\u0315\u0316\7r\2\2\u0316\u0317\7t\2\2\u0317\u0318\7g\2\2"+ + "\u0318\u0319\7f\2\2\u0319\u031a\7k\2\2\u031a\u031b\7e\2\2\u031b\u031c"+ + "\7c\2\2\u031c\u031d\7v\2\2\u031d\u031e\7g\2\2\u031e\u0081\3\2\2\2\u031f"+ + "\u0320\7y\2\2\u0320\u0321\7t\2\2\u0321\u0322\7k\2\2\u0322\u0323\7v\2\2"+ + "\u0323\u0324\7g\2\2\u0324\u0325\7R\2\2\u0325\u0326\7g\2\2\u0326\u0327"+ + "\7t\2\2\u0327\u0328\7o\2\2\u0328\u0329\3\2\2\2\u0329\u032a\bA\2\2\u032a"+ + "\u0083\3\2\2\2\u032b\u032c\7p\2\2\u032c\u032d\7q\2\2\u032d\u032e\7R\2"+ + "\2\u032e\u032f\7g\2\2\u032f\u0330\7t\2\2\u0330\u0331\7o\2\2\u0331\u0332"+ + "\3\2\2\2\u0332\u0333\bB\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7v\2\2\u0335"+ + "\u0336\7t\2\2\u0336\u0337\7w\2\2\u0337\u0338\7u\2\2\u0338\u0339\7v\2\2"+ + "\u0339\u033a\7g\2\2\u033a\u033b\7f\2\2\u033b\u033c\3\2\2\2\u033c\u033d"+ + "\bC\2\2\u033d\u0087\3\2\2\2\u033e\u033f\7q\2\2\u033f\u0340\7w\2\2\u0340"+ + "\u0341\7v\2\2\u0341\u0342\7n\2\2\u0342\u0343\7k\2\2\u0343\u0344\7p\2\2"+ + "\u0344\u0345\7g\2\2\u0345\u0089\3\2\2\2\u0346\u0347\7k\2\2\u0347\u0348"+ + "\7p\2\2\u0348\u0349\7k\2\2\u0349\u034a\7v\2\2\u034a\u034b\7G\2\2\u034b"+ + "\u034c\7p\2\2\u034c\u034d\7u\2\2\u034d\u034e\7w\2\2\u034e\u034f\7t\2\2"+ + "\u034f\u0350\7g\2\2\u0350\u0351\7u\2\2\u0351\u008b\3\2\2\2\u0352\u0353"+ + "\7k\2\2\u0353\u0354\7o\2\2\u0354\u0355\7r\2\2\u0355\u0356\7q\2\2\u0356"+ + "\u0357\7t\2\2\u0357\u0358\7v\2\2\u0358\u0359\7T\2\2\u0359\u035a\7g\2\2"+ + "\u035a\u035b\7s\2\2\u035b\u035c\7w\2\2\u035c\u035d\7k\2\2\u035d\u035e"+ + "\7t\2\2\u035e\u035f\7g\2\2\u035f\u0360\7u\2\2\u0360\u008d\3\2\2\2\u0361"+ + "\u0362\7r\2\2\u0362\u0363\7t\2\2\u0363\u0364\7q\2\2\u0364\u0365\7q\2\2"+ + "\u0365\u0366\7h\2\2\u0366\u008f\3\2\2\2\u0367\u0368\7?\2\2\u0368\u0369"+ + "\7?\2\2\u0369\u036a\7?\2\2\u036a\u0091\3\2\2\2\u036b\u036c\7#\2\2\u036c"+ + "\u036d\7?\2\2\u036d\u036e\7?\2\2\u036e\u0093\3\2\2\2\u036f\u0370\7y\2"+ + "\2\u0370\u0371\7k\2\2\u0371\u0372\7v\2\2\u0372\u0373\7j\2\2\u0373\u0095"+ + "\3\2\2\2\u0374\u0375\7d\2\2\u0375\u0376\7t\2\2\u0376\u0377\7g\2\2\u0377"+ + "\u0378\7c\2\2\u0378\u0379\7m\2\2\u0379\u037a\3\2\2\2\u037a\u037b\bK\2"+ + "\2\u037b\u0097\3\2\2\2\u037c\u037d\7f\2\2\u037d\u037e\7g\2\2\u037e\u037f"+ + "\7h\2\2\u037f\u0380\7c\2\2\u0380\u0381\7w\2\2\u0381\u0382\7n\2\2\u0382"+ + "\u0383\7v\2\2\u0383\u0099\3\2\2\2\u0384\u0385\7h\2\2\u0385\u0386\7w\2"+ + "\2\u0386\u0387\7p\2\2\u0387\u0388\7e\2\2\u0388\u009b\3\2\2\2\u0389\u038a"+ + "\7k\2\2\u038a\u038b\7p\2\2\u038b\u038c\7v\2\2\u038c\u038d\7g\2\2\u038d"+ + "\u038e\7t\2\2\u038e\u038f\7h\2\2\u038f\u0390\7c\2\2\u0390\u0391\7e\2\2"+ + "\u0391\u0392\7g\2\2\u0392\u009d\3\2\2\2\u0393\u0394\7u\2\2\u0394\u0395"+ + "\7g\2\2\u0395\u0396\7n\2\2\u0396\u0397\7g\2\2\u0397\u0398\7e\2\2\u0398"+ + "\u0399\7v\2\2\u0399\u009f\3\2\2\2\u039a\u039b\7e\2\2\u039b\u039c\7c\2"+ + "\2\u039c\u039d\7u\2\2\u039d\u039e\7g\2\2\u039e\u00a1\3\2\2\2\u039f\u03a0"+ + "\7f\2\2\u03a0\u03a1\7g\2\2\u03a1\u03a2\7h\2\2\u03a2\u03a3\7g\2\2\u03a3"+ + "\u03a4\7t\2\2\u03a4\u00a3\3\2\2\2\u03a5\u03a6\7i\2\2\u03a6\u03a7\7q\2"+ + "\2\u03a7\u00a5\3\2\2\2\u03a8\u03a9\7o\2\2\u03a9\u03aa\7c\2\2\u03aa\u03ab"+ + "\7r\2\2\u03ab\u00a7\3\2\2\2\u03ac\u03ad\7u\2\2\u03ad\u03ae\7v\2\2\u03ae"+ + "\u03af\7t\2\2\u03af\u03b0\7w\2\2\u03b0\u03b1\7e\2\2\u03b1\u03b2\7v\2\2"+ + "\u03b2\u00a9\3\2\2\2\u03b3\u03b4\7e\2\2\u03b4\u03b5\7j\2\2\u03b5\u03b6"+ + "\7c\2\2\u03b6\u03b7\7p\2\2\u03b7\u00ab\3\2\2\2\u03b8\u03b9\7g\2\2\u03b9"+ + "\u03ba\7n\2\2\u03ba\u03bb\7u\2\2\u03bb\u03bc\7g\2\2\u03bc\u00ad\3\2\2"+ + "\2\u03bd\u03be\7i\2\2\u03be\u03bf\7q\2\2\u03bf\u03c0\7v\2\2\u03c0\u03c1"+ + "\7q\2\2\u03c1\u00af\3\2\2\2\u03c2\u03c3\7r\2\2\u03c3\u03c4\7c\2\2\u03c4"+ + "\u03c5\7e\2\2\u03c5\u03c6\7m\2\2\u03c6\u03c7\7c\2\2\u03c7\u03c8\7i\2\2"+ + "\u03c8\u03c9\7g\2\2\u03c9\u00b1\3\2\2\2\u03ca\u03cb\7u\2\2\u03cb\u03cc"+ + "\7y\2\2\u03cc\u03cd\7k\2\2\u03cd\u03ce\7v\2\2\u03ce\u03cf\7e\2\2\u03cf"+ + "\u03d0\7j\2\2\u03d0\u00b3\3\2\2\2\u03d1\u03d2\7e\2\2\u03d2\u03d3\7q\2"+ + "\2\u03d3\u03d4\7p\2\2\u03d4\u03d5\7u\2\2\u03d5\u03d6\7v\2\2\u03d6\u00b5"+ + "\3\2\2\2\u03d7\u03d8\7h\2\2\u03d8\u03d9\7c\2\2\u03d9\u03da\7n\2\2\u03da"+ + "\u03db\7n\2\2\u03db\u03dc\7v\2\2\u03dc\u03dd\7j\2\2\u03dd\u03de\7t\2\2"+ + "\u03de\u03df\7q\2\2\u03df\u03e0\7w\2\2\u03e0\u03e1\7i\2\2\u03e1\u03e2"+ + "\7j\2\2\u03e2\u03e3\3\2\2\2\u03e3\u03e4\b[\2\2\u03e4\u00b7\3\2\2\2\u03e5"+ + "\u03e6\7k\2\2\u03e6\u03e7\7h\2\2\u03e7\u00b9\3\2\2\2\u03e8\u03e9\7t\2"+ + "\2\u03e9\u03ea\7c\2\2\u03ea\u03eb\7p\2\2\u03eb\u03ec\7i\2\2\u03ec\u03ed"+ + "\7g\2\2\u03ed\u00bb\3\2\2\2\u03ee\u03ef\7v\2\2\u03ef\u03f0\7{\2\2\u03f0"+ + "\u03f1\7r\2\2\u03f1\u03f2\7g\2\2\u03f2\u00bd\3\2\2\2\u03f3\u03f4\7e\2"+ + "\2\u03f4\u03f5\7q\2\2\u03f5\u03f6\7p\2\2\u03f6\u03f7\7v\2\2\u03f7\u03f8"+ + "\7k\2\2\u03f8\u03f9\7p\2\2\u03f9\u03fa\7w\2\2\u03fa\u03fb\7g\2\2\u03fb"+ + "\u03fc\3\2\2\2\u03fc\u03fd\b_\2\2\u03fd\u00bf\3\2\2\2\u03fe\u03ff\7h\2"+ + "\2\u03ff\u0400\7q\2\2\u0400\u0401\7t\2\2\u0401\u00c1\3\2\2\2\u0402\u0403"+ + "\7k\2\2\u0403\u0404\7o\2\2\u0404\u0405\7r\2\2\u0405\u0406\7q\2\2\u0406"+ + "\u0407\7t\2\2\u0407\u0408\7v\2\2\u0408\u00c3\3\2\2\2\u0409\u040a\7t\2"+ + "\2\u040a\u040b\7g\2\2\u040b\u040c\7v\2\2\u040c\u040d\7w\2\2\u040d\u040e"+ + "\7t\2\2\u040e\u040f\7p\2\2\u040f\u0410\3\2\2\2\u0410\u0411\bb\2\2\u0411"+ + "\u00c5\3\2\2\2\u0412\u0413\7x\2\2\u0413\u0414\7c\2\2\u0414\u0415\7t\2"+ + "\2\u0415\u00c7\3\2\2\2\u0416\u0417\7p\2\2\u0417\u0418\7k\2\2\u0418\u0419"+ + "\7n\2\2\u0419\u041a\3\2\2\2\u041a\u041b\bd\2\2\u041b\u00c9\3\2\2\2\u041c"+ + "\u0421\5\u014c\u00a6\2\u041d\u0420\5\u014c\u00a6\2\u041e\u0420\5\u014e"+ + "\u00a7\2\u041f\u041d\3\2\2\2\u041f\u041e\3\2\2\2\u0420\u0423\3\2\2\2\u0421"+ + "\u041f\3\2\2\2\u0421\u0422\3\2\2\2\u0422\u0424\3\2\2\2\u0423\u0421\3\2"+ + "\2\2\u0424\u0425\be\2\2\u0425\u00cb\3\2\2\2\u0426\u0427\7*\2\2\u0427\u00cd"+ + "\3\2\2\2\u0428\u0429\7+\2\2\u0429\u042a\3\2\2\2\u042a\u042b\bg\2\2\u042b"+ + "\u00cf\3\2\2\2\u042c\u042d\7}\2\2\u042d\u00d1\3\2\2\2\u042e\u042f\7\177"+ + "\2\2\u042f\u0430\3\2\2\2\u0430\u0431\bi\2\2\u0431\u00d3\3\2\2\2\u0432"+ + "\u0433\7]\2\2\u0433\u00d5\3\2\2\2\u0434\u0435\7_\2\2\u0435\u0436\3\2\2"+ + "\2\u0436\u0437\bk\2\2\u0437\u00d7\3\2\2\2\u0438\u0439\7?\2\2\u0439\u00d9"+ + "\3\2\2\2\u043a\u043b\7.\2\2\u043b\u00db\3\2\2\2\u043c\u043d\7=\2\2\u043d"+ + "\u00dd\3\2\2\2\u043e\u043f\7<\2\2\u043f\u00df\3\2\2\2\u0440\u0441\7\60"+ + "\2\2\u0441\u00e1\3\2\2\2\u0442\u0443\7-\2\2\u0443\u0444\7-\2\2\u0444\u0445"+ + "\3\2\2\2\u0445\u0446\bq\2\2\u0446\u00e3\3\2\2\2\u0447\u0448\7/\2\2\u0448"+ + "\u0449\7/\2\2\u0449\u044a\3\2\2\2\u044a\u044b\br\2\2\u044b\u00e5\3\2\2"+ + "\2\u044c\u044d\7<\2\2\u044d\u044e\7?\2\2\u044e\u00e7\3\2\2\2\u044f\u0450"+ + "\7\60\2\2\u0450\u0451\7\60\2\2\u0451\u0452\7\60\2\2\u0452\u00e9\3\2\2"+ + "\2\u0453\u0454\7~\2\2\u0454\u0455\7~\2\2\u0455\u00eb\3\2\2\2\u0456\u0457"+ + "\7(\2\2\u0457\u0458\7(\2\2\u0458\u00ed\3\2\2\2\u0459\u045a\7?\2\2\u045a"+ + "\u045b\7?\2\2\u045b\u00ef\3\2\2\2\u045c\u045d\7#\2\2\u045d\u045e\7?\2"+ + "\2\u045e\u00f1\3\2\2\2\u045f\u0460\7>\2\2\u0460\u00f3\3\2\2\2\u0461\u0462"+ + "\7>\2\2\u0462\u0463\7?\2\2\u0463\u00f5\3\2\2\2\u0464\u0465\7@\2\2\u0465"+ + "\u00f7\3\2\2\2\u0466\u0467\7@\2\2\u0467\u0468\7?\2\2\u0468\u00f9\3\2\2"+ + "\2\u0469\u046a\7~\2\2\u046a\u00fb\3\2\2\2\u046b\u046c\7\61\2\2\u046c\u00fd"+ + "\3\2\2\2\u046d\u046e\7\'\2\2\u046e\u00ff\3\2\2\2\u046f\u0470\7>\2\2\u0470"+ + "\u0471\7>\2\2\u0471\u0101\3\2\2\2\u0472\u0473\7@\2\2\u0473\u0474\7@\2"+ + "\2\u0474\u0103\3\2\2\2\u0475\u0476\7(\2\2\u0476\u0477\7`\2\2\u0477\u0105"+ + "\3\2\2\2\u0478\u0479\7#\2\2\u0479\u0107\3\2\2\2\u047a\u047b\7-\2\2\u047b"+ + "\u0109\3\2\2\2\u047c\u047d\7/\2\2\u047d\u010b\3\2\2\2\u047e\u047f\7`\2"+ + "\2\u047f\u010d\3\2\2\2\u0480\u0481\7,\2\2\u0481\u010f\3\2\2\2\u0482\u0483"+ + "\7(\2\2\u0483\u0111\3\2\2\2\u0484\u0485\7>\2\2\u0485\u0486\7/\2\2\u0486"+ + "\u0113\3\2\2\2\u0487\u0493\7\62\2\2\u0488\u048f\t\2\2\2\u0489\u048b\7"+ + "a\2\2\u048a\u0489\3\2\2\2\u048a\u048b\3\2\2\2\u048b\u048c\3\2\2\2\u048c"+ + "\u048e\t\3\2\2\u048d\u048a\3\2\2\2\u048e\u0491\3\2\2\2\u048f\u048d\3\2"+ + "\2\2\u048f\u0490\3\2\2\2\u0490\u0493\3\2\2\2\u0491\u048f\3\2\2\2\u0492"+ + "\u0487\3\2\2\2\u0492\u0488\3\2\2\2\u0493\u0494\3\2\2\2\u0494\u0495\b\u008a"+ + "\2\2\u0495\u0115\3\2\2\2\u0496\u0497\7\62\2\2\u0497\u049c\t\4\2\2\u0498"+ + "\u049a\7a\2\2\u0499\u0498\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u049b\3\2"+ + "\2\2\u049b\u049d\5\u0148\u00a4\2\u049c\u0499\3\2\2\2\u049d\u049e\3\2\2"+ + "\2\u049e\u049c\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u04a0\3\2\2\2\u04a0\u04a1"+ + "\b\u008b\2\2\u04a1\u0117\3\2\2\2\u04a2\u04a4\7\62\2\2\u04a3\u04a5\t\5"+ + "\2\2\u04a4\u04a3\3\2\2\2\u04a4\u04a5\3\2\2\2\u04a5\u04aa\3\2\2\2\u04a6"+ + "\u04a8\7a\2\2\u04a7\u04a6\3\2\2\2\u04a7\u04a8\3\2\2\2\u04a8\u04a9\3\2"+ + "\2\2\u04a9\u04ab\5\u0144\u00a2\2\u04aa\u04a7\3\2\2\2\u04ab\u04ac\3\2\2"+ + "\2\u04ac\u04aa\3\2\2\2\u04ac\u04ad\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04af"+ + "\b\u008c\2\2\u04af\u0119\3\2\2\2\u04b0\u04b1\7\62\2\2\u04b1\u04b6\t\6"+ + "\2\2\u04b2\u04b4\7a\2\2\u04b3\u04b2\3\2\2\2\u04b3\u04b4\3\2\2\2\u04b4"+ + "\u04b5\3\2\2\2\u04b5\u04b7\5\u0146\u00a3\2\u04b6\u04b3\3\2\2\2\u04b7\u04b8"+ + "\3\2\2\2\u04b8\u04b6\3\2\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba"+ + "\u04bb\b\u008d\2\2\u04bb\u011b\3\2\2\2\u04bc\u04bd\7\62\2\2\u04bd\u04be"+ + "\t\6\2\2\u04be\u04bf\5\u011e\u008f\2\u04bf\u04c0\5\u0120\u0090\2\u04c0"+ + "\u011d\3\2\2\2\u04c1\u04c3\7a\2\2\u04c2\u04c1\3\2\2\2\u04c2\u04c3\3\2"+ + "\2\2\u04c3\u04c4\3\2\2\2\u04c4\u04c6\5\u0146\u00a3\2\u04c5\u04c2\3\2\2"+ + "\2\u04c6\u04c7\3\2\2\2\u04c7\u04c5\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04d3"+ + "\3\2\2\2\u04c9\u04d0\7\60\2\2\u04ca\u04cc\7a\2\2\u04cb\u04ca\3\2\2\2\u04cb"+ + "\u04cc\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd\u04cf\5\u0146\u00a3\2\u04ce\u04cb"+ + "\3\2\2\2\u04cf\u04d2\3\2\2\2\u04d0\u04ce\3\2\2\2\u04d0\u04d1\3\2\2\2\u04d1"+ + "\u04d4\3\2\2\2\u04d2\u04d0\3\2\2\2\u04d3\u04c9\3\2\2\2\u04d3\u04d4\3\2"+ + "\2\2\u04d4\u04e1\3\2\2\2\u04d5\u04d6\7\60\2\2\u04d6\u04dd\5\u0146\u00a3"+ + "\2\u04d7\u04d9\7a\2\2\u04d8\u04d7\3\2\2\2\u04d8\u04d9\3\2\2\2\u04d9\u04da"+ + "\3\2\2\2\u04da\u04dc\5\u0146\u00a3\2\u04db\u04d8\3\2\2\2\u04dc\u04df\3"+ + "\2\2\2\u04dd\u04db\3\2\2\2\u04dd\u04de\3\2\2\2\u04de\u04e1\3\2\2\2\u04df"+ + "\u04dd\3\2\2\2\u04e0\u04c5\3\2\2\2\u04e0\u04d5\3\2\2\2\u04e1\u011f\3\2"+ + "\2\2\u04e2\u04e3\t\7\2\2\u04e3\u04e4\t\b\2\2\u04e4\u04e5\5\u0142\u00a1"+ + "\2\u04e5\u0121\3\2\2\2\u04e6\u04ec\5\u0114\u008a\2\u04e7\u04ec\5\u0116"+ + "\u008b\2\u04e8\u04ec\5\u0118\u008c\2\u04e9\u04ec\5\u011a\u008d\2\u04ea"+ + "\u04ec\5\4\2\2\u04eb\u04e6\3\2\2\2\u04eb\u04e7\3\2\2\2\u04eb\u04e8\3\2"+ + "\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ea\3\2\2\2\u04ec\u04ed\3\2\2\2\u04ed"+ + "\u04ee\7k\2\2\u04ee\u04ef\3\2\2\2\u04ef\u04f0\b\u0091\2\2\u04f0\u0123"+ + "\3\2\2\2\u04f1\u04f4\7)\2\2\u04f2\u04f5\5\u013e\u009f\2\u04f3\u04f5\5"+ + "\u0128\u0094\2\u04f4\u04f2\3\2\2\2\u04f4\u04f3\3\2\2\2\u04f5\u04f6\3\2"+ + "\2\2\u04f6\u04f7\7)\2\2\u04f7\u0125\3\2\2\2\u04f8\u04f9\5\u0124\u0092"+ + "\2\u04f9\u04fa\3\2\2\2\u04fa\u04fb\b\u0093\2\2\u04fb\u0127\3\2\2\2\u04fc"+ + "\u04ff\5\u012a\u0095\2\u04fd\u04ff\5\u012c\u0096\2\u04fe\u04fc\3\2\2\2"+ + "\u04fe\u04fd\3\2\2\2\u04ff\u0129\3\2\2\2\u0500\u0501\7^\2\2\u0501\u0502"+ + "\5\u0144\u00a2\2\u0502\u0503\5\u0144\u00a2\2\u0503\u0504\5\u0144\u00a2"+ + "\2\u0504\u012b\3\2\2\2\u0505\u0506\7^\2\2\u0506\u0507\7z\2\2\u0507\u0508"+ + "\5\u0146\u00a3\2\u0508\u0509\5\u0146\u00a3\2\u0509\u012d\3\2\2\2\u050a"+ + "\u050b\7^\2\2\u050b\u050c\7w\2\2\u050c\u050d\5\u0146\u00a3\2\u050d\u050e"+ + "\5\u0146\u00a3\2\u050e\u050f\5\u0146\u00a3\2\u050f\u0510\5\u0146\u00a3"+ + "\2\u0510\u012f\3\2\2\2\u0511\u0512\7^\2\2\u0512\u0513\7W\2\2\u0513\u0514"+ + "\5\u0146\u00a3\2\u0514\u0515\5\u0146\u00a3\2\u0515\u0516\5\u0146\u00a3"+ + "\2\u0516\u0517\5\u0146\u00a3\2\u0517\u0518\5\u0146\u00a3\2\u0518\u0519"+ + "\5\u0146\u00a3\2\u0519\u051a\5\u0146\u00a3\2\u051a\u051b\5\u0146\u00a3"+ + "\2\u051b\u0131\3\2\2\2\u051c\u0520\7b\2\2\u051d\u051f\n\t\2\2\u051e\u051d"+ + "\3\2\2\2\u051f\u0522\3\2\2\2\u0520\u051e\3\2\2\2\u0520\u0521\3\2\2\2\u0521"+ + "\u0523\3\2\2\2\u0522\u0520\3\2\2\2\u0523\u0524\7b\2\2\u0524\u0525\3\2"+ + "\2\2\u0525\u0526\b\u0099\2\2\u0526\u0133\3\2\2\2\u0527\u052c\7$\2\2\u0528"+ + "\u052b\n\n\2\2\u0529\u052b\5\u0140\u00a0\2\u052a\u0528\3\2\2\2\u052a\u0529"+ + "\3\2\2\2\u052b\u052e\3\2\2\2\u052c\u052a\3\2\2\2\u052c\u052d\3\2\2\2\u052d"+ + "\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0530\7$\2\2\u0530\u0531\3\2"+ + "\2\2\u0531\u0532\b\u009a\2\2\u0532\u0135\3\2\2\2\u0533\u0535\t\13\2\2"+ + "\u0534\u0533\3\2\2\2\u0535\u0536\3\2\2\2\u0536\u0534\3\2\2\2\u0536\u0537"+ + "\3\2\2\2\u0537\u0538\3\2\2\2\u0538\u0539\b\u009b\3\2\u0539\u0137\3\2\2"+ + "\2\u053a\u053b\7\61\2\2\u053b\u053c\7,\2\2\u053c\u0540\3\2\2\2\u053d\u053f"+ + "\13\2\2\2\u053e\u053d\3\2\2\2\u053f\u0542\3\2\2\2\u0540\u0541\3\2\2\2"+ + "\u0540\u053e\3\2\2\2\u0541\u0543\3\2\2\2\u0542\u0540\3\2\2\2\u0543\u0544"+ + "\7,\2\2\u0544\u0545\7\61\2\2\u0545\u0546\3\2\2\2\u0546\u0547\b\u009c\3"+ + "\2\u0547\u0139\3\2\2\2\u0548\u054a\t\f\2\2\u0549\u0548\3\2\2\2\u054a\u054b"+ + "\3\2\2\2\u054b\u0549\3\2\2\2\u054b\u054c\3\2\2\2\u054c\u054d\3\2\2\2\u054d"+ + "\u054e\b\u009d\3\2\u054e\u013b\3\2\2\2\u054f\u0550\7\61\2\2\u0550\u0551"+ + "\7\61\2\2\u0551\u0555\3\2\2\2\u0552\u0554\n\f\2\2\u0553\u0552\3\2\2\2"+ + "\u0554\u0557\3\2\2\2\u0555\u0553\3\2\2\2\u0555\u0556\3\2\2\2\u0556\u0558"+ + "\3\2\2\2\u0557\u0555\3\2\2\2\u0558\u0559\b\u009e\3\2\u0559\u013d\3\2\2"+ + "\2\u055a\u055f\n\r\2\2\u055b\u055f\5\u012e\u0097\2\u055c\u055f\5\u0130"+ + "\u0098\2\u055d\u055f\5\u0140\u00a0\2\u055e\u055a\3\2\2\2\u055e\u055b\3"+ + "\2\2\2\u055e\u055c\3\2\2\2\u055e\u055d\3\2\2\2\u055f\u013f\3\2\2\2\u0560"+ + "\u057a\7^\2\2\u0561\u0562\7w\2\2\u0562\u0563\5\u0146\u00a3\2\u0563\u0564"+ + "\5\u0146\u00a3\2\u0564\u0565\5\u0146\u00a3\2\u0565\u0566\5\u0146\u00a3"+ + "\2\u0566\u057b\3\2\2\2\u0567\u0568\7W\2\2\u0568\u0569\5\u0146\u00a3\2"+ + "\u0569\u056a\5\u0146\u00a3\2\u056a\u056b\5\u0146\u00a3\2\u056b\u056c\5"+ + "\u0146\u00a3\2\u056c\u056d\5\u0146\u00a3\2\u056d\u056e\5\u0146\u00a3\2"+ + "\u056e\u056f\5\u0146\u00a3\2\u056f\u0570\5\u0146\u00a3\2\u0570\u057b\3"+ + "\2\2\2\u0571\u057b\t\16\2\2\u0572\u0573\5\u0144\u00a2\2\u0573\u0574\5"+ + "\u0144\u00a2\2\u0574\u0575\5\u0144\u00a2\2\u0575\u057b\3\2\2\2\u0576\u0577"+ + "\7z\2\2\u0577\u0578\5\u0146\u00a3\2\u0578\u0579\5\u0146\u00a3\2\u0579"+ + "\u057b\3\2\2\2\u057a\u0561\3\2\2\2\u057a\u0567\3\2\2\2\u057a\u0571\3\2"+ + "\2\2\u057a\u0572\3\2\2\2\u057a\u0576\3\2\2\2\u057b\u0141\3\2\2\2\u057c"+ + "\u0583\t\3\2\2\u057d\u057f\7a\2\2\u057e\u057d\3\2\2\2\u057e\u057f\3\2"+ + "\2\2\u057f\u0580\3\2\2\2\u0580\u0582\t\3\2\2\u0581\u057e\3\2\2\2\u0582"+ + "\u0585\3\2\2\2\u0583\u0581\3\2\2\2\u0583\u0584\3\2\2\2\u0584\u0143\3\2"+ + "\2\2\u0585\u0583\3\2\2\2\u0586\u0587\t\17\2\2\u0587\u0145\3\2\2\2\u0588"+ + "\u0589\t\20\2\2\u0589\u0147\3\2\2\2\u058a\u058b\t\21\2\2\u058b\u0149\3"+ + "\2\2\2\u058c\u058e\t\22\2\2\u058d\u058f\t\b\2\2\u058e\u058d\3\2\2\2\u058e"+ + "\u058f\3\2\2\2\u058f\u0590\3\2\2\2\u0590\u0591\5\u0142\u00a1\2\u0591\u014b"+ + "\3\2\2\2\u0592\u0595\5\u0150\u00a8\2\u0593\u0595\7a\2\2\u0594\u0592\3"+ + "\2\2\2\u0594\u0593\3\2\2\2\u0595\u014d\3\2\2\2\u0596\u0597\t\23\2\2\u0597"+ + "\u014f\3\2\2\2\u0598\u0599\t\24\2\2\u0599\u0151\3\2\2\2\u059a\u059c\t"+ + "\13\2\2\u059b\u059a\3\2\2\2\u059c\u059d\3\2\2\2\u059d\u059b\3\2\2\2\u059d"+ + "\u059e\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u05a0\b\u00a9\3\2\u05a0\u0153"+ + "\3\2\2\2\u05a1\u05a2\7\61\2\2\u05a2\u05a3\7,\2\2\u05a3\u05a7\3\2\2\2\u05a4"+ + "\u05a6\n\f\2\2\u05a5\u05a4\3\2\2\2\u05a6\u05a9\3\2\2\2\u05a7\u05a8\3\2"+ + "\2\2\u05a7\u05a5\3\2\2\2\u05a8\u05aa\3\2\2\2\u05a9\u05a7\3\2\2\2\u05aa"+ + "\u05ab\7,\2\2\u05ab\u05ac\7\61\2\2\u05ac\u05ad\3\2\2\2\u05ad\u05ae\b\u00aa"+ + "\3\2\u05ae\u0155\3\2\2\2\u05af\u05b0\7\61\2\2\u05b0\u05b1\7\61\2\2\u05b1"+ + "\u05b5\3\2\2\2\u05b2\u05b4\n\f\2\2\u05b3\u05b2\3\2\2\2\u05b4\u05b7\3\2"+ + "\2\2\u05b5\u05b3\3\2\2\2\u05b5\u05b6\3\2\2\2\u05b6\u05b8\3\2\2\2\u05b7"+ + "\u05b5\3\2\2\2\u05b8\u05b9\b\u00ab\3\2\u05b9\u0157\3\2\2\2\u05ba\u05bc"+ + "\t\f\2\2\u05bb\u05ba\3\2\2\2\u05bc\u05bd\3\2\2\2\u05bd\u05bb\3\2\2\2\u05bd"+ + "\u05be\3\2\2\2\u05be\u05cd\3\2\2\2\u05bf\u05cd\7=\2\2\u05c0\u05c1\7\61"+ + "\2\2\u05c1\u05c2\7,\2\2\u05c2\u05c6\3\2\2\2\u05c3\u05c5\13\2\2\2\u05c4"+ + "\u05c3\3\2\2\2\u05c5\u05c8\3\2\2\2\u05c6\u05c7\3\2\2\2\u05c6\u05c4\3\2"+ + "\2\2\u05c7\u05c9\3\2\2\2\u05c8\u05c6\3\2\2\2\u05c9\u05ca\7,\2\2\u05ca"+ + "\u05cd\7\61\2\2\u05cb\u05cd\7\2\2\3\u05cc\u05bb\3\2\2\2\u05cc\u05bf\3"+ + "\2\2\2\u05cc\u05c0\3\2\2\2\u05cc\u05cb\3\2\2\2\u05cd\u05ce\3\2\2\2\u05ce"+ + "\u05cf\b\u00ac\4\2\u05cf\u0159\3\2\2\2\u05d0\u05d1\3\2\2\2\u05d1\u05d2"+ + "\3\2\2\2\u05d2\u05d3\b\u00ad\4\2\u05d3\u05d4\b\u00ad\3\2\u05d4\u015b\3"+ + "\2\2\2\64\2\3\u015e\u0166\u0169\u016c\u0172\u0174\u041f\u0421\u048a\u048f"+ + "\u0492\u0499\u049e\u04a4\u04a7\u04ac\u04b3\u04b8\u04c2\u04c7\u04cb\u04d0"+ + "\u04d3\u04d8\u04dd\u04e0\u04eb\u04f4\u04fe\u0520\u052a\u052c\u0536\u0540"+ + "\u054b\u0555\u055e\u057a\u057e\u0583\u058e\u0594\u059d\u05a7\u05b5\u05bd"+ + "\u05c6\u05cc\5\4\3\2\2\3\2\4\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index cfa628934..30c539f37 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -24,25 +24,25 @@ public class GobraParser extends GobraParserBase { UNION=30, INTERSECTION=31, SETMINUS=32, IMPLIES=33, WAND=34, APPLY=35, QMARK=36, L_PRED=37, R_PRED=38, SEQ=39, SET=40, MSET=41, DICT=42, OPT=43, LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, ADT=52, - NONE=53, PRED=54, TYPE_OF=55, IS_COMPARABLE=56, SHARE=57, ADDR_MOD=58, - DOT_DOT=59, SHARED=60, EXCLUSIVE=61, PREDICATE=62, WRITEPERM=63, NOPERM=64, - TRUSTED=65, OUTLINE=66, INIT_POST=67, IMPORT_PRE=68, PROOF=69, GHOST_EQUALS=70, - GHOST_NOT_EQUALS=71, WITH=72, BREAK=73, DEFAULT=74, FUNC=75, INTERFACE=76, - SELECT=77, CASE=78, DEFER=79, GO=80, MAP=81, STRUCT=82, CHAN=83, ELSE=84, - GOTO=85, PACKAGE=86, SWITCH=87, CONST=88, FALLTHROUGH=89, IF=90, RANGE=91, - TYPE=92, CONTINUE=93, FOR=94, IMPORT=95, RETURN=96, VAR=97, NIL_LIT=98, - IDENTIFIER=99, L_PAREN=100, R_PAREN=101, L_CURLY=102, R_CURLY=103, L_BRACKET=104, - R_BRACKET=105, ASSIGN=106, COMMA=107, SEMI=108, COLON=109, DOT=110, PLUS_PLUS=111, - MINUS_MINUS=112, DECLARE_ASSIGN=113, ELLIPSIS=114, LOGICAL_OR=115, LOGICAL_AND=116, - EQUALS=117, NOT_EQUALS=118, LESS=119, LESS_OR_EQUALS=120, GREATER=121, - GREATER_OR_EQUALS=122, OR=123, DIV=124, MOD=125, LSHIFT=126, RSHIFT=127, - BIT_CLEAR=128, EXCLAMATION=129, PLUS=130, MINUS=131, CARET=132, STAR=133, - AMPERSAND=134, RECEIVE=135, DECIMAL_LIT=136, BINARY_LIT=137, OCTAL_LIT=138, - HEX_LIT=139, HEX_FLOAT_LIT=140, IMAGINARY_LIT=141, RUNE_LIT=142, BYTE_VALUE=143, - OCTAL_BYTE_VALUE=144, HEX_BYTE_VALUE=145, LITTLE_U_VALUE=146, BIG_U_VALUE=147, - RAW_STRING_LIT=148, INTERPRETED_STRING_LIT=149, WS=150, COMMENT=151, TERMINATOR=152, - LINE_COMMENT=153, WS_NLSEMI=154, COMMENT_NLSEMI=155, LINE_COMMENT_NLSEMI=156, - EOS=157, OTHER=158; + MATCH=53, NONE=54, PRED=55, TYPE_OF=56, IS_COMPARABLE=57, SHARE=58, ADDR_MOD=59, + DOT_DOT=60, SHARED=61, EXCLUSIVE=62, PREDICATE=63, WRITEPERM=64, NOPERM=65, + TRUSTED=66, OUTLINE=67, INIT_POST=68, IMPORT_PRE=69, PROOF=70, GHOST_EQUALS=71, + GHOST_NOT_EQUALS=72, WITH=73, BREAK=74, DEFAULT=75, FUNC=76, INTERFACE=77, + SELECT=78, CASE=79, DEFER=80, GO=81, MAP=82, STRUCT=83, CHAN=84, ELSE=85, + GOTO=86, PACKAGE=87, SWITCH=88, CONST=89, FALLTHROUGH=90, IF=91, RANGE=92, + TYPE=93, CONTINUE=94, FOR=95, IMPORT=96, RETURN=97, VAR=98, NIL_LIT=99, + IDENTIFIER=100, L_PAREN=101, R_PAREN=102, L_CURLY=103, R_CURLY=104, L_BRACKET=105, + R_BRACKET=106, ASSIGN=107, COMMA=108, SEMI=109, COLON=110, DOT=111, PLUS_PLUS=112, + MINUS_MINUS=113, DECLARE_ASSIGN=114, ELLIPSIS=115, LOGICAL_OR=116, LOGICAL_AND=117, + EQUALS=118, NOT_EQUALS=119, LESS=120, LESS_OR_EQUALS=121, GREATER=122, + GREATER_OR_EQUALS=123, OR=124, DIV=125, MOD=126, LSHIFT=127, RSHIFT=128, + BIT_CLEAR=129, EXCLAMATION=130, PLUS=131, MINUS=132, CARET=133, STAR=134, + AMPERSAND=135, RECEIVE=136, DECIMAL_LIT=137, BINARY_LIT=138, OCTAL_LIT=139, + HEX_LIT=140, HEX_FLOAT_LIT=141, IMAGINARY_LIT=142, RUNE_LIT=143, BYTE_VALUE=144, + OCTAL_BYTE_VALUE=145, HEX_BYTE_VALUE=146, LITTLE_U_VALUE=147, BIG_U_VALUE=148, + RAW_STRING_LIT=149, INTERPRETED_STRING_LIT=150, WS=151, COMMENT=152, TERMINATOR=153, + LINE_COMMENT=154, WS_NLSEMI=155, COMMENT_NLSEMI=156, LINE_COMMENT_NLSEMI=157, + EOS=158, OTHER=159; public static final int RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3, RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_initPost = 6, @@ -53,47 +53,50 @@ public class GobraParser extends GobraParserBase { RULE_triggers = 20, RULE_trigger = 21, RULE_predicateAccess = 22, RULE_optionSome = 23, RULE_optionNone = 24, RULE_optionGet = 25, RULE_sConversion = 26, RULE_old = 27, RULE_oldLabelUse = 28, RULE_labelUse = 29, RULE_before = 30, RULE_isComparable = 31, - RULE_typeOf = 32, RULE_access = 33, RULE_range = 34, RULE_seqUpdExp = 35, - RULE_seqUpdClause = 36, RULE_ghostTypeLit = 37, RULE_domainType = 38, - RULE_domainClause = 39, RULE_adtType = 40, RULE_adtClause = 41, RULE_ghostSliceType = 42, - RULE_sqType = 43, RULE_specification = 44, RULE_specStatement = 45, RULE_terminationMeasure = 46, - RULE_assertion = 47, RULE_blockWithBodyParameterInfo = 48, RULE_closureSpecInstance = 49, - RULE_closureSpecParams = 50, RULE_closureSpecParam = 51, RULE_closureImplProofStmt = 52, - RULE_implementationProof = 53, RULE_methodImplementationProof = 54, RULE_nonLocalReceiver = 55, - RULE_selection = 56, RULE_implementationProofPredicateAlias = 57, RULE_make = 58, - RULE_new_ = 59, RULE_specMember = 60, RULE_functionDecl = 61, RULE_methodDecl = 62, - RULE_explicitGhostMember = 63, RULE_fpredicateDecl = 64, RULE_predicateBody = 65, - RULE_mpredicateDecl = 66, RULE_varSpec = 67, RULE_shortVarDecl = 68, RULE_receiver = 69, - RULE_parameterDecl = 70, RULE_actualParameterDecl = 71, RULE_ghostParameterDecl = 72, - RULE_parameterType = 73, RULE_expression = 74, RULE_statement = 75, RULE_applyStmt = 76, - RULE_packageStmt = 77, RULE_specForStmt = 78, RULE_loopSpec = 79, RULE_deferStmt = 80, - RULE_basicLit = 81, RULE_primaryExpr = 82, RULE_functionLit = 83, RULE_closureDecl = 84, - RULE_predConstructArgs = 85, RULE_interfaceType = 86, RULE_predicateSpec = 87, - RULE_methodSpec = 88, RULE_type_ = 89, RULE_typeLit = 90, RULE_predType = 91, - RULE_predTypeParams = 92, RULE_literalType = 93, RULE_implicitArray = 94, - RULE_slice_ = 95, RULE_low = 96, RULE_high = 97, RULE_cap = 98, RULE_assign_op = 99, - RULE_rangeClause = 100, RULE_packageClause = 101, RULE_importPath = 102, - RULE_declaration = 103, RULE_constDecl = 104, RULE_constSpec = 105, RULE_identifierList = 106, - RULE_expressionList = 107, RULE_typeDecl = 108, RULE_typeSpec = 109, RULE_varDecl = 110, - RULE_block = 111, RULE_statementList = 112, RULE_simpleStmt = 113, RULE_expressionStmt = 114, - RULE_sendStmt = 115, RULE_incDecStmt = 116, RULE_assignment = 117, RULE_emptyStmt = 118, - RULE_labeledStmt = 119, RULE_returnStmt = 120, RULE_breakStmt = 121, RULE_continueStmt = 122, - RULE_gotoStmt = 123, RULE_fallthroughStmt = 124, RULE_ifStmt = 125, RULE_switchStmt = 126, - RULE_exprSwitchStmt = 127, RULE_exprCaseClause = 128, RULE_exprSwitchCase = 129, - RULE_typeSwitchStmt = 130, RULE_typeSwitchGuard = 131, RULE_typeCaseClause = 132, - RULE_typeSwitchCase = 133, RULE_typeList = 134, RULE_selectStmt = 135, - RULE_commClause = 136, RULE_commCase = 137, RULE_recvStmt = 138, RULE_forStmt = 139, - RULE_forClause = 140, RULE_goStmt = 141, RULE_typeName = 142, RULE_arrayType = 143, - RULE_arrayLength = 144, RULE_elementType = 145, RULE_pointerType = 146, - RULE_sliceType = 147, RULE_mapType = 148, RULE_channelType = 149, RULE_functionType = 150, - RULE_signature = 151, RULE_result = 152, RULE_parameters = 153, RULE_conversion = 154, - RULE_nonNamedType = 155, RULE_operand = 156, RULE_literal = 157, RULE_integer = 158, - RULE_operandName = 159, RULE_qualifiedIdent = 160, RULE_compositeLit = 161, - RULE_literalValue = 162, RULE_elementList = 163, RULE_keyedElement = 164, - RULE_key = 165, RULE_element = 166, RULE_structType = 167, RULE_fieldDecl = 168, - RULE_string_ = 169, RULE_embeddedField = 170, RULE_index = 171, RULE_typeAssertion = 172, - RULE_arguments = 173, RULE_methodExpr = 174, RULE_receiverType = 175, - RULE_eos = 176; + RULE_typeOf = 32, RULE_access = 33, RULE_range = 34, RULE_matchExpr = 35, + RULE_matchExprClause = 36, RULE_seqUpdExp = 37, RULE_seqUpdClause = 38, + RULE_ghostTypeLit = 39, RULE_domainType = 40, RULE_domainClause = 41, + RULE_adtType = 42, RULE_adtClause = 43, RULE_ghostSliceType = 44, RULE_sqType = 45, + RULE_specification = 46, RULE_specStatement = 47, RULE_terminationMeasure = 48, + RULE_assertion = 49, RULE_matchStmt = 50, RULE_matchStmtClause = 51, RULE_matchCase = 52, + RULE_matchPattern = 53, RULE_matchPatternList = 54, RULE_blockWithBodyParameterInfo = 55, + RULE_closureSpecInstance = 56, RULE_closureSpecParams = 57, RULE_closureSpecParam = 58, + RULE_closureImplProofStmt = 59, RULE_implementationProof = 60, RULE_methodImplementationProof = 61, + RULE_nonLocalReceiver = 62, RULE_selection = 63, RULE_implementationProofPredicateAlias = 64, + RULE_make = 65, RULE_new_ = 66, RULE_specMember = 67, RULE_functionDecl = 68, + RULE_methodDecl = 69, RULE_explicitGhostMember = 70, RULE_fpredicateDecl = 71, + RULE_predicateBody = 72, RULE_mpredicateDecl = 73, RULE_varSpec = 74, + RULE_shortVarDecl = 75, RULE_receiver = 76, RULE_parameterDecl = 77, RULE_actualParameterDecl = 78, + RULE_ghostParameterDecl = 79, RULE_parameterType = 80, RULE_expression = 81, + RULE_statement = 82, RULE_applyStmt = 83, RULE_packageStmt = 84, RULE_specForStmt = 85, + RULE_loopSpec = 86, RULE_deferStmt = 87, RULE_basicLit = 88, RULE_primaryExpr = 89, + RULE_functionLit = 90, RULE_closureDecl = 91, RULE_predConstructArgs = 92, + RULE_interfaceType = 93, RULE_predicateSpec = 94, RULE_methodSpec = 95, + RULE_type_ = 96, RULE_typeLit = 97, RULE_predType = 98, RULE_predTypeParams = 99, + RULE_literalType = 100, RULE_implicitArray = 101, RULE_slice_ = 102, RULE_low = 103, + RULE_high = 104, RULE_cap = 105, RULE_assign_op = 106, RULE_rangeClause = 107, + RULE_packageClause = 108, RULE_importPath = 109, RULE_declaration = 110, + RULE_constDecl = 111, RULE_constSpec = 112, RULE_identifierList = 113, + RULE_expressionList = 114, RULE_typeDecl = 115, RULE_typeSpec = 116, RULE_varDecl = 117, + RULE_block = 118, RULE_statementList = 119, RULE_simpleStmt = 120, RULE_expressionStmt = 121, + RULE_sendStmt = 122, RULE_incDecStmt = 123, RULE_assignment = 124, RULE_emptyStmt = 125, + RULE_labeledStmt = 126, RULE_returnStmt = 127, RULE_breakStmt = 128, RULE_continueStmt = 129, + RULE_gotoStmt = 130, RULE_fallthroughStmt = 131, RULE_ifStmt = 132, RULE_switchStmt = 133, + RULE_exprSwitchStmt = 134, RULE_exprCaseClause = 135, RULE_exprSwitchCase = 136, + RULE_typeSwitchStmt = 137, RULE_typeSwitchGuard = 138, RULE_typeCaseClause = 139, + RULE_typeSwitchCase = 140, RULE_typeList = 141, RULE_selectStmt = 142, + RULE_commClause = 143, RULE_commCase = 144, RULE_recvStmt = 145, RULE_forStmt = 146, + RULE_forClause = 147, RULE_goStmt = 148, RULE_typeName = 149, RULE_arrayType = 150, + RULE_arrayLength = 151, RULE_elementType = 152, RULE_pointerType = 153, + RULE_sliceType = 154, RULE_mapType = 155, RULE_channelType = 156, RULE_functionType = 157, + RULE_signature = 158, RULE_result = 159, RULE_parameters = 160, RULE_conversion = 161, + RULE_nonNamedType = 162, RULE_operand = 163, RULE_literal = 164, RULE_integer = 165, + RULE_operandName = 166, RULE_qualifiedIdent = 167, RULE_compositeLit = 168, + RULE_literalValue = 169, RULE_elementList = 170, RULE_keyedElement = 171, + RULE_key = 172, RULE_element = 173, RULE_structType = 174, RULE_fieldDecl = 175, + RULE_string_ = 176, RULE_embeddedField = 177, RULE_index = 178, RULE_typeAssertion = 179, + RULE_arguments = 180, RULE_methodExpr = 181, RULE_receiverType = 182, + RULE_eos = 183; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", @@ -103,35 +106,36 @@ private static String[] makeRuleNames() { "typeExpr", "boundVariables", "boundVariableDecl", "triggers", "trigger", "predicateAccess", "optionSome", "optionNone", "optionGet", "sConversion", "old", "oldLabelUse", "labelUse", "before", "isComparable", "typeOf", - "access", "range", "seqUpdExp", "seqUpdClause", "ghostTypeLit", "domainType", - "domainClause", "adtType", "adtClause", "ghostSliceType", "sqType", "specification", - "specStatement", "terminationMeasure", "assertion", "blockWithBodyParameterInfo", - "closureSpecInstance", "closureSpecParams", "closureSpecParam", "closureImplProofStmt", - "implementationProof", "methodImplementationProof", "nonLocalReceiver", - "selection", "implementationProofPredicateAlias", "make", "new_", "specMember", - "functionDecl", "methodDecl", "explicitGhostMember", "fpredicateDecl", - "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl", "receiver", - "parameterDecl", "actualParameterDecl", "ghostParameterDecl", "parameterType", - "expression", "statement", "applyStmt", "packageStmt", "specForStmt", - "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", "closureDecl", - "predConstructArgs", "interfaceType", "predicateSpec", "methodSpec", - "type_", "typeLit", "predType", "predTypeParams", "literalType", "implicitArray", - "slice_", "low", "high", "cap", "assign_op", "rangeClause", "packageClause", - "importPath", "declaration", "constDecl", "constSpec", "identifierList", - "expressionList", "typeDecl", "typeSpec", "varDecl", "block", "statementList", - "simpleStmt", "expressionStmt", "sendStmt", "incDecStmt", "assignment", - "emptyStmt", "labeledStmt", "returnStmt", "breakStmt", "continueStmt", - "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt", - "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard", - "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", "commClause", - "commCase", "recvStmt", "forStmt", "forClause", "goStmt", "typeName", - "arrayType", "arrayLength", "elementType", "pointerType", "sliceType", - "mapType", "channelType", "functionType", "signature", "result", "parameters", - "conversion", "nonNamedType", "operand", "literal", "integer", "operandName", - "qualifiedIdent", "compositeLit", "literalValue", "elementList", "keyedElement", - "key", "element", "structType", "fieldDecl", "string_", "embeddedField", - "index", "typeAssertion", "arguments", "methodExpr", "receiverType", - "eos" + "access", "range", "matchExpr", "matchExprClause", "seqUpdExp", "seqUpdClause", + "ghostTypeLit", "domainType", "domainClause", "adtType", "adtClause", + "ghostSliceType", "sqType", "specification", "specStatement", "terminationMeasure", + "assertion", "matchStmt", "matchStmtClause", "matchCase", "matchPattern", + "matchPatternList", "blockWithBodyParameterInfo", "closureSpecInstance", + "closureSpecParams", "closureSpecParam", "closureImplProofStmt", "implementationProof", + "methodImplementationProof", "nonLocalReceiver", "selection", "implementationProofPredicateAlias", + "make", "new_", "specMember", "functionDecl", "methodDecl", "explicitGhostMember", + "fpredicateDecl", "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl", + "receiver", "parameterDecl", "actualParameterDecl", "ghostParameterDecl", + "parameterType", "expression", "statement", "applyStmt", "packageStmt", + "specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", + "closureDecl", "predConstructArgs", "interfaceType", "predicateSpec", + "methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType", + "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause", + "packageClause", "importPath", "declaration", "constDecl", "constSpec", + "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl", + "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt", + "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt", + "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt", + "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", + "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", + "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt", + "typeName", "arrayType", "arrayLength", "elementType", "pointerType", + "sliceType", "mapType", "channelType", "functionType", "signature", "result", + "parameters", "conversion", "nonNamedType", "operand", "literal", "integer", + "operandName", "qualifiedIdent", "compositeLit", "literalValue", "elementList", + "keyedElement", "key", "element", "structType", "fieldDecl", "string_", + "embeddedField", "index", "typeAssertion", "arguments", "methodExpr", + "receiverType", "eos" }; } public static final String[] ruleNames = makeRuleNames(); @@ -145,18 +149,18 @@ private static String[] makeLiteralNames() { "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'", "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'", "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'", - "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'none'", "'pred'", - "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", - "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", - "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'", - "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", - "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'", - "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", - "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, - "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", - "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", - "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", - "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" + "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", "'none'", + "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", + "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", + "'outline'", "'initEnsures'", "'importRequires'", "'proof'", "'==='", + "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", "'select'", + "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", "'else'", + "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", "'if'", + "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'", + "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", + "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", + "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", + "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -168,7 +172,7 @@ private static String[] makeSymbolicNames() { "UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", - "GET", "DOM", "AXIOM", "ADT", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", + "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", @@ -262,9 +266,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(354); + setState(368); expression(0); - setState(355); + setState(369); match(EOF); } } @@ -301,9 +305,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(357); + setState(371); statement(); - setState(358); + setState(372); match(EOF); } } @@ -340,9 +344,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(360); + setState(374); type_(); - setState(361); + setState(375); match(EOF); } } @@ -386,21 +390,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis try { enterOuterAlt(_localctx, 1); { - setState(363); + setState(377); maybeAddressableIdentifier(); - setState(368); + setState(382); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(364); + setState(378); match(COMMA); - setState(365); + setState(379); maybeAddressableIdentifier(); } } - setState(370); + setState(384); _errHandler.sync(this); _la = _input.LA(1); } @@ -438,14 +442,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro try { enterOuterAlt(_localctx, 1); { - setState(371); + setState(385); match(IDENTIFIER); - setState(373); + setState(387); _errHandler.sync(this); _la = _input.LA(1); if (_la==ADDR_MOD) { { - setState(372); + setState(386); match(ADDR_MOD); } } @@ -522,79 +526,79 @@ public final SourceFileContext sourceFile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(380); + setState(394); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(375); + setState(389); initPost(); - setState(376); + setState(390); eos(); } } - setState(382); + setState(396); _errHandler.sync(this); _la = _input.LA(1); } - setState(383); + setState(397); packageClause(); - setState(384); + setState(398); eos(); - setState(390); + setState(404); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(385); + setState(399); importDecl(); - setState(386); + setState(400); eos(); } } - setState(392); + setState(406); _errHandler.sync(this); _la = _input.LA(1); } - setState(402); + setState(416); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (CONST - 75)) | (1L << (TYPE - 75)) | (1L << (VAR - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) { + while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (CONST - 76)) | (1L << (TYPE - 76)) | (1L << (VAR - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) { { { - setState(396); + setState(410); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: { - setState(393); + setState(407); specMember(); } break; case 2: { - setState(394); + setState(408); declaration(); } break; case 3: { - setState(395); + setState(409); ghostMember(); } break; } - setState(398); + setState(412); eos(); } } - setState(404); + setState(418); _errHandler.sync(this); _la = _input.LA(1); } - setState(405); + setState(419); match(EOF); } } @@ -631,9 +635,9 @@ public final InitPostContext initPost() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(407); + setState(421); match(INIT_POST); - setState(408); + setState(422); expression(0); } } @@ -670,9 +674,9 @@ public final ImportPreContext importPre() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(410); + setState(424); match(IMPORT_PRE); - setState(411); + setState(425); expression(0); } } @@ -724,28 +728,28 @@ public final ImportSpecContext importSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(418); + setState(432); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(413); + setState(427); importPre(); - setState(414); + setState(428); eos(); } } - setState(420); + setState(434); _errHandler.sync(this); _la = _input.LA(1); } - setState(422); + setState(436); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER || _la==DOT) { { - setState(421); + setState(435); ((ImportSpecContext)_localctx).alias = _input.LT(1); _la = _input.LA(1); if ( !(_la==IDENTIFIER || _la==DOT) ) { @@ -759,7 +763,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { } } - setState(424); + setState(438); importPath(); } } @@ -814,56 +818,56 @@ public final ImportDeclContext importDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(431); + setState(445); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(426); + setState(440); importPre(); - setState(427); + setState(441); eos(); } } - setState(433); + setState(447); _errHandler.sync(this); _la = _input.LA(1); } - setState(447); + setState(461); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: { - setState(434); + setState(448); match(IMPORT); - setState(435); + setState(449); importSpec(); } break; case 2: { - setState(436); + setState(450); match(IMPORT); - setState(437); + setState(451); match(L_PAREN); - setState(443); + setState(457); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (IMPORT_PRE - 68)) | (1L << (IDENTIFIER - 68)) | (1L << (DOT - 68)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { + while (((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (IMPORT_PRE - 69)) | (1L << (IDENTIFIER - 69)) | (1L << (DOT - 69)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { - setState(438); + setState(452); importSpec(); - setState(439); + setState(453); eos(); } } - setState(445); + setState(459); _errHandler.sync(this); _la = _input.LA(1); } - setState(446); + setState(460); match(R_PAREN); } break; @@ -909,34 +913,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException { GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState()); enterRule(_localctx, 20, RULE_ghostMember); try { - setState(453); + setState(467); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(449); + setState(463); implementationProof(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(450); + setState(464); fpredicateDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(451); + setState(465); mpredicateDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(452); + setState(466); explicitGhostMember(); } break; @@ -980,6 +984,17 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + public static class MatchStmt_Context extends GhostStatementContext { + public MatchStmtContext matchStmt() { + return getRuleContext(MatchStmtContext.class,0); + } + public MatchStmt_Context(GhostStatementContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMatchStmt_(this); + else return visitor.visitChildren(this); + } + } public static class ExplicitGhostStatementContext extends GhostStatementContext { public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public StatementContext statement() { @@ -1012,16 +1027,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException enterRule(_localctx, 22, RULE_ghostStatement); int _la; try { - setState(461); + setState(476); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: _localctx = new ExplicitGhostStatementContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(455); + setState(469); match(GHOST); - setState(456); + setState(470); statement(); } break; @@ -1030,7 +1045,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new FoldStatementContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(457); + setState(471); ((FoldStatementContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -1041,7 +1056,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(458); + setState(472); predicateAccess(); } break; @@ -1052,7 +1067,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new ProofStatementContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(459); + setState(473); ((ProofStatementContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ASSERT) | (1L << ASSUME) | (1L << INHALE) | (1L << EXHALE))) != 0)) ) { @@ -1063,10 +1078,18 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(460); + setState(474); expression(0); } break; + case MATCH: + _localctx = new MatchStmt_Context(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(475); + matchStmt(); + } + break; default: throw new NoViableAltException(this); } @@ -1103,7 +1126,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(463); + setState(478); statementWithSpec(); } } @@ -1143,10 +1166,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(465); + setState(480); ((StatementWithSpecContext)_localctx).specification = specification(); { - setState(466); + setState(481); outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure); } } @@ -1191,21 +1214,21 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu try { enterOuterAlt(_localctx, 1); { - setState(468); + setState(483); match(OUTLINE); - setState(469); + setState(484); match(L_PAREN); - setState(471); + setState(486); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: { - setState(470); + setState(485); statementList(); } break; } - setState(473); + setState(488); match(R_PAREN); } } @@ -1257,6 +1280,9 @@ public OptionGetContext optionGet() { public PermissionContext permission() { return getRuleContext(PermissionContext.class,0); } + public MatchExprContext matchExpr() { + return getRuleContext(MatchExprContext.class,0); + } public GhostPrimaryExprContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -1272,93 +1298,100 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState()); enterRule(_localctx, 30, RULE_ghostPrimaryExpr); try { - setState(487); + setState(503); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(475); + setState(490); range(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(476); + setState(491); access(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(477); + setState(492); typeOf(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(478); + setState(493); typeExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(479); + setState(494); isComparable(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(480); + setState(495); old(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(481); + setState(496); before(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(482); + setState(497); sConversion(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(483); + setState(498); optionNone(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(484); + setState(499); optionSome(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(485); + setState(500); optionGet(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(486); + setState(501); permission(); } break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(502); + matchExpr(); + } + break; } } catch (RecognitionException re) { @@ -1393,7 +1426,7 @@ public final PermissionContext permission() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(489); + setState(505); _la = _input.LA(1); if ( !(_la==WRITEPERM || _la==NOPERM) ) { _errHandler.recoverInline(this); @@ -1440,13 +1473,13 @@ public final TypeExprContext typeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(491); + setState(507); match(TYPE); - setState(492); + setState(508); match(L_BRACKET); - setState(493); + setState(509); type_(); - setState(494); + setState(510); match(R_BRACKET); } } @@ -1491,32 +1524,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(496); + setState(512); boundVariableDecl(); - setState(501); + setState(517); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(497); + setState(513); match(COMMA); - setState(498); + setState(514); boundVariableDecl(); } } } - setState(503); + setState(519); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); } - setState(505); + setState(521); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(504); + setState(520); match(COMMA); } } @@ -1564,25 +1597,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(507); + setState(523); match(IDENTIFIER); - setState(512); + setState(528); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(508); + setState(524); match(COMMA); - setState(509); + setState(525); match(IDENTIFIER); } } - setState(514); + setState(530); _errHandler.sync(this); _la = _input.LA(1); } - setState(515); + setState(531); elementType(); } } @@ -1622,17 +1655,17 @@ public final TriggersContext triggers() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(520); + setState(536); _errHandler.sync(this); _la = _input.LA(1); while (_la==L_CURLY) { { { - setState(517); + setState(533); trigger(); } } - setState(522); + setState(538); _errHandler.sync(this); _la = _input.LA(1); } @@ -1680,27 +1713,27 @@ public final TriggerContext trigger() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(523); + setState(539); match(L_CURLY); - setState(524); + setState(540); expression(0); - setState(529); + setState(545); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(525); + setState(541); match(COMMA); - setState(526); + setState(542); expression(0); } } - setState(531); + setState(547); _errHandler.sync(this); _la = _input.LA(1); } - setState(532); + setState(548); match(R_CURLY); } } @@ -1736,7 +1769,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(534); + setState(550); primaryExpr(0); } } @@ -1775,13 +1808,13 @@ public final OptionSomeContext optionSome() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(536); + setState(552); match(SOME); - setState(537); + setState(553); match(L_PAREN); - setState(538); + setState(554); expression(0); - setState(539); + setState(555); match(R_PAREN); } } @@ -1820,13 +1853,13 @@ public final OptionNoneContext optionNone() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(541); + setState(557); match(NONE); - setState(542); + setState(558); match(L_BRACKET); - setState(543); + setState(559); type_(); - setState(544); + setState(560); match(R_BRACKET); } } @@ -1865,13 +1898,13 @@ public final OptionGetContext optionGet() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(546); + setState(562); match(GET); - setState(547); + setState(563); match(L_PAREN); - setState(548); + setState(564); expression(0); - setState(549); + setState(565); match(R_PAREN); } } @@ -1914,7 +1947,7 @@ public final SConversionContext sConversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(551); + setState(567); ((SConversionContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) { @@ -1925,11 +1958,11 @@ public final SConversionContext sConversion() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(552); + setState(568); match(L_PAREN); - setState(553); + setState(569); expression(0); - setState(554); + setState(570); match(R_PAREN); } } @@ -1974,27 +2007,27 @@ public final OldContext old() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(556); + setState(572); match(OLD); - setState(561); + setState(577); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(557); + setState(573); match(L_BRACKET); - setState(558); + setState(574); oldLabelUse(); - setState(559); + setState(575); match(R_BRACKET); } } - setState(563); + setState(579); match(L_PAREN); - setState(564); + setState(580); expression(0); - setState(565); + setState(581); match(R_PAREN); } } @@ -2029,20 +2062,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException { OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState()); enterRule(_localctx, 56, RULE_oldLabelUse); try { - setState(569); + setState(585); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(567); + setState(583); labelUse(); } break; case LHS: enterOuterAlt(_localctx, 2); { - setState(568); + setState(584); match(LHS); } break; @@ -2080,7 +2113,7 @@ public final LabelUseContext labelUse() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(571); + setState(587); match(IDENTIFIER); } } @@ -2119,13 +2152,13 @@ public final BeforeContext before() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(573); + setState(589); match(BEFORE); - setState(574); + setState(590); match(L_PAREN); - setState(575); + setState(591); expression(0); - setState(576); + setState(592); match(R_PAREN); } } @@ -2164,13 +2197,13 @@ public final IsComparableContext isComparable() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(578); + setState(594); match(IS_COMPARABLE); - setState(579); + setState(595); match(L_PAREN); - setState(580); + setState(596); expression(0); - setState(581); + setState(597); match(R_PAREN); } } @@ -2209,13 +2242,13 @@ public final TypeOfContext typeOf() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(583); + setState(599); match(TYPE_OF); - setState(584); + setState(600); match(L_PAREN); - setState(585); + setState(601); expression(0); - setState(586); + setState(602); match(R_PAREN); } } @@ -2259,25 +2292,25 @@ public final AccessContext access() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(588); + setState(604); match(ACCESS); - setState(589); + setState(605); match(L_PAREN); - setState(590); + setState(606); expression(0); - setState(593); + setState(609); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(591); + setState(607); match(COMMA); - setState(592); + setState(608); expression(0); } } - setState(595); + setState(611); match(R_PAREN); } } @@ -2324,7 +2357,7 @@ public final RangeContext range() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(597); + setState(613); ((RangeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) { @@ -2335,15 +2368,15 @@ public final RangeContext range() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(598); + setState(614); match(L_BRACKET); - setState(599); + setState(615); expression(0); - setState(600); + setState(616); match(DOT_DOT); - setState(601); + setState(617); expression(0); - setState(602); + setState(618); match(R_BRACKET); } } @@ -2358,6 +2391,116 @@ public final RangeContext range() throws RecognitionException { return _localctx; } + public static class MatchExprContext extends ParserRuleContext { + public TerminalNode MATCH() { return getToken(GobraParser.MATCH, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } + public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } + public List matchExprClause() { + return getRuleContexts(MatchExprClauseContext.class); + } + public MatchExprClauseContext matchExprClause(int i) { + return getRuleContext(MatchExprClauseContext.class,i); + } + public MatchExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchExpr; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMatchExpr(this); + else return visitor.visitChildren(this); + } + } + + public final MatchExprContext matchExpr() throws RecognitionException { + MatchExprContext _localctx = new MatchExprContext(_ctx, getState()); + enterRule(_localctx, 70, RULE_matchExpr); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(620); + match(MATCH); + setState(621); + expression(0); + setState(622); + match(L_CURLY); + setState(626); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==DEFAULT || _la==CASE) { + { + { + setState(623); + matchExprClause(); + } + } + setState(628); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(629); + match(R_CURLY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MatchExprClauseContext extends ParserRuleContext { + public MatchCaseContext matchCase() { + return getRuleContext(MatchCaseContext.class,0); + } + public TerminalNode COLON() { return getToken(GobraParser.COLON, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public MatchExprClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchExprClause; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMatchExprClause(this); + else return visitor.visitChildren(this); + } + } + + public final MatchExprClauseContext matchExprClause() throws RecognitionException { + MatchExprClauseContext _localctx = new MatchExprClauseContext(_ctx, getState()); + enterRule(_localctx, 72, RULE_matchExprClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(631); + matchCase(); + setState(632); + match(COLON); + setState(633); + expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class SeqUpdExpContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } @@ -2384,34 +2527,34 @@ public T accept(ParseTreeVisitor visitor) { public final SeqUpdExpContext seqUpdExp() throws RecognitionException { SeqUpdExpContext _localctx = new SeqUpdExpContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_seqUpdExp); + enterRule(_localctx, 74, RULE_seqUpdExp); int _la; try { enterOuterAlt(_localctx, 1); { - setState(604); + setState(635); match(L_BRACKET); { - setState(605); + setState(636); seqUpdClause(); - setState(610); + setState(641); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(606); + setState(637); match(COMMA); - setState(607); + setState(638); seqUpdClause(); } } - setState(612); + setState(643); _errHandler.sync(this); _la = _input.LA(1); } } - setState(613); + setState(644); match(R_BRACKET); } } @@ -2447,15 +2590,15 @@ public T accept(ParseTreeVisitor visitor) { public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { SeqUpdClauseContext _localctx = new SeqUpdClauseContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_seqUpdClause); + enterRule(_localctx, 76, RULE_seqUpdClause); try { enterOuterAlt(_localctx, 1); { - setState(615); + setState(646); expression(0); - setState(616); + setState(647); match(ASSIGN); - setState(617); + setState(648); expression(0); } } @@ -2496,9 +2639,9 @@ public T accept(ParseTreeVisitor visitor) { public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_ghostTypeLit); + enterRule(_localctx, 78, RULE_ghostTypeLit); try { - setState(623); + setState(654); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2508,28 +2651,28 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { case OPT: enterOuterAlt(_localctx, 1); { - setState(619); + setState(650); sqType(); } break; case GHOST: enterOuterAlt(_localctx, 2); { - setState(620); + setState(651); ghostSliceType(); } break; case DOM: enterOuterAlt(_localctx, 3); { - setState(621); + setState(652); domainType(); } break; case ADT: enterOuterAlt(_localctx, 4); { - setState(622); + setState(653); adtType(); } break; @@ -2577,32 +2720,32 @@ public T accept(ParseTreeVisitor visitor) { public final DomainTypeContext domainType() throws RecognitionException { DomainTypeContext _localctx = new DomainTypeContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_domainType); + enterRule(_localctx, 80, RULE_domainType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(625); + setState(656); match(DOM); - setState(626); + setState(657); match(L_CURLY); - setState(632); + setState(663); _errHandler.sync(this); _la = _input.LA(1); while (_la==AXIOM || _la==FUNC) { { { - setState(627); + setState(658); domainClause(); - setState(628); + setState(659); eos(); } } - setState(634); + setState(665); _errHandler.sync(this); _la = _input.LA(1); } - setState(635); + setState(666); match(R_CURLY); } } @@ -2645,34 +2788,34 @@ public T accept(ParseTreeVisitor visitor) { public final DomainClauseContext domainClause() throws RecognitionException { DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_domainClause); + enterRule(_localctx, 82, RULE_domainClause); try { - setState(646); + setState(677); _errHandler.sync(this); switch (_input.LA(1)) { case FUNC: enterOuterAlt(_localctx, 1); { - setState(637); + setState(668); match(FUNC); - setState(638); + setState(669); match(IDENTIFIER); - setState(639); + setState(670); signature(); } break; case AXIOM: enterOuterAlt(_localctx, 2); { - setState(640); + setState(671); match(AXIOM); - setState(641); + setState(672); match(L_CURLY); - setState(642); + setState(673); expression(0); - setState(643); + setState(674); eos(); - setState(644); + setState(675); match(R_CURLY); } break; @@ -2720,32 +2863,32 @@ public T accept(ParseTreeVisitor visitor) { public final AdtTypeContext adtType() throws RecognitionException { AdtTypeContext _localctx = new AdtTypeContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_adtType); + enterRule(_localctx, 84, RULE_adtType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(648); + setState(679); match(ADT); - setState(649); + setState(680); match(L_CURLY); - setState(655); + setState(686); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(650); + setState(681); adtClause(); - setState(651); + setState(682); eos(); } } - setState(657); + setState(688); _errHandler.sync(this); _la = _input.LA(1); } - setState(658); + setState(689); match(R_CURLY); } } @@ -2789,32 +2932,32 @@ public T accept(ParseTreeVisitor visitor) { public final AdtClauseContext adtClause() throws RecognitionException { AdtClauseContext _localctx = new AdtClauseContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_adtClause); + enterRule(_localctx, 86, RULE_adtClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(660); + setState(691); match(IDENTIFIER); - setState(661); + setState(692); match(L_CURLY); - setState(667); + setState(698); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(662); + setState(693); fieldDecl(); - setState(663); + setState(694); eos(); } } - setState(669); + setState(700); _errHandler.sync(this); _la = _input.LA(1); } - setState(670); + setState(701); match(R_CURLY); } } @@ -2849,17 +2992,17 @@ public T accept(ParseTreeVisitor visitor) { public final GhostSliceTypeContext ghostSliceType() throws RecognitionException { GhostSliceTypeContext _localctx = new GhostSliceTypeContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_ghostSliceType); + enterRule(_localctx, 88, RULE_ghostSliceType); try { enterOuterAlt(_localctx, 1); { - setState(672); + setState(703); match(GHOST); - setState(673); + setState(704); match(L_BRACKET); - setState(674); + setState(705); match(R_BRACKET); - setState(675); + setState(706); elementType(); } } @@ -2902,10 +3045,10 @@ public T accept(ParseTreeVisitor visitor) { public final SqTypeContext sqType() throws RecognitionException { SqTypeContext _localctx = new SqTypeContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_sqType); + enterRule(_localctx, 90, RULE_sqType); int _la; try { - setState(688); + setState(719); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2915,7 +3058,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(677); + setState(708); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << OPT))) != 0)) ) { @@ -2926,11 +3069,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(678); + setState(709); match(L_BRACKET); - setState(679); + setState(710); type_(); - setState(680); + setState(711); match(R_BRACKET); } } @@ -2938,15 +3081,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(682); + setState(713); ((SqTypeContext)_localctx).kind = match(DICT); - setState(683); + setState(714); match(L_BRACKET); - setState(684); + setState(715); type_(); - setState(685); + setState(716); match(R_BRACKET); - setState(686); + setState(717); type_(); } break; @@ -3001,20 +3144,20 @@ public T accept(ParseTreeVisitor visitor) { public final SpecificationContext specification() throws RecognitionException { SpecificationContext _localctx = new SpecificationContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_specification); + enterRule(_localctx, 92, RULE_specification); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(700); + setState(731); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,31,_ctx); + _alt = getInterpreter().adaptivePredict(_input,32,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(695); + setState(726); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3022,20 +3165,20 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(690); + setState(721); specStatement(); } break; case PURE: { - setState(691); + setState(722); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(693); + setState(724); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3043,21 +3186,21 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(697); + setState(728); eos(); } } } - setState(702); + setState(733); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,31,_ctx); + _alt = getInterpreter().adaptivePredict(_input,32,_ctx); } - setState(705); + setState(736); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(703); + setState(734); match(PURE); ((SpecificationContext)_localctx).pure = true; } @@ -3101,44 +3244,44 @@ public T accept(ParseTreeVisitor visitor) { public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_specStatement); + enterRule(_localctx, 94, RULE_specStatement); try { - setState(715); + setState(746); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(707); + setState(738); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(708); + setState(739); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(709); + setState(740); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(710); + setState(741); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(711); + setState(742); ((SpecStatementContext)_localctx).kind = match(POST); - setState(712); + setState(743); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(713); + setState(744); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(714); + setState(745); terminationMeasure(); } break; @@ -3165,46 +3308,387 @@ public ExpressionListContext expressionList() { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); } - public TerminationMeasureContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); + public TerminationMeasureContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_terminationMeasure; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTerminationMeasure(this); + else return visitor.visitChildren(this); + } + } + + public final TerminationMeasureContext terminationMeasure() throws RecognitionException { + TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState()); + enterRule(_localctx, 96, RULE_terminationMeasure); + try { + enterOuterAlt(_localctx, 1); + { + setState(749); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { + case 1: + { + setState(748); + expressionList(); + } + break; + } + setState(753); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + case 1: + { + setState(751); + match(IF); + setState(752); + expression(0); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AssertionContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public AssertionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_assertion; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitAssertion(this); + else return visitor.visitChildren(this); + } + } + + public final AssertionContext assertion() throws RecognitionException { + AssertionContext _localctx = new AssertionContext(_ctx, getState()); + enterRule(_localctx, 98, RULE_assertion); + try { + setState(757); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(756); + expression(0); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MatchStmtContext extends ParserRuleContext { + public TerminalNode MATCH() { return getToken(GobraParser.MATCH, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } + public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } + public List matchStmtClause() { + return getRuleContexts(MatchStmtClauseContext.class); + } + public MatchStmtClauseContext matchStmtClause(int i) { + return getRuleContext(MatchStmtClauseContext.class,i); + } + public MatchStmtContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchStmt; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMatchStmt(this); + else return visitor.visitChildren(this); + } + } + + public final MatchStmtContext matchStmt() throws RecognitionException { + MatchStmtContext _localctx = new MatchStmtContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_matchStmt); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(759); + match(MATCH); + setState(760); + expression(0); + setState(761); + match(L_CURLY); + setState(765); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==DEFAULT || _la==CASE) { + { + { + setState(762); + matchStmtClause(); + } + } + setState(767); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(768); + match(R_CURLY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MatchStmtClauseContext extends ParserRuleContext { + public MatchCaseContext matchCase() { + return getRuleContext(MatchCaseContext.class,0); + } + public TerminalNode COLON() { return getToken(GobraParser.COLON, 0); } + public StatementListContext statementList() { + return getRuleContext(StatementListContext.class,0); + } + public MatchStmtClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchStmtClause; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMatchStmtClause(this); + else return visitor.visitChildren(this); + } + } + + public final MatchStmtClauseContext matchStmtClause() throws RecognitionException { + MatchStmtClauseContext _localctx = new MatchStmtClauseContext(_ctx, getState()); + enterRule(_localctx, 102, RULE_matchStmtClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(770); + matchCase(); + setState(771); + match(COLON); + setState(773); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { + case 1: + { + setState(772); + statementList(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MatchCaseContext extends ParserRuleContext { + public TerminalNode CASE() { return getToken(GobraParser.CASE, 0); } + public MatchPatternContext matchPattern() { + return getRuleContext(MatchPatternContext.class,0); + } + public TerminalNode DEFAULT() { return getToken(GobraParser.DEFAULT, 0); } + public MatchCaseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchCase; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMatchCase(this); + else return visitor.visitChildren(this); + } + } + + public final MatchCaseContext matchCase() throws RecognitionException { + MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); + enterRule(_localctx, 104, RULE_matchCase); + try { + setState(778); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CASE: + enterOuterAlt(_localctx, 1); + { + setState(775); + match(CASE); + setState(776); + matchPattern(); + } + break; + case DEFAULT: + enterOuterAlt(_localctx, 2); + { + setState(777); + match(DEFAULT); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MatchPatternContext extends ParserRuleContext { + public MatchPatternContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchPattern; } + + public MatchPatternContext() { } + public void copyFrom(MatchPatternContext ctx) { + super.copyFrom(ctx); + } + } + public static class MatchPatternValueContext extends MatchPatternContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public MatchPatternValueContext(MatchPatternContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMatchPatternValue(this); + else return visitor.visitChildren(this); + } + } + public static class MatchPatternCompositeContext extends MatchPatternContext { + public LiteralTypeContext literalType() { + return getRuleContext(LiteralTypeContext.class,0); + } + public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } + public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } + public MatchPatternListContext matchPatternList() { + return getRuleContext(MatchPatternListContext.class,0); } - @Override public int getRuleIndex() { return RULE_terminationMeasure; } + public TerminalNode COMMA() { return getToken(GobraParser.COMMA, 0); } + public MatchPatternCompositeContext(MatchPatternContext ctx) { copyFrom(ctx); } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTerminationMeasure(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMatchPatternComposite(this); + else return visitor.visitChildren(this); + } + } + public static class MatchPatternBindContext extends MatchPatternContext { + public TerminalNode QMARK() { return getToken(GobraParser.QMARK, 0); } + public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } + public MatchPatternBindContext(MatchPatternContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMatchPatternBind(this); else return visitor.visitChildren(this); } } - public final TerminationMeasureContext terminationMeasure() throws RecognitionException { - TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_terminationMeasure); + public final MatchPatternContext matchPattern() throws RecognitionException { + MatchPatternContext _localctx = new MatchPatternContext(_ctx, getState()); + enterRule(_localctx, 106, RULE_matchPattern); + int _la; try { - enterOuterAlt(_localctx, 1); - { - setState(718); + setState(793); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: + _localctx = new MatchPatternBindContext(_localctx); + enterOuterAlt(_localctx, 1); { - setState(717); - expressionList(); + setState(780); + match(QMARK); + setState(781); + match(IDENTIFIER); } break; - } - setState(722); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { - case 1: + case 2: + _localctx = new MatchPatternCompositeContext(_localctx); + enterOuterAlt(_localctx, 2); { - setState(720); - match(IF); - setState(721); + setState(782); + literalType(); + setState(783); + match(L_CURLY); + setState(788); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << QMARK) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + { + setState(784); + matchPatternList(); + setState(786); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(785); + match(COMMA); + } + } + + } + } + + setState(790); + match(R_CURLY); + } + break; + case 3: + _localctx = new MatchPatternValueContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(792); expression(0); } break; } - } } catch (RecognitionException re) { _localctx.exception = re; @@ -3217,40 +3701,55 @@ public final TerminationMeasureContext terminationMeasure() throws RecognitionEx return _localctx; } - public static class AssertionContext extends ParserRuleContext { - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); + public static class MatchPatternListContext extends ParserRuleContext { + public List matchPattern() { + return getRuleContexts(MatchPatternContext.class); } - public AssertionContext(ParserRuleContext parent, int invokingState) { + public MatchPatternContext matchPattern(int i) { + return getRuleContext(MatchPatternContext.class,i); + } + public List COMMA() { return getTokens(GobraParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(GobraParser.COMMA, i); + } + public MatchPatternListContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_assertion; } + @Override public int getRuleIndex() { return RULE_matchPatternList; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitAssertion(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMatchPatternList(this); else return visitor.visitChildren(this); } } - public final AssertionContext assertion() throws RecognitionException { - AssertionContext _localctx = new AssertionContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_assertion); + public final MatchPatternListContext matchPatternList() throws RecognitionException { + MatchPatternListContext _localctx = new MatchPatternListContext(_ctx, getState()); + enterRule(_localctx, 108, RULE_matchPatternList); try { - setState(726); + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(795); + matchPattern(); + setState(800); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(725); - expression(0); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(796); + match(COMMA); + setState(797); + matchPattern(); + } + } } - break; + setState(802); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + } } } catch (RecognitionException re) { @@ -3290,37 +3789,37 @@ public T accept(ParseTreeVisitor visitor) { public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException { BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_blockWithBodyParameterInfo); + enterRule(_localctx, 110, RULE_blockWithBodyParameterInfo); try { enterOuterAlt(_localctx, 1); { - setState(728); + setState(803); match(L_CURLY); - setState(733); + setState(808); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(729); + setState(804); match(SHARE); - setState(730); + setState(805); identifierList(); - setState(731); + setState(806); eos(); } break; } - setState(736); + setState(811); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: { - setState(735); + setState(810); statementList(); } break; } - setState(738); + setState(813); match(R_CURLY); } } @@ -3359,47 +3858,47 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecInstanceContext closureSpecInstance() throws RecognitionException { ClosureSpecInstanceContext _localctx = new ClosureSpecInstanceContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_closureSpecInstance); + enterRule(_localctx, 112, RULE_closureSpecInstance); int _la; try { enterOuterAlt(_localctx, 1); { - setState(742); + setState(817); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(740); + setState(815); qualifiedIdent(); } break; case 2: { - setState(741); + setState(816); match(IDENTIFIER); } break; } - setState(752); + setState(827); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(744); + setState(819); match(L_CURLY); - setState(749); + setState(824); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(745); + setState(820); closureSpecParams(); - setState(747); + setState(822); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(746); + setState(821); match(COMMA); } } @@ -3407,7 +3906,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(751); + setState(826); match(R_CURLY); } break; @@ -3449,30 +3948,30 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamsContext closureSpecParams() throws RecognitionException { ClosureSpecParamsContext _localctx = new ClosureSpecParamsContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_closureSpecParams); + enterRule(_localctx, 114, RULE_closureSpecParams); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(754); + setState(829); closureSpecParam(); - setState(759); + setState(834); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + _alt = getInterpreter().adaptivePredict(_input,51,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(755); + setState(830); match(COMMA); - setState(756); + setState(831); closureSpecParam(); } } } - setState(761); + setState(836); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + _alt = getInterpreter().adaptivePredict(_input,51,_ctx); } } } @@ -3506,23 +4005,23 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamContext closureSpecParam() throws RecognitionException { ClosureSpecParamContext _localctx = new ClosureSpecParamContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_closureSpecParam); + enterRule(_localctx, 116, RULE_closureSpecParam); try { enterOuterAlt(_localctx, 1); { - setState(764); + setState(839); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(762); + setState(837); match(IDENTIFIER); - setState(763); + setState(838); match(COLON); } break; } - setState(766); + setState(841); expression(0); } } @@ -3562,19 +4061,19 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureImplProofStmtContext closureImplProofStmt() throws RecognitionException { ClosureImplProofStmtContext _localctx = new ClosureImplProofStmtContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_closureImplProofStmt); + enterRule(_localctx, 118, RULE_closureImplProofStmt); try { enterOuterAlt(_localctx, 1); { - setState(768); + setState(843); match(PROOF); - setState(769); + setState(844); expression(0); - setState(770); + setState(845); match(IMPL); - setState(771); + setState(846); closureSpecInstance(); - setState(772); + setState(847); block(); } } @@ -3630,57 +4129,57 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofContext implementationProof() throws RecognitionException { ImplementationProofContext _localctx = new ImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_implementationProof); + enterRule(_localctx, 120, RULE_implementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(774); + setState(849); type_(); - setState(775); + setState(850); match(IMPL); - setState(776); + setState(851); type_(); - setState(795); + setState(870); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(777); + setState(852); match(L_CURLY); - setState(783); + setState(858); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(778); + setState(853); implementationProofPredicateAlias(); - setState(779); + setState(854); eos(); } } - setState(785); + setState(860); _errHandler.sync(this); _la = _input.LA(1); } - setState(791); + setState(866); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(786); + setState(861); methodImplementationProof(); - setState(787); + setState(862); eos(); } } - setState(793); + setState(868); _errHandler.sync(this); _la = _input.LA(1); } - setState(794); + setState(869); match(R_CURLY); } break; @@ -3723,33 +4222,33 @@ public T accept(ParseTreeVisitor visitor) { public final MethodImplementationProofContext methodImplementationProof() throws RecognitionException { MethodImplementationProofContext _localctx = new MethodImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_methodImplementationProof); + enterRule(_localctx, 122, RULE_methodImplementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(798); + setState(873); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(797); + setState(872); match(PURE); } } - setState(800); + setState(875); nonLocalReceiver(); - setState(801); + setState(876); match(IDENTIFIER); - setState(802); + setState(877); signature(); - setState(804); + setState(879); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(803); + setState(878); block(); } break; @@ -3788,36 +4287,36 @@ public T accept(ParseTreeVisitor visitor) { public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionException { NonLocalReceiverContext _localctx = new NonLocalReceiverContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_nonLocalReceiver); + enterRule(_localctx, 124, RULE_nonLocalReceiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(806); + setState(881); match(L_PAREN); - setState(808); + setState(883); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { - setState(807); + setState(882); match(IDENTIFIER); } break; } - setState(811); + setState(886); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(810); + setState(885); match(STAR); } } - setState(813); + setState(888); typeName(); - setState(814); + setState(889); match(R_PAREN); } } @@ -3854,26 +4353,26 @@ public T accept(ParseTreeVisitor visitor) { public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_selection); + enterRule(_localctx, 126, RULE_selection); try { - setState(821); + setState(896); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(816); + setState(891); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(817); + setState(892); type_(); - setState(818); + setState(893); match(DOT); - setState(819); + setState(894); match(IDENTIFIER); } break; @@ -3913,28 +4412,28 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofPredicateAliasContext implementationProofPredicateAlias() throws RecognitionException { ImplementationProofPredicateAliasContext _localctx = new ImplementationProofPredicateAliasContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_implementationProofPredicateAlias); + enterRule(_localctx, 128, RULE_implementationProofPredicateAlias); try { enterOuterAlt(_localctx, 1); { - setState(823); + setState(898); match(PRED); - setState(824); + setState(899); match(IDENTIFIER); - setState(825); + setState(900); match(DECLARE_ASSIGN); - setState(828); + setState(903); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(826); + setState(901); selection(); } break; case 2: { - setState(827); + setState(902); operandName(); } break; @@ -3976,30 +4475,30 @@ public T accept(ParseTreeVisitor visitor) { public final MakeContext make() throws RecognitionException { MakeContext _localctx = new MakeContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_make); + enterRule(_localctx, 130, RULE_make); int _la; try { enterOuterAlt(_localctx, 1); { - setState(830); + setState(905); match(MAKE); - setState(831); + setState(906); match(L_PAREN); - setState(832); + setState(907); type_(); - setState(835); + setState(910); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(833); + setState(908); match(COMMA); - setState(834); + setState(909); expressionList(); } } - setState(837); + setState(912); match(R_PAREN); } } @@ -4034,17 +4533,17 @@ public T accept(ParseTreeVisitor visitor) { public final New_Context new_() throws RecognitionException { New_Context _localctx = new New_Context(_ctx, getState()); - enterRule(_localctx, 118, RULE_new_); + enterRule(_localctx, 132, RULE_new_); try { enterOuterAlt(_localctx, 1); { - setState(839); + setState(914); match(NEW); - setState(840); + setState(915); match(L_PAREN); - setState(841); + setState(916); type_(); - setState(842); + setState(917); match(R_PAREN); } } @@ -4083,24 +4582,24 @@ public T accept(ParseTreeVisitor visitor) { public final SpecMemberContext specMember() throws RecognitionException { SpecMemberContext _localctx = new SpecMemberContext(_ctx, getState()); - enterRule(_localctx, 120, RULE_specMember); + enterRule(_localctx, 134, RULE_specMember); try { enterOuterAlt(_localctx, 1); { - setState(844); + setState(919); ((SpecMemberContext)_localctx).specification = specification(); - setState(847); + setState(922); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: { - setState(845); + setState(920); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; case 2: { - setState(846); + setState(921); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; @@ -4145,23 +4644,23 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) throws RecognitionException { FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 122, RULE_functionDecl); + enterRule(_localctx, 136, RULE_functionDecl); try { enterOuterAlt(_localctx, 1); { - setState(849); + setState(924); match(FUNC); - setState(850); + setState(925); match(IDENTIFIER); { - setState(851); + setState(926); signature(); - setState(853); + setState(928); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { case 1: { - setState(852); + setState(927); blockWithBodyParameterInfo(); } break; @@ -4210,25 +4709,25 @@ public T accept(ParseTreeVisitor visitor) { public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws RecognitionException { MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 124, RULE_methodDecl); + enterRule(_localctx, 138, RULE_methodDecl); try { enterOuterAlt(_localctx, 1); { - setState(855); + setState(930); match(FUNC); - setState(856); + setState(931); receiver(); - setState(857); + setState(932); match(IDENTIFIER); { - setState(858); + setState(933); signature(); - setState(860); + setState(935); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { - setState(859); + setState(934); blockWithBodyParameterInfo(); } break; @@ -4268,13 +4767,13 @@ public T accept(ParseTreeVisitor visitor) { public final ExplicitGhostMemberContext explicitGhostMember() throws RecognitionException { ExplicitGhostMemberContext _localctx = new ExplicitGhostMemberContext(_ctx, getState()); - enterRule(_localctx, 126, RULE_explicitGhostMember); + enterRule(_localctx, 140, RULE_explicitGhostMember); try { enterOuterAlt(_localctx, 1); { - setState(862); + setState(937); match(GHOST); - setState(865); + setState(940); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -4285,7 +4784,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TRUSTED: case FUNC: { - setState(863); + setState(938); specMember(); } break; @@ -4293,7 +4792,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(864); + setState(939); declaration(); } break; @@ -4335,22 +4834,22 @@ public T accept(ParseTreeVisitor visitor) { public final FpredicateDeclContext fpredicateDecl() throws RecognitionException { FpredicateDeclContext _localctx = new FpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_fpredicateDecl); + enterRule(_localctx, 142, RULE_fpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(867); + setState(942); match(PRED); - setState(868); + setState(943); match(IDENTIFIER); - setState(869); + setState(944); parameters(); - setState(871); + setState(946); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(870); + setState(945); predicateBody(); } break; @@ -4390,17 +4889,17 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateBodyContext predicateBody() throws RecognitionException { PredicateBodyContext _localctx = new PredicateBodyContext(_ctx, getState()); - enterRule(_localctx, 130, RULE_predicateBody); + enterRule(_localctx, 144, RULE_predicateBody); try { enterOuterAlt(_localctx, 1); { - setState(873); + setState(948); match(L_CURLY); - setState(874); + setState(949); expression(0); - setState(875); + setState(950); eos(); - setState(876); + setState(951); match(R_CURLY); } } @@ -4440,24 +4939,24 @@ public T accept(ParseTreeVisitor visitor) { public final MpredicateDeclContext mpredicateDecl() throws RecognitionException { MpredicateDeclContext _localctx = new MpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 132, RULE_mpredicateDecl); + enterRule(_localctx, 146, RULE_mpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(878); + setState(953); match(PRED); - setState(879); + setState(954); receiver(); - setState(880); + setState(955); match(IDENTIFIER); - setState(881); + setState(956); parameters(); - setState(883); + setState(958); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(882); + setState(957); predicateBody(); } break; @@ -4499,13 +4998,13 @@ public T accept(ParseTreeVisitor visitor) { public final VarSpecContext varSpec() throws RecognitionException { VarSpecContext _localctx = new VarSpecContext(_ctx, getState()); - enterRule(_localctx, 134, RULE_varSpec); + enterRule(_localctx, 148, RULE_varSpec); try { enterOuterAlt(_localctx, 1); { - setState(885); + setState(960); maybeAddressableIdentifierList(); - setState(893); + setState(968); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -4528,16 +5027,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(886); + setState(961); type_(); - setState(889); + setState(964); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: { - setState(887); + setState(962); match(ASSIGN); - setState(888); + setState(963); expressionList(); } break; @@ -4546,9 +5045,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(891); + setState(966); match(ASSIGN); - setState(892); + setState(967); expressionList(); } break; @@ -4589,15 +5088,15 @@ public T accept(ParseTreeVisitor visitor) { public final ShortVarDeclContext shortVarDecl() throws RecognitionException { ShortVarDeclContext _localctx = new ShortVarDeclContext(_ctx, getState()); - enterRule(_localctx, 136, RULE_shortVarDecl); + enterRule(_localctx, 150, RULE_shortVarDecl); try { enterOuterAlt(_localctx, 1); { - setState(895); + setState(970); maybeAddressableIdentifierList(); - setState(896); + setState(971); match(DECLARE_ASSIGN); - setState(897); + setState(972); expressionList(); } } @@ -4635,36 +5134,36 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverContext receiver() throws RecognitionException { ReceiverContext _localctx = new ReceiverContext(_ctx, getState()); - enterRule(_localctx, 138, RULE_receiver); + enterRule(_localctx, 152, RULE_receiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(899); + setState(974); match(L_PAREN); - setState(901); + setState(976); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: { - setState(900); + setState(975); maybeAddressableIdentifier(); } break; } - setState(903); + setState(978); type_(); - setState(905); + setState(980); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(904); + setState(979); match(COMMA); } } - setState(907); + setState(982); match(R_PAREN); } } @@ -4699,22 +5198,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 140, RULE_parameterDecl); + enterRule(_localctx, 154, RULE_parameterDecl); try { - setState(911); + setState(986); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(909); + setState(984); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(910); + setState(985); ghostParameterDecl(); } break; @@ -4751,21 +5250,21 @@ public T accept(ParseTreeVisitor visitor) { public final ActualParameterDeclContext actualParameterDecl() throws RecognitionException { ActualParameterDeclContext _localctx = new ActualParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 142, RULE_actualParameterDecl); + enterRule(_localctx, 156, RULE_actualParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(914); + setState(989); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: { - setState(913); + setState(988); identifierList(); } break; } - setState(916); + setState(991); parameterType(); } } @@ -4801,23 +5300,23 @@ public T accept(ParseTreeVisitor visitor) { public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionException { GhostParameterDeclContext _localctx = new GhostParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 144, RULE_ghostParameterDecl); + enterRule(_localctx, 158, RULE_ghostParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(918); + setState(993); match(GHOST); - setState(920); + setState(995); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { case 1: { - setState(919); + setState(994); identifierList(); } break; } - setState(922); + setState(997); parameterType(); } } @@ -4850,22 +5349,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterTypeContext parameterType() throws RecognitionException { ParameterTypeContext _localctx = new ParameterTypeContext(_ctx, getState()); - enterRule(_localctx, 146, RULE_parameterType); + enterRule(_localctx, 160, RULE_parameterType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(925); + setState(1000); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(924); + setState(999); match(ELLIPSIS); } } - setState(927); + setState(1002); type_(); } } @@ -5148,26 +5647,26 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _parentState = getState(); ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); ExpressionContext _prevctx = _localctx; - int _startState = 148; - enterRecursionRule(_localctx, 148, RULE_expression, _p); + int _startState = 162; + enterRecursionRule(_localctx, 162, RULE_expression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(945); + setState(1020); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: { _localctx = new UnaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(930); + setState(1005); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)))) != 0)) ) { + if ( !(((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)))) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -5175,7 +5674,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(931); + setState(1006); expression(14); } break; @@ -5184,7 +5683,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(932); + setState(1007); primaryExpr(0); } break; @@ -5193,13 +5692,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(933); + setState(1008); match(UNFOLDING); - setState(934); + setState(1009); predicateAccess(); - setState(935); + setState(1010); match(IN); - setState(936); + setState(1011); expression(2); } break; @@ -5208,7 +5707,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(938); + setState(1013); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -5218,41 +5717,41 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(939); + setState(1014); boundVariables(); - setState(940); + setState(1015); match(COLON); - setState(941); + setState(1016); match(COLON); - setState(942); + setState(1017); triggers(); - setState(943); + setState(1018); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(982); + setState(1057); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,71,_ctx); + _alt = getInterpreter().adaptivePredict(_input,79,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(980); + setState(1055); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(947); + setState(1022); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(948); + setState(1023); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 124)) & ~0x3f) == 0 && ((1L << (_la - 124)) & ((1L << (DIV - 124)) | (1L << (MOD - 124)) | (1L << (LSHIFT - 124)) | (1L << (RSHIFT - 124)) | (1L << (BIT_CLEAR - 124)) | (1L << (STAR - 124)) | (1L << (AMPERSAND - 124)))) != 0)) ) { + if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (DIV - 125)) | (1L << (MOD - 125)) | (1L << (LSHIFT - 125)) | (1L << (RSHIFT - 125)) | (1L << (BIT_CLEAR - 125)) | (1L << (STAR - 125)) | (1L << (AMPERSAND - 125)))) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -5260,7 +5759,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(949); + setState(1024); expression(13); } break; @@ -5268,12 +5767,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(950); + setState(1025); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(951); + setState(1026); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 111)) & ~0x3f) == 0 && ((1L << (_la - 111)) & ((1L << (PLUS_PLUS - 111)) | (1L << (OR - 111)) | (1L << (PLUS - 111)) | (1L << (MINUS - 111)) | (1L << (CARET - 111)))) != 0)) ) { + if ( !(_la==WAND || ((((_la - 112)) & ~0x3f) == 0 && ((1L << (_la - 112)) & ((1L << (PLUS_PLUS - 112)) | (1L << (OR - 112)) | (1L << (PLUS - 112)) | (1L << (MINUS - 112)) | (1L << (CARET - 112)))) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -5281,7 +5780,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(952); + setState(1027); expression(12); } break; @@ -5289,9 +5788,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(953); + setState(1028); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(954); + setState(1029); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << UNION) | (1L << INTERSECTION) | (1L << SETMINUS))) != 0)) ) { @@ -5302,7 +5801,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(955); + setState(1030); expression(11); } break; @@ -5310,9 +5809,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(956); + setState(1031); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(957); + setState(1032); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << IN) | (1L << MULTI) | (1L << SUBSET))) != 0)) ) { @@ -5323,7 +5822,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(958); + setState(1033); expression(10); } break; @@ -5331,12 +5830,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(959); + setState(1034); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(960); + setState(1035); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (GHOST_EQUALS - 70)) | (1L << (GHOST_NOT_EQUALS - 70)) | (1L << (EQUALS - 70)) | (1L << (NOT_EQUALS - 70)) | (1L << (LESS - 70)) | (1L << (LESS_OR_EQUALS - 70)) | (1L << (GREATER - 70)) | (1L << (GREATER_OR_EQUALS - 70)))) != 0)) ) { + if ( !(((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (GHOST_EQUALS - 71)) | (1L << (GHOST_NOT_EQUALS - 71)) | (1L << (EQUALS - 71)) | (1L << (NOT_EQUALS - 71)) | (1L << (LESS - 71)) | (1L << (LESS_OR_EQUALS - 71)) | (1L << (GREATER - 71)) | (1L << (GREATER_OR_EQUALS - 71)))) != 0)) ) { ((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this); } else { @@ -5344,7 +5843,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(961); + setState(1036); expression(9); } break; @@ -5352,11 +5851,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(962); + setState(1037); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(963); + setState(1038); match(LOGICAL_AND); - setState(964); + setState(1039); expression(7); } break; @@ -5364,11 +5863,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(965); + setState(1040); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(966); + setState(1041); match(LOGICAL_OR); - setState(967); + setState(1042); expression(6); } break; @@ -5376,11 +5875,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(968); + setState(1043); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(969); + setState(1044); match(IMPLIES); - setState(970); + setState(1045); expression(4); } break; @@ -5388,15 +5887,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(971); + setState(1046); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(972); + setState(1047); match(QMARK); - setState(973); + setState(1048); expression(0); - setState(974); + setState(1049); match(COLON); - setState(975); + setState(1050); expression(3); } break; @@ -5404,20 +5903,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(977); + setState(1052); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(978); + setState(1053); match(IMPL); - setState(979); + setState(1054); closureSpecInstance(); } break; } } } - setState(984); + setState(1059); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,71,_ctx); + _alt = getInterpreter().adaptivePredict(_input,79,_ctx); } } } @@ -5506,148 +6005,148 @@ public T accept(ParseTreeVisitor visitor) { public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); - enterRule(_localctx, 150, RULE_statement); + enterRule(_localctx, 164, RULE_statement); try { - setState(1005); + setState(1080); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(985); + setState(1060); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(986); + setState(1061); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(987); + setState(1062); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(988); + setState(1063); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(989); + setState(1064); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(990); + setState(1065); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(991); + setState(1066); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(992); + setState(1067); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(993); + setState(1068); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(994); + setState(1069); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(995); + setState(1070); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(996); + setState(1071); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(997); + setState(1072); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(998); + setState(1073); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(999); + setState(1074); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1000); + setState(1075); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1001); + setState(1076); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1002); + setState(1077); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1003); + setState(1078); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1004); + setState(1079); closureImplProofStmt(); } break; @@ -5682,13 +6181,13 @@ public T accept(ParseTreeVisitor visitor) { public final ApplyStmtContext applyStmt() throws RecognitionException { ApplyStmtContext _localctx = new ApplyStmtContext(_ctx, getState()); - enterRule(_localctx, 152, RULE_applyStmt); + enterRule(_localctx, 166, RULE_applyStmt); try { enterOuterAlt(_localctx, 1); { - setState(1007); + setState(1082); match(APPLY); - setState(1008); + setState(1083); expression(0); } } @@ -5724,20 +6223,20 @@ public T accept(ParseTreeVisitor visitor) { public final PackageStmtContext packageStmt() throws RecognitionException { PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState()); - enterRule(_localctx, 154, RULE_packageStmt); + enterRule(_localctx, 168, RULE_packageStmt); try { enterOuterAlt(_localctx, 1); { - setState(1010); + setState(1085); match(PACKAGE); - setState(1011); + setState(1086); expression(0); - setState(1013); + setState(1088); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { - setState(1012); + setState(1087); block(); } break; @@ -5775,13 +6274,13 @@ public T accept(ParseTreeVisitor visitor) { public final SpecForStmtContext specForStmt() throws RecognitionException { SpecForStmtContext _localctx = new SpecForStmtContext(_ctx, getState()); - enterRule(_localctx, 156, RULE_specForStmt); + enterRule(_localctx, 170, RULE_specForStmt); try { enterOuterAlt(_localctx, 1); { - setState(1015); + setState(1090); loopSpec(); - setState(1016); + setState(1091); forStmt(); } } @@ -5830,39 +6329,39 @@ public T accept(ParseTreeVisitor visitor) { public final LoopSpecContext loopSpec() throws RecognitionException { LoopSpecContext _localctx = new LoopSpecContext(_ctx, getState()); - enterRule(_localctx, 158, RULE_loopSpec); + enterRule(_localctx, 172, RULE_loopSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1024); + setState(1099); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1018); + setState(1093); match(INV); - setState(1019); + setState(1094); expression(0); - setState(1020); + setState(1095); eos(); } } - setState(1026); + setState(1101); _errHandler.sync(this); _la = _input.LA(1); } - setState(1031); + setState(1106); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1027); + setState(1102); match(DEC); - setState(1028); + setState(1103); terminationMeasure(); - setState(1029); + setState(1104); eos(); } } @@ -5904,27 +6403,27 @@ public T accept(ParseTreeVisitor visitor) { public final DeferStmtContext deferStmt() throws RecognitionException { DeferStmtContext _localctx = new DeferStmtContext(_ctx, getState()); - enterRule(_localctx, 160, RULE_deferStmt); + enterRule(_localctx, 174, RULE_deferStmt); int _la; try { - setState(1038); + setState(1113); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1033); + setState(1108); match(DEFER); - setState(1034); + setState(1109); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1035); + setState(1110); match(DEFER); - setState(1036); + setState(1111); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -5935,7 +6434,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1037); + setState(1112); predicateAccess(); } break; @@ -5978,64 +6477,64 @@ public T accept(ParseTreeVisitor visitor) { public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); - enterRule(_localctx, 162, RULE_basicLit); + enterRule(_localctx, 176, RULE_basicLit); try { - setState(1048); + setState(1123); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1040); + setState(1115); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1041); + setState(1116); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1042); + setState(1117); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1043); + setState(1118); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1044); + setState(1119); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1045); + setState(1120); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1046); + setState(1121); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1047); + setState(1122); match(RUNE_LIT); } break; @@ -6272,23 +6771,23 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _parentState = getState(); PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, _parentState); PrimaryExprContext _prevctx = _localctx; - int _startState = 164; - enterRecursionRule(_localctx, 164, RULE_primaryExpr, _p); + int _startState = 178; + enterRecursionRule(_localctx, 178, RULE_primaryExpr, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1062); + setState(1137); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { case 1: { _localctx = new OperandPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1051); + setState(1126); operand(); } break; @@ -6297,7 +6796,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1052); + setState(1127); conversion(); } break; @@ -6306,7 +6805,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1053); + setState(1128); methodExpr(); } break; @@ -6315,7 +6814,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1054); + setState(1129); ghostPrimaryExpr(); } break; @@ -6324,7 +6823,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1055); + setState(1130); new_(); } break; @@ -6333,7 +6832,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1056); + setState(1131); make(); } break; @@ -6342,7 +6841,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1057); + setState(1132); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 44)) & ~0x3f) == 0 && ((1L << (_la - 44)) & ((1L << (LEN - 44)) | (1L << (CAP - 44)) | (1L << (DOM - 44)) | (1L << (RANGE - 44)))) != 0)) ) { @@ -6353,36 +6852,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1058); + setState(1133); match(L_PAREN); - setState(1059); + setState(1134); expression(0); - setState(1060); + setState(1135); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1086); + setState(1161); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,80,_ctx); + _alt = getInterpreter().adaptivePredict(_input,88,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1084); + setState(1159); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1064); + setState(1139); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1065); + setState(1140); match(DOT); - setState(1066); + setState(1141); match(IDENTIFIER); } break; @@ -6390,9 +6889,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1067); + setState(1142); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1068); + setState(1143); index(); } break; @@ -6400,9 +6899,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1069); + setState(1144); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1070); + setState(1145); slice_(); } break; @@ -6410,9 +6909,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1071); + setState(1146); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1072); + setState(1147); seqUpdExp(); } break; @@ -6420,9 +6919,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1073); + setState(1148); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1074); + setState(1149); typeAssertion(); } break; @@ -6430,9 +6929,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1075); + setState(1150); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1076); + setState(1151); arguments(); } break; @@ -6440,13 +6939,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1077); + setState(1152); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1078); + setState(1153); arguments(); - setState(1079); + setState(1154); match(AS); - setState(1080); + setState(1155); closureSpecInstance(); } break; @@ -6454,18 +6953,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1082); + setState(1157); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1083); + setState(1158); predConstructArgs(); } break; } } } - setState(1088); + setState(1163); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,80,_ctx); + _alt = getInterpreter().adaptivePredict(_input,88,_ctx); } } } @@ -6501,13 +7000,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionLitContext functionLit() throws RecognitionException { FunctionLitContext _localctx = new FunctionLitContext(_ctx, getState()); - enterRule(_localctx, 166, RULE_functionLit); + enterRule(_localctx, 180, RULE_functionLit); try { enterOuterAlt(_localctx, 1); { - setState(1089); + setState(1164); ((FunctionLitContext)_localctx).specification = specification(); - setState(1090); + setState(1165); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -6549,32 +7048,32 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws RecognitionException { ClosureDeclContext _localctx = new ClosureDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 168, RULE_closureDecl); + enterRule(_localctx, 182, RULE_closureDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1092); + setState(1167); match(FUNC); - setState(1094); + setState(1169); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1093); + setState(1168); match(IDENTIFIER); } } { - setState(1096); + setState(1171); signature(); - setState(1098); + setState(1173); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { - setState(1097); + setState(1172); blockWithBodyParameterInfo(); } break; @@ -6613,34 +7112,34 @@ public T accept(ParseTreeVisitor visitor) { public final PredConstructArgsContext predConstructArgs() throws RecognitionException { PredConstructArgsContext _localctx = new PredConstructArgsContext(_ctx, getState()); - enterRule(_localctx, 170, RULE_predConstructArgs); + enterRule(_localctx, 184, RULE_predConstructArgs); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1100); + setState(1175); match(L_PRED); - setState(1102); + setState(1177); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1101); + setState(1176); expressionList(); } } - setState(1105); + setState(1180); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1104); + setState(1179); match(COMMA); } } - setState(1107); + setState(1182); match(R_PRED); } } @@ -6696,52 +7195,52 @@ public T accept(ParseTreeVisitor visitor) { public final InterfaceTypeContext interfaceType() throws RecognitionException { InterfaceTypeContext _localctx = new InterfaceTypeContext(_ctx, getState()); - enterRule(_localctx, 172, RULE_interfaceType); + enterRule(_localctx, 186, RULE_interfaceType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1109); + setState(1184); match(INTERFACE); - setState(1110); + setState(1185); match(L_CURLY); - setState(1120); + setState(1195); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << GHOST) | (1L << PRED))) != 0) || _la==TRUSTED || _la==IDENTIFIER) { { { - setState(1114); + setState(1189); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(1111); + setState(1186); methodSpec(); } break; case 2: { - setState(1112); + setState(1187); typeName(); } break; case 3: { - setState(1113); + setState(1188); predicateSpec(); } break; } - setState(1116); + setState(1191); eos(); } } - setState(1122); + setState(1197); _errHandler.sync(this); _la = _input.LA(1); } - setState(1123); + setState(1198); match(R_CURLY); } } @@ -6775,15 +7274,15 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateSpecContext predicateSpec() throws RecognitionException { PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState()); - enterRule(_localctx, 174, RULE_predicateSpec); + enterRule(_localctx, 188, RULE_predicateSpec); try { enterOuterAlt(_localctx, 1); { - setState(1125); + setState(1200); match(PRED); - setState(1126); + setState(1201); match(IDENTIFIER); - setState(1127); + setState(1202); parameters(); } } @@ -6823,53 +7322,53 @@ public T accept(ParseTreeVisitor visitor) { public final MethodSpecContext methodSpec() throws RecognitionException { MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState()); - enterRule(_localctx, 176, RULE_methodSpec); + enterRule(_localctx, 190, RULE_methodSpec); int _la; try { - setState(1144); + setState(1219); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1130); + setState(1205); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1129); + setState(1204); match(GHOST); } } - setState(1132); + setState(1207); specification(); - setState(1133); + setState(1208); match(IDENTIFIER); - setState(1134); + setState(1209); parameters(); - setState(1135); + setState(1210); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1138); + setState(1213); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1137); + setState(1212); match(GHOST); } } - setState(1140); + setState(1215); specification(); - setState(1141); + setState(1216); match(IDENTIFIER); - setState(1142); + setState(1217); parameters(); } break; @@ -6914,15 +7413,15 @@ public T accept(ParseTreeVisitor visitor) { public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); - enterRule(_localctx, 178, RULE_type_); + enterRule(_localctx, 192, RULE_type_); try { - setState(1153); + setState(1228); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1146); + setState(1221); typeName(); } break; @@ -6937,7 +7436,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1147); + setState(1222); typeLit(); } break; @@ -6951,18 +7450,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1148); + setState(1223); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1149); + setState(1224); match(L_PAREN); - setState(1150); + setState(1225); type_(); - setState(1151); + setState(1226); match(R_PAREN); } break; @@ -7022,71 +7521,71 @@ public T accept(ParseTreeVisitor visitor) { public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); - enterRule(_localctx, 180, RULE_typeLit); + enterRule(_localctx, 194, RULE_typeLit); try { - setState(1164); + setState(1239); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1155); + setState(1230); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1156); + setState(1231); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1157); + setState(1232); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1158); + setState(1233); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1159); + setState(1234); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1160); + setState(1235); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1161); + setState(1236); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1162); + setState(1237); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1163); + setState(1238); predType(); } break; @@ -7121,13 +7620,13 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeContext predType() throws RecognitionException { PredTypeContext _localctx = new PredTypeContext(_ctx, getState()); - enterRule(_localctx, 182, RULE_predType); + enterRule(_localctx, 196, RULE_predType); try { enterOuterAlt(_localctx, 1); { - setState(1166); + setState(1241); match(PRED); - setState(1167); + setState(1242); predTypeParams(); } } @@ -7168,45 +7667,45 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeParamsContext predTypeParams() throws RecognitionException { PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState()); - enterRule(_localctx, 184, RULE_predTypeParams); + enterRule(_localctx, 198, RULE_predTypeParams); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1169); + setState(1244); match(L_PAREN); - setState(1181); + setState(1256); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) { { - setState(1170); + setState(1245); type_(); - setState(1175); + setState(1250); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,92,_ctx); + _alt = getInterpreter().adaptivePredict(_input,100,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1171); + setState(1246); match(COMMA); - setState(1172); + setState(1247); type_(); } } } - setState(1177); + setState(1252); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,92,_ctx); + _alt = getInterpreter().adaptivePredict(_input,100,_ctx); } - setState(1179); + setState(1254); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1178); + setState(1253); match(COMMA); } } @@ -7214,7 +7713,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1183); + setState(1258); match(R_PAREN); } } @@ -7264,57 +7763,57 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); - enterRule(_localctx, 186, RULE_literalType); + enterRule(_localctx, 200, RULE_literalType); try { - setState(1192); + setState(1267); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1185); + setState(1260); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1186); + setState(1261); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1187); + setState(1262); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1188); + setState(1263); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1189); + setState(1264); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1190); + setState(1265); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1191); + setState(1266); typeName(); } break; @@ -7351,17 +7850,17 @@ public T accept(ParseTreeVisitor visitor) { public final ImplicitArrayContext implicitArray() throws RecognitionException { ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState()); - enterRule(_localctx, 188, RULE_implicitArray); + enterRule(_localctx, 202, RULE_implicitArray); try { enterOuterAlt(_localctx, 1); { - setState(1194); + setState(1269); match(L_BRACKET); - setState(1195); + setState(1270); match(ELLIPSIS); - setState(1196); + setState(1271); match(R_BRACKET); - setState(1197); + setState(1272); elementType(); } } @@ -7405,36 +7904,36 @@ public T accept(ParseTreeVisitor visitor) { public final Slice_Context slice_() throws RecognitionException { Slice_Context _localctx = new Slice_Context(_ctx, getState()); - enterRule(_localctx, 190, RULE_slice_); + enterRule(_localctx, 204, RULE_slice_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1199); + setState(1274); match(L_BRACKET); - setState(1215); + setState(1290); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) { case 1: { - setState(1201); + setState(1276); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1200); + setState(1275); low(); } } - setState(1203); + setState(1278); match(COLON); - setState(1205); + setState(1280); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1204); + setState(1279); high(); } } @@ -7443,28 +7942,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1208); + setState(1283); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1207); + setState(1282); low(); } } - setState(1210); + setState(1285); match(COLON); - setState(1211); + setState(1286); high(); - setState(1212); + setState(1287); match(COLON); - setState(1213); + setState(1288); cap(); } break; } - setState(1217); + setState(1292); match(R_BRACKET); } } @@ -7496,11 +7995,11 @@ public T accept(ParseTreeVisitor visitor) { public final LowContext low() throws RecognitionException { LowContext _localctx = new LowContext(_ctx, getState()); - enterRule(_localctx, 192, RULE_low); + enterRule(_localctx, 206, RULE_low); try { enterOuterAlt(_localctx, 1); { - setState(1219); + setState(1294); expression(0); } } @@ -7532,11 +8031,11 @@ public T accept(ParseTreeVisitor visitor) { public final HighContext high() throws RecognitionException { HighContext _localctx = new HighContext(_ctx, getState()); - enterRule(_localctx, 194, RULE_high); + enterRule(_localctx, 208, RULE_high); try { enterOuterAlt(_localctx, 1); { - setState(1221); + setState(1296); expression(0); } } @@ -7568,11 +8067,11 @@ public T accept(ParseTreeVisitor visitor) { public final CapContext cap() throws RecognitionException { CapContext _localctx = new CapContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_cap); + enterRule(_localctx, 210, RULE_cap); try { enterOuterAlt(_localctx, 1); { - setState(1223); + setState(1298); expression(0); } } @@ -7614,20 +8113,20 @@ public T accept(ParseTreeVisitor visitor) { public final Assign_opContext assign_op() throws RecognitionException { Assign_opContext _localctx = new Assign_opContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_assign_op); + enterRule(_localctx, 212, RULE_assign_op); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1226); + setState(1301); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (OR - 123)) | (1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (PLUS - 123)) | (1L << (MINUS - 123)) | (1L << (CARET - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) { + if (((((_la - 124)) & ~0x3f) == 0 && ((1L << (_la - 124)) & ((1L << (OR - 124)) | (1L << (DIV - 124)) | (1L << (MOD - 124)) | (1L << (LSHIFT - 124)) | (1L << (RSHIFT - 124)) | (1L << (BIT_CLEAR - 124)) | (1L << (PLUS - 124)) | (1L << (MINUS - 124)) | (1L << (CARET - 124)) | (1L << (STAR - 124)) | (1L << (AMPERSAND - 124)))) != 0)) { { - setState(1225); + setState(1300); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (OR - 123)) | (1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (PLUS - 123)) | (1L << (MINUS - 123)) | (1L << (CARET - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) ) { + if ( !(((((_la - 124)) & ~0x3f) == 0 && ((1L << (_la - 124)) & ((1L << (OR - 124)) | (1L << (DIV - 124)) | (1L << (MOD - 124)) | (1L << (LSHIFT - 124)) | (1L << (RSHIFT - 124)) | (1L << (BIT_CLEAR - 124)) | (1L << (PLUS - 124)) | (1L << (MINUS - 124)) | (1L << (CARET - 124)) | (1L << (STAR - 124)) | (1L << (AMPERSAND - 124)))) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -7638,7 +8137,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1228); + setState(1303); match(ASSIGN); } } @@ -7681,48 +8180,48 @@ public T accept(ParseTreeVisitor visitor) { public final RangeClauseContext rangeClause() throws RecognitionException { RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_rangeClause); + enterRule(_localctx, 214, RULE_rangeClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1236); + setState(1311); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { case 1: { - setState(1230); + setState(1305); expressionList(); - setState(1231); + setState(1306); match(ASSIGN); } break; case 2: { - setState(1233); + setState(1308); maybeAddressableIdentifierList(); - setState(1234); + setState(1309); match(DECLARE_ASSIGN); } break; } - setState(1238); + setState(1313); match(RANGE); - setState(1239); + setState(1314); expression(0); - setState(1244); + setState(1319); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1240); + setState(1315); match(WITH); - setState(1242); + setState(1317); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1241); + setState(1316); match(IDENTIFIER); } } @@ -7760,13 +8259,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_packageClause); + enterRule(_localctx, 216, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1246); + setState(1321); match(PACKAGE); - setState(1247); + setState(1322); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -7798,11 +8297,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 204, RULE_importPath); + enterRule(_localctx, 218, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1249); + setState(1324); string_(); } } @@ -7840,29 +8339,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_declaration); + enterRule(_localctx, 220, RULE_declaration); try { - setState(1254); + setState(1329); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1251); + setState(1326); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1252); + setState(1327); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1253); + setState(1328); varDecl(); } break; @@ -7910,43 +8409,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 208, RULE_constDecl); + enterRule(_localctx, 222, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1256); + setState(1331); match(CONST); - setState(1268); + setState(1343); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1257); + setState(1332); constSpec(); } break; case L_PAREN: { - setState(1258); + setState(1333); match(L_PAREN); - setState(1264); + setState(1339); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1259); + setState(1334); constSpec(); - setState(1260); + setState(1335); eos(); } } - setState(1266); + setState(1341); _errHandler.sync(this); _la = _input.LA(1); } - setState(1267); + setState(1342); match(R_PAREN); } break; @@ -7990,31 +8489,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_constSpec); + enterRule(_localctx, 224, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1270); + setState(1345); identifierList(); - setState(1276); + setState(1351); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { case 1: { - setState(1272); + setState(1347); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) { { - setState(1271); + setState(1346); type_(); } } - setState(1274); + setState(1349); match(ASSIGN); - setState(1275); + setState(1350); expressionList(); } break; @@ -8054,30 +8553,30 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_identifierList); + enterRule(_localctx, 226, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1278); + setState(1353); match(IDENTIFIER); - setState(1283); + setState(1358); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,109,_ctx); + _alt = getInterpreter().adaptivePredict(_input,117,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1279); + setState(1354); match(COMMA); - setState(1280); + setState(1355); match(IDENTIFIER); } } } - setState(1285); + setState(1360); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,109,_ctx); + _alt = getInterpreter().adaptivePredict(_input,117,_ctx); } } } @@ -8116,30 +8615,30 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_expressionList); + enterRule(_localctx, 228, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1286); + setState(1361); expression(0); - setState(1291); + setState(1366); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,110,_ctx); + _alt = getInterpreter().adaptivePredict(_input,118,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1287); + setState(1362); match(COMMA); - setState(1288); + setState(1363); expression(0); } } } - setState(1293); + setState(1368); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,110,_ctx); + _alt = getInterpreter().adaptivePredict(_input,118,_ctx); } } } @@ -8183,43 +8682,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_typeDecl); + enterRule(_localctx, 230, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1294); + setState(1369); match(TYPE); - setState(1306); + setState(1381); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1295); + setState(1370); typeSpec(); } break; case L_PAREN: { - setState(1296); + setState(1371); match(L_PAREN); - setState(1302); + setState(1377); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1297); + setState(1372); typeSpec(); - setState(1298); + setState(1373); eos(); } } - setState(1304); + setState(1379); _errHandler.sync(this); _la = _input.LA(1); } - setState(1305); + setState(1380); match(R_PAREN); } break; @@ -8258,24 +8757,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_typeSpec); + enterRule(_localctx, 232, RULE_typeSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1308); + setState(1383); match(IDENTIFIER); - setState(1310); + setState(1385); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1309); + setState(1384); match(ASSIGN); } } - setState(1312); + setState(1387); type_(); } } @@ -8319,43 +8818,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_varDecl); + enterRule(_localctx, 234, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1314); + setState(1389); match(VAR); - setState(1326); + setState(1401); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1315); + setState(1390); varSpec(); } break; case L_PAREN: { - setState(1316); + setState(1391); match(L_PAREN); - setState(1322); + setState(1397); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1317); + setState(1392); varSpec(); - setState(1318); + setState(1393); eos(); } } - setState(1324); + setState(1399); _errHandler.sync(this); _la = _input.LA(1); } - setState(1325); + setState(1400); match(R_PAREN); } break; @@ -8394,23 +8893,23 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_block); + enterRule(_localctx, 236, RULE_block); try { enterOuterAlt(_localctx, 1); { - setState(1328); + setState(1403); match(L_CURLY); - setState(1330); + setState(1405); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { case 1: { - setState(1329); + setState(1404); statementList(); } break; } - setState(1332); + setState(1407); match(R_CURLY); } } @@ -8451,12 +8950,12 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_statementList); + enterRule(_localctx, 238, RULE_statementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1340); + setState(1415); _errHandler.sync(this); _alt = 1; do { @@ -8464,19 +8963,19 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1335); + setState(1410); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { case 1: { - setState(1334); + setState(1409); eos(); } break; } - setState(1337); + setState(1412); statement(); - setState(1338); + setState(1413); eos(); } } @@ -8484,9 +8983,9 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1342); + setState(1417); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,118,_ctx); + _alt = getInterpreter().adaptivePredict(_input,126,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -8530,43 +9029,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_simpleStmt); + enterRule(_localctx, 240, RULE_simpleStmt); try { - setState(1349); + setState(1424); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1344); + setState(1419); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1345); + setState(1420); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1346); + setState(1421); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1347); + setState(1422); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1348); + setState(1423); shortVarDecl(); } break; @@ -8600,11 +9099,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_expressionStmt); + enterRule(_localctx, 242, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1351); + setState(1426); expression(0); } } @@ -8641,15 +9140,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_sendStmt); + enterRule(_localctx, 244, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1353); + setState(1428); ((SendStmtContext)_localctx).channel = expression(0); - setState(1354); + setState(1429); match(RECEIVE); - setState(1355); + setState(1430); expression(0); } } @@ -8683,14 +9182,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_incDecStmt); + enterRule(_localctx, 246, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1357); + setState(1432); expression(0); - setState(1358); + setState(1433); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -8736,15 +9235,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_assignment); + enterRule(_localctx, 248, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1360); + setState(1435); expressionList(); - setState(1361); + setState(1436); assign_op(); - setState(1362); + setState(1437); expressionList(); } } @@ -8775,12 +9274,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_emptyStmt); + enterRule(_localctx, 250, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1364); + setState(1439); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -8822,20 +9321,20 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_labeledStmt); + enterRule(_localctx, 252, RULE_labeledStmt); try { enterOuterAlt(_localctx, 1); { - setState(1366); + setState(1441); match(IDENTIFIER); - setState(1367); + setState(1442); match(COLON); - setState(1369); + setState(1444); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { case 1: { - setState(1368); + setState(1443); statement(); } break; @@ -8871,18 +9370,18 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_returnStmt); + enterRule(_localctx, 254, RULE_returnStmt); try { enterOuterAlt(_localctx, 1); { - setState(1371); + setState(1446); match(RETURN); - setState(1373); + setState(1448); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: { - setState(1372); + setState(1447); expressionList(); } break; @@ -8916,18 +9415,18 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_breakStmt); + enterRule(_localctx, 256, RULE_breakStmt); try { enterOuterAlt(_localctx, 1); { - setState(1375); + setState(1450); match(BREAK); - setState(1377); + setState(1452); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: { - setState(1376); + setState(1451); match(IDENTIFIER); } break; @@ -8961,18 +9460,18 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_continueStmt); + enterRule(_localctx, 258, RULE_continueStmt); try { enterOuterAlt(_localctx, 1); { - setState(1379); + setState(1454); match(CONTINUE); - setState(1381); + setState(1456); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,123,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { case 1: { - setState(1380); + setState(1455); match(IDENTIFIER); } break; @@ -9006,13 +9505,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_gotoStmt); + enterRule(_localctx, 260, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1383); + setState(1458); match(GOTO); - setState(1384); + setState(1459); match(IDENTIFIER); } } @@ -9042,11 +9541,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_fallthroughStmt); + enterRule(_localctx, 262, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1386); + setState(1461); match(FALLTHROUGH); } } @@ -9095,61 +9594,61 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_ifStmt); + enterRule(_localctx, 264, RULE_ifStmt); try { enterOuterAlt(_localctx, 1); { - setState(1388); + setState(1463); match(IF); - setState(1397); + setState(1472); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { case 1: { - setState(1389); + setState(1464); expression(0); } break; case 2: { - setState(1390); + setState(1465); eos(); - setState(1391); + setState(1466); expression(0); } break; case 3: { - setState(1393); + setState(1468); simpleStmt(); - setState(1394); + setState(1469); eos(); - setState(1395); + setState(1470); expression(0); } break; } - setState(1399); + setState(1474); block(); - setState(1405); + setState(1480); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { case 1: { - setState(1400); + setState(1475); match(ELSE); - setState(1403); + setState(1478); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1401); + setState(1476); ifStmt(); } break; case L_CURLY: { - setState(1402); + setState(1477); block(); } break; @@ -9192,22 +9691,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_switchStmt); + enterRule(_localctx, 266, RULE_switchStmt); try { - setState(1409); + setState(1484); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1407); + setState(1482); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1408); + setState(1483); typeSwitchStmt(); } break; @@ -9256,24 +9755,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_exprSwitchStmt); + enterRule(_localctx, 268, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1411); + setState(1486); match(SWITCH); - setState(1422); + setState(1497); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: { - setState(1413); + setState(1488); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1412); + setState(1487); expression(0); } } @@ -9282,24 +9781,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1416); + setState(1491); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { case 1: { - setState(1415); + setState(1490); simpleStmt(); } break; } - setState(1418); + setState(1493); eos(); - setState(1420); + setState(1495); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1419); + setState(1494); expression(0); } } @@ -9307,23 +9806,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1424); + setState(1499); match(L_CURLY); - setState(1428); + setState(1503); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1425); + setState(1500); exprCaseClause(); } } - setState(1430); + setState(1505); _errHandler.sync(this); _la = _input.LA(1); } - setState(1431); + setState(1506); match(R_CURLY); } } @@ -9359,20 +9858,20 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_exprCaseClause); + enterRule(_localctx, 270, RULE_exprCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1433); + setState(1508); exprSwitchCase(); - setState(1434); + setState(1509); match(COLON); - setState(1436); + setState(1511); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { case 1: { - setState(1435); + setState(1510); statementList(); } break; @@ -9409,24 +9908,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_exprSwitchCase); + enterRule(_localctx, 272, RULE_exprSwitchCase); try { - setState(1441); + setState(1516); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1438); + setState(1513); match(CASE); - setState(1439); + setState(1514); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1440); + setState(1515); match(DEFAULT); } break; @@ -9477,58 +9976,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_typeSwitchStmt); + enterRule(_localctx, 274, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1443); + setState(1518); match(SWITCH); - setState(1452); + setState(1527); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: { - setState(1444); + setState(1519); typeSwitchGuard(); } break; case 2: { - setState(1445); + setState(1520); eos(); - setState(1446); + setState(1521); typeSwitchGuard(); } break; case 3: { - setState(1448); + setState(1523); simpleStmt(); - setState(1449); + setState(1524); eos(); - setState(1450); + setState(1525); typeSwitchGuard(); } break; } - setState(1454); + setState(1529); match(L_CURLY); - setState(1458); + setState(1533); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1455); + setState(1530); typeCaseClause(); } } - setState(1460); + setState(1535); _errHandler.sync(this); _la = _input.LA(1); } - setState(1461); + setState(1536); match(R_CURLY); } } @@ -9566,31 +10065,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_typeSwitchGuard); + enterRule(_localctx, 276, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1465); + setState(1540); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1463); + setState(1538); match(IDENTIFIER); - setState(1464); + setState(1539); match(DECLARE_ASSIGN); } break; } - setState(1467); + setState(1542); primaryExpr(0); - setState(1468); + setState(1543); match(DOT); - setState(1469); + setState(1544); match(L_PAREN); - setState(1470); + setState(1545); match(TYPE); - setState(1471); + setState(1546); match(R_PAREN); } } @@ -9626,20 +10125,20 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_typeCaseClause); + enterRule(_localctx, 278, RULE_typeCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1473); + setState(1548); typeSwitchCase(); - setState(1474); + setState(1549); match(COLON); - setState(1476); + setState(1551); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1475); + setState(1550); statementList(); } break; @@ -9676,24 +10175,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_typeSwitchCase); + enterRule(_localctx, 280, RULE_typeSwitchCase); try { - setState(1481); + setState(1556); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1478); + setState(1553); match(CASE); - setState(1479); + setState(1554); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1480); + setState(1555); match(DEFAULT); } break; @@ -9740,12 +10239,12 @@ public T accept(ParseTreeVisitor visitor) { public final TypeListContext typeList() throws RecognitionException { TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_typeList); + enterRule(_localctx, 282, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1485); + setState(1560); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -9768,28 +10267,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1483); + setState(1558); type_(); } break; case NIL_LIT: { - setState(1484); + setState(1559); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1494); + setState(1569); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1487); + setState(1562); match(COMMA); - setState(1490); + setState(1565); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -9812,13 +10311,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1488); + setState(1563); type_(); } break; case NIL_LIT: { - setState(1489); + setState(1564); match(NIL_LIT); } break; @@ -9827,7 +10326,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1496); + setState(1571); _errHandler.sync(this); _la = _input.LA(1); } @@ -9867,30 +10366,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_selectStmt); + enterRule(_localctx, 284, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1497); + setState(1572); match(SELECT); - setState(1498); + setState(1573); match(L_CURLY); - setState(1502); + setState(1577); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1499); + setState(1574); commClause(); } } - setState(1504); + setState(1579); _errHandler.sync(this); _la = _input.LA(1); } - setState(1505); + setState(1580); match(R_CURLY); } } @@ -9926,20 +10425,20 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_commClause); + enterRule(_localctx, 286, RULE_commClause); try { enterOuterAlt(_localctx, 1); { - setState(1507); + setState(1582); commCase(); - setState(1508); + setState(1583); match(COLON); - setState(1510); + setState(1585); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { case 1: { - setState(1509); + setState(1584); statementList(); } break; @@ -9979,28 +10478,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_commCase); + enterRule(_localctx, 288, RULE_commCase); try { - setState(1518); + setState(1593); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1512); + setState(1587); match(CASE); - setState(1515); + setState(1590); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { case 1: { - setState(1513); + setState(1588); sendStmt(); } break; case 2: { - setState(1514); + setState(1589); recvStmt(); } break; @@ -10010,7 +10509,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1517); + setState(1592); match(DEFAULT); } break; @@ -10055,31 +10554,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_recvStmt); + enterRule(_localctx, 290, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1526); + setState(1601); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { case 1: { - setState(1520); + setState(1595); expressionList(); - setState(1521); + setState(1596); match(ASSIGN); } break; case 2: { - setState(1523); + setState(1598); identifierList(); - setState(1524); + setState(1599); match(DECLARE_ASSIGN); } break; } - setState(1528); + setState(1603); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -10121,35 +10620,35 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 278, RULE_forStmt); + enterRule(_localctx, 292, RULE_forStmt); try { enterOuterAlt(_localctx, 1); { - setState(1530); + setState(1605); match(FOR); - setState(1534); + setState(1609); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { case 1: { - setState(1531); + setState(1606); expression(0); } break; case 2: { - setState(1532); + setState(1607); forClause(); } break; case 3: { - setState(1533); + setState(1608); rangeClause(); } break; } - setState(1536); + setState(1611); block(); } } @@ -10195,41 +10694,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 280, RULE_forClause); + enterRule(_localctx, 294, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1539); + setState(1614); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: { - setState(1538); + setState(1613); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1541); + setState(1616); eos(); - setState(1543); + setState(1618); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { case 1: { - setState(1542); + setState(1617); expression(0); } break; } - setState(1545); + setState(1620); eos(); - setState(1547); + setState(1622); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1546); + setState(1621); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -10265,13 +10764,13 @@ public T accept(ParseTreeVisitor visitor) { public final GoStmtContext goStmt() throws RecognitionException { GoStmtContext _localctx = new GoStmtContext(_ctx, getState()); - enterRule(_localctx, 282, RULE_goStmt); + enterRule(_localctx, 296, RULE_goStmt); try { enterOuterAlt(_localctx, 1); { - setState(1549); + setState(1624); match(GO); - setState(1550); + setState(1625); expression(0); } } @@ -10304,22 +10803,22 @@ public T accept(ParseTreeVisitor visitor) { public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); - enterRule(_localctx, 284, RULE_typeName); + enterRule(_localctx, 298, RULE_typeName); try { - setState(1554); + setState(1629); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1552); + setState(1627); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1553); + setState(1628); match(IDENTIFIER); } break; @@ -10358,17 +10857,17 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayTypeContext arrayType() throws RecognitionException { ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 286, RULE_arrayType); + enterRule(_localctx, 300, RULE_arrayType); try { enterOuterAlt(_localctx, 1); { - setState(1556); + setState(1631); match(L_BRACKET); - setState(1557); + setState(1632); arrayLength(); - setState(1558); + setState(1633); match(R_BRACKET); - setState(1559); + setState(1634); elementType(); } } @@ -10400,11 +10899,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayLengthContext arrayLength() throws RecognitionException { ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_arrayLength); + enterRule(_localctx, 302, RULE_arrayLength); try { enterOuterAlt(_localctx, 1); { - setState(1561); + setState(1636); expression(0); } } @@ -10436,11 +10935,11 @@ public T accept(ParseTreeVisitor visitor) { public final ElementTypeContext elementType() throws RecognitionException { ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); - enterRule(_localctx, 290, RULE_elementType); + enterRule(_localctx, 304, RULE_elementType); try { enterOuterAlt(_localctx, 1); { - setState(1563); + setState(1638); type_(); } } @@ -10473,13 +10972,13 @@ public T accept(ParseTreeVisitor visitor) { public final PointerTypeContext pointerType() throws RecognitionException { PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); - enterRule(_localctx, 292, RULE_pointerType); + enterRule(_localctx, 306, RULE_pointerType); try { enterOuterAlt(_localctx, 1); { - setState(1565); + setState(1640); match(STAR); - setState(1566); + setState(1641); type_(); } } @@ -10513,15 +11012,15 @@ public T accept(ParseTreeVisitor visitor) { public final SliceTypeContext sliceType() throws RecognitionException { SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); - enterRule(_localctx, 294, RULE_sliceType); + enterRule(_localctx, 308, RULE_sliceType); try { enterOuterAlt(_localctx, 1); { - setState(1568); + setState(1643); match(L_BRACKET); - setState(1569); + setState(1644); match(R_BRACKET); - setState(1570); + setState(1645); elementType(); } } @@ -10559,19 +11058,19 @@ public T accept(ParseTreeVisitor visitor) { public final MapTypeContext mapType() throws RecognitionException { MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 296, RULE_mapType); + enterRule(_localctx, 310, RULE_mapType); try { enterOuterAlt(_localctx, 1); { - setState(1572); + setState(1647); match(MAP); - setState(1573); + setState(1648); match(L_BRACKET); - setState(1574); + setState(1649); type_(); - setState(1575); + setState(1650); match(R_BRACKET); - setState(1576); + setState(1651); elementType(); } } @@ -10605,37 +11104,37 @@ public T accept(ParseTreeVisitor visitor) { public final ChannelTypeContext channelType() throws RecognitionException { ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState()); - enterRule(_localctx, 298, RULE_channelType); + enterRule(_localctx, 312, RULE_channelType); try { enterOuterAlt(_localctx, 1); { - setState(1583); + setState(1658); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { case 1: { - setState(1578); + setState(1653); match(CHAN); } break; case 2: { - setState(1579); + setState(1654); match(CHAN); - setState(1580); + setState(1655); match(RECEIVE); } break; case 3: { - setState(1581); + setState(1656); match(RECEIVE); - setState(1582); + setState(1657); match(CHAN); } break; } - setState(1585); + setState(1660); elementType(); } } @@ -10668,13 +11167,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTypeContext functionType() throws RecognitionException { FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState()); - enterRule(_localctx, 300, RULE_functionType); + enterRule(_localctx, 314, RULE_functionType); try { enterOuterAlt(_localctx, 1); { - setState(1587); + setState(1662); match(FUNC); - setState(1588); + setState(1663); signature(); } } @@ -10709,24 +11208,24 @@ public T accept(ParseTreeVisitor visitor) { public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); - enterRule(_localctx, 302, RULE_signature); + enterRule(_localctx, 316, RULE_signature); try { - setState(1594); + setState(1669); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,154,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1590); + setState(1665); parameters(); - setState(1591); + setState(1666); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1593); + setState(1668); parameters(); } break; @@ -10763,22 +11262,22 @@ public T accept(ParseTreeVisitor visitor) { public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); - enterRule(_localctx, 304, RULE_result); + enterRule(_localctx, 318, RULE_result); try { - setState(1598); + setState(1673); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1596); + setState(1671); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1597); + setState(1672); type_(); } break; @@ -10821,45 +11320,45 @@ public T accept(ParseTreeVisitor visitor) { public final ParametersContext parameters() throws RecognitionException { ParametersContext _localctx = new ParametersContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_parameters); + enterRule(_localctx, 320, RULE_parameters); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1600); + setState(1675); match(L_PAREN); - setState(1612); + setState(1687); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (FUNC - 75)) | (1L << (INTERFACE - 75)) | (1L << (MAP - 75)) | (1L << (STRUCT - 75)) | (1L << (CHAN - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (L_PAREN - 75)) | (1L << (L_BRACKET - 75)) | (1L << (ELLIPSIS - 75)) | (1L << (STAR - 75)) | (1L << (RECEIVE - 75)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (ELLIPSIS - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) { { - setState(1601); + setState(1676); parameterDecl(); - setState(1606); + setState(1681); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,156,_ctx); + _alt = getInterpreter().adaptivePredict(_input,164,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1602); + setState(1677); match(COMMA); - setState(1603); + setState(1678); parameterDecl(); } } } - setState(1608); + setState(1683); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,156,_ctx); + _alt = getInterpreter().adaptivePredict(_input,164,_ctx); } - setState(1610); + setState(1685); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1609); + setState(1684); match(COMMA); } } @@ -10867,7 +11366,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1614); + setState(1689); match(R_PAREN); } } @@ -10905,28 +11404,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConversionContext conversion() throws RecognitionException { ConversionContext _localctx = new ConversionContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_conversion); + enterRule(_localctx, 322, RULE_conversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1616); + setState(1691); nonNamedType(); - setState(1617); + setState(1692); match(L_PAREN); - setState(1618); + setState(1693); expression(0); - setState(1620); + setState(1695); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1619); + setState(1694); match(COMMA); } } - setState(1622); + setState(1697); match(R_PAREN); } } @@ -10963,9 +11462,9 @@ public T accept(ParseTreeVisitor visitor) { public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_nonNamedType); + enterRule(_localctx, 324, RULE_nonNamedType); try { - setState(1629); + setState(1704); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -10979,18 +11478,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1624); + setState(1699); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1625); + setState(1700); match(L_PAREN); - setState(1626); + setState(1701); nonNamedType(); - setState(1627); + setState(1702); match(R_PAREN); } break; @@ -11034,33 +11533,33 @@ public T accept(ParseTreeVisitor visitor) { public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_operand); + enterRule(_localctx, 326, RULE_operand); try { - setState(1637); + setState(1712); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1631); + setState(1706); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1632); + setState(1707); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1633); + setState(1708); match(L_PAREN); - setState(1634); + setState(1709); expression(0); - setState(1635); + setState(1710); match(R_PAREN); } break; @@ -11100,9 +11599,9 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_literal); + enterRule(_localctx, 328, RULE_literal); try { - setState(1642); + setState(1717); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11119,7 +11618,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1639); + setState(1714); basicLit(); } break; @@ -11137,7 +11636,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1640); + setState(1715); compositeLit(); } break; @@ -11150,7 +11649,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1641); + setState(1716); functionLit(); } break; @@ -11189,14 +11688,14 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerContext integer() throws RecognitionException { IntegerContext _localctx = new IntegerContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_integer); + enterRule(_localctx, 330, RULE_integer); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1644); + setState(1719); _la = _input.LA(1); - if ( !(((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & ((1L << (DECIMAL_LIT - 136)) | (1L << (BINARY_LIT - 136)) | (1L << (OCTAL_LIT - 136)) | (1L << (HEX_LIT - 136)) | (1L << (IMAGINARY_LIT - 136)) | (1L << (RUNE_LIT - 136)))) != 0)) ) { + if ( !(((((_la - 137)) & ~0x3f) == 0 && ((1L << (_la - 137)) & ((1L << (DECIMAL_LIT - 137)) | (1L << (BINARY_LIT - 137)) | (1L << (OCTAL_LIT - 137)) | (1L << (HEX_LIT - 137)) | (1L << (IMAGINARY_LIT - 137)) | (1L << (RUNE_LIT - 137)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -11232,11 +11731,11 @@ public T accept(ParseTreeVisitor visitor) { public final OperandNameContext operandName() throws RecognitionException { OperandNameContext _localctx = new OperandNameContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_operandName); + enterRule(_localctx, 332, RULE_operandName); try { enterOuterAlt(_localctx, 1); { - setState(1646); + setState(1721); match(IDENTIFIER); } } @@ -11270,15 +11769,15 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedIdentContext qualifiedIdent() throws RecognitionException { QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_qualifiedIdent); + enterRule(_localctx, 334, RULE_qualifiedIdent); try { enterOuterAlt(_localctx, 1); { - setState(1648); + setState(1723); match(IDENTIFIER); - setState(1649); + setState(1724); match(DOT); - setState(1650); + setState(1725); match(IDENTIFIER); } } @@ -11313,13 +11812,13 @@ public T accept(ParseTreeVisitor visitor) { public final CompositeLitContext compositeLit() throws RecognitionException { CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_compositeLit); + enterRule(_localctx, 336, RULE_compositeLit); try { enterOuterAlt(_localctx, 1); { - setState(1652); + setState(1727); literalType(); - setState(1653); + setState(1728); literalValue(); } } @@ -11354,26 +11853,26 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralValueContext literalValue() throws RecognitionException { LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_literalValue); + enterRule(_localctx, 338, RULE_literalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1655); + setState(1730); match(L_CURLY); - setState(1660); + setState(1735); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1656); + setState(1731); elementList(); - setState(1658); + setState(1733); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1657); + setState(1732); match(COMMA); } } @@ -11381,7 +11880,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1662); + setState(1737); match(R_CURLY); } } @@ -11420,30 +11919,30 @@ public T accept(ParseTreeVisitor visitor) { public final ElementListContext elementList() throws RecognitionException { ElementListContext _localctx = new ElementListContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_elementList); + enterRule(_localctx, 340, RULE_elementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1664); + setState(1739); keyedElement(); - setState(1669); + setState(1744); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,165,_ctx); + _alt = getInterpreter().adaptivePredict(_input,173,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1665); + setState(1740); match(COMMA); - setState(1666); + setState(1741); keyedElement(); } } } - setState(1671); + setState(1746); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,165,_ctx); + _alt = getInterpreter().adaptivePredict(_input,173,_ctx); } } } @@ -11479,23 +11978,23 @@ public T accept(ParseTreeVisitor visitor) { public final KeyedElementContext keyedElement() throws RecognitionException { KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_keyedElement); + enterRule(_localctx, 342, RULE_keyedElement); try { enterOuterAlt(_localctx, 1); { - setState(1675); + setState(1750); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { case 1: { - setState(1672); + setState(1747); key(); - setState(1673); + setState(1748); match(COLON); } break; } - setState(1677); + setState(1752); element(); } } @@ -11530,9 +12029,9 @@ public T accept(ParseTreeVisitor visitor) { public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_key); + enterRule(_localctx, 344, RULE_key); try { - setState(1681); + setState(1756); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11563,6 +12062,7 @@ public final KeyContext key() throws RecognitionException { case GET: case DOM: case ADT: + case MATCH: case NONE: case PRED: case TYPE_OF: @@ -11598,14 +12098,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1679); + setState(1754); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1680); + setState(1755); literalValue(); } break; @@ -11644,9 +12144,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_element); + enterRule(_localctx, 346, RULE_element); try { - setState(1685); + setState(1760); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11677,6 +12177,7 @@ public final ElementContext element() throws RecognitionException { case GET: case DOM: case ADT: + case MATCH: case NONE: case PRED: case TYPE_OF: @@ -11712,14 +12213,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1683); + setState(1758); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1684); + setState(1759); literalValue(); } break; @@ -11767,32 +12268,32 @@ public T accept(ParseTreeVisitor visitor) { public final StructTypeContext structType() throws RecognitionException { StructTypeContext _localctx = new StructTypeContext(_ctx, getState()); - enterRule(_localctx, 334, RULE_structType); + enterRule(_localctx, 348, RULE_structType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1687); + setState(1762); match(STRUCT); - setState(1688); + setState(1763); match(L_CURLY); - setState(1694); + setState(1769); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1689); + setState(1764); fieldDecl(); - setState(1690); + setState(1765); eos(); } } - setState(1696); + setState(1771); _errHandler.sync(this); _la = _input.LA(1); } - setState(1697); + setState(1772); match(R_CURLY); } } @@ -11834,34 +12335,34 @@ public T accept(ParseTreeVisitor visitor) { public final FieldDeclContext fieldDecl() throws RecognitionException { FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_fieldDecl); + enterRule(_localctx, 350, RULE_fieldDecl); try { enterOuterAlt(_localctx, 1); { - setState(1703); + setState(1778); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { case 1: { - setState(1699); + setState(1774); identifierList(); - setState(1700); + setState(1775); type_(); } break; case 2: { - setState(1702); + setState(1777); embeddedField(); } break; } - setState(1706); + setState(1781); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { case 1: { - setState(1705); + setState(1780); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -11895,12 +12396,12 @@ public T accept(ParseTreeVisitor visitor) { public final String_Context string_() throws RecognitionException { String_Context _localctx = new String_Context(_ctx, getState()); - enterRule(_localctx, 338, RULE_string_); + enterRule(_localctx, 352, RULE_string_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1708); + setState(1783); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -11941,22 +12442,22 @@ public T accept(ParseTreeVisitor visitor) { public final EmbeddedFieldContext embeddedField() throws RecognitionException { EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_embeddedField); + enterRule(_localctx, 354, RULE_embeddedField); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1711); + setState(1786); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1710); + setState(1785); match(STAR); } } - setState(1713); + setState(1788); typeName(); } } @@ -11990,15 +12491,15 @@ public T accept(ParseTreeVisitor visitor) { public final IndexContext index() throws RecognitionException { IndexContext _localctx = new IndexContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_index); + enterRule(_localctx, 356, RULE_index); try { enterOuterAlt(_localctx, 1); { - setState(1715); + setState(1790); match(L_BRACKET); - setState(1716); + setState(1791); expression(0); - setState(1717); + setState(1792); match(R_BRACKET); } } @@ -12033,17 +12534,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeAssertionContext typeAssertion() throws RecognitionException { TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_typeAssertion); + enterRule(_localctx, 358, RULE_typeAssertion); try { enterOuterAlt(_localctx, 1); { - setState(1719); + setState(1794); match(DOT); - setState(1720); + setState(1795); match(L_PAREN); - setState(1721); + setState(1796); type_(); - setState(1722); + setState(1797); match(R_PAREN); } } @@ -12085,39 +12586,39 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentsContext arguments() throws RecognitionException { ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_arguments); + enterRule(_localctx, 360, RULE_arguments); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1724); + setState(1799); match(L_PAREN); - setState(1739); + setState(1814); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (EXCLAMATION - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (CARET - 129)) | (1L << (STAR - 129)) | (1L << (AMPERSAND - 129)) | (1L << (RECEIVE - 129)) | (1L << (DECIMAL_LIT - 129)) | (1L << (BINARY_LIT - 129)) | (1L << (OCTAL_LIT - 129)) | (1L << (HEX_LIT - 129)) | (1L << (IMAGINARY_LIT - 129)) | (1L << (RUNE_LIT - 129)) | (1L << (RAW_STRING_LIT - 129)) | (1L << (INTERPRETED_STRING_LIT - 129)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1731); + setState(1806); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,182,_ctx) ) { case 1: { - setState(1725); + setState(1800); expressionList(); } break; case 2: { - setState(1726); + setState(1801); nonNamedType(); - setState(1729); + setState(1804); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,181,_ctx) ) { case 1: { - setState(1727); + setState(1802); match(COMMA); - setState(1728); + setState(1803); expressionList(); } break; @@ -12125,22 +12626,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1734); + setState(1809); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1733); + setState(1808); match(ELLIPSIS); } } - setState(1737); + setState(1812); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1736); + setState(1811); match(COMMA); } } @@ -12148,7 +12649,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1741); + setState(1816); match(R_PAREN); } } @@ -12182,15 +12683,15 @@ public T accept(ParseTreeVisitor visitor) { public final MethodExprContext methodExpr() throws RecognitionException { MethodExprContext _localctx = new MethodExprContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_methodExpr); + enterRule(_localctx, 362, RULE_methodExpr); try { enterOuterAlt(_localctx, 1); { - setState(1743); + setState(1818); nonNamedType(); - setState(1744); + setState(1819); match(DOT); - setState(1745); + setState(1820); match(IDENTIFIER); } } @@ -12222,11 +12723,11 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverTypeContext receiverType() throws RecognitionException { ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState()); - enterRule(_localctx, 350, RULE_receiverType); + enterRule(_localctx, 364, RULE_receiverType); try { enterOuterAlt(_localctx, 1); { - setState(1747); + setState(1822); type_(); } } @@ -12258,36 +12759,36 @@ public T accept(ParseTreeVisitor visitor) { public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); - enterRule(_localctx, 352, RULE_eos); + enterRule(_localctx, 366, RULE_eos); try { - setState(1753); + setState(1828); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1749); + setState(1824); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1750); + setState(1825); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1751); + setState(1826); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1752); + setState(1827); if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()"); } break; @@ -12306,11 +12807,11 @@ public final EosContext eos() throws RecognitionException { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 74: + case 81: return expression_sempred((ExpressionContext)_localctx, predIndex); - case 82: + case 89: return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex); - case 176: + case 183: return eos_sempred((EosContext)_localctx, predIndex); } return true; @@ -12370,7 +12871,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a0\u06de\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a1\u0729\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -12395,682 +12896,714 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8\4\u00a9"+ "\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad"+ "\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1\4\u00b2"+ - "\t\u00b2\3\2\3\2\3\2\3\3\3\3\3\3\3\4\3\4\3\4\3\5\3\5\3\5\7\5\u0171\n\5"+ - "\f\5\16\5\u0174\13\5\3\6\3\6\5\6\u0178\n\6\3\7\3\7\3\7\7\7\u017d\n\7\f"+ - "\7\16\7\u0180\13\7\3\7\3\7\3\7\3\7\3\7\7\7\u0187\n\7\f\7\16\7\u018a\13"+ - "\7\3\7\3\7\3\7\5\7\u018f\n\7\3\7\3\7\7\7\u0193\n\7\f\7\16\7\u0196\13\7"+ - "\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3\t\3\n\3\n\3\n\7\n\u01a3\n\n\f\n\16\n\u01a6"+ - "\13\n\3\n\5\n\u01a9\n\n\3\n\3\n\3\13\3\13\3\13\7\13\u01b0\n\13\f\13\16"+ - "\13\u01b3\13\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\7\13\u01bc\n\13\f\13"+ - "\16\13\u01bf\13\13\3\13\5\13\u01c2\n\13\3\f\3\f\3\f\3\f\5\f\u01c8\n\f"+ - "\3\r\3\r\3\r\3\r\3\r\3\r\5\r\u01d0\n\r\3\16\3\16\3\17\3\17\3\17\3\20\3"+ - "\20\3\20\5\20\u01da\n\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ - "\3\21\3\21\3\21\3\21\3\21\5\21\u01ea\n\21\3\22\3\22\3\23\3\23\3\23\3\23"+ - "\3\23\3\24\3\24\3\24\7\24\u01f6\n\24\f\24\16\24\u01f9\13\24\3\24\5\24"+ - "\u01fc\n\24\3\25\3\25\3\25\7\25\u0201\n\25\f\25\16\25\u0204\13\25\3\25"+ - "\3\25\3\26\7\26\u0209\n\26\f\26\16\26\u020c\13\26\3\27\3\27\3\27\3\27"+ - "\7\27\u0212\n\27\f\27\16\27\u0215\13\27\3\27\3\27\3\30\3\30\3\31\3\31"+ - "\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34"+ - "\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\5\35\u0234\n\35\3\35\3\35"+ - "\3\35\3\35\3\36\3\36\5\36\u023c\n\36\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3"+ - "!\3!\3!\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\5#\u0254\n#\3#\3#\3$\3$\3$"+ - "\3$\3$\3$\3$\3%\3%\3%\3%\7%\u0263\n%\f%\16%\u0266\13%\3%\3%\3&\3&\3&\3"+ - "&\3\'\3\'\3\'\3\'\5\'\u0272\n\'\3(\3(\3(\3(\3(\7(\u0279\n(\f(\16(\u027c"+ - "\13(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u0289\n)\3*\3*\3*\3*\3*\7*\u0290"+ - "\n*\f*\16*\u0293\13*\3*\3*\3+\3+\3+\3+\3+\7+\u029c\n+\f+\16+\u029f\13"+ - "+\3+\3+\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\5-\u02b3\n-\3"+ - ".\3.\3.\3.\3.\5.\u02ba\n.\3.\7.\u02bd\n.\f.\16.\u02c0\13.\3.\3.\5.\u02c4"+ - "\n.\3/\3/\3/\3/\3/\3/\3/\3/\5/\u02ce\n/\3\60\5\60\u02d1\n\60\3\60\3\60"+ - "\5\60\u02d5\n\60\3\61\3\61\5\61\u02d9\n\61\3\62\3\62\3\62\3\62\3\62\5"+ - "\62\u02e0\n\62\3\62\5\62\u02e3\n\62\3\62\3\62\3\63\3\63\5\63\u02e9\n\63"+ - "\3\63\3\63\3\63\5\63\u02ee\n\63\5\63\u02f0\n\63\3\63\5\63\u02f3\n\63\3"+ - "\64\3\64\3\64\7\64\u02f8\n\64\f\64\16\64\u02fb\13\64\3\65\3\65\5\65\u02ff"+ - "\n\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67"+ - "\3\67\3\67\7\67\u0310\n\67\f\67\16\67\u0313\13\67\3\67\3\67\3\67\7\67"+ - "\u0318\n\67\f\67\16\67\u031b\13\67\3\67\5\67\u031e\n\67\38\58\u0321\n"+ - "8\38\38\38\38\58\u0327\n8\39\39\59\u032b\n9\39\59\u032e\n9\39\39\39\3"+ - ":\3:\3:\3:\3:\5:\u0338\n:\3;\3;\3;\3;\3;\5;\u033f\n;\3<\3<\3<\3<\3<\5"+ - "<\u0346\n<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\5>\u0352\n>\3?\3?\3?\3?\5?\u0358"+ - "\n?\3@\3@\3@\3@\3@\5@\u035f\n@\3A\3A\3A\5A\u0364\nA\3B\3B\3B\3B\5B\u036a"+ - "\nB\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\5D\u0376\nD\3E\3E\3E\3E\5E\u037c\nE"+ - "\3E\3E\5E\u0380\nE\3F\3F\3F\3F\3G\3G\5G\u0388\nG\3G\3G\5G\u038c\nG\3G"+ - "\3G\3H\3H\5H\u0392\nH\3I\5I\u0395\nI\3I\3I\3J\3J\5J\u039b\nJ\3J\3J\3K"+ - "\5K\u03a0\nK\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\5L"+ - "\u03b4\nL\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L"+ - "\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\7L\u03d7\nL\fL\16L\u03da\13L\3"+ - "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\5M\u03f0\n"+ - "M\3N\3N\3N\3O\3O\3O\5O\u03f8\nO\3P\3P\3P\3Q\3Q\3Q\3Q\7Q\u0401\nQ\fQ\16"+ - "Q\u0404\13Q\3Q\3Q\3Q\3Q\5Q\u040a\nQ\3R\3R\3R\3R\3R\5R\u0411\nR\3S\3S\3"+ - "S\3S\3S\3S\3S\3S\5S\u041b\nS\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\5T\u0429"+ - "\nT\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\7T\u043f"+ - "\nT\fT\16T\u0442\13T\3U\3U\3U\3V\3V\5V\u0449\nV\3V\3V\5V\u044d\nV\3W\3"+ - "W\5W\u0451\nW\3W\5W\u0454\nW\3W\3W\3X\3X\3X\3X\3X\5X\u045d\nX\3X\3X\7"+ - "X\u0461\nX\fX\16X\u0464\13X\3X\3X\3Y\3Y\3Y\3Y\3Z\5Z\u046d\nZ\3Z\3Z\3Z"+ - "\3Z\3Z\3Z\5Z\u0475\nZ\3Z\3Z\3Z\3Z\5Z\u047b\nZ\3[\3[\3[\3[\3[\3[\3[\5["+ - "\u0484\n[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\5\\\u048f\n\\\3]\3]\3]\3"+ - "^\3^\3^\3^\7^\u0498\n^\f^\16^\u049b\13^\3^\5^\u049e\n^\5^\u04a0\n^\3^"+ - "\3^\3_\3_\3_\3_\3_\3_\3_\5_\u04ab\n_\3`\3`\3`\3`\3`\3a\3a\5a\u04b4\na"+ - "\3a\3a\5a\u04b8\na\3a\5a\u04bb\na\3a\3a\3a\3a\3a\5a\u04c2\na\3a\3a\3b"+ - "\3b\3c\3c\3d\3d\3e\5e\u04cd\ne\3e\3e\3f\3f\3f\3f\3f\3f\5f\u04d7\nf\3f"+ - "\3f\3f\3f\5f\u04dd\nf\5f\u04df\nf\3g\3g\3g\3h\3h\3i\3i\3i\5i\u04e9\ni"+ - "\3j\3j\3j\3j\3j\3j\7j\u04f1\nj\fj\16j\u04f4\13j\3j\5j\u04f7\nj\3k\3k\5"+ - "k\u04fb\nk\3k\3k\5k\u04ff\nk\3l\3l\3l\7l\u0504\nl\fl\16l\u0507\13l\3m"+ - "\3m\3m\7m\u050c\nm\fm\16m\u050f\13m\3n\3n\3n\3n\3n\3n\7n\u0517\nn\fn\16"+ - "n\u051a\13n\3n\5n\u051d\nn\3o\3o\5o\u0521\no\3o\3o\3p\3p\3p\3p\3p\3p\7"+ - "p\u052b\np\fp\16p\u052e\13p\3p\5p\u0531\np\3q\3q\5q\u0535\nq\3q\3q\3r"+ - "\5r\u053a\nr\3r\3r\3r\6r\u053f\nr\rr\16r\u0540\3s\3s\3s\3s\3s\5s\u0548"+ - "\ns\3t\3t\3u\3u\3u\3u\3v\3v\3v\3w\3w\3w\3w\3x\3x\3y\3y\3y\5y\u055c\ny"+ - "\3z\3z\5z\u0560\nz\3{\3{\5{\u0564\n{\3|\3|\5|\u0568\n|\3}\3}\3}\3~\3~"+ - "\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\3\177\5\177\u0578\n\177"+ - "\3\177\3\177\3\177\3\177\5\177\u057e\n\177\5\177\u0580\n\177\3\u0080\3"+ - "\u0080\5\u0080\u0584\n\u0080\3\u0081\3\u0081\5\u0081\u0588\n\u0081\3\u0081"+ - "\5\u0081\u058b\n\u0081\3\u0081\3\u0081\5\u0081\u058f\n\u0081\5\u0081\u0591"+ - "\n\u0081\3\u0081\3\u0081\7\u0081\u0595\n\u0081\f\u0081\16\u0081\u0598"+ - "\13\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082\5\u0082\u059f\n\u0082"+ - "\3\u0083\3\u0083\3\u0083\5\u0083\u05a4\n\u0083\3\u0084\3\u0084\3\u0084"+ - "\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\5\u0084\u05af\n\u0084"+ - "\3\u0084\3\u0084\7\u0084\u05b3\n\u0084\f\u0084\16\u0084\u05b6\13\u0084"+ - "\3\u0084\3\u0084\3\u0085\3\u0085\5\u0085\u05bc\n\u0085\3\u0085\3\u0085"+ - "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\5\u0086\u05c7"+ - "\n\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u05cc\n\u0087\3\u0088\3\u0088"+ - "\5\u0088\u05d0\n\u0088\3\u0088\3\u0088\3\u0088\5\u0088\u05d5\n\u0088\7"+ - "\u0088\u05d7\n\u0088\f\u0088\16\u0088\u05da\13\u0088\3\u0089\3\u0089\3"+ - "\u0089\7\u0089\u05df\n\u0089\f\u0089\16\u0089\u05e2\13\u0089\3\u0089\3"+ - "\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u05e9\n\u008a\3\u008b\3\u008b\3"+ - "\u008b\5\u008b\u05ee\n\u008b\3\u008b\5\u008b\u05f1\n\u008b\3\u008c\3\u008c"+ - "\3\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u05f9\n\u008c\3\u008c\3\u008c"+ - "\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u0601\n\u008d\3\u008d\3\u008d"+ - "\3\u008e\5\u008e\u0606\n\u008e\3\u008e\3\u008e\5\u008e\u060a\n\u008e\3"+ - "\u008e\3\u008e\5\u008e\u060e\n\u008e\3\u008f\3\u008f\3\u008f\3\u0090\3"+ - "\u0090\5\u0090\u0615\n\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3"+ - "\u0092\3\u0092\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095"+ - "\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097"+ - "\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u0632\n\u0097\3\u0097\3\u0097"+ - "\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\5\u0099\u063d"+ - "\n\u0099\3\u009a\3\u009a\5\u009a\u0641\n\u009a\3\u009b\3\u009b\3\u009b"+ - "\3\u009b\7\u009b\u0647\n\u009b\f\u009b\16\u009b\u064a\13\u009b\3\u009b"+ - "\5\u009b\u064d\n\u009b\5\u009b\u064f\n\u009b\3\u009b\3\u009b\3\u009c\3"+ - "\u009c\3\u009c\3\u009c\5\u009c\u0657\n\u009c\3\u009c\3\u009c\3\u009d\3"+ - "\u009d\3\u009d\3\u009d\3\u009d\5\u009d\u0660\n\u009d\3\u009e\3\u009e\3"+ - "\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u0668\n\u009e\3\u009f\3\u009f\3"+ - "\u009f\5\u009f\u066d\n\u009f\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a2\3"+ - "\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4"+ - "\5\u00a4\u067d\n\u00a4\5\u00a4\u067f\n\u00a4\3\u00a4\3\u00a4\3\u00a5\3"+ - "\u00a5\3\u00a5\7\u00a5\u0686\n\u00a5\f\u00a5\16\u00a5\u0689\13\u00a5\3"+ - "\u00a6\3\u00a6\3\u00a6\5\u00a6\u068e\n\u00a6\3\u00a6\3\u00a6\3\u00a7\3"+ - "\u00a7\5\u00a7\u0694\n\u00a7\3\u00a8\3\u00a8\5\u00a8\u0698\n\u00a8\3\u00a9"+ - "\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9\u069f\n\u00a9\f\u00a9\16\u00a9"+ - "\u06a2\13\u00a9\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa"+ - "\u06aa\n\u00aa\3\u00aa\5\u00aa\u06ad\n\u00aa\3\u00ab\3\u00ab\3\u00ac\5"+ - "\u00ac\u06b2\n\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3"+ - "\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af\3\u00af"+ - "\3\u00af\5\u00af\u06c4\n\u00af\5\u00af\u06c6\n\u00af\3\u00af\5\u00af\u06c9"+ - "\n\u00af\3\u00af\5\u00af\u06cc\n\u00af\5\u00af\u06ce\n\u00af\3\u00af\3"+ - "\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b2\3\u00b2"+ - "\3\u00b2\3\u00b2\5\u00b2\u06dc\n\u00b2\3\u00b2\3\u02be\4\u0096\u00a6\u00b3"+ - "\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFH"+ - "JLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c"+ - "\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4"+ - "\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc"+ - "\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4"+ - "\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec"+ - "\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104"+ - "\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c"+ - "\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134"+ - "\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c"+ - "\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\2\25"+ - "\4\2eepp\3\2\31\32\3\2\7\n\3\2AB\3\2)+\4\2)+--\3\2\u0083\u0089\3\2\26"+ - "\27\4\2~\u0082\u0087\u0088\6\2$$qq}}\u0084\u0086\3\2 \"\3\2\35\37\4\2"+ - "HIw|\6\2..\61\61\64\64]]\4\2}\u0082\u0084\u0088\3\2qr\4\2nn\u009f\u009f"+ - "\4\2\u008a\u008d\u008f\u0090\3\2\u0096\u0097\2\u073d\2\u0164\3\2\2\2\4"+ - "\u0167\3\2\2\2\6\u016a\3\2\2\2\b\u016d\3\2\2\2\n\u0175\3\2\2\2\f\u017e"+ - "\3\2\2\2\16\u0199\3\2\2\2\20\u019c\3\2\2\2\22\u01a4\3\2\2\2\24\u01b1\3"+ - "\2\2\2\26\u01c7\3\2\2\2\30\u01cf\3\2\2\2\32\u01d1\3\2\2\2\34\u01d3\3\2"+ - "\2\2\36\u01d6\3\2\2\2 \u01e9\3\2\2\2\"\u01eb\3\2\2\2$\u01ed\3\2\2\2&\u01f2"+ - "\3\2\2\2(\u01fd\3\2\2\2*\u020a\3\2\2\2,\u020d\3\2\2\2.\u0218\3\2\2\2\60"+ - "\u021a\3\2\2\2\62\u021f\3\2\2\2\64\u0224\3\2\2\2\66\u0229\3\2\2\28\u022e"+ - "\3\2\2\2:\u023b\3\2\2\2<\u023d\3\2\2\2>\u023f\3\2\2\2@\u0244\3\2\2\2B"+ - "\u0249\3\2\2\2D\u024e\3\2\2\2F\u0257\3\2\2\2H\u025e\3\2\2\2J\u0269\3\2"+ - "\2\2L\u0271\3\2\2\2N\u0273\3\2\2\2P\u0288\3\2\2\2R\u028a\3\2\2\2T\u0296"+ - "\3\2\2\2V\u02a2\3\2\2\2X\u02b2\3\2\2\2Z\u02be\3\2\2\2\\\u02cd\3\2\2\2"+ - "^\u02d0\3\2\2\2`\u02d8\3\2\2\2b\u02da\3\2\2\2d\u02e8\3\2\2\2f\u02f4\3"+ - "\2\2\2h\u02fe\3\2\2\2j\u0302\3\2\2\2l\u0308\3\2\2\2n\u0320\3\2\2\2p\u0328"+ - "\3\2\2\2r\u0337\3\2\2\2t\u0339\3\2\2\2v\u0340\3\2\2\2x\u0349\3\2\2\2z"+ - "\u034e\3\2\2\2|\u0353\3\2\2\2~\u0359\3\2\2\2\u0080\u0360\3\2\2\2\u0082"+ - "\u0365\3\2\2\2\u0084\u036b\3\2\2\2\u0086\u0370\3\2\2\2\u0088\u0377\3\2"+ - "\2\2\u008a\u0381\3\2\2\2\u008c\u0385\3\2\2\2\u008e\u0391\3\2\2\2\u0090"+ - "\u0394\3\2\2\2\u0092\u0398\3\2\2\2\u0094\u039f\3\2\2\2\u0096\u03b3\3\2"+ - "\2\2\u0098\u03ef\3\2\2\2\u009a\u03f1\3\2\2\2\u009c\u03f4\3\2\2\2\u009e"+ - "\u03f9\3\2\2\2\u00a0\u0402\3\2\2\2\u00a2\u0410\3\2\2\2\u00a4\u041a\3\2"+ - "\2\2\u00a6\u0428\3\2\2\2\u00a8\u0443\3\2\2\2\u00aa\u0446\3\2\2\2\u00ac"+ - "\u044e\3\2\2\2\u00ae\u0457\3\2\2\2\u00b0\u0467\3\2\2\2\u00b2\u047a\3\2"+ - "\2\2\u00b4\u0483\3\2\2\2\u00b6\u048e\3\2\2\2\u00b8\u0490\3\2\2\2\u00ba"+ - "\u0493\3\2\2\2\u00bc\u04aa\3\2\2\2\u00be\u04ac\3\2\2\2\u00c0\u04b1\3\2"+ - "\2\2\u00c2\u04c5\3\2\2\2\u00c4\u04c7\3\2\2\2\u00c6\u04c9\3\2\2\2\u00c8"+ - "\u04cc\3\2\2\2\u00ca\u04d6\3\2\2\2\u00cc\u04e0\3\2\2\2\u00ce\u04e3\3\2"+ - "\2\2\u00d0\u04e8\3\2\2\2\u00d2\u04ea\3\2\2\2\u00d4\u04f8\3\2\2\2\u00d6"+ - "\u0500\3\2\2\2\u00d8\u0508\3\2\2\2\u00da\u0510\3\2\2\2\u00dc\u051e\3\2"+ - "\2\2\u00de\u0524\3\2\2\2\u00e0\u0532\3\2\2\2\u00e2\u053e\3\2\2\2\u00e4"+ - "\u0547\3\2\2\2\u00e6\u0549\3\2\2\2\u00e8\u054b\3\2\2\2\u00ea\u054f\3\2"+ - "\2\2\u00ec\u0552\3\2\2\2\u00ee\u0556\3\2\2\2\u00f0\u0558\3\2\2\2\u00f2"+ - "\u055d\3\2\2\2\u00f4\u0561\3\2\2\2\u00f6\u0565\3\2\2\2\u00f8\u0569\3\2"+ - "\2\2\u00fa\u056c\3\2\2\2\u00fc\u056e\3\2\2\2\u00fe\u0583\3\2\2\2\u0100"+ - "\u0585\3\2\2\2\u0102\u059b\3\2\2\2\u0104\u05a3\3\2\2\2\u0106\u05a5\3\2"+ - "\2\2\u0108\u05bb\3\2\2\2\u010a\u05c3\3\2\2\2\u010c\u05cb\3\2\2\2\u010e"+ - "\u05cf\3\2\2\2\u0110\u05db\3\2\2\2\u0112\u05e5\3\2\2\2\u0114\u05f0\3\2"+ - "\2\2\u0116\u05f8\3\2\2\2\u0118\u05fc\3\2\2\2\u011a\u0605\3\2\2\2\u011c"+ - "\u060f\3\2\2\2\u011e\u0614\3\2\2\2\u0120\u0616\3\2\2\2\u0122\u061b\3\2"+ - "\2\2\u0124\u061d\3\2\2\2\u0126\u061f\3\2\2\2\u0128\u0622\3\2\2\2\u012a"+ - "\u0626\3\2\2\2\u012c\u0631\3\2\2\2\u012e\u0635\3\2\2\2\u0130\u063c\3\2"+ - "\2\2\u0132\u0640\3\2\2\2\u0134\u0642\3\2\2\2\u0136\u0652\3\2\2\2\u0138"+ - "\u065f\3\2\2\2\u013a\u0667\3\2\2\2\u013c\u066c\3\2\2\2\u013e\u066e\3\2"+ - "\2\2\u0140\u0670\3\2\2\2\u0142\u0672\3\2\2\2\u0144\u0676\3\2\2\2\u0146"+ - "\u0679\3\2\2\2\u0148\u0682\3\2\2\2\u014a\u068d\3\2\2\2\u014c\u0693\3\2"+ - "\2\2\u014e\u0697\3\2\2\2\u0150\u0699\3\2\2\2\u0152\u06a9\3\2\2\2\u0154"+ - "\u06ae\3\2\2\2\u0156\u06b1\3\2\2\2\u0158\u06b5\3\2\2\2\u015a\u06b9\3\2"+ - "\2\2\u015c\u06be\3\2\2\2\u015e\u06d1\3\2\2\2\u0160\u06d5\3\2\2\2\u0162"+ - "\u06db\3\2\2\2\u0164\u0165\5\u0096L\2\u0165\u0166\7\2\2\3\u0166\3\3\2"+ - "\2\2\u0167\u0168\5\u0098M\2\u0168\u0169\7\2\2\3\u0169\5\3\2\2\2\u016a"+ - "\u016b\5\u00b4[\2\u016b\u016c\7\2\2\3\u016c\7\3\2\2\2\u016d\u0172\5\n"+ - "\6\2\u016e\u016f\7m\2\2\u016f\u0171\5\n\6\2\u0170\u016e\3\2\2\2\u0171"+ - "\u0174\3\2\2\2\u0172\u0170\3\2\2\2\u0172\u0173\3\2\2\2\u0173\t\3\2\2\2"+ - "\u0174\u0172\3\2\2\2\u0175\u0177\7e\2\2\u0176\u0178\7<\2\2\u0177\u0176"+ - "\3\2\2\2\u0177\u0178\3\2\2\2\u0178\13\3\2\2\2\u0179\u017a\5\16\b\2\u017a"+ - "\u017b\5\u0162\u00b2\2\u017b\u017d\3\2\2\2\u017c\u0179\3\2\2\2\u017d\u0180"+ - "\3\2\2\2\u017e\u017c\3\2\2\2\u017e\u017f\3\2\2\2\u017f\u0181\3\2\2\2\u0180"+ - "\u017e\3\2\2\2\u0181\u0182\5\u00ccg\2\u0182\u0188\5\u0162\u00b2\2\u0183"+ - "\u0184\5\24\13\2\u0184\u0185\5\u0162\u00b2\2\u0185\u0187\3\2\2\2\u0186"+ - "\u0183\3\2\2\2\u0187\u018a\3\2\2\2\u0188\u0186\3\2\2\2\u0188\u0189\3\2"+ - "\2\2\u0189\u0194\3\2\2\2\u018a\u0188\3\2\2\2\u018b\u018f\5z>\2\u018c\u018f"+ - "\5\u00d0i\2\u018d\u018f\5\26\f\2\u018e\u018b\3\2\2\2\u018e\u018c\3\2\2"+ - "\2\u018e\u018d\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191\5\u0162\u00b2\2"+ - "\u0191\u0193\3\2\2\2\u0192\u018e\3\2\2\2\u0193\u0196\3\2\2\2\u0194\u0192"+ - "\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u0197\3\2\2\2\u0196\u0194\3\2\2\2\u0197"+ - "\u0198\7\2\2\3\u0198\r\3\2\2\2\u0199\u019a\7E\2\2\u019a\u019b\5\u0096"+ - "L\2\u019b\17\3\2\2\2\u019c\u019d\7F\2\2\u019d\u019e\5\u0096L\2\u019e\21"+ - "\3\2\2\2\u019f\u01a0\5\20\t\2\u01a0\u01a1\5\u0162\u00b2\2\u01a1\u01a3"+ - "\3\2\2\2\u01a2\u019f\3\2\2\2\u01a3\u01a6\3\2\2\2\u01a4\u01a2\3\2\2\2\u01a4"+ - "\u01a5\3\2\2\2\u01a5\u01a8\3\2\2\2\u01a6\u01a4\3\2\2\2\u01a7\u01a9\t\2"+ - "\2\2\u01a8\u01a7\3\2\2\2\u01a8\u01a9\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aa"+ - "\u01ab\5\u00ceh\2\u01ab\23\3\2\2\2\u01ac\u01ad\5\20\t\2\u01ad\u01ae\5"+ - "\u0162\u00b2\2\u01ae\u01b0\3\2\2\2\u01af\u01ac\3\2\2\2\u01b0\u01b3\3\2"+ - "\2\2\u01b1\u01af\3\2\2\2\u01b1\u01b2\3\2\2\2\u01b2\u01c1\3\2\2\2\u01b3"+ - "\u01b1\3\2\2\2\u01b4\u01b5\7a\2\2\u01b5\u01c2\5\22\n\2\u01b6\u01b7\7a"+ - "\2\2\u01b7\u01bd\7f\2\2\u01b8\u01b9\5\22\n\2\u01b9\u01ba\5\u0162\u00b2"+ - "\2\u01ba\u01bc\3\2\2\2\u01bb\u01b8\3\2\2\2\u01bc\u01bf\3\2\2\2\u01bd\u01bb"+ - "\3\2\2\2\u01bd\u01be\3\2\2\2\u01be\u01c0\3\2\2\2\u01bf\u01bd\3\2\2\2\u01c0"+ - "\u01c2\7g\2\2\u01c1\u01b4\3\2\2\2\u01c1\u01b6\3\2\2\2\u01c2\25\3\2\2\2"+ - "\u01c3\u01c8\5l\67\2\u01c4\u01c8\5\u0082B\2\u01c5\u01c8\5\u0086D\2\u01c6"+ - "\u01c8\5\u0080A\2\u01c7\u01c3\3\2\2\2\u01c7\u01c4\3\2\2\2\u01c7\u01c5"+ - "\3\2\2\2\u01c7\u01c6\3\2\2\2\u01c8\27\3\2\2\2\u01c9\u01ca\7\34\2\2\u01ca"+ - "\u01d0\5\u0098M\2\u01cb\u01cc\t\3\2\2\u01cc\u01d0\5.\30\2\u01cd\u01ce"+ - "\t\4\2\2\u01ce\u01d0\5\u0096L\2\u01cf\u01c9\3\2\2\2\u01cf\u01cb\3\2\2"+ - "\2\u01cf\u01cd\3\2\2\2\u01d0\31\3\2\2\2\u01d1\u01d2\5\34\17\2\u01d2\33"+ - "\3\2\2\2\u01d3\u01d4\5Z.\2\u01d4\u01d5\5\36\20\2\u01d5\35\3\2\2\2\u01d6"+ - "\u01d7\7D\2\2\u01d7\u01d9\7f\2\2\u01d8\u01da\5\u00e2r\2\u01d9\u01d8\3"+ - "\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01db\3\2\2\2\u01db\u01dc\7g\2\2\u01dc"+ - "\37\3\2\2\2\u01dd\u01ea\5F$\2\u01de\u01ea\5D#\2\u01df\u01ea\5B\"\2\u01e0"+ - "\u01ea\5$\23\2\u01e1\u01ea\5@!\2\u01e2\u01ea\58\35\2\u01e3\u01ea\5> \2"+ - "\u01e4\u01ea\5\66\34\2\u01e5\u01ea\5\62\32\2\u01e6\u01ea\5\60\31\2\u01e7"+ - "\u01ea\5\64\33\2\u01e8\u01ea\5\"\22\2\u01e9\u01dd\3\2\2\2\u01e9\u01de"+ - "\3\2\2\2\u01e9\u01df\3\2\2\2\u01e9\u01e0\3\2\2\2\u01e9\u01e1\3\2\2\2\u01e9"+ - "\u01e2\3\2\2\2\u01e9\u01e3\3\2\2\2\u01e9\u01e4\3\2\2\2\u01e9\u01e5\3\2"+ - "\2\2\u01e9\u01e6\3\2\2\2\u01e9\u01e7\3\2\2\2\u01e9\u01e8\3\2\2\2\u01ea"+ - "!\3\2\2\2\u01eb\u01ec\t\5\2\2\u01ec#\3\2\2\2\u01ed\u01ee\7^\2\2\u01ee"+ - "\u01ef\7j\2\2\u01ef\u01f0\5\u00b4[\2\u01f0\u01f1\7k\2\2\u01f1%\3\2\2\2"+ - "\u01f2\u01f7\5(\25\2\u01f3\u01f4\7m\2\2\u01f4\u01f6\5(\25\2\u01f5\u01f3"+ - "\3\2\2\2\u01f6\u01f9\3\2\2\2\u01f7\u01f5\3\2\2\2\u01f7\u01f8\3\2\2\2\u01f8"+ - "\u01fb\3\2\2\2\u01f9\u01f7\3\2\2\2\u01fa\u01fc\7m\2\2\u01fb\u01fa\3\2"+ - "\2\2\u01fb\u01fc\3\2\2\2\u01fc\'\3\2\2\2\u01fd\u0202\7e\2\2\u01fe\u01ff"+ - "\7m\2\2\u01ff\u0201\7e\2\2\u0200\u01fe\3\2\2\2\u0201\u0204\3\2\2\2\u0202"+ - "\u0200\3\2\2\2\u0202\u0203\3\2\2\2\u0203\u0205\3\2\2\2\u0204\u0202\3\2"+ - "\2\2\u0205\u0206\5\u0124\u0093\2\u0206)\3\2\2\2\u0207\u0209\5,\27\2\u0208"+ - "\u0207\3\2\2\2\u0209\u020c\3\2\2\2\u020a\u0208\3\2\2\2\u020a\u020b\3\2"+ - "\2\2\u020b+\3\2\2\2\u020c\u020a\3\2\2\2\u020d\u020e\7h\2\2\u020e\u0213"+ - "\5\u0096L\2\u020f\u0210\7m\2\2\u0210\u0212\5\u0096L\2\u0211\u020f\3\2"+ - "\2\2\u0212\u0215\3\2\2\2\u0213\u0211\3\2\2\2\u0213\u0214\3\2\2\2\u0214"+ - "\u0216\3\2\2\2\u0215\u0213\3\2\2\2\u0216\u0217\7i\2\2\u0217-\3\2\2\2\u0218"+ - "\u0219\5\u00a6T\2\u0219/\3\2\2\2\u021a\u021b\7\62\2\2\u021b\u021c\7f\2"+ - "\2\u021c\u021d\5\u0096L\2\u021d\u021e\7g\2\2\u021e\61\3\2\2\2\u021f\u0220"+ - "\7\67\2\2\u0220\u0221\7j\2\2\u0221\u0222\5\u00b4[\2\u0222\u0223\7k\2\2"+ - "\u0223\63\3\2\2\2\u0224\u0225\7\63\2\2\u0225\u0226\7f\2\2\u0226\u0227"+ - "\5\u0096L\2\u0227\u0228\7g\2\2\u0228\65\3\2\2\2\u0229\u022a\t\6\2\2\u022a"+ - "\u022b\7f\2\2\u022b\u022c\5\u0096L\2\u022c\u022d\7g\2\2\u022d\67\3\2\2"+ - "\2\u022e\u0233\7\23\2\2\u022f\u0230\7j\2\2\u0230\u0231\5:\36\2\u0231\u0232"+ - "\7k\2\2\u0232\u0234\3\2\2\2\u0233\u022f\3\2\2\2\u0233\u0234\3\2\2\2\u0234"+ - "\u0235\3\2\2\2\u0235\u0236\7f\2\2\u0236\u0237\5\u0096L\2\u0237\u0238\7"+ - "g\2\2\u02389\3\2\2\2\u0239\u023c\5<\37\2\u023a\u023c\7\25\2\2\u023b\u0239"+ - "\3\2\2\2\u023b\u023a\3\2\2\2\u023c;\3\2\2\2\u023d\u023e\7e\2\2\u023e="+ - "\3\2\2\2\u023f\u0240\7\24\2\2\u0240\u0241\7f\2\2\u0241\u0242\5\u0096L"+ - "\2\u0242\u0243\7g\2\2\u0243?\3\2\2\2\u0244\u0245\7:\2\2\u0245\u0246\7"+ - "f\2\2\u0246\u0247\5\u0096L\2\u0247\u0248\7g\2\2\u0248A\3\2\2\2\u0249\u024a"+ - "\79\2\2\u024a\u024b\7f\2\2\u024b\u024c\5\u0096L\2\u024c\u024d\7g\2\2\u024d"+ - "C\3\2\2\2\u024e\u024f\7\30\2\2\u024f\u0250\7f\2\2\u0250\u0253\5\u0096"+ - "L\2\u0251\u0252\7m\2\2\u0252\u0254\5\u0096L\2\u0253\u0251\3\2\2\2\u0253"+ - "\u0254\3\2\2\2\u0254\u0255\3\2\2\2\u0255\u0256\7g\2\2\u0256E\3\2\2\2\u0257"+ - "\u0258\t\6\2\2\u0258\u0259\7j\2\2\u0259\u025a\5\u0096L\2\u025a\u025b\7"+ - "=\2\2\u025b\u025c\5\u0096L\2\u025c\u025d\7k\2\2\u025dG\3\2\2\2\u025e\u025f"+ - "\7j\2\2\u025f\u0264\5J&\2\u0260\u0261\7m\2\2\u0261\u0263\5J&\2\u0262\u0260"+ - "\3\2\2\2\u0263\u0266\3\2\2\2\u0264\u0262\3\2\2\2\u0264\u0265\3\2\2\2\u0265"+ - "\u0267\3\2\2\2\u0266\u0264\3\2\2\2\u0267\u0268\7k\2\2\u0268I\3\2\2\2\u0269"+ - "\u026a\5\u0096L\2\u026a\u026b\7l\2\2\u026b\u026c\5\u0096L\2\u026cK\3\2"+ - "\2\2\u026d\u0272\5X-\2\u026e\u0272\5V,\2\u026f\u0272\5N(\2\u0270\u0272"+ - "\5R*\2\u0271\u026d\3\2\2\2\u0271\u026e\3\2\2\2\u0271\u026f\3\2\2\2\u0271"+ - "\u0270\3\2\2\2\u0272M\3\2\2\2\u0273\u0274\7\64\2\2\u0274\u027a\7h\2\2"+ - "\u0275\u0276\5P)\2\u0276\u0277\5\u0162\u00b2\2\u0277\u0279\3\2\2\2\u0278"+ - "\u0275\3\2\2\2\u0279\u027c\3\2\2\2\u027a\u0278\3\2\2\2\u027a\u027b\3\2"+ - "\2\2\u027b\u027d\3\2\2\2\u027c\u027a\3\2\2\2\u027d\u027e\7i\2\2\u027e"+ - "O\3\2\2\2\u027f\u0280\7M\2\2\u0280\u0281\7e\2\2\u0281\u0289\5\u0130\u0099"+ - "\2\u0282\u0283\7\65\2\2\u0283\u0284\7h\2\2\u0284\u0285\5\u0096L\2\u0285"+ - "\u0286\5\u0162\u00b2\2\u0286\u0287\7i\2\2\u0287\u0289\3\2\2\2\u0288\u027f"+ - "\3\2\2\2\u0288\u0282\3\2\2\2\u0289Q\3\2\2\2\u028a\u028b\7\66\2\2\u028b"+ - "\u0291\7h\2\2\u028c\u028d\5T+\2\u028d\u028e\5\u0162\u00b2\2\u028e\u0290"+ - "\3\2\2\2\u028f\u028c\3\2\2\2\u0290\u0293\3\2\2\2\u0291\u028f\3\2\2\2\u0291"+ - "\u0292\3\2\2\2\u0292\u0294\3\2\2\2\u0293\u0291\3\2\2\2\u0294\u0295\7i"+ - "\2\2\u0295S\3\2\2\2\u0296\u0297\7e\2\2\u0297\u029d\7h\2\2\u0298\u0299"+ - "\5\u0152\u00aa\2\u0299\u029a\5\u0162\u00b2\2\u029a\u029c\3\2\2\2\u029b"+ - "\u0298\3\2\2\2\u029c\u029f\3\2\2\2\u029d\u029b\3\2\2\2\u029d\u029e\3\2"+ - "\2\2\u029e\u02a0\3\2\2\2\u029f\u029d\3\2\2\2\u02a0\u02a1\7i\2\2\u02a1"+ - "U\3\2\2\2\u02a2\u02a3\7\34\2\2\u02a3\u02a4\7j\2\2\u02a4\u02a5\7k\2\2\u02a5"+ - "\u02a6\5\u0124\u0093\2\u02a6W\3\2\2\2\u02a7\u02a8\t\7\2\2\u02a8\u02a9"+ - "\7j\2\2\u02a9\u02aa\5\u00b4[\2\u02aa\u02ab\7k\2\2\u02ab\u02b3\3\2\2\2"+ - "\u02ac\u02ad\7,\2\2\u02ad\u02ae\7j\2\2\u02ae\u02af\5\u00b4[\2\u02af\u02b0"+ - "\7k\2\2\u02b0\u02b1\5\u00b4[\2\u02b1\u02b3\3\2\2\2\u02b2\u02a7\3\2\2\2"+ - "\u02b2\u02ac\3\2\2\2\u02b3Y\3\2\2\2\u02b4\u02ba\5\\/\2\u02b5\u02b6\7\20"+ - "\2\2\u02b6\u02ba\b.\1\2\u02b7\u02b8\7C\2\2\u02b8\u02ba\b.\1\2\u02b9\u02b4"+ - "\3\2\2\2\u02b9\u02b5\3\2\2\2\u02b9\u02b7\3\2\2\2\u02ba\u02bb\3\2\2\2\u02bb"+ - "\u02bd\5\u0162\u00b2\2\u02bc\u02b9\3\2\2\2\u02bd\u02c0\3\2\2\2\u02be\u02bf"+ - "\3\2\2\2\u02be\u02bc\3\2\2\2\u02bf\u02c3\3\2\2\2\u02c0\u02be\3\2\2\2\u02c1"+ - "\u02c2\7\20\2\2\u02c2\u02c4\b.\1\2\u02c3\u02c1\3\2\2\2\u02c3\u02c4\3\2"+ - "\2\2\u02c4[\3\2\2\2\u02c5\u02c6\7\13\2\2\u02c6\u02ce\5`\61\2\u02c7\u02c8"+ - "\7\f\2\2\u02c8\u02ce\5`\61\2\u02c9\u02ca\7\r\2\2\u02ca\u02ce\5`\61\2\u02cb"+ - "\u02cc\7\17\2\2\u02cc\u02ce\5^\60\2\u02cd\u02c5\3\2\2\2\u02cd\u02c7\3"+ - "\2\2\2\u02cd\u02c9\3\2\2\2\u02cd\u02cb\3\2\2\2\u02ce]\3\2\2\2\u02cf\u02d1"+ - "\5\u00d8m\2\u02d0\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d4\3\2\2"+ - "\2\u02d2\u02d3\7\\\2\2\u02d3\u02d5\5\u0096L\2\u02d4\u02d2\3\2\2\2\u02d4"+ - "\u02d5\3\2\2\2\u02d5_\3\2\2\2\u02d6\u02d9\3\2\2\2\u02d7\u02d9\5\u0096"+ - "L\2\u02d8\u02d6\3\2\2\2\u02d8\u02d7\3\2\2\2\u02d9a\3\2\2\2\u02da\u02df"+ - "\7h\2\2\u02db\u02dc\7;\2\2\u02dc\u02dd\5\u00d6l\2\u02dd\u02de\5\u0162"+ - "\u00b2\2\u02de\u02e0\3\2\2\2\u02df\u02db\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0"+ - "\u02e2\3\2\2\2\u02e1\u02e3\5\u00e2r\2\u02e2\u02e1\3\2\2\2\u02e2\u02e3"+ - "\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02e5\7i\2\2\u02e5c\3\2\2\2\u02e6\u02e9"+ - "\5\u0142\u00a2\2\u02e7\u02e9\7e\2\2\u02e8\u02e6\3\2\2\2\u02e8\u02e7\3"+ - "\2\2\2\u02e9\u02f2\3\2\2\2\u02ea\u02ef\7h\2\2\u02eb\u02ed\5f\64\2\u02ec"+ - "\u02ee\7m\2\2\u02ed\u02ec\3\2\2\2\u02ed\u02ee\3\2\2\2\u02ee\u02f0\3\2"+ - "\2\2\u02ef\u02eb\3\2\2\2\u02ef\u02f0\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1"+ - "\u02f3\7i\2\2\u02f2\u02ea\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3e\3\2\2\2\u02f4"+ - "\u02f9\5h\65\2\u02f5\u02f6\7m\2\2\u02f6\u02f8\5h\65\2\u02f7\u02f5\3\2"+ - "\2\2\u02f8\u02fb\3\2\2\2\u02f9\u02f7\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa"+ - "g\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fc\u02fd\7e\2\2\u02fd\u02ff\7o\2\2\u02fe"+ - "\u02fc\3\2\2\2\u02fe\u02ff\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u0301\5\u0096"+ - "L\2\u0301i\3\2\2\2\u0302\u0303\7G\2\2\u0303\u0304\5\u0096L\2\u0304\u0305"+ - "\7\21\2\2\u0305\u0306\5d\63\2\u0306\u0307\5\u00e0q\2\u0307k\3\2\2\2\u0308"+ - "\u0309\5\u00b4[\2\u0309\u030a\7\21\2\2\u030a\u031d\5\u00b4[\2\u030b\u0311"+ - "\7h\2\2\u030c\u030d\5t;\2\u030d\u030e\5\u0162\u00b2\2\u030e\u0310\3\2"+ - "\2\2\u030f\u030c\3\2\2\2\u0310\u0313\3\2\2\2\u0311\u030f\3\2\2\2\u0311"+ - "\u0312\3\2\2\2\u0312\u0319\3\2\2\2\u0313\u0311\3\2\2\2\u0314\u0315\5n"+ - "8\2\u0315\u0316\5\u0162\u00b2\2\u0316\u0318\3\2\2\2\u0317\u0314\3\2\2"+ - "\2\u0318\u031b\3\2\2\2\u0319\u0317\3\2\2\2\u0319\u031a\3\2\2\2\u031a\u031c"+ - "\3\2\2\2\u031b\u0319\3\2\2\2\u031c\u031e\7i\2\2\u031d\u030b\3\2\2\2\u031d"+ - "\u031e\3\2\2\2\u031em\3\2\2\2\u031f\u0321\7\20\2\2\u0320\u031f\3\2\2\2"+ - "\u0320\u0321\3\2\2\2\u0321\u0322\3\2\2\2\u0322\u0323\5p9\2\u0323\u0324"+ - "\7e\2\2\u0324\u0326\5\u0130\u0099\2\u0325\u0327\5\u00e0q\2\u0326\u0325"+ - "\3\2\2\2\u0326\u0327\3\2\2\2\u0327o\3\2\2\2\u0328\u032a\7f\2\2\u0329\u032b"+ - "\7e\2\2\u032a\u0329\3\2\2\2\u032a\u032b\3\2\2\2\u032b\u032d\3\2\2\2\u032c"+ - "\u032e\7\u0087\2\2\u032d\u032c\3\2\2\2\u032d\u032e\3\2\2\2\u032e\u032f"+ - "\3\2\2\2\u032f\u0330\5\u011e\u0090\2\u0330\u0331\7g\2\2\u0331q\3\2\2\2"+ - "\u0332\u0338\5\u00a6T\2\u0333\u0334\5\u00b4[\2\u0334\u0335\7p\2\2\u0335"+ - "\u0336\7e\2\2\u0336\u0338\3\2\2\2\u0337\u0332\3\2\2\2\u0337\u0333\3\2"+ - "\2\2\u0338s\3\2\2\2\u0339\u033a\78\2\2\u033a\u033b\7e\2\2\u033b\u033e"+ - "\7s\2\2\u033c\u033f\5r:\2\u033d\u033f\5\u0140\u00a1\2\u033e\u033c\3\2"+ - "\2\2\u033e\u033d\3\2\2\2\u033fu\3\2\2\2\u0340\u0341\7\60\2\2\u0341\u0342"+ - "\7f\2\2\u0342\u0345\5\u00b4[\2\u0343\u0344\7m\2\2\u0344\u0346\5\u00d8"+ - "m\2\u0345\u0343\3\2\2\2\u0345\u0346\3\2\2\2\u0346\u0347\3\2\2\2\u0347"+ - "\u0348\7g\2\2\u0348w\3\2\2\2\u0349\u034a\7/\2\2\u034a\u034b\7f\2\2\u034b"+ - "\u034c\5\u00b4[\2\u034c\u034d\7g\2\2\u034dy\3\2\2\2\u034e\u0351\5Z.\2"+ - "\u034f\u0352\5|?\2\u0350\u0352\5~@\2\u0351\u034f\3\2\2\2\u0351\u0350\3"+ - "\2\2\2\u0352{\3\2\2\2\u0353\u0354\7M\2\2\u0354\u0355\7e\2\2\u0355\u0357"+ - "\5\u0130\u0099\2\u0356\u0358\5b\62\2\u0357\u0356\3\2\2\2\u0357\u0358\3"+ - "\2\2\2\u0358}\3\2\2\2\u0359\u035a\7M\2\2\u035a\u035b\5\u008cG\2\u035b"+ - "\u035c\7e\2\2\u035c\u035e\5\u0130\u0099\2\u035d\u035f\5b\62\2\u035e\u035d"+ - "\3\2\2\2\u035e\u035f\3\2\2\2\u035f\177\3\2\2\2\u0360\u0363\7\34\2\2\u0361"+ - "\u0364\5z>\2\u0362\u0364\5\u00d0i\2\u0363\u0361\3\2\2\2\u0363\u0362\3"+ - "\2\2\2\u0364\u0081\3\2\2\2\u0365\u0366\78\2\2\u0366\u0367\7e\2\2\u0367"+ - "\u0369\5\u0134\u009b\2\u0368\u036a\5\u0084C\2\u0369\u0368\3\2\2\2\u0369"+ - "\u036a\3\2\2\2\u036a\u0083\3\2\2\2\u036b\u036c\7h\2\2\u036c\u036d\5\u0096"+ - "L\2\u036d\u036e\5\u0162\u00b2\2\u036e\u036f\7i\2\2\u036f\u0085\3\2\2\2"+ - "\u0370\u0371\78\2\2\u0371\u0372\5\u008cG\2\u0372\u0373\7e\2\2\u0373\u0375"+ - "\5\u0134\u009b\2\u0374\u0376\5\u0084C\2\u0375\u0374\3\2\2\2\u0375\u0376"+ - "\3\2\2\2\u0376\u0087\3\2\2\2\u0377\u037f\5\b\5\2\u0378\u037b\5\u00b4["+ - "\2\u0379\u037a\7l\2\2\u037a\u037c\5\u00d8m\2\u037b\u0379\3\2\2\2\u037b"+ - "\u037c\3\2\2\2\u037c\u0380\3\2\2\2\u037d\u037e\7l\2\2\u037e\u0380\5\u00d8"+ - "m\2\u037f\u0378\3\2\2\2\u037f\u037d\3\2\2\2\u0380\u0089\3\2\2\2\u0381"+ - "\u0382\5\b\5\2\u0382\u0383\7s\2\2\u0383\u0384\5\u00d8m\2\u0384\u008b\3"+ - "\2\2\2\u0385\u0387\7f\2\2\u0386\u0388\5\n\6\2\u0387\u0386\3\2\2\2\u0387"+ - "\u0388\3\2\2\2\u0388\u0389\3\2\2\2\u0389\u038b\5\u00b4[\2\u038a\u038c"+ - "\7m\2\2\u038b\u038a\3\2\2\2\u038b\u038c\3\2\2\2\u038c\u038d\3\2\2\2\u038d"+ - "\u038e\7g\2\2\u038e\u008d\3\2\2\2\u038f\u0392\5\u0090I\2\u0390\u0392\5"+ - "\u0092J\2\u0391\u038f\3\2\2\2\u0391\u0390\3\2\2\2\u0392\u008f\3\2\2\2"+ - "\u0393\u0395\5\u00d6l\2\u0394\u0393\3\2\2\2\u0394\u0395\3\2\2\2\u0395"+ - "\u0396\3\2\2\2\u0396\u0397\5\u0094K\2\u0397\u0091\3\2\2\2\u0398\u039a"+ - "\7\34\2\2\u0399\u039b\5\u00d6l\2\u039a\u0399\3\2\2\2\u039a\u039b\3\2\2"+ - "\2\u039b\u039c\3\2\2\2\u039c\u039d\5\u0094K\2\u039d\u0093\3\2\2\2\u039e"+ - "\u03a0\7t\2\2\u039f\u039e\3\2\2\2\u039f\u03a0\3\2\2\2\u03a0\u03a1\3\2"+ - "\2\2\u03a1\u03a2\5\u00b4[\2\u03a2\u0095\3\2\2\2\u03a3\u03a4\bL\1\2\u03a4"+ - "\u03a5\t\b\2\2\u03a5\u03b4\5\u0096L\20\u03a6\u03b4\5\u00a6T\2\u03a7\u03a8"+ - "\7\33\2\2\u03a8\u03a9\5.\30\2\u03a9\u03aa\7\35\2\2\u03aa\u03ab\5\u0096"+ - "L\4\u03ab\u03b4\3\2\2\2\u03ac\u03ad\t\t\2\2\u03ad\u03ae\5&\24\2\u03ae"+ - "\u03af\7o\2\2\u03af\u03b0\7o\2\2\u03b0\u03b1\5*\26\2\u03b1\u03b2\5\u0096"+ - "L\3\u03b2\u03b4\3\2\2\2\u03b3\u03a3\3\2\2\2\u03b3\u03a6\3\2\2\2\u03b3"+ - "\u03a7\3\2\2\2\u03b3\u03ac\3\2\2\2\u03b4\u03d8\3\2\2\2\u03b5\u03b6\f\16"+ - "\2\2\u03b6\u03b7\t\n\2\2\u03b7\u03d7\5\u0096L\17\u03b8\u03b9\f\r\2\2\u03b9"+ - "\u03ba\t\13\2\2\u03ba\u03d7\5\u0096L\16\u03bb\u03bc\f\f\2\2\u03bc\u03bd"+ - "\t\f\2\2\u03bd\u03d7\5\u0096L\r\u03be\u03bf\f\13\2\2\u03bf\u03c0\t\r\2"+ - "\2\u03c0\u03d7\5\u0096L\f\u03c1\u03c2\f\n\2\2\u03c2\u03c3\t\16\2\2\u03c3"+ - "\u03d7\5\u0096L\13\u03c4\u03c5\f\b\2\2\u03c5\u03c6\7v\2\2\u03c6\u03d7"+ - "\5\u0096L\t\u03c7\u03c8\f\7\2\2\u03c8\u03c9\7u\2\2\u03c9\u03d7\5\u0096"+ - "L\b\u03ca\u03cb\f\6\2\2\u03cb\u03cc\7#\2\2\u03cc\u03d7\5\u0096L\6\u03cd"+ - "\u03ce\f\5\2\2\u03ce\u03cf\7&\2\2\u03cf\u03d0\5\u0096L\2\u03d0\u03d1\7"+ - "o\2\2\u03d1\u03d2\5\u0096L\5\u03d2\u03d7\3\2\2\2\u03d3\u03d4\f\t\2\2\u03d4"+ - "\u03d5\7\21\2\2\u03d5\u03d7\5d\63\2\u03d6\u03b5\3\2\2\2\u03d6\u03b8\3"+ - "\2\2\2\u03d6\u03bb\3\2\2\2\u03d6\u03be\3\2\2\2\u03d6\u03c1\3\2\2\2\u03d6"+ - "\u03c4\3\2\2\2\u03d6\u03c7\3\2\2\2\u03d6\u03ca\3\2\2\2\u03d6\u03cd\3\2"+ - "\2\2\u03d6\u03d3\3\2\2\2\u03d7\u03da\3\2\2\2\u03d8\u03d6\3\2\2\2\u03d8"+ - "\u03d9\3\2\2\2\u03d9\u0097\3\2\2\2\u03da\u03d8\3\2\2\2\u03db\u03f0\5\30"+ - "\r\2\u03dc\u03f0\5\32\16\2\u03dd\u03f0\5\u009cO\2\u03de\u03f0\5\u009a"+ - "N\2\u03df\u03f0\5\u00d0i\2\u03e0\u03f0\5\u00f0y\2\u03e1\u03f0\5\u00e4"+ - "s\2\u03e2\u03f0\5\u011c\u008f\2\u03e3\u03f0\5\u00f2z\2\u03e4\u03f0\5\u00f4"+ - "{\2\u03e5\u03f0\5\u00f6|\2\u03e6\u03f0\5\u00f8}\2\u03e7\u03f0\5\u00fa"+ - "~\2\u03e8\u03f0\5\u00e0q\2\u03e9\u03f0\5\u00fc\177\2\u03ea\u03f0\5\u00fe"+ - "\u0080\2\u03eb\u03f0\5\u0110\u0089\2\u03ec\u03f0\5\u009eP\2\u03ed\u03f0"+ - "\5\u00a2R\2\u03ee\u03f0\5j\66\2\u03ef\u03db\3\2\2\2\u03ef\u03dc\3\2\2"+ - "\2\u03ef\u03dd\3\2\2\2\u03ef\u03de\3\2\2\2\u03ef\u03df\3\2\2\2\u03ef\u03e0"+ - "\3\2\2\2\u03ef\u03e1\3\2\2\2\u03ef\u03e2\3\2\2\2\u03ef\u03e3\3\2\2\2\u03ef"+ - "\u03e4\3\2\2\2\u03ef\u03e5\3\2\2\2\u03ef\u03e6\3\2\2\2\u03ef\u03e7\3\2"+ - "\2\2\u03ef\u03e8\3\2\2\2\u03ef\u03e9\3\2\2\2\u03ef\u03ea\3\2\2\2\u03ef"+ - "\u03eb\3\2\2\2\u03ef\u03ec\3\2\2\2\u03ef\u03ed\3\2\2\2\u03ef\u03ee\3\2"+ - "\2\2\u03f0\u0099\3\2\2\2\u03f1\u03f2\7%\2\2\u03f2\u03f3\5\u0096L\2\u03f3"+ - "\u009b\3\2\2\2\u03f4\u03f5\7X\2\2\u03f5\u03f7\5\u0096L\2\u03f6\u03f8\5"+ - "\u00e0q\2\u03f7\u03f6\3\2\2\2\u03f7\u03f8\3\2\2\2\u03f8\u009d\3\2\2\2"+ - "\u03f9\u03fa\5\u00a0Q\2\u03fa\u03fb\5\u0118\u008d\2\u03fb\u009f\3\2\2"+ - "\2\u03fc\u03fd\7\16\2\2\u03fd\u03fe\5\u0096L\2\u03fe\u03ff\5\u0162\u00b2"+ - "\2\u03ff\u0401\3\2\2\2\u0400\u03fc\3\2\2\2\u0401\u0404\3\2\2\2\u0402\u0400"+ - "\3\2\2\2\u0402\u0403\3\2\2\2\u0403\u0409\3\2\2\2\u0404\u0402\3\2\2\2\u0405"+ - "\u0406\7\17\2\2\u0406\u0407\5^\60\2\u0407\u0408\5\u0162\u00b2\2\u0408"+ - "\u040a\3\2\2\2\u0409\u0405\3\2\2\2\u0409\u040a\3\2\2\2\u040a\u00a1\3\2"+ - "\2\2\u040b\u040c\7Q\2\2\u040c\u0411\5\u0096L\2\u040d\u040e\7Q\2\2\u040e"+ - "\u040f\t\3\2\2\u040f\u0411\5.\30\2\u0410\u040b\3\2\2\2\u0410\u040d\3\2"+ - "\2\2\u0411\u00a3\3\2\2\2\u0412\u041b\7\5\2\2\u0413\u041b\7\6\2\2\u0414"+ - "\u041b\7d\2\2\u0415\u041b\5\u013e\u00a0\2\u0416\u041b\5\u0154\u00ab\2"+ - "\u0417\u041b\7\3\2\2\u0418\u041b\7\u008f\2\2\u0419\u041b\7\u0090\2\2\u041a"+ - "\u0412\3\2\2\2\u041a\u0413\3\2\2\2\u041a\u0414\3\2\2\2\u041a\u0415\3\2"+ - "\2\2\u041a\u0416\3\2\2\2\u041a\u0417\3\2\2\2\u041a\u0418\3\2\2\2\u041a"+ - "\u0419\3\2\2\2\u041b\u00a5\3\2\2\2\u041c\u041d\bT\1\2\u041d\u0429\5\u013a"+ - "\u009e\2\u041e\u0429\5\u0136\u009c\2\u041f\u0429\5\u015e\u00b0\2\u0420"+ - "\u0429\5 \21\2\u0421\u0429\5x=\2\u0422\u0429\5v<\2\u0423\u0424\t\17\2"+ - "\2\u0424\u0425\7f\2\2\u0425\u0426\5\u0096L\2\u0426\u0427\7g\2\2\u0427"+ - "\u0429\3\2\2\2\u0428\u041c\3\2\2\2\u0428\u041e\3\2\2\2\u0428\u041f\3\2"+ - "\2\2\u0428\u0420\3\2\2\2\u0428\u0421\3\2\2\2\u0428\u0422\3\2\2\2\u0428"+ - "\u0423\3\2\2\2\u0429\u0440\3\2\2\2\u042a\u042b\f\13\2\2\u042b\u042c\7"+ - "p\2\2\u042c\u043f\7e\2\2\u042d\u042e\f\n\2\2\u042e\u043f\5\u0158\u00ad"+ - "\2\u042f\u0430\f\t\2\2\u0430\u043f\5\u00c0a\2\u0431\u0432\f\b\2\2\u0432"+ - "\u043f\5H%\2\u0433\u0434\f\7\2\2\u0434\u043f\5\u015a\u00ae\2\u0435\u0436"+ - "\f\6\2\2\u0436\u043f\5\u015c\u00af\2\u0437\u0438\f\5\2\2\u0438\u0439\5"+ - "\u015c\u00af\2\u0439\u043a\7\22\2\2\u043a\u043b\5d\63\2\u043b\u043f\3"+ - "\2\2\2\u043c\u043d\f\4\2\2\u043d\u043f\5\u00acW\2\u043e\u042a\3\2\2\2"+ - "\u043e\u042d\3\2\2\2\u043e\u042f\3\2\2\2\u043e\u0431\3\2\2\2\u043e\u0433"+ - "\3\2\2\2\u043e\u0435\3\2\2\2\u043e\u0437\3\2\2\2\u043e\u043c\3\2\2\2\u043f"+ - "\u0442\3\2\2\2\u0440\u043e\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u00a7\3\2"+ - "\2\2\u0442\u0440\3\2\2\2\u0443\u0444\5Z.\2\u0444\u0445\5\u00aaV\2\u0445"+ - "\u00a9\3\2\2\2\u0446\u0448\7M\2\2\u0447\u0449\7e\2\2\u0448\u0447\3\2\2"+ - "\2\u0448\u0449\3\2\2\2\u0449\u044a\3\2\2\2\u044a\u044c\5\u0130\u0099\2"+ - "\u044b\u044d\5b\62\2\u044c\u044b\3\2\2\2\u044c\u044d\3\2\2\2\u044d\u00ab"+ - "\3\2\2\2\u044e\u0450\7\'\2\2\u044f\u0451\5\u00d8m\2\u0450\u044f\3\2\2"+ - "\2\u0450\u0451\3\2\2\2\u0451\u0453\3\2\2\2\u0452\u0454\7m\2\2\u0453\u0452"+ - "\3\2\2\2\u0453\u0454\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u0456\7(\2\2\u0456"+ - "\u00ad\3\2\2\2\u0457\u0458\7N\2\2\u0458\u0462\7h\2\2\u0459\u045d\5\u00b2"+ - "Z\2\u045a\u045d\5\u011e\u0090\2\u045b\u045d\5\u00b0Y\2\u045c\u0459\3\2"+ - "\2\2\u045c\u045a\3\2\2\2\u045c\u045b\3\2\2\2\u045d\u045e\3\2\2\2\u045e"+ - "\u045f\5\u0162\u00b2\2\u045f\u0461\3\2\2\2\u0460\u045c\3\2\2\2\u0461\u0464"+ - "\3\2\2\2\u0462\u0460\3\2\2\2\u0462\u0463\3\2\2\2\u0463\u0465\3\2\2\2\u0464"+ - "\u0462\3\2\2\2\u0465\u0466\7i\2\2\u0466\u00af\3\2\2\2\u0467\u0468\78\2"+ - "\2\u0468\u0469\7e\2\2\u0469\u046a\5\u0134\u009b\2\u046a\u00b1\3\2\2\2"+ - "\u046b\u046d\7\34\2\2\u046c\u046b\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u046e"+ - "\3\2\2\2\u046e\u046f\5Z.\2\u046f\u0470\7e\2\2\u0470\u0471\5\u0134\u009b"+ - "\2\u0471\u0472\5\u0132\u009a\2\u0472\u047b\3\2\2\2\u0473\u0475\7\34\2"+ - "\2\u0474\u0473\3\2\2\2\u0474\u0475\3\2\2\2\u0475\u0476\3\2\2\2\u0476\u0477"+ - "\5Z.\2\u0477\u0478\7e\2\2\u0478\u0479\5\u0134\u009b\2\u0479\u047b\3\2"+ - "\2\2\u047a\u046c\3\2\2\2\u047a\u0474\3\2\2\2\u047b\u00b3\3\2\2\2\u047c"+ - "\u0484\5\u011e\u0090\2\u047d\u0484\5\u00b6\\\2\u047e\u0484\5L\'\2\u047f"+ - "\u0480\7f\2\2\u0480\u0481\5\u00b4[\2\u0481\u0482\7g\2\2\u0482\u0484\3"+ - "\2\2\2\u0483\u047c\3\2\2\2\u0483\u047d\3\2\2\2\u0483\u047e\3\2\2\2\u0483"+ - "\u047f\3\2\2\2\u0484\u00b5\3\2\2\2\u0485\u048f\5\u0120\u0091\2\u0486\u048f"+ - "\5\u0150\u00a9\2\u0487\u048f\5\u0126\u0094\2\u0488\u048f\5\u012e\u0098"+ - "\2\u0489\u048f\5\u00aeX\2\u048a\u048f\5\u0128\u0095\2\u048b\u048f\5\u012a"+ - "\u0096\2\u048c\u048f\5\u012c\u0097\2\u048d\u048f\5\u00b8]\2\u048e\u0485"+ - "\3\2\2\2\u048e\u0486\3\2\2\2\u048e\u0487\3\2\2\2\u048e\u0488\3\2\2\2\u048e"+ - "\u0489\3\2\2\2\u048e\u048a\3\2\2\2\u048e\u048b\3\2\2\2\u048e\u048c\3\2"+ - "\2\2\u048e\u048d\3\2\2\2\u048f\u00b7\3\2\2\2\u0490\u0491\78\2\2\u0491"+ - "\u0492\5\u00ba^\2\u0492\u00b9\3\2\2\2\u0493\u049f\7f\2\2\u0494\u0499\5"+ - "\u00b4[\2\u0495\u0496\7m\2\2\u0496\u0498\5\u00b4[\2\u0497\u0495\3\2\2"+ - "\2\u0498\u049b\3\2\2\2\u0499\u0497\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u049d"+ - "\3\2\2\2\u049b\u0499\3\2\2\2\u049c\u049e\7m\2\2\u049d\u049c\3\2\2\2\u049d"+ - "\u049e\3\2\2\2\u049e\u04a0\3\2\2\2\u049f\u0494\3\2\2\2\u049f\u04a0\3\2"+ - "\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\7g\2\2\u04a2\u00bb\3\2\2\2\u04a3"+ - "\u04ab\5\u0150\u00a9\2\u04a4\u04ab\5\u0120\u0091\2\u04a5\u04ab\5\u00be"+ - "`\2\u04a6\u04ab\5\u0128\u0095\2\u04a7\u04ab\5\u012a\u0096\2\u04a8\u04ab"+ - "\5L\'\2\u04a9\u04ab\5\u011e\u0090\2\u04aa\u04a3\3\2\2\2\u04aa\u04a4\3"+ - "\2\2\2\u04aa\u04a5\3\2\2\2\u04aa\u04a6\3\2\2\2\u04aa\u04a7\3\2\2\2\u04aa"+ - "\u04a8\3\2\2\2\u04aa\u04a9\3\2\2\2\u04ab\u00bd\3\2\2\2\u04ac\u04ad\7j"+ - "\2\2\u04ad\u04ae\7t\2\2\u04ae\u04af\7k\2\2\u04af\u04b0\5\u0124\u0093\2"+ - "\u04b0\u00bf\3\2\2\2\u04b1\u04c1\7j\2\2\u04b2\u04b4\5\u00c2b\2\u04b3\u04b2"+ - "\3\2\2\2\u04b3\u04b4\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b7\7o\2\2\u04b6"+ - "\u04b8\5\u00c4c\2\u04b7\u04b6\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04c2"+ - "\3\2\2\2\u04b9\u04bb\5\u00c2b\2\u04ba\u04b9\3\2\2\2\u04ba\u04bb\3\2\2"+ - "\2\u04bb\u04bc\3\2\2\2\u04bc\u04bd\7o\2\2\u04bd\u04be\5\u00c4c\2\u04be"+ - "\u04bf\7o\2\2\u04bf\u04c0\5\u00c6d\2\u04c0\u04c2\3\2\2\2\u04c1\u04b3\3"+ - "\2\2\2\u04c1\u04ba\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c3\u04c4\7k\2\2\u04c4"+ - "\u00c1\3\2\2\2\u04c5\u04c6\5\u0096L\2\u04c6\u00c3\3\2\2\2\u04c7\u04c8"+ - "\5\u0096L\2\u04c8\u00c5\3\2\2\2\u04c9\u04ca\5\u0096L\2\u04ca\u00c7\3\2"+ - "\2\2\u04cb\u04cd\t\20\2\2\u04cc\u04cb\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd"+ - "\u04ce\3\2\2\2\u04ce\u04cf\7l\2\2\u04cf\u00c9\3\2\2\2\u04d0\u04d1\5\u00d8"+ - "m\2\u04d1\u04d2\7l\2\2\u04d2\u04d7\3\2\2\2\u04d3\u04d4\5\b\5\2\u04d4\u04d5"+ - "\7s\2\2\u04d5\u04d7\3\2\2\2\u04d6\u04d0\3\2\2\2\u04d6\u04d3\3\2\2\2\u04d6"+ - "\u04d7\3\2\2\2\u04d7\u04d8\3\2\2\2\u04d8\u04d9\7]\2\2\u04d9\u04de\5\u0096"+ - "L\2\u04da\u04dc\7J\2\2\u04db\u04dd\7e\2\2\u04dc\u04db\3\2\2\2\u04dc\u04dd"+ - "\3\2\2\2\u04dd\u04df\3\2\2\2\u04de\u04da\3\2\2\2\u04de\u04df\3\2\2\2\u04df"+ - "\u00cb\3\2\2\2\u04e0\u04e1\7X\2\2\u04e1\u04e2\7e\2\2\u04e2\u00cd\3\2\2"+ - "\2\u04e3\u04e4\5\u0154\u00ab\2\u04e4\u00cf\3\2\2\2\u04e5\u04e9\5\u00d2"+ - "j\2\u04e6\u04e9\5\u00dan\2\u04e7\u04e9\5\u00dep\2\u04e8\u04e5\3\2\2\2"+ - "\u04e8\u04e6\3\2\2\2\u04e8\u04e7\3\2\2\2\u04e9\u00d1\3\2\2\2\u04ea\u04f6"+ - "\7Z\2\2\u04eb\u04f7\5\u00d4k\2\u04ec\u04f2\7f\2\2\u04ed\u04ee\5\u00d4"+ - "k\2\u04ee\u04ef\5\u0162\u00b2\2\u04ef\u04f1\3\2\2\2\u04f0\u04ed\3\2\2"+ - "\2\u04f1\u04f4\3\2\2\2\u04f2\u04f0\3\2\2\2\u04f2\u04f3\3\2\2\2\u04f3\u04f5"+ - "\3\2\2\2\u04f4\u04f2\3\2\2\2\u04f5\u04f7\7g\2\2\u04f6\u04eb\3\2\2\2\u04f6"+ - "\u04ec\3\2\2\2\u04f7\u00d3\3\2\2\2\u04f8\u04fe\5\u00d6l\2\u04f9\u04fb"+ - "\5\u00b4[\2\u04fa\u04f9\3\2\2\2\u04fa\u04fb\3\2\2\2\u04fb\u04fc\3\2\2"+ - "\2\u04fc\u04fd\7l\2\2\u04fd\u04ff\5\u00d8m\2\u04fe\u04fa\3\2\2\2\u04fe"+ - "\u04ff\3\2\2\2\u04ff\u00d5\3\2\2\2\u0500\u0505\7e\2\2\u0501\u0502\7m\2"+ - "\2\u0502\u0504\7e\2\2\u0503\u0501\3\2\2\2\u0504\u0507\3\2\2\2\u0505\u0503"+ - "\3\2\2\2\u0505\u0506\3\2\2\2\u0506\u00d7\3\2\2\2\u0507\u0505\3\2\2\2\u0508"+ - "\u050d\5\u0096L\2\u0509\u050a\7m\2\2\u050a\u050c\5\u0096L\2\u050b\u0509"+ - "\3\2\2\2\u050c\u050f\3\2\2\2\u050d\u050b\3\2\2\2\u050d\u050e\3\2\2\2\u050e"+ - "\u00d9\3\2\2\2\u050f\u050d\3\2\2\2\u0510\u051c\7^\2\2\u0511\u051d\5\u00dc"+ - "o\2\u0512\u0518\7f\2\2\u0513\u0514\5\u00dco\2\u0514\u0515\5\u0162\u00b2"+ - "\2\u0515\u0517\3\2\2\2\u0516\u0513\3\2\2\2\u0517\u051a\3\2\2\2\u0518\u0516"+ - "\3\2\2\2\u0518\u0519\3\2\2\2\u0519\u051b\3\2\2\2\u051a\u0518\3\2\2\2\u051b"+ - "\u051d\7g\2\2\u051c\u0511\3\2\2\2\u051c\u0512\3\2\2\2\u051d\u00db\3\2"+ - "\2\2\u051e\u0520\7e\2\2\u051f\u0521\7l\2\2\u0520\u051f\3\2\2\2\u0520\u0521"+ - "\3\2\2\2\u0521\u0522\3\2\2\2\u0522\u0523\5\u00b4[\2\u0523\u00dd\3\2\2"+ - "\2\u0524\u0530\7c\2\2\u0525\u0531\5\u0088E\2\u0526\u052c\7f\2\2\u0527"+ - "\u0528\5\u0088E\2\u0528\u0529\5\u0162\u00b2\2\u0529\u052b\3\2\2\2\u052a"+ - "\u0527\3\2\2\2\u052b\u052e\3\2\2\2\u052c\u052a\3\2\2\2\u052c\u052d\3\2"+ - "\2\2\u052d\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0531\7g\2\2\u0530"+ - "\u0525\3\2\2\2\u0530\u0526\3\2\2\2\u0531\u00df\3\2\2\2\u0532\u0534\7h"+ - "\2\2\u0533\u0535\5\u00e2r\2\u0534\u0533\3\2\2\2\u0534\u0535\3\2\2\2\u0535"+ - "\u0536\3\2\2\2\u0536\u0537\7i\2\2\u0537\u00e1\3\2\2\2\u0538\u053a\5\u0162"+ - "\u00b2\2\u0539\u0538\3\2\2\2\u0539\u053a\3\2\2\2\u053a\u053b\3\2\2\2\u053b"+ - "\u053c\5\u0098M\2\u053c\u053d\5\u0162\u00b2\2\u053d\u053f\3\2\2\2\u053e"+ - "\u0539\3\2\2\2\u053f\u0540\3\2\2\2\u0540\u053e\3\2\2\2\u0540\u0541\3\2"+ - "\2\2\u0541\u00e3\3\2\2\2\u0542\u0548\5\u00e8u\2\u0543\u0548\5\u00eav\2"+ - "\u0544\u0548\5\u00ecw\2\u0545\u0548\5\u00e6t\2\u0546\u0548\5\u008aF\2"+ - "\u0547\u0542\3\2\2\2\u0547\u0543\3\2\2\2\u0547\u0544\3\2\2\2\u0547\u0545"+ - "\3\2\2\2\u0547\u0546\3\2\2\2\u0548\u00e5\3\2\2\2\u0549\u054a\5\u0096L"+ - "\2\u054a\u00e7\3\2\2\2\u054b\u054c\5\u0096L\2\u054c\u054d\7\u0089\2\2"+ - "\u054d\u054e\5\u0096L\2\u054e\u00e9\3\2\2\2\u054f\u0550\5\u0096L\2\u0550"+ - "\u0551\t\21\2\2\u0551\u00eb\3\2\2\2\u0552\u0553\5\u00d8m\2\u0553\u0554"+ - "\5\u00c8e\2\u0554\u0555\5\u00d8m\2\u0555\u00ed\3\2\2\2\u0556\u0557\t\22"+ - "\2\2\u0557\u00ef\3\2\2\2\u0558\u0559\7e\2\2\u0559\u055b\7o\2\2\u055a\u055c"+ - "\5\u0098M\2\u055b\u055a\3\2\2\2\u055b\u055c\3\2\2\2\u055c\u00f1\3\2\2"+ - "\2\u055d\u055f\7b\2\2\u055e\u0560\5\u00d8m\2\u055f\u055e\3\2\2\2\u055f"+ - "\u0560\3\2\2\2\u0560\u00f3\3\2\2\2\u0561\u0563\7K\2\2\u0562\u0564\7e\2"+ - "\2\u0563\u0562\3\2\2\2\u0563\u0564\3\2\2\2\u0564\u00f5\3\2\2\2\u0565\u0567"+ - "\7_\2\2\u0566\u0568\7e\2\2\u0567\u0566\3\2\2\2\u0567\u0568\3\2\2\2\u0568"+ - "\u00f7\3\2\2\2\u0569\u056a\7W\2\2\u056a\u056b\7e\2\2\u056b\u00f9\3\2\2"+ - "\2\u056c\u056d\7[\2\2\u056d\u00fb\3\2\2\2\u056e\u0577\7\\\2\2\u056f\u0578"+ - "\5\u0096L\2\u0570\u0571\5\u0162\u00b2\2\u0571\u0572\5\u0096L\2\u0572\u0578"+ - "\3\2\2\2\u0573\u0574\5\u00e4s\2\u0574\u0575\5\u0162\u00b2\2\u0575\u0576"+ - "\5\u0096L\2\u0576\u0578\3\2\2\2\u0577\u056f\3\2\2\2\u0577\u0570\3\2\2"+ - "\2\u0577\u0573\3\2\2\2\u0578\u0579\3\2\2\2\u0579\u057f\5\u00e0q\2\u057a"+ - "\u057d\7V\2\2\u057b\u057e\5\u00fc\177\2\u057c\u057e\5\u00e0q\2\u057d\u057b"+ - "\3\2\2\2\u057d\u057c\3\2\2\2\u057e\u0580\3\2\2\2\u057f\u057a\3\2\2\2\u057f"+ - "\u0580\3\2\2\2\u0580\u00fd\3\2\2\2\u0581\u0584\5\u0100\u0081\2\u0582\u0584"+ - "\5\u0106\u0084\2\u0583\u0581\3\2\2\2\u0583\u0582\3\2\2\2\u0584\u00ff\3"+ - "\2\2\2\u0585\u0590\7Y\2\2\u0586\u0588\5\u0096L\2\u0587\u0586\3\2\2\2\u0587"+ - "\u0588\3\2\2\2\u0588\u0591\3\2\2\2\u0589\u058b\5\u00e4s\2\u058a\u0589"+ - "\3\2\2\2\u058a\u058b\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058e\5\u0162\u00b2"+ - "\2\u058d\u058f\5\u0096L\2\u058e\u058d\3\2\2\2\u058e\u058f\3\2\2\2\u058f"+ - "\u0591\3\2\2\2\u0590\u0587\3\2\2\2\u0590\u058a\3\2\2\2\u0591\u0592\3\2"+ - "\2\2\u0592\u0596\7h\2\2\u0593\u0595\5\u0102\u0082\2\u0594\u0593\3\2\2"+ - "\2\u0595\u0598\3\2\2\2\u0596\u0594\3\2\2\2\u0596\u0597\3\2\2\2\u0597\u0599"+ - "\3\2\2\2\u0598\u0596\3\2\2\2\u0599\u059a\7i\2\2\u059a\u0101\3\2\2\2\u059b"+ - "\u059c\5\u0104\u0083\2\u059c\u059e\7o\2\2\u059d\u059f\5\u00e2r\2\u059e"+ - "\u059d\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u0103\3\2\2\2\u05a0\u05a1\7P"+ - "\2\2\u05a1\u05a4\5\u00d8m\2\u05a2\u05a4\7L\2\2\u05a3\u05a0\3\2\2\2\u05a3"+ - "\u05a2\3\2\2\2\u05a4\u0105\3\2\2\2\u05a5\u05ae\7Y\2\2\u05a6\u05af\5\u0108"+ - "\u0085\2\u05a7\u05a8\5\u0162\u00b2\2\u05a8\u05a9\5\u0108\u0085\2\u05a9"+ - "\u05af\3\2\2\2\u05aa\u05ab\5\u00e4s\2\u05ab\u05ac\5\u0162\u00b2\2\u05ac"+ - "\u05ad\5\u0108\u0085\2\u05ad\u05af\3\2\2\2\u05ae\u05a6\3\2\2\2\u05ae\u05a7"+ - "\3\2\2\2\u05ae\u05aa\3\2\2\2\u05af\u05b0\3\2\2\2\u05b0\u05b4\7h\2\2\u05b1"+ - "\u05b3\5\u010a\u0086\2\u05b2\u05b1\3\2\2\2\u05b3\u05b6\3\2\2\2\u05b4\u05b2"+ - "\3\2\2\2\u05b4\u05b5\3\2\2\2\u05b5\u05b7\3\2\2\2\u05b6\u05b4\3\2\2\2\u05b7"+ - "\u05b8\7i\2\2\u05b8\u0107\3\2\2\2\u05b9\u05ba\7e\2\2\u05ba\u05bc\7s\2"+ - "\2\u05bb\u05b9\3\2\2\2\u05bb\u05bc\3\2\2\2\u05bc\u05bd\3\2\2\2\u05bd\u05be"+ - "\5\u00a6T\2\u05be\u05bf\7p\2\2\u05bf\u05c0\7f\2\2\u05c0\u05c1\7^\2\2\u05c1"+ - "\u05c2\7g\2\2\u05c2\u0109\3\2\2\2\u05c3\u05c4\5\u010c\u0087\2\u05c4\u05c6"+ - "\7o\2\2\u05c5\u05c7\5\u00e2r\2\u05c6\u05c5\3\2\2\2\u05c6\u05c7\3\2\2\2"+ - "\u05c7\u010b\3\2\2\2\u05c8\u05c9\7P\2\2\u05c9\u05cc\5\u010e\u0088\2\u05ca"+ - "\u05cc\7L\2\2\u05cb\u05c8\3\2\2\2\u05cb\u05ca\3\2\2\2\u05cc\u010d\3\2"+ - "\2\2\u05cd\u05d0\5\u00b4[\2\u05ce\u05d0\7d\2\2\u05cf\u05cd\3\2\2\2\u05cf"+ - "\u05ce\3\2\2\2\u05d0\u05d8\3\2\2\2\u05d1\u05d4\7m\2\2\u05d2\u05d5\5\u00b4"+ - "[\2\u05d3\u05d5\7d\2\2\u05d4\u05d2\3\2\2\2\u05d4\u05d3\3\2\2\2\u05d5\u05d7"+ - "\3\2\2\2\u05d6\u05d1\3\2\2\2\u05d7\u05da\3\2\2\2\u05d8\u05d6\3\2\2\2\u05d8"+ - "\u05d9\3\2\2\2\u05d9\u010f\3\2\2\2\u05da\u05d8\3\2\2\2\u05db\u05dc\7O"+ - "\2\2\u05dc\u05e0\7h\2\2\u05dd\u05df\5\u0112\u008a\2\u05de\u05dd\3\2\2"+ - "\2\u05df\u05e2\3\2\2\2\u05e0\u05de\3\2\2\2\u05e0\u05e1\3\2\2\2\u05e1\u05e3"+ - "\3\2\2\2\u05e2\u05e0\3\2\2\2\u05e3\u05e4\7i\2\2\u05e4\u0111\3\2\2\2\u05e5"+ - "\u05e6\5\u0114\u008b\2\u05e6\u05e8\7o\2\2\u05e7\u05e9\5\u00e2r\2\u05e8"+ - "\u05e7\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9\u0113\3\2\2\2\u05ea\u05ed\7P"+ - "\2\2\u05eb\u05ee\5\u00e8u\2\u05ec\u05ee\5\u0116\u008c\2\u05ed\u05eb\3"+ - "\2\2\2\u05ed\u05ec\3\2\2\2\u05ee\u05f1\3\2\2\2\u05ef\u05f1\7L\2\2\u05f0"+ - "\u05ea\3\2\2\2\u05f0\u05ef\3\2\2\2\u05f1\u0115\3\2\2\2\u05f2\u05f3\5\u00d8"+ - "m\2\u05f3\u05f4\7l\2\2\u05f4\u05f9\3\2\2\2\u05f5\u05f6\5\u00d6l\2\u05f6"+ - "\u05f7\7s\2\2\u05f7\u05f9\3\2\2\2\u05f8\u05f2\3\2\2\2\u05f8\u05f5\3\2"+ - "\2\2\u05f8\u05f9\3\2\2\2\u05f9\u05fa\3\2\2\2\u05fa\u05fb\5\u0096L\2\u05fb"+ - "\u0117\3\2\2\2\u05fc\u0600\7`\2\2\u05fd\u0601\5\u0096L\2\u05fe\u0601\5"+ - "\u011a\u008e\2\u05ff\u0601\5\u00caf\2\u0600\u05fd\3\2\2\2\u0600\u05fe"+ - "\3\2\2\2\u0600\u05ff\3\2\2\2\u0600\u0601\3\2\2\2\u0601\u0602\3\2\2\2\u0602"+ - "\u0603\5\u00e0q\2\u0603\u0119\3\2\2\2\u0604\u0606\5\u00e4s\2\u0605\u0604"+ - "\3\2\2\2\u0605\u0606\3\2\2\2\u0606\u0607\3\2\2\2\u0607\u0609\5\u0162\u00b2"+ - "\2\u0608\u060a\5\u0096L\2\u0609\u0608\3\2\2\2\u0609\u060a\3\2\2\2\u060a"+ - "\u060b\3\2\2\2\u060b\u060d\5\u0162\u00b2\2\u060c\u060e\5\u00e4s\2\u060d"+ - "\u060c\3\2\2\2\u060d\u060e\3\2\2\2\u060e\u011b\3\2\2\2\u060f\u0610\7R"+ - "\2\2\u0610\u0611\5\u0096L\2\u0611\u011d\3\2\2\2\u0612\u0615\5\u0142\u00a2"+ - "\2\u0613\u0615\7e\2\2\u0614\u0612\3\2\2\2\u0614\u0613\3\2\2\2\u0615\u011f"+ - "\3\2\2\2\u0616\u0617\7j\2\2\u0617\u0618\5\u0122\u0092\2\u0618\u0619\7"+ - "k\2\2\u0619\u061a\5\u0124\u0093\2\u061a\u0121\3\2\2\2\u061b\u061c\5\u0096"+ - "L\2\u061c\u0123\3\2\2\2\u061d\u061e\5\u00b4[\2\u061e\u0125\3\2\2\2\u061f"+ - "\u0620\7\u0087\2\2\u0620\u0621\5\u00b4[\2\u0621\u0127\3\2\2\2\u0622\u0623"+ - "\7j\2\2\u0623\u0624\7k\2\2\u0624\u0625\5\u0124\u0093\2\u0625\u0129\3\2"+ - "\2\2\u0626\u0627\7S\2\2\u0627\u0628\7j\2\2\u0628\u0629\5\u00b4[\2\u0629"+ - "\u062a\7k\2\2\u062a\u062b\5\u0124\u0093\2\u062b\u012b\3\2\2\2\u062c\u0632"+ - "\7U\2\2\u062d\u062e\7U\2\2\u062e\u0632\7\u0089\2\2\u062f\u0630\7\u0089"+ - "\2\2\u0630\u0632\7U\2\2\u0631\u062c\3\2\2\2\u0631\u062d\3\2\2\2\u0631"+ - "\u062f\3\2\2\2\u0632\u0633\3\2\2\2\u0633\u0634\5\u0124\u0093\2\u0634\u012d"+ - "\3\2\2\2\u0635\u0636\7M\2\2\u0636\u0637\5\u0130\u0099\2\u0637\u012f\3"+ - "\2\2\2\u0638\u0639\5\u0134\u009b\2\u0639\u063a\5\u0132\u009a\2\u063a\u063d"+ - "\3\2\2\2\u063b\u063d\5\u0134\u009b\2\u063c\u0638\3\2\2\2\u063c\u063b\3"+ - "\2\2\2\u063d\u0131\3\2\2\2\u063e\u0641\5\u0134\u009b\2\u063f\u0641\5\u00b4"+ - "[\2\u0640\u063e\3\2\2\2\u0640\u063f\3\2\2\2\u0641\u0133\3\2\2\2\u0642"+ - "\u064e\7f\2\2\u0643\u0648\5\u008eH\2\u0644\u0645\7m\2\2\u0645\u0647\5"+ - "\u008eH\2\u0646\u0644\3\2\2\2\u0647\u064a\3\2\2\2\u0648\u0646\3\2\2\2"+ - "\u0648\u0649\3\2\2\2\u0649\u064c\3\2\2\2\u064a\u0648\3\2\2\2\u064b\u064d"+ - "\7m\2\2\u064c\u064b\3\2\2\2\u064c\u064d\3\2\2\2\u064d\u064f\3\2\2\2\u064e"+ - "\u0643\3\2\2\2\u064e\u064f\3\2\2\2\u064f\u0650\3\2\2\2\u0650\u0651\7g"+ - "\2\2\u0651\u0135\3\2\2\2\u0652\u0653\5\u0138\u009d\2\u0653\u0654\7f\2"+ - "\2\u0654\u0656\5\u0096L\2\u0655\u0657\7m\2\2\u0656\u0655\3\2\2\2\u0656"+ - "\u0657\3\2\2\2\u0657\u0658\3\2\2\2\u0658\u0659\7g\2\2\u0659\u0137\3\2"+ - "\2\2\u065a\u0660\5\u00b6\\\2\u065b\u065c\7f\2\2\u065c\u065d\5\u0138\u009d"+ - "\2\u065d\u065e\7g\2\2\u065e\u0660\3\2\2\2\u065f\u065a\3\2\2\2\u065f\u065b"+ - "\3\2\2\2\u0660\u0139\3\2\2\2\u0661\u0668\5\u013c\u009f\2\u0662\u0668\5"+ - "\u0140\u00a1\2\u0663\u0664\7f\2\2\u0664\u0665\5\u0096L\2\u0665\u0666\7"+ - "g\2\2\u0666\u0668\3\2\2\2\u0667\u0661\3\2\2\2\u0667\u0662\3\2\2\2\u0667"+ - "\u0663\3\2\2\2\u0668\u013b\3\2\2\2\u0669\u066d\5\u00a4S\2\u066a\u066d"+ - "\5\u0144\u00a3\2\u066b\u066d\5\u00a8U\2\u066c\u0669\3\2\2\2\u066c\u066a"+ - "\3\2\2\2\u066c\u066b\3\2\2\2\u066d\u013d\3\2\2\2\u066e\u066f\t\23\2\2"+ - "\u066f\u013f\3\2\2\2\u0670\u0671\7e\2\2\u0671\u0141\3\2\2\2\u0672\u0673"+ - "\7e\2\2\u0673\u0674\7p\2\2\u0674\u0675\7e\2\2\u0675\u0143\3\2\2\2\u0676"+ - "\u0677\5\u00bc_\2\u0677\u0678\5\u0146\u00a4\2\u0678\u0145\3\2\2\2\u0679"+ - "\u067e\7h\2\2\u067a\u067c\5\u0148\u00a5\2\u067b\u067d\7m\2\2\u067c\u067b"+ - "\3\2\2\2\u067c\u067d\3\2\2\2\u067d\u067f\3\2\2\2\u067e\u067a\3\2\2\2\u067e"+ - "\u067f\3\2\2\2\u067f\u0680\3\2\2\2\u0680\u0681\7i\2\2\u0681\u0147\3\2"+ - "\2\2\u0682\u0687\5\u014a\u00a6\2\u0683\u0684\7m\2\2\u0684\u0686\5\u014a"+ - "\u00a6\2\u0685\u0683\3\2\2\2\u0686\u0689\3\2\2\2\u0687\u0685\3\2\2\2\u0687"+ - "\u0688\3\2\2\2\u0688\u0149\3\2\2\2\u0689\u0687\3\2\2\2\u068a\u068b\5\u014c"+ - "\u00a7\2\u068b\u068c\7o\2\2\u068c\u068e\3\2\2\2\u068d\u068a\3\2\2\2\u068d"+ - "\u068e\3\2\2\2\u068e\u068f\3\2\2\2\u068f\u0690\5\u014e\u00a8\2\u0690\u014b"+ - "\3\2\2\2\u0691\u0694\5\u0096L\2\u0692\u0694\5\u0146\u00a4\2\u0693\u0691"+ - "\3\2\2\2\u0693\u0692\3\2\2\2\u0694\u014d\3\2\2\2\u0695\u0698\5\u0096L"+ - "\2\u0696\u0698\5\u0146\u00a4\2\u0697\u0695\3\2\2\2\u0697\u0696\3\2\2\2"+ - "\u0698\u014f\3\2\2\2\u0699\u069a\7T\2\2\u069a\u06a0\7h\2\2\u069b\u069c"+ - "\5\u0152\u00aa\2\u069c\u069d\5\u0162\u00b2\2\u069d\u069f\3\2\2\2\u069e"+ - "\u069b\3\2\2\2\u069f\u06a2\3\2\2\2\u06a0\u069e\3\2\2\2\u06a0\u06a1\3\2"+ - "\2\2\u06a1\u06a3\3\2\2\2\u06a2\u06a0\3\2\2\2\u06a3\u06a4\7i\2\2\u06a4"+ - "\u0151\3\2\2\2\u06a5\u06a6\5\u00d6l\2\u06a6\u06a7\5\u00b4[\2\u06a7\u06aa"+ - "\3\2\2\2\u06a8\u06aa\5\u0156\u00ac\2\u06a9\u06a5\3\2\2\2\u06a9\u06a8\3"+ - "\2\2\2\u06aa\u06ac\3\2\2\2\u06ab\u06ad\5\u0154\u00ab\2\u06ac\u06ab\3\2"+ - "\2\2\u06ac\u06ad\3\2\2\2\u06ad\u0153\3\2\2\2\u06ae\u06af\t\24\2\2\u06af"+ - "\u0155\3\2\2\2\u06b0\u06b2\7\u0087\2\2\u06b1\u06b0\3\2\2\2\u06b1\u06b2"+ - "\3\2\2\2\u06b2\u06b3\3\2\2\2\u06b3\u06b4\5\u011e\u0090\2\u06b4\u0157\3"+ - "\2\2\2\u06b5\u06b6\7j\2\2\u06b6\u06b7\5\u0096L\2\u06b7\u06b8\7k\2\2\u06b8"+ - "\u0159\3\2\2\2\u06b9\u06ba\7p\2\2\u06ba\u06bb\7f\2\2\u06bb\u06bc\5\u00b4"+ - "[\2\u06bc\u06bd\7g\2\2\u06bd\u015b\3\2\2\2\u06be\u06cd\7f\2\2\u06bf\u06c6"+ - "\5\u00d8m\2\u06c0\u06c3\5\u0138\u009d\2\u06c1\u06c2\7m\2\2\u06c2\u06c4"+ - "\5\u00d8m\2\u06c3\u06c1\3\2\2\2\u06c3\u06c4\3\2\2\2\u06c4\u06c6\3\2\2"+ - "\2\u06c5\u06bf\3\2\2\2\u06c5\u06c0\3\2\2\2\u06c6\u06c8\3\2\2\2\u06c7\u06c9"+ - "\7t\2\2\u06c8\u06c7\3\2\2\2\u06c8\u06c9\3\2\2\2\u06c9\u06cb\3\2\2\2\u06ca"+ - "\u06cc\7m\2\2\u06cb\u06ca\3\2\2\2\u06cb\u06cc\3\2\2\2\u06cc\u06ce\3\2"+ - "\2\2\u06cd\u06c5\3\2\2\2\u06cd\u06ce\3\2\2\2\u06ce\u06cf\3\2\2\2\u06cf"+ - "\u06d0\7g\2\2\u06d0\u015d\3\2\2\2\u06d1\u06d2\5\u0138\u009d\2\u06d2\u06d3"+ - "\7p\2\2\u06d3\u06d4\7e\2\2\u06d4\u015f\3\2\2\2\u06d5\u06d6\5\u00b4[\2"+ - "\u06d6\u0161\3\2\2\2\u06d7\u06dc\7n\2\2\u06d8\u06dc\7\2\2\3\u06d9\u06dc"+ - "\7\u009f\2\2\u06da\u06dc\6\u00b2\24\2\u06db\u06d7\3\2\2\2\u06db\u06d8"+ - "\3\2\2\2\u06db\u06d9\3\2\2\2\u06db\u06da\3\2\2\2\u06dc\u0163\3\2\2\2\u00b5"+ - "\u0172\u0177\u017e\u0188\u018e\u0194\u01a4\u01a8\u01b1\u01bd\u01c1\u01c7"+ - "\u01cf\u01d9\u01e9\u01f7\u01fb\u0202\u020a\u0213\u0233\u023b\u0253\u0264"+ - "\u0271\u027a\u0288\u0291\u029d\u02b2\u02b9\u02be\u02c3\u02cd\u02d0\u02d4"+ - "\u02d8\u02df\u02e2\u02e8\u02ed\u02ef\u02f2\u02f9\u02fe\u0311\u0319\u031d"+ - "\u0320\u0326\u032a\u032d\u0337\u033e\u0345\u0351\u0357\u035e\u0363\u0369"+ - "\u0375\u037b\u037f\u0387\u038b\u0391\u0394\u039a\u039f\u03b3\u03d6\u03d8"+ - "\u03ef\u03f7\u0402\u0409\u0410\u041a\u0428\u043e\u0440\u0448\u044c\u0450"+ - "\u0453\u045c\u0462\u046c\u0474\u047a\u0483\u048e\u0499\u049d\u049f\u04aa"+ - "\u04b3\u04b7\u04ba\u04c1\u04cc\u04d6\u04dc\u04de\u04e8\u04f2\u04f6\u04fa"+ - "\u04fe\u0505\u050d\u0518\u051c\u0520\u052c\u0530\u0534\u0539\u0540\u0547"+ - "\u055b\u055f\u0563\u0567\u0577\u057d\u057f\u0583\u0587\u058a\u058e\u0590"+ - "\u0596\u059e\u05a3\u05ae\u05b4\u05bb\u05c6\u05cb\u05cf\u05d4\u05d8\u05e0"+ - "\u05e8\u05ed\u05f0\u05f8\u0600\u0605\u0609\u060d\u0614\u0631\u063c\u0640"+ - "\u0648\u064c\u064e\u0656\u065f\u0667\u066c\u067c\u067e\u0687\u068d\u0693"+ - "\u0697\u06a0\u06a9\u06ac\u06b1\u06c3\u06c5\u06c8\u06cb\u06cd\u06db"; + "\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\4\u00b5\t\u00b5\4\u00b6\t\u00b6"+ + "\4\u00b7\t\u00b7\4\u00b8\t\u00b8\4\u00b9\t\u00b9\3\2\3\2\3\2\3\3\3\3\3"+ + "\3\3\4\3\4\3\4\3\5\3\5\3\5\7\5\u017f\n\5\f\5\16\5\u0182\13\5\3\6\3\6\5"+ + "\6\u0186\n\6\3\7\3\7\3\7\7\7\u018b\n\7\f\7\16\7\u018e\13\7\3\7\3\7\3\7"+ + "\3\7\3\7\7\7\u0195\n\7\f\7\16\7\u0198\13\7\3\7\3\7\3\7\5\7\u019d\n\7\3"+ + "\7\3\7\7\7\u01a1\n\7\f\7\16\7\u01a4\13\7\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3"+ + "\t\3\n\3\n\3\n\7\n\u01b1\n\n\f\n\16\n\u01b4\13\n\3\n\5\n\u01b7\n\n\3\n"+ + "\3\n\3\13\3\13\3\13\7\13\u01be\n\13\f\13\16\13\u01c1\13\13\3\13\3\13\3"+ + "\13\3\13\3\13\3\13\3\13\7\13\u01ca\n\13\f\13\16\13\u01cd\13\13\3\13\5"+ + "\13\u01d0\n\13\3\f\3\f\3\f\3\f\5\f\u01d6\n\f\3\r\3\r\3\r\3\r\3\r\3\r\3"+ + "\r\5\r\u01df\n\r\3\16\3\16\3\17\3\17\3\17\3\20\3\20\3\20\5\20\u01e9\n"+ + "\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3"+ + "\21\3\21\5\21\u01fa\n\21\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24"+ + "\3\24\7\24\u0206\n\24\f\24\16\24\u0209\13\24\3\24\5\24\u020c\n\24\3\25"+ + "\3\25\3\25\7\25\u0211\n\25\f\25\16\25\u0214\13\25\3\25\3\25\3\26\7\26"+ + "\u0219\n\26\f\26\16\26\u021c\13\26\3\27\3\27\3\27\3\27\7\27\u0222\n\27"+ + "\f\27\16\27\u0225\13\27\3\27\3\27\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3"+ + "\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3"+ + "\34\3\35\3\35\3\35\3\35\3\35\5\35\u0244\n\35\3\35\3\35\3\35\3\35\3\36"+ + "\3\36\5\36\u024c\n\36\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\""+ + "\3\"\3\"\3\"\3#\3#\3#\3#\3#\5#\u0264\n#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%"+ + "\3%\3%\3%\7%\u0273\n%\f%\16%\u0276\13%\3%\3%\3&\3&\3&\3&\3\'\3\'\3\'\3"+ + "\'\7\'\u0282\n\'\f\'\16\'\u0285\13\'\3\'\3\'\3(\3(\3(\3(\3)\3)\3)\3)\5"+ + ")\u0291\n)\3*\3*\3*\3*\3*\7*\u0298\n*\f*\16*\u029b\13*\3*\3*\3+\3+\3+"+ + "\3+\3+\3+\3+\3+\3+\5+\u02a8\n+\3,\3,\3,\3,\3,\7,\u02af\n,\f,\16,\u02b2"+ + "\13,\3,\3,\3-\3-\3-\3-\3-\7-\u02bb\n-\f-\16-\u02be\13-\3-\3-\3.\3.\3."+ + "\3.\3.\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\5/\u02d2\n/\3\60\3\60\3\60\3\60"+ + "\3\60\5\60\u02d9\n\60\3\60\7\60\u02dc\n\60\f\60\16\60\u02df\13\60\3\60"+ + "\3\60\5\60\u02e3\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u02ed"+ + "\n\61\3\62\5\62\u02f0\n\62\3\62\3\62\5\62\u02f4\n\62\3\63\3\63\5\63\u02f8"+ + "\n\63\3\64\3\64\3\64\3\64\7\64\u02fe\n\64\f\64\16\64\u0301\13\64\3\64"+ + "\3\64\3\65\3\65\3\65\5\65\u0308\n\65\3\66\3\66\3\66\5\66\u030d\n\66\3"+ + "\67\3\67\3\67\3\67\3\67\3\67\5\67\u0315\n\67\5\67\u0317\n\67\3\67\3\67"+ + "\3\67\5\67\u031c\n\67\38\38\38\78\u0321\n8\f8\168\u0324\138\39\39\39\3"+ + "9\39\59\u032b\n9\39\59\u032e\n9\39\39\3:\3:\5:\u0334\n:\3:\3:\3:\5:\u0339"+ + "\n:\5:\u033b\n:\3:\5:\u033e\n:\3;\3;\3;\7;\u0343\n;\f;\16;\u0346\13;\3"+ + "<\3<\5<\u034a\n<\3<\3<\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\7>\u035b"+ + "\n>\f>\16>\u035e\13>\3>\3>\3>\7>\u0363\n>\f>\16>\u0366\13>\3>\5>\u0369"+ + "\n>\3?\5?\u036c\n?\3?\3?\3?\3?\5?\u0372\n?\3@\3@\5@\u0376\n@\3@\5@\u0379"+ + "\n@\3@\3@\3@\3A\3A\3A\3A\3A\5A\u0383\nA\3B\3B\3B\3B\3B\5B\u038a\nB\3C"+ + "\3C\3C\3C\3C\5C\u0391\nC\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E\5E\u039d\nE\3F"+ + "\3F\3F\3F\5F\u03a3\nF\3G\3G\3G\3G\3G\5G\u03aa\nG\3H\3H\3H\5H\u03af\nH"+ + "\3I\3I\3I\3I\5I\u03b5\nI\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\5K\u03c1\nK\3L"+ + "\3L\3L\3L\5L\u03c7\nL\3L\3L\5L\u03cb\nL\3M\3M\3M\3M\3N\3N\5N\u03d3\nN"+ + "\3N\3N\5N\u03d7\nN\3N\3N\3O\3O\5O\u03dd\nO\3P\5P\u03e0\nP\3P\3P\3Q\3Q"+ + "\5Q\u03e6\nQ\3Q\3Q\3R\5R\u03eb\nR\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S"+ + "\3S\3S\3S\3S\3S\3S\5S\u03ff\nS\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S"+ + "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\7S\u0422"+ + "\nS\fS\16S\u0425\13S\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3"+ + "T\3T\3T\3T\5T\u043b\nT\3U\3U\3U\3V\3V\3V\5V\u0443\nV\3W\3W\3W\3X\3X\3"+ + "X\3X\7X\u044c\nX\fX\16X\u044f\13X\3X\3X\3X\3X\5X\u0455\nX\3Y\3Y\3Y\3Y"+ + "\3Y\5Y\u045c\nY\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\5Z\u0466\nZ\3[\3[\3[\3[\3[\3["+ + "\3[\3[\3[\3[\3[\3[\5[\u0474\n[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3["+ + "\3[\3[\3[\3[\3[\3[\3[\7[\u048a\n[\f[\16[\u048d\13[\3\\\3\\\3\\\3]\3]\5"+ + "]\u0494\n]\3]\3]\5]\u0498\n]\3^\3^\5^\u049c\n^\3^\5^\u049f\n^\3^\3^\3"+ + "_\3_\3_\3_\3_\5_\u04a8\n_\3_\3_\7_\u04ac\n_\f_\16_\u04af\13_\3_\3_\3`"+ + "\3`\3`\3`\3a\5a\u04b8\na\3a\3a\3a\3a\3a\3a\5a\u04c0\na\3a\3a\3a\3a\5a"+ + "\u04c6\na\3b\3b\3b\3b\3b\3b\3b\5b\u04cf\nb\3c\3c\3c\3c\3c\3c\3c\3c\3c"+ + "\5c\u04da\nc\3d\3d\3d\3e\3e\3e\3e\7e\u04e3\ne\fe\16e\u04e6\13e\3e\5e\u04e9"+ + "\ne\5e\u04eb\ne\3e\3e\3f\3f\3f\3f\3f\3f\3f\5f\u04f6\nf\3g\3g\3g\3g\3g"+ + "\3h\3h\5h\u04ff\nh\3h\3h\5h\u0503\nh\3h\5h\u0506\nh\3h\3h\3h\3h\3h\5h"+ + "\u050d\nh\3h\3h\3i\3i\3j\3j\3k\3k\3l\5l\u0518\nl\3l\3l\3m\3m\3m\3m\3m"+ + "\3m\5m\u0522\nm\3m\3m\3m\3m\5m\u0528\nm\5m\u052a\nm\3n\3n\3n\3o\3o\3p"+ + "\3p\3p\5p\u0534\np\3q\3q\3q\3q\3q\3q\7q\u053c\nq\fq\16q\u053f\13q\3q\5"+ + "q\u0542\nq\3r\3r\5r\u0546\nr\3r\3r\5r\u054a\nr\3s\3s\3s\7s\u054f\ns\f"+ + "s\16s\u0552\13s\3t\3t\3t\7t\u0557\nt\ft\16t\u055a\13t\3u\3u\3u\3u\3u\3"+ + "u\7u\u0562\nu\fu\16u\u0565\13u\3u\5u\u0568\nu\3v\3v\5v\u056c\nv\3v\3v"+ + "\3w\3w\3w\3w\3w\3w\7w\u0576\nw\fw\16w\u0579\13w\3w\5w\u057c\nw\3x\3x\5"+ + "x\u0580\nx\3x\3x\3y\5y\u0585\ny\3y\3y\3y\6y\u058a\ny\ry\16y\u058b\3z\3"+ + "z\3z\3z\3z\5z\u0593\nz\3{\3{\3|\3|\3|\3|\3}\3}\3}\3~\3~\3~\3~\3\177\3"+ + "\177\3\u0080\3\u0080\3\u0080\5\u0080\u05a7\n\u0080\3\u0081\3\u0081\5\u0081"+ + "\u05ab\n\u0081\3\u0082\3\u0082\5\u0082\u05af\n\u0082\3\u0083\3\u0083\5"+ + "\u0083\u05b3\n\u0083\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3"+ + "\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\5\u0086"+ + "\u05c3\n\u0086\3\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u05c9\n\u0086\5"+ + "\u0086\u05cb\n\u0086\3\u0087\3\u0087\5\u0087\u05cf\n\u0087\3\u0088\3\u0088"+ + "\5\u0088\u05d3\n\u0088\3\u0088\5\u0088\u05d6\n\u0088\3\u0088\3\u0088\5"+ + "\u0088\u05da\n\u0088\5\u0088\u05dc\n\u0088\3\u0088\3\u0088\7\u0088\u05e0"+ + "\n\u0088\f\u0088\16\u0088\u05e3\13\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+ + "\3\u0089\5\u0089\u05ea\n\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u05ef\n"+ + "\u008a\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b"+ + "\3\u008b\5\u008b\u05fa\n\u008b\3\u008b\3\u008b\7\u008b\u05fe\n\u008b\f"+ + "\u008b\16\u008b\u0601\13\u008b\3\u008b\3\u008b\3\u008c\3\u008c\5\u008c"+ + "\u0607\n\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d"+ + "\3\u008d\3\u008d\5\u008d\u0612\n\u008d\3\u008e\3\u008e\3\u008e\5\u008e"+ + "\u0617\n\u008e\3\u008f\3\u008f\5\u008f\u061b\n\u008f\3\u008f\3\u008f\3"+ + "\u008f\5\u008f\u0620\n\u008f\7\u008f\u0622\n\u008f\f\u008f\16\u008f\u0625"+ + "\13\u008f\3\u0090\3\u0090\3\u0090\7\u0090\u062a\n\u0090\f\u0090\16\u0090"+ + "\u062d\13\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\5\u0091\u0634"+ + "\n\u0091\3\u0092\3\u0092\3\u0092\5\u0092\u0639\n\u0092\3\u0092\5\u0092"+ + "\u063c\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\5\u0093"+ + "\u0644\n\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\5\u0094"+ + "\u064c\n\u0094\3\u0094\3\u0094\3\u0095\5\u0095\u0651\n\u0095\3\u0095\3"+ + "\u0095\5\u0095\u0655\n\u0095\3\u0095\3\u0095\5\u0095\u0659\n\u0095\3\u0096"+ + "\3\u0096\3\u0096\3\u0097\3\u0097\5\u0097\u0660\n\u0097\3\u0098\3\u0098"+ + "\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u009a\3\u009a\3\u009b\3\u009b"+ + "\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d\3\u009d\3\u009d\3\u009d"+ + "\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u067d"+ + "\n\u009e\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0"+ + "\3\u00a0\5\u00a0\u0688\n\u00a0\3\u00a1\3\u00a1\5\u00a1\u068c\n\u00a1\3"+ + "\u00a2\3\u00a2\3\u00a2\3\u00a2\7\u00a2\u0692\n\u00a2\f\u00a2\16\u00a2"+ + "\u0695\13\u00a2\3\u00a2\5\u00a2\u0698\n\u00a2\5\u00a2\u069a\n\u00a2\3"+ + "\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a3\5\u00a3\u06a2\n\u00a3\3"+ + "\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u06ab\n"+ + "\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\5\u00a5\u06b3\n"+ + "\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u06b8\n\u00a6\3\u00a7\3\u00a7\3"+ + "\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa"+ + "\3\u00ab\3\u00ab\3\u00ab\5\u00ab\u06c8\n\u00ab\5\u00ab\u06ca\n\u00ab\3"+ + "\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\7\u00ac\u06d1\n\u00ac\f\u00ac\16"+ + "\u00ac\u06d4\13\u00ac\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u06d9\n\u00ad\3"+ + "\u00ad\3\u00ad\3\u00ae\3\u00ae\5\u00ae\u06df\n\u00ae\3\u00af\3\u00af\5"+ + "\u00af\u06e3\n\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\7\u00b0\u06ea"+ + "\n\u00b0\f\u00b0\16\u00b0\u06ed\13\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1"+ + "\3\u00b1\3\u00b1\5\u00b1\u06f5\n\u00b1\3\u00b1\5\u00b1\u06f8\n\u00b1\3"+ + "\u00b2\3\u00b2\3\u00b3\5\u00b3\u06fd\n\u00b3\3\u00b3\3\u00b3\3\u00b4\3"+ + "\u00b4\3\u00b4\3\u00b4\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b6"+ + "\3\u00b6\3\u00b6\3\u00b6\3\u00b6\5\u00b6\u070f\n\u00b6\5\u00b6\u0711\n"+ + "\u00b6\3\u00b6\5\u00b6\u0714\n\u00b6\3\u00b6\5\u00b6\u0717\n\u00b6\5\u00b6"+ + "\u0719\n\u00b6\3\u00b6\3\u00b6\3\u00b7\3\u00b7\3\u00b7\3\u00b7\3\u00b8"+ + "\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\5\u00b9\u0727\n\u00b9\3\u00b9"+ + "\3\u02dd\4\u00a4\u00b4\u00ba\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \""+ + "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084"+ + "\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c"+ + "\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4"+ + "\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc"+ + "\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4"+ + "\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc"+ + "\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114"+ + "\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c"+ + "\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144"+ + "\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c"+ + "\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\2\25\4\2"+ + "ffqq\3\2\31\32\3\2\7\n\3\2BC\3\2)+\4\2)+--\3\2\u0084\u008a\3\2\26\27\4"+ + "\2\177\u0083\u0088\u0089\6\2$$rr~~\u0085\u0087\3\2 \"\3\2\35\37\4\2IJ"+ + "x}\6\2..\61\61\64\64^^\4\2~\u0083\u0085\u0089\3\2rs\4\2oo\u00a0\u00a0"+ + "\4\2\u008b\u008e\u0090\u0091\3\2\u0097\u0098\2\u078c\2\u0172\3\2\2\2\4"+ + "\u0175\3\2\2\2\6\u0178\3\2\2\2\b\u017b\3\2\2\2\n\u0183\3\2\2\2\f\u018c"+ + "\3\2\2\2\16\u01a7\3\2\2\2\20\u01aa\3\2\2\2\22\u01b2\3\2\2\2\24\u01bf\3"+ + "\2\2\2\26\u01d5\3\2\2\2\30\u01de\3\2\2\2\32\u01e0\3\2\2\2\34\u01e2\3\2"+ + "\2\2\36\u01e5\3\2\2\2 \u01f9\3\2\2\2\"\u01fb\3\2\2\2$\u01fd\3\2\2\2&\u0202"+ + "\3\2\2\2(\u020d\3\2\2\2*\u021a\3\2\2\2,\u021d\3\2\2\2.\u0228\3\2\2\2\60"+ + "\u022a\3\2\2\2\62\u022f\3\2\2\2\64\u0234\3\2\2\2\66\u0239\3\2\2\28\u023e"+ + "\3\2\2\2:\u024b\3\2\2\2<\u024d\3\2\2\2>\u024f\3\2\2\2@\u0254\3\2\2\2B"+ + "\u0259\3\2\2\2D\u025e\3\2\2\2F\u0267\3\2\2\2H\u026e\3\2\2\2J\u0279\3\2"+ + "\2\2L\u027d\3\2\2\2N\u0288\3\2\2\2P\u0290\3\2\2\2R\u0292\3\2\2\2T\u02a7"+ + "\3\2\2\2V\u02a9\3\2\2\2X\u02b5\3\2\2\2Z\u02c1\3\2\2\2\\\u02d1\3\2\2\2"+ + "^\u02dd\3\2\2\2`\u02ec\3\2\2\2b\u02ef\3\2\2\2d\u02f7\3\2\2\2f\u02f9\3"+ + "\2\2\2h\u0304\3\2\2\2j\u030c\3\2\2\2l\u031b\3\2\2\2n\u031d\3\2\2\2p\u0325"+ + "\3\2\2\2r\u0333\3\2\2\2t\u033f\3\2\2\2v\u0349\3\2\2\2x\u034d\3\2\2\2z"+ + "\u0353\3\2\2\2|\u036b\3\2\2\2~\u0373\3\2\2\2\u0080\u0382\3\2\2\2\u0082"+ + "\u0384\3\2\2\2\u0084\u038b\3\2\2\2\u0086\u0394\3\2\2\2\u0088\u0399\3\2"+ + "\2\2\u008a\u039e\3\2\2\2\u008c\u03a4\3\2\2\2\u008e\u03ab\3\2\2\2\u0090"+ + "\u03b0\3\2\2\2\u0092\u03b6\3\2\2\2\u0094\u03bb\3\2\2\2\u0096\u03c2\3\2"+ + "\2\2\u0098\u03cc\3\2\2\2\u009a\u03d0\3\2\2\2\u009c\u03dc\3\2\2\2\u009e"+ + "\u03df\3\2\2\2\u00a0\u03e3\3\2\2\2\u00a2\u03ea\3\2\2\2\u00a4\u03fe\3\2"+ + "\2\2\u00a6\u043a\3\2\2\2\u00a8\u043c\3\2\2\2\u00aa\u043f\3\2\2\2\u00ac"+ + "\u0444\3\2\2\2\u00ae\u044d\3\2\2\2\u00b0\u045b\3\2\2\2\u00b2\u0465\3\2"+ + "\2\2\u00b4\u0473\3\2\2\2\u00b6\u048e\3\2\2\2\u00b8\u0491\3\2\2\2\u00ba"+ + "\u0499\3\2\2\2\u00bc\u04a2\3\2\2\2\u00be\u04b2\3\2\2\2\u00c0\u04c5\3\2"+ + "\2\2\u00c2\u04ce\3\2\2\2\u00c4\u04d9\3\2\2\2\u00c6\u04db\3\2\2\2\u00c8"+ + "\u04de\3\2\2\2\u00ca\u04f5\3\2\2\2\u00cc\u04f7\3\2\2\2\u00ce\u04fc\3\2"+ + "\2\2\u00d0\u0510\3\2\2\2\u00d2\u0512\3\2\2\2\u00d4\u0514\3\2\2\2\u00d6"+ + "\u0517\3\2\2\2\u00d8\u0521\3\2\2\2\u00da\u052b\3\2\2\2\u00dc\u052e\3\2"+ + "\2\2\u00de\u0533\3\2\2\2\u00e0\u0535\3\2\2\2\u00e2\u0543\3\2\2\2\u00e4"+ + "\u054b\3\2\2\2\u00e6\u0553\3\2\2\2\u00e8\u055b\3\2\2\2\u00ea\u0569\3\2"+ + "\2\2\u00ec\u056f\3\2\2\2\u00ee\u057d\3\2\2\2\u00f0\u0589\3\2\2\2\u00f2"+ + "\u0592\3\2\2\2\u00f4\u0594\3\2\2\2\u00f6\u0596\3\2\2\2\u00f8\u059a\3\2"+ + "\2\2\u00fa\u059d\3\2\2\2\u00fc\u05a1\3\2\2\2\u00fe\u05a3\3\2\2\2\u0100"+ + "\u05a8\3\2\2\2\u0102\u05ac\3\2\2\2\u0104\u05b0\3\2\2\2\u0106\u05b4\3\2"+ + "\2\2\u0108\u05b7\3\2\2\2\u010a\u05b9\3\2\2\2\u010c\u05ce\3\2\2\2\u010e"+ + "\u05d0\3\2\2\2\u0110\u05e6\3\2\2\2\u0112\u05ee\3\2\2\2\u0114\u05f0\3\2"+ + "\2\2\u0116\u0606\3\2\2\2\u0118\u060e\3\2\2\2\u011a\u0616\3\2\2\2\u011c"+ + "\u061a\3\2\2\2\u011e\u0626\3\2\2\2\u0120\u0630\3\2\2\2\u0122\u063b\3\2"+ + "\2\2\u0124\u0643\3\2\2\2\u0126\u0647\3\2\2\2\u0128\u0650\3\2\2\2\u012a"+ + "\u065a\3\2\2\2\u012c\u065f\3\2\2\2\u012e\u0661\3\2\2\2\u0130\u0666\3\2"+ + "\2\2\u0132\u0668\3\2\2\2\u0134\u066a\3\2\2\2\u0136\u066d\3\2\2\2\u0138"+ + "\u0671\3\2\2\2\u013a\u067c\3\2\2\2\u013c\u0680\3\2\2\2\u013e\u0687\3\2"+ + "\2\2\u0140\u068b\3\2\2\2\u0142\u068d\3\2\2\2\u0144\u069d\3\2\2\2\u0146"+ + "\u06aa\3\2\2\2\u0148\u06b2\3\2\2\2\u014a\u06b7\3\2\2\2\u014c\u06b9\3\2"+ + "\2\2\u014e\u06bb\3\2\2\2\u0150\u06bd\3\2\2\2\u0152\u06c1\3\2\2\2\u0154"+ + "\u06c4\3\2\2\2\u0156\u06cd\3\2\2\2\u0158\u06d8\3\2\2\2\u015a\u06de\3\2"+ + "\2\2\u015c\u06e2\3\2\2\2\u015e\u06e4\3\2\2\2\u0160\u06f4\3\2\2\2\u0162"+ + "\u06f9\3\2\2\2\u0164\u06fc\3\2\2\2\u0166\u0700\3\2\2\2\u0168\u0704\3\2"+ + "\2\2\u016a\u0709\3\2\2\2\u016c\u071c\3\2\2\2\u016e\u0720\3\2\2\2\u0170"+ + "\u0726\3\2\2\2\u0172\u0173\5\u00a4S\2\u0173\u0174\7\2\2\3\u0174\3\3\2"+ + "\2\2\u0175\u0176\5\u00a6T\2\u0176\u0177\7\2\2\3\u0177\5\3\2\2\2\u0178"+ + "\u0179\5\u00c2b\2\u0179\u017a\7\2\2\3\u017a\7\3\2\2\2\u017b\u0180\5\n"+ + "\6\2\u017c\u017d\7n\2\2\u017d\u017f\5\n\6\2\u017e\u017c\3\2\2\2\u017f"+ + "\u0182\3\2\2\2\u0180\u017e\3\2\2\2\u0180\u0181\3\2\2\2\u0181\t\3\2\2\2"+ + "\u0182\u0180\3\2\2\2\u0183\u0185\7f\2\2\u0184\u0186\7=\2\2\u0185\u0184"+ + "\3\2\2\2\u0185\u0186\3\2\2\2\u0186\13\3\2\2\2\u0187\u0188\5\16\b\2\u0188"+ + "\u0189\5\u0170\u00b9\2\u0189\u018b\3\2\2\2\u018a\u0187\3\2\2\2\u018b\u018e"+ + "\3\2\2\2\u018c\u018a\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u018f\3\2\2\2\u018e"+ + "\u018c\3\2\2\2\u018f\u0190\5\u00dan\2\u0190\u0196\5\u0170\u00b9\2\u0191"+ + "\u0192\5\24\13\2\u0192\u0193\5\u0170\u00b9\2\u0193\u0195\3\2\2\2\u0194"+ + "\u0191\3\2\2\2\u0195\u0198\3\2\2\2\u0196\u0194\3\2\2\2\u0196\u0197\3\2"+ + "\2\2\u0197\u01a2\3\2\2\2\u0198\u0196\3\2\2\2\u0199\u019d\5\u0088E\2\u019a"+ + "\u019d\5\u00dep\2\u019b\u019d\5\26\f\2\u019c\u0199\3\2\2\2\u019c\u019a"+ + "\3\2\2\2\u019c\u019b\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u019f\5\u0170\u00b9"+ + "\2\u019f\u01a1\3\2\2\2\u01a0\u019c\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0"+ + "\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a5\3\2\2\2\u01a4\u01a2\3\2\2\2\u01a5"+ + "\u01a6\7\2\2\3\u01a6\r\3\2\2\2\u01a7\u01a8\7F\2\2\u01a8\u01a9\5\u00a4"+ + "S\2\u01a9\17\3\2\2\2\u01aa\u01ab\7G\2\2\u01ab\u01ac\5\u00a4S\2\u01ac\21"+ + "\3\2\2\2\u01ad\u01ae\5\20\t\2\u01ae\u01af\5\u0170\u00b9\2\u01af\u01b1"+ + "\3\2\2\2\u01b0\u01ad\3\2\2\2\u01b1\u01b4\3\2\2\2\u01b2\u01b0\3\2\2\2\u01b2"+ + "\u01b3\3\2\2\2\u01b3\u01b6\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b5\u01b7\t\2"+ + "\2\2\u01b6\u01b5\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b8\3\2\2\2\u01b8"+ + "\u01b9\5\u00dco\2\u01b9\23\3\2\2\2\u01ba\u01bb\5\20\t\2\u01bb\u01bc\5"+ + "\u0170\u00b9\2\u01bc\u01be\3\2\2\2\u01bd\u01ba\3\2\2\2\u01be\u01c1\3\2"+ + "\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01cf\3\2\2\2\u01c1"+ + "\u01bf\3\2\2\2\u01c2\u01c3\7b\2\2\u01c3\u01d0\5\22\n\2\u01c4\u01c5\7b"+ + "\2\2\u01c5\u01cb\7g\2\2\u01c6\u01c7\5\22\n\2\u01c7\u01c8\5\u0170\u00b9"+ + "\2\u01c8\u01ca\3\2\2\2\u01c9\u01c6\3\2\2\2\u01ca\u01cd\3\2\2\2\u01cb\u01c9"+ + "\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01ce\3\2\2\2\u01cd\u01cb\3\2\2\2\u01ce"+ + "\u01d0\7h\2\2\u01cf\u01c2\3\2\2\2\u01cf\u01c4\3\2\2\2\u01d0\25\3\2\2\2"+ + "\u01d1\u01d6\5z>\2\u01d2\u01d6\5\u0090I\2\u01d3\u01d6\5\u0094K\2\u01d4"+ + "\u01d6\5\u008eH\2\u01d5\u01d1\3\2\2\2\u01d5\u01d2\3\2\2\2\u01d5\u01d3"+ + "\3\2\2\2\u01d5\u01d4\3\2\2\2\u01d6\27\3\2\2\2\u01d7\u01d8\7\34\2\2\u01d8"+ + "\u01df\5\u00a6T\2\u01d9\u01da\t\3\2\2\u01da\u01df\5.\30\2\u01db\u01dc"+ + "\t\4\2\2\u01dc\u01df\5\u00a4S\2\u01dd\u01df\5f\64\2\u01de\u01d7\3\2\2"+ + "\2\u01de\u01d9\3\2\2\2\u01de\u01db\3\2\2\2\u01de\u01dd\3\2\2\2\u01df\31"+ + "\3\2\2\2\u01e0\u01e1\5\34\17\2\u01e1\33\3\2\2\2\u01e2\u01e3\5^\60\2\u01e3"+ + "\u01e4\5\36\20\2\u01e4\35\3\2\2\2\u01e5\u01e6\7E\2\2\u01e6\u01e8\7g\2"+ + "\2\u01e7\u01e9\5\u00f0y\2\u01e8\u01e7\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9"+ + "\u01ea\3\2\2\2\u01ea\u01eb\7h\2\2\u01eb\37\3\2\2\2\u01ec\u01fa\5F$\2\u01ed"+ + "\u01fa\5D#\2\u01ee\u01fa\5B\"\2\u01ef\u01fa\5$\23\2\u01f0\u01fa\5@!\2"+ + "\u01f1\u01fa\58\35\2\u01f2\u01fa\5> \2\u01f3\u01fa\5\66\34\2\u01f4\u01fa"+ + "\5\62\32\2\u01f5\u01fa\5\60\31\2\u01f6\u01fa\5\64\33\2\u01f7\u01fa\5\""+ + "\22\2\u01f8\u01fa\5H%\2\u01f9\u01ec\3\2\2\2\u01f9\u01ed\3\2\2\2\u01f9"+ + "\u01ee\3\2\2\2\u01f9\u01ef\3\2\2\2\u01f9\u01f0\3\2\2\2\u01f9\u01f1\3\2"+ + "\2\2\u01f9\u01f2\3\2\2\2\u01f9\u01f3\3\2\2\2\u01f9\u01f4\3\2\2\2\u01f9"+ + "\u01f5\3\2\2\2\u01f9\u01f6\3\2\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01f8\3\2"+ + "\2\2\u01fa!\3\2\2\2\u01fb\u01fc\t\5\2\2\u01fc#\3\2\2\2\u01fd\u01fe\7_"+ + "\2\2\u01fe\u01ff\7k\2\2\u01ff\u0200\5\u00c2b\2\u0200\u0201\7l\2\2\u0201"+ + "%\3\2\2\2\u0202\u0207\5(\25\2\u0203\u0204\7n\2\2\u0204\u0206\5(\25\2\u0205"+ + "\u0203\3\2\2\2\u0206\u0209\3\2\2\2\u0207\u0205\3\2\2\2\u0207\u0208\3\2"+ + "\2\2\u0208\u020b\3\2\2\2\u0209\u0207\3\2\2\2\u020a\u020c\7n\2\2\u020b"+ + "\u020a\3\2\2\2\u020b\u020c\3\2\2\2\u020c\'\3\2\2\2\u020d\u0212\7f\2\2"+ + "\u020e\u020f\7n\2\2\u020f\u0211\7f\2\2\u0210\u020e\3\2\2\2\u0211\u0214"+ + "\3\2\2\2\u0212\u0210\3\2\2\2\u0212\u0213\3\2\2\2\u0213\u0215\3\2\2\2\u0214"+ + "\u0212\3\2\2\2\u0215\u0216\5\u0132\u009a\2\u0216)\3\2\2\2\u0217\u0219"+ + "\5,\27\2\u0218\u0217\3\2\2\2\u0219\u021c\3\2\2\2\u021a\u0218\3\2\2\2\u021a"+ + "\u021b\3\2\2\2\u021b+\3\2\2\2\u021c\u021a\3\2\2\2\u021d\u021e\7i\2\2\u021e"+ + "\u0223\5\u00a4S\2\u021f\u0220\7n\2\2\u0220\u0222\5\u00a4S\2\u0221\u021f"+ + "\3\2\2\2\u0222\u0225\3\2\2\2\u0223\u0221\3\2\2\2\u0223\u0224\3\2\2\2\u0224"+ + "\u0226\3\2\2\2\u0225\u0223\3\2\2\2\u0226\u0227\7j\2\2\u0227-\3\2\2\2\u0228"+ + "\u0229\5\u00b4[\2\u0229/\3\2\2\2\u022a\u022b\7\62\2\2\u022b\u022c\7g\2"+ + "\2\u022c\u022d\5\u00a4S\2\u022d\u022e\7h\2\2\u022e\61\3\2\2\2\u022f\u0230"+ + "\78\2\2\u0230\u0231\7k\2\2\u0231\u0232\5\u00c2b\2\u0232\u0233\7l\2\2\u0233"+ + "\63\3\2\2\2\u0234\u0235\7\63\2\2\u0235\u0236\7g\2\2\u0236\u0237\5\u00a4"+ + "S\2\u0237\u0238\7h\2\2\u0238\65\3\2\2\2\u0239\u023a\t\6\2\2\u023a\u023b"+ + "\7g\2\2\u023b\u023c\5\u00a4S\2\u023c\u023d\7h\2\2\u023d\67\3\2\2\2\u023e"+ + "\u0243\7\23\2\2\u023f\u0240\7k\2\2\u0240\u0241\5:\36\2\u0241\u0242\7l"+ + "\2\2\u0242\u0244\3\2\2\2\u0243\u023f\3\2\2\2\u0243\u0244\3\2\2\2\u0244"+ + "\u0245\3\2\2\2\u0245\u0246\7g\2\2\u0246\u0247\5\u00a4S\2\u0247\u0248\7"+ + "h\2\2\u02489\3\2\2\2\u0249\u024c\5<\37\2\u024a\u024c\7\25\2\2\u024b\u0249"+ + "\3\2\2\2\u024b\u024a\3\2\2\2\u024c;\3\2\2\2\u024d\u024e\7f\2\2\u024e="+ + "\3\2\2\2\u024f\u0250\7\24\2\2\u0250\u0251\7g\2\2\u0251\u0252\5\u00a4S"+ + "\2\u0252\u0253\7h\2\2\u0253?\3\2\2\2\u0254\u0255\7;\2\2\u0255\u0256\7"+ + "g\2\2\u0256\u0257\5\u00a4S\2\u0257\u0258\7h\2\2\u0258A\3\2\2\2\u0259\u025a"+ + "\7:\2\2\u025a\u025b\7g\2\2\u025b\u025c\5\u00a4S\2\u025c\u025d\7h\2\2\u025d"+ + "C\3\2\2\2\u025e\u025f\7\30\2\2\u025f\u0260\7g\2\2\u0260\u0263\5\u00a4"+ + "S\2\u0261\u0262\7n\2\2\u0262\u0264\5\u00a4S\2\u0263\u0261\3\2\2\2\u0263"+ + "\u0264\3\2\2\2\u0264\u0265\3\2\2\2\u0265\u0266\7h\2\2\u0266E\3\2\2\2\u0267"+ + "\u0268\t\6\2\2\u0268\u0269\7k\2\2\u0269\u026a\5\u00a4S\2\u026a\u026b\7"+ + ">\2\2\u026b\u026c\5\u00a4S\2\u026c\u026d\7l\2\2\u026dG\3\2\2\2\u026e\u026f"+ + "\7\67\2\2\u026f\u0270\5\u00a4S\2\u0270\u0274\7i\2\2\u0271\u0273\5J&\2"+ + "\u0272\u0271\3\2\2\2\u0273\u0276\3\2\2\2\u0274\u0272\3\2\2\2\u0274\u0275"+ + "\3\2\2\2\u0275\u0277\3\2\2\2\u0276\u0274\3\2\2\2\u0277\u0278\7j\2\2\u0278"+ + "I\3\2\2\2\u0279\u027a\5j\66\2\u027a\u027b\7p\2\2\u027b\u027c\5\u00a4S"+ + "\2\u027cK\3\2\2\2\u027d\u027e\7k\2\2\u027e\u0283\5N(\2\u027f\u0280\7n"+ + "\2\2\u0280\u0282\5N(\2\u0281\u027f\3\2\2\2\u0282\u0285\3\2\2\2\u0283\u0281"+ + "\3\2\2\2\u0283\u0284\3\2\2\2\u0284\u0286\3\2\2\2\u0285\u0283\3\2\2\2\u0286"+ + "\u0287\7l\2\2\u0287M\3\2\2\2\u0288\u0289\5\u00a4S\2\u0289\u028a\7m\2\2"+ + "\u028a\u028b\5\u00a4S\2\u028bO\3\2\2\2\u028c\u0291\5\\/\2\u028d\u0291"+ + "\5Z.\2\u028e\u0291\5R*\2\u028f\u0291\5V,\2\u0290\u028c\3\2\2\2\u0290\u028d"+ + "\3\2\2\2\u0290\u028e\3\2\2\2\u0290\u028f\3\2\2\2\u0291Q\3\2\2\2\u0292"+ + "\u0293\7\64\2\2\u0293\u0299\7i\2\2\u0294\u0295\5T+\2\u0295\u0296\5\u0170"+ + "\u00b9\2\u0296\u0298\3\2\2\2\u0297\u0294\3\2\2\2\u0298\u029b\3\2\2\2\u0299"+ + "\u0297\3\2\2\2\u0299\u029a\3\2\2\2\u029a\u029c\3\2\2\2\u029b\u0299\3\2"+ + "\2\2\u029c\u029d\7j\2\2\u029dS\3\2\2\2\u029e\u029f\7N\2\2\u029f\u02a0"+ + "\7f\2\2\u02a0\u02a8\5\u013e\u00a0\2\u02a1\u02a2\7\65\2\2\u02a2\u02a3\7"+ + "i\2\2\u02a3\u02a4\5\u00a4S\2\u02a4\u02a5\5\u0170\u00b9\2\u02a5\u02a6\7"+ + "j\2\2\u02a6\u02a8\3\2\2\2\u02a7\u029e\3\2\2\2\u02a7\u02a1\3\2\2\2\u02a8"+ + "U\3\2\2\2\u02a9\u02aa\7\66\2\2\u02aa\u02b0\7i\2\2\u02ab\u02ac\5X-\2\u02ac"+ + "\u02ad\5\u0170\u00b9\2\u02ad\u02af\3\2\2\2\u02ae\u02ab\3\2\2\2\u02af\u02b2"+ + "\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b0\u02b1\3\2\2\2\u02b1\u02b3\3\2\2\2\u02b2"+ + "\u02b0\3\2\2\2\u02b3\u02b4\7j\2\2\u02b4W\3\2\2\2\u02b5\u02b6\7f\2\2\u02b6"+ + "\u02bc\7i\2\2\u02b7\u02b8\5\u0160\u00b1\2\u02b8\u02b9\5\u0170\u00b9\2"+ + "\u02b9\u02bb\3\2\2\2\u02ba\u02b7\3\2\2\2\u02bb\u02be\3\2\2\2\u02bc\u02ba"+ + "\3\2\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02bf\3\2\2\2\u02be\u02bc\3\2\2\2\u02bf"+ + "\u02c0\7j\2\2\u02c0Y\3\2\2\2\u02c1\u02c2\7\34\2\2\u02c2\u02c3\7k\2\2\u02c3"+ + "\u02c4\7l\2\2\u02c4\u02c5\5\u0132\u009a\2\u02c5[\3\2\2\2\u02c6\u02c7\t"+ + "\7\2\2\u02c7\u02c8\7k\2\2\u02c8\u02c9\5\u00c2b\2\u02c9\u02ca\7l\2\2\u02ca"+ + "\u02d2\3\2\2\2\u02cb\u02cc\7,\2\2\u02cc\u02cd\7k\2\2\u02cd\u02ce\5\u00c2"+ + "b\2\u02ce\u02cf\7l\2\2\u02cf\u02d0\5\u00c2b\2\u02d0\u02d2\3\2\2\2\u02d1"+ + "\u02c6\3\2\2\2\u02d1\u02cb\3\2\2\2\u02d2]\3\2\2\2\u02d3\u02d9\5`\61\2"+ + "\u02d4\u02d5\7\20\2\2\u02d5\u02d9\b\60\1\2\u02d6\u02d7\7D\2\2\u02d7\u02d9"+ + "\b\60\1\2\u02d8\u02d3\3\2\2\2\u02d8\u02d4\3\2\2\2\u02d8\u02d6\3\2\2\2"+ + "\u02d9\u02da\3\2\2\2\u02da\u02dc\5\u0170\u00b9\2\u02db\u02d8\3\2\2\2\u02dc"+ + "\u02df\3\2\2\2\u02dd\u02de\3\2\2\2\u02dd\u02db\3\2\2\2\u02de\u02e2\3\2"+ + "\2\2\u02df\u02dd\3\2\2\2\u02e0\u02e1\7\20\2\2\u02e1\u02e3\b\60\1\2\u02e2"+ + "\u02e0\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3_\3\2\2\2\u02e4\u02e5\7\13\2\2"+ + "\u02e5\u02ed\5d\63\2\u02e6\u02e7\7\f\2\2\u02e7\u02ed\5d\63\2\u02e8\u02e9"+ + "\7\r\2\2\u02e9\u02ed\5d\63\2\u02ea\u02eb\7\17\2\2\u02eb\u02ed\5b\62\2"+ + "\u02ec\u02e4\3\2\2\2\u02ec\u02e6\3\2\2\2\u02ec\u02e8\3\2\2\2\u02ec\u02ea"+ + "\3\2\2\2\u02eda\3\2\2\2\u02ee\u02f0\5\u00e6t\2\u02ef\u02ee\3\2\2\2\u02ef"+ + "\u02f0\3\2\2\2\u02f0\u02f3\3\2\2\2\u02f1\u02f2\7]\2\2\u02f2\u02f4\5\u00a4"+ + "S\2\u02f3\u02f1\3\2\2\2\u02f3\u02f4\3\2\2\2\u02f4c\3\2\2\2\u02f5\u02f8"+ + "\3\2\2\2\u02f6\u02f8\5\u00a4S\2\u02f7\u02f5\3\2\2\2\u02f7\u02f6\3\2\2"+ + "\2\u02f8e\3\2\2\2\u02f9\u02fa\7\67\2\2\u02fa\u02fb\5\u00a4S\2\u02fb\u02ff"+ + "\7i\2\2\u02fc\u02fe\5h\65\2\u02fd\u02fc\3\2\2\2\u02fe\u0301\3\2\2\2\u02ff"+ + "\u02fd\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u0302\3\2\2\2\u0301\u02ff\3\2"+ + "\2\2\u0302\u0303\7j\2\2\u0303g\3\2\2\2\u0304\u0305\5j\66\2\u0305\u0307"+ + "\7p\2\2\u0306\u0308\5\u00f0y\2\u0307\u0306\3\2\2\2\u0307\u0308\3\2\2\2"+ + "\u0308i\3\2\2\2\u0309\u030a\7Q\2\2\u030a\u030d\5l\67\2\u030b\u030d\7M"+ + "\2\2\u030c\u0309\3\2\2\2\u030c\u030b\3\2\2\2\u030dk\3\2\2\2\u030e\u030f"+ + "\7&\2\2\u030f\u031c\7f\2\2\u0310\u0311\5\u00caf\2\u0311\u0316\7i\2\2\u0312"+ + "\u0314\5n8\2\u0313\u0315\7n\2\2\u0314\u0313\3\2\2\2\u0314\u0315\3\2\2"+ + "\2\u0315\u0317\3\2\2\2\u0316\u0312\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u0318"+ + "\3\2\2\2\u0318\u0319\7j\2\2\u0319\u031c\3\2\2\2\u031a\u031c\5\u00a4S\2"+ + "\u031b\u030e\3\2\2\2\u031b\u0310\3\2\2\2\u031b\u031a\3\2\2\2\u031cm\3"+ + "\2\2\2\u031d\u0322\5l\67\2\u031e\u031f\7n\2\2\u031f\u0321\5l\67\2\u0320"+ + "\u031e\3\2\2\2\u0321\u0324\3\2\2\2\u0322\u0320\3\2\2\2\u0322\u0323\3\2"+ + "\2\2\u0323o\3\2\2\2\u0324\u0322\3\2\2\2\u0325\u032a\7i\2\2\u0326\u0327"+ + "\7<\2\2\u0327\u0328\5\u00e4s\2\u0328\u0329\5\u0170\u00b9\2\u0329\u032b"+ + "\3\2\2\2\u032a\u0326\3\2\2\2\u032a\u032b\3\2\2\2\u032b\u032d\3\2\2\2\u032c"+ + "\u032e\5\u00f0y\2\u032d\u032c\3\2\2\2\u032d\u032e\3\2\2\2\u032e\u032f"+ + "\3\2\2\2\u032f\u0330\7j\2\2\u0330q\3\2\2\2\u0331\u0334\5\u0150\u00a9\2"+ + "\u0332\u0334\7f\2\2\u0333\u0331\3\2\2\2\u0333\u0332\3\2\2\2\u0334\u033d"+ + "\3\2\2\2\u0335\u033a\7i\2\2\u0336\u0338\5t;\2\u0337\u0339\7n\2\2\u0338"+ + "\u0337\3\2\2\2\u0338\u0339\3\2\2\2\u0339\u033b\3\2\2\2\u033a\u0336\3\2"+ + "\2\2\u033a\u033b\3\2\2\2\u033b\u033c\3\2\2\2\u033c\u033e\7j\2\2\u033d"+ + "\u0335\3\2\2\2\u033d\u033e\3\2\2\2\u033es\3\2\2\2\u033f\u0344\5v<\2\u0340"+ + "\u0341\7n\2\2\u0341\u0343\5v<\2\u0342\u0340\3\2\2\2\u0343\u0346\3\2\2"+ + "\2\u0344\u0342\3\2\2\2\u0344\u0345\3\2\2\2\u0345u\3\2\2\2\u0346\u0344"+ + "\3\2\2\2\u0347\u0348\7f\2\2\u0348\u034a\7p\2\2\u0349\u0347\3\2\2\2\u0349"+ + "\u034a\3\2\2\2\u034a\u034b\3\2\2\2\u034b\u034c\5\u00a4S\2\u034cw\3\2\2"+ + "\2\u034d\u034e\7H\2\2\u034e\u034f\5\u00a4S\2\u034f\u0350\7\21\2\2\u0350"+ + "\u0351\5r:\2\u0351\u0352\5\u00eex\2\u0352y\3\2\2\2\u0353\u0354\5\u00c2"+ + "b\2\u0354\u0355\7\21\2\2\u0355\u0368\5\u00c2b\2\u0356\u035c\7i\2\2\u0357"+ + "\u0358\5\u0082B\2\u0358\u0359\5\u0170\u00b9\2\u0359\u035b\3\2\2\2\u035a"+ + "\u0357\3\2\2\2\u035b\u035e\3\2\2\2\u035c\u035a\3\2\2\2\u035c\u035d\3\2"+ + "\2\2\u035d\u0364\3\2\2\2\u035e\u035c\3\2\2\2\u035f\u0360\5|?\2\u0360\u0361"+ + "\5\u0170\u00b9\2\u0361\u0363\3\2\2\2\u0362\u035f\3\2\2\2\u0363\u0366\3"+ + "\2\2\2\u0364\u0362\3\2\2\2\u0364\u0365\3\2\2\2\u0365\u0367\3\2\2\2\u0366"+ + "\u0364\3\2\2\2\u0367\u0369\7j\2\2\u0368\u0356\3\2\2\2\u0368\u0369\3\2"+ + "\2\2\u0369{\3\2\2\2\u036a\u036c\7\20\2\2\u036b\u036a\3\2\2\2\u036b\u036c"+ + "\3\2\2\2\u036c\u036d\3\2\2\2\u036d\u036e\5~@\2\u036e\u036f\7f\2\2\u036f"+ + "\u0371\5\u013e\u00a0\2\u0370\u0372\5\u00eex\2\u0371\u0370\3\2\2\2\u0371"+ + "\u0372\3\2\2\2\u0372}\3\2\2\2\u0373\u0375\7g\2\2\u0374\u0376\7f\2\2\u0375"+ + "\u0374\3\2\2\2\u0375\u0376\3\2\2\2\u0376\u0378\3\2\2\2\u0377\u0379\7\u0088"+ + "\2\2\u0378\u0377\3\2\2\2\u0378\u0379\3\2\2\2\u0379\u037a\3\2\2\2\u037a"+ + "\u037b\5\u012c\u0097\2\u037b\u037c\7h\2\2\u037c\177\3\2\2\2\u037d\u0383"+ + "\5\u00b4[\2\u037e\u037f\5\u00c2b\2\u037f\u0380\7q\2\2\u0380\u0381\7f\2"+ + "\2\u0381\u0383\3\2\2\2\u0382\u037d\3\2\2\2\u0382\u037e\3\2\2\2\u0383\u0081"+ + "\3\2\2\2\u0384\u0385\79\2\2\u0385\u0386\7f\2\2\u0386\u0389\7t\2\2\u0387"+ + "\u038a\5\u0080A\2\u0388\u038a\5\u014e\u00a8\2\u0389\u0387\3\2\2\2\u0389"+ + "\u0388\3\2\2\2\u038a\u0083\3\2\2\2\u038b\u038c\7\60\2\2\u038c\u038d\7"+ + "g\2\2\u038d\u0390\5\u00c2b\2\u038e\u038f\7n\2\2\u038f\u0391\5\u00e6t\2"+ + "\u0390\u038e\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0392\3\2\2\2\u0392\u0393"+ + "\7h\2\2\u0393\u0085\3\2\2\2\u0394\u0395\7/\2\2\u0395\u0396\7g\2\2\u0396"+ + "\u0397\5\u00c2b\2\u0397\u0398\7h\2\2\u0398\u0087\3\2\2\2\u0399\u039c\5"+ + "^\60\2\u039a\u039d\5\u008aF\2\u039b\u039d\5\u008cG\2\u039c\u039a\3\2\2"+ + "\2\u039c\u039b\3\2\2\2\u039d\u0089\3\2\2\2\u039e\u039f\7N\2\2\u039f\u03a0"+ + "\7f\2\2\u03a0\u03a2\5\u013e\u00a0\2\u03a1\u03a3\5p9\2\u03a2\u03a1\3\2"+ + "\2\2\u03a2\u03a3\3\2\2\2\u03a3\u008b\3\2\2\2\u03a4\u03a5\7N\2\2\u03a5"+ + "\u03a6\5\u009aN\2\u03a6\u03a7\7f\2\2\u03a7\u03a9\5\u013e\u00a0\2\u03a8"+ + "\u03aa\5p9\2\u03a9\u03a8\3\2\2\2\u03a9\u03aa\3\2\2\2\u03aa\u008d\3\2\2"+ + "\2\u03ab\u03ae\7\34\2\2\u03ac\u03af\5\u0088E\2\u03ad\u03af\5\u00dep\2"+ + "\u03ae\u03ac\3\2\2\2\u03ae\u03ad\3\2\2\2\u03af\u008f\3\2\2\2\u03b0\u03b1"+ + "\79\2\2\u03b1\u03b2\7f\2\2\u03b2\u03b4\5\u0142\u00a2\2\u03b3\u03b5\5\u0092"+ + "J\2\u03b4\u03b3\3\2\2\2\u03b4\u03b5\3\2\2\2\u03b5\u0091\3\2\2\2\u03b6"+ + "\u03b7\7i\2\2\u03b7\u03b8\5\u00a4S\2\u03b8\u03b9\5\u0170\u00b9\2\u03b9"+ + "\u03ba\7j\2\2\u03ba\u0093\3\2\2\2\u03bb\u03bc\79\2\2\u03bc\u03bd\5\u009a"+ + "N\2\u03bd\u03be\7f\2\2\u03be\u03c0\5\u0142\u00a2\2\u03bf\u03c1\5\u0092"+ + "J\2\u03c0\u03bf\3\2\2\2\u03c0\u03c1\3\2\2\2\u03c1\u0095\3\2\2\2\u03c2"+ + "\u03ca\5\b\5\2\u03c3\u03c6\5\u00c2b\2\u03c4\u03c5\7m\2\2\u03c5\u03c7\5"+ + "\u00e6t\2\u03c6\u03c4\3\2\2\2\u03c6\u03c7\3\2\2\2\u03c7\u03cb\3\2\2\2"+ + "\u03c8\u03c9\7m\2\2\u03c9\u03cb\5\u00e6t\2\u03ca\u03c3\3\2\2\2\u03ca\u03c8"+ + "\3\2\2\2\u03cb\u0097\3\2\2\2\u03cc\u03cd\5\b\5\2\u03cd\u03ce\7t\2\2\u03ce"+ + "\u03cf\5\u00e6t\2\u03cf\u0099\3\2\2\2\u03d0\u03d2\7g\2\2\u03d1\u03d3\5"+ + "\n\6\2\u03d2\u03d1\3\2\2\2\u03d2\u03d3\3\2\2\2\u03d3\u03d4\3\2\2\2\u03d4"+ + "\u03d6\5\u00c2b\2\u03d5\u03d7\7n\2\2\u03d6\u03d5\3\2\2\2\u03d6\u03d7\3"+ + "\2\2\2\u03d7\u03d8\3\2\2\2\u03d8\u03d9\7h\2\2\u03d9\u009b\3\2\2\2\u03da"+ + "\u03dd\5\u009eP\2\u03db\u03dd\5\u00a0Q\2\u03dc\u03da\3\2\2\2\u03dc\u03db"+ + "\3\2\2\2\u03dd\u009d\3\2\2\2\u03de\u03e0\5\u00e4s\2\u03df\u03de\3\2\2"+ + "\2\u03df\u03e0\3\2\2\2\u03e0\u03e1\3\2\2\2\u03e1\u03e2\5\u00a2R\2\u03e2"+ + "\u009f\3\2\2\2\u03e3\u03e5\7\34\2\2\u03e4\u03e6\5\u00e4s\2\u03e5\u03e4"+ + "\3\2\2\2\u03e5\u03e6\3\2\2\2\u03e6\u03e7\3\2\2\2\u03e7\u03e8\5\u00a2R"+ + "\2\u03e8\u00a1\3\2\2\2\u03e9\u03eb\7u\2\2\u03ea\u03e9\3\2\2\2\u03ea\u03eb"+ + "\3\2\2\2\u03eb\u03ec\3\2\2\2\u03ec\u03ed\5\u00c2b\2\u03ed\u00a3\3\2\2"+ + "\2\u03ee\u03ef\bS\1\2\u03ef\u03f0\t\b\2\2\u03f0\u03ff\5\u00a4S\20\u03f1"+ + "\u03ff\5\u00b4[\2\u03f2\u03f3\7\33\2\2\u03f3\u03f4\5.\30\2\u03f4\u03f5"+ + "\7\35\2\2\u03f5\u03f6\5\u00a4S\4\u03f6\u03ff\3\2\2\2\u03f7\u03f8\t\t\2"+ + "\2\u03f8\u03f9\5&\24\2\u03f9\u03fa\7p\2\2\u03fa\u03fb\7p\2\2\u03fb\u03fc"+ + "\5*\26\2\u03fc\u03fd\5\u00a4S\3\u03fd\u03ff\3\2\2\2\u03fe\u03ee\3\2\2"+ + "\2\u03fe\u03f1\3\2\2\2\u03fe\u03f2\3\2\2\2\u03fe\u03f7\3\2\2\2\u03ff\u0423"+ + "\3\2\2\2\u0400\u0401\f\16\2\2\u0401\u0402\t\n\2\2\u0402\u0422\5\u00a4"+ + "S\17\u0403\u0404\f\r\2\2\u0404\u0405\t\13\2\2\u0405\u0422\5\u00a4S\16"+ + "\u0406\u0407\f\f\2\2\u0407\u0408\t\f\2\2\u0408\u0422\5\u00a4S\r\u0409"+ + "\u040a\f\13\2\2\u040a\u040b\t\r\2\2\u040b\u0422\5\u00a4S\f\u040c\u040d"+ + "\f\n\2\2\u040d\u040e\t\16\2\2\u040e\u0422\5\u00a4S\13\u040f\u0410\f\b"+ + "\2\2\u0410\u0411\7w\2\2\u0411\u0422\5\u00a4S\t\u0412\u0413\f\7\2\2\u0413"+ + "\u0414\7v\2\2\u0414\u0422\5\u00a4S\b\u0415\u0416\f\6\2\2\u0416\u0417\7"+ + "#\2\2\u0417\u0422\5\u00a4S\6\u0418\u0419\f\5\2\2\u0419\u041a\7&\2\2\u041a"+ + "\u041b\5\u00a4S\2\u041b\u041c\7p\2\2\u041c\u041d\5\u00a4S\5\u041d\u0422"+ + "\3\2\2\2\u041e\u041f\f\t\2\2\u041f\u0420\7\21\2\2\u0420\u0422\5r:\2\u0421"+ + "\u0400\3\2\2\2\u0421\u0403\3\2\2\2\u0421\u0406\3\2\2\2\u0421\u0409\3\2"+ + "\2\2\u0421\u040c\3\2\2\2\u0421\u040f\3\2\2\2\u0421\u0412\3\2\2\2\u0421"+ + "\u0415\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041e\3\2\2\2\u0422\u0425\3\2"+ + "\2\2\u0423\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u00a5\3\2\2\2\u0425"+ + "\u0423\3\2\2\2\u0426\u043b\5\30\r\2\u0427\u043b\5\32\16\2\u0428\u043b"+ + "\5\u00aaV\2\u0429\u043b\5\u00a8U\2\u042a\u043b\5\u00dep\2\u042b\u043b"+ + "\5\u00fe\u0080\2\u042c\u043b\5\u00f2z\2\u042d\u043b\5\u012a\u0096\2\u042e"+ + "\u043b\5\u0100\u0081\2\u042f\u043b\5\u0102\u0082\2\u0430\u043b\5\u0104"+ + "\u0083\2\u0431\u043b\5\u0106\u0084\2\u0432\u043b\5\u0108\u0085\2\u0433"+ + "\u043b\5\u00eex\2\u0434\u043b\5\u010a\u0086\2\u0435\u043b\5\u010c\u0087"+ + "\2\u0436\u043b\5\u011e\u0090\2\u0437\u043b\5\u00acW\2\u0438\u043b\5\u00b0"+ + "Y\2\u0439\u043b\5x=\2\u043a\u0426\3\2\2\2\u043a\u0427\3\2\2\2\u043a\u0428"+ + "\3\2\2\2\u043a\u0429\3\2\2\2\u043a\u042a\3\2\2\2\u043a\u042b\3\2\2\2\u043a"+ + "\u042c\3\2\2\2\u043a\u042d\3\2\2\2\u043a\u042e\3\2\2\2\u043a\u042f\3\2"+ + "\2\2\u043a\u0430\3\2\2\2\u043a\u0431\3\2\2\2\u043a\u0432\3\2\2\2\u043a"+ + "\u0433\3\2\2\2\u043a\u0434\3\2\2\2\u043a\u0435\3\2\2\2\u043a\u0436\3\2"+ + "\2\2\u043a\u0437\3\2\2\2\u043a\u0438\3\2\2\2\u043a\u0439\3\2\2\2\u043b"+ + "\u00a7\3\2\2\2\u043c\u043d\7%\2\2\u043d\u043e\5\u00a4S\2\u043e\u00a9\3"+ + "\2\2\2\u043f\u0440\7Y\2\2\u0440\u0442\5\u00a4S\2\u0441\u0443\5\u00eex"+ + "\2\u0442\u0441\3\2\2\2\u0442\u0443\3\2\2\2\u0443\u00ab\3\2\2\2\u0444\u0445"+ + "\5\u00aeX\2\u0445\u0446\5\u0126\u0094\2\u0446\u00ad\3\2\2\2\u0447\u0448"+ + "\7\16\2\2\u0448\u0449\5\u00a4S\2\u0449\u044a\5\u0170\u00b9\2\u044a\u044c"+ + "\3\2\2\2\u044b\u0447\3\2\2\2\u044c\u044f\3\2\2\2\u044d\u044b\3\2\2\2\u044d"+ + "\u044e\3\2\2\2\u044e\u0454\3\2\2\2\u044f\u044d\3\2\2\2\u0450\u0451\7\17"+ + "\2\2\u0451\u0452\5b\62\2\u0452\u0453\5\u0170\u00b9\2\u0453\u0455\3\2\2"+ + "\2\u0454\u0450\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u00af\3\2\2\2\u0456\u0457"+ + "\7R\2\2\u0457\u045c\5\u00a4S\2\u0458\u0459\7R\2\2\u0459\u045a\t\3\2\2"+ + "\u045a\u045c\5.\30\2\u045b\u0456\3\2\2\2\u045b\u0458\3\2\2\2\u045c\u00b1"+ + "\3\2\2\2\u045d\u0466\7\5\2\2\u045e\u0466\7\6\2\2\u045f\u0466\7e\2\2\u0460"+ + "\u0466\5\u014c\u00a7\2\u0461\u0466\5\u0162\u00b2\2\u0462\u0466\7\3\2\2"+ + "\u0463\u0466\7\u0090\2\2\u0464\u0466\7\u0091\2\2\u0465\u045d\3\2\2\2\u0465"+ + "\u045e\3\2\2\2\u0465\u045f\3\2\2\2\u0465\u0460\3\2\2\2\u0465\u0461\3\2"+ + "\2\2\u0465\u0462\3\2\2\2\u0465\u0463\3\2\2\2\u0465\u0464\3\2\2\2\u0466"+ + "\u00b3\3\2\2\2\u0467\u0468\b[\1\2\u0468\u0474\5\u0148\u00a5\2\u0469\u0474"+ + "\5\u0144\u00a3\2\u046a\u0474\5\u016c\u00b7\2\u046b\u0474\5 \21\2\u046c"+ + "\u0474\5\u0086D\2\u046d\u0474\5\u0084C\2\u046e\u046f\t\17\2\2\u046f\u0470"+ + "\7g\2\2\u0470\u0471\5\u00a4S\2\u0471\u0472\7h\2\2\u0472\u0474\3\2\2\2"+ + "\u0473\u0467\3\2\2\2\u0473\u0469\3\2\2\2\u0473\u046a\3\2\2\2\u0473\u046b"+ + "\3\2\2\2\u0473\u046c\3\2\2\2\u0473\u046d\3\2\2\2\u0473\u046e\3\2\2\2\u0474"+ + "\u048b\3\2\2\2\u0475\u0476\f\13\2\2\u0476\u0477\7q\2\2\u0477\u048a\7f"+ + "\2\2\u0478\u0479\f\n\2\2\u0479\u048a\5\u0166\u00b4\2\u047a\u047b\f\t\2"+ + "\2\u047b\u048a\5\u00ceh\2\u047c\u047d\f\b\2\2\u047d\u048a\5L\'\2\u047e"+ + "\u047f\f\7\2\2\u047f\u048a\5\u0168\u00b5\2\u0480\u0481\f\6\2\2\u0481\u048a"+ + "\5\u016a\u00b6\2\u0482\u0483\f\5\2\2\u0483\u0484\5\u016a\u00b6\2\u0484"+ + "\u0485\7\22\2\2\u0485\u0486\5r:\2\u0486\u048a\3\2\2\2\u0487\u0488\f\4"+ + "\2\2\u0488\u048a\5\u00ba^\2\u0489\u0475\3\2\2\2\u0489\u0478\3\2\2\2\u0489"+ + "\u047a\3\2\2\2\u0489\u047c\3\2\2\2\u0489\u047e\3\2\2\2\u0489\u0480\3\2"+ + "\2\2\u0489\u0482\3\2\2\2\u0489\u0487\3\2\2\2\u048a\u048d\3\2\2\2\u048b"+ + "\u0489\3\2\2\2\u048b\u048c\3\2\2\2\u048c\u00b5\3\2\2\2\u048d\u048b\3\2"+ + "\2\2\u048e\u048f\5^\60\2\u048f\u0490\5\u00b8]\2\u0490\u00b7\3\2\2\2\u0491"+ + "\u0493\7N\2\2\u0492\u0494\7f\2\2\u0493\u0492\3\2\2\2\u0493\u0494\3\2\2"+ + "\2\u0494\u0495\3\2\2\2\u0495\u0497\5\u013e\u00a0\2\u0496\u0498\5p9\2\u0497"+ + "\u0496\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u00b9\3\2\2\2\u0499\u049b\7\'"+ + "\2\2\u049a\u049c\5\u00e6t\2\u049b\u049a\3\2\2\2\u049b\u049c\3\2\2\2\u049c"+ + "\u049e\3\2\2\2\u049d\u049f\7n\2\2\u049e\u049d\3\2\2\2\u049e\u049f\3\2"+ + "\2\2\u049f\u04a0\3\2\2\2\u04a0\u04a1\7(\2\2\u04a1\u00bb\3\2\2\2\u04a2"+ + "\u04a3\7O\2\2\u04a3\u04ad\7i\2\2\u04a4\u04a8\5\u00c0a\2\u04a5\u04a8\5"+ + "\u012c\u0097\2\u04a6\u04a8\5\u00be`\2\u04a7\u04a4\3\2\2\2\u04a7\u04a5"+ + "\3\2\2\2\u04a7\u04a6\3\2\2\2\u04a8\u04a9\3\2\2\2\u04a9\u04aa\5\u0170\u00b9"+ + "\2\u04aa\u04ac\3\2\2\2\u04ab\u04a7\3\2\2\2\u04ac\u04af\3\2\2\2\u04ad\u04ab"+ + "\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04b0\3\2\2\2\u04af\u04ad\3\2\2\2\u04b0"+ + "\u04b1\7j\2\2\u04b1\u00bd\3\2\2\2\u04b2\u04b3\79\2\2\u04b3\u04b4\7f\2"+ + "\2\u04b4\u04b5\5\u0142\u00a2\2\u04b5\u00bf\3\2\2\2\u04b6\u04b8\7\34\2"+ + "\2\u04b7\u04b6\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba"+ + "\5^\60\2\u04ba\u04bb\7f\2\2\u04bb\u04bc\5\u0142\u00a2\2\u04bc\u04bd\5"+ + "\u0140\u00a1\2\u04bd\u04c6\3\2\2\2\u04be\u04c0\7\34\2\2\u04bf\u04be\3"+ + "\2\2\2\u04bf\u04c0\3\2\2\2\u04c0\u04c1\3\2\2\2\u04c1\u04c2\5^\60\2\u04c2"+ + "\u04c3\7f\2\2\u04c3\u04c4\5\u0142\u00a2\2\u04c4\u04c6\3\2\2\2\u04c5\u04b7"+ + "\3\2\2\2\u04c5\u04bf\3\2\2\2\u04c6\u00c1\3\2\2\2\u04c7\u04cf\5\u012c\u0097"+ + "\2\u04c8\u04cf\5\u00c4c\2\u04c9\u04cf\5P)\2\u04ca\u04cb\7g\2\2\u04cb\u04cc"+ + "\5\u00c2b\2\u04cc\u04cd\7h\2\2\u04cd\u04cf\3\2\2\2\u04ce\u04c7\3\2\2\2"+ + "\u04ce\u04c8\3\2\2\2\u04ce\u04c9\3\2\2\2\u04ce\u04ca\3\2\2\2\u04cf\u00c3"+ + "\3\2\2\2\u04d0\u04da\5\u012e\u0098\2\u04d1\u04da\5\u015e\u00b0\2\u04d2"+ + "\u04da\5\u0134\u009b\2\u04d3\u04da\5\u013c\u009f\2\u04d4\u04da\5\u00bc"+ + "_\2\u04d5\u04da\5\u0136\u009c\2\u04d6\u04da\5\u0138\u009d\2\u04d7\u04da"+ + "\5\u013a\u009e\2\u04d8\u04da\5\u00c6d\2\u04d9\u04d0\3\2\2\2\u04d9\u04d1"+ + "\3\2\2\2\u04d9\u04d2\3\2\2\2\u04d9\u04d3\3\2\2\2\u04d9\u04d4\3\2\2\2\u04d9"+ + "\u04d5\3\2\2\2\u04d9\u04d6\3\2\2\2\u04d9\u04d7\3\2\2\2\u04d9\u04d8\3\2"+ + "\2\2\u04da\u00c5\3\2\2\2\u04db\u04dc\79\2\2\u04dc\u04dd\5\u00c8e\2\u04dd"+ + "\u00c7\3\2\2\2\u04de\u04ea\7g\2\2\u04df\u04e4\5\u00c2b\2\u04e0\u04e1\7"+ + "n\2\2\u04e1\u04e3\5\u00c2b\2\u04e2\u04e0\3\2\2\2\u04e3\u04e6\3\2\2\2\u04e4"+ + "\u04e2\3\2\2\2\u04e4\u04e5\3\2\2\2\u04e5\u04e8\3\2\2\2\u04e6\u04e4\3\2"+ + "\2\2\u04e7\u04e9\7n\2\2\u04e8\u04e7\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9"+ + "\u04eb\3\2\2\2\u04ea\u04df\3\2\2\2\u04ea\u04eb\3\2\2\2\u04eb\u04ec\3\2"+ + "\2\2\u04ec\u04ed\7h\2\2\u04ed\u00c9\3\2\2\2\u04ee\u04f6\5\u015e\u00b0"+ + "\2\u04ef\u04f6\5\u012e\u0098\2\u04f0\u04f6\5\u00ccg\2\u04f1\u04f6\5\u0136"+ + "\u009c\2\u04f2\u04f6\5\u0138\u009d\2\u04f3\u04f6\5P)\2\u04f4\u04f6\5\u012c"+ + "\u0097\2\u04f5\u04ee\3\2\2\2\u04f5\u04ef\3\2\2\2\u04f5\u04f0\3\2\2\2\u04f5"+ + "\u04f1\3\2\2\2\u04f5\u04f2\3\2\2\2\u04f5\u04f3\3\2\2\2\u04f5\u04f4\3\2"+ + "\2\2\u04f6\u00cb\3\2\2\2\u04f7\u04f8\7k\2\2\u04f8\u04f9\7u\2\2\u04f9\u04fa"+ + "\7l\2\2\u04fa\u04fb\5\u0132\u009a\2\u04fb\u00cd\3\2\2\2\u04fc\u050c\7"+ + "k\2\2\u04fd\u04ff\5\u00d0i\2\u04fe\u04fd\3\2\2\2\u04fe\u04ff\3\2\2\2\u04ff"+ + "\u0500\3\2\2\2\u0500\u0502\7p\2\2\u0501\u0503\5\u00d2j\2\u0502\u0501\3"+ + "\2\2\2\u0502\u0503\3\2\2\2\u0503\u050d\3\2\2\2\u0504\u0506\5\u00d0i\2"+ + "\u0505\u0504\3\2\2\2\u0505\u0506\3\2\2\2\u0506\u0507\3\2\2\2\u0507\u0508"+ + "\7p\2\2\u0508\u0509\5\u00d2j\2\u0509\u050a\7p\2\2\u050a\u050b\5\u00d4"+ + "k\2\u050b\u050d\3\2\2\2\u050c\u04fe\3\2\2\2\u050c\u0505\3\2\2\2\u050d"+ + "\u050e\3\2\2\2\u050e\u050f\7l\2\2\u050f\u00cf\3\2\2\2\u0510\u0511\5\u00a4"+ + "S\2\u0511\u00d1\3\2\2\2\u0512\u0513\5\u00a4S\2\u0513\u00d3\3\2\2\2\u0514"+ + "\u0515\5\u00a4S\2\u0515\u00d5\3\2\2\2\u0516\u0518\t\20\2\2\u0517\u0516"+ + "\3\2\2\2\u0517\u0518\3\2\2\2\u0518\u0519\3\2\2\2\u0519\u051a\7m\2\2\u051a"+ + "\u00d7\3\2\2\2\u051b\u051c\5\u00e6t\2\u051c\u051d\7m\2\2\u051d\u0522\3"+ + "\2\2\2\u051e\u051f\5\b\5\2\u051f\u0520\7t\2\2\u0520\u0522\3\2\2\2\u0521"+ + "\u051b\3\2\2\2\u0521\u051e\3\2\2\2\u0521\u0522\3\2\2\2\u0522\u0523\3\2"+ + "\2\2\u0523\u0524\7^\2\2\u0524\u0529\5\u00a4S\2\u0525\u0527\7K\2\2\u0526"+ + "\u0528\7f\2\2\u0527\u0526\3\2\2\2\u0527\u0528\3\2\2\2\u0528\u052a\3\2"+ + "\2\2\u0529\u0525\3\2\2\2\u0529\u052a\3\2\2\2\u052a\u00d9\3\2\2\2\u052b"+ + "\u052c\7Y\2\2\u052c\u052d\7f\2\2\u052d\u00db\3\2\2\2\u052e\u052f\5\u0162"+ + "\u00b2\2\u052f\u00dd\3\2\2\2\u0530\u0534\5\u00e0q\2\u0531\u0534\5\u00e8"+ + "u\2\u0532\u0534\5\u00ecw\2\u0533\u0530\3\2\2\2\u0533\u0531\3\2\2\2\u0533"+ + "\u0532\3\2\2\2\u0534\u00df\3\2\2\2\u0535\u0541\7[\2\2\u0536\u0542\5\u00e2"+ + "r\2\u0537\u053d\7g\2\2\u0538\u0539\5\u00e2r\2\u0539\u053a\5\u0170\u00b9"+ + "\2\u053a\u053c\3\2\2\2\u053b\u0538\3\2\2\2\u053c\u053f\3\2\2\2\u053d\u053b"+ + "\3\2\2\2\u053d\u053e\3\2\2\2\u053e\u0540\3\2\2\2\u053f\u053d\3\2\2\2\u0540"+ + "\u0542\7h\2\2\u0541\u0536\3\2\2\2\u0541\u0537\3\2\2\2\u0542\u00e1\3\2"+ + "\2\2\u0543\u0549\5\u00e4s\2\u0544\u0546\5\u00c2b\2\u0545\u0544\3\2\2\2"+ + "\u0545\u0546\3\2\2\2\u0546\u0547\3\2\2\2\u0547\u0548\7m\2\2\u0548\u054a"+ + "\5\u00e6t\2\u0549\u0545\3\2\2\2\u0549\u054a\3\2\2\2\u054a\u00e3\3\2\2"+ + "\2\u054b\u0550\7f\2\2\u054c\u054d\7n\2\2\u054d\u054f\7f\2\2\u054e\u054c"+ + "\3\2\2\2\u054f\u0552\3\2\2\2\u0550\u054e\3\2\2\2\u0550\u0551\3\2\2\2\u0551"+ + "\u00e5\3\2\2\2\u0552\u0550\3\2\2\2\u0553\u0558\5\u00a4S\2\u0554\u0555"+ + "\7n\2\2\u0555\u0557\5\u00a4S\2\u0556\u0554\3\2\2\2\u0557\u055a\3\2\2\2"+ + "\u0558\u0556\3\2\2\2\u0558\u0559\3\2\2\2\u0559\u00e7\3\2\2\2\u055a\u0558"+ + "\3\2\2\2\u055b\u0567\7_\2\2\u055c\u0568\5\u00eav\2\u055d\u0563\7g\2\2"+ + "\u055e\u055f\5\u00eav\2\u055f\u0560\5\u0170\u00b9\2\u0560\u0562\3\2\2"+ + "\2\u0561\u055e\3\2\2\2\u0562\u0565\3\2\2\2\u0563\u0561\3\2\2\2\u0563\u0564"+ + "\3\2\2\2\u0564\u0566\3\2\2\2\u0565\u0563\3\2\2\2\u0566\u0568\7h\2\2\u0567"+ + "\u055c\3\2\2\2\u0567\u055d\3\2\2\2\u0568\u00e9\3\2\2\2\u0569\u056b\7f"+ + "\2\2\u056a\u056c\7m\2\2\u056b\u056a\3\2\2\2\u056b\u056c\3\2\2\2\u056c"+ + "\u056d\3\2\2\2\u056d\u056e\5\u00c2b\2\u056e\u00eb\3\2\2\2\u056f\u057b"+ + "\7d\2\2\u0570\u057c\5\u0096L\2\u0571\u0577\7g\2\2\u0572\u0573\5\u0096"+ + "L\2\u0573\u0574\5\u0170\u00b9\2\u0574\u0576\3\2\2\2\u0575\u0572\3\2\2"+ + "\2\u0576\u0579\3\2\2\2\u0577\u0575\3\2\2\2\u0577\u0578\3\2\2\2\u0578\u057a"+ + "\3\2\2\2\u0579\u0577\3\2\2\2\u057a\u057c\7h\2\2\u057b\u0570\3\2\2\2\u057b"+ + "\u0571\3\2\2\2\u057c\u00ed\3\2\2\2\u057d\u057f\7i\2\2\u057e\u0580\5\u00f0"+ + "y\2\u057f\u057e\3\2\2\2\u057f\u0580\3\2\2\2\u0580\u0581\3\2\2\2\u0581"+ + "\u0582\7j\2\2\u0582\u00ef\3\2\2\2\u0583\u0585\5\u0170\u00b9\2\u0584\u0583"+ + "\3\2\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0587\5\u00a6T"+ + "\2\u0587\u0588\5\u0170\u00b9\2\u0588\u058a\3\2\2\2\u0589\u0584\3\2\2\2"+ + "\u058a\u058b\3\2\2\2\u058b\u0589\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u00f1"+ + "\3\2\2\2\u058d\u0593\5\u00f6|\2\u058e\u0593\5\u00f8}\2\u058f\u0593\5\u00fa"+ + "~\2\u0590\u0593\5\u00f4{\2\u0591\u0593\5\u0098M\2\u0592\u058d\3\2\2\2"+ + "\u0592\u058e\3\2\2\2\u0592\u058f\3\2\2\2\u0592\u0590\3\2\2\2\u0592\u0591"+ + "\3\2\2\2\u0593\u00f3\3\2\2\2\u0594\u0595\5\u00a4S\2\u0595\u00f5\3\2\2"+ + "\2\u0596\u0597\5\u00a4S\2\u0597\u0598\7\u008a\2\2\u0598\u0599\5\u00a4"+ + "S\2\u0599\u00f7\3\2\2\2\u059a\u059b\5\u00a4S\2\u059b\u059c\t\21\2\2\u059c"+ + "\u00f9\3\2\2\2\u059d\u059e\5\u00e6t\2\u059e\u059f\5\u00d6l\2\u059f\u05a0"+ + "\5\u00e6t\2\u05a0\u00fb\3\2\2\2\u05a1\u05a2\t\22\2\2\u05a2\u00fd\3\2\2"+ + "\2\u05a3\u05a4\7f\2\2\u05a4\u05a6\7p\2\2\u05a5\u05a7\5\u00a6T\2\u05a6"+ + "\u05a5\3\2\2\2\u05a6\u05a7\3\2\2\2\u05a7\u00ff\3\2\2\2\u05a8\u05aa\7c"+ + "\2\2\u05a9\u05ab\5\u00e6t\2\u05aa\u05a9\3\2\2\2\u05aa\u05ab\3\2\2\2\u05ab"+ + "\u0101\3\2\2\2\u05ac\u05ae\7L\2\2\u05ad\u05af\7f\2\2\u05ae\u05ad\3\2\2"+ + "\2\u05ae\u05af\3\2\2\2\u05af\u0103\3\2\2\2\u05b0\u05b2\7`\2\2\u05b1\u05b3"+ + "\7f\2\2\u05b2\u05b1\3\2\2\2\u05b2\u05b3\3\2\2\2\u05b3\u0105\3\2\2\2\u05b4"+ + "\u05b5\7X\2\2\u05b5\u05b6\7f\2\2\u05b6\u0107\3\2\2\2\u05b7\u05b8\7\\\2"+ + "\2\u05b8\u0109\3\2\2\2\u05b9\u05c2\7]\2\2\u05ba\u05c3\5\u00a4S\2\u05bb"+ + "\u05bc\5\u0170\u00b9\2\u05bc\u05bd\5\u00a4S\2\u05bd\u05c3\3\2\2\2\u05be"+ + "\u05bf\5\u00f2z\2\u05bf\u05c0\5\u0170\u00b9\2\u05c0\u05c1\5\u00a4S\2\u05c1"+ + "\u05c3\3\2\2\2\u05c2\u05ba\3\2\2\2\u05c2\u05bb\3\2\2\2\u05c2\u05be\3\2"+ + "\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05ca\5\u00eex\2\u05c5\u05c8\7W\2\2\u05c6"+ + "\u05c9\5\u010a\u0086\2\u05c7\u05c9\5\u00eex\2\u05c8\u05c6\3\2\2\2\u05c8"+ + "\u05c7\3\2\2\2\u05c9\u05cb\3\2\2\2\u05ca\u05c5\3\2\2\2\u05ca\u05cb\3\2"+ + "\2\2\u05cb\u010b\3\2\2\2\u05cc\u05cf\5\u010e\u0088\2\u05cd\u05cf\5\u0114"+ + "\u008b\2\u05ce\u05cc\3\2\2\2\u05ce\u05cd\3\2\2\2\u05cf\u010d\3\2\2\2\u05d0"+ + "\u05db\7Z\2\2\u05d1\u05d3\5\u00a4S\2\u05d2\u05d1\3\2\2\2\u05d2\u05d3\3"+ + "\2\2\2\u05d3\u05dc\3\2\2\2\u05d4\u05d6\5\u00f2z\2\u05d5\u05d4\3\2\2\2"+ + "\u05d5\u05d6\3\2\2\2\u05d6\u05d7\3\2\2\2\u05d7\u05d9\5\u0170\u00b9\2\u05d8"+ + "\u05da\5\u00a4S\2\u05d9\u05d8\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05dc"+ + "\3\2\2\2\u05db\u05d2\3\2\2\2\u05db\u05d5\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd"+ + "\u05e1\7i\2\2\u05de\u05e0\5\u0110\u0089\2\u05df\u05de\3\2\2\2\u05e0\u05e3"+ + "\3\2\2\2\u05e1\u05df\3\2\2\2\u05e1\u05e2\3\2\2\2\u05e2\u05e4\3\2\2\2\u05e3"+ + "\u05e1\3\2\2\2\u05e4\u05e5\7j\2\2\u05e5\u010f\3\2\2\2\u05e6\u05e7\5\u0112"+ + "\u008a\2\u05e7\u05e9\7p\2\2\u05e8\u05ea\5\u00f0y\2\u05e9\u05e8\3\2\2\2"+ + "\u05e9\u05ea\3\2\2\2\u05ea\u0111\3\2\2\2\u05eb\u05ec\7Q\2\2\u05ec\u05ef"+ + "\5\u00e6t\2\u05ed\u05ef\7M\2\2\u05ee\u05eb\3\2\2\2\u05ee\u05ed\3\2\2\2"+ + "\u05ef\u0113\3\2\2\2\u05f0\u05f9\7Z\2\2\u05f1\u05fa\5\u0116\u008c\2\u05f2"+ + "\u05f3\5\u0170\u00b9\2\u05f3\u05f4\5\u0116\u008c\2\u05f4\u05fa\3\2\2\2"+ + "\u05f5\u05f6\5\u00f2z\2\u05f6\u05f7\5\u0170\u00b9\2\u05f7\u05f8\5\u0116"+ + "\u008c\2\u05f8\u05fa\3\2\2\2\u05f9\u05f1\3\2\2\2\u05f9\u05f2\3\2\2\2\u05f9"+ + "\u05f5\3\2\2\2\u05fa\u05fb\3\2\2\2\u05fb\u05ff\7i\2\2\u05fc\u05fe\5\u0118"+ + "\u008d\2\u05fd\u05fc\3\2\2\2\u05fe\u0601\3\2\2\2\u05ff\u05fd\3\2\2\2\u05ff"+ + "\u0600\3\2\2\2\u0600\u0602\3\2\2\2\u0601\u05ff\3\2\2\2\u0602\u0603\7j"+ + "\2\2\u0603\u0115\3\2\2\2\u0604\u0605\7f\2\2\u0605\u0607\7t\2\2\u0606\u0604"+ + "\3\2\2\2\u0606\u0607\3\2\2\2\u0607\u0608\3\2\2\2\u0608\u0609\5\u00b4["+ + "\2\u0609\u060a\7q\2\2\u060a\u060b\7g\2\2\u060b\u060c\7_\2\2\u060c\u060d"+ + "\7h\2\2\u060d\u0117\3\2\2\2\u060e\u060f\5\u011a\u008e\2\u060f\u0611\7"+ + "p\2\2\u0610\u0612\5\u00f0y\2\u0611\u0610\3\2\2\2\u0611\u0612\3\2\2\2\u0612"+ + "\u0119\3\2\2\2\u0613\u0614\7Q\2\2\u0614\u0617\5\u011c\u008f\2\u0615\u0617"+ + "\7M\2\2\u0616\u0613\3\2\2\2\u0616\u0615\3\2\2\2\u0617\u011b\3\2\2\2\u0618"+ + "\u061b\5\u00c2b\2\u0619\u061b\7e\2\2\u061a\u0618\3\2\2\2\u061a\u0619\3"+ + "\2\2\2\u061b\u0623\3\2\2\2\u061c\u061f\7n\2\2\u061d\u0620\5\u00c2b\2\u061e"+ + "\u0620\7e\2\2\u061f\u061d\3\2\2\2\u061f\u061e\3\2\2\2\u0620\u0622\3\2"+ + "\2\2\u0621\u061c\3\2\2\2\u0622\u0625\3\2\2\2\u0623\u0621\3\2\2\2\u0623"+ + "\u0624\3\2\2\2\u0624\u011d\3\2\2\2\u0625\u0623\3\2\2\2\u0626\u0627\7P"+ + "\2\2\u0627\u062b\7i\2\2\u0628\u062a\5\u0120\u0091\2\u0629\u0628\3\2\2"+ + "\2\u062a\u062d\3\2\2\2\u062b\u0629\3\2\2\2\u062b\u062c\3\2\2\2\u062c\u062e"+ + "\3\2\2\2\u062d\u062b\3\2\2\2\u062e\u062f\7j\2\2\u062f\u011f\3\2\2\2\u0630"+ + "\u0631\5\u0122\u0092\2\u0631\u0633\7p\2\2\u0632\u0634\5\u00f0y\2\u0633"+ + "\u0632\3\2\2\2\u0633\u0634\3\2\2\2\u0634\u0121\3\2\2\2\u0635\u0638\7Q"+ + "\2\2\u0636\u0639\5\u00f6|\2\u0637\u0639\5\u0124\u0093\2\u0638\u0636\3"+ + "\2\2\2\u0638\u0637\3\2\2\2\u0639\u063c\3\2\2\2\u063a\u063c\7M\2\2\u063b"+ + "\u0635\3\2\2\2\u063b\u063a\3\2\2\2\u063c\u0123\3\2\2\2\u063d\u063e\5\u00e6"+ + "t\2\u063e\u063f\7m\2\2\u063f\u0644\3\2\2\2\u0640\u0641\5\u00e4s\2\u0641"+ + "\u0642\7t\2\2\u0642\u0644\3\2\2\2\u0643\u063d\3\2\2\2\u0643\u0640\3\2"+ + "\2\2\u0643\u0644\3\2\2\2\u0644\u0645\3\2\2\2\u0645\u0646\5\u00a4S\2\u0646"+ + "\u0125\3\2\2\2\u0647\u064b\7a\2\2\u0648\u064c\5\u00a4S\2\u0649\u064c\5"+ + "\u0128\u0095\2\u064a\u064c\5\u00d8m\2\u064b\u0648\3\2\2\2\u064b\u0649"+ + "\3\2\2\2\u064b\u064a\3\2\2\2\u064b\u064c\3\2\2\2\u064c\u064d\3\2\2\2\u064d"+ + "\u064e\5\u00eex\2\u064e\u0127\3\2\2\2\u064f\u0651\5\u00f2z\2\u0650\u064f"+ + "\3\2\2\2\u0650\u0651\3\2\2\2\u0651\u0652\3\2\2\2\u0652\u0654\5\u0170\u00b9"+ + "\2\u0653\u0655\5\u00a4S\2\u0654\u0653\3\2\2\2\u0654\u0655\3\2\2\2\u0655"+ + "\u0656\3\2\2\2\u0656\u0658\5\u0170\u00b9\2\u0657\u0659\5\u00f2z\2\u0658"+ + "\u0657\3\2\2\2\u0658\u0659\3\2\2\2\u0659\u0129\3\2\2\2\u065a\u065b\7S"+ + "\2\2\u065b\u065c\5\u00a4S\2\u065c\u012b\3\2\2\2\u065d\u0660\5\u0150\u00a9"+ + "\2\u065e\u0660\7f\2\2\u065f\u065d\3\2\2\2\u065f\u065e\3\2\2\2\u0660\u012d"+ + "\3\2\2\2\u0661\u0662\7k\2\2\u0662\u0663\5\u0130\u0099\2\u0663\u0664\7"+ + "l\2\2\u0664\u0665\5\u0132\u009a\2\u0665\u012f\3\2\2\2\u0666\u0667\5\u00a4"+ + "S\2\u0667\u0131\3\2\2\2\u0668\u0669\5\u00c2b\2\u0669\u0133\3\2\2\2\u066a"+ + "\u066b\7\u0088\2\2\u066b\u066c\5\u00c2b\2\u066c\u0135\3\2\2\2\u066d\u066e"+ + "\7k\2\2\u066e\u066f\7l\2\2\u066f\u0670\5\u0132\u009a\2\u0670\u0137\3\2"+ + "\2\2\u0671\u0672\7T\2\2\u0672\u0673\7k\2\2\u0673\u0674\5\u00c2b\2\u0674"+ + "\u0675\7l\2\2\u0675\u0676\5\u0132\u009a\2\u0676\u0139\3\2\2\2\u0677\u067d"+ + "\7V\2\2\u0678\u0679\7V\2\2\u0679\u067d\7\u008a\2\2\u067a\u067b\7\u008a"+ + "\2\2\u067b\u067d\7V\2\2\u067c\u0677\3\2\2\2\u067c\u0678\3\2\2\2\u067c"+ + "\u067a\3\2\2\2\u067d\u067e\3\2\2\2\u067e\u067f\5\u0132\u009a\2\u067f\u013b"+ + "\3\2\2\2\u0680\u0681\7N\2\2\u0681\u0682\5\u013e\u00a0\2\u0682\u013d\3"+ + "\2\2\2\u0683\u0684\5\u0142\u00a2\2\u0684\u0685\5\u0140\u00a1\2\u0685\u0688"+ + "\3\2\2\2\u0686\u0688\5\u0142\u00a2\2\u0687\u0683\3\2\2\2\u0687\u0686\3"+ + "\2\2\2\u0688\u013f\3\2\2\2\u0689\u068c\5\u0142\u00a2\2\u068a\u068c\5\u00c2"+ + "b\2\u068b\u0689\3\2\2\2\u068b\u068a\3\2\2\2\u068c\u0141\3\2\2\2\u068d"+ + "\u0699\7g\2\2\u068e\u0693\5\u009cO\2\u068f\u0690\7n\2\2\u0690\u0692\5"+ + "\u009cO\2\u0691\u068f\3\2\2\2\u0692\u0695\3\2\2\2\u0693\u0691\3\2\2\2"+ + "\u0693\u0694\3\2\2\2\u0694\u0697\3\2\2\2\u0695\u0693\3\2\2\2\u0696\u0698"+ + "\7n\2\2\u0697\u0696\3\2\2\2\u0697\u0698\3\2\2\2\u0698\u069a\3\2\2\2\u0699"+ + "\u068e\3\2\2\2\u0699\u069a\3\2\2\2\u069a\u069b\3\2\2\2\u069b\u069c\7h"+ + "\2\2\u069c\u0143\3\2\2\2\u069d\u069e\5\u0146\u00a4\2\u069e\u069f\7g\2"+ + "\2\u069f\u06a1\5\u00a4S\2\u06a0\u06a2\7n\2\2\u06a1\u06a0\3\2\2\2\u06a1"+ + "\u06a2\3\2\2\2\u06a2\u06a3\3\2\2\2\u06a3\u06a4\7h\2\2\u06a4\u0145\3\2"+ + "\2\2\u06a5\u06ab\5\u00c4c\2\u06a6\u06a7\7g\2\2\u06a7\u06a8\5\u0146\u00a4"+ + "\2\u06a8\u06a9\7h\2\2\u06a9\u06ab\3\2\2\2\u06aa\u06a5\3\2\2\2\u06aa\u06a6"+ + "\3\2\2\2\u06ab\u0147\3\2\2\2\u06ac\u06b3\5\u014a\u00a6\2\u06ad\u06b3\5"+ + "\u014e\u00a8\2\u06ae\u06af\7g\2\2\u06af\u06b0\5\u00a4S\2\u06b0\u06b1\7"+ + "h\2\2\u06b1\u06b3\3\2\2\2\u06b2\u06ac\3\2\2\2\u06b2\u06ad\3\2\2\2\u06b2"+ + "\u06ae\3\2\2\2\u06b3\u0149\3\2\2\2\u06b4\u06b8\5\u00b2Z\2\u06b5\u06b8"+ + "\5\u0152\u00aa\2\u06b6\u06b8\5\u00b6\\\2\u06b7\u06b4\3\2\2\2\u06b7\u06b5"+ + "\3\2\2\2\u06b7\u06b6\3\2\2\2\u06b8\u014b\3\2\2\2\u06b9\u06ba\t\23\2\2"+ + "\u06ba\u014d\3\2\2\2\u06bb\u06bc\7f\2\2\u06bc\u014f\3\2\2\2\u06bd\u06be"+ + "\7f\2\2\u06be\u06bf\7q\2\2\u06bf\u06c0\7f\2\2\u06c0\u0151\3\2\2\2\u06c1"+ + "\u06c2\5\u00caf\2\u06c2\u06c3\5\u0154\u00ab\2\u06c3\u0153\3\2\2\2\u06c4"+ + "\u06c9\7i\2\2\u06c5\u06c7\5\u0156\u00ac\2\u06c6\u06c8\7n\2\2\u06c7\u06c6"+ + "\3\2\2\2\u06c7\u06c8\3\2\2\2\u06c8\u06ca\3\2\2\2\u06c9\u06c5\3\2\2\2\u06c9"+ + "\u06ca\3\2\2\2\u06ca\u06cb\3\2\2\2\u06cb\u06cc\7j\2\2\u06cc\u0155\3\2"+ + "\2\2\u06cd\u06d2\5\u0158\u00ad\2\u06ce\u06cf\7n\2\2\u06cf\u06d1\5\u0158"+ + "\u00ad\2\u06d0\u06ce\3\2\2\2\u06d1\u06d4\3\2\2\2\u06d2\u06d0\3\2\2\2\u06d2"+ + "\u06d3\3\2\2\2\u06d3\u0157\3\2\2\2\u06d4\u06d2\3\2\2\2\u06d5\u06d6\5\u015a"+ + "\u00ae\2\u06d6\u06d7\7p\2\2\u06d7\u06d9\3\2\2\2\u06d8\u06d5\3\2\2\2\u06d8"+ + "\u06d9\3\2\2\2\u06d9\u06da\3\2\2\2\u06da\u06db\5\u015c\u00af\2\u06db\u0159"+ + "\3\2\2\2\u06dc\u06df\5\u00a4S\2\u06dd\u06df\5\u0154\u00ab\2\u06de\u06dc"+ + "\3\2\2\2\u06de\u06dd\3\2\2\2\u06df\u015b\3\2\2\2\u06e0\u06e3\5\u00a4S"+ + "\2\u06e1\u06e3\5\u0154\u00ab\2\u06e2\u06e0\3\2\2\2\u06e2\u06e1\3\2\2\2"+ + "\u06e3\u015d\3\2\2\2\u06e4\u06e5\7U\2\2\u06e5\u06eb\7i\2\2\u06e6\u06e7"+ + "\5\u0160\u00b1\2\u06e7\u06e8\5\u0170\u00b9\2\u06e8\u06ea\3\2\2\2\u06e9"+ + "\u06e6\3\2\2\2\u06ea\u06ed\3\2\2\2\u06eb\u06e9\3\2\2\2\u06eb\u06ec\3\2"+ + "\2\2\u06ec\u06ee\3\2\2\2\u06ed\u06eb\3\2\2\2\u06ee\u06ef\7j\2\2\u06ef"+ + "\u015f\3\2\2\2\u06f0\u06f1\5\u00e4s\2\u06f1\u06f2\5\u00c2b\2\u06f2\u06f5"+ + "\3\2\2\2\u06f3\u06f5\5\u0164\u00b3\2\u06f4\u06f0\3\2\2\2\u06f4\u06f3\3"+ + "\2\2\2\u06f5\u06f7\3\2\2\2\u06f6\u06f8\5\u0162\u00b2\2\u06f7\u06f6\3\2"+ + "\2\2\u06f7\u06f8\3\2\2\2\u06f8\u0161\3\2\2\2\u06f9\u06fa\t\24\2\2\u06fa"+ + "\u0163\3\2\2\2\u06fb\u06fd\7\u0088\2\2\u06fc\u06fb\3\2\2\2\u06fc\u06fd"+ + "\3\2\2\2\u06fd\u06fe\3\2\2\2\u06fe\u06ff\5\u012c\u0097\2\u06ff\u0165\3"+ + "\2\2\2\u0700\u0701\7k\2\2\u0701\u0702\5\u00a4S\2\u0702\u0703\7l\2\2\u0703"+ + "\u0167\3\2\2\2\u0704\u0705\7q\2\2\u0705\u0706\7g\2\2\u0706\u0707\5\u00c2"+ + "b\2\u0707\u0708\7h\2\2\u0708\u0169\3\2\2\2\u0709\u0718\7g\2\2\u070a\u0711"+ + "\5\u00e6t\2\u070b\u070e\5\u0146\u00a4\2\u070c\u070d\7n\2\2\u070d\u070f"+ + "\5\u00e6t\2\u070e\u070c\3\2\2\2\u070e\u070f\3\2\2\2\u070f\u0711\3\2\2"+ + "\2\u0710\u070a\3\2\2\2\u0710\u070b\3\2\2\2\u0711\u0713\3\2\2\2\u0712\u0714"+ + "\7u\2\2\u0713\u0712\3\2\2\2\u0713\u0714\3\2\2\2\u0714\u0716\3\2\2\2\u0715"+ + "\u0717\7n\2\2\u0716\u0715\3\2\2\2\u0716\u0717\3\2\2\2\u0717\u0719\3\2"+ + "\2\2\u0718\u0710\3\2\2\2\u0718\u0719\3\2\2\2\u0719\u071a\3\2\2\2\u071a"+ + "\u071b\7h\2\2\u071b\u016b\3\2\2\2\u071c\u071d\5\u0146\u00a4\2\u071d\u071e"+ + "\7q\2\2\u071e\u071f\7f\2\2\u071f\u016d\3\2\2\2\u0720\u0721\5\u00c2b\2"+ + "\u0721\u016f\3\2\2\2\u0722\u0727\7o\2\2\u0723\u0727\7\2\2\3\u0724\u0727"+ + "\7\u00a0\2\2\u0725\u0727\6\u00b9\24\2\u0726\u0722\3\2\2\2\u0726\u0723"+ + "\3\2\2\2\u0726\u0724\3\2\2\2\u0726\u0725\3\2\2\2\u0727\u0171\3\2\2\2\u00bd"+ + "\u0180\u0185\u018c\u0196\u019c\u01a2\u01b2\u01b6\u01bf\u01cb\u01cf\u01d5"+ + "\u01de\u01e8\u01f9\u0207\u020b\u0212\u021a\u0223\u0243\u024b\u0263\u0274"+ + "\u0283\u0290\u0299\u02a7\u02b0\u02bc\u02d1\u02d8\u02dd\u02e2\u02ec\u02ef"+ + "\u02f3\u02f7\u02ff\u0307\u030c\u0314\u0316\u031b\u0322\u032a\u032d\u0333"+ + "\u0338\u033a\u033d\u0344\u0349\u035c\u0364\u0368\u036b\u0371\u0375\u0378"+ + "\u0382\u0389\u0390\u039c\u03a2\u03a9\u03ae\u03b4\u03c0\u03c6\u03ca\u03d2"+ + "\u03d6\u03dc\u03df\u03e5\u03ea\u03fe\u0421\u0423\u043a\u0442\u044d\u0454"+ + "\u045b\u0465\u0473\u0489\u048b\u0493\u0497\u049b\u049e\u04a7\u04ad\u04b7"+ + "\u04bf\u04c5\u04ce\u04d9\u04e4\u04e8\u04ea\u04f5\u04fe\u0502\u0505\u050c"+ + "\u0517\u0521\u0527\u0529\u0533\u053d\u0541\u0545\u0549\u0550\u0558\u0563"+ + "\u0567\u056b\u0577\u057b\u057f\u0584\u058b\u0592\u05a6\u05aa\u05ae\u05b2"+ + "\u05c2\u05c8\u05ca\u05ce\u05d2\u05d5\u05d9\u05db\u05e1\u05e9\u05ee\u05f9"+ + "\u05ff\u0606\u0611\u0616\u061a\u061f\u0623\u062b\u0633\u0638\u063b\u0643"+ + "\u064b\u0650\u0654\u0658\u065f\u067c\u0687\u068b\u0693\u0697\u0699\u06a1"+ + "\u06aa\u06b2\u06b7\u06c7\u06c9\u06d2\u06d8\u06de\u06e2\u06eb\u06f4\u06f7"+ + "\u06fc\u070e\u0710\u0713\u0716\u0718\u0726"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index 4214a5448..eade596c2 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -109,6 +109,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitProofStatement(GobraParser.ProofStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchStmt_(GobraParser.MatchStmt_Context ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -270,6 +277,20 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitRange(GobraParser.RangeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchExpr(GobraParser.MatchExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchExprClause(GobraParser.MatchExprClauseContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -361,6 +382,55 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitAssertion(GobraParser.AssertionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchStmt(GobraParser.MatchStmtContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchStmtClause(GobraParser.MatchStmtClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchCase(GobraParser.MatchCaseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchPatternBind(GobraParser.MatchPatternBindContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchPatternComposite(GobraParser.MatchPatternCompositeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchPatternValue(GobraParser.MatchPatternValueContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchPatternList(GobraParser.MatchPatternListContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index e5db4b55a..cc614dff8 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -97,6 +97,13 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitProofStatement(GobraParser.ProofStatementContext ctx); + /** + * Visit a parse tree produced by the {@code matchStmt_} + * labeled alternative in {@link GobraParser#ghostStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchStmt_(GobraParser.MatchStmt_Context ctx); /** * Visit a parse tree produced by {@link GobraParser#auxiliaryStatement}. * @param ctx the parse tree @@ -235,6 +242,18 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitRange(GobraParser.RangeContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#matchExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchExpr(GobraParser.MatchExprContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#matchExprClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchExprClause(GobraParser.MatchExprClauseContext ctx); /** * Visit a parse tree produced by {@link GobraParser#seqUpdExp}. * @param ctx the parse tree @@ -313,6 +332,51 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitAssertion(GobraParser.AssertionContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#matchStmt}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchStmt(GobraParser.MatchStmtContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#matchStmtClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchStmtClause(GobraParser.MatchStmtClauseContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#matchCase}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchCase(GobraParser.MatchCaseContext ctx); + /** + * Visit a parse tree produced by the {@code matchPatternBind} + * labeled alternative in {@link GobraParser#matchPattern}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchPatternBind(GobraParser.MatchPatternBindContext ctx); + /** + * Visit a parse tree produced by the {@code matchPatternComposite} + * labeled alternative in {@link GobraParser#matchPattern}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchPatternComposite(GobraParser.MatchPatternCompositeContext ctx); + /** + * Visit a parse tree produced by the {@code matchPatternValue} + * labeled alternative in {@link GobraParser#matchPattern}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchPatternValue(GobraParser.MatchPatternValueContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#matchPatternList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchPatternList(GobraParser.MatchPatternListContext ctx); /** * Visit a parse tree produced by {@link GobraParser#blockWithBodyParameterInfo}. * @param ctx the parse tree diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index c5b207027..8eea4fa06 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -957,7 +957,6 @@ case class PMatchExp(exp: PExpression, clauses: Vector[PMatchExpClause]) extends val caseClauses: Vector[PMatchExpCase] = clauses collect {case c: PMatchExpCase => c} val defaultClauses: Vector[PMatchExpDefault] = clauses collect {case c: PMatchExpDefault => c} val hasDefault: Boolean = defaultClauses.length == 1 - val hasNoDefault: Boolean = defaultClauses.isEmpty } sealed trait PMatchExpClause extends PGhostMisc with PScope { diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 0d44beed1..12eb54ed4 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -537,6 +537,66 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole PAdtClause(id.get, args).at(ctx) } + override def visitMatchStmt(ctx: MatchStmtContext): PMatchStatement = { + val expr = visitNode[PExpression](ctx.expression()) + val cases = ctx.matchStmtClause().asScala.toVector.map(visitNode[PMatchStmtCase](_)) + PMatchStatement(expr, cases).at(ctx) + } + override def visitMatchStmtClause(ctx: MatchStmtClauseContext): PMatchStmtCase = { + val p = visitNode[PMatchPattern](ctx.matchCase()) + val s = visitNodeOrElse[Vector[PStatement]](ctx.statementList(), Vector.empty) + PMatchStmtCase(p, s).at(ctx) + } + + override def visitMatchExpr(ctx: MatchExprContext): PMatchExp = { + val expr = visitNode[PExpression](ctx.expression()) + val cases = ctx.matchExprClause().asScala.toVector.map(visitNode[PMatchExpClause](_)) + PMatchExp(expr, cases).at(ctx) + } + override def visitMatchExprClause(ctx: MatchExprClauseContext): PMatchExpClause = { + val p = visitNode[PMatchPattern](ctx.matchCase()) + val e = visitNode[PExpression](ctx.expression()) + + p match { + case _: PMatchWildcard => PMatchExpDefault(e).at(ctx) + case _ => PMatchExpCase(p, e).at(ctx) + } + } + + override def visitMatchCase(ctx: MatchCaseContext): PMatchPattern = { + visitChildren(ctx) match { + case Vector("default") => PMatchWildcard().at(ctx) + case Vector("case", p: PMatchPattern) => p + } + } + + override def visitMatchPatternBind(ctx: MatchPatternBindContext): PMatchPattern = { + visitChildren(ctx) match { + case Vector("?", idnDef(id)) => PMatchBindVar(id).at(ctx) + } + } + + override def visitMatchPatternComposite(ctx: MatchPatternCompositeContext): PMatchPattern = { + val t = visitNode[PType](ctx.literalType()) + val args = + if (!has(ctx.matchPatternList())) Vector.empty + else visitNode[Vector[PMatchPattern]](ctx.matchPatternList()) + + PMatchAdt(t, args).at(ctx) + } + + override def visitMatchPatternValue(ctx: MatchPatternValueContext): PMatchPattern = { + visitNode[PExpression](ctx.expression()) match { + case _: PBlankIdentifier => PMatchWildcard().at(ctx) + case expr: PExpression => PMatchValue(expr).at(ctx) + } + } + + override def visitMatchPatternList(ctx: MatchPatternListContext): Vector[PMatchPattern] = { + if (!has(ctx)) Vector.empty + else (for (expr <- ctx.matchPattern().asScala.toVector) yield visitNode[PMatchPattern](expr)).at(ctx) + } + /** * {@inheritDoc } * @@ -2291,10 +2351,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole /** Helper Function for optional Nodes * * @param ctx a context that might be null (signified with ? in the grammar) - * @tparam P The PNode type + * @tparam P The expected return type * @return a positioned Option of a positioned PNode */ - def visitNodeOrNone[P <: PNode](ctx : ParserRuleContext) : Option[P] = { + def visitNodeOrNone[P](ctx : ParserRuleContext) : Option[P] = { if (ctx != null) { Some(visitNode(ctx)).pos() } else None @@ -2303,10 +2363,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole /** Helper Function for Nodes with a default * * @param ctx a context that might be null (signified with ? in the grammar) - * @tparam P The PNode type + * @tparam P The expected return type * @return a positioned Option of a positioned PNode */ - def visitNodeOrElse[P <: PNode](ctx : ParserRuleContext, default : P) : P = { + def visitNodeOrElse[P](ctx : ParserRuleContext, default : P) : P = { visitNodeOrNone[P](ctx) match { case Some(value) => value case None => default diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala index 910259799..74f80f6ad 100644 --- a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala @@ -298,7 +298,7 @@ class AdtEncoding extends LeafTypeEncoding { val checkExVar = checkExVarDecl.localVar // b := false - val initialExVar = unit(vpr.LocalVarAssign(checkExVar, vpr.FalseLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT)) + val initialExVar = vpr.LocalVarAssign(checkExVar, vpr.FalseLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT) // b := true def setExVar(p: vpr.Position, i: vpr.Info, e: vpr.ErrorTrafo): Writer[vpr.LocalVarAssign] = @@ -319,12 +319,12 @@ class AdtEncoding extends LeafTypeEncoding { } for { - init <- initialExVar + _ <- local(checkExVarDecl) + _ <- write(initialExVar) cs <- sequence(s.cases map translateCase) - _ <- if (s.strict) { - assert(vpr.EqCmp(checkExVar, vpr.TrueLit()(sPos, sInfo, sErrT))(sPos, sInfo, sErrT), (info, _) => MatchError(info)) - } else unit(()) - } yield vpr.Seqn(init +: cs, Seq(checkExVarDecl))(sPos, sInfo, sErrT) + _ <- write(cs: _*) + _ <- if (s.strict) assert(checkExVar, (info, _) => MatchError(info)) else unit(()) + } yield vu.nop(sPos, sInfo, sErrT) } /** From 6d47dcf5316fa19de765d895a3ea5043fbd67f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 16 Nov 2022 14:12:00 +0100 Subject: [PATCH 052/296] Fix --- .../scala/viper/gobra/frontend/Desugar.scala | 4 ++++ .../property/Executability.scala | 3 ++- .../features/channels/channel-fail9.go | 20 +++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/regressions/features/channels/channel-fail9.go diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 0c0b590f2..0ba641ffa 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -1574,6 +1574,10 @@ object Desugar { // create temporary local variables to assign them the expression in `w.res` val targetTypes = info.typ(e) match { case InternalTupleT(ts) => ts + case InternalSingleMulti(s, _) => + // when an expression that can yield a single or multiple return values depending on the context + // is executed as a stmt, we consider only the single return value + Vector(s) case t => Vector(t) } val targets = targetTypes.map(typ => freshExclusiveVar(typeD(typ, Addressability.exclusiveVariable)(src), stmt, info)(src)) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Executability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Executability.scala index 893f94e7c..baf7b1834 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Executability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Executability.scala @@ -6,7 +6,7 @@ package viper.gobra.frontend.info.implementation.property -import viper.gobra.ast.frontend.{PBuildIn, PExpression, PInvoke, AstPattern => ap} +import viper.gobra.ast.frontend.{PBuildIn, PExpression, PInvoke, PReceive, AstPattern => ap} import viper.gobra.frontend.info.implementation.TypeInfoImpl trait Executability extends BaseProperty { this: TypeInfoImpl => @@ -22,6 +22,7 @@ trait Executability extends BaseProperty { this: TypeInfoImpl => case Some(_: ap.ClosureCall) => true case _ => false } + case _: PReceive => true case _ => false } diff --git a/src/test/resources/regressions/features/channels/channel-fail9.go b/src/test/resources/regressions/features/channels/channel-fail9.go new file mode 100644 index 000000000..8e460cb34 --- /dev/null +++ b/src/test/resources/regressions/features/channels/channel-fail9.go @@ -0,0 +1,20 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +func c() <-chan struct{} + +func test1() { + //:: ExpectedOutput(precondition_error) + <-c() +} + +type T interface { + getC() <-chan struct{} +} + +func test2(t T) { + //:: ExpectedOutput(precondition_error) + <-t.getC() +} From 6828d4b5d95c4b389494bd778e9ea486a0bdadd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 16 Nov 2022 15:22:16 +0100 Subject: [PATCH 053/296] Make receive executable --- .../resources/regressions/features/channels/channel-fail9.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/regressions/features/channels/channel-fail9.go b/src/test/resources/regressions/features/channels/channel-fail9.go index 8e460cb34..9fc305a57 100644 --- a/src/test/resources/regressions/features/channels/channel-fail9.go +++ b/src/test/resources/regressions/features/channels/channel-fail9.go @@ -15,6 +15,6 @@ type T interface { } func test2(t T) { - //:: ExpectedOutput(precondition_error) + //:: ExpectedOutput(receive_error:permission_error) <-t.getC() } From 8ae9db18e2a11c2a3b1ea8d44da79bbbe20fe0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 16 Nov 2022 15:42:03 +0100 Subject: [PATCH 054/296] Fix 576 (#577) * Add witness * Add fix * Fix test --- src/main/scala/viper/gobra/frontend/Desugar.scala | 4 ++-- .../scala/viper/gobra/frontend/info/TypeInfo.scala | 2 +- .../info/implementation/resolution/Enclosing.scala | 3 ++- .../info/implementation/typing/ExprTyping.scala | 2 +- .../typing/ghost/GhostMiscTyping.scala | 2 +- src/test/resources/regressions/issues/000576.go | 14 ++++++++++++++ 6 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/regressions/issues/000576.go diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 0c0b590f2..49b7a401d 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -552,7 +552,7 @@ object Desugar { val (args, argSubs) = argsWithSubs.unzip val captured = decl match { - case d: PClosureDecl => info.capturedVariables(d) + case d: PClosureDecl => info.capturedLocalVariables(d) case _ => Vector.empty } val capturedWithSubs = captured map capturedVarD @@ -684,7 +684,7 @@ object Desugar { val (args, _) = argsWithSubs.unzip val captured = decl match { - case d: PClosureDecl => info.capturedVariables(d) + case d: PClosureDecl => info.capturedLocalVariables(d) case _ => Vector.empty } val capturedWithSubs = captured map capturedVarD diff --git a/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala b/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala index da403b1db..0e2dd08e7 100644 --- a/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala +++ b/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala @@ -42,5 +42,5 @@ trait TypeInfo extends ExternalTypeInfo { def freeModified(n: PNode): Vector[PIdnNode] def freeDeclared(n: PNode): Vector[PIdnNode] - def capturedVariables(decl: PClosureDecl): Vector[PIdnNode] + def capturedLocalVariables(decl: PClosureDecl): Vector[PIdnNode] } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala index c961885c2..c25c4c9a3 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/Enclosing.scala @@ -266,10 +266,11 @@ trait Enclosing { this: TypeInfoImpl => } } - override def capturedVariables(decl: PClosureDecl): Vector[PIdnNode] = + override def capturedLocalVariables(decl: PClosureDecl): Vector[PIdnNode] = capturedVariablesAttr(tree.parent(decl).head.asInstanceOf[PFunctionLit]) private lazy val capturedVariablesAttr: PFunctionLit => Vector[PIdnNode] = { def capturedVar(x: PIdnNode, lit: PFunctionLit): Boolean = entity(x) match { + case _: SymbolTable.GlobalVariable => false case r: SymbolTable.Variable => !containedIn(enclosingScope(r.rep), lit) case _ => false } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 97f67d697..faceb7a5e 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -218,7 +218,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => literalAssignableTo.errors(lit, simplifiedT)(n) case f: PFunctionLit => - capturedVariables(f.decl).flatMap(v => addressable.errors(enclosingExpr(v).get)(v)) ++ + capturedLocalVariables(f.decl).flatMap(v => addressable.errors(enclosingExpr(v).get)(v)) ++ wellDefVariadicArgs(f.args) ++ f.id.fold(noMessages)(id => wellDefID(id).out) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala index 31c81c8b3..67022ba39 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala @@ -22,7 +22,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def wellDefGhostMisc(misc: PGhostMisc) = misc match { case c@PClosureSpecInstance(id, _) => resolve(id) match { case Some(ap.Function(_, f)) => wellDefClosureSpecInstanceParams(c, f.args zip exprOrTypeType(id).asInstanceOf[FunctionT].args) - case Some(ap.Closure(_, l)) => if (c.params.isEmpty || capturedVariables(l.lit.decl).isEmpty) + case Some(ap.Closure(_, l)) => if (c.params.isEmpty || capturedLocalVariables(l.lit.decl).isEmpty) wellDefClosureSpecInstanceParams(c, l.args zip exprOrTypeType(id).asInstanceOf[FunctionT].args) else error(c, s"function literal ${l.lit.id.get} captures variables, so it cannot be used to derive a parametrized spec instance") case _ => error(id, s"identifier $id does not identify a user-defined function or function literal") diff --git a/src/test/resources/regressions/issues/000576.go b/src/test/resources/regressions/issues/000576.go new file mode 100644 index 000000000..725b0b992 --- /dev/null +++ b/src/test/resources/regressions/issues/000576.go @@ -0,0 +1,14 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +var x /*@@@*/ int = 1 + +func test() { + f := + // @ requires acc(&x, _) + func /*@ g @*/ () int { + return x + } +} From 8d84d0b5632e80802b6637588ca0577e4ad949ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 16 Nov 2022 23:48:09 +0100 Subject: [PATCH 055/296] Fix test --- .../regressions/features/channels/channel-fail9.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/test/resources/regressions/features/channels/channel-fail9.go b/src/test/resources/regressions/features/channels/channel-fail9.go index 9fc305a57..2f3023952 100644 --- a/src/test/resources/regressions/features/channels/channel-fail9.go +++ b/src/test/resources/regressions/features/channels/channel-fail9.go @@ -3,18 +3,19 @@ package pkg -func c() <-chan struct{} +// @ ensures res.RecvChannel() && res.RecvGivenPerm()() +func c() (res <-chan struct{}) func test1() { - //:: ExpectedOutput(precondition_error) <-c() } type T interface { - getC() <-chan struct{} + // @ ensures res.RecvChannel() && res.RecvGivenPerm()() + getC() (res <-chan struct{}) } +// @ requires t != nil func test2(t T) { - //:: ExpectedOutput(receive_error:permission_error) <-t.getC() } From 2cd70fbb49b5323650410fee2a2982030fdb7e10 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Tue, 22 Nov 2022 13:59:14 +0100 Subject: [PATCH 056/296] Updates submodules (#579) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index bbc7ecaf1..25d2b1c54 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit bbc7ecaf1265d171c287e21062ed7477eccc575f +Subproject commit 25d2b1c544776448101ac9ce94c35ef88302f53f From aedab720a323215297c23b5fa1652ddaa742dba5 Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Wed, 23 Nov 2022 22:57:31 +0100 Subject: [PATCH 057/296] fixed typeidentity of sort types --- .../frontend/info/implementation/property/TypeIdentity.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala index 416c2bec8..d46efbb34 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala @@ -54,6 +54,8 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl => case (PointerT(l), PointerT(r)) => identicalTypes(l, r) + case (SortT, SortT) => true + case (FunctionT(larg, lr), FunctionT(rarg, rr)) => larg.size == rarg.size && larg.zip(rarg).forall { case (l, r) => identicalTypes(l, r) From 128bb006a69056fe2146522a201d9325656c144c Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Wed, 23 Nov 2022 23:25:29 +0100 Subject: [PATCH 058/296] fixed some printer tests --- .../viper/gobra/theory/Addressability.scala | 2 +- .../ast/InternalPrettyPrinterUnitTests.scala | 110 +++++++++--------- 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/src/main/scala/viper/gobra/theory/Addressability.scala b/src/main/scala/viper/gobra/theory/Addressability.scala index ad1458317..8f438518a 100644 --- a/src/main/scala/viper/gobra/theory/Addressability.scala +++ b/src/main/scala/viper/gobra/theory/Addressability.scala @@ -41,7 +41,7 @@ object Addressability { /** Addressability modifier. Expressions of exclusive type cannot be aliased. */ case object Exclusive extends Addressability { override val isShared: Boolean = false - override val pretty: String = "." + override val pretty: String = "°" } diff --git a/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala b/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala index 121c9b954..753d5d6a4 100644 --- a/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala +++ b/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala @@ -54,7 +54,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val expr = SequenceLit(0, intT, Map())(Internal) frontend.show(expr) should matchPattern { - case "seq[int] { }" => + case "seq[int°] { }" => } } @@ -62,7 +62,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val expr = SequenceLit(0, sequenceT(sequenceT(boolT)), Map())(Internal) frontend.show(expr) should matchPattern { - case "seq[seq[seq[bool]]] { }" => + case "seq[seq[seq[bool°]°]°] { }" => } } @@ -88,7 +88,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "seq[int] { 0:2, 1:4, 2:8 }" => + case "seq[int°] { 0:2, 1:4, 2:8 }" => } } @@ -99,7 +99,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "seq[int] { 0:42 }" => + case "seq[int°] { 0:42 }" => } } @@ -107,7 +107,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val expr = SequenceLit(0, boolT, Map())(Internal) frontend.show(expr) should matchPattern { - case "seq[bool] { }" => + case "seq[bool°] { }" => } } @@ -150,49 +150,49 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi test("Printer: should correctly show an integer sequence type") { val t = sequenceT(intT) frontend.show(t) should matchPattern { - case "seq[int]" => + case "seq[int°]" => } } test("Printer: should correctly show a nested sequence type") { val t = sequenceT(sequenceT(sequenceT(boolT))) frontend.show(t) should matchPattern { - case "seq[seq[seq[bool]]]" => + case "seq[seq[seq[bool°]°]°]" => } } test("Printer: should correctly show an integer set type") { val t = setT(intT) frontend.show(t) should matchPattern { - case "set[int]" => + case "set[int°]" => } } test("Printer: should correctly show a nested set type") { val t = setT(setT(setT(boolT))) frontend.show(t) should matchPattern { - case "set[set[set[bool]]]" => + case "set[set[set[bool°]°]°]" => } } test("Printer: should correctly show an empty integer set") { val expr = SetLit(intT, Vector())(Internal) frontend.show(expr) should matchPattern { - case "set[int] { }" => + case "set[int°] { }" => } } test("Printer: should correctly show an empty nested set") { val expr = SetLit(setT(boolT), Vector())(Internal) frontend.show(expr) should matchPattern { - case "set[set[bool]] { }" => + case "set[set[bool°]°] { }" => } } test("Printer: should correctly show a singleton integer set literal") { val expr = SetLit(intT, Vector(IntLit(42)(Internal)))(Internal) frontend.show(expr) should matchPattern { - case "set[int] { 42 }" => + case "set[int°] { 42 }" => } } @@ -204,7 +204,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi ))(Internal) frontend.show(expr) should matchPattern { - case "set[bool] { false, true, true }" => + case "set[bool°] { false, true, true }" => } } @@ -259,7 +259,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set[bool] { s } union set[bool] { t, u }" => + case "set[bool°] { s } union set[bool°] { t, u }" => } } @@ -314,7 +314,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set[bool] { s } intersection set[bool] { t, u }" => + case "set[bool°] { s } intersection set[bool°] { t, u }" => } } @@ -369,7 +369,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set[bool] { s } setminus set[bool] { t, u }" => + case "set[bool°] { s } setminus set[bool°] { t, u }" => } } @@ -405,7 +405,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set[int] { 42 } subset set[bool] { }" => + case "set[int°] { 42 } subset set[bool°] { }" => } } @@ -469,7 +469,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set[bool] { true, false } in set[set[set[int]]] { }" => + case "set[bool°] { true, false } in set[set[set[int°]°]°] { }" => } } @@ -505,7 +505,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "len(set[int] { 1, 42 })" => + case "len(set[int°] { 1, 42 })" => } } @@ -515,35 +515,35 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "len(set[seq[int]] { })" => + case "len(set[seq[int°]°] { })" => } } test("Printer: should correctly show a simple integer multiset type") { val typ = multisetT(intT) frontend.show(typ) should matchPattern { - case "mset[int]" => + case "mset[int°]" => } } test("Printer: should correctly show a nested multiset type") { val typ = multisetT(multisetT(boolT)) frontend.show(typ) should matchPattern { - case "mset[mset[bool]]" => + case "mset[mset[bool°]°]" => } } test("Printer: should correctly show an empty multiset integer literal") { val expr = MultisetLit(intT, Vector())(Internal) frontend.show(expr) should matchPattern { - case "mset[int] { }" => + case "mset[int°] { }" => } } test("Printer: should correctly show an empty multiset literal of a nested type") { val expr = MultisetLit(multisetT(multisetT(boolT)), Vector())(Internal) frontend.show(expr) should matchPattern { - case "mset[mset[mset[bool]]] { }" => + case "mset[mset[mset[bool°]°]°] { }" => } } @@ -553,7 +553,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi ))(Internal) frontend.show(expr) should matchPattern { - case "mset[int] { 42 }" => + case "mset[int°] { 42 }" => } } @@ -565,7 +565,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi ))(Internal) frontend.show(expr) should matchPattern { - case "mset[mset[bool]] { mset[bool] { false } }" => + case "mset[mset[bool°]°] { mset[bool°] { false } }" => } } @@ -577,7 +577,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi ))(Internal) frontend.show(expr) should matchPattern { - case "mset[int] { 1, 2, 3 }" => + case "mset[int°] { 1, 2, 3 }" => } } @@ -588,7 +588,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "mset[int] { 1, 2 } union mset[int] { 3 }" => + case "mset[int°] { 1, 2 } union mset[int°] { 3 }" => } } @@ -599,7 +599,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "mset[int] { 1, 2 } intersection mset[int] { 3 }" => + case "mset[int°] { 1, 2 } intersection mset[int°] { 3 }" => } } @@ -610,7 +610,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "mset[int] { 1, 2 } subset mset[int] { 3 }" => + case "mset[int°] { 1, 2 } subset mset[int°] { 3 }" => } } @@ -628,7 +628,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "len(mset[mset[int]] { mset[int] { 1 }, mset[int] { 2, 3 } })" => + case "len(mset[mset[int°]°] { mset[int°] { 1 }, mset[int°] { 2, 3 } })" => } } @@ -643,7 +643,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "2 in mset[int] { 1, 2, 3 }" => + case "2 in mset[int°] { 1, 2, 3 }" => } } @@ -659,7 +659,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "mset[int] { 1 } in mset[int] { 2, 3 }" => + case "mset[int°] { 1 } in mset[int°] { 2, 3 }" => } } @@ -732,7 +732,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "40 + 2 # seq[int] { 0:1, 1:2, 2:3 }" => + case "40 + 2 # seq[int°] { 0:1, 1:2, 2:3 }" => } } @@ -800,7 +800,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val t = exclusiveArrayT(42, intT) frontend.show(t) should matchPattern { - case "[42]int" => + case "[42]int°°" => } } @@ -808,7 +808,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val t = exclusiveArrayT(1, exclusiveArrayT(2, exclusiveArrayT(3, boolT))) frontend.show(t) should matchPattern { - case "[1][2][3]bool" => + case "[1][2][3]bool°°°°" => } } @@ -816,7 +816,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val t = exclusiveArrayT(12, sequenceT(intT)) frontend.show(t) should matchPattern { - case "[12]seq[int]" => + case "[12]seq[int°]°°" => } } @@ -824,7 +824,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val t = sequenceT(exclusiveArrayT(42, boolT)) frontend.show(t) should matchPattern { - case "seq[[42]bool]" => + case "seq[[42]bool°°]°" => } } @@ -889,7 +889,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "len(seq[bool] { 0:false } ++ xs)" => + case "len(seq[bool°] { 0:false } ++ xs)" => } } @@ -899,7 +899,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "len(len(seq[int] { }))" => + case "len(len(seq[int°] { }))" => } } @@ -1001,7 +1001,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi ))(Internal) frontend.show(expr) should matchPattern { - case "[3]int { 0:12, 1:24, 2:48 }" => + case "[3]int° { 0:12, 1:24, 2:48 }" => } } @@ -1009,7 +1009,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val expr = ArrayLit(0, boolT, Map())(Internal) frontend.show(expr) should matchPattern { - case "[0]bool { }" => + case "[0]bool° { }" => } } @@ -1022,7 +1022,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi ))(Internal) frontend.show(expr) should matchPattern { - case "[1][2]int { 0:[2]int { 0:24, 1:42 } }" => + case "[1][2]int°° { 0:[2]int° { 0:24, 1:42 } }" => } } @@ -1034,7 +1034,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "[0][24][48]bool { }" => + case "[0][24][48]bool°°° { }" => } } @@ -1046,7 +1046,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "[1]seq[int] { 0:seq[int] { } }" => + case "[1]seq[int°]° { 0:seq[int] { } }" => } } @@ -1054,7 +1054,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val typ = sharedArrayT(12, IntT(Addressability.Shared, TypeBounds.DefaultInt)) frontend.show(typ) should matchPattern { - case "[12]int" => + case "[12]int@@" => } } @@ -1062,7 +1062,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val typ = sharedArrayT(12, sharedArrayT(24, BoolT(Addressability.Shared))) frontend.show(typ) should matchPattern { - case "[12][24]bool" => + case "[12][24]bool@@@" => } } @@ -1076,7 +1076,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "seq(seq[int] { 0:1, 1:2, 2:4 })" => + case "seq(seq[int°] { 0:1, 1:2, 2:4 })" => } } @@ -1089,7 +1089,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "seq([2]bool { 0:false, 1:true })" => + case "seq([2]bool° { 0:false, 1:true })" => } } @@ -1109,7 +1109,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val typ = OptionT(OptionT(BoolT(a), a), a) frontend.show(typ) should matchPattern { - case "option[option[bool]]" => + case "option[option[bool°]°]°" => } } @@ -1118,7 +1118,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val typ = OptionT(OptionT(BoolT(a), a), a) frontend.show(typ) should matchPattern { - case "option[option[bool]]" => + case "option[option[bool@]@]@" => } } @@ -1126,7 +1126,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val exp = OptionNone(sequenceT(intT))(Internal) frontend.show(exp) should matchPattern { - case "none[seq[int]]" => + case "none[seq[int°]°]°" => } } @@ -1151,7 +1151,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val t = SliceT(intT, a) frontend.show(t) should matchPattern { - case "[]int" => + case "[]int°°" => } } @@ -1160,7 +1160,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val t = SliceT(SetT(SequenceT(boolT, a), a), a) frontend.show(t) should matchPattern { - case "[]set[seq[bool]]" => + case "[]set[seq[bool°]°]°°" => } } @@ -1169,7 +1169,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val t = SliceT(SliceT(SliceT(SliceT(intT, a), a), a), a) frontend.show(t) should matchPattern { - case "[][][][]int" => + case "[][][][]int°°°°°" => } } From baf85f7eb6f87a196b398fd64c3dcd92b07d0ba2 Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Thu, 24 Nov 2022 10:22:05 +0100 Subject: [PATCH 059/296] fixed more printer tests --- .../ast/InternalPrettyPrinterUnitTests.scala | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala b/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala index 753d5d6a4..13478a06a 100644 --- a/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala +++ b/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala @@ -150,28 +150,28 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi test("Printer: should correctly show an integer sequence type") { val t = sequenceT(intT) frontend.show(t) should matchPattern { - case "seq[int°]" => + case "seq[int°]°" => } } test("Printer: should correctly show a nested sequence type") { val t = sequenceT(sequenceT(sequenceT(boolT))) frontend.show(t) should matchPattern { - case "seq[seq[seq[bool°]°]°]" => + case "seq[seq[seq[bool°]°]°]°" => } } test("Printer: should correctly show an integer set type") { val t = setT(intT) frontend.show(t) should matchPattern { - case "set[int°]" => + case "set[int°]°" => } } test("Printer: should correctly show a nested set type") { val t = setT(setT(setT(boolT))) frontend.show(t) should matchPattern { - case "set[set[set[bool°]°]°]" => + case "set[set[set[bool°]°]°]°" => } } @@ -522,14 +522,14 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi test("Printer: should correctly show a simple integer multiset type") { val typ = multisetT(intT) frontend.show(typ) should matchPattern { - case "mset[int°]" => + case "mset[int°]°" => } } test("Printer: should correctly show a nested multiset type") { val typ = multisetT(multisetT(boolT)) frontend.show(typ) should matchPattern { - case "mset[mset[bool°]°]" => + case "mset[mset[bool°]°]°" => } } @@ -1046,7 +1046,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "[1]seq[int°]° { 0:seq[int] { } }" => + case "[1]seq[int°]° { 0:seq[int°] { } }" => } } @@ -1126,7 +1126,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val exp = OptionNone(sequenceT(intT))(Internal) frontend.show(exp) should matchPattern { - case "none[seq[int°]°]°" => + case "none[seq[int°]°]" => } } From 9e9f638fa3e2b5940c94149e92898f51ced6393f Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Sun, 27 Nov 2022 12:35:25 +0100 Subject: [PATCH 060/296] fixed error causing consistency errors --- src/main/antlr4/GobraParser.g4 | 2 +- .../viper/gobra/frontend/GobraParser.java | 2899 +++++++++-------- .../typing/ghost/GhostMiscTyping.scala | 34 +- .../encodings/adts/AdtEncoding.scala | 7 +- .../regressions/features/adts/simple1.gobra | 50 + 5 files changed, 1523 insertions(+), 1469 deletions(-) create mode 100644 src/test/resources/regressions/features/adts/simple1.gobra diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 1bc5a6d73..a276969f4 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -128,7 +128,7 @@ access: ACCESS L_PAREN expression (COMMA expression)? R_PAREN; range: kind=(SEQ | SET | MSET) L_BRACKET expression DOT_DOT expression R_BRACKET; -matchExpr: MATCH expression L_CURLY matchExprClause* R_CURLY; +matchExpr: MATCH expression L_CURLY (matchExprClause eos)* R_CURLY; matchExprClause: matchCase COLON expression; // Added directly to primaryExpr diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 30c539f37..84cc6b0af 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -2404,6 +2404,12 @@ public List matchExprClause() { public MatchExprClauseContext matchExprClause(int i) { return getRuleContext(MatchExprClauseContext.class,i); } + public List eos() { + return getRuleContexts(EosContext.class); + } + public EosContext eos(int i) { + return getRuleContext(EosContext.class,i); + } public MatchExprContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -2428,7 +2434,7 @@ public final MatchExprContext matchExpr() throws RecognitionException { expression(0); setState(622); match(L_CURLY); - setState(626); + setState(628); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { @@ -2436,13 +2442,15 @@ public final MatchExprContext matchExpr() throws RecognitionException { { setState(623); matchExprClause(); + setState(624); + eos(); } } - setState(628); + setState(630); _errHandler.sync(this); _la = _input.LA(1); } - setState(629); + setState(631); match(R_CURLY); } } @@ -2482,11 +2490,11 @@ public final MatchExprClauseContext matchExprClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(631); + setState(633); matchCase(); - setState(632); + setState(634); match(COLON); - setState(633); + setState(635); expression(0); } } @@ -2532,29 +2540,29 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(635); + setState(637); match(L_BRACKET); { - setState(636); + setState(638); seqUpdClause(); - setState(641); + setState(643); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(637); + setState(639); match(COMMA); - setState(638); + setState(640); seqUpdClause(); } } - setState(643); + setState(645); _errHandler.sync(this); _la = _input.LA(1); } } - setState(644); + setState(646); match(R_BRACKET); } } @@ -2594,11 +2602,11 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(646); + setState(648); expression(0); - setState(647); + setState(649); match(ASSIGN); - setState(648); + setState(650); expression(0); } } @@ -2641,7 +2649,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState()); enterRule(_localctx, 78, RULE_ghostTypeLit); try { - setState(654); + setState(656); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2651,28 +2659,28 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { case OPT: enterOuterAlt(_localctx, 1); { - setState(650); + setState(652); sqType(); } break; case GHOST: enterOuterAlt(_localctx, 2); { - setState(651); + setState(653); ghostSliceType(); } break; case DOM: enterOuterAlt(_localctx, 3); { - setState(652); + setState(654); domainType(); } break; case ADT: enterOuterAlt(_localctx, 4); { - setState(653); + setState(655); adtType(); } break; @@ -2725,27 +2733,27 @@ public final DomainTypeContext domainType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(656); + setState(658); match(DOM); - setState(657); + setState(659); match(L_CURLY); - setState(663); + setState(665); _errHandler.sync(this); _la = _input.LA(1); while (_la==AXIOM || _la==FUNC) { { { - setState(658); + setState(660); domainClause(); - setState(659); + setState(661); eos(); } } - setState(665); + setState(667); _errHandler.sync(this); _la = _input.LA(1); } - setState(666); + setState(668); match(R_CURLY); } } @@ -2790,32 +2798,32 @@ public final DomainClauseContext domainClause() throws RecognitionException { DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState()); enterRule(_localctx, 82, RULE_domainClause); try { - setState(677); + setState(679); _errHandler.sync(this); switch (_input.LA(1)) { case FUNC: enterOuterAlt(_localctx, 1); { - setState(668); + setState(670); match(FUNC); - setState(669); + setState(671); match(IDENTIFIER); - setState(670); + setState(672); signature(); } break; case AXIOM: enterOuterAlt(_localctx, 2); { - setState(671); + setState(673); match(AXIOM); - setState(672); + setState(674); match(L_CURLY); - setState(673); + setState(675); expression(0); - setState(674); + setState(676); eos(); - setState(675); + setState(677); match(R_CURLY); } break; @@ -2868,27 +2876,27 @@ public final AdtTypeContext adtType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(679); + setState(681); match(ADT); - setState(680); + setState(682); match(L_CURLY); - setState(686); + setState(688); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(681); + setState(683); adtClause(); - setState(682); + setState(684); eos(); } } - setState(688); + setState(690); _errHandler.sync(this); _la = _input.LA(1); } - setState(689); + setState(691); match(R_CURLY); } } @@ -2937,27 +2945,27 @@ public final AdtClauseContext adtClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(691); + setState(693); match(IDENTIFIER); - setState(692); + setState(694); match(L_CURLY); - setState(698); + setState(700); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(693); + setState(695); fieldDecl(); - setState(694); + setState(696); eos(); } } - setState(700); + setState(702); _errHandler.sync(this); _la = _input.LA(1); } - setState(701); + setState(703); match(R_CURLY); } } @@ -2996,13 +3004,13 @@ public final GhostSliceTypeContext ghostSliceType() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(703); + setState(705); match(GHOST); - setState(704); + setState(706); match(L_BRACKET); - setState(705); + setState(707); match(R_BRACKET); - setState(706); + setState(708); elementType(); } } @@ -3048,7 +3056,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterRule(_localctx, 90, RULE_sqType); int _la; try { - setState(719); + setState(721); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3058,7 +3066,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(708); + setState(710); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << OPT))) != 0)) ) { @@ -3069,11 +3077,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(709); + setState(711); match(L_BRACKET); - setState(710); + setState(712); type_(); - setState(711); + setState(713); match(R_BRACKET); } } @@ -3081,15 +3089,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(713); + setState(715); ((SqTypeContext)_localctx).kind = match(DICT); - setState(714); + setState(716); match(L_BRACKET); - setState(715); + setState(717); type_(); - setState(716); + setState(718); match(R_BRACKET); - setState(717); + setState(719); type_(); } break; @@ -3150,14 +3158,14 @@ public final SpecificationContext specification() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(731); + setState(733); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,32,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(726); + setState(728); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3165,20 +3173,20 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(721); + setState(723); specStatement(); } break; case PURE: { - setState(722); + setState(724); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(724); + setState(726); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3186,21 +3194,21 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(728); + setState(730); eos(); } } } - setState(733); + setState(735); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,32,_ctx); } - setState(736); + setState(738); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(734); + setState(736); match(PURE); ((SpecificationContext)_localctx).pure = true; } @@ -3246,42 +3254,42 @@ public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); enterRule(_localctx, 94, RULE_specStatement); try { - setState(746); + setState(748); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(738); + setState(740); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(739); + setState(741); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(740); + setState(742); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(741); + setState(743); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(742); + setState(744); ((SpecStatementContext)_localctx).kind = match(POST); - setState(743); + setState(745); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(744); + setState(746); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(745); + setState(747); terminationMeasure(); } break; @@ -3325,24 +3333,24 @@ public final TerminationMeasureContext terminationMeasure() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(749); + setState(751); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { case 1: { - setState(748); + setState(750); expressionList(); } break; } - setState(753); + setState(755); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { case 1: { - setState(751); + setState(753); match(IF); - setState(752); + setState(754); expression(0); } break; @@ -3379,7 +3387,7 @@ public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); enterRule(_localctx, 98, RULE_assertion); try { - setState(757); + setState(759); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: @@ -3390,7 +3398,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(756); + setState(758); expression(0); } break; @@ -3438,27 +3446,27 @@ public final MatchStmtContext matchStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(759); + setState(761); match(MATCH); - setState(760); + setState(762); expression(0); - setState(761); + setState(763); match(L_CURLY); - setState(765); + setState(767); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(762); + setState(764); matchStmtClause(); } } - setState(767); + setState(769); _errHandler.sync(this); _la = _input.LA(1); } - setState(768); + setState(770); match(R_CURLY); } } @@ -3498,16 +3506,16 @@ public final MatchStmtClauseContext matchStmtClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(770); + setState(772); matchCase(); - setState(771); - match(COLON); setState(773); + match(COLON); + setState(775); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { - setState(772); + setState(774); statementList(); } break; @@ -3546,22 +3554,22 @@ public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); enterRule(_localctx, 104, RULE_matchCase); try { - setState(778); + setState(780); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(775); + setState(777); match(CASE); - setState(776); + setState(778); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(777); + setState(779); match(DEFAULT); } break; @@ -3635,16 +3643,16 @@ public final MatchPatternContext matchPattern() throws RecognitionException { enterRule(_localctx, 106, RULE_matchPattern); int _la; try { - setState(793); + setState(795); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(780); + setState(782); match(QMARK); - setState(781); + setState(783); match(IDENTIFIER); } break; @@ -3652,23 +3660,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(782); + setState(784); literalType(); - setState(783); + setState(785); match(L_CURLY); - setState(788); + setState(790); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << QMARK) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(784); - matchPatternList(); setState(786); + matchPatternList(); + setState(788); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(785); + setState(787); match(COMMA); } } @@ -3676,7 +3684,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(790); + setState(792); match(R_CURLY); } break; @@ -3684,7 +3692,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(792); + setState(794); expression(0); } break; @@ -3730,23 +3738,23 @@ public final MatchPatternListContext matchPatternList() throws RecognitionExcept int _alt; enterOuterAlt(_localctx, 1); { - setState(795); + setState(797); matchPattern(); - setState(800); + setState(802); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(796); + setState(798); match(COMMA); - setState(797); + setState(799); matchPattern(); } } } - setState(802); + setState(804); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); } @@ -3793,33 +3801,33 @@ public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() thro try { enterOuterAlt(_localctx, 1); { - setState(803); + setState(805); match(L_CURLY); - setState(808); + setState(810); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(804); + setState(806); match(SHARE); - setState(805); + setState(807); identifierList(); - setState(806); + setState(808); eos(); } break; } - setState(811); + setState(813); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: { - setState(810); + setState(812); statementList(); } break; } - setState(813); + setState(815); match(R_CURLY); } } @@ -3863,42 +3871,42 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(817); + setState(819); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(815); + setState(817); qualifiedIdent(); } break; case 2: { - setState(816); + setState(818); match(IDENTIFIER); } break; } - setState(827); + setState(829); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(819); + setState(821); match(L_CURLY); - setState(824); + setState(826); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(820); - closureSpecParams(); setState(822); + closureSpecParams(); + setState(824); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(821); + setState(823); match(COMMA); } } @@ -3906,7 +3914,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(826); + setState(828); match(R_CURLY); } break; @@ -3953,23 +3961,23 @@ public final ClosureSpecParamsContext closureSpecParams() throws RecognitionExce int _alt; enterOuterAlt(_localctx, 1); { - setState(829); + setState(831); closureSpecParam(); - setState(834); + setState(836); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,51,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(830); + setState(832); match(COMMA); - setState(831); + setState(833); closureSpecParam(); } } } - setState(836); + setState(838); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,51,_ctx); } @@ -4009,19 +4017,19 @@ public final ClosureSpecParamContext closureSpecParam() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(839); + setState(841); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(837); + setState(839); match(IDENTIFIER); - setState(838); + setState(840); match(COLON); } break; } - setState(841); + setState(843); expression(0); } } @@ -4065,15 +4073,15 @@ public final ClosureImplProofStmtContext closureImplProofStmt() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(843); + setState(845); match(PROOF); - setState(844); + setState(846); expression(0); - setState(845); + setState(847); match(IMPL); - setState(846); + setState(848); closureSpecInstance(); - setState(847); + setState(849); block(); } } @@ -4134,52 +4142,52 @@ public final ImplementationProofContext implementationProof() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(849); + setState(851); type_(); - setState(850); + setState(852); match(IMPL); - setState(851); + setState(853); type_(); - setState(870); + setState(872); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(852); + setState(854); match(L_CURLY); - setState(858); + setState(860); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(853); + setState(855); implementationProofPredicateAlias(); - setState(854); + setState(856); eos(); } } - setState(860); + setState(862); _errHandler.sync(this); _la = _input.LA(1); } - setState(866); + setState(868); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(861); + setState(863); methodImplementationProof(); - setState(862); + setState(864); eos(); } } - setState(868); + setState(870); _errHandler.sync(this); _la = _input.LA(1); } - setState(869); + setState(871); match(R_CURLY); } break; @@ -4227,28 +4235,28 @@ public final MethodImplementationProofContext methodImplementationProof() throws try { enterOuterAlt(_localctx, 1); { - setState(873); + setState(875); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(872); + setState(874); match(PURE); } } - setState(875); + setState(877); nonLocalReceiver(); - setState(876); + setState(878); match(IDENTIFIER); - setState(877); - signature(); setState(879); + signature(); + setState(881); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(878); + setState(880); block(); } break; @@ -4292,31 +4300,31 @@ public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(881); - match(L_PAREN); setState(883); + match(L_PAREN); + setState(885); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { - setState(882); + setState(884); match(IDENTIFIER); } break; } - setState(886); + setState(888); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(885); + setState(887); match(STAR); } } - setState(888); + setState(890); typeName(); - setState(889); + setState(891); match(R_PAREN); } } @@ -4355,24 +4363,24 @@ public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); enterRule(_localctx, 126, RULE_selection); try { - setState(896); + setState(898); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(891); + setState(893); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(892); + setState(894); type_(); - setState(893); + setState(895); match(DOT); - setState(894); + setState(896); match(IDENTIFIER); } break; @@ -4416,24 +4424,24 @@ public final ImplementationProofPredicateAliasContext implementationProofPredica try { enterOuterAlt(_localctx, 1); { - setState(898); + setState(900); match(PRED); - setState(899); + setState(901); match(IDENTIFIER); - setState(900); + setState(902); match(DECLARE_ASSIGN); - setState(903); + setState(905); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(901); + setState(903); selection(); } break; case 2: { - setState(902); + setState(904); operandName(); } break; @@ -4480,25 +4488,25 @@ public final MakeContext make() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(905); + setState(907); match(MAKE); - setState(906); + setState(908); match(L_PAREN); - setState(907); + setState(909); type_(); - setState(910); + setState(912); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(908); + setState(910); match(COMMA); - setState(909); + setState(911); expressionList(); } } - setState(912); + setState(914); match(R_PAREN); } } @@ -4537,13 +4545,13 @@ public final New_Context new_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(914); + setState(916); match(NEW); - setState(915); + setState(917); match(L_PAREN); - setState(916); + setState(918); type_(); - setState(917); + setState(919); match(R_PAREN); } } @@ -4586,20 +4594,20 @@ public final SpecMemberContext specMember() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(919); + setState(921); ((SpecMemberContext)_localctx).specification = specification(); - setState(922); + setState(924); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: { - setState(920); + setState(922); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; case 2: { - setState(921); + setState(923); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; @@ -4648,19 +4656,19 @@ public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) thro try { enterOuterAlt(_localctx, 1); { - setState(924); + setState(926); match(FUNC); - setState(925); + setState(927); match(IDENTIFIER); { - setState(926); - signature(); setState(928); + signature(); + setState(930); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { case 1: { - setState(927); + setState(929); blockWithBodyParameterInfo(); } break; @@ -4713,21 +4721,21 @@ public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws R try { enterOuterAlt(_localctx, 1); { - setState(930); + setState(932); match(FUNC); - setState(931); + setState(933); receiver(); - setState(932); + setState(934); match(IDENTIFIER); { - setState(933); - signature(); setState(935); + signature(); + setState(937); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { - setState(934); + setState(936); blockWithBodyParameterInfo(); } break; @@ -4771,9 +4779,9 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(937); + setState(939); match(GHOST); - setState(940); + setState(942); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -4784,7 +4792,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TRUSTED: case FUNC: { - setState(938); + setState(940); specMember(); } break; @@ -4792,7 +4800,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(939); + setState(941); declaration(); } break; @@ -4838,18 +4846,18 @@ public final FpredicateDeclContext fpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(942); + setState(944); match(PRED); - setState(943); + setState(945); match(IDENTIFIER); - setState(944); - parameters(); setState(946); + parameters(); + setState(948); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(945); + setState(947); predicateBody(); } break; @@ -4893,13 +4901,13 @@ public final PredicateBodyContext predicateBody() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(948); + setState(950); match(L_CURLY); - setState(949); + setState(951); expression(0); - setState(950); + setState(952); eos(); - setState(951); + setState(953); match(R_CURLY); } } @@ -4943,20 +4951,20 @@ public final MpredicateDeclContext mpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(953); + setState(955); match(PRED); - setState(954); + setState(956); receiver(); - setState(955); + setState(957); match(IDENTIFIER); - setState(956); - parameters(); setState(958); + parameters(); + setState(960); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(957); + setState(959); predicateBody(); } break; @@ -5002,9 +5010,9 @@ public final VarSpecContext varSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(960); + setState(962); maybeAddressableIdentifierList(); - setState(968); + setState(970); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5027,16 +5035,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(961); + setState(963); type_(); - setState(964); + setState(966); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: { - setState(962); + setState(964); match(ASSIGN); - setState(963); + setState(965); expressionList(); } break; @@ -5045,9 +5053,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(966); + setState(968); match(ASSIGN); - setState(967); + setState(969); expressionList(); } break; @@ -5092,11 +5100,11 @@ public final ShortVarDeclContext shortVarDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(970); + setState(972); maybeAddressableIdentifierList(); - setState(971); + setState(973); match(DECLARE_ASSIGN); - setState(972); + setState(974); expressionList(); } } @@ -5139,31 +5147,31 @@ public final ReceiverContext receiver() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(974); - match(L_PAREN); setState(976); + match(L_PAREN); + setState(978); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: { - setState(975); + setState(977); maybeAddressableIdentifier(); } break; } - setState(978); - type_(); setState(980); + type_(); + setState(982); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(979); + setState(981); match(COMMA); } } - setState(982); + setState(984); match(R_PAREN); } } @@ -5200,20 +5208,20 @@ public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); enterRule(_localctx, 154, RULE_parameterDecl); try { - setState(986); + setState(988); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(984); + setState(986); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(985); + setState(987); ghostParameterDecl(); } break; @@ -5254,17 +5262,17 @@ public final ActualParameterDeclContext actualParameterDecl() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(989); + setState(991); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: { - setState(988); + setState(990); identifierList(); } break; } - setState(991); + setState(993); parameterType(); } } @@ -5304,19 +5312,19 @@ public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(993); - match(GHOST); setState(995); + match(GHOST); + setState(997); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { case 1: { - setState(994); + setState(996); identifierList(); } break; } - setState(997); + setState(999); parameterType(); } } @@ -5354,17 +5362,17 @@ public final ParameterTypeContext parameterType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1000); + setState(1002); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(999); + setState(1001); match(ELLIPSIS); } } - setState(1002); + setState(1004); type_(); } } @@ -5654,7 +5662,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1020); + setState(1022); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: @@ -5663,7 +5671,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(1005); + setState(1007); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)))) != 0)) ) { @@ -5674,7 +5682,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1006); + setState(1008); expression(14); } break; @@ -5683,7 +5691,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1007); + setState(1009); primaryExpr(0); } break; @@ -5692,13 +5700,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1008); + setState(1010); match(UNFOLDING); - setState(1009); + setState(1011); predicateAccess(); - setState(1010); + setState(1012); match(IN); - setState(1011); + setState(1013); expression(2); } break; @@ -5707,7 +5715,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1013); + setState(1015); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -5717,21 +5725,21 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1014); + setState(1016); boundVariables(); - setState(1015); + setState(1017); match(COLON); - setState(1016); + setState(1018); match(COLON); - setState(1017); + setState(1019); triggers(); - setState(1018); + setState(1020); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1057); + setState(1059); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,79,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -5739,16 +5747,16 @@ private ExpressionContext expression(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1055); + setState(1057); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1022); + setState(1024); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1023); + setState(1025); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (DIV - 125)) | (1L << (MOD - 125)) | (1L << (LSHIFT - 125)) | (1L << (RSHIFT - 125)) | (1L << (BIT_CLEAR - 125)) | (1L << (STAR - 125)) | (1L << (AMPERSAND - 125)))) != 0)) ) { @@ -5759,7 +5767,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1024); + setState(1026); expression(13); } break; @@ -5767,9 +5775,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1025); + setState(1027); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1026); + setState(1028); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); if ( !(_la==WAND || ((((_la - 112)) & ~0x3f) == 0 && ((1L << (_la - 112)) & ((1L << (PLUS_PLUS - 112)) | (1L << (OR - 112)) | (1L << (PLUS - 112)) | (1L << (MINUS - 112)) | (1L << (CARET - 112)))) != 0)) ) { @@ -5780,7 +5788,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1027); + setState(1029); expression(12); } break; @@ -5788,9 +5796,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1028); + setState(1030); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1029); + setState(1031); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << UNION) | (1L << INTERSECTION) | (1L << SETMINUS))) != 0)) ) { @@ -5801,7 +5809,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1030); + setState(1032); expression(11); } break; @@ -5809,9 +5817,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1031); + setState(1033); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1032); + setState(1034); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << IN) | (1L << MULTI) | (1L << SUBSET))) != 0)) ) { @@ -5822,7 +5830,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1033); + setState(1035); expression(10); } break; @@ -5830,9 +5838,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1034); + setState(1036); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1035); + setState(1037); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (GHOST_EQUALS - 71)) | (1L << (GHOST_NOT_EQUALS - 71)) | (1L << (EQUALS - 71)) | (1L << (NOT_EQUALS - 71)) | (1L << (LESS - 71)) | (1L << (LESS_OR_EQUALS - 71)) | (1L << (GREATER - 71)) | (1L << (GREATER_OR_EQUALS - 71)))) != 0)) ) { @@ -5843,7 +5851,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1036); + setState(1038); expression(9); } break; @@ -5851,11 +5859,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1037); + setState(1039); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1038); + setState(1040); match(LOGICAL_AND); - setState(1039); + setState(1041); expression(7); } break; @@ -5863,11 +5871,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1040); + setState(1042); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1041); + setState(1043); match(LOGICAL_OR); - setState(1042); + setState(1044); expression(6); } break; @@ -5875,11 +5883,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1043); + setState(1045); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1044); + setState(1046); match(IMPLIES); - setState(1045); + setState(1047); expression(4); } break; @@ -5887,15 +5895,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1046); + setState(1048); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1047); + setState(1049); match(QMARK); - setState(1048); + setState(1050); expression(0); - setState(1049); + setState(1051); match(COLON); - setState(1050); + setState(1052); expression(3); } break; @@ -5903,18 +5911,18 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1052); + setState(1054); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1053); + setState(1055); match(IMPL); - setState(1054); + setState(1056); closureSpecInstance(); } break; } } } - setState(1059); + setState(1061); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,79,_ctx); } @@ -6007,146 +6015,146 @@ public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 164, RULE_statement); try { - setState(1080); + setState(1082); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1060); + setState(1062); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1061); + setState(1063); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1062); + setState(1064); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1063); + setState(1065); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1064); + setState(1066); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1065); + setState(1067); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1066); + setState(1068); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1067); + setState(1069); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1068); + setState(1070); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1069); + setState(1071); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1070); + setState(1072); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1071); + setState(1073); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1072); + setState(1074); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1073); + setState(1075); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1074); + setState(1076); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1075); + setState(1077); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1076); + setState(1078); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1077); + setState(1079); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1078); + setState(1080); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1079); + setState(1081); closureImplProofStmt(); } break; @@ -6185,9 +6193,9 @@ public final ApplyStmtContext applyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1082); + setState(1084); match(APPLY); - setState(1083); + setState(1085); expression(0); } } @@ -6227,16 +6235,16 @@ public final PackageStmtContext packageStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1085); + setState(1087); match(PACKAGE); - setState(1086); - expression(0); setState(1088); + expression(0); + setState(1090); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { - setState(1087); + setState(1089); block(); } break; @@ -6278,9 +6286,9 @@ public final SpecForStmtContext specForStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1090); + setState(1092); loopSpec(); - setState(1091); + setState(1093); forStmt(); } } @@ -6334,34 +6342,34 @@ public final LoopSpecContext loopSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1099); + setState(1101); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1093); + setState(1095); match(INV); - setState(1094); + setState(1096); expression(0); - setState(1095); + setState(1097); eos(); } } - setState(1101); + setState(1103); _errHandler.sync(this); _la = _input.LA(1); } - setState(1106); + setState(1108); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1102); + setState(1104); match(DEC); - setState(1103); + setState(1105); terminationMeasure(); - setState(1104); + setState(1106); eos(); } } @@ -6406,24 +6414,24 @@ public final DeferStmtContext deferStmt() throws RecognitionException { enterRule(_localctx, 174, RULE_deferStmt); int _la; try { - setState(1113); + setState(1115); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1108); + setState(1110); match(DEFER); - setState(1109); + setState(1111); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1110); + setState(1112); match(DEFER); - setState(1111); + setState(1113); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -6434,7 +6442,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1112); + setState(1114); predicateAccess(); } break; @@ -6479,62 +6487,62 @@ public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); enterRule(_localctx, 176, RULE_basicLit); try { - setState(1123); + setState(1125); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1115); + setState(1117); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1116); + setState(1118); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1117); + setState(1119); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1118); + setState(1120); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1119); + setState(1121); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1120); + setState(1122); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1121); + setState(1123); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1122); + setState(1124); match(RUNE_LIT); } break; @@ -6778,7 +6786,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1137); + setState(1139); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { case 1: @@ -6787,7 +6795,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(1126); + setState(1128); operand(); } break; @@ -6796,7 +6804,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1127); + setState(1129); conversion(); } break; @@ -6805,7 +6813,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1128); + setState(1130); methodExpr(); } break; @@ -6814,7 +6822,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1129); + setState(1131); ghostPrimaryExpr(); } break; @@ -6823,7 +6831,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1130); + setState(1132); new_(); } break; @@ -6832,7 +6840,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1131); + setState(1133); make(); } break; @@ -6841,7 +6849,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1132); + setState(1134); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 44)) & ~0x3f) == 0 && ((1L << (_la - 44)) & ((1L << (LEN - 44)) | (1L << (CAP - 44)) | (1L << (DOM - 44)) | (1L << (RANGE - 44)))) != 0)) ) { @@ -6852,17 +6860,17 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1133); + setState(1135); match(L_PAREN); - setState(1134); + setState(1136); expression(0); - setState(1135); + setState(1137); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1161); + setState(1163); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,88,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -6870,18 +6878,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1159); + setState(1161); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1139); + setState(1141); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1140); + setState(1142); match(DOT); - setState(1141); + setState(1143); match(IDENTIFIER); } break; @@ -6889,9 +6897,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1142); + setState(1144); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1143); + setState(1145); index(); } break; @@ -6899,9 +6907,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1144); + setState(1146); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1145); + setState(1147); slice_(); } break; @@ -6909,9 +6917,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1146); + setState(1148); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1147); + setState(1149); seqUpdExp(); } break; @@ -6919,9 +6927,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1148); + setState(1150); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1149); + setState(1151); typeAssertion(); } break; @@ -6929,9 +6937,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1150); + setState(1152); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1151); + setState(1153); arguments(); } break; @@ -6939,13 +6947,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1152); + setState(1154); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1153); + setState(1155); arguments(); - setState(1154); + setState(1156); match(AS); - setState(1155); + setState(1157); closureSpecInstance(); } break; @@ -6953,16 +6961,16 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1157); + setState(1159); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1158); + setState(1160); predConstructArgs(); } break; } } } - setState(1163); + setState(1165); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,88,_ctx); } @@ -7004,9 +7012,9 @@ public final FunctionLitContext functionLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1164); + setState(1166); ((FunctionLitContext)_localctx).specification = specification(); - setState(1165); + setState(1167); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7053,27 +7061,27 @@ public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws try { enterOuterAlt(_localctx, 1); { - setState(1167); - match(FUNC); setState(1169); + match(FUNC); + setState(1171); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1168); + setState(1170); match(IDENTIFIER); } } { - setState(1171); - signature(); setState(1173); + signature(); + setState(1175); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { - setState(1172); + setState(1174); blockWithBodyParameterInfo(); } break; @@ -7117,29 +7125,29 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1175); - match(L_PRED); setState(1177); + match(L_PRED); + setState(1179); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1176); + setState(1178); expressionList(); } } - setState(1180); + setState(1182); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1179); + setState(1181); match(COMMA); } } - setState(1182); + setState(1184); match(R_PRED); } } @@ -7200,47 +7208,47 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1184); + setState(1186); match(INTERFACE); - setState(1185); + setState(1187); match(L_CURLY); - setState(1195); + setState(1197); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << GHOST) | (1L << PRED))) != 0) || _la==TRUSTED || _la==IDENTIFIER) { { { - setState(1189); + setState(1191); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(1186); + setState(1188); methodSpec(); } break; case 2: { - setState(1187); + setState(1189); typeName(); } break; case 3: { - setState(1188); + setState(1190); predicateSpec(); } break; } - setState(1191); + setState(1193); eos(); } } - setState(1197); + setState(1199); _errHandler.sync(this); _la = _input.LA(1); } - setState(1198); + setState(1200); match(R_CURLY); } } @@ -7278,11 +7286,11 @@ public final PredicateSpecContext predicateSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1200); + setState(1202); match(PRED); - setState(1201); + setState(1203); match(IDENTIFIER); - setState(1202); + setState(1204); parameters(); } } @@ -7325,50 +7333,50 @@ public final MethodSpecContext methodSpec() throws RecognitionException { enterRule(_localctx, 190, RULE_methodSpec); int _la; try { - setState(1219); + setState(1221); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1205); + setState(1207); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1204); + setState(1206); match(GHOST); } } - setState(1207); + setState(1209); specification(); - setState(1208); + setState(1210); match(IDENTIFIER); - setState(1209); + setState(1211); parameters(); - setState(1210); + setState(1212); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1213); + setState(1215); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1212); + setState(1214); match(GHOST); } } - setState(1215); + setState(1217); specification(); - setState(1216); + setState(1218); match(IDENTIFIER); - setState(1217); + setState(1219); parameters(); } break; @@ -7415,13 +7423,13 @@ public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); enterRule(_localctx, 192, RULE_type_); try { - setState(1228); + setState(1230); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1221); + setState(1223); typeName(); } break; @@ -7436,7 +7444,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1222); + setState(1224); typeLit(); } break; @@ -7450,18 +7458,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1223); + setState(1225); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1224); + setState(1226); match(L_PAREN); - setState(1225); + setState(1227); type_(); - setState(1226); + setState(1228); match(R_PAREN); } break; @@ -7523,69 +7531,69 @@ public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); enterRule(_localctx, 194, RULE_typeLit); try { - setState(1239); + setState(1241); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1230); + setState(1232); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1231); + setState(1233); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1232); + setState(1234); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1233); + setState(1235); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1234); + setState(1236); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1235); + setState(1237); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1236); + setState(1238); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1237); + setState(1239); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1238); + setState(1240); predType(); } break; @@ -7624,9 +7632,9 @@ public final PredTypeContext predType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1241); + setState(1243); match(PRED); - setState(1242); + setState(1244); predTypeParams(); } } @@ -7673,39 +7681,39 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1244); + setState(1246); match(L_PAREN); - setState(1256); + setState(1258); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) { { - setState(1245); + setState(1247); type_(); - setState(1250); + setState(1252); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,100,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1246); + setState(1248); match(COMMA); - setState(1247); + setState(1249); type_(); } } } - setState(1252); + setState(1254); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,100,_ctx); } - setState(1254); + setState(1256); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1253); + setState(1255); match(COMMA); } } @@ -7713,7 +7721,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1258); + setState(1260); match(R_PAREN); } } @@ -7765,55 +7773,55 @@ public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); enterRule(_localctx, 200, RULE_literalType); try { - setState(1267); + setState(1269); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1260); + setState(1262); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1261); + setState(1263); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1262); + setState(1264); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1263); + setState(1265); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1264); + setState(1266); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1265); + setState(1267); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1266); + setState(1268); typeName(); } break; @@ -7854,13 +7862,13 @@ public final ImplicitArrayContext implicitArray() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1269); + setState(1271); match(L_BRACKET); - setState(1270); + setState(1272); match(ELLIPSIS); - setState(1271); + setState(1273); match(R_BRACKET); - setState(1272); + setState(1274); elementType(); } } @@ -7909,31 +7917,31 @@ public final Slice_Context slice_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1274); + setState(1276); match(L_BRACKET); - setState(1290); + setState(1292); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) { case 1: { - setState(1276); + setState(1278); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1275); + setState(1277); low(); } } - setState(1278); - match(COLON); setState(1280); + match(COLON); + setState(1282); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1279); + setState(1281); high(); } } @@ -7942,28 +7950,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1283); + setState(1285); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1282); + setState(1284); low(); } } - setState(1285); - match(COLON); - setState(1286); - high(); setState(1287); match(COLON); setState(1288); + high(); + setState(1289); + match(COLON); + setState(1290); cap(); } break; } - setState(1292); + setState(1294); match(R_BRACKET); } } @@ -7999,7 +8007,7 @@ public final LowContext low() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1294); + setState(1296); expression(0); } } @@ -8035,7 +8043,7 @@ public final HighContext high() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1296); + setState(1298); expression(0); } } @@ -8071,7 +8079,7 @@ public final CapContext cap() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1298); + setState(1300); expression(0); } } @@ -8118,12 +8126,12 @@ public final Assign_opContext assign_op() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1301); + setState(1303); _errHandler.sync(this); _la = _input.LA(1); if (((((_la - 124)) & ~0x3f) == 0 && ((1L << (_la - 124)) & ((1L << (OR - 124)) | (1L << (DIV - 124)) | (1L << (MOD - 124)) | (1L << (LSHIFT - 124)) | (1L << (RSHIFT - 124)) | (1L << (BIT_CLEAR - 124)) | (1L << (PLUS - 124)) | (1L << (MINUS - 124)) | (1L << (CARET - 124)) | (1L << (STAR - 124)) | (1L << (AMPERSAND - 124)))) != 0)) { { - setState(1300); + setState(1302); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 124)) & ~0x3f) == 0 && ((1L << (_la - 124)) & ((1L << (OR - 124)) | (1L << (DIV - 124)) | (1L << (MOD - 124)) | (1L << (LSHIFT - 124)) | (1L << (RSHIFT - 124)) | (1L << (BIT_CLEAR - 124)) | (1L << (PLUS - 124)) | (1L << (MINUS - 124)) | (1L << (CARET - 124)) | (1L << (STAR - 124)) | (1L << (AMPERSAND - 124)))) != 0)) ) { @@ -8137,7 +8145,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1303); + setState(1305); match(ASSIGN); } } @@ -8185,43 +8193,43 @@ public final RangeClauseContext rangeClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1311); + setState(1313); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { case 1: { - setState(1305); + setState(1307); expressionList(); - setState(1306); + setState(1308); match(ASSIGN); } break; case 2: { - setState(1308); + setState(1310); maybeAddressableIdentifierList(); - setState(1309); + setState(1311); match(DECLARE_ASSIGN); } break; } - setState(1313); + setState(1315); match(RANGE); - setState(1314); + setState(1316); expression(0); - setState(1319); + setState(1321); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1315); - match(WITH); setState(1317); + match(WITH); + setState(1319); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1316); + setState(1318); match(IDENTIFIER); } } @@ -8263,9 +8271,9 @@ public final PackageClauseContext packageClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1321); + setState(1323); match(PACKAGE); - setState(1322); + setState(1324); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -8301,7 +8309,7 @@ public final ImportPathContext importPath() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1324); + setState(1326); string_(); } } @@ -8341,27 +8349,27 @@ public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); enterRule(_localctx, 220, RULE_declaration); try { - setState(1329); + setState(1331); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1326); + setState(1328); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1327); + setState(1329); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1328); + setState(1330); varDecl(); } break; @@ -8414,38 +8422,38 @@ public final ConstDeclContext constDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1331); + setState(1333); match(CONST); - setState(1343); + setState(1345); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1332); + setState(1334); constSpec(); } break; case L_PAREN: { - setState(1333); + setState(1335); match(L_PAREN); - setState(1339); + setState(1341); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1334); + setState(1336); constSpec(); - setState(1335); + setState(1337); eos(); } } - setState(1341); + setState(1343); _errHandler.sync(this); _la = _input.LA(1); } - setState(1342); + setState(1344); match(R_PAREN); } break; @@ -8494,26 +8502,26 @@ public final ConstSpecContext constSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1345); + setState(1347); identifierList(); - setState(1351); + setState(1353); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { case 1: { - setState(1347); + setState(1349); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) { { - setState(1346); + setState(1348); type_(); } } - setState(1349); + setState(1351); match(ASSIGN); - setState(1350); + setState(1352); expressionList(); } break; @@ -8558,23 +8566,23 @@ public final IdentifierListContext identifierList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1353); + setState(1355); match(IDENTIFIER); - setState(1358); + setState(1360); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,117,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1354); + setState(1356); match(COMMA); - setState(1355); + setState(1357); match(IDENTIFIER); } } } - setState(1360); + setState(1362); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,117,_ctx); } @@ -8620,23 +8628,23 @@ public final ExpressionListContext expressionList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1361); + setState(1363); expression(0); - setState(1366); + setState(1368); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,118,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1362); + setState(1364); match(COMMA); - setState(1363); + setState(1365); expression(0); } } } - setState(1368); + setState(1370); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,118,_ctx); } @@ -8687,38 +8695,38 @@ public final TypeDeclContext typeDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1369); + setState(1371); match(TYPE); - setState(1381); + setState(1383); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1370); + setState(1372); typeSpec(); } break; case L_PAREN: { - setState(1371); + setState(1373); match(L_PAREN); - setState(1377); + setState(1379); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1372); + setState(1374); typeSpec(); - setState(1373); + setState(1375); eos(); } } - setState(1379); + setState(1381); _errHandler.sync(this); _la = _input.LA(1); } - setState(1380); + setState(1382); match(R_PAREN); } break; @@ -8762,19 +8770,19 @@ public final TypeSpecContext typeSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1383); - match(IDENTIFIER); setState(1385); + match(IDENTIFIER); + setState(1387); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1384); + setState(1386); match(ASSIGN); } } - setState(1387); + setState(1389); type_(); } } @@ -8823,38 +8831,38 @@ public final VarDeclContext varDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1389); + setState(1391); match(VAR); - setState(1401); + setState(1403); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1390); + setState(1392); varSpec(); } break; case L_PAREN: { - setState(1391); + setState(1393); match(L_PAREN); - setState(1397); + setState(1399); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1392); + setState(1394); varSpec(); - setState(1393); + setState(1395); eos(); } } - setState(1399); + setState(1401); _errHandler.sync(this); _la = _input.LA(1); } - setState(1400); + setState(1402); match(R_PAREN); } break; @@ -8897,19 +8905,19 @@ public final BlockContext block() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1403); - match(L_CURLY); setState(1405); + match(L_CURLY); + setState(1407); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { case 1: { - setState(1404); + setState(1406); statementList(); } break; } - setState(1407); + setState(1409); match(R_CURLY); } } @@ -8955,7 +8963,7 @@ public final StatementListContext statementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1415); + setState(1417); _errHandler.sync(this); _alt = 1; do { @@ -8963,19 +8971,19 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1410); + setState(1412); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { case 1: { - setState(1409); + setState(1411); eos(); } break; } - setState(1412); + setState(1414); statement(); - setState(1413); + setState(1415); eos(); } } @@ -8983,7 +8991,7 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1417); + setState(1419); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,126,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -9031,41 +9039,41 @@ public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); enterRule(_localctx, 240, RULE_simpleStmt); try { - setState(1424); + setState(1426); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1419); + setState(1421); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1420); + setState(1422); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1421); + setState(1423); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1422); + setState(1424); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1423); + setState(1425); shortVarDecl(); } break; @@ -9103,7 +9111,7 @@ public final ExpressionStmtContext expressionStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1426); + setState(1428); expression(0); } } @@ -9144,11 +9152,11 @@ public final SendStmtContext sendStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1428); + setState(1430); ((SendStmtContext)_localctx).channel = expression(0); - setState(1429); + setState(1431); match(RECEIVE); - setState(1430); + setState(1432); expression(0); } } @@ -9187,9 +9195,9 @@ public final IncDecStmtContext incDecStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1432); + setState(1434); expression(0); - setState(1433); + setState(1435); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -9239,11 +9247,11 @@ public final AssignmentContext assignment() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1435); + setState(1437); expressionList(); - setState(1436); + setState(1438); assign_op(); - setState(1437); + setState(1439); expressionList(); } } @@ -9279,7 +9287,7 @@ public final EmptyStmtContext emptyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1439); + setState(1441); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -9325,16 +9333,16 @@ public final LabeledStmtContext labeledStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1441); + setState(1443); match(IDENTIFIER); - setState(1442); - match(COLON); setState(1444); + match(COLON); + setState(1446); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { case 1: { - setState(1443); + setState(1445); statement(); } break; @@ -9374,14 +9382,14 @@ public final ReturnStmtContext returnStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1446); - match(RETURN); setState(1448); + match(RETURN); + setState(1450); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: { - setState(1447); + setState(1449); expressionList(); } break; @@ -9419,14 +9427,14 @@ public final BreakStmtContext breakStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1450); - match(BREAK); setState(1452); + match(BREAK); + setState(1454); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: { - setState(1451); + setState(1453); match(IDENTIFIER); } break; @@ -9464,14 +9472,14 @@ public final ContinueStmtContext continueStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1454); - match(CONTINUE); setState(1456); + match(CONTINUE); + setState(1458); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { case 1: { - setState(1455); + setState(1457); match(IDENTIFIER); } break; @@ -9509,9 +9517,9 @@ public final GotoStmtContext gotoStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1458); + setState(1460); match(GOTO); - setState(1459); + setState(1461); match(IDENTIFIER); } } @@ -9545,7 +9553,7 @@ public final FallthroughStmtContext fallthroughStmt() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1461); + setState(1463); match(FALLTHROUGH); } } @@ -9598,57 +9606,57 @@ public final IfStmtContext ifStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1463); + setState(1465); match(IF); - setState(1472); + setState(1474); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { case 1: { - setState(1464); + setState(1466); expression(0); } break; case 2: { - setState(1465); + setState(1467); eos(); - setState(1466); + setState(1468); expression(0); } break; case 3: { - setState(1468); + setState(1470); simpleStmt(); - setState(1469); + setState(1471); eos(); - setState(1470); + setState(1472); expression(0); } break; } - setState(1474); + setState(1476); block(); - setState(1480); + setState(1482); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { case 1: { - setState(1475); + setState(1477); match(ELSE); - setState(1478); + setState(1480); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1476); + setState(1478); ifStmt(); } break; case L_CURLY: { - setState(1477); + setState(1479); block(); } break; @@ -9693,20 +9701,20 @@ public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); enterRule(_localctx, 266, RULE_switchStmt); try { - setState(1484); + setState(1486); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1482); + setState(1484); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1483); + setState(1485); typeSwitchStmt(); } break; @@ -9760,19 +9768,19 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1486); + setState(1488); match(SWITCH); - setState(1497); + setState(1499); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: { - setState(1488); + setState(1490); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1487); + setState(1489); expression(0); } } @@ -9781,24 +9789,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1491); + setState(1493); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { case 1: { - setState(1490); + setState(1492); simpleStmt(); } break; } - setState(1493); - eos(); setState(1495); + eos(); + setState(1497); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1494); + setState(1496); expression(0); } } @@ -9806,23 +9814,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1499); + setState(1501); match(L_CURLY); - setState(1503); + setState(1505); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1500); + setState(1502); exprCaseClause(); } } - setState(1505); + setState(1507); _errHandler.sync(this); _la = _input.LA(1); } - setState(1506); + setState(1508); match(R_CURLY); } } @@ -9862,16 +9870,16 @@ public final ExprCaseClauseContext exprCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1508); + setState(1510); exprSwitchCase(); - setState(1509); - match(COLON); setState(1511); + match(COLON); + setState(1513); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { case 1: { - setState(1510); + setState(1512); statementList(); } break; @@ -9910,22 +9918,22 @@ public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 272, RULE_exprSwitchCase); try { - setState(1516); + setState(1518); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1513); + setState(1515); match(CASE); - setState(1514); + setState(1516); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1515); + setState(1517); match(DEFAULT); } break; @@ -9981,53 +9989,53 @@ public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1518); + setState(1520); match(SWITCH); - setState(1527); + setState(1529); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: { - setState(1519); + setState(1521); typeSwitchGuard(); } break; case 2: { - setState(1520); + setState(1522); eos(); - setState(1521); + setState(1523); typeSwitchGuard(); } break; case 3: { - setState(1523); + setState(1525); simpleStmt(); - setState(1524); + setState(1526); eos(); - setState(1525); + setState(1527); typeSwitchGuard(); } break; } - setState(1529); + setState(1531); match(L_CURLY); - setState(1533); + setState(1535); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1530); + setState(1532); typeCaseClause(); } } - setState(1535); + setState(1537); _errHandler.sync(this); _la = _input.LA(1); } - setState(1536); + setState(1538); match(R_CURLY); } } @@ -10069,27 +10077,27 @@ public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1540); + setState(1542); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1538); + setState(1540); match(IDENTIFIER); - setState(1539); + setState(1541); match(DECLARE_ASSIGN); } break; } - setState(1542); + setState(1544); primaryExpr(0); - setState(1543); + setState(1545); match(DOT); - setState(1544); + setState(1546); match(L_PAREN); - setState(1545); + setState(1547); match(TYPE); - setState(1546); + setState(1548); match(R_PAREN); } } @@ -10129,16 +10137,16 @@ public final TypeCaseClauseContext typeCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1548); + setState(1550); typeSwitchCase(); - setState(1549); - match(COLON); setState(1551); + match(COLON); + setState(1553); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1550); + setState(1552); statementList(); } break; @@ -10177,22 +10185,22 @@ public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 280, RULE_typeSwitchCase); try { - setState(1556); + setState(1558); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1553); + setState(1555); match(CASE); - setState(1554); + setState(1556); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1555); + setState(1557); match(DEFAULT); } break; @@ -10244,7 +10252,7 @@ public final TypeListContext typeList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1560); + setState(1562); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10267,28 +10275,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1558); + setState(1560); type_(); } break; case NIL_LIT: { - setState(1559); + setState(1561); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1569); + setState(1571); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1562); + setState(1564); match(COMMA); - setState(1565); + setState(1567); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10311,13 +10319,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1563); + setState(1565); type_(); } break; case NIL_LIT: { - setState(1564); + setState(1566); match(NIL_LIT); } break; @@ -10326,7 +10334,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1571); + setState(1573); _errHandler.sync(this); _la = _input.LA(1); } @@ -10371,25 +10379,25 @@ public final SelectStmtContext selectStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1572); + setState(1574); match(SELECT); - setState(1573); + setState(1575); match(L_CURLY); - setState(1577); + setState(1579); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1574); + setState(1576); commClause(); } } - setState(1579); + setState(1581); _errHandler.sync(this); _la = _input.LA(1); } - setState(1580); + setState(1582); match(R_CURLY); } } @@ -10429,16 +10437,16 @@ public final CommClauseContext commClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1582); + setState(1584); commCase(); - setState(1583); - match(COLON); setState(1585); + match(COLON); + setState(1587); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { case 1: { - setState(1584); + setState(1586); statementList(); } break; @@ -10480,26 +10488,26 @@ public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); enterRule(_localctx, 288, RULE_commCase); try { - setState(1593); + setState(1595); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1587); + setState(1589); match(CASE); - setState(1590); + setState(1592); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { case 1: { - setState(1588); + setState(1590); sendStmt(); } break; case 2: { - setState(1589); + setState(1591); recvStmt(); } break; @@ -10509,7 +10517,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1592); + setState(1594); match(DEFAULT); } break; @@ -10558,27 +10566,27 @@ public final RecvStmtContext recvStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1601); + setState(1603); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { case 1: { - setState(1595); + setState(1597); expressionList(); - setState(1596); + setState(1598); match(ASSIGN); } break; case 2: { - setState(1598); + setState(1600); identifierList(); - setState(1599); + setState(1601); match(DECLARE_ASSIGN); } break; } - setState(1603); + setState(1605); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -10624,31 +10632,31 @@ public final ForStmtContext forStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1605); + setState(1607); match(FOR); - setState(1609); + setState(1611); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { case 1: { - setState(1606); + setState(1608); expression(0); } break; case 2: { - setState(1607); + setState(1609); forClause(); } break; case 3: { - setState(1608); + setState(1610); rangeClause(); } break; } - setState(1611); + setState(1613); block(); } } @@ -10699,36 +10707,36 @@ public final ForClauseContext forClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1614); + setState(1616); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: { - setState(1613); + setState(1615); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1616); - eos(); setState(1618); + eos(); + setState(1620); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { case 1: { - setState(1617); + setState(1619); expression(0); } break; } - setState(1620); - eos(); setState(1622); + eos(); + setState(1624); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1621); + setState(1623); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -10768,9 +10776,9 @@ public final GoStmtContext goStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1624); + setState(1626); match(GO); - setState(1625); + setState(1627); expression(0); } } @@ -10805,20 +10813,20 @@ public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); enterRule(_localctx, 298, RULE_typeName); try { - setState(1629); + setState(1631); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1627); + setState(1629); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1628); + setState(1630); match(IDENTIFIER); } break; @@ -10861,13 +10869,13 @@ public final ArrayTypeContext arrayType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1631); + setState(1633); match(L_BRACKET); - setState(1632); + setState(1634); arrayLength(); - setState(1633); + setState(1635); match(R_BRACKET); - setState(1634); + setState(1636); elementType(); } } @@ -10903,7 +10911,7 @@ public final ArrayLengthContext arrayLength() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1636); + setState(1638); expression(0); } } @@ -10939,7 +10947,7 @@ public final ElementTypeContext elementType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1638); + setState(1640); type_(); } } @@ -10976,9 +10984,9 @@ public final PointerTypeContext pointerType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1640); + setState(1642); match(STAR); - setState(1641); + setState(1643); type_(); } } @@ -11016,11 +11024,11 @@ public final SliceTypeContext sliceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1643); + setState(1645); match(L_BRACKET); - setState(1644); + setState(1646); match(R_BRACKET); - setState(1645); + setState(1647); elementType(); } } @@ -11062,15 +11070,15 @@ public final MapTypeContext mapType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1647); + setState(1649); match(MAP); - setState(1648); + setState(1650); match(L_BRACKET); - setState(1649); + setState(1651); type_(); - setState(1650); + setState(1652); match(R_BRACKET); - setState(1651); + setState(1653); elementType(); } } @@ -11108,33 +11116,33 @@ public final ChannelTypeContext channelType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1658); + setState(1660); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { case 1: { - setState(1653); + setState(1655); match(CHAN); } break; case 2: { - setState(1654); + setState(1656); match(CHAN); - setState(1655); + setState(1657); match(RECEIVE); } break; case 3: { - setState(1656); + setState(1658); match(RECEIVE); - setState(1657); + setState(1659); match(CHAN); } break; } - setState(1660); + setState(1662); elementType(); } } @@ -11171,9 +11179,9 @@ public final FunctionTypeContext functionType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1662); + setState(1664); match(FUNC); - setState(1663); + setState(1665); signature(); } } @@ -11210,22 +11218,22 @@ public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); enterRule(_localctx, 316, RULE_signature); try { - setState(1669); + setState(1671); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1665); + setState(1667); parameters(); - setState(1666); + setState(1668); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1668); + setState(1670); parameters(); } break; @@ -11264,20 +11272,20 @@ public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); enterRule(_localctx, 318, RULE_result); try { - setState(1673); + setState(1675); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1671); + setState(1673); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1672); + setState(1674); type_(); } break; @@ -11326,39 +11334,39 @@ public final ParametersContext parameters() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1675); + setState(1677); match(L_PAREN); - setState(1687); + setState(1689); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (ELLIPSIS - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) { { - setState(1676); + setState(1678); parameterDecl(); - setState(1681); + setState(1683); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,164,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1677); + setState(1679); match(COMMA); - setState(1678); + setState(1680); parameterDecl(); } } } - setState(1683); + setState(1685); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,164,_ctx); } - setState(1685); + setState(1687); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1684); + setState(1686); match(COMMA); } } @@ -11366,7 +11374,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1689); + setState(1691); match(R_PAREN); } } @@ -11409,23 +11417,23 @@ public final ConversionContext conversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1691); + setState(1693); nonNamedType(); - setState(1692); + setState(1694); match(L_PAREN); - setState(1693); - expression(0); setState(1695); + expression(0); + setState(1697); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1694); + setState(1696); match(COMMA); } } - setState(1697); + setState(1699); match(R_PAREN); } } @@ -11464,7 +11472,7 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); enterRule(_localctx, 324, RULE_nonNamedType); try { - setState(1704); + setState(1706); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -11478,18 +11486,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1699); + setState(1701); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1700); + setState(1702); match(L_PAREN); - setState(1701); + setState(1703); nonNamedType(); - setState(1702); + setState(1704); match(R_PAREN); } break; @@ -11535,31 +11543,31 @@ public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); enterRule(_localctx, 326, RULE_operand); try { - setState(1712); + setState(1714); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1706); + setState(1708); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1707); + setState(1709); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1708); + setState(1710); match(L_PAREN); - setState(1709); + setState(1711); expression(0); - setState(1710); + setState(1712); match(R_PAREN); } break; @@ -11601,7 +11609,7 @@ public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); enterRule(_localctx, 328, RULE_literal); try { - setState(1717); + setState(1719); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11618,7 +11626,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1714); + setState(1716); basicLit(); } break; @@ -11636,7 +11644,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1715); + setState(1717); compositeLit(); } break; @@ -11649,7 +11657,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1716); + setState(1718); functionLit(); } break; @@ -11693,7 +11701,7 @@ public final IntegerContext integer() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1719); + setState(1721); _la = _input.LA(1); if ( !(((((_la - 137)) & ~0x3f) == 0 && ((1L << (_la - 137)) & ((1L << (DECIMAL_LIT - 137)) | (1L << (BINARY_LIT - 137)) | (1L << (OCTAL_LIT - 137)) | (1L << (HEX_LIT - 137)) | (1L << (IMAGINARY_LIT - 137)) | (1L << (RUNE_LIT - 137)))) != 0)) ) { _errHandler.recoverInline(this); @@ -11735,7 +11743,7 @@ public final OperandNameContext operandName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1721); + setState(1723); match(IDENTIFIER); } } @@ -11773,11 +11781,11 @@ public final QualifiedIdentContext qualifiedIdent() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1723); + setState(1725); match(IDENTIFIER); - setState(1724); + setState(1726); match(DOT); - setState(1725); + setState(1727); match(IDENTIFIER); } } @@ -11816,9 +11824,9 @@ public final CompositeLitContext compositeLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1727); + setState(1729); literalType(); - setState(1728); + setState(1730); literalValue(); } } @@ -11858,21 +11866,21 @@ public final LiteralValueContext literalValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1730); + setState(1732); match(L_CURLY); - setState(1735); + setState(1737); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1731); - elementList(); setState(1733); + elementList(); + setState(1735); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1732); + setState(1734); match(COMMA); } } @@ -11880,7 +11888,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1737); + setState(1739); match(R_CURLY); } } @@ -11924,23 +11932,23 @@ public final ElementListContext elementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1739); + setState(1741); keyedElement(); - setState(1744); + setState(1746); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,173,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1740); + setState(1742); match(COMMA); - setState(1741); + setState(1743); keyedElement(); } } } - setState(1746); + setState(1748); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,173,_ctx); } @@ -11982,19 +11990,19 @@ public final KeyedElementContext keyedElement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1750); + setState(1752); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { case 1: { - setState(1747); + setState(1749); key(); - setState(1748); + setState(1750); match(COLON); } break; } - setState(1752); + setState(1754); element(); } } @@ -12031,7 +12039,7 @@ public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); enterRule(_localctx, 344, RULE_key); try { - setState(1756); + setState(1758); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12098,14 +12106,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1754); + setState(1756); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1755); + setState(1757); literalValue(); } break; @@ -12146,7 +12154,7 @@ public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); enterRule(_localctx, 346, RULE_element); try { - setState(1760); + setState(1762); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12213,14 +12221,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1758); + setState(1760); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1759); + setState(1761); literalValue(); } break; @@ -12273,27 +12281,27 @@ public final StructTypeContext structType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1762); + setState(1764); match(STRUCT); - setState(1763); + setState(1765); match(L_CURLY); - setState(1769); + setState(1771); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1764); + setState(1766); fieldDecl(); - setState(1765); + setState(1767); eos(); } } - setState(1771); + setState(1773); _errHandler.sync(this); _la = _input.LA(1); } - setState(1772); + setState(1774); match(R_CURLY); } } @@ -12339,30 +12347,30 @@ public final FieldDeclContext fieldDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1778); + setState(1780); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { case 1: { - setState(1774); + setState(1776); identifierList(); - setState(1775); + setState(1777); type_(); } break; case 2: { - setState(1777); + setState(1779); embeddedField(); } break; } - setState(1781); + setState(1783); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { case 1: { - setState(1780); + setState(1782); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -12401,7 +12409,7 @@ public final String_Context string_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1783); + setState(1785); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -12447,17 +12455,17 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1786); + setState(1788); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1785); + setState(1787); match(STAR); } } - setState(1788); + setState(1790); typeName(); } } @@ -12495,11 +12503,11 @@ public final IndexContext index() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1790); + setState(1792); match(L_BRACKET); - setState(1791); + setState(1793); expression(0); - setState(1792); + setState(1794); match(R_BRACKET); } } @@ -12538,13 +12546,13 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1794); + setState(1796); match(DOT); - setState(1795); + setState(1797); match(L_PAREN); - setState(1796); + setState(1798); type_(); - setState(1797); + setState(1799); match(R_PAREN); } } @@ -12591,34 +12599,34 @@ public final ArgumentsContext arguments() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1799); + setState(1801); match(L_PAREN); - setState(1814); + setState(1816); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { { - setState(1806); + setState(1808); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,182,_ctx) ) { case 1: { - setState(1800); + setState(1802); expressionList(); } break; case 2: { - setState(1801); + setState(1803); nonNamedType(); - setState(1804); + setState(1806); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,181,_ctx) ) { case 1: { - setState(1802); + setState(1804); match(COMMA); - setState(1803); + setState(1805); expressionList(); } break; @@ -12626,22 +12634,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1809); + setState(1811); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1808); + setState(1810); match(ELLIPSIS); } } - setState(1812); + setState(1814); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1811); + setState(1813); match(COMMA); } } @@ -12649,7 +12657,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1816); + setState(1818); match(R_PAREN); } } @@ -12687,11 +12695,11 @@ public final MethodExprContext methodExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1818); + setState(1820); nonNamedType(); - setState(1819); + setState(1821); match(DOT); - setState(1820); + setState(1822); match(IDENTIFIER); } } @@ -12727,7 +12735,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1822); + setState(1824); type_(); } } @@ -12761,34 +12769,34 @@ public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); enterRule(_localctx, 366, RULE_eos); try { - setState(1828); + setState(1830); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1824); + setState(1826); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1825); + setState(1827); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1826); + setState(1828); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1827); + setState(1829); if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()"); } break; @@ -12871,7 +12879,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a1\u0729\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a1\u072b\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -12917,106 +12925,106 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\34\3\35\3\35\3\35\3\35\3\35\5\35\u0244\n\35\3\35\3\35\3\35\3\35\3\36"+ "\3\36\5\36\u024c\n\36\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\""+ "\3\"\3\"\3\"\3#\3#\3#\3#\3#\5#\u0264\n#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%"+ - "\3%\3%\3%\7%\u0273\n%\f%\16%\u0276\13%\3%\3%\3&\3&\3&\3&\3\'\3\'\3\'\3"+ - "\'\7\'\u0282\n\'\f\'\16\'\u0285\13\'\3\'\3\'\3(\3(\3(\3(\3)\3)\3)\3)\5"+ - ")\u0291\n)\3*\3*\3*\3*\3*\7*\u0298\n*\f*\16*\u029b\13*\3*\3*\3+\3+\3+"+ - "\3+\3+\3+\3+\3+\3+\5+\u02a8\n+\3,\3,\3,\3,\3,\7,\u02af\n,\f,\16,\u02b2"+ - "\13,\3,\3,\3-\3-\3-\3-\3-\7-\u02bb\n-\f-\16-\u02be\13-\3-\3-\3.\3.\3."+ - "\3.\3.\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\5/\u02d2\n/\3\60\3\60\3\60\3\60"+ - "\3\60\5\60\u02d9\n\60\3\60\7\60\u02dc\n\60\f\60\16\60\u02df\13\60\3\60"+ - "\3\60\5\60\u02e3\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\5\61\u02ed"+ - "\n\61\3\62\5\62\u02f0\n\62\3\62\3\62\5\62\u02f4\n\62\3\63\3\63\5\63\u02f8"+ - "\n\63\3\64\3\64\3\64\3\64\7\64\u02fe\n\64\f\64\16\64\u0301\13\64\3\64"+ - "\3\64\3\65\3\65\3\65\5\65\u0308\n\65\3\66\3\66\3\66\5\66\u030d\n\66\3"+ - "\67\3\67\3\67\3\67\3\67\3\67\5\67\u0315\n\67\5\67\u0317\n\67\3\67\3\67"+ - "\3\67\5\67\u031c\n\67\38\38\38\78\u0321\n8\f8\168\u0324\138\39\39\39\3"+ - "9\39\59\u032b\n9\39\59\u032e\n9\39\39\3:\3:\5:\u0334\n:\3:\3:\3:\5:\u0339"+ - "\n:\5:\u033b\n:\3:\5:\u033e\n:\3;\3;\3;\7;\u0343\n;\f;\16;\u0346\13;\3"+ - "<\3<\5<\u034a\n<\3<\3<\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\7>\u035b"+ - "\n>\f>\16>\u035e\13>\3>\3>\3>\7>\u0363\n>\f>\16>\u0366\13>\3>\5>\u0369"+ - "\n>\3?\5?\u036c\n?\3?\3?\3?\3?\5?\u0372\n?\3@\3@\5@\u0376\n@\3@\5@\u0379"+ - "\n@\3@\3@\3@\3A\3A\3A\3A\3A\5A\u0383\nA\3B\3B\3B\3B\3B\5B\u038a\nB\3C"+ - "\3C\3C\3C\3C\5C\u0391\nC\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E\5E\u039d\nE\3F"+ - "\3F\3F\3F\5F\u03a3\nF\3G\3G\3G\3G\3G\5G\u03aa\nG\3H\3H\3H\5H\u03af\nH"+ - "\3I\3I\3I\3I\5I\u03b5\nI\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\5K\u03c1\nK\3L"+ - "\3L\3L\3L\5L\u03c7\nL\3L\3L\5L\u03cb\nL\3M\3M\3M\3M\3N\3N\5N\u03d3\nN"+ - "\3N\3N\5N\u03d7\nN\3N\3N\3O\3O\5O\u03dd\nO\3P\5P\u03e0\nP\3P\3P\3Q\3Q"+ - "\5Q\u03e6\nQ\3Q\3Q\3R\5R\u03eb\nR\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\5S\u03ff\nS\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\7S\u0422"+ - "\nS\fS\16S\u0425\13S\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3"+ - "T\3T\3T\3T\5T\u043b\nT\3U\3U\3U\3V\3V\3V\5V\u0443\nV\3W\3W\3W\3X\3X\3"+ - "X\3X\7X\u044c\nX\fX\16X\u044f\13X\3X\3X\3X\3X\5X\u0455\nX\3Y\3Y\3Y\3Y"+ - "\3Y\5Y\u045c\nY\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\5Z\u0466\nZ\3[\3[\3[\3[\3[\3["+ - "\3[\3[\3[\3[\3[\3[\5[\u0474\n[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3["+ - "\3[\3[\3[\3[\3[\3[\3[\7[\u048a\n[\f[\16[\u048d\13[\3\\\3\\\3\\\3]\3]\5"+ - "]\u0494\n]\3]\3]\5]\u0498\n]\3^\3^\5^\u049c\n^\3^\5^\u049f\n^\3^\3^\3"+ - "_\3_\3_\3_\3_\5_\u04a8\n_\3_\3_\7_\u04ac\n_\f_\16_\u04af\13_\3_\3_\3`"+ - "\3`\3`\3`\3a\5a\u04b8\na\3a\3a\3a\3a\3a\3a\5a\u04c0\na\3a\3a\3a\3a\5a"+ - "\u04c6\na\3b\3b\3b\3b\3b\3b\3b\5b\u04cf\nb\3c\3c\3c\3c\3c\3c\3c\3c\3c"+ - "\5c\u04da\nc\3d\3d\3d\3e\3e\3e\3e\7e\u04e3\ne\fe\16e\u04e6\13e\3e\5e\u04e9"+ - "\ne\5e\u04eb\ne\3e\3e\3f\3f\3f\3f\3f\3f\3f\5f\u04f6\nf\3g\3g\3g\3g\3g"+ - "\3h\3h\5h\u04ff\nh\3h\3h\5h\u0503\nh\3h\5h\u0506\nh\3h\3h\3h\3h\3h\5h"+ - "\u050d\nh\3h\3h\3i\3i\3j\3j\3k\3k\3l\5l\u0518\nl\3l\3l\3m\3m\3m\3m\3m"+ - "\3m\5m\u0522\nm\3m\3m\3m\3m\5m\u0528\nm\5m\u052a\nm\3n\3n\3n\3o\3o\3p"+ - "\3p\3p\5p\u0534\np\3q\3q\3q\3q\3q\3q\7q\u053c\nq\fq\16q\u053f\13q\3q\5"+ - "q\u0542\nq\3r\3r\5r\u0546\nr\3r\3r\5r\u054a\nr\3s\3s\3s\7s\u054f\ns\f"+ - "s\16s\u0552\13s\3t\3t\3t\7t\u0557\nt\ft\16t\u055a\13t\3u\3u\3u\3u\3u\3"+ - "u\7u\u0562\nu\fu\16u\u0565\13u\3u\5u\u0568\nu\3v\3v\5v\u056c\nv\3v\3v"+ - "\3w\3w\3w\3w\3w\3w\7w\u0576\nw\fw\16w\u0579\13w\3w\5w\u057c\nw\3x\3x\5"+ - "x\u0580\nx\3x\3x\3y\5y\u0585\ny\3y\3y\3y\6y\u058a\ny\ry\16y\u058b\3z\3"+ - "z\3z\3z\3z\5z\u0593\nz\3{\3{\3|\3|\3|\3|\3}\3}\3}\3~\3~\3~\3~\3\177\3"+ - "\177\3\u0080\3\u0080\3\u0080\5\u0080\u05a7\n\u0080\3\u0081\3\u0081\5\u0081"+ - "\u05ab\n\u0081\3\u0082\3\u0082\5\u0082\u05af\n\u0082\3\u0083\3\u0083\5"+ - "\u0083\u05b3\n\u0083\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3"+ - "\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\5\u0086"+ - "\u05c3\n\u0086\3\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u05c9\n\u0086\5"+ - "\u0086\u05cb\n\u0086\3\u0087\3\u0087\5\u0087\u05cf\n\u0087\3\u0088\3\u0088"+ - "\5\u0088\u05d3\n\u0088\3\u0088\5\u0088\u05d6\n\u0088\3\u0088\3\u0088\5"+ - "\u0088\u05da\n\u0088\5\u0088\u05dc\n\u0088\3\u0088\3\u0088\7\u0088\u05e0"+ - "\n\u0088\f\u0088\16\u0088\u05e3\13\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+ - "\3\u0089\5\u0089\u05ea\n\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u05ef\n"+ + "\3%\3%\3%\3%\3%\7%\u0275\n%\f%\16%\u0278\13%\3%\3%\3&\3&\3&\3&\3\'\3\'"+ + "\3\'\3\'\7\'\u0284\n\'\f\'\16\'\u0287\13\'\3\'\3\'\3(\3(\3(\3(\3)\3)\3"+ + ")\3)\5)\u0293\n)\3*\3*\3*\3*\3*\7*\u029a\n*\f*\16*\u029d\13*\3*\3*\3+"+ + "\3+\3+\3+\3+\3+\3+\3+\3+\5+\u02aa\n+\3,\3,\3,\3,\3,\7,\u02b1\n,\f,\16"+ + ",\u02b4\13,\3,\3,\3-\3-\3-\3-\3-\7-\u02bd\n-\f-\16-\u02c0\13-\3-\3-\3"+ + ".\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\5/\u02d4\n/\3\60\3\60\3"+ + "\60\3\60\3\60\5\60\u02db\n\60\3\60\7\60\u02de\n\60\f\60\16\60\u02e1\13"+ + "\60\3\60\3\60\5\60\u02e5\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61"+ + "\5\61\u02ef\n\61\3\62\5\62\u02f2\n\62\3\62\3\62\5\62\u02f6\n\62\3\63\3"+ + "\63\5\63\u02fa\n\63\3\64\3\64\3\64\3\64\7\64\u0300\n\64\f\64\16\64\u0303"+ + "\13\64\3\64\3\64\3\65\3\65\3\65\5\65\u030a\n\65\3\66\3\66\3\66\5\66\u030f"+ + "\n\66\3\67\3\67\3\67\3\67\3\67\3\67\5\67\u0317\n\67\5\67\u0319\n\67\3"+ + "\67\3\67\3\67\5\67\u031e\n\67\38\38\38\78\u0323\n8\f8\168\u0326\138\3"+ + "9\39\39\39\39\59\u032d\n9\39\59\u0330\n9\39\39\3:\3:\5:\u0336\n:\3:\3"+ + ":\3:\5:\u033b\n:\5:\u033d\n:\3:\5:\u0340\n:\3;\3;\3;\7;\u0345\n;\f;\16"+ + ";\u0348\13;\3<\3<\5<\u034c\n<\3<\3<\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3"+ + ">\3>\7>\u035d\n>\f>\16>\u0360\13>\3>\3>\3>\7>\u0365\n>\f>\16>\u0368\13"+ + ">\3>\5>\u036b\n>\3?\5?\u036e\n?\3?\3?\3?\3?\5?\u0374\n?\3@\3@\5@\u0378"+ + "\n@\3@\5@\u037b\n@\3@\3@\3@\3A\3A\3A\3A\3A\5A\u0385\nA\3B\3B\3B\3B\3B"+ + "\5B\u038c\nB\3C\3C\3C\3C\3C\5C\u0393\nC\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E"+ + "\5E\u039f\nE\3F\3F\3F\3F\5F\u03a5\nF\3G\3G\3G\3G\3G\5G\u03ac\nG\3H\3H"+ + "\3H\5H\u03b1\nH\3I\3I\3I\3I\5I\u03b7\nI\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K"+ + "\5K\u03c3\nK\3L\3L\3L\3L\5L\u03c9\nL\3L\3L\5L\u03cd\nL\3M\3M\3M\3M\3N"+ + "\3N\5N\u03d5\nN\3N\3N\5N\u03d9\nN\3N\3N\3O\3O\5O\u03df\nO\3P\5P\u03e2"+ + "\nP\3P\3P\3Q\3Q\5Q\u03e8\nQ\3Q\3Q\3R\5R\u03ed\nR\3R\3R\3S\3S\3S\3S\3S"+ + "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\5S\u0401\nS\3S\3S\3S\3S\3S\3S\3S\3S"+ + "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S"+ + "\3S\3S\7S\u0424\nS\fS\16S\u0427\13S\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3"+ + "T\3T\3T\3T\3T\3T\3T\3T\3T\5T\u043d\nT\3U\3U\3U\3V\3V\3V\5V\u0445\nV\3"+ + "W\3W\3W\3X\3X\3X\3X\7X\u044e\nX\fX\16X\u0451\13X\3X\3X\3X\3X\5X\u0457"+ + "\nX\3Y\3Y\3Y\3Y\3Y\5Y\u045e\nY\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\5Z\u0468\nZ\3["+ + "\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\5[\u0476\n[\3[\3[\3[\3[\3[\3[\3[\3["+ + "\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\7[\u048c\n[\f[\16[\u048f\13[\3\\"+ + "\3\\\3\\\3]\3]\5]\u0496\n]\3]\3]\5]\u049a\n]\3^\3^\5^\u049e\n^\3^\5^\u04a1"+ + "\n^\3^\3^\3_\3_\3_\3_\3_\5_\u04aa\n_\3_\3_\7_\u04ae\n_\f_\16_\u04b1\13"+ + "_\3_\3_\3`\3`\3`\3`\3a\5a\u04ba\na\3a\3a\3a\3a\3a\3a\5a\u04c2\na\3a\3"+ + "a\3a\3a\5a\u04c8\na\3b\3b\3b\3b\3b\3b\3b\5b\u04d1\nb\3c\3c\3c\3c\3c\3"+ + "c\3c\3c\3c\5c\u04dc\nc\3d\3d\3d\3e\3e\3e\3e\7e\u04e5\ne\fe\16e\u04e8\13"+ + "e\3e\5e\u04eb\ne\5e\u04ed\ne\3e\3e\3f\3f\3f\3f\3f\3f\3f\5f\u04f8\nf\3"+ + "g\3g\3g\3g\3g\3h\3h\5h\u0501\nh\3h\3h\5h\u0505\nh\3h\5h\u0508\nh\3h\3"+ + "h\3h\3h\3h\5h\u050f\nh\3h\3h\3i\3i\3j\3j\3k\3k\3l\5l\u051a\nl\3l\3l\3"+ + "m\3m\3m\3m\3m\3m\5m\u0524\nm\3m\3m\3m\3m\5m\u052a\nm\5m\u052c\nm\3n\3"+ + "n\3n\3o\3o\3p\3p\3p\5p\u0536\np\3q\3q\3q\3q\3q\3q\7q\u053e\nq\fq\16q\u0541"+ + "\13q\3q\5q\u0544\nq\3r\3r\5r\u0548\nr\3r\3r\5r\u054c\nr\3s\3s\3s\7s\u0551"+ + "\ns\fs\16s\u0554\13s\3t\3t\3t\7t\u0559\nt\ft\16t\u055c\13t\3u\3u\3u\3"+ + "u\3u\3u\7u\u0564\nu\fu\16u\u0567\13u\3u\5u\u056a\nu\3v\3v\5v\u056e\nv"+ + "\3v\3v\3w\3w\3w\3w\3w\3w\7w\u0578\nw\fw\16w\u057b\13w\3w\5w\u057e\nw\3"+ + "x\3x\5x\u0582\nx\3x\3x\3y\5y\u0587\ny\3y\3y\3y\6y\u058c\ny\ry\16y\u058d"+ + "\3z\3z\3z\3z\3z\5z\u0595\nz\3{\3{\3|\3|\3|\3|\3}\3}\3}\3~\3~\3~\3~\3\177"+ + "\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u05a9\n\u0080\3\u0081\3\u0081\5"+ + "\u0081\u05ad\n\u0081\3\u0082\3\u0082\5\u0082\u05b1\n\u0082\3\u0083\3\u0083"+ + "\5\u0083\u05b5\n\u0083\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086"+ + "\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\5\u0086"+ + "\u05c5\n\u0086\3\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u05cb\n\u0086\5"+ + "\u0086\u05cd\n\u0086\3\u0087\3\u0087\5\u0087\u05d1\n\u0087\3\u0088\3\u0088"+ + "\5\u0088\u05d5\n\u0088\3\u0088\5\u0088\u05d8\n\u0088\3\u0088\3\u0088\5"+ + "\u0088\u05dc\n\u0088\5\u0088\u05de\n\u0088\3\u0088\3\u0088\7\u0088\u05e2"+ + "\n\u0088\f\u0088\16\u0088\u05e5\13\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+ + "\3\u0089\5\u0089\u05ec\n\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u05f1\n"+ "\u008a\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b"+ - "\3\u008b\5\u008b\u05fa\n\u008b\3\u008b\3\u008b\7\u008b\u05fe\n\u008b\f"+ - "\u008b\16\u008b\u0601\13\u008b\3\u008b\3\u008b\3\u008c\3\u008c\5\u008c"+ - "\u0607\n\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d"+ - "\3\u008d\3\u008d\5\u008d\u0612\n\u008d\3\u008e\3\u008e\3\u008e\5\u008e"+ - "\u0617\n\u008e\3\u008f\3\u008f\5\u008f\u061b\n\u008f\3\u008f\3\u008f\3"+ - "\u008f\5\u008f\u0620\n\u008f\7\u008f\u0622\n\u008f\f\u008f\16\u008f\u0625"+ - "\13\u008f\3\u0090\3\u0090\3\u0090\7\u0090\u062a\n\u0090\f\u0090\16\u0090"+ - "\u062d\13\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\5\u0091\u0634"+ - "\n\u0091\3\u0092\3\u0092\3\u0092\5\u0092\u0639\n\u0092\3\u0092\5\u0092"+ - "\u063c\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\5\u0093"+ - "\u0644\n\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\5\u0094"+ - "\u064c\n\u0094\3\u0094\3\u0094\3\u0095\5\u0095\u0651\n\u0095\3\u0095\3"+ - "\u0095\5\u0095\u0655\n\u0095\3\u0095\3\u0095\5\u0095\u0659\n\u0095\3\u0096"+ - "\3\u0096\3\u0096\3\u0097\3\u0097\5\u0097\u0660\n\u0097\3\u0098\3\u0098"+ + "\3\u008b\5\u008b\u05fc\n\u008b\3\u008b\3\u008b\7\u008b\u0600\n\u008b\f"+ + "\u008b\16\u008b\u0603\13\u008b\3\u008b\3\u008b\3\u008c\3\u008c\5\u008c"+ + "\u0609\n\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d"+ + "\3\u008d\3\u008d\5\u008d\u0614\n\u008d\3\u008e\3\u008e\3\u008e\5\u008e"+ + "\u0619\n\u008e\3\u008f\3\u008f\5\u008f\u061d\n\u008f\3\u008f\3\u008f\3"+ + "\u008f\5\u008f\u0622\n\u008f\7\u008f\u0624\n\u008f\f\u008f\16\u008f\u0627"+ + "\13\u008f\3\u0090\3\u0090\3\u0090\7\u0090\u062c\n\u0090\f\u0090\16\u0090"+ + "\u062f\13\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\5\u0091\u0636"+ + "\n\u0091\3\u0092\3\u0092\3\u0092\5\u0092\u063b\n\u0092\3\u0092\5\u0092"+ + "\u063e\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\5\u0093"+ + "\u0646\n\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\5\u0094"+ + "\u064e\n\u0094\3\u0094\3\u0094\3\u0095\5\u0095\u0653\n\u0095\3\u0095\3"+ + "\u0095\5\u0095\u0657\n\u0095\3\u0095\3\u0095\5\u0095\u065b\n\u0095\3\u0096"+ + "\3\u0096\3\u0096\3\u0097\3\u0097\5\u0097\u0662\n\u0097\3\u0098\3\u0098"+ "\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u009a\3\u009a\3\u009b\3\u009b"+ "\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d\3\u009d\3\u009d\3\u009d"+ - "\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u067d"+ + "\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u067f"+ "\n\u009e\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0"+ - "\3\u00a0\5\u00a0\u0688\n\u00a0\3\u00a1\3\u00a1\5\u00a1\u068c\n\u00a1\3"+ - "\u00a2\3\u00a2\3\u00a2\3\u00a2\7\u00a2\u0692\n\u00a2\f\u00a2\16\u00a2"+ - "\u0695\13\u00a2\3\u00a2\5\u00a2\u0698\n\u00a2\5\u00a2\u069a\n\u00a2\3"+ - "\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a3\5\u00a3\u06a2\n\u00a3\3"+ - "\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u06ab\n"+ - "\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\5\u00a5\u06b3\n"+ - "\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u06b8\n\u00a6\3\u00a7\3\u00a7\3"+ + "\3\u00a0\5\u00a0\u068a\n\u00a0\3\u00a1\3\u00a1\5\u00a1\u068e\n\u00a1\3"+ + "\u00a2\3\u00a2\3\u00a2\3\u00a2\7\u00a2\u0694\n\u00a2\f\u00a2\16\u00a2"+ + "\u0697\13\u00a2\3\u00a2\5\u00a2\u069a\n\u00a2\5\u00a2\u069c\n\u00a2\3"+ + "\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a3\5\u00a3\u06a4\n\u00a3\3"+ + "\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u06ad\n"+ + "\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\5\u00a5\u06b5\n"+ + "\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u06ba\n\u00a6\3\u00a7\3\u00a7\3"+ "\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa"+ - "\3\u00ab\3\u00ab\3\u00ab\5\u00ab\u06c8\n\u00ab\5\u00ab\u06ca\n\u00ab\3"+ - "\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\7\u00ac\u06d1\n\u00ac\f\u00ac\16"+ - "\u00ac\u06d4\13\u00ac\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u06d9\n\u00ad\3"+ - "\u00ad\3\u00ad\3\u00ae\3\u00ae\5\u00ae\u06df\n\u00ae\3\u00af\3\u00af\5"+ - "\u00af\u06e3\n\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\7\u00b0\u06ea"+ - "\n\u00b0\f\u00b0\16\u00b0\u06ed\13\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1"+ - "\3\u00b1\3\u00b1\5\u00b1\u06f5\n\u00b1\3\u00b1\5\u00b1\u06f8\n\u00b1\3"+ - "\u00b2\3\u00b2\3\u00b3\5\u00b3\u06fd\n\u00b3\3\u00b3\3\u00b3\3\u00b4\3"+ + "\3\u00ab\3\u00ab\3\u00ab\5\u00ab\u06ca\n\u00ab\5\u00ab\u06cc\n\u00ab\3"+ + "\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\7\u00ac\u06d3\n\u00ac\f\u00ac\16"+ + "\u00ac\u06d6\13\u00ac\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u06db\n\u00ad\3"+ + "\u00ad\3\u00ad\3\u00ae\3\u00ae\5\u00ae\u06e1\n\u00ae\3\u00af\3\u00af\5"+ + "\u00af\u06e5\n\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\7\u00b0\u06ec"+ + "\n\u00b0\f\u00b0\16\u00b0\u06ef\13\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1"+ + "\3\u00b1\3\u00b1\5\u00b1\u06f7\n\u00b1\3\u00b1\5\u00b1\u06fa\n\u00b1\3"+ + "\u00b2\3\u00b2\3\u00b3\5\u00b3\u06ff\n\u00b3\3\u00b3\3\u00b3\3\u00b4\3"+ "\u00b4\3\u00b4\3\u00b4\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b6"+ - "\3\u00b6\3\u00b6\3\u00b6\3\u00b6\5\u00b6\u070f\n\u00b6\5\u00b6\u0711\n"+ - "\u00b6\3\u00b6\5\u00b6\u0714\n\u00b6\3\u00b6\5\u00b6\u0717\n\u00b6\5\u00b6"+ - "\u0719\n\u00b6\3\u00b6\3\u00b6\3\u00b7\3\u00b7\3\u00b7\3\u00b7\3\u00b8"+ - "\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\5\u00b9\u0727\n\u00b9\3\u00b9"+ - "\3\u02dd\4\u00a4\u00b4\u00ba\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \""+ + "\3\u00b6\3\u00b6\3\u00b6\3\u00b6\5\u00b6\u0711\n\u00b6\5\u00b6\u0713\n"+ + "\u00b6\3\u00b6\5\u00b6\u0716\n\u00b6\3\u00b6\5\u00b6\u0719\n\u00b6\5\u00b6"+ + "\u071b\n\u00b6\3\u00b6\3\u00b6\3\u00b7\3\u00b7\3\u00b7\3\u00b7\3\u00b8"+ + "\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\5\u00b9\u0729\n\u00b9\3\u00b9"+ + "\3\u02df\4\u00a4\u00b4\u00ba\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \""+ "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084"+ "\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c"+ "\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4"+ @@ -13031,7 +13039,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "ffqq\3\2\31\32\3\2\7\n\3\2BC\3\2)+\4\2)+--\3\2\u0084\u008a\3\2\26\27\4"+ "\2\177\u0083\u0088\u0089\6\2$$rr~~\u0085\u0087\3\2 \"\3\2\35\37\4\2IJ"+ "x}\6\2..\61\61\64\64^^\4\2~\u0083\u0085\u0089\3\2rs\4\2oo\u00a0\u00a0"+ - "\4\2\u008b\u008e\u0090\u0091\3\2\u0097\u0098\2\u078c\2\u0172\3\2\2\2\4"+ + "\4\2\u008b\u008e\u0090\u0091\3\2\u0097\u0098\2\u078e\2\u0172\3\2\2\2\4"+ "\u0175\3\2\2\2\6\u0178\3\2\2\2\b\u017b\3\2\2\2\n\u0183\3\2\2\2\f\u018c"+ "\3\2\2\2\16\u01a7\3\2\2\2\20\u01aa\3\2\2\2\22\u01b2\3\2\2\2\24\u01bf\3"+ "\2\2\2\26\u01d5\3\2\2\2\30\u01de\3\2\2\2\32\u01e0\3\2\2\2\34\u01e2\3\2"+ @@ -13039,48 +13047,48 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\3\2\2\2(\u020d\3\2\2\2*\u021a\3\2\2\2,\u021d\3\2\2\2.\u0228\3\2\2\2\60"+ "\u022a\3\2\2\2\62\u022f\3\2\2\2\64\u0234\3\2\2\2\66\u0239\3\2\2\28\u023e"+ "\3\2\2\2:\u024b\3\2\2\2<\u024d\3\2\2\2>\u024f\3\2\2\2@\u0254\3\2\2\2B"+ - "\u0259\3\2\2\2D\u025e\3\2\2\2F\u0267\3\2\2\2H\u026e\3\2\2\2J\u0279\3\2"+ - "\2\2L\u027d\3\2\2\2N\u0288\3\2\2\2P\u0290\3\2\2\2R\u0292\3\2\2\2T\u02a7"+ - "\3\2\2\2V\u02a9\3\2\2\2X\u02b5\3\2\2\2Z\u02c1\3\2\2\2\\\u02d1\3\2\2\2"+ - "^\u02dd\3\2\2\2`\u02ec\3\2\2\2b\u02ef\3\2\2\2d\u02f7\3\2\2\2f\u02f9\3"+ - "\2\2\2h\u0304\3\2\2\2j\u030c\3\2\2\2l\u031b\3\2\2\2n\u031d\3\2\2\2p\u0325"+ - "\3\2\2\2r\u0333\3\2\2\2t\u033f\3\2\2\2v\u0349\3\2\2\2x\u034d\3\2\2\2z"+ - "\u0353\3\2\2\2|\u036b\3\2\2\2~\u0373\3\2\2\2\u0080\u0382\3\2\2\2\u0082"+ - "\u0384\3\2\2\2\u0084\u038b\3\2\2\2\u0086\u0394\3\2\2\2\u0088\u0399\3\2"+ - "\2\2\u008a\u039e\3\2\2\2\u008c\u03a4\3\2\2\2\u008e\u03ab\3\2\2\2\u0090"+ - "\u03b0\3\2\2\2\u0092\u03b6\3\2\2\2\u0094\u03bb\3\2\2\2\u0096\u03c2\3\2"+ - "\2\2\u0098\u03cc\3\2\2\2\u009a\u03d0\3\2\2\2\u009c\u03dc\3\2\2\2\u009e"+ - "\u03df\3\2\2\2\u00a0\u03e3\3\2\2\2\u00a2\u03ea\3\2\2\2\u00a4\u03fe\3\2"+ - "\2\2\u00a6\u043a\3\2\2\2\u00a8\u043c\3\2\2\2\u00aa\u043f\3\2\2\2\u00ac"+ - "\u0444\3\2\2\2\u00ae\u044d\3\2\2\2\u00b0\u045b\3\2\2\2\u00b2\u0465\3\2"+ - "\2\2\u00b4\u0473\3\2\2\2\u00b6\u048e\3\2\2\2\u00b8\u0491\3\2\2\2\u00ba"+ - "\u0499\3\2\2\2\u00bc\u04a2\3\2\2\2\u00be\u04b2\3\2\2\2\u00c0\u04c5\3\2"+ - "\2\2\u00c2\u04ce\3\2\2\2\u00c4\u04d9\3\2\2\2\u00c6\u04db\3\2\2\2\u00c8"+ - "\u04de\3\2\2\2\u00ca\u04f5\3\2\2\2\u00cc\u04f7\3\2\2\2\u00ce\u04fc\3\2"+ - "\2\2\u00d0\u0510\3\2\2\2\u00d2\u0512\3\2\2\2\u00d4\u0514\3\2\2\2\u00d6"+ - "\u0517\3\2\2\2\u00d8\u0521\3\2\2\2\u00da\u052b\3\2\2\2\u00dc\u052e\3\2"+ - "\2\2\u00de\u0533\3\2\2\2\u00e0\u0535\3\2\2\2\u00e2\u0543\3\2\2\2\u00e4"+ - "\u054b\3\2\2\2\u00e6\u0553\3\2\2\2\u00e8\u055b\3\2\2\2\u00ea\u0569\3\2"+ - "\2\2\u00ec\u056f\3\2\2\2\u00ee\u057d\3\2\2\2\u00f0\u0589\3\2\2\2\u00f2"+ - "\u0592\3\2\2\2\u00f4\u0594\3\2\2\2\u00f6\u0596\3\2\2\2\u00f8\u059a\3\2"+ - "\2\2\u00fa\u059d\3\2\2\2\u00fc\u05a1\3\2\2\2\u00fe\u05a3\3\2\2\2\u0100"+ - "\u05a8\3\2\2\2\u0102\u05ac\3\2\2\2\u0104\u05b0\3\2\2\2\u0106\u05b4\3\2"+ - "\2\2\u0108\u05b7\3\2\2\2\u010a\u05b9\3\2\2\2\u010c\u05ce\3\2\2\2\u010e"+ - "\u05d0\3\2\2\2\u0110\u05e6\3\2\2\2\u0112\u05ee\3\2\2\2\u0114\u05f0\3\2"+ - "\2\2\u0116\u0606\3\2\2\2\u0118\u060e\3\2\2\2\u011a\u0616\3\2\2\2\u011c"+ - "\u061a\3\2\2\2\u011e\u0626\3\2\2\2\u0120\u0630\3\2\2\2\u0122\u063b\3\2"+ - "\2\2\u0124\u0643\3\2\2\2\u0126\u0647\3\2\2\2\u0128\u0650\3\2\2\2\u012a"+ - "\u065a\3\2\2\2\u012c\u065f\3\2\2\2\u012e\u0661\3\2\2\2\u0130\u0666\3\2"+ - "\2\2\u0132\u0668\3\2\2\2\u0134\u066a\3\2\2\2\u0136\u066d\3\2\2\2\u0138"+ - "\u0671\3\2\2\2\u013a\u067c\3\2\2\2\u013c\u0680\3\2\2\2\u013e\u0687\3\2"+ - "\2\2\u0140\u068b\3\2\2\2\u0142\u068d\3\2\2\2\u0144\u069d\3\2\2\2\u0146"+ - "\u06aa\3\2\2\2\u0148\u06b2\3\2\2\2\u014a\u06b7\3\2\2\2\u014c\u06b9\3\2"+ - "\2\2\u014e\u06bb\3\2\2\2\u0150\u06bd\3\2\2\2\u0152\u06c1\3\2\2\2\u0154"+ - "\u06c4\3\2\2\2\u0156\u06cd\3\2\2\2\u0158\u06d8\3\2\2\2\u015a\u06de\3\2"+ - "\2\2\u015c\u06e2\3\2\2\2\u015e\u06e4\3\2\2\2\u0160\u06f4\3\2\2\2\u0162"+ - "\u06f9\3\2\2\2\u0164\u06fc\3\2\2\2\u0166\u0700\3\2\2\2\u0168\u0704\3\2"+ - "\2\2\u016a\u0709\3\2\2\2\u016c\u071c\3\2\2\2\u016e\u0720\3\2\2\2\u0170"+ - "\u0726\3\2\2\2\u0172\u0173\5\u00a4S\2\u0173\u0174\7\2\2\3\u0174\3\3\2"+ + "\u0259\3\2\2\2D\u025e\3\2\2\2F\u0267\3\2\2\2H\u026e\3\2\2\2J\u027b\3\2"+ + "\2\2L\u027f\3\2\2\2N\u028a\3\2\2\2P\u0292\3\2\2\2R\u0294\3\2\2\2T\u02a9"+ + "\3\2\2\2V\u02ab\3\2\2\2X\u02b7\3\2\2\2Z\u02c3\3\2\2\2\\\u02d3\3\2\2\2"+ + "^\u02df\3\2\2\2`\u02ee\3\2\2\2b\u02f1\3\2\2\2d\u02f9\3\2\2\2f\u02fb\3"+ + "\2\2\2h\u0306\3\2\2\2j\u030e\3\2\2\2l\u031d\3\2\2\2n\u031f\3\2\2\2p\u0327"+ + "\3\2\2\2r\u0335\3\2\2\2t\u0341\3\2\2\2v\u034b\3\2\2\2x\u034f\3\2\2\2z"+ + "\u0355\3\2\2\2|\u036d\3\2\2\2~\u0375\3\2\2\2\u0080\u0384\3\2\2\2\u0082"+ + "\u0386\3\2\2\2\u0084\u038d\3\2\2\2\u0086\u0396\3\2\2\2\u0088\u039b\3\2"+ + "\2\2\u008a\u03a0\3\2\2\2\u008c\u03a6\3\2\2\2\u008e\u03ad\3\2\2\2\u0090"+ + "\u03b2\3\2\2\2\u0092\u03b8\3\2\2\2\u0094\u03bd\3\2\2\2\u0096\u03c4\3\2"+ + "\2\2\u0098\u03ce\3\2\2\2\u009a\u03d2\3\2\2\2\u009c\u03de\3\2\2\2\u009e"+ + "\u03e1\3\2\2\2\u00a0\u03e5\3\2\2\2\u00a2\u03ec\3\2\2\2\u00a4\u0400\3\2"+ + "\2\2\u00a6\u043c\3\2\2\2\u00a8\u043e\3\2\2\2\u00aa\u0441\3\2\2\2\u00ac"+ + "\u0446\3\2\2\2\u00ae\u044f\3\2\2\2\u00b0\u045d\3\2\2\2\u00b2\u0467\3\2"+ + "\2\2\u00b4\u0475\3\2\2\2\u00b6\u0490\3\2\2\2\u00b8\u0493\3\2\2\2\u00ba"+ + "\u049b\3\2\2\2\u00bc\u04a4\3\2\2\2\u00be\u04b4\3\2\2\2\u00c0\u04c7\3\2"+ + "\2\2\u00c2\u04d0\3\2\2\2\u00c4\u04db\3\2\2\2\u00c6\u04dd\3\2\2\2\u00c8"+ + "\u04e0\3\2\2\2\u00ca\u04f7\3\2\2\2\u00cc\u04f9\3\2\2\2\u00ce\u04fe\3\2"+ + "\2\2\u00d0\u0512\3\2\2\2\u00d2\u0514\3\2\2\2\u00d4\u0516\3\2\2\2\u00d6"+ + "\u0519\3\2\2\2\u00d8\u0523\3\2\2\2\u00da\u052d\3\2\2\2\u00dc\u0530\3\2"+ + "\2\2\u00de\u0535\3\2\2\2\u00e0\u0537\3\2\2\2\u00e2\u0545\3\2\2\2\u00e4"+ + "\u054d\3\2\2\2\u00e6\u0555\3\2\2\2\u00e8\u055d\3\2\2\2\u00ea\u056b\3\2"+ + "\2\2\u00ec\u0571\3\2\2\2\u00ee\u057f\3\2\2\2\u00f0\u058b\3\2\2\2\u00f2"+ + "\u0594\3\2\2\2\u00f4\u0596\3\2\2\2\u00f6\u0598\3\2\2\2\u00f8\u059c\3\2"+ + "\2\2\u00fa\u059f\3\2\2\2\u00fc\u05a3\3\2\2\2\u00fe\u05a5\3\2\2\2\u0100"+ + "\u05aa\3\2\2\2\u0102\u05ae\3\2\2\2\u0104\u05b2\3\2\2\2\u0106\u05b6\3\2"+ + "\2\2\u0108\u05b9\3\2\2\2\u010a\u05bb\3\2\2\2\u010c\u05d0\3\2\2\2\u010e"+ + "\u05d2\3\2\2\2\u0110\u05e8\3\2\2\2\u0112\u05f0\3\2\2\2\u0114\u05f2\3\2"+ + "\2\2\u0116\u0608\3\2\2\2\u0118\u0610\3\2\2\2\u011a\u0618\3\2\2\2\u011c"+ + "\u061c\3\2\2\2\u011e\u0628\3\2\2\2\u0120\u0632\3\2\2\2\u0122\u063d\3\2"+ + "\2\2\u0124\u0645\3\2\2\2\u0126\u0649\3\2\2\2\u0128\u0652\3\2\2\2\u012a"+ + "\u065c\3\2\2\2\u012c\u0661\3\2\2\2\u012e\u0663\3\2\2\2\u0130\u0668\3\2"+ + "\2\2\u0132\u066a\3\2\2\2\u0134\u066c\3\2\2\2\u0136\u066f\3\2\2\2\u0138"+ + "\u0673\3\2\2\2\u013a\u067e\3\2\2\2\u013c\u0682\3\2\2\2\u013e\u0689\3\2"+ + "\2\2\u0140\u068d\3\2\2\2\u0142\u068f\3\2\2\2\u0144\u069f\3\2\2\2\u0146"+ + "\u06ac\3\2\2\2\u0148\u06b4\3\2\2\2\u014a\u06b9\3\2\2\2\u014c\u06bb\3\2"+ + "\2\2\u014e\u06bd\3\2\2\2\u0150\u06bf\3\2\2\2\u0152\u06c3\3\2\2\2\u0154"+ + "\u06c6\3\2\2\2\u0156\u06cf\3\2\2\2\u0158\u06da\3\2\2\2\u015a\u06e0\3\2"+ + "\2\2\u015c\u06e4\3\2\2\2\u015e\u06e6\3\2\2\2\u0160\u06f6\3\2\2\2\u0162"+ + "\u06fb\3\2\2\2\u0164\u06fe\3\2\2\2\u0166\u0702\3\2\2\2\u0168\u0706\3\2"+ + "\2\2\u016a\u070b\3\2\2\2\u016c\u071e\3\2\2\2\u016e\u0722\3\2\2\2\u0170"+ + "\u0728\3\2\2\2\u0172\u0173\5\u00a4S\2\u0173\u0174\7\2\2\3\u0174\3\3\2"+ "\2\2\u0175\u0176\5\u00a6T\2\u0176\u0177\7\2\2\3\u0177\5\3\2\2\2\u0178"+ "\u0179\5\u00c2b\2\u0179\u017a\7\2\2\3\u017a\7\3\2\2\2\u017b\u0180\5\n"+ "\6\2\u017c\u017d\7n\2\2\u017d\u017f\5\n\6\2\u017e\u017c\3\2\2\2\u017f"+ @@ -13162,448 +13170,449 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0264\3\2\2\2\u0264\u0265\3\2\2\2\u0265\u0266\7h\2\2\u0266E\3\2\2\2\u0267"+ "\u0268\t\6\2\2\u0268\u0269\7k\2\2\u0269\u026a\5\u00a4S\2\u026a\u026b\7"+ ">\2\2\u026b\u026c\5\u00a4S\2\u026c\u026d\7l\2\2\u026dG\3\2\2\2\u026e\u026f"+ - "\7\67\2\2\u026f\u0270\5\u00a4S\2\u0270\u0274\7i\2\2\u0271\u0273\5J&\2"+ - "\u0272\u0271\3\2\2\2\u0273\u0276\3\2\2\2\u0274\u0272\3\2\2\2\u0274\u0275"+ - "\3\2\2\2\u0275\u0277\3\2\2\2\u0276\u0274\3\2\2\2\u0277\u0278\7j\2\2\u0278"+ - "I\3\2\2\2\u0279\u027a\5j\66\2\u027a\u027b\7p\2\2\u027b\u027c\5\u00a4S"+ - "\2\u027cK\3\2\2\2\u027d\u027e\7k\2\2\u027e\u0283\5N(\2\u027f\u0280\7n"+ - "\2\2\u0280\u0282\5N(\2\u0281\u027f\3\2\2\2\u0282\u0285\3\2\2\2\u0283\u0281"+ - "\3\2\2\2\u0283\u0284\3\2\2\2\u0284\u0286\3\2\2\2\u0285\u0283\3\2\2\2\u0286"+ - "\u0287\7l\2\2\u0287M\3\2\2\2\u0288\u0289\5\u00a4S\2\u0289\u028a\7m\2\2"+ - "\u028a\u028b\5\u00a4S\2\u028bO\3\2\2\2\u028c\u0291\5\\/\2\u028d\u0291"+ - "\5Z.\2\u028e\u0291\5R*\2\u028f\u0291\5V,\2\u0290\u028c\3\2\2\2\u0290\u028d"+ - "\3\2\2\2\u0290\u028e\3\2\2\2\u0290\u028f\3\2\2\2\u0291Q\3\2\2\2\u0292"+ - "\u0293\7\64\2\2\u0293\u0299\7i\2\2\u0294\u0295\5T+\2\u0295\u0296\5\u0170"+ - "\u00b9\2\u0296\u0298\3\2\2\2\u0297\u0294\3\2\2\2\u0298\u029b\3\2\2\2\u0299"+ - "\u0297\3\2\2\2\u0299\u029a\3\2\2\2\u029a\u029c\3\2\2\2\u029b\u0299\3\2"+ - "\2\2\u029c\u029d\7j\2\2\u029dS\3\2\2\2\u029e\u029f\7N\2\2\u029f\u02a0"+ - "\7f\2\2\u02a0\u02a8\5\u013e\u00a0\2\u02a1\u02a2\7\65\2\2\u02a2\u02a3\7"+ - "i\2\2\u02a3\u02a4\5\u00a4S\2\u02a4\u02a5\5\u0170\u00b9\2\u02a5\u02a6\7"+ - "j\2\2\u02a6\u02a8\3\2\2\2\u02a7\u029e\3\2\2\2\u02a7\u02a1\3\2\2\2\u02a8"+ - "U\3\2\2\2\u02a9\u02aa\7\66\2\2\u02aa\u02b0\7i\2\2\u02ab\u02ac\5X-\2\u02ac"+ - "\u02ad\5\u0170\u00b9\2\u02ad\u02af\3\2\2\2\u02ae\u02ab\3\2\2\2\u02af\u02b2"+ - "\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b0\u02b1\3\2\2\2\u02b1\u02b3\3\2\2\2\u02b2"+ - "\u02b0\3\2\2\2\u02b3\u02b4\7j\2\2\u02b4W\3\2\2\2\u02b5\u02b6\7f\2\2\u02b6"+ - "\u02bc\7i\2\2\u02b7\u02b8\5\u0160\u00b1\2\u02b8\u02b9\5\u0170\u00b9\2"+ - "\u02b9\u02bb\3\2\2\2\u02ba\u02b7\3\2\2\2\u02bb\u02be\3\2\2\2\u02bc\u02ba"+ - "\3\2\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02bf\3\2\2\2\u02be\u02bc\3\2\2\2\u02bf"+ - "\u02c0\7j\2\2\u02c0Y\3\2\2\2\u02c1\u02c2\7\34\2\2\u02c2\u02c3\7k\2\2\u02c3"+ - "\u02c4\7l\2\2\u02c4\u02c5\5\u0132\u009a\2\u02c5[\3\2\2\2\u02c6\u02c7\t"+ - "\7\2\2\u02c7\u02c8\7k\2\2\u02c8\u02c9\5\u00c2b\2\u02c9\u02ca\7l\2\2\u02ca"+ - "\u02d2\3\2\2\2\u02cb\u02cc\7,\2\2\u02cc\u02cd\7k\2\2\u02cd\u02ce\5\u00c2"+ - "b\2\u02ce\u02cf\7l\2\2\u02cf\u02d0\5\u00c2b\2\u02d0\u02d2\3\2\2\2\u02d1"+ - "\u02c6\3\2\2\2\u02d1\u02cb\3\2\2\2\u02d2]\3\2\2\2\u02d3\u02d9\5`\61\2"+ - "\u02d4\u02d5\7\20\2\2\u02d5\u02d9\b\60\1\2\u02d6\u02d7\7D\2\2\u02d7\u02d9"+ - "\b\60\1\2\u02d8\u02d3\3\2\2\2\u02d8\u02d4\3\2\2\2\u02d8\u02d6\3\2\2\2"+ - "\u02d9\u02da\3\2\2\2\u02da\u02dc\5\u0170\u00b9\2\u02db\u02d8\3\2\2\2\u02dc"+ - "\u02df\3\2\2\2\u02dd\u02de\3\2\2\2\u02dd\u02db\3\2\2\2\u02de\u02e2\3\2"+ - "\2\2\u02df\u02dd\3\2\2\2\u02e0\u02e1\7\20\2\2\u02e1\u02e3\b\60\1\2\u02e2"+ - "\u02e0\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3_\3\2\2\2\u02e4\u02e5\7\13\2\2"+ - "\u02e5\u02ed\5d\63\2\u02e6\u02e7\7\f\2\2\u02e7\u02ed\5d\63\2\u02e8\u02e9"+ - "\7\r\2\2\u02e9\u02ed\5d\63\2\u02ea\u02eb\7\17\2\2\u02eb\u02ed\5b\62\2"+ - "\u02ec\u02e4\3\2\2\2\u02ec\u02e6\3\2\2\2\u02ec\u02e8\3\2\2\2\u02ec\u02ea"+ - "\3\2\2\2\u02eda\3\2\2\2\u02ee\u02f0\5\u00e6t\2\u02ef\u02ee\3\2\2\2\u02ef"+ - "\u02f0\3\2\2\2\u02f0\u02f3\3\2\2\2\u02f1\u02f2\7]\2\2\u02f2\u02f4\5\u00a4"+ - "S\2\u02f3\u02f1\3\2\2\2\u02f3\u02f4\3\2\2\2\u02f4c\3\2\2\2\u02f5\u02f8"+ - "\3\2\2\2\u02f6\u02f8\5\u00a4S\2\u02f7\u02f5\3\2\2\2\u02f7\u02f6\3\2\2"+ - "\2\u02f8e\3\2\2\2\u02f9\u02fa\7\67\2\2\u02fa\u02fb\5\u00a4S\2\u02fb\u02ff"+ - "\7i\2\2\u02fc\u02fe\5h\65\2\u02fd\u02fc\3\2\2\2\u02fe\u0301\3\2\2\2\u02ff"+ - "\u02fd\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u0302\3\2\2\2\u0301\u02ff\3\2"+ - "\2\2\u0302\u0303\7j\2\2\u0303g\3\2\2\2\u0304\u0305\5j\66\2\u0305\u0307"+ - "\7p\2\2\u0306\u0308\5\u00f0y\2\u0307\u0306\3\2\2\2\u0307\u0308\3\2\2\2"+ - "\u0308i\3\2\2\2\u0309\u030a\7Q\2\2\u030a\u030d\5l\67\2\u030b\u030d\7M"+ - "\2\2\u030c\u0309\3\2\2\2\u030c\u030b\3\2\2\2\u030dk\3\2\2\2\u030e\u030f"+ - "\7&\2\2\u030f\u031c\7f\2\2\u0310\u0311\5\u00caf\2\u0311\u0316\7i\2\2\u0312"+ - "\u0314\5n8\2\u0313\u0315\7n\2\2\u0314\u0313\3\2\2\2\u0314\u0315\3\2\2"+ - "\2\u0315\u0317\3\2\2\2\u0316\u0312\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u0318"+ - "\3\2\2\2\u0318\u0319\7j\2\2\u0319\u031c\3\2\2\2\u031a\u031c\5\u00a4S\2"+ - "\u031b\u030e\3\2\2\2\u031b\u0310\3\2\2\2\u031b\u031a\3\2\2\2\u031cm\3"+ - "\2\2\2\u031d\u0322\5l\67\2\u031e\u031f\7n\2\2\u031f\u0321\5l\67\2\u0320"+ - "\u031e\3\2\2\2\u0321\u0324\3\2\2\2\u0322\u0320\3\2\2\2\u0322\u0323\3\2"+ - "\2\2\u0323o\3\2\2\2\u0324\u0322\3\2\2\2\u0325\u032a\7i\2\2\u0326\u0327"+ - "\7<\2\2\u0327\u0328\5\u00e4s\2\u0328\u0329\5\u0170\u00b9\2\u0329\u032b"+ - "\3\2\2\2\u032a\u0326\3\2\2\2\u032a\u032b\3\2\2\2\u032b\u032d\3\2\2\2\u032c"+ - "\u032e\5\u00f0y\2\u032d\u032c\3\2\2\2\u032d\u032e\3\2\2\2\u032e\u032f"+ - "\3\2\2\2\u032f\u0330\7j\2\2\u0330q\3\2\2\2\u0331\u0334\5\u0150\u00a9\2"+ - "\u0332\u0334\7f\2\2\u0333\u0331\3\2\2\2\u0333\u0332\3\2\2\2\u0334\u033d"+ - "\3\2\2\2\u0335\u033a\7i\2\2\u0336\u0338\5t;\2\u0337\u0339\7n\2\2\u0338"+ - "\u0337\3\2\2\2\u0338\u0339\3\2\2\2\u0339\u033b\3\2\2\2\u033a\u0336\3\2"+ - "\2\2\u033a\u033b\3\2\2\2\u033b\u033c\3\2\2\2\u033c\u033e\7j\2\2\u033d"+ - "\u0335\3\2\2\2\u033d\u033e\3\2\2\2\u033es\3\2\2\2\u033f\u0344\5v<\2\u0340"+ - "\u0341\7n\2\2\u0341\u0343\5v<\2\u0342\u0340\3\2\2\2\u0343\u0346\3\2\2"+ - "\2\u0344\u0342\3\2\2\2\u0344\u0345\3\2\2\2\u0345u\3\2\2\2\u0346\u0344"+ - "\3\2\2\2\u0347\u0348\7f\2\2\u0348\u034a\7p\2\2\u0349\u0347\3\2\2\2\u0349"+ - "\u034a\3\2\2\2\u034a\u034b\3\2\2\2\u034b\u034c\5\u00a4S\2\u034cw\3\2\2"+ - "\2\u034d\u034e\7H\2\2\u034e\u034f\5\u00a4S\2\u034f\u0350\7\21\2\2\u0350"+ - "\u0351\5r:\2\u0351\u0352\5\u00eex\2\u0352y\3\2\2\2\u0353\u0354\5\u00c2"+ - "b\2\u0354\u0355\7\21\2\2\u0355\u0368\5\u00c2b\2\u0356\u035c\7i\2\2\u0357"+ - "\u0358\5\u0082B\2\u0358\u0359\5\u0170\u00b9\2\u0359\u035b\3\2\2\2\u035a"+ - "\u0357\3\2\2\2\u035b\u035e\3\2\2\2\u035c\u035a\3\2\2\2\u035c\u035d\3\2"+ - "\2\2\u035d\u0364\3\2\2\2\u035e\u035c\3\2\2\2\u035f\u0360\5|?\2\u0360\u0361"+ - "\5\u0170\u00b9\2\u0361\u0363\3\2\2\2\u0362\u035f\3\2\2\2\u0363\u0366\3"+ - "\2\2\2\u0364\u0362\3\2\2\2\u0364\u0365\3\2\2\2\u0365\u0367\3\2\2\2\u0366"+ - "\u0364\3\2\2\2\u0367\u0369\7j\2\2\u0368\u0356\3\2\2\2\u0368\u0369\3\2"+ - "\2\2\u0369{\3\2\2\2\u036a\u036c\7\20\2\2\u036b\u036a\3\2\2\2\u036b\u036c"+ - "\3\2\2\2\u036c\u036d\3\2\2\2\u036d\u036e\5~@\2\u036e\u036f\7f\2\2\u036f"+ - "\u0371\5\u013e\u00a0\2\u0370\u0372\5\u00eex\2\u0371\u0370\3\2\2\2\u0371"+ - "\u0372\3\2\2\2\u0372}\3\2\2\2\u0373\u0375\7g\2\2\u0374\u0376\7f\2\2\u0375"+ - "\u0374\3\2\2\2\u0375\u0376\3\2\2\2\u0376\u0378\3\2\2\2\u0377\u0379\7\u0088"+ - "\2\2\u0378\u0377\3\2\2\2\u0378\u0379\3\2\2\2\u0379\u037a\3\2\2\2\u037a"+ - "\u037b\5\u012c\u0097\2\u037b\u037c\7h\2\2\u037c\177\3\2\2\2\u037d\u0383"+ - "\5\u00b4[\2\u037e\u037f\5\u00c2b\2\u037f\u0380\7q\2\2\u0380\u0381\7f\2"+ - "\2\u0381\u0383\3\2\2\2\u0382\u037d\3\2\2\2\u0382\u037e\3\2\2\2\u0383\u0081"+ - "\3\2\2\2\u0384\u0385\79\2\2\u0385\u0386\7f\2\2\u0386\u0389\7t\2\2\u0387"+ - "\u038a\5\u0080A\2\u0388\u038a\5\u014e\u00a8\2\u0389\u0387\3\2\2\2\u0389"+ - "\u0388\3\2\2\2\u038a\u0083\3\2\2\2\u038b\u038c\7\60\2\2\u038c\u038d\7"+ - "g\2\2\u038d\u0390\5\u00c2b\2\u038e\u038f\7n\2\2\u038f\u0391\5\u00e6t\2"+ - "\u0390\u038e\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0392\3\2\2\2\u0392\u0393"+ - "\7h\2\2\u0393\u0085\3\2\2\2\u0394\u0395\7/\2\2\u0395\u0396\7g\2\2\u0396"+ - "\u0397\5\u00c2b\2\u0397\u0398\7h\2\2\u0398\u0087\3\2\2\2\u0399\u039c\5"+ - "^\60\2\u039a\u039d\5\u008aF\2\u039b\u039d\5\u008cG\2\u039c\u039a\3\2\2"+ - "\2\u039c\u039b\3\2\2\2\u039d\u0089\3\2\2\2\u039e\u039f\7N\2\2\u039f\u03a0"+ - "\7f\2\2\u03a0\u03a2\5\u013e\u00a0\2\u03a1\u03a3\5p9\2\u03a2\u03a1\3\2"+ - "\2\2\u03a2\u03a3\3\2\2\2\u03a3\u008b\3\2\2\2\u03a4\u03a5\7N\2\2\u03a5"+ - "\u03a6\5\u009aN\2\u03a6\u03a7\7f\2\2\u03a7\u03a9\5\u013e\u00a0\2\u03a8"+ - "\u03aa\5p9\2\u03a9\u03a8\3\2\2\2\u03a9\u03aa\3\2\2\2\u03aa\u008d\3\2\2"+ - "\2\u03ab\u03ae\7\34\2\2\u03ac\u03af\5\u0088E\2\u03ad\u03af\5\u00dep\2"+ - "\u03ae\u03ac\3\2\2\2\u03ae\u03ad\3\2\2\2\u03af\u008f\3\2\2\2\u03b0\u03b1"+ - "\79\2\2\u03b1\u03b2\7f\2\2\u03b2\u03b4\5\u0142\u00a2\2\u03b3\u03b5\5\u0092"+ - "J\2\u03b4\u03b3\3\2\2\2\u03b4\u03b5\3\2\2\2\u03b5\u0091\3\2\2\2\u03b6"+ - "\u03b7\7i\2\2\u03b7\u03b8\5\u00a4S\2\u03b8\u03b9\5\u0170\u00b9\2\u03b9"+ - "\u03ba\7j\2\2\u03ba\u0093\3\2\2\2\u03bb\u03bc\79\2\2\u03bc\u03bd\5\u009a"+ - "N\2\u03bd\u03be\7f\2\2\u03be\u03c0\5\u0142\u00a2\2\u03bf\u03c1\5\u0092"+ - "J\2\u03c0\u03bf\3\2\2\2\u03c0\u03c1\3\2\2\2\u03c1\u0095\3\2\2\2\u03c2"+ - "\u03ca\5\b\5\2\u03c3\u03c6\5\u00c2b\2\u03c4\u03c5\7m\2\2\u03c5\u03c7\5"+ - "\u00e6t\2\u03c6\u03c4\3\2\2\2\u03c6\u03c7\3\2\2\2\u03c7\u03cb\3\2\2\2"+ - "\u03c8\u03c9\7m\2\2\u03c9\u03cb\5\u00e6t\2\u03ca\u03c3\3\2\2\2\u03ca\u03c8"+ - "\3\2\2\2\u03cb\u0097\3\2\2\2\u03cc\u03cd\5\b\5\2\u03cd\u03ce\7t\2\2\u03ce"+ - "\u03cf\5\u00e6t\2\u03cf\u0099\3\2\2\2\u03d0\u03d2\7g\2\2\u03d1\u03d3\5"+ - "\n\6\2\u03d2\u03d1\3\2\2\2\u03d2\u03d3\3\2\2\2\u03d3\u03d4\3\2\2\2\u03d4"+ - "\u03d6\5\u00c2b\2\u03d5\u03d7\7n\2\2\u03d6\u03d5\3\2\2\2\u03d6\u03d7\3"+ - "\2\2\2\u03d7\u03d8\3\2\2\2\u03d8\u03d9\7h\2\2\u03d9\u009b\3\2\2\2\u03da"+ - "\u03dd\5\u009eP\2\u03db\u03dd\5\u00a0Q\2\u03dc\u03da\3\2\2\2\u03dc\u03db"+ - "\3\2\2\2\u03dd\u009d\3\2\2\2\u03de\u03e0\5\u00e4s\2\u03df\u03de\3\2\2"+ - "\2\u03df\u03e0\3\2\2\2\u03e0\u03e1\3\2\2\2\u03e1\u03e2\5\u00a2R\2\u03e2"+ - "\u009f\3\2\2\2\u03e3\u03e5\7\34\2\2\u03e4\u03e6\5\u00e4s\2\u03e5\u03e4"+ - "\3\2\2\2\u03e5\u03e6\3\2\2\2\u03e6\u03e7\3\2\2\2\u03e7\u03e8\5\u00a2R"+ - "\2\u03e8\u00a1\3\2\2\2\u03e9\u03eb\7u\2\2\u03ea\u03e9\3\2\2\2\u03ea\u03eb"+ - "\3\2\2\2\u03eb\u03ec\3\2\2\2\u03ec\u03ed\5\u00c2b\2\u03ed\u00a3\3\2\2"+ - "\2\u03ee\u03ef\bS\1\2\u03ef\u03f0\t\b\2\2\u03f0\u03ff\5\u00a4S\20\u03f1"+ - "\u03ff\5\u00b4[\2\u03f2\u03f3\7\33\2\2\u03f3\u03f4\5.\30\2\u03f4\u03f5"+ - "\7\35\2\2\u03f5\u03f6\5\u00a4S\4\u03f6\u03ff\3\2\2\2\u03f7\u03f8\t\t\2"+ - "\2\u03f8\u03f9\5&\24\2\u03f9\u03fa\7p\2\2\u03fa\u03fb\7p\2\2\u03fb\u03fc"+ - "\5*\26\2\u03fc\u03fd\5\u00a4S\3\u03fd\u03ff\3\2\2\2\u03fe\u03ee\3\2\2"+ - "\2\u03fe\u03f1\3\2\2\2\u03fe\u03f2\3\2\2\2\u03fe\u03f7\3\2\2\2\u03ff\u0423"+ - "\3\2\2\2\u0400\u0401\f\16\2\2\u0401\u0402\t\n\2\2\u0402\u0422\5\u00a4"+ - "S\17\u0403\u0404\f\r\2\2\u0404\u0405\t\13\2\2\u0405\u0422\5\u00a4S\16"+ - "\u0406\u0407\f\f\2\2\u0407\u0408\t\f\2\2\u0408\u0422\5\u00a4S\r\u0409"+ - "\u040a\f\13\2\2\u040a\u040b\t\r\2\2\u040b\u0422\5\u00a4S\f\u040c\u040d"+ - "\f\n\2\2\u040d\u040e\t\16\2\2\u040e\u0422\5\u00a4S\13\u040f\u0410\f\b"+ - "\2\2\u0410\u0411\7w\2\2\u0411\u0422\5\u00a4S\t\u0412\u0413\f\7\2\2\u0413"+ - "\u0414\7v\2\2\u0414\u0422\5\u00a4S\b\u0415\u0416\f\6\2\2\u0416\u0417\7"+ - "#\2\2\u0417\u0422\5\u00a4S\6\u0418\u0419\f\5\2\2\u0419\u041a\7&\2\2\u041a"+ - "\u041b\5\u00a4S\2\u041b\u041c\7p\2\2\u041c\u041d\5\u00a4S\5\u041d\u0422"+ - "\3\2\2\2\u041e\u041f\f\t\2\2\u041f\u0420\7\21\2\2\u0420\u0422\5r:\2\u0421"+ - "\u0400\3\2\2\2\u0421\u0403\3\2\2\2\u0421\u0406\3\2\2\2\u0421\u0409\3\2"+ - "\2\2\u0421\u040c\3\2\2\2\u0421\u040f\3\2\2\2\u0421\u0412\3\2\2\2\u0421"+ - "\u0415\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041e\3\2\2\2\u0422\u0425\3\2"+ - "\2\2\u0423\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u00a5\3\2\2\2\u0425"+ - "\u0423\3\2\2\2\u0426\u043b\5\30\r\2\u0427\u043b\5\32\16\2\u0428\u043b"+ - "\5\u00aaV\2\u0429\u043b\5\u00a8U\2\u042a\u043b\5\u00dep\2\u042b\u043b"+ - "\5\u00fe\u0080\2\u042c\u043b\5\u00f2z\2\u042d\u043b\5\u012a\u0096\2\u042e"+ - "\u043b\5\u0100\u0081\2\u042f\u043b\5\u0102\u0082\2\u0430\u043b\5\u0104"+ - "\u0083\2\u0431\u043b\5\u0106\u0084\2\u0432\u043b\5\u0108\u0085\2\u0433"+ - "\u043b\5\u00eex\2\u0434\u043b\5\u010a\u0086\2\u0435\u043b\5\u010c\u0087"+ - "\2\u0436\u043b\5\u011e\u0090\2\u0437\u043b\5\u00acW\2\u0438\u043b\5\u00b0"+ - "Y\2\u0439\u043b\5x=\2\u043a\u0426\3\2\2\2\u043a\u0427\3\2\2\2\u043a\u0428"+ - "\3\2\2\2\u043a\u0429\3\2\2\2\u043a\u042a\3\2\2\2\u043a\u042b\3\2\2\2\u043a"+ - "\u042c\3\2\2\2\u043a\u042d\3\2\2\2\u043a\u042e\3\2\2\2\u043a\u042f\3\2"+ - "\2\2\u043a\u0430\3\2\2\2\u043a\u0431\3\2\2\2\u043a\u0432\3\2\2\2\u043a"+ - "\u0433\3\2\2\2\u043a\u0434\3\2\2\2\u043a\u0435\3\2\2\2\u043a\u0436\3\2"+ - "\2\2\u043a\u0437\3\2\2\2\u043a\u0438\3\2\2\2\u043a\u0439\3\2\2\2\u043b"+ - "\u00a7\3\2\2\2\u043c\u043d\7%\2\2\u043d\u043e\5\u00a4S\2\u043e\u00a9\3"+ - "\2\2\2\u043f\u0440\7Y\2\2\u0440\u0442\5\u00a4S\2\u0441\u0443\5\u00eex"+ - "\2\u0442\u0441\3\2\2\2\u0442\u0443\3\2\2\2\u0443\u00ab\3\2\2\2\u0444\u0445"+ - "\5\u00aeX\2\u0445\u0446\5\u0126\u0094\2\u0446\u00ad\3\2\2\2\u0447\u0448"+ - "\7\16\2\2\u0448\u0449\5\u00a4S\2\u0449\u044a\5\u0170\u00b9\2\u044a\u044c"+ - "\3\2\2\2\u044b\u0447\3\2\2\2\u044c\u044f\3\2\2\2\u044d\u044b\3\2\2\2\u044d"+ - "\u044e\3\2\2\2\u044e\u0454\3\2\2\2\u044f\u044d\3\2\2\2\u0450\u0451\7\17"+ - "\2\2\u0451\u0452\5b\62\2\u0452\u0453\5\u0170\u00b9\2\u0453\u0455\3\2\2"+ - "\2\u0454\u0450\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u00af\3\2\2\2\u0456\u0457"+ - "\7R\2\2\u0457\u045c\5\u00a4S\2\u0458\u0459\7R\2\2\u0459\u045a\t\3\2\2"+ - "\u045a\u045c\5.\30\2\u045b\u0456\3\2\2\2\u045b\u0458\3\2\2\2\u045c\u00b1"+ - "\3\2\2\2\u045d\u0466\7\5\2\2\u045e\u0466\7\6\2\2\u045f\u0466\7e\2\2\u0460"+ - "\u0466\5\u014c\u00a7\2\u0461\u0466\5\u0162\u00b2\2\u0462\u0466\7\3\2\2"+ - "\u0463\u0466\7\u0090\2\2\u0464\u0466\7\u0091\2\2\u0465\u045d\3\2\2\2\u0465"+ - "\u045e\3\2\2\2\u0465\u045f\3\2\2\2\u0465\u0460\3\2\2\2\u0465\u0461\3\2"+ - "\2\2\u0465\u0462\3\2\2\2\u0465\u0463\3\2\2\2\u0465\u0464\3\2\2\2\u0466"+ - "\u00b3\3\2\2\2\u0467\u0468\b[\1\2\u0468\u0474\5\u0148\u00a5\2\u0469\u0474"+ - "\5\u0144\u00a3\2\u046a\u0474\5\u016c\u00b7\2\u046b\u0474\5 \21\2\u046c"+ - "\u0474\5\u0086D\2\u046d\u0474\5\u0084C\2\u046e\u046f\t\17\2\2\u046f\u0470"+ - "\7g\2\2\u0470\u0471\5\u00a4S\2\u0471\u0472\7h\2\2\u0472\u0474\3\2\2\2"+ - "\u0473\u0467\3\2\2\2\u0473\u0469\3\2\2\2\u0473\u046a\3\2\2\2\u0473\u046b"+ - "\3\2\2\2\u0473\u046c\3\2\2\2\u0473\u046d\3\2\2\2\u0473\u046e\3\2\2\2\u0474"+ - "\u048b\3\2\2\2\u0475\u0476\f\13\2\2\u0476\u0477\7q\2\2\u0477\u048a\7f"+ - "\2\2\u0478\u0479\f\n\2\2\u0479\u048a\5\u0166\u00b4\2\u047a\u047b\f\t\2"+ - "\2\u047b\u048a\5\u00ceh\2\u047c\u047d\f\b\2\2\u047d\u048a\5L\'\2\u047e"+ - "\u047f\f\7\2\2\u047f\u048a\5\u0168\u00b5\2\u0480\u0481\f\6\2\2\u0481\u048a"+ - "\5\u016a\u00b6\2\u0482\u0483\f\5\2\2\u0483\u0484\5\u016a\u00b6\2\u0484"+ - "\u0485\7\22\2\2\u0485\u0486\5r:\2\u0486\u048a\3\2\2\2\u0487\u0488\f\4"+ - "\2\2\u0488\u048a\5\u00ba^\2\u0489\u0475\3\2\2\2\u0489\u0478\3\2\2\2\u0489"+ - "\u047a\3\2\2\2\u0489\u047c\3\2\2\2\u0489\u047e\3\2\2\2\u0489\u0480\3\2"+ - "\2\2\u0489\u0482\3\2\2\2\u0489\u0487\3\2\2\2\u048a\u048d\3\2\2\2\u048b"+ - "\u0489\3\2\2\2\u048b\u048c\3\2\2\2\u048c\u00b5\3\2\2\2\u048d\u048b\3\2"+ - "\2\2\u048e\u048f\5^\60\2\u048f\u0490\5\u00b8]\2\u0490\u00b7\3\2\2\2\u0491"+ - "\u0493\7N\2\2\u0492\u0494\7f\2\2\u0493\u0492\3\2\2\2\u0493\u0494\3\2\2"+ - "\2\u0494\u0495\3\2\2\2\u0495\u0497\5\u013e\u00a0\2\u0496\u0498\5p9\2\u0497"+ - "\u0496\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u00b9\3\2\2\2\u0499\u049b\7\'"+ - "\2\2\u049a\u049c\5\u00e6t\2\u049b\u049a\3\2\2\2\u049b\u049c\3\2\2\2\u049c"+ - "\u049e\3\2\2\2\u049d\u049f\7n\2\2\u049e\u049d\3\2\2\2\u049e\u049f\3\2"+ - "\2\2\u049f\u04a0\3\2\2\2\u04a0\u04a1\7(\2\2\u04a1\u00bb\3\2\2\2\u04a2"+ - "\u04a3\7O\2\2\u04a3\u04ad\7i\2\2\u04a4\u04a8\5\u00c0a\2\u04a5\u04a8\5"+ - "\u012c\u0097\2\u04a6\u04a8\5\u00be`\2\u04a7\u04a4\3\2\2\2\u04a7\u04a5"+ - "\3\2\2\2\u04a7\u04a6\3\2\2\2\u04a8\u04a9\3\2\2\2\u04a9\u04aa\5\u0170\u00b9"+ - "\2\u04aa\u04ac\3\2\2\2\u04ab\u04a7\3\2\2\2\u04ac\u04af\3\2\2\2\u04ad\u04ab"+ - "\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04b0\3\2\2\2\u04af\u04ad\3\2\2\2\u04b0"+ - "\u04b1\7j\2\2\u04b1\u00bd\3\2\2\2\u04b2\u04b3\79\2\2\u04b3\u04b4\7f\2"+ - "\2\u04b4\u04b5\5\u0142\u00a2\2\u04b5\u00bf\3\2\2\2\u04b6\u04b8\7\34\2"+ - "\2\u04b7\u04b6\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba"+ - "\5^\60\2\u04ba\u04bb\7f\2\2\u04bb\u04bc\5\u0142\u00a2\2\u04bc\u04bd\5"+ - "\u0140\u00a1\2\u04bd\u04c6\3\2\2\2\u04be\u04c0\7\34\2\2\u04bf\u04be\3"+ - "\2\2\2\u04bf\u04c0\3\2\2\2\u04c0\u04c1\3\2\2\2\u04c1\u04c2\5^\60\2\u04c2"+ - "\u04c3\7f\2\2\u04c3\u04c4\5\u0142\u00a2\2\u04c4\u04c6\3\2\2\2\u04c5\u04b7"+ - "\3\2\2\2\u04c5\u04bf\3\2\2\2\u04c6\u00c1\3\2\2\2\u04c7\u04cf\5\u012c\u0097"+ - "\2\u04c8\u04cf\5\u00c4c\2\u04c9\u04cf\5P)\2\u04ca\u04cb\7g\2\2\u04cb\u04cc"+ - "\5\u00c2b\2\u04cc\u04cd\7h\2\2\u04cd\u04cf\3\2\2\2\u04ce\u04c7\3\2\2\2"+ - "\u04ce\u04c8\3\2\2\2\u04ce\u04c9\3\2\2\2\u04ce\u04ca\3\2\2\2\u04cf\u00c3"+ - "\3\2\2\2\u04d0\u04da\5\u012e\u0098\2\u04d1\u04da\5\u015e\u00b0\2\u04d2"+ - "\u04da\5\u0134\u009b\2\u04d3\u04da\5\u013c\u009f\2\u04d4\u04da\5\u00bc"+ - "_\2\u04d5\u04da\5\u0136\u009c\2\u04d6\u04da\5\u0138\u009d\2\u04d7\u04da"+ - "\5\u013a\u009e\2\u04d8\u04da\5\u00c6d\2\u04d9\u04d0\3\2\2\2\u04d9\u04d1"+ - "\3\2\2\2\u04d9\u04d2\3\2\2\2\u04d9\u04d3\3\2\2\2\u04d9\u04d4\3\2\2\2\u04d9"+ - "\u04d5\3\2\2\2\u04d9\u04d6\3\2\2\2\u04d9\u04d7\3\2\2\2\u04d9\u04d8\3\2"+ - "\2\2\u04da\u00c5\3\2\2\2\u04db\u04dc\79\2\2\u04dc\u04dd\5\u00c8e\2\u04dd"+ - "\u00c7\3\2\2\2\u04de\u04ea\7g\2\2\u04df\u04e4\5\u00c2b\2\u04e0\u04e1\7"+ - "n\2\2\u04e1\u04e3\5\u00c2b\2\u04e2\u04e0\3\2\2\2\u04e3\u04e6\3\2\2\2\u04e4"+ - "\u04e2\3\2\2\2\u04e4\u04e5\3\2\2\2\u04e5\u04e8\3\2\2\2\u04e6\u04e4\3\2"+ - "\2\2\u04e7\u04e9\7n\2\2\u04e8\u04e7\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9"+ - "\u04eb\3\2\2\2\u04ea\u04df\3\2\2\2\u04ea\u04eb\3\2\2\2\u04eb\u04ec\3\2"+ - "\2\2\u04ec\u04ed\7h\2\2\u04ed\u00c9\3\2\2\2\u04ee\u04f6\5\u015e\u00b0"+ - "\2\u04ef\u04f6\5\u012e\u0098\2\u04f0\u04f6\5\u00ccg\2\u04f1\u04f6\5\u0136"+ - "\u009c\2\u04f2\u04f6\5\u0138\u009d\2\u04f3\u04f6\5P)\2\u04f4\u04f6\5\u012c"+ - "\u0097\2\u04f5\u04ee\3\2\2\2\u04f5\u04ef\3\2\2\2\u04f5\u04f0\3\2\2\2\u04f5"+ - "\u04f1\3\2\2\2\u04f5\u04f2\3\2\2\2\u04f5\u04f3\3\2\2\2\u04f5\u04f4\3\2"+ - "\2\2\u04f6\u00cb\3\2\2\2\u04f7\u04f8\7k\2\2\u04f8\u04f9\7u\2\2\u04f9\u04fa"+ - "\7l\2\2\u04fa\u04fb\5\u0132\u009a\2\u04fb\u00cd\3\2\2\2\u04fc\u050c\7"+ - "k\2\2\u04fd\u04ff\5\u00d0i\2\u04fe\u04fd\3\2\2\2\u04fe\u04ff\3\2\2\2\u04ff"+ - "\u0500\3\2\2\2\u0500\u0502\7p\2\2\u0501\u0503\5\u00d2j\2\u0502\u0501\3"+ - "\2\2\2\u0502\u0503\3\2\2\2\u0503\u050d\3\2\2\2\u0504\u0506\5\u00d0i\2"+ - "\u0505\u0504\3\2\2\2\u0505\u0506\3\2\2\2\u0506\u0507\3\2\2\2\u0507\u0508"+ - "\7p\2\2\u0508\u0509\5\u00d2j\2\u0509\u050a\7p\2\2\u050a\u050b\5\u00d4"+ - "k\2\u050b\u050d\3\2\2\2\u050c\u04fe\3\2\2\2\u050c\u0505\3\2\2\2\u050d"+ - "\u050e\3\2\2\2\u050e\u050f\7l\2\2\u050f\u00cf\3\2\2\2\u0510\u0511\5\u00a4"+ - "S\2\u0511\u00d1\3\2\2\2\u0512\u0513\5\u00a4S\2\u0513\u00d3\3\2\2\2\u0514"+ - "\u0515\5\u00a4S\2\u0515\u00d5\3\2\2\2\u0516\u0518\t\20\2\2\u0517\u0516"+ - "\3\2\2\2\u0517\u0518\3\2\2\2\u0518\u0519\3\2\2\2\u0519\u051a\7m\2\2\u051a"+ - "\u00d7\3\2\2\2\u051b\u051c\5\u00e6t\2\u051c\u051d\7m\2\2\u051d\u0522\3"+ - "\2\2\2\u051e\u051f\5\b\5\2\u051f\u0520\7t\2\2\u0520\u0522\3\2\2\2\u0521"+ - "\u051b\3\2\2\2\u0521\u051e\3\2\2\2\u0521\u0522\3\2\2\2\u0522\u0523\3\2"+ - "\2\2\u0523\u0524\7^\2\2\u0524\u0529\5\u00a4S\2\u0525\u0527\7K\2\2\u0526"+ - "\u0528\7f\2\2\u0527\u0526\3\2\2\2\u0527\u0528\3\2\2\2\u0528\u052a\3\2"+ - "\2\2\u0529\u0525\3\2\2\2\u0529\u052a\3\2\2\2\u052a\u00d9\3\2\2\2\u052b"+ - "\u052c\7Y\2\2\u052c\u052d\7f\2\2\u052d\u00db\3\2\2\2\u052e\u052f\5\u0162"+ - "\u00b2\2\u052f\u00dd\3\2\2\2\u0530\u0534\5\u00e0q\2\u0531\u0534\5\u00e8"+ - "u\2\u0532\u0534\5\u00ecw\2\u0533\u0530\3\2\2\2\u0533\u0531\3\2\2\2\u0533"+ - "\u0532\3\2\2\2\u0534\u00df\3\2\2\2\u0535\u0541\7[\2\2\u0536\u0542\5\u00e2"+ - "r\2\u0537\u053d\7g\2\2\u0538\u0539\5\u00e2r\2\u0539\u053a\5\u0170\u00b9"+ - "\2\u053a\u053c\3\2\2\2\u053b\u0538\3\2\2\2\u053c\u053f\3\2\2\2\u053d\u053b"+ - "\3\2\2\2\u053d\u053e\3\2\2\2\u053e\u0540\3\2\2\2\u053f\u053d\3\2\2\2\u0540"+ - "\u0542\7h\2\2\u0541\u0536\3\2\2\2\u0541\u0537\3\2\2\2\u0542\u00e1\3\2"+ - "\2\2\u0543\u0549\5\u00e4s\2\u0544\u0546\5\u00c2b\2\u0545\u0544\3\2\2\2"+ - "\u0545\u0546\3\2\2\2\u0546\u0547\3\2\2\2\u0547\u0548\7m\2\2\u0548\u054a"+ - "\5\u00e6t\2\u0549\u0545\3\2\2\2\u0549\u054a\3\2\2\2\u054a\u00e3\3\2\2"+ - "\2\u054b\u0550\7f\2\2\u054c\u054d\7n\2\2\u054d\u054f\7f\2\2\u054e\u054c"+ - "\3\2\2\2\u054f\u0552\3\2\2\2\u0550\u054e\3\2\2\2\u0550\u0551\3\2\2\2\u0551"+ - "\u00e5\3\2\2\2\u0552\u0550\3\2\2\2\u0553\u0558\5\u00a4S\2\u0554\u0555"+ - "\7n\2\2\u0555\u0557\5\u00a4S\2\u0556\u0554\3\2\2\2\u0557\u055a\3\2\2\2"+ - "\u0558\u0556\3\2\2\2\u0558\u0559\3\2\2\2\u0559\u00e7\3\2\2\2\u055a\u0558"+ - "\3\2\2\2\u055b\u0567\7_\2\2\u055c\u0568\5\u00eav\2\u055d\u0563\7g\2\2"+ - "\u055e\u055f\5\u00eav\2\u055f\u0560\5\u0170\u00b9\2\u0560\u0562\3\2\2"+ - "\2\u0561\u055e\3\2\2\2\u0562\u0565\3\2\2\2\u0563\u0561\3\2\2\2\u0563\u0564"+ - "\3\2\2\2\u0564\u0566\3\2\2\2\u0565\u0563\3\2\2\2\u0566\u0568\7h\2\2\u0567"+ - "\u055c\3\2\2\2\u0567\u055d\3\2\2\2\u0568\u00e9\3\2\2\2\u0569\u056b\7f"+ - "\2\2\u056a\u056c\7m\2\2\u056b\u056a\3\2\2\2\u056b\u056c\3\2\2\2\u056c"+ - "\u056d\3\2\2\2\u056d\u056e\5\u00c2b\2\u056e\u00eb\3\2\2\2\u056f\u057b"+ - "\7d\2\2\u0570\u057c\5\u0096L\2\u0571\u0577\7g\2\2\u0572\u0573\5\u0096"+ - "L\2\u0573\u0574\5\u0170\u00b9\2\u0574\u0576\3\2\2\2\u0575\u0572\3\2\2"+ - "\2\u0576\u0579\3\2\2\2\u0577\u0575\3\2\2\2\u0577\u0578\3\2\2\2\u0578\u057a"+ - "\3\2\2\2\u0579\u0577\3\2\2\2\u057a\u057c\7h\2\2\u057b\u0570\3\2\2\2\u057b"+ - "\u0571\3\2\2\2\u057c\u00ed\3\2\2\2\u057d\u057f\7i\2\2\u057e\u0580\5\u00f0"+ - "y\2\u057f\u057e\3\2\2\2\u057f\u0580\3\2\2\2\u0580\u0581\3\2\2\2\u0581"+ - "\u0582\7j\2\2\u0582\u00ef\3\2\2\2\u0583\u0585\5\u0170\u00b9\2\u0584\u0583"+ - "\3\2\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0587\5\u00a6T"+ - "\2\u0587\u0588\5\u0170\u00b9\2\u0588\u058a\3\2\2\2\u0589\u0584\3\2\2\2"+ - "\u058a\u058b\3\2\2\2\u058b\u0589\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u00f1"+ - "\3\2\2\2\u058d\u0593\5\u00f6|\2\u058e\u0593\5\u00f8}\2\u058f\u0593\5\u00fa"+ - "~\2\u0590\u0593\5\u00f4{\2\u0591\u0593\5\u0098M\2\u0592\u058d\3\2\2\2"+ - "\u0592\u058e\3\2\2\2\u0592\u058f\3\2\2\2\u0592\u0590\3\2\2\2\u0592\u0591"+ - "\3\2\2\2\u0593\u00f3\3\2\2\2\u0594\u0595\5\u00a4S\2\u0595\u00f5\3\2\2"+ - "\2\u0596\u0597\5\u00a4S\2\u0597\u0598\7\u008a\2\2\u0598\u0599\5\u00a4"+ - "S\2\u0599\u00f7\3\2\2\2\u059a\u059b\5\u00a4S\2\u059b\u059c\t\21\2\2\u059c"+ - "\u00f9\3\2\2\2\u059d\u059e\5\u00e6t\2\u059e\u059f\5\u00d6l\2\u059f\u05a0"+ - "\5\u00e6t\2\u05a0\u00fb\3\2\2\2\u05a1\u05a2\t\22\2\2\u05a2\u00fd\3\2\2"+ - "\2\u05a3\u05a4\7f\2\2\u05a4\u05a6\7p\2\2\u05a5\u05a7\5\u00a6T\2\u05a6"+ - "\u05a5\3\2\2\2\u05a6\u05a7\3\2\2\2\u05a7\u00ff\3\2\2\2\u05a8\u05aa\7c"+ - "\2\2\u05a9\u05ab\5\u00e6t\2\u05aa\u05a9\3\2\2\2\u05aa\u05ab\3\2\2\2\u05ab"+ - "\u0101\3\2\2\2\u05ac\u05ae\7L\2\2\u05ad\u05af\7f\2\2\u05ae\u05ad\3\2\2"+ - "\2\u05ae\u05af\3\2\2\2\u05af\u0103\3\2\2\2\u05b0\u05b2\7`\2\2\u05b1\u05b3"+ - "\7f\2\2\u05b2\u05b1\3\2\2\2\u05b2\u05b3\3\2\2\2\u05b3\u0105\3\2\2\2\u05b4"+ - "\u05b5\7X\2\2\u05b5\u05b6\7f\2\2\u05b6\u0107\3\2\2\2\u05b7\u05b8\7\\\2"+ - "\2\u05b8\u0109\3\2\2\2\u05b9\u05c2\7]\2\2\u05ba\u05c3\5\u00a4S\2\u05bb"+ - "\u05bc\5\u0170\u00b9\2\u05bc\u05bd\5\u00a4S\2\u05bd\u05c3\3\2\2\2\u05be"+ - "\u05bf\5\u00f2z\2\u05bf\u05c0\5\u0170\u00b9\2\u05c0\u05c1\5\u00a4S\2\u05c1"+ - "\u05c3\3\2\2\2\u05c2\u05ba\3\2\2\2\u05c2\u05bb\3\2\2\2\u05c2\u05be\3\2"+ - "\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05ca\5\u00eex\2\u05c5\u05c8\7W\2\2\u05c6"+ - "\u05c9\5\u010a\u0086\2\u05c7\u05c9\5\u00eex\2\u05c8\u05c6\3\2\2\2\u05c8"+ - "\u05c7\3\2\2\2\u05c9\u05cb\3\2\2\2\u05ca\u05c5\3\2\2\2\u05ca\u05cb\3\2"+ - "\2\2\u05cb\u010b\3\2\2\2\u05cc\u05cf\5\u010e\u0088\2\u05cd\u05cf\5\u0114"+ - "\u008b\2\u05ce\u05cc\3\2\2\2\u05ce\u05cd\3\2\2\2\u05cf\u010d\3\2\2\2\u05d0"+ - "\u05db\7Z\2\2\u05d1\u05d3\5\u00a4S\2\u05d2\u05d1\3\2\2\2\u05d2\u05d3\3"+ - "\2\2\2\u05d3\u05dc\3\2\2\2\u05d4\u05d6\5\u00f2z\2\u05d5\u05d4\3\2\2\2"+ - "\u05d5\u05d6\3\2\2\2\u05d6\u05d7\3\2\2\2\u05d7\u05d9\5\u0170\u00b9\2\u05d8"+ - "\u05da\5\u00a4S\2\u05d9\u05d8\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05dc"+ - "\3\2\2\2\u05db\u05d2\3\2\2\2\u05db\u05d5\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd"+ - "\u05e1\7i\2\2\u05de\u05e0\5\u0110\u0089\2\u05df\u05de\3\2\2\2\u05e0\u05e3"+ - "\3\2\2\2\u05e1\u05df\3\2\2\2\u05e1\u05e2\3\2\2\2\u05e2\u05e4\3\2\2\2\u05e3"+ - "\u05e1\3\2\2\2\u05e4\u05e5\7j\2\2\u05e5\u010f\3\2\2\2\u05e6\u05e7\5\u0112"+ - "\u008a\2\u05e7\u05e9\7p\2\2\u05e8\u05ea\5\u00f0y\2\u05e9\u05e8\3\2\2\2"+ - "\u05e9\u05ea\3\2\2\2\u05ea\u0111\3\2\2\2\u05eb\u05ec\7Q\2\2\u05ec\u05ef"+ - "\5\u00e6t\2\u05ed\u05ef\7M\2\2\u05ee\u05eb\3\2\2\2\u05ee\u05ed\3\2\2\2"+ - "\u05ef\u0113\3\2\2\2\u05f0\u05f9\7Z\2\2\u05f1\u05fa\5\u0116\u008c\2\u05f2"+ - "\u05f3\5\u0170\u00b9\2\u05f3\u05f4\5\u0116\u008c\2\u05f4\u05fa\3\2\2\2"+ - "\u05f5\u05f6\5\u00f2z\2\u05f6\u05f7\5\u0170\u00b9\2\u05f7\u05f8\5\u0116"+ - "\u008c\2\u05f8\u05fa\3\2\2\2\u05f9\u05f1\3\2\2\2\u05f9\u05f2\3\2\2\2\u05f9"+ - "\u05f5\3\2\2\2\u05fa\u05fb\3\2\2\2\u05fb\u05ff\7i\2\2\u05fc\u05fe\5\u0118"+ - "\u008d\2\u05fd\u05fc\3\2\2\2\u05fe\u0601\3\2\2\2\u05ff\u05fd\3\2\2\2\u05ff"+ - "\u0600\3\2\2\2\u0600\u0602\3\2\2\2\u0601\u05ff\3\2\2\2\u0602\u0603\7j"+ - "\2\2\u0603\u0115\3\2\2\2\u0604\u0605\7f\2\2\u0605\u0607\7t\2\2\u0606\u0604"+ - "\3\2\2\2\u0606\u0607\3\2\2\2\u0607\u0608\3\2\2\2\u0608\u0609\5\u00b4["+ - "\2\u0609\u060a\7q\2\2\u060a\u060b\7g\2\2\u060b\u060c\7_\2\2\u060c\u060d"+ - "\7h\2\2\u060d\u0117\3\2\2\2\u060e\u060f\5\u011a\u008e\2\u060f\u0611\7"+ - "p\2\2\u0610\u0612\5\u00f0y\2\u0611\u0610\3\2\2\2\u0611\u0612\3\2\2\2\u0612"+ - "\u0119\3\2\2\2\u0613\u0614\7Q\2\2\u0614\u0617\5\u011c\u008f\2\u0615\u0617"+ - "\7M\2\2\u0616\u0613\3\2\2\2\u0616\u0615\3\2\2\2\u0617\u011b\3\2\2\2\u0618"+ - "\u061b\5\u00c2b\2\u0619\u061b\7e\2\2\u061a\u0618\3\2\2\2\u061a\u0619\3"+ - "\2\2\2\u061b\u0623\3\2\2\2\u061c\u061f\7n\2\2\u061d\u0620\5\u00c2b\2\u061e"+ - "\u0620\7e\2\2\u061f\u061d\3\2\2\2\u061f\u061e\3\2\2\2\u0620\u0622\3\2"+ - "\2\2\u0621\u061c\3\2\2\2\u0622\u0625\3\2\2\2\u0623\u0621\3\2\2\2\u0623"+ - "\u0624\3\2\2\2\u0624\u011d\3\2\2\2\u0625\u0623\3\2\2\2\u0626\u0627\7P"+ - "\2\2\u0627\u062b\7i\2\2\u0628\u062a\5\u0120\u0091\2\u0629\u0628\3\2\2"+ - "\2\u062a\u062d\3\2\2\2\u062b\u0629\3\2\2\2\u062b\u062c\3\2\2\2\u062c\u062e"+ - "\3\2\2\2\u062d\u062b\3\2\2\2\u062e\u062f\7j\2\2\u062f\u011f\3\2\2\2\u0630"+ - "\u0631\5\u0122\u0092\2\u0631\u0633\7p\2\2\u0632\u0634\5\u00f0y\2\u0633"+ - "\u0632\3\2\2\2\u0633\u0634\3\2\2\2\u0634\u0121\3\2\2\2\u0635\u0638\7Q"+ - "\2\2\u0636\u0639\5\u00f6|\2\u0637\u0639\5\u0124\u0093\2\u0638\u0636\3"+ - "\2\2\2\u0638\u0637\3\2\2\2\u0639\u063c\3\2\2\2\u063a\u063c\7M\2\2\u063b"+ - "\u0635\3\2\2\2\u063b\u063a\3\2\2\2\u063c\u0123\3\2\2\2\u063d\u063e\5\u00e6"+ - "t\2\u063e\u063f\7m\2\2\u063f\u0644\3\2\2\2\u0640\u0641\5\u00e4s\2\u0641"+ - "\u0642\7t\2\2\u0642\u0644\3\2\2\2\u0643\u063d\3\2\2\2\u0643\u0640\3\2"+ - "\2\2\u0643\u0644\3\2\2\2\u0644\u0645\3\2\2\2\u0645\u0646\5\u00a4S\2\u0646"+ - "\u0125\3\2\2\2\u0647\u064b\7a\2\2\u0648\u064c\5\u00a4S\2\u0649\u064c\5"+ - "\u0128\u0095\2\u064a\u064c\5\u00d8m\2\u064b\u0648\3\2\2\2\u064b\u0649"+ - "\3\2\2\2\u064b\u064a\3\2\2\2\u064b\u064c\3\2\2\2\u064c\u064d\3\2\2\2\u064d"+ - "\u064e\5\u00eex\2\u064e\u0127\3\2\2\2\u064f\u0651\5\u00f2z\2\u0650\u064f"+ - "\3\2\2\2\u0650\u0651\3\2\2\2\u0651\u0652\3\2\2\2\u0652\u0654\5\u0170\u00b9"+ - "\2\u0653\u0655\5\u00a4S\2\u0654\u0653\3\2\2\2\u0654\u0655\3\2\2\2\u0655"+ - "\u0656\3\2\2\2\u0656\u0658\5\u0170\u00b9\2\u0657\u0659\5\u00f2z\2\u0658"+ - "\u0657\3\2\2\2\u0658\u0659\3\2\2\2\u0659\u0129\3\2\2\2\u065a\u065b\7S"+ - "\2\2\u065b\u065c\5\u00a4S\2\u065c\u012b\3\2\2\2\u065d\u0660\5\u0150\u00a9"+ - "\2\u065e\u0660\7f\2\2\u065f\u065d\3\2\2\2\u065f\u065e\3\2\2\2\u0660\u012d"+ - "\3\2\2\2\u0661\u0662\7k\2\2\u0662\u0663\5\u0130\u0099\2\u0663\u0664\7"+ - "l\2\2\u0664\u0665\5\u0132\u009a\2\u0665\u012f\3\2\2\2\u0666\u0667\5\u00a4"+ - "S\2\u0667\u0131\3\2\2\2\u0668\u0669\5\u00c2b\2\u0669\u0133\3\2\2\2\u066a"+ - "\u066b\7\u0088\2\2\u066b\u066c\5\u00c2b\2\u066c\u0135\3\2\2\2\u066d\u066e"+ - "\7k\2\2\u066e\u066f\7l\2\2\u066f\u0670\5\u0132\u009a\2\u0670\u0137\3\2"+ - "\2\2\u0671\u0672\7T\2\2\u0672\u0673\7k\2\2\u0673\u0674\5\u00c2b\2\u0674"+ - "\u0675\7l\2\2\u0675\u0676\5\u0132\u009a\2\u0676\u0139\3\2\2\2\u0677\u067d"+ - "\7V\2\2\u0678\u0679\7V\2\2\u0679\u067d\7\u008a\2\2\u067a\u067b\7\u008a"+ - "\2\2\u067b\u067d\7V\2\2\u067c\u0677\3\2\2\2\u067c\u0678\3\2\2\2\u067c"+ - "\u067a\3\2\2\2\u067d\u067e\3\2\2\2\u067e\u067f\5\u0132\u009a\2\u067f\u013b"+ - "\3\2\2\2\u0680\u0681\7N\2\2\u0681\u0682\5\u013e\u00a0\2\u0682\u013d\3"+ - "\2\2\2\u0683\u0684\5\u0142\u00a2\2\u0684\u0685\5\u0140\u00a1\2\u0685\u0688"+ - "\3\2\2\2\u0686\u0688\5\u0142\u00a2\2\u0687\u0683\3\2\2\2\u0687\u0686\3"+ - "\2\2\2\u0688\u013f\3\2\2\2\u0689\u068c\5\u0142\u00a2\2\u068a\u068c\5\u00c2"+ - "b\2\u068b\u0689\3\2\2\2\u068b\u068a\3\2\2\2\u068c\u0141\3\2\2\2\u068d"+ - "\u0699\7g\2\2\u068e\u0693\5\u009cO\2\u068f\u0690\7n\2\2\u0690\u0692\5"+ - "\u009cO\2\u0691\u068f\3\2\2\2\u0692\u0695\3\2\2\2\u0693\u0691\3\2\2\2"+ - "\u0693\u0694\3\2\2\2\u0694\u0697\3\2\2\2\u0695\u0693\3\2\2\2\u0696\u0698"+ - "\7n\2\2\u0697\u0696\3\2\2\2\u0697\u0698\3\2\2\2\u0698\u069a\3\2\2\2\u0699"+ - "\u068e\3\2\2\2\u0699\u069a\3\2\2\2\u069a\u069b\3\2\2\2\u069b\u069c\7h"+ - "\2\2\u069c\u0143\3\2\2\2\u069d\u069e\5\u0146\u00a4\2\u069e\u069f\7g\2"+ - "\2\u069f\u06a1\5\u00a4S\2\u06a0\u06a2\7n\2\2\u06a1\u06a0\3\2\2\2\u06a1"+ - "\u06a2\3\2\2\2\u06a2\u06a3\3\2\2\2\u06a3\u06a4\7h\2\2\u06a4\u0145\3\2"+ - "\2\2\u06a5\u06ab\5\u00c4c\2\u06a6\u06a7\7g\2\2\u06a7\u06a8\5\u0146\u00a4"+ - "\2\u06a8\u06a9\7h\2\2\u06a9\u06ab\3\2\2\2\u06aa\u06a5\3\2\2\2\u06aa\u06a6"+ - "\3\2\2\2\u06ab\u0147\3\2\2\2\u06ac\u06b3\5\u014a\u00a6\2\u06ad\u06b3\5"+ - "\u014e\u00a8\2\u06ae\u06af\7g\2\2\u06af\u06b0\5\u00a4S\2\u06b0\u06b1\7"+ - "h\2\2\u06b1\u06b3\3\2\2\2\u06b2\u06ac\3\2\2\2\u06b2\u06ad\3\2\2\2\u06b2"+ - "\u06ae\3\2\2\2\u06b3\u0149\3\2\2\2\u06b4\u06b8\5\u00b2Z\2\u06b5\u06b8"+ - "\5\u0152\u00aa\2\u06b6\u06b8\5\u00b6\\\2\u06b7\u06b4\3\2\2\2\u06b7\u06b5"+ - "\3\2\2\2\u06b7\u06b6\3\2\2\2\u06b8\u014b\3\2\2\2\u06b9\u06ba\t\23\2\2"+ - "\u06ba\u014d\3\2\2\2\u06bb\u06bc\7f\2\2\u06bc\u014f\3\2\2\2\u06bd\u06be"+ - "\7f\2\2\u06be\u06bf\7q\2\2\u06bf\u06c0\7f\2\2\u06c0\u0151\3\2\2\2\u06c1"+ - "\u06c2\5\u00caf\2\u06c2\u06c3\5\u0154\u00ab\2\u06c3\u0153\3\2\2\2\u06c4"+ - "\u06c9\7i\2\2\u06c5\u06c7\5\u0156\u00ac\2\u06c6\u06c8\7n\2\2\u06c7\u06c6"+ - "\3\2\2\2\u06c7\u06c8\3\2\2\2\u06c8\u06ca\3\2\2\2\u06c9\u06c5\3\2\2\2\u06c9"+ - "\u06ca\3\2\2\2\u06ca\u06cb\3\2\2\2\u06cb\u06cc\7j\2\2\u06cc\u0155\3\2"+ - "\2\2\u06cd\u06d2\5\u0158\u00ad\2\u06ce\u06cf\7n\2\2\u06cf\u06d1\5\u0158"+ - "\u00ad\2\u06d0\u06ce\3\2\2\2\u06d1\u06d4\3\2\2\2\u06d2\u06d0\3\2\2\2\u06d2"+ - "\u06d3\3\2\2\2\u06d3\u0157\3\2\2\2\u06d4\u06d2\3\2\2\2\u06d5\u06d6\5\u015a"+ - "\u00ae\2\u06d6\u06d7\7p\2\2\u06d7\u06d9\3\2\2\2\u06d8\u06d5\3\2\2\2\u06d8"+ - "\u06d9\3\2\2\2\u06d9\u06da\3\2\2\2\u06da\u06db\5\u015c\u00af\2\u06db\u0159"+ - "\3\2\2\2\u06dc\u06df\5\u00a4S\2\u06dd\u06df\5\u0154\u00ab\2\u06de\u06dc"+ - "\3\2\2\2\u06de\u06dd\3\2\2\2\u06df\u015b\3\2\2\2\u06e0\u06e3\5\u00a4S"+ - "\2\u06e1\u06e3\5\u0154\u00ab\2\u06e2\u06e0\3\2\2\2\u06e2\u06e1\3\2\2\2"+ - "\u06e3\u015d\3\2\2\2\u06e4\u06e5\7U\2\2\u06e5\u06eb\7i\2\2\u06e6\u06e7"+ - "\5\u0160\u00b1\2\u06e7\u06e8\5\u0170\u00b9\2\u06e8\u06ea\3\2\2\2\u06e9"+ - "\u06e6\3\2\2\2\u06ea\u06ed\3\2\2\2\u06eb\u06e9\3\2\2\2\u06eb\u06ec\3\2"+ - "\2\2\u06ec\u06ee\3\2\2\2\u06ed\u06eb\3\2\2\2\u06ee\u06ef\7j\2\2\u06ef"+ - "\u015f\3\2\2\2\u06f0\u06f1\5\u00e4s\2\u06f1\u06f2\5\u00c2b\2\u06f2\u06f5"+ - "\3\2\2\2\u06f3\u06f5\5\u0164\u00b3\2\u06f4\u06f0\3\2\2\2\u06f4\u06f3\3"+ - "\2\2\2\u06f5\u06f7\3\2\2\2\u06f6\u06f8\5\u0162\u00b2\2\u06f7\u06f6\3\2"+ - "\2\2\u06f7\u06f8\3\2\2\2\u06f8\u0161\3\2\2\2\u06f9\u06fa\t\24\2\2\u06fa"+ - "\u0163\3\2\2\2\u06fb\u06fd\7\u0088\2\2\u06fc\u06fb\3\2\2\2\u06fc\u06fd"+ - "\3\2\2\2\u06fd\u06fe\3\2\2\2\u06fe\u06ff\5\u012c\u0097\2\u06ff\u0165\3"+ - "\2\2\2\u0700\u0701\7k\2\2\u0701\u0702\5\u00a4S\2\u0702\u0703\7l\2\2\u0703"+ - "\u0167\3\2\2\2\u0704\u0705\7q\2\2\u0705\u0706\7g\2\2\u0706\u0707\5\u00c2"+ - "b\2\u0707\u0708\7h\2\2\u0708\u0169\3\2\2\2\u0709\u0718\7g\2\2\u070a\u0711"+ - "\5\u00e6t\2\u070b\u070e\5\u0146\u00a4\2\u070c\u070d\7n\2\2\u070d\u070f"+ - "\5\u00e6t\2\u070e\u070c\3\2\2\2\u070e\u070f\3\2\2\2\u070f\u0711\3\2\2"+ - "\2\u0710\u070a\3\2\2\2\u0710\u070b\3\2\2\2\u0711\u0713\3\2\2\2\u0712\u0714"+ - "\7u\2\2\u0713\u0712\3\2\2\2\u0713\u0714\3\2\2\2\u0714\u0716\3\2\2\2\u0715"+ - "\u0717\7n\2\2\u0716\u0715\3\2\2\2\u0716\u0717\3\2\2\2\u0717\u0719\3\2"+ - "\2\2\u0718\u0710\3\2\2\2\u0718\u0719\3\2\2\2\u0719\u071a\3\2\2\2\u071a"+ - "\u071b\7h\2\2\u071b\u016b\3\2\2\2\u071c\u071d\5\u0146\u00a4\2\u071d\u071e"+ - "\7q\2\2\u071e\u071f\7f\2\2\u071f\u016d\3\2\2\2\u0720\u0721\5\u00c2b\2"+ - "\u0721\u016f\3\2\2\2\u0722\u0727\7o\2\2\u0723\u0727\7\2\2\3\u0724\u0727"+ - "\7\u00a0\2\2\u0725\u0727\6\u00b9\24\2\u0726\u0722\3\2\2\2\u0726\u0723"+ - "\3\2\2\2\u0726\u0724\3\2\2\2\u0726\u0725\3\2\2\2\u0727\u0171\3\2\2\2\u00bd"+ - "\u0180\u0185\u018c\u0196\u019c\u01a2\u01b2\u01b6\u01bf\u01cb\u01cf\u01d5"+ - "\u01de\u01e8\u01f9\u0207\u020b\u0212\u021a\u0223\u0243\u024b\u0263\u0274"+ - "\u0283\u0290\u0299\u02a7\u02b0\u02bc\u02d1\u02d8\u02dd\u02e2\u02ec\u02ef"+ - "\u02f3\u02f7\u02ff\u0307\u030c\u0314\u0316\u031b\u0322\u032a\u032d\u0333"+ - "\u0338\u033a\u033d\u0344\u0349\u035c\u0364\u0368\u036b\u0371\u0375\u0378"+ - "\u0382\u0389\u0390\u039c\u03a2\u03a9\u03ae\u03b4\u03c0\u03c6\u03ca\u03d2"+ - "\u03d6\u03dc\u03df\u03e5\u03ea\u03fe\u0421\u0423\u043a\u0442\u044d\u0454"+ - "\u045b\u0465\u0473\u0489\u048b\u0493\u0497\u049b\u049e\u04a7\u04ad\u04b7"+ - "\u04bf\u04c5\u04ce\u04d9\u04e4\u04e8\u04ea\u04f5\u04fe\u0502\u0505\u050c"+ - "\u0517\u0521\u0527\u0529\u0533\u053d\u0541\u0545\u0549\u0550\u0558\u0563"+ - "\u0567\u056b\u0577\u057b\u057f\u0584\u058b\u0592\u05a6\u05aa\u05ae\u05b2"+ - "\u05c2\u05c8\u05ca\u05ce\u05d2\u05d5\u05d9\u05db\u05e1\u05e9\u05ee\u05f9"+ - "\u05ff\u0606\u0611\u0616\u061a\u061f\u0623\u062b\u0633\u0638\u063b\u0643"+ - "\u064b\u0650\u0654\u0658\u065f\u067c\u0687\u068b\u0693\u0697\u0699\u06a1"+ - "\u06aa\u06b2\u06b7\u06c7\u06c9\u06d2\u06d8\u06de\u06e2\u06eb\u06f4\u06f7"+ - "\u06fc\u070e\u0710\u0713\u0716\u0718\u0726"; + "\7\67\2\2\u026f\u0270\5\u00a4S\2\u0270\u0276\7i\2\2\u0271\u0272\5J&\2"+ + "\u0272\u0273\5\u0170\u00b9\2\u0273\u0275\3\2\2\2\u0274\u0271\3\2\2\2\u0275"+ + "\u0278\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0279\3\2"+ + "\2\2\u0278\u0276\3\2\2\2\u0279\u027a\7j\2\2\u027aI\3\2\2\2\u027b\u027c"+ + "\5j\66\2\u027c\u027d\7p\2\2\u027d\u027e\5\u00a4S\2\u027eK\3\2\2\2\u027f"+ + "\u0280\7k\2\2\u0280\u0285\5N(\2\u0281\u0282\7n\2\2\u0282\u0284\5N(\2\u0283"+ + "\u0281\3\2\2\2\u0284\u0287\3\2\2\2\u0285\u0283\3\2\2\2\u0285\u0286\3\2"+ + "\2\2\u0286\u0288\3\2\2\2\u0287\u0285\3\2\2\2\u0288\u0289\7l\2\2\u0289"+ + "M\3\2\2\2\u028a\u028b\5\u00a4S\2\u028b\u028c\7m\2\2\u028c\u028d\5\u00a4"+ + "S\2\u028dO\3\2\2\2\u028e\u0293\5\\/\2\u028f\u0293\5Z.\2\u0290\u0293\5"+ + "R*\2\u0291\u0293\5V,\2\u0292\u028e\3\2\2\2\u0292\u028f\3\2\2\2\u0292\u0290"+ + "\3\2\2\2\u0292\u0291\3\2\2\2\u0293Q\3\2\2\2\u0294\u0295\7\64\2\2\u0295"+ + "\u029b\7i\2\2\u0296\u0297\5T+\2\u0297\u0298\5\u0170\u00b9\2\u0298\u029a"+ + "\3\2\2\2\u0299\u0296\3\2\2\2\u029a\u029d\3\2\2\2\u029b\u0299\3\2\2\2\u029b"+ + "\u029c\3\2\2\2\u029c\u029e\3\2\2\2\u029d\u029b\3\2\2\2\u029e\u029f\7j"+ + "\2\2\u029fS\3\2\2\2\u02a0\u02a1\7N\2\2\u02a1\u02a2\7f\2\2\u02a2\u02aa"+ + "\5\u013e\u00a0\2\u02a3\u02a4\7\65\2\2\u02a4\u02a5\7i\2\2\u02a5\u02a6\5"+ + "\u00a4S\2\u02a6\u02a7\5\u0170\u00b9\2\u02a7\u02a8\7j\2\2\u02a8\u02aa\3"+ + "\2\2\2\u02a9\u02a0\3\2\2\2\u02a9\u02a3\3\2\2\2\u02aaU\3\2\2\2\u02ab\u02ac"+ + "\7\66\2\2\u02ac\u02b2\7i\2\2\u02ad\u02ae\5X-\2\u02ae\u02af\5\u0170\u00b9"+ + "\2\u02af\u02b1\3\2\2\2\u02b0\u02ad\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0"+ + "\3\2\2\2\u02b2\u02b3\3\2\2\2\u02b3\u02b5\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5"+ + "\u02b6\7j\2\2\u02b6W\3\2\2\2\u02b7\u02b8\7f\2\2\u02b8\u02be\7i\2\2\u02b9"+ + "\u02ba\5\u0160\u00b1\2\u02ba\u02bb\5\u0170\u00b9\2\u02bb\u02bd\3\2\2\2"+ + "\u02bc\u02b9\3\2\2\2\u02bd\u02c0\3\2\2\2\u02be\u02bc\3\2\2\2\u02be\u02bf"+ + "\3\2\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02be\3\2\2\2\u02c1\u02c2\7j\2\2\u02c2"+ + "Y\3\2\2\2\u02c3\u02c4\7\34\2\2\u02c4\u02c5\7k\2\2\u02c5\u02c6\7l\2\2\u02c6"+ + "\u02c7\5\u0132\u009a\2\u02c7[\3\2\2\2\u02c8\u02c9\t\7\2\2\u02c9\u02ca"+ + "\7k\2\2\u02ca\u02cb\5\u00c2b\2\u02cb\u02cc\7l\2\2\u02cc\u02d4\3\2\2\2"+ + "\u02cd\u02ce\7,\2\2\u02ce\u02cf\7k\2\2\u02cf\u02d0\5\u00c2b\2\u02d0\u02d1"+ + "\7l\2\2\u02d1\u02d2\5\u00c2b\2\u02d2\u02d4\3\2\2\2\u02d3\u02c8\3\2\2\2"+ + "\u02d3\u02cd\3\2\2\2\u02d4]\3\2\2\2\u02d5\u02db\5`\61\2\u02d6\u02d7\7"+ + "\20\2\2\u02d7\u02db\b\60\1\2\u02d8\u02d9\7D\2\2\u02d9\u02db\b\60\1\2\u02da"+ + "\u02d5\3\2\2\2\u02da\u02d6\3\2\2\2\u02da\u02d8\3\2\2\2\u02db\u02dc\3\2"+ + "\2\2\u02dc\u02de\5\u0170\u00b9\2\u02dd\u02da\3\2\2\2\u02de\u02e1\3\2\2"+ + "\2\u02df\u02e0\3\2\2\2\u02df\u02dd\3\2\2\2\u02e0\u02e4\3\2\2\2\u02e1\u02df"+ + "\3\2\2\2\u02e2\u02e3\7\20\2\2\u02e3\u02e5\b\60\1\2\u02e4\u02e2\3\2\2\2"+ + "\u02e4\u02e5\3\2\2\2\u02e5_\3\2\2\2\u02e6\u02e7\7\13\2\2\u02e7\u02ef\5"+ + "d\63\2\u02e8\u02e9\7\f\2\2\u02e9\u02ef\5d\63\2\u02ea\u02eb\7\r\2\2\u02eb"+ + "\u02ef\5d\63\2\u02ec\u02ed\7\17\2\2\u02ed\u02ef\5b\62\2\u02ee\u02e6\3"+ + "\2\2\2\u02ee\u02e8\3\2\2\2\u02ee\u02ea\3\2\2\2\u02ee\u02ec\3\2\2\2\u02ef"+ + "a\3\2\2\2\u02f0\u02f2\5\u00e6t\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2"+ + "\2\u02f2\u02f5\3\2\2\2\u02f3\u02f4\7]\2\2\u02f4\u02f6\5\u00a4S\2\u02f5"+ + "\u02f3\3\2\2\2\u02f5\u02f6\3\2\2\2\u02f6c\3\2\2\2\u02f7\u02fa\3\2\2\2"+ + "\u02f8\u02fa\5\u00a4S\2\u02f9\u02f7\3\2\2\2\u02f9\u02f8\3\2\2\2\u02fa"+ + "e\3\2\2\2\u02fb\u02fc\7\67\2\2\u02fc\u02fd\5\u00a4S\2\u02fd\u0301\7i\2"+ + "\2\u02fe\u0300\5h\65\2\u02ff\u02fe\3\2\2\2\u0300\u0303\3\2\2\2\u0301\u02ff"+ + "\3\2\2\2\u0301\u0302\3\2\2\2\u0302\u0304\3\2\2\2\u0303\u0301\3\2\2\2\u0304"+ + "\u0305\7j\2\2\u0305g\3\2\2\2\u0306\u0307\5j\66\2\u0307\u0309\7p\2\2\u0308"+ + "\u030a\5\u00f0y\2\u0309\u0308\3\2\2\2\u0309\u030a\3\2\2\2\u030ai\3\2\2"+ + "\2\u030b\u030c\7Q\2\2\u030c\u030f\5l\67\2\u030d\u030f\7M\2\2\u030e\u030b"+ + "\3\2\2\2\u030e\u030d\3\2\2\2\u030fk\3\2\2\2\u0310\u0311\7&\2\2\u0311\u031e"+ + "\7f\2\2\u0312\u0313\5\u00caf\2\u0313\u0318\7i\2\2\u0314\u0316\5n8\2\u0315"+ + "\u0317\7n\2\2\u0316\u0315\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u0319\3\2"+ + "\2\2\u0318\u0314\3\2\2\2\u0318\u0319\3\2\2\2\u0319\u031a\3\2\2\2\u031a"+ + "\u031b\7j\2\2\u031b\u031e\3\2\2\2\u031c\u031e\5\u00a4S\2\u031d\u0310\3"+ + "\2\2\2\u031d\u0312\3\2\2\2\u031d\u031c\3\2\2\2\u031em\3\2\2\2\u031f\u0324"+ + "\5l\67\2\u0320\u0321\7n\2\2\u0321\u0323\5l\67\2\u0322\u0320\3\2\2\2\u0323"+ + "\u0326\3\2\2\2\u0324\u0322\3\2\2\2\u0324\u0325\3\2\2\2\u0325o\3\2\2\2"+ + "\u0326\u0324\3\2\2\2\u0327\u032c\7i\2\2\u0328\u0329\7<\2\2\u0329\u032a"+ + "\5\u00e4s\2\u032a\u032b\5\u0170\u00b9\2\u032b\u032d\3\2\2\2\u032c\u0328"+ + "\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u032f\3\2\2\2\u032e\u0330\5\u00f0y"+ + "\2\u032f\u032e\3\2\2\2\u032f\u0330\3\2\2\2\u0330\u0331\3\2\2\2\u0331\u0332"+ + "\7j\2\2\u0332q\3\2\2\2\u0333\u0336\5\u0150\u00a9\2\u0334\u0336\7f\2\2"+ + "\u0335\u0333\3\2\2\2\u0335\u0334\3\2\2\2\u0336\u033f\3\2\2\2\u0337\u033c"+ + "\7i\2\2\u0338\u033a\5t;\2\u0339\u033b\7n\2\2\u033a\u0339\3\2\2\2\u033a"+ + "\u033b\3\2\2\2\u033b\u033d\3\2\2\2\u033c\u0338\3\2\2\2\u033c\u033d\3\2"+ + "\2\2\u033d\u033e\3\2\2\2\u033e\u0340\7j\2\2\u033f\u0337\3\2\2\2\u033f"+ + "\u0340\3\2\2\2\u0340s\3\2\2\2\u0341\u0346\5v<\2\u0342\u0343\7n\2\2\u0343"+ + "\u0345\5v<\2\u0344\u0342\3\2\2\2\u0345\u0348\3\2\2\2\u0346\u0344\3\2\2"+ + "\2\u0346\u0347\3\2\2\2\u0347u\3\2\2\2\u0348\u0346\3\2\2\2\u0349\u034a"+ + "\7f\2\2\u034a\u034c\7p\2\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034c"+ + "\u034d\3\2\2\2\u034d\u034e\5\u00a4S\2\u034ew\3\2\2\2\u034f\u0350\7H\2"+ + "\2\u0350\u0351\5\u00a4S\2\u0351\u0352\7\21\2\2\u0352\u0353\5r:\2\u0353"+ + "\u0354\5\u00eex\2\u0354y\3\2\2\2\u0355\u0356\5\u00c2b\2\u0356\u0357\7"+ + "\21\2\2\u0357\u036a\5\u00c2b\2\u0358\u035e\7i\2\2\u0359\u035a\5\u0082"+ + "B\2\u035a\u035b\5\u0170\u00b9\2\u035b\u035d\3\2\2\2\u035c\u0359\3\2\2"+ + "\2\u035d\u0360\3\2\2\2\u035e\u035c\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0366"+ + "\3\2\2\2\u0360\u035e\3\2\2\2\u0361\u0362\5|?\2\u0362\u0363\5\u0170\u00b9"+ + "\2\u0363\u0365\3\2\2\2\u0364\u0361\3\2\2\2\u0365\u0368\3\2\2\2\u0366\u0364"+ + "\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u0369\3\2\2\2\u0368\u0366\3\2\2\2\u0369"+ + "\u036b\7j\2\2\u036a\u0358\3\2\2\2\u036a\u036b\3\2\2\2\u036b{\3\2\2\2\u036c"+ + "\u036e\7\20\2\2\u036d\u036c\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u036f\3"+ + "\2\2\2\u036f\u0370\5~@\2\u0370\u0371\7f\2\2\u0371\u0373\5\u013e\u00a0"+ + "\2\u0372\u0374\5\u00eex\2\u0373\u0372\3\2\2\2\u0373\u0374\3\2\2\2\u0374"+ + "}\3\2\2\2\u0375\u0377\7g\2\2\u0376\u0378\7f\2\2\u0377\u0376\3\2\2\2\u0377"+ + "\u0378\3\2\2\2\u0378\u037a\3\2\2\2\u0379\u037b\7\u0088\2\2\u037a\u0379"+ + "\3\2\2\2\u037a\u037b\3\2\2\2\u037b\u037c\3\2\2\2\u037c\u037d\5\u012c\u0097"+ + "\2\u037d\u037e\7h\2\2\u037e\177\3\2\2\2\u037f\u0385\5\u00b4[\2\u0380\u0381"+ + "\5\u00c2b\2\u0381\u0382\7q\2\2\u0382\u0383\7f\2\2\u0383\u0385\3\2\2\2"+ + "\u0384\u037f\3\2\2\2\u0384\u0380\3\2\2\2\u0385\u0081\3\2\2\2\u0386\u0387"+ + "\79\2\2\u0387\u0388\7f\2\2\u0388\u038b\7t\2\2\u0389\u038c\5\u0080A\2\u038a"+ + "\u038c\5\u014e\u00a8\2\u038b\u0389\3\2\2\2\u038b\u038a\3\2\2\2\u038c\u0083"+ + "\3\2\2\2\u038d\u038e\7\60\2\2\u038e\u038f\7g\2\2\u038f\u0392\5\u00c2b"+ + "\2\u0390\u0391\7n\2\2\u0391\u0393\5\u00e6t\2\u0392\u0390\3\2\2\2\u0392"+ + "\u0393\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0395\7h\2\2\u0395\u0085\3\2"+ + "\2\2\u0396\u0397\7/\2\2\u0397\u0398\7g\2\2\u0398\u0399\5\u00c2b\2\u0399"+ + "\u039a\7h\2\2\u039a\u0087\3\2\2\2\u039b\u039e\5^\60\2\u039c\u039f\5\u008a"+ + "F\2\u039d\u039f\5\u008cG\2\u039e\u039c\3\2\2\2\u039e\u039d\3\2\2\2\u039f"+ + "\u0089\3\2\2\2\u03a0\u03a1\7N\2\2\u03a1\u03a2\7f\2\2\u03a2\u03a4\5\u013e"+ + "\u00a0\2\u03a3\u03a5\5p9\2\u03a4\u03a3\3\2\2\2\u03a4\u03a5\3\2\2\2\u03a5"+ + "\u008b\3\2\2\2\u03a6\u03a7\7N\2\2\u03a7\u03a8\5\u009aN\2\u03a8\u03a9\7"+ + "f\2\2\u03a9\u03ab\5\u013e\u00a0\2\u03aa\u03ac\5p9\2\u03ab\u03aa\3\2\2"+ + "\2\u03ab\u03ac\3\2\2\2\u03ac\u008d\3\2\2\2\u03ad\u03b0\7\34\2\2\u03ae"+ + "\u03b1\5\u0088E\2\u03af\u03b1\5\u00dep\2\u03b0\u03ae\3\2\2\2\u03b0\u03af"+ + "\3\2\2\2\u03b1\u008f\3\2\2\2\u03b2\u03b3\79\2\2\u03b3\u03b4\7f\2\2\u03b4"+ + "\u03b6\5\u0142\u00a2\2\u03b5\u03b7\5\u0092J\2\u03b6\u03b5\3\2\2\2\u03b6"+ + "\u03b7\3\2\2\2\u03b7\u0091\3\2\2\2\u03b8\u03b9\7i\2\2\u03b9\u03ba\5\u00a4"+ + "S\2\u03ba\u03bb\5\u0170\u00b9\2\u03bb\u03bc\7j\2\2\u03bc\u0093\3\2\2\2"+ + "\u03bd\u03be\79\2\2\u03be\u03bf\5\u009aN\2\u03bf\u03c0\7f\2\2\u03c0\u03c2"+ + "\5\u0142\u00a2\2\u03c1\u03c3\5\u0092J\2\u03c2\u03c1\3\2\2\2\u03c2\u03c3"+ + "\3\2\2\2\u03c3\u0095\3\2\2\2\u03c4\u03cc\5\b\5\2\u03c5\u03c8\5\u00c2b"+ + "\2\u03c6\u03c7\7m\2\2\u03c7\u03c9\5\u00e6t\2\u03c8\u03c6\3\2\2\2\u03c8"+ + "\u03c9\3\2\2\2\u03c9\u03cd\3\2\2\2\u03ca\u03cb\7m\2\2\u03cb\u03cd\5\u00e6"+ + "t\2\u03cc\u03c5\3\2\2\2\u03cc\u03ca\3\2\2\2\u03cd\u0097\3\2\2\2\u03ce"+ + "\u03cf\5\b\5\2\u03cf\u03d0\7t\2\2\u03d0\u03d1\5\u00e6t\2\u03d1\u0099\3"+ + "\2\2\2\u03d2\u03d4\7g\2\2\u03d3\u03d5\5\n\6\2\u03d4\u03d3\3\2\2\2\u03d4"+ + "\u03d5\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u03d8\5\u00c2b\2\u03d7\u03d9"+ + "\7n\2\2\u03d8\u03d7\3\2\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03da\3\2\2\2\u03da"+ + "\u03db\7h\2\2\u03db\u009b\3\2\2\2\u03dc\u03df\5\u009eP\2\u03dd\u03df\5"+ + "\u00a0Q\2\u03de\u03dc\3\2\2\2\u03de\u03dd\3\2\2\2\u03df\u009d\3\2\2\2"+ + "\u03e0\u03e2\5\u00e4s\2\u03e1\u03e0\3\2\2\2\u03e1\u03e2\3\2\2\2\u03e2"+ + "\u03e3\3\2\2\2\u03e3\u03e4\5\u00a2R\2\u03e4\u009f\3\2\2\2\u03e5\u03e7"+ + "\7\34\2\2\u03e6\u03e8\5\u00e4s\2\u03e7\u03e6\3\2\2\2\u03e7\u03e8\3\2\2"+ + "\2\u03e8\u03e9\3\2\2\2\u03e9\u03ea\5\u00a2R\2\u03ea\u00a1\3\2\2\2\u03eb"+ + "\u03ed\7u\2\2\u03ec\u03eb\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u03ee\3\2"+ + "\2\2\u03ee\u03ef\5\u00c2b\2\u03ef\u00a3\3\2\2\2\u03f0\u03f1\bS\1\2\u03f1"+ + "\u03f2\t\b\2\2\u03f2\u0401\5\u00a4S\20\u03f3\u0401\5\u00b4[\2\u03f4\u03f5"+ + "\7\33\2\2\u03f5\u03f6\5.\30\2\u03f6\u03f7\7\35\2\2\u03f7\u03f8\5\u00a4"+ + "S\4\u03f8\u0401\3\2\2\2\u03f9\u03fa\t\t\2\2\u03fa\u03fb\5&\24\2\u03fb"+ + "\u03fc\7p\2\2\u03fc\u03fd\7p\2\2\u03fd\u03fe\5*\26\2\u03fe\u03ff\5\u00a4"+ + "S\3\u03ff\u0401\3\2\2\2\u0400\u03f0\3\2\2\2\u0400\u03f3\3\2\2\2\u0400"+ + "\u03f4\3\2\2\2\u0400\u03f9\3\2\2\2\u0401\u0425\3\2\2\2\u0402\u0403\f\16"+ + "\2\2\u0403\u0404\t\n\2\2\u0404\u0424\5\u00a4S\17\u0405\u0406\f\r\2\2\u0406"+ + "\u0407\t\13\2\2\u0407\u0424\5\u00a4S\16\u0408\u0409\f\f\2\2\u0409\u040a"+ + "\t\f\2\2\u040a\u0424\5\u00a4S\r\u040b\u040c\f\13\2\2\u040c\u040d\t\r\2"+ + "\2\u040d\u0424\5\u00a4S\f\u040e\u040f\f\n\2\2\u040f\u0410\t\16\2\2\u0410"+ + "\u0424\5\u00a4S\13\u0411\u0412\f\b\2\2\u0412\u0413\7w\2\2\u0413\u0424"+ + "\5\u00a4S\t\u0414\u0415\f\7\2\2\u0415\u0416\7v\2\2\u0416\u0424\5\u00a4"+ + "S\b\u0417\u0418\f\6\2\2\u0418\u0419\7#\2\2\u0419\u0424\5\u00a4S\6\u041a"+ + "\u041b\f\5\2\2\u041b\u041c\7&\2\2\u041c\u041d\5\u00a4S\2\u041d\u041e\7"+ + "p\2\2\u041e\u041f\5\u00a4S\5\u041f\u0424\3\2\2\2\u0420\u0421\f\t\2\2\u0421"+ + "\u0422\7\21\2\2\u0422\u0424\5r:\2\u0423\u0402\3\2\2\2\u0423\u0405\3\2"+ + "\2\2\u0423\u0408\3\2\2\2\u0423\u040b\3\2\2\2\u0423\u040e\3\2\2\2\u0423"+ + "\u0411\3\2\2\2\u0423\u0414\3\2\2\2\u0423\u0417\3\2\2\2\u0423\u041a\3\2"+ + "\2\2\u0423\u0420\3\2\2\2\u0424\u0427\3\2\2\2\u0425\u0423\3\2\2\2\u0425"+ + "\u0426\3\2\2\2\u0426\u00a5\3\2\2\2\u0427\u0425\3\2\2\2\u0428\u043d\5\30"+ + "\r\2\u0429\u043d\5\32\16\2\u042a\u043d\5\u00aaV\2\u042b\u043d\5\u00a8"+ + "U\2\u042c\u043d\5\u00dep\2\u042d\u043d\5\u00fe\u0080\2\u042e\u043d\5\u00f2"+ + "z\2\u042f\u043d\5\u012a\u0096\2\u0430\u043d\5\u0100\u0081\2\u0431\u043d"+ + "\5\u0102\u0082\2\u0432\u043d\5\u0104\u0083\2\u0433\u043d\5\u0106\u0084"+ + "\2\u0434\u043d\5\u0108\u0085\2\u0435\u043d\5\u00eex\2\u0436\u043d\5\u010a"+ + "\u0086\2\u0437\u043d\5\u010c\u0087\2\u0438\u043d\5\u011e\u0090\2\u0439"+ + "\u043d\5\u00acW\2\u043a\u043d\5\u00b0Y\2\u043b\u043d\5x=\2\u043c\u0428"+ + "\3\2\2\2\u043c\u0429\3\2\2\2\u043c\u042a\3\2\2\2\u043c\u042b\3\2\2\2\u043c"+ + "\u042c\3\2\2\2\u043c\u042d\3\2\2\2\u043c\u042e\3\2\2\2\u043c\u042f\3\2"+ + "\2\2\u043c\u0430\3\2\2\2\u043c\u0431\3\2\2\2\u043c\u0432\3\2\2\2\u043c"+ + "\u0433\3\2\2\2\u043c\u0434\3\2\2\2\u043c\u0435\3\2\2\2\u043c\u0436\3\2"+ + "\2\2\u043c\u0437\3\2\2\2\u043c\u0438\3\2\2\2\u043c\u0439\3\2\2\2\u043c"+ + "\u043a\3\2\2\2\u043c\u043b\3\2\2\2\u043d\u00a7\3\2\2\2\u043e\u043f\7%"+ + "\2\2\u043f\u0440\5\u00a4S\2\u0440\u00a9\3\2\2\2\u0441\u0442\7Y\2\2\u0442"+ + "\u0444\5\u00a4S\2\u0443\u0445\5\u00eex\2\u0444\u0443\3\2\2\2\u0444\u0445"+ + "\3\2\2\2\u0445\u00ab\3\2\2\2\u0446\u0447\5\u00aeX\2\u0447\u0448\5\u0126"+ + "\u0094\2\u0448\u00ad\3\2\2\2\u0449\u044a\7\16\2\2\u044a\u044b\5\u00a4"+ + "S\2\u044b\u044c\5\u0170\u00b9\2\u044c\u044e\3\2\2\2\u044d\u0449\3\2\2"+ + "\2\u044e\u0451\3\2\2\2\u044f\u044d\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u0456"+ + "\3\2\2\2\u0451\u044f\3\2\2\2\u0452\u0453\7\17\2\2\u0453\u0454\5b\62\2"+ + "\u0454\u0455\5\u0170\u00b9\2\u0455\u0457\3\2\2\2\u0456\u0452\3\2\2\2\u0456"+ + "\u0457\3\2\2\2\u0457\u00af\3\2\2\2\u0458\u0459\7R\2\2\u0459\u045e\5\u00a4"+ + "S\2\u045a\u045b\7R\2\2\u045b\u045c\t\3\2\2\u045c\u045e\5.\30\2\u045d\u0458"+ + "\3\2\2\2\u045d\u045a\3\2\2\2\u045e\u00b1\3\2\2\2\u045f\u0468\7\5\2\2\u0460"+ + "\u0468\7\6\2\2\u0461\u0468\7e\2\2\u0462\u0468\5\u014c\u00a7\2\u0463\u0468"+ + "\5\u0162\u00b2\2\u0464\u0468\7\3\2\2\u0465\u0468\7\u0090\2\2\u0466\u0468"+ + "\7\u0091\2\2\u0467\u045f\3\2\2\2\u0467\u0460\3\2\2\2\u0467\u0461\3\2\2"+ + "\2\u0467\u0462\3\2\2\2\u0467\u0463\3\2\2\2\u0467\u0464\3\2\2\2\u0467\u0465"+ + "\3\2\2\2\u0467\u0466\3\2\2\2\u0468\u00b3\3\2\2\2\u0469\u046a\b[\1\2\u046a"+ + "\u0476\5\u0148\u00a5\2\u046b\u0476\5\u0144\u00a3\2\u046c\u0476\5\u016c"+ + "\u00b7\2\u046d\u0476\5 \21\2\u046e\u0476\5\u0086D\2\u046f\u0476\5\u0084"+ + "C\2\u0470\u0471\t\17\2\2\u0471\u0472\7g\2\2\u0472\u0473\5\u00a4S\2\u0473"+ + "\u0474\7h\2\2\u0474\u0476\3\2\2\2\u0475\u0469\3\2\2\2\u0475\u046b\3\2"+ + "\2\2\u0475\u046c\3\2\2\2\u0475\u046d\3\2\2\2\u0475\u046e\3\2\2\2\u0475"+ + "\u046f\3\2\2\2\u0475\u0470\3\2\2\2\u0476\u048d\3\2\2\2\u0477\u0478\f\13"+ + "\2\2\u0478\u0479\7q\2\2\u0479\u048c\7f\2\2\u047a\u047b\f\n\2\2\u047b\u048c"+ + "\5\u0166\u00b4\2\u047c\u047d\f\t\2\2\u047d\u048c\5\u00ceh\2\u047e\u047f"+ + "\f\b\2\2\u047f\u048c\5L\'\2\u0480\u0481\f\7\2\2\u0481\u048c\5\u0168\u00b5"+ + "\2\u0482\u0483\f\6\2\2\u0483\u048c\5\u016a\u00b6\2\u0484\u0485\f\5\2\2"+ + "\u0485\u0486\5\u016a\u00b6\2\u0486\u0487\7\22\2\2\u0487\u0488\5r:\2\u0488"+ + "\u048c\3\2\2\2\u0489\u048a\f\4\2\2\u048a\u048c\5\u00ba^\2\u048b\u0477"+ + "\3\2\2\2\u048b\u047a\3\2\2\2\u048b\u047c\3\2\2\2\u048b\u047e\3\2\2\2\u048b"+ + "\u0480\3\2\2\2\u048b\u0482\3\2\2\2\u048b\u0484\3\2\2\2\u048b\u0489\3\2"+ + "\2\2\u048c\u048f\3\2\2\2\u048d\u048b\3\2\2\2\u048d\u048e\3\2\2\2\u048e"+ + "\u00b5\3\2\2\2\u048f\u048d\3\2\2\2\u0490\u0491\5^\60\2\u0491\u0492\5\u00b8"+ + "]\2\u0492\u00b7\3\2\2\2\u0493\u0495\7N\2\2\u0494\u0496\7f\2\2\u0495\u0494"+ + "\3\2\2\2\u0495\u0496\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0499\5\u013e\u00a0"+ + "\2\u0498\u049a\5p9\2\u0499\u0498\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u00b9"+ + "\3\2\2\2\u049b\u049d\7\'\2\2\u049c\u049e\5\u00e6t\2\u049d\u049c\3\2\2"+ + "\2\u049d\u049e\3\2\2\2\u049e\u04a0\3\2\2\2\u049f\u04a1\7n\2\2\u04a0\u049f"+ + "\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\7(\2\2\u04a3"+ + "\u00bb\3\2\2\2\u04a4\u04a5\7O\2\2\u04a5\u04af\7i\2\2\u04a6\u04aa\5\u00c0"+ + "a\2\u04a7\u04aa\5\u012c\u0097\2\u04a8\u04aa\5\u00be`\2\u04a9\u04a6\3\2"+ + "\2\2\u04a9\u04a7\3\2\2\2\u04a9\u04a8\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab"+ + "\u04ac\5\u0170\u00b9\2\u04ac\u04ae\3\2\2\2\u04ad\u04a9\3\2\2\2\u04ae\u04b1"+ + "\3\2\2\2\u04af\u04ad\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0\u04b2\3\2\2\2\u04b1"+ + "\u04af\3\2\2\2\u04b2\u04b3\7j\2\2\u04b3\u00bd\3\2\2\2\u04b4\u04b5\79\2"+ + "\2\u04b5\u04b6\7f\2\2\u04b6\u04b7\5\u0142\u00a2\2\u04b7\u00bf\3\2\2\2"+ + "\u04b8\u04ba\7\34\2\2\u04b9\u04b8\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bb"+ + "\3\2\2\2\u04bb\u04bc\5^\60\2\u04bc\u04bd\7f\2\2\u04bd\u04be\5\u0142\u00a2"+ + "\2\u04be\u04bf\5\u0140\u00a1\2\u04bf\u04c8\3\2\2\2\u04c0\u04c2\7\34\2"+ + "\2\u04c1\u04c0\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c3\u04c4"+ + "\5^\60\2\u04c4\u04c5\7f\2\2\u04c5\u04c6\5\u0142\u00a2\2\u04c6\u04c8\3"+ + "\2\2\2\u04c7\u04b9\3\2\2\2\u04c7\u04c1\3\2\2\2\u04c8\u00c1\3\2\2\2\u04c9"+ + "\u04d1\5\u012c\u0097\2\u04ca\u04d1\5\u00c4c\2\u04cb\u04d1\5P)\2\u04cc"+ + "\u04cd\7g\2\2\u04cd\u04ce\5\u00c2b\2\u04ce\u04cf\7h\2\2\u04cf\u04d1\3"+ + "\2\2\2\u04d0\u04c9\3\2\2\2\u04d0\u04ca\3\2\2\2\u04d0\u04cb\3\2\2\2\u04d0"+ + "\u04cc\3\2\2\2\u04d1\u00c3\3\2\2\2\u04d2\u04dc\5\u012e\u0098\2\u04d3\u04dc"+ + "\5\u015e\u00b0\2\u04d4\u04dc\5\u0134\u009b\2\u04d5\u04dc\5\u013c\u009f"+ + "\2\u04d6\u04dc\5\u00bc_\2\u04d7\u04dc\5\u0136\u009c\2\u04d8\u04dc\5\u0138"+ + "\u009d\2\u04d9\u04dc\5\u013a\u009e\2\u04da\u04dc\5\u00c6d\2\u04db\u04d2"+ + "\3\2\2\2\u04db\u04d3\3\2\2\2\u04db\u04d4\3\2\2\2\u04db\u04d5\3\2\2\2\u04db"+ + "\u04d6\3\2\2\2\u04db\u04d7\3\2\2\2\u04db\u04d8\3\2\2\2\u04db\u04d9\3\2"+ + "\2\2\u04db\u04da\3\2\2\2\u04dc\u00c5\3\2\2\2\u04dd\u04de\79\2\2\u04de"+ + "\u04df\5\u00c8e\2\u04df\u00c7\3\2\2\2\u04e0\u04ec\7g\2\2\u04e1\u04e6\5"+ + "\u00c2b\2\u04e2\u04e3\7n\2\2\u04e3\u04e5\5\u00c2b\2\u04e4\u04e2\3\2\2"+ + "\2\u04e5\u04e8\3\2\2\2\u04e6\u04e4\3\2\2\2\u04e6\u04e7\3\2\2\2\u04e7\u04ea"+ + "\3\2\2\2\u04e8\u04e6\3\2\2\2\u04e9\u04eb\7n\2\2\u04ea\u04e9\3\2\2\2\u04ea"+ + "\u04eb\3\2\2\2\u04eb\u04ed\3\2\2\2\u04ec\u04e1\3\2\2\2\u04ec\u04ed\3\2"+ + "\2\2\u04ed\u04ee\3\2\2\2\u04ee\u04ef\7h\2\2\u04ef\u00c9\3\2\2\2\u04f0"+ + "\u04f8\5\u015e\u00b0\2\u04f1\u04f8\5\u012e\u0098\2\u04f2\u04f8\5\u00cc"+ + "g\2\u04f3\u04f8\5\u0136\u009c\2\u04f4\u04f8\5\u0138\u009d\2\u04f5\u04f8"+ + "\5P)\2\u04f6\u04f8\5\u012c\u0097\2\u04f7\u04f0\3\2\2\2\u04f7\u04f1\3\2"+ + "\2\2\u04f7\u04f2\3\2\2\2\u04f7\u04f3\3\2\2\2\u04f7\u04f4\3\2\2\2\u04f7"+ + "\u04f5\3\2\2\2\u04f7\u04f6\3\2\2\2\u04f8\u00cb\3\2\2\2\u04f9\u04fa\7k"+ + "\2\2\u04fa\u04fb\7u\2\2\u04fb\u04fc\7l\2\2\u04fc\u04fd\5\u0132\u009a\2"+ + "\u04fd\u00cd\3\2\2\2\u04fe\u050e\7k\2\2\u04ff\u0501\5\u00d0i\2\u0500\u04ff"+ + "\3\2\2\2\u0500\u0501\3\2\2\2\u0501\u0502\3\2\2\2\u0502\u0504\7p\2\2\u0503"+ + "\u0505\5\u00d2j\2\u0504\u0503\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u050f"+ + "\3\2\2\2\u0506\u0508\5\u00d0i\2\u0507\u0506\3\2\2\2\u0507\u0508\3\2\2"+ + "\2\u0508\u0509\3\2\2\2\u0509\u050a\7p\2\2\u050a\u050b\5\u00d2j\2\u050b"+ + "\u050c\7p\2\2\u050c\u050d\5\u00d4k\2\u050d\u050f\3\2\2\2\u050e\u0500\3"+ + "\2\2\2\u050e\u0507\3\2\2\2\u050f\u0510\3\2\2\2\u0510\u0511\7l\2\2\u0511"+ + "\u00cf\3\2\2\2\u0512\u0513\5\u00a4S\2\u0513\u00d1\3\2\2\2\u0514\u0515"+ + "\5\u00a4S\2\u0515\u00d3\3\2\2\2\u0516\u0517\5\u00a4S\2\u0517\u00d5\3\2"+ + "\2\2\u0518\u051a\t\20\2\2\u0519\u0518\3\2\2\2\u0519\u051a\3\2\2\2\u051a"+ + "\u051b\3\2\2\2\u051b\u051c\7m\2\2\u051c\u00d7\3\2\2\2\u051d\u051e\5\u00e6"+ + "t\2\u051e\u051f\7m\2\2\u051f\u0524\3\2\2\2\u0520\u0521\5\b\5\2\u0521\u0522"+ + "\7t\2\2\u0522\u0524\3\2\2\2\u0523\u051d\3\2\2\2\u0523\u0520\3\2\2\2\u0523"+ + "\u0524\3\2\2\2\u0524\u0525\3\2\2\2\u0525\u0526\7^\2\2\u0526\u052b\5\u00a4"+ + "S\2\u0527\u0529\7K\2\2\u0528\u052a\7f\2\2\u0529\u0528\3\2\2\2\u0529\u052a"+ + "\3\2\2\2\u052a\u052c\3\2\2\2\u052b\u0527\3\2\2\2\u052b\u052c\3\2\2\2\u052c"+ + "\u00d9\3\2\2\2\u052d\u052e\7Y\2\2\u052e\u052f\7f\2\2\u052f\u00db\3\2\2"+ + "\2\u0530\u0531\5\u0162\u00b2\2\u0531\u00dd\3\2\2\2\u0532\u0536\5\u00e0"+ + "q\2\u0533\u0536\5\u00e8u\2\u0534\u0536\5\u00ecw\2\u0535\u0532\3\2\2\2"+ + "\u0535\u0533\3\2\2\2\u0535\u0534\3\2\2\2\u0536\u00df\3\2\2\2\u0537\u0543"+ + "\7[\2\2\u0538\u0544\5\u00e2r\2\u0539\u053f\7g\2\2\u053a\u053b\5\u00e2"+ + "r\2\u053b\u053c\5\u0170\u00b9\2\u053c\u053e\3\2\2\2\u053d\u053a\3\2\2"+ + "\2\u053e\u0541\3\2\2\2\u053f\u053d\3\2\2\2\u053f\u0540\3\2\2\2\u0540\u0542"+ + "\3\2\2\2\u0541\u053f\3\2\2\2\u0542\u0544\7h\2\2\u0543\u0538\3\2\2\2\u0543"+ + "\u0539\3\2\2\2\u0544\u00e1\3\2\2\2\u0545\u054b\5\u00e4s\2\u0546\u0548"+ + "\5\u00c2b\2\u0547\u0546\3\2\2\2\u0547\u0548\3\2\2\2\u0548\u0549\3\2\2"+ + "\2\u0549\u054a\7m\2\2\u054a\u054c\5\u00e6t\2\u054b\u0547\3\2\2\2\u054b"+ + "\u054c\3\2\2\2\u054c\u00e3\3\2\2\2\u054d\u0552\7f\2\2\u054e\u054f\7n\2"+ + "\2\u054f\u0551\7f\2\2\u0550\u054e\3\2\2\2\u0551\u0554\3\2\2\2\u0552\u0550"+ + "\3\2\2\2\u0552\u0553\3\2\2\2\u0553\u00e5\3\2\2\2\u0554\u0552\3\2\2\2\u0555"+ + "\u055a\5\u00a4S\2\u0556\u0557\7n\2\2\u0557\u0559\5\u00a4S\2\u0558\u0556"+ + "\3\2\2\2\u0559\u055c\3\2\2\2\u055a\u0558\3\2\2\2\u055a\u055b\3\2\2\2\u055b"+ + "\u00e7\3\2\2\2\u055c\u055a\3\2\2\2\u055d\u0569\7_\2\2\u055e\u056a\5\u00ea"+ + "v\2\u055f\u0565\7g\2\2\u0560\u0561\5\u00eav\2\u0561\u0562\5\u0170\u00b9"+ + "\2\u0562\u0564\3\2\2\2\u0563\u0560\3\2\2\2\u0564\u0567\3\2\2\2\u0565\u0563"+ + "\3\2\2\2\u0565\u0566\3\2\2\2\u0566\u0568\3\2\2\2\u0567\u0565\3\2\2\2\u0568"+ + "\u056a\7h\2\2\u0569\u055e\3\2\2\2\u0569\u055f\3\2\2\2\u056a\u00e9\3\2"+ + "\2\2\u056b\u056d\7f\2\2\u056c\u056e\7m\2\2\u056d\u056c\3\2\2\2\u056d\u056e"+ + "\3\2\2\2\u056e\u056f\3\2\2\2\u056f\u0570\5\u00c2b\2\u0570\u00eb\3\2\2"+ + "\2\u0571\u057d\7d\2\2\u0572\u057e\5\u0096L\2\u0573\u0579\7g\2\2\u0574"+ + "\u0575\5\u0096L\2\u0575\u0576\5\u0170\u00b9\2\u0576\u0578\3\2\2\2\u0577"+ + "\u0574\3\2\2\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2"+ + "\2\2\u057a\u057c\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057e\7h\2\2\u057d"+ + "\u0572\3\2\2\2\u057d\u0573\3\2\2\2\u057e\u00ed\3\2\2\2\u057f\u0581\7i"+ + "\2\2\u0580\u0582\5\u00f0y\2\u0581\u0580\3\2\2\2\u0581\u0582\3\2\2\2\u0582"+ + "\u0583\3\2\2\2\u0583\u0584\7j\2\2\u0584\u00ef\3\2\2\2\u0585\u0587\5\u0170"+ + "\u00b9\2\u0586\u0585\3\2\2\2\u0586\u0587\3\2\2\2\u0587\u0588\3\2\2\2\u0588"+ + "\u0589\5\u00a6T\2\u0589\u058a\5\u0170\u00b9\2\u058a\u058c\3\2\2\2\u058b"+ + "\u0586\3\2\2\2\u058c\u058d\3\2\2\2\u058d\u058b\3\2\2\2\u058d\u058e\3\2"+ + "\2\2\u058e\u00f1\3\2\2\2\u058f\u0595\5\u00f6|\2\u0590\u0595\5\u00f8}\2"+ + "\u0591\u0595\5\u00fa~\2\u0592\u0595\5\u00f4{\2\u0593\u0595\5\u0098M\2"+ + "\u0594\u058f\3\2\2\2\u0594\u0590\3\2\2\2\u0594\u0591\3\2\2\2\u0594\u0592"+ + "\3\2\2\2\u0594\u0593\3\2\2\2\u0595\u00f3\3\2\2\2\u0596\u0597\5\u00a4S"+ + "\2\u0597\u00f5\3\2\2\2\u0598\u0599\5\u00a4S\2\u0599\u059a\7\u008a\2\2"+ + "\u059a\u059b\5\u00a4S\2\u059b\u00f7\3\2\2\2\u059c\u059d\5\u00a4S\2\u059d"+ + "\u059e\t\21\2\2\u059e\u00f9\3\2\2\2\u059f\u05a0\5\u00e6t\2\u05a0\u05a1"+ + "\5\u00d6l\2\u05a1\u05a2\5\u00e6t\2\u05a2\u00fb\3\2\2\2\u05a3\u05a4\t\22"+ + "\2\2\u05a4\u00fd\3\2\2\2\u05a5\u05a6\7f\2\2\u05a6\u05a8\7p\2\2\u05a7\u05a9"+ + "\5\u00a6T\2\u05a8\u05a7\3\2\2\2\u05a8\u05a9\3\2\2\2\u05a9\u00ff\3\2\2"+ + "\2\u05aa\u05ac\7c\2\2\u05ab\u05ad\5\u00e6t\2\u05ac\u05ab\3\2\2\2\u05ac"+ + "\u05ad\3\2\2\2\u05ad\u0101\3\2\2\2\u05ae\u05b0\7L\2\2\u05af\u05b1\7f\2"+ + "\2\u05b0\u05af\3\2\2\2\u05b0\u05b1\3\2\2\2\u05b1\u0103\3\2\2\2\u05b2\u05b4"+ + "\7`\2\2\u05b3\u05b5\7f\2\2\u05b4\u05b3\3\2\2\2\u05b4\u05b5\3\2\2\2\u05b5"+ + "\u0105\3\2\2\2\u05b6\u05b7\7X\2\2\u05b7\u05b8\7f\2\2\u05b8\u0107\3\2\2"+ + "\2\u05b9\u05ba\7\\\2\2\u05ba\u0109\3\2\2\2\u05bb\u05c4\7]\2\2\u05bc\u05c5"+ + "\5\u00a4S\2\u05bd\u05be\5\u0170\u00b9\2\u05be\u05bf\5\u00a4S\2\u05bf\u05c5"+ + "\3\2\2\2\u05c0\u05c1\5\u00f2z\2\u05c1\u05c2\5\u0170\u00b9\2\u05c2\u05c3"+ + "\5\u00a4S\2\u05c3\u05c5\3\2\2\2\u05c4\u05bc\3\2\2\2\u05c4\u05bd\3\2\2"+ + "\2\u05c4\u05c0\3\2\2\2\u05c5\u05c6\3\2\2\2\u05c6\u05cc\5\u00eex\2\u05c7"+ + "\u05ca\7W\2\2\u05c8\u05cb\5\u010a\u0086\2\u05c9\u05cb\5\u00eex\2\u05ca"+ + "\u05c8\3\2\2\2\u05ca\u05c9\3\2\2\2\u05cb\u05cd\3\2\2\2\u05cc\u05c7\3\2"+ + "\2\2\u05cc\u05cd\3\2\2\2\u05cd\u010b\3\2\2\2\u05ce\u05d1\5\u010e\u0088"+ + "\2\u05cf\u05d1\5\u0114\u008b\2\u05d0\u05ce\3\2\2\2\u05d0\u05cf\3\2\2\2"+ + "\u05d1\u010d\3\2\2\2\u05d2\u05dd\7Z\2\2\u05d3\u05d5\5\u00a4S\2\u05d4\u05d3"+ + "\3\2\2\2\u05d4\u05d5\3\2\2\2\u05d5\u05de\3\2\2\2\u05d6\u05d8\5\u00f2z"+ + "\2\u05d7\u05d6\3\2\2\2\u05d7\u05d8\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05db"+ + "\5\u0170\u00b9\2\u05da\u05dc\5\u00a4S\2\u05db\u05da\3\2\2\2\u05db\u05dc"+ + "\3\2\2\2\u05dc\u05de\3\2\2\2\u05dd\u05d4\3\2\2\2\u05dd\u05d7\3\2\2\2\u05de"+ + "\u05df\3\2\2\2\u05df\u05e3\7i\2\2\u05e0\u05e2\5\u0110\u0089\2\u05e1\u05e0"+ + "\3\2\2\2\u05e2\u05e5\3\2\2\2\u05e3\u05e1\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4"+ + "\u05e6\3\2\2\2\u05e5\u05e3\3\2\2\2\u05e6\u05e7\7j\2\2\u05e7\u010f\3\2"+ + "\2\2\u05e8\u05e9\5\u0112\u008a\2\u05e9\u05eb\7p\2\2\u05ea\u05ec\5\u00f0"+ + "y\2\u05eb\u05ea\3\2\2\2\u05eb\u05ec\3\2\2\2\u05ec\u0111\3\2\2\2\u05ed"+ + "\u05ee\7Q\2\2\u05ee\u05f1\5\u00e6t\2\u05ef\u05f1\7M\2\2\u05f0\u05ed\3"+ + "\2\2\2\u05f0\u05ef\3\2\2\2\u05f1\u0113\3\2\2\2\u05f2\u05fb\7Z\2\2\u05f3"+ + "\u05fc\5\u0116\u008c\2\u05f4\u05f5\5\u0170\u00b9\2\u05f5\u05f6\5\u0116"+ + "\u008c\2\u05f6\u05fc\3\2\2\2\u05f7\u05f8\5\u00f2z\2\u05f8\u05f9\5\u0170"+ + "\u00b9\2\u05f9\u05fa\5\u0116\u008c\2\u05fa\u05fc\3\2\2\2\u05fb\u05f3\3"+ + "\2\2\2\u05fb\u05f4\3\2\2\2\u05fb\u05f7\3\2\2\2\u05fc\u05fd\3\2\2\2\u05fd"+ + "\u0601\7i\2\2\u05fe\u0600\5\u0118\u008d\2\u05ff\u05fe\3\2\2\2\u0600\u0603"+ + "\3\2\2\2\u0601\u05ff\3\2\2\2\u0601\u0602\3\2\2\2\u0602\u0604\3\2\2\2\u0603"+ + "\u0601\3\2\2\2\u0604\u0605\7j\2\2\u0605\u0115\3\2\2\2\u0606\u0607\7f\2"+ + "\2\u0607\u0609\7t\2\2\u0608\u0606\3\2\2\2\u0608\u0609\3\2\2\2\u0609\u060a"+ + "\3\2\2\2\u060a\u060b\5\u00b4[\2\u060b\u060c\7q\2\2\u060c\u060d\7g\2\2"+ + "\u060d\u060e\7_\2\2\u060e\u060f\7h\2\2\u060f\u0117\3\2\2\2\u0610\u0611"+ + "\5\u011a\u008e\2\u0611\u0613\7p\2\2\u0612\u0614\5\u00f0y\2\u0613\u0612"+ + "\3\2\2\2\u0613\u0614\3\2\2\2\u0614\u0119\3\2\2\2\u0615\u0616\7Q\2\2\u0616"+ + "\u0619\5\u011c\u008f\2\u0617\u0619\7M\2\2\u0618\u0615\3\2\2\2\u0618\u0617"+ + "\3\2\2\2\u0619\u011b\3\2\2\2\u061a\u061d\5\u00c2b\2\u061b\u061d\7e\2\2"+ + "\u061c\u061a\3\2\2\2\u061c\u061b\3\2\2\2\u061d\u0625\3\2\2\2\u061e\u0621"+ + "\7n\2\2\u061f\u0622\5\u00c2b\2\u0620\u0622\7e\2\2\u0621\u061f\3\2\2\2"+ + "\u0621\u0620\3\2\2\2\u0622\u0624\3\2\2\2\u0623\u061e\3\2\2\2\u0624\u0627"+ + "\3\2\2\2\u0625\u0623\3\2\2\2\u0625\u0626\3\2\2\2\u0626\u011d\3\2\2\2\u0627"+ + "\u0625\3\2\2\2\u0628\u0629\7P\2\2\u0629\u062d\7i\2\2\u062a\u062c\5\u0120"+ + "\u0091\2\u062b\u062a\3\2\2\2\u062c\u062f\3\2\2\2\u062d\u062b\3\2\2\2\u062d"+ + "\u062e\3\2\2\2\u062e\u0630\3\2\2\2\u062f\u062d\3\2\2\2\u0630\u0631\7j"+ + "\2\2\u0631\u011f\3\2\2\2\u0632\u0633\5\u0122\u0092\2\u0633\u0635\7p\2"+ + "\2\u0634\u0636\5\u00f0y\2\u0635\u0634\3\2\2\2\u0635\u0636\3\2\2\2\u0636"+ + "\u0121\3\2\2\2\u0637\u063a\7Q\2\2\u0638\u063b\5\u00f6|\2\u0639\u063b\5"+ + "\u0124\u0093\2\u063a\u0638\3\2\2\2\u063a\u0639\3\2\2\2\u063b\u063e\3\2"+ + "\2\2\u063c\u063e\7M\2\2\u063d\u0637\3\2\2\2\u063d\u063c\3\2\2\2\u063e"+ + "\u0123\3\2\2\2\u063f\u0640\5\u00e6t\2\u0640\u0641\7m\2\2\u0641\u0646\3"+ + "\2\2\2\u0642\u0643\5\u00e4s\2\u0643\u0644\7t\2\2\u0644\u0646\3\2\2\2\u0645"+ + "\u063f\3\2\2\2\u0645\u0642\3\2\2\2\u0645\u0646\3\2\2\2\u0646\u0647\3\2"+ + "\2\2\u0647\u0648\5\u00a4S\2\u0648\u0125\3\2\2\2\u0649\u064d\7a\2\2\u064a"+ + "\u064e\5\u00a4S\2\u064b\u064e\5\u0128\u0095\2\u064c\u064e\5\u00d8m\2\u064d"+ + "\u064a\3\2\2\2\u064d\u064b\3\2\2\2\u064d\u064c\3\2\2\2\u064d\u064e\3\2"+ + "\2\2\u064e\u064f\3\2\2\2\u064f\u0650\5\u00eex\2\u0650\u0127\3\2\2\2\u0651"+ + "\u0653\5\u00f2z\2\u0652\u0651\3\2\2\2\u0652\u0653\3\2\2\2\u0653\u0654"+ + "\3\2\2\2\u0654\u0656\5\u0170\u00b9\2\u0655\u0657\5\u00a4S\2\u0656\u0655"+ + "\3\2\2\2\u0656\u0657\3\2\2\2\u0657\u0658\3\2\2\2\u0658\u065a\5\u0170\u00b9"+ + "\2\u0659\u065b\5\u00f2z\2\u065a\u0659\3\2\2\2\u065a\u065b\3\2\2\2\u065b"+ + "\u0129\3\2\2\2\u065c\u065d\7S\2\2\u065d\u065e\5\u00a4S\2\u065e\u012b\3"+ + "\2\2\2\u065f\u0662\5\u0150\u00a9\2\u0660\u0662\7f\2\2\u0661\u065f\3\2"+ + "\2\2\u0661\u0660\3\2\2\2\u0662\u012d\3\2\2\2\u0663\u0664\7k\2\2\u0664"+ + "\u0665\5\u0130\u0099\2\u0665\u0666\7l\2\2\u0666\u0667\5\u0132\u009a\2"+ + "\u0667\u012f\3\2\2\2\u0668\u0669\5\u00a4S\2\u0669\u0131\3\2\2\2\u066a"+ + "\u066b\5\u00c2b\2\u066b\u0133\3\2\2\2\u066c\u066d\7\u0088\2\2\u066d\u066e"+ + "\5\u00c2b\2\u066e\u0135\3\2\2\2\u066f\u0670\7k\2\2\u0670\u0671\7l\2\2"+ + "\u0671\u0672\5\u0132\u009a\2\u0672\u0137\3\2\2\2\u0673\u0674\7T\2\2\u0674"+ + "\u0675\7k\2\2\u0675\u0676\5\u00c2b\2\u0676\u0677\7l\2\2\u0677\u0678\5"+ + "\u0132\u009a\2\u0678\u0139\3\2\2\2\u0679\u067f\7V\2\2\u067a\u067b\7V\2"+ + "\2\u067b\u067f\7\u008a\2\2\u067c\u067d\7\u008a\2\2\u067d\u067f\7V\2\2"+ + "\u067e\u0679\3\2\2\2\u067e\u067a\3\2\2\2\u067e\u067c\3\2\2\2\u067f\u0680"+ + "\3\2\2\2\u0680\u0681\5\u0132\u009a\2\u0681\u013b\3\2\2\2\u0682\u0683\7"+ + "N\2\2\u0683\u0684\5\u013e\u00a0\2\u0684\u013d\3\2\2\2\u0685\u0686\5\u0142"+ + "\u00a2\2\u0686\u0687\5\u0140\u00a1\2\u0687\u068a\3\2\2\2\u0688\u068a\5"+ + "\u0142\u00a2\2\u0689\u0685\3\2\2\2\u0689\u0688\3\2\2\2\u068a\u013f\3\2"+ + "\2\2\u068b\u068e\5\u0142\u00a2\2\u068c\u068e\5\u00c2b\2\u068d\u068b\3"+ + "\2\2\2\u068d\u068c\3\2\2\2\u068e\u0141\3\2\2\2\u068f\u069b\7g\2\2\u0690"+ + "\u0695\5\u009cO\2\u0691\u0692\7n\2\2\u0692\u0694\5\u009cO\2\u0693\u0691"+ + "\3\2\2\2\u0694\u0697\3\2\2\2\u0695\u0693\3\2\2\2\u0695\u0696\3\2\2\2\u0696"+ + "\u0699\3\2\2\2\u0697\u0695\3\2\2\2\u0698\u069a\7n\2\2\u0699\u0698\3\2"+ + "\2\2\u0699\u069a\3\2\2\2\u069a\u069c\3\2\2\2\u069b\u0690\3\2\2\2\u069b"+ + "\u069c\3\2\2\2\u069c\u069d\3\2\2\2\u069d\u069e\7h\2\2\u069e\u0143\3\2"+ + "\2\2\u069f\u06a0\5\u0146\u00a4\2\u06a0\u06a1\7g\2\2\u06a1\u06a3\5\u00a4"+ + "S\2\u06a2\u06a4\7n\2\2\u06a3\u06a2\3\2\2\2\u06a3\u06a4\3\2\2\2\u06a4\u06a5"+ + "\3\2\2\2\u06a5\u06a6\7h\2\2\u06a6\u0145\3\2\2\2\u06a7\u06ad\5\u00c4c\2"+ + "\u06a8\u06a9\7g\2\2\u06a9\u06aa\5\u0146\u00a4\2\u06aa\u06ab\7h\2\2\u06ab"+ + "\u06ad\3\2\2\2\u06ac\u06a7\3\2\2\2\u06ac\u06a8\3\2\2\2\u06ad\u0147\3\2"+ + "\2\2\u06ae\u06b5\5\u014a\u00a6\2\u06af\u06b5\5\u014e\u00a8\2\u06b0\u06b1"+ + "\7g\2\2\u06b1\u06b2\5\u00a4S\2\u06b2\u06b3\7h\2\2\u06b3\u06b5\3\2\2\2"+ + "\u06b4\u06ae\3\2\2\2\u06b4\u06af\3\2\2\2\u06b4\u06b0\3\2\2\2\u06b5\u0149"+ + "\3\2\2\2\u06b6\u06ba\5\u00b2Z\2\u06b7\u06ba\5\u0152\u00aa\2\u06b8\u06ba"+ + "\5\u00b6\\\2\u06b9\u06b6\3\2\2\2\u06b9\u06b7\3\2\2\2\u06b9\u06b8\3\2\2"+ + "\2\u06ba\u014b\3\2\2\2\u06bb\u06bc\t\23\2\2\u06bc\u014d\3\2\2\2\u06bd"+ + "\u06be\7f\2\2\u06be\u014f\3\2\2\2\u06bf\u06c0\7f\2\2\u06c0\u06c1\7q\2"+ + "\2\u06c1\u06c2\7f\2\2\u06c2\u0151\3\2\2\2\u06c3\u06c4\5\u00caf\2\u06c4"+ + "\u06c5\5\u0154\u00ab\2\u06c5\u0153\3\2\2\2\u06c6\u06cb\7i\2\2\u06c7\u06c9"+ + "\5\u0156\u00ac\2\u06c8\u06ca\7n\2\2\u06c9\u06c8\3\2\2\2\u06c9\u06ca\3"+ + "\2\2\2\u06ca\u06cc\3\2\2\2\u06cb\u06c7\3\2\2\2\u06cb\u06cc\3\2\2\2\u06cc"+ + "\u06cd\3\2\2\2\u06cd\u06ce\7j\2\2\u06ce\u0155\3\2\2\2\u06cf\u06d4\5\u0158"+ + "\u00ad\2\u06d0\u06d1\7n\2\2\u06d1\u06d3\5\u0158\u00ad\2\u06d2\u06d0\3"+ + "\2\2\2\u06d3\u06d6\3\2\2\2\u06d4\u06d2\3\2\2\2\u06d4\u06d5\3\2\2\2\u06d5"+ + "\u0157\3\2\2\2\u06d6\u06d4\3\2\2\2\u06d7\u06d8\5\u015a\u00ae\2\u06d8\u06d9"+ + "\7p\2\2\u06d9\u06db\3\2\2\2\u06da\u06d7\3\2\2\2\u06da\u06db\3\2\2\2\u06db"+ + "\u06dc\3\2\2\2\u06dc\u06dd\5\u015c\u00af\2\u06dd\u0159\3\2\2\2\u06de\u06e1"+ + "\5\u00a4S\2\u06df\u06e1\5\u0154\u00ab\2\u06e0\u06de\3\2\2\2\u06e0\u06df"+ + "\3\2\2\2\u06e1\u015b\3\2\2\2\u06e2\u06e5\5\u00a4S\2\u06e3\u06e5\5\u0154"+ + "\u00ab\2\u06e4\u06e2\3\2\2\2\u06e4\u06e3\3\2\2\2\u06e5\u015d\3\2\2\2\u06e6"+ + "\u06e7\7U\2\2\u06e7\u06ed\7i\2\2\u06e8\u06e9\5\u0160\u00b1\2\u06e9\u06ea"+ + "\5\u0170\u00b9\2\u06ea\u06ec\3\2\2\2\u06eb\u06e8\3\2\2\2\u06ec\u06ef\3"+ + "\2\2\2\u06ed\u06eb\3\2\2\2\u06ed\u06ee\3\2\2\2\u06ee\u06f0\3\2\2\2\u06ef"+ + "\u06ed\3\2\2\2\u06f0\u06f1\7j\2\2\u06f1\u015f\3\2\2\2\u06f2\u06f3\5\u00e4"+ + "s\2\u06f3\u06f4\5\u00c2b\2\u06f4\u06f7\3\2\2\2\u06f5\u06f7\5\u0164\u00b3"+ + "\2\u06f6\u06f2\3\2\2\2\u06f6\u06f5\3\2\2\2\u06f7\u06f9\3\2\2\2\u06f8\u06fa"+ + "\5\u0162\u00b2\2\u06f9\u06f8\3\2\2\2\u06f9\u06fa\3\2\2\2\u06fa\u0161\3"+ + "\2\2\2\u06fb\u06fc\t\24\2\2\u06fc\u0163\3\2\2\2\u06fd\u06ff\7\u0088\2"+ + "\2\u06fe\u06fd\3\2\2\2\u06fe\u06ff\3\2\2\2\u06ff\u0700\3\2\2\2\u0700\u0701"+ + "\5\u012c\u0097\2\u0701\u0165\3\2\2\2\u0702\u0703\7k\2\2\u0703\u0704\5"+ + "\u00a4S\2\u0704\u0705\7l\2\2\u0705\u0167\3\2\2\2\u0706\u0707\7q\2\2\u0707"+ + "\u0708\7g\2\2\u0708\u0709\5\u00c2b\2\u0709\u070a\7h\2\2\u070a\u0169\3"+ + "\2\2\2\u070b\u071a\7g\2\2\u070c\u0713\5\u00e6t\2\u070d\u0710\5\u0146\u00a4"+ + "\2\u070e\u070f\7n\2\2\u070f\u0711\5\u00e6t\2\u0710\u070e\3\2\2\2\u0710"+ + "\u0711\3\2\2\2\u0711\u0713\3\2\2\2\u0712\u070c\3\2\2\2\u0712\u070d\3\2"+ + "\2\2\u0713\u0715\3\2\2\2\u0714\u0716\7u\2\2\u0715\u0714\3\2\2\2\u0715"+ + "\u0716\3\2\2\2\u0716\u0718\3\2\2\2\u0717\u0719\7n\2\2\u0718\u0717\3\2"+ + "\2\2\u0718\u0719\3\2\2\2\u0719\u071b\3\2\2\2\u071a\u0712\3\2\2\2\u071a"+ + "\u071b\3\2\2\2\u071b\u071c\3\2\2\2\u071c\u071d\7h\2\2\u071d\u016b\3\2"+ + "\2\2\u071e\u071f\5\u0146\u00a4\2\u071f\u0720\7q\2\2\u0720\u0721\7f\2\2"+ + "\u0721\u016d\3\2\2\2\u0722\u0723\5\u00c2b\2\u0723\u016f\3\2\2\2\u0724"+ + "\u0729\7o\2\2\u0725\u0729\7\2\2\3\u0726\u0729\7\u00a0\2\2\u0727\u0729"+ + "\6\u00b9\24\2\u0728\u0724\3\2\2\2\u0728\u0725\3\2\2\2\u0728\u0726\3\2"+ + "\2\2\u0728\u0727\3\2\2\2\u0729\u0171\3\2\2\2\u00bd\u0180\u0185\u018c\u0196"+ + "\u019c\u01a2\u01b2\u01b6\u01bf\u01cb\u01cf\u01d5\u01de\u01e8\u01f9\u0207"+ + "\u020b\u0212\u021a\u0223\u0243\u024b\u0263\u0276\u0285\u0292\u029b\u02a9"+ + "\u02b2\u02be\u02d3\u02da\u02df\u02e4\u02ee\u02f1\u02f5\u02f9\u0301\u0309"+ + "\u030e\u0316\u0318\u031d\u0324\u032c\u032f\u0335\u033a\u033c\u033f\u0346"+ + "\u034b\u035e\u0366\u036a\u036d\u0373\u0377\u037a\u0384\u038b\u0392\u039e"+ + "\u03a4\u03ab\u03b0\u03b6\u03c2\u03c8\u03cc\u03d4\u03d8\u03de\u03e1\u03e7"+ + "\u03ec\u0400\u0423\u0425\u043c\u0444\u044f\u0456\u045d\u0467\u0475\u048b"+ + "\u048d\u0495\u0499\u049d\u04a0\u04a9\u04af\u04b9\u04c1\u04c7\u04d0\u04db"+ + "\u04e6\u04ea\u04ec\u04f7\u0500\u0504\u0507\u050e\u0519\u0523\u0529\u052b"+ + "\u0535\u053f\u0543\u0547\u054b\u0552\u055a\u0565\u0569\u056d\u0579\u057d"+ + "\u0581\u0586\u058d\u0594\u05a8\u05ac\u05b0\u05b4\u05c4\u05ca\u05cc\u05d0"+ + "\u05d4\u05d7\u05db\u05dd\u05e3\u05eb\u05f0\u05fb\u0601\u0608\u0613\u0618"+ + "\u061c\u0621\u0625\u062d\u0635\u063a\u063d\u0645\u064d\u0652\u0656\u065a"+ + "\u0661\u067e\u0689\u068d\u0695\u0699\u069b\u06a3\u06ac\u06b4\u06b9\u06c9"+ + "\u06cb\u06d4\u06da\u06e0\u06e4\u06ed\u06f6\u06f9\u06fe\u0710\u0712\u0715"+ + "\u0718\u071a\u0728"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala index 405163e20..c5b8a697b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala @@ -56,7 +56,8 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case t: AdtClauseT => val fieldTypes = fields map typ val clauseFieldTypes = t.decl.args.flatMap(f => f.fields).map(f => symbType(f.typ)) - fieldTypes.zip(clauseFieldTypes).flatMap(a => assignableTo.errors(a)(m)) + error(m, s"Expected ${clauseFieldTypes.size} patterns, but got ${fieldTypes.size}", clauseFieldTypes.size != fieldTypes.size) ++ + fieldTypes.zip(clauseFieldTypes).flatMap(a => assignableTo.errors(a)(m)) case _ => violation("Pattern matching only works on ADT Literals") } case PMatchValue(lit) => isPureExpr(lit) @@ -287,30 +288,23 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => w match { case tree.parent(p) => p match { case PMatchAdt(c, fields) => - val index = fields indexWhere { w eq _ } + val index = fields indexWhere { + w eq _ + } val adtClauseT = underlyingType(typeSymbType(c)).asInstanceOf[AdtClauseT] - val field = adtClauseT.decl.args.flatMap(f => f.fields)(index) - typeSymbType(field.typ) + val flatFields = adtClauseT.decl.args.flatMap(f => f.fields) + if (index < flatFields.size) { + val field = flatFields(index) + typeSymbType(field.typ) + } else UnknownType // Error is found when PMatchADT is checked higher up the ADT - case p: PMatchExpCase => p match { - case tree.parent(pa) => pa match { - case PMatchExp(e, _) => exprType(e) - case _ => ??? - } - case _ => ??? - } + case tree.parent.pair(_: PMatchExpCase, m: PMatchExp) => exprType(m.exp) + case tree.parent.pair(_: PMatchStmtCase, m: PMatchStatement) => exprType(m.exp) - case p: PMatchStmtCase => p match { - case tree.parent(pa) => pa match { - case PMatchStatement(e, _, _) => exprType(e) - case _ => ??? - } - case _ => ??? - } - case _ => ??? + case _ => Violation.violation("Found wildcard with unexpected root in wildcardMatchType") } - case _ => ??? + case _ => Violation.violation(s"Did not find root for wildcard in wildcardMatchType") } } } diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala index 74f80f6ad..2cae1926c 100644 --- a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala @@ -405,11 +405,11 @@ class AdtEncoding extends LeafTypeEncoding { /** * Assign(_, e) -> nop * Assign(`v`, e) -> nop - * Assign(x, e) -> var x = [e] + * Assign(x, e) -> var x; x = [e] * Assign(C{f1: p1, ...}, e) -> Assign(p1, e.f1); Assign(p2, e.f2); ... * */ - def translateMatchPatternDeclarations(expr: in.Expr, pattern: in.MatchPattern)(ctx: Context): CodeWriter[vpr.Seqn] = { + def translateMatchPatternDeclarations(expr: in.Expr, pattern: in.MatchPattern)(ctx: Context): CodeWriter[vpr.Stmt] = { val (mPos, mInfo, mErrT) = pattern.vprMeta pattern match { @@ -420,8 +420,9 @@ class AdtEncoding extends LeafTypeEncoding { for { e <- ctx.expression(expr) v = vpr.LocalVarDecl(name, t)(mPos, mInfo, mErrT) + _ <- local(v) // definition of locals is propagated to body of match case a = vpr.LocalVarAssign(vpr.LocalVar(name, t)(mPos, mInfo, mErrT), e)(mPos, mInfo, mErrT) - } yield vpr.Seqn(Seq(a), Seq(v))(mPos, mInfo, mErrT) + } yield a case in.MatchAdt(clause, exprs) => diff --git a/src/test/resources/regressions/features/adts/simple1.gobra b/src/test/resources/regressions/features/adts/simple1.gobra new file mode 100644 index 000000000..787614929 --- /dev/null +++ b/src/test/resources/regressions/features/adts/simple1.gobra @@ -0,0 +1,50 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg; + +type tree adt{ + leaf{ value int } + node{ left, right tree } +} + +func test1() { + ghost var x tree + ghost y := leaf{value: 3} + assert y == leaf{3} + assert y.value == 3 + assert y.isleaf +} + +func test2(x tree) { + var y int + match x { + case node{leaf{5}, _}: y = 4 + case _: y = 3 + } + + assert y >= 3 +} + +func test3() { + x := node{leaf{3},node{leaf{4}, leaf{5}}} + ghost var q int + match x { + case node{_, node{leaf{?z}, _}}: q = z + } + assert q == 4 +} + +func test4() { + x := node{leaf{3},node{leaf{4}, leaf{5}}} + assert 4 == match x { case node{_, node{leaf{?z}, _}}: z } + + assert 4 == match x { + case node{_, node{leaf{?z}, _}}: z + } + + assert 4 == match x { + case node{_, node{leaf{?z}, _}}: z + case _: 600 + } +} \ No newline at end of file From 85bf7676f3a9391e8073d4960443c0d9dc1d9373 Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Sun, 27 Nov 2022 14:00:11 +0100 Subject: [PATCH 061/296] fixed more bugs and added examples --- .../gobra/frontend/ParseTreeTranslator.scala | 2 +- .../implementation/property/TypeMerging.scala | 17 ++ .../typing/ghost/GhostExprTyping.scala | 7 +- .../regressions/features/adts/fields1.gobra | 96 +++++++++ .../features/adts/simple-match1.gobra | 135 +++++++++++++ .../regressions/features/adts/simple1.gobra | 10 + .../features/adts/stateMachine1.gobra | 189 ++++++++++++++++++ 7 files changed, 452 insertions(+), 4 deletions(-) create mode 100644 src/test/resources/regressions/features/adts/fields1.gobra create mode 100644 src/test/resources/regressions/features/adts/simple-match1.gobra create mode 100644 src/test/resources/regressions/features/adts/stateMachine1.gobra diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 12eb54ed4..7aeaf3c20 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -565,7 +565,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole override def visitMatchCase(ctx: MatchCaseContext): PMatchPattern = { visitChildren(ctx) match { - case Vector("default") => PMatchWildcard().at(ctx) + case "default" => PMatchWildcard().at(ctx) case Vector("case", p: PMatchPattern) => p } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala index abeea0c05..9ffd3e6cf 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala @@ -44,8 +44,11 @@ trait TypeMerging extends BaseProperty { this: TypeInfoImpl => sin <- typeMerge(sin1, sin2) multi <- typeMerge(multi1, multi2) } yield InternalSingleMulti(sin, multi.asInstanceOf[InternalTupleT]) + case (l: AdtClauseT, r: AdtClauseT) if l.context == r.context && l.adtT == r.adtT => Some(AdtT(l.adtT, l.context)) + case (c: AdtClauseT, u@UnderlyingType(a: AdtT)) if c.context == a.context && c.adtT == a.decl => Some(u) + case (u@UnderlyingType(a: AdtT), c: AdtClauseT) if c.context == a.context && c.adtT == a.decl => Some(u) case _ => None } @@ -53,10 +56,24 @@ trait TypeMerging extends BaseProperty { this: TypeInfoImpl => case _ => None } + def typeMergeAll(ts: Vector[Type]): Option[Type] = { + if (ts.isEmpty) None + else ts.tail.foldLeft[Option[Type]](Some(ts.head)){ + case (None, _) => None + case (Some(t1), t2) => typeMerge(t1, t2) + } + } + lazy val mergeableTypes: Property[(Type, Type)] = createFlatProperty[(Type, Type)] { case (left, right) => s"$left is not mergeable with $right" } { case (left, right) => typeMerge(left, right).isDefined } + lazy val allMergeableTypes: Property[Vector[Type]] = createFlatProperty[Vector[Type]] { + xs => s"${xs.mkString(",")} are not mergeable" + } { + xs => typeMergeAll(xs).isDefined + } + } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index 0054d003b..623e1e956 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -123,8 +123,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => } case m@PMatchExp(exp, clauses) => - val types: Vector[Type] = clauses map { c => exprType(c.exp) } - val sameTypeE = error(exp, s"All clauses has to be of the same type but got $types", !types.foldLeft(true)({ case (acc, next) => acc && assignableTo(next, types.head) })) + val sameTypeE = allMergeableTypes.errors(clauses map { c => exprType(c.exp) })(exp) val patternE = m.caseClauses.flatMap(c => c.pattern match { case PMatchAdt(clause, _) => assignableTo.errors(symbType(clause), exprType(exp))(c) case _ => comparableTypes.errors((miscType(c.pattern), exprType(exp)))(c) @@ -254,7 +253,9 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"expected an option type, but got $t") } - case m: PMatchExp => if (m.clauses.isEmpty) exprType(m.defaultClauses.head.exp) else exprType(m.caseClauses.head.exp) + case m: PMatchExp => + if (m.clauses.isEmpty) exprType(m.defaultClauses.head.exp) + else typeMergeAll(m.clauses map { c => exprType(c.exp) }).get case expr : PGhostCollectionExp => expr match { // The result of integer ghost expressions is unbounded (UntypedConst) diff --git a/src/test/resources/regressions/features/adts/fields1.gobra b/src/test/resources/regressions/features/adts/fields1.gobra new file mode 100644 index 000000000..e409e7f2c --- /dev/null +++ b/src/test/resources/regressions/features/adts/fields1.gobra @@ -0,0 +1,96 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package adts + +type tree adt { + + Node { + val int + left, right tree + } + + Leaf { + leafVal int + } + + EmptyLeaf { + + } + +} + +type list adt { + + Cons { + head int + tail list + } + + Nil { + + } + +} + +type expression adt { + + Add { + lA, rA expression + } + + Mul { + lM, rM expression + } + + Lit { + val int + } +} + +func testTree(){ + var t tree = Node{1, Node{2, EmptyLeaf{}, EmptyLeaf{}}, Node{3, Leaf{4}, EmptyLeaf{}}} + + assert t.val == 1 + assert t.isNode + assert t.left.isNode + assert t.left.val == 2 + assert t.left.left.isEmptyLeaf + assert t.left.right.isEmptyLeaf + assert t.right.isNode + assert t.right.val == 3 + assert t.right.left.isLeaf + assert t.right.left.leafVal == 4 + +} + +func testList() { + var l list = Cons{1, Cons{2, Cons{3, Cons{4, Nil{}}}}} + + assert l.head == 1 + assert l.isCons + assert l.tail.head == 2 + assert l.tail.isCons + assert l.tail.tail.head == 3 + assert l.tail.tail.isCons + assert l.tail.tail.tail.head == 4 + assert l.tail.tail.tail.isCons + assert l.tail.tail.tail.tail.isNil + assert !l.isNil + assert !l.tail.tail.tail.tail.isCons +} + +func testExpression() { + var e expression = Add{Mul{Lit{2}, Lit{3}}, Add{Lit{4}, Lit{20}}} + + assert e.lA.lM.val == 2 + assert e.isAdd + assert !e.isMul + assert !e.isLit + assert e.lA.rM.isLit + assert !e.lA.rM.isAdd + assert e.lA.rM.val == 3 + assert e.rA.lA.val == 4 + assert !e.rA.lA.isMul + assert e.rA.rA.val != 21 +} diff --git a/src/test/resources/regressions/features/adts/simple-match1.gobra b/src/test/resources/regressions/features/adts/simple-match1.gobra new file mode 100644 index 000000000..e98cfb9ff --- /dev/null +++ b/src/test/resources/regressions/features/adts/simple-match1.gobra @@ -0,0 +1,135 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package adts + +type tree adt { + Node { + val int + left, right tree + } + Leaf{} +} + +type list adt { + Cons { + head int + tail list + } + Nil {} +} + +ghost +ensures a > b ==> a == res +ensures a <= b ==> b == res +pure func max (a, b int) (res int) + +ghost +pure func depth(t tree) (res int) { + return match t { + case Node{_, ?l, ?r}: 1 + max(depth(l), depth(r)) + case Leaf{}: 0 + } +} + +ghost +pure func count(t tree) (res int) { + return match t { + case Node{_, ?l, ?r}: 1 + count(l) + count(r) + case Leaf{}: 0 + } +} + + +ghost +ensures count(t) >= 0 && depth(t) >= 0 +ensures count(t) >= depth(t) +func proof1(t tree) { + match t { + case Node{_, ?l, ?r}: proof1(l) + proof1(r) + case Leaf{}: + } +} + + +ghost +pure func concat(l1, l2 list) list { + return match l1 { + case Nil{}: l2 + case Cons{?h, ?t}: Cons{h, concat(t, l2)} + } +} + +pred allNatrual(xs list) { + (xs.isCons ==> (xs.head >= 0 && allNatrual(xs.tail))) && + (xs.isNil ==> true) +} + +ghost +requires n >= 0 +pure func rep(n, v int) list { + return match n { + case 0: Nil{} + default: Cons{v, rep(n-1, v)} + } +} + + +ghost +requires allNatrual(xs) +pure func dec(xs list) list { + return match xs { + case Nil{}: Nil{} + case Cons{_, Nil{}}: Nil{} + case Cons{?n, Cons{?v, ?t}}: ( + unfolding allNatrual(xs) in ( + unfolding allNatrual(xs.tail) in ( + concat(rep(xs.head, v), dec(xs.tail.tail))))) + } +} + +ghost +pure func srclen(xs list) int { + return match xs { + case Nil{}: 0 + case Cons{_, Nil{}}: 0 + case Cons{?n, Cons{?v, ?t}}: n + srclen(t) + } +} + +ghost +pure func length(xs list) int { + return match xs { + case Nil{}: 0 + case Cons{_, ?t}: 1 + length(t) + } +} + +ghost +ensures forall xs, ys list :: {length(concat(xs, ys))} length(concat(xs, ys)) == length(xs) + length(ys) +func lemma1() + +ghost +ensures forall x, y int :: {length(rep(x,y))} x >= 0 ==> length(rep(x, y)) == x +func lemma2() + +ghost +requires allNatrual(xs) +ensures allNatrual(xs) +ensures length(dec(xs)) == srclen(xs) +func proof2 (xs list) { + match xs { + case Nil{}: + case Cons{_, Nil{}}: + case Cons{?n, Cons{?v, ?t}}: + unfold allNatrual(xs); + unfold allNatrual(xs.tail); + lemma1(); + lemma2(); + proof2(t); + fold allNatrual(xs.tail); + fold allNatrual(xs); + } +} + diff --git a/src/test/resources/regressions/features/adts/simple1.gobra b/src/test/resources/regressions/features/adts/simple1.gobra index 787614929..369acfd97 100644 --- a/src/test/resources/regressions/features/adts/simple1.gobra +++ b/src/test/resources/regressions/features/adts/simple1.gobra @@ -47,4 +47,14 @@ func test4() { case node{_, node{leaf{?z}, _}}: z case _: 600 } +} + +requires n == 1 +func test5(n int) { + v := match n { + case 1: leaf{} + default: node{} + } + + assert v == leaf{} } \ No newline at end of file diff --git a/src/test/resources/regressions/features/adts/stateMachine1.gobra b/src/test/resources/regressions/features/adts/stateMachine1.gobra new file mode 100644 index 000000000..adc55b686 --- /dev/null +++ b/src/test/resources/regressions/features/adts/stateMachine1.gobra @@ -0,0 +1,189 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package adts + +type State adt { + Modified{} + Shared{} + Invalid{} +} + +type ProcessorSignal adt { + PrWr{} + PrRd{} +} + +type BusSignal adt { + BusRd{} + BusRdX{} + BusUpgr{} + NoSig{} +} + +type BusOpt adt { + Some { + sig BusSignal + } + + None{} +} + +type Machine struct { + current int +} + +pred (m *Machine) isMachine() { + acc(m) && m.current >= 0 && m.current < 3 +} + +ghost +requires m.isMachine() +pure func (m *Machine) stateOfMachine() State { + return unfolding m.isMachine() in ( + match m.current { + case 0: Invalid{} + case 1: Shared{} + case 2: Modified{} + }) +} + +ghost +requires i >= -1 && i <= 2 +pure func busSigToAdt(i int) BusSignal { + return (match i { + case -1: NoSig{} + case 0: BusRd{} + case 1: BusRdX{} + case 2: BusUpgr{} + }) +} + + +ghost +requires i >= 0 && i <= 1 +pure func prSigToAdt(i int) ProcessorSignal { + return (match i { + case 0: PrRd{} + case 1: PrWr{} + }) +} + + +requires m.isMachine() +requires signal >= 0 && signal <= 1 +ensures res.isMachine() +ensures addtionalSignal >= -1 && addtionalSignal <= 2 +ensures (old((m.stateOfMachine())) == Invalid{}) ==> (match prSigToAdt(signal) { + case PrWr{}: ((res.stateOfMachine()).isModified && (busSigToAdt(addtionalSignal)).isBusRdX) + case PrRd{}: ((res.stateOfMachine()).isShared && (busSigToAdt(addtionalSignal)).isBusRd)}) +ensures (old((m.stateOfMachine())) == Modified{}) ==> (res.stateOfMachine()).isModified && (busSigToAdt(addtionalSignal)).isNoSig +ensures (old((m.stateOfMachine())) == Shared{}) ==> (match prSigToAdt(signal) { + case PrWr{}: ((res.stateOfMachine()).isModified && (busSigToAdt(addtionalSignal)).isBusUpgr) + case PrRd{}: ((res.stateOfMachine()).isShared && (busSigToAdt(addtionalSignal)).isNoSig)}) +func (m *Machine) transitionProcessorSignal(signal int) (res *Machine, addtionalSignal int) { + addtionalSignal = -1 + unfold m.isMachine() + if m.current == 0 { + if signal == 0 { + m.current = 1 + addtionalSignal = 0 + } else { + m.current = 2 + addtionalSignal = 1 + } + } else if m.current == 2 { + m.current = 2 + } else { + if signal == 1 { + m.current = 2 + addtionalSignal = 2 + } else { + m.current = 1 + } + } + res = m + fold res.isMachine() +} + + +requires m.isMachine() +requires signal >= 0 && signal <= 2 +requires (m.stateOfMachine()).isModified ==> !((busSigToAdt(signal)).isBusUpgr) +ensures res.isMachine() +ensures old((m.stateOfMachine()).isModified) == flushed +ensures match old((m.stateOfMachine())) { + case Invalid{}: (res.stateOfMachine()).isInvalid + case Shared{}: match (busSigToAdt(signal)) { + case BusRd{}: (res.stateOfMachine()).isShared + default: (res.stateOfMachine()).isInvalid + } + case Modified{}: match (busSigToAdt(signal)) { + case BusRd{}: (res.stateOfMachine()).isShared + case BusRdX{}: (res.stateOfMachine()).isInvalid + } +} +func (m *Machine) transitionBusSignal(signal int) (res *Machine, flushed bool) { + flushed = false + unfold m.isMachine() + if m.current == 0 { + m.current = 0 + } else if m.current == 1 { + if signal == 1 || signal == 2 { + m.current = 0 + } else { + m.current = 1 + } + } else { + flushed = true + if signal == 0 { + m.current = 1 + } else if signal == 1 { + m.current = 0 + } + } + + res = m + fold res.isMachine() +} + + +func client() { + p1 := &Machine{0} + p2 := &Machine{0} + + fold p1.isMachine() + fold p2.isMachine() + + var addtionalSignal int + var flushed bool + + p1, addtionalSignal = p1.transitionProcessorSignal(0) + if (addtionalSignal != -1) { + p2, flushed = p2.transitionBusSignal(addtionalSignal) + } + + assert (p1.stateOfMachine()).isShared && (p2.stateOfMachine()).isInvalid && !flushed + + p2, addtionalSignal = p2.transitionProcessorSignal(0) + if (addtionalSignal != -1) { + p1, flushed = p1.transitionBusSignal(addtionalSignal) + } + + assert (p1.stateOfMachine()).isShared && (p2.stateOfMachine()).isShared && !flushed + + p1, addtionalSignal = p1.transitionProcessorSignal(1) + if (addtionalSignal != -1) { + p2, flushed = p2.transitionBusSignal(addtionalSignal) + } + + assert (p1.stateOfMachine()).isModified && (p2.stateOfMachine()).isInvalid && !flushed + + p2, addtionalSignal = p2.transitionProcessorSignal(1) + if (addtionalSignal != -1) { + p1, flushed = p1.transitionBusSignal(addtionalSignal) + } + + assert (p1.stateOfMachine()).isInvalid && (p2.stateOfMachine()).isModified && flushed + +} From 2431722ab3604973b263546ef9e1448145e04d16 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Mon, 28 Nov 2022 11:36:06 +0100 Subject: [PATCH 062/296] Updates submodules (#581) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 25d2b1c54..c18f60f43 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 25d2b1c544776448101ac9ce94c35ef88302f53f +Subproject commit c18f60f43a141a218bdb913887c35f81c82b1471 From 0fd7bf1213f12924088f69951d3ac5097ceb7fbb Mon Sep 17 00:00:00 2001 From: "Felix A. Wolf" Date: Tue, 29 Nov 2022 14:22:26 +0100 Subject: [PATCH 063/296] implemented joaos feedback --- src/main/scala/viper/gobra/ast/frontend/AstPattern.scala | 2 +- src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala | 2 -- src/main/scala/viper/gobra/ast/internal/Program.scala | 4 ++-- src/main/scala/viper/gobra/frontend/Desugar.scala | 2 +- src/main/scala/viper/gobra/frontend/info/base/Type.scala | 3 +-- .../info/implementation/property/Assignability.scala | 6 +++--- .../info/implementation/typing/ghost/GhostExprTyping.scala | 2 +- 7 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala index 9f962b41d..3a6cfdc9c 100644 --- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala +++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala @@ -33,7 +33,7 @@ object AstPattern { case class GlobalVariable(id: PIdnUse, symb: st.GlobalVariable) extends Expr with Symbolic case class Deref(base: PExpression) extends Expr case class FieldSelection(base: PExpression, id: PIdnUse, path: Vector[MemberPath], symb: st.StructMember) extends Expr with Symbolic - case class AdtField(base: PExpression, id: PIdnUse, symb: st.AdtMember) extends Expr with Symbolic // TODO: maybe rename + case class AdtField(base: PExpression, id: PIdnUse, symb: st.AdtMember) extends Expr with Symbolic case class Conversion(typ: PType, arg: PExpression) extends Expr sealed trait FunctionLikeCall extends Expr { diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index fdd1bf978..14cdf66bb 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -646,8 +646,6 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter // types def showType(typ : Type) : Doc = typ match { - case MathMapT(keys, values, _) => "dict" <> brackets(showType(keys)) <> showType(values) - case MapT(keys, values, _) => "map" <> brackets(showType(keys)) <> showType(values) case t: PrettyType => t.toString } diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index 706072dcf..00818fc75 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -1406,7 +1406,7 @@ case class SliceT(elems : Type, addressability: Addressability) extends PrettyTy /** * The (composite) type of maps from type `keys` to type `values`. */ -case class MapT(keys: Type, values: Type, addressability: Addressability) extends Type { +case class MapT(keys: Type, values: Type, addressability: Addressability) extends PrettyType(s"map[$keys]$values") { def hasGhostField(k: Type): Boolean = k match { case StructT(fields, _) => fields exists (_.ghost) case _ => false @@ -1465,7 +1465,7 @@ case class MultisetT(t : Type, addressability: Addressability) extends PrettyTyp /** * The type of mathematical maps from `keys` to `values` */ -case class MathMapT(keys: Type, values: Type, addressability: Addressability) extends Type { +case class MathMapT(keys: Type, values: Type, addressability: Addressability) extends PrettyType(s"dict[$keys]$values") { override def equalsWithoutMod(t: Type): Boolean = t match { case MathMapT(otherKeys, otherValues, _) => keys.equalsWithoutMod(otherKeys) && values.equalsWithoutMod(otherValues) case _ => false diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 1f87bd5f5..c653e73ce 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -3723,7 +3723,7 @@ object Desugar { case t: Type.AdtClauseT => val tAdt = Type.AdtT(t.adtT, t.context) val adt: in.AdtT = in.AdtT(nm.adt(tAdt), addrMod) - val fields: Vector[in.Field] = (t.clauses map { case (key: String, typ: Type) => + val fields: Vector[in.Field] = (t.fields map { case (key: String, typ: Type) => in.Field(nm.adtField(key, tAdt), typeD(typ, Addressability.mathDataStructureElement)(src), true)(src) }).toVector in.AdtClauseT(idName(t.decl.id, t.context.getTypeInfo), adt, fields, addrMod) diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala index a467e5462..c0eb1bdf1 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -58,8 +58,7 @@ object Type { case class AdtT(decl: PAdtType, context: ExternalTypeInfo) extends Type - // TODO: rename `clauses` to `fields` - case class AdtClauseT(clauses: Map[String, Type], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends Type + case class AdtClauseT(fields: Map[String, Type], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends Type case class MapT(key: Type, elem: Type) extends PrettyType(s"map[$key]$elem") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index ac88a2ddd..4c0bd33fb 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala @@ -184,7 +184,7 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => if (elems.isEmpty) { successProp } else if (elems.exists(_.key.nonEmpty)) { - val tmap: Map[String, Type] = a.clauses + val tmap: Map[String, Type] = a.fields failedProp("for adt literals either all or none elements must be keyed", !elems.forall(_.key.nonEmpty)) and @@ -196,9 +196,9 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => case v => failedProp(s"got $v but expected field name") }.getOrElse(successProp) }) - } else if (elems.size == a.clauses.size) { + } else if (elems.size == a.fields.size) { propForall( - elems.map(_.exp).zip(a.clauses.values), + elems.map(_.exp).zip(a.fields.values), compositeValAssignableTo ) } else { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index 623e1e956..f68ed936b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -254,7 +254,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => } case m: PMatchExp => - if (m.clauses.isEmpty) exprType(m.defaultClauses.head.exp) + if (m.clauses.isEmpty) violation(s"expected that match exp always has a clause, but found none: $m.") else typeMergeAll(m.clauses map { c => exprType(c.exp) }).get case expr : PGhostCollectionExp => expr match { From e30ddaf21af223114882bd92b5a3dd894f54a4c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 30 Nov 2022 20:11:56 +0100 Subject: [PATCH 064/296] Remove sneaky heap-dependent triggers (#582) * Remove some heap-dependent triggers still * Dummy change --- .../encodings/typeless/BuiltInEncoding.scala | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala index c47efa18e..3e3563cd2 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala @@ -379,7 +379,7 @@ class BuiltInEncoding extends Encoding { def accessSlice(sliceExpr: in.Expr, perm: in.Expr): in.Assertion = quantify( - trigger = { i => Vector(in.Trigger(Vector(in.IndexedExp(sliceExpr, i, sliceExpr.typ)(src)))(src)) }, + trigger = { i => Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(sliceExpr, i, sliceExpr.typ)(src))(src)))(src)) }, range = { i => inRange(i, in.IntLit(0)(src), in.Length(sliceExpr)(src)) }, body = { i => in.Access(in.Accessible.Address(in.IndexedExp(sliceExpr, i, sliceExpr.typ)(src)), perm)(src) } ) @@ -436,13 +436,13 @@ class BuiltInEncoding extends Encoding { case (AppendFunctionTag, Vector(_: in.PermissionT, dst, _)) => /** * requires p > 0 - * requires forall i int :: { dst[i] } 0 <= i && i < len(dst) ==> acc(&dst[i]) - * requires forall i int :: { src[i] } 0 <= i && i < len(src) ==> acc(&src[i], p) + * requires forall i int :: { &dst[i] } 0 <= i && i < len(dst) ==> acc(&dst[i]) + * requires forall i int :: { &src[i] } 0 <= i && i < len(src) ==> acc(&src[i], p) * ensures len(res) == len(dst) + len(src) - * ensures forall i int :: { res[i] } 0 <= i && i < len(res) ==> acc(&res[i]) - * ensures forall i int :: { src[i] } 0 <= i && i < len(src) ==> acc(&src[i], p) - * ensures forall i int :: { res[i] } 0 <= i && i < len(dst) ==> res[i] == old(dst[i]) - * ensures forall i int :: { res[i] } len(dst) <= i && i < len(res) ==> res[i] == src[i - len(dst)] + * ensures forall i int :: { &res[i] } 0 <= i && i < len(res) ==> acc(&res[i]) + * ensures forall i int :: { &src[i] } 0 <= i && i < len(src) ==> acc(&src[i], p) + * ensures forall i int :: { &res[i] } 0 <= i && i < len(dst) ==> res[i] == old(dst[i]) + * ensures forall i int :: { &res[i] } len(dst) <= i && i < len(res) ==> res[i] == src[i - len(dst)] */ val elemType = ctx.underlyingType(dst) match { case t: in.SliceT => t.elems.withAddressability(Addressability.sliceLookup) @@ -477,7 +477,7 @@ class BuiltInEncoding extends Encoding { val postRes = accessSlice(resultParam, in.FullPerm(src)) val postVariadic = accessSlice(variadicParam, pParam) val postCmpSlice = quantify( - trigger = { i => Vector(in.Trigger(Vector(in.IndexedExp(resultParam, i, sliceType)(src)))(src)) }, + trigger = { i => Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(resultParam, i, sliceType)(src))(src)))(src)) }, range = { inRange(_, in.IntLit(0)(src), in.Length(sliceParam)(src)) }, body = { i => in.ExprAssertion( @@ -486,7 +486,7 @@ class BuiltInEncoding extends Encoding { } ) val postCmpVariadic = quantify( - trigger = { i => Vector(in.Trigger(Vector(in.IndexedExp(resultParam, i, sliceType)(src)))(src)) }, + trigger = { i => Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(resultParam, i, sliceType)(src))(src)))(src)) }, range = { inRange(_, in.Length(sliceParam)(src), in.Length(resultParam)(src)) }, body = { i => in.ExprAssertion( @@ -497,7 +497,6 @@ class BuiltInEncoding extends Encoding { )(src) } ) - val posts: Vector[in.Assertion] = Vector(postLen, postRes, postVariadic, postCmpSlice, postCmpVariadic) in.Function(x.name, args, results, pres, posts, Vector(in.WildcardMeasure(None)(src)), None)(src) From 1bc49603b01e164cfd38445d9ef3b661a2e292a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Thu, 1 Dec 2022 00:11:04 +0100 Subject: [PATCH 065/296] fix (#583) --- .../encodings/typeless/BuiltInEncoding.scala | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala index 3e3563cd2..df86ccff2 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala @@ -441,8 +441,8 @@ class BuiltInEncoding extends Encoding { * ensures len(res) == len(dst) + len(src) * ensures forall i int :: { &res[i] } 0 <= i && i < len(res) ==> acc(&res[i]) * ensures forall i int :: { &src[i] } 0 <= i && i < len(src) ==> acc(&src[i], p) - * ensures forall i int :: { &res[i] } 0 <= i && i < len(dst) ==> res[i] == old(dst[i]) - * ensures forall i int :: { &res[i] } len(dst) <= i && i < len(res) ==> res[i] == src[i - len(dst)] + * ensures forall i int :: { &res[i] } 0 <= i && i < len(dst) ==> res[i] === old(dst[i]) + * ensures forall i int :: { &res[i] } len(dst) <= i && i < len(res) ==> res[i] === src[i - len(dst)] */ val elemType = ctx.underlyingType(dst) match { case t: in.SliceT => t.elems.withAddressability(Addressability.sliceLookup) @@ -481,7 +481,10 @@ class BuiltInEncoding extends Encoding { range = { inRange(_, in.IntLit(0)(src), in.Length(sliceParam)(src)) }, body = { i => in.ExprAssertion( - in.EqCmp(in.IndexedExp(resultParam, i, sliceType)(src), in.Old(in.IndexedExp(sliceParam, i, sliceType)(src), elemType)(src))(src) + in.GhostEqCmp( + in.IndexedExp(resultParam, i, sliceType)(src), + in.Old(in.IndexedExp(sliceParam, i, sliceType)(src), elemType)(src) + )(src) )(src) } ) @@ -490,7 +493,7 @@ class BuiltInEncoding extends Encoding { range = { inRange(_, in.Length(sliceParam)(src), in.Length(resultParam)(src)) }, body = { i => in.ExprAssertion( - in.EqCmp( + in.GhostEqCmp( in.IndexedExp(resultParam, i, sliceType)(src), in.IndexedExp(variadicParam, in.Sub(i, in.Length(sliceParam)(src))(src), sliceType)(src), )(src) @@ -510,8 +513,8 @@ class BuiltInEncoding extends Encoding { * ensures len(src) < len(dst) ==> res == len(src) * ensures forall i int :: { &dst[i] } 0 <= i && i < len(dst) ==> acc(&dst[i], write) * ensures forall i int :: { &src[i] } 0 <= i && i < len(src) ==> acc(&src[i], p) - * ensures forall i int :: { &dst[i] } (0 <= i && i < len(src) && i < len(dst)) ==> dst[i] == old(src[i]) - * ensures forall i int :: { &dst[i] } (len(src) <= i && i < len(dst)) ==> dst[i] == old(dst[i]) + * ensures forall i int :: { &dst[i] } (0 <= i && i < len(src) && i < len(dst)) ==> dst[i] === old(src[i]) + * ensures forall i int :: { &dst[i] } (len(src) <= i && i < len(dst)) ==> dst[i] === old(dst[i]) * func copy(dst, src []int, ghost p perm) (res int) */ @@ -581,7 +584,7 @@ class BuiltInEncoding extends Encoding { }, body = { i => in.ExprAssertion( - in.EqCmp( + in.GhostEqCmp( in.IndexedExp(dstParam, i, dstUnderlyingType)(src), in.Old(in.IndexedExp(srcParam, i, srcUnderlyingType)(src), srcUnderlyingType.elems)(src) )(src) @@ -593,7 +596,7 @@ class BuiltInEncoding extends Encoding { range = { i => inRange(i, in.Length(srcParam)(src), in.Length(dstParam)(src)) }, body = { i => in.ExprAssertion( - in.EqCmp( + in.GhostEqCmp( in.IndexedExp(dstParam, i, dstUnderlyingType)(src), in.Old(in.IndexedExp(dstParam, i, dstUnderlyingType)(src), dstUnderlyingType.elems)(src) )(src) From bd3cc88fdd6dd83b455d16ca18e5f6b356981159 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Fri, 2 Dec 2022 17:26:24 +0100 Subject: [PATCH 066/296] Updates submodules (#584) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index c18f60f43..6b698b214 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit c18f60f43a141a218bdb913887c35f81c82b1471 +Subproject commit 6b698b21492149536165bd75abb48633734336d3 From 00113c339bb201d378e89bbbb4103e3e858f7041 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Sun, 11 Dec 2022 13:43:14 +0100 Subject: [PATCH 067/296] Updates submodules (#585) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 6b698b214..11693fbda 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 6b698b21492149536165bd75abb48633734336d3 +Subproject commit 11693fbdad7438c3e9bc51be7010513b48a0b349 From 9e8ab73a4c40403062adc60ae376405119c2bd56 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Fri, 16 Dec 2022 15:42:08 +0100 Subject: [PATCH 068/296] Updates submodules (#586) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 11693fbda..6658f7537 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 11693fbdad7438c3e9bc51be7010513b48a0b349 +Subproject commit 6658f7537a6995021e3e6e45247fbfe084038024 From 9083e36fb293686e842a2df96e615d697a92008a Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Tue, 3 Jan 2023 17:57:21 +0100 Subject: [PATCH 069/296] Updates submodules (#587) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 6658f7537..48aef3560 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 6658f7537a6995021e3e6e45247fbfe084038024 +Subproject commit 48aef356012d571570d61a8e936639ad1c520e0c From 5fb621fcdb7ae10a810cf8f1845e806837c92972 Mon Sep 17 00:00:00 2001 From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com> Date: Fri, 6 Jan 2023 14:39:43 +0100 Subject: [PATCH 070/296] Streaming errors (#590) * streaming errors * streamingReporter in the config * slightly different error message * handle type checking and parsing errors --- src/main/scala/viper/gobra/Gobra.scala | 1 - .../scala/viper/gobra/frontend/Config.scala | 17 ++++++------ .../gobra/reporting/StreamingReporter.scala | 26 +++++++++++++++++++ 3 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 src/main/scala/viper/gobra/reporting/StreamingReporter.scala diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index 54de7422a..cb1c3181e 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -93,7 +93,6 @@ trait GoVerifier extends StrictLogging { case VerifierResult.Success => logger.info(s"$name found no errors") case VerifierResult.Failure(errors) => logger.error(s"$name has found ${errors.length} error(s) in package $pkgId") - errors.foreach(err => logger.error(s"\t${err.formattedMessage}")) allVerifierErrors = allVerifierErrors ++ errors } })(executor) diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 3fb3f7c4d..0adc5a199 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -16,7 +16,7 @@ import viper.gobra.backend.{ViperBackend, ViperBackends} import viper.gobra.GoVerifier import viper.gobra.frontend.PackageResolver.FileResource import viper.gobra.frontend.Source.getPackageInfo -import viper.gobra.reporting.{FileWriterReporter, GobraReporter, StdIOReporter} +import viper.gobra.reporting.{FileWriterReporter, GobraReporter, StdIOReporter, StreamingReporter} import viper.gobra.util.{TypeBounds, Violation} import viper.silver.ast.SourcePosition @@ -709,13 +709,14 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals gobraDirectory = gobraDirectory(), moduleName = module(), includeDirs = includeDirs, - reporter = FileWriterReporter( - unparse = unparse(), - eraseGhost = eraseGhost(), - goify = goify(), - debug = debug(), - printInternal = printInternal(), - printVpr = printVpr()), + reporter = StreamingReporter( + FileWriterReporter( + unparse = unparse(), + eraseGhost = eraseGhost(), + goify = goify(), + debug = debug(), + printInternal = printInternal(), + printVpr = printVpr())), backend = backend(), isolate = isolate, choppingUpperBound = chopUpperBound(), diff --git a/src/main/scala/viper/gobra/reporting/StreamingReporter.scala b/src/main/scala/viper/gobra/reporting/StreamingReporter.scala new file mode 100644 index 000000000..dd60e3527 --- /dev/null +++ b/src/main/scala/viper/gobra/reporting/StreamingReporter.scala @@ -0,0 +1,26 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2020 ETH Zurich. + +package viper.gobra.reporting + +import com.typesafe.scalalogging.StrictLogging + +case class StreamingReporter(reporter: GobraReporter) extends GobraReporter with StrictLogging { + override val name: String = reporter.name + + def report(msg: GobraMessage): Unit = { + msg match { + case m:GobraEntityFailureMessage => m.result match { + case VerifierResult.Failure(errors) => errors.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) + case _ => // ignore + } + case m:ParserErrorMessage => m.result.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) + case m:TypeCheckFailureMessage => m.result.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) + case _ => // ignore + } + reporter.report(msg) + } +} From 94c939c19e86807d2f4833dde0b6005fb344c86b Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 6 Jan 2023 21:03:54 +0100 Subject: [PATCH 071/296] Update CI Dependencies (#592) * update GitHub actions to fix warnings * updates one more CI action --- .github/workflows/license-check.yml | 4 ++-- .github/workflows/test.yml | 14 +++++++------- .github/workflows/update-submodules.yml | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/license-check.yml b/.github/workflows/license-check.yml index f9faa6337..cd73512f3 100644 --- a/.github/workflows/license-check.yml +++ b/.github/workflows/license-check.yml @@ -16,9 +16,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Gobra - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check license headers - uses: viperproject/check-license-header@v1 + uses: viperproject/check-license-header@v2 with: path: ./ config: ./.github/license-check/config.json diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2e04318e7..0b3d56f37 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,7 +25,7 @@ jobs: FAILURE_LEVEL: "error" steps: - name: Checkout Gobra - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: submodules: 'recursive' - name: Check that silicon & carbon reference same silver commit @@ -49,11 +49,11 @@ jobs: # used to enable Docker caching (see https://github.com/docker/build-push-action) - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 - name: Build image up to including stage 'build' # note that the action's name is misleading: this step does NOT push - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . load: true # make the built image available in docker (locally) @@ -161,13 +161,13 @@ jobs: - name: Upload RAM usage if: ${{ always() }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: pidstat.txt path: sync/pidstat.txt - name: Build entire image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . load: true # make the built image available in docker (locally) @@ -203,7 +203,7 @@ jobs: - name: Login to Github Packages if: env.SHOULD_DEPLOY == 'true' - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: registry: ghcr.io username: ${{ github.actor }} @@ -211,7 +211,7 @@ jobs: - name: Push entire image if: env.SHOULD_DEPLOY == 'true' - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: workflow-container/Dockerfile diff --git a/.github/workflows/update-submodules.yml b/.github/workflows/update-submodules.yml index d505ddb92..efc59dc7d 100644 --- a/.github/workflows/update-submodules.yml +++ b/.github/workflows/update-submodules.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: submodules: true @@ -35,7 +35,7 @@ jobs: - name: Open a pull request id: pr - uses: peter-evans/create-pull-request@v3 + uses: peter-evans/create-pull-request@v4 if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF with: # Use viper-admin's token to workaround a restriction of GitHub. From 0fdddc156601a9c9647c09c77216ef6f4058140b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Tue, 10 Jan 2023 13:44:25 +0100 Subject: [PATCH 072/296] Introduce `len` for ADTs to be used as a termination measure (#591) * New impl * minor tweak in doc * fix consistency checks * Felix's feedback --- .../implementation/typing/ExprTyping.scala | 4 +- .../encodings/adts/AdtEncoding.scala | 87 ++++++++++++++++++- .../features/adts/termination-fail1.gobra | 41 +++++++++ .../features/adts/termination-success1.gobra | 56 ++++++++++++ 4 files changed, 184 insertions(+), 4 deletions(-) create mode 100644 src/test/resources/regressions/features/adts/termination-fail1.gobra create mode 100644 src/test/resources/regressions/features/adts/termination-success1.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 4f0812b75..29ab8fa94 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -502,7 +502,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case PLength(op) => isExpr(op).out ++ { underlyingType(exprType(op)) match { case _: ArrayT | _: SliceT | _: GhostSliceT | StringT | _: VariadicT | _: MapT | _: MathMapT => noMessages - case _: SequenceT | _: SetT | _: MultisetT => isPureExpr(op) + case _: SequenceT | _: SetT | _: MultisetT | _: AdtT => isPureExpr(op) case typ => error(op, s"expected an array, string, sequence or slice type, but got $typ") } } @@ -1051,7 +1051,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def typeOfPLength(expr: PLength): Type = underlyingType(exprType(expr.exp)) match { case _: ArrayT | _: SliceT | _: GhostSliceT | StringT | _: VariadicT | _: MapT => INT_TYPE - case _: SequenceT | _: SetT | _: MultisetT | _: MathMapT => UNTYPED_INT_CONST + case _: SequenceT | _: SetT | _: MultisetT | _: MathMapT | _: AdtT => UNTYPED_INT_CONST case t => violation(s"unexpected argument ${expr.exp} of type $t passed to len") } } diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala index 2cae1926c..a13be34e1 100644 --- a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala @@ -60,6 +60,9 @@ class AdtEncoding extends LeafTypeEncoding { * unique X_clause1_tag(): Int * ... * + * // rank function + * rank(): Int + * * axiom { * forall f11: F11, ... :: { X_clause1(f11, ...) } * X_tag(X_clause1(f11, ...)) == X_clause1_tag() && X_F11(X_clause1(f11, ...)) )) == f11 && ... @@ -76,6 +79,16 @@ class AdtEncoding extends LeafTypeEncoding { * forall t: X :: {X_tag(t)} t == X_clause1(X_clause1_f11(t), ...) || t == ... * } * + * axiom { + * forall t X :: {rank(t)} 0 <= rank(t) + * } + * + * // for every parameter pi of a constructor C with arity n, if pi has an ADT type: + * axiom { + * forall p1, ..., pn ==> rank(pi) < rank(C(p1, ..., pi, ..., pn)) + * } + * ... + * * } */ override def member(ctx: Context): in.Member ==> MemberWriter[Vector[vpr.Member]] = { @@ -227,13 +240,77 @@ class AdtEncoding extends LeafTypeEncoding { vpr.Forall(Seq(variableDecl), Seq(trigger), vu.bigOr(equalities)(aPos, aInfo, aErrT))(aPos, aInfo, aErrT) )(aPos, aInfo, adtName, aErrT) } + + // rank function for ADTs, as axiomatized in Paul Dahlke's thesis - section 5.3.2 of + // https://ethz.ch/content/dam/ethz/special-interest/infk/chair-program-method/pm/documents/Education/Theses/Paul_Dahlke_BA_Report.pdf + val rankFunc = adtRankFunc(adtName)(aPos, aInfo, aErrT) + val rankAxioms = { + // the following axiom is useful for Gobra to easily infer that there is a lower bound + // on the values produced by rank: + // forall x X :: {rank(x)} 0 <= rank(x) + val rankIsBounded = { + val variableDecl = vpr.LocalVarDecl("x", adtT)(aPos, aInfo, aErrT) + val rankApp = applyRankFunc(adtName, variableDecl.localVar)(aPos, aInfo, aErrT) + val trigger = vpr.Trigger(Seq(rankApp))(aPos, aInfo, aErrT) + val body = vpr.Forall( + variables = Seq(variableDecl), + triggers = Seq(trigger), + exp = vpr.LeCmp(vpr.IntLit(0)(aPos, aInfo, aErrT), rankApp)(aPos, aInfo, aErrT) + )(aPos, aInfo, aErrT) + vpr.AnonymousDomainAxiom(body)(aPos, aInfo, adtName, aErrT) + } + + // for every parameter pi of a constructor C with arity n, if pi has an ADT type: + // forall p1, ..., pn ==> rank(pi) < rank(C(p1, ..., pi, ..., pn)) + val defsRankPerClause = adt.clauses zip constructors flatMap { case (clause, cons) => + val variables = fieldDecls(clause) + val constApp = vpr.DomainFuncApp( + funcname = cons.name, + args = variables map (_.localVar), + typVarMap = Map() + )(aPos, aInfo, adtT, adtName, aErrT) + val rankOfConst = applyRankFunc(adtName, constApp)(aPos, aInfo, aErrT) // rank(C(p1, ..., pn)) + val trigger = vpr.Trigger(Seq(rankOfConst))(aPos, aInfo, aErrT) + clause.args.map(arg => underlyingType(arg.typ)(ctx)) zip variables collect { + case (inVarT: in.AdtT, vprVar) => + // selects the appropriate rank function according to the ADT type + val rankOfParam = applyRankFunc(inVarT.name, vprVar.localVar)(aPos, aInfo, aErrT) // rank(pi) + val body = vpr.LtCmp(rankOfParam, rankOfConst)(aPos, aInfo, aErrT) + val axExp = vpr.Forall(variables = variables, triggers = Seq(trigger), exp = body)(aPos, aInfo, aErrT) + vpr.AnonymousDomainAxiom(axExp)(aPos, aInfo, adtName, aErrT) + } + } + rankIsBounded +: defsRankPerClause + } + ml.unit(Vector(vpr.Domain( adtName, - functions = (defaultFunc +: tagFunc +: clauseTags) ++ constructors ++ destructors, - axioms = (exclusiveAxiom +: constructorAxioms) ++ destructorAxioms + functions = (defaultFunc +: rankFunc +: tagFunc +: clauseTags) ++ constructors ++ destructors, + axioms = (exclusiveAxiom +: constructorAxioms) ++ destructorAxioms ++ rankAxioms )(pos = aPos, info = aInfo, errT = aErrT))) } + private def adtRankFuncName(adtName: String): String = s"rank$$$adtName" + private def adtRankFunc(adtName: String)(pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo) = { + val funcName = adtRankFuncName(adtName) + val adtT = adtType(adtName) + val variableDecl = vpr.LocalVarDecl("x", adtT)(pos, info, errT) + vpr.DomainFunc( + name = funcName, + formalArgs = Seq(variableDecl), + typ = vpr.Int, + unique = false, + interpretation = None + )(pos, info, adtName, errT) + } + + private def applyRankFunc(adtName: String, arg: vpr.Exp) + (pos: vpr.Position, info: vpr.Info, errT: vpr.ErrorTrafo): vpr.DomainFuncApp = vpr.DomainFuncApp( + funcname = adtRankFuncName(adtName), + args = Seq(arg), + typVarMap = Map() + )(pos, info, vpr.Int, adtName, errT) + /** * [ dflt(adt{N}) ] -> N_default() * [ C{args}: adt{N} ] -> N_C([args]) @@ -263,6 +340,12 @@ class AdtEncoding extends LeafTypeEncoding { } yield withSrc(destructor(ad.field.name, adtType.name, value, ctx.typ(ad.field.typ)), ad) case p: in.PatternMatchExp => translatePatternMatchExp(p)(ctx) + + case l@in.Length(expr :: ctx.Adt(a)) => + for { + e <- ctx.expression(expr) + rankApp = withSrc(applyRankFunc(a.name, e), l) + } yield rankApp } } diff --git a/src/test/resources/regressions/features/adts/termination-fail1.gobra b/src/test/resources/regressions/features/adts/termination-fail1.gobra new file mode 100644 index 000000000..99d5a4b77 --- /dev/null +++ b/src/test/resources/regressions/features/adts/termination-fail1.gobra @@ -0,0 +1,41 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type tree adt{ + leaf{ value int } + node{ left, right tree } +} + +ghost +pure +decreases // cause: wrong termination measure +func leafCount(t tree) int { + return match t { + case leaf{_}: 1 + //:: ExpectedOutput(pure_function_termination_error) + case node{?l, ?r}: leafCount(l) + leafCount(r) + } +} + +type list adt { + Empty{} + + Cons{ + head any + tail list + } +} + +ghost +decreases len(l) +func length(l list) int { + match l { + case Empty{}: + return 0 + case Cons{_, ?t}: + //:: ExpectedOutput(function_termination_error) + return 1 + length(l) // cause: pass l to length instead of t + } +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/adts/termination-success1.gobra b/src/test/resources/regressions/features/adts/termination-success1.gobra new file mode 100644 index 000000000..d38649dbb --- /dev/null +++ b/src/test/resources/regressions/features/adts/termination-success1.gobra @@ -0,0 +1,56 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type tree adt{ + leaf{ value int } + node{ left, right tree } +} + +ghost +pure +decreases len(t) +func leafCount(t tree) int { + return match t { + case leaf{_}: 1 + case node{?l, ?r}: leafCount(l) + leafCount(r) + } +} + +type list adt { + Empty{} + + Cons{ + head any + tail list + } +} + +ghost +decreases len(l) +func length(l list) int { + match l { + case Empty{}: + return 0 + case Cons{_, ?t}: + return 1 + length(t) + } +} + +ghost +requires l === r || l.tail.tail === r +decreases len(l) +func testSubSubList(l, r list) { + if (l === r) { + return + } else { + assert l.tail.tail === r + assert l !== r + assume l.isCons // Gobra cannot infer this - adt axiomatization still a bit weak? + assume l.tail.isCons // Gobra cannot infer this - adt axiomatization still a bit weak? + assert len(l.tail) < len(l) + assert len(l.tail.tail) < len(l) + testSubSubList(l.tail.tail, r) + } +} \ No newline at end of file From c11000d1367a4367dba2068319e3edb37ff89399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Thu, 12 Jan 2023 11:44:05 +0100 Subject: [PATCH 073/296] Fix --debug flag (#593) * backup * backup * backup --- .../scala/viper/gobra/frontend/Parser.scala | 8 ++---- .../resolution/NameResolution.scala | 4 +-- .../viper/gobra/reporting/Reporter.scala | 27 +++++++++++++------ 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 6fcefc649..89ae869c3 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -42,12 +42,8 @@ object Parser { */ def parse(input: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean = false)(config: Config): Either[Vector[VerifierError], PPackage] = { - val sources = input - .map(Gobrafier.gobrafy) - .map(s => { - config.reporter report PreprocessedInputMessage(s.name, () => s.content) - s - }) + val sources = input.map(Gobrafier.gobrafy) + sources.foreach { s => config.reporter report PreprocessedInputMessage(s.name, () => s.content) } for { parseAst <- parseSources(sources, pkgInfo, specOnly)(config) postprocessors = Seq( diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index 877cbfcb4..b9b9da4db 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -167,9 +167,7 @@ trait NameResolution { private def defenvin(in: PNode => Environment): PNode ==> Environment = { case n: PPackage => addUnorderedDefToEnv(rootenv(initialEnv(n): _*))(n) case scope: PUnorderedScope => addUnorderedDefToEnv(enter(in(scope)))(scope) - case scope: PScope if !scopeSpecialCaseWithNoNewScope(scope) => - logger.debug(scope.toString) - enter(in(scope)) + case scope: PScope if !scopeSpecialCaseWithNoNewScope(scope) => enter(in(scope)) } private def scopeSpecialCaseWithNoNewScope(s: PScope): Boolean = s match { diff --git a/src/main/scala/viper/gobra/reporting/Reporter.scala b/src/main/scala/viper/gobra/reporting/Reporter.scala index b296b74ca..a44dea07f 100644 --- a/src/main/scala/viper/gobra/reporting/Reporter.scala +++ b/src/main/scala/viper/gobra/reporting/Reporter.scala @@ -8,7 +8,6 @@ package viper.gobra.reporting import java.nio.charset.StandardCharsets.UTF_8 import java.nio.file.Paths - import ch.qos.logback.classic.Level import com.typesafe.scalalogging.Logger import org.apache.commons.io.FileUtils @@ -47,21 +46,33 @@ case class FileWriterReporter(name: String = "filewriter_reporter", Logger(LoggerFactory.getLogger(getClass.getName)) override def report(msg: GobraMessage): Unit = msg match { - case PreprocessedInputMessage(input, content) if unparse => write(input, "gobrafied", content()) - case ParsedInputMessage(input, program) if unparse => write(input, "unparsed", program().formatted) - case TypeCheckSuccessMessage(inputs, _, _, _, erasedGhostCode, goifiedGhostCode) => + case PreprocessedInputMessage(WithoutBuiltinSources(input), content) if unparse => write(input, "gobrafied", content()) + case ParsedInputMessage(WithoutBuiltinSources(input), program) if unparse => write(input, "unparsed", program().formatted) + case TypeCheckSuccessMessage(WithoutBuiltinSources(inputs), _, _, _, erasedGhostCode, goifiedGhostCode) => if (eraseGhost) write(inputs, "ghostLess", erasedGhostCode()) if (goify) write(inputs, "go", goifiedGhostCode()) - case TypeCheckDebugMessage(inputs, _, debugTypeInfo) if debug => write(inputs, "debugType", debugTypeInfo()) - case DesugaredMessage(inputs, internal) if printInternal => write(inputs, "internal", internal().formatted) - case AppliedInternalTransformsMessage(inputs, internal) if printInternal => write(inputs, "internal", internal().formatted) - case m@GeneratedViperMessage(_, inputs, _, _) if printVpr => write(inputs, "vpr", m.vprAstFormatted) + case TypeCheckDebugMessage(WithoutBuiltinSources(inputs), _, debugTypeInfo) if debug => write(inputs, "debugType", debugTypeInfo()) + case DesugaredMessage(WithoutBuiltinSources(inputs), internal) if printInternal => write(inputs, "internal", internal().formatted) + case AppliedInternalTransformsMessage(WithoutBuiltinSources(inputs), internal) if printInternal => write(inputs, "internal", internal().formatted) + case m@GeneratedViperMessage(_, WithoutBuiltinSources(inputs), _, _) if printVpr => write(inputs, "vpr", m.vprAstFormatted) case m: ChoppedViperMessage if printVpr => write(m.inputs, s"chopped${m.idx}.vpr", m.vprAstFormatted) case m: ChoppedProgressMessage => logger.info(m.toString) case CopyrightReport(text) => println(text) case _ => // ignore } + private object WithoutBuiltinSources { + // the reporter generates files with different extensions in the same place as the original file. + // unfortunately, for the builtin resources, we do not generate a suitable path for the output files (these + // paths in particular are typically for a path for which a regular use does not have permissions). + val builtinSourcesNames = Seq("/builtin/builtin.gobra") + def unapply(s: String): Option[String] = if (builtinSourcesNames contains s) None else Some(s) + def unapply(s: Vector[String]): Option[Vector[String]] = { + val diff = s filterNot builtinSourcesNames.contains + if (diff.isEmpty) None else Some(diff) + } + } + private def write(inputs: Vector[String], fileExt: String, content: String): Unit = { // this message belongs to multiple inputs. We simply pick the first one for the resulting file's name Violation.violation(inputs.nonEmpty, s"expected at least one file path for which the following message was reported: '$content''") From f6852e29cf3361e809aa9f30a1761b7f8e20604c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 16 Jan 2023 10:47:58 +0100 Subject: [PATCH 074/296] More precise triggers for smake (#594) * use more precise triggers for smake * doc * Improve doc --- .../library/slices/SlicesImpl.scala | 99 +++++++++++++++---- 1 file changed, 79 insertions(+), 20 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/library/slices/SlicesImpl.scala b/src/main/scala/viper/gobra/translator/library/slices/SlicesImpl.scala index 0e9b8e584..f614ab63c 100644 --- a/src/main/scala/viper/gobra/translator/library/slices/SlicesImpl.scala +++ b/src/main/scala/viper/gobra/translator/library/slices/SlicesImpl.scala @@ -163,14 +163,28 @@ class SlicesImpl(val arrays : Arrays) extends Slices { /** * {{{ - * axiom slice_deconstructor_over_constructor { - * forall arr, off, len, cap :: { smake(arr,off,len,cap) } - * 0 <= off && 0 <= len && len <= cap && off + cap <= alen(arr) ==> - * sarray(smake(arr,off,len,cap)) == arr && ... + * axiom slice_deconstructor_over_constructor_array { + * forall arr, off, len, cap :: { sarray(smake(arr,off,len,cap)) } + * 0 <= off && 0 <= len && len <= cap && off + cap <= alen(arr) ==> sarray(smake(arr,off,len,cap)) == arr + * } + * + * axiom slice_deconstructor_over_constructor_offset { + * forall arr, off, len, cap :: { soffset(smake(arr,off,len,cap)) } + * 0 <= off && 0 <= len && len <= cap && off + cap <= alen(arr) ==> soffset(smake(arr,off,len,cap)) == off + * } + * + * axiom slice_deconstructor_over_constructor_len { + * forall arr, off, len, cap :: { slen(smake(arr,off,len,cap)) } + * 0 <= off && 0 <= len && len <= cap && off + cap <= alen(arr) ==> slen(smake(arr,off,len,cap)) == len + * } + * + * axiom slice_deconstructor_over_constructor_cap { + * forall arr, off, len, cap :: { slen(smake(arr,off,len,cap)) } + * 0 <= off && 0 <= len && len <= cap && off + cap <= alen(arr) ==> scap(smake(arr,off,len,cap)) == cap * } * }}} */ - private lazy val slice_deconstructor_over_constructor: vpr.DomainAxiom = { + private lazy val slice_deconstructors_over_constructor: Vector[vpr.DomainAxiom] = { val arrDecl = vpr.LocalVarDecl("a", arrays.typ(typeVar))(); val arr = arrDecl.localVar val offDecl = vpr.LocalVarDecl("o", vpr.Int)(); val off = offDecl.localVar val lehDecl = vpr.LocalVarDecl("l", vpr.Int)(); val leh = lehDecl.localVar @@ -182,19 +196,50 @@ class SlicesImpl(val arrays : Arrays) extends Slices { vpr.LeCmp(vpr.IntLit(0)(), leh)(), vpr.And( vpr.LeCmp(leh, cay)(), vpr.LeCmp(vpr.Add(off,cay)(), arrays.len(arr)())())())())() - val rhs = vpr.And( - vpr.EqCmp(array(smake)(), arr)(), vpr.And( - vpr.EqCmp(offset(smake)(), off)(), vpr.And( - vpr.EqCmp(len(smake)(), leh)(), - vpr.EqCmp(cap(smake)(), cay)())())())() - vpr.AnonymousDomainAxiom( + val funcAppAxiom1 = array(smake)() + val funcAppAxiom2 = offset(smake)() + val funcAppAxiom3 = len(smake)() + val funcAppAxiom4 = cap(smake)() + val rhsAxiom1 = vpr.EqCmp(funcAppAxiom1, arr)() + val rhsAxiom2 = vpr.EqCmp(funcAppAxiom2, off)() + val rhsAxiom3 = vpr.EqCmp(funcAppAxiom3, leh)() + val rhsAxiom4 = vpr.EqCmp(funcAppAxiom4, cay)() + + val axiom1 = vpr.NamedDomainAxiom( + "deconstructor_over_constructor_array", + vpr.Forall( + Seq(arrDecl, offDecl, lehDecl, cayDecl), + Seq(vpr.Trigger(Seq(funcAppAxiom1))()), + vpr.Implies(lhs, rhsAxiom1)() + )() + )(domainName = domainName) + val axiom2 = vpr.NamedDomainAxiom( + "deconstructor_over_constructor_offset", + vpr.Forall( + Seq(arrDecl, offDecl, lehDecl, cayDecl), + Seq(vpr.Trigger(Seq(funcAppAxiom2))()), + vpr.Implies(lhs, rhsAxiom2)() + )() + )(domainName = domainName) + val axiom3 = vpr.NamedDomainAxiom( + "deconstructor_over_constructor_len", vpr.Forall( Seq(arrDecl, offDecl, lehDecl, cayDecl), - Seq(vpr.Trigger(Seq(smake))()), - vpr.Implies(lhs, rhs)() + Seq(vpr.Trigger(Seq(funcAppAxiom3))()), + vpr.Implies(lhs, rhsAxiom3)() )() )(domainName = domainName) + val axiom4 = vpr.NamedDomainAxiom( + "deconstructor_over_constructor_cap", + vpr.Forall( + Seq(arrDecl, offDecl, lehDecl, cayDecl), + Seq(vpr.Trigger(Seq(funcAppAxiom4))()), + vpr.Implies(lhs, rhsAxiom4)() + )() + )(domainName = domainName) + + Vector(axiom1, axiom2, axiom3, axiom4) } /** @@ -268,10 +313,24 @@ class SlicesImpl(val arrays : Arrays) extends Slices { * soffset(s) + scap(s) <= alen(sarray(s)) * } * - * axiom slice_deconstructor_over_constructor { - * forall arr, off, len, cap :: { smake(arr,off,len,cap) } - * 0 <= off && 0 <= len && len <= cap && off + cap <= alen(arr) ==> - * sarray(smake(arr,off,len,cap)) == arr && ... + * axiom slice_deconstructor_over_constructor_array { + * forall arr, off, len, cap :: { sarray(smake(arr,off,len,cap)) } + * 0 <= off && 0 <= len && len <= cap && off + cap <= alen(arr) ==> sarray(smake(arr,off,len,cap)) == arr + * } + * + * axiom slice_deconstructor_over_constructor_offset { + * forall arr, off, len, cap :: { soffset(smake(arr,off,len,cap)) } + * 0 <= off && 0 <= len && len <= cap && off + cap <= alen(arr) ==> soffset(smake(arr,off,len,cap)) == off + * } + * + * axiom slice_deconstructor_over_constructor_len { + * forall arr, off, len, cap :: { slen(smake(arr,off,len,cap)) } + * 0 <= off && 0 <= len && len <= cap && off + cap <= alen(arr) ==> slen(smake(arr,off,len,cap)) == len + * } + * + * axiom slice_deconstructor_over_constructor_cap { + * forall arr, off, len, cap :: { slen(smake(arr,off,len,cap)) } + * 0 <= off && 0 <= len && len <= cap && off + cap <= alen(arr) ==> scap(smake(arr,off,len,cap)) == cap * } * * axiom slice_constructor_over_deconstructor { @@ -284,9 +343,9 @@ class SlicesImpl(val arrays : Arrays) extends Slices { private lazy val domain : vpr.Domain = vpr.Domain( domainName, Seq(sarray_func, soffset_func, slen_func, scap_func, smake_func), - Seq(slice_offset_nonneg_axiom, slice_len_nonneg_axiom, - slice_len_leq_cap_axiom, slice_cap_leq_alen_axiom, - slice_deconstructor_over_constructor, slice_constructor_over_deconstructor), + slice_offset_nonneg_axiom +: slice_len_nonneg_axiom +: + slice_len_leq_cap_axiom +: slice_cap_leq_alen_axiom +: + slice_constructor_over_deconstructor +: slice_deconstructors_over_constructor, Seq(typeVar) )() From 9974336b0d07177700e32edada9977863ee44a43 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Wed, 18 Jan 2023 14:28:08 +0100 Subject: [PATCH 075/296] Updates submodules (#598) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 48aef3560..fcaff291b 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 48aef356012d571570d61a8e936639ad1c520e0c +Subproject commit fcaff291b48d0796e1f11045e24190d93106c0ef From c5eba1615e03df4960275a7e97058ea113d04a8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Thu, 19 Jan 2023 13:09:45 +0100 Subject: [PATCH 076/296] QoL improvements (#599) * print start time * noVerify flag --- src/main/scala/viper/gobra/Gobra.scala | 15 +++++++++++++-- src/main/scala/viper/gobra/frontend/Config.scala | 13 +++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index cb1c3181e..fddd64a8a 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -25,6 +25,8 @@ import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext} import viper.silicon.BuildInfo import viper.silver.{ast => vpr} +import java.time.format.DateTimeFormatter +import java.time.LocalTime import scala.concurrent.{Await, Future, TimeoutException} object GoVerifier { @@ -77,9 +79,10 @@ trait GoVerifier extends StrictLogging { } }) + val timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss"); config.packageInfoInputMap.keys.foreach(pkgInfo => { val pkgId = pkgInfo.id - logger.info(s"Verifying Package $pkgId") + logger.info(s"Verifying package $pkgId [${LocalTime.now().format(timeFormatter)}]") val future = verify(pkgInfo, config.copy(reporter = statsCollector, taskName = pkgId))(executor) .map(result => { // report that verification of this package has finished in order that `statsCollector` can free space by getting rid of this package's typeInfo @@ -162,7 +165,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { task.flatMap{ case Left(Vector()) => Future(VerifierResult.Success) case Left(errors) => Future(VerifierResult.Failure(errors)) - case Right((job, finalConfig)) => verifyAst(finalConfig, pkgInfo, job.program, job.backtrack)(executor) + case Right((job, finalConfig)) => performVerification(finalConfig, pkgInfo, job.program, job.backtrack)(executor) } } @@ -260,6 +263,14 @@ class Gobra extends GoVerifier with GoIdeVerifier { } } + private def performVerification(config: Config, pkgInfo: PackageInfo, ast: vpr.Program, backtrack: BackTranslator.BackTrackInfo)(executor: GobraExecutionContext): Future[VerifierResult] = { + if (config.noVerify) { + Future(VerifierResult.Success)(executor) + } else { + verifyAst(config, pkgInfo, ast, backtrack)(executor) + } + } + /** * Applies transformations to programs in the internal language. Currently, only adds overflow checks but it can * be easily extended to perform more transformations diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 0adc5a199..8535f187a 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -65,6 +65,7 @@ object ConfigDefaults { lazy val DefaultParallelizeBranches: Boolean = false lazy val DefaultDisableMoreCompleteExhale: Boolean = false lazy val DefaultEnableLazyImports: Boolean = false + lazy val DefaultNoVerify: Boolean = false } case class Config( @@ -113,6 +114,7 @@ case class Config( parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, + noVerify: Boolean = ConfigDefaults.DefaultNoVerify, ) { def merge(other: Config): Config = { @@ -155,6 +157,7 @@ case class Config( parallelizeBranches = parallelizeBranches, disableMoreCompleteExhale = disableMoreCompleteExhale, enableLazyImports = enableLazyImports || other.enableLazyImports, + noVerify = noVerify || other.noVerify, ) } @@ -202,6 +205,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, + noVerify: Boolean = ConfigDefaults.DefaultNoVerify, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -253,6 +257,7 @@ trait RawConfig { parallelizeBranches = baseConfig.parallelizeBranches, disableMoreCompleteExhale = baseConfig.disableMoreCompleteExhale, enableLazyImports = baseConfig.enableLazyImports, + noVerify = baseConfig.noVerify, ) } @@ -601,6 +606,13 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) + val noVerify: ScallopOption[Boolean] = opt[Boolean]( + name = "noVerify", + descr = s"Skip the verification step performed after encoding the Gobra program into Viper.", + default = Some(ConfigDefaults.DefaultNoVerify), + noshort = true, + ) + /** * Exception handling */ @@ -735,5 +747,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals parallelizeBranches = parallelizeBranches(), disableMoreCompleteExhale = disableMoreCompleteExhale(), enableLazyImports = enableLazyImports(), + noVerify = noVerify(), ) } From e41aed3c726a56768ef390d53e0acbe9b5a72344 Mon Sep 17 00:00:00 2001 From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com> Date: Thu, 19 Jan 2023 16:16:55 +0100 Subject: [PATCH 077/296] print early errors that don't go through the streaming reporter (#597) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * print early errors that don't go through the streaming reporter * remove parser and typechecker errors from streaming reporter * trait used instead of Either * stream faulty messages * try to revert space change * again * I don't know how * refactoring and add flag for no streaming of errors * stream faulty message only when streaming errors Co-authored-by: JoĂ£o Pereira --- src/main/scala/viper/gobra/Gobra.scala | 3 +++ .../scala/viper/gobra/frontend/Config.scala | 21 ++++++++++++--- .../scala/viper/gobra/frontend/Parser.scala | 7 +++-- .../DefaultMessageBackTranslator.scala | 13 +++++++++- .../viper/gobra/reporting/Reporter.scala | 10 ++++++- .../gobra/reporting/StreamingReporter.scala | 26 ------------------- .../gobra/reporting/VerifierResult.scala | 2 -- .../viper/gobra/DetailedBenchmarkTests.scala | 2 +- 8 files changed, 47 insertions(+), 37 deletions(-) delete mode 100644 src/main/scala/viper/gobra/reporting/StreamingReporter.scala diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index fddd64a8a..cb9e18620 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -96,6 +96,9 @@ trait GoVerifier extends StrictLogging { case VerifierResult.Success => logger.info(s"$name found no errors") case VerifierResult.Failure(errors) => logger.error(s"$name has found ${errors.length} error(s) in package $pkgId") + if (config.noStreamErrors) { + errors.foreach(err => logger.error(s"\t${err.formattedMessage}")) + } allVerifierErrors = allVerifierErrors ++ errors } })(executor) diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 8535f187a..d4309c30b 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -16,7 +16,7 @@ import viper.gobra.backend.{ViperBackend, ViperBackends} import viper.gobra.GoVerifier import viper.gobra.frontend.PackageResolver.FileResource import viper.gobra.frontend.Source.getPackageInfo -import viper.gobra.reporting.{FileWriterReporter, GobraReporter, StdIOReporter, StreamingReporter} +import viper.gobra.reporting.{FileWriterReporter, GobraReporter, StdIOReporter} import viper.gobra.util.{TypeBounds, Violation} import viper.silver.ast.SourcePosition @@ -66,6 +66,7 @@ object ConfigDefaults { lazy val DefaultDisableMoreCompleteExhale: Boolean = false lazy val DefaultEnableLazyImports: Boolean = false lazy val DefaultNoVerify: Boolean = false + lazy val DefaultNoStreamErrors: Boolean = false } case class Config( @@ -115,6 +116,7 @@ case class Config( disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, + noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors ) { def merge(other: Config): Config = { @@ -158,6 +160,7 @@ case class Config( disableMoreCompleteExhale = disableMoreCompleteExhale, enableLazyImports = enableLazyImports || other.enableLazyImports, noVerify = noVerify || other.noVerify, + noStreamErrors = noStreamErrors || other.noStreamErrors ) } @@ -206,6 +209,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, + noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -258,6 +262,7 @@ trait RawConfig { disableMoreCompleteExhale = baseConfig.disableMoreCompleteExhale, enableLazyImports = baseConfig.enableLazyImports, noVerify = baseConfig.noVerify, + noStreamErrors = baseConfig.noStreamErrors, ) } @@ -613,6 +618,13 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) + val noStreamErrors: ScallopOption[Boolean] = opt[Boolean]( + name = "noStreamErrors", + descr = "Do not stream errors produced by Gobra but instead print them all organized by package in the end.", + default = Some(ConfigDefaults.DefaultNoStreamErrors), + noshort = true, + ) + /** * Exception handling */ @@ -721,14 +733,14 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals gobraDirectory = gobraDirectory(), moduleName = module(), includeDirs = includeDirs, - reporter = StreamingReporter( - FileWriterReporter( + reporter = FileWriterReporter( unparse = unparse(), eraseGhost = eraseGhost(), goify = goify(), debug = debug(), printInternal = printInternal(), - printVpr = printVpr())), + printVpr = printVpr(), + streamErrs = !noStreamErrors()), backend = backend(), isolate = isolate, choppingUpperBound = chopUpperBound(), @@ -748,5 +760,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals disableMoreCompleteExhale = disableMoreCompleteExhale(), enableLazyImports = enableLazyImports(), noVerify = noVerify(), + noStreamErrors = noStreamErrors(), ) } diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 89ae869c3..bc80f19e5 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -233,9 +233,12 @@ object Parser { * Replaces all PQualifiedWoQualifierImport by PQualifiedImport nodes */ def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = { - def createError(n: PImplicitQualifiedImport, errorMsg: String): Vector[VerifierError] = - pkg.positions.translate(message(n, + def createError(n: PImplicitQualifiedImport, errorMsg: String): Vector[VerifierError] = { + val err = pkg.positions.translate(message(n, s"Explicit qualifier could not be derived (reason: '$errorMsg')"), ParserError) + config.reporter report ParserErrorMessage(err.head.position.get.file, err) + err + } // unfortunately Kiama does not seem to offer a way to report errors while applying the strategy // hence, we keep ourselves track of errors diff --git a/src/main/scala/viper/gobra/reporting/DefaultMessageBackTranslator.scala b/src/main/scala/viper/gobra/reporting/DefaultMessageBackTranslator.scala index ad1ae7fa4..93947ff53 100644 --- a/src/main/scala/viper/gobra/reporting/DefaultMessageBackTranslator.scala +++ b/src/main/scala/viper/gobra/reporting/DefaultMessageBackTranslator.scala @@ -11,9 +11,20 @@ import viper.gobra.frontend.Config import viper.gobra.reporting.BackTranslator.BackTrackInfo import viper.silver.reporter.{EntityFailureMessage, EntitySuccessMessage, Message, OverallFailureMessage, OverallSuccessMessage} import viper.silver.verifier.VerificationResult +import com.typesafe.scalalogging.StrictLogging -class DefaultMessageBackTranslator(backTrackInfo: BackTrackInfo, config: Config) extends MessageBackTranslator { +class DefaultMessageBackTranslator(backTrackInfo: BackTrackInfo, config: Config) extends MessageBackTranslator with StrictLogging { override def translate(msg: Message): GobraMessage = { + // TODO: Remove this "if" when issue https://github.com/viperproject/gobra/issues/556 is fixed + if (!config.noStreamErrors) { + msg match { + case _@EntityFailureMessage(_, Source(_), _, _, _) => // ignore + case _@EntityFailureMessage(_, _, _, result, _) => + // Stream faulty message + translate(result).asInstanceOf[VerifierResult.Failure].errors.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) + case _ => + } + } defaultTranslate.lift.apply(msg).getOrElse(RawMessage(msg)) } diff --git a/src/main/scala/viper/gobra/reporting/Reporter.scala b/src/main/scala/viper/gobra/reporting/Reporter.scala index a44dea07f..f4cffc761 100644 --- a/src/main/scala/viper/gobra/reporting/Reporter.scala +++ b/src/main/scala/viper/gobra/reporting/Reporter.scala @@ -40,7 +40,8 @@ case class FileWriterReporter(name: String = "filewriter_reporter", goify: Boolean = false, debug: Boolean = false, printInternal: Boolean = false, - printVpr: Boolean = false) extends GobraReporter { + printVpr: Boolean = false, + streamErrs: Boolean = true) extends GobraReporter { lazy val logger: Logger = Logger(LoggerFactory.getLogger(getClass.getName)) @@ -58,6 +59,13 @@ case class FileWriterReporter(name: String = "filewriter_reporter", case m: ChoppedViperMessage if printVpr => write(m.inputs, s"chopped${m.idx}.vpr", m.vprAstFormatted) case m: ChoppedProgressMessage => logger.info(m.toString) case CopyrightReport(text) => println(text) + // Stream errors here + case m:GobraEntityFailureMessage if streamErrs => m.result match { + case VerifierResult.Failure(errors) => errors.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) + case _ => // ignore + } + case m:ParserErrorMessage if streamErrs => m.result.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) + case m:TypeCheckFailureMessage if streamErrs => m.result.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) case _ => // ignore } diff --git a/src/main/scala/viper/gobra/reporting/StreamingReporter.scala b/src/main/scala/viper/gobra/reporting/StreamingReporter.scala deleted file mode 100644 index dd60e3527..000000000 --- a/src/main/scala/viper/gobra/reporting/StreamingReporter.scala +++ /dev/null @@ -1,26 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// Copyright (c) 2011-2020 ETH Zurich. - -package viper.gobra.reporting - -import com.typesafe.scalalogging.StrictLogging - -case class StreamingReporter(reporter: GobraReporter) extends GobraReporter with StrictLogging { - override val name: String = reporter.name - - def report(msg: GobraMessage): Unit = { - msg match { - case m:GobraEntityFailureMessage => m.result match { - case VerifierResult.Failure(errors) => errors.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) - case _ => // ignore - } - case m:ParserErrorMessage => m.result.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) - case m:TypeCheckFailureMessage => m.result.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) - case _ => // ignore - } - reporter.report(msg) - } -} diff --git a/src/main/scala/viper/gobra/reporting/VerifierResult.scala b/src/main/scala/viper/gobra/reporting/VerifierResult.scala index 318b22263..f054029b3 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierResult.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierResult.scala @@ -15,5 +15,3 @@ object VerifierResult { case object Success extends VerifierResult case class Failure(errors: Vector[VerifierError]) extends VerifierResult } - - diff --git a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala index 06372fb81..1e2ea620f 100644 --- a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala +++ b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala @@ -173,4 +173,4 @@ class DetailedBenchmarkTests extends BenchmarkTests { case Some(Right(result)) => result } } -} \ No newline at end of file +} From 539f2a3affbc725a045a5ee6a7003cfec198f78b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 23 Jan 2023 13:10:41 +0100 Subject: [PATCH 078/296] Allow non-side-effectful conversions in spec (#600) * allow conversions in spec * add tests * cleanup * address felix's comment --- .../scala/viper/gobra/frontend/Desugar.scala | 14 ++++++-------- .../viper/gobra/frontend/info/TypeInfo.scala | 1 + .../info/implementation/typing/ExprTyping.scala | 16 +++++++++++++++- .../typing/ghost/GhostExprTyping.scala | 9 +-------- .../typing/ghost/separation/GhostWellDef.scala | 2 +- .../features/conversion/conversion-fail01.gobra | 10 ++++++++++ .../conversion/conversion-simple01.gobra | 7 +++++++ 7 files changed, 41 insertions(+), 18 deletions(-) create mode 100644 src/test/resources/regressions/features/conversion/conversion-fail01.gobra create mode 100644 src/test/resources/regressions/features/conversion/conversion-simple01.gobra diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index f56fd3004..e89e1d776 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -20,7 +20,7 @@ import viper.gobra.reporting.{DesugaredMessage, Source} import viper.gobra.theory.Addressability import viper.gobra.translator.Names import viper.gobra.util.Violation.violation -import viper.gobra.util.{Constants, DesugarWriter, TypeBounds, Violation} +import viper.gobra.util.{Constants, DesugarWriter, Violation} import scala.annotation.{tailrec, unused} import scala.collection.{Iterable, SortedSet} @@ -2805,20 +2805,18 @@ object Desugar { val src: Meta = meta(expr, info) info.resolve(expr) match { case Some(p: ap.FunctionLikeCall) => functionLikeCallD(ctx, info)(p, expr)(src) - case Some(ap.Conversion(typ, arg)) => + case Some(c@ap.Conversion(typ, arg)) => val typType = info.symbType(typ) - val argType = info.typ(arg) - - (underlyingType(typType), underlyingType(argType)) match { - case (SliceT(IntT(TypeBounds.Byte)), StringT) => - val resT = typeD(SliceT(IntT(TypeBounds.Byte)), Addressability.Exclusive)(src) + underlyingType(typType) match { + case l if info.isEffectfulConversion(c) => + val resT = typeD(l, Addressability.Exclusive)(src) for { target <- freshDeclaredExclusiveVar(resT, expr, info)(src) dArg <- exprD(ctx, info)(arg) conv: in.EffectfulConversion = in.EffectfulConversion(target, resT, dArg)(src) _ <- write(conv) } yield target - case (t: InterfaceT, _) => + case t: InterfaceT => for { exp <- exprD(ctx, info)(arg) tD = typeD(t, exp.typ.addressability)(src) diff --git a/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala b/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala index 0e2dd08e7..41dd8c249 100644 --- a/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala +++ b/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala @@ -26,6 +26,7 @@ trait TypeInfo extends ExternalTypeInfo { def regular(n: PIdnNode): Regular def isDef(n: PIdnUnk): Boolean + def isEffectfulConversion(c: AstPattern.Conversion): Boolean def resolve(n: PExpressionOrType): Option[AstPattern.Pattern] def exprOrType(n: PExpressionOrType): Either[PExpression, PType] diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 29ab8fa94..979af8e2e 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -12,7 +12,7 @@ import viper.gobra.frontend.info.base.SymbolTable.{AdtDestructor, AdtDiscriminat import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.TypeBounds.{BoundedIntegerKind, UnboundedInteger} -import viper.gobra.util.{Constants, Violation} +import viper.gobra.util.{Constants, TypeBounds, Violation} trait ExprTyping extends BaseTyping { this: TypeInfoImpl => @@ -1054,4 +1054,18 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case _: SequenceT | _: SetT | _: MultisetT | _: MathMapT | _: AdtT => UNTYPED_INT_CONST case t => violation(s"unexpected argument ${expr.exp} of type $t passed to len") } + + /** + * True iff a conversion may produce side-effects, such as allocating a slice. + * May need to be extended when we introduce support for generics and when we allow + * a cast from a `[]T` to a `*[n]T` (described in https://go.dev/ref/spec#Conversions). + */ + override def isEffectfulConversion(c: ap.Conversion): Boolean = { + val fromType = underlyingType(exprType(c.arg)) + val toType = underlyingType(typeSymbType(c.typ)) + (fromType, toType) match { + case (StringT, SliceT(IntT(TypeBounds.Byte))) => true + case _ => false + } + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index f68ed936b..f422a8f91 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -360,14 +360,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => // Might change at some point case n: PInvoke => (exprOrType(n.base), resolve(n)) match { case (Right(_), Some(p: ap.Conversion)) => - val dstTyp = symbType(p.typ) - val exprTyp = typ(p.arg) - (underlyingType(dstTyp), underlyingType(exprTyp)) match { - case (SliceT(IntT(TypeBounds.Byte)), StringT) => - // this is an effectful conversion which produces permissions to the resulting slice - false - case _ => go(p.arg) - } + !isEffectfulConversion(p) && go(p.arg) case (Left(callee), Some(p@ap.FunctionCall(f, _))) => go(callee) && p.args.forall(go) && (f match { case ap.Function(_, symb) => symb.isPure case ap.Closure(_, symb) => symb.isPure diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala index bdd36b32c..c6db45808 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala @@ -129,7 +129,7 @@ trait GhostWellDef { this: TypeInfoImpl => ) => error(n, "ghost error: Found ghost child expression, but expected none", !noGhostPropagationFromChildren(n)) case n: PInvoke => (exprOrType(n.base), resolve(n)) match { - case (Right(_), Some(_: ap.Conversion)) => error(n, "ghost error: Found ghost child expression, but expected none", !noGhostPropagationFromChildren(n)) + case (Right(_), Some(_: ap.Conversion)) => noMessages case (Left(_), Some(call: ap.FunctionCall)) => ghostAssignableToCallExpr(call) case (Left(_), Some(call: ap.ClosureCall)) => ghostAssignableToClosureCall(call) case (Left(_), Some(_: ap.PredicateCall)) => noMessages diff --git a/src/test/resources/regressions/features/conversion/conversion-fail01.gobra b/src/test/resources/regressions/features/conversion/conversion-fail01.gobra new file mode 100644 index 000000000..6086013ad --- /dev/null +++ b/src/test/resources/regressions/features/conversion/conversion-fail01.gobra @@ -0,0 +1,10 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +// Rejected, as this conversion is side-effectful, as thus +// it is not a pure expression. +//:: ExpectedOutput(type_error) +ensures res === []byte(s) +func to64(s string) (res []byte) diff --git a/src/test/resources/regressions/features/conversion/conversion-simple01.gobra b/src/test/resources/regressions/features/conversion/conversion-simple01.gobra new file mode 100644 index 000000000..832c14c42 --- /dev/null +++ b/src/test/resources/regressions/features/conversion/conversion-simple01.gobra @@ -0,0 +1,7 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +ensures res == int64(i) +func to64(i int8) (res int64) From 8e64d5ac6f4bafb3f0cd77882b24ed2498471043 Mon Sep 17 00:00:00 2001 From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com> Date: Mon, 23 Jan 2023 16:44:44 +0100 Subject: [PATCH 079/296] weaker error contract (#602) --- src/main/resources/builtin/builtin.gobra | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/builtin/builtin.gobra b/src/main/resources/builtin/builtin.gobra index 13a11a4b5..dab7039a1 100644 --- a/src/main/resources/builtin/builtin.gobra +++ b/src/main/resources/builtin/builtin.gobra @@ -13,7 +13,7 @@ type any = interface{} type error interface { pred ErrorMem() - preserves ErrorMem() + requires acc(ErrorMem(), _) decreases Error() string } From 67a4af83b1f96b78e44652f2b528361fd5c34d78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 25 Jan 2023 10:29:41 +0100 Subject: [PATCH 080/296] Better error spec (#604) * Test better error spec * clean up tabs --- src/main/resources/builtin/builtin.gobra | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/resources/builtin/builtin.gobra b/src/main/resources/builtin/builtin.gobra index dab7039a1..9680d28e2 100644 --- a/src/main/resources/builtin/builtin.gobra +++ b/src/main/resources/builtin/builtin.gobra @@ -13,8 +13,19 @@ type any = interface{} type error interface { pred ErrorMem() + ghost requires acc(ErrorMem(), _) decreases + pure IsDuplicableMem() bool + + ghost + preserves ErrorMem() + ensures IsDuplicableMem() ==> ErrorMem() + decreases + Duplicate() + + preserves ErrorMem() + decreases Error() string } From 3dd82c128c2d52ee57031317f6fdddabd0ecee63 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Fri, 27 Jan 2023 10:22:19 +0100 Subject: [PATCH 081/296] Update Submodules (#605) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Updates submodules * Updates submodules * fix Co-authored-by: jcp19 Co-authored-by: JoĂ£o Pereira --- src/main/scala/viper/gobra/translator/Translator.scala | 10 +++++----- viperserver | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala index 823862088..537b7d94f 100644 --- a/src/main/scala/viper/gobra/translator/Translator.scala +++ b/src/main/scala/viper/gobra/translator/Translator.scala @@ -25,11 +25,6 @@ object Translator { val programTranslator = new ProgramsImpl() val task = programTranslator.translate(program)(translationConfig) - if (config.checkConsistency) { - val errors = task.program.checkTransitively - if (errors.nonEmpty) Violation.violation(errors.toString) - } - val transformers: Seq[ViperTransformer] = Seq( new AssumeTransformer, new TerminationTransformer @@ -40,6 +35,11 @@ object Translator { .fold(errs => Violation.violation(s"Applying transformer ${transformer.getClass.getSimpleName} resulted in errors: ${errs.toString}"), identity) } + if (config.checkConsistency) { + val errors = transformedTask.program.checkTransitively + if (errors.nonEmpty) Violation.violation(errors.toString) + } + config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => sortAst(transformedTask.program), () => transformedTask.backtrack) transformedTask } diff --git a/viperserver b/viperserver index fcaff291b..1af666336 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit fcaff291b48d0796e1f11045e24190d93106c0ef +Subproject commit 1af666336b5e2e00c1ac04aead3dc5308cca6d13 From 15c8f050193f21ce27e1cf8e7fa29a3fd5b32e40 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 2 Feb 2023 11:11:59 +0100 Subject: [PATCH 082/296] Updates submodules (#608) Co-authored-by: ArquintL --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 1af666336..0e9f12ef3 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 1af666336b5e2e00c1ac04aead3dc5308cca6d13 +Subproject commit 0e9f12ef35c5e09b59b6f40dca4c3b2093f59752 From 247d1829bdbb7e42065192674b631eac57cd554c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Thu, 2 Feb 2023 17:26:48 +0100 Subject: [PATCH 083/296] Encode slice `make` as a method call (#607) * Introduce explicit call to method to make slice * Clean up old encoding * cleanup * use pure instead of checking stuff wrongly * add doc * Apply suggestions from code review Co-authored-by: Linard Arquint * Apply suggestions from code review --- .../viper/gobra/reporting/VerifierError.scala | 10 +- .../encodings/slices/SliceEncoding.scala | 138 +++++++++++------- .../translator/util/MethodGenerator.scala | 35 +++++ .../features/make_and_new/make1.gobra | 4 +- 4 files changed, 124 insertions(+), 63 deletions(-) create mode 100644 src/main/scala/viper/gobra/translator/util/MethodGenerator.scala diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala index 858c2f2ae..a76834da9 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierError.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala @@ -269,11 +269,6 @@ case class ImportPreconditionNotEstablished(info: Source.Verifier.Info) extends s"The import precondition might not be established by the initialization code of the imported package" } -case class ArrayMakePreconditionError(info: Source.Verifier.Info) extends VerificationError { - override def localId: String = "make_precondition_error" - override def localMessage: String = s"The provided length might not be smaller or equals to the provided capacity, or length and capacity might not be non-negative" -} - case class ChannelMakePreconditionError(info: Source.Verifier.Info) extends VerificationError { override def localId: String = "make_precondition_error" override def localMessage: String = s"The provided length to ${info.origin.tag.trim} might be negative" @@ -505,6 +500,11 @@ case class SpecNotImplementedByClosure(info: Verifier.Info, closure: String, spe override def message: String = s"$closure might not implement $spec." } +case class SliceMakePreconditionFailed(info: Source.Verifier.Info) extends VerificationErrorReason { + override def id: String = "make_precondition_error" + override def message: String = s"The provided length might not be smaller or equal to the provided capacity, or length or capacity might be negative" +} + sealed trait VerificationErrorClarification { def message: String override def toString: String = message diff --git a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala index 9d3b8c4b0..749389ef7 100644 --- a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala @@ -9,14 +9,14 @@ package viper.gobra.translator.encodings.slices import org.bitbucket.inkytonik.kiama.==> import viper.gobra.ast.{internal => in} import viper.gobra.reporting.BackTranslator.RichErrorMessage -import viper.gobra.reporting.{ArrayMakePreconditionError, Source} +import viper.gobra.reporting.{PreconditionError, SliceMakePreconditionFailed, Source} import viper.gobra.theory.Addressability import viper.gobra.theory.Addressability.{Exclusive, Shared} import viper.gobra.translator.Names import viper.gobra.translator.encodings.arrays.SharedArrayEmbedding import viper.gobra.translator.encodings.combinators.LeafTypeEncoding import viper.gobra.translator.context.Context -import viper.gobra.translator.util.FunctionGenerator +import viper.gobra.translator.util.{FunctionGenerator, MethodGenerator} import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.util.Violation import viper.silver.verifier.{errors => err} @@ -36,6 +36,7 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { sliceFromArrayGenerator.finalize(addMemberFn) sliceFromSliceGenerator.finalize(addMemberFn) nilSliceGenerator.finalize(addMemberFn) + makeMethodGenerator.finalize(addMemberFn) } /** @@ -137,60 +138,19 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { default(super.statement(ctx)) { case makeStmt@in.MakeSlice(target, in.SliceT(typeParam, _), lenArg, optCapArg) => val (pos, info, errT) = makeStmt.vprMeta - val sliceT = in.SliceT(typeParam.withAddressability(Shared), Addressability.Exclusive) - val slice = in.LocalVar(ctx.freshNames.next(), sliceT)(makeStmt.info) - val vprSlice = ctx.variable(slice) - seqn( - for { - // var a [ []T ] - _ <- local(vprSlice) - - capArg = optCapArg.getOrElse(lenArg) - vprLength <- ctx.expression(lenArg) - vprCapacity <- ctx.expression(capArg) - - // Perform additional runtime checks of conditions that must be true when make is invoked, otherwise the program panics (according to the go spec) - // asserts 0 <= [len] && 0 <= [cap] && [len] <= [cap] - runtimeChecks = vu.bigAnd(Vector( - vpr.LeCmp(vpr.IntLit(0)(pos, info, errT), vprLength)(pos, info, errT), // 0 <= len - vpr.LeCmp(vpr.IntLit(0)(pos, info, errT), vprCapacity)(pos, info, errT), // 0 <= cap - vpr.LeCmp(vprLength, vprCapacity)(pos, info, errT) // len <= cap - ))(pos, info, errT) - - exhale = vpr.Exhale(runtimeChecks)(pos, info, errT) - _ <- write(exhale) - _ <- errorT { - case e@err.ExhaleFailed(Source(info), _, _) if e causedBy exhale => ArrayMakePreconditionError(info) - } - - // inhale forall i: int :: {loc(a, i)} 0 <= i && i < [cap] ==> Footprint[ a[i] ] - footprintAssertion <- getCellPerms(ctx)(slice, in.FullPerm(slice.info), SliceBound.Cap) - _ <- write(vpr.Inhale(footprintAssertion)(pos, info, errT)) - - lenExpr = in.Length(slice)(makeStmt.info) - capExpr = in.Capacity(slice)(makeStmt.info) - - // inhale cap(a) == [cap] - eqCap <- ctx.equal(capExpr, capArg)(makeStmt) - _ <- write(vpr.Inhale(eqCap)(pos, info, errT)) - - // inhale len(a) == [len] - eqLen <- ctx.equal(lenExpr, lenArg)(makeStmt) - _ <- write(vpr.Inhale(eqLen)(pos, info, errT)) - - // inhale forall i: int :: {loc(a, i)} 0 <= i && i < [len] ==> [ a[i] == dfltVal(T) ] - eqValueAssertion <- boundedQuant( - bound = vprLength, - trigger = (idx: vpr.LocalVar) => - Seq(vpr.Trigger(Seq(ctx.slice.loc(vprSlice.localVar, idx)(pos, info, errT)))(pos, info, errT)), - body = (x: in.BoundVar) => - ctx.equal(in.IndexedExp(slice, x, sliceT)(makeStmt.info), in.DfltVal(typeParam.withAddressability(Exclusive))(makeStmt.info))(makeStmt) - )(makeStmt)(ctx) - _ <- write(vpr.Inhale(eqValueAssertion)(pos, info, errT)) - - ass <- ctx.assignment(in.Assignee.Var(target), slice)(makeStmt) - } yield ass - ) + for { + len <- ctx.expression(lenArg) + cap <- optCapArg match { + case Some(c) => ctx.expression(c) + case None => unit(len) + } + t = ctx.variable(target) + makeCall = makeMethodGenerator(Vector(len, cap), Vector(t.localVar), typeParam)(pos, info, errT)(ctx) + _ <- errorT { + case e@err.PreconditionInCallFalse(Source(info), _, _) if e causedBy makeCall => + PreconditionError(info) dueTo SliceMakePreconditionFailed(info) + } + } yield makeCall case lit: in.NewSliceLit => val (pos, info, errT) = lit.vprMeta @@ -664,4 +624,70 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { )() } } + + private val makeMethodGenerator: MethodGenerator[in.Type] = new MethodGenerator[in.Type] { + /** + * Generates viper method for making slices with elements of type T: + * + * method makeSliceMethodT(len: Int, cap: Int) returns (res: Slice[Ref]) + * requires 0 <= len + * requires 0 <= cap + * requires len <= cap + * ensures slen(res) == len + * ensures scap(res) == cap + * ensures forall i: Int :: { [ &res[i] ] } 0 <= i && i < cap ==> acc([ &res[i] ], write) + * ensures forall i: Int :: { [ &res[i] ] } 0 <= i && i < len ==> [ res[i] ] == [ dflt(T) ] + * decreases _ + */ + override def genMethod(t: in.Type)(ctx: Context): vpr.Method = { + val tName = Names.serializeType(t) + val lenDecl = vpr.LocalVarDecl("len", vpr.Int)() + val capDecl = vpr.LocalVarDecl("cap", vpr.Int)() + val sliceT = ctx.typ(in.SliceT(t, Addressability.make)) + val result = vpr.LocalVarDecl("res", sliceT)() + val qtfVar = vpr.LocalVarDecl("i", vpr.Int)() + + val dfltValWriter = ctx.expression(in.DfltVal(t.withAddressability(Addressability.Exclusive))(Source.Parser.Internal)) + val dfltVal = pure(dfltValWriter)(ctx).res + + val post1 = vpr.EqCmp(ctx.slice.len(result.localVar)(), lenDecl.localVar)() + val post2 = vpr.EqCmp(ctx.slice.cap(result.localVar)(), capDecl.localVar)() + val post3 = vpr.Forall( + variables = Seq(qtfVar), + triggers = Seq(vpr.Trigger(Seq(ctx.slice.loc(result.localVar, qtfVar.localVar)()))()), + exp = vpr.Implies( + vpr.And(vpr.LeCmp(vpr.IntLit(0)(), qtfVar.localVar)(), vpr.LtCmp(qtfVar.localVar, capDecl.localVar)())(), + vpr.FieldAccessPredicate( + vpr.FieldAccess( + ctx.slice.loc(result.localVar, qtfVar.localVar)(), + ctx.field.field(t.withAddressability(Exclusive))(ctx) + )(), + vpr.FullPerm()())())())() + val post4 = vpr.Forall( + variables = Seq(qtfVar), + triggers = Seq(vpr.Trigger(Seq(ctx.slice.loc(result.localVar, qtfVar.localVar)()))()), + exp = vpr.Implies( + vpr.And(vpr.LeCmp(vpr.IntLit(0)(), qtfVar.localVar)(), vpr.LtCmp(qtfVar.localVar, lenDecl.localVar)())(), + vpr.EqCmp( + vpr.FieldAccess( + ctx.slice.loc(result.localVar, qtfVar.localVar)(), + ctx.field.field(t.withAddressability(Exclusive))(ctx) + )(), + dfltVal + )())())() + vpr.Method( + name = s"makeSliceMethod$tName", + formalArgs = Seq(lenDecl, capDecl), + formalReturns = Seq(result), + pres = Seq( + vpr.LeCmp(vpr.IntLit(0)(), lenDecl.localVar)(), // 0 <= len + vpr.LeCmp(vpr.IntLit(0)(), capDecl.localVar)(), // 0 <= cap + vpr.LeCmp(lenDecl.localVar, capDecl.localVar)(), // len <= cap + synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate") + ), + posts = Seq(post1, post2, post3, post4), + body = None, + )() + } + } } diff --git a/src/main/scala/viper/gobra/translator/util/MethodGenerator.scala b/src/main/scala/viper/gobra/translator/util/MethodGenerator.scala new file mode 100644 index 000000000..2e342e99c --- /dev/null +++ b/src/main/scala/viper/gobra/translator/util/MethodGenerator.scala @@ -0,0 +1,35 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2022 ETH Zurich. + +package viper.gobra.translator.util + +import viper.gobra.translator.library.Generator +import viper.gobra.translator.context.Context +import viper.silver.{ast => vpr} + +trait MethodGenerator[T] extends Generator { + + override def finalize(addMemberFn: vpr.Member => Unit): Unit = generatedMember foreach addMemberFn + + private var generatedMember: List[vpr.Method] = List.empty + private var genMap: Map[T, vpr.Method] = Map.empty + + def genMethod(x: T)(ctx: Context): vpr.Method + + def getMethod(x: T)(ctx: Context): vpr.Method = { + genMap.getOrElse(x, { + val newMethod = genMethod(x)(ctx) + genMap += x -> newMethod + generatedMember ::= newMethod + newMethod + }) + } + + def apply(args: Vector[vpr.Exp], targets: Seq[vpr.LocalVar], x: T)(pos: vpr.Position = vpr.NoPosition, info: vpr.Info = vpr.NoInfo, errT: vpr.ErrorTrafo = vpr.NoTrafos)(ctx: Context): vpr.MethodCall = { + val method = getMethod(x)(ctx) + vpr.MethodCall(method, args, targets)(pos, info, errT) + } +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/make_and_new/make1.gobra b/src/test/resources/regressions/features/make_and_new/make1.gobra index 209d5a541..462b25b9f 100644 --- a/src/test/resources/regressions/features/make_and_new/make1.gobra +++ b/src/test/resources/regressions/features/make_and_new/make1.gobra @@ -5,14 +5,14 @@ package main // Throws an error because length might be negative func Err1(length int) (ret []int) { - //:: ExpectedOutput(make_precondition_error) + //:: ExpectedOutput(precondition_error:make_precondition_error) ret := make([]int, length) } // Throws an error because length is not guaranteed to be less than capacity requires length > 0 && capacity > 0 func Err2(length int, capacity int) (ret []int) { - //:: ExpectedOutput(make_precondition_error) + //:: ExpectedOutput(precondition_error:make_precondition_error) ret := make([]int, length, capacity) } From 2f6bc4dc9f11d3d624f012d22b5ff98829692a09 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Fri, 3 Feb 2023 16:29:03 +0100 Subject: [PATCH 084/296] Updates submodules (#611) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 0e9f12ef3..804d63f5b 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 0e9f12ef35c5e09b59b6f40dca4c3b2093f59752 +Subproject commit 804d63f5bcda1968cce60f493cf9bb7dfc2912ff From 6a8c4a0e6b94e8e92e5b33171fb0d8b746db82bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 6 Feb 2023 11:51:15 +0100 Subject: [PATCH 085/296] mini-cleanup in range desugaring; use ghost eq (#613) --- .../scala/viper/gobra/frontend/Desugar.scala | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index e89e1d776..6350a4bff 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -1031,7 +1031,7 @@ object Desugar { * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0 * var j T = c[0] // [v] * invariant 0 <= i0 && i0 <= len(c) - * invariant i0 < len(c) ==> i0 == i && j == c[i0] // [v] just the j == c[i0] part + * invariant i0 < len(c) ==> i0 == i && j === c[i0] // [v] just the j == c[i0] part * * for i0 < length { * @@ -1084,7 +1084,7 @@ object Desugar { addedInvariantsAfter = (if (hasValue) Vector( in.Implication( in.LessCmp(i0, in.Length(c)(src))(src), - in.ExprAssertion(in.EqCmp(j, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc)) + in.ExprAssertion(in.GhostEqCmp(j, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc)) else Vector()) @@ -1175,7 +1175,7 @@ object Desugar { * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0 * var j T = c[0] // [v] * invariant 0 <= i0 && i0 <= len(c) - * invariant i0 < len(c) ==> i0 == i && j == c[i0] // [v] just the j == c[i0] part + * invariant i0 < len(c) ==> i0 == i && j === c[i0] // [v] just the j == c[i0] part * * for i0 < length { * @@ -1190,9 +1190,9 @@ object Desugar { def desugarArrSliceAssRange(n: PAssForRange, range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for { exp <- goE(range.exp) - (elemType, typ) = underlyingType(exp.typ) match { - case s: in.SliceT => (s.elems, s) - case a: in.ArrayT => (a.elems, a) + typ = underlyingType(exp.typ) match { + case s: in.SliceT => s + case a: in.ArrayT => a case _ => violation("Expected slice or array in for-range statement") } @@ -1223,7 +1223,7 @@ object Desugar { in.ExprAssertion(in.EqCmp(i0, i.op)(src))(src))(src), in.Implication( in.LessCmp(i0, in.Length(c)(src))(src), - in.ExprAssertion(in.EqCmp(j.op, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc)) + in.ExprAssertion(in.GhostEqCmp(j.op, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc)) else Vector( in.Implication( @@ -1344,7 +1344,6 @@ object Desugar { case in.MapT(k, v, _) => (k.withAddressability(Addressability.exclusiveVariable), v.withAddressability(Addressability.exclusiveVariable)) case _ => violation("unexpected type of range expression") } - visType = in.SetT(keyType, Addressability.exclusiveVariable) domain = in.MapKeys(c, underlyingType(exp.typ))(src) @@ -1364,7 +1363,6 @@ object Desugar { (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) - indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) addedInvariants = Vector( in.ExprAssertion(in.AtMostCmp(in.Length(visited.op)(src), in.Length(c)(src))(src))(src), in.ExprAssertion(in.Subset(visited.op, domain)(src))(src)) @@ -1420,11 +1418,10 @@ object Desugar { def desugarMapAssRange(n: PAssForRange, range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for { exp <- goE(range.exp) - (keyType, valType) = underlyingType(exp.typ) match { - case in.MapT(k, v, _) => (k.withAddressability(Addressability.exclusiveVariable), v.withAddressability(Addressability.exclusiveVariable)) + keyType = underlyingType(exp.typ) match { + case in.MapT(k, _, _) => k.withAddressability(Addressability.exclusiveVariable) case _ => violation("unexpected type of range expression") } - visType = in.SetT(keyType, Addressability.exclusiveVariable) c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(src) @@ -1446,7 +1443,6 @@ object Desugar { (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) - indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) addedInvariants = Vector( in.ExprAssertion(in.AtMostCmp(in.Length(visited.op)(src), in.Length(c)(src))(src))(src), in.ExprAssertion(in.Subset(visited.op, domain)(src))(src)) From 45c9532599463bcd6eaecccded4847502eb8555f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 6 Feb 2023 12:55:04 +0100 Subject: [PATCH 086/296] add missing termination measures in box/unbox functions (#614) --- .../library/embeddings/EmbeddingComponent.scala | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/library/embeddings/EmbeddingComponent.scala b/src/main/scala/viper/gobra/translator/library/embeddings/EmbeddingComponent.scala index 4bea05a8a..59f12f64a 100644 --- a/src/main/scala/viper/gobra/translator/library/embeddings/EmbeddingComponent.scala +++ b/src/main/scala/viper/gobra/translator/library/embeddings/EmbeddingComponent.scala @@ -10,6 +10,7 @@ import viper.gobra.translator.Names import viper.gobra.translator.context.Context import viper.gobra.translator.library.Generator import viper.silver.{ast => vpr} +import viper.silver.plugin.standard.termination trait EmbeddingParameter { def serialize: String @@ -81,9 +82,11 @@ object EmbeddingComponent { * function boxNT(x: T): N * requires p(x) * ensures unbox(result) == x + * decreases * * function unboxNT(y: N): T * ensures p(result) && boxN(result) == y + * decreases * * */ private def genTriple(id: P)(ctx: Context): Unit = { @@ -121,7 +124,10 @@ object EmbeddingComponent { name = boxName, formalArgs = Seq(x), typ = N, - pres = Seq(p(x.localVar, id)(ctx)), + pres = Seq( + p(x.localVar, id)(ctx), + synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate") + ), posts = Seq(vpr.EqCmp(unboxApp(vpr.Result(N)()), x.localVar)()), body = None )() @@ -130,7 +136,7 @@ object EmbeddingComponent { name = unboxName, formalArgs = Seq(y), typ = T, - pres = Seq.empty, + pres = Seq(synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate")), posts = Seq(p(vpr.Result(T)(), id)(ctx), vpr.EqCmp(boxApp(vpr.Result(T)()), y.localVar)()), body = None )() @@ -143,4 +149,7 @@ object EmbeddingComponent { genUnboxFuncMap += (id -> unbox) } } + + private def synthesized[T](node: (vpr.Position, vpr.Info, vpr.ErrorTrafo) => T)(comment: String): T = + node(vpr.NoPosition, vpr.SimpleInfo(Seq(comment)), vpr.NoTrafos) } From 1e58c3e85e6418aaefaae7dacf68ce3a836c71a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 6 Feb 2023 13:01:20 +0100 Subject: [PATCH 087/296] Undo #607 (#616) --- .../viper/gobra/reporting/VerifierError.scala | 10 +- .../encodings/slices/SliceEncoding.scala | 138 +++++++----------- .../features/make_and_new/make1.gobra | 4 +- 3 files changed, 63 insertions(+), 89 deletions(-) diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala index a76834da9..858c2f2ae 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierError.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala @@ -269,6 +269,11 @@ case class ImportPreconditionNotEstablished(info: Source.Verifier.Info) extends s"The import precondition might not be established by the initialization code of the imported package" } +case class ArrayMakePreconditionError(info: Source.Verifier.Info) extends VerificationError { + override def localId: String = "make_precondition_error" + override def localMessage: String = s"The provided length might not be smaller or equals to the provided capacity, or length and capacity might not be non-negative" +} + case class ChannelMakePreconditionError(info: Source.Verifier.Info) extends VerificationError { override def localId: String = "make_precondition_error" override def localMessage: String = s"The provided length to ${info.origin.tag.trim} might be negative" @@ -500,11 +505,6 @@ case class SpecNotImplementedByClosure(info: Verifier.Info, closure: String, spe override def message: String = s"$closure might not implement $spec." } -case class SliceMakePreconditionFailed(info: Source.Verifier.Info) extends VerificationErrorReason { - override def id: String = "make_precondition_error" - override def message: String = s"The provided length might not be smaller or equal to the provided capacity, or length or capacity might be negative" -} - sealed trait VerificationErrorClarification { def message: String override def toString: String = message diff --git a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala index 749389ef7..9d3b8c4b0 100644 --- a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala @@ -9,14 +9,14 @@ package viper.gobra.translator.encodings.slices import org.bitbucket.inkytonik.kiama.==> import viper.gobra.ast.{internal => in} import viper.gobra.reporting.BackTranslator.RichErrorMessage -import viper.gobra.reporting.{PreconditionError, SliceMakePreconditionFailed, Source} +import viper.gobra.reporting.{ArrayMakePreconditionError, Source} import viper.gobra.theory.Addressability import viper.gobra.theory.Addressability.{Exclusive, Shared} import viper.gobra.translator.Names import viper.gobra.translator.encodings.arrays.SharedArrayEmbedding import viper.gobra.translator.encodings.combinators.LeafTypeEncoding import viper.gobra.translator.context.Context -import viper.gobra.translator.util.{FunctionGenerator, MethodGenerator} +import viper.gobra.translator.util.FunctionGenerator import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.util.Violation import viper.silver.verifier.{errors => err} @@ -36,7 +36,6 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { sliceFromArrayGenerator.finalize(addMemberFn) sliceFromSliceGenerator.finalize(addMemberFn) nilSliceGenerator.finalize(addMemberFn) - makeMethodGenerator.finalize(addMemberFn) } /** @@ -138,19 +137,60 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { default(super.statement(ctx)) { case makeStmt@in.MakeSlice(target, in.SliceT(typeParam, _), lenArg, optCapArg) => val (pos, info, errT) = makeStmt.vprMeta - for { - len <- ctx.expression(lenArg) - cap <- optCapArg match { - case Some(c) => ctx.expression(c) - case None => unit(len) - } - t = ctx.variable(target) - makeCall = makeMethodGenerator(Vector(len, cap), Vector(t.localVar), typeParam)(pos, info, errT)(ctx) - _ <- errorT { - case e@err.PreconditionInCallFalse(Source(info), _, _) if e causedBy makeCall => - PreconditionError(info) dueTo SliceMakePreconditionFailed(info) - } - } yield makeCall + val sliceT = in.SliceT(typeParam.withAddressability(Shared), Addressability.Exclusive) + val slice = in.LocalVar(ctx.freshNames.next(), sliceT)(makeStmt.info) + val vprSlice = ctx.variable(slice) + seqn( + for { + // var a [ []T ] + _ <- local(vprSlice) + + capArg = optCapArg.getOrElse(lenArg) + vprLength <- ctx.expression(lenArg) + vprCapacity <- ctx.expression(capArg) + + // Perform additional runtime checks of conditions that must be true when make is invoked, otherwise the program panics (according to the go spec) + // asserts 0 <= [len] && 0 <= [cap] && [len] <= [cap] + runtimeChecks = vu.bigAnd(Vector( + vpr.LeCmp(vpr.IntLit(0)(pos, info, errT), vprLength)(pos, info, errT), // 0 <= len + vpr.LeCmp(vpr.IntLit(0)(pos, info, errT), vprCapacity)(pos, info, errT), // 0 <= cap + vpr.LeCmp(vprLength, vprCapacity)(pos, info, errT) // len <= cap + ))(pos, info, errT) + + exhale = vpr.Exhale(runtimeChecks)(pos, info, errT) + _ <- write(exhale) + _ <- errorT { + case e@err.ExhaleFailed(Source(info), _, _) if e causedBy exhale => ArrayMakePreconditionError(info) + } + + // inhale forall i: int :: {loc(a, i)} 0 <= i && i < [cap] ==> Footprint[ a[i] ] + footprintAssertion <- getCellPerms(ctx)(slice, in.FullPerm(slice.info), SliceBound.Cap) + _ <- write(vpr.Inhale(footprintAssertion)(pos, info, errT)) + + lenExpr = in.Length(slice)(makeStmt.info) + capExpr = in.Capacity(slice)(makeStmt.info) + + // inhale cap(a) == [cap] + eqCap <- ctx.equal(capExpr, capArg)(makeStmt) + _ <- write(vpr.Inhale(eqCap)(pos, info, errT)) + + // inhale len(a) == [len] + eqLen <- ctx.equal(lenExpr, lenArg)(makeStmt) + _ <- write(vpr.Inhale(eqLen)(pos, info, errT)) + + // inhale forall i: int :: {loc(a, i)} 0 <= i && i < [len] ==> [ a[i] == dfltVal(T) ] + eqValueAssertion <- boundedQuant( + bound = vprLength, + trigger = (idx: vpr.LocalVar) => + Seq(vpr.Trigger(Seq(ctx.slice.loc(vprSlice.localVar, idx)(pos, info, errT)))(pos, info, errT)), + body = (x: in.BoundVar) => + ctx.equal(in.IndexedExp(slice, x, sliceT)(makeStmt.info), in.DfltVal(typeParam.withAddressability(Exclusive))(makeStmt.info))(makeStmt) + )(makeStmt)(ctx) + _ <- write(vpr.Inhale(eqValueAssertion)(pos, info, errT)) + + ass <- ctx.assignment(in.Assignee.Var(target), slice)(makeStmt) + } yield ass + ) case lit: in.NewSliceLit => val (pos, info, errT) = lit.vprMeta @@ -624,70 +664,4 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { )() } } - - private val makeMethodGenerator: MethodGenerator[in.Type] = new MethodGenerator[in.Type] { - /** - * Generates viper method for making slices with elements of type T: - * - * method makeSliceMethodT(len: Int, cap: Int) returns (res: Slice[Ref]) - * requires 0 <= len - * requires 0 <= cap - * requires len <= cap - * ensures slen(res) == len - * ensures scap(res) == cap - * ensures forall i: Int :: { [ &res[i] ] } 0 <= i && i < cap ==> acc([ &res[i] ], write) - * ensures forall i: Int :: { [ &res[i] ] } 0 <= i && i < len ==> [ res[i] ] == [ dflt(T) ] - * decreases _ - */ - override def genMethod(t: in.Type)(ctx: Context): vpr.Method = { - val tName = Names.serializeType(t) - val lenDecl = vpr.LocalVarDecl("len", vpr.Int)() - val capDecl = vpr.LocalVarDecl("cap", vpr.Int)() - val sliceT = ctx.typ(in.SliceT(t, Addressability.make)) - val result = vpr.LocalVarDecl("res", sliceT)() - val qtfVar = vpr.LocalVarDecl("i", vpr.Int)() - - val dfltValWriter = ctx.expression(in.DfltVal(t.withAddressability(Addressability.Exclusive))(Source.Parser.Internal)) - val dfltVal = pure(dfltValWriter)(ctx).res - - val post1 = vpr.EqCmp(ctx.slice.len(result.localVar)(), lenDecl.localVar)() - val post2 = vpr.EqCmp(ctx.slice.cap(result.localVar)(), capDecl.localVar)() - val post3 = vpr.Forall( - variables = Seq(qtfVar), - triggers = Seq(vpr.Trigger(Seq(ctx.slice.loc(result.localVar, qtfVar.localVar)()))()), - exp = vpr.Implies( - vpr.And(vpr.LeCmp(vpr.IntLit(0)(), qtfVar.localVar)(), vpr.LtCmp(qtfVar.localVar, capDecl.localVar)())(), - vpr.FieldAccessPredicate( - vpr.FieldAccess( - ctx.slice.loc(result.localVar, qtfVar.localVar)(), - ctx.field.field(t.withAddressability(Exclusive))(ctx) - )(), - vpr.FullPerm()())())())() - val post4 = vpr.Forall( - variables = Seq(qtfVar), - triggers = Seq(vpr.Trigger(Seq(ctx.slice.loc(result.localVar, qtfVar.localVar)()))()), - exp = vpr.Implies( - vpr.And(vpr.LeCmp(vpr.IntLit(0)(), qtfVar.localVar)(), vpr.LtCmp(qtfVar.localVar, lenDecl.localVar)())(), - vpr.EqCmp( - vpr.FieldAccess( - ctx.slice.loc(result.localVar, qtfVar.localVar)(), - ctx.field.field(t.withAddressability(Exclusive))(ctx) - )(), - dfltVal - )())())() - vpr.Method( - name = s"makeSliceMethod$tName", - formalArgs = Seq(lenDecl, capDecl), - formalReturns = Seq(result), - pres = Seq( - vpr.LeCmp(vpr.IntLit(0)(), lenDecl.localVar)(), // 0 <= len - vpr.LeCmp(vpr.IntLit(0)(), capDecl.localVar)(), // 0 <= cap - vpr.LeCmp(lenDecl.localVar, capDecl.localVar)(), // len <= cap - synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate") - ), - posts = Seq(post1, post2, post3, post4), - body = None, - )() - } - } } diff --git a/src/test/resources/regressions/features/make_and_new/make1.gobra b/src/test/resources/regressions/features/make_and_new/make1.gobra index 462b25b9f..209d5a541 100644 --- a/src/test/resources/regressions/features/make_and_new/make1.gobra +++ b/src/test/resources/regressions/features/make_and_new/make1.gobra @@ -5,14 +5,14 @@ package main // Throws an error because length might be negative func Err1(length int) (ret []int) { - //:: ExpectedOutput(precondition_error:make_precondition_error) + //:: ExpectedOutput(make_precondition_error) ret := make([]int, length) } // Throws an error because length is not guaranteed to be less than capacity requires length > 0 && capacity > 0 func Err2(length int, capacity int) (ret []int) { - //:: ExpectedOutput(precondition_error:make_precondition_error) + //:: ExpectedOutput(make_precondition_error) ret := make([]int, length, capacity) } From 9a15e1a5535bbc906cbfc2dd76e1d0d0002ff852 Mon Sep 17 00:00:00 2001 From: Nicolas Klose Date: Mon, 6 Feb 2023 14:05:55 +0100 Subject: [PATCH 088/296] Added section on debugging to README. --- README.md | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c0c6760ae..30e6dc3c2 100644 --- a/README.md +++ b/README.md @@ -36,21 +36,41 @@ Gobra can be run either from sbt or from a compiled jar: - running from sbt: 1. change directory to the `gobra` directory obtained from cloning this repository. 2. run `sbt`. - 3. inside the sbt shell, run `run - i path/to/file` (e.g., `run -i src/test/resources/regressions/examples/swap.gobra`) + 3. inside the sbt shell, run `run - i path/to/file` ( + e.g., `run -i src/test/resources/regressions/examples/swap.gobra`) - running from a compiled jar: 1. run `java -jar -Xss128m path/to/gobra.jar -i path/to/file`. -More information about the available options in Gobra can be found by running `run --help` in an sbt shell or `java -jar path/to/gobra.jar --help` if you assembled Gobra. +More information about the available options in Gobra can be found by running `run --help` in an sbt shell +or `java -jar path/to/gobra.jar --help` if you assembled Gobra. ### Running the Tests + In the `gobra` directory, run the command `sbt test`. +### Debugging + +By default, Gobra runs in sbt on a forked VM. This means that simply attaching a debugger to sbt will not work. There +are two workarounds: + +- Run Gobra in a non-forked VM by first running `set fork := false` in sbt. This will allow you to attach a debugger to + sbt normally. However, for unknown reasons, this causes issues with class resolution in the Viper backend, so actually + only the parsing can really be debugged. +- Attach the debugger to the forked VM. By + running `set javaOptions += "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"` in sbt, the forked + VM can be debugged. However, this will require starting the debugger for each run after the VM has started and is + ready for connection. In particular, it may be more difficult to debug early stages. + ## Licensing + Most Gobra sources are licensed under the Mozilla Public License Version 2.0. The [LICENSE](./LICENSE) lists the exceptions to this rule. Note that source files (whenever possible) should list their license in a short header. Continuous integration checks these file headers. -The same checks can be performed locally by running `npx github:viperproject/check-license-header#v1 check --config .github/license-check/config.json --strict` in this repository's root directory. +The same checks can be performed locally by +running `npx github:viperproject/check-license-header#v1 check --config .github/license-check/config.json --strict` in +this repository's root directory. ## Get in touch + Do you still have questions? Open an issue or contact us on [Zulip](https://gobra.zulipchat.com). From 5647db533c8fab15ee28c063e4f0f6454b0edbdc Mon Sep 17 00:00:00 2001 From: Nicolas Klose Date: Mon, 6 Feb 2023 17:29:56 +0100 Subject: [PATCH 089/296] Clarified some stuff --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 30e6dc3c2..b789ea611 100644 --- a/README.md +++ b/README.md @@ -50,16 +50,18 @@ In the `gobra` directory, run the command `sbt test`. ### Debugging -By default, Gobra runs in sbt on a forked VM. This means that simply attaching a debugger to sbt will not work. There +By default, Gobra runs in sbt on a forked JVM. This means that simply attaching a debugger to sbt will not work. There are two workarounds: -- Run Gobra in a non-forked VM by first running `set fork := false` in sbt. This will allow you to attach a debugger to +- Run Gobra in a non-forked JVM by first running `set fork := false` in sbt. This will allow you to attach a debugger to sbt normally. However, for unknown reasons, this causes issues with class resolution in the Viper backend, so actually only the parsing can really be debugged. -- Attach the debugger to the forked VM. By - running `set javaOptions += "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"` in sbt, the forked - VM can be debugged. However, this will require starting the debugger for each run after the VM has started and is - ready for connection. In particular, it may be more difficult to debug early stages. +- Attach the debugger to the forked JVM. + Run `set javaOptions += "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"` + in sbt (use any port you like, just make sure to use the same one in the debugger). Now, the forked JVM can be + debugged + instead of the sbt JVM. This requires starting the debugger again every time a new VM is created, e.g. for + every `run`. ## Licensing From cc21298266cd73d6301b2a292fd8e5705de985ab Mon Sep 17 00:00:00 2001 From: Nicolas Klose Date: Mon, 6 Feb 2023 17:32:57 +0100 Subject: [PATCH 090/296] Reverted accidental formatting. --- README.md | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b789ea611..45e1c5298 100644 --- a/README.md +++ b/README.md @@ -36,20 +36,16 @@ Gobra can be run either from sbt or from a compiled jar: - running from sbt: 1. change directory to the `gobra` directory obtained from cloning this repository. 2. run `sbt`. - 3. inside the sbt shell, run `run - i path/to/file` ( - e.g., `run -i src/test/resources/regressions/examples/swap.gobra`) + 3. inside the sbt shell, run `run - i path/to/file` (e.g., `run -i src/test/resources/regressions/examples/swap.gobra`) - running from a compiled jar: 1. run `java -jar -Xss128m path/to/gobra.jar -i path/to/file`. -More information about the available options in Gobra can be found by running `run --help` in an sbt shell -or `java -jar path/to/gobra.jar --help` if you assembled Gobra. +More information about the available options in Gobra can be found by running `run --help` in an sbt shell or `java -jar path/to/gobra.jar --help` if you assembled Gobra. ### Running the Tests - In the `gobra` directory, run the command `sbt test`. ### Debugging - By default, Gobra runs in sbt on a forked JVM. This means that simply attaching a debugger to sbt will not work. There are two workarounds: @@ -64,15 +60,11 @@ are two workarounds: every `run`. ## Licensing - Most Gobra sources are licensed under the Mozilla Public License Version 2.0. The [LICENSE](./LICENSE) lists the exceptions to this rule. Note that source files (whenever possible) should list their license in a short header. Continuous integration checks these file headers. -The same checks can be performed locally by -running `npx github:viperproject/check-license-header#v1 check --config .github/license-check/config.json --strict` in -this repository's root directory. +The same checks can be performed locally by running `npx github:viperproject/check-license-header#v1 check --config .github/license-check/config.json --strict` in this repository's root directory. ## Get in touch - Do you still have questions? Open an issue or contact us on [Zulip](https://gobra.zulipchat.com). From 64122cf383cf1a96af899ef514cddb3731b43c26 Mon Sep 17 00:00:00 2001 From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com> Date: Tue, 7 Feb 2023 18:18:03 +0100 Subject: [PATCH 091/296] let expression support (#618) * stuff * working? * parenthesis in let pretty printing * tests * remove change from dflttranslatorconfig * remove shit * ghost * Update src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> * Update src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> --------- Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> --- src/main/antlr4/GobraLexer.g4 | 1 + src/main/antlr4/GobraParser.g4 | 1 + .../java/viper/gobra/frontend/GobraLexer.java | 1164 ++++---- .../viper/gobra/frontend/GobraParser.java | 2634 +++++++++-------- .../frontend/GobraParserBaseVisitor.java | 10 +- .../gobra/frontend/GobraParserVisitor.java | 10 +- .../scala/viper/gobra/ast/frontend/Ast.scala | 4 + .../gobra/ast/frontend/PrettyPrinter.scala | 1 + .../gobra/ast/internal/PrettyPrinter.scala | 2 + .../viper/gobra/ast/internal/Program.scala | 4 + .../scala/viper/gobra/frontend/Desugar.scala | 8 + .../gobra/frontend/ParseTreeTranslator.scala | 6 + .../typing/ghost/GhostExprTyping.scala | 6 + .../typeless/AssertionEncoding.scala | 7 + .../regressions/features/let/let_fail1.gobra | 29 + .../regressions/features/let/let_simple.gobra | 34 + 16 files changed, 2036 insertions(+), 1885 deletions(-) create mode 100644 src/test/resources/regressions/features/let/let_fail1.gobra create mode 100644 src/test/resources/regressions/features/let/let_simple.gobra diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4 index 03c45f0cb..bdd27a857 100644 --- a/src/main/antlr4/GobraLexer.g4 +++ b/src/main/antlr4/GobraLexer.g4 @@ -40,6 +40,7 @@ ACCESS : 'acc' -> mode(NLSEMI); FOLD : 'fold'; UNFOLD : 'unfold'; UNFOLDING : 'unfolding'; +LET : 'let'; GHOST : 'ghost'; IN : 'in'; MULTI : '#'; diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index a276969f4..3f08a2fcb 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -306,6 +306,7 @@ expression: | expression IMPLIES expression #implication | expression QMARK expression COLON expression #ternaryExpr | UNFOLDING predicateAccess IN expression #unfolding + | LET shortVarDecl IN expression #let | (FORALL | EXISTS) boundVariables COLON COLON triggers expression #quantification ; diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index de38da7fc..0d4c2dd0e 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,4 +1,3 @@ -// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -11,7 +10,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class GobraLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -20,29 +19,29 @@ public class GobraLexer extends Lexer { FLOAT_LIT=1, DECIMAL_FLOAT_LIT=2, TRUE=3, FALSE=4, ASSERT=5, ASSUME=6, INHALE=7, EXHALE=8, PRE=9, PRESERVES=10, POST=11, INV=12, DEC=13, PURE=14, IMPL=15, AS=16, OLD=17, BEFORE=18, LHS=19, FORALL=20, EXISTS=21, ACCESS=22, - FOLD=23, UNFOLD=24, UNFOLDING=25, GHOST=26, IN=27, MULTI=28, SUBSET=29, - UNION=30, INTERSECTION=31, SETMINUS=32, IMPLIES=33, WAND=34, APPLY=35, - QMARK=36, L_PRED=37, R_PRED=38, SEQ=39, SET=40, MSET=41, DICT=42, OPT=43, - LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, ADT=52, - MATCH=53, NONE=54, PRED=55, TYPE_OF=56, IS_COMPARABLE=57, SHARE=58, ADDR_MOD=59, - DOT_DOT=60, SHARED=61, EXCLUSIVE=62, PREDICATE=63, WRITEPERM=64, NOPERM=65, - TRUSTED=66, OUTLINE=67, INIT_POST=68, IMPORT_PRE=69, PROOF=70, GHOST_EQUALS=71, - GHOST_NOT_EQUALS=72, WITH=73, BREAK=74, DEFAULT=75, FUNC=76, INTERFACE=77, - SELECT=78, CASE=79, DEFER=80, GO=81, MAP=82, STRUCT=83, CHAN=84, ELSE=85, - GOTO=86, PACKAGE=87, SWITCH=88, CONST=89, FALLTHROUGH=90, IF=91, RANGE=92, - TYPE=93, CONTINUE=94, FOR=95, IMPORT=96, RETURN=97, VAR=98, NIL_LIT=99, - IDENTIFIER=100, L_PAREN=101, R_PAREN=102, L_CURLY=103, R_CURLY=104, L_BRACKET=105, - R_BRACKET=106, ASSIGN=107, COMMA=108, SEMI=109, COLON=110, DOT=111, PLUS_PLUS=112, - MINUS_MINUS=113, DECLARE_ASSIGN=114, ELLIPSIS=115, LOGICAL_OR=116, LOGICAL_AND=117, - EQUALS=118, NOT_EQUALS=119, LESS=120, LESS_OR_EQUALS=121, GREATER=122, - GREATER_OR_EQUALS=123, OR=124, DIV=125, MOD=126, LSHIFT=127, RSHIFT=128, - BIT_CLEAR=129, EXCLAMATION=130, PLUS=131, MINUS=132, CARET=133, STAR=134, - AMPERSAND=135, RECEIVE=136, DECIMAL_LIT=137, BINARY_LIT=138, OCTAL_LIT=139, - HEX_LIT=140, HEX_FLOAT_LIT=141, IMAGINARY_LIT=142, RUNE_LIT=143, BYTE_VALUE=144, - OCTAL_BYTE_VALUE=145, HEX_BYTE_VALUE=146, LITTLE_U_VALUE=147, BIG_U_VALUE=148, - RAW_STRING_LIT=149, INTERPRETED_STRING_LIT=150, WS=151, COMMENT=152, TERMINATOR=153, - LINE_COMMENT=154, WS_NLSEMI=155, COMMENT_NLSEMI=156, LINE_COMMENT_NLSEMI=157, - EOS=158, OTHER=159; + FOLD=23, UNFOLD=24, UNFOLDING=25, LET=26, GHOST=27, IN=28, MULTI=29, SUBSET=30, + UNION=31, INTERSECTION=32, SETMINUS=33, IMPLIES=34, WAND=35, APPLY=36, + QMARK=37, L_PRED=38, R_PRED=39, SEQ=40, SET=41, MSET=42, DICT=43, OPT=44, + LEN=45, NEW=46, MAKE=47, CAP=48, SOME=49, GET=50, DOM=51, AXIOM=52, ADT=53, + MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, SHARE=59, ADDR_MOD=60, + DOT_DOT=61, SHARED=62, EXCLUSIVE=63, PREDICATE=64, WRITEPERM=65, NOPERM=66, + TRUSTED=67, OUTLINE=68, INIT_POST=69, IMPORT_PRE=70, PROOF=71, GHOST_EQUALS=72, + GHOST_NOT_EQUALS=73, WITH=74, BREAK=75, DEFAULT=76, FUNC=77, INTERFACE=78, + SELECT=79, CASE=80, DEFER=81, GO=82, MAP=83, STRUCT=84, CHAN=85, ELSE=86, + GOTO=87, PACKAGE=88, SWITCH=89, CONST=90, FALLTHROUGH=91, IF=92, RANGE=93, + TYPE=94, CONTINUE=95, FOR=96, IMPORT=97, RETURN=98, VAR=99, NIL_LIT=100, + IDENTIFIER=101, L_PAREN=102, R_PAREN=103, L_CURLY=104, R_CURLY=105, L_BRACKET=106, + R_BRACKET=107, ASSIGN=108, COMMA=109, SEMI=110, COLON=111, DOT=112, PLUS_PLUS=113, + MINUS_MINUS=114, DECLARE_ASSIGN=115, ELLIPSIS=116, LOGICAL_OR=117, LOGICAL_AND=118, + EQUALS=119, NOT_EQUALS=120, LESS=121, LESS_OR_EQUALS=122, GREATER=123, + GREATER_OR_EQUALS=124, OR=125, DIV=126, MOD=127, LSHIFT=128, RSHIFT=129, + BIT_CLEAR=130, EXCLAMATION=131, PLUS=132, MINUS=133, CARET=134, STAR=135, + AMPERSAND=136, RECEIVE=137, DECIMAL_LIT=138, BINARY_LIT=139, OCTAL_LIT=140, + HEX_LIT=141, HEX_FLOAT_LIT=142, IMAGINARY_LIT=143, RUNE_LIT=144, BYTE_VALUE=145, + OCTAL_BYTE_VALUE=146, HEX_BYTE_VALUE=147, LITTLE_U_VALUE=148, BIG_U_VALUE=149, + RAW_STRING_LIT=150, INTERPRETED_STRING_LIT=151, WS=152, COMMENT=153, TERMINATOR=154, + LINE_COMMENT=155, WS_NLSEMI=156, COMMENT_NLSEMI=157, LINE_COMMENT_NLSEMI=158, + EOS=159, OTHER=160; public static final int NLSEMI=1; public static String[] channelNames = { @@ -58,28 +57,29 @@ private static String[] makeRuleNames() { "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "TRUE", "FALSE", "ASSERT", "ASSUME", "INHALE", "EXHALE", "PRE", "PRESERVES", "POST", "INV", "DEC", "PURE", "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", "FOLD", - "UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", - "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", - "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", - "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", - "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", - "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", - "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", - "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", - "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", - "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", - "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", - "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", - "ELLIPSIS", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", - "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", "OR", "DIV", "MOD", - "LSHIFT", "RSHIFT", "BIT_CLEAR", "EXCLAMATION", "PLUS", "MINUS", "CARET", - "STAR", "AMPERSAND", "RECEIVE", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", - "HEX_LIT", "HEX_FLOAT_LIT", "HEX_MANTISSA", "HEX_EXPONENT", "IMAGINARY_LIT", - "RUNE", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", - "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", - "WS", "COMMENT", "TERMINATOR", "LINE_COMMENT", "UNICODE_VALUE", "ESCAPED_VALUE", - "DECIMALS", "OCTAL_DIGIT", "HEX_DIGIT", "BIN_DIGIT", "EXPONENT", "LETTER", - "UNICODE_DIGIT", "UNICODE_LETTER", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", + "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", "UNION", + "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", + "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", + "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", + "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", + "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", + "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", + "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", + "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", + "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", + "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", + "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", + "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR", + "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", + "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", + "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE", + "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "HEX_FLOAT_LIT", + "HEX_MANTISSA", "HEX_EXPONENT", "IMAGINARY_LIT", "RUNE", "RUNE_LIT", + "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", + "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", + "TERMINATOR", "LINE_COMMENT", "UNICODE_VALUE", "ESCAPED_VALUE", "DECIMALS", + "OCTAL_DIGIT", "HEX_DIGIT", "BIN_DIGIT", "EXPONENT", "LETTER", "UNICODE_DIGIT", + "UNICODE_LETTER", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", "EOS", "OTHER" }; } @@ -91,21 +91,21 @@ private static String[] makeLiteralNames() { "'exhale'", "'requires'", "'preserves'", "'ensures'", "'invariant'", "'decreases'", "'pure'", "'implements'", "'as'", "'old'", "'before'", "'#lhs'", "'forall'", "'exists'", "'acc'", "'fold'", "'unfold'", "'unfolding'", - "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'", - "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'", - "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'", - "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", "'none'", - "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", - "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", - "'outline'", "'initEnsures'", "'importRequires'", "'proof'", "'==='", - "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", "'select'", - "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", "'else'", - "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", "'if'", - "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'", - "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", - "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", - "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", - "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" + "'let'", "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", + "'setminus'", "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", + "'set'", "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", + "'cap'", "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", + "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", + "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", + "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", + "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", + "'select'", "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", + "'else'", "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", + "'if'", "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", + "'var'", "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", + "','", "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", + "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", + "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -114,27 +114,27 @@ private static String[] makeSymbolicNames() { null, "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "TRUE", "FALSE", "ASSERT", "ASSUME", "INHALE", "EXHALE", "PRE", "PRESERVES", "POST", "INV", "DEC", "PURE", "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", "FOLD", - "UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", - "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", - "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", - "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", - "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", - "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", - "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", - "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", - "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", - "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", - "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", - "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", - "ELLIPSIS", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", - "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", "OR", "DIV", "MOD", - "LSHIFT", "RSHIFT", "BIT_CLEAR", "EXCLAMATION", "PLUS", "MINUS", "CARET", - "STAR", "AMPERSAND", "RECEIVE", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", - "HEX_LIT", "HEX_FLOAT_LIT", "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", - "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", "BIG_U_VALUE", - "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", "TERMINATOR", - "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", - "EOS", "OTHER" + "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", "UNION", + "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", + "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", + "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", + "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", + "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", + "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", + "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", + "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", + "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", + "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", + "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", + "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR", + "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", + "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", + "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE", + "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "HEX_FLOAT_LIT", + "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", + "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", + "WS", "COMMENT", "TERMINATOR", "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI", + "LINE_COMMENT_NLSEMI", "EOS", "OTHER" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -214,7 +214,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a1\u05d5\b\1\b"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a2\u05db\b\1\b"+ "\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n"+ "\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21"+ "\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30"+ @@ -238,111 +238,112 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+ "\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+ "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad"+ - "\t\u00ad\3\2\3\2\5\2\u015f\n\2\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0167\n\3\3"+ - "\3\5\3\u016a\n\3\3\3\5\3\u016d\n\3\3\3\3\3\3\3\3\3\5\3\u0173\n\3\5\3\u0175"+ - "\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3"+ - "\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b"+ - "\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3"+ - "\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3"+ - "\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16"+ - "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17"+ - "\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21"+ - "\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23"+ - "\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25"+ - "\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27"+ - "\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32"+ - "\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33"+ - "\3\34\3\34\3\34\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37"+ - "\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3"+ - "!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3"+ - "&\3&\3&\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*"+ - "\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-"+ - "\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60"+ - "\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62"+ - "\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64"+ - "\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66"+ - "\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\3"+ - "8\39\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3:\3"+ - ":\3:\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3"+ - "?\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3"+ - "A\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3"+ - "C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3E\3"+ - "E\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3H\3"+ - "H\3H\3H\3I\3I\3I\3I\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3"+ - "L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3"+ - "O\3O\3O\3O\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3S\3S\3S\3S\3T\3"+ - "T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3X\3X\3"+ - "X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3"+ - "[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3]\3]\3]\3]\3]\3]\3^\3^\3^\3"+ - "^\3^\3_\3_\3_\3_\3_\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3"+ - "a\3b\3b\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3d\3d\3d\3d\3d\3d\3e\3e\3e\7"+ - "e\u0420\ne\fe\16e\u0423\13e\3e\3e\3f\3f\3g\3g\3g\3g\3h\3h\3i\3i\3i\3i"+ - "\3j\3j\3k\3k\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3p\3p\3q\3q\3q\3q\3q\3r\3r"+ - "\3r\3r\3r\3s\3s\3s\3t\3t\3t\3t\3u\3u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3x\3y"+ - "\3y\3z\3z\3z\3{\3{\3|\3|\3|\3}\3}\3~\3~\3\177\3\177\3\u0080\3\u0080\3"+ - "\u0080\3\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083"+ - "\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088"+ - "\3\u0088\3\u0089\3\u0089\3\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u048b"+ - "\n\u008a\3\u008a\7\u008a\u048e\n\u008a\f\u008a\16\u008a\u0491\13\u008a"+ - "\5\u008a\u0493\n\u008a\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\5\u008b"+ - "\u049a\n\u008b\3\u008b\6\u008b\u049d\n\u008b\r\u008b\16\u008b\u049e\3"+ - "\u008b\3\u008b\3\u008c\3\u008c\5\u008c\u04a5\n\u008c\3\u008c\5\u008c\u04a8"+ - "\n\u008c\3\u008c\6\u008c\u04ab\n\u008c\r\u008c\16\u008c\u04ac\3\u008c"+ - "\3\u008c\3\u008d\3\u008d\3\u008d\5\u008d\u04b4\n\u008d\3\u008d\6\u008d"+ - "\u04b7\n\u008d\r\u008d\16\u008d\u04b8\3\u008d\3\u008d\3\u008e\3\u008e"+ - "\3\u008e\3\u008e\3\u008e\3\u008f\5\u008f\u04c3\n\u008f\3\u008f\6\u008f"+ - "\u04c6\n\u008f\r\u008f\16\u008f\u04c7\3\u008f\3\u008f\5\u008f\u04cc\n"+ - "\u008f\3\u008f\7\u008f\u04cf\n\u008f\f\u008f\16\u008f\u04d2\13\u008f\5"+ - "\u008f\u04d4\n\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u04d9\n\u008f\3\u008f"+ - "\7\u008f\u04dc\n\u008f\f\u008f\16\u008f\u04df\13\u008f\5\u008f\u04e1\n"+ - "\u008f\3\u0090\3\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091"+ - "\3\u0091\5\u0091\u04ec\n\u0091\3\u0091\3\u0091\3\u0091\3\u0091\3\u0092"+ - "\3\u0092\3\u0092\5\u0092\u04f5\n\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+ - "\3\u0093\3\u0093\3\u0094\3\u0094\5\u0094\u04ff\n\u0094\3\u0095\3\u0095"+ - "\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097"+ - "\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098"+ - "\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099"+ - "\3\u0099\7\u0099\u051f\n\u0099\f\u0099\16\u0099\u0522\13\u0099\3\u0099"+ - "\3\u0099\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\7\u009a\u052b\n\u009a"+ - "\f\u009a\16\u009a\u052e\13\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009b"+ - "\6\u009b\u0535\n\u009b\r\u009b\16\u009b\u0536\3\u009b\3\u009b\3\u009c"+ - "\3\u009c\3\u009c\3\u009c\7\u009c\u053f\n\u009c\f\u009c\16\u009c\u0542"+ - "\13\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d\6\u009d\u054a"+ - "\n\u009d\r\u009d\16\u009d\u054b\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e"+ - "\3\u009e\7\u009e\u0554\n\u009e\f\u009e\16\u009e\u0557\13\u009e\3\u009e"+ - "\3\u009e\3\u009f\3\u009f\3\u009f\3\u009f\5\u009f\u055f\n\u009f\3\u00a0"+ - "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+ - "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0"+ - "\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u057b"+ - "\n\u00a0\3\u00a1\3\u00a1\5\u00a1\u057f\n\u00a1\3\u00a1\7\u00a1\u0582\n"+ - "\u00a1\f\u00a1\16\u00a1\u0585\13\u00a1\3\u00a2\3\u00a2\3\u00a3\3\u00a3"+ - "\3\u00a4\3\u00a4\3\u00a5\3\u00a5\5\u00a5\u058f\n\u00a5\3\u00a5\3\u00a5"+ - "\3\u00a6\3\u00a6\5\u00a6\u0595\n\u00a6\3\u00a7\3\u00a7\3\u00a8\3\u00a8"+ - "\3\u00a9\6\u00a9\u059c\n\u00a9\r\u00a9\16\u00a9\u059d\3\u00a9\3\u00a9"+ - "\3\u00aa\3\u00aa\3\u00aa\3\u00aa\7\u00aa\u05a6\n\u00aa\f\u00aa\16\u00aa"+ - "\u05a9\13\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab"+ - "\3\u00ab\3\u00ab\7\u00ab\u05b4\n\u00ab\f\u00ab\16\u00ab\u05b7\13\u00ab"+ - "\3\u00ab\3\u00ab\3\u00ac\6\u00ac\u05bc\n\u00ac\r\u00ac\16\u00ac\u05bd"+ - "\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\7\u00ac\u05c5\n\u00ac\f\u00ac"+ - "\16\u00ac\u05c8\13\u00ac\3\u00ac\3\u00ac\3\u00ac\5\u00ac\u05cd\n\u00ac"+ - "\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad\3\u00ad\5\u0540\u05a7"+ - "\u05c6\2\u00ae\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16"+ - "\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\34"+ - "8\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65"+ - "j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008c"+ - "G\u008eH\u0090I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0"+ - "Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4"+ - "[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8"+ - "e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dc"+ - "o\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0"+ - "y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081"+ - "\u0102\u0082\u0104\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087"+ - "\u010e\u0088\u0110\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d"+ - "\u011a\u008e\u011c\u008f\u011e\2\u0120\2\u0122\u0090\u0124\2\u0126\u0091"+ - "\u0128\u0092\u012a\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097"+ - "\u0134\u0098\u0136\u0099\u0138\u009a\u013a\u009b\u013c\u009c\u013e\2\u0140"+ - "\2\u0142\2\u0144\2\u0146\2\u0148\2\u014a\2\u014c\2\u014e\2\u0150\2\u0152"+ - "\u009d\u0154\u009e\u0156\u009f\u0158\u00a0\u015a\u00a1\4\2\3\23\3\2\63"+ + "\t\u00ad\4\u00ae\t\u00ae\3\2\3\2\5\2\u0161\n\2\3\2\3\2\3\3\3\3\3\3\3\3"+ + "\5\3\u0169\n\3\3\3\5\3\u016c\n\3\3\3\5\3\u016f\n\3\3\3\3\3\3\3\3\3\5\3"+ + "\u0175\n\3\5\3\u0177\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3"+ + "\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+ + "\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3"+ + "\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+ + "\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3"+ + "\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17"+ + "\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+ + "\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23"+ + "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25"+ + "\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27"+ + "\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31"+ + "\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33"+ + "\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\37"+ + "\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!"+ + "\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$"+ + "\3$\3$\3$\3%\3%\3%\3%\3%\3%\3&\3&\3\'\3\'\3\'\3(\3(\3(\3(\3(\3)\3)\3)"+ + "\3)\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,"+ + "\3-\3-\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3\60\3"+ + "\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3"+ + "\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3"+ + "\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3"+ + "\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3"+ + "8\38\38\38\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;\3;\3"+ + ";\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3"+ + ">\3>\3>\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3"+ + "A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3"+ + "C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3"+ + "F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+ + "G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3J\3J\3J\3J\3K\3K\3K\3K\3K\3"+ + "L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3"+ + "O\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3"+ + "R\3R\3R\3S\3S\3S\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3"+ + "W\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3"+ + "Z\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3"+ + "\\\3\\\3]\3]\3]\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`"+ + "\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3c"+ + "\3c\3d\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\7f\u0426\nf\ff\16f\u0429\13"+ + "f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3i\3j\3j\3j\3j\3k\3k\3l\3l\3l\3l\3m\3m\3"+ + "n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3t\3t\3t\3u\3u\3"+ + "u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3x\3y\3y\3y\3z\3z\3{\3{\3{\3|\3|\3}\3}\3"+ + "}\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0082\3"+ + "\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085"+ + "\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u008a"+ + "\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\5\u008b\u0491\n\u008b\3\u008b"+ + "\7\u008b\u0494\n\u008b\f\u008b\16\u008b\u0497\13\u008b\5\u008b\u0499\n"+ + "\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\5\u008c\u04a0\n\u008c\3"+ + "\u008c\6\u008c\u04a3\n\u008c\r\u008c\16\u008c\u04a4\3\u008c\3\u008c\3"+ + "\u008d\3\u008d\5\u008d\u04ab\n\u008d\3\u008d\5\u008d\u04ae\n\u008d\3\u008d"+ + "\6\u008d\u04b1\n\u008d\r\u008d\16\u008d\u04b2\3\u008d\3\u008d\3\u008e"+ + "\3\u008e\3\u008e\5\u008e\u04ba\n\u008e\3\u008e\6\u008e\u04bd\n\u008e\r"+ + "\u008e\16\u008e\u04be\3\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f"+ + "\3\u008f\3\u0090\5\u0090\u04c9\n\u0090\3\u0090\6\u0090\u04cc\n\u0090\r"+ + "\u0090\16\u0090\u04cd\3\u0090\3\u0090\5\u0090\u04d2\n\u0090\3\u0090\7"+ + "\u0090\u04d5\n\u0090\f\u0090\16\u0090\u04d8\13\u0090\5\u0090\u04da\n\u0090"+ + "\3\u0090\3\u0090\3\u0090\5\u0090\u04df\n\u0090\3\u0090\7\u0090\u04e2\n"+ + "\u0090\f\u0090\16\u0090\u04e5\13\u0090\5\u0090\u04e7\n\u0090\3\u0091\3"+ + "\u0091\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\5\u0092"+ + "\u04f2\n\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\3\u0093"+ + "\5\u0093\u04fb\n\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094"+ + "\3\u0095\3\u0095\5\u0095\u0505\n\u0095\3\u0096\3\u0096\3\u0096\3\u0096"+ + "\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098"+ + "\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+ + "\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u009a\3\u009a\7\u009a"+ + "\u0525\n\u009a\f\u009a\16\u009a\u0528\13\u009a\3\u009a\3\u009a\3\u009a"+ + "\3\u009a\3\u009b\3\u009b\3\u009b\7\u009b\u0531\n\u009b\f\u009b\16\u009b"+ + "\u0534\13\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009c\6\u009c\u053b"+ + "\n\u009c\r\u009c\16\u009c\u053c\3\u009c\3\u009c\3\u009d\3\u009d\3\u009d"+ + "\3\u009d\7\u009d\u0545\n\u009d\f\u009d\16\u009d\u0548\13\u009d\3\u009d"+ + "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\6\u009e\u0550\n\u009e\r\u009e"+ + "\16\u009e\u0551\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u009f\7\u009f"+ + "\u055a\n\u009f\f\u009f\16\u009f\u055d\13\u009f\3\u009f\3\u009f\3\u00a0"+ + "\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u0565\n\u00a0\3\u00a1\3\u00a1\3\u00a1"+ + "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ + "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ + "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\5\u00a1\u0581\n\u00a1\3\u00a2"+ + "\3\u00a2\5\u00a2\u0585\n\u00a2\3\u00a2\7\u00a2\u0588\n\u00a2\f\u00a2\16"+ + "\u00a2\u058b\13\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a5\3\u00a5"+ + "\3\u00a6\3\u00a6\5\u00a6\u0595\n\u00a6\3\u00a6\3\u00a6\3\u00a7\3\u00a7"+ + "\5\u00a7\u059b\n\u00a7\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00aa\6\u00aa"+ + "\u05a2\n\u00aa\r\u00aa\16\u00aa\u05a3\3\u00aa\3\u00aa\3\u00ab\3\u00ab"+ + "\3\u00ab\3\u00ab\7\u00ab\u05ac\n\u00ab\f\u00ab\16\u00ab\u05af\13\u00ab"+ + "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac"+ + "\7\u00ac\u05ba\n\u00ac\f\u00ac\16\u00ac\u05bd\13\u00ac\3\u00ac\3\u00ac"+ + "\3\u00ad\6\u00ad\u05c2\n\u00ad\r\u00ad\16\u00ad\u05c3\3\u00ad\3\u00ad"+ + "\3\u00ad\3\u00ad\3\u00ad\7\u00ad\u05cb\n\u00ad\f\u00ad\16\u00ad\u05ce"+ + "\13\u00ad\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u05d3\n\u00ad\3\u00ad\3\u00ad"+ + "\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\5\u0546\u05ad\u05cc\2\u00af\4"+ + "\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21"+ + "\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!"+ + "B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:"+ + "t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090"+ + "I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4"+ + "S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8"+ + "]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00cc"+ + "g\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0"+ + "q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4"+ + "{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104"+ + "\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110"+ + "\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d\u011a\u008e\u011c"+ + "\u008f\u011e\u0090\u0120\2\u0122\2\u0124\u0091\u0126\2\u0128\u0092\u012a"+ + "\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136"+ + "\u0099\u0138\u009a\u013a\u009b\u013c\u009c\u013e\u009d\u0140\2\u0142\2"+ + "\u0144\2\u0146\2\u0148\2\u014a\2\u014c\2\u014e\2\u0150\2\u0152\2\u0154"+ + "\u009e\u0156\u009f\u0158\u00a0\u015a\u00a1\u015c\u00a2\4\2\3\23\3\2\63"+ ";\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13"+ "\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5"+ "\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb"+ @@ -486,7 +487,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e"+ "\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7"+ "\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4"+ - "\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802\4\ufa1f\4\u0600\2\4\3\2\2\2\2\6"+ + "\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802\4\ufa1f\4\u0606\2\4\3\2\2\2\2\6"+ "\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2"+ "\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34"+ "\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2("+ @@ -514,398 +515,399 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2\2\2\u0102\3\2\2\2\2\u0104\3\2\2"+ "\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a\3\2\2\2\2\u010c\3\2\2\2\2\u010e"+ "\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2\2\2\u0114\3\2\2\2\2\u0116\3\2\2"+ - "\2\2\u0118\3\2\2\2\2\u011a\3\2\2\2\2\u011c\3\2\2\2\2\u0122\3\2\2\2\2\u0126"+ + "\2\2\u0118\3\2\2\2\2\u011a\3\2\2\2\2\u011c\3\2\2\2\2\u011e\3\2\2\2\2\u0124"+ "\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2\2\2\u012c\3\2\2\2\2\u012e\3\2\2"+ "\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134\3\2\2\2\2\u0136\3\2\2\2\2\u0138"+ - "\3\2\2\2\2\u013a\3\2\2\2\2\u013c\3\2\2\2\3\u0152\3\2\2\2\3\u0154\3\2\2"+ - "\2\3\u0156\3\2\2\2\3\u0158\3\2\2\2\3\u015a\3\2\2\2\4\u015e\3\2\2\2\6\u0174"+ - "\3\2\2\2\b\u0176\3\2\2\2\n\u017d\3\2\2\2\f\u0185\3\2\2\2\16\u018c\3\2"+ - "\2\2\20\u0193\3\2\2\2\22\u019a\3\2\2\2\24\u01a1\3\2\2\2\26\u01aa\3\2\2"+ - "\2\30\u01b4\3\2\2\2\32\u01bc\3\2\2\2\34\u01c6\3\2\2\2\36\u01d2\3\2\2\2"+ - " \u01d9\3\2\2\2\"\u01e4\3\2\2\2$\u01e7\3\2\2\2&\u01ed\3\2\2\2(\u01f6\3"+ - "\2\2\2*\u01fb\3\2\2\2,\u0202\3\2\2\2.\u0209\3\2\2\2\60\u020f\3\2\2\2\62"+ - "\u0214\3\2\2\2\64\u021b\3\2\2\2\66\u0225\3\2\2\28\u022b\3\2\2\2:\u022e"+ - "\3\2\2\2<\u0230\3\2\2\2>\u0237\3\2\2\2@\u023d\3\2\2\2B\u024a\3\2\2\2D"+ - "\u0253\3\2\2\2F\u0257\3\2\2\2H\u025b\3\2\2\2J\u0261\3\2\2\2L\u0263\3\2"+ - "\2\2N\u0266\3\2\2\2P\u026b\3\2\2\2R\u0271\3\2\2\2T\u0277\3\2\2\2V\u027e"+ - "\3\2\2\2X\u0285\3\2\2\2Z\u028e\3\2\2\2\\\u0294\3\2\2\2^\u029a\3\2\2\2"+ - "`\u02a1\3\2\2\2b\u02a7\3\2\2\2d\u02ae\3\2\2\2f\u02b4\3\2\2\2h\u02bd\3"+ - "\2\2\2j\u02c5\3\2\2\2l\u02cb\3\2\2\2n\u02d3\3\2\2\2p\u02da\3\2\2\2r\u02df"+ - "\3\2\2\2t\u02e8\3\2\2\2v\u02f7\3\2\2\2x\u02fd\3\2\2\2z\u0301\3\2\2\2|"+ - "\u0304\3\2\2\2~\u030b\3\2\2\2\u0080\u0315\3\2\2\2\u0082\u031f\3\2\2\2"+ - "\u0084\u032b\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u033e\3\2\2\2\u008a\u0346"+ - "\3\2\2\2\u008c\u0352\3\2\2\2\u008e\u0361\3\2\2\2\u0090\u0367\3\2\2\2\u0092"+ - "\u036b\3\2\2\2\u0094\u036f\3\2\2\2\u0096\u0374\3\2\2\2\u0098\u037c\3\2"+ - "\2\2\u009a\u0384\3\2\2\2\u009c\u0389\3\2\2\2\u009e\u0393\3\2\2\2\u00a0"+ - "\u039a\3\2\2\2\u00a2\u039f\3\2\2\2\u00a4\u03a5\3\2\2\2\u00a6\u03a8\3\2"+ - "\2\2\u00a8\u03ac\3\2\2\2\u00aa\u03b3\3\2\2\2\u00ac\u03b8\3\2\2\2\u00ae"+ - "\u03bd\3\2\2\2\u00b0\u03c2\3\2\2\2\u00b2\u03ca\3\2\2\2\u00b4\u03d1\3\2"+ - "\2\2\u00b6\u03d7\3\2\2\2\u00b8\u03e5\3\2\2\2\u00ba\u03e8\3\2\2\2\u00bc"+ - "\u03ee\3\2\2\2\u00be\u03f3\3\2\2\2\u00c0\u03fe\3\2\2\2\u00c2\u0402\3\2"+ - "\2\2\u00c4\u0409\3\2\2\2\u00c6\u0412\3\2\2\2\u00c8\u0416\3\2\2\2\u00ca"+ - "\u041c\3\2\2\2\u00cc\u0426\3\2\2\2\u00ce\u0428\3\2\2\2\u00d0\u042c\3\2"+ - "\2\2\u00d2\u042e\3\2\2\2\u00d4\u0432\3\2\2\2\u00d6\u0434\3\2\2\2\u00d8"+ - "\u0438\3\2\2\2\u00da\u043a\3\2\2\2\u00dc\u043c\3\2\2\2\u00de\u043e\3\2"+ - "\2\2\u00e0\u0440\3\2\2\2\u00e2\u0442\3\2\2\2\u00e4\u0447\3\2\2\2\u00e6"+ - "\u044c\3\2\2\2\u00e8\u044f\3\2\2\2\u00ea\u0453\3\2\2\2\u00ec\u0456\3\2"+ - "\2\2\u00ee\u0459\3\2\2\2\u00f0\u045c\3\2\2\2\u00f2\u045f\3\2\2\2\u00f4"+ - "\u0461\3\2\2\2\u00f6\u0464\3\2\2\2\u00f8\u0466\3\2\2\2\u00fa\u0469\3\2"+ - "\2\2\u00fc\u046b\3\2\2\2\u00fe\u046d\3\2\2\2\u0100\u046f\3\2\2\2\u0102"+ - "\u0472\3\2\2\2\u0104\u0475\3\2\2\2\u0106\u0478\3\2\2\2\u0108\u047a\3\2"+ - "\2\2\u010a\u047c\3\2\2\2\u010c\u047e\3\2\2\2\u010e\u0480\3\2\2\2\u0110"+ - "\u0482\3\2\2\2\u0112\u0484\3\2\2\2\u0114\u0492\3\2\2\2\u0116\u0496\3\2"+ - "\2\2\u0118\u04a2\3\2\2\2\u011a\u04b0\3\2\2\2\u011c\u04bc\3\2\2\2\u011e"+ - "\u04e0\3\2\2\2\u0120\u04e2\3\2\2\2\u0122\u04eb\3\2\2\2\u0124\u04f1\3\2"+ - "\2\2\u0126\u04f8\3\2\2\2\u0128\u04fe\3\2\2\2\u012a\u0500\3\2\2\2\u012c"+ - "\u0505\3\2\2\2\u012e\u050a\3\2\2\2\u0130\u0511\3\2\2\2\u0132\u051c\3\2"+ - "\2\2\u0134\u0527\3\2\2\2\u0136\u0534\3\2\2\2\u0138\u053a\3\2\2\2\u013a"+ - "\u0549\3\2\2\2\u013c\u054f\3\2\2\2\u013e\u055e\3\2\2\2\u0140\u0560\3\2"+ - "\2\2\u0142\u057c\3\2\2\2\u0144\u0586\3\2\2\2\u0146\u0588\3\2\2\2\u0148"+ - "\u058a\3\2\2\2\u014a\u058c\3\2\2\2\u014c\u0594\3\2\2\2\u014e\u0596\3\2"+ - "\2\2\u0150\u0598\3\2\2\2\u0152\u059b\3\2\2\2\u0154\u05a1\3\2\2\2\u0156"+ - "\u05af\3\2\2\2\u0158\u05cc\3\2\2\2\u015a\u05d0\3\2\2\2\u015c\u015f\5\6"+ - "\3\2\u015d\u015f\5\u011c\u008e\2\u015e\u015c\3\2\2\2\u015e\u015d\3\2\2"+ - "\2\u015f\u0160\3\2\2\2\u0160\u0161\b\2\2\2\u0161\5\3\2\2\2\u0162\u016c"+ - "\5\u0142\u00a1\2\u0163\u0164\7\60\2\2\u0164\u0166\6\3\2\2\u0165\u0167"+ - "\5\u0142\u00a1\2\u0166\u0165\3\2\2\2\u0166\u0167\3\2\2\2\u0167\u0169\3"+ - "\2\2\2\u0168\u016a\5\u014a\u00a5\2\u0169\u0168\3\2\2\2\u0169\u016a\3\2"+ - "\2\2\u016a\u016d\3\2\2\2\u016b\u016d\5\u014a\u00a5\2\u016c\u0163\3\2\2"+ - "\2\u016c\u016b\3\2\2\2\u016d\u0175\3\2\2\2\u016e\u016f\7\60\2\2\u016f"+ - "\u0170\6\3\3\2\u0170\u0172\5\u0142\u00a1\2\u0171\u0173\5\u014a\u00a5\2"+ - "\u0172\u0171\3\2\2\2\u0172\u0173\3\2\2\2\u0173\u0175\3\2\2\2\u0174\u0162"+ - "\3\2\2\2\u0174\u016e\3\2\2\2\u0175\7\3\2\2\2\u0176\u0177\7v\2\2\u0177"+ - "\u0178\7t\2\2\u0178\u0179\7w\2\2\u0179\u017a\7g\2\2\u017a\u017b\3\2\2"+ - "\2\u017b\u017c\b\4\2\2\u017c\t\3\2\2\2\u017d\u017e\7h\2\2\u017e\u017f"+ - "\7c\2\2\u017f\u0180\7n\2\2\u0180\u0181\7u\2\2\u0181\u0182\7g\2\2\u0182"+ - "\u0183\3\2\2\2\u0183\u0184\b\5\2\2\u0184\13\3\2\2\2\u0185\u0186\7c\2\2"+ - "\u0186\u0187\7u\2\2\u0187\u0188\7u\2\2\u0188\u0189\7g\2\2\u0189\u018a"+ - "\7t\2\2\u018a\u018b\7v\2\2\u018b\r\3\2\2\2\u018c\u018d\7c\2\2\u018d\u018e"+ - "\7u\2\2\u018e\u018f\7u\2\2\u018f\u0190\7w\2\2\u0190\u0191\7o\2\2\u0191"+ - "\u0192\7g\2\2\u0192\17\3\2\2\2\u0193\u0194\7k\2\2\u0194\u0195\7p\2\2\u0195"+ - "\u0196\7j\2\2\u0196\u0197\7c\2\2\u0197\u0198\7n\2\2\u0198\u0199\7g\2\2"+ - "\u0199\21\3\2\2\2\u019a\u019b\7g\2\2\u019b\u019c\7z\2\2\u019c\u019d\7"+ - "j\2\2\u019d\u019e\7c\2\2\u019e\u019f\7n\2\2\u019f\u01a0\7g\2\2\u01a0\23"+ - "\3\2\2\2\u01a1\u01a2\7t\2\2\u01a2\u01a3\7g\2\2\u01a3\u01a4\7s\2\2\u01a4"+ - "\u01a5\7w\2\2\u01a5\u01a6\7k\2\2\u01a6\u01a7\7t\2\2\u01a7\u01a8\7g\2\2"+ - "\u01a8\u01a9\7u\2\2\u01a9\25\3\2\2\2\u01aa\u01ab\7r\2\2\u01ab\u01ac\7"+ - "t\2\2\u01ac\u01ad\7g\2\2\u01ad\u01ae\7u\2\2\u01ae\u01af\7g\2\2\u01af\u01b0"+ - "\7t\2\2\u01b0\u01b1\7x\2\2\u01b1\u01b2\7g\2\2\u01b2\u01b3\7u\2\2\u01b3"+ - "\27\3\2\2\2\u01b4\u01b5\7g\2\2\u01b5\u01b6\7p\2\2\u01b6\u01b7\7u\2\2\u01b7"+ - "\u01b8\7w\2\2\u01b8\u01b9\7t\2\2\u01b9\u01ba\7g\2\2\u01ba\u01bb\7u\2\2"+ - "\u01bb\31\3\2\2\2\u01bc\u01bd\7k\2\2\u01bd\u01be\7p\2\2\u01be\u01bf\7"+ - "x\2\2\u01bf\u01c0\7c\2\2\u01c0\u01c1\7t\2\2\u01c1\u01c2\7k\2\2\u01c2\u01c3"+ - "\7c\2\2\u01c3\u01c4\7p\2\2\u01c4\u01c5\7v\2\2\u01c5\33\3\2\2\2\u01c6\u01c7"+ - "\7f\2\2\u01c7\u01c8\7g\2\2\u01c8\u01c9\7e\2\2\u01c9\u01ca\7t\2\2\u01ca"+ - "\u01cb\7g\2\2\u01cb\u01cc\7c\2\2\u01cc\u01cd\7u\2\2\u01cd\u01ce\7g\2\2"+ - "\u01ce\u01cf\7u\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d1\b\16\2\2\u01d1\35"+ - "\3\2\2\2\u01d2\u01d3\7r\2\2\u01d3\u01d4\7w\2\2\u01d4\u01d5\7t\2\2\u01d5"+ - "\u01d6\7g\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\b\17\2\2\u01d8\37\3\2\2"+ - "\2\u01d9\u01da\7k\2\2\u01da\u01db\7o\2\2\u01db\u01dc\7r\2\2\u01dc\u01dd"+ - "\7n\2\2\u01dd\u01de\7g\2\2\u01de\u01df\7o\2\2\u01df\u01e0\7g\2\2\u01e0"+ - "\u01e1\7p\2\2\u01e1\u01e2\7v\2\2\u01e2\u01e3\7u\2\2\u01e3!\3\2\2\2\u01e4"+ - "\u01e5\7c\2\2\u01e5\u01e6\7u\2\2\u01e6#\3\2\2\2\u01e7\u01e8\7q\2\2\u01e8"+ - "\u01e9\7n\2\2\u01e9\u01ea\7f\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ec\b\22"+ - "\2\2\u01ec%\3\2\2\2\u01ed\u01ee\7d\2\2\u01ee\u01ef\7g\2\2\u01ef\u01f0"+ - "\7h\2\2\u01f0\u01f1\7q\2\2\u01f1\u01f2\7t\2\2\u01f2\u01f3\7g\2\2\u01f3"+ - "\u01f4\3\2\2\2\u01f4\u01f5\b\23\2\2\u01f5\'\3\2\2\2\u01f6\u01f7\7%\2\2"+ - "\u01f7\u01f8\7n\2\2\u01f8\u01f9\7j\2\2\u01f9\u01fa\7u\2\2\u01fa)\3\2\2"+ - "\2\u01fb\u01fc\7h\2\2\u01fc\u01fd\7q\2\2\u01fd\u01fe\7t\2\2\u01fe\u01ff"+ - "\7c\2\2\u01ff\u0200\7n\2\2\u0200\u0201\7n\2\2\u0201+\3\2\2\2\u0202\u0203"+ - "\7g\2\2\u0203\u0204\7z\2\2\u0204\u0205\7k\2\2\u0205\u0206\7u\2\2\u0206"+ - "\u0207\7v\2\2\u0207\u0208\7u\2\2\u0208-\3\2\2\2\u0209\u020a\7c\2\2\u020a"+ - "\u020b\7e\2\2\u020b\u020c\7e\2\2\u020c\u020d\3\2\2\2\u020d\u020e\b\27"+ - "\2\2\u020e/\3\2\2\2\u020f\u0210\7h\2\2\u0210\u0211\7q\2\2\u0211\u0212"+ - "\7n\2\2\u0212\u0213\7f\2\2\u0213\61\3\2\2\2\u0214\u0215\7w\2\2\u0215\u0216"+ - "\7p\2\2\u0216\u0217\7h\2\2\u0217\u0218\7q\2\2\u0218\u0219\7n\2\2\u0219"+ - "\u021a\7f\2\2\u021a\63\3\2\2\2\u021b\u021c\7w\2\2\u021c\u021d\7p\2\2\u021d"+ - "\u021e\7h\2\2\u021e\u021f\7q\2\2\u021f\u0220\7n\2\2\u0220\u0221\7f\2\2"+ - "\u0221\u0222\7k\2\2\u0222\u0223\7p\2\2\u0223\u0224\7i\2\2\u0224\65\3\2"+ - "\2\2\u0225\u0226\7i\2\2\u0226\u0227\7j\2\2\u0227\u0228\7q\2\2\u0228\u0229"+ - "\7u\2\2\u0229\u022a\7v\2\2\u022a\67\3\2\2\2\u022b\u022c\7k\2\2\u022c\u022d"+ - "\7p\2\2\u022d9\3\2\2\2\u022e\u022f\7%\2\2\u022f;\3\2\2\2\u0230\u0231\7"+ - "u\2\2\u0231\u0232\7w\2\2\u0232\u0233\7d\2\2\u0233\u0234\7u\2\2\u0234\u0235"+ - "\7g\2\2\u0235\u0236\7v\2\2\u0236=\3\2\2\2\u0237\u0238\7w\2\2\u0238\u0239"+ - "\7p\2\2\u0239\u023a\7k\2\2\u023a\u023b\7q\2\2\u023b\u023c\7p\2\2\u023c"+ - "?\3\2\2\2\u023d\u023e\7k\2\2\u023e\u023f\7p\2\2\u023f\u0240\7v\2\2\u0240"+ - "\u0241\7g\2\2\u0241\u0242\7t\2\2\u0242\u0243\7u\2\2\u0243\u0244\7g\2\2"+ - "\u0244\u0245\7e\2\2\u0245\u0246\7v\2\2\u0246\u0247\7k\2\2\u0247\u0248"+ - "\7q\2\2\u0248\u0249\7p\2\2\u0249A\3\2\2\2\u024a\u024b\7u\2\2\u024b\u024c"+ - "\7g\2\2\u024c\u024d\7v\2\2\u024d\u024e\7o\2\2\u024e\u024f\7k\2\2\u024f"+ - "\u0250\7p\2\2\u0250\u0251\7w\2\2\u0251\u0252\7u\2\2\u0252C\3\2\2\2\u0253"+ - "\u0254\7?\2\2\u0254\u0255\7?\2\2\u0255\u0256\7@\2\2\u0256E\3\2\2\2\u0257"+ - "\u0258\7/\2\2\u0258\u0259\7/\2\2\u0259\u025a\7,\2\2\u025aG\3\2\2\2\u025b"+ - "\u025c\7c\2\2\u025c\u025d\7r\2\2\u025d\u025e\7r\2\2\u025e\u025f\7n\2\2"+ - "\u025f\u0260\7{\2\2\u0260I\3\2\2\2\u0261\u0262\7A\2\2\u0262K\3\2\2\2\u0263"+ - "\u0264\7#\2\2\u0264\u0265\7>\2\2\u0265M\3\2\2\2\u0266\u0267\7#\2\2\u0267"+ - "\u0268\7@\2\2\u0268\u0269\3\2\2\2\u0269\u026a\b\'\2\2\u026aO\3\2\2\2\u026b"+ - "\u026c\7u\2\2\u026c\u026d\7g\2\2\u026d\u026e\7s\2\2\u026e\u026f\3\2\2"+ - "\2\u026f\u0270\b(\2\2\u0270Q\3\2\2\2\u0271\u0272\7u\2\2\u0272\u0273\7"+ - "g\2\2\u0273\u0274\7v\2\2\u0274\u0275\3\2\2\2\u0275\u0276\b)\2\2\u0276"+ - "S\3\2\2\2\u0277\u0278\7o\2\2\u0278\u0279\7u\2\2\u0279\u027a\7g\2\2\u027a"+ - "\u027b\7v\2\2\u027b\u027c\3\2\2\2\u027c\u027d\b*\2\2\u027dU\3\2\2\2\u027e"+ - "\u027f\7f\2\2\u027f\u0280\7k\2\2\u0280\u0281\7e\2\2\u0281\u0282\7v\2\2"+ - "\u0282\u0283\3\2\2\2\u0283\u0284\b+\2\2\u0284W\3\2\2\2\u0285\u0286\7q"+ - "\2\2\u0286\u0287\7r\2\2\u0287\u0288\7v\2\2\u0288\u0289\7k\2\2\u0289\u028a"+ - "\7q\2\2\u028a\u028b\7p\2\2\u028b\u028c\3\2\2\2\u028c\u028d\b,\2\2\u028d"+ - "Y\3\2\2\2\u028e\u028f\7n\2\2\u028f\u0290\7g\2\2\u0290\u0291\7p\2\2\u0291"+ - "\u0292\3\2\2\2\u0292\u0293\b-\2\2\u0293[\3\2\2\2\u0294\u0295\7p\2\2\u0295"+ - "\u0296\7g\2\2\u0296\u0297\7y\2\2\u0297\u0298\3\2\2\2\u0298\u0299\b.\2"+ - "\2\u0299]\3\2\2\2\u029a\u029b\7o\2\2\u029b\u029c\7c\2\2\u029c\u029d\7"+ - "m\2\2\u029d\u029e\7g\2\2\u029e\u029f\3\2\2\2\u029f\u02a0\b/\2\2\u02a0"+ - "_\3\2\2\2\u02a1\u02a2\7e\2\2\u02a2\u02a3\7c\2\2\u02a3\u02a4\7r\2\2\u02a4"+ - "\u02a5\3\2\2\2\u02a5\u02a6\b\60\2\2\u02a6a\3\2\2\2\u02a7\u02a8\7u\2\2"+ - "\u02a8\u02a9\7q\2\2\u02a9\u02aa\7o\2\2\u02aa\u02ab\7g\2\2\u02ab\u02ac"+ - "\3\2\2\2\u02ac\u02ad\b\61\2\2\u02adc\3\2\2\2\u02ae\u02af\7i\2\2\u02af"+ - "\u02b0\7g\2\2\u02b0\u02b1\7v\2\2\u02b1\u02b2\3\2\2\2\u02b2\u02b3\b\62"+ - "\2\2\u02b3e\3\2\2\2\u02b4\u02b5\7f\2\2\u02b5\u02b6\7q\2\2\u02b6\u02b7"+ - "\7o\2\2\u02b7\u02b8\7c\2\2\u02b8\u02b9\7k\2\2\u02b9\u02ba\7p\2\2\u02ba"+ - "\u02bb\3\2\2\2\u02bb\u02bc\b\63\2\2\u02bcg\3\2\2\2\u02bd\u02be\7c\2\2"+ - "\u02be\u02bf\7z\2\2\u02bf\u02c0\7k\2\2\u02c0\u02c1\7q\2\2\u02c1\u02c2"+ - "\7o\2\2\u02c2\u02c3\3\2\2\2\u02c3\u02c4\b\64\2\2\u02c4i\3\2\2\2\u02c5"+ - "\u02c6\7c\2\2\u02c6\u02c7\7f\2\2\u02c7\u02c8\7v\2\2\u02c8\u02c9\3\2\2"+ - "\2\u02c9\u02ca\b\65\2\2\u02cak\3\2\2\2\u02cb\u02cc\7o\2\2\u02cc\u02cd"+ - "\7c\2\2\u02cd\u02ce\7v\2\2\u02ce\u02cf\7e\2\2\u02cf\u02d0\7j\2\2\u02d0"+ - "\u02d1\3\2\2\2\u02d1\u02d2\b\66\2\2\u02d2m\3\2\2\2\u02d3\u02d4\7p\2\2"+ - "\u02d4\u02d5\7q\2\2\u02d5\u02d6\7p\2\2\u02d6\u02d7\7g\2\2\u02d7\u02d8"+ - "\3\2\2\2\u02d8\u02d9\b\67\2\2\u02d9o\3\2\2\2\u02da\u02db\7r\2\2\u02db"+ - "\u02dc\7t\2\2\u02dc\u02dd\7g\2\2\u02dd\u02de\7f\2\2\u02deq\3\2\2\2\u02df"+ - "\u02e0\7v\2\2\u02e0\u02e1\7{\2\2\u02e1\u02e2\7r\2\2\u02e2\u02e3\7g\2\2"+ - "\u02e3\u02e4\7Q\2\2\u02e4\u02e5\7h\2\2\u02e5\u02e6\3\2\2\2\u02e6\u02e7"+ - "\b9\2\2\u02e7s\3\2\2\2\u02e8\u02e9\7k\2\2\u02e9\u02ea\7u\2\2\u02ea\u02eb"+ - "\7E\2\2\u02eb\u02ec\7q\2\2\u02ec\u02ed\7o\2\2\u02ed\u02ee\7r\2\2\u02ee"+ - "\u02ef\7c\2\2\u02ef\u02f0\7t\2\2\u02f0\u02f1\7c\2\2\u02f1\u02f2\7d\2\2"+ - "\u02f2\u02f3\7n\2\2\u02f3\u02f4\7g\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f6"+ - "\b:\2\2\u02f6u\3\2\2\2\u02f7\u02f8\7u\2\2\u02f8\u02f9\7j\2\2\u02f9\u02fa"+ - "\7c\2\2\u02fa\u02fb\7t\2\2\u02fb\u02fc\7g\2\2\u02fcw\3\2\2\2\u02fd\u02fe"+ - "\7B\2\2\u02fe\u02ff\3\2\2\2\u02ff\u0300\b<\2\2\u0300y\3\2\2\2\u0301\u0302"+ - "\7\60\2\2\u0302\u0303\7\60\2\2\u0303{\3\2\2\2\u0304\u0305\7u\2\2\u0305"+ - "\u0306\7j\2\2\u0306\u0307\7c\2\2\u0307\u0308\7t\2\2\u0308\u0309\7g\2\2"+ - "\u0309\u030a\7f\2\2\u030a}\3\2\2\2\u030b\u030c\7g\2\2\u030c\u030d\7z\2"+ - "\2\u030d\u030e\7e\2\2\u030e\u030f\7n\2\2\u030f\u0310\7w\2\2\u0310\u0311"+ - "\7u\2\2\u0311\u0312\7k\2\2\u0312\u0313\7x\2\2\u0313\u0314\7g\2\2\u0314"+ - "\177\3\2\2\2\u0315\u0316\7r\2\2\u0316\u0317\7t\2\2\u0317\u0318\7g\2\2"+ - "\u0318\u0319\7f\2\2\u0319\u031a\7k\2\2\u031a\u031b\7e\2\2\u031b\u031c"+ - "\7c\2\2\u031c\u031d\7v\2\2\u031d\u031e\7g\2\2\u031e\u0081\3\2\2\2\u031f"+ - "\u0320\7y\2\2\u0320\u0321\7t\2\2\u0321\u0322\7k\2\2\u0322\u0323\7v\2\2"+ - "\u0323\u0324\7g\2\2\u0324\u0325\7R\2\2\u0325\u0326\7g\2\2\u0326\u0327"+ - "\7t\2\2\u0327\u0328\7o\2\2\u0328\u0329\3\2\2\2\u0329\u032a\bA\2\2\u032a"+ - "\u0083\3\2\2\2\u032b\u032c\7p\2\2\u032c\u032d\7q\2\2\u032d\u032e\7R\2"+ - "\2\u032e\u032f\7g\2\2\u032f\u0330\7t\2\2\u0330\u0331\7o\2\2\u0331\u0332"+ - "\3\2\2\2\u0332\u0333\bB\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7v\2\2\u0335"+ - "\u0336\7t\2\2\u0336\u0337\7w\2\2\u0337\u0338\7u\2\2\u0338\u0339\7v\2\2"+ - "\u0339\u033a\7g\2\2\u033a\u033b\7f\2\2\u033b\u033c\3\2\2\2\u033c\u033d"+ - "\bC\2\2\u033d\u0087\3\2\2\2\u033e\u033f\7q\2\2\u033f\u0340\7w\2\2\u0340"+ - "\u0341\7v\2\2\u0341\u0342\7n\2\2\u0342\u0343\7k\2\2\u0343\u0344\7p\2\2"+ - "\u0344\u0345\7g\2\2\u0345\u0089\3\2\2\2\u0346\u0347\7k\2\2\u0347\u0348"+ - "\7p\2\2\u0348\u0349\7k\2\2\u0349\u034a\7v\2\2\u034a\u034b\7G\2\2\u034b"+ - "\u034c\7p\2\2\u034c\u034d\7u\2\2\u034d\u034e\7w\2\2\u034e\u034f\7t\2\2"+ - "\u034f\u0350\7g\2\2\u0350\u0351\7u\2\2\u0351\u008b\3\2\2\2\u0352\u0353"+ - "\7k\2\2\u0353\u0354\7o\2\2\u0354\u0355\7r\2\2\u0355\u0356\7q\2\2\u0356"+ - "\u0357\7t\2\2\u0357\u0358\7v\2\2\u0358\u0359\7T\2\2\u0359\u035a\7g\2\2"+ - "\u035a\u035b\7s\2\2\u035b\u035c\7w\2\2\u035c\u035d\7k\2\2\u035d\u035e"+ - "\7t\2\2\u035e\u035f\7g\2\2\u035f\u0360\7u\2\2\u0360\u008d\3\2\2\2\u0361"+ - "\u0362\7r\2\2\u0362\u0363\7t\2\2\u0363\u0364\7q\2\2\u0364\u0365\7q\2\2"+ - "\u0365\u0366\7h\2\2\u0366\u008f\3\2\2\2\u0367\u0368\7?\2\2\u0368\u0369"+ - "\7?\2\2\u0369\u036a\7?\2\2\u036a\u0091\3\2\2\2\u036b\u036c\7#\2\2\u036c"+ - "\u036d\7?\2\2\u036d\u036e\7?\2\2\u036e\u0093\3\2\2\2\u036f\u0370\7y\2"+ - "\2\u0370\u0371\7k\2\2\u0371\u0372\7v\2\2\u0372\u0373\7j\2\2\u0373\u0095"+ - "\3\2\2\2\u0374\u0375\7d\2\2\u0375\u0376\7t\2\2\u0376\u0377\7g\2\2\u0377"+ - "\u0378\7c\2\2\u0378\u0379\7m\2\2\u0379\u037a\3\2\2\2\u037a\u037b\bK\2"+ - "\2\u037b\u0097\3\2\2\2\u037c\u037d\7f\2\2\u037d\u037e\7g\2\2\u037e\u037f"+ - "\7h\2\2\u037f\u0380\7c\2\2\u0380\u0381\7w\2\2\u0381\u0382\7n\2\2\u0382"+ - "\u0383\7v\2\2\u0383\u0099\3\2\2\2\u0384\u0385\7h\2\2\u0385\u0386\7w\2"+ - "\2\u0386\u0387\7p\2\2\u0387\u0388\7e\2\2\u0388\u009b\3\2\2\2\u0389\u038a"+ - "\7k\2\2\u038a\u038b\7p\2\2\u038b\u038c\7v\2\2\u038c\u038d\7g\2\2\u038d"+ - "\u038e\7t\2\2\u038e\u038f\7h\2\2\u038f\u0390\7c\2\2\u0390\u0391\7e\2\2"+ - "\u0391\u0392\7g\2\2\u0392\u009d\3\2\2\2\u0393\u0394\7u\2\2\u0394\u0395"+ - "\7g\2\2\u0395\u0396\7n\2\2\u0396\u0397\7g\2\2\u0397\u0398\7e\2\2\u0398"+ - "\u0399\7v\2\2\u0399\u009f\3\2\2\2\u039a\u039b\7e\2\2\u039b\u039c\7c\2"+ - "\2\u039c\u039d\7u\2\2\u039d\u039e\7g\2\2\u039e\u00a1\3\2\2\2\u039f\u03a0"+ - "\7f\2\2\u03a0\u03a1\7g\2\2\u03a1\u03a2\7h\2\2\u03a2\u03a3\7g\2\2\u03a3"+ - "\u03a4\7t\2\2\u03a4\u00a3\3\2\2\2\u03a5\u03a6\7i\2\2\u03a6\u03a7\7q\2"+ - "\2\u03a7\u00a5\3\2\2\2\u03a8\u03a9\7o\2\2\u03a9\u03aa\7c\2\2\u03aa\u03ab"+ - "\7r\2\2\u03ab\u00a7\3\2\2\2\u03ac\u03ad\7u\2\2\u03ad\u03ae\7v\2\2\u03ae"+ - "\u03af\7t\2\2\u03af\u03b0\7w\2\2\u03b0\u03b1\7e\2\2\u03b1\u03b2\7v\2\2"+ - "\u03b2\u00a9\3\2\2\2\u03b3\u03b4\7e\2\2\u03b4\u03b5\7j\2\2\u03b5\u03b6"+ - "\7c\2\2\u03b6\u03b7\7p\2\2\u03b7\u00ab\3\2\2\2\u03b8\u03b9\7g\2\2\u03b9"+ - "\u03ba\7n\2\2\u03ba\u03bb\7u\2\2\u03bb\u03bc\7g\2\2\u03bc\u00ad\3\2\2"+ - "\2\u03bd\u03be\7i\2\2\u03be\u03bf\7q\2\2\u03bf\u03c0\7v\2\2\u03c0\u03c1"+ - "\7q\2\2\u03c1\u00af\3\2\2\2\u03c2\u03c3\7r\2\2\u03c3\u03c4\7c\2\2\u03c4"+ - "\u03c5\7e\2\2\u03c5\u03c6\7m\2\2\u03c6\u03c7\7c\2\2\u03c7\u03c8\7i\2\2"+ - "\u03c8\u03c9\7g\2\2\u03c9\u00b1\3\2\2\2\u03ca\u03cb\7u\2\2\u03cb\u03cc"+ - "\7y\2\2\u03cc\u03cd\7k\2\2\u03cd\u03ce\7v\2\2\u03ce\u03cf\7e\2\2\u03cf"+ - "\u03d0\7j\2\2\u03d0\u00b3\3\2\2\2\u03d1\u03d2\7e\2\2\u03d2\u03d3\7q\2"+ - "\2\u03d3\u03d4\7p\2\2\u03d4\u03d5\7u\2\2\u03d5\u03d6\7v\2\2\u03d6\u00b5"+ - "\3\2\2\2\u03d7\u03d8\7h\2\2\u03d8\u03d9\7c\2\2\u03d9\u03da\7n\2\2\u03da"+ - "\u03db\7n\2\2\u03db\u03dc\7v\2\2\u03dc\u03dd\7j\2\2\u03dd\u03de\7t\2\2"+ - "\u03de\u03df\7q\2\2\u03df\u03e0\7w\2\2\u03e0\u03e1\7i\2\2\u03e1\u03e2"+ - "\7j\2\2\u03e2\u03e3\3\2\2\2\u03e3\u03e4\b[\2\2\u03e4\u00b7\3\2\2\2\u03e5"+ - "\u03e6\7k\2\2\u03e6\u03e7\7h\2\2\u03e7\u00b9\3\2\2\2\u03e8\u03e9\7t\2"+ - "\2\u03e9\u03ea\7c\2\2\u03ea\u03eb\7p\2\2\u03eb\u03ec\7i\2\2\u03ec\u03ed"+ - "\7g\2\2\u03ed\u00bb\3\2\2\2\u03ee\u03ef\7v\2\2\u03ef\u03f0\7{\2\2\u03f0"+ - "\u03f1\7r\2\2\u03f1\u03f2\7g\2\2\u03f2\u00bd\3\2\2\2\u03f3\u03f4\7e\2"+ - "\2\u03f4\u03f5\7q\2\2\u03f5\u03f6\7p\2\2\u03f6\u03f7\7v\2\2\u03f7\u03f8"+ - "\7k\2\2\u03f8\u03f9\7p\2\2\u03f9\u03fa\7w\2\2\u03fa\u03fb\7g\2\2\u03fb"+ - "\u03fc\3\2\2\2\u03fc\u03fd\b_\2\2\u03fd\u00bf\3\2\2\2\u03fe\u03ff\7h\2"+ - "\2\u03ff\u0400\7q\2\2\u0400\u0401\7t\2\2\u0401\u00c1\3\2\2\2\u0402\u0403"+ - "\7k\2\2\u0403\u0404\7o\2\2\u0404\u0405\7r\2\2\u0405\u0406\7q\2\2\u0406"+ - "\u0407\7t\2\2\u0407\u0408\7v\2\2\u0408\u00c3\3\2\2\2\u0409\u040a\7t\2"+ - "\2\u040a\u040b\7g\2\2\u040b\u040c\7v\2\2\u040c\u040d\7w\2\2\u040d\u040e"+ - "\7t\2\2\u040e\u040f\7p\2\2\u040f\u0410\3\2\2\2\u0410\u0411\bb\2\2\u0411"+ - "\u00c5\3\2\2\2\u0412\u0413\7x\2\2\u0413\u0414\7c\2\2\u0414\u0415\7t\2"+ - "\2\u0415\u00c7\3\2\2\2\u0416\u0417\7p\2\2\u0417\u0418\7k\2\2\u0418\u0419"+ - "\7n\2\2\u0419\u041a\3\2\2\2\u041a\u041b\bd\2\2\u041b\u00c9\3\2\2\2\u041c"+ - "\u0421\5\u014c\u00a6\2\u041d\u0420\5\u014c\u00a6\2\u041e\u0420\5\u014e"+ - "\u00a7\2\u041f\u041d\3\2\2\2\u041f\u041e\3\2\2\2\u0420\u0423\3\2\2\2\u0421"+ - "\u041f\3\2\2\2\u0421\u0422\3\2\2\2\u0422\u0424\3\2\2\2\u0423\u0421\3\2"+ - "\2\2\u0424\u0425\be\2\2\u0425\u00cb\3\2\2\2\u0426\u0427\7*\2\2\u0427\u00cd"+ - "\3\2\2\2\u0428\u0429\7+\2\2\u0429\u042a\3\2\2\2\u042a\u042b\bg\2\2\u042b"+ - "\u00cf\3\2\2\2\u042c\u042d\7}\2\2\u042d\u00d1\3\2\2\2\u042e\u042f\7\177"+ - "\2\2\u042f\u0430\3\2\2\2\u0430\u0431\bi\2\2\u0431\u00d3\3\2\2\2\u0432"+ - "\u0433\7]\2\2\u0433\u00d5\3\2\2\2\u0434\u0435\7_\2\2\u0435\u0436\3\2\2"+ - "\2\u0436\u0437\bk\2\2\u0437\u00d7\3\2\2\2\u0438\u0439\7?\2\2\u0439\u00d9"+ - "\3\2\2\2\u043a\u043b\7.\2\2\u043b\u00db\3\2\2\2\u043c\u043d\7=\2\2\u043d"+ - "\u00dd\3\2\2\2\u043e\u043f\7<\2\2\u043f\u00df\3\2\2\2\u0440\u0441\7\60"+ - "\2\2\u0441\u00e1\3\2\2\2\u0442\u0443\7-\2\2\u0443\u0444\7-\2\2\u0444\u0445"+ - "\3\2\2\2\u0445\u0446\bq\2\2\u0446\u00e3\3\2\2\2\u0447\u0448\7/\2\2\u0448"+ - "\u0449\7/\2\2\u0449\u044a\3\2\2\2\u044a\u044b\br\2\2\u044b\u00e5\3\2\2"+ - "\2\u044c\u044d\7<\2\2\u044d\u044e\7?\2\2\u044e\u00e7\3\2\2\2\u044f\u0450"+ - "\7\60\2\2\u0450\u0451\7\60\2\2\u0451\u0452\7\60\2\2\u0452\u00e9\3\2\2"+ - "\2\u0453\u0454\7~\2\2\u0454\u0455\7~\2\2\u0455\u00eb\3\2\2\2\u0456\u0457"+ - "\7(\2\2\u0457\u0458\7(\2\2\u0458\u00ed\3\2\2\2\u0459\u045a\7?\2\2\u045a"+ - "\u045b\7?\2\2\u045b\u00ef\3\2\2\2\u045c\u045d\7#\2\2\u045d\u045e\7?\2"+ - "\2\u045e\u00f1\3\2\2\2\u045f\u0460\7>\2\2\u0460\u00f3\3\2\2\2\u0461\u0462"+ - "\7>\2\2\u0462\u0463\7?\2\2\u0463\u00f5\3\2\2\2\u0464\u0465\7@\2\2\u0465"+ - "\u00f7\3\2\2\2\u0466\u0467\7@\2\2\u0467\u0468\7?\2\2\u0468\u00f9\3\2\2"+ - "\2\u0469\u046a\7~\2\2\u046a\u00fb\3\2\2\2\u046b\u046c\7\61\2\2\u046c\u00fd"+ - "\3\2\2\2\u046d\u046e\7\'\2\2\u046e\u00ff\3\2\2\2\u046f\u0470\7>\2\2\u0470"+ - "\u0471\7>\2\2\u0471\u0101\3\2\2\2\u0472\u0473\7@\2\2\u0473\u0474\7@\2"+ - "\2\u0474\u0103\3\2\2\2\u0475\u0476\7(\2\2\u0476\u0477\7`\2\2\u0477\u0105"+ - "\3\2\2\2\u0478\u0479\7#\2\2\u0479\u0107\3\2\2\2\u047a\u047b\7-\2\2\u047b"+ - "\u0109\3\2\2\2\u047c\u047d\7/\2\2\u047d\u010b\3\2\2\2\u047e\u047f\7`\2"+ - "\2\u047f\u010d\3\2\2\2\u0480\u0481\7,\2\2\u0481\u010f\3\2\2\2\u0482\u0483"+ - "\7(\2\2\u0483\u0111\3\2\2\2\u0484\u0485\7>\2\2\u0485\u0486\7/\2\2\u0486"+ - "\u0113\3\2\2\2\u0487\u0493\7\62\2\2\u0488\u048f\t\2\2\2\u0489\u048b\7"+ - "a\2\2\u048a\u0489\3\2\2\2\u048a\u048b\3\2\2\2\u048b\u048c\3\2\2\2\u048c"+ - "\u048e\t\3\2\2\u048d\u048a\3\2\2\2\u048e\u0491\3\2\2\2\u048f\u048d\3\2"+ - "\2\2\u048f\u0490\3\2\2\2\u0490\u0493\3\2\2\2\u0491\u048f\3\2\2\2\u0492"+ - "\u0487\3\2\2\2\u0492\u0488\3\2\2\2\u0493\u0494\3\2\2\2\u0494\u0495\b\u008a"+ - "\2\2\u0495\u0115\3\2\2\2\u0496\u0497\7\62\2\2\u0497\u049c\t\4\2\2\u0498"+ - "\u049a\7a\2\2\u0499\u0498\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u049b\3\2"+ - "\2\2\u049b\u049d\5\u0148\u00a4\2\u049c\u0499\3\2\2\2\u049d\u049e\3\2\2"+ - "\2\u049e\u049c\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u04a0\3\2\2\2\u04a0\u04a1"+ - "\b\u008b\2\2\u04a1\u0117\3\2\2\2\u04a2\u04a4\7\62\2\2\u04a3\u04a5\t\5"+ - "\2\2\u04a4\u04a3\3\2\2\2\u04a4\u04a5\3\2\2\2\u04a5\u04aa\3\2\2\2\u04a6"+ - "\u04a8\7a\2\2\u04a7\u04a6\3\2\2\2\u04a7\u04a8\3\2\2\2\u04a8\u04a9\3\2"+ - "\2\2\u04a9\u04ab\5\u0144\u00a2\2\u04aa\u04a7\3\2\2\2\u04ab\u04ac\3\2\2"+ - "\2\u04ac\u04aa\3\2\2\2\u04ac\u04ad\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04af"+ - "\b\u008c\2\2\u04af\u0119\3\2\2\2\u04b0\u04b1\7\62\2\2\u04b1\u04b6\t\6"+ - "\2\2\u04b2\u04b4\7a\2\2\u04b3\u04b2\3\2\2\2\u04b3\u04b4\3\2\2\2\u04b4"+ - "\u04b5\3\2\2\2\u04b5\u04b7\5\u0146\u00a3\2\u04b6\u04b3\3\2\2\2\u04b7\u04b8"+ - "\3\2\2\2\u04b8\u04b6\3\2\2\2\u04b8\u04b9\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba"+ - "\u04bb\b\u008d\2\2\u04bb\u011b\3\2\2\2\u04bc\u04bd\7\62\2\2\u04bd\u04be"+ - "\t\6\2\2\u04be\u04bf\5\u011e\u008f\2\u04bf\u04c0\5\u0120\u0090\2\u04c0"+ - "\u011d\3\2\2\2\u04c1\u04c3\7a\2\2\u04c2\u04c1\3\2\2\2\u04c2\u04c3\3\2"+ - "\2\2\u04c3\u04c4\3\2\2\2\u04c4\u04c6\5\u0146\u00a3\2\u04c5\u04c2\3\2\2"+ - "\2\u04c6\u04c7\3\2\2\2\u04c7\u04c5\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04d3"+ - "\3\2\2\2\u04c9\u04d0\7\60\2\2\u04ca\u04cc\7a\2\2\u04cb\u04ca\3\2\2\2\u04cb"+ - "\u04cc\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd\u04cf\5\u0146\u00a3\2\u04ce\u04cb"+ - "\3\2\2\2\u04cf\u04d2\3\2\2\2\u04d0\u04ce\3\2\2\2\u04d0\u04d1\3\2\2\2\u04d1"+ - "\u04d4\3\2\2\2\u04d2\u04d0\3\2\2\2\u04d3\u04c9\3\2\2\2\u04d3\u04d4\3\2"+ - "\2\2\u04d4\u04e1\3\2\2\2\u04d5\u04d6\7\60\2\2\u04d6\u04dd\5\u0146\u00a3"+ - "\2\u04d7\u04d9\7a\2\2\u04d8\u04d7\3\2\2\2\u04d8\u04d9\3\2\2\2\u04d9\u04da"+ - "\3\2\2\2\u04da\u04dc\5\u0146\u00a3\2\u04db\u04d8\3\2\2\2\u04dc\u04df\3"+ - "\2\2\2\u04dd\u04db\3\2\2\2\u04dd\u04de\3\2\2\2\u04de\u04e1\3\2\2\2\u04df"+ - "\u04dd\3\2\2\2\u04e0\u04c5\3\2\2\2\u04e0\u04d5\3\2\2\2\u04e1\u011f\3\2"+ - "\2\2\u04e2\u04e3\t\7\2\2\u04e3\u04e4\t\b\2\2\u04e4\u04e5\5\u0142\u00a1"+ - "\2\u04e5\u0121\3\2\2\2\u04e6\u04ec\5\u0114\u008a\2\u04e7\u04ec\5\u0116"+ - "\u008b\2\u04e8\u04ec\5\u0118\u008c\2\u04e9\u04ec\5\u011a\u008d\2\u04ea"+ - "\u04ec\5\4\2\2\u04eb\u04e6\3\2\2\2\u04eb\u04e7\3\2\2\2\u04eb\u04e8\3\2"+ - "\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ea\3\2\2\2\u04ec\u04ed\3\2\2\2\u04ed"+ - "\u04ee\7k\2\2\u04ee\u04ef\3\2\2\2\u04ef\u04f0\b\u0091\2\2\u04f0\u0123"+ - "\3\2\2\2\u04f1\u04f4\7)\2\2\u04f2\u04f5\5\u013e\u009f\2\u04f3\u04f5\5"+ - "\u0128\u0094\2\u04f4\u04f2\3\2\2\2\u04f4\u04f3\3\2\2\2\u04f5\u04f6\3\2"+ - "\2\2\u04f6\u04f7\7)\2\2\u04f7\u0125\3\2\2\2\u04f8\u04f9\5\u0124\u0092"+ - "\2\u04f9\u04fa\3\2\2\2\u04fa\u04fb\b\u0093\2\2\u04fb\u0127\3\2\2\2\u04fc"+ - "\u04ff\5\u012a\u0095\2\u04fd\u04ff\5\u012c\u0096\2\u04fe\u04fc\3\2\2\2"+ - "\u04fe\u04fd\3\2\2\2\u04ff\u0129\3\2\2\2\u0500\u0501\7^\2\2\u0501\u0502"+ - "\5\u0144\u00a2\2\u0502\u0503\5\u0144\u00a2\2\u0503\u0504\5\u0144\u00a2"+ - "\2\u0504\u012b\3\2\2\2\u0505\u0506\7^\2\2\u0506\u0507\7z\2\2\u0507\u0508"+ - "\5\u0146\u00a3\2\u0508\u0509\5\u0146\u00a3\2\u0509\u012d\3\2\2\2\u050a"+ - "\u050b\7^\2\2\u050b\u050c\7w\2\2\u050c\u050d\5\u0146\u00a3\2\u050d\u050e"+ - "\5\u0146\u00a3\2\u050e\u050f\5\u0146\u00a3\2\u050f\u0510\5\u0146\u00a3"+ - "\2\u0510\u012f\3\2\2\2\u0511\u0512\7^\2\2\u0512\u0513\7W\2\2\u0513\u0514"+ - "\5\u0146\u00a3\2\u0514\u0515\5\u0146\u00a3\2\u0515\u0516\5\u0146\u00a3"+ - "\2\u0516\u0517\5\u0146\u00a3\2\u0517\u0518\5\u0146\u00a3\2\u0518\u0519"+ - "\5\u0146\u00a3\2\u0519\u051a\5\u0146\u00a3\2\u051a\u051b\5\u0146\u00a3"+ - "\2\u051b\u0131\3\2\2\2\u051c\u0520\7b\2\2\u051d\u051f\n\t\2\2\u051e\u051d"+ - "\3\2\2\2\u051f\u0522\3\2\2\2\u0520\u051e\3\2\2\2\u0520\u0521\3\2\2\2\u0521"+ - "\u0523\3\2\2\2\u0522\u0520\3\2\2\2\u0523\u0524\7b\2\2\u0524\u0525\3\2"+ - "\2\2\u0525\u0526\b\u0099\2\2\u0526\u0133\3\2\2\2\u0527\u052c\7$\2\2\u0528"+ - "\u052b\n\n\2\2\u0529\u052b\5\u0140\u00a0\2\u052a\u0528\3\2\2\2\u052a\u0529"+ - "\3\2\2\2\u052b\u052e\3\2\2\2\u052c\u052a\3\2\2\2\u052c\u052d\3\2\2\2\u052d"+ - "\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0530\7$\2\2\u0530\u0531\3\2"+ - "\2\2\u0531\u0532\b\u009a\2\2\u0532\u0135\3\2\2\2\u0533\u0535\t\13\2\2"+ - "\u0534\u0533\3\2\2\2\u0535\u0536\3\2\2\2\u0536\u0534\3\2\2\2\u0536\u0537"+ - "\3\2\2\2\u0537\u0538\3\2\2\2\u0538\u0539\b\u009b\3\2\u0539\u0137\3\2\2"+ - "\2\u053a\u053b\7\61\2\2\u053b\u053c\7,\2\2\u053c\u0540\3\2\2\2\u053d\u053f"+ - "\13\2\2\2\u053e\u053d\3\2\2\2\u053f\u0542\3\2\2\2\u0540\u0541\3\2\2\2"+ - "\u0540\u053e\3\2\2\2\u0541\u0543\3\2\2\2\u0542\u0540\3\2\2\2\u0543\u0544"+ - "\7,\2\2\u0544\u0545\7\61\2\2\u0545\u0546\3\2\2\2\u0546\u0547\b\u009c\3"+ - "\2\u0547\u0139\3\2\2\2\u0548\u054a\t\f\2\2\u0549\u0548\3\2\2\2\u054a\u054b"+ - "\3\2\2\2\u054b\u0549\3\2\2\2\u054b\u054c\3\2\2\2\u054c\u054d\3\2\2\2\u054d"+ - "\u054e\b\u009d\3\2\u054e\u013b\3\2\2\2\u054f\u0550\7\61\2\2\u0550\u0551"+ - "\7\61\2\2\u0551\u0555\3\2\2\2\u0552\u0554\n\f\2\2\u0553\u0552\3\2\2\2"+ - "\u0554\u0557\3\2\2\2\u0555\u0553\3\2\2\2\u0555\u0556\3\2\2\2\u0556\u0558"+ - "\3\2\2\2\u0557\u0555\3\2\2\2\u0558\u0559\b\u009e\3\2\u0559\u013d\3\2\2"+ - "\2\u055a\u055f\n\r\2\2\u055b\u055f\5\u012e\u0097\2\u055c\u055f\5\u0130"+ - "\u0098\2\u055d\u055f\5\u0140\u00a0\2\u055e\u055a\3\2\2\2\u055e\u055b\3"+ - "\2\2\2\u055e\u055c\3\2\2\2\u055e\u055d\3\2\2\2\u055f\u013f\3\2\2\2\u0560"+ - "\u057a\7^\2\2\u0561\u0562\7w\2\2\u0562\u0563\5\u0146\u00a3\2\u0563\u0564"+ - "\5\u0146\u00a3\2\u0564\u0565\5\u0146\u00a3\2\u0565\u0566\5\u0146\u00a3"+ - "\2\u0566\u057b\3\2\2\2\u0567\u0568\7W\2\2\u0568\u0569\5\u0146\u00a3\2"+ - "\u0569\u056a\5\u0146\u00a3\2\u056a\u056b\5\u0146\u00a3\2\u056b\u056c\5"+ - "\u0146\u00a3\2\u056c\u056d\5\u0146\u00a3\2\u056d\u056e\5\u0146\u00a3\2"+ - "\u056e\u056f\5\u0146\u00a3\2\u056f\u0570\5\u0146\u00a3\2\u0570\u057b\3"+ - "\2\2\2\u0571\u057b\t\16\2\2\u0572\u0573\5\u0144\u00a2\2\u0573\u0574\5"+ - "\u0144\u00a2\2\u0574\u0575\5\u0144\u00a2\2\u0575\u057b\3\2\2\2\u0576\u0577"+ - "\7z\2\2\u0577\u0578\5\u0146\u00a3\2\u0578\u0579\5\u0146\u00a3\2\u0579"+ - "\u057b\3\2\2\2\u057a\u0561\3\2\2\2\u057a\u0567\3\2\2\2\u057a\u0571\3\2"+ - "\2\2\u057a\u0572\3\2\2\2\u057a\u0576\3\2\2\2\u057b\u0141\3\2\2\2\u057c"+ - "\u0583\t\3\2\2\u057d\u057f\7a\2\2\u057e\u057d\3\2\2\2\u057e\u057f\3\2"+ - "\2\2\u057f\u0580\3\2\2\2\u0580\u0582\t\3\2\2\u0581\u057e\3\2\2\2\u0582"+ - "\u0585\3\2\2\2\u0583\u0581\3\2\2\2\u0583\u0584\3\2\2\2\u0584\u0143\3\2"+ - "\2\2\u0585\u0583\3\2\2\2\u0586\u0587\t\17\2\2\u0587\u0145\3\2\2\2\u0588"+ - "\u0589\t\20\2\2\u0589\u0147\3\2\2\2\u058a\u058b\t\21\2\2\u058b\u0149\3"+ - "\2\2\2\u058c\u058e\t\22\2\2\u058d\u058f\t\b\2\2\u058e\u058d\3\2\2\2\u058e"+ - "\u058f\3\2\2\2\u058f\u0590\3\2\2\2\u0590\u0591\5\u0142\u00a1\2\u0591\u014b"+ - "\3\2\2\2\u0592\u0595\5\u0150\u00a8\2\u0593\u0595\7a\2\2\u0594\u0592\3"+ - "\2\2\2\u0594\u0593\3\2\2\2\u0595\u014d\3\2\2\2\u0596\u0597\t\23\2\2\u0597"+ - "\u014f\3\2\2\2\u0598\u0599\t\24\2\2\u0599\u0151\3\2\2\2\u059a\u059c\t"+ - "\13\2\2\u059b\u059a\3\2\2\2\u059c\u059d\3\2\2\2\u059d\u059b\3\2\2\2\u059d"+ - "\u059e\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u05a0\b\u00a9\3\2\u05a0\u0153"+ - "\3\2\2\2\u05a1\u05a2\7\61\2\2\u05a2\u05a3\7,\2\2\u05a3\u05a7\3\2\2\2\u05a4"+ - "\u05a6\n\f\2\2\u05a5\u05a4\3\2\2\2\u05a6\u05a9\3\2\2\2\u05a7\u05a8\3\2"+ - "\2\2\u05a7\u05a5\3\2\2\2\u05a8\u05aa\3\2\2\2\u05a9\u05a7\3\2\2\2\u05aa"+ - "\u05ab\7,\2\2\u05ab\u05ac\7\61\2\2\u05ac\u05ad\3\2\2\2\u05ad\u05ae\b\u00aa"+ - "\3\2\u05ae\u0155\3\2\2\2\u05af\u05b0\7\61\2\2\u05b0\u05b1\7\61\2\2\u05b1"+ - "\u05b5\3\2\2\2\u05b2\u05b4\n\f\2\2\u05b3\u05b2\3\2\2\2\u05b4\u05b7\3\2"+ - "\2\2\u05b5\u05b3\3\2\2\2\u05b5\u05b6\3\2\2\2\u05b6\u05b8\3\2\2\2\u05b7"+ - "\u05b5\3\2\2\2\u05b8\u05b9\b\u00ab\3\2\u05b9\u0157\3\2\2\2\u05ba\u05bc"+ - "\t\f\2\2\u05bb\u05ba\3\2\2\2\u05bc\u05bd\3\2\2\2\u05bd\u05bb\3\2\2\2\u05bd"+ - "\u05be\3\2\2\2\u05be\u05cd\3\2\2\2\u05bf\u05cd\7=\2\2\u05c0\u05c1\7\61"+ - "\2\2\u05c1\u05c2\7,\2\2\u05c2\u05c6\3\2\2\2\u05c3\u05c5\13\2\2\2\u05c4"+ - "\u05c3\3\2\2\2\u05c5\u05c8\3\2\2\2\u05c6\u05c7\3\2\2\2\u05c6\u05c4\3\2"+ - "\2\2\u05c7\u05c9\3\2\2\2\u05c8\u05c6\3\2\2\2\u05c9\u05ca\7,\2\2\u05ca"+ - "\u05cd\7\61\2\2\u05cb\u05cd\7\2\2\3\u05cc\u05bb\3\2\2\2\u05cc\u05bf\3"+ - "\2\2\2\u05cc\u05c0\3\2\2\2\u05cc\u05cb\3\2\2\2\u05cd\u05ce\3\2\2\2\u05ce"+ - "\u05cf\b\u00ac\4\2\u05cf\u0159\3\2\2\2\u05d0\u05d1\3\2\2\2\u05d1\u05d2"+ - "\3\2\2\2\u05d2\u05d3\b\u00ad\4\2\u05d3\u05d4\b\u00ad\3\2\u05d4\u015b\3"+ - "\2\2\2\64\2\3\u015e\u0166\u0169\u016c\u0172\u0174\u041f\u0421\u048a\u048f"+ - "\u0492\u0499\u049e\u04a4\u04a7\u04ac\u04b3\u04b8\u04c2\u04c7\u04cb\u04d0"+ - "\u04d3\u04d8\u04dd\u04e0\u04eb\u04f4\u04fe\u0520\u052a\u052c\u0536\u0540"+ - "\u054b\u0555\u055e\u057a\u057e\u0583\u058e\u0594\u059d\u05a7\u05b5\u05bd"+ - "\u05c6\u05cc\5\4\3\2\2\3\2\4\2\2"; + "\3\2\2\2\2\u013a\3\2\2\2\2\u013c\3\2\2\2\2\u013e\3\2\2\2\3\u0154\3\2\2"+ + "\2\3\u0156\3\2\2\2\3\u0158\3\2\2\2\3\u015a\3\2\2\2\3\u015c\3\2\2\2\4\u0160"+ + "\3\2\2\2\6\u0176\3\2\2\2\b\u0178\3\2\2\2\n\u017f\3\2\2\2\f\u0187\3\2\2"+ + "\2\16\u018e\3\2\2\2\20\u0195\3\2\2\2\22\u019c\3\2\2\2\24\u01a3\3\2\2\2"+ + "\26\u01ac\3\2\2\2\30\u01b6\3\2\2\2\32\u01be\3\2\2\2\34\u01c8\3\2\2\2\36"+ + "\u01d4\3\2\2\2 \u01db\3\2\2\2\"\u01e6\3\2\2\2$\u01e9\3\2\2\2&\u01ef\3"+ + "\2\2\2(\u01f8\3\2\2\2*\u01fd\3\2\2\2,\u0204\3\2\2\2.\u020b\3\2\2\2\60"+ + "\u0211\3\2\2\2\62\u0216\3\2\2\2\64\u021d\3\2\2\2\66\u0227\3\2\2\28\u022b"+ + "\3\2\2\2:\u0231\3\2\2\2<\u0234\3\2\2\2>\u0236\3\2\2\2@\u023d\3\2\2\2B"+ + "\u0243\3\2\2\2D\u0250\3\2\2\2F\u0259\3\2\2\2H\u025d\3\2\2\2J\u0261\3\2"+ + "\2\2L\u0267\3\2\2\2N\u0269\3\2\2\2P\u026c\3\2\2\2R\u0271\3\2\2\2T\u0277"+ + "\3\2\2\2V\u027d\3\2\2\2X\u0284\3\2\2\2Z\u028b\3\2\2\2\\\u0294\3\2\2\2"+ + "^\u029a\3\2\2\2`\u02a0\3\2\2\2b\u02a7\3\2\2\2d\u02ad\3\2\2\2f\u02b4\3"+ + "\2\2\2h\u02ba\3\2\2\2j\u02c3\3\2\2\2l\u02cb\3\2\2\2n\u02d1\3\2\2\2p\u02d9"+ + "\3\2\2\2r\u02e0\3\2\2\2t\u02e5\3\2\2\2v\u02ee\3\2\2\2x\u02fd\3\2\2\2z"+ + "\u0303\3\2\2\2|\u0307\3\2\2\2~\u030a\3\2\2\2\u0080\u0311\3\2\2\2\u0082"+ + "\u031b\3\2\2\2\u0084\u0325\3\2\2\2\u0086\u0331\3\2\2\2\u0088\u033a\3\2"+ + "\2\2\u008a\u0344\3\2\2\2\u008c\u034c\3\2\2\2\u008e\u0358\3\2\2\2\u0090"+ + "\u0367\3\2\2\2\u0092\u036d\3\2\2\2\u0094\u0371\3\2\2\2\u0096\u0375\3\2"+ + "\2\2\u0098\u037a\3\2\2\2\u009a\u0382\3\2\2\2\u009c\u038a\3\2\2\2\u009e"+ + "\u038f\3\2\2\2\u00a0\u0399\3\2\2\2\u00a2\u03a0\3\2\2\2\u00a4\u03a5\3\2"+ + "\2\2\u00a6\u03ab\3\2\2\2\u00a8\u03ae\3\2\2\2\u00aa\u03b2\3\2\2\2\u00ac"+ + "\u03b9\3\2\2\2\u00ae\u03be\3\2\2\2\u00b0\u03c3\3\2\2\2\u00b2\u03c8\3\2"+ + "\2\2\u00b4\u03d0\3\2\2\2\u00b6\u03d7\3\2\2\2\u00b8\u03dd\3\2\2\2\u00ba"+ + "\u03eb\3\2\2\2\u00bc\u03ee\3\2\2\2\u00be\u03f4\3\2\2\2\u00c0\u03f9\3\2"+ + "\2\2\u00c2\u0404\3\2\2\2\u00c4\u0408\3\2\2\2\u00c6\u040f\3\2\2\2\u00c8"+ + "\u0418\3\2\2\2\u00ca\u041c\3\2\2\2\u00cc\u0422\3\2\2\2\u00ce\u042c\3\2"+ + "\2\2\u00d0\u042e\3\2\2\2\u00d2\u0432\3\2\2\2\u00d4\u0434\3\2\2\2\u00d6"+ + "\u0438\3\2\2\2\u00d8\u043a\3\2\2\2\u00da\u043e\3\2\2\2\u00dc\u0440\3\2"+ + "\2\2\u00de\u0442\3\2\2\2\u00e0\u0444\3\2\2\2\u00e2\u0446\3\2\2\2\u00e4"+ + "\u0448\3\2\2\2\u00e6\u044d\3\2\2\2\u00e8\u0452\3\2\2\2\u00ea\u0455\3\2"+ + "\2\2\u00ec\u0459\3\2\2\2\u00ee\u045c\3\2\2\2\u00f0\u045f\3\2\2\2\u00f2"+ + "\u0462\3\2\2\2\u00f4\u0465\3\2\2\2\u00f6\u0467\3\2\2\2\u00f8\u046a\3\2"+ + "\2\2\u00fa\u046c\3\2\2\2\u00fc\u046f\3\2\2\2\u00fe\u0471\3\2\2\2\u0100"+ + "\u0473\3\2\2\2\u0102\u0475\3\2\2\2\u0104\u0478\3\2\2\2\u0106\u047b\3\2"+ + "\2\2\u0108\u047e\3\2\2\2\u010a\u0480\3\2\2\2\u010c\u0482\3\2\2\2\u010e"+ + "\u0484\3\2\2\2\u0110\u0486\3\2\2\2\u0112\u0488\3\2\2\2\u0114\u048a\3\2"+ + "\2\2\u0116\u0498\3\2\2\2\u0118\u049c\3\2\2\2\u011a\u04a8\3\2\2\2\u011c"+ + "\u04b6\3\2\2\2\u011e\u04c2\3\2\2\2\u0120\u04e6\3\2\2\2\u0122\u04e8\3\2"+ + "\2\2\u0124\u04f1\3\2\2\2\u0126\u04f7\3\2\2\2\u0128\u04fe\3\2\2\2\u012a"+ + "\u0504\3\2\2\2\u012c\u0506\3\2\2\2\u012e\u050b\3\2\2\2\u0130\u0510\3\2"+ + "\2\2\u0132\u0517\3\2\2\2\u0134\u0522\3\2\2\2\u0136\u052d\3\2\2\2\u0138"+ + "\u053a\3\2\2\2\u013a\u0540\3\2\2\2\u013c\u054f\3\2\2\2\u013e\u0555\3\2"+ + "\2\2\u0140\u0564\3\2\2\2\u0142\u0566\3\2\2\2\u0144\u0582\3\2\2\2\u0146"+ + "\u058c\3\2\2\2\u0148\u058e\3\2\2\2\u014a\u0590\3\2\2\2\u014c\u0592\3\2"+ + "\2\2\u014e\u059a\3\2\2\2\u0150\u059c\3\2\2\2\u0152\u059e\3\2\2\2\u0154"+ + "\u05a1\3\2\2\2\u0156\u05a7\3\2\2\2\u0158\u05b5\3\2\2\2\u015a\u05d2\3\2"+ + "\2\2\u015c\u05d6\3\2\2\2\u015e\u0161\5\6\3\2\u015f\u0161\5\u011e\u008f"+ + "\2\u0160\u015e\3\2\2\2\u0160\u015f\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0163"+ + "\b\2\2\2\u0163\5\3\2\2\2\u0164\u016e\5\u0144\u00a2\2\u0165\u0166\7\60"+ + "\2\2\u0166\u0168\6\3\2\2\u0167\u0169\5\u0144\u00a2\2\u0168\u0167\3\2\2"+ + "\2\u0168\u0169\3\2\2\2\u0169\u016b\3\2\2\2\u016a\u016c\5\u014c\u00a6\2"+ + "\u016b\u016a\3\2\2\2\u016b\u016c\3\2\2\2\u016c\u016f\3\2\2\2\u016d\u016f"+ + "\5\u014c\u00a6\2\u016e\u0165\3\2\2\2\u016e\u016d\3\2\2\2\u016f\u0177\3"+ + "\2\2\2\u0170\u0171\7\60\2\2\u0171\u0172\6\3\3\2\u0172\u0174\5\u0144\u00a2"+ + "\2\u0173\u0175\5\u014c\u00a6\2\u0174\u0173\3\2\2\2\u0174\u0175\3\2\2\2"+ + "\u0175\u0177\3\2\2\2\u0176\u0164\3\2\2\2\u0176\u0170\3\2\2\2\u0177\7\3"+ + "\2\2\2\u0178\u0179\7v\2\2\u0179\u017a\7t\2\2\u017a\u017b\7w\2\2\u017b"+ + "\u017c\7g\2\2\u017c\u017d\3\2\2\2\u017d\u017e\b\4\2\2\u017e\t\3\2\2\2"+ + "\u017f\u0180\7h\2\2\u0180\u0181\7c\2\2\u0181\u0182\7n\2\2\u0182\u0183"+ + "\7u\2\2\u0183\u0184\7g\2\2\u0184\u0185\3\2\2\2\u0185\u0186\b\5\2\2\u0186"+ + "\13\3\2\2\2\u0187\u0188\7c\2\2\u0188\u0189\7u\2\2\u0189\u018a\7u\2\2\u018a"+ + "\u018b\7g\2\2\u018b\u018c\7t\2\2\u018c\u018d\7v\2\2\u018d\r\3\2\2\2\u018e"+ + "\u018f\7c\2\2\u018f\u0190\7u\2\2\u0190\u0191\7u\2\2\u0191\u0192\7w\2\2"+ + "\u0192\u0193\7o\2\2\u0193\u0194\7g\2\2\u0194\17\3\2\2\2\u0195\u0196\7"+ + "k\2\2\u0196\u0197\7p\2\2\u0197\u0198\7j\2\2\u0198\u0199\7c\2\2\u0199\u019a"+ + "\7n\2\2\u019a\u019b\7g\2\2\u019b\21\3\2\2\2\u019c\u019d\7g\2\2\u019d\u019e"+ + "\7z\2\2\u019e\u019f\7j\2\2\u019f\u01a0\7c\2\2\u01a0\u01a1\7n\2\2\u01a1"+ + "\u01a2\7g\2\2\u01a2\23\3\2\2\2\u01a3\u01a4\7t\2\2\u01a4\u01a5\7g\2\2\u01a5"+ + "\u01a6\7s\2\2\u01a6\u01a7\7w\2\2\u01a7\u01a8\7k\2\2\u01a8\u01a9\7t\2\2"+ + "\u01a9\u01aa\7g\2\2\u01aa\u01ab\7u\2\2\u01ab\25\3\2\2\2\u01ac\u01ad\7"+ + "r\2\2\u01ad\u01ae\7t\2\2\u01ae\u01af\7g\2\2\u01af\u01b0\7u\2\2\u01b0\u01b1"+ + "\7g\2\2\u01b1\u01b2\7t\2\2\u01b2\u01b3\7x\2\2\u01b3\u01b4\7g\2\2\u01b4"+ + "\u01b5\7u\2\2\u01b5\27\3\2\2\2\u01b6\u01b7\7g\2\2\u01b7\u01b8\7p\2\2\u01b8"+ + "\u01b9\7u\2\2\u01b9\u01ba\7w\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7g\2\2"+ + "\u01bc\u01bd\7u\2\2\u01bd\31\3\2\2\2\u01be\u01bf\7k\2\2\u01bf\u01c0\7"+ + "p\2\2\u01c0\u01c1\7x\2\2\u01c1\u01c2\7c\2\2\u01c2\u01c3\7t\2\2\u01c3\u01c4"+ + "\7k\2\2\u01c4\u01c5\7c\2\2\u01c5\u01c6\7p\2\2\u01c6\u01c7\7v\2\2\u01c7"+ + "\33\3\2\2\2\u01c8\u01c9\7f\2\2\u01c9\u01ca\7g\2\2\u01ca\u01cb\7e\2\2\u01cb"+ + "\u01cc\7t\2\2\u01cc\u01cd\7g\2\2\u01cd\u01ce\7c\2\2\u01ce\u01cf\7u\2\2"+ + "\u01cf\u01d0\7g\2\2\u01d0\u01d1\7u\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d3"+ + "\b\16\2\2\u01d3\35\3\2\2\2\u01d4\u01d5\7r\2\2\u01d5\u01d6\7w\2\2\u01d6"+ + "\u01d7\7t\2\2\u01d7\u01d8\7g\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01da\b\17"+ + "\2\2\u01da\37\3\2\2\2\u01db\u01dc\7k\2\2\u01dc\u01dd\7o\2\2\u01dd\u01de"+ + "\7r\2\2\u01de\u01df\7n\2\2\u01df\u01e0\7g\2\2\u01e0\u01e1\7o\2\2\u01e1"+ + "\u01e2\7g\2\2\u01e2\u01e3\7p\2\2\u01e3\u01e4\7v\2\2\u01e4\u01e5\7u\2\2"+ + "\u01e5!\3\2\2\2\u01e6\u01e7\7c\2\2\u01e7\u01e8\7u\2\2\u01e8#\3\2\2\2\u01e9"+ + "\u01ea\7q\2\2\u01ea\u01eb\7n\2\2\u01eb\u01ec\7f\2\2\u01ec\u01ed\3\2\2"+ + "\2\u01ed\u01ee\b\22\2\2\u01ee%\3\2\2\2\u01ef\u01f0\7d\2\2\u01f0\u01f1"+ + "\7g\2\2\u01f1\u01f2\7h\2\2\u01f2\u01f3\7q\2\2\u01f3\u01f4\7t\2\2\u01f4"+ + "\u01f5\7g\2\2\u01f5\u01f6\3\2\2\2\u01f6\u01f7\b\23\2\2\u01f7\'\3\2\2\2"+ + "\u01f8\u01f9\7%\2\2\u01f9\u01fa\7n\2\2\u01fa\u01fb\7j\2\2\u01fb\u01fc"+ + "\7u\2\2\u01fc)\3\2\2\2\u01fd\u01fe\7h\2\2\u01fe\u01ff\7q\2\2\u01ff\u0200"+ + "\7t\2\2\u0200\u0201\7c\2\2\u0201\u0202\7n\2\2\u0202\u0203\7n\2\2\u0203"+ + "+\3\2\2\2\u0204\u0205\7g\2\2\u0205\u0206\7z\2\2\u0206\u0207\7k\2\2\u0207"+ + "\u0208\7u\2\2\u0208\u0209\7v\2\2\u0209\u020a\7u\2\2\u020a-\3\2\2\2\u020b"+ + "\u020c\7c\2\2\u020c\u020d\7e\2\2\u020d\u020e\7e\2\2\u020e\u020f\3\2\2"+ + "\2\u020f\u0210\b\27\2\2\u0210/\3\2\2\2\u0211\u0212\7h\2\2\u0212\u0213"+ + "\7q\2\2\u0213\u0214\7n\2\2\u0214\u0215\7f\2\2\u0215\61\3\2\2\2\u0216\u0217"+ + "\7w\2\2\u0217\u0218\7p\2\2\u0218\u0219\7h\2\2\u0219\u021a\7q\2\2\u021a"+ + "\u021b\7n\2\2\u021b\u021c\7f\2\2\u021c\63\3\2\2\2\u021d\u021e\7w\2\2\u021e"+ + "\u021f\7p\2\2\u021f\u0220\7h\2\2\u0220\u0221\7q\2\2\u0221\u0222\7n\2\2"+ + "\u0222\u0223\7f\2\2\u0223\u0224\7k\2\2\u0224\u0225\7p\2\2\u0225\u0226"+ + "\7i\2\2\u0226\65\3\2\2\2\u0227\u0228\7n\2\2\u0228\u0229\7g\2\2\u0229\u022a"+ + "\7v\2\2\u022a\67\3\2\2\2\u022b\u022c\7i\2\2\u022c\u022d\7j\2\2\u022d\u022e"+ + "\7q\2\2\u022e\u022f\7u\2\2\u022f\u0230\7v\2\2\u02309\3\2\2\2\u0231\u0232"+ + "\7k\2\2\u0232\u0233\7p\2\2\u0233;\3\2\2\2\u0234\u0235\7%\2\2\u0235=\3"+ + "\2\2\2\u0236\u0237\7u\2\2\u0237\u0238\7w\2\2\u0238\u0239\7d\2\2\u0239"+ + "\u023a\7u\2\2\u023a\u023b\7g\2\2\u023b\u023c\7v\2\2\u023c?\3\2\2\2\u023d"+ + "\u023e\7w\2\2\u023e\u023f\7p\2\2\u023f\u0240\7k\2\2\u0240\u0241\7q\2\2"+ + "\u0241\u0242\7p\2\2\u0242A\3\2\2\2\u0243\u0244\7k\2\2\u0244\u0245\7p\2"+ + "\2\u0245\u0246\7v\2\2\u0246\u0247\7g\2\2\u0247\u0248\7t\2\2\u0248\u0249"+ + "\7u\2\2\u0249\u024a\7g\2\2\u024a\u024b\7e\2\2\u024b\u024c\7v\2\2\u024c"+ + "\u024d\7k\2\2\u024d\u024e\7q\2\2\u024e\u024f\7p\2\2\u024fC\3\2\2\2\u0250"+ + "\u0251\7u\2\2\u0251\u0252\7g\2\2\u0252\u0253\7v\2\2\u0253\u0254\7o\2\2"+ + "\u0254\u0255\7k\2\2\u0255\u0256\7p\2\2\u0256\u0257\7w\2\2\u0257\u0258"+ + "\7u\2\2\u0258E\3\2\2\2\u0259\u025a\7?\2\2\u025a\u025b\7?\2\2\u025b\u025c"+ + "\7@\2\2\u025cG\3\2\2\2\u025d\u025e\7/\2\2\u025e\u025f\7/\2\2\u025f\u0260"+ + "\7,\2\2\u0260I\3\2\2\2\u0261\u0262\7c\2\2\u0262\u0263\7r\2\2\u0263\u0264"+ + "\7r\2\2\u0264\u0265\7n\2\2\u0265\u0266\7{\2\2\u0266K\3\2\2\2\u0267\u0268"+ + "\7A\2\2\u0268M\3\2\2\2\u0269\u026a\7#\2\2\u026a\u026b\7>\2\2\u026bO\3"+ + "\2\2\2\u026c\u026d\7#\2\2\u026d\u026e\7@\2\2\u026e\u026f\3\2\2\2\u026f"+ + "\u0270\b(\2\2\u0270Q\3\2\2\2\u0271\u0272\7u\2\2\u0272\u0273\7g\2\2\u0273"+ + "\u0274\7s\2\2\u0274\u0275\3\2\2\2\u0275\u0276\b)\2\2\u0276S\3\2\2\2\u0277"+ + "\u0278\7u\2\2\u0278\u0279\7g\2\2\u0279\u027a\7v\2\2\u027a\u027b\3\2\2"+ + "\2\u027b\u027c\b*\2\2\u027cU\3\2\2\2\u027d\u027e\7o\2\2\u027e\u027f\7"+ + "u\2\2\u027f\u0280\7g\2\2\u0280\u0281\7v\2\2\u0281\u0282\3\2\2\2\u0282"+ + "\u0283\b+\2\2\u0283W\3\2\2\2\u0284\u0285\7f\2\2\u0285\u0286\7k\2\2\u0286"+ + "\u0287\7e\2\2\u0287\u0288\7v\2\2\u0288\u0289\3\2\2\2\u0289\u028a\b,\2"+ + "\2\u028aY\3\2\2\2\u028b\u028c\7q\2\2\u028c\u028d\7r\2\2\u028d\u028e\7"+ + "v\2\2\u028e\u028f\7k\2\2\u028f\u0290\7q\2\2\u0290\u0291\7p\2\2\u0291\u0292"+ + "\3\2\2\2\u0292\u0293\b-\2\2\u0293[\3\2\2\2\u0294\u0295\7n\2\2\u0295\u0296"+ + "\7g\2\2\u0296\u0297\7p\2\2\u0297\u0298\3\2\2\2\u0298\u0299\b.\2\2\u0299"+ + "]\3\2\2\2\u029a\u029b\7p\2\2\u029b\u029c\7g\2\2\u029c\u029d\7y\2\2\u029d"+ + "\u029e\3\2\2\2\u029e\u029f\b/\2\2\u029f_\3\2\2\2\u02a0\u02a1\7o\2\2\u02a1"+ + "\u02a2\7c\2\2\u02a2\u02a3\7m\2\2\u02a3\u02a4\7g\2\2\u02a4\u02a5\3\2\2"+ + "\2\u02a5\u02a6\b\60\2\2\u02a6a\3\2\2\2\u02a7\u02a8\7e\2\2\u02a8\u02a9"+ + "\7c\2\2\u02a9\u02aa\7r\2\2\u02aa\u02ab\3\2\2\2\u02ab\u02ac\b\61\2\2\u02ac"+ + "c\3\2\2\2\u02ad\u02ae\7u\2\2\u02ae\u02af\7q\2\2\u02af\u02b0\7o\2\2\u02b0"+ + "\u02b1\7g\2\2\u02b1\u02b2\3\2\2\2\u02b2\u02b3\b\62\2\2\u02b3e\3\2\2\2"+ + "\u02b4\u02b5\7i\2\2\u02b5\u02b6\7g\2\2\u02b6\u02b7\7v\2\2\u02b7\u02b8"+ + "\3\2\2\2\u02b8\u02b9\b\63\2\2\u02b9g\3\2\2\2\u02ba\u02bb\7f\2\2\u02bb"+ + "\u02bc\7q\2\2\u02bc\u02bd\7o\2\2\u02bd\u02be\7c\2\2\u02be\u02bf\7k\2\2"+ + "\u02bf\u02c0\7p\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\b\64\2\2\u02c2i\3"+ + "\2\2\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7z\2\2\u02c5\u02c6\7k\2\2\u02c6"+ + "\u02c7\7q\2\2\u02c7\u02c8\7o\2\2\u02c8\u02c9\3\2\2\2\u02c9\u02ca\b\65"+ + "\2\2\u02cak\3\2\2\2\u02cb\u02cc\7c\2\2\u02cc\u02cd\7f\2\2\u02cd\u02ce"+ + "\7v\2\2\u02ce\u02cf\3\2\2\2\u02cf\u02d0\b\66\2\2\u02d0m\3\2\2\2\u02d1"+ + "\u02d2\7o\2\2\u02d2\u02d3\7c\2\2\u02d3\u02d4\7v\2\2\u02d4\u02d5\7e\2\2"+ + "\u02d5\u02d6\7j\2\2\u02d6\u02d7\3\2\2\2\u02d7\u02d8\b\67\2\2\u02d8o\3"+ + "\2\2\2\u02d9\u02da\7p\2\2\u02da\u02db\7q\2\2\u02db\u02dc\7p\2\2\u02dc"+ + "\u02dd\7g\2\2\u02dd\u02de\3\2\2\2\u02de\u02df\b8\2\2\u02dfq\3\2\2\2\u02e0"+ + "\u02e1\7r\2\2\u02e1\u02e2\7t\2\2\u02e2\u02e3\7g\2\2\u02e3\u02e4\7f\2\2"+ + "\u02e4s\3\2\2\2\u02e5\u02e6\7v\2\2\u02e6\u02e7\7{\2\2\u02e7\u02e8\7r\2"+ + "\2\u02e8\u02e9\7g\2\2\u02e9\u02ea\7Q\2\2\u02ea\u02eb\7h\2\2\u02eb\u02ec"+ + "\3\2\2\2\u02ec\u02ed\b:\2\2\u02edu\3\2\2\2\u02ee\u02ef\7k\2\2\u02ef\u02f0"+ + "\7u\2\2\u02f0\u02f1\7E\2\2\u02f1\u02f2\7q\2\2\u02f2\u02f3\7o\2\2\u02f3"+ + "\u02f4\7r\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7t\2\2\u02f6\u02f7\7c\2\2"+ + "\u02f7\u02f8\7d\2\2\u02f8\u02f9\7n\2\2\u02f9\u02fa\7g\2\2\u02fa\u02fb"+ + "\3\2\2\2\u02fb\u02fc\b;\2\2\u02fcw\3\2\2\2\u02fd\u02fe\7u\2\2\u02fe\u02ff"+ + "\7j\2\2\u02ff\u0300\7c\2\2\u0300\u0301\7t\2\2\u0301\u0302\7g\2\2\u0302"+ + "y\3\2\2\2\u0303\u0304\7B\2\2\u0304\u0305\3\2\2\2\u0305\u0306\b=\2\2\u0306"+ + "{\3\2\2\2\u0307\u0308\7\60\2\2\u0308\u0309\7\60\2\2\u0309}\3\2\2\2\u030a"+ + "\u030b\7u\2\2\u030b\u030c\7j\2\2\u030c\u030d\7c\2\2\u030d\u030e\7t\2\2"+ + "\u030e\u030f\7g\2\2\u030f\u0310\7f\2\2\u0310\177\3\2\2\2\u0311\u0312\7"+ + "g\2\2\u0312\u0313\7z\2\2\u0313\u0314\7e\2\2\u0314\u0315\7n\2\2\u0315\u0316"+ + "\7w\2\2\u0316\u0317\7u\2\2\u0317\u0318\7k\2\2\u0318\u0319\7x\2\2\u0319"+ + "\u031a\7g\2\2\u031a\u0081\3\2\2\2\u031b\u031c\7r\2\2\u031c\u031d\7t\2"+ + "\2\u031d\u031e\7g\2\2\u031e\u031f\7f\2\2\u031f\u0320\7k\2\2\u0320\u0321"+ + "\7e\2\2\u0321\u0322\7c\2\2\u0322\u0323\7v\2\2\u0323\u0324\7g\2\2\u0324"+ + "\u0083\3\2\2\2\u0325\u0326\7y\2\2\u0326\u0327\7t\2\2\u0327\u0328\7k\2"+ + "\2\u0328\u0329\7v\2\2\u0329\u032a\7g\2\2\u032a\u032b\7R\2\2\u032b\u032c"+ + "\7g\2\2\u032c\u032d\7t\2\2\u032d\u032e\7o\2\2\u032e\u032f\3\2\2\2\u032f"+ + "\u0330\bB\2\2\u0330\u0085\3\2\2\2\u0331\u0332\7p\2\2\u0332\u0333\7q\2"+ + "\2\u0333\u0334\7R\2\2\u0334\u0335\7g\2\2\u0335\u0336\7t\2\2\u0336\u0337"+ + "\7o\2\2\u0337\u0338\3\2\2\2\u0338\u0339\bC\2\2\u0339\u0087\3\2\2\2\u033a"+ + "\u033b\7v\2\2\u033b\u033c\7t\2\2\u033c\u033d\7w\2\2\u033d\u033e\7u\2\2"+ + "\u033e\u033f\7v\2\2\u033f\u0340\7g\2\2\u0340\u0341\7f\2\2\u0341\u0342"+ + "\3\2\2\2\u0342\u0343\bD\2\2\u0343\u0089\3\2\2\2\u0344\u0345\7q\2\2\u0345"+ + "\u0346\7w\2\2\u0346\u0347\7v\2\2\u0347\u0348\7n\2\2\u0348\u0349\7k\2\2"+ + "\u0349\u034a\7p\2\2\u034a\u034b\7g\2\2\u034b\u008b\3\2\2\2\u034c\u034d"+ + "\7k\2\2\u034d\u034e\7p\2\2\u034e\u034f\7k\2\2\u034f\u0350\7v\2\2\u0350"+ + "\u0351\7G\2\2\u0351\u0352\7p\2\2\u0352\u0353\7u\2\2\u0353\u0354\7w\2\2"+ + "\u0354\u0355\7t\2\2\u0355\u0356\7g\2\2\u0356\u0357\7u\2\2\u0357\u008d"+ + "\3\2\2\2\u0358\u0359\7k\2\2\u0359\u035a\7o\2\2\u035a\u035b\7r\2\2\u035b"+ + "\u035c\7q\2\2\u035c\u035d\7t\2\2\u035d\u035e\7v\2\2\u035e\u035f\7T\2\2"+ + "\u035f\u0360\7g\2\2\u0360\u0361\7s\2\2\u0361\u0362\7w\2\2\u0362\u0363"+ + "\7k\2\2\u0363\u0364\7t\2\2\u0364\u0365\7g\2\2\u0365\u0366\7u\2\2\u0366"+ + "\u008f\3\2\2\2\u0367\u0368\7r\2\2\u0368\u0369\7t\2\2\u0369\u036a\7q\2"+ + "\2\u036a\u036b\7q\2\2\u036b\u036c\7h\2\2\u036c\u0091\3\2\2\2\u036d\u036e"+ + "\7?\2\2\u036e\u036f\7?\2\2\u036f\u0370\7?\2\2\u0370\u0093\3\2\2\2\u0371"+ + "\u0372\7#\2\2\u0372\u0373\7?\2\2\u0373\u0374\7?\2\2\u0374\u0095\3\2\2"+ + "\2\u0375\u0376\7y\2\2\u0376\u0377\7k\2\2\u0377\u0378\7v\2\2\u0378\u0379"+ + "\7j\2\2\u0379\u0097\3\2\2\2\u037a\u037b\7d\2\2\u037b\u037c\7t\2\2\u037c"+ + "\u037d\7g\2\2\u037d\u037e\7c\2\2\u037e\u037f\7m\2\2\u037f\u0380\3\2\2"+ + "\2\u0380\u0381\bL\2\2\u0381\u0099\3\2\2\2\u0382\u0383\7f\2\2\u0383\u0384"+ + "\7g\2\2\u0384\u0385\7h\2\2\u0385\u0386\7c\2\2\u0386\u0387\7w\2\2\u0387"+ + "\u0388\7n\2\2\u0388\u0389\7v\2\2\u0389\u009b\3\2\2\2\u038a\u038b\7h\2"+ + "\2\u038b\u038c\7w\2\2\u038c\u038d\7p\2\2\u038d\u038e\7e\2\2\u038e\u009d"+ + "\3\2\2\2\u038f\u0390\7k\2\2\u0390\u0391\7p\2\2\u0391\u0392\7v\2\2\u0392"+ + "\u0393\7g\2\2\u0393\u0394\7t\2\2\u0394\u0395\7h\2\2\u0395\u0396\7c\2\2"+ + "\u0396\u0397\7e\2\2\u0397\u0398\7g\2\2\u0398\u009f\3\2\2\2\u0399\u039a"+ + "\7u\2\2\u039a\u039b\7g\2\2\u039b\u039c\7n\2\2\u039c\u039d\7g\2\2\u039d"+ + "\u039e\7e\2\2\u039e\u039f\7v\2\2\u039f\u00a1\3\2\2\2\u03a0\u03a1\7e\2"+ + "\2\u03a1\u03a2\7c\2\2\u03a2\u03a3\7u\2\2\u03a3\u03a4\7g\2\2\u03a4\u00a3"+ + "\3\2\2\2\u03a5\u03a6\7f\2\2\u03a6\u03a7\7g\2\2\u03a7\u03a8\7h\2\2\u03a8"+ + "\u03a9\7g\2\2\u03a9\u03aa\7t\2\2\u03aa\u00a5\3\2\2\2\u03ab\u03ac\7i\2"+ + "\2\u03ac\u03ad\7q\2\2\u03ad\u00a7\3\2\2\2\u03ae\u03af\7o\2\2\u03af\u03b0"+ + "\7c\2\2\u03b0\u03b1\7r\2\2\u03b1\u00a9\3\2\2\2\u03b2\u03b3\7u\2\2\u03b3"+ + "\u03b4\7v\2\2\u03b4\u03b5\7t\2\2\u03b5\u03b6\7w\2\2\u03b6\u03b7\7e\2\2"+ + "\u03b7\u03b8\7v\2\2\u03b8\u00ab\3\2\2\2\u03b9\u03ba\7e\2\2\u03ba\u03bb"+ + "\7j\2\2\u03bb\u03bc\7c\2\2\u03bc\u03bd\7p\2\2\u03bd\u00ad\3\2\2\2\u03be"+ + "\u03bf\7g\2\2\u03bf\u03c0\7n\2\2\u03c0\u03c1\7u\2\2\u03c1\u03c2\7g\2\2"+ + "\u03c2\u00af\3\2\2\2\u03c3\u03c4\7i\2\2\u03c4\u03c5\7q\2\2\u03c5\u03c6"+ + "\7v\2\2\u03c6\u03c7\7q\2\2\u03c7\u00b1\3\2\2\2\u03c8\u03c9\7r\2\2\u03c9"+ + "\u03ca\7c\2\2\u03ca\u03cb\7e\2\2\u03cb\u03cc\7m\2\2\u03cc\u03cd\7c\2\2"+ + "\u03cd\u03ce\7i\2\2\u03ce\u03cf\7g\2\2\u03cf\u00b3\3\2\2\2\u03d0\u03d1"+ + "\7u\2\2\u03d1\u03d2\7y\2\2\u03d2\u03d3\7k\2\2\u03d3\u03d4\7v\2\2\u03d4"+ + "\u03d5\7e\2\2\u03d5\u03d6\7j\2\2\u03d6\u00b5\3\2\2\2\u03d7\u03d8\7e\2"+ + "\2\u03d8\u03d9\7q\2\2\u03d9\u03da\7p\2\2\u03da\u03db\7u\2\2\u03db\u03dc"+ + "\7v\2\2\u03dc\u00b7\3\2\2\2\u03dd\u03de\7h\2\2\u03de\u03df\7c\2\2\u03df"+ + "\u03e0\7n\2\2\u03e0\u03e1\7n\2\2\u03e1\u03e2\7v\2\2\u03e2\u03e3\7j\2\2"+ + "\u03e3\u03e4\7t\2\2\u03e4\u03e5\7q\2\2\u03e5\u03e6\7w\2\2\u03e6\u03e7"+ + "\7i\2\2\u03e7\u03e8\7j\2\2\u03e8\u03e9\3\2\2\2\u03e9\u03ea\b\\\2\2\u03ea"+ + "\u00b9\3\2\2\2\u03eb\u03ec\7k\2\2\u03ec\u03ed\7h\2\2\u03ed\u00bb\3\2\2"+ + "\2\u03ee\u03ef\7t\2\2\u03ef\u03f0\7c\2\2\u03f0\u03f1\7p\2\2\u03f1\u03f2"+ + "\7i\2\2\u03f2\u03f3\7g\2\2\u03f3\u00bd\3\2\2\2\u03f4\u03f5\7v\2\2\u03f5"+ + "\u03f6\7{\2\2\u03f6\u03f7\7r\2\2\u03f7\u03f8\7g\2\2\u03f8\u00bf\3\2\2"+ + "\2\u03f9\u03fa\7e\2\2\u03fa\u03fb\7q\2\2\u03fb\u03fc\7p\2\2\u03fc\u03fd"+ + "\7v\2\2\u03fd\u03fe\7k\2\2\u03fe\u03ff\7p\2\2\u03ff\u0400\7w\2\2\u0400"+ + "\u0401\7g\2\2\u0401\u0402\3\2\2\2\u0402\u0403\b`\2\2\u0403\u00c1\3\2\2"+ + "\2\u0404\u0405\7h\2\2\u0405\u0406\7q\2\2\u0406\u0407\7t\2\2\u0407\u00c3"+ + "\3\2\2\2\u0408\u0409\7k\2\2\u0409\u040a\7o\2\2\u040a\u040b\7r\2\2\u040b"+ + "\u040c\7q\2\2\u040c\u040d\7t\2\2\u040d\u040e\7v\2\2\u040e\u00c5\3\2\2"+ + "\2\u040f\u0410\7t\2\2\u0410\u0411\7g\2\2\u0411\u0412\7v\2\2\u0412\u0413"+ + "\7w\2\2\u0413\u0414\7t\2\2\u0414\u0415\7p\2\2\u0415\u0416\3\2\2\2\u0416"+ + "\u0417\bc\2\2\u0417\u00c7\3\2\2\2\u0418\u0419\7x\2\2\u0419\u041a\7c\2"+ + "\2\u041a\u041b\7t\2\2\u041b\u00c9\3\2\2\2\u041c\u041d\7p\2\2\u041d\u041e"+ + "\7k\2\2\u041e\u041f\7n\2\2\u041f\u0420\3\2\2\2\u0420\u0421\be\2\2\u0421"+ + "\u00cb\3\2\2\2\u0422\u0427\5\u014e\u00a7\2\u0423\u0426\5\u014e\u00a7\2"+ + "\u0424\u0426\5\u0150\u00a8\2\u0425\u0423\3\2\2\2\u0425\u0424\3\2\2\2\u0426"+ + "\u0429\3\2\2\2\u0427\u0425\3\2\2\2\u0427\u0428\3\2\2\2\u0428\u042a\3\2"+ + "\2\2\u0429\u0427\3\2\2\2\u042a\u042b\bf\2\2\u042b\u00cd\3\2\2\2\u042c"+ + "\u042d\7*\2\2\u042d\u00cf\3\2\2\2\u042e\u042f\7+\2\2\u042f\u0430\3\2\2"+ + "\2\u0430\u0431\bh\2\2\u0431\u00d1\3\2\2\2\u0432\u0433\7}\2\2\u0433\u00d3"+ + "\3\2\2\2\u0434\u0435\7\177\2\2\u0435\u0436\3\2\2\2\u0436\u0437\bj\2\2"+ + "\u0437\u00d5\3\2\2\2\u0438\u0439\7]\2\2\u0439\u00d7\3\2\2\2\u043a\u043b"+ + "\7_\2\2\u043b\u043c\3\2\2\2\u043c\u043d\bl\2\2\u043d\u00d9\3\2\2\2\u043e"+ + "\u043f\7?\2\2\u043f\u00db\3\2\2\2\u0440\u0441\7.\2\2\u0441\u00dd\3\2\2"+ + "\2\u0442\u0443\7=\2\2\u0443\u00df\3\2\2\2\u0444\u0445\7<\2\2\u0445\u00e1"+ + "\3\2\2\2\u0446\u0447\7\60\2\2\u0447\u00e3\3\2\2\2\u0448\u0449\7-\2\2\u0449"+ + "\u044a\7-\2\2\u044a\u044b\3\2\2\2\u044b\u044c\br\2\2\u044c\u00e5\3\2\2"+ + "\2\u044d\u044e\7/\2\2\u044e\u044f\7/\2\2\u044f\u0450\3\2\2\2\u0450\u0451"+ + "\bs\2\2\u0451\u00e7\3\2\2\2\u0452\u0453\7<\2\2\u0453\u0454\7?\2\2\u0454"+ + "\u00e9\3\2\2\2\u0455\u0456\7\60\2\2\u0456\u0457\7\60\2\2\u0457\u0458\7"+ + "\60\2\2\u0458\u00eb\3\2\2\2\u0459\u045a\7~\2\2\u045a\u045b\7~\2\2\u045b"+ + "\u00ed\3\2\2\2\u045c\u045d\7(\2\2\u045d\u045e\7(\2\2\u045e\u00ef\3\2\2"+ + "\2\u045f\u0460\7?\2\2\u0460\u0461\7?\2\2\u0461\u00f1\3\2\2\2\u0462\u0463"+ + "\7#\2\2\u0463\u0464\7?\2\2\u0464\u00f3\3\2\2\2\u0465\u0466\7>\2\2\u0466"+ + "\u00f5\3\2\2\2\u0467\u0468\7>\2\2\u0468\u0469\7?\2\2\u0469\u00f7\3\2\2"+ + "\2\u046a\u046b\7@\2\2\u046b\u00f9\3\2\2\2\u046c\u046d\7@\2\2\u046d\u046e"+ + "\7?\2\2\u046e\u00fb\3\2\2\2\u046f\u0470\7~\2\2\u0470\u00fd\3\2\2\2\u0471"+ + "\u0472\7\61\2\2\u0472\u00ff\3\2\2\2\u0473\u0474\7\'\2\2\u0474\u0101\3"+ + "\2\2\2\u0475\u0476\7>\2\2\u0476\u0477\7>\2\2\u0477\u0103\3\2\2\2\u0478"+ + "\u0479\7@\2\2\u0479\u047a\7@\2\2\u047a\u0105\3\2\2\2\u047b\u047c\7(\2"+ + "\2\u047c\u047d\7`\2\2\u047d\u0107\3\2\2\2\u047e\u047f\7#\2\2\u047f\u0109"+ + "\3\2\2\2\u0480\u0481\7-\2\2\u0481\u010b\3\2\2\2\u0482\u0483\7/\2\2\u0483"+ + "\u010d\3\2\2\2\u0484\u0485\7`\2\2\u0485\u010f\3\2\2\2\u0486\u0487\7,\2"+ + "\2\u0487\u0111\3\2\2\2\u0488\u0489\7(\2\2\u0489\u0113\3\2\2\2\u048a\u048b"+ + "\7>\2\2\u048b\u048c\7/\2\2\u048c\u0115\3\2\2\2\u048d\u0499\7\62\2\2\u048e"+ + "\u0495\t\2\2\2\u048f\u0491\7a\2\2\u0490\u048f\3\2\2\2\u0490\u0491\3\2"+ + "\2\2\u0491\u0492\3\2\2\2\u0492\u0494\t\3\2\2\u0493\u0490\3\2\2\2\u0494"+ + "\u0497\3\2\2\2\u0495\u0493\3\2\2\2\u0495\u0496\3\2\2\2\u0496\u0499\3\2"+ + "\2\2\u0497\u0495\3\2\2\2\u0498\u048d\3\2\2\2\u0498\u048e\3\2\2\2\u0499"+ + "\u049a\3\2\2\2\u049a\u049b\b\u008b\2\2\u049b\u0117\3\2\2\2\u049c\u049d"+ + "\7\62\2\2\u049d\u04a2\t\4\2\2\u049e\u04a0\7a\2\2\u049f\u049e\3\2\2\2\u049f"+ + "\u04a0\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a3\5\u014a\u00a5\2\u04a2\u049f"+ + "\3\2\2\2\u04a3\u04a4\3\2\2\2\u04a4\u04a2\3\2\2\2\u04a4\u04a5\3\2\2\2\u04a5"+ + "\u04a6\3\2\2\2\u04a6\u04a7\b\u008c\2\2\u04a7\u0119\3\2\2\2\u04a8\u04aa"+ + "\7\62\2\2\u04a9\u04ab\t\5\2\2\u04aa\u04a9\3\2\2\2\u04aa\u04ab\3\2\2\2"+ + "\u04ab\u04b0\3\2\2\2\u04ac\u04ae\7a\2\2\u04ad\u04ac\3\2\2\2\u04ad\u04ae"+ + "\3\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04b1\5\u0146\u00a3\2\u04b0\u04ad\3"+ + "\2\2\2\u04b1\u04b2\3\2\2\2\u04b2\u04b0\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3"+ + "\u04b4\3\2\2\2\u04b4\u04b5\b\u008d\2\2\u04b5\u011b\3\2\2\2\u04b6\u04b7"+ + "\7\62\2\2\u04b7\u04bc\t\6\2\2\u04b8\u04ba\7a\2\2\u04b9\u04b8\3\2\2\2\u04b9"+ + "\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bd\5\u0148\u00a4\2\u04bc\u04b9"+ + "\3\2\2\2\u04bd\u04be\3\2\2\2\u04be\u04bc\3\2\2\2\u04be\u04bf\3\2\2\2\u04bf"+ + "\u04c0\3\2\2\2\u04c0\u04c1\b\u008e\2\2\u04c1\u011d\3\2\2\2\u04c2\u04c3"+ + "\7\62\2\2\u04c3\u04c4\t\6\2\2\u04c4\u04c5\5\u0120\u0090\2\u04c5\u04c6"+ + "\5\u0122\u0091\2\u04c6\u011f\3\2\2\2\u04c7\u04c9\7a\2\2\u04c8\u04c7\3"+ + "\2\2\2\u04c8\u04c9\3\2\2\2\u04c9\u04ca\3\2\2\2\u04ca\u04cc\5\u0148\u00a4"+ + "\2\u04cb\u04c8\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd\u04cb\3\2\2\2\u04cd\u04ce"+ + "\3\2\2\2\u04ce\u04d9\3\2\2\2\u04cf\u04d6\7\60\2\2\u04d0\u04d2\7a\2\2\u04d1"+ + "\u04d0\3\2\2\2\u04d1\u04d2\3\2\2\2\u04d2\u04d3\3\2\2\2\u04d3\u04d5\5\u0148"+ + "\u00a4\2\u04d4\u04d1\3\2\2\2\u04d5\u04d8\3\2\2\2\u04d6\u04d4\3\2\2\2\u04d6"+ + "\u04d7\3\2\2\2\u04d7\u04da\3\2\2\2\u04d8\u04d6\3\2\2\2\u04d9\u04cf\3\2"+ + "\2\2\u04d9\u04da\3\2\2\2\u04da\u04e7\3\2\2\2\u04db\u04dc\7\60\2\2\u04dc"+ + "\u04e3\5\u0148\u00a4\2\u04dd\u04df\7a\2\2\u04de\u04dd\3\2\2\2\u04de\u04df"+ + "\3\2\2\2\u04df\u04e0\3\2\2\2\u04e0\u04e2\5\u0148\u00a4\2\u04e1\u04de\3"+ + "\2\2\2\u04e2\u04e5\3\2\2\2\u04e3\u04e1\3\2\2\2\u04e3\u04e4\3\2\2\2\u04e4"+ + "\u04e7\3\2\2\2\u04e5\u04e3\3\2\2\2\u04e6\u04cb\3\2\2\2\u04e6\u04db\3\2"+ + "\2\2\u04e7\u0121\3\2\2\2\u04e8\u04e9\t\7\2\2\u04e9\u04ea\t\b\2\2\u04ea"+ + "\u04eb\5\u0144\u00a2\2\u04eb\u0123\3\2\2\2\u04ec\u04f2\5\u0116\u008b\2"+ + "\u04ed\u04f2\5\u0118\u008c\2\u04ee\u04f2\5\u011a\u008d\2\u04ef\u04f2\5"+ + "\u011c\u008e\2\u04f0\u04f2\5\4\2\2\u04f1\u04ec\3\2\2\2\u04f1\u04ed\3\2"+ + "\2\2\u04f1\u04ee\3\2\2\2\u04f1\u04ef\3\2\2\2\u04f1\u04f0\3\2\2\2\u04f2"+ + "\u04f3\3\2\2\2\u04f3\u04f4\7k\2\2\u04f4\u04f5\3\2\2\2\u04f5\u04f6\b\u0092"+ + "\2\2\u04f6\u0125\3\2\2\2\u04f7\u04fa\7)\2\2\u04f8\u04fb\5\u0140\u00a0"+ + "\2\u04f9\u04fb\5\u012a\u0095\2\u04fa\u04f8\3\2\2\2\u04fa\u04f9\3\2\2\2"+ + "\u04fb\u04fc\3\2\2\2\u04fc\u04fd\7)\2\2\u04fd\u0127\3\2\2\2\u04fe\u04ff"+ + "\5\u0126\u0093\2\u04ff\u0500\3\2\2\2\u0500\u0501\b\u0094\2\2\u0501\u0129"+ + "\3\2\2\2\u0502\u0505\5\u012c\u0096\2\u0503\u0505\5\u012e\u0097\2\u0504"+ + "\u0502\3\2\2\2\u0504\u0503\3\2\2\2\u0505\u012b\3\2\2\2\u0506\u0507\7^"+ + "\2\2\u0507\u0508\5\u0146\u00a3\2\u0508\u0509\5\u0146\u00a3\2\u0509\u050a"+ + "\5\u0146\u00a3\2\u050a\u012d\3\2\2\2\u050b\u050c\7^\2\2\u050c\u050d\7"+ + "z\2\2\u050d\u050e\5\u0148\u00a4\2\u050e\u050f\5\u0148\u00a4\2\u050f\u012f"+ + "\3\2\2\2\u0510\u0511\7^\2\2\u0511\u0512\7w\2\2\u0512\u0513\5\u0148\u00a4"+ + "\2\u0513\u0514\5\u0148\u00a4\2\u0514\u0515\5\u0148\u00a4\2\u0515\u0516"+ + "\5\u0148\u00a4\2\u0516\u0131\3\2\2\2\u0517\u0518\7^\2\2\u0518\u0519\7"+ + "W\2\2\u0519\u051a\5\u0148\u00a4\2\u051a\u051b\5\u0148\u00a4\2\u051b\u051c"+ + "\5\u0148\u00a4\2\u051c\u051d\5\u0148\u00a4\2\u051d\u051e\5\u0148\u00a4"+ + "\2\u051e\u051f\5\u0148\u00a4\2\u051f\u0520\5\u0148\u00a4\2\u0520\u0521"+ + "\5\u0148\u00a4\2\u0521\u0133\3\2\2\2\u0522\u0526\7b\2\2\u0523\u0525\n"+ + "\t\2\2\u0524\u0523\3\2\2\2\u0525\u0528\3\2\2\2\u0526\u0524\3\2\2\2\u0526"+ + "\u0527\3\2\2\2\u0527\u0529\3\2\2\2\u0528\u0526\3\2\2\2\u0529\u052a\7b"+ + "\2\2\u052a\u052b\3\2\2\2\u052b\u052c\b\u009a\2\2\u052c\u0135\3\2\2\2\u052d"+ + "\u0532\7$\2\2\u052e\u0531\n\n\2\2\u052f\u0531\5\u0142\u00a1\2\u0530\u052e"+ + "\3\2\2\2\u0530\u052f\3\2\2\2\u0531\u0534\3\2\2\2\u0532\u0530\3\2\2\2\u0532"+ + "\u0533\3\2\2\2\u0533\u0535\3\2\2\2\u0534\u0532\3\2\2\2\u0535\u0536\7$"+ + "\2\2\u0536\u0537\3\2\2\2\u0537\u0538\b\u009b\2\2\u0538\u0137\3\2\2\2\u0539"+ + "\u053b\t\13\2\2\u053a\u0539\3\2\2\2\u053b\u053c\3\2\2\2\u053c\u053a\3"+ + "\2\2\2\u053c\u053d\3\2\2\2\u053d\u053e\3\2\2\2\u053e\u053f\b\u009c\3\2"+ + "\u053f\u0139\3\2\2\2\u0540\u0541\7\61\2\2\u0541\u0542\7,\2\2\u0542\u0546"+ + "\3\2\2\2\u0543\u0545\13\2\2\2\u0544\u0543\3\2\2\2\u0545\u0548\3\2\2\2"+ + "\u0546\u0547\3\2\2\2\u0546\u0544\3\2\2\2\u0547\u0549\3\2\2\2\u0548\u0546"+ + "\3\2\2\2\u0549\u054a\7,\2\2\u054a\u054b\7\61\2\2\u054b\u054c\3\2\2\2\u054c"+ + "\u054d\b\u009d\3\2\u054d\u013b\3\2\2\2\u054e\u0550\t\f\2\2\u054f\u054e"+ + "\3\2\2\2\u0550\u0551\3\2\2\2\u0551\u054f\3\2\2\2\u0551\u0552\3\2\2\2\u0552"+ + "\u0553\3\2\2\2\u0553\u0554\b\u009e\3\2\u0554\u013d\3\2\2\2\u0555\u0556"+ + "\7\61\2\2\u0556\u0557\7\61\2\2\u0557\u055b\3\2\2\2\u0558\u055a\n\f\2\2"+ + "\u0559\u0558\3\2\2\2\u055a\u055d\3\2\2\2\u055b\u0559\3\2\2\2\u055b\u055c"+ + "\3\2\2\2\u055c\u055e\3\2\2\2\u055d\u055b\3\2\2\2\u055e\u055f\b\u009f\3"+ + "\2\u055f\u013f\3\2\2\2\u0560\u0565\n\r\2\2\u0561\u0565\5\u0130\u0098\2"+ + "\u0562\u0565\5\u0132\u0099\2\u0563\u0565\5\u0142\u00a1\2\u0564\u0560\3"+ + "\2\2\2\u0564\u0561\3\2\2\2\u0564\u0562\3\2\2\2\u0564\u0563\3\2\2\2\u0565"+ + "\u0141\3\2\2\2\u0566\u0580\7^\2\2\u0567\u0568\7w\2\2\u0568\u0569\5\u0148"+ + "\u00a4\2\u0569\u056a\5\u0148\u00a4\2\u056a\u056b\5\u0148\u00a4\2\u056b"+ + "\u056c\5\u0148\u00a4\2\u056c\u0581\3\2\2\2\u056d\u056e\7W\2\2\u056e\u056f"+ + "\5\u0148\u00a4\2\u056f\u0570\5\u0148\u00a4\2\u0570\u0571\5\u0148\u00a4"+ + "\2\u0571\u0572\5\u0148\u00a4\2\u0572\u0573\5\u0148\u00a4\2\u0573\u0574"+ + "\5\u0148\u00a4\2\u0574\u0575\5\u0148\u00a4\2\u0575\u0576\5\u0148\u00a4"+ + "\2\u0576\u0581\3\2\2\2\u0577\u0581\t\16\2\2\u0578\u0579\5\u0146\u00a3"+ + "\2\u0579\u057a\5\u0146\u00a3\2\u057a\u057b\5\u0146\u00a3\2\u057b\u0581"+ + "\3\2\2\2\u057c\u057d\7z\2\2\u057d\u057e\5\u0148\u00a4\2\u057e\u057f\5"+ + "\u0148\u00a4\2\u057f\u0581\3\2\2\2\u0580\u0567\3\2\2\2\u0580\u056d\3\2"+ + "\2\2\u0580\u0577\3\2\2\2\u0580\u0578\3\2\2\2\u0580\u057c\3\2\2\2\u0581"+ + "\u0143\3\2\2\2\u0582\u0589\t\3\2\2\u0583\u0585\7a\2\2\u0584\u0583\3\2"+ + "\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0588\t\3\2\2\u0587"+ + "\u0584\3\2\2\2\u0588\u058b\3\2\2\2\u0589\u0587\3\2\2\2\u0589\u058a\3\2"+ + "\2\2\u058a\u0145\3\2\2\2\u058b\u0589\3\2\2\2\u058c\u058d\t\17\2\2\u058d"+ + "\u0147\3\2\2\2\u058e\u058f\t\20\2\2\u058f\u0149\3\2\2\2\u0590\u0591\t"+ + "\21\2\2\u0591\u014b\3\2\2\2\u0592\u0594\t\22\2\2\u0593\u0595\t\b\2\2\u0594"+ + "\u0593\3\2\2\2\u0594\u0595\3\2\2\2\u0595\u0596\3\2\2\2\u0596\u0597\5\u0144"+ + "\u00a2\2\u0597\u014d\3\2\2\2\u0598\u059b\5\u0152\u00a9\2\u0599\u059b\7"+ + "a\2\2\u059a\u0598\3\2\2\2\u059a\u0599\3\2\2\2\u059b\u014f\3\2\2\2\u059c"+ + "\u059d\t\23\2\2\u059d\u0151\3\2\2\2\u059e\u059f\t\24\2\2\u059f\u0153\3"+ + "\2\2\2\u05a0\u05a2\t\13\2\2\u05a1\u05a0\3\2\2\2\u05a2\u05a3\3\2\2\2\u05a3"+ + "\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4\u05a5\3\2\2\2\u05a5\u05a6\b\u00aa"+ + "\3\2\u05a6\u0155\3\2\2\2\u05a7\u05a8\7\61\2\2\u05a8\u05a9\7,\2\2\u05a9"+ + "\u05ad\3\2\2\2\u05aa\u05ac\n\f\2\2\u05ab\u05aa\3\2\2\2\u05ac\u05af\3\2"+ + "\2\2\u05ad\u05ae\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05b0\3\2\2\2\u05af"+ + "\u05ad\3\2\2\2\u05b0\u05b1\7,\2\2\u05b1\u05b2\7\61\2\2\u05b2\u05b3\3\2"+ + "\2\2\u05b3\u05b4\b\u00ab\3\2\u05b4\u0157\3\2\2\2\u05b5\u05b6\7\61\2\2"+ + "\u05b6\u05b7\7\61\2\2\u05b7\u05bb\3\2\2\2\u05b8\u05ba\n\f\2\2\u05b9\u05b8"+ + "\3\2\2\2\u05ba\u05bd\3\2\2\2\u05bb\u05b9\3\2\2\2\u05bb\u05bc\3\2\2\2\u05bc"+ + "\u05be\3\2\2\2\u05bd\u05bb\3\2\2\2\u05be\u05bf\b\u00ac\3\2\u05bf\u0159"+ + "\3\2\2\2\u05c0\u05c2\t\f\2\2\u05c1\u05c0\3\2\2\2\u05c2\u05c3\3\2\2\2\u05c3"+ + "\u05c1\3\2\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05d3\3\2\2\2\u05c5\u05d3\7="+ + "\2\2\u05c6\u05c7\7\61\2\2\u05c7\u05c8\7,\2\2\u05c8\u05cc\3\2\2\2\u05c9"+ + "\u05cb\13\2\2\2\u05ca\u05c9\3\2\2\2\u05cb\u05ce\3\2\2\2\u05cc\u05cd\3"+ + "\2\2\2\u05cc\u05ca\3\2\2\2\u05cd\u05cf\3\2\2\2\u05ce\u05cc\3\2\2\2\u05cf"+ + "\u05d0\7,\2\2\u05d0\u05d3\7\61\2\2\u05d1\u05d3\7\2\2\3\u05d2\u05c1\3\2"+ + "\2\2\u05d2\u05c5\3\2\2\2\u05d2\u05c6\3\2\2\2\u05d2\u05d1\3\2\2\2\u05d3"+ + "\u05d4\3\2\2\2\u05d4\u05d5\b\u00ad\4\2\u05d5\u015b\3\2\2\2\u05d6\u05d7"+ + "\3\2\2\2\u05d7\u05d8\3\2\2\2\u05d8\u05d9\b\u00ae\4\2\u05d9\u05da\b\u00ae"+ + "\3\2\u05da\u015d\3\2\2\2\64\2\3\u0160\u0168\u016b\u016e\u0174\u0176\u0425"+ + "\u0427\u0490\u0495\u0498\u049f\u04a4\u04aa\u04ad\u04b2\u04b9\u04be\u04c8"+ + "\u04cd\u04d1\u04d6\u04d9\u04de\u04e3\u04e6\u04f1\u04fa\u0504\u0526\u0530"+ + "\u0532\u053c\u0546\u0551\u055b\u0564\u0580\u0584\u0589\u0594\u059a\u05a3"+ + "\u05ad\u05bb\u05c3\u05cc\u05d2\5\4\3\2\2\3\2\4\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { @@ -914,4 +916,4 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); } } -} \ No newline at end of file +} diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 84cc6b0af..5771a622b 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,4 +1,3 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -11,7 +10,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class GobraParser extends GobraParserBase { - static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -20,29 +19,29 @@ public class GobraParser extends GobraParserBase { FLOAT_LIT=1, DECIMAL_FLOAT_LIT=2, TRUE=3, FALSE=4, ASSERT=5, ASSUME=6, INHALE=7, EXHALE=8, PRE=9, PRESERVES=10, POST=11, INV=12, DEC=13, PURE=14, IMPL=15, AS=16, OLD=17, BEFORE=18, LHS=19, FORALL=20, EXISTS=21, ACCESS=22, - FOLD=23, UNFOLD=24, UNFOLDING=25, GHOST=26, IN=27, MULTI=28, SUBSET=29, - UNION=30, INTERSECTION=31, SETMINUS=32, IMPLIES=33, WAND=34, APPLY=35, - QMARK=36, L_PRED=37, R_PRED=38, SEQ=39, SET=40, MSET=41, DICT=42, OPT=43, - LEN=44, NEW=45, MAKE=46, CAP=47, SOME=48, GET=49, DOM=50, AXIOM=51, ADT=52, - MATCH=53, NONE=54, PRED=55, TYPE_OF=56, IS_COMPARABLE=57, SHARE=58, ADDR_MOD=59, - DOT_DOT=60, SHARED=61, EXCLUSIVE=62, PREDICATE=63, WRITEPERM=64, NOPERM=65, - TRUSTED=66, OUTLINE=67, INIT_POST=68, IMPORT_PRE=69, PROOF=70, GHOST_EQUALS=71, - GHOST_NOT_EQUALS=72, WITH=73, BREAK=74, DEFAULT=75, FUNC=76, INTERFACE=77, - SELECT=78, CASE=79, DEFER=80, GO=81, MAP=82, STRUCT=83, CHAN=84, ELSE=85, - GOTO=86, PACKAGE=87, SWITCH=88, CONST=89, FALLTHROUGH=90, IF=91, RANGE=92, - TYPE=93, CONTINUE=94, FOR=95, IMPORT=96, RETURN=97, VAR=98, NIL_LIT=99, - IDENTIFIER=100, L_PAREN=101, R_PAREN=102, L_CURLY=103, R_CURLY=104, L_BRACKET=105, - R_BRACKET=106, ASSIGN=107, COMMA=108, SEMI=109, COLON=110, DOT=111, PLUS_PLUS=112, - MINUS_MINUS=113, DECLARE_ASSIGN=114, ELLIPSIS=115, LOGICAL_OR=116, LOGICAL_AND=117, - EQUALS=118, NOT_EQUALS=119, LESS=120, LESS_OR_EQUALS=121, GREATER=122, - GREATER_OR_EQUALS=123, OR=124, DIV=125, MOD=126, LSHIFT=127, RSHIFT=128, - BIT_CLEAR=129, EXCLAMATION=130, PLUS=131, MINUS=132, CARET=133, STAR=134, - AMPERSAND=135, RECEIVE=136, DECIMAL_LIT=137, BINARY_LIT=138, OCTAL_LIT=139, - HEX_LIT=140, HEX_FLOAT_LIT=141, IMAGINARY_LIT=142, RUNE_LIT=143, BYTE_VALUE=144, - OCTAL_BYTE_VALUE=145, HEX_BYTE_VALUE=146, LITTLE_U_VALUE=147, BIG_U_VALUE=148, - RAW_STRING_LIT=149, INTERPRETED_STRING_LIT=150, WS=151, COMMENT=152, TERMINATOR=153, - LINE_COMMENT=154, WS_NLSEMI=155, COMMENT_NLSEMI=156, LINE_COMMENT_NLSEMI=157, - EOS=158, OTHER=159; + FOLD=23, UNFOLD=24, UNFOLDING=25, LET=26, GHOST=27, IN=28, MULTI=29, SUBSET=30, + UNION=31, INTERSECTION=32, SETMINUS=33, IMPLIES=34, WAND=35, APPLY=36, + QMARK=37, L_PRED=38, R_PRED=39, SEQ=40, SET=41, MSET=42, DICT=43, OPT=44, + LEN=45, NEW=46, MAKE=47, CAP=48, SOME=49, GET=50, DOM=51, AXIOM=52, ADT=53, + MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, SHARE=59, ADDR_MOD=60, + DOT_DOT=61, SHARED=62, EXCLUSIVE=63, PREDICATE=64, WRITEPERM=65, NOPERM=66, + TRUSTED=67, OUTLINE=68, INIT_POST=69, IMPORT_PRE=70, PROOF=71, GHOST_EQUALS=72, + GHOST_NOT_EQUALS=73, WITH=74, BREAK=75, DEFAULT=76, FUNC=77, INTERFACE=78, + SELECT=79, CASE=80, DEFER=81, GO=82, MAP=83, STRUCT=84, CHAN=85, ELSE=86, + GOTO=87, PACKAGE=88, SWITCH=89, CONST=90, FALLTHROUGH=91, IF=92, RANGE=93, + TYPE=94, CONTINUE=95, FOR=96, IMPORT=97, RETURN=98, VAR=99, NIL_LIT=100, + IDENTIFIER=101, L_PAREN=102, R_PAREN=103, L_CURLY=104, R_CURLY=105, L_BRACKET=106, + R_BRACKET=107, ASSIGN=108, COMMA=109, SEMI=110, COLON=111, DOT=112, PLUS_PLUS=113, + MINUS_MINUS=114, DECLARE_ASSIGN=115, ELLIPSIS=116, LOGICAL_OR=117, LOGICAL_AND=118, + EQUALS=119, NOT_EQUALS=120, LESS=121, LESS_OR_EQUALS=122, GREATER=123, + GREATER_OR_EQUALS=124, OR=125, DIV=126, MOD=127, LSHIFT=128, RSHIFT=129, + BIT_CLEAR=130, EXCLAMATION=131, PLUS=132, MINUS=133, CARET=134, STAR=135, + AMPERSAND=136, RECEIVE=137, DECIMAL_LIT=138, BINARY_LIT=139, OCTAL_LIT=140, + HEX_LIT=141, HEX_FLOAT_LIT=142, IMAGINARY_LIT=143, RUNE_LIT=144, BYTE_VALUE=145, + OCTAL_BYTE_VALUE=146, HEX_BYTE_VALUE=147, LITTLE_U_VALUE=148, BIG_U_VALUE=149, + RAW_STRING_LIT=150, INTERPRETED_STRING_LIT=151, WS=152, COMMENT=153, TERMINATOR=154, + LINE_COMMENT=155, WS_NLSEMI=156, COMMENT_NLSEMI=157, LINE_COMMENT_NLSEMI=158, + EOS=159, OTHER=160; public static final int RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3, RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_initPost = 6, @@ -146,21 +145,21 @@ private static String[] makeLiteralNames() { "'exhale'", "'requires'", "'preserves'", "'ensures'", "'invariant'", "'decreases'", "'pure'", "'implements'", "'as'", "'old'", "'before'", "'#lhs'", "'forall'", "'exists'", "'acc'", "'fold'", "'unfold'", "'unfolding'", - "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'", - "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", "'set'", - "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", "'cap'", - "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", "'none'", - "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", - "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", - "'outline'", "'initEnsures'", "'importRequires'", "'proof'", "'==='", - "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", "'select'", - "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", "'else'", - "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", "'if'", - "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'", - "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", - "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", - "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", - "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" + "'let'", "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", + "'setminus'", "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", + "'set'", "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", + "'cap'", "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", + "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", + "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", + "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", + "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", + "'select'", "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", + "'else'", "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", + "'if'", "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", + "'var'", "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", + "','", "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", + "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", + "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -169,27 +168,27 @@ private static String[] makeSymbolicNames() { null, "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "TRUE", "FALSE", "ASSERT", "ASSUME", "INHALE", "EXHALE", "PRE", "PRESERVES", "POST", "INV", "DEC", "PURE", "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", "FOLD", - "UNFOLD", "UNFOLDING", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", - "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", "R_PRED", - "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", "CAP", "SOME", - "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", - "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", - "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", - "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", - "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", - "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", - "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", - "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", - "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", - "ELLIPSIS", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", - "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", "OR", "DIV", "MOD", - "LSHIFT", "RSHIFT", "BIT_CLEAR", "EXCLAMATION", "PLUS", "MINUS", "CARET", - "STAR", "AMPERSAND", "RECEIVE", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", - "HEX_LIT", "HEX_FLOAT_LIT", "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", - "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", "BIG_U_VALUE", - "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", "TERMINATOR", - "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", - "EOS", "OTHER" + "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", "UNION", + "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", + "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", + "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", + "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", + "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", + "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", + "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", + "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", + "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", + "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", + "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", + "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR", + "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", + "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", + "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE", + "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "HEX_FLOAT_LIT", + "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", + "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", + "WS", "COMMENT", "TERMINATOR", "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI", + "LINE_COMMENT_NLSEMI", "EOS", "OTHER" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -565,7 +564,7 @@ public final SourceFileContext sourceFile() throws RecognitionException { setState(416); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (CONST - 76)) | (1L << (TYPE - 76)) | (1L << (VAR - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) { + while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (CONST - 77)) | (1L << (TYPE - 77)) | (1L << (VAR - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { { { setState(410); @@ -854,7 +853,7 @@ public final ImportDeclContext importDecl() throws RecognitionException { setState(457); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (IMPORT_PRE - 69)) | (1L << (IDENTIFIER - 69)) | (1L << (DOT - 69)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { + while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (IMPORT_PRE - 70)) | (1L << (IDENTIFIER - 70)) | (1L << (DOT - 70)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { setState(452); @@ -3667,7 +3666,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { setState(790); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << QMARK) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << QMARK) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { { setState(786); matchPatternList(); @@ -3897,7 +3896,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition setState(826); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { { setState(822); closureSpecParams(); @@ -5607,6 +5606,22 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + public static class LetContext extends ExpressionContext { + public TerminalNode LET() { return getToken(GobraParser.LET, 0); } + public ShortVarDeclContext shortVarDecl() { + return getRuleContext(ShortVarDeclContext.class,0); + } + public TerminalNode IN() { return getToken(GobraParser.IN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public LetContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitLet(this); + else return visitor.visitChildren(this); + } + } public static class RelExprContext extends ExpressionContext { public Token rel_op; public List expression() { @@ -5662,7 +5677,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1022); + setState(1027); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: @@ -5674,7 +5689,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(1007); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)))) != 0)) ) { + if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)))) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -5683,7 +5698,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { consume(); } setState(1008); - expression(14); + expression(15); } break; case 2: @@ -5707,15 +5722,30 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(1012); match(IN); setState(1013); - expression(2); + expression(3); } break; case 4: { - _localctx = new QuantificationContext(_localctx); + _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; setState(1015); + match(LET); + setState(1016); + shortVarDecl(); + setState(1017); + match(IN); + setState(1018); + expression(2); + } + break; + case 5: + { + _localctx = new QuantificationContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(1020); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -5725,21 +5755,21 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1016); + setState(1021); boundVariables(); - setState(1017); + setState(1022); match(COLON); - setState(1018); + setState(1023); match(COLON); - setState(1019); + setState(1024); triggers(); - setState(1020); + setState(1025); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1059); + setState(1064); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,79,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -5747,19 +5777,19 @@ private ExpressionContext expression(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1057); + setState(1062); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1024); - if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1025); + setState(1029); + if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); + setState(1030); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (DIV - 125)) | (1L << (MOD - 125)) | (1L << (LSHIFT - 125)) | (1L << (RSHIFT - 125)) | (1L << (BIT_CLEAR - 125)) | (1L << (STAR - 125)) | (1L << (AMPERSAND - 125)))) != 0)) ) { + if ( !(((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & ((1L << (DIV - 126)) | (1L << (MOD - 126)) | (1L << (LSHIFT - 126)) | (1L << (RSHIFT - 126)) | (1L << (BIT_CLEAR - 126)) | (1L << (STAR - 126)) | (1L << (AMPERSAND - 126)))) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -5767,20 +5797,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1026); - expression(13); + setState(1031); + expression(14); } break; case 2: { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1027); - if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1028); + setState(1032); + if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); + setState(1033); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 112)) & ~0x3f) == 0 && ((1L << (_la - 112)) & ((1L << (PLUS_PLUS - 112)) | (1L << (OR - 112)) | (1L << (PLUS - 112)) | (1L << (MINUS - 112)) | (1L << (CARET - 112)))) != 0)) ) { + if ( !(_la==WAND || ((((_la - 113)) & ~0x3f) == 0 && ((1L << (_la - 113)) & ((1L << (PLUS_PLUS - 113)) | (1L << (OR - 113)) | (1L << (PLUS - 113)) | (1L << (MINUS - 113)) | (1L << (CARET - 113)))) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -5788,17 +5818,17 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1029); - expression(12); + setState(1034); + expression(13); } break; case 3: { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1030); - if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1031); + setState(1035); + if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); + setState(1036); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << UNION) | (1L << INTERSECTION) | (1L << SETMINUS))) != 0)) ) { @@ -5809,17 +5839,17 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1032); - expression(11); + setState(1037); + expression(12); } break; case 4: { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1033); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1034); + setState(1038); + if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); + setState(1039); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << IN) | (1L << MULTI) | (1L << SUBSET))) != 0)) ) { @@ -5830,20 +5860,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1035); - expression(10); + setState(1040); + expression(11); } break; case 5: { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1036); - if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1037); + setState(1041); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); + setState(1042); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (GHOST_EQUALS - 71)) | (1L << (GHOST_NOT_EQUALS - 71)) | (1L << (EQUALS - 71)) | (1L << (NOT_EQUALS - 71)) | (1L << (LESS - 71)) | (1L << (LESS_OR_EQUALS - 71)) | (1L << (GREATER - 71)) | (1L << (GREATER_OR_EQUALS - 71)))) != 0)) ) { + if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (GHOST_EQUALS - 72)) | (1L << (GHOST_NOT_EQUALS - 72)) | (1L << (EQUALS - 72)) | (1L << (NOT_EQUALS - 72)) | (1L << (LESS - 72)) | (1L << (LESS_OR_EQUALS - 72)) | (1L << (GREATER - 72)) | (1L << (GREATER_OR_EQUALS - 72)))) != 0)) ) { ((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this); } else { @@ -5851,78 +5881,78 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1038); - expression(9); + setState(1043); + expression(10); } break; case 6: { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1039); - if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1040); + setState(1044); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); + setState(1045); match(LOGICAL_AND); - setState(1041); - expression(7); + setState(1046); + expression(8); } break; case 7: { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1042); - if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1043); + setState(1047); + if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); + setState(1048); match(LOGICAL_OR); - setState(1044); - expression(6); + setState(1049); + expression(7); } break; case 8: { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1045); - if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1046); + setState(1050); + if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); + setState(1051); match(IMPLIES); - setState(1047); - expression(4); + setState(1052); + expression(5); } break; case 9: { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1048); - if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1049); + setState(1053); + if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); + setState(1054); match(QMARK); - setState(1050); + setState(1055); expression(0); - setState(1051); + setState(1056); match(COLON); - setState(1052); - expression(3); + setState(1057); + expression(4); } break; case 10: { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1054); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1055); + setState(1059); + if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); + setState(1060); match(IMPL); - setState(1056); + setState(1061); closureSpecInstance(); } break; } } } - setState(1061); + setState(1066); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,79,_ctx); } @@ -6015,146 +6045,146 @@ public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 164, RULE_statement); try { - setState(1082); + setState(1087); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1062); + setState(1067); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1063); + setState(1068); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1064); + setState(1069); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1065); + setState(1070); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1066); + setState(1071); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1067); + setState(1072); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1068); + setState(1073); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1069); + setState(1074); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1070); + setState(1075); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1071); + setState(1076); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1072); + setState(1077); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1073); + setState(1078); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1074); + setState(1079); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1075); + setState(1080); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1076); + setState(1081); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1077); + setState(1082); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1078); + setState(1083); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1079); + setState(1084); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1080); + setState(1085); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1081); + setState(1086); closureImplProofStmt(); } break; @@ -6193,9 +6223,9 @@ public final ApplyStmtContext applyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1084); + setState(1089); match(APPLY); - setState(1085); + setState(1090); expression(0); } } @@ -6235,16 +6265,16 @@ public final PackageStmtContext packageStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1087); + setState(1092); match(PACKAGE); - setState(1088); + setState(1093); expression(0); - setState(1090); + setState(1095); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { - setState(1089); + setState(1094); block(); } break; @@ -6286,9 +6316,9 @@ public final SpecForStmtContext specForStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1092); + setState(1097); loopSpec(); - setState(1093); + setState(1098); forStmt(); } } @@ -6342,34 +6372,34 @@ public final LoopSpecContext loopSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1101); + setState(1106); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1095); + setState(1100); match(INV); - setState(1096); + setState(1101); expression(0); - setState(1097); + setState(1102); eos(); } } - setState(1103); + setState(1108); _errHandler.sync(this); _la = _input.LA(1); } - setState(1108); + setState(1113); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1104); + setState(1109); match(DEC); - setState(1105); + setState(1110); terminationMeasure(); - setState(1106); + setState(1111); eos(); } } @@ -6414,24 +6444,24 @@ public final DeferStmtContext deferStmt() throws RecognitionException { enterRule(_localctx, 174, RULE_deferStmt); int _la; try { - setState(1115); + setState(1120); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1110); + setState(1115); match(DEFER); - setState(1111); + setState(1116); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1112); + setState(1117); match(DEFER); - setState(1113); + setState(1118); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -6442,7 +6472,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1114); + setState(1119); predicateAccess(); } break; @@ -6487,62 +6517,62 @@ public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); enterRule(_localctx, 176, RULE_basicLit); try { - setState(1125); + setState(1130); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1117); + setState(1122); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1118); + setState(1123); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1119); + setState(1124); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1120); + setState(1125); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1121); + setState(1126); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1122); + setState(1127); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1123); + setState(1128); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1124); + setState(1129); match(RUNE_LIT); } break; @@ -6786,7 +6816,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1139); + setState(1144); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { case 1: @@ -6795,7 +6825,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(1128); + setState(1133); operand(); } break; @@ -6804,7 +6834,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1129); + setState(1134); conversion(); } break; @@ -6813,7 +6843,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1130); + setState(1135); methodExpr(); } break; @@ -6822,7 +6852,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1131); + setState(1136); ghostPrimaryExpr(); } break; @@ -6831,7 +6861,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1132); + setState(1137); new_(); } break; @@ -6840,7 +6870,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1133); + setState(1138); make(); } break; @@ -6849,10 +6879,10 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1134); + setState(1139); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 44)) & ~0x3f) == 0 && ((1L << (_la - 44)) & ((1L << (LEN - 44)) | (1L << (CAP - 44)) | (1L << (DOM - 44)) | (1L << (RANGE - 44)))) != 0)) ) { + if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & ((1L << (LEN - 45)) | (1L << (CAP - 45)) | (1L << (DOM - 45)) | (1L << (RANGE - 45)))) != 0)) ) { ((BuiltInCallExprContext)_localctx).call_op = (Token)_errHandler.recoverInline(this); } else { @@ -6860,17 +6890,17 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1135); + setState(1140); match(L_PAREN); - setState(1136); + setState(1141); expression(0); - setState(1137); + setState(1142); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1163); + setState(1168); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,88,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -6878,18 +6908,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1161); + setState(1166); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1141); + setState(1146); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1142); + setState(1147); match(DOT); - setState(1143); + setState(1148); match(IDENTIFIER); } break; @@ -6897,9 +6927,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1144); + setState(1149); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1145); + setState(1150); index(); } break; @@ -6907,9 +6937,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1146); + setState(1151); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1147); + setState(1152); slice_(); } break; @@ -6917,9 +6947,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1148); + setState(1153); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1149); + setState(1154); seqUpdExp(); } break; @@ -6927,9 +6957,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1150); + setState(1155); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1151); + setState(1156); typeAssertion(); } break; @@ -6937,9 +6967,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1152); + setState(1157); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1153); + setState(1158); arguments(); } break; @@ -6947,13 +6977,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1154); + setState(1159); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1155); + setState(1160); arguments(); - setState(1156); + setState(1161); match(AS); - setState(1157); + setState(1162); closureSpecInstance(); } break; @@ -6961,16 +6991,16 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1159); + setState(1164); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1160); + setState(1165); predConstructArgs(); } break; } } } - setState(1165); + setState(1170); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,88,_ctx); } @@ -7012,9 +7042,9 @@ public final FunctionLitContext functionLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1166); + setState(1171); ((FunctionLitContext)_localctx).specification = specification(); - setState(1167); + setState(1172); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7061,27 +7091,27 @@ public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws try { enterOuterAlt(_localctx, 1); { - setState(1169); + setState(1174); match(FUNC); - setState(1171); + setState(1176); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1170); + setState(1175); match(IDENTIFIER); } } { - setState(1173); + setState(1178); signature(); - setState(1175); + setState(1180); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { - setState(1174); + setState(1179); blockWithBodyParameterInfo(); } break; @@ -7125,29 +7155,29 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1177); + setState(1182); match(L_PRED); - setState(1179); + setState(1184); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { { - setState(1178); + setState(1183); expressionList(); } } - setState(1182); + setState(1187); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1181); + setState(1186); match(COMMA); } } - setState(1184); + setState(1189); match(R_PRED); } } @@ -7208,47 +7238,47 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1186); + setState(1191); match(INTERFACE); - setState(1187); + setState(1192); match(L_CURLY); - setState(1197); + setState(1202); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << GHOST) | (1L << PRED))) != 0) || _la==TRUSTED || _la==IDENTIFIER) { { { - setState(1191); + setState(1196); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(1188); + setState(1193); methodSpec(); } break; case 2: { - setState(1189); + setState(1194); typeName(); } break; case 3: { - setState(1190); + setState(1195); predicateSpec(); } break; } - setState(1193); + setState(1198); eos(); } } - setState(1199); + setState(1204); _errHandler.sync(this); _la = _input.LA(1); } - setState(1200); + setState(1205); match(R_CURLY); } } @@ -7286,11 +7316,11 @@ public final PredicateSpecContext predicateSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1202); + setState(1207); match(PRED); - setState(1203); + setState(1208); match(IDENTIFIER); - setState(1204); + setState(1209); parameters(); } } @@ -7333,50 +7363,50 @@ public final MethodSpecContext methodSpec() throws RecognitionException { enterRule(_localctx, 190, RULE_methodSpec); int _la; try { - setState(1221); + setState(1226); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1207); + setState(1212); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1206); + setState(1211); match(GHOST); } } - setState(1209); + setState(1214); specification(); - setState(1210); + setState(1215); match(IDENTIFIER); - setState(1211); + setState(1216); parameters(); - setState(1212); + setState(1217); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1215); + setState(1220); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1214); + setState(1219); match(GHOST); } } - setState(1217); + setState(1222); specification(); - setState(1218); + setState(1223); match(IDENTIFIER); - setState(1219); + setState(1224); parameters(); } break; @@ -7423,13 +7453,13 @@ public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); enterRule(_localctx, 192, RULE_type_); try { - setState(1230); + setState(1235); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1223); + setState(1228); typeName(); } break; @@ -7444,7 +7474,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1224); + setState(1229); typeLit(); } break; @@ -7458,18 +7488,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1225); + setState(1230); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1226); + setState(1231); match(L_PAREN); - setState(1227); + setState(1232); type_(); - setState(1228); + setState(1233); match(R_PAREN); } break; @@ -7531,69 +7561,69 @@ public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); enterRule(_localctx, 194, RULE_typeLit); try { - setState(1241); + setState(1246); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1232); + setState(1237); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1233); + setState(1238); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1234); + setState(1239); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1235); + setState(1240); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1236); + setState(1241); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1237); + setState(1242); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1238); + setState(1243); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1239); + setState(1244); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1240); + setState(1245); predType(); } break; @@ -7632,9 +7662,9 @@ public final PredTypeContext predType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1243); + setState(1248); match(PRED); - setState(1244); + setState(1249); predTypeParams(); } } @@ -7681,39 +7711,39 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1246); + setState(1251); match(L_PAREN); - setState(1258); + setState(1263); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { { - setState(1247); - type_(); setState(1252); + type_(); + setState(1257); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,100,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1248); + setState(1253); match(COMMA); - setState(1249); + setState(1254); type_(); } } } - setState(1254); + setState(1259); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,100,_ctx); } - setState(1256); + setState(1261); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1255); + setState(1260); match(COMMA); } } @@ -7721,7 +7751,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1260); + setState(1265); match(R_PAREN); } } @@ -7773,55 +7803,55 @@ public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); enterRule(_localctx, 200, RULE_literalType); try { - setState(1269); + setState(1274); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1262); + setState(1267); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1263); + setState(1268); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1264); + setState(1269); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1265); + setState(1270); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1266); + setState(1271); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1267); + setState(1272); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1268); + setState(1273); typeName(); } break; @@ -7862,13 +7892,13 @@ public final ImplicitArrayContext implicitArray() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1271); + setState(1276); match(L_BRACKET); - setState(1272); + setState(1277); match(ELLIPSIS); - setState(1273); + setState(1278); match(R_BRACKET); - setState(1274); + setState(1279); elementType(); } } @@ -7917,31 +7947,31 @@ public final Slice_Context slice_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1276); + setState(1281); match(L_BRACKET); - setState(1292); + setState(1297); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) { case 1: { - setState(1278); + setState(1283); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { { - setState(1277); + setState(1282); low(); } } - setState(1280); + setState(1285); match(COLON); - setState(1282); + setState(1287); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { { - setState(1281); + setState(1286); high(); } } @@ -7950,28 +7980,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1285); + setState(1290); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { { - setState(1284); + setState(1289); low(); } } - setState(1287); + setState(1292); match(COLON); - setState(1288); + setState(1293); high(); - setState(1289); + setState(1294); match(COLON); - setState(1290); + setState(1295); cap(); } break; } - setState(1294); + setState(1299); match(R_BRACKET); } } @@ -8007,7 +8037,7 @@ public final LowContext low() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1296); + setState(1301); expression(0); } } @@ -8043,7 +8073,7 @@ public final HighContext high() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1298); + setState(1303); expression(0); } } @@ -8079,7 +8109,7 @@ public final CapContext cap() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1300); + setState(1305); expression(0); } } @@ -8126,15 +8156,15 @@ public final Assign_opContext assign_op() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1303); + setState(1308); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 124)) & ~0x3f) == 0 && ((1L << (_la - 124)) & ((1L << (OR - 124)) | (1L << (DIV - 124)) | (1L << (MOD - 124)) | (1L << (LSHIFT - 124)) | (1L << (RSHIFT - 124)) | (1L << (BIT_CLEAR - 124)) | (1L << (PLUS - 124)) | (1L << (MINUS - 124)) | (1L << (CARET - 124)) | (1L << (STAR - 124)) | (1L << (AMPERSAND - 124)))) != 0)) { + if (((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (OR - 125)) | (1L << (DIV - 125)) | (1L << (MOD - 125)) | (1L << (LSHIFT - 125)) | (1L << (RSHIFT - 125)) | (1L << (BIT_CLEAR - 125)) | (1L << (PLUS - 125)) | (1L << (MINUS - 125)) | (1L << (CARET - 125)) | (1L << (STAR - 125)) | (1L << (AMPERSAND - 125)))) != 0)) { { - setState(1302); + setState(1307); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 124)) & ~0x3f) == 0 && ((1L << (_la - 124)) & ((1L << (OR - 124)) | (1L << (DIV - 124)) | (1L << (MOD - 124)) | (1L << (LSHIFT - 124)) | (1L << (RSHIFT - 124)) | (1L << (BIT_CLEAR - 124)) | (1L << (PLUS - 124)) | (1L << (MINUS - 124)) | (1L << (CARET - 124)) | (1L << (STAR - 124)) | (1L << (AMPERSAND - 124)))) != 0)) ) { + if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (OR - 125)) | (1L << (DIV - 125)) | (1L << (MOD - 125)) | (1L << (LSHIFT - 125)) | (1L << (RSHIFT - 125)) | (1L << (BIT_CLEAR - 125)) | (1L << (PLUS - 125)) | (1L << (MINUS - 125)) | (1L << (CARET - 125)) | (1L << (STAR - 125)) | (1L << (AMPERSAND - 125)))) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -8145,7 +8175,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1305); + setState(1310); match(ASSIGN); } } @@ -8193,43 +8223,43 @@ public final RangeClauseContext rangeClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1313); + setState(1318); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { case 1: { - setState(1307); + setState(1312); expressionList(); - setState(1308); + setState(1313); match(ASSIGN); } break; case 2: { - setState(1310); + setState(1315); maybeAddressableIdentifierList(); - setState(1311); + setState(1316); match(DECLARE_ASSIGN); } break; } - setState(1315); + setState(1320); match(RANGE); - setState(1316); - expression(0); setState(1321); + expression(0); + setState(1326); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1317); + setState(1322); match(WITH); - setState(1319); + setState(1324); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1318); + setState(1323); match(IDENTIFIER); } } @@ -8271,9 +8301,9 @@ public final PackageClauseContext packageClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1323); + setState(1328); match(PACKAGE); - setState(1324); + setState(1329); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -8309,7 +8339,7 @@ public final ImportPathContext importPath() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1326); + setState(1331); string_(); } } @@ -8349,27 +8379,27 @@ public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); enterRule(_localctx, 220, RULE_declaration); try { - setState(1331); + setState(1336); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1328); + setState(1333); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1329); + setState(1334); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1330); + setState(1335); varDecl(); } break; @@ -8422,38 +8452,38 @@ public final ConstDeclContext constDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1333); + setState(1338); match(CONST); - setState(1345); + setState(1350); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1334); + setState(1339); constSpec(); } break; case L_PAREN: { - setState(1335); + setState(1340); match(L_PAREN); - setState(1341); + setState(1346); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1336); + setState(1341); constSpec(); - setState(1337); + setState(1342); eos(); } } - setState(1343); + setState(1348); _errHandler.sync(this); _la = _input.LA(1); } - setState(1344); + setState(1349); match(R_PAREN); } break; @@ -8502,26 +8532,26 @@ public final ConstSpecContext constSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1347); + setState(1352); identifierList(); - setState(1353); + setState(1358); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { case 1: { - setState(1349); + setState(1354); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { { - setState(1348); + setState(1353); type_(); } } - setState(1351); + setState(1356); match(ASSIGN); - setState(1352); + setState(1357); expressionList(); } break; @@ -8566,23 +8596,23 @@ public final IdentifierListContext identifierList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1355); - match(IDENTIFIER); setState(1360); + match(IDENTIFIER); + setState(1365); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,117,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1356); + setState(1361); match(COMMA); - setState(1357); + setState(1362); match(IDENTIFIER); } } } - setState(1362); + setState(1367); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,117,_ctx); } @@ -8628,23 +8658,23 @@ public final ExpressionListContext expressionList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1363); - expression(0); setState(1368); + expression(0); + setState(1373); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,118,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1364); + setState(1369); match(COMMA); - setState(1365); + setState(1370); expression(0); } } } - setState(1370); + setState(1375); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,118,_ctx); } @@ -8695,38 +8725,38 @@ public final TypeDeclContext typeDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1371); + setState(1376); match(TYPE); - setState(1383); + setState(1388); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1372); + setState(1377); typeSpec(); } break; case L_PAREN: { - setState(1373); + setState(1378); match(L_PAREN); - setState(1379); + setState(1384); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1374); + setState(1379); typeSpec(); - setState(1375); + setState(1380); eos(); } } - setState(1381); + setState(1386); _errHandler.sync(this); _la = _input.LA(1); } - setState(1382); + setState(1387); match(R_PAREN); } break; @@ -8770,19 +8800,19 @@ public final TypeSpecContext typeSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1385); + setState(1390); match(IDENTIFIER); - setState(1387); + setState(1392); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1386); + setState(1391); match(ASSIGN); } } - setState(1389); + setState(1394); type_(); } } @@ -8831,38 +8861,38 @@ public final VarDeclContext varDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1391); + setState(1396); match(VAR); - setState(1403); + setState(1408); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1392); + setState(1397); varSpec(); } break; case L_PAREN: { - setState(1393); + setState(1398); match(L_PAREN); - setState(1399); + setState(1404); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1394); + setState(1399); varSpec(); - setState(1395); + setState(1400); eos(); } } - setState(1401); + setState(1406); _errHandler.sync(this); _la = _input.LA(1); } - setState(1402); + setState(1407); match(R_PAREN); } break; @@ -8905,19 +8935,19 @@ public final BlockContext block() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1405); + setState(1410); match(L_CURLY); - setState(1407); + setState(1412); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { case 1: { - setState(1406); + setState(1411); statementList(); } break; } - setState(1409); + setState(1414); match(R_CURLY); } } @@ -8963,7 +8993,7 @@ public final StatementListContext statementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1417); + setState(1422); _errHandler.sync(this); _alt = 1; do { @@ -8971,19 +9001,19 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1412); + setState(1417); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { case 1: { - setState(1411); + setState(1416); eos(); } break; } - setState(1414); + setState(1419); statement(); - setState(1415); + setState(1420); eos(); } } @@ -8991,7 +9021,7 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1419); + setState(1424); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,126,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -9039,41 +9069,41 @@ public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); enterRule(_localctx, 240, RULE_simpleStmt); try { - setState(1426); + setState(1431); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1421); + setState(1426); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1422); + setState(1427); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1423); + setState(1428); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1424); + setState(1429); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1425); + setState(1430); shortVarDecl(); } break; @@ -9111,7 +9141,7 @@ public final ExpressionStmtContext expressionStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1428); + setState(1433); expression(0); } } @@ -9152,11 +9182,11 @@ public final SendStmtContext sendStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1430); + setState(1435); ((SendStmtContext)_localctx).channel = expression(0); - setState(1431); + setState(1436); match(RECEIVE); - setState(1432); + setState(1437); expression(0); } } @@ -9195,9 +9225,9 @@ public final IncDecStmtContext incDecStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1434); + setState(1439); expression(0); - setState(1435); + setState(1440); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -9247,11 +9277,11 @@ public final AssignmentContext assignment() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1437); + setState(1442); expressionList(); - setState(1438); + setState(1443); assign_op(); - setState(1439); + setState(1444); expressionList(); } } @@ -9287,7 +9317,7 @@ public final EmptyStmtContext emptyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1441); + setState(1446); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -9333,16 +9363,16 @@ public final LabeledStmtContext labeledStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1443); + setState(1448); match(IDENTIFIER); - setState(1444); + setState(1449); match(COLON); - setState(1446); + setState(1451); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { case 1: { - setState(1445); + setState(1450); statement(); } break; @@ -9382,14 +9412,14 @@ public final ReturnStmtContext returnStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1448); + setState(1453); match(RETURN); - setState(1450); + setState(1455); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: { - setState(1449); + setState(1454); expressionList(); } break; @@ -9427,14 +9457,14 @@ public final BreakStmtContext breakStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1452); + setState(1457); match(BREAK); - setState(1454); + setState(1459); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: { - setState(1453); + setState(1458); match(IDENTIFIER); } break; @@ -9472,14 +9502,14 @@ public final ContinueStmtContext continueStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1456); + setState(1461); match(CONTINUE); - setState(1458); + setState(1463); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { case 1: { - setState(1457); + setState(1462); match(IDENTIFIER); } break; @@ -9517,9 +9547,9 @@ public final GotoStmtContext gotoStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1460); + setState(1465); match(GOTO); - setState(1461); + setState(1466); match(IDENTIFIER); } } @@ -9553,7 +9583,7 @@ public final FallthroughStmtContext fallthroughStmt() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1463); + setState(1468); match(FALLTHROUGH); } } @@ -9606,57 +9636,57 @@ public final IfStmtContext ifStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1465); + setState(1470); match(IF); - setState(1474); + setState(1479); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { case 1: { - setState(1466); + setState(1471); expression(0); } break; case 2: { - setState(1467); + setState(1472); eos(); - setState(1468); + setState(1473); expression(0); } break; case 3: { - setState(1470); + setState(1475); simpleStmt(); - setState(1471); + setState(1476); eos(); - setState(1472); + setState(1477); expression(0); } break; } - setState(1476); + setState(1481); block(); - setState(1482); + setState(1487); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { case 1: { - setState(1477); + setState(1482); match(ELSE); - setState(1480); + setState(1485); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1478); + setState(1483); ifStmt(); } break; case L_CURLY: { - setState(1479); + setState(1484); block(); } break; @@ -9701,20 +9731,20 @@ public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); enterRule(_localctx, 266, RULE_switchStmt); try { - setState(1486); + setState(1491); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1484); + setState(1489); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1485); + setState(1490); typeSwitchStmt(); } break; @@ -9768,19 +9798,19 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1488); + setState(1493); match(SWITCH); - setState(1499); + setState(1504); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: { - setState(1490); + setState(1495); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { { - setState(1489); + setState(1494); expression(0); } } @@ -9789,24 +9819,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1493); + setState(1498); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { case 1: { - setState(1492); + setState(1497); simpleStmt(); } break; } - setState(1495); + setState(1500); eos(); - setState(1497); + setState(1502); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { { - setState(1496); + setState(1501); expression(0); } } @@ -9814,23 +9844,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1501); + setState(1506); match(L_CURLY); - setState(1505); + setState(1510); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1502); + setState(1507); exprCaseClause(); } } - setState(1507); + setState(1512); _errHandler.sync(this); _la = _input.LA(1); } - setState(1508); + setState(1513); match(R_CURLY); } } @@ -9870,16 +9900,16 @@ public final ExprCaseClauseContext exprCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1510); + setState(1515); exprSwitchCase(); - setState(1511); + setState(1516); match(COLON); - setState(1513); + setState(1518); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { case 1: { - setState(1512); + setState(1517); statementList(); } break; @@ -9918,22 +9948,22 @@ public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 272, RULE_exprSwitchCase); try { - setState(1518); + setState(1523); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1515); + setState(1520); match(CASE); - setState(1516); + setState(1521); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1517); + setState(1522); match(DEFAULT); } break; @@ -9989,53 +10019,53 @@ public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1520); + setState(1525); match(SWITCH); - setState(1529); + setState(1534); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: { - setState(1521); + setState(1526); typeSwitchGuard(); } break; case 2: { - setState(1522); + setState(1527); eos(); - setState(1523); + setState(1528); typeSwitchGuard(); } break; case 3: { - setState(1525); + setState(1530); simpleStmt(); - setState(1526); + setState(1531); eos(); - setState(1527); + setState(1532); typeSwitchGuard(); } break; } - setState(1531); + setState(1536); match(L_CURLY); - setState(1535); + setState(1540); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1532); + setState(1537); typeCaseClause(); } } - setState(1537); + setState(1542); _errHandler.sync(this); _la = _input.LA(1); } - setState(1538); + setState(1543); match(R_CURLY); } } @@ -10077,27 +10107,27 @@ public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1542); + setState(1547); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1540); + setState(1545); match(IDENTIFIER); - setState(1541); + setState(1546); match(DECLARE_ASSIGN); } break; } - setState(1544); + setState(1549); primaryExpr(0); - setState(1545); + setState(1550); match(DOT); - setState(1546); + setState(1551); match(L_PAREN); - setState(1547); + setState(1552); match(TYPE); - setState(1548); + setState(1553); match(R_PAREN); } } @@ -10137,16 +10167,16 @@ public final TypeCaseClauseContext typeCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1550); + setState(1555); typeSwitchCase(); - setState(1551); + setState(1556); match(COLON); - setState(1553); + setState(1558); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1552); + setState(1557); statementList(); } break; @@ -10185,22 +10215,22 @@ public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 280, RULE_typeSwitchCase); try { - setState(1558); + setState(1563); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1555); + setState(1560); match(CASE); - setState(1556); + setState(1561); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1557); + setState(1562); match(DEFAULT); } break; @@ -10252,7 +10282,7 @@ public final TypeListContext typeList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1562); + setState(1567); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10275,28 +10305,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1560); + setState(1565); type_(); } break; case NIL_LIT: { - setState(1561); + setState(1566); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1571); + setState(1576); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1564); + setState(1569); match(COMMA); - setState(1567); + setState(1572); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10319,13 +10349,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1565); + setState(1570); type_(); } break; case NIL_LIT: { - setState(1566); + setState(1571); match(NIL_LIT); } break; @@ -10334,7 +10364,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1573); + setState(1578); _errHandler.sync(this); _la = _input.LA(1); } @@ -10379,25 +10409,25 @@ public final SelectStmtContext selectStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1574); + setState(1579); match(SELECT); - setState(1575); + setState(1580); match(L_CURLY); - setState(1579); + setState(1584); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1576); + setState(1581); commClause(); } } - setState(1581); + setState(1586); _errHandler.sync(this); _la = _input.LA(1); } - setState(1582); + setState(1587); match(R_CURLY); } } @@ -10437,16 +10467,16 @@ public final CommClauseContext commClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1584); + setState(1589); commCase(); - setState(1585); + setState(1590); match(COLON); - setState(1587); + setState(1592); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { case 1: { - setState(1586); + setState(1591); statementList(); } break; @@ -10488,26 +10518,26 @@ public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); enterRule(_localctx, 288, RULE_commCase); try { - setState(1595); + setState(1600); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1589); + setState(1594); match(CASE); - setState(1592); + setState(1597); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { case 1: { - setState(1590); + setState(1595); sendStmt(); } break; case 2: { - setState(1591); + setState(1596); recvStmt(); } break; @@ -10517,7 +10547,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1594); + setState(1599); match(DEFAULT); } break; @@ -10566,27 +10596,27 @@ public final RecvStmtContext recvStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1603); + setState(1608); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { case 1: { - setState(1597); + setState(1602); expressionList(); - setState(1598); + setState(1603); match(ASSIGN); } break; case 2: { - setState(1600); + setState(1605); identifierList(); - setState(1601); + setState(1606); match(DECLARE_ASSIGN); } break; } - setState(1605); + setState(1610); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -10632,31 +10662,31 @@ public final ForStmtContext forStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1607); + setState(1612); match(FOR); - setState(1611); + setState(1616); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { case 1: { - setState(1608); + setState(1613); expression(0); } break; case 2: { - setState(1609); + setState(1614); forClause(); } break; case 3: { - setState(1610); + setState(1615); rangeClause(); } break; } - setState(1613); + setState(1618); block(); } } @@ -10707,36 +10737,36 @@ public final ForClauseContext forClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1616); + setState(1621); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: { - setState(1615); + setState(1620); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1618); + setState(1623); eos(); - setState(1620); + setState(1625); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { case 1: { - setState(1619); + setState(1624); expression(0); } break; } - setState(1622); + setState(1627); eos(); - setState(1624); + setState(1629); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { { - setState(1623); + setState(1628); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -10776,9 +10806,9 @@ public final GoStmtContext goStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1626); + setState(1631); match(GO); - setState(1627); + setState(1632); expression(0); } } @@ -10813,20 +10843,20 @@ public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); enterRule(_localctx, 298, RULE_typeName); try { - setState(1631); + setState(1636); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1629); + setState(1634); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1630); + setState(1635); match(IDENTIFIER); } break; @@ -10869,13 +10899,13 @@ public final ArrayTypeContext arrayType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1633); + setState(1638); match(L_BRACKET); - setState(1634); + setState(1639); arrayLength(); - setState(1635); + setState(1640); match(R_BRACKET); - setState(1636); + setState(1641); elementType(); } } @@ -10911,7 +10941,7 @@ public final ArrayLengthContext arrayLength() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1638); + setState(1643); expression(0); } } @@ -10947,7 +10977,7 @@ public final ElementTypeContext elementType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1640); + setState(1645); type_(); } } @@ -10984,9 +11014,9 @@ public final PointerTypeContext pointerType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1642); + setState(1647); match(STAR); - setState(1643); + setState(1648); type_(); } } @@ -11024,11 +11054,11 @@ public final SliceTypeContext sliceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1645); + setState(1650); match(L_BRACKET); - setState(1646); + setState(1651); match(R_BRACKET); - setState(1647); + setState(1652); elementType(); } } @@ -11070,15 +11100,15 @@ public final MapTypeContext mapType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1649); + setState(1654); match(MAP); - setState(1650); + setState(1655); match(L_BRACKET); - setState(1651); + setState(1656); type_(); - setState(1652); + setState(1657); match(R_BRACKET); - setState(1653); + setState(1658); elementType(); } } @@ -11116,33 +11146,33 @@ public final ChannelTypeContext channelType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1660); + setState(1665); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { case 1: { - setState(1655); + setState(1660); match(CHAN); } break; case 2: { - setState(1656); + setState(1661); match(CHAN); - setState(1657); + setState(1662); match(RECEIVE); } break; case 3: { - setState(1658); + setState(1663); match(RECEIVE); - setState(1659); + setState(1664); match(CHAN); } break; } - setState(1662); + setState(1667); elementType(); } } @@ -11179,9 +11209,9 @@ public final FunctionTypeContext functionType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1664); + setState(1669); match(FUNC); - setState(1665); + setState(1670); signature(); } } @@ -11218,22 +11248,22 @@ public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); enterRule(_localctx, 316, RULE_signature); try { - setState(1671); + setState(1676); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1667); + setState(1672); parameters(); - setState(1668); + setState(1673); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1670); + setState(1675); parameters(); } break; @@ -11272,20 +11302,20 @@ public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); enterRule(_localctx, 318, RULE_result); try { - setState(1675); + setState(1680); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1673); + setState(1678); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1674); + setState(1679); type_(); } break; @@ -11334,39 +11364,39 @@ public final ParametersContext parameters() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1677); + setState(1682); match(L_PAREN); - setState(1689); + setState(1694); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (FUNC - 76)) | (1L << (INTERFACE - 76)) | (1L << (MAP - 76)) | (1L << (STRUCT - 76)) | (1L << (CHAN - 76)) | (1L << (IDENTIFIER - 76)) | (1L << (L_PAREN - 76)) | (1L << (L_BRACKET - 76)) | (1L << (ELLIPSIS - 76)) | (1L << (STAR - 76)) | (1L << (RECEIVE - 76)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (ELLIPSIS - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { { - setState(1678); - parameterDecl(); setState(1683); + parameterDecl(); + setState(1688); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,164,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1679); + setState(1684); match(COMMA); - setState(1680); + setState(1685); parameterDecl(); } } } - setState(1685); + setState(1690); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,164,_ctx); } - setState(1687); + setState(1692); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1686); + setState(1691); match(COMMA); } } @@ -11374,7 +11404,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1691); + setState(1696); match(R_PAREN); } } @@ -11417,23 +11447,23 @@ public final ConversionContext conversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1693); + setState(1698); nonNamedType(); - setState(1694); + setState(1699); match(L_PAREN); - setState(1695); + setState(1700); expression(0); - setState(1697); + setState(1702); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1696); + setState(1701); match(COMMA); } } - setState(1699); + setState(1704); match(R_PAREN); } } @@ -11472,7 +11502,7 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); enterRule(_localctx, 324, RULE_nonNamedType); try { - setState(1706); + setState(1711); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -11486,18 +11516,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1701); + setState(1706); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1702); + setState(1707); match(L_PAREN); - setState(1703); + setState(1708); nonNamedType(); - setState(1704); + setState(1709); match(R_PAREN); } break; @@ -11543,31 +11573,31 @@ public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); enterRule(_localctx, 326, RULE_operand); try { - setState(1714); + setState(1719); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1708); + setState(1713); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1709); + setState(1714); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1710); + setState(1715); match(L_PAREN); - setState(1711); + setState(1716); expression(0); - setState(1712); + setState(1717); match(R_PAREN); } break; @@ -11609,7 +11639,7 @@ public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); enterRule(_localctx, 328, RULE_literal); try { - setState(1719); + setState(1724); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11626,7 +11656,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1716); + setState(1721); basicLit(); } break; @@ -11644,7 +11674,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1717); + setState(1722); compositeLit(); } break; @@ -11657,7 +11687,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1718); + setState(1723); functionLit(); } break; @@ -11701,9 +11731,9 @@ public final IntegerContext integer() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1721); + setState(1726); _la = _input.LA(1); - if ( !(((((_la - 137)) & ~0x3f) == 0 && ((1L << (_la - 137)) & ((1L << (DECIMAL_LIT - 137)) | (1L << (BINARY_LIT - 137)) | (1L << (OCTAL_LIT - 137)) | (1L << (HEX_LIT - 137)) | (1L << (IMAGINARY_LIT - 137)) | (1L << (RUNE_LIT - 137)))) != 0)) ) { + if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & ((1L << (DECIMAL_LIT - 138)) | (1L << (BINARY_LIT - 138)) | (1L << (OCTAL_LIT - 138)) | (1L << (HEX_LIT - 138)) | (1L << (IMAGINARY_LIT - 138)) | (1L << (RUNE_LIT - 138)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -11743,7 +11773,7 @@ public final OperandNameContext operandName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1723); + setState(1728); match(IDENTIFIER); } } @@ -11781,11 +11811,11 @@ public final QualifiedIdentContext qualifiedIdent() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1725); + setState(1730); match(IDENTIFIER); - setState(1726); + setState(1731); match(DOT); - setState(1727); + setState(1732); match(IDENTIFIER); } } @@ -11824,9 +11854,9 @@ public final CompositeLitContext compositeLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1729); + setState(1734); literalType(); - setState(1730); + setState(1735); literalValue(); } } @@ -11866,21 +11896,21 @@ public final LiteralValueContext literalValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1732); - match(L_CURLY); setState(1737); + match(L_CURLY); + setState(1742); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_CURLY - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { { - setState(1733); + setState(1738); elementList(); - setState(1735); + setState(1740); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1734); + setState(1739); match(COMMA); } } @@ -11888,7 +11918,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1739); + setState(1744); match(R_CURLY); } } @@ -11932,23 +11962,23 @@ public final ElementListContext elementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1741); - keyedElement(); setState(1746); + keyedElement(); + setState(1751); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,173,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1742); + setState(1747); match(COMMA); - setState(1743); + setState(1748); keyedElement(); } } } - setState(1748); + setState(1753); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,173,_ctx); } @@ -11990,19 +12020,19 @@ public final KeyedElementContext keyedElement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1752); + setState(1757); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { case 1: { - setState(1749); + setState(1754); key(); - setState(1750); + setState(1755); match(COLON); } break; } - setState(1754); + setState(1759); element(); } } @@ -12039,7 +12069,7 @@ public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); enterRule(_localctx, 344, RULE_key); try { - setState(1758); + setState(1763); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12056,6 +12086,7 @@ public final KeyContext key() throws RecognitionException { case EXISTS: case ACCESS: case UNFOLDING: + case LET: case GHOST: case SEQ: case SET: @@ -12106,14 +12137,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1756); + setState(1761); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1757); + setState(1762); literalValue(); } break; @@ -12154,7 +12185,7 @@ public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); enterRule(_localctx, 346, RULE_element); try { - setState(1762); + setState(1767); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12171,6 +12202,7 @@ public final ElementContext element() throws RecognitionException { case EXISTS: case ACCESS: case UNFOLDING: + case LET: case GHOST: case SEQ: case SET: @@ -12221,14 +12253,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1760); + setState(1765); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1761); + setState(1766); literalValue(); } break; @@ -12281,27 +12313,27 @@ public final StructTypeContext structType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1764); + setState(1769); match(STRUCT); - setState(1765); + setState(1770); match(L_CURLY); - setState(1771); + setState(1776); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1766); + setState(1771); fieldDecl(); - setState(1767); + setState(1772); eos(); } } - setState(1773); + setState(1778); _errHandler.sync(this); _la = _input.LA(1); } - setState(1774); + setState(1779); match(R_CURLY); } } @@ -12347,30 +12379,30 @@ public final FieldDeclContext fieldDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1780); + setState(1785); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { case 1: { - setState(1776); + setState(1781); identifierList(); - setState(1777); + setState(1782); type_(); } break; case 2: { - setState(1779); + setState(1784); embeddedField(); } break; } - setState(1783); + setState(1788); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { case 1: { - setState(1782); + setState(1787); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -12409,7 +12441,7 @@ public final String_Context string_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1785); + setState(1790); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -12455,17 +12487,17 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1788); + setState(1793); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1787); + setState(1792); match(STAR); } } - setState(1790); + setState(1795); typeName(); } } @@ -12503,11 +12535,11 @@ public final IndexContext index() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1792); + setState(1797); match(L_BRACKET); - setState(1793); + setState(1798); expression(0); - setState(1794); + setState(1799); match(R_BRACKET); } } @@ -12546,13 +12578,13 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1796); + setState(1801); match(DOT); - setState(1797); + setState(1802); match(L_PAREN); - setState(1798); + setState(1803); type_(); - setState(1799); + setState(1804); match(R_PAREN); } } @@ -12599,34 +12631,34 @@ public final ArgumentsContext arguments() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1801); + setState(1806); match(L_PAREN); - setState(1816); + setState(1821); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (WRITEPERM - 64)) | (1L << (NOPERM - 64)) | (1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & ((1L << (EXCLAMATION - 130)) | (1L << (PLUS - 130)) | (1L << (MINUS - 130)) | (1L << (CARET - 130)) | (1L << (STAR - 130)) | (1L << (AMPERSAND - 130)) | (1L << (RECEIVE - 130)) | (1L << (DECIMAL_LIT - 130)) | (1L << (BINARY_LIT - 130)) | (1L << (OCTAL_LIT - 130)) | (1L << (HEX_LIT - 130)) | (1L << (IMAGINARY_LIT - 130)) | (1L << (RUNE_LIT - 130)) | (1L << (RAW_STRING_LIT - 130)) | (1L << (INTERPRETED_STRING_LIT - 130)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { { - setState(1808); + setState(1813); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,182,_ctx) ) { case 1: { - setState(1802); + setState(1807); expressionList(); } break; case 2: { - setState(1803); + setState(1808); nonNamedType(); - setState(1806); + setState(1811); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,181,_ctx) ) { case 1: { - setState(1804); + setState(1809); match(COMMA); - setState(1805); + setState(1810); expressionList(); } break; @@ -12634,22 +12666,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1811); + setState(1816); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1810); + setState(1815); match(ELLIPSIS); } } - setState(1814); + setState(1819); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1813); + setState(1818); match(COMMA); } } @@ -12657,7 +12689,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1818); + setState(1823); match(R_PAREN); } } @@ -12695,11 +12727,11 @@ public final MethodExprContext methodExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1820); + setState(1825); nonNamedType(); - setState(1821); + setState(1826); match(DOT); - setState(1822); + setState(1827); match(IDENTIFIER); } } @@ -12735,7 +12767,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1824); + setState(1829); type_(); } } @@ -12769,34 +12801,34 @@ public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); enterRule(_localctx, 366, RULE_eos); try { - setState(1830); + setState(1835); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1826); + setState(1831); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1827); + setState(1832); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1828); + setState(1833); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1829); + setState(1834); if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()"); } break; @@ -12827,25 +12859,25 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { switch (predIndex) { case 0: - return precpred(_ctx, 12); + return precpred(_ctx, 13); case 1: - return precpred(_ctx, 11); + return precpred(_ctx, 12); case 2: - return precpred(_ctx, 10); + return precpred(_ctx, 11); case 3: - return precpred(_ctx, 9); + return precpred(_ctx, 10); case 4: - return precpred(_ctx, 8); + return precpred(_ctx, 9); case 5: - return precpred(_ctx, 6); + return precpred(_ctx, 7); case 6: - return precpred(_ctx, 5); + return precpred(_ctx, 6); case 7: - return precpred(_ctx, 4); + return precpred(_ctx, 5); case 8: - return precpred(_ctx, 3); + return precpred(_ctx, 4); case 9: - return precpred(_ctx, 7); + return precpred(_ctx, 8); } return true; } @@ -12879,7 +12911,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a1\u072b\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a2\u0730\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -12950,185 +12982,185 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\5K\u03c3\nK\3L\3L\3L\3L\5L\u03c9\nL\3L\3L\5L\u03cd\nL\3M\3M\3M\3M\3N"+ "\3N\5N\u03d5\nN\3N\3N\5N\u03d9\nN\3N\3N\3O\3O\5O\u03df\nO\3P\5P\u03e2"+ "\nP\3P\3P\3Q\3Q\5Q\u03e8\nQ\3Q\3Q\3R\5R\u03ed\nR\3R\3R\3S\3S\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\5S\u0401\nS\3S\3S\3S\3S\3S\3S\3S\3S"+ + "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\5S\u0406\nS\3S\3S\3S"+ "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S"+ - "\3S\3S\7S\u0424\nS\fS\16S\u0427\13S\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3"+ - "T\3T\3T\3T\3T\3T\3T\3T\3T\5T\u043d\nT\3U\3U\3U\3V\3V\3V\5V\u0445\nV\3"+ - "W\3W\3W\3X\3X\3X\3X\7X\u044e\nX\fX\16X\u0451\13X\3X\3X\3X\3X\5X\u0457"+ - "\nX\3Y\3Y\3Y\3Y\3Y\5Y\u045e\nY\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\5Z\u0468\nZ\3["+ - "\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\5[\u0476\n[\3[\3[\3[\3[\3[\3[\3[\3["+ - "\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\7[\u048c\n[\f[\16[\u048f\13[\3\\"+ - "\3\\\3\\\3]\3]\5]\u0496\n]\3]\3]\5]\u049a\n]\3^\3^\5^\u049e\n^\3^\5^\u04a1"+ - "\n^\3^\3^\3_\3_\3_\3_\3_\5_\u04aa\n_\3_\3_\7_\u04ae\n_\f_\16_\u04b1\13"+ - "_\3_\3_\3`\3`\3`\3`\3a\5a\u04ba\na\3a\3a\3a\3a\3a\3a\5a\u04c2\na\3a\3"+ - "a\3a\3a\5a\u04c8\na\3b\3b\3b\3b\3b\3b\3b\5b\u04d1\nb\3c\3c\3c\3c\3c\3"+ - "c\3c\3c\3c\5c\u04dc\nc\3d\3d\3d\3e\3e\3e\3e\7e\u04e5\ne\fe\16e\u04e8\13"+ - "e\3e\5e\u04eb\ne\5e\u04ed\ne\3e\3e\3f\3f\3f\3f\3f\3f\3f\5f\u04f8\nf\3"+ - "g\3g\3g\3g\3g\3h\3h\5h\u0501\nh\3h\3h\5h\u0505\nh\3h\5h\u0508\nh\3h\3"+ - "h\3h\3h\3h\5h\u050f\nh\3h\3h\3i\3i\3j\3j\3k\3k\3l\5l\u051a\nl\3l\3l\3"+ - "m\3m\3m\3m\3m\3m\5m\u0524\nm\3m\3m\3m\3m\5m\u052a\nm\5m\u052c\nm\3n\3"+ - "n\3n\3o\3o\3p\3p\3p\5p\u0536\np\3q\3q\3q\3q\3q\3q\7q\u053e\nq\fq\16q\u0541"+ - "\13q\3q\5q\u0544\nq\3r\3r\5r\u0548\nr\3r\3r\5r\u054c\nr\3s\3s\3s\7s\u0551"+ - "\ns\fs\16s\u0554\13s\3t\3t\3t\7t\u0559\nt\ft\16t\u055c\13t\3u\3u\3u\3"+ - "u\3u\3u\7u\u0564\nu\fu\16u\u0567\13u\3u\5u\u056a\nu\3v\3v\5v\u056e\nv"+ - "\3v\3v\3w\3w\3w\3w\3w\3w\7w\u0578\nw\fw\16w\u057b\13w\3w\5w\u057e\nw\3"+ - "x\3x\5x\u0582\nx\3x\3x\3y\5y\u0587\ny\3y\3y\3y\6y\u058c\ny\ry\16y\u058d"+ - "\3z\3z\3z\3z\3z\5z\u0595\nz\3{\3{\3|\3|\3|\3|\3}\3}\3}\3~\3~\3~\3~\3\177"+ - "\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u05a9\n\u0080\3\u0081\3\u0081\5"+ - "\u0081\u05ad\n\u0081\3\u0082\3\u0082\5\u0082\u05b1\n\u0082\3\u0083\3\u0083"+ - "\5\u0083\u05b5\n\u0083\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086"+ - "\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\5\u0086"+ - "\u05c5\n\u0086\3\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u05cb\n\u0086\5"+ - "\u0086\u05cd\n\u0086\3\u0087\3\u0087\5\u0087\u05d1\n\u0087\3\u0088\3\u0088"+ - "\5\u0088\u05d5\n\u0088\3\u0088\5\u0088\u05d8\n\u0088\3\u0088\3\u0088\5"+ - "\u0088\u05dc\n\u0088\5\u0088\u05de\n\u0088\3\u0088\3\u0088\7\u0088\u05e2"+ - "\n\u0088\f\u0088\16\u0088\u05e5\13\u0088\3\u0088\3\u0088\3\u0089\3\u0089"+ - "\3\u0089\5\u0089\u05ec\n\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u05f1\n"+ - "\u008a\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b"+ - "\3\u008b\5\u008b\u05fc\n\u008b\3\u008b\3\u008b\7\u008b\u0600\n\u008b\f"+ - "\u008b\16\u008b\u0603\13\u008b\3\u008b\3\u008b\3\u008c\3\u008c\5\u008c"+ - "\u0609\n\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d"+ - "\3\u008d\3\u008d\5\u008d\u0614\n\u008d\3\u008e\3\u008e\3\u008e\5\u008e"+ - "\u0619\n\u008e\3\u008f\3\u008f\5\u008f\u061d\n\u008f\3\u008f\3\u008f\3"+ - "\u008f\5\u008f\u0622\n\u008f\7\u008f\u0624\n\u008f\f\u008f\16\u008f\u0627"+ - "\13\u008f\3\u0090\3\u0090\3\u0090\7\u0090\u062c\n\u0090\f\u0090\16\u0090"+ - "\u062f\13\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\5\u0091\u0636"+ - "\n\u0091\3\u0092\3\u0092\3\u0092\5\u0092\u063b\n\u0092\3\u0092\5\u0092"+ - "\u063e\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\5\u0093"+ - "\u0646\n\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\5\u0094"+ - "\u064e\n\u0094\3\u0094\3\u0094\3\u0095\5\u0095\u0653\n\u0095\3\u0095\3"+ - "\u0095\5\u0095\u0657\n\u0095\3\u0095\3\u0095\5\u0095\u065b\n\u0095\3\u0096"+ - "\3\u0096\3\u0096\3\u0097\3\u0097\5\u0097\u0662\n\u0097\3\u0098\3\u0098"+ - "\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u009a\3\u009a\3\u009b\3\u009b"+ - "\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d\3\u009d\3\u009d\3\u009d"+ - "\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u067f"+ - "\n\u009e\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0"+ - "\3\u00a0\5\u00a0\u068a\n\u00a0\3\u00a1\3\u00a1\5\u00a1\u068e\n\u00a1\3"+ - "\u00a2\3\u00a2\3\u00a2\3\u00a2\7\u00a2\u0694\n\u00a2\f\u00a2\16\u00a2"+ - "\u0697\13\u00a2\3\u00a2\5\u00a2\u069a\n\u00a2\5\u00a2\u069c\n\u00a2\3"+ - "\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3\u00a3\5\u00a3\u06a4\n\u00a3\3"+ - "\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u06ad\n"+ - "\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5\5\u00a5\u06b5\n"+ - "\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u06ba\n\u00a6\3\u00a7\3\u00a7\3"+ - "\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa"+ - "\3\u00ab\3\u00ab\3\u00ab\5\u00ab\u06ca\n\u00ab\5\u00ab\u06cc\n\u00ab\3"+ - "\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\7\u00ac\u06d3\n\u00ac\f\u00ac\16"+ - "\u00ac\u06d6\13\u00ac\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u06db\n\u00ad\3"+ - "\u00ad\3\u00ad\3\u00ae\3\u00ae\5\u00ae\u06e1\n\u00ae\3\u00af\3\u00af\5"+ - "\u00af\u06e5\n\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\3\u00b0\7\u00b0\u06ec"+ - "\n\u00b0\f\u00b0\16\u00b0\u06ef\13\u00b0\3\u00b0\3\u00b0\3\u00b1\3\u00b1"+ - "\3\u00b1\3\u00b1\5\u00b1\u06f7\n\u00b1\3\u00b1\5\u00b1\u06fa\n\u00b1\3"+ - "\u00b2\3\u00b2\3\u00b3\5\u00b3\u06ff\n\u00b3\3\u00b3\3\u00b3\3\u00b4\3"+ - "\u00b4\3\u00b4\3\u00b4\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b6"+ - "\3\u00b6\3\u00b6\3\u00b6\3\u00b6\5\u00b6\u0711\n\u00b6\5\u00b6\u0713\n"+ - "\u00b6\3\u00b6\5\u00b6\u0716\n\u00b6\3\u00b6\5\u00b6\u0719\n\u00b6\5\u00b6"+ - "\u071b\n\u00b6\3\u00b6\3\u00b6\3\u00b7\3\u00b7\3\u00b7\3\u00b7\3\u00b8"+ - "\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\5\u00b9\u0729\n\u00b9\3\u00b9"+ - "\3\u02df\4\u00a4\u00b4\u00ba\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \""+ - "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084"+ - "\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c"+ - "\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4"+ - "\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc"+ - "\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4"+ - "\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc"+ - "\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114"+ - "\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c"+ - "\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144"+ - "\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c"+ - "\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\2\25\4\2"+ - "ffqq\3\2\31\32\3\2\7\n\3\2BC\3\2)+\4\2)+--\3\2\u0084\u008a\3\2\26\27\4"+ - "\2\177\u0083\u0088\u0089\6\2$$rr~~\u0085\u0087\3\2 \"\3\2\35\37\4\2IJ"+ - "x}\6\2..\61\61\64\64^^\4\2~\u0083\u0085\u0089\3\2rs\4\2oo\u00a0\u00a0"+ - "\4\2\u008b\u008e\u0090\u0091\3\2\u0097\u0098\2\u078e\2\u0172\3\2\2\2\4"+ - "\u0175\3\2\2\2\6\u0178\3\2\2\2\b\u017b\3\2\2\2\n\u0183\3\2\2\2\f\u018c"+ - "\3\2\2\2\16\u01a7\3\2\2\2\20\u01aa\3\2\2\2\22\u01b2\3\2\2\2\24\u01bf\3"+ - "\2\2\2\26\u01d5\3\2\2\2\30\u01de\3\2\2\2\32\u01e0\3\2\2\2\34\u01e2\3\2"+ - "\2\2\36\u01e5\3\2\2\2 \u01f9\3\2\2\2\"\u01fb\3\2\2\2$\u01fd\3\2\2\2&\u0202"+ - "\3\2\2\2(\u020d\3\2\2\2*\u021a\3\2\2\2,\u021d\3\2\2\2.\u0228\3\2\2\2\60"+ - "\u022a\3\2\2\2\62\u022f\3\2\2\2\64\u0234\3\2\2\2\66\u0239\3\2\2\28\u023e"+ - "\3\2\2\2:\u024b\3\2\2\2<\u024d\3\2\2\2>\u024f\3\2\2\2@\u0254\3\2\2\2B"+ - "\u0259\3\2\2\2D\u025e\3\2\2\2F\u0267\3\2\2\2H\u026e\3\2\2\2J\u027b\3\2"+ - "\2\2L\u027f\3\2\2\2N\u028a\3\2\2\2P\u0292\3\2\2\2R\u0294\3\2\2\2T\u02a9"+ - "\3\2\2\2V\u02ab\3\2\2\2X\u02b7\3\2\2\2Z\u02c3\3\2\2\2\\\u02d3\3\2\2\2"+ - "^\u02df\3\2\2\2`\u02ee\3\2\2\2b\u02f1\3\2\2\2d\u02f9\3\2\2\2f\u02fb\3"+ - "\2\2\2h\u0306\3\2\2\2j\u030e\3\2\2\2l\u031d\3\2\2\2n\u031f\3\2\2\2p\u0327"+ - "\3\2\2\2r\u0335\3\2\2\2t\u0341\3\2\2\2v\u034b\3\2\2\2x\u034f\3\2\2\2z"+ - "\u0355\3\2\2\2|\u036d\3\2\2\2~\u0375\3\2\2\2\u0080\u0384\3\2\2\2\u0082"+ - "\u0386\3\2\2\2\u0084\u038d\3\2\2\2\u0086\u0396\3\2\2\2\u0088\u039b\3\2"+ - "\2\2\u008a\u03a0\3\2\2\2\u008c\u03a6\3\2\2\2\u008e\u03ad\3\2\2\2\u0090"+ - "\u03b2\3\2\2\2\u0092\u03b8\3\2\2\2\u0094\u03bd\3\2\2\2\u0096\u03c4\3\2"+ - "\2\2\u0098\u03ce\3\2\2\2\u009a\u03d2\3\2\2\2\u009c\u03de\3\2\2\2\u009e"+ - "\u03e1\3\2\2\2\u00a0\u03e5\3\2\2\2\u00a2\u03ec\3\2\2\2\u00a4\u0400\3\2"+ - "\2\2\u00a6\u043c\3\2\2\2\u00a8\u043e\3\2\2\2\u00aa\u0441\3\2\2\2\u00ac"+ - "\u0446\3\2\2\2\u00ae\u044f\3\2\2\2\u00b0\u045d\3\2\2\2\u00b2\u0467\3\2"+ - "\2\2\u00b4\u0475\3\2\2\2\u00b6\u0490\3\2\2\2\u00b8\u0493\3\2\2\2\u00ba"+ - "\u049b\3\2\2\2\u00bc\u04a4\3\2\2\2\u00be\u04b4\3\2\2\2\u00c0\u04c7\3\2"+ - "\2\2\u00c2\u04d0\3\2\2\2\u00c4\u04db\3\2\2\2\u00c6\u04dd\3\2\2\2\u00c8"+ - "\u04e0\3\2\2\2\u00ca\u04f7\3\2\2\2\u00cc\u04f9\3\2\2\2\u00ce\u04fe\3\2"+ - "\2\2\u00d0\u0512\3\2\2\2\u00d2\u0514\3\2\2\2\u00d4\u0516\3\2\2\2\u00d6"+ - "\u0519\3\2\2\2\u00d8\u0523\3\2\2\2\u00da\u052d\3\2\2\2\u00dc\u0530\3\2"+ - "\2\2\u00de\u0535\3\2\2\2\u00e0\u0537\3\2\2\2\u00e2\u0545\3\2\2\2\u00e4"+ - "\u054d\3\2\2\2\u00e6\u0555\3\2\2\2\u00e8\u055d\3\2\2\2\u00ea\u056b\3\2"+ - "\2\2\u00ec\u0571\3\2\2\2\u00ee\u057f\3\2\2\2\u00f0\u058b\3\2\2\2\u00f2"+ - "\u0594\3\2\2\2\u00f4\u0596\3\2\2\2\u00f6\u0598\3\2\2\2\u00f8\u059c\3\2"+ - "\2\2\u00fa\u059f\3\2\2\2\u00fc\u05a3\3\2\2\2\u00fe\u05a5\3\2\2\2\u0100"+ - "\u05aa\3\2\2\2\u0102\u05ae\3\2\2\2\u0104\u05b2\3\2\2\2\u0106\u05b6\3\2"+ - "\2\2\u0108\u05b9\3\2\2\2\u010a\u05bb\3\2\2\2\u010c\u05d0\3\2\2\2\u010e"+ - "\u05d2\3\2\2\2\u0110\u05e8\3\2\2\2\u0112\u05f0\3\2\2\2\u0114\u05f2\3\2"+ - "\2\2\u0116\u0608\3\2\2\2\u0118\u0610\3\2\2\2\u011a\u0618\3\2\2\2\u011c"+ - "\u061c\3\2\2\2\u011e\u0628\3\2\2\2\u0120\u0632\3\2\2\2\u0122\u063d\3\2"+ - "\2\2\u0124\u0645\3\2\2\2\u0126\u0649\3\2\2\2\u0128\u0652\3\2\2\2\u012a"+ - "\u065c\3\2\2\2\u012c\u0661\3\2\2\2\u012e\u0663\3\2\2\2\u0130\u0668\3\2"+ - "\2\2\u0132\u066a\3\2\2\2\u0134\u066c\3\2\2\2\u0136\u066f\3\2\2\2\u0138"+ - "\u0673\3\2\2\2\u013a\u067e\3\2\2\2\u013c\u0682\3\2\2\2\u013e\u0689\3\2"+ - "\2\2\u0140\u068d\3\2\2\2\u0142\u068f\3\2\2\2\u0144\u069f\3\2\2\2\u0146"+ - "\u06ac\3\2\2\2\u0148\u06b4\3\2\2\2\u014a\u06b9\3\2\2\2\u014c\u06bb\3\2"+ - "\2\2\u014e\u06bd\3\2\2\2\u0150\u06bf\3\2\2\2\u0152\u06c3\3\2\2\2\u0154"+ - "\u06c6\3\2\2\2\u0156\u06cf\3\2\2\2\u0158\u06da\3\2\2\2\u015a\u06e0\3\2"+ - "\2\2\u015c\u06e4\3\2\2\2\u015e\u06e6\3\2\2\2\u0160\u06f6\3\2\2\2\u0162"+ - "\u06fb\3\2\2\2\u0164\u06fe\3\2\2\2\u0166\u0702\3\2\2\2\u0168\u0706\3\2"+ - "\2\2\u016a\u070b\3\2\2\2\u016c\u071e\3\2\2\2\u016e\u0722\3\2\2\2\u0170"+ - "\u0728\3\2\2\2\u0172\u0173\5\u00a4S\2\u0173\u0174\7\2\2\3\u0174\3\3\2"+ - "\2\2\u0175\u0176\5\u00a6T\2\u0176\u0177\7\2\2\3\u0177\5\3\2\2\2\u0178"+ - "\u0179\5\u00c2b\2\u0179\u017a\7\2\2\3\u017a\7\3\2\2\2\u017b\u0180\5\n"+ - "\6\2\u017c\u017d\7n\2\2\u017d\u017f\5\n\6\2\u017e\u017c\3\2\2\2\u017f"+ - "\u0182\3\2\2\2\u0180\u017e\3\2\2\2\u0180\u0181\3\2\2\2\u0181\t\3\2\2\2"+ - "\u0182\u0180\3\2\2\2\u0183\u0185\7f\2\2\u0184\u0186\7=\2\2\u0185\u0184"+ - "\3\2\2\2\u0185\u0186\3\2\2\2\u0186\13\3\2\2\2\u0187\u0188\5\16\b\2\u0188"+ - "\u0189\5\u0170\u00b9\2\u0189\u018b\3\2\2\2\u018a\u0187\3\2\2\2\u018b\u018e"+ - "\3\2\2\2\u018c\u018a\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u018f\3\2\2\2\u018e"+ - "\u018c\3\2\2\2\u018f\u0190\5\u00dan\2\u0190\u0196\5\u0170\u00b9\2\u0191"+ - "\u0192\5\24\13\2\u0192\u0193\5\u0170\u00b9\2\u0193\u0195\3\2\2\2\u0194"+ - "\u0191\3\2\2\2\u0195\u0198\3\2\2\2\u0196\u0194\3\2\2\2\u0196\u0197\3\2"+ - "\2\2\u0197\u01a2\3\2\2\2\u0198\u0196\3\2\2\2\u0199\u019d\5\u0088E\2\u019a"+ - "\u019d\5\u00dep\2\u019b\u019d\5\26\f\2\u019c\u0199\3\2\2\2\u019c\u019a"+ - "\3\2\2\2\u019c\u019b\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u019f\5\u0170\u00b9"+ - "\2\u019f\u01a1\3\2\2\2\u01a0\u019c\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0"+ - "\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a5\3\2\2\2\u01a4\u01a2\3\2\2\2\u01a5"+ - "\u01a6\7\2\2\3\u01a6\r\3\2\2\2\u01a7\u01a8\7F\2\2\u01a8\u01a9\5\u00a4"+ - "S\2\u01a9\17\3\2\2\2\u01aa\u01ab\7G\2\2\u01ab\u01ac\5\u00a4S\2\u01ac\21"+ - "\3\2\2\2\u01ad\u01ae\5\20\t\2\u01ae\u01af\5\u0170\u00b9\2\u01af\u01b1"+ - "\3\2\2\2\u01b0\u01ad\3\2\2\2\u01b1\u01b4\3\2\2\2\u01b2\u01b0\3\2\2\2\u01b2"+ - "\u01b3\3\2\2\2\u01b3\u01b6\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b5\u01b7\t\2"+ - "\2\2\u01b6\u01b5\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b8\3\2\2\2\u01b8"+ - "\u01b9\5\u00dco\2\u01b9\23\3\2\2\2\u01ba\u01bb\5\20\t\2\u01bb\u01bc\5"+ - "\u0170\u00b9\2\u01bc\u01be\3\2\2\2\u01bd\u01ba\3\2\2\2\u01be\u01c1\3\2"+ - "\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01cf\3\2\2\2\u01c1"+ - "\u01bf\3\2\2\2\u01c2\u01c3\7b\2\2\u01c3\u01d0\5\22\n\2\u01c4\u01c5\7b"+ - "\2\2\u01c5\u01cb\7g\2\2\u01c6\u01c7\5\22\n\2\u01c7\u01c8\5\u0170\u00b9"+ + "\3S\3S\3S\3S\3S\3S\3S\7S\u0429\nS\fS\16S\u042c\13S\3T\3T\3T\3T\3T\3T\3"+ + "T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\5T\u0442\nT\3U\3U\3U\3V\3V\3"+ + "V\5V\u044a\nV\3W\3W\3W\3X\3X\3X\3X\7X\u0453\nX\fX\16X\u0456\13X\3X\3X"+ + "\3X\3X\5X\u045c\nX\3Y\3Y\3Y\3Y\3Y\5Y\u0463\nY\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z"+ + "\5Z\u046d\nZ\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\5[\u047b\n[\3[\3[\3["+ + "\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\7[\u0491\n[\f[\16"+ + "[\u0494\13[\3\\\3\\\3\\\3]\3]\5]\u049b\n]\3]\3]\5]\u049f\n]\3^\3^\5^\u04a3"+ + "\n^\3^\5^\u04a6\n^\3^\3^\3_\3_\3_\3_\3_\5_\u04af\n_\3_\3_\7_\u04b3\n_"+ + "\f_\16_\u04b6\13_\3_\3_\3`\3`\3`\3`\3a\5a\u04bf\na\3a\3a\3a\3a\3a\3a\5"+ + "a\u04c7\na\3a\3a\3a\3a\5a\u04cd\na\3b\3b\3b\3b\3b\3b\3b\5b\u04d6\nb\3"+ + "c\3c\3c\3c\3c\3c\3c\3c\3c\5c\u04e1\nc\3d\3d\3d\3e\3e\3e\3e\7e\u04ea\n"+ + "e\fe\16e\u04ed\13e\3e\5e\u04f0\ne\5e\u04f2\ne\3e\3e\3f\3f\3f\3f\3f\3f"+ + "\3f\5f\u04fd\nf\3g\3g\3g\3g\3g\3h\3h\5h\u0506\nh\3h\3h\5h\u050a\nh\3h"+ + "\5h\u050d\nh\3h\3h\3h\3h\3h\5h\u0514\nh\3h\3h\3i\3i\3j\3j\3k\3k\3l\5l"+ + "\u051f\nl\3l\3l\3m\3m\3m\3m\3m\3m\5m\u0529\nm\3m\3m\3m\3m\5m\u052f\nm"+ + "\5m\u0531\nm\3n\3n\3n\3o\3o\3p\3p\3p\5p\u053b\np\3q\3q\3q\3q\3q\3q\7q"+ + "\u0543\nq\fq\16q\u0546\13q\3q\5q\u0549\nq\3r\3r\5r\u054d\nr\3r\3r\5r\u0551"+ + "\nr\3s\3s\3s\7s\u0556\ns\fs\16s\u0559\13s\3t\3t\3t\7t\u055e\nt\ft\16t"+ + "\u0561\13t\3u\3u\3u\3u\3u\3u\7u\u0569\nu\fu\16u\u056c\13u\3u\5u\u056f"+ + "\nu\3v\3v\5v\u0573\nv\3v\3v\3w\3w\3w\3w\3w\3w\7w\u057d\nw\fw\16w\u0580"+ + "\13w\3w\5w\u0583\nw\3x\3x\5x\u0587\nx\3x\3x\3y\5y\u058c\ny\3y\3y\3y\6"+ + "y\u0591\ny\ry\16y\u0592\3z\3z\3z\3z\3z\5z\u059a\nz\3{\3{\3|\3|\3|\3|\3"+ + "}\3}\3}\3~\3~\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u05ae"+ + "\n\u0080\3\u0081\3\u0081\5\u0081\u05b2\n\u0081\3\u0082\3\u0082\5\u0082"+ + "\u05b6\n\u0082\3\u0083\3\u0083\5\u0083\u05ba\n\u0083\3\u0084\3\u0084\3"+ + "\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086"+ + "\3\u0086\3\u0086\3\u0086\5\u0086\u05ca\n\u0086\3\u0086\3\u0086\3\u0086"+ + "\3\u0086\5\u0086\u05d0\n\u0086\5\u0086\u05d2\n\u0086\3\u0087\3\u0087\5"+ + "\u0087\u05d6\n\u0087\3\u0088\3\u0088\5\u0088\u05da\n\u0088\3\u0088\5\u0088"+ + "\u05dd\n\u0088\3\u0088\3\u0088\5\u0088\u05e1\n\u0088\5\u0088\u05e3\n\u0088"+ + "\3\u0088\3\u0088\7\u0088\u05e7\n\u0088\f\u0088\16\u0088\u05ea\13\u0088"+ + "\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089\5\u0089\u05f1\n\u0089\3\u008a"+ + "\3\u008a\3\u008a\5\u008a\u05f6\n\u008a\3\u008b\3\u008b\3\u008b\3\u008b"+ + "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u0601\n\u008b\3\u008b"+ + "\3\u008b\7\u008b\u0605\n\u008b\f\u008b\16\u008b\u0608\13\u008b\3\u008b"+ + "\3\u008b\3\u008c\3\u008c\5\u008c\u060e\n\u008c\3\u008c\3\u008c\3\u008c"+ + "\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\5\u008d\u0619\n\u008d"+ + "\3\u008e\3\u008e\3\u008e\5\u008e\u061e\n\u008e\3\u008f\3\u008f\5\u008f"+ + "\u0622\n\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u0627\n\u008f\7\u008f\u0629"+ + "\n\u008f\f\u008f\16\u008f\u062c\13\u008f\3\u0090\3\u0090\3\u0090\7\u0090"+ + "\u0631\n\u0090\f\u0090\16\u0090\u0634\13\u0090\3\u0090\3\u0090\3\u0091"+ + "\3\u0091\3\u0091\5\u0091\u063b\n\u0091\3\u0092\3\u0092\3\u0092\5\u0092"+ + "\u0640\n\u0092\3\u0092\5\u0092\u0643\n\u0092\3\u0093\3\u0093\3\u0093\3"+ + "\u0093\3\u0093\3\u0093\5\u0093\u064b\n\u0093\3\u0093\3\u0093\3\u0094\3"+ + "\u0094\3\u0094\3\u0094\5\u0094\u0653\n\u0094\3\u0094\3\u0094\3\u0095\5"+ + "\u0095\u0658\n\u0095\3\u0095\3\u0095\5\u0095\u065c\n\u0095\3\u0095\3\u0095"+ + "\5\u0095\u0660\n\u0095\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\5\u0097"+ + "\u0667\n\u0097\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099"+ + "\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c"+ + "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\5\u009e\u0684\n\u009e\3\u009e\3\u009e\3\u009f\3\u009f"+ + "\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u068f\n\u00a0\3\u00a1"+ + "\3\u00a1\5\u00a1\u0693\n\u00a1\3\u00a2\3\u00a2\3\u00a2\3\u00a2\7\u00a2"+ + "\u0699\n\u00a2\f\u00a2\16\u00a2\u069c\13\u00a2\3\u00a2\5\u00a2\u069f\n"+ + "\u00a2\5\u00a2\u06a1\n\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3"+ + "\u00a3\5\u00a3\u06a9\n\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3"+ + "\u00a4\3\u00a4\5\u00a4\u06b2\n\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3"+ + "\u00a5\3\u00a5\5\u00a5\u06ba\n\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u06bf"+ + "\n\u00a6\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9"+ + "\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\5\u00ab\u06cf\n\u00ab"+ + "\5\u00ab\u06d1\n\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\7\u00ac"+ + "\u06d8\n\u00ac\f\u00ac\16\u00ac\u06db\13\u00ac\3\u00ad\3\u00ad\3\u00ad"+ + "\5\u00ad\u06e0\n\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\5\u00ae\u06e6\n"+ + "\u00ae\3\u00af\3\u00af\5\u00af\u06ea\n\u00af\3\u00b0\3\u00b0\3\u00b0\3"+ + "\u00b0\3\u00b0\7\u00b0\u06f1\n\u00b0\f\u00b0\16\u00b0\u06f4\13\u00b0\3"+ + "\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b1\3\u00b1\5\u00b1\u06fc\n\u00b1\3"+ + "\u00b1\5\u00b1\u06ff\n\u00b1\3\u00b2\3\u00b2\3\u00b3\5\u00b3\u0704\n\u00b3"+ + "\3\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b5\3\u00b5\3\u00b5"+ + "\3\u00b5\3\u00b5\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6\5\u00b6\u0716"+ + "\n\u00b6\5\u00b6\u0718\n\u00b6\3\u00b6\5\u00b6\u071b\n\u00b6\3\u00b6\5"+ + "\u00b6\u071e\n\u00b6\5\u00b6\u0720\n\u00b6\3\u00b6\3\u00b6\3\u00b7\3\u00b7"+ + "\3\u00b7\3\u00b7\3\u00b8\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\5\u00b9"+ + "\u072e\n\u00b9\3\u00b9\3\u02df\4\u00a4\u00b4\u00ba\2\4\6\b\n\f\16\20\22"+ + "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnp"+ + "rtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094"+ + "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac"+ + "\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4"+ + "\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc"+ + "\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4"+ + "\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c"+ + "\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124"+ + "\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c"+ + "\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154"+ + "\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c"+ + "\u016e\u0170\2\25\4\2ggrr\3\2\31\32\3\2\7\n\3\2CD\3\2*,\4\2*,..\3\2\u0085"+ + "\u008b\3\2\26\27\4\2\u0080\u0084\u0089\u008a\6\2%%ss\177\177\u0086\u0088"+ + "\3\2!#\3\2\36 \4\2JKy~\6\2//\62\62\65\65__\4\2\177\u0084\u0086\u008a\3"+ + "\2st\4\2pp\u00a1\u00a1\4\2\u008c\u008f\u0091\u0092\3\2\u0098\u0099\2\u0794"+ + "\2\u0172\3\2\2\2\4\u0175\3\2\2\2\6\u0178\3\2\2\2\b\u017b\3\2\2\2\n\u0183"+ + "\3\2\2\2\f\u018c\3\2\2\2\16\u01a7\3\2\2\2\20\u01aa\3\2\2\2\22\u01b2\3"+ + "\2\2\2\24\u01bf\3\2\2\2\26\u01d5\3\2\2\2\30\u01de\3\2\2\2\32\u01e0\3\2"+ + "\2\2\34\u01e2\3\2\2\2\36\u01e5\3\2\2\2 \u01f9\3\2\2\2\"\u01fb\3\2\2\2"+ + "$\u01fd\3\2\2\2&\u0202\3\2\2\2(\u020d\3\2\2\2*\u021a\3\2\2\2,\u021d\3"+ + "\2\2\2.\u0228\3\2\2\2\60\u022a\3\2\2\2\62\u022f\3\2\2\2\64\u0234\3\2\2"+ + "\2\66\u0239\3\2\2\28\u023e\3\2\2\2:\u024b\3\2\2\2<\u024d\3\2\2\2>\u024f"+ + "\3\2\2\2@\u0254\3\2\2\2B\u0259\3\2\2\2D\u025e\3\2\2\2F\u0267\3\2\2\2H"+ + "\u026e\3\2\2\2J\u027b\3\2\2\2L\u027f\3\2\2\2N\u028a\3\2\2\2P\u0292\3\2"+ + "\2\2R\u0294\3\2\2\2T\u02a9\3\2\2\2V\u02ab\3\2\2\2X\u02b7\3\2\2\2Z\u02c3"+ + "\3\2\2\2\\\u02d3\3\2\2\2^\u02df\3\2\2\2`\u02ee\3\2\2\2b\u02f1\3\2\2\2"+ + "d\u02f9\3\2\2\2f\u02fb\3\2\2\2h\u0306\3\2\2\2j\u030e\3\2\2\2l\u031d\3"+ + "\2\2\2n\u031f\3\2\2\2p\u0327\3\2\2\2r\u0335\3\2\2\2t\u0341\3\2\2\2v\u034b"+ + "\3\2\2\2x\u034f\3\2\2\2z\u0355\3\2\2\2|\u036d\3\2\2\2~\u0375\3\2\2\2\u0080"+ + "\u0384\3\2\2\2\u0082\u0386\3\2\2\2\u0084\u038d\3\2\2\2\u0086\u0396\3\2"+ + "\2\2\u0088\u039b\3\2\2\2\u008a\u03a0\3\2\2\2\u008c\u03a6\3\2\2\2\u008e"+ + "\u03ad\3\2\2\2\u0090\u03b2\3\2\2\2\u0092\u03b8\3\2\2\2\u0094\u03bd\3\2"+ + "\2\2\u0096\u03c4\3\2\2\2\u0098\u03ce\3\2\2\2\u009a\u03d2\3\2\2\2\u009c"+ + "\u03de\3\2\2\2\u009e\u03e1\3\2\2\2\u00a0\u03e5\3\2\2\2\u00a2\u03ec\3\2"+ + "\2\2\u00a4\u0405\3\2\2\2\u00a6\u0441\3\2\2\2\u00a8\u0443\3\2\2\2\u00aa"+ + "\u0446\3\2\2\2\u00ac\u044b\3\2\2\2\u00ae\u0454\3\2\2\2\u00b0\u0462\3\2"+ + "\2\2\u00b2\u046c\3\2\2\2\u00b4\u047a\3\2\2\2\u00b6\u0495\3\2\2\2\u00b8"+ + "\u0498\3\2\2\2\u00ba\u04a0\3\2\2\2\u00bc\u04a9\3\2\2\2\u00be\u04b9\3\2"+ + "\2\2\u00c0\u04cc\3\2\2\2\u00c2\u04d5\3\2\2\2\u00c4\u04e0\3\2\2\2\u00c6"+ + "\u04e2\3\2\2\2\u00c8\u04e5\3\2\2\2\u00ca\u04fc\3\2\2\2\u00cc\u04fe\3\2"+ + "\2\2\u00ce\u0503\3\2\2\2\u00d0\u0517\3\2\2\2\u00d2\u0519\3\2\2\2\u00d4"+ + "\u051b\3\2\2\2\u00d6\u051e\3\2\2\2\u00d8\u0528\3\2\2\2\u00da\u0532\3\2"+ + "\2\2\u00dc\u0535\3\2\2\2\u00de\u053a\3\2\2\2\u00e0\u053c\3\2\2\2\u00e2"+ + "\u054a\3\2\2\2\u00e4\u0552\3\2\2\2\u00e6\u055a\3\2\2\2\u00e8\u0562\3\2"+ + "\2\2\u00ea\u0570\3\2\2\2\u00ec\u0576\3\2\2\2\u00ee\u0584\3\2\2\2\u00f0"+ + "\u0590\3\2\2\2\u00f2\u0599\3\2\2\2\u00f4\u059b\3\2\2\2\u00f6\u059d\3\2"+ + "\2\2\u00f8\u05a1\3\2\2\2\u00fa\u05a4\3\2\2\2\u00fc\u05a8\3\2\2\2\u00fe"+ + "\u05aa\3\2\2\2\u0100\u05af\3\2\2\2\u0102\u05b3\3\2\2\2\u0104\u05b7\3\2"+ + "\2\2\u0106\u05bb\3\2\2\2\u0108\u05be\3\2\2\2\u010a\u05c0\3\2\2\2\u010c"+ + "\u05d5\3\2\2\2\u010e\u05d7\3\2\2\2\u0110\u05ed\3\2\2\2\u0112\u05f5\3\2"+ + "\2\2\u0114\u05f7\3\2\2\2\u0116\u060d\3\2\2\2\u0118\u0615\3\2\2\2\u011a"+ + "\u061d\3\2\2\2\u011c\u0621\3\2\2\2\u011e\u062d\3\2\2\2\u0120\u0637\3\2"+ + "\2\2\u0122\u0642\3\2\2\2\u0124\u064a\3\2\2\2\u0126\u064e\3\2\2\2\u0128"+ + "\u0657\3\2\2\2\u012a\u0661\3\2\2\2\u012c\u0666\3\2\2\2\u012e\u0668\3\2"+ + "\2\2\u0130\u066d\3\2\2\2\u0132\u066f\3\2\2\2\u0134\u0671\3\2\2\2\u0136"+ + "\u0674\3\2\2\2\u0138\u0678\3\2\2\2\u013a\u0683\3\2\2\2\u013c\u0687\3\2"+ + "\2\2\u013e\u068e\3\2\2\2\u0140\u0692\3\2\2\2\u0142\u0694\3\2\2\2\u0144"+ + "\u06a4\3\2\2\2\u0146\u06b1\3\2\2\2\u0148\u06b9\3\2\2\2\u014a\u06be\3\2"+ + "\2\2\u014c\u06c0\3\2\2\2\u014e\u06c2\3\2\2\2\u0150\u06c4\3\2\2\2\u0152"+ + "\u06c8\3\2\2\2\u0154\u06cb\3\2\2\2\u0156\u06d4\3\2\2\2\u0158\u06df\3\2"+ + "\2\2\u015a\u06e5\3\2\2\2\u015c\u06e9\3\2\2\2\u015e\u06eb\3\2\2\2\u0160"+ + "\u06fb\3\2\2\2\u0162\u0700\3\2\2\2\u0164\u0703\3\2\2\2\u0166\u0707\3\2"+ + "\2\2\u0168\u070b\3\2\2\2\u016a\u0710\3\2\2\2\u016c\u0723\3\2\2\2\u016e"+ + "\u0727\3\2\2\2\u0170\u072d\3\2\2\2\u0172\u0173\5\u00a4S\2\u0173\u0174"+ + "\7\2\2\3\u0174\3\3\2\2\2\u0175\u0176\5\u00a6T\2\u0176\u0177\7\2\2\3\u0177"+ + "\5\3\2\2\2\u0178\u0179\5\u00c2b\2\u0179\u017a\7\2\2\3\u017a\7\3\2\2\2"+ + "\u017b\u0180\5\n\6\2\u017c\u017d\7o\2\2\u017d\u017f\5\n\6\2\u017e\u017c"+ + "\3\2\2\2\u017f\u0182\3\2\2\2\u0180\u017e\3\2\2\2\u0180\u0181\3\2\2\2\u0181"+ + "\t\3\2\2\2\u0182\u0180\3\2\2\2\u0183\u0185\7g\2\2\u0184\u0186\7>\2\2\u0185"+ + "\u0184\3\2\2\2\u0185\u0186\3\2\2\2\u0186\13\3\2\2\2\u0187\u0188\5\16\b"+ + "\2\u0188\u0189\5\u0170\u00b9\2\u0189\u018b\3\2\2\2\u018a\u0187\3\2\2\2"+ + "\u018b\u018e\3\2\2\2\u018c\u018a\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u018f"+ + "\3\2\2\2\u018e\u018c\3\2\2\2\u018f\u0190\5\u00dan\2\u0190\u0196\5\u0170"+ + "\u00b9\2\u0191\u0192\5\24\13\2\u0192\u0193\5\u0170\u00b9\2\u0193\u0195"+ + "\3\2\2\2\u0194\u0191\3\2\2\2\u0195\u0198\3\2\2\2\u0196\u0194\3\2\2\2\u0196"+ + "\u0197\3\2\2\2\u0197\u01a2\3\2\2\2\u0198\u0196\3\2\2\2\u0199\u019d\5\u0088"+ + "E\2\u019a\u019d\5\u00dep\2\u019b\u019d\5\26\f\2\u019c\u0199\3\2\2\2\u019c"+ + "\u019a\3\2\2\2\u019c\u019b\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u019f\5\u0170"+ + "\u00b9\2\u019f\u01a1\3\2\2\2\u01a0\u019c\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2"+ + "\u01a0\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a5\3\2\2\2\u01a4\u01a2\3\2"+ + "\2\2\u01a5\u01a6\7\2\2\3\u01a6\r\3\2\2\2\u01a7\u01a8\7G\2\2\u01a8\u01a9"+ + "\5\u00a4S\2\u01a9\17\3\2\2\2\u01aa\u01ab\7H\2\2\u01ab\u01ac\5\u00a4S\2"+ + "\u01ac\21\3\2\2\2\u01ad\u01ae\5\20\t\2\u01ae\u01af\5\u0170\u00b9\2\u01af"+ + "\u01b1\3\2\2\2\u01b0\u01ad\3\2\2\2\u01b1\u01b4\3\2\2\2\u01b2\u01b0\3\2"+ + "\2\2\u01b2\u01b3\3\2\2\2\u01b3\u01b6\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b5"+ + "\u01b7\t\2\2\2\u01b6\u01b5\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b8\3\2"+ + "\2\2\u01b8\u01b9\5\u00dco\2\u01b9\23\3\2\2\2\u01ba\u01bb\5\20\t\2\u01bb"+ + "\u01bc\5\u0170\u00b9\2\u01bc\u01be\3\2\2\2\u01bd\u01ba\3\2\2\2\u01be\u01c1"+ + "\3\2\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01cf\3\2\2\2\u01c1"+ + "\u01bf\3\2\2\2\u01c2\u01c3\7c\2\2\u01c3\u01d0\5\22\n\2\u01c4\u01c5\7c"+ + "\2\2\u01c5\u01cb\7h\2\2\u01c6\u01c7\5\22\n\2\u01c7\u01c8\5\u0170\u00b9"+ "\2\u01c8\u01ca\3\2\2\2\u01c9\u01c6\3\2\2\2\u01ca\u01cd\3\2\2\2\u01cb\u01c9"+ "\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01ce\3\2\2\2\u01cd\u01cb\3\2\2\2\u01ce"+ - "\u01d0\7h\2\2\u01cf\u01c2\3\2\2\2\u01cf\u01c4\3\2\2\2\u01d0\25\3\2\2\2"+ + "\u01d0\7i\2\2\u01cf\u01c2\3\2\2\2\u01cf\u01c4\3\2\2\2\u01d0\25\3\2\2\2"+ "\u01d1\u01d6\5z>\2\u01d2\u01d6\5\u0090I\2\u01d3\u01d6\5\u0094K\2\u01d4"+ "\u01d6\5\u008eH\2\u01d5\u01d1\3\2\2\2\u01d5\u01d2\3\2\2\2\u01d5\u01d3"+ - "\3\2\2\2\u01d5\u01d4\3\2\2\2\u01d6\27\3\2\2\2\u01d7\u01d8\7\34\2\2\u01d8"+ + "\3\2\2\2\u01d5\u01d4\3\2\2\2\u01d6\27\3\2\2\2\u01d7\u01d8\7\35\2\2\u01d8"+ "\u01df\5\u00a6T\2\u01d9\u01da\t\3\2\2\u01da\u01df\5.\30\2\u01db\u01dc"+ "\t\4\2\2\u01dc\u01df\5\u00a4S\2\u01dd\u01df\5f\64\2\u01de\u01d7\3\2\2"+ "\2\u01de\u01d9\3\2\2\2\u01de\u01db\3\2\2\2\u01de\u01dd\3\2\2\2\u01df\31"+ "\3\2\2\2\u01e0\u01e1\5\34\17\2\u01e1\33\3\2\2\2\u01e2\u01e3\5^\60\2\u01e3"+ - "\u01e4\5\36\20\2\u01e4\35\3\2\2\2\u01e5\u01e6\7E\2\2\u01e6\u01e8\7g\2"+ + "\u01e4\5\36\20\2\u01e4\35\3\2\2\2\u01e5\u01e6\7F\2\2\u01e6\u01e8\7h\2"+ "\2\u01e7\u01e9\5\u00f0y\2\u01e8\u01e7\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9"+ - "\u01ea\3\2\2\2\u01ea\u01eb\7h\2\2\u01eb\37\3\2\2\2\u01ec\u01fa\5F$\2\u01ed"+ + "\u01ea\3\2\2\2\u01ea\u01eb\7i\2\2\u01eb\37\3\2\2\2\u01ec\u01fa\5F$\2\u01ed"+ "\u01fa\5D#\2\u01ee\u01fa\5B\"\2\u01ef\u01fa\5$\23\2\u01f0\u01fa\5@!\2"+ "\u01f1\u01fa\58\35\2\u01f2\u01fa\5> \2\u01f3\u01fa\5\66\34\2\u01f4\u01fa"+ "\5\62\32\2\u01f5\u01fa\5\60\31\2\u01f6\u01fa\5\64\33\2\u01f7\u01fa\5\""+ @@ -13136,73 +13168,73 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u01ee\3\2\2\2\u01f9\u01ef\3\2\2\2\u01f9\u01f0\3\2\2\2\u01f9\u01f1\3\2"+ "\2\2\u01f9\u01f2\3\2\2\2\u01f9\u01f3\3\2\2\2\u01f9\u01f4\3\2\2\2\u01f9"+ "\u01f5\3\2\2\2\u01f9\u01f6\3\2\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01f8\3\2"+ - "\2\2\u01fa!\3\2\2\2\u01fb\u01fc\t\5\2\2\u01fc#\3\2\2\2\u01fd\u01fe\7_"+ - "\2\2\u01fe\u01ff\7k\2\2\u01ff\u0200\5\u00c2b\2\u0200\u0201\7l\2\2\u0201"+ - "%\3\2\2\2\u0202\u0207\5(\25\2\u0203\u0204\7n\2\2\u0204\u0206\5(\25\2\u0205"+ + "\2\2\u01fa!\3\2\2\2\u01fb\u01fc\t\5\2\2\u01fc#\3\2\2\2\u01fd\u01fe\7`"+ + "\2\2\u01fe\u01ff\7l\2\2\u01ff\u0200\5\u00c2b\2\u0200\u0201\7m\2\2\u0201"+ + "%\3\2\2\2\u0202\u0207\5(\25\2\u0203\u0204\7o\2\2\u0204\u0206\5(\25\2\u0205"+ "\u0203\3\2\2\2\u0206\u0209\3\2\2\2\u0207\u0205\3\2\2\2\u0207\u0208\3\2"+ - "\2\2\u0208\u020b\3\2\2\2\u0209\u0207\3\2\2\2\u020a\u020c\7n\2\2\u020b"+ - "\u020a\3\2\2\2\u020b\u020c\3\2\2\2\u020c\'\3\2\2\2\u020d\u0212\7f\2\2"+ - "\u020e\u020f\7n\2\2\u020f\u0211\7f\2\2\u0210\u020e\3\2\2\2\u0211\u0214"+ + "\2\2\u0208\u020b\3\2\2\2\u0209\u0207\3\2\2\2\u020a\u020c\7o\2\2\u020b"+ + "\u020a\3\2\2\2\u020b\u020c\3\2\2\2\u020c\'\3\2\2\2\u020d\u0212\7g\2\2"+ + "\u020e\u020f\7o\2\2\u020f\u0211\7g\2\2\u0210\u020e\3\2\2\2\u0211\u0214"+ "\3\2\2\2\u0212\u0210\3\2\2\2\u0212\u0213\3\2\2\2\u0213\u0215\3\2\2\2\u0214"+ "\u0212\3\2\2\2\u0215\u0216\5\u0132\u009a\2\u0216)\3\2\2\2\u0217\u0219"+ "\5,\27\2\u0218\u0217\3\2\2\2\u0219\u021c\3\2\2\2\u021a\u0218\3\2\2\2\u021a"+ - "\u021b\3\2\2\2\u021b+\3\2\2\2\u021c\u021a\3\2\2\2\u021d\u021e\7i\2\2\u021e"+ - "\u0223\5\u00a4S\2\u021f\u0220\7n\2\2\u0220\u0222\5\u00a4S\2\u0221\u021f"+ + "\u021b\3\2\2\2\u021b+\3\2\2\2\u021c\u021a\3\2\2\2\u021d\u021e\7j\2\2\u021e"+ + "\u0223\5\u00a4S\2\u021f\u0220\7o\2\2\u0220\u0222\5\u00a4S\2\u0221\u021f"+ "\3\2\2\2\u0222\u0225\3\2\2\2\u0223\u0221\3\2\2\2\u0223\u0224\3\2\2\2\u0224"+ - "\u0226\3\2\2\2\u0225\u0223\3\2\2\2\u0226\u0227\7j\2\2\u0227-\3\2\2\2\u0228"+ - "\u0229\5\u00b4[\2\u0229/\3\2\2\2\u022a\u022b\7\62\2\2\u022b\u022c\7g\2"+ - "\2\u022c\u022d\5\u00a4S\2\u022d\u022e\7h\2\2\u022e\61\3\2\2\2\u022f\u0230"+ - "\78\2\2\u0230\u0231\7k\2\2\u0231\u0232\5\u00c2b\2\u0232\u0233\7l\2\2\u0233"+ - "\63\3\2\2\2\u0234\u0235\7\63\2\2\u0235\u0236\7g\2\2\u0236\u0237\5\u00a4"+ - "S\2\u0237\u0238\7h\2\2\u0238\65\3\2\2\2\u0239\u023a\t\6\2\2\u023a\u023b"+ - "\7g\2\2\u023b\u023c\5\u00a4S\2\u023c\u023d\7h\2\2\u023d\67\3\2\2\2\u023e"+ - "\u0243\7\23\2\2\u023f\u0240\7k\2\2\u0240\u0241\5:\36\2\u0241\u0242\7l"+ + "\u0226\3\2\2\2\u0225\u0223\3\2\2\2\u0226\u0227\7k\2\2\u0227-\3\2\2\2\u0228"+ + "\u0229\5\u00b4[\2\u0229/\3\2\2\2\u022a\u022b\7\63\2\2\u022b\u022c\7h\2"+ + "\2\u022c\u022d\5\u00a4S\2\u022d\u022e\7i\2\2\u022e\61\3\2\2\2\u022f\u0230"+ + "\79\2\2\u0230\u0231\7l\2\2\u0231\u0232\5\u00c2b\2\u0232\u0233\7m\2\2\u0233"+ + "\63\3\2\2\2\u0234\u0235\7\64\2\2\u0235\u0236\7h\2\2\u0236\u0237\5\u00a4"+ + "S\2\u0237\u0238\7i\2\2\u0238\65\3\2\2\2\u0239\u023a\t\6\2\2\u023a\u023b"+ + "\7h\2\2\u023b\u023c\5\u00a4S\2\u023c\u023d\7i\2\2\u023d\67\3\2\2\2\u023e"+ + "\u0243\7\23\2\2\u023f\u0240\7l\2\2\u0240\u0241\5:\36\2\u0241\u0242\7m"+ "\2\2\u0242\u0244\3\2\2\2\u0243\u023f\3\2\2\2\u0243\u0244\3\2\2\2\u0244"+ - "\u0245\3\2\2\2\u0245\u0246\7g\2\2\u0246\u0247\5\u00a4S\2\u0247\u0248\7"+ - "h\2\2\u02489\3\2\2\2\u0249\u024c\5<\37\2\u024a\u024c\7\25\2\2\u024b\u0249"+ - "\3\2\2\2\u024b\u024a\3\2\2\2\u024c;\3\2\2\2\u024d\u024e\7f\2\2\u024e="+ - "\3\2\2\2\u024f\u0250\7\24\2\2\u0250\u0251\7g\2\2\u0251\u0252\5\u00a4S"+ - "\2\u0252\u0253\7h\2\2\u0253?\3\2\2\2\u0254\u0255\7;\2\2\u0255\u0256\7"+ - "g\2\2\u0256\u0257\5\u00a4S\2\u0257\u0258\7h\2\2\u0258A\3\2\2\2\u0259\u025a"+ - "\7:\2\2\u025a\u025b\7g\2\2\u025b\u025c\5\u00a4S\2\u025c\u025d\7h\2\2\u025d"+ - "C\3\2\2\2\u025e\u025f\7\30\2\2\u025f\u0260\7g\2\2\u0260\u0263\5\u00a4"+ - "S\2\u0261\u0262\7n\2\2\u0262\u0264\5\u00a4S\2\u0263\u0261\3\2\2\2\u0263"+ - "\u0264\3\2\2\2\u0264\u0265\3\2\2\2\u0265\u0266\7h\2\2\u0266E\3\2\2\2\u0267"+ - "\u0268\t\6\2\2\u0268\u0269\7k\2\2\u0269\u026a\5\u00a4S\2\u026a\u026b\7"+ - ">\2\2\u026b\u026c\5\u00a4S\2\u026c\u026d\7l\2\2\u026dG\3\2\2\2\u026e\u026f"+ - "\7\67\2\2\u026f\u0270\5\u00a4S\2\u0270\u0276\7i\2\2\u0271\u0272\5J&\2"+ - "\u0272\u0273\5\u0170\u00b9\2\u0273\u0275\3\2\2\2\u0274\u0271\3\2\2\2\u0275"+ - "\u0278\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0279\3\2"+ - "\2\2\u0278\u0276\3\2\2\2\u0279\u027a\7j\2\2\u027aI\3\2\2\2\u027b\u027c"+ - "\5j\66\2\u027c\u027d\7p\2\2\u027d\u027e\5\u00a4S\2\u027eK\3\2\2\2\u027f"+ - "\u0280\7k\2\2\u0280\u0285\5N(\2\u0281\u0282\7n\2\2\u0282\u0284\5N(\2\u0283"+ - "\u0281\3\2\2\2\u0284\u0287\3\2\2\2\u0285\u0283\3\2\2\2\u0285\u0286\3\2"+ - "\2\2\u0286\u0288\3\2\2\2\u0287\u0285\3\2\2\2\u0288\u0289\7l\2\2\u0289"+ - "M\3\2\2\2\u028a\u028b\5\u00a4S\2\u028b\u028c\7m\2\2\u028c\u028d\5\u00a4"+ - "S\2\u028dO\3\2\2\2\u028e\u0293\5\\/\2\u028f\u0293\5Z.\2\u0290\u0293\5"+ - "R*\2\u0291\u0293\5V,\2\u0292\u028e\3\2\2\2\u0292\u028f\3\2\2\2\u0292\u0290"+ - "\3\2\2\2\u0292\u0291\3\2\2\2\u0293Q\3\2\2\2\u0294\u0295\7\64\2\2\u0295"+ - "\u029b\7i\2\2\u0296\u0297\5T+\2\u0297\u0298\5\u0170\u00b9\2\u0298\u029a"+ - "\3\2\2\2\u0299\u0296\3\2\2\2\u029a\u029d\3\2\2\2\u029b\u0299\3\2\2\2\u029b"+ - "\u029c\3\2\2\2\u029c\u029e\3\2\2\2\u029d\u029b\3\2\2\2\u029e\u029f\7j"+ - "\2\2\u029fS\3\2\2\2\u02a0\u02a1\7N\2\2\u02a1\u02a2\7f\2\2\u02a2\u02aa"+ - "\5\u013e\u00a0\2\u02a3\u02a4\7\65\2\2\u02a4\u02a5\7i\2\2\u02a5\u02a6\5"+ - "\u00a4S\2\u02a6\u02a7\5\u0170\u00b9\2\u02a7\u02a8\7j\2\2\u02a8\u02aa\3"+ - "\2\2\2\u02a9\u02a0\3\2\2\2\u02a9\u02a3\3\2\2\2\u02aaU\3\2\2\2\u02ab\u02ac"+ - "\7\66\2\2\u02ac\u02b2\7i\2\2\u02ad\u02ae\5X-\2\u02ae\u02af\5\u0170\u00b9"+ - "\2\u02af\u02b1\3\2\2\2\u02b0\u02ad\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0"+ - "\3\2\2\2\u02b2\u02b3\3\2\2\2\u02b3\u02b5\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5"+ - "\u02b6\7j\2\2\u02b6W\3\2\2\2\u02b7\u02b8\7f\2\2\u02b8\u02be\7i\2\2\u02b9"+ - "\u02ba\5\u0160\u00b1\2\u02ba\u02bb\5\u0170\u00b9\2\u02bb\u02bd\3\2\2\2"+ - "\u02bc\u02b9\3\2\2\2\u02bd\u02c0\3\2\2\2\u02be\u02bc\3\2\2\2\u02be\u02bf"+ - "\3\2\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02be\3\2\2\2\u02c1\u02c2\7j\2\2\u02c2"+ - "Y\3\2\2\2\u02c3\u02c4\7\34\2\2\u02c4\u02c5\7k\2\2\u02c5\u02c6\7l\2\2\u02c6"+ + "\u0245\3\2\2\2\u0245\u0246\7h\2\2\u0246\u0247\5\u00a4S\2\u0247\u0248\7"+ + "i\2\2\u02489\3\2\2\2\u0249\u024c\5<\37\2\u024a\u024c\7\25\2\2\u024b\u0249"+ + "\3\2\2\2\u024b\u024a\3\2\2\2\u024c;\3\2\2\2\u024d\u024e\7g\2\2\u024e="+ + "\3\2\2\2\u024f\u0250\7\24\2\2\u0250\u0251\7h\2\2\u0251\u0252\5\u00a4S"+ + "\2\u0252\u0253\7i\2\2\u0253?\3\2\2\2\u0254\u0255\7<\2\2\u0255\u0256\7"+ + "h\2\2\u0256\u0257\5\u00a4S\2\u0257\u0258\7i\2\2\u0258A\3\2\2\2\u0259\u025a"+ + "\7;\2\2\u025a\u025b\7h\2\2\u025b\u025c\5\u00a4S\2\u025c\u025d\7i\2\2\u025d"+ + "C\3\2\2\2\u025e\u025f\7\30\2\2\u025f\u0260\7h\2\2\u0260\u0263\5\u00a4"+ + "S\2\u0261\u0262\7o\2\2\u0262\u0264\5\u00a4S\2\u0263\u0261\3\2\2\2\u0263"+ + "\u0264\3\2\2\2\u0264\u0265\3\2\2\2\u0265\u0266\7i\2\2\u0266E\3\2\2\2\u0267"+ + "\u0268\t\6\2\2\u0268\u0269\7l\2\2\u0269\u026a\5\u00a4S\2\u026a\u026b\7"+ + "?\2\2\u026b\u026c\5\u00a4S\2\u026c\u026d\7m\2\2\u026dG\3\2\2\2\u026e\u026f"+ + "\78\2\2\u026f\u0270\5\u00a4S\2\u0270\u0276\7j\2\2\u0271\u0272\5J&\2\u0272"+ + "\u0273\5\u0170\u00b9\2\u0273\u0275\3\2\2\2\u0274\u0271\3\2\2\2\u0275\u0278"+ + "\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0279\3\2\2\2\u0278"+ + "\u0276\3\2\2\2\u0279\u027a\7k\2\2\u027aI\3\2\2\2\u027b\u027c\5j\66\2\u027c"+ + "\u027d\7q\2\2\u027d\u027e\5\u00a4S\2\u027eK\3\2\2\2\u027f\u0280\7l\2\2"+ + "\u0280\u0285\5N(\2\u0281\u0282\7o\2\2\u0282\u0284\5N(\2\u0283\u0281\3"+ + "\2\2\2\u0284\u0287\3\2\2\2\u0285\u0283\3\2\2\2\u0285\u0286\3\2\2\2\u0286"+ + "\u0288\3\2\2\2\u0287\u0285\3\2\2\2\u0288\u0289\7m\2\2\u0289M\3\2\2\2\u028a"+ + "\u028b\5\u00a4S\2\u028b\u028c\7n\2\2\u028c\u028d\5\u00a4S\2\u028dO\3\2"+ + "\2\2\u028e\u0293\5\\/\2\u028f\u0293\5Z.\2\u0290\u0293\5R*\2\u0291\u0293"+ + "\5V,\2\u0292\u028e\3\2\2\2\u0292\u028f\3\2\2\2\u0292\u0290\3\2\2\2\u0292"+ + "\u0291\3\2\2\2\u0293Q\3\2\2\2\u0294\u0295\7\65\2\2\u0295\u029b\7j\2\2"+ + "\u0296\u0297\5T+\2\u0297\u0298\5\u0170\u00b9\2\u0298\u029a\3\2\2\2\u0299"+ + "\u0296\3\2\2\2\u029a\u029d\3\2\2\2\u029b\u0299\3\2\2\2\u029b\u029c\3\2"+ + "\2\2\u029c\u029e\3\2\2\2\u029d\u029b\3\2\2\2\u029e\u029f\7k\2\2\u029f"+ + "S\3\2\2\2\u02a0\u02a1\7O\2\2\u02a1\u02a2\7g\2\2\u02a2\u02aa\5\u013e\u00a0"+ + "\2\u02a3\u02a4\7\66\2\2\u02a4\u02a5\7j\2\2\u02a5\u02a6\5\u00a4S\2\u02a6"+ + "\u02a7\5\u0170\u00b9\2\u02a7\u02a8\7k\2\2\u02a8\u02aa\3\2\2\2\u02a9\u02a0"+ + "\3\2\2\2\u02a9\u02a3\3\2\2\2\u02aaU\3\2\2\2\u02ab\u02ac\7\67\2\2\u02ac"+ + "\u02b2\7j\2\2\u02ad\u02ae\5X-\2\u02ae\u02af\5\u0170\u00b9\2\u02af\u02b1"+ + "\3\2\2\2\u02b0\u02ad\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2"+ + "\u02b3\3\2\2\2\u02b3\u02b5\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02b6\7k"+ + "\2\2\u02b6W\3\2\2\2\u02b7\u02b8\7g\2\2\u02b8\u02be\7j\2\2\u02b9\u02ba"+ + "\5\u0160\u00b1\2\u02ba\u02bb\5\u0170\u00b9\2\u02bb\u02bd\3\2\2\2\u02bc"+ + "\u02b9\3\2\2\2\u02bd\u02c0\3\2\2\2\u02be\u02bc\3\2\2\2\u02be\u02bf\3\2"+ + "\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02be\3\2\2\2\u02c1\u02c2\7k\2\2\u02c2"+ + "Y\3\2\2\2\u02c3\u02c4\7\35\2\2\u02c4\u02c5\7l\2\2\u02c5\u02c6\7m\2\2\u02c6"+ "\u02c7\5\u0132\u009a\2\u02c7[\3\2\2\2\u02c8\u02c9\t\7\2\2\u02c9\u02ca"+ - "\7k\2\2\u02ca\u02cb\5\u00c2b\2\u02cb\u02cc\7l\2\2\u02cc\u02d4\3\2\2\2"+ - "\u02cd\u02ce\7,\2\2\u02ce\u02cf\7k\2\2\u02cf\u02d0\5\u00c2b\2\u02d0\u02d1"+ - "\7l\2\2\u02d1\u02d2\5\u00c2b\2\u02d2\u02d4\3\2\2\2\u02d3\u02c8\3\2\2\2"+ + "\7l\2\2\u02ca\u02cb\5\u00c2b\2\u02cb\u02cc\7m\2\2\u02cc\u02d4\3\2\2\2"+ + "\u02cd\u02ce\7-\2\2\u02ce\u02cf\7l\2\2\u02cf\u02d0\5\u00c2b\2\u02d0\u02d1"+ + "\7m\2\2\u02d1\u02d2\5\u00c2b\2\u02d2\u02d4\3\2\2\2\u02d3\u02c8\3\2\2\2"+ "\u02d3\u02cd\3\2\2\2\u02d4]\3\2\2\2\u02d5\u02db\5`\61\2\u02d6\u02d7\7"+ - "\20\2\2\u02d7\u02db\b\60\1\2\u02d8\u02d9\7D\2\2\u02d9\u02db\b\60\1\2\u02da"+ + "\20\2\2\u02d7\u02db\b\60\1\2\u02d8\u02d9\7E\2\2\u02d9\u02db\b\60\1\2\u02da"+ "\u02d5\3\2\2\2\u02da\u02d6\3\2\2\2\u02da\u02d8\3\2\2\2\u02db\u02dc\3\2"+ "\2\2\u02dc\u02de\5\u0170\u00b9\2\u02dd\u02da\3\2\2\2\u02de\u02e1\3\2\2"+ "\2\u02df\u02e0\3\2\2\2\u02df\u02dd\3\2\2\2\u02e0\u02e4\3\2\2\2\u02e1\u02df"+ @@ -13212,407 +13244,409 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u02ef\5d\63\2\u02ec\u02ed\7\17\2\2\u02ed\u02ef\5b\62\2\u02ee\u02e6\3"+ "\2\2\2\u02ee\u02e8\3\2\2\2\u02ee\u02ea\3\2\2\2\u02ee\u02ec\3\2\2\2\u02ef"+ "a\3\2\2\2\u02f0\u02f2\5\u00e6t\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2"+ - "\2\u02f2\u02f5\3\2\2\2\u02f3\u02f4\7]\2\2\u02f4\u02f6\5\u00a4S\2\u02f5"+ + "\2\u02f2\u02f5\3\2\2\2\u02f3\u02f4\7^\2\2\u02f4\u02f6\5\u00a4S\2\u02f5"+ "\u02f3\3\2\2\2\u02f5\u02f6\3\2\2\2\u02f6c\3\2\2\2\u02f7\u02fa\3\2\2\2"+ "\u02f8\u02fa\5\u00a4S\2\u02f9\u02f7\3\2\2\2\u02f9\u02f8\3\2\2\2\u02fa"+ - "e\3\2\2\2\u02fb\u02fc\7\67\2\2\u02fc\u02fd\5\u00a4S\2\u02fd\u0301\7i\2"+ - "\2\u02fe\u0300\5h\65\2\u02ff\u02fe\3\2\2\2\u0300\u0303\3\2\2\2\u0301\u02ff"+ + "e\3\2\2\2\u02fb\u02fc\78\2\2\u02fc\u02fd\5\u00a4S\2\u02fd\u0301\7j\2\2"+ + "\u02fe\u0300\5h\65\2\u02ff\u02fe\3\2\2\2\u0300\u0303\3\2\2\2\u0301\u02ff"+ "\3\2\2\2\u0301\u0302\3\2\2\2\u0302\u0304\3\2\2\2\u0303\u0301\3\2\2\2\u0304"+ - "\u0305\7j\2\2\u0305g\3\2\2\2\u0306\u0307\5j\66\2\u0307\u0309\7p\2\2\u0308"+ + "\u0305\7k\2\2\u0305g\3\2\2\2\u0306\u0307\5j\66\2\u0307\u0309\7q\2\2\u0308"+ "\u030a\5\u00f0y\2\u0309\u0308\3\2\2\2\u0309\u030a\3\2\2\2\u030ai\3\2\2"+ - "\2\u030b\u030c\7Q\2\2\u030c\u030f\5l\67\2\u030d\u030f\7M\2\2\u030e\u030b"+ - "\3\2\2\2\u030e\u030d\3\2\2\2\u030fk\3\2\2\2\u0310\u0311\7&\2\2\u0311\u031e"+ - "\7f\2\2\u0312\u0313\5\u00caf\2\u0313\u0318\7i\2\2\u0314\u0316\5n8\2\u0315"+ - "\u0317\7n\2\2\u0316\u0315\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u0319\3\2"+ - "\2\2\u0318\u0314\3\2\2\2\u0318\u0319\3\2\2\2\u0319\u031a\3\2\2\2\u031a"+ - "\u031b\7j\2\2\u031b\u031e\3\2\2\2\u031c\u031e\5\u00a4S\2\u031d\u0310\3"+ - "\2\2\2\u031d\u0312\3\2\2\2\u031d\u031c\3\2\2\2\u031em\3\2\2\2\u031f\u0324"+ - "\5l\67\2\u0320\u0321\7n\2\2\u0321\u0323\5l\67\2\u0322\u0320\3\2\2\2\u0323"+ - "\u0326\3\2\2\2\u0324\u0322\3\2\2\2\u0324\u0325\3\2\2\2\u0325o\3\2\2\2"+ - "\u0326\u0324\3\2\2\2\u0327\u032c\7i\2\2\u0328\u0329\7<\2\2\u0329\u032a"+ - "\5\u00e4s\2\u032a\u032b\5\u0170\u00b9\2\u032b\u032d\3\2\2\2\u032c\u0328"+ - "\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u032f\3\2\2\2\u032e\u0330\5\u00f0y"+ - "\2\u032f\u032e\3\2\2\2\u032f\u0330\3\2\2\2\u0330\u0331\3\2\2\2\u0331\u0332"+ - "\7j\2\2\u0332q\3\2\2\2\u0333\u0336\5\u0150\u00a9\2\u0334\u0336\7f\2\2"+ - "\u0335\u0333\3\2\2\2\u0335\u0334\3\2\2\2\u0336\u033f\3\2\2\2\u0337\u033c"+ - "\7i\2\2\u0338\u033a\5t;\2\u0339\u033b\7n\2\2\u033a\u0339\3\2\2\2\u033a"+ - "\u033b\3\2\2\2\u033b\u033d\3\2\2\2\u033c\u0338\3\2\2\2\u033c\u033d\3\2"+ - "\2\2\u033d\u033e\3\2\2\2\u033e\u0340\7j\2\2\u033f\u0337\3\2\2\2\u033f"+ - "\u0340\3\2\2\2\u0340s\3\2\2\2\u0341\u0346\5v<\2\u0342\u0343\7n\2\2\u0343"+ + "\2\u030b\u030c\7R\2\2\u030c\u030f\5l\67\2\u030d\u030f\7N\2\2\u030e\u030b"+ + "\3\2\2\2\u030e\u030d\3\2\2\2\u030fk\3\2\2\2\u0310\u0311\7\'\2\2\u0311"+ + "\u031e\7g\2\2\u0312\u0313\5\u00caf\2\u0313\u0318\7j\2\2\u0314\u0316\5"+ + "n8\2\u0315\u0317\7o\2\2\u0316\u0315\3\2\2\2\u0316\u0317\3\2\2\2\u0317"+ + "\u0319\3\2\2\2\u0318\u0314\3\2\2\2\u0318\u0319\3\2\2\2\u0319\u031a\3\2"+ + "\2\2\u031a\u031b\7k\2\2\u031b\u031e\3\2\2\2\u031c\u031e\5\u00a4S\2\u031d"+ + "\u0310\3\2\2\2\u031d\u0312\3\2\2\2\u031d\u031c\3\2\2\2\u031em\3\2\2\2"+ + "\u031f\u0324\5l\67\2\u0320\u0321\7o\2\2\u0321\u0323\5l\67\2\u0322\u0320"+ + "\3\2\2\2\u0323\u0326\3\2\2\2\u0324\u0322\3\2\2\2\u0324\u0325\3\2\2\2\u0325"+ + "o\3\2\2\2\u0326\u0324\3\2\2\2\u0327\u032c\7j\2\2\u0328\u0329\7=\2\2\u0329"+ + "\u032a\5\u00e4s\2\u032a\u032b\5\u0170\u00b9\2\u032b\u032d\3\2\2\2\u032c"+ + "\u0328\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u032f\3\2\2\2\u032e\u0330\5\u00f0"+ + "y\2\u032f\u032e\3\2\2\2\u032f\u0330\3\2\2\2\u0330\u0331\3\2\2\2\u0331"+ + "\u0332\7k\2\2\u0332q\3\2\2\2\u0333\u0336\5\u0150\u00a9\2\u0334\u0336\7"+ + "g\2\2\u0335\u0333\3\2\2\2\u0335\u0334\3\2\2\2\u0336\u033f\3\2\2\2\u0337"+ + "\u033c\7j\2\2\u0338\u033a\5t;\2\u0339\u033b\7o\2\2\u033a\u0339\3\2\2\2"+ + "\u033a\u033b\3\2\2\2\u033b\u033d\3\2\2\2\u033c\u0338\3\2\2\2\u033c\u033d"+ + "\3\2\2\2\u033d\u033e\3\2\2\2\u033e\u0340\7k\2\2\u033f\u0337\3\2\2\2\u033f"+ + "\u0340\3\2\2\2\u0340s\3\2\2\2\u0341\u0346\5v<\2\u0342\u0343\7o\2\2\u0343"+ "\u0345\5v<\2\u0344\u0342\3\2\2\2\u0345\u0348\3\2\2\2\u0346\u0344\3\2\2"+ "\2\u0346\u0347\3\2\2\2\u0347u\3\2\2\2\u0348\u0346\3\2\2\2\u0349\u034a"+ - "\7f\2\2\u034a\u034c\7p\2\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034c"+ - "\u034d\3\2\2\2\u034d\u034e\5\u00a4S\2\u034ew\3\2\2\2\u034f\u0350\7H\2"+ + "\7g\2\2\u034a\u034c\7q\2\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034c"+ + "\u034d\3\2\2\2\u034d\u034e\5\u00a4S\2\u034ew\3\2\2\2\u034f\u0350\7I\2"+ "\2\u0350\u0351\5\u00a4S\2\u0351\u0352\7\21\2\2\u0352\u0353\5r:\2\u0353"+ "\u0354\5\u00eex\2\u0354y\3\2\2\2\u0355\u0356\5\u00c2b\2\u0356\u0357\7"+ - "\21\2\2\u0357\u036a\5\u00c2b\2\u0358\u035e\7i\2\2\u0359\u035a\5\u0082"+ + "\21\2\2\u0357\u036a\5\u00c2b\2\u0358\u035e\7j\2\2\u0359\u035a\5\u0082"+ "B\2\u035a\u035b\5\u0170\u00b9\2\u035b\u035d\3\2\2\2\u035c\u0359\3\2\2"+ "\2\u035d\u0360\3\2\2\2\u035e\u035c\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0366"+ "\3\2\2\2\u0360\u035e\3\2\2\2\u0361\u0362\5|?\2\u0362\u0363\5\u0170\u00b9"+ "\2\u0363\u0365\3\2\2\2\u0364\u0361\3\2\2\2\u0365\u0368\3\2\2\2\u0366\u0364"+ "\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u0369\3\2\2\2\u0368\u0366\3\2\2\2\u0369"+ - "\u036b\7j\2\2\u036a\u0358\3\2\2\2\u036a\u036b\3\2\2\2\u036b{\3\2\2\2\u036c"+ + "\u036b\7k\2\2\u036a\u0358\3\2\2\2\u036a\u036b\3\2\2\2\u036b{\3\2\2\2\u036c"+ "\u036e\7\20\2\2\u036d\u036c\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u036f\3"+ - "\2\2\2\u036f\u0370\5~@\2\u0370\u0371\7f\2\2\u0371\u0373\5\u013e\u00a0"+ + "\2\2\2\u036f\u0370\5~@\2\u0370\u0371\7g\2\2\u0371\u0373\5\u013e\u00a0"+ "\2\u0372\u0374\5\u00eex\2\u0373\u0372\3\2\2\2\u0373\u0374\3\2\2\2\u0374"+ - "}\3\2\2\2\u0375\u0377\7g\2\2\u0376\u0378\7f\2\2\u0377\u0376\3\2\2\2\u0377"+ - "\u0378\3\2\2\2\u0378\u037a\3\2\2\2\u0379\u037b\7\u0088\2\2\u037a\u0379"+ + "}\3\2\2\2\u0375\u0377\7h\2\2\u0376\u0378\7g\2\2\u0377\u0376\3\2\2\2\u0377"+ + "\u0378\3\2\2\2\u0378\u037a\3\2\2\2\u0379\u037b\7\u0089\2\2\u037a\u0379"+ "\3\2\2\2\u037a\u037b\3\2\2\2\u037b\u037c\3\2\2\2\u037c\u037d\5\u012c\u0097"+ - "\2\u037d\u037e\7h\2\2\u037e\177\3\2\2\2\u037f\u0385\5\u00b4[\2\u0380\u0381"+ - "\5\u00c2b\2\u0381\u0382\7q\2\2\u0382\u0383\7f\2\2\u0383\u0385\3\2\2\2"+ + "\2\u037d\u037e\7i\2\2\u037e\177\3\2\2\2\u037f\u0385\5\u00b4[\2\u0380\u0381"+ + "\5\u00c2b\2\u0381\u0382\7r\2\2\u0382\u0383\7g\2\2\u0383\u0385\3\2\2\2"+ "\u0384\u037f\3\2\2\2\u0384\u0380\3\2\2\2\u0385\u0081\3\2\2\2\u0386\u0387"+ - "\79\2\2\u0387\u0388\7f\2\2\u0388\u038b\7t\2\2\u0389\u038c\5\u0080A\2\u038a"+ + "\7:\2\2\u0387\u0388\7g\2\2\u0388\u038b\7u\2\2\u0389\u038c\5\u0080A\2\u038a"+ "\u038c\5\u014e\u00a8\2\u038b\u0389\3\2\2\2\u038b\u038a\3\2\2\2\u038c\u0083"+ - "\3\2\2\2\u038d\u038e\7\60\2\2\u038e\u038f\7g\2\2\u038f\u0392\5\u00c2b"+ - "\2\u0390\u0391\7n\2\2\u0391\u0393\5\u00e6t\2\u0392\u0390\3\2\2\2\u0392"+ - "\u0393\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0395\7h\2\2\u0395\u0085\3\2"+ - "\2\2\u0396\u0397\7/\2\2\u0397\u0398\7g\2\2\u0398\u0399\5\u00c2b\2\u0399"+ - "\u039a\7h\2\2\u039a\u0087\3\2\2\2\u039b\u039e\5^\60\2\u039c\u039f\5\u008a"+ + "\3\2\2\2\u038d\u038e\7\61\2\2\u038e\u038f\7h\2\2\u038f\u0392\5\u00c2b"+ + "\2\u0390\u0391\7o\2\2\u0391\u0393\5\u00e6t\2\u0392\u0390\3\2\2\2\u0392"+ + "\u0393\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0395\7i\2\2\u0395\u0085\3\2"+ + "\2\2\u0396\u0397\7\60\2\2\u0397\u0398\7h\2\2\u0398\u0399\5\u00c2b\2\u0399"+ + "\u039a\7i\2\2\u039a\u0087\3\2\2\2\u039b\u039e\5^\60\2\u039c\u039f\5\u008a"+ "F\2\u039d\u039f\5\u008cG\2\u039e\u039c\3\2\2\2\u039e\u039d\3\2\2\2\u039f"+ - "\u0089\3\2\2\2\u03a0\u03a1\7N\2\2\u03a1\u03a2\7f\2\2\u03a2\u03a4\5\u013e"+ + "\u0089\3\2\2\2\u03a0\u03a1\7O\2\2\u03a1\u03a2\7g\2\2\u03a2\u03a4\5\u013e"+ "\u00a0\2\u03a3\u03a5\5p9\2\u03a4\u03a3\3\2\2\2\u03a4\u03a5\3\2\2\2\u03a5"+ - "\u008b\3\2\2\2\u03a6\u03a7\7N\2\2\u03a7\u03a8\5\u009aN\2\u03a8\u03a9\7"+ - "f\2\2\u03a9\u03ab\5\u013e\u00a0\2\u03aa\u03ac\5p9\2\u03ab\u03aa\3\2\2"+ - "\2\u03ab\u03ac\3\2\2\2\u03ac\u008d\3\2\2\2\u03ad\u03b0\7\34\2\2\u03ae"+ + "\u008b\3\2\2\2\u03a6\u03a7\7O\2\2\u03a7\u03a8\5\u009aN\2\u03a8\u03a9\7"+ + "g\2\2\u03a9\u03ab\5\u013e\u00a0\2\u03aa\u03ac\5p9\2\u03ab\u03aa\3\2\2"+ + "\2\u03ab\u03ac\3\2\2\2\u03ac\u008d\3\2\2\2\u03ad\u03b0\7\35\2\2\u03ae"+ "\u03b1\5\u0088E\2\u03af\u03b1\5\u00dep\2\u03b0\u03ae\3\2\2\2\u03b0\u03af"+ - "\3\2\2\2\u03b1\u008f\3\2\2\2\u03b2\u03b3\79\2\2\u03b3\u03b4\7f\2\2\u03b4"+ + "\3\2\2\2\u03b1\u008f\3\2\2\2\u03b2\u03b3\7:\2\2\u03b3\u03b4\7g\2\2\u03b4"+ "\u03b6\5\u0142\u00a2\2\u03b5\u03b7\5\u0092J\2\u03b6\u03b5\3\2\2\2\u03b6"+ - "\u03b7\3\2\2\2\u03b7\u0091\3\2\2\2\u03b8\u03b9\7i\2\2\u03b9\u03ba\5\u00a4"+ - "S\2\u03ba\u03bb\5\u0170\u00b9\2\u03bb\u03bc\7j\2\2\u03bc\u0093\3\2\2\2"+ - "\u03bd\u03be\79\2\2\u03be\u03bf\5\u009aN\2\u03bf\u03c0\7f\2\2\u03c0\u03c2"+ + "\u03b7\3\2\2\2\u03b7\u0091\3\2\2\2\u03b8\u03b9\7j\2\2\u03b9\u03ba\5\u00a4"+ + "S\2\u03ba\u03bb\5\u0170\u00b9\2\u03bb\u03bc\7k\2\2\u03bc\u0093\3\2\2\2"+ + "\u03bd\u03be\7:\2\2\u03be\u03bf\5\u009aN\2\u03bf\u03c0\7g\2\2\u03c0\u03c2"+ "\5\u0142\u00a2\2\u03c1\u03c3\5\u0092J\2\u03c2\u03c1\3\2\2\2\u03c2\u03c3"+ "\3\2\2\2\u03c3\u0095\3\2\2\2\u03c4\u03cc\5\b\5\2\u03c5\u03c8\5\u00c2b"+ - "\2\u03c6\u03c7\7m\2\2\u03c7\u03c9\5\u00e6t\2\u03c8\u03c6\3\2\2\2\u03c8"+ - "\u03c9\3\2\2\2\u03c9\u03cd\3\2\2\2\u03ca\u03cb\7m\2\2\u03cb\u03cd\5\u00e6"+ + "\2\u03c6\u03c7\7n\2\2\u03c7\u03c9\5\u00e6t\2\u03c8\u03c6\3\2\2\2\u03c8"+ + "\u03c9\3\2\2\2\u03c9\u03cd\3\2\2\2\u03ca\u03cb\7n\2\2\u03cb\u03cd\5\u00e6"+ "t\2\u03cc\u03c5\3\2\2\2\u03cc\u03ca\3\2\2\2\u03cd\u0097\3\2\2\2\u03ce"+ - "\u03cf\5\b\5\2\u03cf\u03d0\7t\2\2\u03d0\u03d1\5\u00e6t\2\u03d1\u0099\3"+ - "\2\2\2\u03d2\u03d4\7g\2\2\u03d3\u03d5\5\n\6\2\u03d4\u03d3\3\2\2\2\u03d4"+ + "\u03cf\5\b\5\2\u03cf\u03d0\7u\2\2\u03d0\u03d1\5\u00e6t\2\u03d1\u0099\3"+ + "\2\2\2\u03d2\u03d4\7h\2\2\u03d3\u03d5\5\n\6\2\u03d4\u03d3\3\2\2\2\u03d4"+ "\u03d5\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u03d8\5\u00c2b\2\u03d7\u03d9"+ - "\7n\2\2\u03d8\u03d7\3\2\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03da\3\2\2\2\u03da"+ - "\u03db\7h\2\2\u03db\u009b\3\2\2\2\u03dc\u03df\5\u009eP\2\u03dd\u03df\5"+ + "\7o\2\2\u03d8\u03d7\3\2\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03da\3\2\2\2\u03da"+ + "\u03db\7i\2\2\u03db\u009b\3\2\2\2\u03dc\u03df\5\u009eP\2\u03dd\u03df\5"+ "\u00a0Q\2\u03de\u03dc\3\2\2\2\u03de\u03dd\3\2\2\2\u03df\u009d\3\2\2\2"+ "\u03e0\u03e2\5\u00e4s\2\u03e1\u03e0\3\2\2\2\u03e1\u03e2\3\2\2\2\u03e2"+ "\u03e3\3\2\2\2\u03e3\u03e4\5\u00a2R\2\u03e4\u009f\3\2\2\2\u03e5\u03e7"+ - "\7\34\2\2\u03e6\u03e8\5\u00e4s\2\u03e7\u03e6\3\2\2\2\u03e7\u03e8\3\2\2"+ + "\7\35\2\2\u03e6\u03e8\5\u00e4s\2\u03e7\u03e6\3\2\2\2\u03e7\u03e8\3\2\2"+ "\2\u03e8\u03e9\3\2\2\2\u03e9\u03ea\5\u00a2R\2\u03ea\u00a1\3\2\2\2\u03eb"+ - "\u03ed\7u\2\2\u03ec\u03eb\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u03ee\3\2"+ + "\u03ed\7v\2\2\u03ec\u03eb\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u03ee\3\2"+ "\2\2\u03ee\u03ef\5\u00c2b\2\u03ef\u00a3\3\2\2\2\u03f0\u03f1\bS\1\2\u03f1"+ - "\u03f2\t\b\2\2\u03f2\u0401\5\u00a4S\20\u03f3\u0401\5\u00b4[\2\u03f4\u03f5"+ - "\7\33\2\2\u03f5\u03f6\5.\30\2\u03f6\u03f7\7\35\2\2\u03f7\u03f8\5\u00a4"+ - "S\4\u03f8\u0401\3\2\2\2\u03f9\u03fa\t\t\2\2\u03fa\u03fb\5&\24\2\u03fb"+ - "\u03fc\7p\2\2\u03fc\u03fd\7p\2\2\u03fd\u03fe\5*\26\2\u03fe\u03ff\5\u00a4"+ - "S\3\u03ff\u0401\3\2\2\2\u0400\u03f0\3\2\2\2\u0400\u03f3\3\2\2\2\u0400"+ - "\u03f4\3\2\2\2\u0400\u03f9\3\2\2\2\u0401\u0425\3\2\2\2\u0402\u0403\f\16"+ - "\2\2\u0403\u0404\t\n\2\2\u0404\u0424\5\u00a4S\17\u0405\u0406\f\r\2\2\u0406"+ - "\u0407\t\13\2\2\u0407\u0424\5\u00a4S\16\u0408\u0409\f\f\2\2\u0409\u040a"+ - "\t\f\2\2\u040a\u0424\5\u00a4S\r\u040b\u040c\f\13\2\2\u040c\u040d\t\r\2"+ - "\2\u040d\u0424\5\u00a4S\f\u040e\u040f\f\n\2\2\u040f\u0410\t\16\2\2\u0410"+ - "\u0424\5\u00a4S\13\u0411\u0412\f\b\2\2\u0412\u0413\7w\2\2\u0413\u0424"+ - "\5\u00a4S\t\u0414\u0415\f\7\2\2\u0415\u0416\7v\2\2\u0416\u0424\5\u00a4"+ - "S\b\u0417\u0418\f\6\2\2\u0418\u0419\7#\2\2\u0419\u0424\5\u00a4S\6\u041a"+ - "\u041b\f\5\2\2\u041b\u041c\7&\2\2\u041c\u041d\5\u00a4S\2\u041d\u041e\7"+ - "p\2\2\u041e\u041f\5\u00a4S\5\u041f\u0424\3\2\2\2\u0420\u0421\f\t\2\2\u0421"+ - "\u0422\7\21\2\2\u0422\u0424\5r:\2\u0423\u0402\3\2\2\2\u0423\u0405\3\2"+ - "\2\2\u0423\u0408\3\2\2\2\u0423\u040b\3\2\2\2\u0423\u040e\3\2\2\2\u0423"+ - "\u0411\3\2\2\2\u0423\u0414\3\2\2\2\u0423\u0417\3\2\2\2\u0423\u041a\3\2"+ - "\2\2\u0423\u0420\3\2\2\2\u0424\u0427\3\2\2\2\u0425\u0423\3\2\2\2\u0425"+ - "\u0426\3\2\2\2\u0426\u00a5\3\2\2\2\u0427\u0425\3\2\2\2\u0428\u043d\5\30"+ - "\r\2\u0429\u043d\5\32\16\2\u042a\u043d\5\u00aaV\2\u042b\u043d\5\u00a8"+ - "U\2\u042c\u043d\5\u00dep\2\u042d\u043d\5\u00fe\u0080\2\u042e\u043d\5\u00f2"+ - "z\2\u042f\u043d\5\u012a\u0096\2\u0430\u043d\5\u0100\u0081\2\u0431\u043d"+ - "\5\u0102\u0082\2\u0432\u043d\5\u0104\u0083\2\u0433\u043d\5\u0106\u0084"+ - "\2\u0434\u043d\5\u0108\u0085\2\u0435\u043d\5\u00eex\2\u0436\u043d\5\u010a"+ - "\u0086\2\u0437\u043d\5\u010c\u0087\2\u0438\u043d\5\u011e\u0090\2\u0439"+ - "\u043d\5\u00acW\2\u043a\u043d\5\u00b0Y\2\u043b\u043d\5x=\2\u043c\u0428"+ - "\3\2\2\2\u043c\u0429\3\2\2\2\u043c\u042a\3\2\2\2\u043c\u042b\3\2\2\2\u043c"+ - "\u042c\3\2\2\2\u043c\u042d\3\2\2\2\u043c\u042e\3\2\2\2\u043c\u042f\3\2"+ - "\2\2\u043c\u0430\3\2\2\2\u043c\u0431\3\2\2\2\u043c\u0432\3\2\2\2\u043c"+ - "\u0433\3\2\2\2\u043c\u0434\3\2\2\2\u043c\u0435\3\2\2\2\u043c\u0436\3\2"+ - "\2\2\u043c\u0437\3\2\2\2\u043c\u0438\3\2\2\2\u043c\u0439\3\2\2\2\u043c"+ - "\u043a\3\2\2\2\u043c\u043b\3\2\2\2\u043d\u00a7\3\2\2\2\u043e\u043f\7%"+ - "\2\2\u043f\u0440\5\u00a4S\2\u0440\u00a9\3\2\2\2\u0441\u0442\7Y\2\2\u0442"+ - "\u0444\5\u00a4S\2\u0443\u0445\5\u00eex\2\u0444\u0443\3\2\2\2\u0444\u0445"+ - "\3\2\2\2\u0445\u00ab\3\2\2\2\u0446\u0447\5\u00aeX\2\u0447\u0448\5\u0126"+ - "\u0094\2\u0448\u00ad\3\2\2\2\u0449\u044a\7\16\2\2\u044a\u044b\5\u00a4"+ - "S\2\u044b\u044c\5\u0170\u00b9\2\u044c\u044e\3\2\2\2\u044d\u0449\3\2\2"+ - "\2\u044e\u0451\3\2\2\2\u044f\u044d\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u0456"+ - "\3\2\2\2\u0451\u044f\3\2\2\2\u0452\u0453\7\17\2\2\u0453\u0454\5b\62\2"+ - "\u0454\u0455\5\u0170\u00b9\2\u0455\u0457\3\2\2\2\u0456\u0452\3\2\2\2\u0456"+ - "\u0457\3\2\2\2\u0457\u00af\3\2\2\2\u0458\u0459\7R\2\2\u0459\u045e\5\u00a4"+ - "S\2\u045a\u045b\7R\2\2\u045b\u045c\t\3\2\2\u045c\u045e\5.\30\2\u045d\u0458"+ - "\3\2\2\2\u045d\u045a\3\2\2\2\u045e\u00b1\3\2\2\2\u045f\u0468\7\5\2\2\u0460"+ - "\u0468\7\6\2\2\u0461\u0468\7e\2\2\u0462\u0468\5\u014c\u00a7\2\u0463\u0468"+ - "\5\u0162\u00b2\2\u0464\u0468\7\3\2\2\u0465\u0468\7\u0090\2\2\u0466\u0468"+ - "\7\u0091\2\2\u0467\u045f\3\2\2\2\u0467\u0460\3\2\2\2\u0467\u0461\3\2\2"+ - "\2\u0467\u0462\3\2\2\2\u0467\u0463\3\2\2\2\u0467\u0464\3\2\2\2\u0467\u0465"+ - "\3\2\2\2\u0467\u0466\3\2\2\2\u0468\u00b3\3\2\2\2\u0469\u046a\b[\1\2\u046a"+ - "\u0476\5\u0148\u00a5\2\u046b\u0476\5\u0144\u00a3\2\u046c\u0476\5\u016c"+ - "\u00b7\2\u046d\u0476\5 \21\2\u046e\u0476\5\u0086D\2\u046f\u0476\5\u0084"+ - "C\2\u0470\u0471\t\17\2\2\u0471\u0472\7g\2\2\u0472\u0473\5\u00a4S\2\u0473"+ - "\u0474\7h\2\2\u0474\u0476\3\2\2\2\u0475\u0469\3\2\2\2\u0475\u046b\3\2"+ - "\2\2\u0475\u046c\3\2\2\2\u0475\u046d\3\2\2\2\u0475\u046e\3\2\2\2\u0475"+ - "\u046f\3\2\2\2\u0475\u0470\3\2\2\2\u0476\u048d\3\2\2\2\u0477\u0478\f\13"+ - "\2\2\u0478\u0479\7q\2\2\u0479\u048c\7f\2\2\u047a\u047b\f\n\2\2\u047b\u048c"+ - "\5\u0166\u00b4\2\u047c\u047d\f\t\2\2\u047d\u048c\5\u00ceh\2\u047e\u047f"+ - "\f\b\2\2\u047f\u048c\5L\'\2\u0480\u0481\f\7\2\2\u0481\u048c\5\u0168\u00b5"+ - "\2\u0482\u0483\f\6\2\2\u0483\u048c\5\u016a\u00b6\2\u0484\u0485\f\5\2\2"+ - "\u0485\u0486\5\u016a\u00b6\2\u0486\u0487\7\22\2\2\u0487\u0488\5r:\2\u0488"+ - "\u048c\3\2\2\2\u0489\u048a\f\4\2\2\u048a\u048c\5\u00ba^\2\u048b\u0477"+ - "\3\2\2\2\u048b\u047a\3\2\2\2\u048b\u047c\3\2\2\2\u048b\u047e\3\2\2\2\u048b"+ - "\u0480\3\2\2\2\u048b\u0482\3\2\2\2\u048b\u0484\3\2\2\2\u048b\u0489\3\2"+ - "\2\2\u048c\u048f\3\2\2\2\u048d\u048b\3\2\2\2\u048d\u048e\3\2\2\2\u048e"+ - "\u00b5\3\2\2\2\u048f\u048d\3\2\2\2\u0490\u0491\5^\60\2\u0491\u0492\5\u00b8"+ - "]\2\u0492\u00b7\3\2\2\2\u0493\u0495\7N\2\2\u0494\u0496\7f\2\2\u0495\u0494"+ - "\3\2\2\2\u0495\u0496\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0499\5\u013e\u00a0"+ - "\2\u0498\u049a\5p9\2\u0499\u0498\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u00b9"+ - "\3\2\2\2\u049b\u049d\7\'\2\2\u049c\u049e\5\u00e6t\2\u049d\u049c\3\2\2"+ - "\2\u049d\u049e\3\2\2\2\u049e\u04a0\3\2\2\2\u049f\u04a1\7n\2\2\u04a0\u049f"+ - "\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\3\2\2\2\u04a2\u04a3\7(\2\2\u04a3"+ - "\u00bb\3\2\2\2\u04a4\u04a5\7O\2\2\u04a5\u04af\7i\2\2\u04a6\u04aa\5\u00c0"+ - "a\2\u04a7\u04aa\5\u012c\u0097\2\u04a8\u04aa\5\u00be`\2\u04a9\u04a6\3\2"+ - "\2\2\u04a9\u04a7\3\2\2\2\u04a9\u04a8\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab"+ - "\u04ac\5\u0170\u00b9\2\u04ac\u04ae\3\2\2\2\u04ad\u04a9\3\2\2\2\u04ae\u04b1"+ - "\3\2\2\2\u04af\u04ad\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0\u04b2\3\2\2\2\u04b1"+ - "\u04af\3\2\2\2\u04b2\u04b3\7j\2\2\u04b3\u00bd\3\2\2\2\u04b4\u04b5\79\2"+ - "\2\u04b5\u04b6\7f\2\2\u04b6\u04b7\5\u0142\u00a2\2\u04b7\u00bf\3\2\2\2"+ - "\u04b8\u04ba\7\34\2\2\u04b9\u04b8\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bb"+ - "\3\2\2\2\u04bb\u04bc\5^\60\2\u04bc\u04bd\7f\2\2\u04bd\u04be\5\u0142\u00a2"+ - "\2\u04be\u04bf\5\u0140\u00a1\2\u04bf\u04c8\3\2\2\2\u04c0\u04c2\7\34\2"+ - "\2\u04c1\u04c0\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04c3\3\2\2\2\u04c3\u04c4"+ - "\5^\60\2\u04c4\u04c5\7f\2\2\u04c5\u04c6\5\u0142\u00a2\2\u04c6\u04c8\3"+ - "\2\2\2\u04c7\u04b9\3\2\2\2\u04c7\u04c1\3\2\2\2\u04c8\u00c1\3\2\2\2\u04c9"+ - "\u04d1\5\u012c\u0097\2\u04ca\u04d1\5\u00c4c\2\u04cb\u04d1\5P)\2\u04cc"+ - "\u04cd\7g\2\2\u04cd\u04ce\5\u00c2b\2\u04ce\u04cf\7h\2\2\u04cf\u04d1\3"+ - "\2\2\2\u04d0\u04c9\3\2\2\2\u04d0\u04ca\3\2\2\2\u04d0\u04cb\3\2\2\2\u04d0"+ - "\u04cc\3\2\2\2\u04d1\u00c3\3\2\2\2\u04d2\u04dc\5\u012e\u0098\2\u04d3\u04dc"+ - "\5\u015e\u00b0\2\u04d4\u04dc\5\u0134\u009b\2\u04d5\u04dc\5\u013c\u009f"+ - "\2\u04d6\u04dc\5\u00bc_\2\u04d7\u04dc\5\u0136\u009c\2\u04d8\u04dc\5\u0138"+ - "\u009d\2\u04d9\u04dc\5\u013a\u009e\2\u04da\u04dc\5\u00c6d\2\u04db\u04d2"+ - "\3\2\2\2\u04db\u04d3\3\2\2\2\u04db\u04d4\3\2\2\2\u04db\u04d5\3\2\2\2\u04db"+ - "\u04d6\3\2\2\2\u04db\u04d7\3\2\2\2\u04db\u04d8\3\2\2\2\u04db\u04d9\3\2"+ - "\2\2\u04db\u04da\3\2\2\2\u04dc\u00c5\3\2\2\2\u04dd\u04de\79\2\2\u04de"+ - "\u04df\5\u00c8e\2\u04df\u00c7\3\2\2\2\u04e0\u04ec\7g\2\2\u04e1\u04e6\5"+ - "\u00c2b\2\u04e2\u04e3\7n\2\2\u04e3\u04e5\5\u00c2b\2\u04e4\u04e2\3\2\2"+ - "\2\u04e5\u04e8\3\2\2\2\u04e6\u04e4\3\2\2\2\u04e6\u04e7\3\2\2\2\u04e7\u04ea"+ - "\3\2\2\2\u04e8\u04e6\3\2\2\2\u04e9\u04eb\7n\2\2\u04ea\u04e9\3\2\2\2\u04ea"+ - "\u04eb\3\2\2\2\u04eb\u04ed\3\2\2\2\u04ec\u04e1\3\2\2\2\u04ec\u04ed\3\2"+ - "\2\2\u04ed\u04ee\3\2\2\2\u04ee\u04ef\7h\2\2\u04ef\u00c9\3\2\2\2\u04f0"+ - "\u04f8\5\u015e\u00b0\2\u04f1\u04f8\5\u012e\u0098\2\u04f2\u04f8\5\u00cc"+ - "g\2\u04f3\u04f8\5\u0136\u009c\2\u04f4\u04f8\5\u0138\u009d\2\u04f5\u04f8"+ - "\5P)\2\u04f6\u04f8\5\u012c\u0097\2\u04f7\u04f0\3\2\2\2\u04f7\u04f1\3\2"+ - "\2\2\u04f7\u04f2\3\2\2\2\u04f7\u04f3\3\2\2\2\u04f7\u04f4\3\2\2\2\u04f7"+ - "\u04f5\3\2\2\2\u04f7\u04f6\3\2\2\2\u04f8\u00cb\3\2\2\2\u04f9\u04fa\7k"+ - "\2\2\u04fa\u04fb\7u\2\2\u04fb\u04fc\7l\2\2\u04fc\u04fd\5\u0132\u009a\2"+ - "\u04fd\u00cd\3\2\2\2\u04fe\u050e\7k\2\2\u04ff\u0501\5\u00d0i\2\u0500\u04ff"+ - "\3\2\2\2\u0500\u0501\3\2\2\2\u0501\u0502\3\2\2\2\u0502\u0504\7p\2\2\u0503"+ - "\u0505\5\u00d2j\2\u0504\u0503\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u050f"+ - "\3\2\2\2\u0506\u0508\5\u00d0i\2\u0507\u0506\3\2\2\2\u0507\u0508\3\2\2"+ - "\2\u0508\u0509\3\2\2\2\u0509\u050a\7p\2\2\u050a\u050b\5\u00d2j\2\u050b"+ - "\u050c\7p\2\2\u050c\u050d\5\u00d4k\2\u050d\u050f\3\2\2\2\u050e\u0500\3"+ - "\2\2\2\u050e\u0507\3\2\2\2\u050f\u0510\3\2\2\2\u0510\u0511\7l\2\2\u0511"+ - "\u00cf\3\2\2\2\u0512\u0513\5\u00a4S\2\u0513\u00d1\3\2\2\2\u0514\u0515"+ - "\5\u00a4S\2\u0515\u00d3\3\2\2\2\u0516\u0517\5\u00a4S\2\u0517\u00d5\3\2"+ - "\2\2\u0518\u051a\t\20\2\2\u0519\u0518\3\2\2\2\u0519\u051a\3\2\2\2\u051a"+ - "\u051b\3\2\2\2\u051b\u051c\7m\2\2\u051c\u00d7\3\2\2\2\u051d\u051e\5\u00e6"+ - "t\2\u051e\u051f\7m\2\2\u051f\u0524\3\2\2\2\u0520\u0521\5\b\5\2\u0521\u0522"+ - "\7t\2\2\u0522\u0524\3\2\2\2\u0523\u051d\3\2\2\2\u0523\u0520\3\2\2\2\u0523"+ - "\u0524\3\2\2\2\u0524\u0525\3\2\2\2\u0525\u0526\7^\2\2\u0526\u052b\5\u00a4"+ - "S\2\u0527\u0529\7K\2\2\u0528\u052a\7f\2\2\u0529\u0528\3\2\2\2\u0529\u052a"+ - "\3\2\2\2\u052a\u052c\3\2\2\2\u052b\u0527\3\2\2\2\u052b\u052c\3\2\2\2\u052c"+ - "\u00d9\3\2\2\2\u052d\u052e\7Y\2\2\u052e\u052f\7f\2\2\u052f\u00db\3\2\2"+ - "\2\u0530\u0531\5\u0162\u00b2\2\u0531\u00dd\3\2\2\2\u0532\u0536\5\u00e0"+ - "q\2\u0533\u0536\5\u00e8u\2\u0534\u0536\5\u00ecw\2\u0535\u0532\3\2\2\2"+ - "\u0535\u0533\3\2\2\2\u0535\u0534\3\2\2\2\u0536\u00df\3\2\2\2\u0537\u0543"+ - "\7[\2\2\u0538\u0544\5\u00e2r\2\u0539\u053f\7g\2\2\u053a\u053b\5\u00e2"+ - "r\2\u053b\u053c\5\u0170\u00b9\2\u053c\u053e\3\2\2\2\u053d\u053a\3\2\2"+ - "\2\u053e\u0541\3\2\2\2\u053f\u053d\3\2\2\2\u053f\u0540\3\2\2\2\u0540\u0542"+ - "\3\2\2\2\u0541\u053f\3\2\2\2\u0542\u0544\7h\2\2\u0543\u0538\3\2\2\2\u0543"+ - "\u0539\3\2\2\2\u0544\u00e1\3\2\2\2\u0545\u054b\5\u00e4s\2\u0546\u0548"+ - "\5\u00c2b\2\u0547\u0546\3\2\2\2\u0547\u0548\3\2\2\2\u0548\u0549\3\2\2"+ - "\2\u0549\u054a\7m\2\2\u054a\u054c\5\u00e6t\2\u054b\u0547\3\2\2\2\u054b"+ - "\u054c\3\2\2\2\u054c\u00e3\3\2\2\2\u054d\u0552\7f\2\2\u054e\u054f\7n\2"+ - "\2\u054f\u0551\7f\2\2\u0550\u054e\3\2\2\2\u0551\u0554\3\2\2\2\u0552\u0550"+ - "\3\2\2\2\u0552\u0553\3\2\2\2\u0553\u00e5\3\2\2\2\u0554\u0552\3\2\2\2\u0555"+ - "\u055a\5\u00a4S\2\u0556\u0557\7n\2\2\u0557\u0559\5\u00a4S\2\u0558\u0556"+ - "\3\2\2\2\u0559\u055c\3\2\2\2\u055a\u0558\3\2\2\2\u055a\u055b\3\2\2\2\u055b"+ - "\u00e7\3\2\2\2\u055c\u055a\3\2\2\2\u055d\u0569\7_\2\2\u055e\u056a\5\u00ea"+ - "v\2\u055f\u0565\7g\2\2\u0560\u0561\5\u00eav\2\u0561\u0562\5\u0170\u00b9"+ - "\2\u0562\u0564\3\2\2\2\u0563\u0560\3\2\2\2\u0564\u0567\3\2\2\2\u0565\u0563"+ - "\3\2\2\2\u0565\u0566\3\2\2\2\u0566\u0568\3\2\2\2\u0567\u0565\3\2\2\2\u0568"+ - "\u056a\7h\2\2\u0569\u055e\3\2\2\2\u0569\u055f\3\2\2\2\u056a\u00e9\3\2"+ - "\2\2\u056b\u056d\7f\2\2\u056c\u056e\7m\2\2\u056d\u056c\3\2\2\2\u056d\u056e"+ - "\3\2\2\2\u056e\u056f\3\2\2\2\u056f\u0570\5\u00c2b\2\u0570\u00eb\3\2\2"+ - "\2\u0571\u057d\7d\2\2\u0572\u057e\5\u0096L\2\u0573\u0579\7g\2\2\u0574"+ - "\u0575\5\u0096L\2\u0575\u0576\5\u0170\u00b9\2\u0576\u0578\3\2\2\2\u0577"+ - "\u0574\3\2\2\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2"+ - "\2\2\u057a\u057c\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057e\7h\2\2\u057d"+ - "\u0572\3\2\2\2\u057d\u0573\3\2\2\2\u057e\u00ed\3\2\2\2\u057f\u0581\7i"+ - "\2\2\u0580\u0582\5\u00f0y\2\u0581\u0580\3\2\2\2\u0581\u0582\3\2\2\2\u0582"+ - "\u0583\3\2\2\2\u0583\u0584\7j\2\2\u0584\u00ef\3\2\2\2\u0585\u0587\5\u0170"+ - "\u00b9\2\u0586\u0585\3\2\2\2\u0586\u0587\3\2\2\2\u0587\u0588\3\2\2\2\u0588"+ - "\u0589\5\u00a6T\2\u0589\u058a\5\u0170\u00b9\2\u058a\u058c\3\2\2\2\u058b"+ - "\u0586\3\2\2\2\u058c\u058d\3\2\2\2\u058d\u058b\3\2\2\2\u058d\u058e\3\2"+ - "\2\2\u058e\u00f1\3\2\2\2\u058f\u0595\5\u00f6|\2\u0590\u0595\5\u00f8}\2"+ - "\u0591\u0595\5\u00fa~\2\u0592\u0595\5\u00f4{\2\u0593\u0595\5\u0098M\2"+ - "\u0594\u058f\3\2\2\2\u0594\u0590\3\2\2\2\u0594\u0591\3\2\2\2\u0594\u0592"+ - "\3\2\2\2\u0594\u0593\3\2\2\2\u0595\u00f3\3\2\2\2\u0596\u0597\5\u00a4S"+ - "\2\u0597\u00f5\3\2\2\2\u0598\u0599\5\u00a4S\2\u0599\u059a\7\u008a\2\2"+ - "\u059a\u059b\5\u00a4S\2\u059b\u00f7\3\2\2\2\u059c\u059d\5\u00a4S\2\u059d"+ - "\u059e\t\21\2\2\u059e\u00f9\3\2\2\2\u059f\u05a0\5\u00e6t\2\u05a0\u05a1"+ - "\5\u00d6l\2\u05a1\u05a2\5\u00e6t\2\u05a2\u00fb\3\2\2\2\u05a3\u05a4\t\22"+ - "\2\2\u05a4\u00fd\3\2\2\2\u05a5\u05a6\7f\2\2\u05a6\u05a8\7p\2\2\u05a7\u05a9"+ - "\5\u00a6T\2\u05a8\u05a7\3\2\2\2\u05a8\u05a9\3\2\2\2\u05a9\u00ff\3\2\2"+ - "\2\u05aa\u05ac\7c\2\2\u05ab\u05ad\5\u00e6t\2\u05ac\u05ab\3\2\2\2\u05ac"+ - "\u05ad\3\2\2\2\u05ad\u0101\3\2\2\2\u05ae\u05b0\7L\2\2\u05af\u05b1\7f\2"+ - "\2\u05b0\u05af\3\2\2\2\u05b0\u05b1\3\2\2\2\u05b1\u0103\3\2\2\2\u05b2\u05b4"+ - "\7`\2\2\u05b3\u05b5\7f\2\2\u05b4\u05b3\3\2\2\2\u05b4\u05b5\3\2\2\2\u05b5"+ - "\u0105\3\2\2\2\u05b6\u05b7\7X\2\2\u05b7\u05b8\7f\2\2\u05b8\u0107\3\2\2"+ - "\2\u05b9\u05ba\7\\\2\2\u05ba\u0109\3\2\2\2\u05bb\u05c4\7]\2\2\u05bc\u05c5"+ - "\5\u00a4S\2\u05bd\u05be\5\u0170\u00b9\2\u05be\u05bf\5\u00a4S\2\u05bf\u05c5"+ - "\3\2\2\2\u05c0\u05c1\5\u00f2z\2\u05c1\u05c2\5\u0170\u00b9\2\u05c2\u05c3"+ - "\5\u00a4S\2\u05c3\u05c5\3\2\2\2\u05c4\u05bc\3\2\2\2\u05c4\u05bd\3\2\2"+ - "\2\u05c4\u05c0\3\2\2\2\u05c5\u05c6\3\2\2\2\u05c6\u05cc\5\u00eex\2\u05c7"+ - "\u05ca\7W\2\2\u05c8\u05cb\5\u010a\u0086\2\u05c9\u05cb\5\u00eex\2\u05ca"+ - "\u05c8\3\2\2\2\u05ca\u05c9\3\2\2\2\u05cb\u05cd\3\2\2\2\u05cc\u05c7\3\2"+ - "\2\2\u05cc\u05cd\3\2\2\2\u05cd\u010b\3\2\2\2\u05ce\u05d1\5\u010e\u0088"+ - "\2\u05cf\u05d1\5\u0114\u008b\2\u05d0\u05ce\3\2\2\2\u05d0\u05cf\3\2\2\2"+ - "\u05d1\u010d\3\2\2\2\u05d2\u05dd\7Z\2\2\u05d3\u05d5\5\u00a4S\2\u05d4\u05d3"+ - "\3\2\2\2\u05d4\u05d5\3\2\2\2\u05d5\u05de\3\2\2\2\u05d6\u05d8\5\u00f2z"+ - "\2\u05d7\u05d6\3\2\2\2\u05d7\u05d8\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05db"+ - "\5\u0170\u00b9\2\u05da\u05dc\5\u00a4S\2\u05db\u05da\3\2\2\2\u05db\u05dc"+ - "\3\2\2\2\u05dc\u05de\3\2\2\2\u05dd\u05d4\3\2\2\2\u05dd\u05d7\3\2\2\2\u05de"+ - "\u05df\3\2\2\2\u05df\u05e3\7i\2\2\u05e0\u05e2\5\u0110\u0089\2\u05e1\u05e0"+ - "\3\2\2\2\u05e2\u05e5\3\2\2\2\u05e3\u05e1\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4"+ - "\u05e6\3\2\2\2\u05e5\u05e3\3\2\2\2\u05e6\u05e7\7j\2\2\u05e7\u010f\3\2"+ - "\2\2\u05e8\u05e9\5\u0112\u008a\2\u05e9\u05eb\7p\2\2\u05ea\u05ec\5\u00f0"+ - "y\2\u05eb\u05ea\3\2\2\2\u05eb\u05ec\3\2\2\2\u05ec\u0111\3\2\2\2\u05ed"+ - "\u05ee\7Q\2\2\u05ee\u05f1\5\u00e6t\2\u05ef\u05f1\7M\2\2\u05f0\u05ed\3"+ - "\2\2\2\u05f0\u05ef\3\2\2\2\u05f1\u0113\3\2\2\2\u05f2\u05fb\7Z\2\2\u05f3"+ - "\u05fc\5\u0116\u008c\2\u05f4\u05f5\5\u0170\u00b9\2\u05f5\u05f6\5\u0116"+ - "\u008c\2\u05f6\u05fc\3\2\2\2\u05f7\u05f8\5\u00f2z\2\u05f8\u05f9\5\u0170"+ - "\u00b9\2\u05f9\u05fa\5\u0116\u008c\2\u05fa\u05fc\3\2\2\2\u05fb\u05f3\3"+ - "\2\2\2\u05fb\u05f4\3\2\2\2\u05fb\u05f7\3\2\2\2\u05fc\u05fd\3\2\2\2\u05fd"+ - "\u0601\7i\2\2\u05fe\u0600\5\u0118\u008d\2\u05ff\u05fe\3\2\2\2\u0600\u0603"+ - "\3\2\2\2\u0601\u05ff\3\2\2\2\u0601\u0602\3\2\2\2\u0602\u0604\3\2\2\2\u0603"+ - "\u0601\3\2\2\2\u0604\u0605\7j\2\2\u0605\u0115\3\2\2\2\u0606\u0607\7f\2"+ - "\2\u0607\u0609\7t\2\2\u0608\u0606\3\2\2\2\u0608\u0609\3\2\2\2\u0609\u060a"+ - "\3\2\2\2\u060a\u060b\5\u00b4[\2\u060b\u060c\7q\2\2\u060c\u060d\7g\2\2"+ - "\u060d\u060e\7_\2\2\u060e\u060f\7h\2\2\u060f\u0117\3\2\2\2\u0610\u0611"+ - "\5\u011a\u008e\2\u0611\u0613\7p\2\2\u0612\u0614\5\u00f0y\2\u0613\u0612"+ - "\3\2\2\2\u0613\u0614\3\2\2\2\u0614\u0119\3\2\2\2\u0615\u0616\7Q\2\2\u0616"+ - "\u0619\5\u011c\u008f\2\u0617\u0619\7M\2\2\u0618\u0615\3\2\2\2\u0618\u0617"+ - "\3\2\2\2\u0619\u011b\3\2\2\2\u061a\u061d\5\u00c2b\2\u061b\u061d\7e\2\2"+ - "\u061c\u061a\3\2\2\2\u061c\u061b\3\2\2\2\u061d\u0625\3\2\2\2\u061e\u0621"+ - "\7n\2\2\u061f\u0622\5\u00c2b\2\u0620\u0622\7e\2\2\u0621\u061f\3\2\2\2"+ - "\u0621\u0620\3\2\2\2\u0622\u0624\3\2\2\2\u0623\u061e\3\2\2\2\u0624\u0627"+ - "\3\2\2\2\u0625\u0623\3\2\2\2\u0625\u0626\3\2\2\2\u0626\u011d\3\2\2\2\u0627"+ - "\u0625\3\2\2\2\u0628\u0629\7P\2\2\u0629\u062d\7i\2\2\u062a\u062c\5\u0120"+ - "\u0091\2\u062b\u062a\3\2\2\2\u062c\u062f\3\2\2\2\u062d\u062b\3\2\2\2\u062d"+ - "\u062e\3\2\2\2\u062e\u0630\3\2\2\2\u062f\u062d\3\2\2\2\u0630\u0631\7j"+ - "\2\2\u0631\u011f\3\2\2\2\u0632\u0633\5\u0122\u0092\2\u0633\u0635\7p\2"+ - "\2\u0634\u0636\5\u00f0y\2\u0635\u0634\3\2\2\2\u0635\u0636\3\2\2\2\u0636"+ - "\u0121\3\2\2\2\u0637\u063a\7Q\2\2\u0638\u063b\5\u00f6|\2\u0639\u063b\5"+ - "\u0124\u0093\2\u063a\u0638\3\2\2\2\u063a\u0639\3\2\2\2\u063b\u063e\3\2"+ - "\2\2\u063c\u063e\7M\2\2\u063d\u0637\3\2\2\2\u063d\u063c\3\2\2\2\u063e"+ - "\u0123\3\2\2\2\u063f\u0640\5\u00e6t\2\u0640\u0641\7m\2\2\u0641\u0646\3"+ - "\2\2\2\u0642\u0643\5\u00e4s\2\u0643\u0644\7t\2\2\u0644\u0646\3\2\2\2\u0645"+ - "\u063f\3\2\2\2\u0645\u0642\3\2\2\2\u0645\u0646\3\2\2\2\u0646\u0647\3\2"+ - "\2\2\u0647\u0648\5\u00a4S\2\u0648\u0125\3\2\2\2\u0649\u064d\7a\2\2\u064a"+ - "\u064e\5\u00a4S\2\u064b\u064e\5\u0128\u0095\2\u064c\u064e\5\u00d8m\2\u064d"+ - "\u064a\3\2\2\2\u064d\u064b\3\2\2\2\u064d\u064c\3\2\2\2\u064d\u064e\3\2"+ - "\2\2\u064e\u064f\3\2\2\2\u064f\u0650\5\u00eex\2\u0650\u0127\3\2\2\2\u0651"+ - "\u0653\5\u00f2z\2\u0652\u0651\3\2\2\2\u0652\u0653\3\2\2\2\u0653\u0654"+ - "\3\2\2\2\u0654\u0656\5\u0170\u00b9\2\u0655\u0657\5\u00a4S\2\u0656\u0655"+ - "\3\2\2\2\u0656\u0657\3\2\2\2\u0657\u0658\3\2\2\2\u0658\u065a\5\u0170\u00b9"+ - "\2\u0659\u065b\5\u00f2z\2\u065a\u0659\3\2\2\2\u065a\u065b\3\2\2\2\u065b"+ - "\u0129\3\2\2\2\u065c\u065d\7S\2\2\u065d\u065e\5\u00a4S\2\u065e\u012b\3"+ - "\2\2\2\u065f\u0662\5\u0150\u00a9\2\u0660\u0662\7f\2\2\u0661\u065f\3\2"+ - "\2\2\u0661\u0660\3\2\2\2\u0662\u012d\3\2\2\2\u0663\u0664\7k\2\2\u0664"+ - "\u0665\5\u0130\u0099\2\u0665\u0666\7l\2\2\u0666\u0667\5\u0132\u009a\2"+ - "\u0667\u012f\3\2\2\2\u0668\u0669\5\u00a4S\2\u0669\u0131\3\2\2\2\u066a"+ - "\u066b\5\u00c2b\2\u066b\u0133\3\2\2\2\u066c\u066d\7\u0088\2\2\u066d\u066e"+ - "\5\u00c2b\2\u066e\u0135\3\2\2\2\u066f\u0670\7k\2\2\u0670\u0671\7l\2\2"+ - "\u0671\u0672\5\u0132\u009a\2\u0672\u0137\3\2\2\2\u0673\u0674\7T\2\2\u0674"+ - "\u0675\7k\2\2\u0675\u0676\5\u00c2b\2\u0676\u0677\7l\2\2\u0677\u0678\5"+ - "\u0132\u009a\2\u0678\u0139\3\2\2\2\u0679\u067f\7V\2\2\u067a\u067b\7V\2"+ - "\2\u067b\u067f\7\u008a\2\2\u067c\u067d\7\u008a\2\2\u067d\u067f\7V\2\2"+ - "\u067e\u0679\3\2\2\2\u067e\u067a\3\2\2\2\u067e\u067c\3\2\2\2\u067f\u0680"+ - "\3\2\2\2\u0680\u0681\5\u0132\u009a\2\u0681\u013b\3\2\2\2\u0682\u0683\7"+ - "N\2\2\u0683\u0684\5\u013e\u00a0\2\u0684\u013d\3\2\2\2\u0685\u0686\5\u0142"+ - "\u00a2\2\u0686\u0687\5\u0140\u00a1\2\u0687\u068a\3\2\2\2\u0688\u068a\5"+ - "\u0142\u00a2\2\u0689\u0685\3\2\2\2\u0689\u0688\3\2\2\2\u068a\u013f\3\2"+ - "\2\2\u068b\u068e\5\u0142\u00a2\2\u068c\u068e\5\u00c2b\2\u068d\u068b\3"+ - "\2\2\2\u068d\u068c\3\2\2\2\u068e\u0141\3\2\2\2\u068f\u069b\7g\2\2\u0690"+ - "\u0695\5\u009cO\2\u0691\u0692\7n\2\2\u0692\u0694\5\u009cO\2\u0693\u0691"+ - "\3\2\2\2\u0694\u0697\3\2\2\2\u0695\u0693\3\2\2\2\u0695\u0696\3\2\2\2\u0696"+ - "\u0699\3\2\2\2\u0697\u0695\3\2\2\2\u0698\u069a\7n\2\2\u0699\u0698\3\2"+ - "\2\2\u0699\u069a\3\2\2\2\u069a\u069c\3\2\2\2\u069b\u0690\3\2\2\2\u069b"+ - "\u069c\3\2\2\2\u069c\u069d\3\2\2\2\u069d\u069e\7h\2\2\u069e\u0143\3\2"+ - "\2\2\u069f\u06a0\5\u0146\u00a4\2\u06a0\u06a1\7g\2\2\u06a1\u06a3\5\u00a4"+ - "S\2\u06a2\u06a4\7n\2\2\u06a3\u06a2\3\2\2\2\u06a3\u06a4\3\2\2\2\u06a4\u06a5"+ - "\3\2\2\2\u06a5\u06a6\7h\2\2\u06a6\u0145\3\2\2\2\u06a7\u06ad\5\u00c4c\2"+ - "\u06a8\u06a9\7g\2\2\u06a9\u06aa\5\u0146\u00a4\2\u06aa\u06ab\7h\2\2\u06ab"+ - "\u06ad\3\2\2\2\u06ac\u06a7\3\2\2\2\u06ac\u06a8\3\2\2\2\u06ad\u0147\3\2"+ - "\2\2\u06ae\u06b5\5\u014a\u00a6\2\u06af\u06b5\5\u014e\u00a8\2\u06b0\u06b1"+ - "\7g\2\2\u06b1\u06b2\5\u00a4S\2\u06b2\u06b3\7h\2\2\u06b3\u06b5\3\2\2\2"+ - "\u06b4\u06ae\3\2\2\2\u06b4\u06af\3\2\2\2\u06b4\u06b0\3\2\2\2\u06b5\u0149"+ - "\3\2\2\2\u06b6\u06ba\5\u00b2Z\2\u06b7\u06ba\5\u0152\u00aa\2\u06b8\u06ba"+ - "\5\u00b6\\\2\u06b9\u06b6\3\2\2\2\u06b9\u06b7\3\2\2\2\u06b9\u06b8\3\2\2"+ - "\2\u06ba\u014b\3\2\2\2\u06bb\u06bc\t\23\2\2\u06bc\u014d\3\2\2\2\u06bd"+ - "\u06be\7f\2\2\u06be\u014f\3\2\2\2\u06bf\u06c0\7f\2\2\u06c0\u06c1\7q\2"+ - "\2\u06c1\u06c2\7f\2\2\u06c2\u0151\3\2\2\2\u06c3\u06c4\5\u00caf\2\u06c4"+ - "\u06c5\5\u0154\u00ab\2\u06c5\u0153\3\2\2\2\u06c6\u06cb\7i\2\2\u06c7\u06c9"+ - "\5\u0156\u00ac\2\u06c8\u06ca\7n\2\2\u06c9\u06c8\3\2\2\2\u06c9\u06ca\3"+ - "\2\2\2\u06ca\u06cc\3\2\2\2\u06cb\u06c7\3\2\2\2\u06cb\u06cc\3\2\2\2\u06cc"+ - "\u06cd\3\2\2\2\u06cd\u06ce\7j\2\2\u06ce\u0155\3\2\2\2\u06cf\u06d4\5\u0158"+ - "\u00ad\2\u06d0\u06d1\7n\2\2\u06d1\u06d3\5\u0158\u00ad\2\u06d2\u06d0\3"+ - "\2\2\2\u06d3\u06d6\3\2\2\2\u06d4\u06d2\3\2\2\2\u06d4\u06d5\3\2\2\2\u06d5"+ - "\u0157\3\2\2\2\u06d6\u06d4\3\2\2\2\u06d7\u06d8\5\u015a\u00ae\2\u06d8\u06d9"+ - "\7p\2\2\u06d9\u06db\3\2\2\2\u06da\u06d7\3\2\2\2\u06da\u06db\3\2\2\2\u06db"+ - "\u06dc\3\2\2\2\u06dc\u06dd\5\u015c\u00af\2\u06dd\u0159\3\2\2\2\u06de\u06e1"+ - "\5\u00a4S\2\u06df\u06e1\5\u0154\u00ab\2\u06e0\u06de\3\2\2\2\u06e0\u06df"+ - "\3\2\2\2\u06e1\u015b\3\2\2\2\u06e2\u06e5\5\u00a4S\2\u06e3\u06e5\5\u0154"+ - "\u00ab\2\u06e4\u06e2\3\2\2\2\u06e4\u06e3\3\2\2\2\u06e5\u015d\3\2\2\2\u06e6"+ - "\u06e7\7U\2\2\u06e7\u06ed\7i\2\2\u06e8\u06e9\5\u0160\u00b1\2\u06e9\u06ea"+ - "\5\u0170\u00b9\2\u06ea\u06ec\3\2\2\2\u06eb\u06e8\3\2\2\2\u06ec\u06ef\3"+ - "\2\2\2\u06ed\u06eb\3\2\2\2\u06ed\u06ee\3\2\2\2\u06ee\u06f0\3\2\2\2\u06ef"+ - "\u06ed\3\2\2\2\u06f0\u06f1\7j\2\2\u06f1\u015f\3\2\2\2\u06f2\u06f3\5\u00e4"+ - "s\2\u06f3\u06f4\5\u00c2b\2\u06f4\u06f7\3\2\2\2\u06f5\u06f7\5\u0164\u00b3"+ - "\2\u06f6\u06f2\3\2\2\2\u06f6\u06f5\3\2\2\2\u06f7\u06f9\3\2\2\2\u06f8\u06fa"+ - "\5\u0162\u00b2\2\u06f9\u06f8\3\2\2\2\u06f9\u06fa\3\2\2\2\u06fa\u0161\3"+ - "\2\2\2\u06fb\u06fc\t\24\2\2\u06fc\u0163\3\2\2\2\u06fd\u06ff\7\u0088\2"+ - "\2\u06fe\u06fd\3\2\2\2\u06fe\u06ff\3\2\2\2\u06ff\u0700\3\2\2\2\u0700\u0701"+ - "\5\u012c\u0097\2\u0701\u0165\3\2\2\2\u0702\u0703\7k\2\2\u0703\u0704\5"+ - "\u00a4S\2\u0704\u0705\7l\2\2\u0705\u0167\3\2\2\2\u0706\u0707\7q\2\2\u0707"+ - "\u0708\7g\2\2\u0708\u0709\5\u00c2b\2\u0709\u070a\7h\2\2\u070a\u0169\3"+ - "\2\2\2\u070b\u071a\7g\2\2\u070c\u0713\5\u00e6t\2\u070d\u0710\5\u0146\u00a4"+ - "\2\u070e\u070f\7n\2\2\u070f\u0711\5\u00e6t\2\u0710\u070e\3\2\2\2\u0710"+ - "\u0711\3\2\2\2\u0711\u0713\3\2\2\2\u0712\u070c\3\2\2\2\u0712\u070d\3\2"+ - "\2\2\u0713\u0715\3\2\2\2\u0714\u0716\7u\2\2\u0715\u0714\3\2\2\2\u0715"+ - "\u0716\3\2\2\2\u0716\u0718\3\2\2\2\u0717\u0719\7n\2\2\u0718\u0717\3\2"+ - "\2\2\u0718\u0719\3\2\2\2\u0719\u071b\3\2\2\2\u071a\u0712\3\2\2\2\u071a"+ - "\u071b\3\2\2\2\u071b\u071c\3\2\2\2\u071c\u071d\7h\2\2\u071d\u016b\3\2"+ - "\2\2\u071e\u071f\5\u0146\u00a4\2\u071f\u0720\7q\2\2\u0720\u0721\7f\2\2"+ - "\u0721\u016d\3\2\2\2\u0722\u0723\5\u00c2b\2\u0723\u016f\3\2\2\2\u0724"+ - "\u0729\7o\2\2\u0725\u0729\7\2\2\3\u0726\u0729\7\u00a0\2\2\u0727\u0729"+ - "\6\u00b9\24\2\u0728\u0724\3\2\2\2\u0728\u0725\3\2\2\2\u0728\u0726\3\2"+ - "\2\2\u0728\u0727\3\2\2\2\u0729\u0171\3\2\2\2\u00bd\u0180\u0185\u018c\u0196"+ + "\u03f2\t\b\2\2\u03f2\u0406\5\u00a4S\21\u03f3\u0406\5\u00b4[\2\u03f4\u03f5"+ + "\7\33\2\2\u03f5\u03f6\5.\30\2\u03f6\u03f7\7\36\2\2\u03f7\u03f8\5\u00a4"+ + "S\5\u03f8\u0406\3\2\2\2\u03f9\u03fa\7\34\2\2\u03fa\u03fb\5\u0098M\2\u03fb"+ + "\u03fc\7\36\2\2\u03fc\u03fd\5\u00a4S\4\u03fd\u0406\3\2\2\2\u03fe\u03ff"+ + "\t\t\2\2\u03ff\u0400\5&\24\2\u0400\u0401\7q\2\2\u0401\u0402\7q\2\2\u0402"+ + "\u0403\5*\26\2\u0403\u0404\5\u00a4S\3\u0404\u0406\3\2\2\2\u0405\u03f0"+ + "\3\2\2\2\u0405\u03f3\3\2\2\2\u0405\u03f4\3\2\2\2\u0405\u03f9\3\2\2\2\u0405"+ + "\u03fe\3\2\2\2\u0406\u042a\3\2\2\2\u0407\u0408\f\17\2\2\u0408\u0409\t"+ + "\n\2\2\u0409\u0429\5\u00a4S\20\u040a\u040b\f\16\2\2\u040b\u040c\t\13\2"+ + "\2\u040c\u0429\5\u00a4S\17\u040d\u040e\f\r\2\2\u040e\u040f\t\f\2\2\u040f"+ + "\u0429\5\u00a4S\16\u0410\u0411\f\f\2\2\u0411\u0412\t\r\2\2\u0412\u0429"+ + "\5\u00a4S\r\u0413\u0414\f\13\2\2\u0414\u0415\t\16\2\2\u0415\u0429\5\u00a4"+ + "S\f\u0416\u0417\f\t\2\2\u0417\u0418\7x\2\2\u0418\u0429\5\u00a4S\n\u0419"+ + "\u041a\f\b\2\2\u041a\u041b\7w\2\2\u041b\u0429\5\u00a4S\t\u041c\u041d\f"+ + "\7\2\2\u041d\u041e\7$\2\2\u041e\u0429\5\u00a4S\7\u041f\u0420\f\6\2\2\u0420"+ + "\u0421\7\'\2\2\u0421\u0422\5\u00a4S\2\u0422\u0423\7q\2\2\u0423\u0424\5"+ + "\u00a4S\6\u0424\u0429\3\2\2\2\u0425\u0426\f\n\2\2\u0426\u0427\7\21\2\2"+ + "\u0427\u0429\5r:\2\u0428\u0407\3\2\2\2\u0428\u040a\3\2\2\2\u0428\u040d"+ + "\3\2\2\2\u0428\u0410\3\2\2\2\u0428\u0413\3\2\2\2\u0428\u0416\3\2\2\2\u0428"+ + "\u0419\3\2\2\2\u0428\u041c\3\2\2\2\u0428\u041f\3\2\2\2\u0428\u0425\3\2"+ + "\2\2\u0429\u042c\3\2\2\2\u042a\u0428\3\2\2\2\u042a\u042b\3\2\2\2\u042b"+ + "\u00a5\3\2\2\2\u042c\u042a\3\2\2\2\u042d\u0442\5\30\r\2\u042e\u0442\5"+ + "\32\16\2\u042f\u0442\5\u00aaV\2\u0430\u0442\5\u00a8U\2\u0431\u0442\5\u00de"+ + "p\2\u0432\u0442\5\u00fe\u0080\2\u0433\u0442\5\u00f2z\2\u0434\u0442\5\u012a"+ + "\u0096\2\u0435\u0442\5\u0100\u0081\2\u0436\u0442\5\u0102\u0082\2\u0437"+ + "\u0442\5\u0104\u0083\2\u0438\u0442\5\u0106\u0084\2\u0439\u0442\5\u0108"+ + "\u0085\2\u043a\u0442\5\u00eex\2\u043b\u0442\5\u010a\u0086\2\u043c\u0442"+ + "\5\u010c\u0087\2\u043d\u0442\5\u011e\u0090\2\u043e\u0442\5\u00acW\2\u043f"+ + "\u0442\5\u00b0Y\2\u0440\u0442\5x=\2\u0441\u042d\3\2\2\2\u0441\u042e\3"+ + "\2\2\2\u0441\u042f\3\2\2\2\u0441\u0430\3\2\2\2\u0441\u0431\3\2\2\2\u0441"+ + "\u0432\3\2\2\2\u0441\u0433\3\2\2\2\u0441\u0434\3\2\2\2\u0441\u0435\3\2"+ + "\2\2\u0441\u0436\3\2\2\2\u0441\u0437\3\2\2\2\u0441\u0438\3\2\2\2\u0441"+ + "\u0439\3\2\2\2\u0441\u043a\3\2\2\2\u0441\u043b\3\2\2\2\u0441\u043c\3\2"+ + "\2\2\u0441\u043d\3\2\2\2\u0441\u043e\3\2\2\2\u0441\u043f\3\2\2\2\u0441"+ + "\u0440\3\2\2\2\u0442\u00a7\3\2\2\2\u0443\u0444\7&\2\2\u0444\u0445\5\u00a4"+ + "S\2\u0445\u00a9\3\2\2\2\u0446\u0447\7Z\2\2\u0447\u0449\5\u00a4S\2\u0448"+ + "\u044a\5\u00eex\2\u0449\u0448\3\2\2\2\u0449\u044a\3\2\2\2\u044a\u00ab"+ + "\3\2\2\2\u044b\u044c\5\u00aeX\2\u044c\u044d\5\u0126\u0094\2\u044d\u00ad"+ + "\3\2\2\2\u044e\u044f\7\16\2\2\u044f\u0450\5\u00a4S\2\u0450\u0451\5\u0170"+ + "\u00b9\2\u0451\u0453\3\2\2\2\u0452\u044e\3\2\2\2\u0453\u0456\3\2\2\2\u0454"+ + "\u0452\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u045b\3\2\2\2\u0456\u0454\3\2"+ + "\2\2\u0457\u0458\7\17\2\2\u0458\u0459\5b\62\2\u0459\u045a\5\u0170\u00b9"+ + "\2\u045a\u045c\3\2\2\2\u045b\u0457\3\2\2\2\u045b\u045c\3\2\2\2\u045c\u00af"+ + "\3\2\2\2\u045d\u045e\7S\2\2\u045e\u0463\5\u00a4S\2\u045f\u0460\7S\2\2"+ + "\u0460\u0461\t\3\2\2\u0461\u0463\5.\30\2\u0462\u045d\3\2\2\2\u0462\u045f"+ + "\3\2\2\2\u0463\u00b1\3\2\2\2\u0464\u046d\7\5\2\2\u0465\u046d\7\6\2\2\u0466"+ + "\u046d\7f\2\2\u0467\u046d\5\u014c\u00a7\2\u0468\u046d\5\u0162\u00b2\2"+ + "\u0469\u046d\7\3\2\2\u046a\u046d\7\u0091\2\2\u046b\u046d\7\u0092\2\2\u046c"+ + "\u0464\3\2\2\2\u046c\u0465\3\2\2\2\u046c\u0466\3\2\2\2\u046c\u0467\3\2"+ + "\2\2\u046c\u0468\3\2\2\2\u046c\u0469\3\2\2\2\u046c\u046a\3\2\2\2\u046c"+ + "\u046b\3\2\2\2\u046d\u00b3\3\2\2\2\u046e\u046f\b[\1\2\u046f\u047b\5\u0148"+ + "\u00a5\2\u0470\u047b\5\u0144\u00a3\2\u0471\u047b\5\u016c\u00b7\2\u0472"+ + "\u047b\5 \21\2\u0473\u047b\5\u0086D\2\u0474\u047b\5\u0084C\2\u0475\u0476"+ + "\t\17\2\2\u0476\u0477\7h\2\2\u0477\u0478\5\u00a4S\2\u0478\u0479\7i\2\2"+ + "\u0479\u047b\3\2\2\2\u047a\u046e\3\2\2\2\u047a\u0470\3\2\2\2\u047a\u0471"+ + "\3\2\2\2\u047a\u0472\3\2\2\2\u047a\u0473\3\2\2\2\u047a\u0474\3\2\2\2\u047a"+ + "\u0475\3\2\2\2\u047b\u0492\3\2\2\2\u047c\u047d\f\13\2\2\u047d\u047e\7"+ + "r\2\2\u047e\u0491\7g\2\2\u047f\u0480\f\n\2\2\u0480\u0491\5\u0166\u00b4"+ + "\2\u0481\u0482\f\t\2\2\u0482\u0491\5\u00ceh\2\u0483\u0484\f\b\2\2\u0484"+ + "\u0491\5L\'\2\u0485\u0486\f\7\2\2\u0486\u0491\5\u0168\u00b5\2\u0487\u0488"+ + "\f\6\2\2\u0488\u0491\5\u016a\u00b6\2\u0489\u048a\f\5\2\2\u048a\u048b\5"+ + "\u016a\u00b6\2\u048b\u048c\7\22\2\2\u048c\u048d\5r:\2\u048d\u0491\3\2"+ + "\2\2\u048e\u048f\f\4\2\2\u048f\u0491\5\u00ba^\2\u0490\u047c\3\2\2\2\u0490"+ + "\u047f\3\2\2\2\u0490\u0481\3\2\2\2\u0490\u0483\3\2\2\2\u0490\u0485\3\2"+ + "\2\2\u0490\u0487\3\2\2\2\u0490\u0489\3\2\2\2\u0490\u048e\3\2\2\2\u0491"+ + "\u0494\3\2\2\2\u0492\u0490\3\2\2\2\u0492\u0493\3\2\2\2\u0493\u00b5\3\2"+ + "\2\2\u0494\u0492\3\2\2\2\u0495\u0496\5^\60\2\u0496\u0497\5\u00b8]\2\u0497"+ + "\u00b7\3\2\2\2\u0498\u049a\7O\2\2\u0499\u049b\7g\2\2\u049a\u0499\3\2\2"+ + "\2\u049a\u049b\3\2\2\2\u049b\u049c\3\2\2\2\u049c\u049e\5\u013e\u00a0\2"+ + "\u049d\u049f\5p9\2\u049e\u049d\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u00b9"+ + "\3\2\2\2\u04a0\u04a2\7(\2\2\u04a1\u04a3\5\u00e6t\2\u04a2\u04a1\3\2\2\2"+ + "\u04a2\u04a3\3\2\2\2\u04a3\u04a5\3\2\2\2\u04a4\u04a6\7o\2\2\u04a5\u04a4"+ + "\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7\u04a8\7)\2\2\u04a8"+ + "\u00bb\3\2\2\2\u04a9\u04aa\7P\2\2\u04aa\u04b4\7j\2\2\u04ab\u04af\5\u00c0"+ + "a\2\u04ac\u04af\5\u012c\u0097\2\u04ad\u04af\5\u00be`\2\u04ae\u04ab\3\2"+ + "\2\2\u04ae\u04ac\3\2\2\2\u04ae\u04ad\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0"+ + "\u04b1\5\u0170\u00b9\2\u04b1\u04b3\3\2\2\2\u04b2\u04ae\3\2\2\2\u04b3\u04b6"+ + "\3\2\2\2\u04b4\u04b2\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b7\3\2\2\2\u04b6"+ + "\u04b4\3\2\2\2\u04b7\u04b8\7k\2\2\u04b8\u00bd\3\2\2\2\u04b9\u04ba\7:\2"+ + "\2\u04ba\u04bb\7g\2\2\u04bb\u04bc\5\u0142\u00a2\2\u04bc\u00bf\3\2\2\2"+ + "\u04bd\u04bf\7\35\2\2\u04be\u04bd\3\2\2\2\u04be\u04bf\3\2\2\2\u04bf\u04c0"+ + "\3\2\2\2\u04c0\u04c1\5^\60\2\u04c1\u04c2\7g\2\2\u04c2\u04c3\5\u0142\u00a2"+ + "\2\u04c3\u04c4\5\u0140\u00a1\2\u04c4\u04cd\3\2\2\2\u04c5\u04c7\7\35\2"+ + "\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04c9"+ + "\5^\60\2\u04c9\u04ca\7g\2\2\u04ca\u04cb\5\u0142\u00a2\2\u04cb\u04cd\3"+ + "\2\2\2\u04cc\u04be\3\2\2\2\u04cc\u04c6\3\2\2\2\u04cd\u00c1\3\2\2\2\u04ce"+ + "\u04d6\5\u012c\u0097\2\u04cf\u04d6\5\u00c4c\2\u04d0\u04d6\5P)\2\u04d1"+ + "\u04d2\7h\2\2\u04d2\u04d3\5\u00c2b\2\u04d3\u04d4\7i\2\2\u04d4\u04d6\3"+ + "\2\2\2\u04d5\u04ce\3\2\2\2\u04d5\u04cf\3\2\2\2\u04d5\u04d0\3\2\2\2\u04d5"+ + "\u04d1\3\2\2\2\u04d6\u00c3\3\2\2\2\u04d7\u04e1\5\u012e\u0098\2\u04d8\u04e1"+ + "\5\u015e\u00b0\2\u04d9\u04e1\5\u0134\u009b\2\u04da\u04e1\5\u013c\u009f"+ + "\2\u04db\u04e1\5\u00bc_\2\u04dc\u04e1\5\u0136\u009c\2\u04dd\u04e1\5\u0138"+ + "\u009d\2\u04de\u04e1\5\u013a\u009e\2\u04df\u04e1\5\u00c6d\2\u04e0\u04d7"+ + "\3\2\2\2\u04e0\u04d8\3\2\2\2\u04e0\u04d9\3\2\2\2\u04e0\u04da\3\2\2\2\u04e0"+ + "\u04db\3\2\2\2\u04e0\u04dc\3\2\2\2\u04e0\u04dd\3\2\2\2\u04e0\u04de\3\2"+ + "\2\2\u04e0\u04df\3\2\2\2\u04e1\u00c5\3\2\2\2\u04e2\u04e3\7:\2\2\u04e3"+ + "\u04e4\5\u00c8e\2\u04e4\u00c7\3\2\2\2\u04e5\u04f1\7h\2\2\u04e6\u04eb\5"+ + "\u00c2b\2\u04e7\u04e8\7o\2\2\u04e8\u04ea\5\u00c2b\2\u04e9\u04e7\3\2\2"+ + "\2\u04ea\u04ed\3\2\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ec\3\2\2\2\u04ec\u04ef"+ + "\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ee\u04f0\7o\2\2\u04ef\u04ee\3\2\2\2\u04ef"+ + "\u04f0\3\2\2\2\u04f0\u04f2\3\2\2\2\u04f1\u04e6\3\2\2\2\u04f1\u04f2\3\2"+ + "\2\2\u04f2\u04f3\3\2\2\2\u04f3\u04f4\7i\2\2\u04f4\u00c9\3\2\2\2\u04f5"+ + "\u04fd\5\u015e\u00b0\2\u04f6\u04fd\5\u012e\u0098\2\u04f7\u04fd\5\u00cc"+ + "g\2\u04f8\u04fd\5\u0136\u009c\2\u04f9\u04fd\5\u0138\u009d\2\u04fa\u04fd"+ + "\5P)\2\u04fb\u04fd\5\u012c\u0097\2\u04fc\u04f5\3\2\2\2\u04fc\u04f6\3\2"+ + "\2\2\u04fc\u04f7\3\2\2\2\u04fc\u04f8\3\2\2\2\u04fc\u04f9\3\2\2\2\u04fc"+ + "\u04fa\3\2\2\2\u04fc\u04fb\3\2\2\2\u04fd\u00cb\3\2\2\2\u04fe\u04ff\7l"+ + "\2\2\u04ff\u0500\7v\2\2\u0500\u0501\7m\2\2\u0501\u0502\5\u0132\u009a\2"+ + "\u0502\u00cd\3\2\2\2\u0503\u0513\7l\2\2\u0504\u0506\5\u00d0i\2\u0505\u0504"+ + "\3\2\2\2\u0505\u0506\3\2\2\2\u0506\u0507\3\2\2\2\u0507\u0509\7q\2\2\u0508"+ + "\u050a\5\u00d2j\2\u0509\u0508\3\2\2\2\u0509\u050a\3\2\2\2\u050a\u0514"+ + "\3\2\2\2\u050b\u050d\5\u00d0i\2\u050c\u050b\3\2\2\2\u050c\u050d\3\2\2"+ + "\2\u050d\u050e\3\2\2\2\u050e\u050f\7q\2\2\u050f\u0510\5\u00d2j\2\u0510"+ + "\u0511\7q\2\2\u0511\u0512\5\u00d4k\2\u0512\u0514\3\2\2\2\u0513\u0505\3"+ + "\2\2\2\u0513\u050c\3\2\2\2\u0514\u0515\3\2\2\2\u0515\u0516\7m\2\2\u0516"+ + "\u00cf\3\2\2\2\u0517\u0518\5\u00a4S\2\u0518\u00d1\3\2\2\2\u0519\u051a"+ + "\5\u00a4S\2\u051a\u00d3\3\2\2\2\u051b\u051c\5\u00a4S\2\u051c\u00d5\3\2"+ + "\2\2\u051d\u051f\t\20\2\2\u051e\u051d\3\2\2\2\u051e\u051f\3\2\2\2\u051f"+ + "\u0520\3\2\2\2\u0520\u0521\7n\2\2\u0521\u00d7\3\2\2\2\u0522\u0523\5\u00e6"+ + "t\2\u0523\u0524\7n\2\2\u0524\u0529\3\2\2\2\u0525\u0526\5\b\5\2\u0526\u0527"+ + "\7u\2\2\u0527\u0529\3\2\2\2\u0528\u0522\3\2\2\2\u0528\u0525\3\2\2\2\u0528"+ + "\u0529\3\2\2\2\u0529\u052a\3\2\2\2\u052a\u052b\7_\2\2\u052b\u0530\5\u00a4"+ + "S\2\u052c\u052e\7L\2\2\u052d\u052f\7g\2\2\u052e\u052d\3\2\2\2\u052e\u052f"+ + "\3\2\2\2\u052f\u0531\3\2\2\2\u0530\u052c\3\2\2\2\u0530\u0531\3\2\2\2\u0531"+ + "\u00d9\3\2\2\2\u0532\u0533\7Z\2\2\u0533\u0534\7g\2\2\u0534\u00db\3\2\2"+ + "\2\u0535\u0536\5\u0162\u00b2\2\u0536\u00dd\3\2\2\2\u0537\u053b\5\u00e0"+ + "q\2\u0538\u053b\5\u00e8u\2\u0539\u053b\5\u00ecw\2\u053a\u0537\3\2\2\2"+ + "\u053a\u0538\3\2\2\2\u053a\u0539\3\2\2\2\u053b\u00df\3\2\2\2\u053c\u0548"+ + "\7\\\2\2\u053d\u0549\5\u00e2r\2\u053e\u0544\7h\2\2\u053f\u0540\5\u00e2"+ + "r\2\u0540\u0541\5\u0170\u00b9\2\u0541\u0543\3\2\2\2\u0542\u053f\3\2\2"+ + "\2\u0543\u0546\3\2\2\2\u0544\u0542\3\2\2\2\u0544\u0545\3\2\2\2\u0545\u0547"+ + "\3\2\2\2\u0546\u0544\3\2\2\2\u0547\u0549\7i\2\2\u0548\u053d\3\2\2\2\u0548"+ + "\u053e\3\2\2\2\u0549\u00e1\3\2\2\2\u054a\u0550\5\u00e4s\2\u054b\u054d"+ + "\5\u00c2b\2\u054c\u054b\3\2\2\2\u054c\u054d\3\2\2\2\u054d\u054e\3\2\2"+ + "\2\u054e\u054f\7n\2\2\u054f\u0551\5\u00e6t\2\u0550\u054c\3\2\2\2\u0550"+ + "\u0551\3\2\2\2\u0551\u00e3\3\2\2\2\u0552\u0557\7g\2\2\u0553\u0554\7o\2"+ + "\2\u0554\u0556\7g\2\2\u0555\u0553\3\2\2\2\u0556\u0559\3\2\2\2\u0557\u0555"+ + "\3\2\2\2\u0557\u0558\3\2\2\2\u0558\u00e5\3\2\2\2\u0559\u0557\3\2\2\2\u055a"+ + "\u055f\5\u00a4S\2\u055b\u055c\7o\2\2\u055c\u055e\5\u00a4S\2\u055d\u055b"+ + "\3\2\2\2\u055e\u0561\3\2\2\2\u055f\u055d\3\2\2\2\u055f\u0560\3\2\2\2\u0560"+ + "\u00e7\3\2\2\2\u0561\u055f\3\2\2\2\u0562\u056e\7`\2\2\u0563\u056f\5\u00ea"+ + "v\2\u0564\u056a\7h\2\2\u0565\u0566\5\u00eav\2\u0566\u0567\5\u0170\u00b9"+ + "\2\u0567\u0569\3\2\2\2\u0568\u0565\3\2\2\2\u0569\u056c\3\2\2\2\u056a\u0568"+ + "\3\2\2\2\u056a\u056b\3\2\2\2\u056b\u056d\3\2\2\2\u056c\u056a\3\2\2\2\u056d"+ + "\u056f\7i\2\2\u056e\u0563\3\2\2\2\u056e\u0564\3\2\2\2\u056f\u00e9\3\2"+ + "\2\2\u0570\u0572\7g\2\2\u0571\u0573\7n\2\2\u0572\u0571\3\2\2\2\u0572\u0573"+ + "\3\2\2\2\u0573\u0574\3\2\2\2\u0574\u0575\5\u00c2b\2\u0575\u00eb\3\2\2"+ + "\2\u0576\u0582\7e\2\2\u0577\u0583\5\u0096L\2\u0578\u057e\7h\2\2\u0579"+ + "\u057a\5\u0096L\2\u057a\u057b\5\u0170\u00b9\2\u057b\u057d\3\2\2\2\u057c"+ + "\u0579\3\2\2\2\u057d\u0580\3\2\2\2\u057e\u057c\3\2\2\2\u057e\u057f\3\2"+ + "\2\2\u057f\u0581\3\2\2\2\u0580\u057e\3\2\2\2\u0581\u0583\7i\2\2\u0582"+ + "\u0577\3\2\2\2\u0582\u0578\3\2\2\2\u0583\u00ed\3\2\2\2\u0584\u0586\7j"+ + "\2\2\u0585\u0587\5\u00f0y\2\u0586\u0585\3\2\2\2\u0586\u0587\3\2\2\2\u0587"+ + "\u0588\3\2\2\2\u0588\u0589\7k\2\2\u0589\u00ef\3\2\2\2\u058a\u058c\5\u0170"+ + "\u00b9\2\u058b\u058a\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058d\3\2\2\2\u058d"+ + "\u058e\5\u00a6T\2\u058e\u058f\5\u0170\u00b9\2\u058f\u0591\3\2\2\2\u0590"+ + "\u058b\3\2\2\2\u0591\u0592\3\2\2\2\u0592\u0590\3\2\2\2\u0592\u0593\3\2"+ + "\2\2\u0593\u00f1\3\2\2\2\u0594\u059a\5\u00f6|\2\u0595\u059a\5\u00f8}\2"+ + "\u0596\u059a\5\u00fa~\2\u0597\u059a\5\u00f4{\2\u0598\u059a\5\u0098M\2"+ + "\u0599\u0594\3\2\2\2\u0599\u0595\3\2\2\2\u0599\u0596\3\2\2\2\u0599\u0597"+ + "\3\2\2\2\u0599\u0598\3\2\2\2\u059a\u00f3\3\2\2\2\u059b\u059c\5\u00a4S"+ + "\2\u059c\u00f5\3\2\2\2\u059d\u059e\5\u00a4S\2\u059e\u059f\7\u008b\2\2"+ + "\u059f\u05a0\5\u00a4S\2\u05a0\u00f7\3\2\2\2\u05a1\u05a2\5\u00a4S\2\u05a2"+ + "\u05a3\t\21\2\2\u05a3\u00f9\3\2\2\2\u05a4\u05a5\5\u00e6t\2\u05a5\u05a6"+ + "\5\u00d6l\2\u05a6\u05a7\5\u00e6t\2\u05a7\u00fb\3\2\2\2\u05a8\u05a9\t\22"+ + "\2\2\u05a9\u00fd\3\2\2\2\u05aa\u05ab\7g\2\2\u05ab\u05ad\7q\2\2\u05ac\u05ae"+ + "\5\u00a6T\2\u05ad\u05ac\3\2\2\2\u05ad\u05ae\3\2\2\2\u05ae\u00ff\3\2\2"+ + "\2\u05af\u05b1\7d\2\2\u05b0\u05b2\5\u00e6t\2\u05b1\u05b0\3\2\2\2\u05b1"+ + "\u05b2\3\2\2\2\u05b2\u0101\3\2\2\2\u05b3\u05b5\7M\2\2\u05b4\u05b6\7g\2"+ + "\2\u05b5\u05b4\3\2\2\2\u05b5\u05b6\3\2\2\2\u05b6\u0103\3\2\2\2\u05b7\u05b9"+ + "\7a\2\2\u05b8\u05ba\7g\2\2\u05b9\u05b8\3\2\2\2\u05b9\u05ba\3\2\2\2\u05ba"+ + "\u0105\3\2\2\2\u05bb\u05bc\7Y\2\2\u05bc\u05bd\7g\2\2\u05bd\u0107\3\2\2"+ + "\2\u05be\u05bf\7]\2\2\u05bf\u0109\3\2\2\2\u05c0\u05c9\7^\2\2\u05c1\u05ca"+ + "\5\u00a4S\2\u05c2\u05c3\5\u0170\u00b9\2\u05c3\u05c4\5\u00a4S\2\u05c4\u05ca"+ + "\3\2\2\2\u05c5\u05c6\5\u00f2z\2\u05c6\u05c7\5\u0170\u00b9\2\u05c7\u05c8"+ + "\5\u00a4S\2\u05c8\u05ca\3\2\2\2\u05c9\u05c1\3\2\2\2\u05c9\u05c2\3\2\2"+ + "\2\u05c9\u05c5\3\2\2\2\u05ca\u05cb\3\2\2\2\u05cb\u05d1\5\u00eex\2\u05cc"+ + "\u05cf\7X\2\2\u05cd\u05d0\5\u010a\u0086\2\u05ce\u05d0\5\u00eex\2\u05cf"+ + "\u05cd\3\2\2\2\u05cf\u05ce\3\2\2\2\u05d0\u05d2\3\2\2\2\u05d1\u05cc\3\2"+ + "\2\2\u05d1\u05d2\3\2\2\2\u05d2\u010b\3\2\2\2\u05d3\u05d6\5\u010e\u0088"+ + "\2\u05d4\u05d6\5\u0114\u008b\2\u05d5\u05d3\3\2\2\2\u05d5\u05d4\3\2\2\2"+ + "\u05d6\u010d\3\2\2\2\u05d7\u05e2\7[\2\2\u05d8\u05da\5\u00a4S\2\u05d9\u05d8"+ + "\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05e3\3\2\2\2\u05db\u05dd\5\u00f2z"+ + "\2\u05dc\u05db\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd\u05de\3\2\2\2\u05de\u05e0"+ + "\5\u0170\u00b9\2\u05df\u05e1\5\u00a4S\2\u05e0\u05df\3\2\2\2\u05e0\u05e1"+ + "\3\2\2\2\u05e1\u05e3\3\2\2\2\u05e2\u05d9\3\2\2\2\u05e2\u05dc\3\2\2\2\u05e3"+ + "\u05e4\3\2\2\2\u05e4\u05e8\7j\2\2\u05e5\u05e7\5\u0110\u0089\2\u05e6\u05e5"+ + "\3\2\2\2\u05e7\u05ea\3\2\2\2\u05e8\u05e6\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9"+ + "\u05eb\3\2\2\2\u05ea\u05e8\3\2\2\2\u05eb\u05ec\7k\2\2\u05ec\u010f\3\2"+ + "\2\2\u05ed\u05ee\5\u0112\u008a\2\u05ee\u05f0\7q\2\2\u05ef\u05f1\5\u00f0"+ + "y\2\u05f0\u05ef\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u0111\3\2\2\2\u05f2"+ + "\u05f3\7R\2\2\u05f3\u05f6\5\u00e6t\2\u05f4\u05f6\7N\2\2\u05f5\u05f2\3"+ + "\2\2\2\u05f5\u05f4\3\2\2\2\u05f6\u0113\3\2\2\2\u05f7\u0600\7[\2\2\u05f8"+ + "\u0601\5\u0116\u008c\2\u05f9\u05fa\5\u0170\u00b9\2\u05fa\u05fb\5\u0116"+ + "\u008c\2\u05fb\u0601\3\2\2\2\u05fc\u05fd\5\u00f2z\2\u05fd\u05fe\5\u0170"+ + "\u00b9\2\u05fe\u05ff\5\u0116\u008c\2\u05ff\u0601\3\2\2\2\u0600\u05f8\3"+ + "\2\2\2\u0600\u05f9\3\2\2\2\u0600\u05fc\3\2\2\2\u0601\u0602\3\2\2\2\u0602"+ + "\u0606\7j\2\2\u0603\u0605\5\u0118\u008d\2\u0604\u0603\3\2\2\2\u0605\u0608"+ + "\3\2\2\2\u0606\u0604\3\2\2\2\u0606\u0607\3\2\2\2\u0607\u0609\3\2\2\2\u0608"+ + "\u0606\3\2\2\2\u0609\u060a\7k\2\2\u060a\u0115\3\2\2\2\u060b\u060c\7g\2"+ + "\2\u060c\u060e\7u\2\2\u060d\u060b\3\2\2\2\u060d\u060e\3\2\2\2\u060e\u060f"+ + "\3\2\2\2\u060f\u0610\5\u00b4[\2\u0610\u0611\7r\2\2\u0611\u0612\7h\2\2"+ + "\u0612\u0613\7`\2\2\u0613\u0614\7i\2\2\u0614\u0117\3\2\2\2\u0615\u0616"+ + "\5\u011a\u008e\2\u0616\u0618\7q\2\2\u0617\u0619\5\u00f0y\2\u0618\u0617"+ + "\3\2\2\2\u0618\u0619\3\2\2\2\u0619\u0119\3\2\2\2\u061a\u061b\7R\2\2\u061b"+ + "\u061e\5\u011c\u008f\2\u061c\u061e\7N\2\2\u061d\u061a\3\2\2\2\u061d\u061c"+ + "\3\2\2\2\u061e\u011b\3\2\2\2\u061f\u0622\5\u00c2b\2\u0620\u0622\7f\2\2"+ + "\u0621\u061f\3\2\2\2\u0621\u0620\3\2\2\2\u0622\u062a\3\2\2\2\u0623\u0626"+ + "\7o\2\2\u0624\u0627\5\u00c2b\2\u0625\u0627\7f\2\2\u0626\u0624\3\2\2\2"+ + "\u0626\u0625\3\2\2\2\u0627\u0629\3\2\2\2\u0628\u0623\3\2\2\2\u0629\u062c"+ + "\3\2\2\2\u062a\u0628\3\2\2\2\u062a\u062b\3\2\2\2\u062b\u011d\3\2\2\2\u062c"+ + "\u062a\3\2\2\2\u062d\u062e\7Q\2\2\u062e\u0632\7j\2\2\u062f\u0631\5\u0120"+ + "\u0091\2\u0630\u062f\3\2\2\2\u0631\u0634\3\2\2\2\u0632\u0630\3\2\2\2\u0632"+ + "\u0633\3\2\2\2\u0633\u0635\3\2\2\2\u0634\u0632\3\2\2\2\u0635\u0636\7k"+ + "\2\2\u0636\u011f\3\2\2\2\u0637\u0638\5\u0122\u0092\2\u0638\u063a\7q\2"+ + "\2\u0639\u063b\5\u00f0y\2\u063a\u0639\3\2\2\2\u063a\u063b\3\2\2\2\u063b"+ + "\u0121\3\2\2\2\u063c\u063f\7R\2\2\u063d\u0640\5\u00f6|\2\u063e\u0640\5"+ + "\u0124\u0093\2\u063f\u063d\3\2\2\2\u063f\u063e\3\2\2\2\u0640\u0643\3\2"+ + "\2\2\u0641\u0643\7N\2\2\u0642\u063c\3\2\2\2\u0642\u0641\3\2\2\2\u0643"+ + "\u0123\3\2\2\2\u0644\u0645\5\u00e6t\2\u0645\u0646\7n\2\2\u0646\u064b\3"+ + "\2\2\2\u0647\u0648\5\u00e4s\2\u0648\u0649\7u\2\2\u0649\u064b\3\2\2\2\u064a"+ + "\u0644\3\2\2\2\u064a\u0647\3\2\2\2\u064a\u064b\3\2\2\2\u064b\u064c\3\2"+ + "\2\2\u064c\u064d\5\u00a4S\2\u064d\u0125\3\2\2\2\u064e\u0652\7b\2\2\u064f"+ + "\u0653\5\u00a4S\2\u0650\u0653\5\u0128\u0095\2\u0651\u0653\5\u00d8m\2\u0652"+ + "\u064f\3\2\2\2\u0652\u0650\3\2\2\2\u0652\u0651\3\2\2\2\u0652\u0653\3\2"+ + "\2\2\u0653\u0654\3\2\2\2\u0654\u0655\5\u00eex\2\u0655\u0127\3\2\2\2\u0656"+ + "\u0658\5\u00f2z\2\u0657\u0656\3\2\2\2\u0657\u0658\3\2\2\2\u0658\u0659"+ + "\3\2\2\2\u0659\u065b\5\u0170\u00b9\2\u065a\u065c\5\u00a4S\2\u065b\u065a"+ + "\3\2\2\2\u065b\u065c\3\2\2\2\u065c\u065d\3\2\2\2\u065d\u065f\5\u0170\u00b9"+ + "\2\u065e\u0660\5\u00f2z\2\u065f\u065e\3\2\2\2\u065f\u0660\3\2\2\2\u0660"+ + "\u0129\3\2\2\2\u0661\u0662\7T\2\2\u0662\u0663\5\u00a4S\2\u0663\u012b\3"+ + "\2\2\2\u0664\u0667\5\u0150\u00a9\2\u0665\u0667\7g\2\2\u0666\u0664\3\2"+ + "\2\2\u0666\u0665\3\2\2\2\u0667\u012d\3\2\2\2\u0668\u0669\7l\2\2\u0669"+ + "\u066a\5\u0130\u0099\2\u066a\u066b\7m\2\2\u066b\u066c\5\u0132\u009a\2"+ + "\u066c\u012f\3\2\2\2\u066d\u066e\5\u00a4S\2\u066e\u0131\3\2\2\2\u066f"+ + "\u0670\5\u00c2b\2\u0670\u0133\3\2\2\2\u0671\u0672\7\u0089\2\2\u0672\u0673"+ + "\5\u00c2b\2\u0673\u0135\3\2\2\2\u0674\u0675\7l\2\2\u0675\u0676\7m\2\2"+ + "\u0676\u0677\5\u0132\u009a\2\u0677\u0137\3\2\2\2\u0678\u0679\7U\2\2\u0679"+ + "\u067a\7l\2\2\u067a\u067b\5\u00c2b\2\u067b\u067c\7m\2\2\u067c\u067d\5"+ + "\u0132\u009a\2\u067d\u0139\3\2\2\2\u067e\u0684\7W\2\2\u067f\u0680\7W\2"+ + "\2\u0680\u0684\7\u008b\2\2\u0681\u0682\7\u008b\2\2\u0682\u0684\7W\2\2"+ + "\u0683\u067e\3\2\2\2\u0683\u067f\3\2\2\2\u0683\u0681\3\2\2\2\u0684\u0685"+ + "\3\2\2\2\u0685\u0686\5\u0132\u009a\2\u0686\u013b\3\2\2\2\u0687\u0688\7"+ + "O\2\2\u0688\u0689\5\u013e\u00a0\2\u0689\u013d\3\2\2\2\u068a\u068b\5\u0142"+ + "\u00a2\2\u068b\u068c\5\u0140\u00a1\2\u068c\u068f\3\2\2\2\u068d\u068f\5"+ + "\u0142\u00a2\2\u068e\u068a\3\2\2\2\u068e\u068d\3\2\2\2\u068f\u013f\3\2"+ + "\2\2\u0690\u0693\5\u0142\u00a2\2\u0691\u0693\5\u00c2b\2\u0692\u0690\3"+ + "\2\2\2\u0692\u0691\3\2\2\2\u0693\u0141\3\2\2\2\u0694\u06a0\7h\2\2\u0695"+ + "\u069a\5\u009cO\2\u0696\u0697\7o\2\2\u0697\u0699\5\u009cO\2\u0698\u0696"+ + "\3\2\2\2\u0699\u069c\3\2\2\2\u069a\u0698\3\2\2\2\u069a\u069b\3\2\2\2\u069b"+ + "\u069e\3\2\2\2\u069c\u069a\3\2\2\2\u069d\u069f\7o\2\2\u069e\u069d\3\2"+ + "\2\2\u069e\u069f\3\2\2\2\u069f\u06a1\3\2\2\2\u06a0\u0695\3\2\2\2\u06a0"+ + "\u06a1\3\2\2\2\u06a1\u06a2\3\2\2\2\u06a2\u06a3\7i\2\2\u06a3\u0143\3\2"+ + "\2\2\u06a4\u06a5\5\u0146\u00a4\2\u06a5\u06a6\7h\2\2\u06a6\u06a8\5\u00a4"+ + "S\2\u06a7\u06a9\7o\2\2\u06a8\u06a7\3\2\2\2\u06a8\u06a9\3\2\2\2\u06a9\u06aa"+ + "\3\2\2\2\u06aa\u06ab\7i\2\2\u06ab\u0145\3\2\2\2\u06ac\u06b2\5\u00c4c\2"+ + "\u06ad\u06ae\7h\2\2\u06ae\u06af\5\u0146\u00a4\2\u06af\u06b0\7i\2\2\u06b0"+ + "\u06b2\3\2\2\2\u06b1\u06ac\3\2\2\2\u06b1\u06ad\3\2\2\2\u06b2\u0147\3\2"+ + "\2\2\u06b3\u06ba\5\u014a\u00a6\2\u06b4\u06ba\5\u014e\u00a8\2\u06b5\u06b6"+ + "\7h\2\2\u06b6\u06b7\5\u00a4S\2\u06b7\u06b8\7i\2\2\u06b8\u06ba\3\2\2\2"+ + "\u06b9\u06b3\3\2\2\2\u06b9\u06b4\3\2\2\2\u06b9\u06b5\3\2\2\2\u06ba\u0149"+ + "\3\2\2\2\u06bb\u06bf\5\u00b2Z\2\u06bc\u06bf\5\u0152\u00aa\2\u06bd\u06bf"+ + "\5\u00b6\\\2\u06be\u06bb\3\2\2\2\u06be\u06bc\3\2\2\2\u06be\u06bd\3\2\2"+ + "\2\u06bf\u014b\3\2\2\2\u06c0\u06c1\t\23\2\2\u06c1\u014d\3\2\2\2\u06c2"+ + "\u06c3\7g\2\2\u06c3\u014f\3\2\2\2\u06c4\u06c5\7g\2\2\u06c5\u06c6\7r\2"+ + "\2\u06c6\u06c7\7g\2\2\u06c7\u0151\3\2\2\2\u06c8\u06c9\5\u00caf\2\u06c9"+ + "\u06ca\5\u0154\u00ab\2\u06ca\u0153\3\2\2\2\u06cb\u06d0\7j\2\2\u06cc\u06ce"+ + "\5\u0156\u00ac\2\u06cd\u06cf\7o\2\2\u06ce\u06cd\3\2\2\2\u06ce\u06cf\3"+ + "\2\2\2\u06cf\u06d1\3\2\2\2\u06d0\u06cc\3\2\2\2\u06d0\u06d1\3\2\2\2\u06d1"+ + "\u06d2\3\2\2\2\u06d2\u06d3\7k\2\2\u06d3\u0155\3\2\2\2\u06d4\u06d9\5\u0158"+ + "\u00ad\2\u06d5\u06d6\7o\2\2\u06d6\u06d8\5\u0158\u00ad\2\u06d7\u06d5\3"+ + "\2\2\2\u06d8\u06db\3\2\2\2\u06d9\u06d7\3\2\2\2\u06d9\u06da\3\2\2\2\u06da"+ + "\u0157\3\2\2\2\u06db\u06d9\3\2\2\2\u06dc\u06dd\5\u015a\u00ae\2\u06dd\u06de"+ + "\7q\2\2\u06de\u06e0\3\2\2\2\u06df\u06dc\3\2\2\2\u06df\u06e0\3\2\2\2\u06e0"+ + "\u06e1\3\2\2\2\u06e1\u06e2\5\u015c\u00af\2\u06e2\u0159\3\2\2\2\u06e3\u06e6"+ + "\5\u00a4S\2\u06e4\u06e6\5\u0154\u00ab\2\u06e5\u06e3\3\2\2\2\u06e5\u06e4"+ + "\3\2\2\2\u06e6\u015b\3\2\2\2\u06e7\u06ea\5\u00a4S\2\u06e8\u06ea\5\u0154"+ + "\u00ab\2\u06e9\u06e7\3\2\2\2\u06e9\u06e8\3\2\2\2\u06ea\u015d\3\2\2\2\u06eb"+ + "\u06ec\7V\2\2\u06ec\u06f2\7j\2\2\u06ed\u06ee\5\u0160\u00b1\2\u06ee\u06ef"+ + "\5\u0170\u00b9\2\u06ef\u06f1\3\2\2\2\u06f0\u06ed\3\2\2\2\u06f1\u06f4\3"+ + "\2\2\2\u06f2\u06f0\3\2\2\2\u06f2\u06f3\3\2\2\2\u06f3\u06f5\3\2\2\2\u06f4"+ + "\u06f2\3\2\2\2\u06f5\u06f6\7k\2\2\u06f6\u015f\3\2\2\2\u06f7\u06f8\5\u00e4"+ + "s\2\u06f8\u06f9\5\u00c2b\2\u06f9\u06fc\3\2\2\2\u06fa\u06fc\5\u0164\u00b3"+ + "\2\u06fb\u06f7\3\2\2\2\u06fb\u06fa\3\2\2\2\u06fc\u06fe\3\2\2\2\u06fd\u06ff"+ + "\5\u0162\u00b2\2\u06fe\u06fd\3\2\2\2\u06fe\u06ff\3\2\2\2\u06ff\u0161\3"+ + "\2\2\2\u0700\u0701\t\24\2\2\u0701\u0163\3\2\2\2\u0702\u0704\7\u0089\2"+ + "\2\u0703\u0702\3\2\2\2\u0703\u0704\3\2\2\2\u0704\u0705\3\2\2\2\u0705\u0706"+ + "\5\u012c\u0097\2\u0706\u0165\3\2\2\2\u0707\u0708\7l\2\2\u0708\u0709\5"+ + "\u00a4S\2\u0709\u070a\7m\2\2\u070a\u0167\3\2\2\2\u070b\u070c\7r\2\2\u070c"+ + "\u070d\7h\2\2\u070d\u070e\5\u00c2b\2\u070e\u070f\7i\2\2\u070f\u0169\3"+ + "\2\2\2\u0710\u071f\7h\2\2\u0711\u0718\5\u00e6t\2\u0712\u0715\5\u0146\u00a4"+ + "\2\u0713\u0714\7o\2\2\u0714\u0716\5\u00e6t\2\u0715\u0713\3\2\2\2\u0715"+ + "\u0716\3\2\2\2\u0716\u0718\3\2\2\2\u0717\u0711\3\2\2\2\u0717\u0712\3\2"+ + "\2\2\u0718\u071a\3\2\2\2\u0719\u071b\7v\2\2\u071a\u0719\3\2\2\2\u071a"+ + "\u071b\3\2\2\2\u071b\u071d\3\2\2\2\u071c\u071e\7o\2\2\u071d\u071c\3\2"+ + "\2\2\u071d\u071e\3\2\2\2\u071e\u0720\3\2\2\2\u071f\u0717\3\2\2\2\u071f"+ + "\u0720\3\2\2\2\u0720\u0721\3\2\2\2\u0721\u0722\7i\2\2\u0722\u016b\3\2"+ + "\2\2\u0723\u0724\5\u0146\u00a4\2\u0724\u0725\7r\2\2\u0725\u0726\7g\2\2"+ + "\u0726\u016d\3\2\2\2\u0727\u0728\5\u00c2b\2\u0728\u016f\3\2\2\2\u0729"+ + "\u072e\7p\2\2\u072a\u072e\7\2\2\3\u072b\u072e\7\u00a1\2\2\u072c\u072e"+ + "\6\u00b9\24\2\u072d\u0729\3\2\2\2\u072d\u072a\3\2\2\2\u072d\u072b\3\2"+ + "\2\2\u072d\u072c\3\2\2\2\u072e\u0171\3\2\2\2\u00bd\u0180\u0185\u018c\u0196"+ "\u019c\u01a2\u01b2\u01b6\u01bf\u01cb\u01cf\u01d5\u01de\u01e8\u01f9\u0207"+ "\u020b\u0212\u021a\u0223\u0243\u024b\u0263\u0276\u0285\u0292\u029b\u02a9"+ "\u02b2\u02be\u02d3\u02da\u02df\u02e4\u02ee\u02f1\u02f5\u02f9\u0301\u0309"+ "\u030e\u0316\u0318\u031d\u0324\u032c\u032f\u0335\u033a\u033c\u033f\u0346"+ "\u034b\u035e\u0366\u036a\u036d\u0373\u0377\u037a\u0384\u038b\u0392\u039e"+ "\u03a4\u03ab\u03b0\u03b6\u03c2\u03c8\u03cc\u03d4\u03d8\u03de\u03e1\u03e7"+ - "\u03ec\u0400\u0423\u0425\u043c\u0444\u044f\u0456\u045d\u0467\u0475\u048b"+ - "\u048d\u0495\u0499\u049d\u04a0\u04a9\u04af\u04b9\u04c1\u04c7\u04d0\u04db"+ - "\u04e6\u04ea\u04ec\u04f7\u0500\u0504\u0507\u050e\u0519\u0523\u0529\u052b"+ - "\u0535\u053f\u0543\u0547\u054b\u0552\u055a\u0565\u0569\u056d\u0579\u057d"+ - "\u0581\u0586\u058d\u0594\u05a8\u05ac\u05b0\u05b4\u05c4\u05ca\u05cc\u05d0"+ - "\u05d4\u05d7\u05db\u05dd\u05e3\u05eb\u05f0\u05fb\u0601\u0608\u0613\u0618"+ - "\u061c\u0621\u0625\u062d\u0635\u063a\u063d\u0645\u064d\u0652\u0656\u065a"+ - "\u0661\u067e\u0689\u068d\u0695\u0699\u069b\u06a3\u06ac\u06b4\u06b9\u06c9"+ - "\u06cb\u06d4\u06da\u06e0\u06e4\u06ed\u06f6\u06f9\u06fe\u0710\u0712\u0715"+ - "\u0718\u071a\u0728"; + "\u03ec\u0405\u0428\u042a\u0441\u0449\u0454\u045b\u0462\u046c\u047a\u0490"+ + "\u0492\u049a\u049e\u04a2\u04a5\u04ae\u04b4\u04be\u04c6\u04cc\u04d5\u04e0"+ + "\u04eb\u04ef\u04f1\u04fc\u0505\u0509\u050c\u0513\u051e\u0528\u052e\u0530"+ + "\u053a\u0544\u0548\u054c\u0550\u0557\u055f\u056a\u056e\u0572\u057e\u0582"+ + "\u0586\u058b\u0592\u0599\u05ad\u05b1\u05b5\u05b9\u05c9\u05cf\u05d1\u05d5"+ + "\u05d9\u05dc\u05e0\u05e2\u05e8\u05f0\u05f5\u0600\u0606\u060d\u0618\u061d"+ + "\u0621\u0626\u062a\u0632\u063a\u063f\u0642\u064a\u0652\u0657\u065b\u065f"+ + "\u0666\u0683\u068e\u0692\u069a\u069e\u06a0\u06a8\u06b1\u06b9\u06be\u06ce"+ + "\u06d0\u06d9\u06df\u06e5\u06e9\u06f2\u06fb\u06fe\u0703\u0715\u0717\u071a"+ + "\u071d\u071f\u072d"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { @@ -13621,4 +13655,4 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); } } -} \ No newline at end of file +} diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index eade596c2..27688feeb 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,4 +1,3 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -697,6 +696,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitMulExpr(GobraParser.MulExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLet(GobraParser.LetContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1523,4 +1529,4 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitEos(GobraParser.EosContext ctx) { return visitChildren(ctx); } -} \ No newline at end of file +} diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index cc614dff8..79f5cf002 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,4 +1,3 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -617,6 +616,13 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitMulExpr(GobraParser.MulExprContext ctx); + /** + * Visit a parse tree produced by the {@code let} + * labeled alternative in {@link GobraParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLet(GobraParser.LetContext ctx); /** * Visit a parse tree produced by the {@code relExpr} * labeled alternative in {@link GobraParser#expression}. @@ -1342,4 +1348,4 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitEos(GobraParser.EosContext ctx); -} \ No newline at end of file +} diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index 2b3a976d0..dcc5c3a65 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -571,6 +571,10 @@ case class PUnfolding(pred: PPredicateAccess, op: PExpression) extends PActualEx override def nonGhostChildren: Vector[PNode] = Vector(op) } +case class PLet(ass: PShortVarDecl, op: PExpression) extends PGhostExpression with PProofAnnotation with PScope { + override def nonGhostChildren: Vector[PNode] = Vector(op) +} + /** * Represents Go's built-in "make(`T`, `size` ...IntegerType)" function that allocates and initializes * an object of type `T` and returns it. The documentation (https://golang.org/pkg/builtin/#make) gives diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index 05a005354..eaddcec2b 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -493,6 +493,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PGhostEquals(l, r) => showExpr(l) <+> "===" <+> showExpr(r) case PGhostUnequals(l, r) => showExpr(l) <+> "!==" <+> showExpr(r) case POld(e) => "old" <> parens(showExpr(e)) + case PLet(ass, op) => "let" <+> showStmt(ass) <+> "in" <+> showExpr(op) case PLabeledOld(l, e) => "old" <> brackets(l.name) <> parens(showExpr(e)) case PBefore(e) => "before" <> parens(showExpr(e)) case PConditional(cond, thn, els) => showSubExpr(expr, cond) <> "?" <> showSubExpr(expr, thn) <> ":" <> showSubExpr(expr, els) diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index 14cdf66bb..b22e0e539 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -459,6 +459,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter def showExpr(e: Expr): Doc = updatePositionStore(e) <> (e match { case Unfolding(acc, exp) => "unfolding" <+> showAss(acc) <+> "in" <+> showExpr(exp) + case Let(left, right, exp) => "let" <+> showVar(left) <+> "==" <+> parens(showExpr(right)) <+> "in" <+> showExpr(exp) + case Old(op, _) => "old" <> parens(showExpr(op)) case LabeledOld(label, operand) => "old" <> brackets(showProxy(label)) <> parens(showExpr(operand)) diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index 00818fc75..7a5cca0c6 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -542,6 +542,10 @@ case class Unfolding(acc: Access, in: Expr)(val info: Source.Parser.Info) extend require(typ.addressability == Addressability.unfolding(in.typ.addressability)) } +case class Let(left: LocalVar, right: Expr, in: Expr)(val info: Source.Parser.Info) extends Expr { + override def typ: Type = in.typ +} + case class Old(operand: Expr, typ: Type)(val info: Source.Parser.Info) extends Expr case class LabeledOld(label: LabelProxy, operand: Expr)(val info: Source.Parser.Info) extends Expr { diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 6350a4bff..d2b0c82bd 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -2622,6 +2622,14 @@ object Desugar { val dOp = pureExprD(ctx, info)(op) unit(in.Unfolding(dAcc, dOp)(src)) + case PLet(ass, op) => + val dOp = pureExprD(ctx, info)(op) + unit((ass.left zip ass.right).foldRight(dOp)((lr, letop) => { + val right = pureExprD(ctx, info)(lr._2) + val left = in.LocalVar(nm.variable(lr._1.name, info.scope(lr._1), info), right.typ.withAddressability(Addressability.exclusiveVariable))(src) + in.Let(left, right, letop)(src) + })) + case n : PIndexedExp => indexedExprD(n)(ctx, info) case PSliceExp(base, low, high, cap) => for { diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 2cd533b66..3b3dc04c3 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -1615,6 +1615,12 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole val op = visitNode[PExpression](ctx.expression()) PUnfolding(pred, op).at(ctx) } + + override def visitLet(ctx: LetContext): PLet = { + val ass = visitNode[PShortVarDecl](ctx.shortVarDecl()) + val op = visitNode[PExpression](ctx.expression()) + PLet(ass, op).at(ctx) + } //endregion //region Statements diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index f422a8f91..d701e360e 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -75,6 +75,9 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case n: PClosureImplements => isPureExpr(n.closure) ++ wellDefIfClosureMatchesSpec(n.closure, n.spec) + case n: PLet => isExpr(n.op).out ++ isPureExpr(n.op) ++ + n.ass.right.foldLeft(noMessages)((a, b) => a ++ isPureExpr(b)) + case n: PAccess => val permWellDef = error(n.perm, s"expected perm or integer division expression, but got ${n.perm}", !assignableTo(typ(n.perm), PermissionT)) @@ -237,6 +240,8 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case n: PImplication => exprType(n.right) // implication is assertion or boolean iff its right side is + case n: PLet => exprType(n.op) + case _: PAccess | _: PPredicateAccess | _: PMagicWand => AssertionT case _: PClosureImplements => BooleanT @@ -410,6 +415,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => }) case _: PUnfolding => true + case _: PLet => true // the well-definedness check makes sure that both sub-expressions are pure. case _: POld | _: PLabeledOld | _: PBefore => true case _: PForall => true case _: PExists => true diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala index d2fdec5b9..46c9b13d6 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala @@ -54,6 +54,13 @@ class AssertionEncoding extends Encoding { case Seq() => newExists case errors => Violation.violation(s"invalid trigger pattern (${errors.head.readableMessage})") } + + case let: in.Let => + for { + exp <- ctx.expression(let.in) + l = ctx.variable(let.left) + r <- ctx.expression(let.right) + } yield withSrc(vpr.Let(l, r, exp), let) } override def assertion(ctx: Context): in.Assertion ==> CodeWriter[vpr.Exp] = { diff --git a/src/test/resources/regressions/features/let/let_fail1.gobra b/src/test/resources/regressions/features/let/let_fail1.gobra new file mode 100644 index 000000000..8687fc7e1 --- /dev/null +++ b/src/test/resources/regressions/features/let/let_fail1.gobra @@ -0,0 +1,29 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +pure func f(x *int) bool { + //:: ExpectedOutput(type_error) + return let y := *x in &y == x +} + +pure func g1(x *int) int { + //:: ExpectedOutput(type_error) + return let y := h(x) in y +} + +pure func g2(x *int) int { + //:: ExpectedOutput(type_error) + return let y := x in h(y) +} + +pure func g3(x *int) int { + //:: ExpectedOutput(type_error) + return let y, z := 1, h(x) in y +} + +func h(x *int) int { + *x += 1 + return *x +} diff --git a/src/test/resources/regressions/features/let/let_simple.gobra b/src/test/resources/regressions/features/let/let_simple.gobra new file mode 100644 index 000000000..030bb432d --- /dev/null +++ b/src/test/resources/regressions/features/let/let_simple.gobra @@ -0,0 +1,34 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +ghost +pure func f(x int) int { + return let y,z := x + 1,x+2 in let y := y + x in y + z +} + +ghost +ensures res == 3 * x + 3 +func g(x int) (res int) { + return f(x) +} + + +type A struct { + x *int +} + +pred (a *A) Mem() { + acc(&a.x) && acc(a.x) +} + +requires a.Mem() +ensures a.Mem() +ensures let y := unfolding a.Mem() in *(a.x) in y > 0 && y < 4 && y != 2 +func (a *A) g(x int) { + unfold a.Mem() + *a.x = 3 + fold a.Mem() +} + From e498930d379d41167814aee92c530271efc11efa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Fri, 10 Feb 2023 23:14:54 +0100 Subject: [PATCH 092/296] Fix issue 621 (#622) * Fix 621 * fix identation --- .../typing/ghost/GhostExprTyping.scala | 1 - .../encodings/arrays/ArrayEncoding.scala | 7 ++++++- .../arrays/SharedArrayComponentImpl.scala | 4 +++- .../encodings/combinators/TypeEncoding.scala | 4 ---- .../defaults/DefaultGlobalVarEncoding.scala | 1 + .../encodings/sequences/SequenceEncoding.scala | 1 + .../encodings/slices/SliceEncoding.scala | 1 + .../encodings/structs/StructEncoding.scala | 1 + .../library/embeddings/EmbeddingComponent.scala | 4 +--- .../viper/gobra/translator/util/ViperUtil.scala | 4 ++++ .../resources/regressions/issues/000621.gobra | 15 +++++++++++++++ 11 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 src/test/resources/regressions/issues/000621.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index d701e360e..a49c58c22 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -15,7 +15,6 @@ import viper.gobra.frontend.info.base.Type import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.BaseTyping -import viper.gobra.util.TypeBounds import viper.gobra.util.Violation.violation import scala.annotation.unused diff --git a/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala index e31682f55..3ad28b2a8 100644 --- a/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala @@ -17,8 +17,10 @@ import viper.gobra.translator.encodings.combinators.TypeEncoding import viper.gobra.translator.context.Context import viper.gobra.translator.library.embeddings.EmbeddingParameter import viper.gobra.translator.util.FunctionGenerator +import viper.gobra.translator.util.ViperUtil.synthesized import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.util.Violation +import viper.silver.plugin.standard.termination import viper.silver.{ast => vpr} import scala.annotation.unused @@ -318,7 +320,10 @@ class ArrayEncoding extends TypeEncoding with SharedArrayEmbedding { name = s"${Names.arrayConversionFunc}_${t.serialize}", formalArgs = Vector(variable(ctx)(x)), typ = vResultType, - pres = Vector(pure(addressFootprint(ctx)(x, in.WildcardPerm(Source.Parser.Internal)))(ctx).res), + pres = Vector( + pure(addressFootprint(ctx)(x, in.WildcardPerm(Source.Parser.Internal)))(ctx).res, + synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate") + ), posts = Vector(post), body = None )() diff --git a/src/main/scala/viper/gobra/translator/encodings/arrays/SharedArrayComponentImpl.scala b/src/main/scala/viper/gobra/translator/encodings/arrays/SharedArrayComponentImpl.scala index ef71fae04..49adc4b88 100644 --- a/src/main/scala/viper/gobra/translator/encodings/arrays/SharedArrayComponentImpl.scala +++ b/src/main/scala/viper/gobra/translator/encodings/arrays/SharedArrayComponentImpl.scala @@ -15,7 +15,9 @@ import viper.gobra.translator.context.Context import viper.gobra.translator.library.embeddings.EmbeddingComponent import viper.gobra.translator.Names import viper.gobra.translator.util.FunctionGenerator +import viper.gobra.translator.util.ViperUtil.synthesized import viper.gobra.translator.util.ViperWriter.CodeLevel.pure +import viper.silver.plugin.standard.termination class SharedArrayComponentImpl extends SharedArrayComponent { @@ -48,7 +50,7 @@ class SharedArrayComponentImpl extends SharedArrayComponent { name = s"${Names.arrayNilFunc}_${t.serialize}", formalArgs = Seq.empty, typ = vResType, - pres = Seq.empty, + pres = Seq(synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate")), posts = Vector(vpr.EqCmp(ctx.array.len(vpr.Result(vResType)())(), vpr.IntLit(1)())(), forall), body = None )() diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala index a64938693..b130a0c2a 100644 --- a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala @@ -443,8 +443,4 @@ trait TypeEncoding extends Generator { val (pos, info, errT) = src.vprMeta node(pos, info, errT)(ctx) } - - /** Adds simple (source) information to a node without source information. */ - protected def synthesized[T](node: (vpr.Position, vpr.Info, vpr.ErrorTrafo) => T)(comment: String): T = - node(vpr.NoPosition, vpr.SimpleInfo(Seq(comment)), vpr.NoTrafos) } diff --git a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala index 213f5a48a..deb066545 100644 --- a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultGlobalVarEncoding.scala @@ -10,6 +10,7 @@ import org.bitbucket.inkytonik.kiama.==> import viper.gobra.ast.{internal => in} import viper.gobra.translator.context.Context import viper.gobra.translator.encodings.combinators.Encoding +import viper.gobra.translator.util.ViperUtil.synthesized import viper.gobra.translator.util.ViperWriter.MemberLevel.unit import viper.gobra.translator.util.ViperWriter.MemberWriter import viper.silver.{ast => vpr} diff --git a/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala index 15025880b..b622f9df3 100644 --- a/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala @@ -14,6 +14,7 @@ import viper.gobra.translator.Names import viper.gobra.translator.encodings.combinators.LeafTypeEncoding import viper.gobra.translator.context.Context import viper.gobra.translator.util.FunctionGenerator +import viper.gobra.translator.util.ViperUtil.synthesized import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.util.Violation import viper.silver.{ast => vpr} diff --git a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala index 9d3b8c4b0..6171920e1 100644 --- a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala @@ -17,6 +17,7 @@ import viper.gobra.translator.encodings.arrays.SharedArrayEmbedding import viper.gobra.translator.encodings.combinators.LeafTypeEncoding import viper.gobra.translator.context.Context import viper.gobra.translator.util.FunctionGenerator +import viper.gobra.translator.util.ViperUtil.synthesized import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.util.Violation import viper.silver.verifier.{errors => err} diff --git a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala index c4ad369c6..92dbc3360 100644 --- a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala @@ -14,6 +14,7 @@ import viper.gobra.translator.Names import viper.gobra.translator.encodings.combinators.TypeEncoding import viper.gobra.translator.context.Context import viper.gobra.translator.util.FunctionGenerator +import viper.gobra.translator.util.ViperUtil.synthesized import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.util.Violation import viper.silver.{ast => vpr} diff --git a/src/main/scala/viper/gobra/translator/library/embeddings/EmbeddingComponent.scala b/src/main/scala/viper/gobra/translator/library/embeddings/EmbeddingComponent.scala index 59f12f64a..fcce1a174 100644 --- a/src/main/scala/viper/gobra/translator/library/embeddings/EmbeddingComponent.scala +++ b/src/main/scala/viper/gobra/translator/library/embeddings/EmbeddingComponent.scala @@ -9,6 +9,7 @@ package viper.gobra.translator.library.embeddings import viper.gobra.translator.Names import viper.gobra.translator.context.Context import viper.gobra.translator.library.Generator +import viper.gobra.translator.util.ViperUtil.synthesized import viper.silver.{ast => vpr} import viper.silver.plugin.standard.termination @@ -149,7 +150,4 @@ object EmbeddingComponent { genUnboxFuncMap += (id -> unbox) } } - - private def synthesized[T](node: (vpr.Position, vpr.Info, vpr.ErrorTrafo) => T)(comment: String): T = - node(vpr.NoPosition, vpr.SimpleInfo(Seq(comment)), vpr.NoTrafos) } diff --git a/src/main/scala/viper/gobra/translator/util/ViperUtil.scala b/src/main/scala/viper/gobra/translator/util/ViperUtil.scala index 169911348..7a4abf539 100644 --- a/src/main/scala/viper/gobra/translator/util/ViperUtil.scala +++ b/src/main/scala/viper/gobra/translator/util/ViperUtil.scala @@ -104,4 +104,8 @@ object ViperUtil { s.reduceWithContext(Nil, addDecls, combineResults) } + + /** Adds simple (source) information to a node without source information. */ + def synthesized[T](node: (Position, Info, ErrorTrafo) => T)(comment: String): T = + node(NoPosition, SimpleInfo(Seq(comment)), NoTrafos) } diff --git a/src/test/resources/regressions/issues/000621.gobra b/src/test/resources/regressions/issues/000621.gobra new file mode 100644 index 000000000..dd1bd55df --- /dev/null +++ b/src/test/resources/regressions/issues/000621.gobra @@ -0,0 +1,15 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type A struct { + x [3]int +} + +ghost +requires acc(&a.x) +decreases +pure func f(a *A) int { + return let x := a.x in x[0] +} From 0db5290866ebbaa66140fc7fd4d901b901ee45a8 Mon Sep 17 00:00:00 2001 From: ArquintL Date: Fri, 17 Feb 2023 15:45:54 +0000 Subject: [PATCH 093/296] Updates submodules --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 804d63f5b..39fc07d23 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 804d63f5bcda1968cce60f493cf9bb7dfc2912ff +Subproject commit 39fc07d2309da1aef84960b611bd0d3a0b5cffb2 From 6018725428a4bbf00cfe9e5e2e0e6e93149fe813 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 17 Feb 2023 18:40:15 +0100 Subject: [PATCH 094/296] fixes a compiler error caused by a recent change in ViperServer --- src/main/scala/viper/gobra/backend/ViperBackends.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index a306f1573..b4bacc2d1 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -10,6 +10,7 @@ import viper.gobra.frontend.Config import viper.gobra.util.GobraExecutionContext import viper.server.ViperConfig import viper.server.core.ViperCoreServer +import viper.server.vsi.DefaultVerificationServerStart trait ViperBackend { def create(exePaths: Vector[String], config: Config)(implicit executor: GobraExecutionContext): ViperVerifier @@ -79,7 +80,7 @@ object ViperBackends { serverConfig = serverConfig.appendedAll(List("--cacheFile", config.cacheFile.get.toString)) } - val createdServer = new ViperCoreServer(new ViperConfig(serverConfig))(executionContext) + val createdServer = new ViperCoreServer(new ViperConfig(serverConfig))(executionContext) with DefaultVerificationServerStart // store server for next time: server = Some(createdServer) createdServer From fe9aaf00359d5dc5dca13a88d6f044a0b44215a6 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Sun, 19 Feb 2023 17:06:25 +0100 Subject: [PATCH 095/296] Updates submodules (#627) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 39fc07d23..481c80914 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 39fc07d2309da1aef84960b611bd0d3a0b5cffb2 +Subproject commit 481c80914609a030bd3d71c1bdf1d6d62d689c8a From 5cf6a71ce4c73d3d4aaac057ba7d7c3fa4a5768e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 20 Feb 2023 13:17:23 +0100 Subject: [PATCH 096/296] Add `--conditionalizePermissions` (#628) * add --conditionalizePermissions * fix confusion with names --- .../viper/gobra/backend/ViperBackends.scala | 3 +++ .../scala/viper/gobra/frontend/Config.scala | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index b4bacc2d1..ff526dbdc 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -24,6 +24,9 @@ object ViperBackends { var options: Vector[String] = Vector.empty options ++= Vector("--logLevel", "ERROR") options ++= Vector("--disableCatchingExceptions") + if (config.conditionalizePermissions) { + options ++= Vector("--conditionalizePermissions") + } if (!config.disableMoreCompleteExhale) { options ++= Vector("--enableMoreCompleteExhale") } diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index d4309c30b..51da14019 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -63,6 +63,7 @@ object ConfigDefaults { lazy val DefaultTaskName: String = "gobra-task" lazy val DefaultAssumeInjectivityOnInhale: Boolean = true lazy val DefaultParallelizeBranches: Boolean = false + lazy val DefaultConditionalizePermissions: Boolean = false lazy val DefaultDisableMoreCompleteExhale: Boolean = false lazy val DefaultEnableLazyImports: Boolean = false lazy val DefaultNoVerify: Boolean = false @@ -113,6 +114,7 @@ case class Config( // if enabled, and if the chosen backend is either SILICON or VSWITHSILICON, // branches will be verified in parallel parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, + conditionalizePermissions: Boolean = ConfigDefaults.DefaultConditionalizePermissions, disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, @@ -157,6 +159,7 @@ case class Config( onlyFilesWithHeader = onlyFilesWithHeader || other.onlyFilesWithHeader, assumeInjectivityOnInhale = assumeInjectivityOnInhale || other.assumeInjectivityOnInhale, parallelizeBranches = parallelizeBranches, + conditionalizePermissions = conditionalizePermissions, disableMoreCompleteExhale = disableMoreCompleteExhale, enableLazyImports = enableLazyImports || other.enableLazyImports, noVerify = noVerify || other.noVerify, @@ -206,6 +209,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector onlyFilesWithHeader: Boolean = ConfigDefaults.DefaultOnlyFilesWithHeader, assumeInjectivityOnInhale: Boolean = ConfigDefaults.DefaultAssumeInjectivityOnInhale, parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, + conditionalizePermissions: Boolean = ConfigDefaults.DefaultConditionalizePermissions, disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, @@ -259,6 +263,7 @@ trait RawConfig { onlyFilesWithHeader = baseConfig.onlyFilesWithHeader, assumeInjectivityOnInhale = baseConfig.assumeInjectivityOnInhale, parallelizeBranches = baseConfig.parallelizeBranches, + conditionalizePermissions = baseConfig.conditionalizePermissions, disableMoreCompleteExhale = baseConfig.disableMoreCompleteExhale, enableLazyImports = baseConfig.enableLazyImports, noVerify = baseConfig.noVerify, @@ -597,6 +602,15 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) + val conditionalizePermissions: ScallopOption[Boolean] = opt[Boolean]( + name = "conditionalizePermissions", + descr = "Experimental: if enabled, and if the chosen backend is either SILICON or VSWITHSILICON, silicon will try " + + "to reduce the number of symbolic execution paths by conditionalising permission expressions. " + + "E.g. \"b ==> acc(x.f, p)\" is rewritten to \"acc(x.f, b ? p : none)\".", + default = Some(ConfigDefaults.DefaultConditionalizePermissions), + short = 'c', + ) + val disableMoreCompleteExhale: ScallopOption[Boolean] = opt[Boolean]( name = "disableMoreCompleteExhale", descr = "Disables the flag --enableMoreCompleteExhale passed by default to Silicon", @@ -662,6 +676,15 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals } } + addValidation { + val conditionalizePermissionsOn = conditionalizePermissions.toOption.contains(true) + if (conditionalizePermissionsOn && !isSiliconBasedBackend) { + Left("The selected backend does not support --conditionalizePermissions.") + } else { + Right(()) + } + } + // `disableMoreCompleteExhale` can only be enabled when using a silicon-based backend addValidation { val disableMoreCompleteExh = disableMoreCompleteExhale.toOption.contains(true) @@ -757,6 +780,7 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals onlyFilesWithHeader = onlyFilesWithHeader(), assumeInjectivityOnInhale = assumeInjectivityOnInhale(), parallelizeBranches = parallelizeBranches(), + conditionalizePermissions = conditionalizePermissions(), disableMoreCompleteExhale = disableMoreCompleteExhale(), enableLazyImports = enableLazyImports(), noVerify = noVerify(), From dd1fc3c0f6394bc4731aa244c335dcaa5967b246 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 20 Feb 2023 18:04:02 +0100 Subject: [PATCH 097/296] add flag to viperserver --- src/main/scala/viper/gobra/backend/ViperBackends.scala | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index ff526dbdc..53692e770 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -109,6 +109,9 @@ object ViperBackends { if (config.parallelizeBranches) { options ++= Vector("--parallelizeBranches") } + if (config.conditionalizePermissions) { + options ++= Vector("--conditionalizePermissions") + } options ++= exePaths ViperServerConfig.ConfigWithSilicon(options.toList) } From a9174e3e8f351e90794436dcd2b18299a09951db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 1 Mar 2023 10:41:50 +0100 Subject: [PATCH 098/296] Allow go calls of closures (#615) * backup * Undo #607 * backup * remove test pushed by mistake * add fix and tests * Fix identation test * remove println --- .../gobra/ast/internal/PrettyPrinter.scala | 6 ++++ .../viper/gobra/ast/internal/Program.scala | 1 + .../scala/viper/gobra/frontend/Desugar.scala | 7 ++++ .../gobra/frontend/ParseTreeTranslator.scala | 2 +- .../encodings/closures/ClosureEncoding.scala | 2 ++ .../closures/ClosureSpecsEncoder.scala | 33 +++++++++++++++++-- .../go-routines-closures-fail1.gobra | 22 +++++++++++++ .../go_routines/go-routines-closures1.gobra | 23 +++++++++++++ 8 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/test/resources/regressions/features/go_routines/go-routines-closures-fail1.gobra create mode 100644 src/test/resources/regressions/features/go_routines/go-routines-closures1.gobra diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index b22e0e539..4d0cc0040 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -330,6 +330,9 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case GoMethodCall(recv, meth, args) => "go" <+> showExpr(recv) <> "." <> meth.name <> parens(showExprList(args)) + case GoClosureCall(closure, args, spec) => + "go" <+> showExpr(closure) <> parens(showExprList(args)) <+> "as" <+> showClosureSpec(spec) + case s: Defer => "defer" <+> showStmt(s.stmt) case Return() => "return" @@ -756,6 +759,9 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter { case GoMethodCall(recv, meth, args) => "go" <+> showExpr(recv) <> "." <> meth.name <> parens(showExprList(args)) + case GoClosureCall(closure, args, spec) => + "go" <+> showExpr(closure) <> parens(showExprList(args)) <+> "as" <+> showClosureSpec(spec) + case s: Defer => "defer" <+> showStmt(s.stmt) case Return() => "return" diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index 7a5cca0c6..a23f14046 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -416,6 +416,7 @@ case class ClosureCall(targets: Vector[LocalVar], closure: Expr, args: Vector[Ex case class GoFunctionCall(func: FunctionProxy, args: Vector[Expr])(val info: Source.Parser.Info) extends Stmt case class GoMethodCall(recv: Expr, meth: MethodProxy, args: Vector[Expr])(val info: Source.Parser.Info) extends Stmt +case class GoClosureCall(closure: Expr, args: Vector[Expr], spec: ClosureSpec)(val info: Source.Parser.Info) extends Stmt sealed trait Deferrable extends Stmt case class Defer(stmt: Deferrable)(val info: Source.Parser.Info) extends Stmt diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index d2b0c82bd..cc107c5d7 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -1738,6 +1738,13 @@ object Desugar { in.GoMethodCall(call.recv, call.meth, call.args)(src) case _ => unexpectedExprError(exp) } + case Some(_: ap.ClosureCall) => + closureCallDAux(ctx, info)(inv)(src) map { + case Left((_, call: in.ClosureCall)) => + in.GoClosureCall(call.closure, call.args, call.spec)(src) + case Right(call: in.PureClosureCall) => + in.GoClosureCall(call.closure, call.args, call.spec)(src) + } case _ => unexpectedExprError(exp) } case _ => unexpectedExprError(exp) diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 3b3dc04c3..73425dd07 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -1138,7 +1138,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole override def visitFunctionLit(ctx: FunctionLitContext): PFunctionLit = { visitChildren(ctx) match { case Vector(spec: PFunctionSpec, (id: Option[PIdnDef@unchecked], args: Vector[PParameter@unchecked], result: PResult, body: Option[(PBodyParameterInfo, PBlock)@unchecked])) => - PFunctionLit(id, PClosureDecl(args, result, spec, body)) + PFunctionLit(id, PClosureDecl(args, result, spec, body).at(spec)) } } diff --git a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureEncoding.scala index f32d7a754..31e0047a7 100644 --- a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureEncoding.scala @@ -85,6 +85,8 @@ class ClosureEncoding extends LeafTypeEncoding { override def statement(ctx: Context): in.Stmt ==> CodeWriter[vpr.Stmt] = default(super.statement(ctx)) { case c: in.ClosureCall => specs.closureCall(c)(ctx) + case c: in.GoClosureCall => specs.goClosureCall(c)(ctx) + case p: in.SpecImplementationProof => specImplementationProof(p)(ctx) } diff --git a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala index 5dbb2e0b3..3a35fcd57 100644 --- a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala +++ b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala @@ -9,13 +9,15 @@ package viper.gobra.translator.encodings.closures import viper.gobra.ast.internal.FunctionLikeMemberOrLit import viper.gobra.ast.{internal => in} import viper.gobra.reporting.BackTranslator.ErrorTransformer -import viper.gobra.reporting.{PreconditionError, Source, SpecNotImplementedByClosure} +import viper.gobra.reporting.{GoCallPreconditionReason, PreconditionError, Source, SpecNotImplementedByClosure} import viper.gobra.theory.Addressability import viper.gobra.translator.Names import viper.gobra.translator.context.Context -import viper.gobra.translator.util.ViperWriter.CodeLevel.errorT +import viper.gobra.translator.util.ViperUtil +import viper.gobra.translator.util.ViperWriter.CodeLevel.{errorT, fromMemberLevel, sequence} import viper.gobra.translator.util.ViperWriter.MemberKindCompanion.ErrorT import viper.gobra.translator.util.ViperWriter.{CodeWriter, MemberWriter} +import viper.gobra.util.Violation import viper.silver.verifier.{reasons, errors => vprerr} import viper.silver.{ast => vpr} @@ -81,6 +83,31 @@ protected class ClosureSpecsEncoder { } yield exp } + def goClosureCall(c: in.GoClosureCall)(ctx: Context): CodeWriter[vpr.Stmt] = { + import viper.silver.verifier.{errors => err} + + register(c.spec)(ctx, c.spec.info) + val (pos, info, errT) = c.vprMeta + for { + member <- fromMemberLevel(callableMemberWithClosure(c.spec)(ctx)) + args = closureCallArgs(c.closure, c.args, c.spec)(ctx) + vprargs <- sequence(args map ctx.expression) + (pres, formalParamDecls) = member match { + case f: vpr.Function => (f.pres, f.formalArgs) + case m: vpr.Method => (m.pres, m.formalArgs) + case e => Violation.violation(s"expected a function or method, but found $e instead.") + } + formalParams = formalParamDecls.map(_.localVar) + substitutions = (formalParams zip vprargs).toMap + instantiatedPres = pres.map(_.replace(substitutions)) + and = ViperUtil.bigAnd(instantiatedPres)(pos, info, errT) + exhale = vpr.Exhale(and)(pos, info, errT) + _ <- errorT { + case err.ExhaleFailed(Source(info), _, _) => PreconditionError(info).dueTo(GoCallPreconditionReason(info)) + } + } yield exhale + } + def finalize(addMemberFn: vpr.Member => Unit): Unit = { genMembers foreach { m => addMemberFn(m.res) } } @@ -114,7 +141,7 @@ protected class ClosureSpecsEncoder { specsSeen += ((spec.func, spec.params.keySet)) val implementsF = implementsFunction(spec)(ctx, info) val callable = callableMemberWithClosure(spec)(ctx) - errorTransformers = callable.sum.collect{ case ErrorT(t) => t }.toVector + errorTransformers = callable.sum.collect { case ErrorT(t) => t } genDomFuncs :+= implementsF genMembers :+= callable } diff --git a/src/test/resources/regressions/features/go_routines/go-routines-closures-fail1.gobra b/src/test/resources/regressions/features/go_routines/go-routines-closures-fail1.gobra new file mode 100644 index 000000000..8462a3d18 --- /dev/null +++ b/src/test/resources/regressions/features/go_routines/go-routines-closures-fail1.gobra @@ -0,0 +1,22 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +func intSeq() { + i@ := 0 + tmp := + preserves acc(&i, 1/10) + func f() int { + return i + } + // The following fails because there is no proof that tmp implements spec{&i} + //:: ExpectedOutput(precondition_error:go_call_precondition_error) + go tmp() as spec{&i} + return +} + +preserves acc(x, 1/2) +func spec(x *int) int { + return *x +} diff --git a/src/test/resources/regressions/features/go_routines/go-routines-closures1.gobra b/src/test/resources/regressions/features/go_routines/go-routines-closures1.gobra new file mode 100644 index 000000000..b1f8e0bcf --- /dev/null +++ b/src/test/resources/regressions/features/go_routines/go-routines-closures1.gobra @@ -0,0 +1,23 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +func intSeq() { + i@ := 0 + tmp := + preserves acc(&i, 1/10) + func f() int { + return i + } + proof tmp implements spec{&i} { + return tmp() as f{} + } + go tmp() as spec{&i} + return +} + +preserves acc(x, 1/2) +func spec(x *int) int { + return *x +} From 844f5e72059821d1b109a80a2ce68aacdf227c28 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Fri, 3 Mar 2023 22:03:26 +0100 Subject: [PATCH 099/296] Updates submodules (#631) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 481c80914..d5d38d628 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 481c80914609a030bd3d71c1bdf1d6d62d689c8a +Subproject commit d5d38d62825e8bf4448c55f589dd8c838f33dc96 From 137e57f1834821bc78bd84d5354b058212240ebf Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Sat, 4 Mar 2023 13:08:42 +0100 Subject: [PATCH 100/296] disable plugins in ViperServer --- src/main/scala/viper/gobra/backend/ViperBackends.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index 53692e770..5726c97d2 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -78,7 +78,7 @@ object ViperBackends { /** returns an existing ViperCoreServer instance or otherwise creates a new one */ protected def getOrCreateServer(config: Config)(executionContext: GobraExecutionContext): ViperCoreServer = { server.getOrElse({ - var serverConfig = List("--logLevel", config.logLevel.levelStr) + var serverConfig = List("--disablePlugins", "--logLevel", config.logLevel.levelStr) if(config.cacheFile.isDefined) { serverConfig = serverConfig.appendedAll(List("--cacheFile", config.cacheFile.get.toString)) } From 62d634932cccb1116e84779862b7de9e06ff4889 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Sat, 4 Mar 2023 20:22:55 +0100 Subject: [PATCH 101/296] saves on-going work --- src/main/scala/viper/gobra/Gobra.scala | 28 +- .../scala/viper/gobra/frontend/Config.scala | 25 +- .../scala/viper/gobra/frontend/Desugar.scala | 10 +- .../scala/viper/gobra/frontend/Parser.scala | 10 +- .../viper/gobra/frontend/TaskManager.scala | 76 +++ .../viper/gobra/frontend/info/Info.scala | 502 ++++++++++++++++-- .../resolution/MemberResolution.scala | 18 +- 7 files changed, 614 insertions(+), 55 deletions(-) create mode 100644 src/main/scala/viper/gobra/frontend/TaskManager.scala diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index cb9e18620..a391465f8 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -16,6 +16,7 @@ import viper.gobra.ast.frontend.PPackage import viper.gobra.ast.internal.Program import viper.gobra.ast.internal.transform.{CGEdgesTerminationTransform, ConstantPropagation, InternalTransform, OverflowChecksTransform} import viper.gobra.backend.BackendVerifier +import viper.gobra.frontend.info.Info.Context import viper.gobra.frontend.info.{Info, TypeInfo} import viper.gobra.frontend.{Config, Desugar, PackageInfo, Parser, ScallopGobraConfig} import viper.gobra.reporting._ @@ -158,7 +159,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { finalConfig <- getAndMergeInFileConfig(config, pkgInfo) _ = setLogLevel(finalConfig) parsedPackage <- performParsing(pkgInfo, finalConfig) - typeInfo <- performTypeChecking(parsedPackage, finalConfig) + typeInfo <- performTypeChecking(parsedPackage, executor, finalConfig) program <- performDesugaring(parsedPackage, typeInfo, finalConfig) program <- performInternalTransformations(program, finalConfig, pkgInfo) viperTask <- performViperEncoding(program, finalConfig, pkgInfo) @@ -243,16 +244,20 @@ class Gobra extends GoVerifier with GoIdeVerifier { private def performParsing(pkgInfo: PackageInfo, config: Config): Either[Vector[VerifierError], PPackage] = { if (config.shouldParse) { + val startMs = System.currentTimeMillis() val sourcesToParse = config.packageInfoInputMap(pkgInfo) - Parser.parse(sourcesToParse, pkgInfo)(config) + val res = Parser.parse(sourcesToParse, pkgInfo)(config) + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + println(s"parser phase done, took ${durationS}s") + res } else { Left(Vector()) } } - private def performTypeChecking(parsedPackage: PPackage, config: Config): Either[Vector[VerifierError], TypeInfo] = { + private def performTypeChecking(parsedPackage: PPackage, executionContext: GobraExecutionContext, config: Config): Either[Vector[VerifierError], TypeInfo] = { if (config.shouldTypeCheck) { - Info.check(parsedPackage, config.packageInfoInputMap(parsedPackage.info), isMainContext = true)(config) + Info.check(parsedPackage, config.packageInfoInputMap(parsedPackage.info), isMainContext = true, context = new Context(executionContext, config))(config) } else { Left(Vector()) } @@ -260,7 +265,11 @@ class Gobra extends GoVerifier with GoIdeVerifier { private def performDesugaring(parsedPackage: PPackage, typeInfo: TypeInfo, config: Config): Either[Vector[VerifierError], Program] = { if (config.shouldDesugar) { - Right(Desugar.desugar(parsedPackage, typeInfo)(config)) + val startMs = System.currentTimeMillis() + val res = Right(Desugar.desugar(parsedPackage, typeInfo)(config)) + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + println(s"desugaring done, took ${durationS}s") + res } else { Left(Vector()) } @@ -282,18 +291,25 @@ class Gobra extends GoVerifier with GoIdeVerifier { // constant propagation does not cause duplication of verification errors caused // by overflow checks (if enabled) because all overflows in constant declarations // can be found by the well-formedness checks. + val startMs = System.currentTimeMillis() var transformations: Vector[InternalTransform] = Vector(CGEdgesTerminationTransform, ConstantPropagation) if (config.checkOverflows) { transformations :+= OverflowChecksTransform } val result = transformations.foldLeft(program)((prog, transf) => transf.transform(prog)) config.reporter.report(AppliedInternalTransformsMessage(config.packageInfoInputMap(pkgInfo).map(_.name), () => result)) + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + println(s"internal transformations done, took ${durationS}s") Right(result) } private def performViperEncoding(program: Program, config: Config, pkgInfo: PackageInfo): Either[Vector[VerifierError], BackendVerifier.Task] = { if (config.shouldViperEncode) { - Right(Translator.translate(program, pkgInfo)(config)) + val startMs = System.currentTimeMillis() + val res = Right(Translator.translate(program, pkgInfo)(config)) + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + println(s"Viper encoding done, took ${durationS}s") + res } else { Left(Vector()) } diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 51da14019..f9a1c9c59 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -16,6 +16,8 @@ import viper.gobra.backend.{ViperBackend, ViperBackends} import viper.gobra.GoVerifier import viper.gobra.frontend.PackageResolver.FileResource import viper.gobra.frontend.Source.getPackageInfo +import viper.gobra.frontend.info.Info.TypeCheckMode +import viper.gobra.frontend.info.Info.TypeCheckMode.TypeCheckMode import viper.gobra.reporting.{FileWriterReporter, GobraReporter, StdIOReporter} import viper.gobra.util.{TypeBounds, Violation} import viper.silver.ast.SourcePosition @@ -68,6 +70,7 @@ object ConfigDefaults { lazy val DefaultEnableLazyImports: Boolean = false lazy val DefaultNoVerify: Boolean = false lazy val DefaultNoStreamErrors: Boolean = false + lazy val DefaultTypeCheckMode: TypeCheckMode = TypeCheckMode.Parallel } case class Config( @@ -118,7 +121,8 @@ case class Config( disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, - noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors + noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, + typeCheckMode: TypeCheckMode = ConfigDefaults.DefaultTypeCheckMode, ) { def merge(other: Config): Config = { @@ -163,7 +167,8 @@ case class Config( disableMoreCompleteExhale = disableMoreCompleteExhale, enableLazyImports = enableLazyImports || other.enableLazyImports, noVerify = noVerify || other.noVerify, - noStreamErrors = noStreamErrors || other.noStreamErrors + noStreamErrors = noStreamErrors || other.noStreamErrors, + typeCheckMode = typeCheckMode ) } @@ -214,6 +219,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, + typeCheckMode: TypeCheckMode = ConfigDefaults.DefaultTypeCheckMode, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -268,6 +274,7 @@ trait RawConfig { enableLazyImports = baseConfig.enableLazyImports, noVerify = baseConfig.noVerify, noStreamErrors = baseConfig.noStreamErrors, + typeCheckMode = baseConfig.typeCheckMode, ) } @@ -639,6 +646,19 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) + val typeCheckMode: ScallopOption[TypeCheckMode] = choice( + name = "typeCheckMode", + choices = Seq("LAZY", "SEQUENTIAL", "PARALLEL"), + descr = "Specifies the mode in which type-checking is performed.", + default = Some("PARALLEL"), + noshort = true + ).map { + case "LAZY" => TypeCheckMode.Lazy + case "SEQUENTIAL" => TypeCheckMode.Sequential + case "PARALLEL" => TypeCheckMode.Parallel + case _ => ConfigDefaults.DefaultTypeCheckMode + } + /** * Exception handling */ @@ -785,5 +805,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals enableLazyImports = enableLazyImports(), noVerify = noVerify(), noStreamErrors = noStreamErrors(), + typeCheckMode = typeCheckMode(), ) } diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index cc107c5d7..96a372934 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -31,6 +31,7 @@ object Desugar { def desugar(pkg: PPackage, info: viper.gobra.frontend.info.TypeInfo)(config: Config): in.Program = { val importsCollector = new PackageInitSpecCollector // independently desugar each imported package. + val importedDesugaringStartMs = System.currentTimeMillis() val importedPrograms = info.context.getContexts map { tI => { val typeInfo: TypeInfo = tI.getTypeInfo val importedPackage = typeInfo.tree.originalRoot @@ -39,12 +40,18 @@ object Desugar { d.registerPackage(importedPackage, importsCollector)(config) (d, d.packageD(importedPackage)) }} + val importedDurationS = f"${(System.currentTimeMillis() - importedDesugaringStartMs) / 1000f}%.1f" + println(s"desugaring imported packages done, took ${importedDurationS}s") + + val desugaringStartMs = System.currentTimeMillis() // desugar the main package, i.e. the package on which verification is performed: val mainDesugarer = new Desugarer(pkg.positions, info) // registers main package to generate proof obligations for its init code mainDesugarer.registerMainPackage(pkg, importsCollector)(config) // combine all desugared results into one Viper program: val internalProgram = combine(mainDesugarer, mainDesugarer.packageD(pkg), importedPrograms) + val durationS = f"${(System.currentTimeMillis() - desugaringStartMs) / 1000f}%.1f" + println(s"desugaring main package done, took ${durationS}s") config.reporter report DesugaredMessage(config.packageInfoInputMap(pkg.info).map(_.name), () => internalProgram) internalProgram } @@ -3455,7 +3462,8 @@ object Desugar { // Collect and register all import-preconditions pkg.imports.foreach{ imp => info.context.getTypeInfo(RegularImport(imp.importPath))(config) match { - case Some(Right(tI)) => + // case Some(Right(tI)) => + case Right(tI) => val desugaredPre = imp.importPres.map(specificationD(FunctionContext.empty(), info)) Violation.violation(!config.enableLazyImports || desugaredPre.isEmpty, s"Import precondition found despite running with ${Config.enableLazyImportOptionPrettyPrinted}") specCollector.addImportPres(tI.getTypeInfo.tree.originalRoot, desugaredPre) diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index bc80f19e5..947840d11 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -22,6 +22,7 @@ import viper.silver.ast.SourcePosition import scala.collection.mutable.ListBuffer import java.security.MessageDigest +import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} object Parser { @@ -59,7 +60,7 @@ object Parser { type SourceCacheKey = String // cache maps a key (obtained by hasing file path and file content) to the parse result - private var sourceCache: Map[SourceCacheKey, (Either[Vector[ParserError], PProgram], Positions)] = Map.empty + private var sourceCache: ConcurrentMap[SourceCacheKey, (Either[Vector[ParserError], PProgram], Positions)] = new ConcurrentHashMap() /** computes the key for caching a particular source. This takes the name, the specOnly flag, and the file's contents into account */ private def getCacheKey(source: Source, specOnly: Boolean): SourceCacheKey = { @@ -70,7 +71,7 @@ object Parser { } def flushCache(): Unit = { - sourceCache = Map.empty + sourceCache.clear() } private def parseSources(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[VerifierError], PPackage] = { @@ -100,10 +101,11 @@ object Parser { def parseAndStore(): (Either[Vector[ParserError], PProgram], Positions) = { cacheHit = false val res = parseSource(source) - sourceCache += getCacheKey(source, specOnly) -> (res, positions) + // sourceCache.put(getCacheKey(source, specOnly), (res, positions)) (res, positions) } - val (res, pos) = sourceCache.getOrElse(getCacheKey(source, specOnly), parseAndStore()) + // val (res, pos) = sourceCache.getOrElse(getCacheKey(source, specOnly), parseAndStore()) + val (res, pos) = sourceCache.computeIfAbsent(getCacheKey(source, specOnly), _ => parseAndStore()) if (cacheHit) { // a cached AST has been found in the cache. The position manager does not yet have any positions for nodes in // this AST. Therefore, the following strategy iterates over the entire AST and copies positional information diff --git a/src/main/scala/viper/gobra/frontend/TaskManager.scala b/src/main/scala/viper/gobra/frontend/TaskManager.scala new file mode 100644 index 000000000..8413d396b --- /dev/null +++ b/src/main/scala/viper/gobra/frontend/TaskManager.scala @@ -0,0 +1,76 @@ +package viper.gobra.frontend + +import viper.gobra.frontend.info.Info.TypeCheckMode +import viper.gobra.util.{GobraExecutionContext, Violation} + +import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} +import scala.concurrent.duration.Duration +import scala.concurrent.{Await, Future, Promise} +import scala.util.{Failure, Success} +import scala.jdk.CollectionConverters._ + +trait Job[R] { + private var compututationStarted = false + private val promise: Promise[R] = Promise() + def getFuture: Future[R] = promise.future + protected def compute(): R + + def call(): R = { + getFuture.value match { + case Some(Success(res)) => return res // return already computed type-checker result + case Some(Failure(exception)) => Violation.violation(s"Job resulted in exception: $exception") + case _ => + } + Violation.violation(!compututationStarted, s"Job is already on-going") + compututationStarted = true + val res = compute() + promise.success(res) + res + } +} + +class TaskManager[K, R](config: Config) { + private val jobs: ConcurrentMap[K, Job[R]] = new ConcurrentHashMap() + + /** + * returns true if job has been inserted and thus was previously absent + */ + def addIfAbsent(id: K, job: Job[R], insertOnly: Boolean = false)(executionContext: GobraExecutionContext): Boolean = { + var isAbsent = false + // first insert job, then run it (if necessary) + jobs.computeIfAbsent(id, _ => { + isAbsent = true + job + }) + // now run it but only if it's a new job: + if (isAbsent && !insertOnly) { + config.typeCheckMode match { + case TypeCheckMode.Lazy => // don't do anything as of now + case TypeCheckMode.Sequential => job.call() + case TypeCheckMode.Parallel => Future{ job.call() }(executionContext) + } + } + isAbsent + } + + def getResult(id: K): R = { + val job = jobs.get(id) + Violation.violation(job != null, s"Task $id not found") + getResultFromJob(job) + } + + def getAllResults: Iterable[R] = + jobs.values().asScala.map(getResultFromJob) + + def getAllResultsWithKeys: Iterable[(K, R)] = + jobs.asScala.toVector.map { case (key, job) => (key, getResultFromJob(job)) } + + private def getResultFromJob(job: Job[R]): R = config.typeCheckMode match { + case TypeCheckMode.Lazy => job.call() // we perform the computation now that we need the result + case TypeCheckMode.Sequential => + // note that we cannot await the future here as type-checking of this package might not have started yet. + // Thus, we use `.call()` that either returns a previously calculated type-checking result or will calculate it. + job.call() + case TypeCheckMode.Parallel => Await.result(job.getFuture, Duration.Inf) + } +} diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 234b591fb..9c0ef6a77 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -7,81 +7,507 @@ package viper.gobra.frontend.info import org.bitbucket.inkytonik.kiama.relation.Tree -import org.bitbucket.inkytonik.kiama.util.Source -import viper.gobra.ast.frontend.{PNode, PPackage} -import viper.gobra.frontend.Config -import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage} +import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, message, noMessages} +import org.bitbucket.inkytonik.kiama.util.{Position, Source} +import viper.gobra.ast.frontend.{PImport, PNode, PPackage} +import viper.gobra.frontend.{Config, Job, PackageResolver, Parser, Source, TaskManager} +import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, RegularImport, RegularPackage} +import viper.gobra.frontend.info.Info.TypeCheckMode.TypeCheckMode import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.ghost.separation.{GhostLessPrinter, GoifyingPrinter} -import viper.gobra.reporting.{CyclicImportError, TypeCheckDebugMessage, TypeCheckFailureMessage, TypeCheckSuccessMessage, TypeError, VerifierError} +import viper.gobra.reporting.{CyclicImportError, NotFoundError, TypeCheckDebugMessage, TypeCheckFailureMessage, TypeCheckSuccessMessage, TypeError, VerifierError} +import viper.gobra.util.{GobraExecutionContext, Violation} +import java.util.concurrent.Callable import scala.collection.immutable.ListMap +import scala.concurrent.duration.Duration +import scala.concurrent.{Await, Future, Promise} +import scala.util.{Failure, Success} object Info { type GoTree = Tree[PNode, PPackage] + /** + * ImportCycle describes a cyclic import. `importClosingCycle` is the AST node that closes the cycle and + * `cyclicPackages` stores the packages involved in the cycle. + */ + case class ImportCycle(importNodeCausingCycle: PImport, importNodeStart: Option[Position], cyclicPackages: Vector[AbstractImport]) + + object TypeCheckMode extends Enumeration { + type TypeCheckMode = Value + val Lazy, Sequential, Parallel = Value + } + /** * All TypeInfo instances share a single context instance. * Therefore, package management is centralized. */ - class Context { - /** stores the results of all imported packages that have been parsed and type checked so far */ - private var contextMap: Map[AbstractPackage, Either[Vector[VerifierError], ExternalTypeInfo]] = ListMap[AbstractPackage, Either[Vector[VerifierError], ExternalTypeInfo]]() + class Context(executionContext: GobraExecutionContext, config: Config) { + /** stores the results of all imported packages that have been parsed so far */ + private var parserContextMap: Map[AbstractPackage, Either[Vector[VerifierError], (Vector[Source], PPackage)]] = ListMap() /** keeps track of the package dependencies that are currently resolved. This information is used to detect cycles */ - private var pendingPackages: Vector[AbstractImport] = Vector() + private var parserPendingPackages: Vector[AbstractImport] = Vector() /** stores all cycles that have been discovered so far */ - private var knownImportCycles: Set[Vector[AbstractImport]] = Set() + var parserKnownImportCycles: Set[ImportCycle] = Set() - def addPackage(importTarget: AbstractImport, typeInfo: ExternalTypeInfo)(config: Config): Unit = { + /* + def parseRecursively(importTarget: AbstractImport)(config: Config): Either[Vector[VerifierError], PPackage] = { val packageTarget = AbstractPackage(importTarget)(config) - pendingPackages = pendingPackages.filterNot(_ == importTarget) - contextMap = contextMap + (packageTarget -> Right(typeInfo)) + parserPendingPackages = parserPendingPackages :+ importTarget + val pkgSources = PackageResolver.resolveSources(importTarget)(config) + .getOrElse(Vector()) + .map(_.source) + val res = for { + nonEmptyPkgSources <- if (pkgSources.isEmpty) + Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) + else Right(pkgSources) + parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) + directImportTargets = parsedProgram.imports.map(i => RegularImport(i.importPath)) + errorsInTransitivePackages = directImportTargets + .map(directImportTarget => { + if (parserPendingPackages.contains(directImportTarget)) { + // package cycle detected + parserKnownImportCycles += parserPendingPackages + Left(Vector(CyclicImportError(s"Cyclic package import detected starting with package '$packageTarget'"))) + } else { + parseRecursively(directImportTarget)(config) + } + }) + .flatMap(_.left.getOrElse(Vector.empty)) + res <- if (errorsInTransitivePackages.isEmpty) Right(parsedProgram) else Left(errorsInTransitivePackages) + } yield res + parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) + parserContextMap = parserContextMap + (packageTarget -> res) + res } - - def addErrenousPackage(importTarget: AbstractImport, errors: Vector[VerifierError])(config: Config): Unit = { + */ + def parseRecursively(importTarget: AbstractImport)(config: Config): Either[Vector[VerifierError], PPackage] = { val packageTarget = AbstractPackage(importTarget)(config) - pendingPackages = pendingPackages.filterNot(_ == importTarget) - contextMap = contextMap + (packageTarget -> Left(errors)) - } - def getTypeInfo(importTarget: AbstractImport)(config: Config): Option[Either[Vector[VerifierError], ExternalTypeInfo]] = { - val packageTarget = AbstractPackage(importTarget)(config) - contextMap.get(packageTarget) match { - case s@Some(_) => s - case _ => { - // there is no entry yet and package resolution might need to resolve multiple depending packages - // keep track of these packages in pendingPackages until either type information or an error is added to contextMap - if (pendingPackages.contains(importTarget)) { - // package cycle detected - knownImportCycles += pendingPackages - Some(Left(Vector(CyclicImportError(s"Cyclic package import detected starting with package '$packageTarget'")))) - } else { - pendingPackages = pendingPackages :+ importTarget - None - } + // skip packages that we have already parsed: + if (parserContextMap.contains(packageTarget)) { + return parserContextMap(packageTarget) match { + case Right((_, pkg)) => Right(pkg) + case Left(errs) => Left(errs) } } + + println(s"parsing $importTarget") + parserPendingPackages = parserPendingPackages :+ importTarget + val pkgSources = PackageResolver.resolveSources(importTarget)(config) + .getOrElse(Vector()) + .map(_.source) + + val res = for { + nonEmptyPkgSources <- if (pkgSources.isEmpty) + Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) + // Left(message(importNode, s"No source files for package '$importTarget' found")) + else Right(pkgSources) + parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) + errorsInTransitivePackages = parsedProgram.imports + .map(importNode => { + val directImportTarget = RegularImport(importNode.importPath) + if (parserPendingPackages.contains(directImportTarget)) { + // package cycle detected + val importNodeStart = parsedProgram.positions.positions.getStart(importNode) + parserKnownImportCycles += ImportCycle(importNode, importNodeStart, parserPendingPackages) + println(s"cycle detected: ${importTarget} has import ${directImportTarget} that occurs in ${parserKnownImportCycles}") + Left(Vector(CyclicImportError(s"Cyclic package import detected starting with package '$packageTarget'"))) + // val cycle = parserPendingPackages + // Left(message(importNode, s"Package '$importTarget' is part of this import cycle: ${cycle.mkString("[", ", ", "]")}")) + } else { + parseRecursively(directImportTarget)(config) + } + }) + .flatMap(_.left.getOrElse(Vector.empty)) + res <- if (errorsInTransitivePackages.isEmpty) Right(parsedProgram) else Left(errorsInTransitivePackages) + } yield res + /* + val res: Either[Messages, PPackage] = for { + nonEmptyPkgSources <- if (pkgSources.isEmpty) + // Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) + Left(message(importNode, s"No source files for package '$importTarget' found")) + else Right(pkgSources) + parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) + directImportTargets = parsedProgram.imports // .map(i => RegularImport(i.importPath)) + errorsInTransitivePackages: Messages = directImportTargets + .map(directImportTarget => { + if (parserPendingPackages.contains(directImportTarget)) { + // package cycle detected + parserKnownImportCycles += parserPendingPackages + // Left(Vector(CyclicImportError(s"Cyclic package import detected starting with package '$packageTarget'"))) + val cycle = parserPendingPackages + Left(message(importNode, s"Package '$importTarget' is part of this import cycle: ${cycle.mkString("[", ", ", "]")}")) + } else { + parseRecursively(directImportTarget)(config) + } + }) + .flatMap(_.left.getOrElse(noMessages)) + res <- if (errorsInTransitivePackages.isEmpty) Right(parsedProgram) else Left(errorsInTransitivePackages) + } yield res + */ + parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) + parserContextMap = parserContextMap + (packageTarget -> res.map(pkg => (pkgSources, pkg))) + res + } + + /** + * returns all parser errors and cyclic errors transitively found in imported packages + */ + def computeCycles(importTarget: AbstractImport): Vector[VerifierError] = { + parserPendingPackages = parserPendingPackages :+ importTarget + val abstractPackage = AbstractPackage(importTarget)(config) + val res = for { + res <- parseManager.getResult(abstractPackage) + (_, ast) = res + directImportTargets = ast.imports + errorsInTransitivePackages = directImportTargets + .flatMap(importNode => { + val directImportTarget = RegularImport(importNode.importPath) + if (parserPendingPackages.contains(directImportTarget)) { + // package cycle detected + val importNodeStart = ast.positions.positions.getStart(importNode) + parserKnownImportCycles += ImportCycle(importNode, importNodeStart, parserPendingPackages) + Vector(CyclicImportError(s"Cyclic package import detected starting with package '$directImportTarget'")) + // val cycle = parserPendingPackages + // message(importNode, s"Package '$importTarget' is part of this import cycle: ${cycle.mkString("[", ", ", "]")}") + } else { + computeCycles(directImportTarget) + } + }) + res <- if (errorsInTransitivePackages.isEmpty) Right(ast) else Left(errorsInTransitivePackages) + } yield res + parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) + res.left.getOrElse(Vector.empty) } + /* + def parseRecursively(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = { + val imports = Seq(BuiltInImport) ++ + pkg.imports.map(i => RegularImport(i.importPath)) + imports.map(importTarget => { + parserPendingPackages = parserPendingPackages :+ importTarget + val pkgSources = PackageResolver.resolveSources(importTarget)(config) + .getOrElse(Vector()) + .map(_.source) + val res = for { + nonEmptyPkgSources <- if (pkgSources.isEmpty) + Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) + else Right(pkgSources) + parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) + }) + + } + */ /** * Returns all package names that lie on the cycle of imports or none if no cycle was found */ - def getImportCycle(importTarget: AbstractImport): Option[Vector[AbstractImport]] = knownImportCycles.find(_.contains(importTarget)) + def getParserImportCycle(importTarget: AbstractImport): Option[ImportCycle] = + parserKnownImportCycles.find(_.cyclicPackages.contains(importTarget)) - def getContexts: Iterable[ExternalTypeInfo] = contextMap.values.collect { case Right(info) => info } + case class ParseJob(importTarget: AbstractImport) extends Job[Either[Vector[VerifierError], (Vector[Source], PPackage)]] { + def compute(): Either[Vector[VerifierError], (Vector[Source], PPackage)] = { + println(s"start parsing $importTarget") + val startMs = System.currentTimeMillis() + val pkgSources = PackageResolver.resolveSources(importTarget)(config) + .getOrElse(Vector()) + .map(_.source) + for { + nonEmptyPkgSources <- if (pkgSources.isEmpty) + Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) + // Left(message(importNode, s"No source files for package '$importTarget' found")) + else Right(pkgSources) + parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) + durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + _ = println(s"parsing $importTarget done (took ${durationS}s)") + // submit jobs to parse dependent packages: + _ = parsedProgram.imports.foreach(importNode => { + val directImportTarget = RegularImport(importNode.importPath) + val directImportPackage = AbstractPackage(directImportTarget)(config) + parseManager.addIfAbsent(directImportPackage, ParseJob(directImportTarget))(executionContext) + }) + } yield (pkgSources, parsedProgram) + } + } + + val parseManager = new TaskManager[AbstractPackage, Either[Vector[VerifierError], (Vector[Source], PPackage)]](config) + def parse(importTarget: AbstractImport): Unit = { + val abstractPackage = AbstractPackage(importTarget)(config) + val parseJob = ParseJob(importTarget) + parseManager.addIfAbsent(abstractPackage, parseJob)(executionContext) + } + + case class TypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] { + def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { + println(s"start type-checking ${pkg.info.id}") + val startMs = System.currentTimeMillis() + val res = Info.check(pkg, pkgSources, context)(config) + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + println(s"type-checking ${pkg.info.id} done (took ${durationS}s)") + res + } + } + + case class FailureJob(errs: Vector[VerifierError]) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] { + def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = Left(errs) + } + + /* + lazy val typeContextMap: Map[AbstractPackage, Future[Either[Vector[VerifierError], ExternalTypeInfo]]] = + parserContextMap.map{ case (abstractPackage, value) => (abstractPackage, value match { + case Right((pkgSources, pkg)) => + if (parallelizeTypechecking) Future { typeCheck(pkgSources, pkg) }(executionContext) + else { + val res = typeCheck(pkgSources, pkg) + if (res.isLeft) { + println(s"type-checking ${abstractPackage} failed: ${res.left.get}") + } + Future.successful(res) + } + case Left(errs) => Future.successful(Left(errs)) + })} + */ + private val typeCheckManager = new TaskManager[AbstractPackage, Either[Vector[VerifierError], ExternalTypeInfo]](config) + def typeCheck(): Unit = { + /*parserContextMap.foreach { case (abstractPackage, parseResult) => + val typeCheckJob = parseResult match { + case Right((pkgSources, pkg)) => TypeCheckJob(pkgSources, pkg, this) + case Left(errs) => FailureJob(errs) + } + println(s"adding task $abstractPackage") + typeCheckManager.addIfAbsent(abstractPackage, typeCheckJob)(executionContext) + } + */ + parseManager.getAllResultsWithKeys.foreach { case (abstractPackage, parseResult) => + val typeCheckJob = parseResult match { + case Right((pkgSources, pkg)) => TypeCheckJob(pkgSources, pkg, this) + case Left(errs) => FailureJob(errs) + } + println(s"adding task $abstractPackage") + // since we're adding the packages in arbitrary order, we cannot directly run the task in SEQUENTIAL mode because + // depending packages might not have been inserted yet + typeCheckManager.addIfAbsent(abstractPackage, typeCheckJob, insertOnly = config.typeCheckMode == TypeCheckMode.Sequential)(executionContext) + } + } + /* + lazy val jobMap: Map[AbstractPackage, Job] = + parserContextMap.transform { case (_, value) => value match { + case Right((pkgSources, pkg)) => TypeCheckJob(pkgSources, pkg, this) + case Left(errs) => FailureJob(errs) + }} + */ - def getExternalErrors: Vector[VerifierError] = contextMap.values.collect { case Left(errs) => errs }.flatten.toVector + def typeCheckSequentially(): Unit = { + /* + val jobs = jobMap.toVector.sorted(Ordering.by[(AbstractPackage, Job), Int](_._1.hashCode())) + println(s"typeCheckSequentially: ${jobs.map(_._1)}") + jobs.foreach { case (abstractPackage, job) => + // println(s"typeCheckSequentially: $abstractPackage") + job.call() } + */ + // NOP + } + + def typeCheckInParallel(): Unit = { + // NOP + // jobMap.foreach { case (_, job) => Future{ job.call() }(executionContext) } + } + /* + lazy val typeContextMap: Map[AbstractPackage, Future[Either[Vector[VerifierError], ExternalTypeInfo]]] = + jobMap.transform { case (_, job) => job.getFuture } + */ +// /** stores the results of all imported packages that have been parsed and type checked so far */ +// private var contextMap: Map[AbstractPackage, Either[Vector[VerifierError], ExternalTypeInfo]] = ListMap[AbstractPackage, Either[Vector[VerifierError], ExternalTypeInfo]]() +// /** keeps track of the package dependencies that are currently resolved. This information is used to detect cycles */ +// private var pendingPackages: Vector[AbstractImport] = Vector() +// /** stores all cycles that have been discovered so far */ +// private var knownImportCycles: Set[Vector[AbstractImport]] = Set() +// +// def addPackage(importTarget: AbstractImport, typeInfo: ExternalTypeInfo)(config: Config): Unit = { +// val packageTarget = AbstractPackage(importTarget)(config) +// pendingPackages = pendingPackages.filterNot(_ == importTarget) +// contextMap = contextMap + (packageTarget -> Right(typeInfo)) +// } +// +// def addErrenousPackage(importTarget: AbstractImport, errors: Vector[VerifierError])(config: Config): Unit = { +// val packageTarget = AbstractPackage(importTarget)(config) +// pendingPackages = pendingPackages.filterNot(_ == importTarget) +// contextMap = contextMap + (packageTarget -> Left(errors)) +// } +// +// def getTypeInfo(importTarget: AbstractImport)(config: Config): Option[Either[Vector[VerifierError], ExternalTypeInfo]] = { +// val packageTarget = AbstractPackage(importTarget)(config) +// contextMap.get(packageTarget) match { +// case s@Some(_) => s +// case _ => { +// // there is no entry yet and package resolution might need to resolve multiple depending packages +// // keep track of these packages in pendingPackages until either type information or an error is added to contextMap +// if (pendingPackages.contains(importTarget)) { +// // package cycle detected +// knownImportCycles += pendingPackages +// Some(Left(Vector(CyclicImportError(s"Cyclic package import detected starting with package '$packageTarget'")))) +// } else { +// pendingPackages = pendingPackages :+ importTarget +// None +// } +// } +// } +// } +// +// /** +// * Returns all package names that lie on the cycle of imports or none if no cycle was found +// */ +// def getImportCycle(importTarget: AbstractImport): Option[Vector[AbstractImport]] = knownImportCycles.find(_.contains(importTarget)) +// +// def getContexts: Iterable[ExternalTypeInfo] = contextMap.values.collect { case Right(info) => info } +// +// def getExternalErrors: Vector[VerifierError] = contextMap.values.collect { case Left(errs) => errs }.flatten.toVector + + def getContexts: Iterable[ExternalTypeInfo] = + // typeContextMap.values.map(fut => Await.result(fut, Duration.Inf)).collect { case Right(info) => info } + typeCheckManager.getAllResults.collect { case Right(info) => info } + /* + def getTypeInfoNonBlocking(importTarget: AbstractImport)(config: Config): Option[Future[Either[Vector[VerifierError], ExternalTypeInfo]]] = { + val packageTarget = AbstractPackage(importTarget)(config) + typeContextMap.get(packageTarget) + } + + def getTypeInfo(importTarget: AbstractImport)(config: Config): Option[Either[Vector[VerifierError], ExternalTypeInfo]] = + getTypeInfoNonBlocking(importTarget)(config).map(Await.result(_, Duration.Inf)) + + */ + + /* + def startTypeChecking(): Unit = { + config.typeCheckMode match { + case TypeCheckMode.Parallel => typeCheckInParallel() + case TypeCheckMode.Sequential => typeCheckSequentially() + case TypeCheckMode.Lazy => // don't do anything yet + } + } + */ + + def getTypeInfo(importTarget: AbstractImport)(config: Config): Either[Vector[VerifierError], ExternalTypeInfo] = { + val packageTarget = AbstractPackage(importTarget)(config) + /* + Violation.violation(typeContextMap.contains(packageTarget), s"expected that a job for ${packageTarget} but found none") + val fut = typeContextMap(packageTarget) + Await.result(fut, Duration.Inf) + */ + /* + Violation.violation(jobMap.contains(packageTarget), s"expected that a job for ${packageTarget} but found none") + val job = jobMap(packageTarget) + config.typeCheckMode match { + case TypeCheckMode.Lazy => job.call() + case TypeCheckMode.Sequential => + // note that we cannot await the future here as type-checking of this package might not have started yet. + // Thus, we use `.call()` that either returns a previously calculated type-checking result or will calculate it. + job.call() + case TypeCheckMode.Parallel => Await.result(job.getFuture, Duration.Inf) + } + */ + typeCheckManager.getResult(packageTarget) + } } - def check(pkg: PPackage, sources: Vector[Source], context: Context = new Context, isMainContext: Boolean = false)(config: Config): Either[Vector[VerifierError], TypeInfo with ExternalTypeInfo] = { + + def check(pkg: PPackage, sources: Vector[Source], context: Context /*= new Context()*/, isMainContext: Boolean = false)(config: Config): Either[Vector[VerifierError], TypeInfo with ExternalTypeInfo] = { val tree = new GoTree(pkg) // println(program.declarations.head) // println("-------------------") // println(tree) val info = new TypeInfoImpl(tree, context, isMainContext)(config: Config) - val errors = info.errors + def createImportError(importNode: PImport, errs: Vector[VerifierError]): Messages = { + val importTarget = RegularImport(importNode.importPath) + // create an error message located at the import statement to indicate errors in the imported package + // we distinguish between parse and type errors, cyclic imports, and packages whose source files could not be found + val notFoundErr = errs.collectFirst { case e: NotFoundError => e } + // alternativeErr is a function to compute the message only when needed + val alternativeErr = () => context.getParserImportCycle(importTarget) match { + case Some(cycle) => + val positionalInfo = cycle.importNodeStart.map(pos => s" at ${pos.format}").getOrElse("") + message(importNode, s"Package '$importTarget' is part of the following import cycle that involves the import ${cycle.importNodeCausingCycle}${positionalInfo}: ${cycle.cyclicPackages.mkString("[", ", ", "]")}") + case _ => message(importNode, s"Package '$importTarget' contains errors: $errs") + } + notFoundErr.map(e => message(importNode, e.message)) + .getOrElse(alternativeErr()) + } + + //val parserMessages = noMessages + val parserMessages = if (isMainContext) { + val sequential = false + val parsingStartMs = System.currentTimeMillis() + val messages = if (sequential) { + // parse BuiltInImport + val builtInParseResult = context.parseRecursively(BuiltInImport)(config) + val builtInMessages = if (builtInParseResult.isRight) noMessages else message(pkg, s"Parsing package with Gobra's built-in definitions failed. This is an internal bug.") + + val importedPackagesMessages = pkg.imports.flatMap(importNode => { + val importTarget = RegularImport(importNode.importPath) + val parseResult = context.parseRecursively(importTarget)(config) + parseResult.left.map(errs => createImportError(importNode, errs)).left.getOrElse(noMessages) + }) + + builtInMessages ++ importedPackagesMessages + } else { + // parse BuiltInImport + context.parse(BuiltInImport) + + pkg.imports.foreach(importNode => { + val importTarget = RegularImport(importNode.importPath) + context.parse(importTarget) + }) + + // collect parse errors and cyclic import errors: + val builtInParseErrors = context.computeCycles(BuiltInImport) + val builtInMessages = if (builtInParseErrors.isEmpty) noMessages else message(pkg, s"Parsing package with Gobra's built-in definitions failed. This is an internal bug.") + + val importedPackagesMessages = pkg.imports.flatMap(importNode => { + val importTarget = RegularImport(importNode.importPath) + val parseErrors = context.computeCycles(importTarget) + if (parseErrors.isEmpty) noMessages else createImportError(importNode, parseErrors) + }) + + builtInMessages ++ importedPackagesMessages + } + val durationS = f"${(System.currentTimeMillis() - parsingStartMs) / 1000f}%.1f" + println(s"parsing done, took ${durationS}s, ${messages.length} errors found") + /* + val imports = Vector(BuiltInImport) ++ + pkg.imports.map(i => RegularImport(i.importPath)) + val parseResult = imports.map(importTarget => { + context.parseRecursively(importTarget)(config) + }) + val transitiveParseErrors = parseResult.flatMap(res => res.left.getOrElse(Vector.empty)) + if (transitiveParseErrors.nonEmpty) { + println(s"parse error encountered") + println(transitiveParseErrors) + return Left(transitiveParseErrors) + } + println(s"parsing was fine") + */ + + messages + } else { + noMessages + } + + val typeCheckingStartMs = System.currentTimeMillis() + if (isMainContext && parserMessages.isEmpty) { + // context.startTypeChecking() + context.typeCheck() + } + + // val errors = info.errors + val errors = if (parserMessages.nonEmpty) parserMessages else { + info.errors + } + if (isMainContext && errors.isEmpty) { + val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" + println(s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})") + } val sourceNames = sources.map(_.name) // use `sources` instead of `context.inputs` for reporting such that the message is correctly attributed in case of imports diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index 896553697..4dc0f9bc9 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -405,6 +405,7 @@ trait MemberResolution { this: TypeInfoImpl => // TODO: move this method to another file def getTypeChecker(importTarget: AbstractImport, errNode: PNode): Either[Messages, ExternalTypeInfo] = { + /* def parseAndTypeCheck(importTarget: AbstractImport): Either[Vector[VerifierError], ExternalTypeInfo] = { val pkgSources = PackageResolver.resolveSources(importTarget)(config) .getOrElse(Vector()) @@ -425,14 +426,15 @@ trait MemberResolution { this: TypeInfoImpl => ) res } - + */ def createImportError(errs: Vector[VerifierError]): Messages = { // create an error message located at the import statement to indicate errors in the imported package // we distinguish between parse and type errors, cyclic imports, and packages whose source files could not be found val notFoundErr = errs.collectFirst { case e: NotFoundError => e } // alternativeErr is a function to compute the message only when needed - val alternativeErr = () => context.getImportCycle(importTarget) match { - case Some(cycle) => message(errNode, s"Package '$importTarget' is part of this import cycle: ${cycle.mkString("[", ", ", "]")}") + val alternativeErr = () => context.getParserImportCycle(importTarget) match { + case Some(cycle) => + message(errNode, s"Package '$importTarget' is part of the following import cycle that involves the import ${cycle.importNodeCausingCycle}: ${cycle.cyclicPackages.mkString("[", ", ", "]")}") case _ => message(errNode, s"Package '$importTarget' contains errors: $errs") } notFoundErr.map(e => message(errNode, e.message)) @@ -440,7 +442,15 @@ trait MemberResolution { this: TypeInfoImpl => } // check if package was already parsed, otherwise do parsing and type checking: + /* val cachedInfo = context.getTypeInfo(importTarget)(config) - cachedInfo.getOrElse(parseAndTypeCheck(importTarget)).left.map(createImportError) + if (cachedInfo.isEmpty) { + println(s"package $importTarget is not contained in context") + } + Violation.violation(cachedInfo.nonEmpty, s"package $importTarget is not contained in context") + cachedInfo.get.left.map(createImportError) + // cachedInfo.getOrElse(parseAndTypeCheck(importTarget)).left.map(createImportError) + */ + context.getTypeInfo(importTarget)(config).left.map(createImportError) } } From dc72343ea5a153387b5b1b0947b724f7f2212926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Tue, 7 Mar 2023 20:59:36 +0100 Subject: [PATCH 102/296] Support outlines in closures (#633) --- .../scala/viper/gobra/frontend/Desugar.scala | 30 +++++++++++++++++-- .../features/outline/outline-simple2.gobra | 14 ++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index cc107c5d7..0eff086cd 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -1808,7 +1808,7 @@ object Desugar { } yield in.Seqn(Vector(dPre, exprAss, clauseBody))(src) case n: POutline => - val name = s"${rootName(n, info)}$$${nm.relativeId(n, info)}" + val name = s"${rootName(n, info)}$$${nm.relativeIdEnclosingFuncOrMethodDecl(n, info)}" val pres = (n.spec.pres ++ n.spec.preserves) map preconditionD(ctx, info) val posts = (n.spec.preserves ++ n.spec.posts) map postconditionD(ctx, info) val terminationMeasures = sequence(n.spec.terminationMeasures map terminationMeasureD(ctx, info)).res @@ -3808,6 +3808,13 @@ object Desugar { case decl: PMethodSig => idName(decl.id, context) case decl: PMPredicateSig => idName(decl.id, context) case decl: PDomainFunction => idName(decl.id, context) + case decl: PClosureDecl => + // closure declarations do not have an associated name and may be arbitrarily nested. + // to simplify, we just return the enclosing function or method's name + info.enclosingFunctionOrMethod(decl) match { + case Some(d) => idName(d.id, context) + case None => violation(s"Could not find a function or method declaration enclosing the closure declaration.") + } case _ => ??? // axiom and method-implementation-proof } } @@ -4852,7 +4859,7 @@ object Desugar { * The id is of the form 'L$$' where a is the difference of the lines * of the node with the code root and b is the difference of the columns * of the node with the code root. - * If a differce is negative, the '-' character is replaced with '_'. + * If the difference is negative, the '-' character is replaced with '_'. * * @param node the node we are interested in * @param info type info to get position information @@ -4865,6 +4872,25 @@ object Desugar { ("L$" + (lpos.line - rpos.line) + "$" + (lpos.column - rpos.column)).replace("-", "_") } + /** + * Returns an id for a node with respect to its enclosing function or method declaration. + * The id is of the form 'L$$' where a is the difference of the lines + * of the node with the enclosing declaration and b is the difference of the columns + * of the node with the enclosing declaration. + * If the difference is negative, the '-' character is replaced with '_'. + * + * @param node the node we are interested in + * @param info type info to get position information + * @return string + */ + def relativeIdEnclosingFuncOrMethodDecl(node: PNode, info: TypeInfo) : String = { + val pom = info.getTypeInfo.tree.originalRoot.positions + val lpos = pom.positions.getStart(node).get + val enclosingMember = info.enclosingFunctionOrMethod(node).get + val rpos = pom.positions.getStart(enclosingMember).get + ("L$" + (lpos.line - rpos.line) + "$" + (lpos.column - rpos.column)).replace("-", "_") + } + /** returns the relativeId with the CONTINUE_LABEL_SUFFIX appended */ def continueLabel(loop: PGeneralForStmt, info: TypeInfo) : String = relativeId(loop, info) + CONTINUE_LABEL_SUFFIX diff --git a/src/test/resources/regressions/features/outline/outline-simple2.gobra b/src/test/resources/regressions/features/outline/outline-simple2.gobra index d59d5b9d8..6e1049d5d 100644 --- a/src/test/resources/regressions/features/outline/outline-simple2.gobra +++ b/src/test/resources/regressions/features/outline/outline-simple2.gobra @@ -93,4 +93,16 @@ func test6() { //:: ExpectedOutput(assert_error:assertion_error) assert x == 11 -} \ No newline at end of file +} + +func test7() { + f := + ensures acc(y) && *y >= 5 + func fspec() (y *int) { + ensures acc(&x) && x >= 5 + outline ( + x@ := 10 + ) + return &x + } +} From 8039bcf97a77a5b5e2f529948345275ae0f01ac9 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 9 Mar 2023 09:32:22 +0100 Subject: [PATCH 103/296] updates ANTLR Go lexer and parser --- build.sbt | 2 +- src/main/antlr4/GoLexer.g4 | 24 +++++++++++--- src/main/antlr4/GoParser.g4 | 62 +++++++++++++++++-------------------- 3 files changed, 49 insertions(+), 39 deletions(-) diff --git a/build.sbt b/build.sbt index d2dfacf37..dca34e1c5 100644 --- a/build.sbt +++ b/build.sbt @@ -34,7 +34,7 @@ lazy val gobra = (project in file(".")) libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.9", // for SystemUtils libraryDependencies += "org.apache.commons" % "commons-text" % "1.9", // for escaping strings in parser preprocessor libraryDependencies += "commons-codec" % "commons-codec" % "1.15", // for obtaining the hex encoding of a string - libraryDependencies += "org.antlr" % "antlr4-runtime" % "4.9.2", + libraryDependencies += "org.antlr" % "antlr4-runtime" % "4.12.0", scalacOptions ++= Seq( "-encoding", "UTF-8", // Enforce UTF-8, instead of relying on properly set locales diff --git a/src/main/antlr4/GoLexer.g4 b/src/main/antlr4/GoLexer.g4 index efcba1f79..871541ca1 100644 --- a/src/main/antlr4/GoLexer.g4 +++ b/src/main/antlr4/GoLexer.g4 @@ -34,8 +34,7 @@ * https://golang.org/ref/spec */ -// Imported to Gobra from https://github.com/antlr/grammars-v4/blob/4c06ad8cc8130931c75ca0b17cbc1453f3830cd2/golang - +// Imported to Gobra from https://github.com/antlr/grammars-v4/blob/fae6a8500e9c6a1ec895fca1495b0384b9144091/golang lexer grammar GoLexer; @@ -145,7 +144,7 @@ HEX_FLOAT_LIT : '0' [xX] HEX_MANTISSA HEX_EXPONENT fragment HEX_MANTISSA : ('_'? HEX_DIGIT)+ ('.' ( '_'? HEX_DIGIT )*)? | '.' HEX_DIGIT ('_'? HEX_DIGIT)*; -fragment HEX_EXPONENT : [pP] [+-] DECIMALS; +fragment HEX_EXPONENT : [pP] [+-]? DECIMALS; IMAGINARY_LIT : (DECIMAL_LIT | BINARY_LIT | OCTAL_LIT | HEX_LIT | FLOAT_LIT) 'i' -> mode(NLSEMI); @@ -172,14 +171,18 @@ BIG_U_VALUE: '\\' 'U' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGI RAW_STRING_LIT : '`' ~'`'* '`' -> mode(NLSEMI); INTERPRETED_STRING_LIT : '"' (~["\\] | ESCAPED_VALUE)* '"' -> mode(NLSEMI); + // Hidden tokens + WS : [ \t]+ -> channel(HIDDEN); COMMENT : '/*' .*? '*/' -> channel(HIDDEN); TERMINATOR : [\r\n]+ -> channel(HIDDEN); LINE_COMMENT : '//' ~[\r\n]* -> channel(HIDDEN); fragment UNICODE_VALUE: ~[\r\n'] | LITTLE_U_VALUE | BIG_U_VALUE | ESCAPED_VALUE; + // Fragments + fragment ESCAPED_VALUE : '\\' ('u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT | 'U' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT @@ -187,27 +190,35 @@ fragment ESCAPED_VALUE | OCTAL_DIGIT OCTAL_DIGIT OCTAL_DIGIT | 'x' HEX_DIGIT HEX_DIGIT) ; + fragment DECIMALS : [0-9] ('_'? [0-9])* ; + fragment OCTAL_DIGIT : [0-7] ; + fragment HEX_DIGIT : [0-9a-fA-F] ; + fragment BIN_DIGIT : [01] ; + fragment EXPONENT : [eE] [+-]? DECIMALS ; + fragment LETTER : UNICODE_LETTER | '_' ; + fragment UNICODE_DIGIT : [\p{Nd}] + /* [\u0030-\u0039] | [\u0660-\u0669] | [\u06F0-\u06F9] @@ -229,6 +240,7 @@ fragment UNICODE_DIGIT | [\u1810-\u1819] | [\uFF10-\uFF19]*/ ; + fragment UNICODE_LETTER : [\p{L}] /* [\u0041-\u005A] @@ -494,7 +506,11 @@ fragment UNICODE_LETTER | [\uFFDA-\uFFDC] */ ; + + mode NLSEMI; + + // Treat whitespace as normal WS_NLSEMI : [ \t]+ -> channel(HIDDEN); // Ignore any comments that only span one line @@ -504,4 +520,4 @@ LINE_COMMENT_NLSEMI : '//' ~[\r\n]* -> channel(HIDDEN); //return to normal lexing EOS: ([\r\n]+ | ';' | '/*' .*? '*/' | EOF) -> mode(DEFAULT_MODE); // Did not find an EOS, so go back to normal lexing -OTHER: -> mode(DEFAULT_MODE), channel(HIDDEN); \ No newline at end of file +OTHER: -> mode(DEFAULT_MODE), channel(HIDDEN); diff --git a/src/main/antlr4/GoParser.g4 b/src/main/antlr4/GoParser.g4 index 0843b0c2c..d357ed404 100644 --- a/src/main/antlr4/GoParser.g4 +++ b/src/main/antlr4/GoParser.g4 @@ -1,38 +1,32 @@ /* - [The "BSD licence"] - Copyright (c) 2017 Sasa Coh, Michał Błotniak - Copyright (c) 2019 Ivan Kochurkin, kvanttt@gmail.com, Positive Technologies - Copyright (c) 2019 Dmitry Rassadin, flipparassa@gmail.com, Positive Technologies - Copyright (c) 2021 Martin Mirchev, mirchevmartin2203@gmail.com - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + [The "BSD licence"] Copyright (c) 2017 Sasa Coh, Michał Błotniak Copyright (c) 2019 Ivan Kochurkin, + kvanttt@gmail.com, Positive Technologies Copyright (c) 2019 Dmitry Rassadin, + flipparassa@gmail.com,Positive Technologies All rights reserved. Copyright (c) 2021 Martin Mirchev, + mirchevmartin2203@gmail.com + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: 1. Redistributions of source code must retain the + above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in + binary form must reproduce the above copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the distribution. 3. The name + of the author may not be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + /* * A Go grammar for ANTLR 4 derived from the Go Language Specification https://golang.org/ref/spec */ -// Imported to Gobra from https://github.com/antlr/grammars-v4/blob/4c06ad8cc8130931c75ca0b17cbc1453f3830cd2/golang +// Imported to Gobra from https://github.com/antlr/grammars-v4/tree/fae6a8500e9c6a1ec895fca1495b0384b9144091/golang parser grammar GoParser; @@ -87,7 +81,7 @@ varSpec: block: L_CURLY statementList? R_CURLY; -statementList: (eos? statement eos)+; +statementList: ((SEMI? | EOS? | {this.closingBracket()}?) statement eos)+; statement: declaration @@ -194,7 +188,7 @@ commCase: CASE (sendStmt | recvStmt) | DEFAULT; recvStmt: (expressionList ASSIGN | identifierList DECLARE_ASSIGN)? recvExpr = expression; -forStmt: FOR (expression | forClause | rangeClause)? block; +forStmt: FOR (expression? | forClause | rangeClause?) block; forClause: initStmt = simpleStmt? eos expression? eos postStmt = simpleStmt?; @@ -384,5 +378,5 @@ eos: SEMI | EOF | EOS - | {closingBracket()}? - ; \ No newline at end of file + | {this.closingBracket()}? + ; From 81ea40397d882c1fc24762518a9900bfe690bf74 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 9 Mar 2023 09:38:03 +0100 Subject: [PATCH 104/296] saves ongoing work --- src/main/antlr4/GobraParser.g4 | 4 + .../java/viper/gobra/frontend/GobraLexer.java | 1820 +++--- .../viper/gobra/frontend/GobraParser.java | 5167 ++++++++++------- .../frontend/GobraParserBaseVisitor.java | 11 +- .../gobra/frontend/GobraParserVisitor.java | 9 +- src/main/scala/viper/gobra/Gobra.scala | 68 +- .../scala/viper/gobra/ast/frontend/Ast.scala | 9 + .../scala/viper/gobra/frontend/Config.scala | 17 +- .../scala/viper/gobra/frontend/Desugar.scala | 16 +- .../gobra/frontend/ParseTreeTranslator.scala | 7 + .../scala/viper/gobra/frontend/Parser.scala | 132 +- .../viper/gobra/frontend/TaskManager.scala | 107 +- .../frontend/info/ExternalTypeInfo.scala | 6 + .../viper/gobra/frontend/info/Info.scala | 733 ++- .../viper/gobra/frontend/info/TypeInfo.scala | 4 +- .../info/implementation/TypeInfoImpl.scala | 12 +- .../resolution/MemberResolution.scala | 20 +- .../typing/ghost/GhostMemberTyping.scala | 13 +- .../gobra/reporting/StatsCollector.scala | 9 + 19 files changed, 5167 insertions(+), 2997 deletions(-) diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 3f08a2fcb..c37e545ba 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -39,6 +39,10 @@ sourceFile: (specMember | declaration | ghostMember) eos )* EOF; +// `preamble` is a second entry point allowing us to parse only the top of a source. +// That's also why we don not enforce EOF at the end. +preamble: (initPost eos)* packageClause eos (importDecl eos)*; + initPost: INIT_POST expression; importPre: IMPORT_PRE expression; diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 0d4c2dd0e..13027367a 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,3 +1,4 @@ +// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -8,9 +9,9 @@ import org.antlr.v4.runtime.dfa.DFA; import org.antlr.v4.runtime.misc.*; -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class GobraLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.12.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -214,700 +215,1125 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a2\u05db\b\1\b"+ - "\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n"+ - "\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21"+ - "\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30"+ - "\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37"+ - "\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t"+ - "*\4+\t+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63"+ - "\4\64\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t"+ - "<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4"+ - "H\tH\4I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\t"+ - "S\4T\tT\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^"+ - "\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j"+ - "\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu"+ - "\4v\tv\4w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080"+ - "\t\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084"+ - "\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089"+ - "\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d"+ - "\4\u008e\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092"+ - "\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096"+ - "\4\u0097\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b"+ - "\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+ - "\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+ - "\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+ - "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad"+ - "\t\u00ad\4\u00ae\t\u00ae\3\2\3\2\5\2\u0161\n\2\3\2\3\2\3\3\3\3\3\3\3\3"+ - "\5\3\u0169\n\3\3\3\5\3\u016c\n\3\3\3\5\3\u016f\n\3\3\3\3\3\3\3\3\3\5\3"+ - "\u0175\n\3\5\3\u0177\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3"+ - "\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+ - "\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3"+ - "\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+ - "\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3"+ - "\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17"+ - "\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+ - "\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23"+ - "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25"+ - "\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27"+ - "\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31"+ - "\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33"+ - "\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\37"+ - "\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!"+ - "\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$"+ - "\3$\3$\3$\3%\3%\3%\3%\3%\3%\3&\3&\3\'\3\'\3\'\3(\3(\3(\3(\3(\3)\3)\3)"+ - "\3)\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,"+ - "\3-\3-\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3\60\3"+ - "\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3"+ - "\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3"+ - "\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3"+ - "\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3"+ - "8\38\38\38\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;\3;\3"+ - ";\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3"+ - ">\3>\3>\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3"+ - "A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3"+ - "C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3"+ - "F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+ - "G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3J\3J\3J\3J\3K\3K\3K\3K\3K\3"+ - "L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3"+ - "O\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3"+ - "R\3R\3R\3S\3S\3S\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3"+ - "W\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3"+ - "Z\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3"+ - "\\\3\\\3]\3]\3]\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`"+ - "\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3c"+ - "\3c\3d\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\7f\u0426\nf\ff\16f\u0429\13"+ - "f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3i\3j\3j\3j\3j\3k\3k\3l\3l\3l\3l\3m\3m\3"+ - "n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3t\3t\3t\3u\3u\3"+ - "u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3x\3y\3y\3y\3z\3z\3{\3{\3{\3|\3|\3}\3}\3"+ - "}\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0082\3"+ - "\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085"+ - "\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u008a"+ - "\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\5\u008b\u0491\n\u008b\3\u008b"+ - "\7\u008b\u0494\n\u008b\f\u008b\16\u008b\u0497\13\u008b\5\u008b\u0499\n"+ - "\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\5\u008c\u04a0\n\u008c\3"+ - "\u008c\6\u008c\u04a3\n\u008c\r\u008c\16\u008c\u04a4\3\u008c\3\u008c\3"+ - "\u008d\3\u008d\5\u008d\u04ab\n\u008d\3\u008d\5\u008d\u04ae\n\u008d\3\u008d"+ - "\6\u008d\u04b1\n\u008d\r\u008d\16\u008d\u04b2\3\u008d\3\u008d\3\u008e"+ - "\3\u008e\3\u008e\5\u008e\u04ba\n\u008e\3\u008e\6\u008e\u04bd\n\u008e\r"+ - "\u008e\16\u008e\u04be\3\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f"+ - "\3\u008f\3\u0090\5\u0090\u04c9\n\u0090\3\u0090\6\u0090\u04cc\n\u0090\r"+ - "\u0090\16\u0090\u04cd\3\u0090\3\u0090\5\u0090\u04d2\n\u0090\3\u0090\7"+ - "\u0090\u04d5\n\u0090\f\u0090\16\u0090\u04d8\13\u0090\5\u0090\u04da\n\u0090"+ - "\3\u0090\3\u0090\3\u0090\5\u0090\u04df\n\u0090\3\u0090\7\u0090\u04e2\n"+ - "\u0090\f\u0090\16\u0090\u04e5\13\u0090\5\u0090\u04e7\n\u0090\3\u0091\3"+ - "\u0091\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\5\u0092"+ - "\u04f2\n\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\3\u0093"+ - "\5\u0093\u04fb\n\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094"+ - "\3\u0095\3\u0095\5\u0095\u0505\n\u0095\3\u0096\3\u0096\3\u0096\3\u0096"+ - "\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098"+ - "\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+ - "\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u009a\3\u009a\7\u009a"+ - "\u0525\n\u009a\f\u009a\16\u009a\u0528\13\u009a\3\u009a\3\u009a\3\u009a"+ - "\3\u009a\3\u009b\3\u009b\3\u009b\7\u009b\u0531\n\u009b\f\u009b\16\u009b"+ - "\u0534\13\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009c\6\u009c\u053b"+ - "\n\u009c\r\u009c\16\u009c\u053c\3\u009c\3\u009c\3\u009d\3\u009d\3\u009d"+ - "\3\u009d\7\u009d\u0545\n\u009d\f\u009d\16\u009d\u0548\13\u009d\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\6\u009e\u0550\n\u009e\r\u009e"+ - "\16\u009e\u0551\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u009f\7\u009f"+ - "\u055a\n\u009f\f\u009f\16\u009f\u055d\13\u009f\3\u009f\3\u009f\3\u00a0"+ - "\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u0565\n\u00a0\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\5\u00a1\u0581\n\u00a1\3\u00a2"+ - "\3\u00a2\5\u00a2\u0585\n\u00a2\3\u00a2\7\u00a2\u0588\n\u00a2\f\u00a2\16"+ - "\u00a2\u058b\13\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a5\3\u00a5"+ - "\3\u00a6\3\u00a6\5\u00a6\u0595\n\u00a6\3\u00a6\3\u00a6\3\u00a7\3\u00a7"+ - "\5\u00a7\u059b\n\u00a7\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00aa\6\u00aa"+ - "\u05a2\n\u00aa\r\u00aa\16\u00aa\u05a3\3\u00aa\3\u00aa\3\u00ab\3\u00ab"+ - "\3\u00ab\3\u00ab\7\u00ab\u05ac\n\u00ab\f\u00ab\16\u00ab\u05af\13\u00ab"+ - "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac"+ - "\7\u00ac\u05ba\n\u00ac\f\u00ac\16\u00ac\u05bd\13\u00ac\3\u00ac\3\u00ac"+ - "\3\u00ad\6\u00ad\u05c2\n\u00ad\r\u00ad\16\u00ad\u05c3\3\u00ad\3\u00ad"+ - "\3\u00ad\3\u00ad\3\u00ad\7\u00ad\u05cb\n\u00ad\f\u00ad\16\u00ad\u05ce"+ - "\13\u00ad\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u05d3\n\u00ad\3\u00ad\3\u00ad"+ - "\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\5\u0546\u05ad\u05cc\2\u00af\4"+ - "\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21"+ - "\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!"+ - "B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:"+ - "t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090"+ - "I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4"+ - "S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8"+ - "]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00cc"+ - "g\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0"+ - "q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4"+ - "{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104"+ - "\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110"+ - "\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d\u011a\u008e\u011c"+ - "\u008f\u011e\u0090\u0120\2\u0122\2\u0124\u0091\u0126\2\u0128\u0092\u012a"+ - "\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136"+ - "\u0099\u0138\u009a\u013a\u009b\u013c\u009c\u013e\u009d\u0140\2\u0142\2"+ - "\u0144\2\u0146\2\u0148\2\u014a\2\u014c\2\u014e\2\u0150\2\u0152\2\u0154"+ - "\u009e\u0156\u009f\u0158\u00a0\u015a\u00a1\u015c\u00a2\4\2\3\23\3\2\63"+ - ";\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13"+ - "\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5"+ - "\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb"+ - "\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8"+ - "\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1"+ - "\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22"+ - "\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b"+ - "\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52"+ - "\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b"+ - "\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52"+ - "\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071"+ - "\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452"+ - "\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b"+ - "\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52"+ - "\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac"+ - "\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8"+ - "\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0"+ - "\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381"+ - "\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5"+ - "\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b"+ - "\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670"+ - "\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1"+ - "\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f"+ - "\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc"+ - "\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842"+ - "\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b"+ - "\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987"+ - "\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4"+ - "\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1"+ - "\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12"+ - "\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a"+ - "\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f"+ - "\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7"+ - "\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb"+ - "\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34"+ - "\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63"+ - "\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94"+ - "\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6"+ - "\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10"+ - "\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c"+ - "\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94"+ - "\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0"+ - "\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14"+ - "\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63"+ - "\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf"+ - "\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48"+ - "\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f"+ - "\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7"+ - "\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf"+ - "\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02"+ - "\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041"+ - "\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068"+ - "\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9"+ - "\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f"+ - "\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c"+ - "\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2"+ - "\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a"+ - "\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e"+ - "\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702"+ - "\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e"+ - "\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822"+ - "\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7"+ - "\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2"+ - "\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35"+ - "\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02"+ - "\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee"+ - "\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a"+ - "\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b"+ - "\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8"+ - "\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5"+ - "\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073"+ - "\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109"+ - "\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128"+ - "\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141"+ - "\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32"+ - "\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27"+ - "\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82"+ - "\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0"+ - "\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31"+ - "\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098"+ - "\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133"+ - "\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec"+ - "\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c"+ - "\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721"+ - "\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805"+ - "\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5"+ - "\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932"+ - "\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6"+ - "\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46"+ - "\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3"+ - "\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd"+ - "\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10"+ - "\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e"+ - "\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd"+ - "\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f"+ - "\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40"+ - "\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52"+ - "\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe"+ - "\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc"+ - "\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3"+ - "A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321"+ - "\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2"+ - "\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd"+ - "\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762"+ - "\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a"+ - "\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2"+ - "\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9"+ - "\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b"+ - "\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6"+ - "\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02"+ - "\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1"+ - "\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185"+ - "\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213"+ - "\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291"+ - "\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312"+ - "\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f"+ - "\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c"+ - "\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da"+ - "\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b"+ - "\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c"+ - "\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa"+ - "\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02"+ - "\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b"+ - "\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42"+ - "\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79"+ - "\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2"+ - "\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd"+ - "\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402"+ - "\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8"+ - "\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7"+ - "\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b"+ - "\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554"+ - "\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716"+ - "\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c"+ - "\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945"+ - "\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29"+ - "\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d"+ - "\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f"+ - "\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b"+ - "\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66"+ - "\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e"+ - "\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7"+ - "\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4"+ - "\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802\4\ufa1f\4\u0606\2\4\3\2\2\2\2\6"+ - "\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2"+ - "\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34"+ - "\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2("+ - "\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2"+ - "\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2"+ - "@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3"+ - "\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2"+ - "\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2"+ - "\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r"+ - "\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2"+ - "\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2"+ - "\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090"+ - "\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2"+ - "\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2"+ - "\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2"+ - "\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4"+ - "\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2"+ - "\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6"+ - "\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2"+ - "\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8"+ - "\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2"+ - "\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea"+ - "\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2"+ - "\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc"+ - "\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2\2\2\u0102\3\2\2\2\2\u0104\3\2\2"+ - "\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a\3\2\2\2\2\u010c\3\2\2\2\2\u010e"+ - "\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2\2\2\u0114\3\2\2\2\2\u0116\3\2\2"+ - "\2\2\u0118\3\2\2\2\2\u011a\3\2\2\2\2\u011c\3\2\2\2\2\u011e\3\2\2\2\2\u0124"+ - "\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2\2\2\u012c\3\2\2\2\2\u012e\3\2\2"+ - "\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134\3\2\2\2\2\u0136\3\2\2\2\2\u0138"+ - "\3\2\2\2\2\u013a\3\2\2\2\2\u013c\3\2\2\2\2\u013e\3\2\2\2\3\u0154\3\2\2"+ - "\2\3\u0156\3\2\2\2\3\u0158\3\2\2\2\3\u015a\3\2\2\2\3\u015c\3\2\2\2\4\u0160"+ - "\3\2\2\2\6\u0176\3\2\2\2\b\u0178\3\2\2\2\n\u017f\3\2\2\2\f\u0187\3\2\2"+ - "\2\16\u018e\3\2\2\2\20\u0195\3\2\2\2\22\u019c\3\2\2\2\24\u01a3\3\2\2\2"+ - "\26\u01ac\3\2\2\2\30\u01b6\3\2\2\2\32\u01be\3\2\2\2\34\u01c8\3\2\2\2\36"+ - "\u01d4\3\2\2\2 \u01db\3\2\2\2\"\u01e6\3\2\2\2$\u01e9\3\2\2\2&\u01ef\3"+ - "\2\2\2(\u01f8\3\2\2\2*\u01fd\3\2\2\2,\u0204\3\2\2\2.\u020b\3\2\2\2\60"+ - "\u0211\3\2\2\2\62\u0216\3\2\2\2\64\u021d\3\2\2\2\66\u0227\3\2\2\28\u022b"+ - "\3\2\2\2:\u0231\3\2\2\2<\u0234\3\2\2\2>\u0236\3\2\2\2@\u023d\3\2\2\2B"+ - "\u0243\3\2\2\2D\u0250\3\2\2\2F\u0259\3\2\2\2H\u025d\3\2\2\2J\u0261\3\2"+ - "\2\2L\u0267\3\2\2\2N\u0269\3\2\2\2P\u026c\3\2\2\2R\u0271\3\2\2\2T\u0277"+ - "\3\2\2\2V\u027d\3\2\2\2X\u0284\3\2\2\2Z\u028b\3\2\2\2\\\u0294\3\2\2\2"+ - "^\u029a\3\2\2\2`\u02a0\3\2\2\2b\u02a7\3\2\2\2d\u02ad\3\2\2\2f\u02b4\3"+ - "\2\2\2h\u02ba\3\2\2\2j\u02c3\3\2\2\2l\u02cb\3\2\2\2n\u02d1\3\2\2\2p\u02d9"+ - "\3\2\2\2r\u02e0\3\2\2\2t\u02e5\3\2\2\2v\u02ee\3\2\2\2x\u02fd\3\2\2\2z"+ - "\u0303\3\2\2\2|\u0307\3\2\2\2~\u030a\3\2\2\2\u0080\u0311\3\2\2\2\u0082"+ - "\u031b\3\2\2\2\u0084\u0325\3\2\2\2\u0086\u0331\3\2\2\2\u0088\u033a\3\2"+ - "\2\2\u008a\u0344\3\2\2\2\u008c\u034c\3\2\2\2\u008e\u0358\3\2\2\2\u0090"+ - "\u0367\3\2\2\2\u0092\u036d\3\2\2\2\u0094\u0371\3\2\2\2\u0096\u0375\3\2"+ - "\2\2\u0098\u037a\3\2\2\2\u009a\u0382\3\2\2\2\u009c\u038a\3\2\2\2\u009e"+ - "\u038f\3\2\2\2\u00a0\u0399\3\2\2\2\u00a2\u03a0\3\2\2\2\u00a4\u03a5\3\2"+ - "\2\2\u00a6\u03ab\3\2\2\2\u00a8\u03ae\3\2\2\2\u00aa\u03b2\3\2\2\2\u00ac"+ - "\u03b9\3\2\2\2\u00ae\u03be\3\2\2\2\u00b0\u03c3\3\2\2\2\u00b2\u03c8\3\2"+ - "\2\2\u00b4\u03d0\3\2\2\2\u00b6\u03d7\3\2\2\2\u00b8\u03dd\3\2\2\2\u00ba"+ - "\u03eb\3\2\2\2\u00bc\u03ee\3\2\2\2\u00be\u03f4\3\2\2\2\u00c0\u03f9\3\2"+ - "\2\2\u00c2\u0404\3\2\2\2\u00c4\u0408\3\2\2\2\u00c6\u040f\3\2\2\2\u00c8"+ - "\u0418\3\2\2\2\u00ca\u041c\3\2\2\2\u00cc\u0422\3\2\2\2\u00ce\u042c\3\2"+ - "\2\2\u00d0\u042e\3\2\2\2\u00d2\u0432\3\2\2\2\u00d4\u0434\3\2\2\2\u00d6"+ - "\u0438\3\2\2\2\u00d8\u043a\3\2\2\2\u00da\u043e\3\2\2\2\u00dc\u0440\3\2"+ - "\2\2\u00de\u0442\3\2\2\2\u00e0\u0444\3\2\2\2\u00e2\u0446\3\2\2\2\u00e4"+ - "\u0448\3\2\2\2\u00e6\u044d\3\2\2\2\u00e8\u0452\3\2\2\2\u00ea\u0455\3\2"+ - "\2\2\u00ec\u0459\3\2\2\2\u00ee\u045c\3\2\2\2\u00f0\u045f\3\2\2\2\u00f2"+ - "\u0462\3\2\2\2\u00f4\u0465\3\2\2\2\u00f6\u0467\3\2\2\2\u00f8\u046a\3\2"+ - "\2\2\u00fa\u046c\3\2\2\2\u00fc\u046f\3\2\2\2\u00fe\u0471\3\2\2\2\u0100"+ - "\u0473\3\2\2\2\u0102\u0475\3\2\2\2\u0104\u0478\3\2\2\2\u0106\u047b\3\2"+ - "\2\2\u0108\u047e\3\2\2\2\u010a\u0480\3\2\2\2\u010c\u0482\3\2\2\2\u010e"+ - "\u0484\3\2\2\2\u0110\u0486\3\2\2\2\u0112\u0488\3\2\2\2\u0114\u048a\3\2"+ - "\2\2\u0116\u0498\3\2\2\2\u0118\u049c\3\2\2\2\u011a\u04a8\3\2\2\2\u011c"+ - "\u04b6\3\2\2\2\u011e\u04c2\3\2\2\2\u0120\u04e6\3\2\2\2\u0122\u04e8\3\2"+ - "\2\2\u0124\u04f1\3\2\2\2\u0126\u04f7\3\2\2\2\u0128\u04fe\3\2\2\2\u012a"+ - "\u0504\3\2\2\2\u012c\u0506\3\2\2\2\u012e\u050b\3\2\2\2\u0130\u0510\3\2"+ - "\2\2\u0132\u0517\3\2\2\2\u0134\u0522\3\2\2\2\u0136\u052d\3\2\2\2\u0138"+ - "\u053a\3\2\2\2\u013a\u0540\3\2\2\2\u013c\u054f\3\2\2\2\u013e\u0555\3\2"+ - "\2\2\u0140\u0564\3\2\2\2\u0142\u0566\3\2\2\2\u0144\u0582\3\2\2\2\u0146"+ - "\u058c\3\2\2\2\u0148\u058e\3\2\2\2\u014a\u0590\3\2\2\2\u014c\u0592\3\2"+ - "\2\2\u014e\u059a\3\2\2\2\u0150\u059c\3\2\2\2\u0152\u059e\3\2\2\2\u0154"+ - "\u05a1\3\2\2\2\u0156\u05a7\3\2\2\2\u0158\u05b5\3\2\2\2\u015a\u05d2\3\2"+ - "\2\2\u015c\u05d6\3\2\2\2\u015e\u0161\5\6\3\2\u015f\u0161\5\u011e\u008f"+ - "\2\u0160\u015e\3\2\2\2\u0160\u015f\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0163"+ - "\b\2\2\2\u0163\5\3\2\2\2\u0164\u016e\5\u0144\u00a2\2\u0165\u0166\7\60"+ - "\2\2\u0166\u0168\6\3\2\2\u0167\u0169\5\u0144\u00a2\2\u0168\u0167\3\2\2"+ - "\2\u0168\u0169\3\2\2\2\u0169\u016b\3\2\2\2\u016a\u016c\5\u014c\u00a6\2"+ - "\u016b\u016a\3\2\2\2\u016b\u016c\3\2\2\2\u016c\u016f\3\2\2\2\u016d\u016f"+ - "\5\u014c\u00a6\2\u016e\u0165\3\2\2\2\u016e\u016d\3\2\2\2\u016f\u0177\3"+ - "\2\2\2\u0170\u0171\7\60\2\2\u0171\u0172\6\3\3\2\u0172\u0174\5\u0144\u00a2"+ - "\2\u0173\u0175\5\u014c\u00a6\2\u0174\u0173\3\2\2\2\u0174\u0175\3\2\2\2"+ - "\u0175\u0177\3\2\2\2\u0176\u0164\3\2\2\2\u0176\u0170\3\2\2\2\u0177\7\3"+ - "\2\2\2\u0178\u0179\7v\2\2\u0179\u017a\7t\2\2\u017a\u017b\7w\2\2\u017b"+ - "\u017c\7g\2\2\u017c\u017d\3\2\2\2\u017d\u017e\b\4\2\2\u017e\t\3\2\2\2"+ - "\u017f\u0180\7h\2\2\u0180\u0181\7c\2\2\u0181\u0182\7n\2\2\u0182\u0183"+ - "\7u\2\2\u0183\u0184\7g\2\2\u0184\u0185\3\2\2\2\u0185\u0186\b\5\2\2\u0186"+ - "\13\3\2\2\2\u0187\u0188\7c\2\2\u0188\u0189\7u\2\2\u0189\u018a\7u\2\2\u018a"+ - "\u018b\7g\2\2\u018b\u018c\7t\2\2\u018c\u018d\7v\2\2\u018d\r\3\2\2\2\u018e"+ - "\u018f\7c\2\2\u018f\u0190\7u\2\2\u0190\u0191\7u\2\2\u0191\u0192\7w\2\2"+ - "\u0192\u0193\7o\2\2\u0193\u0194\7g\2\2\u0194\17\3\2\2\2\u0195\u0196\7"+ - "k\2\2\u0196\u0197\7p\2\2\u0197\u0198\7j\2\2\u0198\u0199\7c\2\2\u0199\u019a"+ - "\7n\2\2\u019a\u019b\7g\2\2\u019b\21\3\2\2\2\u019c\u019d\7g\2\2\u019d\u019e"+ - "\7z\2\2\u019e\u019f\7j\2\2\u019f\u01a0\7c\2\2\u01a0\u01a1\7n\2\2\u01a1"+ - "\u01a2\7g\2\2\u01a2\23\3\2\2\2\u01a3\u01a4\7t\2\2\u01a4\u01a5\7g\2\2\u01a5"+ - "\u01a6\7s\2\2\u01a6\u01a7\7w\2\2\u01a7\u01a8\7k\2\2\u01a8\u01a9\7t\2\2"+ - "\u01a9\u01aa\7g\2\2\u01aa\u01ab\7u\2\2\u01ab\25\3\2\2\2\u01ac\u01ad\7"+ - "r\2\2\u01ad\u01ae\7t\2\2\u01ae\u01af\7g\2\2\u01af\u01b0\7u\2\2\u01b0\u01b1"+ - "\7g\2\2\u01b1\u01b2\7t\2\2\u01b2\u01b3\7x\2\2\u01b3\u01b4\7g\2\2\u01b4"+ - "\u01b5\7u\2\2\u01b5\27\3\2\2\2\u01b6\u01b7\7g\2\2\u01b7\u01b8\7p\2\2\u01b8"+ - "\u01b9\7u\2\2\u01b9\u01ba\7w\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7g\2\2"+ - "\u01bc\u01bd\7u\2\2\u01bd\31\3\2\2\2\u01be\u01bf\7k\2\2\u01bf\u01c0\7"+ - "p\2\2\u01c0\u01c1\7x\2\2\u01c1\u01c2\7c\2\2\u01c2\u01c3\7t\2\2\u01c3\u01c4"+ - "\7k\2\2\u01c4\u01c5\7c\2\2\u01c5\u01c6\7p\2\2\u01c6\u01c7\7v\2\2\u01c7"+ - "\33\3\2\2\2\u01c8\u01c9\7f\2\2\u01c9\u01ca\7g\2\2\u01ca\u01cb\7e\2\2\u01cb"+ - "\u01cc\7t\2\2\u01cc\u01cd\7g\2\2\u01cd\u01ce\7c\2\2\u01ce\u01cf\7u\2\2"+ - "\u01cf\u01d0\7g\2\2\u01d0\u01d1\7u\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d3"+ - "\b\16\2\2\u01d3\35\3\2\2\2\u01d4\u01d5\7r\2\2\u01d5\u01d6\7w\2\2\u01d6"+ - "\u01d7\7t\2\2\u01d7\u01d8\7g\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01da\b\17"+ - "\2\2\u01da\37\3\2\2\2\u01db\u01dc\7k\2\2\u01dc\u01dd\7o\2\2\u01dd\u01de"+ - "\7r\2\2\u01de\u01df\7n\2\2\u01df\u01e0\7g\2\2\u01e0\u01e1\7o\2\2\u01e1"+ - "\u01e2\7g\2\2\u01e2\u01e3\7p\2\2\u01e3\u01e4\7v\2\2\u01e4\u01e5\7u\2\2"+ - "\u01e5!\3\2\2\2\u01e6\u01e7\7c\2\2\u01e7\u01e8\7u\2\2\u01e8#\3\2\2\2\u01e9"+ - "\u01ea\7q\2\2\u01ea\u01eb\7n\2\2\u01eb\u01ec\7f\2\2\u01ec\u01ed\3\2\2"+ - "\2\u01ed\u01ee\b\22\2\2\u01ee%\3\2\2\2\u01ef\u01f0\7d\2\2\u01f0\u01f1"+ - "\7g\2\2\u01f1\u01f2\7h\2\2\u01f2\u01f3\7q\2\2\u01f3\u01f4\7t\2\2\u01f4"+ - "\u01f5\7g\2\2\u01f5\u01f6\3\2\2\2\u01f6\u01f7\b\23\2\2\u01f7\'\3\2\2\2"+ - "\u01f8\u01f9\7%\2\2\u01f9\u01fa\7n\2\2\u01fa\u01fb\7j\2\2\u01fb\u01fc"+ - "\7u\2\2\u01fc)\3\2\2\2\u01fd\u01fe\7h\2\2\u01fe\u01ff\7q\2\2\u01ff\u0200"+ - "\7t\2\2\u0200\u0201\7c\2\2\u0201\u0202\7n\2\2\u0202\u0203\7n\2\2\u0203"+ - "+\3\2\2\2\u0204\u0205\7g\2\2\u0205\u0206\7z\2\2\u0206\u0207\7k\2\2\u0207"+ - "\u0208\7u\2\2\u0208\u0209\7v\2\2\u0209\u020a\7u\2\2\u020a-\3\2\2\2\u020b"+ - "\u020c\7c\2\2\u020c\u020d\7e\2\2\u020d\u020e\7e\2\2\u020e\u020f\3\2\2"+ - "\2\u020f\u0210\b\27\2\2\u0210/\3\2\2\2\u0211\u0212\7h\2\2\u0212\u0213"+ - "\7q\2\2\u0213\u0214\7n\2\2\u0214\u0215\7f\2\2\u0215\61\3\2\2\2\u0216\u0217"+ - "\7w\2\2\u0217\u0218\7p\2\2\u0218\u0219\7h\2\2\u0219\u021a\7q\2\2\u021a"+ - "\u021b\7n\2\2\u021b\u021c\7f\2\2\u021c\63\3\2\2\2\u021d\u021e\7w\2\2\u021e"+ - "\u021f\7p\2\2\u021f\u0220\7h\2\2\u0220\u0221\7q\2\2\u0221\u0222\7n\2\2"+ - "\u0222\u0223\7f\2\2\u0223\u0224\7k\2\2\u0224\u0225\7p\2\2\u0225\u0226"+ - "\7i\2\2\u0226\65\3\2\2\2\u0227\u0228\7n\2\2\u0228\u0229\7g\2\2\u0229\u022a"+ - "\7v\2\2\u022a\67\3\2\2\2\u022b\u022c\7i\2\2\u022c\u022d\7j\2\2\u022d\u022e"+ - "\7q\2\2\u022e\u022f\7u\2\2\u022f\u0230\7v\2\2\u02309\3\2\2\2\u0231\u0232"+ - "\7k\2\2\u0232\u0233\7p\2\2\u0233;\3\2\2\2\u0234\u0235\7%\2\2\u0235=\3"+ - "\2\2\2\u0236\u0237\7u\2\2\u0237\u0238\7w\2\2\u0238\u0239\7d\2\2\u0239"+ - "\u023a\7u\2\2\u023a\u023b\7g\2\2\u023b\u023c\7v\2\2\u023c?\3\2\2\2\u023d"+ - "\u023e\7w\2\2\u023e\u023f\7p\2\2\u023f\u0240\7k\2\2\u0240\u0241\7q\2\2"+ - "\u0241\u0242\7p\2\2\u0242A\3\2\2\2\u0243\u0244\7k\2\2\u0244\u0245\7p\2"+ - "\2\u0245\u0246\7v\2\2\u0246\u0247\7g\2\2\u0247\u0248\7t\2\2\u0248\u0249"+ - "\7u\2\2\u0249\u024a\7g\2\2\u024a\u024b\7e\2\2\u024b\u024c\7v\2\2\u024c"+ - "\u024d\7k\2\2\u024d\u024e\7q\2\2\u024e\u024f\7p\2\2\u024fC\3\2\2\2\u0250"+ - "\u0251\7u\2\2\u0251\u0252\7g\2\2\u0252\u0253\7v\2\2\u0253\u0254\7o\2\2"+ - "\u0254\u0255\7k\2\2\u0255\u0256\7p\2\2\u0256\u0257\7w\2\2\u0257\u0258"+ - "\7u\2\2\u0258E\3\2\2\2\u0259\u025a\7?\2\2\u025a\u025b\7?\2\2\u025b\u025c"+ - "\7@\2\2\u025cG\3\2\2\2\u025d\u025e\7/\2\2\u025e\u025f\7/\2\2\u025f\u0260"+ - "\7,\2\2\u0260I\3\2\2\2\u0261\u0262\7c\2\2\u0262\u0263\7r\2\2\u0263\u0264"+ - "\7r\2\2\u0264\u0265\7n\2\2\u0265\u0266\7{\2\2\u0266K\3\2\2\2\u0267\u0268"+ - "\7A\2\2\u0268M\3\2\2\2\u0269\u026a\7#\2\2\u026a\u026b\7>\2\2\u026bO\3"+ - "\2\2\2\u026c\u026d\7#\2\2\u026d\u026e\7@\2\2\u026e\u026f\3\2\2\2\u026f"+ - "\u0270\b(\2\2\u0270Q\3\2\2\2\u0271\u0272\7u\2\2\u0272\u0273\7g\2\2\u0273"+ - "\u0274\7s\2\2\u0274\u0275\3\2\2\2\u0275\u0276\b)\2\2\u0276S\3\2\2\2\u0277"+ - "\u0278\7u\2\2\u0278\u0279\7g\2\2\u0279\u027a\7v\2\2\u027a\u027b\3\2\2"+ - "\2\u027b\u027c\b*\2\2\u027cU\3\2\2\2\u027d\u027e\7o\2\2\u027e\u027f\7"+ - "u\2\2\u027f\u0280\7g\2\2\u0280\u0281\7v\2\2\u0281\u0282\3\2\2\2\u0282"+ - "\u0283\b+\2\2\u0283W\3\2\2\2\u0284\u0285\7f\2\2\u0285\u0286\7k\2\2\u0286"+ - "\u0287\7e\2\2\u0287\u0288\7v\2\2\u0288\u0289\3\2\2\2\u0289\u028a\b,\2"+ - "\2\u028aY\3\2\2\2\u028b\u028c\7q\2\2\u028c\u028d\7r\2\2\u028d\u028e\7"+ - "v\2\2\u028e\u028f\7k\2\2\u028f\u0290\7q\2\2\u0290\u0291\7p\2\2\u0291\u0292"+ - "\3\2\2\2\u0292\u0293\b-\2\2\u0293[\3\2\2\2\u0294\u0295\7n\2\2\u0295\u0296"+ - "\7g\2\2\u0296\u0297\7p\2\2\u0297\u0298\3\2\2\2\u0298\u0299\b.\2\2\u0299"+ - "]\3\2\2\2\u029a\u029b\7p\2\2\u029b\u029c\7g\2\2\u029c\u029d\7y\2\2\u029d"+ - "\u029e\3\2\2\2\u029e\u029f\b/\2\2\u029f_\3\2\2\2\u02a0\u02a1\7o\2\2\u02a1"+ - "\u02a2\7c\2\2\u02a2\u02a3\7m\2\2\u02a3\u02a4\7g\2\2\u02a4\u02a5\3\2\2"+ - "\2\u02a5\u02a6\b\60\2\2\u02a6a\3\2\2\2\u02a7\u02a8\7e\2\2\u02a8\u02a9"+ - "\7c\2\2\u02a9\u02aa\7r\2\2\u02aa\u02ab\3\2\2\2\u02ab\u02ac\b\61\2\2\u02ac"+ - "c\3\2\2\2\u02ad\u02ae\7u\2\2\u02ae\u02af\7q\2\2\u02af\u02b0\7o\2\2\u02b0"+ - "\u02b1\7g\2\2\u02b1\u02b2\3\2\2\2\u02b2\u02b3\b\62\2\2\u02b3e\3\2\2\2"+ - "\u02b4\u02b5\7i\2\2\u02b5\u02b6\7g\2\2\u02b6\u02b7\7v\2\2\u02b7\u02b8"+ - "\3\2\2\2\u02b8\u02b9\b\63\2\2\u02b9g\3\2\2\2\u02ba\u02bb\7f\2\2\u02bb"+ - "\u02bc\7q\2\2\u02bc\u02bd\7o\2\2\u02bd\u02be\7c\2\2\u02be\u02bf\7k\2\2"+ - "\u02bf\u02c0\7p\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\b\64\2\2\u02c2i\3"+ - "\2\2\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7z\2\2\u02c5\u02c6\7k\2\2\u02c6"+ - "\u02c7\7q\2\2\u02c7\u02c8\7o\2\2\u02c8\u02c9\3\2\2\2\u02c9\u02ca\b\65"+ - "\2\2\u02cak\3\2\2\2\u02cb\u02cc\7c\2\2\u02cc\u02cd\7f\2\2\u02cd\u02ce"+ - "\7v\2\2\u02ce\u02cf\3\2\2\2\u02cf\u02d0\b\66\2\2\u02d0m\3\2\2\2\u02d1"+ - "\u02d2\7o\2\2\u02d2\u02d3\7c\2\2\u02d3\u02d4\7v\2\2\u02d4\u02d5\7e\2\2"+ - "\u02d5\u02d6\7j\2\2\u02d6\u02d7\3\2\2\2\u02d7\u02d8\b\67\2\2\u02d8o\3"+ - "\2\2\2\u02d9\u02da\7p\2\2\u02da\u02db\7q\2\2\u02db\u02dc\7p\2\2\u02dc"+ - "\u02dd\7g\2\2\u02dd\u02de\3\2\2\2\u02de\u02df\b8\2\2\u02dfq\3\2\2\2\u02e0"+ - "\u02e1\7r\2\2\u02e1\u02e2\7t\2\2\u02e2\u02e3\7g\2\2\u02e3\u02e4\7f\2\2"+ - "\u02e4s\3\2\2\2\u02e5\u02e6\7v\2\2\u02e6\u02e7\7{\2\2\u02e7\u02e8\7r\2"+ - "\2\u02e8\u02e9\7g\2\2\u02e9\u02ea\7Q\2\2\u02ea\u02eb\7h\2\2\u02eb\u02ec"+ - "\3\2\2\2\u02ec\u02ed\b:\2\2\u02edu\3\2\2\2\u02ee\u02ef\7k\2\2\u02ef\u02f0"+ - "\7u\2\2\u02f0\u02f1\7E\2\2\u02f1\u02f2\7q\2\2\u02f2\u02f3\7o\2\2\u02f3"+ - "\u02f4\7r\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7t\2\2\u02f6\u02f7\7c\2\2"+ - "\u02f7\u02f8\7d\2\2\u02f8\u02f9\7n\2\2\u02f9\u02fa\7g\2\2\u02fa\u02fb"+ - "\3\2\2\2\u02fb\u02fc\b;\2\2\u02fcw\3\2\2\2\u02fd\u02fe\7u\2\2\u02fe\u02ff"+ - "\7j\2\2\u02ff\u0300\7c\2\2\u0300\u0301\7t\2\2\u0301\u0302\7g\2\2\u0302"+ - "y\3\2\2\2\u0303\u0304\7B\2\2\u0304\u0305\3\2\2\2\u0305\u0306\b=\2\2\u0306"+ - "{\3\2\2\2\u0307\u0308\7\60\2\2\u0308\u0309\7\60\2\2\u0309}\3\2\2\2\u030a"+ - "\u030b\7u\2\2\u030b\u030c\7j\2\2\u030c\u030d\7c\2\2\u030d\u030e\7t\2\2"+ - "\u030e\u030f\7g\2\2\u030f\u0310\7f\2\2\u0310\177\3\2\2\2\u0311\u0312\7"+ - "g\2\2\u0312\u0313\7z\2\2\u0313\u0314\7e\2\2\u0314\u0315\7n\2\2\u0315\u0316"+ - "\7w\2\2\u0316\u0317\7u\2\2\u0317\u0318\7k\2\2\u0318\u0319\7x\2\2\u0319"+ - "\u031a\7g\2\2\u031a\u0081\3\2\2\2\u031b\u031c\7r\2\2\u031c\u031d\7t\2"+ - "\2\u031d\u031e\7g\2\2\u031e\u031f\7f\2\2\u031f\u0320\7k\2\2\u0320\u0321"+ - "\7e\2\2\u0321\u0322\7c\2\2\u0322\u0323\7v\2\2\u0323\u0324\7g\2\2\u0324"+ - "\u0083\3\2\2\2\u0325\u0326\7y\2\2\u0326\u0327\7t\2\2\u0327\u0328\7k\2"+ - "\2\u0328\u0329\7v\2\2\u0329\u032a\7g\2\2\u032a\u032b\7R\2\2\u032b\u032c"+ - "\7g\2\2\u032c\u032d\7t\2\2\u032d\u032e\7o\2\2\u032e\u032f\3\2\2\2\u032f"+ - "\u0330\bB\2\2\u0330\u0085\3\2\2\2\u0331\u0332\7p\2\2\u0332\u0333\7q\2"+ - "\2\u0333\u0334\7R\2\2\u0334\u0335\7g\2\2\u0335\u0336\7t\2\2\u0336\u0337"+ - "\7o\2\2\u0337\u0338\3\2\2\2\u0338\u0339\bC\2\2\u0339\u0087\3\2\2\2\u033a"+ - "\u033b\7v\2\2\u033b\u033c\7t\2\2\u033c\u033d\7w\2\2\u033d\u033e\7u\2\2"+ - "\u033e\u033f\7v\2\2\u033f\u0340\7g\2\2\u0340\u0341\7f\2\2\u0341\u0342"+ - "\3\2\2\2\u0342\u0343\bD\2\2\u0343\u0089\3\2\2\2\u0344\u0345\7q\2\2\u0345"+ - "\u0346\7w\2\2\u0346\u0347\7v\2\2\u0347\u0348\7n\2\2\u0348\u0349\7k\2\2"+ - "\u0349\u034a\7p\2\2\u034a\u034b\7g\2\2\u034b\u008b\3\2\2\2\u034c\u034d"+ - "\7k\2\2\u034d\u034e\7p\2\2\u034e\u034f\7k\2\2\u034f\u0350\7v\2\2\u0350"+ - "\u0351\7G\2\2\u0351\u0352\7p\2\2\u0352\u0353\7u\2\2\u0353\u0354\7w\2\2"+ - "\u0354\u0355\7t\2\2\u0355\u0356\7g\2\2\u0356\u0357\7u\2\2\u0357\u008d"+ - "\3\2\2\2\u0358\u0359\7k\2\2\u0359\u035a\7o\2\2\u035a\u035b\7r\2\2\u035b"+ - "\u035c\7q\2\2\u035c\u035d\7t\2\2\u035d\u035e\7v\2\2\u035e\u035f\7T\2\2"+ - "\u035f\u0360\7g\2\2\u0360\u0361\7s\2\2\u0361\u0362\7w\2\2\u0362\u0363"+ - "\7k\2\2\u0363\u0364\7t\2\2\u0364\u0365\7g\2\2\u0365\u0366\7u\2\2\u0366"+ - "\u008f\3\2\2\2\u0367\u0368\7r\2\2\u0368\u0369\7t\2\2\u0369\u036a\7q\2"+ - "\2\u036a\u036b\7q\2\2\u036b\u036c\7h\2\2\u036c\u0091\3\2\2\2\u036d\u036e"+ - "\7?\2\2\u036e\u036f\7?\2\2\u036f\u0370\7?\2\2\u0370\u0093\3\2\2\2\u0371"+ - "\u0372\7#\2\2\u0372\u0373\7?\2\2\u0373\u0374\7?\2\2\u0374\u0095\3\2\2"+ - "\2\u0375\u0376\7y\2\2\u0376\u0377\7k\2\2\u0377\u0378\7v\2\2\u0378\u0379"+ - "\7j\2\2\u0379\u0097\3\2\2\2\u037a\u037b\7d\2\2\u037b\u037c\7t\2\2\u037c"+ - "\u037d\7g\2\2\u037d\u037e\7c\2\2\u037e\u037f\7m\2\2\u037f\u0380\3\2\2"+ - "\2\u0380\u0381\bL\2\2\u0381\u0099\3\2\2\2\u0382\u0383\7f\2\2\u0383\u0384"+ - "\7g\2\2\u0384\u0385\7h\2\2\u0385\u0386\7c\2\2\u0386\u0387\7w\2\2\u0387"+ - "\u0388\7n\2\2\u0388\u0389\7v\2\2\u0389\u009b\3\2\2\2\u038a\u038b\7h\2"+ - "\2\u038b\u038c\7w\2\2\u038c\u038d\7p\2\2\u038d\u038e\7e\2\2\u038e\u009d"+ - "\3\2\2\2\u038f\u0390\7k\2\2\u0390\u0391\7p\2\2\u0391\u0392\7v\2\2\u0392"+ - "\u0393\7g\2\2\u0393\u0394\7t\2\2\u0394\u0395\7h\2\2\u0395\u0396\7c\2\2"+ - "\u0396\u0397\7e\2\2\u0397\u0398\7g\2\2\u0398\u009f\3\2\2\2\u0399\u039a"+ - "\7u\2\2\u039a\u039b\7g\2\2\u039b\u039c\7n\2\2\u039c\u039d\7g\2\2\u039d"+ - "\u039e\7e\2\2\u039e\u039f\7v\2\2\u039f\u00a1\3\2\2\2\u03a0\u03a1\7e\2"+ - "\2\u03a1\u03a2\7c\2\2\u03a2\u03a3\7u\2\2\u03a3\u03a4\7g\2\2\u03a4\u00a3"+ - "\3\2\2\2\u03a5\u03a6\7f\2\2\u03a6\u03a7\7g\2\2\u03a7\u03a8\7h\2\2\u03a8"+ - "\u03a9\7g\2\2\u03a9\u03aa\7t\2\2\u03aa\u00a5\3\2\2\2\u03ab\u03ac\7i\2"+ - "\2\u03ac\u03ad\7q\2\2\u03ad\u00a7\3\2\2\2\u03ae\u03af\7o\2\2\u03af\u03b0"+ - "\7c\2\2\u03b0\u03b1\7r\2\2\u03b1\u00a9\3\2\2\2\u03b2\u03b3\7u\2\2\u03b3"+ - "\u03b4\7v\2\2\u03b4\u03b5\7t\2\2\u03b5\u03b6\7w\2\2\u03b6\u03b7\7e\2\2"+ - "\u03b7\u03b8\7v\2\2\u03b8\u00ab\3\2\2\2\u03b9\u03ba\7e\2\2\u03ba\u03bb"+ - "\7j\2\2\u03bb\u03bc\7c\2\2\u03bc\u03bd\7p\2\2\u03bd\u00ad\3\2\2\2\u03be"+ - "\u03bf\7g\2\2\u03bf\u03c0\7n\2\2\u03c0\u03c1\7u\2\2\u03c1\u03c2\7g\2\2"+ - "\u03c2\u00af\3\2\2\2\u03c3\u03c4\7i\2\2\u03c4\u03c5\7q\2\2\u03c5\u03c6"+ - "\7v\2\2\u03c6\u03c7\7q\2\2\u03c7\u00b1\3\2\2\2\u03c8\u03c9\7r\2\2\u03c9"+ - "\u03ca\7c\2\2\u03ca\u03cb\7e\2\2\u03cb\u03cc\7m\2\2\u03cc\u03cd\7c\2\2"+ - "\u03cd\u03ce\7i\2\2\u03ce\u03cf\7g\2\2\u03cf\u00b3\3\2\2\2\u03d0\u03d1"+ - "\7u\2\2\u03d1\u03d2\7y\2\2\u03d2\u03d3\7k\2\2\u03d3\u03d4\7v\2\2\u03d4"+ - "\u03d5\7e\2\2\u03d5\u03d6\7j\2\2\u03d6\u00b5\3\2\2\2\u03d7\u03d8\7e\2"+ - "\2\u03d8\u03d9\7q\2\2\u03d9\u03da\7p\2\2\u03da\u03db\7u\2\2\u03db\u03dc"+ - "\7v\2\2\u03dc\u00b7\3\2\2\2\u03dd\u03de\7h\2\2\u03de\u03df\7c\2\2\u03df"+ - "\u03e0\7n\2\2\u03e0\u03e1\7n\2\2\u03e1\u03e2\7v\2\2\u03e2\u03e3\7j\2\2"+ - "\u03e3\u03e4\7t\2\2\u03e4\u03e5\7q\2\2\u03e5\u03e6\7w\2\2\u03e6\u03e7"+ - "\7i\2\2\u03e7\u03e8\7j\2\2\u03e8\u03e9\3\2\2\2\u03e9\u03ea\b\\\2\2\u03ea"+ - "\u00b9\3\2\2\2\u03eb\u03ec\7k\2\2\u03ec\u03ed\7h\2\2\u03ed\u00bb\3\2\2"+ - "\2\u03ee\u03ef\7t\2\2\u03ef\u03f0\7c\2\2\u03f0\u03f1\7p\2\2\u03f1\u03f2"+ - "\7i\2\2\u03f2\u03f3\7g\2\2\u03f3\u00bd\3\2\2\2\u03f4\u03f5\7v\2\2\u03f5"+ - "\u03f6\7{\2\2\u03f6\u03f7\7r\2\2\u03f7\u03f8\7g\2\2\u03f8\u00bf\3\2\2"+ - "\2\u03f9\u03fa\7e\2\2\u03fa\u03fb\7q\2\2\u03fb\u03fc\7p\2\2\u03fc\u03fd"+ - "\7v\2\2\u03fd\u03fe\7k\2\2\u03fe\u03ff\7p\2\2\u03ff\u0400\7w\2\2\u0400"+ - "\u0401\7g\2\2\u0401\u0402\3\2\2\2\u0402\u0403\b`\2\2\u0403\u00c1\3\2\2"+ - "\2\u0404\u0405\7h\2\2\u0405\u0406\7q\2\2\u0406\u0407\7t\2\2\u0407\u00c3"+ - "\3\2\2\2\u0408\u0409\7k\2\2\u0409\u040a\7o\2\2\u040a\u040b\7r\2\2\u040b"+ - "\u040c\7q\2\2\u040c\u040d\7t\2\2\u040d\u040e\7v\2\2\u040e\u00c5\3\2\2"+ - "\2\u040f\u0410\7t\2\2\u0410\u0411\7g\2\2\u0411\u0412\7v\2\2\u0412\u0413"+ - "\7w\2\2\u0413\u0414\7t\2\2\u0414\u0415\7p\2\2\u0415\u0416\3\2\2\2\u0416"+ - "\u0417\bc\2\2\u0417\u00c7\3\2\2\2\u0418\u0419\7x\2\2\u0419\u041a\7c\2"+ - "\2\u041a\u041b\7t\2\2\u041b\u00c9\3\2\2\2\u041c\u041d\7p\2\2\u041d\u041e"+ - "\7k\2\2\u041e\u041f\7n\2\2\u041f\u0420\3\2\2\2\u0420\u0421\be\2\2\u0421"+ - "\u00cb\3\2\2\2\u0422\u0427\5\u014e\u00a7\2\u0423\u0426\5\u014e\u00a7\2"+ - "\u0424\u0426\5\u0150\u00a8\2\u0425\u0423\3\2\2\2\u0425\u0424\3\2\2\2\u0426"+ - "\u0429\3\2\2\2\u0427\u0425\3\2\2\2\u0427\u0428\3\2\2\2\u0428\u042a\3\2"+ - "\2\2\u0429\u0427\3\2\2\2\u042a\u042b\bf\2\2\u042b\u00cd\3\2\2\2\u042c"+ - "\u042d\7*\2\2\u042d\u00cf\3\2\2\2\u042e\u042f\7+\2\2\u042f\u0430\3\2\2"+ - "\2\u0430\u0431\bh\2\2\u0431\u00d1\3\2\2\2\u0432\u0433\7}\2\2\u0433\u00d3"+ - "\3\2\2\2\u0434\u0435\7\177\2\2\u0435\u0436\3\2\2\2\u0436\u0437\bj\2\2"+ - "\u0437\u00d5\3\2\2\2\u0438\u0439\7]\2\2\u0439\u00d7\3\2\2\2\u043a\u043b"+ - "\7_\2\2\u043b\u043c\3\2\2\2\u043c\u043d\bl\2\2\u043d\u00d9\3\2\2\2\u043e"+ - "\u043f\7?\2\2\u043f\u00db\3\2\2\2\u0440\u0441\7.\2\2\u0441\u00dd\3\2\2"+ - "\2\u0442\u0443\7=\2\2\u0443\u00df\3\2\2\2\u0444\u0445\7<\2\2\u0445\u00e1"+ - "\3\2\2\2\u0446\u0447\7\60\2\2\u0447\u00e3\3\2\2\2\u0448\u0449\7-\2\2\u0449"+ - "\u044a\7-\2\2\u044a\u044b\3\2\2\2\u044b\u044c\br\2\2\u044c\u00e5\3\2\2"+ - "\2\u044d\u044e\7/\2\2\u044e\u044f\7/\2\2\u044f\u0450\3\2\2\2\u0450\u0451"+ - "\bs\2\2\u0451\u00e7\3\2\2\2\u0452\u0453\7<\2\2\u0453\u0454\7?\2\2\u0454"+ - "\u00e9\3\2\2\2\u0455\u0456\7\60\2\2\u0456\u0457\7\60\2\2\u0457\u0458\7"+ - "\60\2\2\u0458\u00eb\3\2\2\2\u0459\u045a\7~\2\2\u045a\u045b\7~\2\2\u045b"+ - "\u00ed\3\2\2\2\u045c\u045d\7(\2\2\u045d\u045e\7(\2\2\u045e\u00ef\3\2\2"+ - "\2\u045f\u0460\7?\2\2\u0460\u0461\7?\2\2\u0461\u00f1\3\2\2\2\u0462\u0463"+ - "\7#\2\2\u0463\u0464\7?\2\2\u0464\u00f3\3\2\2\2\u0465\u0466\7>\2\2\u0466"+ - "\u00f5\3\2\2\2\u0467\u0468\7>\2\2\u0468\u0469\7?\2\2\u0469\u00f7\3\2\2"+ - "\2\u046a\u046b\7@\2\2\u046b\u00f9\3\2\2\2\u046c\u046d\7@\2\2\u046d\u046e"+ - "\7?\2\2\u046e\u00fb\3\2\2\2\u046f\u0470\7~\2\2\u0470\u00fd\3\2\2\2\u0471"+ - "\u0472\7\61\2\2\u0472\u00ff\3\2\2\2\u0473\u0474\7\'\2\2\u0474\u0101\3"+ - "\2\2\2\u0475\u0476\7>\2\2\u0476\u0477\7>\2\2\u0477\u0103\3\2\2\2\u0478"+ - "\u0479\7@\2\2\u0479\u047a\7@\2\2\u047a\u0105\3\2\2\2\u047b\u047c\7(\2"+ - "\2\u047c\u047d\7`\2\2\u047d\u0107\3\2\2\2\u047e\u047f\7#\2\2\u047f\u0109"+ - "\3\2\2\2\u0480\u0481\7-\2\2\u0481\u010b\3\2\2\2\u0482\u0483\7/\2\2\u0483"+ - "\u010d\3\2\2\2\u0484\u0485\7`\2\2\u0485\u010f\3\2\2\2\u0486\u0487\7,\2"+ - "\2\u0487\u0111\3\2\2\2\u0488\u0489\7(\2\2\u0489\u0113\3\2\2\2\u048a\u048b"+ - "\7>\2\2\u048b\u048c\7/\2\2\u048c\u0115\3\2\2\2\u048d\u0499\7\62\2\2\u048e"+ - "\u0495\t\2\2\2\u048f\u0491\7a\2\2\u0490\u048f\3\2\2\2\u0490\u0491\3\2"+ - "\2\2\u0491\u0492\3\2\2\2\u0492\u0494\t\3\2\2\u0493\u0490\3\2\2\2\u0494"+ - "\u0497\3\2\2\2\u0495\u0493\3\2\2\2\u0495\u0496\3\2\2\2\u0496\u0499\3\2"+ - "\2\2\u0497\u0495\3\2\2\2\u0498\u048d\3\2\2\2\u0498\u048e\3\2\2\2\u0499"+ - "\u049a\3\2\2\2\u049a\u049b\b\u008b\2\2\u049b\u0117\3\2\2\2\u049c\u049d"+ - "\7\62\2\2\u049d\u04a2\t\4\2\2\u049e\u04a0\7a\2\2\u049f\u049e\3\2\2\2\u049f"+ - "\u04a0\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a3\5\u014a\u00a5\2\u04a2\u049f"+ - "\3\2\2\2\u04a3\u04a4\3\2\2\2\u04a4\u04a2\3\2\2\2\u04a4\u04a5\3\2\2\2\u04a5"+ - "\u04a6\3\2\2\2\u04a6\u04a7\b\u008c\2\2\u04a7\u0119\3\2\2\2\u04a8\u04aa"+ - "\7\62\2\2\u04a9\u04ab\t\5\2\2\u04aa\u04a9\3\2\2\2\u04aa\u04ab\3\2\2\2"+ - "\u04ab\u04b0\3\2\2\2\u04ac\u04ae\7a\2\2\u04ad\u04ac\3\2\2\2\u04ad\u04ae"+ - "\3\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04b1\5\u0146\u00a3\2\u04b0\u04ad\3"+ - "\2\2\2\u04b1\u04b2\3\2\2\2\u04b2\u04b0\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3"+ - "\u04b4\3\2\2\2\u04b4\u04b5\b\u008d\2\2\u04b5\u011b\3\2\2\2\u04b6\u04b7"+ - "\7\62\2\2\u04b7\u04bc\t\6\2\2\u04b8\u04ba\7a\2\2\u04b9\u04b8\3\2\2\2\u04b9"+ - "\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bd\5\u0148\u00a4\2\u04bc\u04b9"+ - "\3\2\2\2\u04bd\u04be\3\2\2\2\u04be\u04bc\3\2\2\2\u04be\u04bf\3\2\2\2\u04bf"+ - "\u04c0\3\2\2\2\u04c0\u04c1\b\u008e\2\2\u04c1\u011d\3\2\2\2\u04c2\u04c3"+ - "\7\62\2\2\u04c3\u04c4\t\6\2\2\u04c4\u04c5\5\u0120\u0090\2\u04c5\u04c6"+ - "\5\u0122\u0091\2\u04c6\u011f\3\2\2\2\u04c7\u04c9\7a\2\2\u04c8\u04c7\3"+ - "\2\2\2\u04c8\u04c9\3\2\2\2\u04c9\u04ca\3\2\2\2\u04ca\u04cc\5\u0148\u00a4"+ - "\2\u04cb\u04c8\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd\u04cb\3\2\2\2\u04cd\u04ce"+ - "\3\2\2\2\u04ce\u04d9\3\2\2\2\u04cf\u04d6\7\60\2\2\u04d0\u04d2\7a\2\2\u04d1"+ - "\u04d0\3\2\2\2\u04d1\u04d2\3\2\2\2\u04d2\u04d3\3\2\2\2\u04d3\u04d5\5\u0148"+ - "\u00a4\2\u04d4\u04d1\3\2\2\2\u04d5\u04d8\3\2\2\2\u04d6\u04d4\3\2\2\2\u04d6"+ - "\u04d7\3\2\2\2\u04d7\u04da\3\2\2\2\u04d8\u04d6\3\2\2\2\u04d9\u04cf\3\2"+ - "\2\2\u04d9\u04da\3\2\2\2\u04da\u04e7\3\2\2\2\u04db\u04dc\7\60\2\2\u04dc"+ - "\u04e3\5\u0148\u00a4\2\u04dd\u04df\7a\2\2\u04de\u04dd\3\2\2\2\u04de\u04df"+ - "\3\2\2\2\u04df\u04e0\3\2\2\2\u04e0\u04e2\5\u0148\u00a4\2\u04e1\u04de\3"+ - "\2\2\2\u04e2\u04e5\3\2\2\2\u04e3\u04e1\3\2\2\2\u04e3\u04e4\3\2\2\2\u04e4"+ - "\u04e7\3\2\2\2\u04e5\u04e3\3\2\2\2\u04e6\u04cb\3\2\2\2\u04e6\u04db\3\2"+ - "\2\2\u04e7\u0121\3\2\2\2\u04e8\u04e9\t\7\2\2\u04e9\u04ea\t\b\2\2\u04ea"+ - "\u04eb\5\u0144\u00a2\2\u04eb\u0123\3\2\2\2\u04ec\u04f2\5\u0116\u008b\2"+ - "\u04ed\u04f2\5\u0118\u008c\2\u04ee\u04f2\5\u011a\u008d\2\u04ef\u04f2\5"+ - "\u011c\u008e\2\u04f0\u04f2\5\4\2\2\u04f1\u04ec\3\2\2\2\u04f1\u04ed\3\2"+ - "\2\2\u04f1\u04ee\3\2\2\2\u04f1\u04ef\3\2\2\2\u04f1\u04f0\3\2\2\2\u04f2"+ - "\u04f3\3\2\2\2\u04f3\u04f4\7k\2\2\u04f4\u04f5\3\2\2\2\u04f5\u04f6\b\u0092"+ - "\2\2\u04f6\u0125\3\2\2\2\u04f7\u04fa\7)\2\2\u04f8\u04fb\5\u0140\u00a0"+ - "\2\u04f9\u04fb\5\u012a\u0095\2\u04fa\u04f8\3\2\2\2\u04fa\u04f9\3\2\2\2"+ - "\u04fb\u04fc\3\2\2\2\u04fc\u04fd\7)\2\2\u04fd\u0127\3\2\2\2\u04fe\u04ff"+ - "\5\u0126\u0093\2\u04ff\u0500\3\2\2\2\u0500\u0501\b\u0094\2\2\u0501\u0129"+ - "\3\2\2\2\u0502\u0505\5\u012c\u0096\2\u0503\u0505\5\u012e\u0097\2\u0504"+ - "\u0502\3\2\2\2\u0504\u0503\3\2\2\2\u0505\u012b\3\2\2\2\u0506\u0507\7^"+ - "\2\2\u0507\u0508\5\u0146\u00a3\2\u0508\u0509\5\u0146\u00a3\2\u0509\u050a"+ - "\5\u0146\u00a3\2\u050a\u012d\3\2\2\2\u050b\u050c\7^\2\2\u050c\u050d\7"+ - "z\2\2\u050d\u050e\5\u0148\u00a4\2\u050e\u050f\5\u0148\u00a4\2\u050f\u012f"+ - "\3\2\2\2\u0510\u0511\7^\2\2\u0511\u0512\7w\2\2\u0512\u0513\5\u0148\u00a4"+ - "\2\u0513\u0514\5\u0148\u00a4\2\u0514\u0515\5\u0148\u00a4\2\u0515\u0516"+ - "\5\u0148\u00a4\2\u0516\u0131\3\2\2\2\u0517\u0518\7^\2\2\u0518\u0519\7"+ - "W\2\2\u0519\u051a\5\u0148\u00a4\2\u051a\u051b\5\u0148\u00a4\2\u051b\u051c"+ - "\5\u0148\u00a4\2\u051c\u051d\5\u0148\u00a4\2\u051d\u051e\5\u0148\u00a4"+ - "\2\u051e\u051f\5\u0148\u00a4\2\u051f\u0520\5\u0148\u00a4\2\u0520\u0521"+ - "\5\u0148\u00a4\2\u0521\u0133\3\2\2\2\u0522\u0526\7b\2\2\u0523\u0525\n"+ - "\t\2\2\u0524\u0523\3\2\2\2\u0525\u0528\3\2\2\2\u0526\u0524\3\2\2\2\u0526"+ - "\u0527\3\2\2\2\u0527\u0529\3\2\2\2\u0528\u0526\3\2\2\2\u0529\u052a\7b"+ - "\2\2\u052a\u052b\3\2\2\2\u052b\u052c\b\u009a\2\2\u052c\u0135\3\2\2\2\u052d"+ - "\u0532\7$\2\2\u052e\u0531\n\n\2\2\u052f\u0531\5\u0142\u00a1\2\u0530\u052e"+ - "\3\2\2\2\u0530\u052f\3\2\2\2\u0531\u0534\3\2\2\2\u0532\u0530\3\2\2\2\u0532"+ - "\u0533\3\2\2\2\u0533\u0535\3\2\2\2\u0534\u0532\3\2\2\2\u0535\u0536\7$"+ - "\2\2\u0536\u0537\3\2\2\2\u0537\u0538\b\u009b\2\2\u0538\u0137\3\2\2\2\u0539"+ - "\u053b\t\13\2\2\u053a\u0539\3\2\2\2\u053b\u053c\3\2\2\2\u053c\u053a\3"+ - "\2\2\2\u053c\u053d\3\2\2\2\u053d\u053e\3\2\2\2\u053e\u053f\b\u009c\3\2"+ - "\u053f\u0139\3\2\2\2\u0540\u0541\7\61\2\2\u0541\u0542\7,\2\2\u0542\u0546"+ - "\3\2\2\2\u0543\u0545\13\2\2\2\u0544\u0543\3\2\2\2\u0545\u0548\3\2\2\2"+ - "\u0546\u0547\3\2\2\2\u0546\u0544\3\2\2\2\u0547\u0549\3\2\2\2\u0548\u0546"+ - "\3\2\2\2\u0549\u054a\7,\2\2\u054a\u054b\7\61\2\2\u054b\u054c\3\2\2\2\u054c"+ - "\u054d\b\u009d\3\2\u054d\u013b\3\2\2\2\u054e\u0550\t\f\2\2\u054f\u054e"+ - "\3\2\2\2\u0550\u0551\3\2\2\2\u0551\u054f\3\2\2\2\u0551\u0552\3\2\2\2\u0552"+ - "\u0553\3\2\2\2\u0553\u0554\b\u009e\3\2\u0554\u013d\3\2\2\2\u0555\u0556"+ - "\7\61\2\2\u0556\u0557\7\61\2\2\u0557\u055b\3\2\2\2\u0558\u055a\n\f\2\2"+ - "\u0559\u0558\3\2\2\2\u055a\u055d\3\2\2\2\u055b\u0559\3\2\2\2\u055b\u055c"+ - "\3\2\2\2\u055c\u055e\3\2\2\2\u055d\u055b\3\2\2\2\u055e\u055f\b\u009f\3"+ - "\2\u055f\u013f\3\2\2\2\u0560\u0565\n\r\2\2\u0561\u0565\5\u0130\u0098\2"+ - "\u0562\u0565\5\u0132\u0099\2\u0563\u0565\5\u0142\u00a1\2\u0564\u0560\3"+ - "\2\2\2\u0564\u0561\3\2\2\2\u0564\u0562\3\2\2\2\u0564\u0563\3\2\2\2\u0565"+ - "\u0141\3\2\2\2\u0566\u0580\7^\2\2\u0567\u0568\7w\2\2\u0568\u0569\5\u0148"+ - "\u00a4\2\u0569\u056a\5\u0148\u00a4\2\u056a\u056b\5\u0148\u00a4\2\u056b"+ - "\u056c\5\u0148\u00a4\2\u056c\u0581\3\2\2\2\u056d\u056e\7W\2\2\u056e\u056f"+ - "\5\u0148\u00a4\2\u056f\u0570\5\u0148\u00a4\2\u0570\u0571\5\u0148\u00a4"+ - "\2\u0571\u0572\5\u0148\u00a4\2\u0572\u0573\5\u0148\u00a4\2\u0573\u0574"+ - "\5\u0148\u00a4\2\u0574\u0575\5\u0148\u00a4\2\u0575\u0576\5\u0148\u00a4"+ - "\2\u0576\u0581\3\2\2\2\u0577\u0581\t\16\2\2\u0578\u0579\5\u0146\u00a3"+ - "\2\u0579\u057a\5\u0146\u00a3\2\u057a\u057b\5\u0146\u00a3\2\u057b\u0581"+ - "\3\2\2\2\u057c\u057d\7z\2\2\u057d\u057e\5\u0148\u00a4\2\u057e\u057f\5"+ - "\u0148\u00a4\2\u057f\u0581\3\2\2\2\u0580\u0567\3\2\2\2\u0580\u056d\3\2"+ - "\2\2\u0580\u0577\3\2\2\2\u0580\u0578\3\2\2\2\u0580\u057c\3\2\2\2\u0581"+ - "\u0143\3\2\2\2\u0582\u0589\t\3\2\2\u0583\u0585\7a\2\2\u0584\u0583\3\2"+ - "\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0588\t\3\2\2\u0587"+ - "\u0584\3\2\2\2\u0588\u058b\3\2\2\2\u0589\u0587\3\2\2\2\u0589\u058a\3\2"+ - "\2\2\u058a\u0145\3\2\2\2\u058b\u0589\3\2\2\2\u058c\u058d\t\17\2\2\u058d"+ - "\u0147\3\2\2\2\u058e\u058f\t\20\2\2\u058f\u0149\3\2\2\2\u0590\u0591\t"+ - "\21\2\2\u0591\u014b\3\2\2\2\u0592\u0594\t\22\2\2\u0593\u0595\t\b\2\2\u0594"+ - "\u0593\3\2\2\2\u0594\u0595\3\2\2\2\u0595\u0596\3\2\2\2\u0596\u0597\5\u0144"+ - "\u00a2\2\u0597\u014d\3\2\2\2\u0598\u059b\5\u0152\u00a9\2\u0599\u059b\7"+ - "a\2\2\u059a\u0598\3\2\2\2\u059a\u0599\3\2\2\2\u059b\u014f\3\2\2\2\u059c"+ - "\u059d\t\23\2\2\u059d\u0151\3\2\2\2\u059e\u059f\t\24\2\2\u059f\u0153\3"+ - "\2\2\2\u05a0\u05a2\t\13\2\2\u05a1\u05a0\3\2\2\2\u05a2\u05a3\3\2\2\2\u05a3"+ - "\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4\u05a5\3\2\2\2\u05a5\u05a6\b\u00aa"+ - "\3\2\u05a6\u0155\3\2\2\2\u05a7\u05a8\7\61\2\2\u05a8\u05a9\7,\2\2\u05a9"+ - "\u05ad\3\2\2\2\u05aa\u05ac\n\f\2\2\u05ab\u05aa\3\2\2\2\u05ac\u05af\3\2"+ - "\2\2\u05ad\u05ae\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05b0\3\2\2\2\u05af"+ - "\u05ad\3\2\2\2\u05b0\u05b1\7,\2\2\u05b1\u05b2\7\61\2\2\u05b2\u05b3\3\2"+ - "\2\2\u05b3\u05b4\b\u00ab\3\2\u05b4\u0157\3\2\2\2\u05b5\u05b6\7\61\2\2"+ - "\u05b6\u05b7\7\61\2\2\u05b7\u05bb\3\2\2\2\u05b8\u05ba\n\f\2\2\u05b9\u05b8"+ - "\3\2\2\2\u05ba\u05bd\3\2\2\2\u05bb\u05b9\3\2\2\2\u05bb\u05bc\3\2\2\2\u05bc"+ - "\u05be\3\2\2\2\u05bd\u05bb\3\2\2\2\u05be\u05bf\b\u00ac\3\2\u05bf\u0159"+ - "\3\2\2\2\u05c0\u05c2\t\f\2\2\u05c1\u05c0\3\2\2\2\u05c2\u05c3\3\2\2\2\u05c3"+ - "\u05c1\3\2\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05d3\3\2\2\2\u05c5\u05d3\7="+ - "\2\2\u05c6\u05c7\7\61\2\2\u05c7\u05c8\7,\2\2\u05c8\u05cc\3\2\2\2\u05c9"+ - "\u05cb\13\2\2\2\u05ca\u05c9\3\2\2\2\u05cb\u05ce\3\2\2\2\u05cc\u05cd\3"+ - "\2\2\2\u05cc\u05ca\3\2\2\2\u05cd\u05cf\3\2\2\2\u05ce\u05cc\3\2\2\2\u05cf"+ - "\u05d0\7,\2\2\u05d0\u05d3\7\61\2\2\u05d1\u05d3\7\2\2\3\u05d2\u05c1\3\2"+ - "\2\2\u05d2\u05c5\3\2\2\2\u05d2\u05c6\3\2\2\2\u05d2\u05d1\3\2\2\2\u05d3"+ - "\u05d4\3\2\2\2\u05d4\u05d5\b\u00ad\4\2\u05d5\u015b\3\2\2\2\u05d6\u05d7"+ - "\3\2\2\2\u05d7\u05d8\3\2\2\2\u05d8\u05d9\b\u00ae\4\2\u05d9\u05da\b\u00ae"+ - "\3\2\u05da\u015d\3\2\2\2\64\2\3\u0160\u0168\u016b\u016e\u0174\u0176\u0425"+ - "\u0427\u0490\u0495\u0498\u049f\u04a4\u04aa\u04ad\u04b2\u04b9\u04be\u04c8"+ - "\u04cd\u04d1\u04d6\u04d9\u04de\u04e3\u04e6\u04f1\u04fa\u0504\u0526\u0530"+ - "\u0532\u053c\u0546\u0551\u055b\u0564\u0580\u0584\u0589\u0594\u059a\u05a3"+ - "\u05ad\u05bb\u05c3\u05cc\u05d2\5\4\3\2\2\3\2\4\2\2"; + "\u0004\u0000\u00a0\u05db\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ + "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ + "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ + "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ + "\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ + "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ + "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ + "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ + "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ + "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ + "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ + " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ + "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ + "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ + "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0002"+ + "4\u00074\u00025\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u0002"+ + "9\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002"+ + ">\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002"+ + "C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002"+ + "H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002"+ + "M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002"+ + "R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002"+ + "W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002"+ + "\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002"+ + "a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002"+ + "f\u0007f\u0002g\u0007g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002"+ + "k\u0007k\u0002l\u0007l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002"+ + "p\u0007p\u0002q\u0007q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002"+ + "u\u0007u\u0002v\u0007v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002"+ + "z\u0007z\u0002{\u0007{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002"+ + "\u007f\u0007\u007f\u0002\u0080\u0007\u0080\u0002\u0081\u0007\u0081\u0002"+ + "\u0082\u0007\u0082\u0002\u0083\u0007\u0083\u0002\u0084\u0007\u0084\u0002"+ + "\u0085\u0007\u0085\u0002\u0086\u0007\u0086\u0002\u0087\u0007\u0087\u0002"+ + "\u0088\u0007\u0088\u0002\u0089\u0007\u0089\u0002\u008a\u0007\u008a\u0002"+ + "\u008b\u0007\u008b\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002"+ + "\u008e\u0007\u008e\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002"+ + "\u0091\u0007\u0091\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002"+ + "\u0094\u0007\u0094\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0002"+ + "\u0097\u0007\u0097\u0002\u0098\u0007\u0098\u0002\u0099\u0007\u0099\u0002"+ + "\u009a\u0007\u009a\u0002\u009b\u0007\u009b\u0002\u009c\u0007\u009c\u0002"+ + "\u009d\u0007\u009d\u0002\u009e\u0007\u009e\u0002\u009f\u0007\u009f\u0002"+ + "\u00a0\u0007\u00a0\u0002\u00a1\u0007\u00a1\u0002\u00a2\u0007\u00a2\u0002"+ + "\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+ + "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+ + "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+ + "\u00ac\u0007\u00ac\u0001\u0000\u0001\u0000\u0003\u0000\u015f\b\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003"+ + "\u0001\u0167\b\u0001\u0001\u0001\u0003\u0001\u016a\b\u0001\u0001\u0001"+ + "\u0003\u0001\u016d\b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0003\u0001\u0173\b\u0001\u0003\u0001\u0175\b\u0001\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001%\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'"+ + "\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + "+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u0001"+ + "0\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00011\u00012\u0001"+ + "2\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00013\u00013\u0001"+ + "3\u00013\u00013\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u0001"+ + "4\u00014\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u0001"+ + "6\u00016\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ + "7\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ + "8\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001"+ + "9\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001"+ + ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001=\u0001"+ + "=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001"+ + "G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001"+ + "I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+ + "M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ + "O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+ + "Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001"+ + "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001_\u0001"+ + "_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ + "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001"+ + "b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001"+ + "d\u0001d\u0005d\u0424\bd\nd\fd\u0427\td\u0001d\u0001d\u0001e\u0001e\u0001"+ + "f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001"+ + "i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001l\u0001l\u0001"+ + "m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001"+ + "p\u0001q\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001s\u0001"+ + "s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001v\u0001"+ + "v\u0001v\u0001w\u0001w\u0001w\u0001x\u0001x\u0001y\u0001y\u0001y\u0001"+ + "z\u0001z\u0001{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001}\u0001~\u0001"+ + "~\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080"+ + "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0083"+ + "\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0086"+ + "\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088"+ + "\u0001\u0089\u0001\u0089\u0001\u0089\u0003\u0089\u048f\b\u0089\u0001\u0089"+ + "\u0005\u0089\u0492\b\u0089\n\u0089\f\u0089\u0495\t\u0089\u0003\u0089\u0497"+ + "\b\u0089\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0003"+ + "\u008a\u049e\b\u008a\u0001\u008a\u0004\u008a\u04a1\b\u008a\u000b\u008a"+ + "\f\u008a\u04a2\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0003\u008b"+ + "\u04a9\b\u008b\u0001\u008b\u0003\u008b\u04ac\b\u008b\u0001\u008b\u0004"+ + "\u008b\u04af\b\u008b\u000b\u008b\f\u008b\u04b0\u0001\u008b\u0001\u008b"+ + "\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u04b8\b\u008c\u0001\u008c"+ + "\u0004\u008c\u04bb\b\u008c\u000b\u008c\f\u008c\u04bc\u0001\u008c\u0001"+ + "\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001"+ + "\u008e\u0003\u008e\u04c7\b\u008e\u0001\u008e\u0004\u008e\u04ca\b\u008e"+ + "\u000b\u008e\f\u008e\u04cb\u0001\u008e\u0001\u008e\u0003\u008e\u04d0\b"+ + "\u008e\u0001\u008e\u0005\u008e\u04d3\b\u008e\n\u008e\f\u008e\u04d6\t\u008e"+ + "\u0003\u008e\u04d8\b\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e"+ + "\u04dd\b\u008e\u0001\u008e\u0005\u008e\u04e0\b\u008e\n\u008e\f\u008e\u04e3"+ + "\t\u008e\u0003\u008e\u04e5\b\u008e\u0001\u008f\u0001\u008f\u0003\u008f"+ + "\u04e9\b\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090"+ + "\u0001\u0090\u0001\u0090\u0003\u0090\u04f2\b\u0090\u0001\u0090\u0001\u0090"+ + "\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091"+ + "\u04fb\b\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0092\u0001\u0093\u0001\u0093\u0003\u0093\u0505\b\u0093\u0001\u0094"+ + "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095"+ + "\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001\u0096"+ + "\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097"+ + "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097"+ + "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0005\u0098"+ + "\u0525\b\u0098\n\u0098\f\u0098\u0528\t\u0098\u0001\u0098\u0001\u0098\u0001"+ + "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0005\u0099\u0531"+ + "\b\u0099\n\u0099\f\u0099\u0534\t\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ + "\u0001\u0099\u0001\u009a\u0004\u009a\u053b\b\u009a\u000b\u009a\f\u009a"+ + "\u053c\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0005\u009b\u0545\b\u009b\n\u009b\f\u009b\u0548\t\u009b\u0001\u009b"+ + "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0004\u009c"+ + "\u0550\b\u009c\u000b\u009c\f\u009c\u0551\u0001\u009c\u0001\u009c\u0001"+ + "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0005\u009d\u055a\b\u009d\n"+ + "\u009d\f\u009d\u055d\t\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001"+ + "\u009e\u0001\u009e\u0001\u009e\u0003\u009e\u0565\b\u009e\u0001\u009f\u0001"+ + "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u009f\u0003\u009f\u0581\b\u009f\u0001\u00a0\u0001\u00a0\u0003\u00a0\u0585"+ + "\b\u00a0\u0001\u00a0\u0005\u00a0\u0588\b\u00a0\n\u00a0\f\u00a0\u058b\t"+ + "\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001"+ + "\u00a3\u0001\u00a4\u0001\u00a4\u0003\u00a4\u0595\b\u00a4\u0001\u00a4\u0001"+ + "\u00a4\u0001\u00a5\u0001\u00a5\u0003\u00a5\u059b\b\u00a5\u0001\u00a6\u0001"+ + "\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0004\u00a8\u05a2\b\u00a8\u000b"+ + "\u00a8\f\u00a8\u05a3\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001"+ + "\u00a9\u0001\u00a9\u0005\u00a9\u05ac\b\u00a9\n\u00a9\f\u00a9\u05af\t\u00a9"+ + "\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa"+ + "\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0005\u00aa\u05ba\b\u00aa\n\u00aa"+ + "\f\u00aa\u05bd\t\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0004\u00ab"+ + "\u05c2\b\u00ab\u000b\u00ab\f\u00ab\u05c3\u0001\u00ab\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ab\u0001\u00ab\u0005\u00ab\u05cb\b\u00ab\n\u00ab\f\u00ab"+ + "\u05ce\t\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0003\u00ab\u05d3\b"+ + "\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001"+ + "\u00ac\u0001\u00ac\u0003\u0546\u05ad\u05cc\u0000\u00ad\u0002\u0001\u0004"+ + "\u0002\u0006\u0003\b\u0004\n\u0005\f\u0006\u000e\u0007\u0010\b\u0012\t"+ + "\u0014\n\u0016\u000b\u0018\f\u001a\r\u001c\u000e\u001e\u000f \u0010\""+ + "\u0011$\u0012&\u0013(\u0014*\u0015,\u0016.\u00170\u00182\u00194\u001a"+ + "6\u001b8\u001c:\u001d<\u001e>\u001f@ B!D\"F#H$J%L&N\'P(R)T*V+X,Z-\\.^"+ + "/`0b1d2f3h4j5l6n7p8r9t:v;x~?\u0080@\u0082A\u0084B\u0086C\u0088D\u008a"+ + "E\u008cF\u008eG\u0090H\u0092I\u0094J\u0096K\u0098L\u009aM\u009cN\u009e"+ + "O\u00a0P\u00a2Q\u00a4R\u00a6S\u00a8T\u00aaU\u00acV\u00aeW\u00b0X\u00b2"+ + "Y\u00b4Z\u00b6[\u00b8\\\u00ba]\u00bc^\u00be_\u00c0`\u00c2a\u00c4b\u00c6"+ + "c\u00c8d\u00cae\u00ccf\u00ceg\u00d0h\u00d2i\u00d4j\u00d6k\u00d8l\u00da"+ + "m\u00dcn\u00deo\u00e0p\u00e2q\u00e4r\u00e6s\u00e8t\u00eau\u00ecv\u00ee"+ + "w\u00f0x\u00f2y\u00f4z\u00f6{\u00f8|\u00fa}\u00fc~\u00fe\u007f\u0100\u0080"+ + "\u0102\u0081\u0104\u0082\u0106\u0083\u0108\u0084\u010a\u0085\u010c\u0086"+ + "\u010e\u0087\u0110\u0088\u0112\u0089\u0114\u008a\u0116\u008b\u0118\u008c"+ + "\u011a\u008d\u011c\u008e\u011e\u0000\u0120\u0000\u0122\u008f\u0124\u0000"+ + "\u0126\u0090\u0128\u0091\u012a\u0092\u012c\u0093\u012e\u0094\u0130\u0095"+ + "\u0132\u0096\u0134\u0097\u0136\u0098\u0138\u0099\u013a\u009a\u013c\u009b"+ + "\u013e\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000\u0148\u0000"+ + "\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0000\u0152\u009c\u0154\u009d"+ + "\u0156\u009e\u0158\u009f\u015a\u00a0\u0002\u0000\u0001\u0013\u0001\u0000"+ + "19\u0001\u000009\u0002\u0000BBbb\u0002\u0000OOoo\u0002\u0000XXxx\u0002"+ + "\u0000PPpp\u0002\u0000++--\u0001\u0000``\u0002\u0000\"\"\\\\\u0002\u0000"+ + "\t\t \u0002\u0000\n\n\r\r\u0003\u0000\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\"+ + "abffnnrrttvv\u0001\u000007\u0003\u000009AFaf\u0001\u000001\u0002\u0000"+ + "EEee>\u000009\u0660\u0669\u06f0\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef"+ + "\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef"+ + "\u0d66\u0d6f\u0de6\u0def\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049"+ + "\u1090\u1099\u17e0\u17e9\u1810\u1819\u1946\u194f\u19d0\u19d9\u1a80\u1a89"+ + "\u1a90\u1a99\u1b50\u1b59\u1bb0\u1bb9\u1c40\u1c49\u1c50\u1c59\u8000\ua620"+ + "\u8000\ua629\u8000\ua8d0\u8000\ua8d9\u8000\ua900\u8000\ua909\u8000\ua9d0"+ + "\u8000\ua9d9\u8000\ua9f0\u8000\ua9f9\u8000\uaa50\u8000\uaa59\u8000\uabf0"+ + "\u8000\uabf9\u8000\uff10\u8000\uff19\u8001\u04a0\u8001\u04a9\u8001\u0d30"+ + "\u8001\u0d39\u8001\u1066\u8001\u106f\u8001\u10f0\u8001\u10f9\u8001\u1136"+ + "\u8001\u113f\u8001\u11d0\u8001\u11d9\u8001\u12f0\u8001\u12f9\u8001\u1450"+ + "\u8001\u1459\u8001\u14d0\u8001\u14d9\u8001\u1650\u8001\u1659\u8001\u16c0"+ + "\u8001\u16c9\u8001\u1730\u8001\u1739\u8001\u18e0\u8001\u18e9\u8001\u1950"+ + "\u8001\u1959\u8001\u1c50\u8001\u1c59\u8001\u1d50\u8001\u1d59\u8001\u1da0"+ + "\u8001\u1da9\u8001\u6a60\u8001\u6a69\u8001\u6ac0\u8001\u6ac9\u8001\u6b50"+ + "\u8001\u6b59\u8001\ud7ce\u8001\ud7ff\u8001\ue140\u8001\ue149\u8001\ue2f0"+ + "\u8001\ue2f9\u8001\ue950\u8001\ue959\u8001\ufbf0\u8001\ufbf9\u0288\u0000"+ + "AZaz\u00aa\u00aa\u00b5\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8"+ + "\u02c1\u02c6\u02d1\u02e0\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376"+ + "\u0377\u037a\u037d\u037f\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e"+ + "\u03a1\u03a3\u03f5\u03f7\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560"+ + "\u0588\u05d0\u05ea\u05ef\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5"+ + "\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712"+ + "\u072f\u074d\u07a5\u07b1\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800"+ + "\u0815\u081a\u081a\u0824\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870"+ + "\u0887\u0889\u088e\u08a0\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958"+ + "\u0961\u0971\u0980\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2"+ + "\u09b2\u09b6\u09b9\u09bd\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0"+ + "\u09f1\u09fc\u09fc\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32"+ + "\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85"+ + "\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd"+ + "\u0abd\u0ad0\u0ad0\u0ae0\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13"+ + "\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f"+ + "\u0b61\u0b71\u0b71\u0b83\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99"+ + "\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0"+ + "\u0bd0\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58"+ + "\u0c5a\u0c5d\u0c5d\u0c60\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92"+ + "\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1"+ + "\u0cf2\u0d04\u0d0c\u0d0e\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54"+ + "\u0d56\u0d5f\u0d61\u0d7a\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd"+ + "\u0dbd\u0dc0\u0dc6\u0e01\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84"+ + "\u0e84\u0e86\u0e8a\u0e8c\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd"+ + "\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49"+ + "\u0f6c\u0f88\u0f8c\u1000\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061"+ + "\u1061\u1065\u1066\u106e\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7"+ + "\u10c7\u10cd\u10cd\u10d0\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258"+ + "\u1258\u125a\u125d\u1260\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8"+ + "\u12be\u12c0\u12c0\u12c2\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318"+ + "\u135a\u1380\u138f\u13a0\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681"+ + "\u169a\u16a0\u16ea\u16f1\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760"+ + "\u176c\u176e\u1770\u1780\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880"+ + "\u1884\u1887\u18a8\u18aa\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970"+ + "\u1974\u1980\u19ab\u19b0\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05"+ + "\u1b33\u1b45\u1b4c\u1b83\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d"+ + "\u1c4f\u1c5a\u1c7d\u1c80\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee"+ + "\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20"+ + "\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f"+ + "\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0"+ + "\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f"+ + "\u207f\u2090\u209c\u2102\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119"+ + "\u211d\u2124\u2124\u2126\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c"+ + "\u213f\u2145\u2149\u214e\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2"+ + "\u2cf3\u2d00\u2d25\u2d27\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80"+ + "\u2d96\u2da0\u2da6\u2da8\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8"+ + "\u2dce\u2dd0\u2dd6\u2dd8\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b"+ + "\u303c\u3041\u3096\u309d\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131"+ + "\u318e\u31a0\u31bf\u31f0\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0"+ + "\u8000\ua4fd\u8000\ua500\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a"+ + "\u8000\ua62b\u8000\ua640\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0"+ + "\u8000\ua6e5\u8000\ua717\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b"+ + "\u8000\ua7ca\u8000\ua7d0\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5"+ + "\u8000\ua7d9\u8000\ua7f2\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807"+ + "\u8000\ua80a\u8000\ua80c\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882"+ + "\u8000\ua8b3\u8000\ua8f2\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd"+ + "\u8000\ua8fe\u8000\ua90a\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960"+ + "\u8000\ua97c\u8000\ua984\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0"+ + "\u8000\ua9e4\u8000\ua9e6\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00"+ + "\u8000\uaa28\u8000\uaa40\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60"+ + "\u8000\uaa76\u8000\uaa7a\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1"+ + "\u8000\uaab1\u8000\uaab5\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0"+ + "\u8000\uaac0\u8000\uaac2\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0"+ + "\u8000\uaaea\u8000\uaaf2\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09"+ + "\u8000\uab0e\u8000\uab11\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28"+ + "\u8000\uab2e\u8000\uab30\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70"+ + "\u8000\uabe2\u8000\uac00\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb"+ + "\u8000\ud7fb\u8000\uf900\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00"+ + "\u8000\ufb06\u8000\ufb13\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f"+ + "\u8000\ufb28\u8000\ufb2a\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e"+ + "\u8000\ufb3e\u8000\ufb40\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46"+ + "\u8000\ufbb1\u8000\ufbd3\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92"+ + "\u8000\ufdc7\u8000\ufdf0\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76"+ + "\u8000\ufefc\u8000\uff21\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66"+ + "\u8000\uffbe\u8000\uffc2\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2"+ + "\u8000\uffd7\u8000\uffda\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001"+ + "&\u8001(\u8001:\u8001<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080"+ + "\u8001\u00fa\u8001\u0280\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300"+ + "\u8001\u031f\u8001\u032d\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350"+ + "\u8001\u0375\u8001\u0380\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8"+ + "\u8001\u03cf\u8001\u0400\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8"+ + "\u8001\u04fb\u8001\u0500\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570"+ + "\u8001\u057a\u8001\u057c\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594"+ + "\u8001\u0595\u8001\u0597\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3"+ + "\u8001\u05b9\u8001\u05bb\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740"+ + "\u8001\u0755\u8001\u0760\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787"+ + "\u8001\u07b0\u8001\u07b2\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808"+ + "\u8001\u0808\u8001\u080a\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c"+ + "\u8001\u083c\u8001\u083f\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880"+ + "\u8001\u089e\u8001\u08e0\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900"+ + "\u8001\u0915\u8001\u0920\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be"+ + "\u8001\u09bf\u8001\u0a00\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15"+ + "\u8001\u0a17\u8001\u0a19\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80"+ + "\u8001\u0a9c\u8001\u0ac0\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00"+ + "\u8001\u0b35\u8001\u0b40\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80"+ + "\u8001\u0b91\u8001\u0c00\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0"+ + "\u8001\u0cf2\u8001\u0d00\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0"+ + "\u8001\u0eb1\u8001\u0f00\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30"+ + "\u8001\u0f45\u8001\u0f70\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0"+ + "\u8001\u0ff6\u8001\u1003\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075"+ + "\u8001\u1075\u8001\u1083\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103"+ + "\u8001\u1126\u8001\u1144\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150"+ + "\u8001\u1172\u8001\u1176\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1"+ + "\u8001\u11c4\u8001\u11da\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200"+ + "\u8001\u1211\u8001\u1213\u8001\u122b\u8001\u1280\u8001\u1286\u8001\u1288"+ + "\u8001\u1288\u8001\u128a\u8001\u128d\u8001\u128f\u8001\u129d\u8001\u129f"+ + "\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001\u1305\u8001\u130c\u8001\u130f"+ + "\u8001\u1310\u8001\u1313\u8001\u1328\u8001\u132a\u8001\u1330\u8001\u1332"+ + "\u8001\u1333\u8001\u1335\u8001\u1339\u8001\u133d\u8001\u133d\u8001\u1350"+ + "\u8001\u1350\u8001\u135d\u8001\u1361\u8001\u1400\u8001\u1434\u8001\u1447"+ + "\u8001\u144a\u8001\u145f\u8001\u1461\u8001\u1480\u8001\u14af\u8001\u14c4"+ + "\u8001\u14c5\u8001\u14c7\u8001\u14c7\u8001\u1580\u8001\u15ae\u8001\u15d8"+ + "\u8001\u15db\u8001\u1600\u8001\u162f\u8001\u1644\u8001\u1644\u8001\u1680"+ + "\u8001\u16aa\u8001\u16b8\u8001\u16b8\u8001\u1700\u8001\u171a\u8001\u1740"+ + "\u8001\u1746\u8001\u1800\u8001\u182b\u8001\u18a0\u8001\u18df\u8001\u18ff"+ + "\u8001\u1906\u8001\u1909\u8001\u1909\u8001\u190c\u8001\u1913\u8001\u1915"+ + "\u8001\u1916\u8001\u1918\u8001\u192f\u8001\u193f\u8001\u193f\u8001\u1941"+ + "\u8001\u1941\u8001\u19a0\u8001\u19a7\u8001\u19aa\u8001\u19d0\u8001\u19e1"+ + "\u8001\u19e1\u8001\u19e3\u8001\u19e3\u8001\u1a00\u8001\u1a00\u8001\u1a0b"+ + "\u8001\u1a32\u8001\u1a3a\u8001\u1a3a\u8001\u1a50\u8001\u1a50\u8001\u1a5c"+ + "\u8001\u1a89\u8001\u1a9d\u8001\u1a9d\u8001\u1ab0\u8001\u1af8\u8001\u1c00"+ + "\u8001\u1c08\u8001\u1c0a\u8001\u1c2e\u8001\u1c40\u8001\u1c40\u8001\u1c72"+ + "\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001\u1d08\u8001\u1d09\u8001\u1d0b"+ + "\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001\u1d60\u8001\u1d65\u8001\u1d67"+ + "\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001\u1d98\u8001\u1d98\u8001\u1ee0"+ + "\u8001\u1ef2\u8001\u1fb0\u8001\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480"+ + "\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342e\u8001\u4400"+ + "\u8001\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40\u8001\u6a5e\u8001\u6a70"+ + "\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00\u8001\u6b2f\u8001\u6b40"+ + "\u8001\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d\u8001\u6b8f\u8001\u6e40"+ + "\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50\u8001\u6f50\u8001\u6f93"+ + "\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3\u8001\u6fe3\u8001\u7000"+ + "\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00\u8001\u8d08\u8001\uaff0"+ + "\u8001\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd\u8001\uaffe\u8001\ub000"+ + "\u8001\ub122\u8001\ub150\u8001\ub152\u8001\ub164\u8001\ub167\u8001\ub170"+ + "\u8001\ub2fb\u8001\ubc00\u8001\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80"+ + "\u8001\ubc88\u8001\ubc90\u8001\ubc99\u8001\ud400\u8001\ud454\u8001\ud456"+ + "\u8001\ud49c\u8001\ud49e\u8001\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5"+ + "\u8001\ud4a6\u8001\ud4a9\u8001\ud4ac\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb"+ + "\u8001\ud4bb\u8001\ud4bd\u8001\ud4c3\u8001\ud4c5\u8001\ud505\u8001\ud507"+ + "\u8001\ud50a\u8001\ud50d\u8001\ud514\u8001\ud516\u8001\ud51c\u8001\ud51e"+ + "\u8001\ud539\u8001\ud53b\u8001\ud53e\u8001\ud540\u8001\ud544\u8001\ud546"+ + "\u8001\ud546\u8001\ud54a\u8001\ud550\u8001\ud552\u8001\ud6a5\u8001\ud6a8"+ + "\u8001\ud6c0\u8001\ud6c2\u8001\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc"+ + "\u8001\ud714\u8001\ud716\u8001\ud734\u8001\ud736\u8001\ud74e\u8001\ud750"+ + "\u8001\ud76e\u8001\ud770\u8001\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa"+ + "\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\ue100"+ + "\u8001\ue12c\u8001\ue137\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290"+ + "\u8001\ue2ad\u8001\ue2c0\u8001\ue2eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8"+ + "\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001\ue7f0\u8001\ue7fe\u8001\ue800"+ + "\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001\ue94b\u8001\ue94b\u8001\uee00"+ + "\u8001\uee03\u8001\uee05\u8001\uee1f\u8001\uee21\u8001\uee22\u8001\uee24"+ + "\u8001\uee24\u8001\uee27\u8001\uee27\u8001\uee29\u8001\uee32\u8001\uee34"+ + "\u8001\uee37\u8001\uee39\u8001\uee39\u8001\uee3b\u8001\uee3b\u8001\uee42"+ + "\u8001\uee42\u8001\uee47\u8001\uee47\u8001\uee49\u8001\uee49\u8001\uee4b"+ + "\u8001\uee4b\u8001\uee4d\u8001\uee4f\u8001\uee51\u8001\uee52\u8001\uee54"+ + "\u8001\uee54\u8001\uee57\u8001\uee57\u8001\uee59\u8001\uee59\u8001\uee5b"+ + "\u8001\uee5b\u8001\uee5d\u8001\uee5d\u8001\uee5f\u8001\uee5f\u8001\uee61"+ + "\u8001\uee62\u8001\uee64\u8001\uee64\u8001\uee67\u8001\uee6a\u8001\uee6c"+ + "\u8001\uee72\u8001\uee74\u8001\uee77\u8001\uee79\u8001\uee7c\u8001\uee7e"+ + "\u8001\uee7e\u8001\uee80\u8001\uee89\u8001\uee8b\u8001\uee9b\u8001\ueea1"+ + "\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000"+ + "\u8002\ua6df\u8002\ua700\u8002\ub738\u8002\ub740\u8002\ub81d\u8002\ub820"+ + "\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000"+ + "\u8003\u134a\u0607\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004\u0001"+ + "\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001\u0000"+ + "\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000\u0000"+ + "\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000\u0000"+ + "\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000"+ + "\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000"+ + "\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000"+ + "\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000"+ + "\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000"+ + "&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001"+ + "\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000"+ + "\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u0000"+ + "4\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001"+ + "\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000"+ + "\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000"+ + "B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001"+ + "\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000"+ + "\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000"+ + "P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001"+ + "\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000"+ + "\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000"+ + "\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b"+ + "\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000"+ + "\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000"+ + "\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p"+ + "\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000"+ + "\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000"+ + "\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~"+ + "\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000\u0000\u0000\u0000\u0082"+ + "\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000\u0000\u0000\u0000\u0086"+ + "\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000\u0000\u0000\u0000\u008a"+ + "\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000\u0000\u0000\u0000\u008e"+ + "\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000\u0000\u0000\u0000\u0092"+ + "\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000\u0000\u0000\u0000\u0096"+ + "\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000\u0000\u0000\u0000\u009a"+ + "\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000\u0000\u0000\u0000\u009e"+ + "\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2"+ + "\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6"+ + "\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa"+ + "\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae"+ + "\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2"+ + "\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6"+ + "\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba"+ + "\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000\u0000\u0000\u0000\u00be"+ + "\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2"+ + "\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6"+ + "\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca"+ + "\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce"+ + "\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2"+ + "\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6"+ + "\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000\u0000\u0000\u0000\u00da"+ + "\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000\u0000\u0000\u0000\u00de"+ + "\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2"+ + "\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6"+ + "\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea"+ + "\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee"+ + "\u0001\u0000\u0000\u0000\u0000\u00f0\u0001\u0000\u0000\u0000\u0000\u00f2"+ + "\u0001\u0000\u0000\u0000\u0000\u00f4\u0001\u0000\u0000\u0000\u0000\u00f6"+ + "\u0001\u0000\u0000\u0000\u0000\u00f8\u0001\u0000\u0000\u0000\u0000\u00fa"+ + "\u0001\u0000\u0000\u0000\u0000\u00fc\u0001\u0000\u0000\u0000\u0000\u00fe"+ + "\u0001\u0000\u0000\u0000\u0000\u0100\u0001\u0000\u0000\u0000\u0000\u0102"+ + "\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000\u0000\u0000\u0000\u0106"+ + "\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000\u0000\u0000\u0000\u010a"+ + "\u0001\u0000\u0000\u0000\u0000\u010c\u0001\u0000\u0000\u0000\u0000\u010e"+ + "\u0001\u0000\u0000\u0000\u0000\u0110\u0001\u0000\u0000\u0000\u0000\u0112"+ + "\u0001\u0000\u0000\u0000\u0000\u0114\u0001\u0000\u0000\u0000\u0000\u0116"+ + "\u0001\u0000\u0000\u0000\u0000\u0118\u0001\u0000\u0000\u0000\u0000\u011a"+ + "\u0001\u0000\u0000\u0000\u0000\u011c\u0001\u0000\u0000\u0000\u0000\u0122"+ + "\u0001\u0000\u0000\u0000\u0000\u0126\u0001\u0000\u0000\u0000\u0000\u0128"+ + "\u0001\u0000\u0000\u0000\u0000\u012a\u0001\u0000\u0000\u0000\u0000\u012c"+ + "\u0001\u0000\u0000\u0000\u0000\u012e\u0001\u0000\u0000\u0000\u0000\u0130"+ + "\u0001\u0000\u0000\u0000\u0000\u0132\u0001\u0000\u0000\u0000\u0000\u0134"+ + "\u0001\u0000\u0000\u0000\u0000\u0136\u0001\u0000\u0000\u0000\u0000\u0138"+ + "\u0001\u0000\u0000\u0000\u0000\u013a\u0001\u0000\u0000\u0000\u0000\u013c"+ + "\u0001\u0000\u0000\u0000\u0001\u0152\u0001\u0000\u0000\u0000\u0001\u0154"+ + "\u0001\u0000\u0000\u0000\u0001\u0156\u0001\u0000\u0000\u0000\u0001\u0158"+ + "\u0001\u0000\u0000\u0000\u0001\u015a\u0001\u0000\u0000\u0000\u0002\u015e"+ + "\u0001\u0000\u0000\u0000\u0004\u0174\u0001\u0000\u0000\u0000\u0006\u0176"+ + "\u0001\u0000\u0000\u0000\b\u017d\u0001\u0000\u0000\u0000\n\u0185\u0001"+ + "\u0000\u0000\u0000\f\u018c\u0001\u0000\u0000\u0000\u000e\u0193\u0001\u0000"+ + "\u0000\u0000\u0010\u019a\u0001\u0000\u0000\u0000\u0012\u01a1\u0001\u0000"+ + "\u0000\u0000\u0014\u01aa\u0001\u0000\u0000\u0000\u0016\u01b4\u0001\u0000"+ + "\u0000\u0000\u0018\u01bc\u0001\u0000\u0000\u0000\u001a\u01c6\u0001\u0000"+ + "\u0000\u0000\u001c\u01d2\u0001\u0000\u0000\u0000\u001e\u01d9\u0001\u0000"+ + "\u0000\u0000 \u01e4\u0001\u0000\u0000\u0000\"\u01e7\u0001\u0000\u0000"+ + "\u0000$\u01ed\u0001\u0000\u0000\u0000&\u01f6\u0001\u0000\u0000\u0000("+ + "\u01fb\u0001\u0000\u0000\u0000*\u0202\u0001\u0000\u0000\u0000,\u0209\u0001"+ + "\u0000\u0000\u0000.\u020f\u0001\u0000\u0000\u00000\u0214\u0001\u0000\u0000"+ + "\u00002\u021b\u0001\u0000\u0000\u00004\u0225\u0001\u0000\u0000\u00006"+ + "\u0229\u0001\u0000\u0000\u00008\u022f\u0001\u0000\u0000\u0000:\u0232\u0001"+ + "\u0000\u0000\u0000<\u0234\u0001\u0000\u0000\u0000>\u023b\u0001\u0000\u0000"+ + "\u0000@\u0241\u0001\u0000\u0000\u0000B\u024e\u0001\u0000\u0000\u0000D"+ + "\u0257\u0001\u0000\u0000\u0000F\u025b\u0001\u0000\u0000\u0000H\u025f\u0001"+ + "\u0000\u0000\u0000J\u0265\u0001\u0000\u0000\u0000L\u0267\u0001\u0000\u0000"+ + "\u0000N\u026a\u0001\u0000\u0000\u0000P\u026f\u0001\u0000\u0000\u0000R"+ + "\u0275\u0001\u0000\u0000\u0000T\u027b\u0001\u0000\u0000\u0000V\u0282\u0001"+ + "\u0000\u0000\u0000X\u0289\u0001\u0000\u0000\u0000Z\u0292\u0001\u0000\u0000"+ + "\u0000\\\u0298\u0001\u0000\u0000\u0000^\u029e\u0001\u0000\u0000\u0000"+ + "`\u02a5\u0001\u0000\u0000\u0000b\u02ab\u0001\u0000\u0000\u0000d\u02b2"+ + "\u0001\u0000\u0000\u0000f\u02b8\u0001\u0000\u0000\u0000h\u02c1\u0001\u0000"+ + "\u0000\u0000j\u02c9\u0001\u0000\u0000\u0000l\u02cf\u0001\u0000\u0000\u0000"+ + "n\u02d7\u0001\u0000\u0000\u0000p\u02de\u0001\u0000\u0000\u0000r\u02e3"+ + "\u0001\u0000\u0000\u0000t\u02ec\u0001\u0000\u0000\u0000v\u02fb\u0001\u0000"+ + "\u0000\u0000x\u0301\u0001\u0000\u0000\u0000z\u0305\u0001\u0000\u0000\u0000"+ + "|\u0308\u0001\u0000\u0000\u0000~\u030f\u0001\u0000\u0000\u0000\u0080\u0319"+ + "\u0001\u0000\u0000\u0000\u0082\u0323\u0001\u0000\u0000\u0000\u0084\u032f"+ + "\u0001\u0000\u0000\u0000\u0086\u0338\u0001\u0000\u0000\u0000\u0088\u0342"+ + "\u0001\u0000\u0000\u0000\u008a\u034a\u0001\u0000\u0000\u0000\u008c\u0356"+ + "\u0001\u0000\u0000\u0000\u008e\u0365\u0001\u0000\u0000\u0000\u0090\u036b"+ + "\u0001\u0000\u0000\u0000\u0092\u036f\u0001\u0000\u0000\u0000\u0094\u0373"+ + "\u0001\u0000\u0000\u0000\u0096\u0378\u0001\u0000\u0000\u0000\u0098\u0380"+ + "\u0001\u0000\u0000\u0000\u009a\u0388\u0001\u0000\u0000\u0000\u009c\u038d"+ + "\u0001\u0000\u0000\u0000\u009e\u0397\u0001\u0000\u0000\u0000\u00a0\u039e"+ + "\u0001\u0000\u0000\u0000\u00a2\u03a3\u0001\u0000\u0000\u0000\u00a4\u03a9"+ + "\u0001\u0000\u0000\u0000\u00a6\u03ac\u0001\u0000\u0000\u0000\u00a8\u03b0"+ + "\u0001\u0000\u0000\u0000\u00aa\u03b7\u0001\u0000\u0000\u0000\u00ac\u03bc"+ + "\u0001\u0000\u0000\u0000\u00ae\u03c1\u0001\u0000\u0000\u0000\u00b0\u03c6"+ + "\u0001\u0000\u0000\u0000\u00b2\u03ce\u0001\u0000\u0000\u0000\u00b4\u03d5"+ + "\u0001\u0000\u0000\u0000\u00b6\u03db\u0001\u0000\u0000\u0000\u00b8\u03e9"+ + "\u0001\u0000\u0000\u0000\u00ba\u03ec\u0001\u0000\u0000\u0000\u00bc\u03f2"+ + "\u0001\u0000\u0000\u0000\u00be\u03f7\u0001\u0000\u0000\u0000\u00c0\u0402"+ + "\u0001\u0000\u0000\u0000\u00c2\u0406\u0001\u0000\u0000\u0000\u00c4\u040d"+ + "\u0001\u0000\u0000\u0000\u00c6\u0416\u0001\u0000\u0000\u0000\u00c8\u041a"+ + "\u0001\u0000\u0000\u0000\u00ca\u0420\u0001\u0000\u0000\u0000\u00cc\u042a"+ + "\u0001\u0000\u0000\u0000\u00ce\u042c\u0001\u0000\u0000\u0000\u00d0\u0430"+ + "\u0001\u0000\u0000\u0000\u00d2\u0432\u0001\u0000\u0000\u0000\u00d4\u0436"+ + "\u0001\u0000\u0000\u0000\u00d6\u0438\u0001\u0000\u0000\u0000\u00d8\u043c"+ + "\u0001\u0000\u0000\u0000\u00da\u043e\u0001\u0000\u0000\u0000\u00dc\u0440"+ + "\u0001\u0000\u0000\u0000\u00de\u0442\u0001\u0000\u0000\u0000\u00e0\u0444"+ + "\u0001\u0000\u0000\u0000\u00e2\u0446\u0001\u0000\u0000\u0000\u00e4\u044b"+ + "\u0001\u0000\u0000\u0000\u00e6\u0450\u0001\u0000\u0000\u0000\u00e8\u0453"+ + "\u0001\u0000\u0000\u0000\u00ea\u0457\u0001\u0000\u0000\u0000\u00ec\u045a"+ + "\u0001\u0000\u0000\u0000\u00ee\u045d\u0001\u0000\u0000\u0000\u00f0\u0460"+ + "\u0001\u0000\u0000\u0000\u00f2\u0463\u0001\u0000\u0000\u0000\u00f4\u0465"+ + "\u0001\u0000\u0000\u0000\u00f6\u0468\u0001\u0000\u0000\u0000\u00f8\u046a"+ + "\u0001\u0000\u0000\u0000\u00fa\u046d\u0001\u0000\u0000\u0000\u00fc\u046f"+ + "\u0001\u0000\u0000\u0000\u00fe\u0471\u0001\u0000\u0000\u0000\u0100\u0473"+ + "\u0001\u0000\u0000\u0000\u0102\u0476\u0001\u0000\u0000\u0000\u0104\u0479"+ + "\u0001\u0000\u0000\u0000\u0106\u047c\u0001\u0000\u0000\u0000\u0108\u047e"+ + "\u0001\u0000\u0000\u0000\u010a\u0480\u0001\u0000\u0000\u0000\u010c\u0482"+ + "\u0001\u0000\u0000\u0000\u010e\u0484\u0001\u0000\u0000\u0000\u0110\u0486"+ + "\u0001\u0000\u0000\u0000\u0112\u0488\u0001\u0000\u0000\u0000\u0114\u0496"+ + "\u0001\u0000\u0000\u0000\u0116\u049a\u0001\u0000\u0000\u0000\u0118\u04a6"+ + "\u0001\u0000\u0000\u0000\u011a\u04b4\u0001\u0000\u0000\u0000\u011c\u04c0"+ + "\u0001\u0000\u0000\u0000\u011e\u04e4\u0001\u0000\u0000\u0000\u0120\u04e6"+ + "\u0001\u0000\u0000\u0000\u0122\u04f1\u0001\u0000\u0000\u0000\u0124\u04f7"+ + "\u0001\u0000\u0000\u0000\u0126\u04fe\u0001\u0000\u0000\u0000\u0128\u0504"+ + "\u0001\u0000\u0000\u0000\u012a\u0506\u0001\u0000\u0000\u0000\u012c\u050b"+ + "\u0001\u0000\u0000\u0000\u012e\u0510\u0001\u0000\u0000\u0000\u0130\u0517"+ + "\u0001\u0000\u0000\u0000\u0132\u0522\u0001\u0000\u0000\u0000\u0134\u052d"+ + "\u0001\u0000\u0000\u0000\u0136\u053a\u0001\u0000\u0000\u0000\u0138\u0540"+ + "\u0001\u0000\u0000\u0000\u013a\u054f\u0001\u0000\u0000\u0000\u013c\u0555"+ + "\u0001\u0000\u0000\u0000\u013e\u0564\u0001\u0000\u0000\u0000\u0140\u0566"+ + "\u0001\u0000\u0000\u0000\u0142\u0582\u0001\u0000\u0000\u0000\u0144\u058c"+ + "\u0001\u0000\u0000\u0000\u0146\u058e\u0001\u0000\u0000\u0000\u0148\u0590"+ + "\u0001\u0000\u0000\u0000\u014a\u0592\u0001\u0000\u0000\u0000\u014c\u059a"+ + "\u0001\u0000\u0000\u0000\u014e\u059c\u0001\u0000\u0000\u0000\u0150\u059e"+ + "\u0001\u0000\u0000\u0000\u0152\u05a1\u0001\u0000\u0000\u0000\u0154\u05a7"+ + "\u0001\u0000\u0000\u0000\u0156\u05b5\u0001\u0000\u0000\u0000\u0158\u05d2"+ + "\u0001\u0000\u0000\u0000\u015a\u05d6\u0001\u0000\u0000\u0000\u015c\u015f"+ + "\u0003\u0004\u0001\u0000\u015d\u015f\u0003\u011c\u008d\u0000\u015e\u015c"+ + "\u0001\u0000\u0000\u0000\u015e\u015d\u0001\u0000\u0000\u0000\u015f\u0160"+ + "\u0001\u0000\u0000\u0000\u0160\u0161\u0006\u0000\u0000\u0000\u0161\u0003"+ + "\u0001\u0000\u0000\u0000\u0162\u016c\u0003\u0142\u00a0\u0000\u0163\u0164"+ + "\u0005.\u0000\u0000\u0164\u0166\u0004\u0001\u0000\u0000\u0165\u0167\u0003"+ + "\u0142\u00a0\u0000\u0166\u0165\u0001\u0000\u0000\u0000\u0166\u0167\u0001"+ + "\u0000\u0000\u0000\u0167\u0169\u0001\u0000\u0000\u0000\u0168\u016a\u0003"+ + "\u014a\u00a4\u0000\u0169\u0168\u0001\u0000\u0000\u0000\u0169\u016a\u0001"+ + "\u0000\u0000\u0000\u016a\u016d\u0001\u0000\u0000\u0000\u016b\u016d\u0003"+ + "\u014a\u00a4\u0000\u016c\u0163\u0001\u0000\u0000\u0000\u016c\u016b\u0001"+ + "\u0000\u0000\u0000\u016d\u0175\u0001\u0000\u0000\u0000\u016e\u016f\u0005"+ + ".\u0000\u0000\u016f\u0170\u0004\u0001\u0001\u0000\u0170\u0172\u0003\u0142"+ + "\u00a0\u0000\u0171\u0173\u0003\u014a\u00a4\u0000\u0172\u0171\u0001\u0000"+ + "\u0000\u0000\u0172\u0173\u0001\u0000\u0000\u0000\u0173\u0175\u0001\u0000"+ + "\u0000\u0000\u0174\u0162\u0001\u0000\u0000\u0000\u0174\u016e\u0001\u0000"+ + "\u0000\u0000\u0175\u0005\u0001\u0000\u0000\u0000\u0176\u0177\u0005t\u0000"+ + "\u0000\u0177\u0178\u0005r\u0000\u0000\u0178\u0179\u0005u\u0000\u0000\u0179"+ + "\u017a\u0005e\u0000\u0000\u017a\u017b\u0001\u0000\u0000\u0000\u017b\u017c"+ + "\u0006\u0002\u0000\u0000\u017c\u0007\u0001\u0000\u0000\u0000\u017d\u017e"+ + "\u0005f\u0000\u0000\u017e\u017f\u0005a\u0000\u0000\u017f\u0180\u0005l"+ + "\u0000\u0000\u0180\u0181\u0005s\u0000\u0000\u0181\u0182\u0005e\u0000\u0000"+ + "\u0182\u0183\u0001\u0000\u0000\u0000\u0183\u0184\u0006\u0003\u0000\u0000"+ + "\u0184\t\u0001\u0000\u0000\u0000\u0185\u0186\u0005a\u0000\u0000\u0186"+ + "\u0187\u0005s\u0000\u0000\u0187\u0188\u0005s\u0000\u0000\u0188\u0189\u0005"+ + "e\u0000\u0000\u0189\u018a\u0005r\u0000\u0000\u018a\u018b\u0005t\u0000"+ + "\u0000\u018b\u000b\u0001\u0000\u0000\u0000\u018c\u018d\u0005a\u0000\u0000"+ + "\u018d\u018e\u0005s\u0000\u0000\u018e\u018f\u0005s\u0000\u0000\u018f\u0190"+ + "\u0005u\u0000\u0000\u0190\u0191\u0005m\u0000\u0000\u0191\u0192\u0005e"+ + "\u0000\u0000\u0192\r\u0001\u0000\u0000\u0000\u0193\u0194\u0005i\u0000"+ + "\u0000\u0194\u0195\u0005n\u0000\u0000\u0195\u0196\u0005h\u0000\u0000\u0196"+ + "\u0197\u0005a\u0000\u0000\u0197\u0198\u0005l\u0000\u0000\u0198\u0199\u0005"+ + "e\u0000\u0000\u0199\u000f\u0001\u0000\u0000\u0000\u019a\u019b\u0005e\u0000"+ + "\u0000\u019b\u019c\u0005x\u0000\u0000\u019c\u019d\u0005h\u0000\u0000\u019d"+ + "\u019e\u0005a\u0000\u0000\u019e\u019f\u0005l\u0000\u0000\u019f\u01a0\u0005"+ + "e\u0000\u0000\u01a0\u0011\u0001\u0000\u0000\u0000\u01a1\u01a2\u0005r\u0000"+ + "\u0000\u01a2\u01a3\u0005e\u0000\u0000\u01a3\u01a4\u0005q\u0000\u0000\u01a4"+ + "\u01a5\u0005u\u0000\u0000\u01a5\u01a6\u0005i\u0000\u0000\u01a6\u01a7\u0005"+ + "r\u0000\u0000\u01a7\u01a8\u0005e\u0000\u0000\u01a8\u01a9\u0005s\u0000"+ + "\u0000\u01a9\u0013\u0001\u0000\u0000\u0000\u01aa\u01ab\u0005p\u0000\u0000"+ + "\u01ab\u01ac\u0005r\u0000\u0000\u01ac\u01ad\u0005e\u0000\u0000\u01ad\u01ae"+ + "\u0005s\u0000\u0000\u01ae\u01af\u0005e\u0000\u0000\u01af\u01b0\u0005r"+ + "\u0000\u0000\u01b0\u01b1\u0005v\u0000\u0000\u01b1\u01b2\u0005e\u0000\u0000"+ + "\u01b2\u01b3\u0005s\u0000\u0000\u01b3\u0015\u0001\u0000\u0000\u0000\u01b4"+ + "\u01b5\u0005e\u0000\u0000\u01b5\u01b6\u0005n\u0000\u0000\u01b6\u01b7\u0005"+ + "s\u0000\u0000\u01b7\u01b8\u0005u\u0000\u0000\u01b8\u01b9\u0005r\u0000"+ + "\u0000\u01b9\u01ba\u0005e\u0000\u0000\u01ba\u01bb\u0005s\u0000\u0000\u01bb"+ + "\u0017\u0001\u0000\u0000\u0000\u01bc\u01bd\u0005i\u0000\u0000\u01bd\u01be"+ + "\u0005n\u0000\u0000\u01be\u01bf\u0005v\u0000\u0000\u01bf\u01c0\u0005a"+ + "\u0000\u0000\u01c0\u01c1\u0005r\u0000\u0000\u01c1\u01c2\u0005i\u0000\u0000"+ + "\u01c2\u01c3\u0005a\u0000\u0000\u01c3\u01c4\u0005n\u0000\u0000\u01c4\u01c5"+ + "\u0005t\u0000\u0000\u01c5\u0019\u0001\u0000\u0000\u0000\u01c6\u01c7\u0005"+ + "d\u0000\u0000\u01c7\u01c8\u0005e\u0000\u0000\u01c8\u01c9\u0005c\u0000"+ + "\u0000\u01c9\u01ca\u0005r\u0000\u0000\u01ca\u01cb\u0005e\u0000\u0000\u01cb"+ + "\u01cc\u0005a\u0000\u0000\u01cc\u01cd\u0005s\u0000\u0000\u01cd\u01ce\u0005"+ + "e\u0000\u0000\u01ce\u01cf\u0005s\u0000\u0000\u01cf\u01d0\u0001\u0000\u0000"+ + "\u0000\u01d0\u01d1\u0006\f\u0000\u0000\u01d1\u001b\u0001\u0000\u0000\u0000"+ + "\u01d2\u01d3\u0005p\u0000\u0000\u01d3\u01d4\u0005u\u0000\u0000\u01d4\u01d5"+ + "\u0005r\u0000\u0000\u01d5\u01d6\u0005e\u0000\u0000\u01d6\u01d7\u0001\u0000"+ + "\u0000\u0000\u01d7\u01d8\u0006\r\u0000\u0000\u01d8\u001d\u0001\u0000\u0000"+ + "\u0000\u01d9\u01da\u0005i\u0000\u0000\u01da\u01db\u0005m\u0000\u0000\u01db"+ + "\u01dc\u0005p\u0000\u0000\u01dc\u01dd\u0005l\u0000\u0000\u01dd\u01de\u0005"+ + "e\u0000\u0000\u01de\u01df\u0005m\u0000\u0000\u01df\u01e0\u0005e\u0000"+ + "\u0000\u01e0\u01e1\u0005n\u0000\u0000\u01e1\u01e2\u0005t\u0000\u0000\u01e2"+ + "\u01e3\u0005s\u0000\u0000\u01e3\u001f\u0001\u0000\u0000\u0000\u01e4\u01e5"+ + "\u0005a\u0000\u0000\u01e5\u01e6\u0005s\u0000\u0000\u01e6!\u0001\u0000"+ + "\u0000\u0000\u01e7\u01e8\u0005o\u0000\u0000\u01e8\u01e9\u0005l\u0000\u0000"+ + "\u01e9\u01ea\u0005d\u0000\u0000\u01ea\u01eb\u0001\u0000\u0000\u0000\u01eb"+ + "\u01ec\u0006\u0010\u0000\u0000\u01ec#\u0001\u0000\u0000\u0000\u01ed\u01ee"+ + "\u0005b\u0000\u0000\u01ee\u01ef\u0005e\u0000\u0000\u01ef\u01f0\u0005f"+ + "\u0000\u0000\u01f0\u01f1\u0005o\u0000\u0000\u01f1\u01f2\u0005r\u0000\u0000"+ + "\u01f2\u01f3\u0005e\u0000\u0000\u01f3\u01f4\u0001\u0000\u0000\u0000\u01f4"+ + "\u01f5\u0006\u0011\u0000\u0000\u01f5%\u0001\u0000\u0000\u0000\u01f6\u01f7"+ + "\u0005#\u0000\u0000\u01f7\u01f8\u0005l\u0000\u0000\u01f8\u01f9\u0005h"+ + "\u0000\u0000\u01f9\u01fa\u0005s\u0000\u0000\u01fa\'\u0001\u0000\u0000"+ + "\u0000\u01fb\u01fc\u0005f\u0000\u0000\u01fc\u01fd\u0005o\u0000\u0000\u01fd"+ + "\u01fe\u0005r\u0000\u0000\u01fe\u01ff\u0005a\u0000\u0000\u01ff\u0200\u0005"+ + "l\u0000\u0000\u0200\u0201\u0005l\u0000\u0000\u0201)\u0001\u0000\u0000"+ + "\u0000\u0202\u0203\u0005e\u0000\u0000\u0203\u0204\u0005x\u0000\u0000\u0204"+ + "\u0205\u0005i\u0000\u0000\u0205\u0206\u0005s\u0000\u0000\u0206\u0207\u0005"+ + "t\u0000\u0000\u0207\u0208\u0005s\u0000\u0000\u0208+\u0001\u0000\u0000"+ + "\u0000\u0209\u020a\u0005a\u0000\u0000\u020a\u020b\u0005c\u0000\u0000\u020b"+ + "\u020c\u0005c\u0000\u0000\u020c\u020d\u0001\u0000\u0000\u0000\u020d\u020e"+ + "\u0006\u0015\u0000\u0000\u020e-\u0001\u0000\u0000\u0000\u020f\u0210\u0005"+ + "f\u0000\u0000\u0210\u0211\u0005o\u0000\u0000\u0211\u0212\u0005l\u0000"+ + "\u0000\u0212\u0213\u0005d\u0000\u0000\u0213/\u0001\u0000\u0000\u0000\u0214"+ + "\u0215\u0005u\u0000\u0000\u0215\u0216\u0005n\u0000\u0000\u0216\u0217\u0005"+ + "f\u0000\u0000\u0217\u0218\u0005o\u0000\u0000\u0218\u0219\u0005l\u0000"+ + "\u0000\u0219\u021a\u0005d\u0000\u0000\u021a1\u0001\u0000\u0000\u0000\u021b"+ + "\u021c\u0005u\u0000\u0000\u021c\u021d\u0005n\u0000\u0000\u021d\u021e\u0005"+ + "f\u0000\u0000\u021e\u021f\u0005o\u0000\u0000\u021f\u0220\u0005l\u0000"+ + "\u0000\u0220\u0221\u0005d\u0000\u0000\u0221\u0222\u0005i\u0000\u0000\u0222"+ + "\u0223\u0005n\u0000\u0000\u0223\u0224\u0005g\u0000\u0000\u02243\u0001"+ + "\u0000\u0000\u0000\u0225\u0226\u0005l\u0000\u0000\u0226\u0227\u0005e\u0000"+ + "\u0000\u0227\u0228\u0005t\u0000\u0000\u02285\u0001\u0000\u0000\u0000\u0229"+ + "\u022a\u0005g\u0000\u0000\u022a\u022b\u0005h\u0000\u0000\u022b\u022c\u0005"+ + "o\u0000\u0000\u022c\u022d\u0005s\u0000\u0000\u022d\u022e\u0005t\u0000"+ + "\u0000\u022e7\u0001\u0000\u0000\u0000\u022f\u0230\u0005i\u0000\u0000\u0230"+ + "\u0231\u0005n\u0000\u0000\u02319\u0001\u0000\u0000\u0000\u0232\u0233\u0005"+ + "#\u0000\u0000\u0233;\u0001\u0000\u0000\u0000\u0234\u0235\u0005s\u0000"+ + "\u0000\u0235\u0236\u0005u\u0000\u0000\u0236\u0237\u0005b\u0000\u0000\u0237"+ + "\u0238\u0005s\u0000\u0000\u0238\u0239\u0005e\u0000\u0000\u0239\u023a\u0005"+ + "t\u0000\u0000\u023a=\u0001\u0000\u0000\u0000\u023b\u023c\u0005u\u0000"+ + "\u0000\u023c\u023d\u0005n\u0000\u0000\u023d\u023e\u0005i\u0000\u0000\u023e"+ + "\u023f\u0005o\u0000\u0000\u023f\u0240\u0005n\u0000\u0000\u0240?\u0001"+ + "\u0000\u0000\u0000\u0241\u0242\u0005i\u0000\u0000\u0242\u0243\u0005n\u0000"+ + "\u0000\u0243\u0244\u0005t\u0000\u0000\u0244\u0245\u0005e\u0000\u0000\u0245"+ + "\u0246\u0005r\u0000\u0000\u0246\u0247\u0005s\u0000\u0000\u0247\u0248\u0005"+ + "e\u0000\u0000\u0248\u0249\u0005c\u0000\u0000\u0249\u024a\u0005t\u0000"+ + "\u0000\u024a\u024b\u0005i\u0000\u0000\u024b\u024c\u0005o\u0000\u0000\u024c"+ + "\u024d\u0005n\u0000\u0000\u024dA\u0001\u0000\u0000\u0000\u024e\u024f\u0005"+ + "s\u0000\u0000\u024f\u0250\u0005e\u0000\u0000\u0250\u0251\u0005t\u0000"+ + "\u0000\u0251\u0252\u0005m\u0000\u0000\u0252\u0253\u0005i\u0000\u0000\u0253"+ + "\u0254\u0005n\u0000\u0000\u0254\u0255\u0005u\u0000\u0000\u0255\u0256\u0005"+ + "s\u0000\u0000\u0256C\u0001\u0000\u0000\u0000\u0257\u0258\u0005=\u0000"+ + "\u0000\u0258\u0259\u0005=\u0000\u0000\u0259\u025a\u0005>\u0000\u0000\u025a"+ + "E\u0001\u0000\u0000\u0000\u025b\u025c\u0005-\u0000\u0000\u025c\u025d\u0005"+ + "-\u0000\u0000\u025d\u025e\u0005*\u0000\u0000\u025eG\u0001\u0000\u0000"+ + "\u0000\u025f\u0260\u0005a\u0000\u0000\u0260\u0261\u0005p\u0000\u0000\u0261"+ + "\u0262\u0005p\u0000\u0000\u0262\u0263\u0005l\u0000\u0000\u0263\u0264\u0005"+ + "y\u0000\u0000\u0264I\u0001\u0000\u0000\u0000\u0265\u0266\u0005?\u0000"+ + "\u0000\u0266K\u0001\u0000\u0000\u0000\u0267\u0268\u0005!\u0000\u0000\u0268"+ + "\u0269\u0005<\u0000\u0000\u0269M\u0001\u0000\u0000\u0000\u026a\u026b\u0005"+ + "!\u0000\u0000\u026b\u026c\u0005>\u0000\u0000\u026c\u026d\u0001\u0000\u0000"+ + "\u0000\u026d\u026e\u0006&\u0000\u0000\u026eO\u0001\u0000\u0000\u0000\u026f"+ + "\u0270\u0005s\u0000\u0000\u0270\u0271\u0005e\u0000\u0000\u0271\u0272\u0005"+ + "q\u0000\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0274\u0006\'"+ + "\u0000\u0000\u0274Q\u0001\u0000\u0000\u0000\u0275\u0276\u0005s\u0000\u0000"+ + "\u0276\u0277\u0005e\u0000\u0000\u0277\u0278\u0005t\u0000\u0000\u0278\u0279"+ + "\u0001\u0000\u0000\u0000\u0279\u027a\u0006(\u0000\u0000\u027aS\u0001\u0000"+ + "\u0000\u0000\u027b\u027c\u0005m\u0000\u0000\u027c\u027d\u0005s\u0000\u0000"+ + "\u027d\u027e\u0005e\u0000\u0000\u027e\u027f\u0005t\u0000\u0000\u027f\u0280"+ + "\u0001\u0000\u0000\u0000\u0280\u0281\u0006)\u0000\u0000\u0281U\u0001\u0000"+ + "\u0000\u0000\u0282\u0283\u0005d\u0000\u0000\u0283\u0284\u0005i\u0000\u0000"+ + "\u0284\u0285\u0005c\u0000\u0000\u0285\u0286\u0005t\u0000\u0000\u0286\u0287"+ + "\u0001\u0000\u0000\u0000\u0287\u0288\u0006*\u0000\u0000\u0288W\u0001\u0000"+ + "\u0000\u0000\u0289\u028a\u0005o\u0000\u0000\u028a\u028b\u0005p\u0000\u0000"+ + "\u028b\u028c\u0005t\u0000\u0000\u028c\u028d\u0005i\u0000\u0000\u028d\u028e"+ + "\u0005o\u0000\u0000\u028e\u028f\u0005n\u0000\u0000\u028f\u0290\u0001\u0000"+ + "\u0000\u0000\u0290\u0291\u0006+\u0000\u0000\u0291Y\u0001\u0000\u0000\u0000"+ + "\u0292\u0293\u0005l\u0000\u0000\u0293\u0294\u0005e\u0000\u0000\u0294\u0295"+ + "\u0005n\u0000\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296\u0297\u0006"+ + ",\u0000\u0000\u0297[\u0001\u0000\u0000\u0000\u0298\u0299\u0005n\u0000"+ + "\u0000\u0299\u029a\u0005e\u0000\u0000\u029a\u029b\u0005w\u0000\u0000\u029b"+ + "\u029c\u0001\u0000\u0000\u0000\u029c\u029d\u0006-\u0000\u0000\u029d]\u0001"+ + "\u0000\u0000\u0000\u029e\u029f\u0005m\u0000\u0000\u029f\u02a0\u0005a\u0000"+ + "\u0000\u02a0\u02a1\u0005k\u0000\u0000\u02a1\u02a2\u0005e\u0000\u0000\u02a2"+ + "\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006.\u0000\u0000\u02a4_\u0001"+ + "\u0000\u0000\u0000\u02a5\u02a6\u0005c\u0000\u0000\u02a6\u02a7\u0005a\u0000"+ + "\u0000\u02a7\u02a8\u0005p\u0000\u0000\u02a8\u02a9\u0001\u0000\u0000\u0000"+ + "\u02a9\u02aa\u0006/\u0000\u0000\u02aaa\u0001\u0000\u0000\u0000\u02ab\u02ac"+ + "\u0005s\u0000\u0000\u02ac\u02ad\u0005o\u0000\u0000\u02ad\u02ae\u0005m"+ + "\u0000\u0000\u02ae\u02af\u0005e\u0000\u0000\u02af\u02b0\u0001\u0000\u0000"+ + "\u0000\u02b0\u02b1\u00060\u0000\u0000\u02b1c\u0001\u0000\u0000\u0000\u02b2"+ + "\u02b3\u0005g\u0000\u0000\u02b3\u02b4\u0005e\u0000\u0000\u02b4\u02b5\u0005"+ + "t\u0000\u0000\u02b5\u02b6\u0001\u0000\u0000\u0000\u02b6\u02b7\u00061\u0000"+ + "\u0000\u02b7e\u0001\u0000\u0000\u0000\u02b8\u02b9\u0005d\u0000\u0000\u02b9"+ + "\u02ba\u0005o\u0000\u0000\u02ba\u02bb\u0005m\u0000\u0000\u02bb\u02bc\u0005"+ + "a\u0000\u0000\u02bc\u02bd\u0005i\u0000\u0000\u02bd\u02be\u0005n\u0000"+ + "\u0000\u02be\u02bf\u0001\u0000\u0000\u0000\u02bf\u02c0\u00062\u0000\u0000"+ + "\u02c0g\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005a\u0000\u0000\u02c2\u02c3"+ + "\u0005x\u0000\u0000\u02c3\u02c4\u0005i\u0000\u0000\u02c4\u02c5\u0005o"+ + "\u0000\u0000\u02c5\u02c6\u0005m\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000"+ + "\u0000\u02c7\u02c8\u00063\u0000\u0000\u02c8i\u0001\u0000\u0000\u0000\u02c9"+ + "\u02ca\u0005a\u0000\u0000\u02ca\u02cb\u0005d\u0000\u0000\u02cb\u02cc\u0005"+ + "t\u0000\u0000\u02cc\u02cd\u0001\u0000\u0000\u0000\u02cd\u02ce\u00064\u0000"+ + "\u0000\u02cek\u0001\u0000\u0000\u0000\u02cf\u02d0\u0005m\u0000\u0000\u02d0"+ + "\u02d1\u0005a\u0000\u0000\u02d1\u02d2\u0005t\u0000\u0000\u02d2\u02d3\u0005"+ + "c\u0000\u0000\u02d3\u02d4\u0005h\u0000\u0000\u02d4\u02d5\u0001\u0000\u0000"+ + "\u0000\u02d5\u02d6\u00065\u0000\u0000\u02d6m\u0001\u0000\u0000\u0000\u02d7"+ + "\u02d8\u0005n\u0000\u0000\u02d8\u02d9\u0005o\u0000\u0000\u02d9\u02da\u0005"+ + "n\u0000\u0000\u02da\u02db\u0005e\u0000\u0000\u02db\u02dc\u0001\u0000\u0000"+ + "\u0000\u02dc\u02dd\u00066\u0000\u0000\u02ddo\u0001\u0000\u0000\u0000\u02de"+ + "\u02df\u0005p\u0000\u0000\u02df\u02e0\u0005r\u0000\u0000\u02e0\u02e1\u0005"+ + "e\u0000\u0000\u02e1\u02e2\u0005d\u0000\u0000\u02e2q\u0001\u0000\u0000"+ + "\u0000\u02e3\u02e4\u0005t\u0000\u0000\u02e4\u02e5\u0005y\u0000\u0000\u02e5"+ + "\u02e6\u0005p\u0000\u0000\u02e6\u02e7\u0005e\u0000\u0000\u02e7\u02e8\u0005"+ + "O\u0000\u0000\u02e8\u02e9\u0005f\u0000\u0000\u02e9\u02ea\u0001\u0000\u0000"+ + "\u0000\u02ea\u02eb\u00068\u0000\u0000\u02ebs\u0001\u0000\u0000\u0000\u02ec"+ + "\u02ed\u0005i\u0000\u0000\u02ed\u02ee\u0005s\u0000\u0000\u02ee\u02ef\u0005"+ + "C\u0000\u0000\u02ef\u02f0\u0005o\u0000\u0000\u02f0\u02f1\u0005m\u0000"+ + "\u0000\u02f1\u02f2\u0005p\u0000\u0000\u02f2\u02f3\u0005a\u0000\u0000\u02f3"+ + "\u02f4\u0005r\u0000\u0000\u02f4\u02f5\u0005a\u0000\u0000\u02f5\u02f6\u0005"+ + "b\u0000\u0000\u02f6\u02f7\u0005l\u0000\u0000\u02f7\u02f8\u0005e\u0000"+ + "\u0000\u02f8\u02f9\u0001\u0000\u0000\u0000\u02f9\u02fa\u00069\u0000\u0000"+ + "\u02fau\u0001\u0000\u0000\u0000\u02fb\u02fc\u0005s\u0000\u0000\u02fc\u02fd"+ + "\u0005h\u0000\u0000\u02fd\u02fe\u0005a\u0000\u0000\u02fe\u02ff\u0005r"+ + "\u0000\u0000\u02ff\u0300\u0005e\u0000\u0000\u0300w\u0001\u0000\u0000\u0000"+ + "\u0301\u0302\u0005@\u0000\u0000\u0302\u0303\u0001\u0000\u0000\u0000\u0303"+ + "\u0304\u0006;\u0000\u0000\u0304y\u0001\u0000\u0000\u0000\u0305\u0306\u0005"+ + ".\u0000\u0000\u0306\u0307\u0005.\u0000\u0000\u0307{\u0001\u0000\u0000"+ + "\u0000\u0308\u0309\u0005s\u0000\u0000\u0309\u030a\u0005h\u0000\u0000\u030a"+ + "\u030b\u0005a\u0000\u0000\u030b\u030c\u0005r\u0000\u0000\u030c\u030d\u0005"+ + "e\u0000\u0000\u030d\u030e\u0005d\u0000\u0000\u030e}\u0001\u0000\u0000"+ + "\u0000\u030f\u0310\u0005e\u0000\u0000\u0310\u0311\u0005x\u0000\u0000\u0311"+ + "\u0312\u0005c\u0000\u0000\u0312\u0313\u0005l\u0000\u0000\u0313\u0314\u0005"+ + "u\u0000\u0000\u0314\u0315\u0005s\u0000\u0000\u0315\u0316\u0005i\u0000"+ + "\u0000\u0316\u0317\u0005v\u0000\u0000\u0317\u0318\u0005e\u0000\u0000\u0318"+ + "\u007f\u0001\u0000\u0000\u0000\u0319\u031a\u0005p\u0000\u0000\u031a\u031b"+ + "\u0005r\u0000\u0000\u031b\u031c\u0005e\u0000\u0000\u031c\u031d\u0005d"+ + "\u0000\u0000\u031d\u031e\u0005i\u0000\u0000\u031e\u031f\u0005c\u0000\u0000"+ + "\u031f\u0320\u0005a\u0000\u0000\u0320\u0321\u0005t\u0000\u0000\u0321\u0322"+ + "\u0005e\u0000\u0000\u0322\u0081\u0001\u0000\u0000\u0000\u0323\u0324\u0005"+ + "w\u0000\u0000\u0324\u0325\u0005r\u0000\u0000\u0325\u0326\u0005i\u0000"+ + "\u0000\u0326\u0327\u0005t\u0000\u0000\u0327\u0328\u0005e\u0000\u0000\u0328"+ + "\u0329\u0005P\u0000\u0000\u0329\u032a\u0005e\u0000\u0000\u032a\u032b\u0005"+ + "r\u0000\u0000\u032b\u032c\u0005m\u0000\u0000\u032c\u032d\u0001\u0000\u0000"+ + "\u0000\u032d\u032e\u0006@\u0000\u0000\u032e\u0083\u0001\u0000\u0000\u0000"+ + "\u032f\u0330\u0005n\u0000\u0000\u0330\u0331\u0005o\u0000\u0000\u0331\u0332"+ + "\u0005P\u0000\u0000\u0332\u0333\u0005e\u0000\u0000\u0333\u0334\u0005r"+ + "\u0000\u0000\u0334\u0335\u0005m\u0000\u0000\u0335\u0336\u0001\u0000\u0000"+ + "\u0000\u0336\u0337\u0006A\u0000\u0000\u0337\u0085\u0001\u0000\u0000\u0000"+ + "\u0338\u0339\u0005t\u0000\u0000\u0339\u033a\u0005r\u0000\u0000\u033a\u033b"+ + "\u0005u\u0000\u0000\u033b\u033c\u0005s\u0000\u0000\u033c\u033d\u0005t"+ + "\u0000\u0000\u033d\u033e\u0005e\u0000\u0000\u033e\u033f\u0005d\u0000\u0000"+ + "\u033f\u0340\u0001\u0000\u0000\u0000\u0340\u0341\u0006B\u0000\u0000\u0341"+ + "\u0087\u0001\u0000\u0000\u0000\u0342\u0343\u0005o\u0000\u0000\u0343\u0344"+ + "\u0005u\u0000\u0000\u0344\u0345\u0005t\u0000\u0000\u0345\u0346\u0005l"+ + "\u0000\u0000\u0346\u0347\u0005i\u0000\u0000\u0347\u0348\u0005n\u0000\u0000"+ + "\u0348\u0349\u0005e\u0000\u0000\u0349\u0089\u0001\u0000\u0000\u0000\u034a"+ + "\u034b\u0005i\u0000\u0000\u034b\u034c\u0005n\u0000\u0000\u034c\u034d\u0005"+ + "i\u0000\u0000\u034d\u034e\u0005t\u0000\u0000\u034e\u034f\u0005E\u0000"+ + "\u0000\u034f\u0350\u0005n\u0000\u0000\u0350\u0351\u0005s\u0000\u0000\u0351"+ + "\u0352\u0005u\u0000\u0000\u0352\u0353\u0005r\u0000\u0000\u0353\u0354\u0005"+ + "e\u0000\u0000\u0354\u0355\u0005s\u0000\u0000\u0355\u008b\u0001\u0000\u0000"+ + "\u0000\u0356\u0357\u0005i\u0000\u0000\u0357\u0358\u0005m\u0000\u0000\u0358"+ + "\u0359\u0005p\u0000\u0000\u0359\u035a\u0005o\u0000\u0000\u035a\u035b\u0005"+ + "r\u0000\u0000\u035b\u035c\u0005t\u0000\u0000\u035c\u035d\u0005R\u0000"+ + "\u0000\u035d\u035e\u0005e\u0000\u0000\u035e\u035f\u0005q\u0000\u0000\u035f"+ + "\u0360\u0005u\u0000\u0000\u0360\u0361\u0005i\u0000\u0000\u0361\u0362\u0005"+ + "r\u0000\u0000\u0362\u0363\u0005e\u0000\u0000\u0363\u0364\u0005s\u0000"+ + "\u0000\u0364\u008d\u0001\u0000\u0000\u0000\u0365\u0366\u0005p\u0000\u0000"+ + "\u0366\u0367\u0005r\u0000\u0000\u0367\u0368\u0005o\u0000\u0000\u0368\u0369"+ + "\u0005o\u0000\u0000\u0369\u036a\u0005f\u0000\u0000\u036a\u008f\u0001\u0000"+ + "\u0000\u0000\u036b\u036c\u0005=\u0000\u0000\u036c\u036d\u0005=\u0000\u0000"+ + "\u036d\u036e\u0005=\u0000\u0000\u036e\u0091\u0001\u0000\u0000\u0000\u036f"+ + "\u0370\u0005!\u0000\u0000\u0370\u0371\u0005=\u0000\u0000\u0371\u0372\u0005"+ + "=\u0000\u0000\u0372\u0093\u0001\u0000\u0000\u0000\u0373\u0374\u0005w\u0000"+ + "\u0000\u0374\u0375\u0005i\u0000\u0000\u0375\u0376\u0005t\u0000\u0000\u0376"+ + "\u0377\u0005h\u0000\u0000\u0377\u0095\u0001\u0000\u0000\u0000\u0378\u0379"+ + "\u0005b\u0000\u0000\u0379\u037a\u0005r\u0000\u0000\u037a\u037b\u0005e"+ + "\u0000\u0000\u037b\u037c\u0005a\u0000\u0000\u037c\u037d\u0005k\u0000\u0000"+ + "\u037d\u037e\u0001\u0000\u0000\u0000\u037e\u037f\u0006J\u0000\u0000\u037f"+ + "\u0097\u0001\u0000\u0000\u0000\u0380\u0381\u0005d\u0000\u0000\u0381\u0382"+ + "\u0005e\u0000\u0000\u0382\u0383\u0005f\u0000\u0000\u0383\u0384\u0005a"+ + "\u0000\u0000\u0384\u0385\u0005u\u0000\u0000\u0385\u0386\u0005l\u0000\u0000"+ + "\u0386\u0387\u0005t\u0000\u0000\u0387\u0099\u0001\u0000\u0000\u0000\u0388"+ + "\u0389\u0005f\u0000\u0000\u0389\u038a\u0005u\u0000\u0000\u038a\u038b\u0005"+ + "n\u0000\u0000\u038b\u038c\u0005c\u0000\u0000\u038c\u009b\u0001\u0000\u0000"+ + "\u0000\u038d\u038e\u0005i\u0000\u0000\u038e\u038f\u0005n\u0000\u0000\u038f"+ + "\u0390\u0005t\u0000\u0000\u0390\u0391\u0005e\u0000\u0000\u0391\u0392\u0005"+ + "r\u0000\u0000\u0392\u0393\u0005f\u0000\u0000\u0393\u0394\u0005a\u0000"+ + "\u0000\u0394\u0395\u0005c\u0000\u0000\u0395\u0396\u0005e\u0000\u0000\u0396"+ + "\u009d\u0001\u0000\u0000\u0000\u0397\u0398\u0005s\u0000\u0000\u0398\u0399"+ + "\u0005e\u0000\u0000\u0399\u039a\u0005l\u0000\u0000\u039a\u039b\u0005e"+ + "\u0000\u0000\u039b\u039c\u0005c\u0000\u0000\u039c\u039d\u0005t\u0000\u0000"+ + "\u039d\u009f\u0001\u0000\u0000\u0000\u039e\u039f\u0005c\u0000\u0000\u039f"+ + "\u03a0\u0005a\u0000\u0000\u03a0\u03a1\u0005s\u0000\u0000\u03a1\u03a2\u0005"+ + "e\u0000\u0000\u03a2\u00a1\u0001\u0000\u0000\u0000\u03a3\u03a4\u0005d\u0000"+ + "\u0000\u03a4\u03a5\u0005e\u0000\u0000\u03a5\u03a6\u0005f\u0000\u0000\u03a6"+ + "\u03a7\u0005e\u0000\u0000\u03a7\u03a8\u0005r\u0000\u0000\u03a8\u00a3\u0001"+ + "\u0000\u0000\u0000\u03a9\u03aa\u0005g\u0000\u0000\u03aa\u03ab\u0005o\u0000"+ + "\u0000\u03ab\u00a5\u0001\u0000\u0000\u0000\u03ac\u03ad\u0005m\u0000\u0000"+ + "\u03ad\u03ae\u0005a\u0000\u0000\u03ae\u03af\u0005p\u0000\u0000\u03af\u00a7"+ + "\u0001\u0000\u0000\u0000\u03b0\u03b1\u0005s\u0000\u0000\u03b1\u03b2\u0005"+ + "t\u0000\u0000\u03b2\u03b3\u0005r\u0000\u0000\u03b3\u03b4\u0005u\u0000"+ + "\u0000\u03b4\u03b5\u0005c\u0000\u0000\u03b5\u03b6\u0005t\u0000\u0000\u03b6"+ + "\u00a9\u0001\u0000\u0000\u0000\u03b7\u03b8\u0005c\u0000\u0000\u03b8\u03b9"+ + "\u0005h\u0000\u0000\u03b9\u03ba\u0005a\u0000\u0000\u03ba\u03bb\u0005n"+ + "\u0000\u0000\u03bb\u00ab\u0001\u0000\u0000\u0000\u03bc\u03bd\u0005e\u0000"+ + "\u0000\u03bd\u03be\u0005l\u0000\u0000\u03be\u03bf\u0005s\u0000\u0000\u03bf"+ + "\u03c0\u0005e\u0000\u0000\u03c0\u00ad\u0001\u0000\u0000\u0000\u03c1\u03c2"+ + "\u0005g\u0000\u0000\u03c2\u03c3\u0005o\u0000\u0000\u03c3\u03c4\u0005t"+ + "\u0000\u0000\u03c4\u03c5\u0005o\u0000\u0000\u03c5\u00af\u0001\u0000\u0000"+ + "\u0000\u03c6\u03c7\u0005p\u0000\u0000\u03c7\u03c8\u0005a\u0000\u0000\u03c8"+ + "\u03c9\u0005c\u0000\u0000\u03c9\u03ca\u0005k\u0000\u0000\u03ca\u03cb\u0005"+ + "a\u0000\u0000\u03cb\u03cc\u0005g\u0000\u0000\u03cc\u03cd\u0005e\u0000"+ + "\u0000\u03cd\u00b1\u0001\u0000\u0000\u0000\u03ce\u03cf\u0005s\u0000\u0000"+ + "\u03cf\u03d0\u0005w\u0000\u0000\u03d0\u03d1\u0005i\u0000\u0000\u03d1\u03d2"+ + "\u0005t\u0000\u0000\u03d2\u03d3\u0005c\u0000\u0000\u03d3\u03d4\u0005h"+ + "\u0000\u0000\u03d4\u00b3\u0001\u0000\u0000\u0000\u03d5\u03d6\u0005c\u0000"+ + "\u0000\u03d6\u03d7\u0005o\u0000\u0000\u03d7\u03d8\u0005n\u0000\u0000\u03d8"+ + "\u03d9\u0005s\u0000\u0000\u03d9\u03da\u0005t\u0000\u0000\u03da\u00b5\u0001"+ + "\u0000\u0000\u0000\u03db\u03dc\u0005f\u0000\u0000\u03dc\u03dd\u0005a\u0000"+ + "\u0000\u03dd\u03de\u0005l\u0000\u0000\u03de\u03df\u0005l\u0000\u0000\u03df"+ + "\u03e0\u0005t\u0000\u0000\u03e0\u03e1\u0005h\u0000\u0000\u03e1\u03e2\u0005"+ + "r\u0000\u0000\u03e2\u03e3\u0005o\u0000\u0000\u03e3\u03e4\u0005u\u0000"+ + "\u0000\u03e4\u03e5\u0005g\u0000\u0000\u03e5\u03e6\u0005h\u0000\u0000\u03e6"+ + "\u03e7\u0001\u0000\u0000\u0000\u03e7\u03e8\u0006Z\u0000\u0000\u03e8\u00b7"+ + "\u0001\u0000\u0000\u0000\u03e9\u03ea\u0005i\u0000\u0000\u03ea\u03eb\u0005"+ + "f\u0000\u0000\u03eb\u00b9\u0001\u0000\u0000\u0000\u03ec\u03ed\u0005r\u0000"+ + "\u0000\u03ed\u03ee\u0005a\u0000\u0000\u03ee\u03ef\u0005n\u0000\u0000\u03ef"+ + "\u03f0\u0005g\u0000\u0000\u03f0\u03f1\u0005e\u0000\u0000\u03f1\u00bb\u0001"+ + "\u0000\u0000\u0000\u03f2\u03f3\u0005t\u0000\u0000\u03f3\u03f4\u0005y\u0000"+ + "\u0000\u03f4\u03f5\u0005p\u0000\u0000\u03f5\u03f6\u0005e\u0000\u0000\u03f6"+ + "\u00bd\u0001\u0000\u0000\u0000\u03f7\u03f8\u0005c\u0000\u0000\u03f8\u03f9"+ + "\u0005o\u0000\u0000\u03f9\u03fa\u0005n\u0000\u0000\u03fa\u03fb\u0005t"+ + "\u0000\u0000\u03fb\u03fc\u0005i\u0000\u0000\u03fc\u03fd\u0005n\u0000\u0000"+ + "\u03fd\u03fe\u0005u\u0000\u0000\u03fe\u03ff\u0005e\u0000\u0000\u03ff\u0400"+ + "\u0001\u0000\u0000\u0000\u0400\u0401\u0006^\u0000\u0000\u0401\u00bf\u0001"+ + "\u0000\u0000\u0000\u0402\u0403\u0005f\u0000\u0000\u0403\u0404\u0005o\u0000"+ + "\u0000\u0404\u0405\u0005r\u0000\u0000\u0405\u00c1\u0001\u0000\u0000\u0000"+ + "\u0406\u0407\u0005i\u0000\u0000\u0407\u0408\u0005m\u0000\u0000\u0408\u0409"+ + "\u0005p\u0000\u0000\u0409\u040a\u0005o\u0000\u0000\u040a\u040b\u0005r"+ + "\u0000\u0000\u040b\u040c\u0005t\u0000\u0000\u040c\u00c3\u0001\u0000\u0000"+ + "\u0000\u040d\u040e\u0005r\u0000\u0000\u040e\u040f\u0005e\u0000\u0000\u040f"+ + "\u0410\u0005t\u0000\u0000\u0410\u0411\u0005u\u0000\u0000\u0411\u0412\u0005"+ + "r\u0000\u0000\u0412\u0413\u0005n\u0000\u0000\u0413\u0414\u0001\u0000\u0000"+ + "\u0000\u0414\u0415\u0006a\u0000\u0000\u0415\u00c5\u0001\u0000\u0000\u0000"+ + "\u0416\u0417\u0005v\u0000\u0000\u0417\u0418\u0005a\u0000\u0000\u0418\u0419"+ + "\u0005r\u0000\u0000\u0419\u00c7\u0001\u0000\u0000\u0000\u041a\u041b\u0005"+ + "n\u0000\u0000\u041b\u041c\u0005i\u0000\u0000\u041c\u041d\u0005l\u0000"+ + "\u0000\u041d\u041e\u0001\u0000\u0000\u0000\u041e\u041f\u0006c\u0000\u0000"+ + "\u041f\u00c9\u0001\u0000\u0000\u0000\u0420\u0425\u0003\u014c\u00a5\u0000"+ + "\u0421\u0424\u0003\u014c\u00a5\u0000\u0422\u0424\u0003\u014e\u00a6\u0000"+ + "\u0423\u0421\u0001\u0000\u0000\u0000\u0423\u0422\u0001\u0000\u0000\u0000"+ + "\u0424\u0427\u0001\u0000\u0000\u0000\u0425\u0423\u0001\u0000\u0000\u0000"+ + "\u0425\u0426\u0001\u0000\u0000\u0000\u0426\u0428\u0001\u0000\u0000\u0000"+ + "\u0427\u0425\u0001\u0000\u0000\u0000\u0428\u0429\u0006d\u0000\u0000\u0429"+ + "\u00cb\u0001\u0000\u0000\u0000\u042a\u042b\u0005(\u0000\u0000\u042b\u00cd"+ + "\u0001\u0000\u0000\u0000\u042c\u042d\u0005)\u0000\u0000\u042d\u042e\u0001"+ + "\u0000\u0000\u0000\u042e\u042f\u0006f\u0000\u0000\u042f\u00cf\u0001\u0000"+ + "\u0000\u0000\u0430\u0431\u0005{\u0000\u0000\u0431\u00d1\u0001\u0000\u0000"+ + "\u0000\u0432\u0433\u0005}\u0000\u0000\u0433\u0434\u0001\u0000\u0000\u0000"+ + "\u0434\u0435\u0006h\u0000\u0000\u0435\u00d3\u0001\u0000\u0000\u0000\u0436"+ + "\u0437\u0005[\u0000\u0000\u0437\u00d5\u0001\u0000\u0000\u0000\u0438\u0439"+ + "\u0005]\u0000\u0000\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0006"+ + "j\u0000\u0000\u043b\u00d7\u0001\u0000\u0000\u0000\u043c\u043d\u0005=\u0000"+ + "\u0000\u043d\u00d9\u0001\u0000\u0000\u0000\u043e\u043f\u0005,\u0000\u0000"+ + "\u043f\u00db\u0001\u0000\u0000\u0000\u0440\u0441\u0005;\u0000\u0000\u0441"+ + "\u00dd\u0001\u0000\u0000\u0000\u0442\u0443\u0005:\u0000\u0000\u0443\u00df"+ + "\u0001\u0000\u0000\u0000\u0444\u0445\u0005.\u0000\u0000\u0445\u00e1\u0001"+ + "\u0000\u0000\u0000\u0446\u0447\u0005+\u0000\u0000\u0447\u0448\u0005+\u0000"+ + "\u0000\u0448\u0449\u0001\u0000\u0000\u0000\u0449\u044a\u0006p\u0000\u0000"+ + "\u044a\u00e3\u0001\u0000\u0000\u0000\u044b\u044c\u0005-\u0000\u0000\u044c"+ + "\u044d\u0005-\u0000\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f"+ + "\u0006q\u0000\u0000\u044f\u00e5\u0001\u0000\u0000\u0000\u0450\u0451\u0005"+ + ":\u0000\u0000\u0451\u0452\u0005=\u0000\u0000\u0452\u00e7\u0001\u0000\u0000"+ + "\u0000\u0453\u0454\u0005.\u0000\u0000\u0454\u0455\u0005.\u0000\u0000\u0455"+ + "\u0456\u0005.\u0000\u0000\u0456\u00e9\u0001\u0000\u0000\u0000\u0457\u0458"+ + "\u0005|\u0000\u0000\u0458\u0459\u0005|\u0000\u0000\u0459\u00eb\u0001\u0000"+ + "\u0000\u0000\u045a\u045b\u0005&\u0000\u0000\u045b\u045c\u0005&\u0000\u0000"+ + "\u045c\u00ed\u0001\u0000\u0000\u0000\u045d\u045e\u0005=\u0000\u0000\u045e"+ + "\u045f\u0005=\u0000\u0000\u045f\u00ef\u0001\u0000\u0000\u0000\u0460\u0461"+ + "\u0005!\u0000\u0000\u0461\u0462\u0005=\u0000\u0000\u0462\u00f1\u0001\u0000"+ + "\u0000\u0000\u0463\u0464\u0005<\u0000\u0000\u0464\u00f3\u0001\u0000\u0000"+ + "\u0000\u0465\u0466\u0005<\u0000\u0000\u0466\u0467\u0005=\u0000\u0000\u0467"+ + "\u00f5\u0001\u0000\u0000\u0000\u0468\u0469\u0005>\u0000\u0000\u0469\u00f7"+ + "\u0001\u0000\u0000\u0000\u046a\u046b\u0005>\u0000\u0000\u046b\u046c\u0005"+ + "=\u0000\u0000\u046c\u00f9\u0001\u0000\u0000\u0000\u046d\u046e\u0005|\u0000"+ + "\u0000\u046e\u00fb\u0001\u0000\u0000\u0000\u046f\u0470\u0005/\u0000\u0000"+ + "\u0470\u00fd\u0001\u0000\u0000\u0000\u0471\u0472\u0005%\u0000\u0000\u0472"+ + "\u00ff\u0001\u0000\u0000\u0000\u0473\u0474\u0005<\u0000\u0000\u0474\u0475"+ + "\u0005<\u0000\u0000\u0475\u0101\u0001\u0000\u0000\u0000\u0476\u0477\u0005"+ + ">\u0000\u0000\u0477\u0478\u0005>\u0000\u0000\u0478\u0103\u0001\u0000\u0000"+ + "\u0000\u0479\u047a\u0005&\u0000\u0000\u047a\u047b\u0005^\u0000\u0000\u047b"+ + "\u0105\u0001\u0000\u0000\u0000\u047c\u047d\u0005!\u0000\u0000\u047d\u0107"+ + "\u0001\u0000\u0000\u0000\u047e\u047f\u0005+\u0000\u0000\u047f\u0109\u0001"+ + "\u0000\u0000\u0000\u0480\u0481\u0005-\u0000\u0000\u0481\u010b\u0001\u0000"+ + "\u0000\u0000\u0482\u0483\u0005^\u0000\u0000\u0483\u010d\u0001\u0000\u0000"+ + "\u0000\u0484\u0485\u0005*\u0000\u0000\u0485\u010f\u0001\u0000\u0000\u0000"+ + "\u0486\u0487\u0005&\u0000\u0000\u0487\u0111\u0001\u0000\u0000\u0000\u0488"+ + "\u0489\u0005<\u0000\u0000\u0489\u048a\u0005-\u0000\u0000\u048a\u0113\u0001"+ + "\u0000\u0000\u0000\u048b\u0497\u00050\u0000\u0000\u048c\u0493\u0007\u0000"+ + "\u0000\u0000\u048d\u048f\u0005_\u0000\u0000\u048e\u048d\u0001\u0000\u0000"+ + "\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f\u0490\u0001\u0000\u0000"+ + "\u0000\u0490\u0492\u0007\u0001\u0000\u0000\u0491\u048e\u0001\u0000\u0000"+ + "\u0000\u0492\u0495\u0001\u0000\u0000\u0000\u0493\u0491\u0001\u0000\u0000"+ + "\u0000\u0493\u0494\u0001\u0000\u0000\u0000\u0494\u0497\u0001\u0000\u0000"+ + "\u0000\u0495\u0493\u0001\u0000\u0000\u0000\u0496\u048b\u0001\u0000\u0000"+ + "\u0000\u0496\u048c\u0001\u0000\u0000\u0000\u0497\u0498\u0001\u0000\u0000"+ + "\u0000\u0498\u0499\u0006\u0089\u0000\u0000\u0499\u0115\u0001\u0000\u0000"+ + "\u0000\u049a\u049b\u00050\u0000\u0000\u049b\u04a0\u0007\u0002\u0000\u0000"+ + "\u049c\u049e\u0005_\u0000\u0000\u049d\u049c\u0001\u0000\u0000\u0000\u049d"+ + "\u049e\u0001\u0000\u0000\u0000\u049e\u049f\u0001\u0000\u0000\u0000\u049f"+ + "\u04a1\u0003\u0148\u00a3\u0000\u04a0\u049d\u0001\u0000\u0000\u0000\u04a1"+ + "\u04a2\u0001\u0000\u0000\u0000\u04a2\u04a0\u0001\u0000\u0000\u0000\u04a2"+ + "\u04a3\u0001\u0000\u0000\u0000\u04a3\u04a4\u0001\u0000\u0000\u0000\u04a4"+ + "\u04a5\u0006\u008a\u0000\u0000\u04a5\u0117\u0001\u0000\u0000\u0000\u04a6"+ + "\u04a8\u00050\u0000\u0000\u04a7\u04a9\u0007\u0003\u0000\u0000\u04a8\u04a7"+ + "\u0001\u0000\u0000\u0000\u04a8\u04a9\u0001\u0000\u0000\u0000\u04a9\u04ae"+ + "\u0001\u0000\u0000\u0000\u04aa\u04ac\u0005_\u0000\u0000\u04ab\u04aa\u0001"+ + "\u0000\u0000\u0000\u04ab\u04ac\u0001\u0000\u0000\u0000\u04ac\u04ad\u0001"+ + "\u0000\u0000\u0000\u04ad\u04af\u0003\u0144\u00a1\u0000\u04ae\u04ab\u0001"+ + "\u0000\u0000\u0000\u04af\u04b0\u0001\u0000\u0000\u0000\u04b0\u04ae\u0001"+ + "\u0000\u0000\u0000\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u04b2\u0001"+ + "\u0000\u0000\u0000\u04b2\u04b3\u0006\u008b\u0000\u0000\u04b3\u0119\u0001"+ + "\u0000\u0000\u0000\u04b4\u04b5\u00050\u0000\u0000\u04b5\u04ba\u0007\u0004"+ + "\u0000\u0000\u04b6\u04b8\u0005_\u0000\u0000\u04b7\u04b6\u0001\u0000\u0000"+ + "\u0000\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8\u04b9\u0001\u0000\u0000"+ + "\u0000\u04b9\u04bb\u0003\u0146\u00a2\u0000\u04ba\u04b7\u0001\u0000\u0000"+ + "\u0000\u04bb\u04bc\u0001\u0000\u0000\u0000\u04bc\u04ba\u0001\u0000\u0000"+ + "\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04be\u0001\u0000\u0000"+ + "\u0000\u04be\u04bf\u0006\u008c\u0000\u0000\u04bf\u011b\u0001\u0000\u0000"+ + "\u0000\u04c0\u04c1\u00050\u0000\u0000\u04c1\u04c2\u0007\u0004\u0000\u0000"+ + "\u04c2\u04c3\u0003\u011e\u008e\u0000\u04c3\u04c4\u0003\u0120\u008f\u0000"+ + "\u04c4\u011d\u0001\u0000\u0000\u0000\u04c5\u04c7\u0005_\u0000\u0000\u04c6"+ + "\u04c5\u0001\u0000\u0000\u0000\u04c6\u04c7\u0001\u0000\u0000\u0000\u04c7"+ + "\u04c8\u0001\u0000\u0000\u0000\u04c8\u04ca\u0003\u0146\u00a2\u0000\u04c9"+ + "\u04c6\u0001\u0000\u0000\u0000\u04ca\u04cb\u0001\u0000\u0000\u0000\u04cb"+ + "\u04c9\u0001\u0000\u0000\u0000\u04cb\u04cc\u0001\u0000\u0000\u0000\u04cc"+ + "\u04d7\u0001\u0000\u0000\u0000\u04cd\u04d4\u0005.\u0000\u0000\u04ce\u04d0"+ + "\u0005_\u0000\u0000\u04cf\u04ce\u0001\u0000\u0000\u0000\u04cf\u04d0\u0001"+ + "\u0000\u0000\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d3\u0003"+ + "\u0146\u00a2\u0000\u04d2\u04cf\u0001\u0000\u0000\u0000\u04d3\u04d6\u0001"+ + "\u0000\u0000\u0000\u04d4\u04d2\u0001\u0000\u0000\u0000\u04d4\u04d5\u0001"+ + "\u0000\u0000\u0000\u04d5\u04d8\u0001\u0000\u0000\u0000\u04d6\u04d4\u0001"+ + "\u0000\u0000\u0000\u04d7\u04cd\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001"+ + "\u0000\u0000\u0000\u04d8\u04e5\u0001\u0000\u0000\u0000\u04d9\u04da\u0005"+ + ".\u0000\u0000\u04da\u04e1\u0003\u0146\u00a2\u0000\u04db\u04dd\u0005_\u0000"+ + "\u0000\u04dc\u04db\u0001\u0000\u0000\u0000\u04dc\u04dd\u0001\u0000\u0000"+ + "\u0000\u04dd\u04de\u0001\u0000\u0000\u0000\u04de\u04e0\u0003\u0146\u00a2"+ + "\u0000\u04df\u04dc\u0001\u0000\u0000\u0000\u04e0\u04e3\u0001\u0000\u0000"+ + "\u0000\u04e1\u04df\u0001\u0000\u0000\u0000\u04e1\u04e2\u0001\u0000\u0000"+ + "\u0000\u04e2\u04e5\u0001\u0000\u0000\u0000\u04e3\u04e1\u0001\u0000\u0000"+ + "\u0000\u04e4\u04c9\u0001\u0000\u0000\u0000\u04e4\u04d9\u0001\u0000\u0000"+ + "\u0000\u04e5\u011f\u0001\u0000\u0000\u0000\u04e6\u04e8\u0007\u0005\u0000"+ + "\u0000\u04e7\u04e9\u0007\u0006\u0000\u0000\u04e8\u04e7\u0001\u0000\u0000"+ + "\u0000\u04e8\u04e9\u0001\u0000\u0000\u0000\u04e9\u04ea\u0001\u0000\u0000"+ + "\u0000\u04ea\u04eb\u0003\u0142\u00a0\u0000\u04eb\u0121\u0001\u0000\u0000"+ + "\u0000\u04ec\u04f2\u0003\u0114\u0089\u0000\u04ed\u04f2\u0003\u0116\u008a"+ + "\u0000\u04ee\u04f2\u0003\u0118\u008b\u0000\u04ef\u04f2\u0003\u011a\u008c"+ + "\u0000\u04f0\u04f2\u0003\u0002\u0000\u0000\u04f1\u04ec\u0001\u0000\u0000"+ + "\u0000\u04f1\u04ed\u0001\u0000\u0000\u0000\u04f1\u04ee\u0001\u0000\u0000"+ + "\u0000\u04f1\u04ef\u0001\u0000\u0000\u0000\u04f1\u04f0\u0001\u0000\u0000"+ + "\u0000\u04f2\u04f3\u0001\u0000\u0000\u0000\u04f3\u04f4\u0005i\u0000\u0000"+ + "\u04f4\u04f5\u0001\u0000\u0000\u0000\u04f5\u04f6\u0006\u0090\u0000\u0000"+ + "\u04f6\u0123\u0001\u0000\u0000\u0000\u04f7\u04fa\u0005\'\u0000\u0000\u04f8"+ + "\u04fb\u0003\u013e\u009e\u0000\u04f9\u04fb\u0003\u0128\u0093\u0000\u04fa"+ + "\u04f8\u0001\u0000\u0000\u0000\u04fa\u04f9\u0001\u0000\u0000\u0000\u04fb"+ + "\u04fc\u0001\u0000\u0000\u0000\u04fc\u04fd\u0005\'\u0000\u0000\u04fd\u0125"+ + "\u0001\u0000\u0000\u0000\u04fe\u04ff\u0003\u0124\u0091\u0000\u04ff\u0500"+ + "\u0001\u0000\u0000\u0000\u0500\u0501\u0006\u0092\u0000\u0000\u0501\u0127"+ + "\u0001\u0000\u0000\u0000\u0502\u0505\u0003\u012a\u0094\u0000\u0503\u0505"+ + "\u0003\u012c\u0095\u0000\u0504\u0502\u0001\u0000\u0000\u0000\u0504\u0503"+ + "\u0001\u0000\u0000\u0000\u0505\u0129\u0001\u0000\u0000\u0000\u0506\u0507"+ + "\u0005\\\u0000\u0000\u0507\u0508\u0003\u0144\u00a1\u0000\u0508\u0509\u0003"+ + "\u0144\u00a1\u0000\u0509\u050a\u0003\u0144\u00a1\u0000\u050a\u012b\u0001"+ + "\u0000\u0000\u0000\u050b\u050c\u0005\\\u0000\u0000\u050c\u050d\u0005x"+ + "\u0000\u0000\u050d\u050e\u0003\u0146\u00a2\u0000\u050e\u050f\u0003\u0146"+ + "\u00a2\u0000\u050f\u012d\u0001\u0000\u0000\u0000\u0510\u0511\u0005\\\u0000"+ + "\u0000\u0511\u0512\u0005u\u0000\u0000\u0512\u0513\u0003\u0146\u00a2\u0000"+ + "\u0513\u0514\u0003\u0146\u00a2\u0000\u0514\u0515\u0003\u0146\u00a2\u0000"+ + "\u0515\u0516\u0003\u0146\u00a2\u0000\u0516\u012f\u0001\u0000\u0000\u0000"+ + "\u0517\u0518\u0005\\\u0000\u0000\u0518\u0519\u0005U\u0000\u0000\u0519"+ + "\u051a\u0003\u0146\u00a2\u0000\u051a\u051b\u0003\u0146\u00a2\u0000\u051b"+ + "\u051c\u0003\u0146\u00a2\u0000\u051c\u051d\u0003\u0146\u00a2\u0000\u051d"+ + "\u051e\u0003\u0146\u00a2\u0000\u051e\u051f\u0003\u0146\u00a2\u0000\u051f"+ + "\u0520\u0003\u0146\u00a2\u0000\u0520\u0521\u0003\u0146\u00a2\u0000\u0521"+ + "\u0131\u0001\u0000\u0000\u0000\u0522\u0526\u0005`\u0000\u0000\u0523\u0525"+ + "\b\u0007\u0000\u0000\u0524\u0523\u0001\u0000\u0000\u0000\u0525\u0528\u0001"+ + "\u0000\u0000\u0000\u0526\u0524\u0001\u0000\u0000\u0000\u0526\u0527\u0001"+ + "\u0000\u0000\u0000\u0527\u0529\u0001\u0000\u0000\u0000\u0528\u0526\u0001"+ + "\u0000\u0000\u0000\u0529\u052a\u0005`\u0000\u0000\u052a\u052b\u0001\u0000"+ + "\u0000\u0000\u052b\u052c\u0006\u0098\u0000\u0000\u052c\u0133\u0001\u0000"+ + "\u0000\u0000\u052d\u0532\u0005\"\u0000\u0000\u052e\u0531\b\b\u0000\u0000"+ + "\u052f\u0531\u0003\u0140\u009f\u0000\u0530\u052e\u0001\u0000\u0000\u0000"+ + "\u0530\u052f\u0001\u0000\u0000\u0000\u0531\u0534\u0001\u0000\u0000\u0000"+ + "\u0532\u0530\u0001\u0000\u0000\u0000\u0532\u0533\u0001\u0000\u0000\u0000"+ + "\u0533\u0535\u0001\u0000\u0000\u0000\u0534\u0532\u0001\u0000\u0000\u0000"+ + "\u0535\u0536\u0005\"\u0000\u0000\u0536\u0537\u0001\u0000\u0000\u0000\u0537"+ + "\u0538\u0006\u0099\u0000\u0000\u0538\u0135\u0001\u0000\u0000\u0000\u0539"+ + "\u053b\u0007\t\u0000\u0000\u053a\u0539\u0001\u0000\u0000\u0000\u053b\u053c"+ + "\u0001\u0000\u0000\u0000\u053c\u053a\u0001\u0000\u0000\u0000\u053c\u053d"+ + "\u0001\u0000\u0000\u0000\u053d\u053e\u0001\u0000\u0000\u0000\u053e\u053f"+ + "\u0006\u009a\u0001\u0000\u053f\u0137\u0001\u0000\u0000\u0000\u0540\u0541"+ + "\u0005/\u0000\u0000\u0541\u0542\u0005*\u0000\u0000\u0542\u0546\u0001\u0000"+ + "\u0000\u0000\u0543\u0545\t\u0000\u0000\u0000\u0544\u0543\u0001\u0000\u0000"+ + "\u0000\u0545\u0548\u0001\u0000\u0000\u0000\u0546\u0547\u0001\u0000\u0000"+ + "\u0000\u0546\u0544\u0001\u0000\u0000\u0000\u0547\u0549\u0001\u0000\u0000"+ + "\u0000\u0548\u0546\u0001\u0000\u0000\u0000\u0549\u054a\u0005*\u0000\u0000"+ + "\u054a\u054b\u0005/\u0000\u0000\u054b\u054c\u0001\u0000\u0000\u0000\u054c"+ + "\u054d\u0006\u009b\u0001\u0000\u054d\u0139\u0001\u0000\u0000\u0000\u054e"+ + "\u0550\u0007\n\u0000\u0000\u054f\u054e\u0001\u0000\u0000\u0000\u0550\u0551"+ + "\u0001\u0000\u0000\u0000\u0551\u054f\u0001\u0000\u0000\u0000\u0551\u0552"+ + "\u0001\u0000\u0000\u0000\u0552\u0553\u0001\u0000\u0000\u0000\u0553\u0554"+ + "\u0006\u009c\u0001\u0000\u0554\u013b\u0001\u0000\u0000\u0000\u0555\u0556"+ + "\u0005/\u0000\u0000\u0556\u0557\u0005/\u0000\u0000\u0557\u055b\u0001\u0000"+ + "\u0000\u0000\u0558\u055a\b\n\u0000\u0000\u0559\u0558\u0001\u0000\u0000"+ + "\u0000\u055a\u055d\u0001\u0000\u0000\u0000\u055b\u0559\u0001\u0000\u0000"+ + "\u0000\u055b\u055c\u0001\u0000\u0000\u0000\u055c\u055e\u0001\u0000\u0000"+ + "\u0000\u055d\u055b\u0001\u0000\u0000\u0000\u055e\u055f\u0006\u009d\u0001"+ + "\u0000\u055f\u013d\u0001\u0000\u0000\u0000\u0560\u0565\b\u000b\u0000\u0000"+ + "\u0561\u0565\u0003\u012e\u0096\u0000\u0562\u0565\u0003\u0130\u0097\u0000"+ + "\u0563\u0565\u0003\u0140\u009f\u0000\u0564\u0560\u0001\u0000\u0000\u0000"+ + "\u0564\u0561\u0001\u0000\u0000\u0000\u0564\u0562\u0001\u0000\u0000\u0000"+ + "\u0564\u0563\u0001\u0000\u0000\u0000\u0565\u013f\u0001\u0000\u0000\u0000"+ + "\u0566\u0580\u0005\\\u0000\u0000\u0567\u0568\u0005u\u0000\u0000\u0568"+ + "\u0569\u0003\u0146\u00a2\u0000\u0569\u056a\u0003\u0146\u00a2\u0000\u056a"+ + "\u056b\u0003\u0146\u00a2\u0000\u056b\u056c\u0003\u0146\u00a2\u0000\u056c"+ + "\u0581\u0001\u0000\u0000\u0000\u056d\u056e\u0005U\u0000\u0000\u056e\u056f"+ + "\u0003\u0146\u00a2\u0000\u056f\u0570\u0003\u0146\u00a2\u0000\u0570\u0571"+ + "\u0003\u0146\u00a2\u0000\u0571\u0572\u0003\u0146\u00a2\u0000\u0572\u0573"+ + "\u0003\u0146\u00a2\u0000\u0573\u0574\u0003\u0146\u00a2\u0000\u0574\u0575"+ + "\u0003\u0146\u00a2\u0000\u0575\u0576\u0003\u0146\u00a2\u0000\u0576\u0581"+ + "\u0001\u0000\u0000\u0000\u0577\u0581\u0007\f\u0000\u0000\u0578\u0579\u0003"+ + "\u0144\u00a1\u0000\u0579\u057a\u0003\u0144\u00a1\u0000\u057a\u057b\u0003"+ + "\u0144\u00a1\u0000\u057b\u0581\u0001\u0000\u0000\u0000\u057c\u057d\u0005"+ + "x\u0000\u0000\u057d\u057e\u0003\u0146\u00a2\u0000\u057e\u057f\u0003\u0146"+ + "\u00a2\u0000\u057f\u0581\u0001\u0000\u0000\u0000\u0580\u0567\u0001\u0000"+ + "\u0000\u0000\u0580\u056d\u0001\u0000\u0000\u0000\u0580\u0577\u0001\u0000"+ + "\u0000\u0000\u0580\u0578\u0001\u0000\u0000\u0000\u0580\u057c\u0001\u0000"+ + "\u0000\u0000\u0581\u0141\u0001\u0000\u0000\u0000\u0582\u0589\u0007\u0001"+ + "\u0000\u0000\u0583\u0585\u0005_\u0000\u0000\u0584\u0583\u0001\u0000\u0000"+ + "\u0000\u0584\u0585\u0001\u0000\u0000\u0000\u0585\u0586\u0001\u0000\u0000"+ + "\u0000\u0586\u0588\u0007\u0001\u0000\u0000\u0587\u0584\u0001\u0000\u0000"+ + "\u0000\u0588\u058b\u0001\u0000\u0000\u0000\u0589\u0587\u0001\u0000\u0000"+ + "\u0000\u0589\u058a\u0001\u0000\u0000\u0000\u058a\u0143\u0001\u0000\u0000"+ + "\u0000\u058b\u0589\u0001\u0000\u0000\u0000\u058c\u058d\u0007\r\u0000\u0000"+ + "\u058d\u0145\u0001\u0000\u0000\u0000\u058e\u058f\u0007\u000e\u0000\u0000"+ + "\u058f\u0147\u0001\u0000\u0000\u0000\u0590\u0591\u0007\u000f\u0000\u0000"+ + "\u0591\u0149\u0001\u0000\u0000\u0000\u0592\u0594\u0007\u0010\u0000\u0000"+ + "\u0593\u0595\u0007\u0006\u0000\u0000\u0594\u0593\u0001\u0000\u0000\u0000"+ + "\u0594\u0595\u0001\u0000\u0000\u0000\u0595\u0596\u0001\u0000\u0000\u0000"+ + "\u0596\u0597\u0003\u0142\u00a0\u0000\u0597\u014b\u0001\u0000\u0000\u0000"+ + "\u0598\u059b\u0003\u0150\u00a7\u0000\u0599\u059b\u0005_\u0000\u0000\u059a"+ + "\u0598\u0001\u0000\u0000\u0000\u059a\u0599\u0001\u0000\u0000\u0000\u059b"+ + "\u014d\u0001\u0000\u0000\u0000\u059c\u059d\u0007\u0011\u0000\u0000\u059d"+ + "\u014f\u0001\u0000\u0000\u0000\u059e\u059f\u0007\u0012\u0000\u0000\u059f"+ + "\u0151\u0001\u0000\u0000\u0000\u05a0\u05a2\u0007\t\u0000\u0000\u05a1\u05a0"+ + "\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000\u0000\u05a3\u05a1"+ + "\u0001\u0000\u0000\u0000\u05a3\u05a4\u0001\u0000\u0000\u0000\u05a4\u05a5"+ + "\u0001\u0000\u0000\u0000\u05a5\u05a6\u0006\u00a8\u0001\u0000\u05a6\u0153"+ + "\u0001\u0000\u0000\u0000\u05a7\u05a8\u0005/\u0000\u0000\u05a8\u05a9\u0005"+ + "*\u0000\u0000\u05a9\u05ad\u0001\u0000\u0000\u0000\u05aa\u05ac\b\n\u0000"+ + "\u0000\u05ab\u05aa\u0001\u0000\u0000\u0000\u05ac\u05af\u0001\u0000\u0000"+ + "\u0000\u05ad\u05ae\u0001\u0000\u0000\u0000\u05ad\u05ab\u0001\u0000\u0000"+ + "\u0000\u05ae\u05b0\u0001\u0000\u0000\u0000\u05af\u05ad\u0001\u0000\u0000"+ + "\u0000\u05b0\u05b1\u0005*\u0000\u0000\u05b1\u05b2\u0005/\u0000\u0000\u05b2"+ + "\u05b3\u0001\u0000\u0000\u0000\u05b3\u05b4\u0006\u00a9\u0001\u0000\u05b4"+ + "\u0155\u0001\u0000\u0000\u0000\u05b5\u05b6\u0005/\u0000\u0000\u05b6\u05b7"+ + "\u0005/\u0000\u0000\u05b7\u05bb\u0001\u0000\u0000\u0000\u05b8\u05ba\b"+ + "\n\u0000\u0000\u05b9\u05b8\u0001\u0000\u0000\u0000\u05ba\u05bd\u0001\u0000"+ + "\u0000\u0000\u05bb\u05b9\u0001\u0000\u0000\u0000\u05bb\u05bc\u0001\u0000"+ + "\u0000\u0000\u05bc\u05be\u0001\u0000\u0000\u0000\u05bd\u05bb\u0001\u0000"+ + "\u0000\u0000\u05be\u05bf\u0006\u00aa\u0001\u0000\u05bf\u0157\u0001\u0000"+ + "\u0000\u0000\u05c0\u05c2\u0007\n\u0000\u0000\u05c1\u05c0\u0001\u0000\u0000"+ + "\u0000\u05c2\u05c3\u0001\u0000\u0000\u0000\u05c3\u05c1\u0001\u0000\u0000"+ + "\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000\u05c4\u05d3\u0001\u0000\u0000"+ + "\u0000\u05c5\u05d3\u0005;\u0000\u0000\u05c6\u05c7\u0005/\u0000\u0000\u05c7"+ + "\u05c8\u0005*\u0000\u0000\u05c8\u05cc\u0001\u0000\u0000\u0000\u05c9\u05cb"+ + "\t\u0000\u0000\u0000\u05ca\u05c9\u0001\u0000\u0000\u0000\u05cb\u05ce\u0001"+ + "\u0000\u0000\u0000\u05cc\u05cd\u0001\u0000\u0000\u0000\u05cc\u05ca\u0001"+ + "\u0000\u0000\u0000\u05cd\u05cf\u0001\u0000\u0000\u0000\u05ce\u05cc\u0001"+ + "\u0000\u0000\u0000\u05cf\u05d0\u0005*\u0000\u0000\u05d0\u05d3\u0005/\u0000"+ + "\u0000\u05d1\u05d3\u0005\u0000\u0000\u0001\u05d2\u05c1\u0001\u0000\u0000"+ + "\u0000\u05d2\u05c5\u0001\u0000\u0000\u0000\u05d2\u05c6\u0001\u0000\u0000"+ + "\u0000\u05d2\u05d1\u0001\u0000\u0000\u0000\u05d3\u05d4\u0001\u0000\u0000"+ + "\u0000\u05d4\u05d5\u0006\u00ab\u0002\u0000\u05d5\u0159\u0001\u0000\u0000"+ + "\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000\u05d7\u05d8\u0001\u0000\u0000"+ + "\u0000\u05d8\u05d9\u0006\u00ac\u0002\u0000\u05d9\u05da\u0006\u00ac\u0001"+ + "\u0000\u05da\u015b\u0001\u0000\u0000\u00003\u0000\u0001\u015e\u0166\u0169"+ + "\u016c\u0172\u0174\u0423\u0425\u048e\u0493\u0496\u049d\u04a2\u04a8\u04ab"+ + "\u04b0\u04b7\u04bc\u04c6\u04cb\u04cf\u04d4\u04d7\u04dc\u04e1\u04e4\u04e8"+ + "\u04f1\u04fa\u0504\u0526\u0530\u0532\u053c\u0546\u0551\u055b\u0564\u0580"+ + "\u0584\u0589\u0594\u059a\u05a3\u05ad\u05bb\u05c3\u05cc\u05d2\u0003\u0002"+ + "\u0001\u0000\u0000\u0001\u0000\u0002\u0000\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { @@ -916,4 +1342,4 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); } } -} +} \ No newline at end of file diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 5771a622b..0b583ef70 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,3 +1,4 @@ +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -8,9 +9,9 @@ import java.util.Iterator; import java.util.ArrayList; -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class GobraParser extends GobraParserBase { - static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.12.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -44,62 +45,62 @@ public class GobraParser extends GobraParserBase { EOS=159, OTHER=160; public static final int RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3, - RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_initPost = 6, - RULE_importPre = 7, RULE_importSpec = 8, RULE_importDecl = 9, RULE_ghostMember = 10, - RULE_ghostStatement = 11, RULE_auxiliaryStatement = 12, RULE_statementWithSpec = 13, - RULE_outlineStatement = 14, RULE_ghostPrimaryExpr = 15, RULE_permission = 16, - RULE_typeExpr = 17, RULE_boundVariables = 18, RULE_boundVariableDecl = 19, - RULE_triggers = 20, RULE_trigger = 21, RULE_predicateAccess = 22, RULE_optionSome = 23, - RULE_optionNone = 24, RULE_optionGet = 25, RULE_sConversion = 26, RULE_old = 27, - RULE_oldLabelUse = 28, RULE_labelUse = 29, RULE_before = 30, RULE_isComparable = 31, - RULE_typeOf = 32, RULE_access = 33, RULE_range = 34, RULE_matchExpr = 35, - RULE_matchExprClause = 36, RULE_seqUpdExp = 37, RULE_seqUpdClause = 38, - RULE_ghostTypeLit = 39, RULE_domainType = 40, RULE_domainClause = 41, - RULE_adtType = 42, RULE_adtClause = 43, RULE_ghostSliceType = 44, RULE_sqType = 45, - RULE_specification = 46, RULE_specStatement = 47, RULE_terminationMeasure = 48, - RULE_assertion = 49, RULE_matchStmt = 50, RULE_matchStmtClause = 51, RULE_matchCase = 52, - RULE_matchPattern = 53, RULE_matchPatternList = 54, RULE_blockWithBodyParameterInfo = 55, - RULE_closureSpecInstance = 56, RULE_closureSpecParams = 57, RULE_closureSpecParam = 58, - RULE_closureImplProofStmt = 59, RULE_implementationProof = 60, RULE_methodImplementationProof = 61, - RULE_nonLocalReceiver = 62, RULE_selection = 63, RULE_implementationProofPredicateAlias = 64, - RULE_make = 65, RULE_new_ = 66, RULE_specMember = 67, RULE_functionDecl = 68, - RULE_methodDecl = 69, RULE_explicitGhostMember = 70, RULE_fpredicateDecl = 71, - RULE_predicateBody = 72, RULE_mpredicateDecl = 73, RULE_varSpec = 74, - RULE_shortVarDecl = 75, RULE_receiver = 76, RULE_parameterDecl = 77, RULE_actualParameterDecl = 78, - RULE_ghostParameterDecl = 79, RULE_parameterType = 80, RULE_expression = 81, - RULE_statement = 82, RULE_applyStmt = 83, RULE_packageStmt = 84, RULE_specForStmt = 85, - RULE_loopSpec = 86, RULE_deferStmt = 87, RULE_basicLit = 88, RULE_primaryExpr = 89, - RULE_functionLit = 90, RULE_closureDecl = 91, RULE_predConstructArgs = 92, - RULE_interfaceType = 93, RULE_predicateSpec = 94, RULE_methodSpec = 95, - RULE_type_ = 96, RULE_typeLit = 97, RULE_predType = 98, RULE_predTypeParams = 99, - RULE_literalType = 100, RULE_implicitArray = 101, RULE_slice_ = 102, RULE_low = 103, - RULE_high = 104, RULE_cap = 105, RULE_assign_op = 106, RULE_rangeClause = 107, - RULE_packageClause = 108, RULE_importPath = 109, RULE_declaration = 110, - RULE_constDecl = 111, RULE_constSpec = 112, RULE_identifierList = 113, - RULE_expressionList = 114, RULE_typeDecl = 115, RULE_typeSpec = 116, RULE_varDecl = 117, - RULE_block = 118, RULE_statementList = 119, RULE_simpleStmt = 120, RULE_expressionStmt = 121, - RULE_sendStmt = 122, RULE_incDecStmt = 123, RULE_assignment = 124, RULE_emptyStmt = 125, - RULE_labeledStmt = 126, RULE_returnStmt = 127, RULE_breakStmt = 128, RULE_continueStmt = 129, - RULE_gotoStmt = 130, RULE_fallthroughStmt = 131, RULE_ifStmt = 132, RULE_switchStmt = 133, - RULE_exprSwitchStmt = 134, RULE_exprCaseClause = 135, RULE_exprSwitchCase = 136, - RULE_typeSwitchStmt = 137, RULE_typeSwitchGuard = 138, RULE_typeCaseClause = 139, - RULE_typeSwitchCase = 140, RULE_typeList = 141, RULE_selectStmt = 142, - RULE_commClause = 143, RULE_commCase = 144, RULE_recvStmt = 145, RULE_forStmt = 146, - RULE_forClause = 147, RULE_goStmt = 148, RULE_typeName = 149, RULE_arrayType = 150, - RULE_arrayLength = 151, RULE_elementType = 152, RULE_pointerType = 153, - RULE_sliceType = 154, RULE_mapType = 155, RULE_channelType = 156, RULE_functionType = 157, - RULE_signature = 158, RULE_result = 159, RULE_parameters = 160, RULE_conversion = 161, - RULE_nonNamedType = 162, RULE_operand = 163, RULE_literal = 164, RULE_integer = 165, - RULE_operandName = 166, RULE_qualifiedIdent = 167, RULE_compositeLit = 168, - RULE_literalValue = 169, RULE_elementList = 170, RULE_keyedElement = 171, - RULE_key = 172, RULE_element = 173, RULE_structType = 174, RULE_fieldDecl = 175, - RULE_string_ = 176, RULE_embeddedField = 177, RULE_index = 178, RULE_typeAssertion = 179, - RULE_arguments = 180, RULE_methodExpr = 181, RULE_receiverType = 182, - RULE_eos = 183; + RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_preamble = 6, + RULE_initPost = 7, RULE_importPre = 8, RULE_importSpec = 9, RULE_importDecl = 10, + RULE_ghostMember = 11, RULE_ghostStatement = 12, RULE_auxiliaryStatement = 13, + RULE_statementWithSpec = 14, RULE_outlineStatement = 15, RULE_ghostPrimaryExpr = 16, + RULE_permission = 17, RULE_typeExpr = 18, RULE_boundVariables = 19, RULE_boundVariableDecl = 20, + RULE_triggers = 21, RULE_trigger = 22, RULE_predicateAccess = 23, RULE_optionSome = 24, + RULE_optionNone = 25, RULE_optionGet = 26, RULE_sConversion = 27, RULE_old = 28, + RULE_oldLabelUse = 29, RULE_labelUse = 30, RULE_before = 31, RULE_isComparable = 32, + RULE_typeOf = 33, RULE_access = 34, RULE_range = 35, RULE_matchExpr = 36, + RULE_matchExprClause = 37, RULE_seqUpdExp = 38, RULE_seqUpdClause = 39, + RULE_ghostTypeLit = 40, RULE_domainType = 41, RULE_domainClause = 42, + RULE_adtType = 43, RULE_adtClause = 44, RULE_ghostSliceType = 45, RULE_sqType = 46, + RULE_specification = 47, RULE_specStatement = 48, RULE_terminationMeasure = 49, + RULE_assertion = 50, RULE_matchStmt = 51, RULE_matchStmtClause = 52, RULE_matchCase = 53, + RULE_matchPattern = 54, RULE_matchPatternList = 55, RULE_blockWithBodyParameterInfo = 56, + RULE_closureSpecInstance = 57, RULE_closureSpecParams = 58, RULE_closureSpecParam = 59, + RULE_closureImplProofStmt = 60, RULE_implementationProof = 61, RULE_methodImplementationProof = 62, + RULE_nonLocalReceiver = 63, RULE_selection = 64, RULE_implementationProofPredicateAlias = 65, + RULE_make = 66, RULE_new_ = 67, RULE_specMember = 68, RULE_functionDecl = 69, + RULE_methodDecl = 70, RULE_explicitGhostMember = 71, RULE_fpredicateDecl = 72, + RULE_predicateBody = 73, RULE_mpredicateDecl = 74, RULE_varSpec = 75, + RULE_shortVarDecl = 76, RULE_receiver = 77, RULE_parameterDecl = 78, RULE_actualParameterDecl = 79, + RULE_ghostParameterDecl = 80, RULE_parameterType = 81, RULE_expression = 82, + RULE_statement = 83, RULE_applyStmt = 84, RULE_packageStmt = 85, RULE_specForStmt = 86, + RULE_loopSpec = 87, RULE_deferStmt = 88, RULE_basicLit = 89, RULE_primaryExpr = 90, + RULE_functionLit = 91, RULE_closureDecl = 92, RULE_predConstructArgs = 93, + RULE_interfaceType = 94, RULE_predicateSpec = 95, RULE_methodSpec = 96, + RULE_type_ = 97, RULE_typeLit = 98, RULE_predType = 99, RULE_predTypeParams = 100, + RULE_literalType = 101, RULE_implicitArray = 102, RULE_slice_ = 103, RULE_low = 104, + RULE_high = 105, RULE_cap = 106, RULE_assign_op = 107, RULE_rangeClause = 108, + RULE_packageClause = 109, RULE_importPath = 110, RULE_declaration = 111, + RULE_constDecl = 112, RULE_constSpec = 113, RULE_identifierList = 114, + RULE_expressionList = 115, RULE_typeDecl = 116, RULE_typeSpec = 117, RULE_varDecl = 118, + RULE_block = 119, RULE_statementList = 120, RULE_simpleStmt = 121, RULE_expressionStmt = 122, + RULE_sendStmt = 123, RULE_incDecStmt = 124, RULE_assignment = 125, RULE_emptyStmt = 126, + RULE_labeledStmt = 127, RULE_returnStmt = 128, RULE_breakStmt = 129, RULE_continueStmt = 130, + RULE_gotoStmt = 131, RULE_fallthroughStmt = 132, RULE_ifStmt = 133, RULE_switchStmt = 134, + RULE_exprSwitchStmt = 135, RULE_exprCaseClause = 136, RULE_exprSwitchCase = 137, + RULE_typeSwitchStmt = 138, RULE_typeSwitchGuard = 139, RULE_typeCaseClause = 140, + RULE_typeSwitchCase = 141, RULE_typeList = 142, RULE_selectStmt = 143, + RULE_commClause = 144, RULE_commCase = 145, RULE_recvStmt = 146, RULE_forStmt = 147, + RULE_forClause = 148, RULE_goStmt = 149, RULE_typeName = 150, RULE_arrayType = 151, + RULE_arrayLength = 152, RULE_elementType = 153, RULE_pointerType = 154, + RULE_sliceType = 155, RULE_mapType = 156, RULE_channelType = 157, RULE_functionType = 158, + RULE_signature = 159, RULE_result = 160, RULE_parameters = 161, RULE_conversion = 162, + RULE_nonNamedType = 163, RULE_operand = 164, RULE_literal = 165, RULE_integer = 166, + RULE_operandName = 167, RULE_qualifiedIdent = 168, RULE_compositeLit = 169, + RULE_literalValue = 170, RULE_elementList = 171, RULE_keyedElement = 172, + RULE_key = 173, RULE_element = 174, RULE_structType = 175, RULE_fieldDecl = 176, + RULE_string_ = 177, RULE_embeddedField = 178, RULE_index = 179, RULE_typeAssertion = 180, + RULE_arguments = 181, RULE_methodExpr = 182, RULE_receiverType = 183, + RULE_eos = 184; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", - "maybeAddressableIdentifier", "sourceFile", "initPost", "importPre", + "maybeAddressableIdentifier", "sourceFile", "preamble", "initPost", "importPre", "importSpec", "importDecl", "ghostMember", "ghostStatement", "auxiliaryStatement", "statementWithSpec", "outlineStatement", "ghostPrimaryExpr", "permission", "typeExpr", "boundVariables", "boundVariableDecl", "triggers", "trigger", @@ -243,6 +244,7 @@ public GobraParser(TokenStream input) { _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); } + @SuppressWarnings("CheckReturnValue") public static class ExprOnlyContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -265,9 +267,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(368); + setState(370); expression(0); - setState(369); + setState(371); match(EOF); } } @@ -282,6 +284,7 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class StmtOnlyContext extends ParserRuleContext { public StatementContext statement() { return getRuleContext(StatementContext.class,0); @@ -304,9 +307,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(371); + setState(373); statement(); - setState(372); + setState(374); match(EOF); } } @@ -321,6 +324,7 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeOnlyContext extends ParserRuleContext { public Type_Context type_() { return getRuleContext(Type_Context.class,0); @@ -343,9 +347,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(374); + setState(376); type_(); - setState(375); + setState(377); match(EOF); } } @@ -360,6 +364,7 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MaybeAddressableIdentifierListContext extends ParserRuleContext { public List maybeAddressableIdentifier() { return getRuleContexts(MaybeAddressableIdentifierContext.class); @@ -389,21 +394,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis try { enterOuterAlt(_localctx, 1); { - setState(377); + setState(379); maybeAddressableIdentifier(); - setState(382); + setState(384); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(378); + setState(380); match(COMMA); - setState(379); + setState(381); maybeAddressableIdentifier(); } } - setState(384); + setState(386); _errHandler.sync(this); _la = _input.LA(1); } @@ -420,6 +425,7 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MaybeAddressableIdentifierContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public TerminalNode ADDR_MOD() { return getToken(GobraParser.ADDR_MOD, 0); } @@ -441,14 +447,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro try { enterOuterAlt(_localctx, 1); { - setState(385); - match(IDENTIFIER); setState(387); + match(IDENTIFIER); + setState(389); _errHandler.sync(this); _la = _input.LA(1); if (_la==ADDR_MOD) { { - setState(386); + setState(388); match(ADDR_MOD); } } @@ -466,6 +472,7 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SourceFileContext extends ParserRuleContext { public PackageClauseContext packageClause() { return getRuleContext(PackageClauseContext.class,0); @@ -525,79 +532,79 @@ public final SourceFileContext sourceFile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(394); + setState(396); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(389); + setState(391); initPost(); - setState(390); + setState(392); eos(); } } - setState(396); + setState(398); _errHandler.sync(this); _la = _input.LA(1); } - setState(397); + setState(399); packageClause(); - setState(398); + setState(400); eos(); - setState(404); + setState(406); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(399); + setState(401); importDecl(); - setState(400); + setState(402); eos(); } } - setState(406); + setState(408); _errHandler.sync(this); _la = _input.LA(1); } - setState(416); + setState(418); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (CONST - 77)) | (1L << (TYPE - 77)) | (1L << (VAR - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & 288393170444877879L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881350095299L) != 0)) { { { - setState(410); + setState(412); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: { - setState(407); + setState(409); specMember(); } break; case 2: { - setState(408); + setState(410); declaration(); } break; case 3: { - setState(409); + setState(411); ghostMember(); } break; } - setState(412); + setState(414); eos(); } } - setState(418); + setState(420); _errHandler.sync(this); _la = _input.LA(1); } - setState(419); + setState(421); match(EOF); } } @@ -612,6 +619,97 @@ public final SourceFileContext sourceFile() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class PreambleContext extends ParserRuleContext { + public PackageClauseContext packageClause() { + return getRuleContext(PackageClauseContext.class,0); + } + public List eos() { + return getRuleContexts(EosContext.class); + } + public EosContext eos(int i) { + return getRuleContext(EosContext.class,i); + } + public List initPost() { + return getRuleContexts(InitPostContext.class); + } + public InitPostContext initPost(int i) { + return getRuleContext(InitPostContext.class,i); + } + public List importDecl() { + return getRuleContexts(ImportDeclContext.class); + } + public ImportDeclContext importDecl(int i) { + return getRuleContext(ImportDeclContext.class,i); + } + public PreambleContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_preamble; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitPreamble(this); + else return visitor.visitChildren(this); + } + } + + public final PreambleContext preamble() throws RecognitionException { + PreambleContext _localctx = new PreambleContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_preamble); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(428); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==INIT_POST) { + { + { + setState(423); + initPost(); + setState(424); + eos(); + } + } + setState(430); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(431); + packageClause(); + setState(432); + eos(); + setState(438); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==IMPORT_PRE || _la==IMPORT) { + { + { + setState(433); + importDecl(); + setState(434); + eos(); + } + } + setState(440); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") public static class InitPostContext extends ParserRuleContext { public TerminalNode INIT_POST() { return getToken(GobraParser.INIT_POST, 0); } public ExpressionContext expression() { @@ -630,13 +728,13 @@ public T accept(ParseTreeVisitor visitor) { public final InitPostContext initPost() throws RecognitionException { InitPostContext _localctx = new InitPostContext(_ctx, getState()); - enterRule(_localctx, 12, RULE_initPost); + enterRule(_localctx, 14, RULE_initPost); try { enterOuterAlt(_localctx, 1); { - setState(421); + setState(441); match(INIT_POST); - setState(422); + setState(442); expression(0); } } @@ -651,6 +749,7 @@ public final InitPostContext initPost() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImportPreContext extends ParserRuleContext { public TerminalNode IMPORT_PRE() { return getToken(GobraParser.IMPORT_PRE, 0); } public ExpressionContext expression() { @@ -669,13 +768,13 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPreContext importPre() throws RecognitionException { ImportPreContext _localctx = new ImportPreContext(_ctx, getState()); - enterRule(_localctx, 14, RULE_importPre); + enterRule(_localctx, 16, RULE_importPre); try { enterOuterAlt(_localctx, 1); { - setState(424); + setState(444); match(IMPORT_PRE); - setState(425); + setState(445); expression(0); } } @@ -690,6 +789,7 @@ public final ImportPreContext importPre() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImportSpecContext extends ParserRuleContext { public Token alias; public ImportPathContext importPath() { @@ -722,33 +822,33 @@ public T accept(ParseTreeVisitor visitor) { public final ImportSpecContext importSpec() throws RecognitionException { ImportSpecContext _localctx = new ImportSpecContext(_ctx, getState()); - enterRule(_localctx, 16, RULE_importSpec); + enterRule(_localctx, 18, RULE_importSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(432); + setState(452); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(427); + setState(447); importPre(); - setState(428); + setState(448); eos(); } } - setState(434); + setState(454); _errHandler.sync(this); _la = _input.LA(1); } - setState(436); + setState(456); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER || _la==DOT) { { - setState(435); + setState(455); ((ImportSpecContext)_localctx).alias = _input.LT(1); _la = _input.LA(1); if ( !(_la==IDENTIFIER || _la==DOT) ) { @@ -762,7 +862,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { } } - setState(438); + setState(458); importPath(); } } @@ -777,6 +877,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImportDeclContext extends ParserRuleContext { public TerminalNode IMPORT() { return getToken(GobraParser.IMPORT, 0); } public List importSpec() { @@ -812,61 +913,61 @@ public T accept(ParseTreeVisitor visitor) { public final ImportDeclContext importDecl() throws RecognitionException { ImportDeclContext _localctx = new ImportDeclContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_importDecl); + enterRule(_localctx, 20, RULE_importDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(445); + setState(465); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(440); + setState(460); importPre(); - setState(441); + setState(461); eos(); } } - setState(447); + setState(467); _errHandler.sync(this); _la = _input.LA(1); } - setState(461); + setState(481); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { case 1: { - setState(448); + setState(468); match(IMPORT); - setState(449); + setState(469); importSpec(); } break; case 2: { - setState(450); + setState(470); match(IMPORT); - setState(451); + setState(471); match(L_PAREN); - setState(457); + setState(477); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (IMPORT_PRE - 70)) | (1L << (IDENTIFIER - 70)) | (1L << (DOT - 70)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { + while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & 4400193994753L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { - setState(452); + setState(472); importSpec(); - setState(453); + setState(473); eos(); } } - setState(459); + setState(479); _errHandler.sync(this); _la = _input.LA(1); } - setState(460); + setState(480); match(R_PAREN); } break; @@ -884,6 +985,7 @@ public final ImportDeclContext importDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostMemberContext extends ParserRuleContext { public ImplementationProofContext implementationProof() { return getRuleContext(ImplementationProofContext.class,0); @@ -910,36 +1012,36 @@ public T accept(ParseTreeVisitor visitor) { public final GhostMemberContext ghostMember() throws RecognitionException { GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_ghostMember); + enterRule(_localctx, 22, RULE_ghostMember); try { - setState(467); + setState(487); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(463); + setState(483); implementationProof(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(464); + setState(484); fpredicateDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(465); + setState(485); mpredicateDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(466); + setState(486); explicitGhostMember(); } break; @@ -956,6 +1058,7 @@ public final GhostMemberContext ghostMember() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostStatementContext extends ParserRuleContext { public GhostStatementContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -967,6 +1070,7 @@ public void copyFrom(GhostStatementContext ctx) { super.copyFrom(ctx); } } + @SuppressWarnings("CheckReturnValue") public static class ProofStatementContext extends GhostStatementContext { public Token kind; public ExpressionContext expression() { @@ -983,6 +1087,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MatchStmt_Context extends GhostStatementContext { public MatchStmtContext matchStmt() { return getRuleContext(MatchStmtContext.class,0); @@ -994,6 +1099,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class ExplicitGhostStatementContext extends GhostStatementContext { public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public StatementContext statement() { @@ -1006,6 +1112,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class FoldStatementContext extends GhostStatementContext { public Token fold_stmt; public PredicateAccessContext predicateAccess() { @@ -1023,19 +1130,19 @@ public T accept(ParseTreeVisitor visitor) { public final GhostStatementContext ghostStatement() throws RecognitionException { GhostStatementContext _localctx = new GhostStatementContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_ghostStatement); + enterRule(_localctx, 24, RULE_ghostStatement); int _la; try { - setState(476); + setState(496); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: _localctx = new ExplicitGhostStatementContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(469); + setState(489); match(GHOST); - setState(470); + setState(490); statement(); } break; @@ -1044,7 +1151,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new FoldStatementContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(471); + setState(491); ((FoldStatementContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -1055,7 +1162,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(472); + setState(492); predicateAccess(); } break; @@ -1066,10 +1173,10 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new ProofStatementContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(473); + setState(493); ((ProofStatementContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ASSERT) | (1L << ASSUME) | (1L << INHALE) | (1L << EXHALE))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 480L) != 0)) ) { ((ProofStatementContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -1077,7 +1184,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(474); + setState(494); expression(0); } break; @@ -1085,7 +1192,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new MatchStmt_Context(_localctx); enterOuterAlt(_localctx, 4); { - setState(475); + setState(495); matchStmt(); } break; @@ -1104,6 +1211,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AuxiliaryStatementContext extends ParserRuleContext { public StatementWithSpecContext statementWithSpec() { return getRuleContext(StatementWithSpecContext.class,0); @@ -1121,11 +1229,11 @@ public T accept(ParseTreeVisitor visitor) { public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionException { AuxiliaryStatementContext _localctx = new AuxiliaryStatementContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_auxiliaryStatement); + enterRule(_localctx, 26, RULE_auxiliaryStatement); try { enterOuterAlt(_localctx, 1); { - setState(478); + setState(498); statementWithSpec(); } } @@ -1140,6 +1248,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class StatementWithSpecContext extends ParserRuleContext { public SpecificationContext specification; public SpecificationContext specification() { @@ -1161,14 +1270,14 @@ public T accept(ParseTreeVisitor visitor) { public final StatementWithSpecContext statementWithSpec() throws RecognitionException { StatementWithSpecContext _localctx = new StatementWithSpecContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_statementWithSpec); + enterRule(_localctx, 28, RULE_statementWithSpec); try { enterOuterAlt(_localctx, 1); { - setState(480); + setState(500); ((StatementWithSpecContext)_localctx).specification = specification(); { - setState(481); + setState(501); outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure); } } @@ -1184,6 +1293,7 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OutlineStatementContext extends ParserRuleContext { public boolean trusted; public boolean pure; @@ -1209,25 +1319,25 @@ public T accept(ParseTreeVisitor visitor) { public final OutlineStatementContext outlineStatement(boolean trusted,boolean pure) throws RecognitionException { OutlineStatementContext _localctx = new OutlineStatementContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 28, RULE_outlineStatement); + enterRule(_localctx, 30, RULE_outlineStatement); try { enterOuterAlt(_localctx, 1); { - setState(483); + setState(503); match(OUTLINE); - setState(484); + setState(504); match(L_PAREN); - setState(486); + setState(506); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(485); + setState(505); statementList(); } break; } - setState(488); + setState(508); match(R_PAREN); } } @@ -1242,6 +1352,7 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostPrimaryExprContext extends ParserRuleContext { public RangeContext range() { return getRuleContext(RangeContext.class,0); @@ -1295,99 +1406,99 @@ public T accept(ParseTreeVisitor visitor) { public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionException { GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_ghostPrimaryExpr); + enterRule(_localctx, 32, RULE_ghostPrimaryExpr); try { - setState(503); + setState(523); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(490); + setState(510); range(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(491); + setState(511); access(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(492); + setState(512); typeOf(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(493); + setState(513); typeExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(494); + setState(514); isComparable(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(495); + setState(515); old(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(496); + setState(516); before(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(497); + setState(517); sConversion(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(498); + setState(518); optionNone(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(499); + setState(519); optionSome(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(500); + setState(520); optionGet(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(501); + setState(521); permission(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(502); + setState(522); matchExpr(); } break; @@ -1404,6 +1515,7 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PermissionContext extends ParserRuleContext { public TerminalNode WRITEPERM() { return getToken(GobraParser.WRITEPERM, 0); } public TerminalNode NOPERM() { return getToken(GobraParser.NOPERM, 0); } @@ -1420,12 +1532,12 @@ public T accept(ParseTreeVisitor visitor) { public final PermissionContext permission() throws RecognitionException { PermissionContext _localctx = new PermissionContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_permission); + enterRule(_localctx, 34, RULE_permission); int _la; try { enterOuterAlt(_localctx, 1); { - setState(505); + setState(525); _la = _input.LA(1); if ( !(_la==WRITEPERM || _la==NOPERM) ) { _errHandler.recoverInline(this); @@ -1448,6 +1560,7 @@ public final PermissionContext permission() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeExprContext extends ParserRuleContext { public TerminalNode TYPE() { return getToken(GobraParser.TYPE, 0); } public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -1468,17 +1581,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeExprContext typeExpr() throws RecognitionException { TypeExprContext _localctx = new TypeExprContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_typeExpr); + enterRule(_localctx, 36, RULE_typeExpr); try { enterOuterAlt(_localctx, 1); { - setState(507); + setState(527); match(TYPE); - setState(508); + setState(528); match(L_BRACKET); - setState(509); + setState(529); type_(); - setState(510); + setState(530); match(R_BRACKET); } } @@ -1493,6 +1606,7 @@ public final TypeExprContext typeExpr() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BoundVariablesContext extends ParserRuleContext { public List boundVariableDecl() { return getRuleContexts(BoundVariableDeclContext.class); @@ -1517,38 +1631,38 @@ public T accept(ParseTreeVisitor visitor) { public final BoundVariablesContext boundVariables() throws RecognitionException { BoundVariablesContext _localctx = new BoundVariablesContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_boundVariables); + enterRule(_localctx, 38, RULE_boundVariables); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(512); + setState(532); boundVariableDecl(); - setState(517); + setState(537); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,15,_ctx); + _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(513); + setState(533); match(COMMA); - setState(514); + setState(534); boundVariableDecl(); } } } - setState(519); + setState(539); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,15,_ctx); + _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } - setState(521); + setState(541); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(520); + setState(540); match(COMMA); } } @@ -1566,6 +1680,7 @@ public final BoundVariablesContext boundVariables() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BoundVariableDeclContext extends ParserRuleContext { public List IDENTIFIER() { return getTokens(GobraParser.IDENTIFIER); } public TerminalNode IDENTIFIER(int i) { @@ -1591,30 +1706,30 @@ public T accept(ParseTreeVisitor visitor) { public final BoundVariableDeclContext boundVariableDecl() throws RecognitionException { BoundVariableDeclContext _localctx = new BoundVariableDeclContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_boundVariableDecl); + enterRule(_localctx, 40, RULE_boundVariableDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(523); + setState(543); match(IDENTIFIER); - setState(528); + setState(548); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(524); + setState(544); match(COMMA); - setState(525); + setState(545); match(IDENTIFIER); } } - setState(530); + setState(550); _errHandler.sync(this); _la = _input.LA(1); } - setState(531); + setState(551); elementType(); } } @@ -1629,6 +1744,7 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TriggersContext extends ParserRuleContext { public List trigger() { return getRuleContexts(TriggerContext.class); @@ -1649,22 +1765,22 @@ public T accept(ParseTreeVisitor visitor) { public final TriggersContext triggers() throws RecognitionException { TriggersContext _localctx = new TriggersContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_triggers); + enterRule(_localctx, 42, RULE_triggers); int _la; try { enterOuterAlt(_localctx, 1); { - setState(536); + setState(556); _errHandler.sync(this); _la = _input.LA(1); while (_la==L_CURLY) { { { - setState(533); + setState(553); trigger(); } } - setState(538); + setState(558); _errHandler.sync(this); _la = _input.LA(1); } @@ -1681,6 +1797,7 @@ public final TriggersContext triggers() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TriggerContext extends ParserRuleContext { public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public List expression() { @@ -1707,32 +1824,32 @@ public T accept(ParseTreeVisitor visitor) { public final TriggerContext trigger() throws RecognitionException { TriggerContext _localctx = new TriggerContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_trigger); + enterRule(_localctx, 44, RULE_trigger); int _la; try { enterOuterAlt(_localctx, 1); { - setState(539); + setState(559); match(L_CURLY); - setState(540); + setState(560); expression(0); - setState(545); + setState(565); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(541); + setState(561); match(COMMA); - setState(542); + setState(562); expression(0); } } - setState(547); + setState(567); _errHandler.sync(this); _la = _input.LA(1); } - setState(548); + setState(568); match(R_CURLY); } } @@ -1747,6 +1864,7 @@ public final TriggerContext trigger() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PredicateAccessContext extends ParserRuleContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -1764,11 +1882,11 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateAccessContext predicateAccess() throws RecognitionException { PredicateAccessContext _localctx = new PredicateAccessContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_predicateAccess); + enterRule(_localctx, 46, RULE_predicateAccess); try { enterOuterAlt(_localctx, 1); { - setState(550); + setState(570); primaryExpr(0); } } @@ -1783,6 +1901,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OptionSomeContext extends ParserRuleContext { public TerminalNode SOME() { return getToken(GobraParser.SOME, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -1803,17 +1922,17 @@ public T accept(ParseTreeVisitor visitor) { public final OptionSomeContext optionSome() throws RecognitionException { OptionSomeContext _localctx = new OptionSomeContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_optionSome); + enterRule(_localctx, 48, RULE_optionSome); try { enterOuterAlt(_localctx, 1); { - setState(552); + setState(572); match(SOME); - setState(553); + setState(573); match(L_PAREN); - setState(554); + setState(574); expression(0); - setState(555); + setState(575); match(R_PAREN); } } @@ -1828,6 +1947,7 @@ public final OptionSomeContext optionSome() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OptionNoneContext extends ParserRuleContext { public TerminalNode NONE() { return getToken(GobraParser.NONE, 0); } public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -1848,17 +1968,17 @@ public T accept(ParseTreeVisitor visitor) { public final OptionNoneContext optionNone() throws RecognitionException { OptionNoneContext _localctx = new OptionNoneContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_optionNone); + enterRule(_localctx, 50, RULE_optionNone); try { enterOuterAlt(_localctx, 1); { - setState(557); + setState(577); match(NONE); - setState(558); + setState(578); match(L_BRACKET); - setState(559); + setState(579); type_(); - setState(560); + setState(580); match(R_BRACKET); } } @@ -1873,6 +1993,7 @@ public final OptionNoneContext optionNone() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OptionGetContext extends ParserRuleContext { public TerminalNode GET() { return getToken(GobraParser.GET, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -1893,17 +2014,17 @@ public T accept(ParseTreeVisitor visitor) { public final OptionGetContext optionGet() throws RecognitionException { OptionGetContext _localctx = new OptionGetContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_optionGet); + enterRule(_localctx, 52, RULE_optionGet); try { enterOuterAlt(_localctx, 1); { - setState(562); + setState(582); match(GET); - setState(563); + setState(583); match(L_PAREN); - setState(564); + setState(584); expression(0); - setState(565); + setState(585); match(R_PAREN); } } @@ -1918,6 +2039,7 @@ public final OptionGetContext optionGet() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SConversionContext extends ParserRuleContext { public Token kind; public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -1941,15 +2063,15 @@ public T accept(ParseTreeVisitor visitor) { public final SConversionContext sConversion() throws RecognitionException { SConversionContext _localctx = new SConversionContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_sConversion); + enterRule(_localctx, 54, RULE_sConversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(567); + setState(587); ((SConversionContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { ((SConversionContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -1957,11 +2079,11 @@ public final SConversionContext sConversion() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(568); + setState(588); match(L_PAREN); - setState(569); + setState(589); expression(0); - setState(570); + setState(590); match(R_PAREN); } } @@ -1976,6 +2098,7 @@ public final SConversionContext sConversion() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OldContext extends ParserRuleContext { public TerminalNode OLD() { return getToken(GobraParser.OLD, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -2001,32 +2124,32 @@ public T accept(ParseTreeVisitor visitor) { public final OldContext old() throws RecognitionException { OldContext _localctx = new OldContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_old); + enterRule(_localctx, 56, RULE_old); int _la; try { enterOuterAlt(_localctx, 1); { - setState(572); + setState(592); match(OLD); - setState(577); + setState(597); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(573); + setState(593); match(L_BRACKET); - setState(574); + setState(594); oldLabelUse(); - setState(575); + setState(595); match(R_BRACKET); } } - setState(579); + setState(599); match(L_PAREN); - setState(580); + setState(600); expression(0); - setState(581); + setState(601); match(R_PAREN); } } @@ -2041,6 +2164,7 @@ public final OldContext old() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OldLabelUseContext extends ParserRuleContext { public LabelUseContext labelUse() { return getRuleContext(LabelUseContext.class,0); @@ -2059,22 +2183,22 @@ public T accept(ParseTreeVisitor visitor) { public final OldLabelUseContext oldLabelUse() throws RecognitionException { OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_oldLabelUse); + enterRule(_localctx, 58, RULE_oldLabelUse); try { - setState(585); + setState(605); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(583); + setState(603); labelUse(); } break; case LHS: enterOuterAlt(_localctx, 2); { - setState(584); + setState(604); match(LHS); } break; @@ -2093,6 +2217,7 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LabelUseContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public LabelUseContext(ParserRuleContext parent, int invokingState) { @@ -2108,11 +2233,11 @@ public T accept(ParseTreeVisitor visitor) { public final LabelUseContext labelUse() throws RecognitionException { LabelUseContext _localctx = new LabelUseContext(_ctx, getState()); - enterRule(_localctx, 58, RULE_labelUse); + enterRule(_localctx, 60, RULE_labelUse); try { enterOuterAlt(_localctx, 1); { - setState(587); + setState(607); match(IDENTIFIER); } } @@ -2127,6 +2252,7 @@ public final LabelUseContext labelUse() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BeforeContext extends ParserRuleContext { public TerminalNode BEFORE() { return getToken(GobraParser.BEFORE, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -2147,17 +2273,17 @@ public T accept(ParseTreeVisitor visitor) { public final BeforeContext before() throws RecognitionException { BeforeContext _localctx = new BeforeContext(_ctx, getState()); - enterRule(_localctx, 60, RULE_before); + enterRule(_localctx, 62, RULE_before); try { enterOuterAlt(_localctx, 1); { - setState(589); + setState(609); match(BEFORE); - setState(590); + setState(610); match(L_PAREN); - setState(591); + setState(611); expression(0); - setState(592); + setState(612); match(R_PAREN); } } @@ -2172,6 +2298,7 @@ public final BeforeContext before() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IsComparableContext extends ParserRuleContext { public TerminalNode IS_COMPARABLE() { return getToken(GobraParser.IS_COMPARABLE, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -2192,17 +2319,17 @@ public T accept(ParseTreeVisitor visitor) { public final IsComparableContext isComparable() throws RecognitionException { IsComparableContext _localctx = new IsComparableContext(_ctx, getState()); - enterRule(_localctx, 62, RULE_isComparable); + enterRule(_localctx, 64, RULE_isComparable); try { enterOuterAlt(_localctx, 1); { - setState(594); + setState(614); match(IS_COMPARABLE); - setState(595); + setState(615); match(L_PAREN); - setState(596); + setState(616); expression(0); - setState(597); + setState(617); match(R_PAREN); } } @@ -2217,6 +2344,7 @@ public final IsComparableContext isComparable() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeOfContext extends ParserRuleContext { public TerminalNode TYPE_OF() { return getToken(GobraParser.TYPE_OF, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -2237,17 +2365,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeOfContext typeOf() throws RecognitionException { TypeOfContext _localctx = new TypeOfContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_typeOf); + enterRule(_localctx, 66, RULE_typeOf); try { enterOuterAlt(_localctx, 1); { - setState(599); + setState(619); match(TYPE_OF); - setState(600); + setState(620); match(L_PAREN); - setState(601); + setState(621); expression(0); - setState(602); + setState(622); match(R_PAREN); } } @@ -2262,6 +2390,7 @@ public final TypeOfContext typeOf() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AccessContext extends ParserRuleContext { public TerminalNode ACCESS() { return getToken(GobraParser.ACCESS, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -2286,30 +2415,30 @@ public T accept(ParseTreeVisitor visitor) { public final AccessContext access() throws RecognitionException { AccessContext _localctx = new AccessContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_access); + enterRule(_localctx, 68, RULE_access); int _la; try { enterOuterAlt(_localctx, 1); { - setState(604); + setState(624); match(ACCESS); - setState(605); + setState(625); match(L_PAREN); - setState(606); + setState(626); expression(0); - setState(609); + setState(629); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(607); + setState(627); match(COMMA); - setState(608); + setState(628); expression(0); } } - setState(611); + setState(631); match(R_PAREN); } } @@ -2324,6 +2453,7 @@ public final AccessContext access() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class RangeContext extends ParserRuleContext { public Token kind; public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -2351,15 +2481,15 @@ public T accept(ParseTreeVisitor visitor) { public final RangeContext range() throws RecognitionException { RangeContext _localctx = new RangeContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_range); + enterRule(_localctx, 70, RULE_range); int _la; try { enterOuterAlt(_localctx, 1); { - setState(613); + setState(633); ((RangeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { ((RangeContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -2367,15 +2497,15 @@ public final RangeContext range() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(614); + setState(634); match(L_BRACKET); - setState(615); + setState(635); expression(0); - setState(616); + setState(636); match(DOT_DOT); - setState(617); + setState(637); expression(0); - setState(618); + setState(638); match(R_BRACKET); } } @@ -2390,6 +2520,7 @@ public final RangeContext range() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchExprContext extends ParserRuleContext { public TerminalNode MATCH() { return getToken(GobraParser.MATCH, 0); } public ExpressionContext expression() { @@ -2422,34 +2553,34 @@ public T accept(ParseTreeVisitor visitor) { public final MatchExprContext matchExpr() throws RecognitionException { MatchExprContext _localctx = new MatchExprContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_matchExpr); + enterRule(_localctx, 72, RULE_matchExpr); int _la; try { enterOuterAlt(_localctx, 1); { - setState(620); + setState(640); match(MATCH); - setState(621); + setState(641); expression(0); - setState(622); + setState(642); match(L_CURLY); - setState(628); + setState(648); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(623); + setState(643); matchExprClause(); - setState(624); + setState(644); eos(); } } - setState(630); + setState(650); _errHandler.sync(this); _la = _input.LA(1); } - setState(631); + setState(651); match(R_CURLY); } } @@ -2464,6 +2595,7 @@ public final MatchExprContext matchExpr() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchExprClauseContext extends ParserRuleContext { public MatchCaseContext matchCase() { return getRuleContext(MatchCaseContext.class,0); @@ -2485,15 +2617,15 @@ public T accept(ParseTreeVisitor visitor) { public final MatchExprClauseContext matchExprClause() throws RecognitionException { MatchExprClauseContext _localctx = new MatchExprClauseContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_matchExprClause); + enterRule(_localctx, 74, RULE_matchExprClause); try { enterOuterAlt(_localctx, 1); { - setState(633); + setState(653); matchCase(); - setState(634); + setState(654); match(COLON); - setState(635); + setState(655); expression(0); } } @@ -2508,6 +2640,7 @@ public final MatchExprClauseContext matchExprClause() throws RecognitionExceptio return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SeqUpdExpContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } @@ -2534,34 +2667,34 @@ public T accept(ParseTreeVisitor visitor) { public final SeqUpdExpContext seqUpdExp() throws RecognitionException { SeqUpdExpContext _localctx = new SeqUpdExpContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_seqUpdExp); + enterRule(_localctx, 76, RULE_seqUpdExp); int _la; try { enterOuterAlt(_localctx, 1); { - setState(637); + setState(657); match(L_BRACKET); { - setState(638); + setState(658); seqUpdClause(); - setState(643); + setState(663); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(639); + setState(659); match(COMMA); - setState(640); + setState(660); seqUpdClause(); } } - setState(645); + setState(665); _errHandler.sync(this); _la = _input.LA(1); } } - setState(646); + setState(666); match(R_BRACKET); } } @@ -2576,6 +2709,7 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SeqUpdClauseContext extends ParserRuleContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -2597,15 +2731,15 @@ public T accept(ParseTreeVisitor visitor) { public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { SeqUpdClauseContext _localctx = new SeqUpdClauseContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_seqUpdClause); + enterRule(_localctx, 78, RULE_seqUpdClause); try { enterOuterAlt(_localctx, 1); { - setState(648); + setState(668); expression(0); - setState(649); + setState(669); match(ASSIGN); - setState(650); + setState(670); expression(0); } } @@ -2620,6 +2754,7 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostTypeLitContext extends ParserRuleContext { public SqTypeContext sqType() { return getRuleContext(SqTypeContext.class,0); @@ -2646,9 +2781,9 @@ public T accept(ParseTreeVisitor visitor) { public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_ghostTypeLit); + enterRule(_localctx, 80, RULE_ghostTypeLit); try { - setState(656); + setState(676); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2658,28 +2793,28 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { case OPT: enterOuterAlt(_localctx, 1); { - setState(652); + setState(672); sqType(); } break; case GHOST: enterOuterAlt(_localctx, 2); { - setState(653); + setState(673); ghostSliceType(); } break; case DOM: enterOuterAlt(_localctx, 3); { - setState(654); + setState(674); domainType(); } break; case ADT: enterOuterAlt(_localctx, 4); { - setState(655); + setState(675); adtType(); } break; @@ -2698,6 +2833,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class DomainTypeContext extends ParserRuleContext { public TerminalNode DOM() { return getToken(GobraParser.DOM, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -2727,32 +2863,32 @@ public T accept(ParseTreeVisitor visitor) { public final DomainTypeContext domainType() throws RecognitionException { DomainTypeContext _localctx = new DomainTypeContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_domainType); + enterRule(_localctx, 82, RULE_domainType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(658); + setState(678); match(DOM); - setState(659); + setState(679); match(L_CURLY); - setState(665); + setState(685); _errHandler.sync(this); _la = _input.LA(1); while (_la==AXIOM || _la==FUNC) { { { - setState(660); + setState(680); domainClause(); - setState(661); + setState(681); eos(); } } - setState(667); + setState(687); _errHandler.sync(this); _la = _input.LA(1); } - setState(668); + setState(688); match(R_CURLY); } } @@ -2767,6 +2903,7 @@ public final DomainTypeContext domainType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class DomainClauseContext extends ParserRuleContext { public TerminalNode FUNC() { return getToken(GobraParser.FUNC, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -2795,34 +2932,34 @@ public T accept(ParseTreeVisitor visitor) { public final DomainClauseContext domainClause() throws RecognitionException { DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_domainClause); + enterRule(_localctx, 84, RULE_domainClause); try { - setState(679); + setState(699); _errHandler.sync(this); switch (_input.LA(1)) { case FUNC: enterOuterAlt(_localctx, 1); { - setState(670); + setState(690); match(FUNC); - setState(671); + setState(691); match(IDENTIFIER); - setState(672); + setState(692); signature(); } break; case AXIOM: enterOuterAlt(_localctx, 2); { - setState(673); + setState(693); match(AXIOM); - setState(674); + setState(694); match(L_CURLY); - setState(675); + setState(695); expression(0); - setState(676); + setState(696); eos(); - setState(677); + setState(697); match(R_CURLY); } break; @@ -2841,6 +2978,7 @@ public final DomainClauseContext domainClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AdtTypeContext extends ParserRuleContext { public TerminalNode ADT() { return getToken(GobraParser.ADT, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -2870,32 +3008,32 @@ public T accept(ParseTreeVisitor visitor) { public final AdtTypeContext adtType() throws RecognitionException { AdtTypeContext _localctx = new AdtTypeContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_adtType); + enterRule(_localctx, 86, RULE_adtType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(681); + setState(701); match(ADT); - setState(682); + setState(702); match(L_CURLY); - setState(688); + setState(708); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(683); + setState(703); adtClause(); - setState(684); + setState(704); eos(); } } - setState(690); + setState(710); _errHandler.sync(this); _la = _input.LA(1); } - setState(691); + setState(711); match(R_CURLY); } } @@ -2910,6 +3048,7 @@ public final AdtTypeContext adtType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AdtClauseContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -2939,32 +3078,32 @@ public T accept(ParseTreeVisitor visitor) { public final AdtClauseContext adtClause() throws RecognitionException { AdtClauseContext _localctx = new AdtClauseContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_adtClause); + enterRule(_localctx, 88, RULE_adtClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(693); + setState(713); match(IDENTIFIER); - setState(694); + setState(714); match(L_CURLY); - setState(700); + setState(720); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(695); + setState(715); fieldDecl(); - setState(696); + setState(716); eos(); } } - setState(702); + setState(722); _errHandler.sync(this); _la = _input.LA(1); } - setState(703); + setState(723); match(R_CURLY); } } @@ -2979,6 +3118,7 @@ public final AdtClauseContext adtClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostSliceTypeContext extends ParserRuleContext { public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -2999,17 +3139,17 @@ public T accept(ParseTreeVisitor visitor) { public final GhostSliceTypeContext ghostSliceType() throws RecognitionException { GhostSliceTypeContext _localctx = new GhostSliceTypeContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_ghostSliceType); + enterRule(_localctx, 90, RULE_ghostSliceType); try { enterOuterAlt(_localctx, 1); { - setState(705); + setState(725); match(GHOST); - setState(706); + setState(726); match(L_BRACKET); - setState(707); + setState(727); match(R_BRACKET); - setState(708); + setState(728); elementType(); } } @@ -3024,6 +3164,7 @@ public final GhostSliceTypeContext ghostSliceType() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SqTypeContext extends ParserRuleContext { public Token kind; public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -3052,10 +3193,10 @@ public T accept(ParseTreeVisitor visitor) { public final SqTypeContext sqType() throws RecognitionException { SqTypeContext _localctx = new SqTypeContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_sqType); + enterRule(_localctx, 92, RULE_sqType); int _la; try { - setState(721); + setState(741); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3065,10 +3206,10 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(710); + setState(730); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << OPT))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) { ((SqTypeContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -3076,11 +3217,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(711); + setState(731); match(L_BRACKET); - setState(712); + setState(732); type_(); - setState(713); + setState(733); match(R_BRACKET); } } @@ -3088,15 +3229,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(715); + setState(735); ((SqTypeContext)_localctx).kind = match(DICT); - setState(716); + setState(736); match(L_BRACKET); - setState(717); + setState(737); type_(); - setState(718); + setState(738); match(R_BRACKET); - setState(719); + setState(739); type_(); } break; @@ -3115,6 +3256,7 @@ public final SqTypeContext sqType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SpecificationContext extends ParserRuleContext { public boolean trusted = false; public boolean pure = false;; @@ -3151,20 +3293,20 @@ public T accept(ParseTreeVisitor visitor) { public final SpecificationContext specification() throws RecognitionException { SpecificationContext _localctx = new SpecificationContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_specification); + enterRule(_localctx, 94, RULE_specification); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(733); + setState(753); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(728); + setState(748); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3172,20 +3314,20 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(723); + setState(743); specStatement(); } break; case PURE: { - setState(724); + setState(744); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(726); + setState(746); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3193,21 +3335,21 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(730); + setState(750); eos(); } } } - setState(735); + setState(755); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); } - setState(738); + setState(758); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(736); + setState(756); match(PURE); ((SpecificationContext)_localctx).pure = true; } @@ -3226,6 +3368,7 @@ public final SpecificationContext specification() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SpecStatementContext extends ParserRuleContext { public Token kind; public AssertionContext assertion() { @@ -3251,44 +3394,44 @@ public T accept(ParseTreeVisitor visitor) { public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_specStatement); + enterRule(_localctx, 96, RULE_specStatement); try { - setState(748); + setState(768); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(740); + setState(760); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(741); + setState(761); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(742); + setState(762); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(743); + setState(763); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(744); + setState(764); ((SpecStatementContext)_localctx).kind = match(POST); - setState(745); + setState(765); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(746); + setState(766); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(747); + setState(767); terminationMeasure(); } break; @@ -3307,6 +3450,7 @@ public final SpecStatementContext specStatement() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TerminationMeasureContext extends ParserRuleContext { public ExpressionListContext expressionList() { return getRuleContext(ExpressionListContext.class,0); @@ -3328,28 +3472,28 @@ public T accept(ParseTreeVisitor visitor) { public final TerminationMeasureContext terminationMeasure() throws RecognitionException { TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_terminationMeasure); + enterRule(_localctx, 98, RULE_terminationMeasure); try { enterOuterAlt(_localctx, 1); { - setState(751); + setState(771); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: { - setState(750); + setState(770); expressionList(); } break; } - setState(755); + setState(775); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { case 1: { - setState(753); + setState(773); match(IF); - setState(754); + setState(774); expression(0); } break; @@ -3367,6 +3511,7 @@ public final TerminationMeasureContext terminationMeasure() throws RecognitionEx return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AssertionContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -3384,11 +3529,11 @@ public T accept(ParseTreeVisitor visitor) { public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_assertion); + enterRule(_localctx, 100, RULE_assertion); try { - setState(759); + setState(779); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { @@ -3397,7 +3542,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(758); + setState(778); expression(0); } break; @@ -3414,6 +3559,7 @@ public final AssertionContext assertion() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchStmtContext extends ParserRuleContext { public TerminalNode MATCH() { return getToken(GobraParser.MATCH, 0); } public ExpressionContext expression() { @@ -3440,32 +3586,32 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtContext matchStmt() throws RecognitionException { MatchStmtContext _localctx = new MatchStmtContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_matchStmt); + enterRule(_localctx, 102, RULE_matchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(761); + setState(781); match(MATCH); - setState(762); + setState(782); expression(0); - setState(763); + setState(783); match(L_CURLY); - setState(767); + setState(787); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(764); + setState(784); matchStmtClause(); } } - setState(769); + setState(789); _errHandler.sync(this); _la = _input.LA(1); } - setState(770); + setState(790); match(R_CURLY); } } @@ -3480,6 +3626,7 @@ public final MatchStmtContext matchStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchStmtClauseContext extends ParserRuleContext { public MatchCaseContext matchCase() { return getRuleContext(MatchCaseContext.class,0); @@ -3501,20 +3648,20 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtClauseContext matchStmtClause() throws RecognitionException { MatchStmtClauseContext _localctx = new MatchStmtClauseContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_matchStmtClause); + enterRule(_localctx, 104, RULE_matchStmtClause); try { enterOuterAlt(_localctx, 1); { - setState(772); + setState(792); matchCase(); - setState(773); + setState(793); match(COLON); - setState(775); + setState(795); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { case 1: { - setState(774); + setState(794); statementList(); } break; @@ -3532,6 +3679,7 @@ public final MatchStmtClauseContext matchStmtClause() throws RecognitionExceptio return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchCaseContext extends ParserRuleContext { public TerminalNode CASE() { return getToken(GobraParser.CASE, 0); } public MatchPatternContext matchPattern() { @@ -3551,24 +3699,24 @@ public T accept(ParseTreeVisitor visitor) { public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_matchCase); + enterRule(_localctx, 106, RULE_matchCase); try { - setState(780); + setState(800); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(777); + setState(797); match(CASE); - setState(778); + setState(798); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(779); + setState(799); match(DEFAULT); } break; @@ -3587,6 +3735,7 @@ public final MatchCaseContext matchCase() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchPatternContext extends ParserRuleContext { public MatchPatternContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -3598,6 +3747,7 @@ public void copyFrom(MatchPatternContext ctx) { super.copyFrom(ctx); } } + @SuppressWarnings("CheckReturnValue") public static class MatchPatternValueContext extends MatchPatternContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -3609,6 +3759,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MatchPatternCompositeContext extends MatchPatternContext { public LiteralTypeContext literalType() { return getRuleContext(LiteralTypeContext.class,0); @@ -3626,6 +3777,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MatchPatternBindContext extends MatchPatternContext { public TerminalNode QMARK() { return getToken(GobraParser.QMARK, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -3639,19 +3791,19 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternContext matchPattern() throws RecognitionException { MatchPatternContext _localctx = new MatchPatternContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_matchPattern); + enterRule(_localctx, 108, RULE_matchPattern); int _la; try { - setState(795); + setState(815); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(782); + setState(802); match(QMARK); - setState(783); + setState(803); match(IDENTIFIER); } break; @@ -3659,23 +3811,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(784); + setState(804); literalType(); - setState(785); + setState(805); match(L_CURLY); - setState(790); + setState(810); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << QMARK) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956190846021146L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(786); + setState(806); matchPatternList(); - setState(788); + setState(808); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(787); + setState(807); match(COMMA); } } @@ -3683,7 +3835,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(792); + setState(812); match(R_CURLY); } break; @@ -3691,7 +3843,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(794); + setState(814); expression(0); } break; @@ -3708,6 +3860,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchPatternListContext extends ParserRuleContext { public List matchPattern() { return getRuleContexts(MatchPatternContext.class); @@ -3732,30 +3885,30 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternListContext matchPatternList() throws RecognitionException { MatchPatternListContext _localctx = new MatchPatternListContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_matchPatternList); + enterRule(_localctx, 110, RULE_matchPatternList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(797); + setState(817); matchPattern(); - setState(802); + setState(822); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + _alt = getInterpreter().adaptivePredict(_input,46,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(798); + setState(818); match(COMMA); - setState(799); + setState(819); matchPattern(); } } } - setState(804); + setState(824); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + _alt = getInterpreter().adaptivePredict(_input,46,_ctx); } } } @@ -3770,6 +3923,7 @@ public final MatchPatternListContext matchPatternList() throws RecognitionExcept return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BlockWithBodyParameterInfoContext extends ParserRuleContext { public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } @@ -3796,37 +3950,37 @@ public T accept(ParseTreeVisitor visitor) { public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException { BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_blockWithBodyParameterInfo); + enterRule(_localctx, 112, RULE_blockWithBodyParameterInfo); try { enterOuterAlt(_localctx, 1); { - setState(805); + setState(825); match(L_CURLY); - setState(810); + setState(830); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(806); + setState(826); match(SHARE); - setState(807); + setState(827); identifierList(); - setState(808); + setState(828); eos(); } break; } - setState(813); + setState(833); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(812); + setState(832); statementList(); } break; } - setState(815); + setState(835); match(R_CURLY); } } @@ -3841,6 +3995,7 @@ public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() thro return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ClosureSpecInstanceContext extends ParserRuleContext { public QualifiedIdentContext qualifiedIdent() { return getRuleContext(QualifiedIdentContext.class,0); @@ -3865,47 +4020,47 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecInstanceContext closureSpecInstance() throws RecognitionException { ClosureSpecInstanceContext _localctx = new ClosureSpecInstanceContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_closureSpecInstance); + enterRule(_localctx, 114, RULE_closureSpecInstance); int _la; try { enterOuterAlt(_localctx, 1); { - setState(819); + setState(839); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: { - setState(817); + setState(837); qualifiedIdent(); } break; case 2: { - setState(818); + setState(838); match(IDENTIFIER); } break; } - setState(829); + setState(849); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(821); + setState(841); match(L_CURLY); - setState(826); + setState(846); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(822); + setState(842); closureSpecParams(); - setState(824); + setState(844); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(823); + setState(843); match(COMMA); } } @@ -3913,7 +4068,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(828); + setState(848); match(R_CURLY); } break; @@ -3931,6 +4086,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ClosureSpecParamsContext extends ParserRuleContext { public List closureSpecParam() { return getRuleContexts(ClosureSpecParamContext.class); @@ -3955,30 +4111,30 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamsContext closureSpecParams() throws RecognitionException { ClosureSpecParamsContext _localctx = new ClosureSpecParamsContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_closureSpecParams); + enterRule(_localctx, 116, RULE_closureSpecParams); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(831); + setState(851); closureSpecParam(); - setState(836); + setState(856); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,51,_ctx); + _alt = getInterpreter().adaptivePredict(_input,53,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(832); + setState(852); match(COMMA); - setState(833); + setState(853); closureSpecParam(); } } } - setState(838); + setState(858); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,51,_ctx); + _alt = getInterpreter().adaptivePredict(_input,53,_ctx); } } } @@ -3993,6 +4149,7 @@ public final ClosureSpecParamsContext closureSpecParams() throws RecognitionExce return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ClosureSpecParamContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -4012,23 +4169,23 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamContext closureSpecParam() throws RecognitionException { ClosureSpecParamContext _localctx = new ClosureSpecParamContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_closureSpecParam); + enterRule(_localctx, 118, RULE_closureSpecParam); try { enterOuterAlt(_localctx, 1); { - setState(841); + setState(861); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { - setState(839); + setState(859); match(IDENTIFIER); - setState(840); + setState(860); match(COLON); } break; } - setState(843); + setState(863); expression(0); } } @@ -4043,6 +4200,7 @@ public final ClosureSpecParamContext closureSpecParam() throws RecognitionExcept return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ClosureImplProofStmtContext extends ParserRuleContext { public TerminalNode PROOF() { return getToken(GobraParser.PROOF, 0); } public ExpressionContext expression() { @@ -4068,19 +4226,19 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureImplProofStmtContext closureImplProofStmt() throws RecognitionException { ClosureImplProofStmtContext _localctx = new ClosureImplProofStmtContext(_ctx, getState()); - enterRule(_localctx, 118, RULE_closureImplProofStmt); + enterRule(_localctx, 120, RULE_closureImplProofStmt); try { enterOuterAlt(_localctx, 1); { - setState(845); + setState(865); match(PROOF); - setState(846); + setState(866); expression(0); - setState(847); + setState(867); match(IMPL); - setState(848); + setState(868); closureSpecInstance(); - setState(849); + setState(869); block(); } } @@ -4095,6 +4253,7 @@ public final ClosureImplProofStmtContext closureImplProofStmt() throws Recogniti return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImplementationProofContext extends ParserRuleContext { public List type_() { return getRuleContexts(Type_Context.class); @@ -4136,57 +4295,57 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofContext implementationProof() throws RecognitionException { ImplementationProofContext _localctx = new ImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 120, RULE_implementationProof); + enterRule(_localctx, 122, RULE_implementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(851); + setState(871); type_(); - setState(852); + setState(872); match(IMPL); - setState(853); + setState(873); type_(); - setState(872); + setState(892); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(854); + setState(874); match(L_CURLY); - setState(860); + setState(880); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(855); + setState(875); implementationProofPredicateAlias(); - setState(856); + setState(876); eos(); } } - setState(862); + setState(882); _errHandler.sync(this); _la = _input.LA(1); } - setState(868); + setState(888); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(863); + setState(883); methodImplementationProof(); - setState(864); + setState(884); eos(); } } - setState(870); + setState(890); _errHandler.sync(this); _la = _input.LA(1); } - setState(871); + setState(891); match(R_CURLY); } break; @@ -4204,6 +4363,7 @@ public final ImplementationProofContext implementationProof() throws Recognition return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MethodImplementationProofContext extends ParserRuleContext { public NonLocalReceiverContext nonLocalReceiver() { return getRuleContext(NonLocalReceiverContext.class,0); @@ -4229,33 +4389,33 @@ public T accept(ParseTreeVisitor visitor) { public final MethodImplementationProofContext methodImplementationProof() throws RecognitionException { MethodImplementationProofContext _localctx = new MethodImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 122, RULE_methodImplementationProof); + enterRule(_localctx, 124, RULE_methodImplementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(875); + setState(895); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(874); + setState(894); match(PURE); } } - setState(877); + setState(897); nonLocalReceiver(); - setState(878); + setState(898); match(IDENTIFIER); - setState(879); + setState(899); signature(); - setState(881); + setState(901); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { case 1: { - setState(880); + setState(900); block(); } break; @@ -4273,6 +4433,7 @@ public final MethodImplementationProofContext methodImplementationProof() throws return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class NonLocalReceiverContext extends ParserRuleContext { public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public TypeNameContext typeName() { @@ -4294,36 +4455,36 @@ public T accept(ParseTreeVisitor visitor) { public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionException { NonLocalReceiverContext _localctx = new NonLocalReceiverContext(_ctx, getState()); - enterRule(_localctx, 124, RULE_nonLocalReceiver); + enterRule(_localctx, 126, RULE_nonLocalReceiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(883); + setState(903); match(L_PAREN); - setState(885); + setState(905); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: { - setState(884); + setState(904); match(IDENTIFIER); } break; } - setState(888); + setState(908); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(887); + setState(907); match(STAR); } } - setState(890); + setState(910); typeName(); - setState(891); + setState(911); match(R_PAREN); } } @@ -4338,6 +4499,7 @@ public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionExcept return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SelectionContext extends ParserRuleContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -4360,26 +4522,26 @@ public T accept(ParseTreeVisitor visitor) { public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); - enterRule(_localctx, 126, RULE_selection); + enterRule(_localctx, 128, RULE_selection); try { - setState(898); + setState(918); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(893); + setState(913); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(894); + setState(914); type_(); - setState(895); + setState(915); match(DOT); - setState(896); + setState(916); match(IDENTIFIER); } break; @@ -4396,6 +4558,7 @@ public final SelectionContext selection() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImplementationProofPredicateAliasContext extends ParserRuleContext { public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -4419,28 +4582,28 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofPredicateAliasContext implementationProofPredicateAlias() throws RecognitionException { ImplementationProofPredicateAliasContext _localctx = new ImplementationProofPredicateAliasContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_implementationProofPredicateAlias); + enterRule(_localctx, 130, RULE_implementationProofPredicateAlias); try { enterOuterAlt(_localctx, 1); { - setState(900); + setState(920); match(PRED); - setState(901); + setState(921); match(IDENTIFIER); - setState(902); + setState(922); match(DECLARE_ASSIGN); - setState(905); + setState(925); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: { - setState(903); + setState(923); selection(); } break; case 2: { - setState(904); + setState(924); operandName(); } break; @@ -4458,6 +4621,7 @@ public final ImplementationProofPredicateAliasContext implementationProofPredica return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MakeContext extends ParserRuleContext { public TerminalNode MAKE() { return getToken(GobraParser.MAKE, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -4482,30 +4646,30 @@ public T accept(ParseTreeVisitor visitor) { public final MakeContext make() throws RecognitionException { MakeContext _localctx = new MakeContext(_ctx, getState()); - enterRule(_localctx, 130, RULE_make); + enterRule(_localctx, 132, RULE_make); int _la; try { enterOuterAlt(_localctx, 1); { - setState(907); + setState(927); match(MAKE); - setState(908); + setState(928); match(L_PAREN); - setState(909); + setState(929); type_(); - setState(912); + setState(932); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(910); + setState(930); match(COMMA); - setState(911); + setState(931); expressionList(); } } - setState(914); + setState(934); match(R_PAREN); } } @@ -4520,6 +4684,7 @@ public final MakeContext make() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class New_Context extends ParserRuleContext { public TerminalNode NEW() { return getToken(GobraParser.NEW, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -4540,17 +4705,17 @@ public T accept(ParseTreeVisitor visitor) { public final New_Context new_() throws RecognitionException { New_Context _localctx = new New_Context(_ctx, getState()); - enterRule(_localctx, 132, RULE_new_); + enterRule(_localctx, 134, RULE_new_); try { enterOuterAlt(_localctx, 1); { - setState(916); + setState(936); match(NEW); - setState(917); + setState(937); match(L_PAREN); - setState(918); + setState(938); type_(); - setState(919); + setState(939); match(R_PAREN); } } @@ -4565,6 +4730,7 @@ public final New_Context new_() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SpecMemberContext extends ParserRuleContext { public SpecificationContext specification; public SpecificationContext specification() { @@ -4589,24 +4755,24 @@ public T accept(ParseTreeVisitor visitor) { public final SpecMemberContext specMember() throws RecognitionException { SpecMemberContext _localctx = new SpecMemberContext(_ctx, getState()); - enterRule(_localctx, 134, RULE_specMember); + enterRule(_localctx, 136, RULE_specMember); try { enterOuterAlt(_localctx, 1); { - setState(921); + setState(941); ((SpecMemberContext)_localctx).specification = specification(); - setState(924); + setState(944); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { - setState(922); + setState(942); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; case 2: { - setState(923); + setState(943); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; @@ -4624,6 +4790,7 @@ public final SpecMemberContext specMember() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FunctionDeclContext extends ParserRuleContext { public boolean trusted; public boolean pure; @@ -4651,23 +4818,23 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) throws RecognitionException { FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 136, RULE_functionDecl); + enterRule(_localctx, 138, RULE_functionDecl); try { enterOuterAlt(_localctx, 1); { - setState(926); + setState(946); match(FUNC); - setState(927); + setState(947); match(IDENTIFIER); { - setState(928); + setState(948); signature(); - setState(930); + setState(950); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { case 1: { - setState(929); + setState(949); blockWithBodyParameterInfo(); } break; @@ -4686,6 +4853,7 @@ public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) thro return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MethodDeclContext extends ParserRuleContext { public boolean trusted; public boolean pure; @@ -4716,25 +4884,25 @@ public T accept(ParseTreeVisitor visitor) { public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws RecognitionException { MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 138, RULE_methodDecl); + enterRule(_localctx, 140, RULE_methodDecl); try { enterOuterAlt(_localctx, 1); { - setState(932); + setState(952); match(FUNC); - setState(933); + setState(953); receiver(); - setState(934); + setState(954); match(IDENTIFIER); { - setState(935); + setState(955); signature(); - setState(937); + setState(957); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(936); + setState(956); blockWithBodyParameterInfo(); } break; @@ -4753,6 +4921,7 @@ public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws R return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExplicitGhostMemberContext extends ParserRuleContext { public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public SpecMemberContext specMember() { @@ -4774,13 +4943,13 @@ public T accept(ParseTreeVisitor visitor) { public final ExplicitGhostMemberContext explicitGhostMember() throws RecognitionException { ExplicitGhostMemberContext _localctx = new ExplicitGhostMemberContext(_ctx, getState()); - enterRule(_localctx, 140, RULE_explicitGhostMember); + enterRule(_localctx, 142, RULE_explicitGhostMember); try { enterOuterAlt(_localctx, 1); { - setState(939); + setState(959); match(GHOST); - setState(942); + setState(962); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -4791,7 +4960,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TRUSTED: case FUNC: { - setState(940); + setState(960); specMember(); } break; @@ -4799,7 +4968,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(941); + setState(961); declaration(); } break; @@ -4819,6 +4988,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FpredicateDeclContext extends ParserRuleContext { public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -4841,22 +5011,22 @@ public T accept(ParseTreeVisitor visitor) { public final FpredicateDeclContext fpredicateDecl() throws RecognitionException { FpredicateDeclContext _localctx = new FpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 142, RULE_fpredicateDecl); + enterRule(_localctx, 144, RULE_fpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(944); + setState(964); match(PRED); - setState(945); + setState(965); match(IDENTIFIER); - setState(946); + setState(966); parameters(); - setState(948); + setState(968); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: { - setState(947); + setState(967); predicateBody(); } break; @@ -4874,6 +5044,7 @@ public final FpredicateDeclContext fpredicateDecl() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PredicateBodyContext extends ParserRuleContext { public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public ExpressionContext expression() { @@ -4896,17 +5067,17 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateBodyContext predicateBody() throws RecognitionException { PredicateBodyContext _localctx = new PredicateBodyContext(_ctx, getState()); - enterRule(_localctx, 144, RULE_predicateBody); + enterRule(_localctx, 146, RULE_predicateBody); try { enterOuterAlt(_localctx, 1); { - setState(950); + setState(970); match(L_CURLY); - setState(951); + setState(971); expression(0); - setState(952); + setState(972); eos(); - setState(953); + setState(973); match(R_CURLY); } } @@ -4921,6 +5092,7 @@ public final PredicateBodyContext predicateBody() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MpredicateDeclContext extends ParserRuleContext { public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } public ReceiverContext receiver() { @@ -4946,24 +5118,24 @@ public T accept(ParseTreeVisitor visitor) { public final MpredicateDeclContext mpredicateDecl() throws RecognitionException { MpredicateDeclContext _localctx = new MpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 146, RULE_mpredicateDecl); + enterRule(_localctx, 148, RULE_mpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(955); + setState(975); match(PRED); - setState(956); + setState(976); receiver(); - setState(957); + setState(977); match(IDENTIFIER); - setState(958); + setState(978); parameters(); - setState(960); + setState(980); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(959); + setState(979); predicateBody(); } break; @@ -4981,6 +5153,7 @@ public final MpredicateDeclContext mpredicateDecl() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class VarSpecContext extends ParserRuleContext { public MaybeAddressableIdentifierListContext maybeAddressableIdentifierList() { return getRuleContext(MaybeAddressableIdentifierListContext.class,0); @@ -5005,13 +5178,13 @@ public T accept(ParseTreeVisitor visitor) { public final VarSpecContext varSpec() throws RecognitionException { VarSpecContext _localctx = new VarSpecContext(_ctx, getState()); - enterRule(_localctx, 148, RULE_varSpec); + enterRule(_localctx, 150, RULE_varSpec); try { enterOuterAlt(_localctx, 1); { - setState(962); + setState(982); maybeAddressableIdentifierList(); - setState(970); + setState(990); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5034,16 +5207,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(963); + setState(983); type_(); - setState(966); + setState(986); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: { - setState(964); + setState(984); match(ASSIGN); - setState(965); + setState(985); expressionList(); } break; @@ -5052,9 +5225,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(968); + setState(988); match(ASSIGN); - setState(969); + setState(989); expressionList(); } break; @@ -5074,6 +5247,7 @@ public final VarSpecContext varSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ShortVarDeclContext extends ParserRuleContext { public MaybeAddressableIdentifierListContext maybeAddressableIdentifierList() { return getRuleContext(MaybeAddressableIdentifierListContext.class,0); @@ -5095,15 +5269,15 @@ public T accept(ParseTreeVisitor visitor) { public final ShortVarDeclContext shortVarDecl() throws RecognitionException { ShortVarDeclContext _localctx = new ShortVarDeclContext(_ctx, getState()); - enterRule(_localctx, 150, RULE_shortVarDecl); + enterRule(_localctx, 152, RULE_shortVarDecl); try { enterOuterAlt(_localctx, 1); { - setState(972); + setState(992); maybeAddressableIdentifierList(); - setState(973); + setState(993); match(DECLARE_ASSIGN); - setState(974); + setState(994); expressionList(); } } @@ -5118,6 +5292,7 @@ public final ShortVarDeclContext shortVarDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ReceiverContext extends ParserRuleContext { public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public Type_Context type_() { @@ -5141,36 +5316,36 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverContext receiver() throws RecognitionException { ReceiverContext _localctx = new ReceiverContext(_ctx, getState()); - enterRule(_localctx, 152, RULE_receiver); + enterRule(_localctx, 154, RULE_receiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(976); + setState(996); match(L_PAREN); - setState(978); + setState(998); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: { - setState(977); + setState(997); maybeAddressableIdentifier(); } break; } - setState(980); + setState(1000); type_(); - setState(982); + setState(1002); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(981); + setState(1001); match(COMMA); } } - setState(984); + setState(1004); match(R_PAREN); } } @@ -5185,6 +5360,7 @@ public final ReceiverContext receiver() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ParameterDeclContext extends ParserRuleContext { public ActualParameterDeclContext actualParameterDecl() { return getRuleContext(ActualParameterDeclContext.class,0); @@ -5205,22 +5381,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 154, RULE_parameterDecl); + enterRule(_localctx, 156, RULE_parameterDecl); try { - setState(988); + setState(1008); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(986); + setState(1006); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(987); + setState(1007); ghostParameterDecl(); } break; @@ -5237,6 +5413,7 @@ public final ParameterDeclContext parameterDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ActualParameterDeclContext extends ParserRuleContext { public ParameterTypeContext parameterType() { return getRuleContext(ParameterTypeContext.class,0); @@ -5257,21 +5434,21 @@ public T accept(ParseTreeVisitor visitor) { public final ActualParameterDeclContext actualParameterDecl() throws RecognitionException { ActualParameterDeclContext _localctx = new ActualParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 156, RULE_actualParameterDecl); + enterRule(_localctx, 158, RULE_actualParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(991); + setState(1011); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: { - setState(990); + setState(1010); identifierList(); } break; } - setState(993); + setState(1013); parameterType(); } } @@ -5286,6 +5463,7 @@ public final ActualParameterDeclContext actualParameterDecl() throws Recognition return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostParameterDeclContext extends ParserRuleContext { public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public ParameterTypeContext parameterType() { @@ -5307,23 +5485,23 @@ public T accept(ParseTreeVisitor visitor) { public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionException { GhostParameterDeclContext _localctx = new GhostParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 158, RULE_ghostParameterDecl); + enterRule(_localctx, 160, RULE_ghostParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(995); + setState(1015); match(GHOST); - setState(997); + setState(1017); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: { - setState(996); + setState(1016); identifierList(); } break; } - setState(999); + setState(1019); parameterType(); } } @@ -5338,6 +5516,7 @@ public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionEx return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ParameterTypeContext extends ParserRuleContext { public Type_Context type_() { return getRuleContext(Type_Context.class,0); @@ -5356,22 +5535,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterTypeContext parameterType() throws RecognitionException { ParameterTypeContext _localctx = new ParameterTypeContext(_ctx, getState()); - enterRule(_localctx, 160, RULE_parameterType); + enterRule(_localctx, 162, RULE_parameterType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1002); + setState(1022); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1001); + setState(1021); match(ELLIPSIS); } } - setState(1004); + setState(1024); type_(); } } @@ -5386,6 +5565,7 @@ public final ParameterTypeContext parameterType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExpressionContext extends ParserRuleContext { public ExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -5397,6 +5577,7 @@ public void copyFrom(ExpressionContext ctx) { super.copyFrom(ctx); } } + @SuppressWarnings("CheckReturnValue") public static class ClosureImplSpecExprContext extends ExpressionContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -5412,6 +5593,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class PrimaryExpr_Context extends ExpressionContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -5423,6 +5605,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class QuantificationContext extends ExpressionContext { public BoundVariablesContext boundVariables() { return getRuleContext(BoundVariablesContext.class,0); @@ -5446,6 +5629,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class UnfoldingContext extends ExpressionContext { public TerminalNode UNFOLDING() { return getToken(GobraParser.UNFOLDING, 0); } public PredicateAccessContext predicateAccess() { @@ -5462,6 +5646,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class OrExprContext extends ExpressionContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -5477,6 +5662,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class P41ExprContext extends ExpressionContext { public Token p41_op; public List expression() { @@ -5495,6 +5681,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class UnaryExprContext extends ExpressionContext { public Token unary_op; public ExpressionContext expression() { @@ -5514,6 +5701,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class P42ExprContext extends ExpressionContext { public Token p42_op; public List expression() { @@ -5532,6 +5720,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class TernaryExprContext extends ExpressionContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -5548,6 +5737,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class AddExprContext extends ExpressionContext { public Token add_op; public List expression() { @@ -5569,6 +5759,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class ImplicationContext extends ExpressionContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -5584,6 +5775,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MulExprContext extends ExpressionContext { public Token mul_op; public List expression() { @@ -5606,6 +5798,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class LetContext extends ExpressionContext { public TerminalNode LET() { return getToken(GobraParser.LET, 0); } public ShortVarDeclContext shortVarDecl() { @@ -5622,6 +5815,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class RelExprContext extends ExpressionContext { public Token rel_op; public List expression() { @@ -5645,6 +5839,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class AndExprContext extends ExpressionContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -5670,26 +5865,26 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _parentState = getState(); ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); ExpressionContext _prevctx = _localctx; - int _startState = 162; - enterRecursionRule(_localctx, 162, RULE_expression, _p); + int _startState = 164; + enterRecursionRule(_localctx, 164, RULE_expression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1027); + setState(1047); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { case 1: { _localctx = new UnaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1007); + setState(1027); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)))) != 0)) ) { + if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 127L) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -5697,7 +5892,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1008); + setState(1028); expression(15); } break; @@ -5706,7 +5901,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1009); + setState(1029); primaryExpr(0); } break; @@ -5715,13 +5910,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1010); + setState(1030); match(UNFOLDING); - setState(1011); + setState(1031); predicateAccess(); - setState(1012); + setState(1032); match(IN); - setState(1013); + setState(1033); expression(3); } break; @@ -5730,13 +5925,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1015); + setState(1035); match(LET); - setState(1016); + setState(1036); shortVarDecl(); - setState(1017); + setState(1037); match(IN); - setState(1018); + setState(1038); expression(2); } break; @@ -5745,7 +5940,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1020); + setState(1040); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -5755,41 +5950,41 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1021); + setState(1041); boundVariables(); - setState(1022); + setState(1042); match(COLON); - setState(1023); + setState(1043); match(COLON); - setState(1024); + setState(1044); triggers(); - setState(1025); + setState(1045); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1064); + setState(1084); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,79,_ctx); + _alt = getInterpreter().adaptivePredict(_input,81,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1062); + setState(1082); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1029); + setState(1049); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1030); + setState(1050); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & ((1L << (DIV - 126)) | (1L << (MOD - 126)) | (1L << (LSHIFT - 126)) | (1L << (RSHIFT - 126)) | (1L << (BIT_CLEAR - 126)) | (1L << (STAR - 126)) | (1L << (AMPERSAND - 126)))) != 0)) ) { + if ( !(((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & 1567L) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -5797,7 +5992,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1031); + setState(1051); expression(14); } break; @@ -5805,12 +6000,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1032); + setState(1052); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1033); + setState(1053); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 113)) & ~0x3f) == 0 && ((1L << (_la - 113)) & ((1L << (PLUS_PLUS - 113)) | (1L << (OR - 113)) | (1L << (PLUS - 113)) | (1L << (MINUS - 113)) | (1L << (CARET - 113)))) != 0)) ) { + if ( !(_la==WAND || ((((_la - 113)) & ~0x3f) == 0 && ((1L << (_la - 113)) & 3674113L) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -5818,7 +6013,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1034); + setState(1054); expression(13); } break; @@ -5826,12 +6021,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1035); + setState(1055); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1036); + setState(1056); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << UNION) | (1L << INTERSECTION) | (1L << SETMINUS))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { ((P42ExprContext)_localctx).p42_op = (Token)_errHandler.recoverInline(this); } else { @@ -5839,7 +6034,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1037); + setState(1057); expression(12); } break; @@ -5847,12 +6042,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1038); + setState(1058); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1039); + setState(1059); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << IN) | (1L << MULTI) | (1L << SUBSET))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { ((P41ExprContext)_localctx).p41_op = (Token)_errHandler.recoverInline(this); } else { @@ -5860,7 +6055,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1040); + setState(1060); expression(11); } break; @@ -5868,12 +6063,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1041); + setState(1061); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1042); + setState(1062); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (GHOST_EQUALS - 72)) | (1L << (GHOST_NOT_EQUALS - 72)) | (1L << (EQUALS - 72)) | (1L << (NOT_EQUALS - 72)) | (1L << (LESS - 72)) | (1L << (LESS_OR_EQUALS - 72)) | (1L << (GREATER - 72)) | (1L << (GREATER_OR_EQUALS - 72)))) != 0)) ) { + if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 8866461766385667L) != 0)) ) { ((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this); } else { @@ -5881,7 +6076,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1043); + setState(1063); expression(10); } break; @@ -5889,11 +6084,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1044); + setState(1064); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1045); + setState(1065); match(LOGICAL_AND); - setState(1046); + setState(1066); expression(8); } break; @@ -5901,11 +6096,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1047); + setState(1067); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1048); + setState(1068); match(LOGICAL_OR); - setState(1049); + setState(1069); expression(7); } break; @@ -5913,11 +6108,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1050); + setState(1070); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1051); + setState(1071); match(IMPLIES); - setState(1052); + setState(1072); expression(5); } break; @@ -5925,15 +6120,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1053); + setState(1073); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1054); + setState(1074); match(QMARK); - setState(1055); + setState(1075); expression(0); - setState(1056); + setState(1076); match(COLON); - setState(1057); + setState(1077); expression(4); } break; @@ -5941,20 +6136,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1059); + setState(1079); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1060); + setState(1080); match(IMPL); - setState(1061); + setState(1081); closureSpecInstance(); } break; } } } - setState(1066); + setState(1086); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,79,_ctx); + _alt = getInterpreter().adaptivePredict(_input,81,_ctx); } } } @@ -5969,6 +6164,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class StatementContext extends ParserRuleContext { public GhostStatementContext ghostStatement() { return getRuleContext(GhostStatementContext.class,0); @@ -6043,148 +6239,148 @@ public T accept(ParseTreeVisitor visitor) { public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); - enterRule(_localctx, 164, RULE_statement); + enterRule(_localctx, 166, RULE_statement); try { - setState(1087); + setState(1107); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1067); + setState(1087); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1068); + setState(1088); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1069); + setState(1089); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1070); + setState(1090); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1071); + setState(1091); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1072); + setState(1092); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1073); + setState(1093); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1074); + setState(1094); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1075); + setState(1095); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1076); + setState(1096); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1077); + setState(1097); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1078); + setState(1098); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1079); + setState(1099); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1080); + setState(1100); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1081); + setState(1101); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1082); + setState(1102); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1083); + setState(1103); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1084); + setState(1104); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1085); + setState(1105); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1086); + setState(1106); closureImplProofStmt(); } break; @@ -6201,6 +6397,7 @@ public final StatementContext statement() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ApplyStmtContext extends ParserRuleContext { public TerminalNode APPLY() { return getToken(GobraParser.APPLY, 0); } public ExpressionContext expression() { @@ -6219,13 +6416,13 @@ public T accept(ParseTreeVisitor visitor) { public final ApplyStmtContext applyStmt() throws RecognitionException { ApplyStmtContext _localctx = new ApplyStmtContext(_ctx, getState()); - enterRule(_localctx, 166, RULE_applyStmt); + enterRule(_localctx, 168, RULE_applyStmt); try { enterOuterAlt(_localctx, 1); { - setState(1089); + setState(1109); match(APPLY); - setState(1090); + setState(1110); expression(0); } } @@ -6240,6 +6437,7 @@ public final ApplyStmtContext applyStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PackageStmtContext extends ParserRuleContext { public TerminalNode PACKAGE() { return getToken(GobraParser.PACKAGE, 0); } public ExpressionContext expression() { @@ -6261,20 +6459,20 @@ public T accept(ParseTreeVisitor visitor) { public final PackageStmtContext packageStmt() throws RecognitionException { PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState()); - enterRule(_localctx, 168, RULE_packageStmt); + enterRule(_localctx, 170, RULE_packageStmt); try { enterOuterAlt(_localctx, 1); { - setState(1092); + setState(1112); match(PACKAGE); - setState(1093); + setState(1113); expression(0); - setState(1095); + setState(1115); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { case 1: { - setState(1094); + setState(1114); block(); } break; @@ -6292,6 +6490,7 @@ public final PackageStmtContext packageStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SpecForStmtContext extends ParserRuleContext { public LoopSpecContext loopSpec() { return getRuleContext(LoopSpecContext.class,0); @@ -6312,13 +6511,13 @@ public T accept(ParseTreeVisitor visitor) { public final SpecForStmtContext specForStmt() throws RecognitionException { SpecForStmtContext _localctx = new SpecForStmtContext(_ctx, getState()); - enterRule(_localctx, 170, RULE_specForStmt); + enterRule(_localctx, 172, RULE_specForStmt); try { enterOuterAlt(_localctx, 1); { - setState(1097); + setState(1117); loopSpec(); - setState(1098); + setState(1118); forStmt(); } } @@ -6333,6 +6532,7 @@ public final SpecForStmtContext specForStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LoopSpecContext extends ParserRuleContext { public List INV() { return getTokens(GobraParser.INV); } public TerminalNode INV(int i) { @@ -6367,39 +6567,39 @@ public T accept(ParseTreeVisitor visitor) { public final LoopSpecContext loopSpec() throws RecognitionException { LoopSpecContext _localctx = new LoopSpecContext(_ctx, getState()); - enterRule(_localctx, 172, RULE_loopSpec); + enterRule(_localctx, 174, RULE_loopSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1106); + setState(1126); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1100); + setState(1120); match(INV); - setState(1101); + setState(1121); expression(0); - setState(1102); + setState(1122); eos(); } } - setState(1108); + setState(1128); _errHandler.sync(this); _la = _input.LA(1); } - setState(1113); + setState(1133); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1109); + setState(1129); match(DEC); - setState(1110); + setState(1130); terminationMeasure(); - setState(1111); + setState(1131); eos(); } } @@ -6417,6 +6617,7 @@ public final LoopSpecContext loopSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class DeferStmtContext extends ParserRuleContext { public Token fold_stmt; public TerminalNode DEFER() { return getToken(GobraParser.DEFER, 0); } @@ -6441,27 +6642,27 @@ public T accept(ParseTreeVisitor visitor) { public final DeferStmtContext deferStmt() throws RecognitionException { DeferStmtContext _localctx = new DeferStmtContext(_ctx, getState()); - enterRule(_localctx, 174, RULE_deferStmt); + enterRule(_localctx, 176, RULE_deferStmt); int _la; try { - setState(1120); + setState(1140); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1115); + setState(1135); match(DEFER); - setState(1116); + setState(1136); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1117); + setState(1137); match(DEFER); - setState(1118); + setState(1138); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -6472,7 +6673,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1119); + setState(1139); predicateAccess(); } break; @@ -6489,6 +6690,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BasicLitContext extends ParserRuleContext { public TerminalNode TRUE() { return getToken(GobraParser.TRUE, 0); } public TerminalNode FALSE() { return getToken(GobraParser.FALSE, 0); } @@ -6515,64 +6717,64 @@ public T accept(ParseTreeVisitor visitor) { public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); - enterRule(_localctx, 176, RULE_basicLit); + enterRule(_localctx, 178, RULE_basicLit); try { - setState(1130); + setState(1150); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1122); + setState(1142); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1123); + setState(1143); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1124); + setState(1144); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1125); + setState(1145); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1126); + setState(1146); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1127); + setState(1147); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1128); + setState(1148); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1129); + setState(1149); match(RUNE_LIT); } break; @@ -6589,6 +6791,7 @@ public final BasicLitContext basicLit() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PrimaryExprContext extends ParserRuleContext { public PrimaryExprContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -6600,6 +6803,7 @@ public void copyFrom(PrimaryExprContext ctx) { super.copyFrom(ctx); } } + @SuppressWarnings("CheckReturnValue") public static class NewExprContext extends PrimaryExprContext { public New_Context new_() { return getRuleContext(New_Context.class,0); @@ -6611,6 +6815,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MakeExprContext extends PrimaryExprContext { public MakeContext make() { return getRuleContext(MakeContext.class,0); @@ -6622,6 +6827,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class GhostPrimaryExpr_Context extends PrimaryExprContext { public GhostPrimaryExprContext ghostPrimaryExpr() { return getRuleContext(GhostPrimaryExprContext.class,0); @@ -6633,6 +6839,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class InvokePrimaryExprWithSpecContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6651,6 +6858,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class IndexPrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6665,6 +6873,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class SeqUpdPrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6679,6 +6888,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MethodPrimaryExprContext extends PrimaryExprContext { public MethodExprContext methodExpr() { return getRuleContext(MethodExprContext.class,0); @@ -6690,6 +6900,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class PredConstrPrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6704,6 +6915,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class InvokePrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6718,6 +6930,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class OperandPrimaryExprContext extends PrimaryExprContext { public OperandContext operand() { return getRuleContext(OperandContext.class,0); @@ -6729,6 +6942,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class TypeAssertionPrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6743,6 +6957,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class BuiltInCallExprContext extends PrimaryExprContext { public Token call_op; public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -6761,6 +6976,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class SelectorPrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6774,6 +6990,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class ConversionPrimaryExprContext extends PrimaryExprContext { public ConversionContext conversion() { return getRuleContext(ConversionContext.class,0); @@ -6785,6 +7002,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class SlicePrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6809,23 +7027,23 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _parentState = getState(); PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, _parentState); PrimaryExprContext _prevctx = _localctx; - int _startState = 178; - enterRecursionRule(_localctx, 178, RULE_primaryExpr, _p); + int _startState = 180; + enterRecursionRule(_localctx, 180, RULE_primaryExpr, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1144); + setState(1164); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { case 1: { _localctx = new OperandPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1133); + setState(1153); operand(); } break; @@ -6834,7 +7052,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1134); + setState(1154); conversion(); } break; @@ -6843,7 +7061,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1135); + setState(1155); methodExpr(); } break; @@ -6852,7 +7070,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1136); + setState(1156); ghostPrimaryExpr(); } break; @@ -6861,7 +7079,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1137); + setState(1157); new_(); } break; @@ -6870,7 +7088,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1138); + setState(1158); make(); } break; @@ -6879,10 +7097,10 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1139); + setState(1159); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & ((1L << (LEN - 45)) | (1L << (CAP - 45)) | (1L << (DOM - 45)) | (1L << (RANGE - 45)))) != 0)) ) { + if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 281474976710729L) != 0)) ) { ((BuiltInCallExprContext)_localctx).call_op = (Token)_errHandler.recoverInline(this); } else { @@ -6890,36 +7108,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1140); + setState(1160); match(L_PAREN); - setState(1141); + setState(1161); expression(0); - setState(1142); + setState(1162); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1168); + setState(1188); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + _alt = getInterpreter().adaptivePredict(_input,90,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1166); + setState(1186); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1146); + setState(1166); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1147); + setState(1167); match(DOT); - setState(1148); + setState(1168); match(IDENTIFIER); } break; @@ -6927,9 +7145,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1149); + setState(1169); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1150); + setState(1170); index(); } break; @@ -6937,9 +7155,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1151); + setState(1171); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1152); + setState(1172); slice_(); } break; @@ -6947,9 +7165,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1153); + setState(1173); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1154); + setState(1174); seqUpdExp(); } break; @@ -6957,9 +7175,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1155); + setState(1175); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1156); + setState(1176); typeAssertion(); } break; @@ -6967,9 +7185,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1157); + setState(1177); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1158); + setState(1178); arguments(); } break; @@ -6977,13 +7195,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1159); + setState(1179); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1160); + setState(1180); arguments(); - setState(1161); + setState(1181); match(AS); - setState(1162); + setState(1182); closureSpecInstance(); } break; @@ -6991,18 +7209,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1164); + setState(1184); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1165); + setState(1185); predConstructArgs(); } break; } } } - setState(1170); + setState(1190); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + _alt = getInterpreter().adaptivePredict(_input,90,_ctx); } } } @@ -7017,6 +7235,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FunctionLitContext extends ParserRuleContext { public SpecificationContext specification; public SpecificationContext specification() { @@ -7038,13 +7257,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionLitContext functionLit() throws RecognitionException { FunctionLitContext _localctx = new FunctionLitContext(_ctx, getState()); - enterRule(_localctx, 180, RULE_functionLit); + enterRule(_localctx, 182, RULE_functionLit); try { enterOuterAlt(_localctx, 1); { - setState(1171); + setState(1191); ((FunctionLitContext)_localctx).specification = specification(); - setState(1172); + setState(1192); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7059,6 +7278,7 @@ public final FunctionLitContext functionLit() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ClosureDeclContext extends ParserRuleContext { public boolean trusted; public boolean pure; @@ -7086,32 +7306,32 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws RecognitionException { ClosureDeclContext _localctx = new ClosureDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 182, RULE_closureDecl); + enterRule(_localctx, 184, RULE_closureDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1174); + setState(1194); match(FUNC); - setState(1176); + setState(1196); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1175); + setState(1195); match(IDENTIFIER); } } { - setState(1178); + setState(1198); signature(); - setState(1180); + setState(1200); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,92,_ctx) ) { case 1: { - setState(1179); + setState(1199); blockWithBodyParameterInfo(); } break; @@ -7130,6 +7350,7 @@ public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PredConstructArgsContext extends ParserRuleContext { public TerminalNode L_PRED() { return getToken(GobraParser.L_PRED, 0); } public TerminalNode R_PRED() { return getToken(GobraParser.R_PRED, 0); } @@ -7150,34 +7371,34 @@ public T accept(ParseTreeVisitor visitor) { public final PredConstructArgsContext predConstructArgs() throws RecognitionException { PredConstructArgsContext _localctx = new PredConstructArgsContext(_ctx, getState()); - enterRule(_localctx, 184, RULE_predConstructArgs); + enterRule(_localctx, 186, RULE_predConstructArgs); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1182); + setState(1202); match(L_PRED); - setState(1184); + setState(1204); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1183); + setState(1203); expressionList(); } } - setState(1187); + setState(1207); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1186); + setState(1206); match(COMMA); } } - setState(1189); + setState(1209); match(R_PRED); } } @@ -7192,6 +7413,7 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class InterfaceTypeContext extends ParserRuleContext { public TerminalNode INTERFACE() { return getToken(GobraParser.INTERFACE, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -7233,52 +7455,52 @@ public T accept(ParseTreeVisitor visitor) { public final InterfaceTypeContext interfaceType() throws RecognitionException { InterfaceTypeContext _localctx = new InterfaceTypeContext(_ctx, getState()); - enterRule(_localctx, 186, RULE_interfaceType); + enterRule(_localctx, 188, RULE_interfaceType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1191); + setState(1211); match(INTERFACE); - setState(1192); + setState(1212); match(L_CURLY); - setState(1202); + setState(1222); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << GHOST) | (1L << PRED))) != 0) || _la==TRUSTED || _la==IDENTIFIER) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 72057594172173824L) != 0) || _la==TRUSTED || _la==IDENTIFIER) { { { - setState(1196); + setState(1216); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { case 1: { - setState(1193); + setState(1213); methodSpec(); } break; case 2: { - setState(1194); + setState(1214); typeName(); } break; case 3: { - setState(1195); + setState(1215); predicateSpec(); } break; } - setState(1198); + setState(1218); eos(); } } - setState(1204); + setState(1224); _errHandler.sync(this); _la = _input.LA(1); } - setState(1205); + setState(1225); match(R_CURLY); } } @@ -7293,6 +7515,7 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PredicateSpecContext extends ParserRuleContext { public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -7312,15 +7535,15 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateSpecContext predicateSpec() throws RecognitionException { PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState()); - enterRule(_localctx, 188, RULE_predicateSpec); + enterRule(_localctx, 190, RULE_predicateSpec); try { enterOuterAlt(_localctx, 1); { - setState(1207); + setState(1227); match(PRED); - setState(1208); + setState(1228); match(IDENTIFIER); - setState(1209); + setState(1229); parameters(); } } @@ -7335,6 +7558,7 @@ public final PredicateSpecContext predicateSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MethodSpecContext extends ParserRuleContext { public SpecificationContext specification() { return getRuleContext(SpecificationContext.class,0); @@ -7360,53 +7584,53 @@ public T accept(ParseTreeVisitor visitor) { public final MethodSpecContext methodSpec() throws RecognitionException { MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState()); - enterRule(_localctx, 190, RULE_methodSpec); + enterRule(_localctx, 192, RULE_methodSpec); int _la; try { - setState(1226); + setState(1246); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1212); + setState(1232); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1211); + setState(1231); match(GHOST); } } - setState(1214); + setState(1234); specification(); - setState(1215); + setState(1235); match(IDENTIFIER); - setState(1216); + setState(1236); parameters(); - setState(1217); + setState(1237); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1220); + setState(1240); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1219); + setState(1239); match(GHOST); } } - setState(1222); + setState(1242); specification(); - setState(1223); + setState(1243); match(IDENTIFIER); - setState(1224); + setState(1244); parameters(); } break; @@ -7423,6 +7647,7 @@ public final MethodSpecContext methodSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class Type_Context extends ParserRuleContext { public TypeNameContext typeName() { return getRuleContext(TypeNameContext.class,0); @@ -7451,15 +7676,15 @@ public T accept(ParseTreeVisitor visitor) { public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); - enterRule(_localctx, 192, RULE_type_); + enterRule(_localctx, 194, RULE_type_); try { - setState(1235); + setState(1255); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1228); + setState(1248); typeName(); } break; @@ -7474,7 +7699,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1229); + setState(1249); typeLit(); } break; @@ -7488,18 +7713,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1230); + setState(1250); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1231); + setState(1251); match(L_PAREN); - setState(1232); + setState(1252); type_(); - setState(1233); + setState(1253); match(R_PAREN); } break; @@ -7518,6 +7743,7 @@ public final Type_Context type_() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeLitContext extends ParserRuleContext { public ArrayTypeContext arrayType() { return getRuleContext(ArrayTypeContext.class,0); @@ -7559,71 +7785,71 @@ public T accept(ParseTreeVisitor visitor) { public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); - enterRule(_localctx, 194, RULE_typeLit); + enterRule(_localctx, 196, RULE_typeLit); try { - setState(1246); + setState(1266); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1237); + setState(1257); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1238); + setState(1258); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1239); + setState(1259); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1240); + setState(1260); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1241); + setState(1261); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1242); + setState(1262); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1243); + setState(1263); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1244); + setState(1264); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1245); + setState(1265); predType(); } break; @@ -7640,6 +7866,7 @@ public final TypeLitContext typeLit() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PredTypeContext extends ParserRuleContext { public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } public PredTypeParamsContext predTypeParams() { @@ -7658,13 +7885,13 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeContext predType() throws RecognitionException { PredTypeContext _localctx = new PredTypeContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_predType); + enterRule(_localctx, 198, RULE_predType); try { enterOuterAlt(_localctx, 1); { - setState(1248); + setState(1268); match(PRED); - setState(1249); + setState(1269); predTypeParams(); } } @@ -7679,6 +7906,7 @@ public final PredTypeContext predType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PredTypeParamsContext extends ParserRuleContext { public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public TerminalNode R_PAREN() { return getToken(GobraParser.R_PAREN, 0); } @@ -7705,45 +7933,45 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeParamsContext predTypeParams() throws RecognitionException { PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_predTypeParams); + enterRule(_localctx, 200, RULE_predTypeParams); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1251); + setState(1271); match(L_PAREN); - setState(1263); + setState(1283); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { { - setState(1252); + setState(1272); type_(); - setState(1257); + setState(1277); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,100,_ctx); + _alt = getInterpreter().adaptivePredict(_input,102,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1253); + setState(1273); match(COMMA); - setState(1254); + setState(1274); type_(); } } } - setState(1259); + setState(1279); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,100,_ctx); + _alt = getInterpreter().adaptivePredict(_input,102,_ctx); } - setState(1261); + setState(1281); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1260); + setState(1280); match(COMMA); } } @@ -7751,7 +7979,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1265); + setState(1285); match(R_PAREN); } } @@ -7766,6 +7994,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LiteralTypeContext extends ParserRuleContext { public StructTypeContext structType() { return getRuleContext(StructTypeContext.class,0); @@ -7801,57 +8030,57 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_literalType); + enterRule(_localctx, 202, RULE_literalType); try { - setState(1274); + setState(1294); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,105,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1267); + setState(1287); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1268); + setState(1288); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1269); + setState(1289); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1270); + setState(1290); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1271); + setState(1291); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1272); + setState(1292); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1273); + setState(1293); typeName(); } break; @@ -7868,6 +8097,7 @@ public final LiteralTypeContext literalType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImplicitArrayContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public TerminalNode ELLIPSIS() { return getToken(GobraParser.ELLIPSIS, 0); } @@ -7888,17 +8118,17 @@ public T accept(ParseTreeVisitor visitor) { public final ImplicitArrayContext implicitArray() throws RecognitionException { ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_implicitArray); + enterRule(_localctx, 204, RULE_implicitArray); try { enterOuterAlt(_localctx, 1); { - setState(1276); + setState(1296); match(L_BRACKET); - setState(1277); + setState(1297); match(ELLIPSIS); - setState(1278); + setState(1298); match(R_BRACKET); - setState(1279); + setState(1299); elementType(); } } @@ -7913,6 +8143,7 @@ public final ImplicitArrayContext implicitArray() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class Slice_Context extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } @@ -7942,36 +8173,36 @@ public T accept(ParseTreeVisitor visitor) { public final Slice_Context slice_() throws RecognitionException { Slice_Context _localctx = new Slice_Context(_ctx, getState()); - enterRule(_localctx, 204, RULE_slice_); + enterRule(_localctx, 206, RULE_slice_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1281); + setState(1301); match(L_BRACKET); - setState(1297); + setState(1317); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { case 1: { - setState(1283); + setState(1303); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1282); + setState(1302); low(); } } - setState(1285); + setState(1305); match(COLON); - setState(1287); + setState(1307); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1286); + setState(1306); high(); } } @@ -7980,28 +8211,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1290); + setState(1310); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1289); + setState(1309); low(); } } - setState(1292); + setState(1312); match(COLON); - setState(1293); + setState(1313); high(); - setState(1294); + setState(1314); match(COLON); - setState(1295); + setState(1315); cap(); } break; } - setState(1299); + setState(1319); match(R_BRACKET); } } @@ -8016,6 +8247,7 @@ public final Slice_Context slice_() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LowContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -8033,11 +8265,11 @@ public T accept(ParseTreeVisitor visitor) { public final LowContext low() throws RecognitionException { LowContext _localctx = new LowContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_low); + enterRule(_localctx, 208, RULE_low); try { enterOuterAlt(_localctx, 1); { - setState(1301); + setState(1321); expression(0); } } @@ -8052,6 +8284,7 @@ public final LowContext low() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class HighContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -8069,11 +8302,11 @@ public T accept(ParseTreeVisitor visitor) { public final HighContext high() throws RecognitionException { HighContext _localctx = new HighContext(_ctx, getState()); - enterRule(_localctx, 208, RULE_high); + enterRule(_localctx, 210, RULE_high); try { enterOuterAlt(_localctx, 1); { - setState(1303); + setState(1323); expression(0); } } @@ -8088,6 +8321,7 @@ public final HighContext high() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class CapContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -8105,11 +8339,11 @@ public T accept(ParseTreeVisitor visitor) { public final CapContext cap() throws RecognitionException { CapContext _localctx = new CapContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_cap); + enterRule(_localctx, 212, RULE_cap); try { enterOuterAlt(_localctx, 1); { - setState(1305); + setState(1325); expression(0); } } @@ -8124,6 +8358,7 @@ public final CapContext cap() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class Assign_opContext extends ParserRuleContext { public Token ass_op; public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); } @@ -8151,20 +8386,20 @@ public T accept(ParseTreeVisitor visitor) { public final Assign_opContext assign_op() throws RecognitionException { Assign_opContext _localctx = new Assign_opContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_assign_op); + enterRule(_localctx, 214, RULE_assign_op); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1308); + setState(1328); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (OR - 125)) | (1L << (DIV - 125)) | (1L << (MOD - 125)) | (1L << (LSHIFT - 125)) | (1L << (RSHIFT - 125)) | (1L << (BIT_CLEAR - 125)) | (1L << (PLUS - 125)) | (1L << (MINUS - 125)) | (1L << (CARET - 125)) | (1L << (STAR - 125)) | (1L << (AMPERSAND - 125)))) != 0)) { + if (((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) { { - setState(1307); + setState(1327); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (OR - 125)) | (1L << (DIV - 125)) | (1L << (MOD - 125)) | (1L << (LSHIFT - 125)) | (1L << (RSHIFT - 125)) | (1L << (BIT_CLEAR - 125)) | (1L << (PLUS - 125)) | (1L << (MINUS - 125)) | (1L << (CARET - 125)) | (1L << (STAR - 125)) | (1L << (AMPERSAND - 125)))) != 0)) ) { + if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -8175,7 +8410,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1310); + setState(1330); match(ASSIGN); } } @@ -8190,6 +8425,7 @@ public final Assign_opContext assign_op() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class RangeClauseContext extends ParserRuleContext { public TerminalNode RANGE() { return getToken(GobraParser.RANGE, 0); } public ExpressionContext expression() { @@ -8218,48 +8454,48 @@ public T accept(ParseTreeVisitor visitor) { public final RangeClauseContext rangeClause() throws RecognitionException { RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_rangeClause); + enterRule(_localctx, 216, RULE_rangeClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1318); + setState(1338); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,111,_ctx) ) { case 1: { - setState(1312); + setState(1332); expressionList(); - setState(1313); + setState(1333); match(ASSIGN); } break; case 2: { - setState(1315); + setState(1335); maybeAddressableIdentifierList(); - setState(1316); + setState(1336); match(DECLARE_ASSIGN); } break; } - setState(1320); + setState(1340); match(RANGE); - setState(1321); + setState(1341); expression(0); - setState(1326); + setState(1346); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1322); + setState(1342); match(WITH); - setState(1324); + setState(1344); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1323); + setState(1343); match(IDENTIFIER); } } @@ -8280,6 +8516,7 @@ public final RangeClauseContext rangeClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PackageClauseContext extends ParserRuleContext { public Token packageName; public TerminalNode PACKAGE() { return getToken(GobraParser.PACKAGE, 0); } @@ -8297,13 +8534,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_packageClause); + enterRule(_localctx, 218, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1328); + setState(1348); match(PACKAGE); - setState(1329); + setState(1349); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -8318,6 +8555,7 @@ public final PackageClauseContext packageClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImportPathContext extends ParserRuleContext { public String_Context string_() { return getRuleContext(String_Context.class,0); @@ -8335,11 +8573,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_importPath); + enterRule(_localctx, 220, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1331); + setState(1351); string_(); } } @@ -8354,6 +8592,7 @@ public final ImportPathContext importPath() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class DeclarationContext extends ParserRuleContext { public ConstDeclContext constDecl() { return getRuleContext(ConstDeclContext.class,0); @@ -8377,29 +8616,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_declaration); + enterRule(_localctx, 222, RULE_declaration); try { - setState(1336); + setState(1356); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1333); + setState(1353); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1334); + setState(1354); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1335); + setState(1355); varDecl(); } break; @@ -8418,6 +8657,7 @@ public final DeclarationContext declaration() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ConstDeclContext extends ParserRuleContext { public TerminalNode CONST() { return getToken(GobraParser.CONST, 0); } public List constSpec() { @@ -8447,43 +8687,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_constDecl); + enterRule(_localctx, 224, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1338); + setState(1358); match(CONST); - setState(1350); + setState(1370); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1339); + setState(1359); constSpec(); } break; case L_PAREN: { - setState(1340); + setState(1360); match(L_PAREN); - setState(1346); + setState(1366); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1341); + setState(1361); constSpec(); - setState(1342); + setState(1362); eos(); } } - setState(1348); + setState(1368); _errHandler.sync(this); _la = _input.LA(1); } - setState(1349); + setState(1369); match(R_PAREN); } break; @@ -8503,6 +8743,7 @@ public final ConstDeclContext constDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ConstSpecContext extends ParserRuleContext { public IdentifierListContext identifierList() { return getRuleContext(IdentifierListContext.class,0); @@ -8527,31 +8768,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_constSpec); + enterRule(_localctx, 226, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1352); + setState(1372); identifierList(); - setState(1358); + setState(1378); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) { case 1: { - setState(1354); + setState(1374); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { { - setState(1353); + setState(1373); type_(); } } - setState(1356); + setState(1376); match(ASSIGN); - setState(1357); + setState(1377); expressionList(); } break; @@ -8569,6 +8810,7 @@ public final ConstSpecContext constSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IdentifierListContext extends ParserRuleContext { public List IDENTIFIER() { return getTokens(GobraParser.IDENTIFIER); } public TerminalNode IDENTIFIER(int i) { @@ -8591,30 +8833,30 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_identifierList); + enterRule(_localctx, 228, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1360); + setState(1380); match(IDENTIFIER); - setState(1365); + setState(1385); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,117,_ctx); + _alt = getInterpreter().adaptivePredict(_input,119,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1361); + setState(1381); match(COMMA); - setState(1362); + setState(1382); match(IDENTIFIER); } } } - setState(1367); + setState(1387); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,117,_ctx); + _alt = getInterpreter().adaptivePredict(_input,119,_ctx); } } } @@ -8629,6 +8871,7 @@ public final IdentifierListContext identifierList() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExpressionListContext extends ParserRuleContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -8653,30 +8896,30 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_expressionList); + enterRule(_localctx, 230, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1368); + setState(1388); expression(0); - setState(1373); + setState(1393); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,118,_ctx); + _alt = getInterpreter().adaptivePredict(_input,120,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1369); + setState(1389); match(COMMA); - setState(1370); + setState(1390); expression(0); } } } - setState(1375); + setState(1395); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,118,_ctx); + _alt = getInterpreter().adaptivePredict(_input,120,_ctx); } } } @@ -8691,6 +8934,7 @@ public final ExpressionListContext expressionList() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeDeclContext extends ParserRuleContext { public TerminalNode TYPE() { return getToken(GobraParser.TYPE, 0); } public List typeSpec() { @@ -8720,43 +8964,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_typeDecl); + enterRule(_localctx, 232, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1376); + setState(1396); match(TYPE); - setState(1388); + setState(1408); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1377); + setState(1397); typeSpec(); } break; case L_PAREN: { - setState(1378); + setState(1398); match(L_PAREN); - setState(1384); + setState(1404); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1379); + setState(1399); typeSpec(); - setState(1380); + setState(1400); eos(); } } - setState(1386); + setState(1406); _errHandler.sync(this); _la = _input.LA(1); } - setState(1387); + setState(1407); match(R_PAREN); } break; @@ -8776,6 +9020,7 @@ public final TypeDeclContext typeDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeSpecContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public Type_Context type_() { @@ -8795,24 +9040,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_typeSpec); + enterRule(_localctx, 234, RULE_typeSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1390); + setState(1410); match(IDENTIFIER); - setState(1392); + setState(1412); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1391); + setState(1411); match(ASSIGN); } } - setState(1394); + setState(1414); type_(); } } @@ -8827,6 +9072,7 @@ public final TypeSpecContext typeSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class VarDeclContext extends ParserRuleContext { public TerminalNode VAR() { return getToken(GobraParser.VAR, 0); } public List varSpec() { @@ -8856,43 +9102,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_varDecl); + enterRule(_localctx, 236, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1396); + setState(1416); match(VAR); - setState(1408); + setState(1428); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1397); + setState(1417); varSpec(); } break; case L_PAREN: { - setState(1398); + setState(1418); match(L_PAREN); - setState(1404); + setState(1424); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1399); + setState(1419); varSpec(); - setState(1400); + setState(1420); eos(); } } - setState(1406); + setState(1426); _errHandler.sync(this); _la = _input.LA(1); } - setState(1407); + setState(1427); match(R_PAREN); } break; @@ -8912,6 +9158,7 @@ public final VarDeclContext varDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BlockContext extends ParserRuleContext { public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } @@ -8931,23 +9178,23 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_block); + enterRule(_localctx, 238, RULE_block); try { enterOuterAlt(_localctx, 1); { - setState(1410); + setState(1430); match(L_CURLY); - setState(1412); + setState(1432); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { case 1: { - setState(1411); + setState(1431); statementList(); } break; } - setState(1414); + setState(1434); match(R_CURLY); } } @@ -8962,6 +9209,7 @@ public final BlockContext block() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class StatementListContext extends ParserRuleContext { public List statement() { return getRuleContexts(StatementContext.class); @@ -8975,6 +9223,14 @@ public List eos() { public EosContext eos(int i) { return getRuleContext(EosContext.class,i); } + public List SEMI() { return getTokens(GobraParser.SEMI); } + public TerminalNode SEMI(int i) { + return getToken(GobraParser.SEMI, i); + } + public List EOS() { return getTokens(GobraParser.EOS); } + public TerminalNode EOS(int i) { + return getToken(GobraParser.EOS, i); + } public StatementListContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -8988,12 +9244,13 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_statementList); + enterRule(_localctx, 240, RULE_statementList); + int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1422); + setState(1448); _errHandler.sync(this); _alt = 1; do { @@ -9001,19 +9258,47 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1417); + setState(1443); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: { - setState(1416); - eos(); + setState(1437); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==SEMI) { + { + setState(1436); + match(SEMI); + } + } + + } + break; + case 2: + { + setState(1440); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EOS) { + { + setState(1439); + match(EOS); + } + } + + } + break; + case 3: + { + setState(1442); + if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; } - setState(1419); + setState(1445); statement(); - setState(1420); + setState(1446); eos(); } } @@ -9021,9 +9306,9 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1424); + setState(1450); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,126,_ctx); + _alt = getInterpreter().adaptivePredict(_input,130,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -9038,6 +9323,7 @@ public final StatementListContext statementList() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SimpleStmtContext extends ParserRuleContext { public SendStmtContext sendStmt() { return getRuleContext(SendStmtContext.class,0); @@ -9067,43 +9353,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_simpleStmt); + enterRule(_localctx, 242, RULE_simpleStmt); try { - setState(1431); + setState(1457); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1426); + setState(1452); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1427); + setState(1453); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1428); + setState(1454); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1429); + setState(1455); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1430); + setState(1456); shortVarDecl(); } break; @@ -9120,6 +9406,7 @@ public final SimpleStmtContext simpleStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExpressionStmtContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -9137,11 +9424,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_expressionStmt); + enterRule(_localctx, 244, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1433); + setState(1459); expression(0); } } @@ -9156,6 +9443,7 @@ public final ExpressionStmtContext expressionStmt() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SendStmtContext extends ParserRuleContext { public ExpressionContext channel; public TerminalNode RECEIVE() { return getToken(GobraParser.RECEIVE, 0); } @@ -9178,15 +9466,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_sendStmt); + enterRule(_localctx, 246, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1435); + setState(1461); ((SendStmtContext)_localctx).channel = expression(0); - setState(1436); + setState(1462); match(RECEIVE); - setState(1437); + setState(1463); expression(0); } } @@ -9201,6 +9489,7 @@ public final SendStmtContext sendStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IncDecStmtContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -9220,14 +9509,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_incDecStmt); + enterRule(_localctx, 248, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1439); + setState(1465); expression(0); - setState(1440); + setState(1466); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -9250,6 +9539,7 @@ public final IncDecStmtContext incDecStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AssignmentContext extends ParserRuleContext { public List expressionList() { return getRuleContexts(ExpressionListContext.class); @@ -9273,15 +9563,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_assignment); + enterRule(_localctx, 250, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1442); + setState(1468); expressionList(); - setState(1443); + setState(1469); assign_op(); - setState(1444); + setState(1470); expressionList(); } } @@ -9296,6 +9586,7 @@ public final AssignmentContext assignment() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class EmptyStmtContext extends ParserRuleContext { public TerminalNode EOS() { return getToken(GobraParser.EOS, 0); } public TerminalNode SEMI() { return getToken(GobraParser.SEMI, 0); } @@ -9312,12 +9603,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_emptyStmt); + enterRule(_localctx, 252, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1446); + setState(1472); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -9340,6 +9631,7 @@ public final EmptyStmtContext emptyStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LabeledStmtContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public TerminalNode COLON() { return getToken(GobraParser.COLON, 0); } @@ -9359,20 +9651,20 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_labeledStmt); + enterRule(_localctx, 254, RULE_labeledStmt); try { enterOuterAlt(_localctx, 1); { - setState(1448); + setState(1474); match(IDENTIFIER); - setState(1449); + setState(1475); match(COLON); - setState(1451); + setState(1477); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { case 1: { - setState(1450); + setState(1476); statement(); } break; @@ -9390,6 +9682,7 @@ public final LabeledStmtContext labeledStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ReturnStmtContext extends ParserRuleContext { public TerminalNode RETURN() { return getToken(GobraParser.RETURN, 0); } public ExpressionListContext expressionList() { @@ -9408,18 +9701,18 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_returnStmt); + enterRule(_localctx, 256, RULE_returnStmt); try { enterOuterAlt(_localctx, 1); { - setState(1453); + setState(1479); match(RETURN); - setState(1455); + setState(1481); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { case 1: { - setState(1454); + setState(1480); expressionList(); } break; @@ -9437,6 +9730,7 @@ public final ReturnStmtContext returnStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BreakStmtContext extends ParserRuleContext { public TerminalNode BREAK() { return getToken(GobraParser.BREAK, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -9453,18 +9747,18 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_breakStmt); + enterRule(_localctx, 258, RULE_breakStmt); try { enterOuterAlt(_localctx, 1); { - setState(1457); + setState(1483); match(BREAK); - setState(1459); + setState(1485); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { case 1: { - setState(1458); + setState(1484); match(IDENTIFIER); } break; @@ -9482,6 +9776,7 @@ public final BreakStmtContext breakStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ContinueStmtContext extends ParserRuleContext { public TerminalNode CONTINUE() { return getToken(GobraParser.CONTINUE, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -9498,18 +9793,18 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_continueStmt); + enterRule(_localctx, 260, RULE_continueStmt); try { enterOuterAlt(_localctx, 1); { - setState(1461); + setState(1487); match(CONTINUE); - setState(1463); + setState(1489); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: { - setState(1462); + setState(1488); match(IDENTIFIER); } break; @@ -9527,6 +9822,7 @@ public final ContinueStmtContext continueStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GotoStmtContext extends ParserRuleContext { public TerminalNode GOTO() { return getToken(GobraParser.GOTO, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -9543,13 +9839,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_gotoStmt); + enterRule(_localctx, 262, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1465); + setState(1491); match(GOTO); - setState(1466); + setState(1492); match(IDENTIFIER); } } @@ -9564,6 +9860,7 @@ public final GotoStmtContext gotoStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FallthroughStmtContext extends ParserRuleContext { public TerminalNode FALLTHROUGH() { return getToken(GobraParser.FALLTHROUGH, 0); } public FallthroughStmtContext(ParserRuleContext parent, int invokingState) { @@ -9579,11 +9876,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_fallthroughStmt); + enterRule(_localctx, 264, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1468); + setState(1494); match(FALLTHROUGH); } } @@ -9598,6 +9895,7 @@ public final FallthroughStmtContext fallthroughStmt() throws RecognitionExceptio return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IfStmtContext extends ParserRuleContext { public TerminalNode IF() { return getToken(GobraParser.IF, 0); } public List block() { @@ -9632,61 +9930,61 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_ifStmt); + enterRule(_localctx, 266, RULE_ifStmt); try { enterOuterAlt(_localctx, 1); { - setState(1470); + setState(1496); match(IF); - setState(1479); + setState(1505); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { case 1: { - setState(1471); + setState(1497); expression(0); } break; case 2: { - setState(1472); + setState(1498); eos(); - setState(1473); + setState(1499); expression(0); } break; case 3: { - setState(1475); + setState(1501); simpleStmt(); - setState(1476); + setState(1502); eos(); - setState(1477); + setState(1503); expression(0); } break; } - setState(1481); + setState(1507); block(); - setState(1487); + setState(1513); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) { case 1: { - setState(1482); + setState(1508); match(ELSE); - setState(1485); + setState(1511); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1483); + setState(1509); ifStmt(); } break; case L_CURLY: { - setState(1484); + setState(1510); block(); } break; @@ -9709,6 +10007,7 @@ public final IfStmtContext ifStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SwitchStmtContext extends ParserRuleContext { public ExprSwitchStmtContext exprSwitchStmt() { return getRuleContext(ExprSwitchStmtContext.class,0); @@ -9729,22 +10028,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_switchStmt); + enterRule(_localctx, 268, RULE_switchStmt); try { - setState(1491); + setState(1517); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1489); + setState(1515); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1490); + setState(1516); typeSwitchStmt(); } break; @@ -9761,6 +10060,7 @@ public final SwitchStmtContext switchStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExprSwitchStmtContext extends ParserRuleContext { public TerminalNode SWITCH() { return getToken(GobraParser.SWITCH, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -9793,24 +10093,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_exprSwitchStmt); + enterRule(_localctx, 270, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1493); + setState(1519); match(SWITCH); - setState(1504); + setState(1530); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: { - setState(1495); + setState(1521); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1494); + setState(1520); expression(0); } } @@ -9819,24 +10119,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1498); + setState(1524); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { case 1: { - setState(1497); + setState(1523); simpleStmt(); } break; } - setState(1500); + setState(1526); eos(); - setState(1502); + setState(1528); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1501); + setState(1527); expression(0); } } @@ -9844,23 +10144,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1506); + setState(1532); match(L_CURLY); - setState(1510); + setState(1536); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1507); + setState(1533); exprCaseClause(); } } - setState(1512); + setState(1538); _errHandler.sync(this); _la = _input.LA(1); } - setState(1513); + setState(1539); match(R_CURLY); } } @@ -9875,6 +10175,7 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExprCaseClauseContext extends ParserRuleContext { public ExprSwitchCaseContext exprSwitchCase() { return getRuleContext(ExprSwitchCaseContext.class,0); @@ -9896,20 +10197,20 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_exprCaseClause); + enterRule(_localctx, 272, RULE_exprCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1515); + setState(1541); exprSwitchCase(); - setState(1516); + setState(1542); match(COLON); - setState(1518); + setState(1544); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1517); + setState(1543); statementList(); } break; @@ -9927,6 +10228,7 @@ public final ExprCaseClauseContext exprCaseClause() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExprSwitchCaseContext extends ParserRuleContext { public TerminalNode CASE() { return getToken(GobraParser.CASE, 0); } public ExpressionListContext expressionList() { @@ -9946,24 +10248,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_exprSwitchCase); + enterRule(_localctx, 274, RULE_exprSwitchCase); try { - setState(1523); + setState(1549); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1520); + setState(1546); match(CASE); - setState(1521); + setState(1547); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1522); + setState(1548); match(DEFAULT); } break; @@ -9982,6 +10284,7 @@ public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeSwitchStmtContext extends ParserRuleContext { public TerminalNode SWITCH() { return getToken(GobraParser.SWITCH, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -10014,58 +10317,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_typeSwitchStmt); + enterRule(_localctx, 276, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1525); + setState(1551); match(SWITCH); - setState(1534); + setState(1560); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { case 1: { - setState(1526); + setState(1552); typeSwitchGuard(); } break; case 2: { - setState(1527); + setState(1553); eos(); - setState(1528); + setState(1554); typeSwitchGuard(); } break; case 3: { - setState(1530); + setState(1556); simpleStmt(); - setState(1531); + setState(1557); eos(); - setState(1532); + setState(1558); typeSwitchGuard(); } break; } - setState(1536); + setState(1562); match(L_CURLY); - setState(1540); + setState(1566); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1537); + setState(1563); typeCaseClause(); } } - setState(1542); + setState(1568); _errHandler.sync(this); _la = _input.LA(1); } - setState(1543); + setState(1569); match(R_CURLY); } } @@ -10080,6 +10383,7 @@ public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeSwitchGuardContext extends ParserRuleContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -10103,31 +10407,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_typeSwitchGuard); + enterRule(_localctx, 278, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1547); + setState(1573); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { case 1: { - setState(1545); + setState(1571); match(IDENTIFIER); - setState(1546); + setState(1572); match(DECLARE_ASSIGN); } break; } - setState(1549); + setState(1575); primaryExpr(0); - setState(1550); + setState(1576); match(DOT); - setState(1551); + setState(1577); match(L_PAREN); - setState(1552); + setState(1578); match(TYPE); - setState(1553); + setState(1579); match(R_PAREN); } } @@ -10142,6 +10446,7 @@ public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionExceptio return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeCaseClauseContext extends ParserRuleContext { public TypeSwitchCaseContext typeSwitchCase() { return getRuleContext(TypeSwitchCaseContext.class,0); @@ -10163,20 +10468,20 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 278, RULE_typeCaseClause); + enterRule(_localctx, 280, RULE_typeCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1555); + setState(1581); typeSwitchCase(); - setState(1556); + setState(1582); match(COLON); - setState(1558); + setState(1584); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { case 1: { - setState(1557); + setState(1583); statementList(); } break; @@ -10194,6 +10499,7 @@ public final TypeCaseClauseContext typeCaseClause() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeSwitchCaseContext extends ParserRuleContext { public TerminalNode CASE() { return getToken(GobraParser.CASE, 0); } public TypeListContext typeList() { @@ -10213,24 +10519,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 280, RULE_typeSwitchCase); + enterRule(_localctx, 282, RULE_typeSwitchCase); try { - setState(1563); + setState(1589); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1560); + setState(1586); match(CASE); - setState(1561); + setState(1587); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1562); + setState(1588); match(DEFAULT); } break; @@ -10249,6 +10555,7 @@ public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeListContext extends ParserRuleContext { public List type_() { return getRuleContexts(Type_Context.class); @@ -10277,12 +10584,12 @@ public T accept(ParseTreeVisitor visitor) { public final TypeListContext typeList() throws RecognitionException { TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 282, RULE_typeList); + enterRule(_localctx, 284, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1567); + setState(1593); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10305,28 +10612,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1565); + setState(1591); type_(); } break; case NIL_LIT: { - setState(1566); + setState(1592); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1576); + setState(1602); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1569); + setState(1595); match(COMMA); - setState(1572); + setState(1598); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10349,13 +10656,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1570); + setState(1596); type_(); } break; case NIL_LIT: { - setState(1571); + setState(1597); match(NIL_LIT); } break; @@ -10364,7 +10671,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1578); + setState(1604); _errHandler.sync(this); _la = _input.LA(1); } @@ -10381,6 +10688,7 @@ public final TypeListContext typeList() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SelectStmtContext extends ParserRuleContext { public TerminalNode SELECT() { return getToken(GobraParser.SELECT, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -10404,30 +10712,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 284, RULE_selectStmt); + enterRule(_localctx, 286, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1579); + setState(1605); match(SELECT); - setState(1580); + setState(1606); match(L_CURLY); - setState(1584); + setState(1610); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1581); + setState(1607); commClause(); } } - setState(1586); + setState(1612); _errHandler.sync(this); _la = _input.LA(1); } - setState(1587); + setState(1613); match(R_CURLY); } } @@ -10442,6 +10750,7 @@ public final SelectStmtContext selectStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class CommClauseContext extends ParserRuleContext { public CommCaseContext commCase() { return getRuleContext(CommCaseContext.class,0); @@ -10463,20 +10772,20 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 286, RULE_commClause); + enterRule(_localctx, 288, RULE_commClause); try { enterOuterAlt(_localctx, 1); { - setState(1589); + setState(1615); commCase(); - setState(1590); + setState(1616); match(COLON); - setState(1592); + setState(1618); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { case 1: { - setState(1591); + setState(1617); statementList(); } break; @@ -10494,6 +10803,7 @@ public final CommClauseContext commClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class CommCaseContext extends ParserRuleContext { public TerminalNode CASE() { return getToken(GobraParser.CASE, 0); } public SendStmtContext sendStmt() { @@ -10516,28 +10826,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_commCase); + enterRule(_localctx, 290, RULE_commCase); try { - setState(1600); + setState(1626); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1594); + setState(1620); match(CASE); - setState(1597); + setState(1623); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: { - setState(1595); + setState(1621); sendStmt(); } break; case 2: { - setState(1596); + setState(1622); recvStmt(); } break; @@ -10547,7 +10857,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1599); + setState(1625); match(DEFAULT); } break; @@ -10566,6 +10876,7 @@ public final CommCaseContext commCase() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class RecvStmtContext extends ParserRuleContext { public ExpressionContext recvExpr; public ExpressionContext expression() { @@ -10592,31 +10903,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 290, RULE_recvStmt); + enterRule(_localctx, 292, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1608); + setState(1634); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { case 1: { - setState(1602); + setState(1628); expressionList(); - setState(1603); + setState(1629); match(ASSIGN); } break; case 2: { - setState(1605); + setState(1631); identifierList(); - setState(1606); + setState(1632); match(DECLARE_ASSIGN); } break; } - setState(1610); + setState(1636); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -10631,17 +10942,18 @@ public final RecvStmtContext recvStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ForStmtContext extends ParserRuleContext { public TerminalNode FOR() { return getToken(GobraParser.FOR, 0); } public BlockContext block() { return getRuleContext(BlockContext.class,0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } public ForClauseContext forClause() { return getRuleContext(ForClauseContext.class,0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } public RangeClauseContext rangeClause() { return getRuleContext(RangeClauseContext.class,0); } @@ -10658,35 +10970,52 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 292, RULE_forStmt); + enterRule(_localctx, 294, RULE_forStmt); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1612); + setState(1638); match(FOR); - setState(1616); + setState(1646); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { case 1: { - setState(1613); - expression(0); + setState(1640); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + { + setState(1639); + expression(0); + } + } + } break; case 2: { - setState(1614); + setState(1642); forClause(); } break; case 3: { - setState(1615); - rangeClause(); + setState(1644); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + { + setState(1643); + rangeClause(); + } + } + } break; } - setState(1618); + setState(1648); block(); } } @@ -10701,6 +11030,7 @@ public final ForStmtContext forStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ForClauseContext extends ParserRuleContext { public SimpleStmtContext initStmt; public SimpleStmtContext postStmt; @@ -10732,41 +11062,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 294, RULE_forClause); + enterRule(_localctx, 296, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1621); + setState(1651); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: { - setState(1620); + setState(1650); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1623); + setState(1653); eos(); - setState(1625); + setState(1655); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { case 1: { - setState(1624); + setState(1654); expression(0); } break; } - setState(1627); + setState(1657); eos(); - setState(1629); + setState(1659); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1628); + setState(1658); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -10784,6 +11114,7 @@ public final ForClauseContext forClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GoStmtContext extends ParserRuleContext { public TerminalNode GO() { return getToken(GobraParser.GO, 0); } public ExpressionContext expression() { @@ -10802,13 +11133,13 @@ public T accept(ParseTreeVisitor visitor) { public final GoStmtContext goStmt() throws RecognitionException { GoStmtContext _localctx = new GoStmtContext(_ctx, getState()); - enterRule(_localctx, 296, RULE_goStmt); + enterRule(_localctx, 298, RULE_goStmt); try { enterOuterAlt(_localctx, 1); { - setState(1631); + setState(1661); match(GO); - setState(1632); + setState(1662); expression(0); } } @@ -10823,6 +11154,7 @@ public final GoStmtContext goStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeNameContext extends ParserRuleContext { public QualifiedIdentContext qualifiedIdent() { return getRuleContext(QualifiedIdentContext.class,0); @@ -10841,22 +11173,22 @@ public T accept(ParseTreeVisitor visitor) { public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); - enterRule(_localctx, 298, RULE_typeName); + enterRule(_localctx, 300, RULE_typeName); try { - setState(1636); + setState(1666); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1634); + setState(1664); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1635); + setState(1665); match(IDENTIFIER); } break; @@ -10873,6 +11205,7 @@ public final TypeNameContext typeName() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ArrayTypeContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public ArrayLengthContext arrayLength() { @@ -10895,17 +11228,17 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayTypeContext arrayType() throws RecognitionException { ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 300, RULE_arrayType); + enterRule(_localctx, 302, RULE_arrayType); try { enterOuterAlt(_localctx, 1); { - setState(1638); + setState(1668); match(L_BRACKET); - setState(1639); + setState(1669); arrayLength(); - setState(1640); + setState(1670); match(R_BRACKET); - setState(1641); + setState(1671); elementType(); } } @@ -10920,6 +11253,7 @@ public final ArrayTypeContext arrayType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ArrayLengthContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -10937,11 +11271,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayLengthContext arrayLength() throws RecognitionException { ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); - enterRule(_localctx, 302, RULE_arrayLength); + enterRule(_localctx, 304, RULE_arrayLength); try { enterOuterAlt(_localctx, 1); { - setState(1643); + setState(1673); expression(0); } } @@ -10956,6 +11290,7 @@ public final ArrayLengthContext arrayLength() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ElementTypeContext extends ParserRuleContext { public Type_Context type_() { return getRuleContext(Type_Context.class,0); @@ -10973,11 +11308,11 @@ public T accept(ParseTreeVisitor visitor) { public final ElementTypeContext elementType() throws RecognitionException { ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); - enterRule(_localctx, 304, RULE_elementType); + enterRule(_localctx, 306, RULE_elementType); try { enterOuterAlt(_localctx, 1); { - setState(1645); + setState(1675); type_(); } } @@ -10992,6 +11327,7 @@ public final ElementTypeContext elementType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PointerTypeContext extends ParserRuleContext { public TerminalNode STAR() { return getToken(GobraParser.STAR, 0); } public Type_Context type_() { @@ -11010,13 +11346,13 @@ public T accept(ParseTreeVisitor visitor) { public final PointerTypeContext pointerType() throws RecognitionException { PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_pointerType); + enterRule(_localctx, 308, RULE_pointerType); try { enterOuterAlt(_localctx, 1); { - setState(1647); + setState(1677); match(STAR); - setState(1648); + setState(1678); type_(); } } @@ -11031,6 +11367,7 @@ public final PointerTypeContext pointerType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SliceTypeContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } @@ -11050,15 +11387,15 @@ public T accept(ParseTreeVisitor visitor) { public final SliceTypeContext sliceType() throws RecognitionException { SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_sliceType); + enterRule(_localctx, 310, RULE_sliceType); try { enterOuterAlt(_localctx, 1); { - setState(1650); + setState(1680); match(L_BRACKET); - setState(1651); + setState(1681); match(R_BRACKET); - setState(1652); + setState(1682); elementType(); } } @@ -11073,6 +11410,7 @@ public final SliceTypeContext sliceType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MapTypeContext extends ParserRuleContext { public TerminalNode MAP() { return getToken(GobraParser.MAP, 0); } public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -11096,19 +11434,19 @@ public T accept(ParseTreeVisitor visitor) { public final MapTypeContext mapType() throws RecognitionException { MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_mapType); + enterRule(_localctx, 312, RULE_mapType); try { enterOuterAlt(_localctx, 1); { - setState(1654); + setState(1684); match(MAP); - setState(1655); + setState(1685); match(L_BRACKET); - setState(1656); + setState(1686); type_(); - setState(1657); + setState(1687); match(R_BRACKET); - setState(1658); + setState(1688); elementType(); } } @@ -11123,6 +11461,7 @@ public final MapTypeContext mapType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ChannelTypeContext extends ParserRuleContext { public ElementTypeContext elementType() { return getRuleContext(ElementTypeContext.class,0); @@ -11142,37 +11481,37 @@ public T accept(ParseTreeVisitor visitor) { public final ChannelTypeContext channelType() throws RecognitionException { ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_channelType); + enterRule(_localctx, 314, RULE_channelType); try { enterOuterAlt(_localctx, 1); { - setState(1665); + setState(1695); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { case 1: { - setState(1660); + setState(1690); match(CHAN); } break; case 2: { - setState(1661); + setState(1691); match(CHAN); - setState(1662); + setState(1692); match(RECEIVE); } break; case 3: { - setState(1663); + setState(1693); match(RECEIVE); - setState(1664); + setState(1694); match(CHAN); } break; } - setState(1667); + setState(1697); elementType(); } } @@ -11187,6 +11526,7 @@ public final ChannelTypeContext channelType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FunctionTypeContext extends ParserRuleContext { public TerminalNode FUNC() { return getToken(GobraParser.FUNC, 0); } public SignatureContext signature() { @@ -11205,13 +11545,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTypeContext functionType() throws RecognitionException { FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_functionType); + enterRule(_localctx, 316, RULE_functionType); try { enterOuterAlt(_localctx, 1); { - setState(1669); + setState(1699); match(FUNC); - setState(1670); + setState(1700); signature(); } } @@ -11226,6 +11566,7 @@ public final FunctionTypeContext functionType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SignatureContext extends ParserRuleContext { public ParametersContext parameters() { return getRuleContext(ParametersContext.class,0); @@ -11246,24 +11587,24 @@ public T accept(ParseTreeVisitor visitor) { public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_signature); + enterRule(_localctx, 318, RULE_signature); try { - setState(1676); + setState(1706); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1672); + setState(1702); parameters(); - setState(1673); + setState(1703); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1675); + setState(1705); parameters(); } break; @@ -11280,6 +11621,7 @@ public final SignatureContext signature() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ResultContext extends ParserRuleContext { public ParametersContext parameters() { return getRuleContext(ParametersContext.class,0); @@ -11300,22 +11642,22 @@ public T accept(ParseTreeVisitor visitor) { public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_result); + enterRule(_localctx, 320, RULE_result); try { - setState(1680); + setState(1710); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1678); + setState(1708); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1679); + setState(1709); type_(); } break; @@ -11332,6 +11674,7 @@ public final ResultContext result() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ParametersContext extends ParserRuleContext { public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public TerminalNode R_PAREN() { return getToken(GobraParser.R_PAREN, 0); } @@ -11358,45 +11701,45 @@ public T accept(ParseTreeVisitor visitor) { public final ParametersContext parameters() throws RecognitionException { ParametersContext _localctx = new ParametersContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_parameters); + enterRule(_localctx, 322, RULE_parameters); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1682); + setState(1712); match(L_PAREN); - setState(1694); + setState(1724); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (ELLIPSIS - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441152431101575619L) != 0)) { { - setState(1683); + setState(1713); parameterDecl(); - setState(1688); + setState(1718); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,164,_ctx); + _alt = getInterpreter().adaptivePredict(_input,170,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1684); + setState(1714); match(COMMA); - setState(1685); + setState(1715); parameterDecl(); } } } - setState(1690); + setState(1720); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,164,_ctx); + _alt = getInterpreter().adaptivePredict(_input,170,_ctx); } - setState(1692); + setState(1722); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1691); + setState(1721); match(COMMA); } } @@ -11404,7 +11747,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1696); + setState(1726); match(R_PAREN); } } @@ -11419,6 +11762,7 @@ public final ParametersContext parameters() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ConversionContext extends ParserRuleContext { public NonNamedTypeContext nonNamedType() { return getRuleContext(NonNamedTypeContext.class,0); @@ -11442,28 +11786,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConversionContext conversion() throws RecognitionException { ConversionContext _localctx = new ConversionContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_conversion); + enterRule(_localctx, 324, RULE_conversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1698); + setState(1728); nonNamedType(); - setState(1699); + setState(1729); match(L_PAREN); - setState(1700); + setState(1730); expression(0); - setState(1702); + setState(1732); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1701); + setState(1731); match(COMMA); } } - setState(1704); + setState(1734); match(R_PAREN); } } @@ -11478,6 +11822,7 @@ public final ConversionContext conversion() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class NonNamedTypeContext extends ParserRuleContext { public TypeLitContext typeLit() { return getRuleContext(TypeLitContext.class,0); @@ -11500,9 +11845,9 @@ public T accept(ParseTreeVisitor visitor) { public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_nonNamedType); + enterRule(_localctx, 326, RULE_nonNamedType); try { - setState(1711); + setState(1741); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -11516,18 +11861,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1706); + setState(1736); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1707); + setState(1737); match(L_PAREN); - setState(1708); + setState(1738); nonNamedType(); - setState(1709); + setState(1739); match(R_PAREN); } break; @@ -11546,6 +11891,7 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OperandContext extends ParserRuleContext { public LiteralContext literal() { return getRuleContext(LiteralContext.class,0); @@ -11571,33 +11917,33 @@ public T accept(ParseTreeVisitor visitor) { public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_operand); + enterRule(_localctx, 328, RULE_operand); try { - setState(1719); + setState(1749); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,175,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1713); + setState(1743); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1714); + setState(1744); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1715); + setState(1745); match(L_PAREN); - setState(1716); + setState(1746); expression(0); - setState(1717); + setState(1747); match(R_PAREN); } break; @@ -11614,6 +11960,7 @@ public final OperandContext operand() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LiteralContext extends ParserRuleContext { public BasicLitContext basicLit() { return getRuleContext(BasicLitContext.class,0); @@ -11637,9 +11984,9 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_literal); + enterRule(_localctx, 330, RULE_literal); try { - setState(1724); + setState(1754); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11656,7 +12003,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1721); + setState(1751); basicLit(); } break; @@ -11674,7 +12021,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1722); + setState(1752); compositeLit(); } break; @@ -11687,7 +12034,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1723); + setState(1753); functionLit(); } break; @@ -11706,6 +12053,7 @@ public final LiteralContext literal() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IntegerContext extends ParserRuleContext { public TerminalNode DECIMAL_LIT() { return getToken(GobraParser.DECIMAL_LIT, 0); } public TerminalNode BINARY_LIT() { return getToken(GobraParser.BINARY_LIT, 0); } @@ -11726,14 +12074,14 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerContext integer() throws RecognitionException { IntegerContext _localctx = new IntegerContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_integer); + enterRule(_localctx, 332, RULE_integer); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1726); + setState(1756); _la = _input.LA(1); - if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & ((1L << (DECIMAL_LIT - 138)) | (1L << (BINARY_LIT - 138)) | (1L << (OCTAL_LIT - 138)) | (1L << (HEX_LIT - 138)) | (1L << (IMAGINARY_LIT - 138)) | (1L << (RUNE_LIT - 138)))) != 0)) ) { + if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & 111L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -11754,6 +12102,7 @@ public final IntegerContext integer() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OperandNameContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public OperandNameContext(ParserRuleContext parent, int invokingState) { @@ -11769,11 +12118,11 @@ public T accept(ParseTreeVisitor visitor) { public final OperandNameContext operandName() throws RecognitionException { OperandNameContext _localctx = new OperandNameContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_operandName); + enterRule(_localctx, 334, RULE_operandName); try { enterOuterAlt(_localctx, 1); { - setState(1728); + setState(1758); match(IDENTIFIER); } } @@ -11788,6 +12137,7 @@ public final OperandNameContext operandName() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class QualifiedIdentContext extends ParserRuleContext { public List IDENTIFIER() { return getTokens(GobraParser.IDENTIFIER); } public TerminalNode IDENTIFIER(int i) { @@ -11807,15 +12157,15 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedIdentContext qualifiedIdent() throws RecognitionException { QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState()); - enterRule(_localctx, 334, RULE_qualifiedIdent); + enterRule(_localctx, 336, RULE_qualifiedIdent); try { enterOuterAlt(_localctx, 1); { - setState(1730); + setState(1760); match(IDENTIFIER); - setState(1731); + setState(1761); match(DOT); - setState(1732); + setState(1762); match(IDENTIFIER); } } @@ -11830,6 +12180,7 @@ public final QualifiedIdentContext qualifiedIdent() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class CompositeLitContext extends ParserRuleContext { public LiteralTypeContext literalType() { return getRuleContext(LiteralTypeContext.class,0); @@ -11850,13 +12201,13 @@ public T accept(ParseTreeVisitor visitor) { public final CompositeLitContext compositeLit() throws RecognitionException { CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_compositeLit); + enterRule(_localctx, 338, RULE_compositeLit); try { enterOuterAlt(_localctx, 1); { - setState(1734); + setState(1764); literalType(); - setState(1735); + setState(1765); literalValue(); } } @@ -11871,6 +12222,7 @@ public final CompositeLitContext compositeLit() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LiteralValueContext extends ParserRuleContext { public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } @@ -11891,26 +12243,26 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralValueContext literalValue() throws RecognitionException { LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState()); - enterRule(_localctx, 338, RULE_literalValue); + enterRule(_localctx, 340, RULE_literalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1737); + setState(1767); match(L_CURLY); - setState(1742); + setState(1772); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_CURLY - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2990104391687L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1738); + setState(1768); elementList(); - setState(1740); + setState(1770); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1739); + setState(1769); match(COMMA); } } @@ -11918,7 +12270,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1744); + setState(1774); match(R_CURLY); } } @@ -11933,6 +12285,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ElementListContext extends ParserRuleContext { public List keyedElement() { return getRuleContexts(KeyedElementContext.class); @@ -11957,30 +12310,30 @@ public T accept(ParseTreeVisitor visitor) { public final ElementListContext elementList() throws RecognitionException { ElementListContext _localctx = new ElementListContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_elementList); + enterRule(_localctx, 342, RULE_elementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1746); + setState(1776); keyedElement(); - setState(1751); + setState(1781); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,173,_ctx); + _alt = getInterpreter().adaptivePredict(_input,179,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1747); + setState(1777); match(COMMA); - setState(1748); + setState(1778); keyedElement(); } } } - setState(1753); + setState(1783); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,173,_ctx); + _alt = getInterpreter().adaptivePredict(_input,179,_ctx); } } } @@ -11995,6 +12348,7 @@ public final ElementListContext elementList() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class KeyedElementContext extends ParserRuleContext { public ElementContext element() { return getRuleContext(ElementContext.class,0); @@ -12016,23 +12370,23 @@ public T accept(ParseTreeVisitor visitor) { public final KeyedElementContext keyedElement() throws RecognitionException { KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_keyedElement); + enterRule(_localctx, 344, RULE_keyedElement); try { enterOuterAlt(_localctx, 1); { - setState(1757); + setState(1787); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,180,_ctx) ) { case 1: { - setState(1754); + setState(1784); key(); - setState(1755); + setState(1785); match(COLON); } break; } - setState(1759); + setState(1789); element(); } } @@ -12047,6 +12401,7 @@ public final KeyedElementContext keyedElement() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class KeyContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -12067,9 +12422,9 @@ public T accept(ParseTreeVisitor visitor) { public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_key); + enterRule(_localctx, 346, RULE_key); try { - setState(1763); + setState(1793); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12137,14 +12492,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1761); + setState(1791); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1762); + setState(1792); literalValue(); } break; @@ -12163,6 +12518,7 @@ public final KeyContext key() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ElementContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -12183,9 +12539,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_element); + enterRule(_localctx, 348, RULE_element); try { - setState(1767); + setState(1797); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12253,14 +12609,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1765); + setState(1795); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1766); + setState(1796); literalValue(); } break; @@ -12279,6 +12635,7 @@ public final ElementContext element() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class StructTypeContext extends ParserRuleContext { public TerminalNode STRUCT() { return getToken(GobraParser.STRUCT, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -12308,32 +12665,32 @@ public T accept(ParseTreeVisitor visitor) { public final StructTypeContext structType() throws RecognitionException { StructTypeContext _localctx = new StructTypeContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_structType); + enterRule(_localctx, 350, RULE_structType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1769); + setState(1799); match(STRUCT); - setState(1770); + setState(1800); match(L_CURLY); - setState(1776); + setState(1806); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1771); + setState(1801); fieldDecl(); - setState(1772); + setState(1802); eos(); } } - setState(1778); + setState(1808); _errHandler.sync(this); _la = _input.LA(1); } - setState(1779); + setState(1809); match(R_CURLY); } } @@ -12348,6 +12705,7 @@ public final StructTypeContext structType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FieldDeclContext extends ParserRuleContext { public String_Context tag; public IdentifierListContext identifierList() { @@ -12375,34 +12733,34 @@ public T accept(ParseTreeVisitor visitor) { public final FieldDeclContext fieldDecl() throws RecognitionException { FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); - enterRule(_localctx, 350, RULE_fieldDecl); + enterRule(_localctx, 352, RULE_fieldDecl); try { enterOuterAlt(_localctx, 1); { - setState(1785); + setState(1815); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,184,_ctx) ) { case 1: { - setState(1781); + setState(1811); identifierList(); - setState(1782); + setState(1812); type_(); } break; case 2: { - setState(1784); + setState(1814); embeddedField(); } break; } - setState(1788); + setState(1818); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) { case 1: { - setState(1787); + setState(1817); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -12420,6 +12778,7 @@ public final FieldDeclContext fieldDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class String_Context extends ParserRuleContext { public TerminalNode RAW_STRING_LIT() { return getToken(GobraParser.RAW_STRING_LIT, 0); } public TerminalNode INTERPRETED_STRING_LIT() { return getToken(GobraParser.INTERPRETED_STRING_LIT, 0); } @@ -12436,12 +12795,12 @@ public T accept(ParseTreeVisitor visitor) { public final String_Context string_() throws RecognitionException { String_Context _localctx = new String_Context(_ctx, getState()); - enterRule(_localctx, 352, RULE_string_); + enterRule(_localctx, 354, RULE_string_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1790); + setState(1820); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -12464,6 +12823,7 @@ public final String_Context string_() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class EmbeddedFieldContext extends ParserRuleContext { public TypeNameContext typeName() { return getRuleContext(TypeNameContext.class,0); @@ -12482,22 +12842,22 @@ public T accept(ParseTreeVisitor visitor) { public final EmbeddedFieldContext embeddedField() throws RecognitionException { EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState()); - enterRule(_localctx, 354, RULE_embeddedField); + enterRule(_localctx, 356, RULE_embeddedField); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1793); + setState(1823); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1792); + setState(1822); match(STAR); } } - setState(1795); + setState(1825); typeName(); } } @@ -12512,6 +12872,7 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IndexContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public ExpressionContext expression() { @@ -12531,15 +12892,15 @@ public T accept(ParseTreeVisitor visitor) { public final IndexContext index() throws RecognitionException { IndexContext _localctx = new IndexContext(_ctx, getState()); - enterRule(_localctx, 356, RULE_index); + enterRule(_localctx, 358, RULE_index); try { enterOuterAlt(_localctx, 1); { - setState(1797); + setState(1827); match(L_BRACKET); - setState(1798); + setState(1828); expression(0); - setState(1799); + setState(1829); match(R_BRACKET); } } @@ -12554,6 +12915,7 @@ public final IndexContext index() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeAssertionContext extends ParserRuleContext { public TerminalNode DOT() { return getToken(GobraParser.DOT, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -12574,17 +12936,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeAssertionContext typeAssertion() throws RecognitionException { TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState()); - enterRule(_localctx, 358, RULE_typeAssertion); + enterRule(_localctx, 360, RULE_typeAssertion); try { enterOuterAlt(_localctx, 1); { - setState(1801); + setState(1831); match(DOT); - setState(1802); + setState(1832); match(L_PAREN); - setState(1803); + setState(1833); type_(); - setState(1804); + setState(1834); match(R_PAREN); } } @@ -12599,6 +12961,7 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ArgumentsContext extends ParserRuleContext { public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public TerminalNode R_PAREN() { return getToken(GobraParser.R_PAREN, 0); } @@ -12626,39 +12989,39 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentsContext arguments() throws RecognitionException { ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 360, RULE_arguments); + enterRule(_localctx, 362, RULE_arguments); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1806); + setState(1836); match(L_PAREN); - setState(1821); + setState(1851); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1813); + setState(1843); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,182,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,188,_ctx) ) { case 1: { - setState(1807); + setState(1837); expressionList(); } break; case 2: { - setState(1808); + setState(1838); nonNamedType(); - setState(1811); + setState(1841); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,181,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,187,_ctx) ) { case 1: { - setState(1809); + setState(1839); match(COMMA); - setState(1810); + setState(1840); expressionList(); } break; @@ -12666,22 +13029,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1816); + setState(1846); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1815); + setState(1845); match(ELLIPSIS); } } - setState(1819); + setState(1849); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1818); + setState(1848); match(COMMA); } } @@ -12689,7 +13052,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1823); + setState(1853); match(R_PAREN); } } @@ -12704,6 +13067,7 @@ public final ArgumentsContext arguments() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MethodExprContext extends ParserRuleContext { public NonNamedTypeContext nonNamedType() { return getRuleContext(NonNamedTypeContext.class,0); @@ -12723,15 +13087,15 @@ public T accept(ParseTreeVisitor visitor) { public final MethodExprContext methodExpr() throws RecognitionException { MethodExprContext _localctx = new MethodExprContext(_ctx, getState()); - enterRule(_localctx, 362, RULE_methodExpr); + enterRule(_localctx, 364, RULE_methodExpr); try { enterOuterAlt(_localctx, 1); { - setState(1825); + setState(1855); nonNamedType(); - setState(1826); + setState(1856); match(DOT); - setState(1827); + setState(1857); match(IDENTIFIER); } } @@ -12746,6 +13110,7 @@ public final MethodExprContext methodExpr() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ReceiverTypeContext extends ParserRuleContext { public Type_Context type_() { return getRuleContext(Type_Context.class,0); @@ -12763,11 +13128,11 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverTypeContext receiverType() throws RecognitionException { ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState()); - enterRule(_localctx, 364, RULE_receiverType); + enterRule(_localctx, 366, RULE_receiverType); try { enterOuterAlt(_localctx, 1); { - setState(1829); + setState(1859); type_(); } } @@ -12782,6 +13147,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class EosContext extends ParserRuleContext { public TerminalNode SEMI() { return getToken(GobraParser.SEMI, 0); } public TerminalNode EOF() { return getToken(GobraParser.EOF, 0); } @@ -12799,37 +13165,37 @@ public T accept(ParseTreeVisitor visitor) { public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); - enterRule(_localctx, 366, RULE_eos); + enterRule(_localctx, 368, RULE_eos); try { - setState(1835); + setState(1865); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,192,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1831); + setState(1861); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1832); + setState(1862); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1833); + setState(1863); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1834); - if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()"); + setState(1864); + if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; } @@ -12847,11 +13213,13 @@ public final EosContext eos() throws RecognitionException { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 81: + case 82: return expression_sempred((ExpressionContext)_localctx, predIndex); - case 89: + case 90: return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex); - case 183: + case 120: + return statementList_sempred((StatementListContext)_localctx, predIndex); + case 184: return eos_sempred((EosContext)_localctx, predIndex); } return true; @@ -12902,751 +13270,1222 @@ private boolean primaryExpr_sempred(PrimaryExprContext _localctx, int predIndex) } return true; } - private boolean eos_sempred(EosContext _localctx, int predIndex) { + private boolean statementList_sempred(StatementListContext _localctx, int predIndex) { switch (predIndex) { case 18: - return closingBracket(); + return this.closingBracket(); + } + return true; + } + private boolean eos_sempred(EosContext _localctx, int predIndex) { + switch (predIndex) { + case 19: + return this.closingBracket(); } return true; } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a2\u0730\4\2\t"+ - "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ - "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ - "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ - "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ - "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ - ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ - "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ - "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ - "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+ - "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ - "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+ - "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+ - "w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t\u0080"+ - "\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084\4\u0085"+ - "\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089"+ - "\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e"+ - "\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092"+ - "\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097"+ - "\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b"+ - "\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f\4\u00a0"+ - "\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4\t\u00a4"+ - "\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8\4\u00a9"+ - "\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad"+ - "\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1\4\u00b2"+ - "\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\4\u00b5\t\u00b5\4\u00b6\t\u00b6"+ - "\4\u00b7\t\u00b7\4\u00b8\t\u00b8\4\u00b9\t\u00b9\3\2\3\2\3\2\3\3\3\3\3"+ - "\3\3\4\3\4\3\4\3\5\3\5\3\5\7\5\u017f\n\5\f\5\16\5\u0182\13\5\3\6\3\6\5"+ - "\6\u0186\n\6\3\7\3\7\3\7\7\7\u018b\n\7\f\7\16\7\u018e\13\7\3\7\3\7\3\7"+ - "\3\7\3\7\7\7\u0195\n\7\f\7\16\7\u0198\13\7\3\7\3\7\3\7\5\7\u019d\n\7\3"+ - "\7\3\7\7\7\u01a1\n\7\f\7\16\7\u01a4\13\7\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3"+ - "\t\3\n\3\n\3\n\7\n\u01b1\n\n\f\n\16\n\u01b4\13\n\3\n\5\n\u01b7\n\n\3\n"+ - "\3\n\3\13\3\13\3\13\7\13\u01be\n\13\f\13\16\13\u01c1\13\13\3\13\3\13\3"+ - "\13\3\13\3\13\3\13\3\13\7\13\u01ca\n\13\f\13\16\13\u01cd\13\13\3\13\5"+ - "\13\u01d0\n\13\3\f\3\f\3\f\3\f\5\f\u01d6\n\f\3\r\3\r\3\r\3\r\3\r\3\r\3"+ - "\r\5\r\u01df\n\r\3\16\3\16\3\17\3\17\3\17\3\20\3\20\3\20\5\20\u01e9\n"+ - "\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3"+ - "\21\3\21\5\21\u01fa\n\21\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24"+ - "\3\24\7\24\u0206\n\24\f\24\16\24\u0209\13\24\3\24\5\24\u020c\n\24\3\25"+ - "\3\25\3\25\7\25\u0211\n\25\f\25\16\25\u0214\13\25\3\25\3\25\3\26\7\26"+ - "\u0219\n\26\f\26\16\26\u021c\13\26\3\27\3\27\3\27\3\27\7\27\u0222\n\27"+ - "\f\27\16\27\u0225\13\27\3\27\3\27\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3"+ - "\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3"+ - "\34\3\35\3\35\3\35\3\35\3\35\5\35\u0244\n\35\3\35\3\35\3\35\3\35\3\36"+ - "\3\36\5\36\u024c\n\36\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\""+ - "\3\"\3\"\3\"\3#\3#\3#\3#\3#\5#\u0264\n#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%"+ - "\3%\3%\3%\3%\3%\7%\u0275\n%\f%\16%\u0278\13%\3%\3%\3&\3&\3&\3&\3\'\3\'"+ - "\3\'\3\'\7\'\u0284\n\'\f\'\16\'\u0287\13\'\3\'\3\'\3(\3(\3(\3(\3)\3)\3"+ - ")\3)\5)\u0293\n)\3*\3*\3*\3*\3*\7*\u029a\n*\f*\16*\u029d\13*\3*\3*\3+"+ - "\3+\3+\3+\3+\3+\3+\3+\3+\5+\u02aa\n+\3,\3,\3,\3,\3,\7,\u02b1\n,\f,\16"+ - ",\u02b4\13,\3,\3,\3-\3-\3-\3-\3-\7-\u02bd\n-\f-\16-\u02c0\13-\3-\3-\3"+ - ".\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\5/\u02d4\n/\3\60\3\60\3"+ - "\60\3\60\3\60\5\60\u02db\n\60\3\60\7\60\u02de\n\60\f\60\16\60\u02e1\13"+ - "\60\3\60\3\60\5\60\u02e5\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61"+ - "\5\61\u02ef\n\61\3\62\5\62\u02f2\n\62\3\62\3\62\5\62\u02f6\n\62\3\63\3"+ - "\63\5\63\u02fa\n\63\3\64\3\64\3\64\3\64\7\64\u0300\n\64\f\64\16\64\u0303"+ - "\13\64\3\64\3\64\3\65\3\65\3\65\5\65\u030a\n\65\3\66\3\66\3\66\5\66\u030f"+ - "\n\66\3\67\3\67\3\67\3\67\3\67\3\67\5\67\u0317\n\67\5\67\u0319\n\67\3"+ - "\67\3\67\3\67\5\67\u031e\n\67\38\38\38\78\u0323\n8\f8\168\u0326\138\3"+ - "9\39\39\39\39\59\u032d\n9\39\59\u0330\n9\39\39\3:\3:\5:\u0336\n:\3:\3"+ - ":\3:\5:\u033b\n:\5:\u033d\n:\3:\5:\u0340\n:\3;\3;\3;\7;\u0345\n;\f;\16"+ - ";\u0348\13;\3<\3<\5<\u034c\n<\3<\3<\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3"+ - ">\3>\7>\u035d\n>\f>\16>\u0360\13>\3>\3>\3>\7>\u0365\n>\f>\16>\u0368\13"+ - ">\3>\5>\u036b\n>\3?\5?\u036e\n?\3?\3?\3?\3?\5?\u0374\n?\3@\3@\5@\u0378"+ - "\n@\3@\5@\u037b\n@\3@\3@\3@\3A\3A\3A\3A\3A\5A\u0385\nA\3B\3B\3B\3B\3B"+ - "\5B\u038c\nB\3C\3C\3C\3C\3C\5C\u0393\nC\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E"+ - "\5E\u039f\nE\3F\3F\3F\3F\5F\u03a5\nF\3G\3G\3G\3G\3G\5G\u03ac\nG\3H\3H"+ - "\3H\5H\u03b1\nH\3I\3I\3I\3I\5I\u03b7\nI\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K"+ - "\5K\u03c3\nK\3L\3L\3L\3L\5L\u03c9\nL\3L\3L\5L\u03cd\nL\3M\3M\3M\3M\3N"+ - "\3N\5N\u03d5\nN\3N\3N\5N\u03d9\nN\3N\3N\3O\3O\5O\u03df\nO\3P\5P\u03e2"+ - "\nP\3P\3P\3Q\3Q\5Q\u03e8\nQ\3Q\3Q\3R\5R\u03ed\nR\3R\3R\3S\3S\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\5S\u0406\nS\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\3S\7S\u0429\nS\fS\16S\u042c\13S\3T\3T\3T\3T\3T\3T\3"+ - "T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\5T\u0442\nT\3U\3U\3U\3V\3V\3"+ - "V\5V\u044a\nV\3W\3W\3W\3X\3X\3X\3X\7X\u0453\nX\fX\16X\u0456\13X\3X\3X"+ - "\3X\3X\5X\u045c\nX\3Y\3Y\3Y\3Y\3Y\5Y\u0463\nY\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z"+ - "\5Z\u046d\nZ\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\5[\u047b\n[\3[\3[\3["+ - "\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\7[\u0491\n[\f[\16"+ - "[\u0494\13[\3\\\3\\\3\\\3]\3]\5]\u049b\n]\3]\3]\5]\u049f\n]\3^\3^\5^\u04a3"+ - "\n^\3^\5^\u04a6\n^\3^\3^\3_\3_\3_\3_\3_\5_\u04af\n_\3_\3_\7_\u04b3\n_"+ - "\f_\16_\u04b6\13_\3_\3_\3`\3`\3`\3`\3a\5a\u04bf\na\3a\3a\3a\3a\3a\3a\5"+ - "a\u04c7\na\3a\3a\3a\3a\5a\u04cd\na\3b\3b\3b\3b\3b\3b\3b\5b\u04d6\nb\3"+ - "c\3c\3c\3c\3c\3c\3c\3c\3c\5c\u04e1\nc\3d\3d\3d\3e\3e\3e\3e\7e\u04ea\n"+ - "e\fe\16e\u04ed\13e\3e\5e\u04f0\ne\5e\u04f2\ne\3e\3e\3f\3f\3f\3f\3f\3f"+ - "\3f\5f\u04fd\nf\3g\3g\3g\3g\3g\3h\3h\5h\u0506\nh\3h\3h\5h\u050a\nh\3h"+ - "\5h\u050d\nh\3h\3h\3h\3h\3h\5h\u0514\nh\3h\3h\3i\3i\3j\3j\3k\3k\3l\5l"+ - "\u051f\nl\3l\3l\3m\3m\3m\3m\3m\3m\5m\u0529\nm\3m\3m\3m\3m\5m\u052f\nm"+ - "\5m\u0531\nm\3n\3n\3n\3o\3o\3p\3p\3p\5p\u053b\np\3q\3q\3q\3q\3q\3q\7q"+ - "\u0543\nq\fq\16q\u0546\13q\3q\5q\u0549\nq\3r\3r\5r\u054d\nr\3r\3r\5r\u0551"+ - "\nr\3s\3s\3s\7s\u0556\ns\fs\16s\u0559\13s\3t\3t\3t\7t\u055e\nt\ft\16t"+ - "\u0561\13t\3u\3u\3u\3u\3u\3u\7u\u0569\nu\fu\16u\u056c\13u\3u\5u\u056f"+ - "\nu\3v\3v\5v\u0573\nv\3v\3v\3w\3w\3w\3w\3w\3w\7w\u057d\nw\fw\16w\u0580"+ - "\13w\3w\5w\u0583\nw\3x\3x\5x\u0587\nx\3x\3x\3y\5y\u058c\ny\3y\3y\3y\6"+ - "y\u0591\ny\ry\16y\u0592\3z\3z\3z\3z\3z\5z\u059a\nz\3{\3{\3|\3|\3|\3|\3"+ - "}\3}\3}\3~\3~\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u05ae"+ - "\n\u0080\3\u0081\3\u0081\5\u0081\u05b2\n\u0081\3\u0082\3\u0082\5\u0082"+ - "\u05b6\n\u0082\3\u0083\3\u0083\5\u0083\u05ba\n\u0083\3\u0084\3\u0084\3"+ - "\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086"+ - "\3\u0086\3\u0086\3\u0086\5\u0086\u05ca\n\u0086\3\u0086\3\u0086\3\u0086"+ - "\3\u0086\5\u0086\u05d0\n\u0086\5\u0086\u05d2\n\u0086\3\u0087\3\u0087\5"+ - "\u0087\u05d6\n\u0087\3\u0088\3\u0088\5\u0088\u05da\n\u0088\3\u0088\5\u0088"+ - "\u05dd\n\u0088\3\u0088\3\u0088\5\u0088\u05e1\n\u0088\5\u0088\u05e3\n\u0088"+ - "\3\u0088\3\u0088\7\u0088\u05e7\n\u0088\f\u0088\16\u0088\u05ea\13\u0088"+ - "\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089\5\u0089\u05f1\n\u0089\3\u008a"+ - "\3\u008a\3\u008a\5\u008a\u05f6\n\u008a\3\u008b\3\u008b\3\u008b\3\u008b"+ - "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u0601\n\u008b\3\u008b"+ - "\3\u008b\7\u008b\u0605\n\u008b\f\u008b\16\u008b\u0608\13\u008b\3\u008b"+ - "\3\u008b\3\u008c\3\u008c\5\u008c\u060e\n\u008c\3\u008c\3\u008c\3\u008c"+ - "\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\5\u008d\u0619\n\u008d"+ - "\3\u008e\3\u008e\3\u008e\5\u008e\u061e\n\u008e\3\u008f\3\u008f\5\u008f"+ - "\u0622\n\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u0627\n\u008f\7\u008f\u0629"+ - "\n\u008f\f\u008f\16\u008f\u062c\13\u008f\3\u0090\3\u0090\3\u0090\7\u0090"+ - "\u0631\n\u0090\f\u0090\16\u0090\u0634\13\u0090\3\u0090\3\u0090\3\u0091"+ - "\3\u0091\3\u0091\5\u0091\u063b\n\u0091\3\u0092\3\u0092\3\u0092\5\u0092"+ - "\u0640\n\u0092\3\u0092\5\u0092\u0643\n\u0092\3\u0093\3\u0093\3\u0093\3"+ - "\u0093\3\u0093\3\u0093\5\u0093\u064b\n\u0093\3\u0093\3\u0093\3\u0094\3"+ - "\u0094\3\u0094\3\u0094\5\u0094\u0653\n\u0094\3\u0094\3\u0094\3\u0095\5"+ - "\u0095\u0658\n\u0095\3\u0095\3\u0095\5\u0095\u065c\n\u0095\3\u0095\3\u0095"+ - "\5\u0095\u0660\n\u0095\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\5\u0097"+ - "\u0667\n\u0097\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099"+ - "\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e"+ - "\3\u009e\3\u009e\5\u009e\u0684\n\u009e\3\u009e\3\u009e\3\u009f\3\u009f"+ - "\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u068f\n\u00a0\3\u00a1"+ - "\3\u00a1\5\u00a1\u0693\n\u00a1\3\u00a2\3\u00a2\3\u00a2\3\u00a2\7\u00a2"+ - "\u0699\n\u00a2\f\u00a2\16\u00a2\u069c\13\u00a2\3\u00a2\5\u00a2\u069f\n"+ - "\u00a2\5\u00a2\u06a1\n\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3"+ - "\u00a3\5\u00a3\u06a9\n\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3"+ - "\u00a4\3\u00a4\5\u00a4\u06b2\n\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3"+ - "\u00a5\3\u00a5\5\u00a5\u06ba\n\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u06bf"+ - "\n\u00a6\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9"+ - "\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\5\u00ab\u06cf\n\u00ab"+ - "\5\u00ab\u06d1\n\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\7\u00ac"+ - "\u06d8\n\u00ac\f\u00ac\16\u00ac\u06db\13\u00ac\3\u00ad\3\u00ad\3\u00ad"+ - "\5\u00ad\u06e0\n\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\5\u00ae\u06e6\n"+ - "\u00ae\3\u00af\3\u00af\5\u00af\u06ea\n\u00af\3\u00b0\3\u00b0\3\u00b0\3"+ - "\u00b0\3\u00b0\7\u00b0\u06f1\n\u00b0\f\u00b0\16\u00b0\u06f4\13\u00b0\3"+ - "\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b1\3\u00b1\5\u00b1\u06fc\n\u00b1\3"+ - "\u00b1\5\u00b1\u06ff\n\u00b1\3\u00b2\3\u00b2\3\u00b3\5\u00b3\u0704\n\u00b3"+ - "\3\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b5\3\u00b5\3\u00b5"+ - "\3\u00b5\3\u00b5\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6\5\u00b6\u0716"+ - "\n\u00b6\5\u00b6\u0718\n\u00b6\3\u00b6\5\u00b6\u071b\n\u00b6\3\u00b6\5"+ - "\u00b6\u071e\n\u00b6\5\u00b6\u0720\n\u00b6\3\u00b6\3\u00b6\3\u00b7\3\u00b7"+ - "\3\u00b7\3\u00b7\3\u00b8\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\5\u00b9"+ - "\u072e\n\u00b9\3\u00b9\3\u02df\4\u00a4\u00b4\u00ba\2\4\6\b\n\f\16\20\22"+ - "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnp"+ - "rtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094"+ - "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac"+ - "\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4"+ - "\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc"+ - "\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4"+ - "\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c"+ - "\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124"+ - "\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c"+ - "\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154"+ - "\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c"+ - "\u016e\u0170\2\25\4\2ggrr\3\2\31\32\3\2\7\n\3\2CD\3\2*,\4\2*,..\3\2\u0085"+ - "\u008b\3\2\26\27\4\2\u0080\u0084\u0089\u008a\6\2%%ss\177\177\u0086\u0088"+ - "\3\2!#\3\2\36 \4\2JKy~\6\2//\62\62\65\65__\4\2\177\u0084\u0086\u008a\3"+ - "\2st\4\2pp\u00a1\u00a1\4\2\u008c\u008f\u0091\u0092\3\2\u0098\u0099\2\u0794"+ - "\2\u0172\3\2\2\2\4\u0175\3\2\2\2\6\u0178\3\2\2\2\b\u017b\3\2\2\2\n\u0183"+ - "\3\2\2\2\f\u018c\3\2\2\2\16\u01a7\3\2\2\2\20\u01aa\3\2\2\2\22\u01b2\3"+ - "\2\2\2\24\u01bf\3\2\2\2\26\u01d5\3\2\2\2\30\u01de\3\2\2\2\32\u01e0\3\2"+ - "\2\2\34\u01e2\3\2\2\2\36\u01e5\3\2\2\2 \u01f9\3\2\2\2\"\u01fb\3\2\2\2"+ - "$\u01fd\3\2\2\2&\u0202\3\2\2\2(\u020d\3\2\2\2*\u021a\3\2\2\2,\u021d\3"+ - "\2\2\2.\u0228\3\2\2\2\60\u022a\3\2\2\2\62\u022f\3\2\2\2\64\u0234\3\2\2"+ - "\2\66\u0239\3\2\2\28\u023e\3\2\2\2:\u024b\3\2\2\2<\u024d\3\2\2\2>\u024f"+ - "\3\2\2\2@\u0254\3\2\2\2B\u0259\3\2\2\2D\u025e\3\2\2\2F\u0267\3\2\2\2H"+ - "\u026e\3\2\2\2J\u027b\3\2\2\2L\u027f\3\2\2\2N\u028a\3\2\2\2P\u0292\3\2"+ - "\2\2R\u0294\3\2\2\2T\u02a9\3\2\2\2V\u02ab\3\2\2\2X\u02b7\3\2\2\2Z\u02c3"+ - "\3\2\2\2\\\u02d3\3\2\2\2^\u02df\3\2\2\2`\u02ee\3\2\2\2b\u02f1\3\2\2\2"+ - "d\u02f9\3\2\2\2f\u02fb\3\2\2\2h\u0306\3\2\2\2j\u030e\3\2\2\2l\u031d\3"+ - "\2\2\2n\u031f\3\2\2\2p\u0327\3\2\2\2r\u0335\3\2\2\2t\u0341\3\2\2\2v\u034b"+ - "\3\2\2\2x\u034f\3\2\2\2z\u0355\3\2\2\2|\u036d\3\2\2\2~\u0375\3\2\2\2\u0080"+ - "\u0384\3\2\2\2\u0082\u0386\3\2\2\2\u0084\u038d\3\2\2\2\u0086\u0396\3\2"+ - "\2\2\u0088\u039b\3\2\2\2\u008a\u03a0\3\2\2\2\u008c\u03a6\3\2\2\2\u008e"+ - "\u03ad\3\2\2\2\u0090\u03b2\3\2\2\2\u0092\u03b8\3\2\2\2\u0094\u03bd\3\2"+ - "\2\2\u0096\u03c4\3\2\2\2\u0098\u03ce\3\2\2\2\u009a\u03d2\3\2\2\2\u009c"+ - "\u03de\3\2\2\2\u009e\u03e1\3\2\2\2\u00a0\u03e5\3\2\2\2\u00a2\u03ec\3\2"+ - "\2\2\u00a4\u0405\3\2\2\2\u00a6\u0441\3\2\2\2\u00a8\u0443\3\2\2\2\u00aa"+ - "\u0446\3\2\2\2\u00ac\u044b\3\2\2\2\u00ae\u0454\3\2\2\2\u00b0\u0462\3\2"+ - "\2\2\u00b2\u046c\3\2\2\2\u00b4\u047a\3\2\2\2\u00b6\u0495\3\2\2\2\u00b8"+ - "\u0498\3\2\2\2\u00ba\u04a0\3\2\2\2\u00bc\u04a9\3\2\2\2\u00be\u04b9\3\2"+ - "\2\2\u00c0\u04cc\3\2\2\2\u00c2\u04d5\3\2\2\2\u00c4\u04e0\3\2\2\2\u00c6"+ - "\u04e2\3\2\2\2\u00c8\u04e5\3\2\2\2\u00ca\u04fc\3\2\2\2\u00cc\u04fe\3\2"+ - "\2\2\u00ce\u0503\3\2\2\2\u00d0\u0517\3\2\2\2\u00d2\u0519\3\2\2\2\u00d4"+ - "\u051b\3\2\2\2\u00d6\u051e\3\2\2\2\u00d8\u0528\3\2\2\2\u00da\u0532\3\2"+ - "\2\2\u00dc\u0535\3\2\2\2\u00de\u053a\3\2\2\2\u00e0\u053c\3\2\2\2\u00e2"+ - "\u054a\3\2\2\2\u00e4\u0552\3\2\2\2\u00e6\u055a\3\2\2\2\u00e8\u0562\3\2"+ - "\2\2\u00ea\u0570\3\2\2\2\u00ec\u0576\3\2\2\2\u00ee\u0584\3\2\2\2\u00f0"+ - "\u0590\3\2\2\2\u00f2\u0599\3\2\2\2\u00f4\u059b\3\2\2\2\u00f6\u059d\3\2"+ - "\2\2\u00f8\u05a1\3\2\2\2\u00fa\u05a4\3\2\2\2\u00fc\u05a8\3\2\2\2\u00fe"+ - "\u05aa\3\2\2\2\u0100\u05af\3\2\2\2\u0102\u05b3\3\2\2\2\u0104\u05b7\3\2"+ - "\2\2\u0106\u05bb\3\2\2\2\u0108\u05be\3\2\2\2\u010a\u05c0\3\2\2\2\u010c"+ - "\u05d5\3\2\2\2\u010e\u05d7\3\2\2\2\u0110\u05ed\3\2\2\2\u0112\u05f5\3\2"+ - "\2\2\u0114\u05f7\3\2\2\2\u0116\u060d\3\2\2\2\u0118\u0615\3\2\2\2\u011a"+ - "\u061d\3\2\2\2\u011c\u0621\3\2\2\2\u011e\u062d\3\2\2\2\u0120\u0637\3\2"+ - "\2\2\u0122\u0642\3\2\2\2\u0124\u064a\3\2\2\2\u0126\u064e\3\2\2\2\u0128"+ - "\u0657\3\2\2\2\u012a\u0661\3\2\2\2\u012c\u0666\3\2\2\2\u012e\u0668\3\2"+ - "\2\2\u0130\u066d\3\2\2\2\u0132\u066f\3\2\2\2\u0134\u0671\3\2\2\2\u0136"+ - "\u0674\3\2\2\2\u0138\u0678\3\2\2\2\u013a\u0683\3\2\2\2\u013c\u0687\3\2"+ - "\2\2\u013e\u068e\3\2\2\2\u0140\u0692\3\2\2\2\u0142\u0694\3\2\2\2\u0144"+ - "\u06a4\3\2\2\2\u0146\u06b1\3\2\2\2\u0148\u06b9\3\2\2\2\u014a\u06be\3\2"+ - "\2\2\u014c\u06c0\3\2\2\2\u014e\u06c2\3\2\2\2\u0150\u06c4\3\2\2\2\u0152"+ - "\u06c8\3\2\2\2\u0154\u06cb\3\2\2\2\u0156\u06d4\3\2\2\2\u0158\u06df\3\2"+ - "\2\2\u015a\u06e5\3\2\2\2\u015c\u06e9\3\2\2\2\u015e\u06eb\3\2\2\2\u0160"+ - "\u06fb\3\2\2\2\u0162\u0700\3\2\2\2\u0164\u0703\3\2\2\2\u0166\u0707\3\2"+ - "\2\2\u0168\u070b\3\2\2\2\u016a\u0710\3\2\2\2\u016c\u0723\3\2\2\2\u016e"+ - "\u0727\3\2\2\2\u0170\u072d\3\2\2\2\u0172\u0173\5\u00a4S\2\u0173\u0174"+ - "\7\2\2\3\u0174\3\3\2\2\2\u0175\u0176\5\u00a6T\2\u0176\u0177\7\2\2\3\u0177"+ - "\5\3\2\2\2\u0178\u0179\5\u00c2b\2\u0179\u017a\7\2\2\3\u017a\7\3\2\2\2"+ - "\u017b\u0180\5\n\6\2\u017c\u017d\7o\2\2\u017d\u017f\5\n\6\2\u017e\u017c"+ - "\3\2\2\2\u017f\u0182\3\2\2\2\u0180\u017e\3\2\2\2\u0180\u0181\3\2\2\2\u0181"+ - "\t\3\2\2\2\u0182\u0180\3\2\2\2\u0183\u0185\7g\2\2\u0184\u0186\7>\2\2\u0185"+ - "\u0184\3\2\2\2\u0185\u0186\3\2\2\2\u0186\13\3\2\2\2\u0187\u0188\5\16\b"+ - "\2\u0188\u0189\5\u0170\u00b9\2\u0189\u018b\3\2\2\2\u018a\u0187\3\2\2\2"+ - "\u018b\u018e\3\2\2\2\u018c\u018a\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u018f"+ - "\3\2\2\2\u018e\u018c\3\2\2\2\u018f\u0190\5\u00dan\2\u0190\u0196\5\u0170"+ - "\u00b9\2\u0191\u0192\5\24\13\2\u0192\u0193\5\u0170\u00b9\2\u0193\u0195"+ - "\3\2\2\2\u0194\u0191\3\2\2\2\u0195\u0198\3\2\2\2\u0196\u0194\3\2\2\2\u0196"+ - "\u0197\3\2\2\2\u0197\u01a2\3\2\2\2\u0198\u0196\3\2\2\2\u0199\u019d\5\u0088"+ - "E\2\u019a\u019d\5\u00dep\2\u019b\u019d\5\26\f\2\u019c\u0199\3\2\2\2\u019c"+ - "\u019a\3\2\2\2\u019c\u019b\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u019f\5\u0170"+ - "\u00b9\2\u019f\u01a1\3\2\2\2\u01a0\u019c\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2"+ - "\u01a0\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a5\3\2\2\2\u01a4\u01a2\3\2"+ - "\2\2\u01a5\u01a6\7\2\2\3\u01a6\r\3\2\2\2\u01a7\u01a8\7G\2\2\u01a8\u01a9"+ - "\5\u00a4S\2\u01a9\17\3\2\2\2\u01aa\u01ab\7H\2\2\u01ab\u01ac\5\u00a4S\2"+ - "\u01ac\21\3\2\2\2\u01ad\u01ae\5\20\t\2\u01ae\u01af\5\u0170\u00b9\2\u01af"+ - "\u01b1\3\2\2\2\u01b0\u01ad\3\2\2\2\u01b1\u01b4\3\2\2\2\u01b2\u01b0\3\2"+ - "\2\2\u01b2\u01b3\3\2\2\2\u01b3\u01b6\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b5"+ - "\u01b7\t\2\2\2\u01b6\u01b5\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b8\3\2"+ - "\2\2\u01b8\u01b9\5\u00dco\2\u01b9\23\3\2\2\2\u01ba\u01bb\5\20\t\2\u01bb"+ - "\u01bc\5\u0170\u00b9\2\u01bc\u01be\3\2\2\2\u01bd\u01ba\3\2\2\2\u01be\u01c1"+ - "\3\2\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01cf\3\2\2\2\u01c1"+ - "\u01bf\3\2\2\2\u01c2\u01c3\7c\2\2\u01c3\u01d0\5\22\n\2\u01c4\u01c5\7c"+ - "\2\2\u01c5\u01cb\7h\2\2\u01c6\u01c7\5\22\n\2\u01c7\u01c8\5\u0170\u00b9"+ - "\2\u01c8\u01ca\3\2\2\2\u01c9\u01c6\3\2\2\2\u01ca\u01cd\3\2\2\2\u01cb\u01c9"+ - "\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01ce\3\2\2\2\u01cd\u01cb\3\2\2\2\u01ce"+ - "\u01d0\7i\2\2\u01cf\u01c2\3\2\2\2\u01cf\u01c4\3\2\2\2\u01d0\25\3\2\2\2"+ - "\u01d1\u01d6\5z>\2\u01d2\u01d6\5\u0090I\2\u01d3\u01d6\5\u0094K\2\u01d4"+ - "\u01d6\5\u008eH\2\u01d5\u01d1\3\2\2\2\u01d5\u01d2\3\2\2\2\u01d5\u01d3"+ - "\3\2\2\2\u01d5\u01d4\3\2\2\2\u01d6\27\3\2\2\2\u01d7\u01d8\7\35\2\2\u01d8"+ - "\u01df\5\u00a6T\2\u01d9\u01da\t\3\2\2\u01da\u01df\5.\30\2\u01db\u01dc"+ - "\t\4\2\2\u01dc\u01df\5\u00a4S\2\u01dd\u01df\5f\64\2\u01de\u01d7\3\2\2"+ - "\2\u01de\u01d9\3\2\2\2\u01de\u01db\3\2\2\2\u01de\u01dd\3\2\2\2\u01df\31"+ - "\3\2\2\2\u01e0\u01e1\5\34\17\2\u01e1\33\3\2\2\2\u01e2\u01e3\5^\60\2\u01e3"+ - "\u01e4\5\36\20\2\u01e4\35\3\2\2\2\u01e5\u01e6\7F\2\2\u01e6\u01e8\7h\2"+ - "\2\u01e7\u01e9\5\u00f0y\2\u01e8\u01e7\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9"+ - "\u01ea\3\2\2\2\u01ea\u01eb\7i\2\2\u01eb\37\3\2\2\2\u01ec\u01fa\5F$\2\u01ed"+ - "\u01fa\5D#\2\u01ee\u01fa\5B\"\2\u01ef\u01fa\5$\23\2\u01f0\u01fa\5@!\2"+ - "\u01f1\u01fa\58\35\2\u01f2\u01fa\5> \2\u01f3\u01fa\5\66\34\2\u01f4\u01fa"+ - "\5\62\32\2\u01f5\u01fa\5\60\31\2\u01f6\u01fa\5\64\33\2\u01f7\u01fa\5\""+ - "\22\2\u01f8\u01fa\5H%\2\u01f9\u01ec\3\2\2\2\u01f9\u01ed\3\2\2\2\u01f9"+ - "\u01ee\3\2\2\2\u01f9\u01ef\3\2\2\2\u01f9\u01f0\3\2\2\2\u01f9\u01f1\3\2"+ - "\2\2\u01f9\u01f2\3\2\2\2\u01f9\u01f3\3\2\2\2\u01f9\u01f4\3\2\2\2\u01f9"+ - "\u01f5\3\2\2\2\u01f9\u01f6\3\2\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01f8\3\2"+ - "\2\2\u01fa!\3\2\2\2\u01fb\u01fc\t\5\2\2\u01fc#\3\2\2\2\u01fd\u01fe\7`"+ - "\2\2\u01fe\u01ff\7l\2\2\u01ff\u0200\5\u00c2b\2\u0200\u0201\7m\2\2\u0201"+ - "%\3\2\2\2\u0202\u0207\5(\25\2\u0203\u0204\7o\2\2\u0204\u0206\5(\25\2\u0205"+ - "\u0203\3\2\2\2\u0206\u0209\3\2\2\2\u0207\u0205\3\2\2\2\u0207\u0208\3\2"+ - "\2\2\u0208\u020b\3\2\2\2\u0209\u0207\3\2\2\2\u020a\u020c\7o\2\2\u020b"+ - "\u020a\3\2\2\2\u020b\u020c\3\2\2\2\u020c\'\3\2\2\2\u020d\u0212\7g\2\2"+ - "\u020e\u020f\7o\2\2\u020f\u0211\7g\2\2\u0210\u020e\3\2\2\2\u0211\u0214"+ - "\3\2\2\2\u0212\u0210\3\2\2\2\u0212\u0213\3\2\2\2\u0213\u0215\3\2\2\2\u0214"+ - "\u0212\3\2\2\2\u0215\u0216\5\u0132\u009a\2\u0216)\3\2\2\2\u0217\u0219"+ - "\5,\27\2\u0218\u0217\3\2\2\2\u0219\u021c\3\2\2\2\u021a\u0218\3\2\2\2\u021a"+ - "\u021b\3\2\2\2\u021b+\3\2\2\2\u021c\u021a\3\2\2\2\u021d\u021e\7j\2\2\u021e"+ - "\u0223\5\u00a4S\2\u021f\u0220\7o\2\2\u0220\u0222\5\u00a4S\2\u0221\u021f"+ - "\3\2\2\2\u0222\u0225\3\2\2\2\u0223\u0221\3\2\2\2\u0223\u0224\3\2\2\2\u0224"+ - "\u0226\3\2\2\2\u0225\u0223\3\2\2\2\u0226\u0227\7k\2\2\u0227-\3\2\2\2\u0228"+ - "\u0229\5\u00b4[\2\u0229/\3\2\2\2\u022a\u022b\7\63\2\2\u022b\u022c\7h\2"+ - "\2\u022c\u022d\5\u00a4S\2\u022d\u022e\7i\2\2\u022e\61\3\2\2\2\u022f\u0230"+ - "\79\2\2\u0230\u0231\7l\2\2\u0231\u0232\5\u00c2b\2\u0232\u0233\7m\2\2\u0233"+ - "\63\3\2\2\2\u0234\u0235\7\64\2\2\u0235\u0236\7h\2\2\u0236\u0237\5\u00a4"+ - "S\2\u0237\u0238\7i\2\2\u0238\65\3\2\2\2\u0239\u023a\t\6\2\2\u023a\u023b"+ - "\7h\2\2\u023b\u023c\5\u00a4S\2\u023c\u023d\7i\2\2\u023d\67\3\2\2\2\u023e"+ - "\u0243\7\23\2\2\u023f\u0240\7l\2\2\u0240\u0241\5:\36\2\u0241\u0242\7m"+ - "\2\2\u0242\u0244\3\2\2\2\u0243\u023f\3\2\2\2\u0243\u0244\3\2\2\2\u0244"+ - "\u0245\3\2\2\2\u0245\u0246\7h\2\2\u0246\u0247\5\u00a4S\2\u0247\u0248\7"+ - "i\2\2\u02489\3\2\2\2\u0249\u024c\5<\37\2\u024a\u024c\7\25\2\2\u024b\u0249"+ - "\3\2\2\2\u024b\u024a\3\2\2\2\u024c;\3\2\2\2\u024d\u024e\7g\2\2\u024e="+ - "\3\2\2\2\u024f\u0250\7\24\2\2\u0250\u0251\7h\2\2\u0251\u0252\5\u00a4S"+ - "\2\u0252\u0253\7i\2\2\u0253?\3\2\2\2\u0254\u0255\7<\2\2\u0255\u0256\7"+ - "h\2\2\u0256\u0257\5\u00a4S\2\u0257\u0258\7i\2\2\u0258A\3\2\2\2\u0259\u025a"+ - "\7;\2\2\u025a\u025b\7h\2\2\u025b\u025c\5\u00a4S\2\u025c\u025d\7i\2\2\u025d"+ - "C\3\2\2\2\u025e\u025f\7\30\2\2\u025f\u0260\7h\2\2\u0260\u0263\5\u00a4"+ - "S\2\u0261\u0262\7o\2\2\u0262\u0264\5\u00a4S\2\u0263\u0261\3\2\2\2\u0263"+ - "\u0264\3\2\2\2\u0264\u0265\3\2\2\2\u0265\u0266\7i\2\2\u0266E\3\2\2\2\u0267"+ - "\u0268\t\6\2\2\u0268\u0269\7l\2\2\u0269\u026a\5\u00a4S\2\u026a\u026b\7"+ - "?\2\2\u026b\u026c\5\u00a4S\2\u026c\u026d\7m\2\2\u026dG\3\2\2\2\u026e\u026f"+ - "\78\2\2\u026f\u0270\5\u00a4S\2\u0270\u0276\7j\2\2\u0271\u0272\5J&\2\u0272"+ - "\u0273\5\u0170\u00b9\2\u0273\u0275\3\2\2\2\u0274\u0271\3\2\2\2\u0275\u0278"+ - "\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0279\3\2\2\2\u0278"+ - "\u0276\3\2\2\2\u0279\u027a\7k\2\2\u027aI\3\2\2\2\u027b\u027c\5j\66\2\u027c"+ - "\u027d\7q\2\2\u027d\u027e\5\u00a4S\2\u027eK\3\2\2\2\u027f\u0280\7l\2\2"+ - "\u0280\u0285\5N(\2\u0281\u0282\7o\2\2\u0282\u0284\5N(\2\u0283\u0281\3"+ - "\2\2\2\u0284\u0287\3\2\2\2\u0285\u0283\3\2\2\2\u0285\u0286\3\2\2\2\u0286"+ - "\u0288\3\2\2\2\u0287\u0285\3\2\2\2\u0288\u0289\7m\2\2\u0289M\3\2\2\2\u028a"+ - "\u028b\5\u00a4S\2\u028b\u028c\7n\2\2\u028c\u028d\5\u00a4S\2\u028dO\3\2"+ - "\2\2\u028e\u0293\5\\/\2\u028f\u0293\5Z.\2\u0290\u0293\5R*\2\u0291\u0293"+ - "\5V,\2\u0292\u028e\3\2\2\2\u0292\u028f\3\2\2\2\u0292\u0290\3\2\2\2\u0292"+ - "\u0291\3\2\2\2\u0293Q\3\2\2\2\u0294\u0295\7\65\2\2\u0295\u029b\7j\2\2"+ - "\u0296\u0297\5T+\2\u0297\u0298\5\u0170\u00b9\2\u0298\u029a\3\2\2\2\u0299"+ - "\u0296\3\2\2\2\u029a\u029d\3\2\2\2\u029b\u0299\3\2\2\2\u029b\u029c\3\2"+ - "\2\2\u029c\u029e\3\2\2\2\u029d\u029b\3\2\2\2\u029e\u029f\7k\2\2\u029f"+ - "S\3\2\2\2\u02a0\u02a1\7O\2\2\u02a1\u02a2\7g\2\2\u02a2\u02aa\5\u013e\u00a0"+ - "\2\u02a3\u02a4\7\66\2\2\u02a4\u02a5\7j\2\2\u02a5\u02a6\5\u00a4S\2\u02a6"+ - "\u02a7\5\u0170\u00b9\2\u02a7\u02a8\7k\2\2\u02a8\u02aa\3\2\2\2\u02a9\u02a0"+ - "\3\2\2\2\u02a9\u02a3\3\2\2\2\u02aaU\3\2\2\2\u02ab\u02ac\7\67\2\2\u02ac"+ - "\u02b2\7j\2\2\u02ad\u02ae\5X-\2\u02ae\u02af\5\u0170\u00b9\2\u02af\u02b1"+ - "\3\2\2\2\u02b0\u02ad\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2"+ - "\u02b3\3\2\2\2\u02b3\u02b5\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02b6\7k"+ - "\2\2\u02b6W\3\2\2\2\u02b7\u02b8\7g\2\2\u02b8\u02be\7j\2\2\u02b9\u02ba"+ - "\5\u0160\u00b1\2\u02ba\u02bb\5\u0170\u00b9\2\u02bb\u02bd\3\2\2\2\u02bc"+ - "\u02b9\3\2\2\2\u02bd\u02c0\3\2\2\2\u02be\u02bc\3\2\2\2\u02be\u02bf\3\2"+ - "\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02be\3\2\2\2\u02c1\u02c2\7k\2\2\u02c2"+ - "Y\3\2\2\2\u02c3\u02c4\7\35\2\2\u02c4\u02c5\7l\2\2\u02c5\u02c6\7m\2\2\u02c6"+ - "\u02c7\5\u0132\u009a\2\u02c7[\3\2\2\2\u02c8\u02c9\t\7\2\2\u02c9\u02ca"+ - "\7l\2\2\u02ca\u02cb\5\u00c2b\2\u02cb\u02cc\7m\2\2\u02cc\u02d4\3\2\2\2"+ - "\u02cd\u02ce\7-\2\2\u02ce\u02cf\7l\2\2\u02cf\u02d0\5\u00c2b\2\u02d0\u02d1"+ - "\7m\2\2\u02d1\u02d2\5\u00c2b\2\u02d2\u02d4\3\2\2\2\u02d3\u02c8\3\2\2\2"+ - "\u02d3\u02cd\3\2\2\2\u02d4]\3\2\2\2\u02d5\u02db\5`\61\2\u02d6\u02d7\7"+ - "\20\2\2\u02d7\u02db\b\60\1\2\u02d8\u02d9\7E\2\2\u02d9\u02db\b\60\1\2\u02da"+ - "\u02d5\3\2\2\2\u02da\u02d6\3\2\2\2\u02da\u02d8\3\2\2\2\u02db\u02dc\3\2"+ - "\2\2\u02dc\u02de\5\u0170\u00b9\2\u02dd\u02da\3\2\2\2\u02de\u02e1\3\2\2"+ - "\2\u02df\u02e0\3\2\2\2\u02df\u02dd\3\2\2\2\u02e0\u02e4\3\2\2\2\u02e1\u02df"+ - "\3\2\2\2\u02e2\u02e3\7\20\2\2\u02e3\u02e5\b\60\1\2\u02e4\u02e2\3\2\2\2"+ - "\u02e4\u02e5\3\2\2\2\u02e5_\3\2\2\2\u02e6\u02e7\7\13\2\2\u02e7\u02ef\5"+ - "d\63\2\u02e8\u02e9\7\f\2\2\u02e9\u02ef\5d\63\2\u02ea\u02eb\7\r\2\2\u02eb"+ - "\u02ef\5d\63\2\u02ec\u02ed\7\17\2\2\u02ed\u02ef\5b\62\2\u02ee\u02e6\3"+ - "\2\2\2\u02ee\u02e8\3\2\2\2\u02ee\u02ea\3\2\2\2\u02ee\u02ec\3\2\2\2\u02ef"+ - "a\3\2\2\2\u02f0\u02f2\5\u00e6t\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2"+ - "\2\u02f2\u02f5\3\2\2\2\u02f3\u02f4\7^\2\2\u02f4\u02f6\5\u00a4S\2\u02f5"+ - "\u02f3\3\2\2\2\u02f5\u02f6\3\2\2\2\u02f6c\3\2\2\2\u02f7\u02fa\3\2\2\2"+ - "\u02f8\u02fa\5\u00a4S\2\u02f9\u02f7\3\2\2\2\u02f9\u02f8\3\2\2\2\u02fa"+ - "e\3\2\2\2\u02fb\u02fc\78\2\2\u02fc\u02fd\5\u00a4S\2\u02fd\u0301\7j\2\2"+ - "\u02fe\u0300\5h\65\2\u02ff\u02fe\3\2\2\2\u0300\u0303\3\2\2\2\u0301\u02ff"+ - "\3\2\2\2\u0301\u0302\3\2\2\2\u0302\u0304\3\2\2\2\u0303\u0301\3\2\2\2\u0304"+ - "\u0305\7k\2\2\u0305g\3\2\2\2\u0306\u0307\5j\66\2\u0307\u0309\7q\2\2\u0308"+ - "\u030a\5\u00f0y\2\u0309\u0308\3\2\2\2\u0309\u030a\3\2\2\2\u030ai\3\2\2"+ - "\2\u030b\u030c\7R\2\2\u030c\u030f\5l\67\2\u030d\u030f\7N\2\2\u030e\u030b"+ - "\3\2\2\2\u030e\u030d\3\2\2\2\u030fk\3\2\2\2\u0310\u0311\7\'\2\2\u0311"+ - "\u031e\7g\2\2\u0312\u0313\5\u00caf\2\u0313\u0318\7j\2\2\u0314\u0316\5"+ - "n8\2\u0315\u0317\7o\2\2\u0316\u0315\3\2\2\2\u0316\u0317\3\2\2\2\u0317"+ - "\u0319\3\2\2\2\u0318\u0314\3\2\2\2\u0318\u0319\3\2\2\2\u0319\u031a\3\2"+ - "\2\2\u031a\u031b\7k\2\2\u031b\u031e\3\2\2\2\u031c\u031e\5\u00a4S\2\u031d"+ - "\u0310\3\2\2\2\u031d\u0312\3\2\2\2\u031d\u031c\3\2\2\2\u031em\3\2\2\2"+ - "\u031f\u0324\5l\67\2\u0320\u0321\7o\2\2\u0321\u0323\5l\67\2\u0322\u0320"+ - "\3\2\2\2\u0323\u0326\3\2\2\2\u0324\u0322\3\2\2\2\u0324\u0325\3\2\2\2\u0325"+ - "o\3\2\2\2\u0326\u0324\3\2\2\2\u0327\u032c\7j\2\2\u0328\u0329\7=\2\2\u0329"+ - "\u032a\5\u00e4s\2\u032a\u032b\5\u0170\u00b9\2\u032b\u032d\3\2\2\2\u032c"+ - "\u0328\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u032f\3\2\2\2\u032e\u0330\5\u00f0"+ - "y\2\u032f\u032e\3\2\2\2\u032f\u0330\3\2\2\2\u0330\u0331\3\2\2\2\u0331"+ - "\u0332\7k\2\2\u0332q\3\2\2\2\u0333\u0336\5\u0150\u00a9\2\u0334\u0336\7"+ - "g\2\2\u0335\u0333\3\2\2\2\u0335\u0334\3\2\2\2\u0336\u033f\3\2\2\2\u0337"+ - "\u033c\7j\2\2\u0338\u033a\5t;\2\u0339\u033b\7o\2\2\u033a\u0339\3\2\2\2"+ - "\u033a\u033b\3\2\2\2\u033b\u033d\3\2\2\2\u033c\u0338\3\2\2\2\u033c\u033d"+ - "\3\2\2\2\u033d\u033e\3\2\2\2\u033e\u0340\7k\2\2\u033f\u0337\3\2\2\2\u033f"+ - "\u0340\3\2\2\2\u0340s\3\2\2\2\u0341\u0346\5v<\2\u0342\u0343\7o\2\2\u0343"+ - "\u0345\5v<\2\u0344\u0342\3\2\2\2\u0345\u0348\3\2\2\2\u0346\u0344\3\2\2"+ - "\2\u0346\u0347\3\2\2\2\u0347u\3\2\2\2\u0348\u0346\3\2\2\2\u0349\u034a"+ - "\7g\2\2\u034a\u034c\7q\2\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034c"+ - "\u034d\3\2\2\2\u034d\u034e\5\u00a4S\2\u034ew\3\2\2\2\u034f\u0350\7I\2"+ - "\2\u0350\u0351\5\u00a4S\2\u0351\u0352\7\21\2\2\u0352\u0353\5r:\2\u0353"+ - "\u0354\5\u00eex\2\u0354y\3\2\2\2\u0355\u0356\5\u00c2b\2\u0356\u0357\7"+ - "\21\2\2\u0357\u036a\5\u00c2b\2\u0358\u035e\7j\2\2\u0359\u035a\5\u0082"+ - "B\2\u035a\u035b\5\u0170\u00b9\2\u035b\u035d\3\2\2\2\u035c\u0359\3\2\2"+ - "\2\u035d\u0360\3\2\2\2\u035e\u035c\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0366"+ - "\3\2\2\2\u0360\u035e\3\2\2\2\u0361\u0362\5|?\2\u0362\u0363\5\u0170\u00b9"+ - "\2\u0363\u0365\3\2\2\2\u0364\u0361\3\2\2\2\u0365\u0368\3\2\2\2\u0366\u0364"+ - "\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u0369\3\2\2\2\u0368\u0366\3\2\2\2\u0369"+ - "\u036b\7k\2\2\u036a\u0358\3\2\2\2\u036a\u036b\3\2\2\2\u036b{\3\2\2\2\u036c"+ - "\u036e\7\20\2\2\u036d\u036c\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u036f\3"+ - "\2\2\2\u036f\u0370\5~@\2\u0370\u0371\7g\2\2\u0371\u0373\5\u013e\u00a0"+ - "\2\u0372\u0374\5\u00eex\2\u0373\u0372\3\2\2\2\u0373\u0374\3\2\2\2\u0374"+ - "}\3\2\2\2\u0375\u0377\7h\2\2\u0376\u0378\7g\2\2\u0377\u0376\3\2\2\2\u0377"+ - "\u0378\3\2\2\2\u0378\u037a\3\2\2\2\u0379\u037b\7\u0089\2\2\u037a\u0379"+ - "\3\2\2\2\u037a\u037b\3\2\2\2\u037b\u037c\3\2\2\2\u037c\u037d\5\u012c\u0097"+ - "\2\u037d\u037e\7i\2\2\u037e\177\3\2\2\2\u037f\u0385\5\u00b4[\2\u0380\u0381"+ - "\5\u00c2b\2\u0381\u0382\7r\2\2\u0382\u0383\7g\2\2\u0383\u0385\3\2\2\2"+ - "\u0384\u037f\3\2\2\2\u0384\u0380\3\2\2\2\u0385\u0081\3\2\2\2\u0386\u0387"+ - "\7:\2\2\u0387\u0388\7g\2\2\u0388\u038b\7u\2\2\u0389\u038c\5\u0080A\2\u038a"+ - "\u038c\5\u014e\u00a8\2\u038b\u0389\3\2\2\2\u038b\u038a\3\2\2\2\u038c\u0083"+ - "\3\2\2\2\u038d\u038e\7\61\2\2\u038e\u038f\7h\2\2\u038f\u0392\5\u00c2b"+ - "\2\u0390\u0391\7o\2\2\u0391\u0393\5\u00e6t\2\u0392\u0390\3\2\2\2\u0392"+ - "\u0393\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0395\7i\2\2\u0395\u0085\3\2"+ - "\2\2\u0396\u0397\7\60\2\2\u0397\u0398\7h\2\2\u0398\u0399\5\u00c2b\2\u0399"+ - "\u039a\7i\2\2\u039a\u0087\3\2\2\2\u039b\u039e\5^\60\2\u039c\u039f\5\u008a"+ - "F\2\u039d\u039f\5\u008cG\2\u039e\u039c\3\2\2\2\u039e\u039d\3\2\2\2\u039f"+ - "\u0089\3\2\2\2\u03a0\u03a1\7O\2\2\u03a1\u03a2\7g\2\2\u03a2\u03a4\5\u013e"+ - "\u00a0\2\u03a3\u03a5\5p9\2\u03a4\u03a3\3\2\2\2\u03a4\u03a5\3\2\2\2\u03a5"+ - "\u008b\3\2\2\2\u03a6\u03a7\7O\2\2\u03a7\u03a8\5\u009aN\2\u03a8\u03a9\7"+ - "g\2\2\u03a9\u03ab\5\u013e\u00a0\2\u03aa\u03ac\5p9\2\u03ab\u03aa\3\2\2"+ - "\2\u03ab\u03ac\3\2\2\2\u03ac\u008d\3\2\2\2\u03ad\u03b0\7\35\2\2\u03ae"+ - "\u03b1\5\u0088E\2\u03af\u03b1\5\u00dep\2\u03b0\u03ae\3\2\2\2\u03b0\u03af"+ - "\3\2\2\2\u03b1\u008f\3\2\2\2\u03b2\u03b3\7:\2\2\u03b3\u03b4\7g\2\2\u03b4"+ - "\u03b6\5\u0142\u00a2\2\u03b5\u03b7\5\u0092J\2\u03b6\u03b5\3\2\2\2\u03b6"+ - "\u03b7\3\2\2\2\u03b7\u0091\3\2\2\2\u03b8\u03b9\7j\2\2\u03b9\u03ba\5\u00a4"+ - "S\2\u03ba\u03bb\5\u0170\u00b9\2\u03bb\u03bc\7k\2\2\u03bc\u0093\3\2\2\2"+ - "\u03bd\u03be\7:\2\2\u03be\u03bf\5\u009aN\2\u03bf\u03c0\7g\2\2\u03c0\u03c2"+ - "\5\u0142\u00a2\2\u03c1\u03c3\5\u0092J\2\u03c2\u03c1\3\2\2\2\u03c2\u03c3"+ - "\3\2\2\2\u03c3\u0095\3\2\2\2\u03c4\u03cc\5\b\5\2\u03c5\u03c8\5\u00c2b"+ - "\2\u03c6\u03c7\7n\2\2\u03c7\u03c9\5\u00e6t\2\u03c8\u03c6\3\2\2\2\u03c8"+ - "\u03c9\3\2\2\2\u03c9\u03cd\3\2\2\2\u03ca\u03cb\7n\2\2\u03cb\u03cd\5\u00e6"+ - "t\2\u03cc\u03c5\3\2\2\2\u03cc\u03ca\3\2\2\2\u03cd\u0097\3\2\2\2\u03ce"+ - "\u03cf\5\b\5\2\u03cf\u03d0\7u\2\2\u03d0\u03d1\5\u00e6t\2\u03d1\u0099\3"+ - "\2\2\2\u03d2\u03d4\7h\2\2\u03d3\u03d5\5\n\6\2\u03d4\u03d3\3\2\2\2\u03d4"+ - "\u03d5\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u03d8\5\u00c2b\2\u03d7\u03d9"+ - "\7o\2\2\u03d8\u03d7\3\2\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03da\3\2\2\2\u03da"+ - "\u03db\7i\2\2\u03db\u009b\3\2\2\2\u03dc\u03df\5\u009eP\2\u03dd\u03df\5"+ - "\u00a0Q\2\u03de\u03dc\3\2\2\2\u03de\u03dd\3\2\2\2\u03df\u009d\3\2\2\2"+ - "\u03e0\u03e2\5\u00e4s\2\u03e1\u03e0\3\2\2\2\u03e1\u03e2\3\2\2\2\u03e2"+ - "\u03e3\3\2\2\2\u03e3\u03e4\5\u00a2R\2\u03e4\u009f\3\2\2\2\u03e5\u03e7"+ - "\7\35\2\2\u03e6\u03e8\5\u00e4s\2\u03e7\u03e6\3\2\2\2\u03e7\u03e8\3\2\2"+ - "\2\u03e8\u03e9\3\2\2\2\u03e9\u03ea\5\u00a2R\2\u03ea\u00a1\3\2\2\2\u03eb"+ - "\u03ed\7v\2\2\u03ec\u03eb\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u03ee\3\2"+ - "\2\2\u03ee\u03ef\5\u00c2b\2\u03ef\u00a3\3\2\2\2\u03f0\u03f1\bS\1\2\u03f1"+ - "\u03f2\t\b\2\2\u03f2\u0406\5\u00a4S\21\u03f3\u0406\5\u00b4[\2\u03f4\u03f5"+ - "\7\33\2\2\u03f5\u03f6\5.\30\2\u03f6\u03f7\7\36\2\2\u03f7\u03f8\5\u00a4"+ - "S\5\u03f8\u0406\3\2\2\2\u03f9\u03fa\7\34\2\2\u03fa\u03fb\5\u0098M\2\u03fb"+ - "\u03fc\7\36\2\2\u03fc\u03fd\5\u00a4S\4\u03fd\u0406\3\2\2\2\u03fe\u03ff"+ - "\t\t\2\2\u03ff\u0400\5&\24\2\u0400\u0401\7q\2\2\u0401\u0402\7q\2\2\u0402"+ - "\u0403\5*\26\2\u0403\u0404\5\u00a4S\3\u0404\u0406\3\2\2\2\u0405\u03f0"+ - "\3\2\2\2\u0405\u03f3\3\2\2\2\u0405\u03f4\3\2\2\2\u0405\u03f9\3\2\2\2\u0405"+ - "\u03fe\3\2\2\2\u0406\u042a\3\2\2\2\u0407\u0408\f\17\2\2\u0408\u0409\t"+ - "\n\2\2\u0409\u0429\5\u00a4S\20\u040a\u040b\f\16\2\2\u040b\u040c\t\13\2"+ - "\2\u040c\u0429\5\u00a4S\17\u040d\u040e\f\r\2\2\u040e\u040f\t\f\2\2\u040f"+ - "\u0429\5\u00a4S\16\u0410\u0411\f\f\2\2\u0411\u0412\t\r\2\2\u0412\u0429"+ - "\5\u00a4S\r\u0413\u0414\f\13\2\2\u0414\u0415\t\16\2\2\u0415\u0429\5\u00a4"+ - "S\f\u0416\u0417\f\t\2\2\u0417\u0418\7x\2\2\u0418\u0429\5\u00a4S\n\u0419"+ - "\u041a\f\b\2\2\u041a\u041b\7w\2\2\u041b\u0429\5\u00a4S\t\u041c\u041d\f"+ - "\7\2\2\u041d\u041e\7$\2\2\u041e\u0429\5\u00a4S\7\u041f\u0420\f\6\2\2\u0420"+ - "\u0421\7\'\2\2\u0421\u0422\5\u00a4S\2\u0422\u0423\7q\2\2\u0423\u0424\5"+ - "\u00a4S\6\u0424\u0429\3\2\2\2\u0425\u0426\f\n\2\2\u0426\u0427\7\21\2\2"+ - "\u0427\u0429\5r:\2\u0428\u0407\3\2\2\2\u0428\u040a\3\2\2\2\u0428\u040d"+ - "\3\2\2\2\u0428\u0410\3\2\2\2\u0428\u0413\3\2\2\2\u0428\u0416\3\2\2\2\u0428"+ - "\u0419\3\2\2\2\u0428\u041c\3\2\2\2\u0428\u041f\3\2\2\2\u0428\u0425\3\2"+ - "\2\2\u0429\u042c\3\2\2\2\u042a\u0428\3\2\2\2\u042a\u042b\3\2\2\2\u042b"+ - "\u00a5\3\2\2\2\u042c\u042a\3\2\2\2\u042d\u0442\5\30\r\2\u042e\u0442\5"+ - "\32\16\2\u042f\u0442\5\u00aaV\2\u0430\u0442\5\u00a8U\2\u0431\u0442\5\u00de"+ - "p\2\u0432\u0442\5\u00fe\u0080\2\u0433\u0442\5\u00f2z\2\u0434\u0442\5\u012a"+ - "\u0096\2\u0435\u0442\5\u0100\u0081\2\u0436\u0442\5\u0102\u0082\2\u0437"+ - "\u0442\5\u0104\u0083\2\u0438\u0442\5\u0106\u0084\2\u0439\u0442\5\u0108"+ - "\u0085\2\u043a\u0442\5\u00eex\2\u043b\u0442\5\u010a\u0086\2\u043c\u0442"+ - "\5\u010c\u0087\2\u043d\u0442\5\u011e\u0090\2\u043e\u0442\5\u00acW\2\u043f"+ - "\u0442\5\u00b0Y\2\u0440\u0442\5x=\2\u0441\u042d\3\2\2\2\u0441\u042e\3"+ - "\2\2\2\u0441\u042f\3\2\2\2\u0441\u0430\3\2\2\2\u0441\u0431\3\2\2\2\u0441"+ - "\u0432\3\2\2\2\u0441\u0433\3\2\2\2\u0441\u0434\3\2\2\2\u0441\u0435\3\2"+ - "\2\2\u0441\u0436\3\2\2\2\u0441\u0437\3\2\2\2\u0441\u0438\3\2\2\2\u0441"+ - "\u0439\3\2\2\2\u0441\u043a\3\2\2\2\u0441\u043b\3\2\2\2\u0441\u043c\3\2"+ - "\2\2\u0441\u043d\3\2\2\2\u0441\u043e\3\2\2\2\u0441\u043f\3\2\2\2\u0441"+ - "\u0440\3\2\2\2\u0442\u00a7\3\2\2\2\u0443\u0444\7&\2\2\u0444\u0445\5\u00a4"+ - "S\2\u0445\u00a9\3\2\2\2\u0446\u0447\7Z\2\2\u0447\u0449\5\u00a4S\2\u0448"+ - "\u044a\5\u00eex\2\u0449\u0448\3\2\2\2\u0449\u044a\3\2\2\2\u044a\u00ab"+ - "\3\2\2\2\u044b\u044c\5\u00aeX\2\u044c\u044d\5\u0126\u0094\2\u044d\u00ad"+ - "\3\2\2\2\u044e\u044f\7\16\2\2\u044f\u0450\5\u00a4S\2\u0450\u0451\5\u0170"+ - "\u00b9\2\u0451\u0453\3\2\2\2\u0452\u044e\3\2\2\2\u0453\u0456\3\2\2\2\u0454"+ - "\u0452\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u045b\3\2\2\2\u0456\u0454\3\2"+ - "\2\2\u0457\u0458\7\17\2\2\u0458\u0459\5b\62\2\u0459\u045a\5\u0170\u00b9"+ - "\2\u045a\u045c\3\2\2\2\u045b\u0457\3\2\2\2\u045b\u045c\3\2\2\2\u045c\u00af"+ - "\3\2\2\2\u045d\u045e\7S\2\2\u045e\u0463\5\u00a4S\2\u045f\u0460\7S\2\2"+ - "\u0460\u0461\t\3\2\2\u0461\u0463\5.\30\2\u0462\u045d\3\2\2\2\u0462\u045f"+ - "\3\2\2\2\u0463\u00b1\3\2\2\2\u0464\u046d\7\5\2\2\u0465\u046d\7\6\2\2\u0466"+ - "\u046d\7f\2\2\u0467\u046d\5\u014c\u00a7\2\u0468\u046d\5\u0162\u00b2\2"+ - "\u0469\u046d\7\3\2\2\u046a\u046d\7\u0091\2\2\u046b\u046d\7\u0092\2\2\u046c"+ - "\u0464\3\2\2\2\u046c\u0465\3\2\2\2\u046c\u0466\3\2\2\2\u046c\u0467\3\2"+ - "\2\2\u046c\u0468\3\2\2\2\u046c\u0469\3\2\2\2\u046c\u046a\3\2\2\2\u046c"+ - "\u046b\3\2\2\2\u046d\u00b3\3\2\2\2\u046e\u046f\b[\1\2\u046f\u047b\5\u0148"+ - "\u00a5\2\u0470\u047b\5\u0144\u00a3\2\u0471\u047b\5\u016c\u00b7\2\u0472"+ - "\u047b\5 \21\2\u0473\u047b\5\u0086D\2\u0474\u047b\5\u0084C\2\u0475\u0476"+ - "\t\17\2\2\u0476\u0477\7h\2\2\u0477\u0478\5\u00a4S\2\u0478\u0479\7i\2\2"+ - "\u0479\u047b\3\2\2\2\u047a\u046e\3\2\2\2\u047a\u0470\3\2\2\2\u047a\u0471"+ - "\3\2\2\2\u047a\u0472\3\2\2\2\u047a\u0473\3\2\2\2\u047a\u0474\3\2\2\2\u047a"+ - "\u0475\3\2\2\2\u047b\u0492\3\2\2\2\u047c\u047d\f\13\2\2\u047d\u047e\7"+ - "r\2\2\u047e\u0491\7g\2\2\u047f\u0480\f\n\2\2\u0480\u0491\5\u0166\u00b4"+ - "\2\u0481\u0482\f\t\2\2\u0482\u0491\5\u00ceh\2\u0483\u0484\f\b\2\2\u0484"+ - "\u0491\5L\'\2\u0485\u0486\f\7\2\2\u0486\u0491\5\u0168\u00b5\2\u0487\u0488"+ - "\f\6\2\2\u0488\u0491\5\u016a\u00b6\2\u0489\u048a\f\5\2\2\u048a\u048b\5"+ - "\u016a\u00b6\2\u048b\u048c\7\22\2\2\u048c\u048d\5r:\2\u048d\u0491\3\2"+ - "\2\2\u048e\u048f\f\4\2\2\u048f\u0491\5\u00ba^\2\u0490\u047c\3\2\2\2\u0490"+ - "\u047f\3\2\2\2\u0490\u0481\3\2\2\2\u0490\u0483\3\2\2\2\u0490\u0485\3\2"+ - "\2\2\u0490\u0487\3\2\2\2\u0490\u0489\3\2\2\2\u0490\u048e\3\2\2\2\u0491"+ - "\u0494\3\2\2\2\u0492\u0490\3\2\2\2\u0492\u0493\3\2\2\2\u0493\u00b5\3\2"+ - "\2\2\u0494\u0492\3\2\2\2\u0495\u0496\5^\60\2\u0496\u0497\5\u00b8]\2\u0497"+ - "\u00b7\3\2\2\2\u0498\u049a\7O\2\2\u0499\u049b\7g\2\2\u049a\u0499\3\2\2"+ - "\2\u049a\u049b\3\2\2\2\u049b\u049c\3\2\2\2\u049c\u049e\5\u013e\u00a0\2"+ - "\u049d\u049f\5p9\2\u049e\u049d\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u00b9"+ - "\3\2\2\2\u04a0\u04a2\7(\2\2\u04a1\u04a3\5\u00e6t\2\u04a2\u04a1\3\2\2\2"+ - "\u04a2\u04a3\3\2\2\2\u04a3\u04a5\3\2\2\2\u04a4\u04a6\7o\2\2\u04a5\u04a4"+ - "\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7\u04a8\7)\2\2\u04a8"+ - "\u00bb\3\2\2\2\u04a9\u04aa\7P\2\2\u04aa\u04b4\7j\2\2\u04ab\u04af\5\u00c0"+ - "a\2\u04ac\u04af\5\u012c\u0097\2\u04ad\u04af\5\u00be`\2\u04ae\u04ab\3\2"+ - "\2\2\u04ae\u04ac\3\2\2\2\u04ae\u04ad\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0"+ - "\u04b1\5\u0170\u00b9\2\u04b1\u04b3\3\2\2\2\u04b2\u04ae\3\2\2\2\u04b3\u04b6"+ - "\3\2\2\2\u04b4\u04b2\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b7\3\2\2\2\u04b6"+ - "\u04b4\3\2\2\2\u04b7\u04b8\7k\2\2\u04b8\u00bd\3\2\2\2\u04b9\u04ba\7:\2"+ - "\2\u04ba\u04bb\7g\2\2\u04bb\u04bc\5\u0142\u00a2\2\u04bc\u00bf\3\2\2\2"+ - "\u04bd\u04bf\7\35\2\2\u04be\u04bd\3\2\2\2\u04be\u04bf\3\2\2\2\u04bf\u04c0"+ - "\3\2\2\2\u04c0\u04c1\5^\60\2\u04c1\u04c2\7g\2\2\u04c2\u04c3\5\u0142\u00a2"+ - "\2\u04c3\u04c4\5\u0140\u00a1\2\u04c4\u04cd\3\2\2\2\u04c5\u04c7\7\35\2"+ - "\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04c9"+ - "\5^\60\2\u04c9\u04ca\7g\2\2\u04ca\u04cb\5\u0142\u00a2\2\u04cb\u04cd\3"+ - "\2\2\2\u04cc\u04be\3\2\2\2\u04cc\u04c6\3\2\2\2\u04cd\u00c1\3\2\2\2\u04ce"+ - "\u04d6\5\u012c\u0097\2\u04cf\u04d6\5\u00c4c\2\u04d0\u04d6\5P)\2\u04d1"+ - "\u04d2\7h\2\2\u04d2\u04d3\5\u00c2b\2\u04d3\u04d4\7i\2\2\u04d4\u04d6\3"+ - "\2\2\2\u04d5\u04ce\3\2\2\2\u04d5\u04cf\3\2\2\2\u04d5\u04d0\3\2\2\2\u04d5"+ - "\u04d1\3\2\2\2\u04d6\u00c3\3\2\2\2\u04d7\u04e1\5\u012e\u0098\2\u04d8\u04e1"+ - "\5\u015e\u00b0\2\u04d9\u04e1\5\u0134\u009b\2\u04da\u04e1\5\u013c\u009f"+ - "\2\u04db\u04e1\5\u00bc_\2\u04dc\u04e1\5\u0136\u009c\2\u04dd\u04e1\5\u0138"+ - "\u009d\2\u04de\u04e1\5\u013a\u009e\2\u04df\u04e1\5\u00c6d\2\u04e0\u04d7"+ - "\3\2\2\2\u04e0\u04d8\3\2\2\2\u04e0\u04d9\3\2\2\2\u04e0\u04da\3\2\2\2\u04e0"+ - "\u04db\3\2\2\2\u04e0\u04dc\3\2\2\2\u04e0\u04dd\3\2\2\2\u04e0\u04de\3\2"+ - "\2\2\u04e0\u04df\3\2\2\2\u04e1\u00c5\3\2\2\2\u04e2\u04e3\7:\2\2\u04e3"+ - "\u04e4\5\u00c8e\2\u04e4\u00c7\3\2\2\2\u04e5\u04f1\7h\2\2\u04e6\u04eb\5"+ - "\u00c2b\2\u04e7\u04e8\7o\2\2\u04e8\u04ea\5\u00c2b\2\u04e9\u04e7\3\2\2"+ - "\2\u04ea\u04ed\3\2\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ec\3\2\2\2\u04ec\u04ef"+ - "\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ee\u04f0\7o\2\2\u04ef\u04ee\3\2\2\2\u04ef"+ - "\u04f0\3\2\2\2\u04f0\u04f2\3\2\2\2\u04f1\u04e6\3\2\2\2\u04f1\u04f2\3\2"+ - "\2\2\u04f2\u04f3\3\2\2\2\u04f3\u04f4\7i\2\2\u04f4\u00c9\3\2\2\2\u04f5"+ - "\u04fd\5\u015e\u00b0\2\u04f6\u04fd\5\u012e\u0098\2\u04f7\u04fd\5\u00cc"+ - "g\2\u04f8\u04fd\5\u0136\u009c\2\u04f9\u04fd\5\u0138\u009d\2\u04fa\u04fd"+ - "\5P)\2\u04fb\u04fd\5\u012c\u0097\2\u04fc\u04f5\3\2\2\2\u04fc\u04f6\3\2"+ - "\2\2\u04fc\u04f7\3\2\2\2\u04fc\u04f8\3\2\2\2\u04fc\u04f9\3\2\2\2\u04fc"+ - "\u04fa\3\2\2\2\u04fc\u04fb\3\2\2\2\u04fd\u00cb\3\2\2\2\u04fe\u04ff\7l"+ - "\2\2\u04ff\u0500\7v\2\2\u0500\u0501\7m\2\2\u0501\u0502\5\u0132\u009a\2"+ - "\u0502\u00cd\3\2\2\2\u0503\u0513\7l\2\2\u0504\u0506\5\u00d0i\2\u0505\u0504"+ - "\3\2\2\2\u0505\u0506\3\2\2\2\u0506\u0507\3\2\2\2\u0507\u0509\7q\2\2\u0508"+ - "\u050a\5\u00d2j\2\u0509\u0508\3\2\2\2\u0509\u050a\3\2\2\2\u050a\u0514"+ - "\3\2\2\2\u050b\u050d\5\u00d0i\2\u050c\u050b\3\2\2\2\u050c\u050d\3\2\2"+ - "\2\u050d\u050e\3\2\2\2\u050e\u050f\7q\2\2\u050f\u0510\5\u00d2j\2\u0510"+ - "\u0511\7q\2\2\u0511\u0512\5\u00d4k\2\u0512\u0514\3\2\2\2\u0513\u0505\3"+ - "\2\2\2\u0513\u050c\3\2\2\2\u0514\u0515\3\2\2\2\u0515\u0516\7m\2\2\u0516"+ - "\u00cf\3\2\2\2\u0517\u0518\5\u00a4S\2\u0518\u00d1\3\2\2\2\u0519\u051a"+ - "\5\u00a4S\2\u051a\u00d3\3\2\2\2\u051b\u051c\5\u00a4S\2\u051c\u00d5\3\2"+ - "\2\2\u051d\u051f\t\20\2\2\u051e\u051d\3\2\2\2\u051e\u051f\3\2\2\2\u051f"+ - "\u0520\3\2\2\2\u0520\u0521\7n\2\2\u0521\u00d7\3\2\2\2\u0522\u0523\5\u00e6"+ - "t\2\u0523\u0524\7n\2\2\u0524\u0529\3\2\2\2\u0525\u0526\5\b\5\2\u0526\u0527"+ - "\7u\2\2\u0527\u0529\3\2\2\2\u0528\u0522\3\2\2\2\u0528\u0525\3\2\2\2\u0528"+ - "\u0529\3\2\2\2\u0529\u052a\3\2\2\2\u052a\u052b\7_\2\2\u052b\u0530\5\u00a4"+ - "S\2\u052c\u052e\7L\2\2\u052d\u052f\7g\2\2\u052e\u052d\3\2\2\2\u052e\u052f"+ - "\3\2\2\2\u052f\u0531\3\2\2\2\u0530\u052c\3\2\2\2\u0530\u0531\3\2\2\2\u0531"+ - "\u00d9\3\2\2\2\u0532\u0533\7Z\2\2\u0533\u0534\7g\2\2\u0534\u00db\3\2\2"+ - "\2\u0535\u0536\5\u0162\u00b2\2\u0536\u00dd\3\2\2\2\u0537\u053b\5\u00e0"+ - "q\2\u0538\u053b\5\u00e8u\2\u0539\u053b\5\u00ecw\2\u053a\u0537\3\2\2\2"+ - "\u053a\u0538\3\2\2\2\u053a\u0539\3\2\2\2\u053b\u00df\3\2\2\2\u053c\u0548"+ - "\7\\\2\2\u053d\u0549\5\u00e2r\2\u053e\u0544\7h\2\2\u053f\u0540\5\u00e2"+ - "r\2\u0540\u0541\5\u0170\u00b9\2\u0541\u0543\3\2\2\2\u0542\u053f\3\2\2"+ - "\2\u0543\u0546\3\2\2\2\u0544\u0542\3\2\2\2\u0544\u0545\3\2\2\2\u0545\u0547"+ - "\3\2\2\2\u0546\u0544\3\2\2\2\u0547\u0549\7i\2\2\u0548\u053d\3\2\2\2\u0548"+ - "\u053e\3\2\2\2\u0549\u00e1\3\2\2\2\u054a\u0550\5\u00e4s\2\u054b\u054d"+ - "\5\u00c2b\2\u054c\u054b\3\2\2\2\u054c\u054d\3\2\2\2\u054d\u054e\3\2\2"+ - "\2\u054e\u054f\7n\2\2\u054f\u0551\5\u00e6t\2\u0550\u054c\3\2\2\2\u0550"+ - "\u0551\3\2\2\2\u0551\u00e3\3\2\2\2\u0552\u0557\7g\2\2\u0553\u0554\7o\2"+ - "\2\u0554\u0556\7g\2\2\u0555\u0553\3\2\2\2\u0556\u0559\3\2\2\2\u0557\u0555"+ - "\3\2\2\2\u0557\u0558\3\2\2\2\u0558\u00e5\3\2\2\2\u0559\u0557\3\2\2\2\u055a"+ - "\u055f\5\u00a4S\2\u055b\u055c\7o\2\2\u055c\u055e\5\u00a4S\2\u055d\u055b"+ - "\3\2\2\2\u055e\u0561\3\2\2\2\u055f\u055d\3\2\2\2\u055f\u0560\3\2\2\2\u0560"+ - "\u00e7\3\2\2\2\u0561\u055f\3\2\2\2\u0562\u056e\7`\2\2\u0563\u056f\5\u00ea"+ - "v\2\u0564\u056a\7h\2\2\u0565\u0566\5\u00eav\2\u0566\u0567\5\u0170\u00b9"+ - "\2\u0567\u0569\3\2\2\2\u0568\u0565\3\2\2\2\u0569\u056c\3\2\2\2\u056a\u0568"+ - "\3\2\2\2\u056a\u056b\3\2\2\2\u056b\u056d\3\2\2\2\u056c\u056a\3\2\2\2\u056d"+ - "\u056f\7i\2\2\u056e\u0563\3\2\2\2\u056e\u0564\3\2\2\2\u056f\u00e9\3\2"+ - "\2\2\u0570\u0572\7g\2\2\u0571\u0573\7n\2\2\u0572\u0571\3\2\2\2\u0572\u0573"+ - "\3\2\2\2\u0573\u0574\3\2\2\2\u0574\u0575\5\u00c2b\2\u0575\u00eb\3\2\2"+ - "\2\u0576\u0582\7e\2\2\u0577\u0583\5\u0096L\2\u0578\u057e\7h\2\2\u0579"+ - "\u057a\5\u0096L\2\u057a\u057b\5\u0170\u00b9\2\u057b\u057d\3\2\2\2\u057c"+ - "\u0579\3\2\2\2\u057d\u0580\3\2\2\2\u057e\u057c\3\2\2\2\u057e\u057f\3\2"+ - "\2\2\u057f\u0581\3\2\2\2\u0580\u057e\3\2\2\2\u0581\u0583\7i\2\2\u0582"+ - "\u0577\3\2\2\2\u0582\u0578\3\2\2\2\u0583\u00ed\3\2\2\2\u0584\u0586\7j"+ - "\2\2\u0585\u0587\5\u00f0y\2\u0586\u0585\3\2\2\2\u0586\u0587\3\2\2\2\u0587"+ - "\u0588\3\2\2\2\u0588\u0589\7k\2\2\u0589\u00ef\3\2\2\2\u058a\u058c\5\u0170"+ - "\u00b9\2\u058b\u058a\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058d\3\2\2\2\u058d"+ - "\u058e\5\u00a6T\2\u058e\u058f\5\u0170\u00b9\2\u058f\u0591\3\2\2\2\u0590"+ - "\u058b\3\2\2\2\u0591\u0592\3\2\2\2\u0592\u0590\3\2\2\2\u0592\u0593\3\2"+ - "\2\2\u0593\u00f1\3\2\2\2\u0594\u059a\5\u00f6|\2\u0595\u059a\5\u00f8}\2"+ - "\u0596\u059a\5\u00fa~\2\u0597\u059a\5\u00f4{\2\u0598\u059a\5\u0098M\2"+ - "\u0599\u0594\3\2\2\2\u0599\u0595\3\2\2\2\u0599\u0596\3\2\2\2\u0599\u0597"+ - "\3\2\2\2\u0599\u0598\3\2\2\2\u059a\u00f3\3\2\2\2\u059b\u059c\5\u00a4S"+ - "\2\u059c\u00f5\3\2\2\2\u059d\u059e\5\u00a4S\2\u059e\u059f\7\u008b\2\2"+ - "\u059f\u05a0\5\u00a4S\2\u05a0\u00f7\3\2\2\2\u05a1\u05a2\5\u00a4S\2\u05a2"+ - "\u05a3\t\21\2\2\u05a3\u00f9\3\2\2\2\u05a4\u05a5\5\u00e6t\2\u05a5\u05a6"+ - "\5\u00d6l\2\u05a6\u05a7\5\u00e6t\2\u05a7\u00fb\3\2\2\2\u05a8\u05a9\t\22"+ - "\2\2\u05a9\u00fd\3\2\2\2\u05aa\u05ab\7g\2\2\u05ab\u05ad\7q\2\2\u05ac\u05ae"+ - "\5\u00a6T\2\u05ad\u05ac\3\2\2\2\u05ad\u05ae\3\2\2\2\u05ae\u00ff\3\2\2"+ - "\2\u05af\u05b1\7d\2\2\u05b0\u05b2\5\u00e6t\2\u05b1\u05b0\3\2\2\2\u05b1"+ - "\u05b2\3\2\2\2\u05b2\u0101\3\2\2\2\u05b3\u05b5\7M\2\2\u05b4\u05b6\7g\2"+ - "\2\u05b5\u05b4\3\2\2\2\u05b5\u05b6\3\2\2\2\u05b6\u0103\3\2\2\2\u05b7\u05b9"+ - "\7a\2\2\u05b8\u05ba\7g\2\2\u05b9\u05b8\3\2\2\2\u05b9\u05ba\3\2\2\2\u05ba"+ - "\u0105\3\2\2\2\u05bb\u05bc\7Y\2\2\u05bc\u05bd\7g\2\2\u05bd\u0107\3\2\2"+ - "\2\u05be\u05bf\7]\2\2\u05bf\u0109\3\2\2\2\u05c0\u05c9\7^\2\2\u05c1\u05ca"+ - "\5\u00a4S\2\u05c2\u05c3\5\u0170\u00b9\2\u05c3\u05c4\5\u00a4S\2\u05c4\u05ca"+ - "\3\2\2\2\u05c5\u05c6\5\u00f2z\2\u05c6\u05c7\5\u0170\u00b9\2\u05c7\u05c8"+ - "\5\u00a4S\2\u05c8\u05ca\3\2\2\2\u05c9\u05c1\3\2\2\2\u05c9\u05c2\3\2\2"+ - "\2\u05c9\u05c5\3\2\2\2\u05ca\u05cb\3\2\2\2\u05cb\u05d1\5\u00eex\2\u05cc"+ - "\u05cf\7X\2\2\u05cd\u05d0\5\u010a\u0086\2\u05ce\u05d0\5\u00eex\2\u05cf"+ - "\u05cd\3\2\2\2\u05cf\u05ce\3\2\2\2\u05d0\u05d2\3\2\2\2\u05d1\u05cc\3\2"+ - "\2\2\u05d1\u05d2\3\2\2\2\u05d2\u010b\3\2\2\2\u05d3\u05d6\5\u010e\u0088"+ - "\2\u05d4\u05d6\5\u0114\u008b\2\u05d5\u05d3\3\2\2\2\u05d5\u05d4\3\2\2\2"+ - "\u05d6\u010d\3\2\2\2\u05d7\u05e2\7[\2\2\u05d8\u05da\5\u00a4S\2\u05d9\u05d8"+ - "\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05e3\3\2\2\2\u05db\u05dd\5\u00f2z"+ - "\2\u05dc\u05db\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd\u05de\3\2\2\2\u05de\u05e0"+ - "\5\u0170\u00b9\2\u05df\u05e1\5\u00a4S\2\u05e0\u05df\3\2\2\2\u05e0\u05e1"+ - "\3\2\2\2\u05e1\u05e3\3\2\2\2\u05e2\u05d9\3\2\2\2\u05e2\u05dc\3\2\2\2\u05e3"+ - "\u05e4\3\2\2\2\u05e4\u05e8\7j\2\2\u05e5\u05e7\5\u0110\u0089\2\u05e6\u05e5"+ - "\3\2\2\2\u05e7\u05ea\3\2\2\2\u05e8\u05e6\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9"+ - "\u05eb\3\2\2\2\u05ea\u05e8\3\2\2\2\u05eb\u05ec\7k\2\2\u05ec\u010f\3\2"+ - "\2\2\u05ed\u05ee\5\u0112\u008a\2\u05ee\u05f0\7q\2\2\u05ef\u05f1\5\u00f0"+ - "y\2\u05f0\u05ef\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u0111\3\2\2\2\u05f2"+ - "\u05f3\7R\2\2\u05f3\u05f6\5\u00e6t\2\u05f4\u05f6\7N\2\2\u05f5\u05f2\3"+ - "\2\2\2\u05f5\u05f4\3\2\2\2\u05f6\u0113\3\2\2\2\u05f7\u0600\7[\2\2\u05f8"+ - "\u0601\5\u0116\u008c\2\u05f9\u05fa\5\u0170\u00b9\2\u05fa\u05fb\5\u0116"+ - "\u008c\2\u05fb\u0601\3\2\2\2\u05fc\u05fd\5\u00f2z\2\u05fd\u05fe\5\u0170"+ - "\u00b9\2\u05fe\u05ff\5\u0116\u008c\2\u05ff\u0601\3\2\2\2\u0600\u05f8\3"+ - "\2\2\2\u0600\u05f9\3\2\2\2\u0600\u05fc\3\2\2\2\u0601\u0602\3\2\2\2\u0602"+ - "\u0606\7j\2\2\u0603\u0605\5\u0118\u008d\2\u0604\u0603\3\2\2\2\u0605\u0608"+ - "\3\2\2\2\u0606\u0604\3\2\2\2\u0606\u0607\3\2\2\2\u0607\u0609\3\2\2\2\u0608"+ - "\u0606\3\2\2\2\u0609\u060a\7k\2\2\u060a\u0115\3\2\2\2\u060b\u060c\7g\2"+ - "\2\u060c\u060e\7u\2\2\u060d\u060b\3\2\2\2\u060d\u060e\3\2\2\2\u060e\u060f"+ - "\3\2\2\2\u060f\u0610\5\u00b4[\2\u0610\u0611\7r\2\2\u0611\u0612\7h\2\2"+ - "\u0612\u0613\7`\2\2\u0613\u0614\7i\2\2\u0614\u0117\3\2\2\2\u0615\u0616"+ - "\5\u011a\u008e\2\u0616\u0618\7q\2\2\u0617\u0619\5\u00f0y\2\u0618\u0617"+ - "\3\2\2\2\u0618\u0619\3\2\2\2\u0619\u0119\3\2\2\2\u061a\u061b\7R\2\2\u061b"+ - "\u061e\5\u011c\u008f\2\u061c\u061e\7N\2\2\u061d\u061a\3\2\2\2\u061d\u061c"+ - "\3\2\2\2\u061e\u011b\3\2\2\2\u061f\u0622\5\u00c2b\2\u0620\u0622\7f\2\2"+ - "\u0621\u061f\3\2\2\2\u0621\u0620\3\2\2\2\u0622\u062a\3\2\2\2\u0623\u0626"+ - "\7o\2\2\u0624\u0627\5\u00c2b\2\u0625\u0627\7f\2\2\u0626\u0624\3\2\2\2"+ - "\u0626\u0625\3\2\2\2\u0627\u0629\3\2\2\2\u0628\u0623\3\2\2\2\u0629\u062c"+ - "\3\2\2\2\u062a\u0628\3\2\2\2\u062a\u062b\3\2\2\2\u062b\u011d\3\2\2\2\u062c"+ - "\u062a\3\2\2\2\u062d\u062e\7Q\2\2\u062e\u0632\7j\2\2\u062f\u0631\5\u0120"+ - "\u0091\2\u0630\u062f\3\2\2\2\u0631\u0634\3\2\2\2\u0632\u0630\3\2\2\2\u0632"+ - "\u0633\3\2\2\2\u0633\u0635\3\2\2\2\u0634\u0632\3\2\2\2\u0635\u0636\7k"+ - "\2\2\u0636\u011f\3\2\2\2\u0637\u0638\5\u0122\u0092\2\u0638\u063a\7q\2"+ - "\2\u0639\u063b\5\u00f0y\2\u063a\u0639\3\2\2\2\u063a\u063b\3\2\2\2\u063b"+ - "\u0121\3\2\2\2\u063c\u063f\7R\2\2\u063d\u0640\5\u00f6|\2\u063e\u0640\5"+ - "\u0124\u0093\2\u063f\u063d\3\2\2\2\u063f\u063e\3\2\2\2\u0640\u0643\3\2"+ - "\2\2\u0641\u0643\7N\2\2\u0642\u063c\3\2\2\2\u0642\u0641\3\2\2\2\u0643"+ - "\u0123\3\2\2\2\u0644\u0645\5\u00e6t\2\u0645\u0646\7n\2\2\u0646\u064b\3"+ - "\2\2\2\u0647\u0648\5\u00e4s\2\u0648\u0649\7u\2\2\u0649\u064b\3\2\2\2\u064a"+ - "\u0644\3\2\2\2\u064a\u0647\3\2\2\2\u064a\u064b\3\2\2\2\u064b\u064c\3\2"+ - "\2\2\u064c\u064d\5\u00a4S\2\u064d\u0125\3\2\2\2\u064e\u0652\7b\2\2\u064f"+ - "\u0653\5\u00a4S\2\u0650\u0653\5\u0128\u0095\2\u0651\u0653\5\u00d8m\2\u0652"+ - "\u064f\3\2\2\2\u0652\u0650\3\2\2\2\u0652\u0651\3\2\2\2\u0652\u0653\3\2"+ - "\2\2\u0653\u0654\3\2\2\2\u0654\u0655\5\u00eex\2\u0655\u0127\3\2\2\2\u0656"+ - "\u0658\5\u00f2z\2\u0657\u0656\3\2\2\2\u0657\u0658\3\2\2\2\u0658\u0659"+ - "\3\2\2\2\u0659\u065b\5\u0170\u00b9\2\u065a\u065c\5\u00a4S\2\u065b\u065a"+ - "\3\2\2\2\u065b\u065c\3\2\2\2\u065c\u065d\3\2\2\2\u065d\u065f\5\u0170\u00b9"+ - "\2\u065e\u0660\5\u00f2z\2\u065f\u065e\3\2\2\2\u065f\u0660\3\2\2\2\u0660"+ - "\u0129\3\2\2\2\u0661\u0662\7T\2\2\u0662\u0663\5\u00a4S\2\u0663\u012b\3"+ - "\2\2\2\u0664\u0667\5\u0150\u00a9\2\u0665\u0667\7g\2\2\u0666\u0664\3\2"+ - "\2\2\u0666\u0665\3\2\2\2\u0667\u012d\3\2\2\2\u0668\u0669\7l\2\2\u0669"+ - "\u066a\5\u0130\u0099\2\u066a\u066b\7m\2\2\u066b\u066c\5\u0132\u009a\2"+ - "\u066c\u012f\3\2\2\2\u066d\u066e\5\u00a4S\2\u066e\u0131\3\2\2\2\u066f"+ - "\u0670\5\u00c2b\2\u0670\u0133\3\2\2\2\u0671\u0672\7\u0089\2\2\u0672\u0673"+ - "\5\u00c2b\2\u0673\u0135\3\2\2\2\u0674\u0675\7l\2\2\u0675\u0676\7m\2\2"+ - "\u0676\u0677\5\u0132\u009a\2\u0677\u0137\3\2\2\2\u0678\u0679\7U\2\2\u0679"+ - "\u067a\7l\2\2\u067a\u067b\5\u00c2b\2\u067b\u067c\7m\2\2\u067c\u067d\5"+ - "\u0132\u009a\2\u067d\u0139\3\2\2\2\u067e\u0684\7W\2\2\u067f\u0680\7W\2"+ - "\2\u0680\u0684\7\u008b\2\2\u0681\u0682\7\u008b\2\2\u0682\u0684\7W\2\2"+ - "\u0683\u067e\3\2\2\2\u0683\u067f\3\2\2\2\u0683\u0681\3\2\2\2\u0684\u0685"+ - "\3\2\2\2\u0685\u0686\5\u0132\u009a\2\u0686\u013b\3\2\2\2\u0687\u0688\7"+ - "O\2\2\u0688\u0689\5\u013e\u00a0\2\u0689\u013d\3\2\2\2\u068a\u068b\5\u0142"+ - "\u00a2\2\u068b\u068c\5\u0140\u00a1\2\u068c\u068f\3\2\2\2\u068d\u068f\5"+ - "\u0142\u00a2\2\u068e\u068a\3\2\2\2\u068e\u068d\3\2\2\2\u068f\u013f\3\2"+ - "\2\2\u0690\u0693\5\u0142\u00a2\2\u0691\u0693\5\u00c2b\2\u0692\u0690\3"+ - "\2\2\2\u0692\u0691\3\2\2\2\u0693\u0141\3\2\2\2\u0694\u06a0\7h\2\2\u0695"+ - "\u069a\5\u009cO\2\u0696\u0697\7o\2\2\u0697\u0699\5\u009cO\2\u0698\u0696"+ - "\3\2\2\2\u0699\u069c\3\2\2\2\u069a\u0698\3\2\2\2\u069a\u069b\3\2\2\2\u069b"+ - "\u069e\3\2\2\2\u069c\u069a\3\2\2\2\u069d\u069f\7o\2\2\u069e\u069d\3\2"+ - "\2\2\u069e\u069f\3\2\2\2\u069f\u06a1\3\2\2\2\u06a0\u0695\3\2\2\2\u06a0"+ - "\u06a1\3\2\2\2\u06a1\u06a2\3\2\2\2\u06a2\u06a3\7i\2\2\u06a3\u0143\3\2"+ - "\2\2\u06a4\u06a5\5\u0146\u00a4\2\u06a5\u06a6\7h\2\2\u06a6\u06a8\5\u00a4"+ - "S\2\u06a7\u06a9\7o\2\2\u06a8\u06a7\3\2\2\2\u06a8\u06a9\3\2\2\2\u06a9\u06aa"+ - "\3\2\2\2\u06aa\u06ab\7i\2\2\u06ab\u0145\3\2\2\2\u06ac\u06b2\5\u00c4c\2"+ - "\u06ad\u06ae\7h\2\2\u06ae\u06af\5\u0146\u00a4\2\u06af\u06b0\7i\2\2\u06b0"+ - "\u06b2\3\2\2\2\u06b1\u06ac\3\2\2\2\u06b1\u06ad\3\2\2\2\u06b2\u0147\3\2"+ - "\2\2\u06b3\u06ba\5\u014a\u00a6\2\u06b4\u06ba\5\u014e\u00a8\2\u06b5\u06b6"+ - "\7h\2\2\u06b6\u06b7\5\u00a4S\2\u06b7\u06b8\7i\2\2\u06b8\u06ba\3\2\2\2"+ - "\u06b9\u06b3\3\2\2\2\u06b9\u06b4\3\2\2\2\u06b9\u06b5\3\2\2\2\u06ba\u0149"+ - "\3\2\2\2\u06bb\u06bf\5\u00b2Z\2\u06bc\u06bf\5\u0152\u00aa\2\u06bd\u06bf"+ - "\5\u00b6\\\2\u06be\u06bb\3\2\2\2\u06be\u06bc\3\2\2\2\u06be\u06bd\3\2\2"+ - "\2\u06bf\u014b\3\2\2\2\u06c0\u06c1\t\23\2\2\u06c1\u014d\3\2\2\2\u06c2"+ - "\u06c3\7g\2\2\u06c3\u014f\3\2\2\2\u06c4\u06c5\7g\2\2\u06c5\u06c6\7r\2"+ - "\2\u06c6\u06c7\7g\2\2\u06c7\u0151\3\2\2\2\u06c8\u06c9\5\u00caf\2\u06c9"+ - "\u06ca\5\u0154\u00ab\2\u06ca\u0153\3\2\2\2\u06cb\u06d0\7j\2\2\u06cc\u06ce"+ - "\5\u0156\u00ac\2\u06cd\u06cf\7o\2\2\u06ce\u06cd\3\2\2\2\u06ce\u06cf\3"+ - "\2\2\2\u06cf\u06d1\3\2\2\2\u06d0\u06cc\3\2\2\2\u06d0\u06d1\3\2\2\2\u06d1"+ - "\u06d2\3\2\2\2\u06d2\u06d3\7k\2\2\u06d3\u0155\3\2\2\2\u06d4\u06d9\5\u0158"+ - "\u00ad\2\u06d5\u06d6\7o\2\2\u06d6\u06d8\5\u0158\u00ad\2\u06d7\u06d5\3"+ - "\2\2\2\u06d8\u06db\3\2\2\2\u06d9\u06d7\3\2\2\2\u06d9\u06da\3\2\2\2\u06da"+ - "\u0157\3\2\2\2\u06db\u06d9\3\2\2\2\u06dc\u06dd\5\u015a\u00ae\2\u06dd\u06de"+ - "\7q\2\2\u06de\u06e0\3\2\2\2\u06df\u06dc\3\2\2\2\u06df\u06e0\3\2\2\2\u06e0"+ - "\u06e1\3\2\2\2\u06e1\u06e2\5\u015c\u00af\2\u06e2\u0159\3\2\2\2\u06e3\u06e6"+ - "\5\u00a4S\2\u06e4\u06e6\5\u0154\u00ab\2\u06e5\u06e3\3\2\2\2\u06e5\u06e4"+ - "\3\2\2\2\u06e6\u015b\3\2\2\2\u06e7\u06ea\5\u00a4S\2\u06e8\u06ea\5\u0154"+ - "\u00ab\2\u06e9\u06e7\3\2\2\2\u06e9\u06e8\3\2\2\2\u06ea\u015d\3\2\2\2\u06eb"+ - "\u06ec\7V\2\2\u06ec\u06f2\7j\2\2\u06ed\u06ee\5\u0160\u00b1\2\u06ee\u06ef"+ - "\5\u0170\u00b9\2\u06ef\u06f1\3\2\2\2\u06f0\u06ed\3\2\2\2\u06f1\u06f4\3"+ - "\2\2\2\u06f2\u06f0\3\2\2\2\u06f2\u06f3\3\2\2\2\u06f3\u06f5\3\2\2\2\u06f4"+ - "\u06f2\3\2\2\2\u06f5\u06f6\7k\2\2\u06f6\u015f\3\2\2\2\u06f7\u06f8\5\u00e4"+ - "s\2\u06f8\u06f9\5\u00c2b\2\u06f9\u06fc\3\2\2\2\u06fa\u06fc\5\u0164\u00b3"+ - "\2\u06fb\u06f7\3\2\2\2\u06fb\u06fa\3\2\2\2\u06fc\u06fe\3\2\2\2\u06fd\u06ff"+ - "\5\u0162\u00b2\2\u06fe\u06fd\3\2\2\2\u06fe\u06ff\3\2\2\2\u06ff\u0161\3"+ - "\2\2\2\u0700\u0701\t\24\2\2\u0701\u0163\3\2\2\2\u0702\u0704\7\u0089\2"+ - "\2\u0703\u0702\3\2\2\2\u0703\u0704\3\2\2\2\u0704\u0705\3\2\2\2\u0705\u0706"+ - "\5\u012c\u0097\2\u0706\u0165\3\2\2\2\u0707\u0708\7l\2\2\u0708\u0709\5"+ - "\u00a4S\2\u0709\u070a\7m\2\2\u070a\u0167\3\2\2\2\u070b\u070c\7r\2\2\u070c"+ - "\u070d\7h\2\2\u070d\u070e\5\u00c2b\2\u070e\u070f\7i\2\2\u070f\u0169\3"+ - "\2\2\2\u0710\u071f\7h\2\2\u0711\u0718\5\u00e6t\2\u0712\u0715\5\u0146\u00a4"+ - "\2\u0713\u0714\7o\2\2\u0714\u0716\5\u00e6t\2\u0715\u0713\3\2\2\2\u0715"+ - "\u0716\3\2\2\2\u0716\u0718\3\2\2\2\u0717\u0711\3\2\2\2\u0717\u0712\3\2"+ - "\2\2\u0718\u071a\3\2\2\2\u0719\u071b\7v\2\2\u071a\u0719\3\2\2\2\u071a"+ - "\u071b\3\2\2\2\u071b\u071d\3\2\2\2\u071c\u071e\7o\2\2\u071d\u071c\3\2"+ - "\2\2\u071d\u071e\3\2\2\2\u071e\u0720\3\2\2\2\u071f\u0717\3\2\2\2\u071f"+ - "\u0720\3\2\2\2\u0720\u0721\3\2\2\2\u0721\u0722\7i\2\2\u0722\u016b\3\2"+ - "\2\2\u0723\u0724\5\u0146\u00a4\2\u0724\u0725\7r\2\2\u0725\u0726\7g\2\2"+ - "\u0726\u016d\3\2\2\2\u0727\u0728\5\u00c2b\2\u0728\u016f\3\2\2\2\u0729"+ - "\u072e\7p\2\2\u072a\u072e\7\2\2\3\u072b\u072e\7\u00a1\2\2\u072c\u072e"+ - "\6\u00b9\24\2\u072d\u0729\3\2\2\2\u072d\u072a\3\2\2\2\u072d\u072b\3\2"+ - "\2\2\u072d\u072c\3\2\2\2\u072e\u0171\3\2\2\2\u00bd\u0180\u0185\u018c\u0196"+ - "\u019c\u01a2\u01b2\u01b6\u01bf\u01cb\u01cf\u01d5\u01de\u01e8\u01f9\u0207"+ - "\u020b\u0212\u021a\u0223\u0243\u024b\u0263\u0276\u0285\u0292\u029b\u02a9"+ - "\u02b2\u02be\u02d3\u02da\u02df\u02e4\u02ee\u02f1\u02f5\u02f9\u0301\u0309"+ - "\u030e\u0316\u0318\u031d\u0324\u032c\u032f\u0335\u033a\u033c\u033f\u0346"+ - "\u034b\u035e\u0366\u036a\u036d\u0373\u0377\u037a\u0384\u038b\u0392\u039e"+ - "\u03a4\u03ab\u03b0\u03b6\u03c2\u03c8\u03cc\u03d4\u03d8\u03de\u03e1\u03e7"+ - "\u03ec\u0405\u0428\u042a\u0441\u0449\u0454\u045b\u0462\u046c\u047a\u0490"+ - "\u0492\u049a\u049e\u04a2\u04a5\u04ae\u04b4\u04be\u04c6\u04cc\u04d5\u04e0"+ - "\u04eb\u04ef\u04f1\u04fc\u0505\u0509\u050c\u0513\u051e\u0528\u052e\u0530"+ - "\u053a\u0544\u0548\u054c\u0550\u0557\u055f\u056a\u056e\u0572\u057e\u0582"+ - "\u0586\u058b\u0592\u0599\u05ad\u05b1\u05b5\u05b9\u05c9\u05cf\u05d1\u05d5"+ - "\u05d9\u05dc\u05e0\u05e2\u05e8\u05f0\u05f5\u0600\u0606\u060d\u0618\u061d"+ - "\u0621\u0626\u062a\u0632\u063a\u063f\u0642\u064a\u0652\u0657\u065b\u065f"+ - "\u0666\u0683\u068e\u0692\u069a\u069e\u06a0\u06a8\u06b1\u06b9\u06be\u06ce"+ - "\u06d0\u06d9\u06df\u06e5\u06e9\u06f2\u06fb\u06fe\u0703\u0715\u0717\u071a"+ - "\u071d\u071f\u072d"; + "\u0004\u0001\u00a0\u074c\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ + "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ + "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ + "\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007"+ + "\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007"+ + "\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007"+ + "\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007"+ + "\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007"+ + "\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007"+ + "\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007"+ + "\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007"+ + "\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007"+ + ",\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u0007"+ + "1\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u0007"+ + "6\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007"+ + ";\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007"+ + "@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007"+ + "E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007"+ + "J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007"+ + "O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007"+ + "T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007"+ + "Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007"+ + "^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007b\u0002c\u0007"+ + "c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007g\u0002h\u0007"+ + "h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007l\u0002m\u0007"+ + "m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007q\u0002r\u0007"+ + "r\u0002s\u0007s\u0002t\u0007t\u0002u\u0007u\u0002v\u0007v\u0002w\u0007"+ + "w\u0002x\u0007x\u0002y\u0007y\u0002z\u0007z\u0002{\u0007{\u0002|\u0007"+ + "|\u0002}\u0007}\u0002~\u0007~\u0002\u007f\u0007\u007f\u0002\u0080\u0007"+ + "\u0080\u0002\u0081\u0007\u0081\u0002\u0082\u0007\u0082\u0002\u0083\u0007"+ + "\u0083\u0002\u0084\u0007\u0084\u0002\u0085\u0007\u0085\u0002\u0086\u0007"+ + "\u0086\u0002\u0087\u0007\u0087\u0002\u0088\u0007\u0088\u0002\u0089\u0007"+ + "\u0089\u0002\u008a\u0007\u008a\u0002\u008b\u0007\u008b\u0002\u008c\u0007"+ + "\u008c\u0002\u008d\u0007\u008d\u0002\u008e\u0007\u008e\u0002\u008f\u0007"+ + "\u008f\u0002\u0090\u0007\u0090\u0002\u0091\u0007\u0091\u0002\u0092\u0007"+ + "\u0092\u0002\u0093\u0007\u0093\u0002\u0094\u0007\u0094\u0002\u0095\u0007"+ + "\u0095\u0002\u0096\u0007\u0096\u0002\u0097\u0007\u0097\u0002\u0098\u0007"+ + "\u0098\u0002\u0099\u0007\u0099\u0002\u009a\u0007\u009a\u0002\u009b\u0007"+ + "\u009b\u0002\u009c\u0007\u009c\u0002\u009d\u0007\u009d\u0002\u009e\u0007"+ + "\u009e\u0002\u009f\u0007\u009f\u0002\u00a0\u0007\u00a0\u0002\u00a1\u0007"+ + "\u00a1\u0002\u00a2\u0007\u00a2\u0002\u00a3\u0007\u00a3\u0002\u00a4\u0007"+ + "\u00a4\u0002\u00a5\u0007\u00a5\u0002\u00a6\u0007\u00a6\u0002\u00a7\u0007"+ + "\u00a7\u0002\u00a8\u0007\u00a8\u0002\u00a9\u0007\u00a9\u0002\u00aa\u0007"+ + "\u00aa\u0002\u00ab\u0007\u00ab\u0002\u00ac\u0007\u00ac\u0002\u00ad\u0007"+ + "\u00ad\u0002\u00ae\u0007\u00ae\u0002\u00af\u0007\u00af\u0002\u00b0\u0007"+ + "\u00b0\u0002\u00b1\u0007\u00b1\u0002\u00b2\u0007\u00b2\u0002\u00b3\u0007"+ + "\u00b3\u0002\u00b4\u0007\u00b4\u0002\u00b5\u0007\u00b5\u0002\u00b6\u0007"+ + "\u00b6\u0002\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u017f"+ + "\b\u0003\n\u0003\f\u0003\u0182\t\u0003\u0001\u0004\u0001\u0004\u0003\u0004"+ + "\u0186\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u018b\b"+ + "\u0005\n\u0005\f\u0005\u018e\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0005\u0005\u0195\b\u0005\n\u0005\f\u0005\u0198"+ + "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u019d\b\u0005"+ + "\u0001\u0005\u0001\u0005\u0005\u0005\u01a1\b\u0005\n\u0005\f\u0005\u01a4"+ + "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0005"+ + "\u0006\u01ab\b\u0006\n\u0006\f\u0006\u01ae\t\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u01b5\b\u0006\n\u0006"+ + "\f\u0006\u01b8\t\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+ + "\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01c3\b\t\n\t\f\t\u01c6\t\t"+ + "\u0001\t\u0003\t\u01c9\b\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0005"+ + "\n\u01d0\b\n\n\n\f\n\u01d3\t\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n"+ + "\u0001\n\u0001\n\u0005\n\u01dc\b\n\n\n\f\n\u01df\t\n\u0001\n\u0003\n\u01e2"+ + "\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u01e8"+ + "\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0003"+ + "\f\u01f1\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u01fb\b\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0003\u0010\u020c\b\u0010\u0001\u0011\u0001\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0005\u0013\u0218\b\u0013\n\u0013\f\u0013\u021b\t\u0013"+ + "\u0001\u0013\u0003\u0013\u021e\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0005\u0014\u0223\b\u0014\n\u0014\f\u0014\u0226\t\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0015\u0005\u0015\u022b\b\u0015\n\u0015\f\u0015\u022e\t\u0015"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0234\b\u0016"+ + "\n\u0016\f\u0016\u0237\t\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ + "\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0003\u001c\u0256\b\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0003\u001d\u025e\b\u001d\u0001"+ + "\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!"+ + "\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0003\"\u0276\b\"\u0001"+ + "\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001"+ + "$\u0001$\u0001$\u0001$\u0001$\u0005$\u0287\b$\n$\f$\u028a\t$\u0001$\u0001"+ + "$\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0005&\u0296"+ + "\b&\n&\f&\u0299\t&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "(\u0001(\u0001(\u0001(\u0003(\u02a5\b(\u0001)\u0001)\u0001)\u0001)\u0001"+ + ")\u0005)\u02ac\b)\n)\f)\u02af\t)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0003*\u02bc\b*\u0001+\u0001+\u0001"+ + "+\u0001+\u0001+\u0005+\u02c3\b+\n+\f+\u02c6\t+\u0001+\u0001+\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0005,\u02cf\b,\n,\f,\u02d2\t,\u0001,\u0001,\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u02e6\b.\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0003/\u02ed\b/\u0001/\u0005/\u02f0\b/\n/\f/\u02f3\t/"+ + "\u0001/\u0001/\u0003/\u02f7\b/\u00010\u00010\u00010\u00010\u00010\u0001"+ + "0\u00010\u00010\u00030\u0301\b0\u00011\u00031\u0304\b1\u00011\u00011\u0003"+ + "1\u0308\b1\u00012\u00012\u00032\u030c\b2\u00013\u00013\u00013\u00013\u0005"+ + "3\u0312\b3\n3\f3\u0315\t3\u00013\u00013\u00014\u00014\u00014\u00034\u031c"+ + "\b4\u00015\u00015\u00015\u00035\u0321\b5\u00016\u00016\u00016\u00016\u0001"+ + "6\u00016\u00036\u0329\b6\u00036\u032b\b6\u00016\u00016\u00016\u00036\u0330"+ + "\b6\u00017\u00017\u00017\u00057\u0335\b7\n7\f7\u0338\t7\u00018\u00018"+ + "\u00018\u00018\u00018\u00038\u033f\b8\u00018\u00038\u0342\b8\u00018\u0001"+ + "8\u00019\u00019\u00039\u0348\b9\u00019\u00019\u00019\u00039\u034d\b9\u0003"+ + "9\u034f\b9\u00019\u00039\u0352\b9\u0001:\u0001:\u0001:\u0005:\u0357\b"+ + ":\n:\f:\u035a\t:\u0001;\u0001;\u0003;\u035e\b;\u0001;\u0001;\u0001<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ + "=\u0001=\u0005=\u036f\b=\n=\f=\u0372\t=\u0001=\u0001=\u0001=\u0005=\u0377"+ + "\b=\n=\f=\u037a\t=\u0001=\u0003=\u037d\b=\u0001>\u0003>\u0380\b>\u0001"+ + ">\u0001>\u0001>\u0001>\u0003>\u0386\b>\u0001?\u0001?\u0003?\u038a\b?\u0001"+ + "?\u0003?\u038d\b?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0003@\u0397\b@\u0001A\u0001A\u0001A\u0001A\u0001A\u0003A\u039e\bA\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0003B\u03a5\bB\u0001B\u0001B\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0003D\u03b1\bD\u0001E\u0001"+ + "E\u0001E\u0001E\u0003E\u03b7\bE\u0001F\u0001F\u0001F\u0001F\u0001F\u0003"+ + "F\u03be\bF\u0001G\u0001G\u0001G\u0003G\u03c3\bG\u0001H\u0001H\u0001H\u0001"+ + "H\u0003H\u03c9\bH\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001"+ + "J\u0001J\u0001J\u0003J\u03d5\bJ\u0001K\u0001K\u0001K\u0001K\u0003K\u03db"+ + "\bK\u0001K\u0001K\u0003K\u03df\bK\u0001L\u0001L\u0001L\u0001L\u0001M\u0001"+ + "M\u0003M\u03e7\bM\u0001M\u0001M\u0003M\u03eb\bM\u0001M\u0001M\u0001N\u0001"+ + "N\u0003N\u03f1\bN\u0001O\u0003O\u03f4\bO\u0001O\u0001O\u0001P\u0001P\u0003"+ + "P\u03fa\bP\u0001P\u0001P\u0001Q\u0003Q\u03ff\bQ\u0001Q\u0001Q\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0003"+ + "R\u0418\bR\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0005R\u043b\bR\nR\fR\u043e\tR\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0003S\u0454"+ + "\bS\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0003U\u045c\bU\u0001V\u0001"+ + "V\u0001V\u0001W\u0001W\u0001W\u0001W\u0005W\u0465\bW\nW\fW\u0468\tW\u0001"+ + "W\u0001W\u0001W\u0001W\u0003W\u046e\bW\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0003X\u0475\bX\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Y\u0003Y\u047f\bY\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003Z\u048d\bZ\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0005Z\u04a3\bZ\nZ\fZ\u04a6"+ + "\tZ\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0003\\\u04ad\b\\\u0001\\\u0001"+ + "\\\u0003\\\u04b1\b\\\u0001]\u0001]\u0003]\u04b5\b]\u0001]\u0003]\u04b8"+ + "\b]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0003^\u04c1\b^\u0001"+ + "^\u0001^\u0005^\u04c5\b^\n^\f^\u04c8\t^\u0001^\u0001^\u0001_\u0001_\u0001"+ + "_\u0001_\u0001`\u0003`\u04d1\b`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ + "`\u0003`\u04d9\b`\u0001`\u0001`\u0001`\u0001`\u0003`\u04df\b`\u0001a\u0001"+ + "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0003a\u04e8\ba\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003b\u04f3\bb\u0001c\u0001"+ + "c\u0001c\u0001d\u0001d\u0001d\u0001d\u0005d\u04fc\bd\nd\fd\u04ff\td\u0001"+ + "d\u0003d\u0502\bd\u0003d\u0504\bd\u0001d\u0001d\u0001e\u0001e\u0001e\u0001"+ + "e\u0001e\u0001e\u0001e\u0003e\u050f\be\u0001f\u0001f\u0001f\u0001f\u0001"+ + "f\u0001g\u0001g\u0003g\u0518\bg\u0001g\u0001g\u0003g\u051c\bg\u0001g\u0003"+ + "g\u051f\bg\u0001g\u0001g\u0001g\u0001g\u0001g\u0003g\u0526\bg\u0001g\u0001"+ + "g\u0001h\u0001h\u0001i\u0001i\u0001j\u0001j\u0001k\u0003k\u0531\bk\u0001"+ + "k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0003l\u053b\bl\u0001"+ + "l\u0001l\u0001l\u0001l\u0003l\u0541\bl\u0003l\u0543\bl\u0001m\u0001m\u0001"+ + "m\u0001n\u0001n\u0001o\u0001o\u0001o\u0003o\u054d\bo\u0001p\u0001p\u0001"+ + "p\u0001p\u0001p\u0001p\u0005p\u0555\bp\np\fp\u0558\tp\u0001p\u0003p\u055b"+ + "\bp\u0001q\u0001q\u0003q\u055f\bq\u0001q\u0001q\u0003q\u0563\bq\u0001"+ + "r\u0001r\u0001r\u0005r\u0568\br\nr\fr\u056b\tr\u0001s\u0001s\u0001s\u0005"+ + "s\u0570\bs\ns\fs\u0573\ts\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0005"+ + "t\u057b\bt\nt\ft\u057e\tt\u0001t\u0003t\u0581\bt\u0001u\u0001u\u0003u"+ + "\u0585\bu\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001v\u0001v\u0005"+ + "v\u058f\bv\nv\fv\u0592\tv\u0001v\u0003v\u0595\bv\u0001w\u0001w\u0003w"+ + "\u0599\bw\u0001w\u0001w\u0001x\u0003x\u059e\bx\u0001x\u0003x\u05a1\bx"+ + "\u0001x\u0003x\u05a4\bx\u0001x\u0001x\u0001x\u0004x\u05a9\bx\u000bx\f"+ + "x\u05aa\u0001y\u0001y\u0001y\u0001y\u0001y\u0003y\u05b2\by\u0001z\u0001"+ + "z\u0001{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001}\u0001}\u0001"+ + "}\u0001}\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f\u0003\u007f"+ + "\u05c6\b\u007f\u0001\u0080\u0001\u0080\u0003\u0080\u05ca\b\u0080\u0001"+ + "\u0081\u0001\u0081\u0003\u0081\u05ce\b\u0081\u0001\u0082\u0001\u0082\u0003"+ + "\u0082\u05d2\b\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001"+ + "\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ + "\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0003\u0085\u05e2\b\u0085\u0001"+ + "\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0003\u0085\u05e8\b\u0085\u0003"+ + "\u0085\u05ea\b\u0085\u0001\u0086\u0001\u0086\u0003\u0086\u05ee\b\u0086"+ + "\u0001\u0087\u0001\u0087\u0003\u0087\u05f2\b\u0087\u0001\u0087\u0003\u0087"+ + "\u05f5\b\u0087\u0001\u0087\u0001\u0087\u0003\u0087\u05f9\b\u0087\u0003"+ + "\u0087\u05fb\b\u0087\u0001\u0087\u0001\u0087\u0005\u0087\u05ff\b\u0087"+ + "\n\u0087\f\u0087\u0602\t\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ + "\u0088\u0001\u0088\u0003\u0088\u0609\b\u0088\u0001\u0089\u0001\u0089\u0001"+ + "\u0089\u0003\u0089\u060e\b\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+ + "\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0003"+ + "\u008a\u0619\b\u008a\u0001\u008a\u0001\u008a\u0005\u008a\u061d\b\u008a"+ + "\n\u008a\f\u008a\u0620\t\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001"+ + "\u008b\u0003\u008b\u0626\b\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001"+ + "\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0003"+ + "\u008c\u0631\b\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0003\u008d\u0636"+ + "\b\u008d\u0001\u008e\u0001\u008e\u0003\u008e\u063a\b\u008e\u0001\u008e"+ + "\u0001\u008e\u0001\u008e\u0003\u008e\u063f\b\u008e\u0005\u008e\u0641\b"+ + "\u008e\n\u008e\f\u008e\u0644\t\u008e\u0001\u008f\u0001\u008f\u0001\u008f"+ + "\u0005\u008f\u0649\b\u008f\n\u008f\f\u008f\u064c\t\u008f\u0001\u008f\u0001"+ + "\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u0653\b\u0090\u0001"+ + "\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u0658\b\u0091\u0001\u0091\u0003"+ + "\u0091\u065b\b\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001"+ + "\u0092\u0001\u0092\u0003\u0092\u0663\b\u0092\u0001\u0092\u0001\u0092\u0001"+ + "\u0093\u0001\u0093\u0003\u0093\u0669\b\u0093\u0001\u0093\u0001\u0093\u0003"+ + "\u0093\u066d\b\u0093\u0003\u0093\u066f\b\u0093\u0001\u0093\u0001\u0093"+ + "\u0001\u0094\u0003\u0094\u0674\b\u0094\u0001\u0094\u0001\u0094\u0003\u0094"+ + "\u0678\b\u0094\u0001\u0094\u0001\u0094\u0003\u0094\u067c\b\u0094\u0001"+ + "\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0003\u0096\u0683"+ + "\b\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ + "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001"+ + "\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001"+ + "\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001"+ + "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0003\u009d\u06a0\b\u009d\u0001"+ + "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001"+ + "\u009f\u0001\u009f\u0001\u009f\u0003\u009f\u06ab\b\u009f\u0001\u00a0\u0001"+ + "\u00a0\u0003\u00a0\u06af\b\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ + "\u00a1\u0005\u00a1\u06b5\b\u00a1\n\u00a1\f\u00a1\u06b8\t\u00a1\u0001\u00a1"+ + "\u0003\u00a1\u06bb\b\u00a1\u0003\u00a1\u06bd\b\u00a1\u0001\u00a1\u0001"+ + "\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0003\u00a2\u06c5"+ + "\b\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ + "\u00a3\u0001\u00a3\u0003\u00a3\u06ce\b\u00a3\u0001\u00a4\u0001\u00a4\u0001"+ + "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0003\u00a4\u06d6\b\u00a4\u0001"+ + "\u00a5\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06db\b\u00a5\u0001\u00a6\u0001"+ + "\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001"+ + "\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001"+ + "\u00aa\u0003\u00aa\u06eb\b\u00aa\u0003\u00aa\u06ed\b\u00aa\u0001\u00aa"+ + "\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0005\u00ab\u06f4\b\u00ab"+ + "\n\u00ab\f\u00ab\u06f7\t\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0003"+ + "\u00ac\u06fc\b\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0003"+ + "\u00ad\u0702\b\u00ad\u0001\u00ae\u0001\u00ae\u0003\u00ae\u0706\b\u00ae"+ + "\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0005\u00af"+ + "\u070d\b\u00af\n\u00af\f\u00af\u0710\t\u00af\u0001\u00af\u0001\u00af\u0001"+ + "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0003\u00b0\u0718\b\u00b0\u0001"+ + "\u00b0\u0003\u00b0\u071b\b\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0003"+ + "\u00b2\u0720\b\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001"+ + "\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001"+ + "\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0003"+ + "\u00b5\u0732\b\u00b5\u0003\u00b5\u0734\b\u00b5\u0001\u00b5\u0003\u00b5"+ + "\u0737\b\u00b5\u0001\u00b5\u0003\u00b5\u073a\b\u00b5\u0003\u00b5\u073c"+ + "\b\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001"+ + "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001"+ + "\u00b8\u0003\u00b8\u074a\b\u00b8\u0001\u00b8\u0001\u02f1\u0002\u00a4\u00b4"+ + "\u00b9\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ + "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ + "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+ + "\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0"+ + "\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8"+ + "\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0"+ + "\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8"+ + "\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110"+ + "\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128"+ + "\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140"+ + "\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158"+ + "\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170"+ + "\u0000\u0013\u0002\u0000eepp\u0001\u0000\u0017\u0018\u0001\u0000\u0005"+ + "\b\u0001\u0000AB\u0001\u0000(*\u0002\u0000(*,,\u0001\u0000\u0083\u0089"+ + "\u0001\u0000\u0014\u0015\u0002\u0000~\u0082\u0087\u0088\u0004\u0000##"+ + "qq}}\u0084\u0086\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000"+ + "HIw|\u0004\u0000--0033]]\u0002\u0000}\u0082\u0084\u0088\u0001\u0000qr"+ + "\u0002\u0000nn\u009f\u009f\u0002\u0000\u008a\u008d\u008f\u0090\u0001\u0000"+ + "\u0096\u0097\u07b5\u0000\u0172\u0001\u0000\u0000\u0000\u0002\u0175\u0001"+ + "\u0000\u0000\u0000\u0004\u0178\u0001\u0000\u0000\u0000\u0006\u017b\u0001"+ + "\u0000\u0000\u0000\b\u0183\u0001\u0000\u0000\u0000\n\u018c\u0001\u0000"+ + "\u0000\u0000\f\u01ac\u0001\u0000\u0000\u0000\u000e\u01b9\u0001\u0000\u0000"+ + "\u0000\u0010\u01bc\u0001\u0000\u0000\u0000\u0012\u01c4\u0001\u0000\u0000"+ + "\u0000\u0014\u01d1\u0001\u0000\u0000\u0000\u0016\u01e7\u0001\u0000\u0000"+ + "\u0000\u0018\u01f0\u0001\u0000\u0000\u0000\u001a\u01f2\u0001\u0000\u0000"+ + "\u0000\u001c\u01f4\u0001\u0000\u0000\u0000\u001e\u01f7\u0001\u0000\u0000"+ + "\u0000 \u020b\u0001\u0000\u0000\u0000\"\u020d\u0001\u0000\u0000\u0000"+ + "$\u020f\u0001\u0000\u0000\u0000&\u0214\u0001\u0000\u0000\u0000(\u021f"+ + "\u0001\u0000\u0000\u0000*\u022c\u0001\u0000\u0000\u0000,\u022f\u0001\u0000"+ + "\u0000\u0000.\u023a\u0001\u0000\u0000\u00000\u023c\u0001\u0000\u0000\u0000"+ + "2\u0241\u0001\u0000\u0000\u00004\u0246\u0001\u0000\u0000\u00006\u024b"+ + "\u0001\u0000\u0000\u00008\u0250\u0001\u0000\u0000\u0000:\u025d\u0001\u0000"+ + "\u0000\u0000<\u025f\u0001\u0000\u0000\u0000>\u0261\u0001\u0000\u0000\u0000"+ + "@\u0266\u0001\u0000\u0000\u0000B\u026b\u0001\u0000\u0000\u0000D\u0270"+ + "\u0001\u0000\u0000\u0000F\u0279\u0001\u0000\u0000\u0000H\u0280\u0001\u0000"+ + "\u0000\u0000J\u028d\u0001\u0000\u0000\u0000L\u0291\u0001\u0000\u0000\u0000"+ + "N\u029c\u0001\u0000\u0000\u0000P\u02a4\u0001\u0000\u0000\u0000R\u02a6"+ + "\u0001\u0000\u0000\u0000T\u02bb\u0001\u0000\u0000\u0000V\u02bd\u0001\u0000"+ + "\u0000\u0000X\u02c9\u0001\u0000\u0000\u0000Z\u02d5\u0001\u0000\u0000\u0000"+ + "\\\u02e5\u0001\u0000\u0000\u0000^\u02f1\u0001\u0000\u0000\u0000`\u0300"+ + "\u0001\u0000\u0000\u0000b\u0303\u0001\u0000\u0000\u0000d\u030b\u0001\u0000"+ + "\u0000\u0000f\u030d\u0001\u0000\u0000\u0000h\u0318\u0001\u0000\u0000\u0000"+ + "j\u0320\u0001\u0000\u0000\u0000l\u032f\u0001\u0000\u0000\u0000n\u0331"+ + "\u0001\u0000\u0000\u0000p\u0339\u0001\u0000\u0000\u0000r\u0347\u0001\u0000"+ + "\u0000\u0000t\u0353\u0001\u0000\u0000\u0000v\u035d\u0001\u0000\u0000\u0000"+ + "x\u0361\u0001\u0000\u0000\u0000z\u0367\u0001\u0000\u0000\u0000|\u037f"+ + "\u0001\u0000\u0000\u0000~\u0387\u0001\u0000\u0000\u0000\u0080\u0396\u0001"+ + "\u0000\u0000\u0000\u0082\u0398\u0001\u0000\u0000\u0000\u0084\u039f\u0001"+ + "\u0000\u0000\u0000\u0086\u03a8\u0001\u0000\u0000\u0000\u0088\u03ad\u0001"+ + "\u0000\u0000\u0000\u008a\u03b2\u0001\u0000\u0000\u0000\u008c\u03b8\u0001"+ + "\u0000\u0000\u0000\u008e\u03bf\u0001\u0000\u0000\u0000\u0090\u03c4\u0001"+ + "\u0000\u0000\u0000\u0092\u03ca\u0001\u0000\u0000\u0000\u0094\u03cf\u0001"+ + "\u0000\u0000\u0000\u0096\u03d6\u0001\u0000\u0000\u0000\u0098\u03e0\u0001"+ + "\u0000\u0000\u0000\u009a\u03e4\u0001\u0000\u0000\u0000\u009c\u03f0\u0001"+ + "\u0000\u0000\u0000\u009e\u03f3\u0001\u0000\u0000\u0000\u00a0\u03f7\u0001"+ + "\u0000\u0000\u0000\u00a2\u03fe\u0001\u0000\u0000\u0000\u00a4\u0417\u0001"+ + "\u0000\u0000\u0000\u00a6\u0453\u0001\u0000\u0000\u0000\u00a8\u0455\u0001"+ + "\u0000\u0000\u0000\u00aa\u0458\u0001\u0000\u0000\u0000\u00ac\u045d\u0001"+ + "\u0000\u0000\u0000\u00ae\u0466\u0001\u0000\u0000\u0000\u00b0\u0474\u0001"+ + "\u0000\u0000\u0000\u00b2\u047e\u0001\u0000\u0000\u0000\u00b4\u048c\u0001"+ + "\u0000\u0000\u0000\u00b6\u04a7\u0001\u0000\u0000\u0000\u00b8\u04aa\u0001"+ + "\u0000\u0000\u0000\u00ba\u04b2\u0001\u0000\u0000\u0000\u00bc\u04bb\u0001"+ + "\u0000\u0000\u0000\u00be\u04cb\u0001\u0000\u0000\u0000\u00c0\u04de\u0001"+ + "\u0000\u0000\u0000\u00c2\u04e7\u0001\u0000\u0000\u0000\u00c4\u04f2\u0001"+ + "\u0000\u0000\u0000\u00c6\u04f4\u0001\u0000\u0000\u0000\u00c8\u04f7\u0001"+ + "\u0000\u0000\u0000\u00ca\u050e\u0001\u0000\u0000\u0000\u00cc\u0510\u0001"+ + "\u0000\u0000\u0000\u00ce\u0515\u0001\u0000\u0000\u0000\u00d0\u0529\u0001"+ + "\u0000\u0000\u0000\u00d2\u052b\u0001\u0000\u0000\u0000\u00d4\u052d\u0001"+ + "\u0000\u0000\u0000\u00d6\u0530\u0001\u0000\u0000\u0000\u00d8\u053a\u0001"+ + "\u0000\u0000\u0000\u00da\u0544\u0001\u0000\u0000\u0000\u00dc\u0547\u0001"+ + "\u0000\u0000\u0000\u00de\u054c\u0001\u0000\u0000\u0000\u00e0\u054e\u0001"+ + "\u0000\u0000\u0000\u00e2\u055c\u0001\u0000\u0000\u0000\u00e4\u0564\u0001"+ + "\u0000\u0000\u0000\u00e6\u056c\u0001\u0000\u0000\u0000\u00e8\u0574\u0001"+ + "\u0000\u0000\u0000\u00ea\u0582\u0001\u0000\u0000\u0000\u00ec\u0588\u0001"+ + "\u0000\u0000\u0000\u00ee\u0596\u0001\u0000\u0000\u0000\u00f0\u05a8\u0001"+ + "\u0000\u0000\u0000\u00f2\u05b1\u0001\u0000\u0000\u0000\u00f4\u05b3\u0001"+ + "\u0000\u0000\u0000\u00f6\u05b5\u0001\u0000\u0000\u0000\u00f8\u05b9\u0001"+ + "\u0000\u0000\u0000\u00fa\u05bc\u0001\u0000\u0000\u0000\u00fc\u05c0\u0001"+ + "\u0000\u0000\u0000\u00fe\u05c2\u0001\u0000\u0000\u0000\u0100\u05c7\u0001"+ + "\u0000\u0000\u0000\u0102\u05cb\u0001\u0000\u0000\u0000\u0104\u05cf\u0001"+ + "\u0000\u0000\u0000\u0106\u05d3\u0001\u0000\u0000\u0000\u0108\u05d6\u0001"+ + "\u0000\u0000\u0000\u010a\u05d8\u0001\u0000\u0000\u0000\u010c\u05ed\u0001"+ + "\u0000\u0000\u0000\u010e\u05ef\u0001\u0000\u0000\u0000\u0110\u0605\u0001"+ + "\u0000\u0000\u0000\u0112\u060d\u0001\u0000\u0000\u0000\u0114\u060f\u0001"+ + "\u0000\u0000\u0000\u0116\u0625\u0001\u0000\u0000\u0000\u0118\u062d\u0001"+ + "\u0000\u0000\u0000\u011a\u0635\u0001\u0000\u0000\u0000\u011c\u0639\u0001"+ + "\u0000\u0000\u0000\u011e\u0645\u0001\u0000\u0000\u0000\u0120\u064f\u0001"+ + "\u0000\u0000\u0000\u0122\u065a\u0001\u0000\u0000\u0000\u0124\u0662\u0001"+ + "\u0000\u0000\u0000\u0126\u0666\u0001\u0000\u0000\u0000\u0128\u0673\u0001"+ + "\u0000\u0000\u0000\u012a\u067d\u0001\u0000\u0000\u0000\u012c\u0682\u0001"+ + "\u0000\u0000\u0000\u012e\u0684\u0001\u0000\u0000\u0000\u0130\u0689\u0001"+ + "\u0000\u0000\u0000\u0132\u068b\u0001\u0000\u0000\u0000\u0134\u068d\u0001"+ + "\u0000\u0000\u0000\u0136\u0690\u0001\u0000\u0000\u0000\u0138\u0694\u0001"+ + "\u0000\u0000\u0000\u013a\u069f\u0001\u0000\u0000\u0000\u013c\u06a3\u0001"+ + "\u0000\u0000\u0000\u013e\u06aa\u0001\u0000\u0000\u0000\u0140\u06ae\u0001"+ + "\u0000\u0000\u0000\u0142\u06b0\u0001\u0000\u0000\u0000\u0144\u06c0\u0001"+ + "\u0000\u0000\u0000\u0146\u06cd\u0001\u0000\u0000\u0000\u0148\u06d5\u0001"+ + "\u0000\u0000\u0000\u014a\u06da\u0001\u0000\u0000\u0000\u014c\u06dc\u0001"+ + "\u0000\u0000\u0000\u014e\u06de\u0001\u0000\u0000\u0000\u0150\u06e0\u0001"+ + "\u0000\u0000\u0000\u0152\u06e4\u0001\u0000\u0000\u0000\u0154\u06e7\u0001"+ + "\u0000\u0000\u0000\u0156\u06f0\u0001\u0000\u0000\u0000\u0158\u06fb\u0001"+ + "\u0000\u0000\u0000\u015a\u0701\u0001\u0000\u0000\u0000\u015c\u0705\u0001"+ + "\u0000\u0000\u0000\u015e\u0707\u0001\u0000\u0000\u0000\u0160\u0717\u0001"+ + "\u0000\u0000\u0000\u0162\u071c\u0001\u0000\u0000\u0000\u0164\u071f\u0001"+ + "\u0000\u0000\u0000\u0166\u0723\u0001\u0000\u0000\u0000\u0168\u0727\u0001"+ + "\u0000\u0000\u0000\u016a\u072c\u0001\u0000\u0000\u0000\u016c\u073f\u0001"+ + "\u0000\u0000\u0000\u016e\u0743\u0001\u0000\u0000\u0000\u0170\u0749\u0001"+ + "\u0000\u0000\u0000\u0172\u0173\u0003\u00a4R\u0000\u0173\u0174\u0005\u0000"+ + "\u0000\u0001\u0174\u0001\u0001\u0000\u0000\u0000\u0175\u0176\u0003\u00a6"+ + "S\u0000\u0176\u0177\u0005\u0000\u0000\u0001\u0177\u0003\u0001\u0000\u0000"+ + "\u0000\u0178\u0179\u0003\u00c2a\u0000\u0179\u017a\u0005\u0000\u0000\u0001"+ + "\u017a\u0005\u0001\u0000\u0000\u0000\u017b\u0180\u0003\b\u0004\u0000\u017c"+ + "\u017d\u0005m\u0000\u0000\u017d\u017f\u0003\b\u0004\u0000\u017e\u017c"+ + "\u0001\u0000\u0000\u0000\u017f\u0182\u0001\u0000\u0000\u0000\u0180\u017e"+ + "\u0001\u0000\u0000\u0000\u0180\u0181\u0001\u0000\u0000\u0000\u0181\u0007"+ + "\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0183\u0185"+ + "\u0005e\u0000\u0000\u0184\u0186\u0005<\u0000\u0000\u0185\u0184\u0001\u0000"+ + "\u0000\u0000\u0185\u0186\u0001\u0000\u0000\u0000\u0186\t\u0001\u0000\u0000"+ + "\u0000\u0187\u0188\u0003\u000e\u0007\u0000\u0188\u0189\u0003\u0170\u00b8"+ + "\u0000\u0189\u018b\u0001\u0000\u0000\u0000\u018a\u0187\u0001\u0000\u0000"+ + "\u0000\u018b\u018e\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000\u0000"+ + "\u0000\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u018f\u0001\u0000\u0000"+ + "\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018f\u0190\u0003\u00dam\u0000"+ + "\u0190\u0196\u0003\u0170\u00b8\u0000\u0191\u0192\u0003\u0014\n\u0000\u0192"+ + "\u0193\u0003\u0170\u00b8\u0000\u0193\u0195\u0001\u0000\u0000\u0000\u0194"+ + "\u0191\u0001\u0000\u0000\u0000\u0195\u0198\u0001\u0000\u0000\u0000\u0196"+ + "\u0194\u0001\u0000\u0000\u0000\u0196\u0197\u0001\u0000\u0000\u0000\u0197"+ + "\u01a2\u0001\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0199"+ + "\u019d\u0003\u0088D\u0000\u019a\u019d\u0003\u00deo\u0000\u019b\u019d\u0003"+ + "\u0016\u000b\u0000\u019c\u0199\u0001\u0000\u0000\u0000\u019c\u019a\u0001"+ + "\u0000\u0000\u0000\u019c\u019b\u0001\u0000\u0000\u0000\u019d\u019e\u0001"+ + "\u0000\u0000\u0000\u019e\u019f\u0003\u0170\u00b8\u0000\u019f\u01a1\u0001"+ + "\u0000\u0000\u0000\u01a0\u019c\u0001\u0000\u0000\u0000\u01a1\u01a4\u0001"+ + "\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000\u0000\u0000\u01a2\u01a3\u0001"+ + "\u0000\u0000\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4\u01a2\u0001"+ + "\u0000\u0000\u0000\u01a5\u01a6\u0005\u0000\u0000\u0001\u01a6\u000b\u0001"+ + "\u0000\u0000\u0000\u01a7\u01a8\u0003\u000e\u0007\u0000\u01a8\u01a9\u0003"+ + "\u0170\u00b8\u0000\u01a9\u01ab\u0001\u0000\u0000\u0000\u01aa\u01a7\u0001"+ + "\u0000\u0000\u0000\u01ab\u01ae\u0001\u0000\u0000\u0000\u01ac\u01aa\u0001"+ + "\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000\u01ad\u01af\u0001"+ + "\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01af\u01b0\u0003"+ + "\u00dam\u0000\u01b0\u01b6\u0003\u0170\u00b8\u0000\u01b1\u01b2\u0003\u0014"+ + "\n\u0000\u01b2\u01b3\u0003\u0170\u00b8\u0000\u01b3\u01b5\u0001\u0000\u0000"+ + "\u0000\u01b4\u01b1\u0001\u0000\u0000\u0000\u01b5\u01b8\u0001\u0000\u0000"+ + "\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b6\u01b7\u0001\u0000\u0000"+ + "\u0000\u01b7\r\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000"+ + "\u01b9\u01ba\u0005E\u0000\u0000\u01ba\u01bb\u0003\u00a4R\u0000\u01bb\u000f"+ + "\u0001\u0000\u0000\u0000\u01bc\u01bd\u0005F\u0000\u0000\u01bd\u01be\u0003"+ + "\u00a4R\u0000\u01be\u0011\u0001\u0000\u0000\u0000\u01bf\u01c0\u0003\u0010"+ + "\b\u0000\u01c0\u01c1\u0003\u0170\u00b8\u0000\u01c1\u01c3\u0001\u0000\u0000"+ + "\u0000\u01c2\u01bf\u0001\u0000\u0000\u0000\u01c3\u01c6\u0001\u0000\u0000"+ + "\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c4\u01c5\u0001\u0000\u0000"+ + "\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6\u01c4\u0001\u0000\u0000"+ + "\u0000\u01c7\u01c9\u0007\u0000\u0000\u0000\u01c8\u01c7\u0001\u0000\u0000"+ + "\u0000\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9\u01ca\u0001\u0000\u0000"+ + "\u0000\u01ca\u01cb\u0003\u00dcn\u0000\u01cb\u0013\u0001\u0000\u0000\u0000"+ + "\u01cc\u01cd\u0003\u0010\b\u0000\u01cd\u01ce\u0003\u0170\u00b8\u0000\u01ce"+ + "\u01d0\u0001\u0000\u0000\u0000\u01cf\u01cc\u0001\u0000\u0000\u0000\u01d0"+ + "\u01d3\u0001\u0000\u0000\u0000\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1"+ + "\u01d2\u0001\u0000\u0000\u0000\u01d2\u01e1\u0001\u0000\u0000\u0000\u01d3"+ + "\u01d1\u0001\u0000\u0000\u0000\u01d4\u01d5\u0005a\u0000\u0000\u01d5\u01e2"+ + "\u0003\u0012\t\u0000\u01d6\u01d7\u0005a\u0000\u0000\u01d7\u01dd\u0005"+ + "f\u0000\u0000\u01d8\u01d9\u0003\u0012\t\u0000\u01d9\u01da\u0003\u0170"+ + "\u00b8\u0000\u01da\u01dc\u0001\u0000\u0000\u0000\u01db\u01d8\u0001\u0000"+ + "\u0000\u0000\u01dc\u01df\u0001\u0000\u0000\u0000\u01dd\u01db\u0001\u0000"+ + "\u0000\u0000\u01dd\u01de\u0001\u0000\u0000\u0000\u01de\u01e0\u0001\u0000"+ + "\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01e0\u01e2\u0005g\u0000"+ + "\u0000\u01e1\u01d4\u0001\u0000\u0000\u0000\u01e1\u01d6\u0001\u0000\u0000"+ + "\u0000\u01e2\u0015\u0001\u0000\u0000\u0000\u01e3\u01e8\u0003z=\u0000\u01e4"+ + "\u01e8\u0003\u0090H\u0000\u01e5\u01e8\u0003\u0094J\u0000\u01e6\u01e8\u0003"+ + "\u008eG\u0000\u01e7\u01e3\u0001\u0000\u0000\u0000\u01e7\u01e4\u0001\u0000"+ + "\u0000\u0000\u01e7\u01e5\u0001\u0000\u0000\u0000\u01e7\u01e6\u0001\u0000"+ + "\u0000\u0000\u01e8\u0017\u0001\u0000\u0000\u0000\u01e9\u01ea\u0005\u001b"+ + "\u0000\u0000\u01ea\u01f1\u0003\u00a6S\u0000\u01eb\u01ec\u0007\u0001\u0000"+ + "\u0000\u01ec\u01f1\u0003.\u0017\u0000\u01ed\u01ee\u0007\u0002\u0000\u0000"+ + "\u01ee\u01f1\u0003\u00a4R\u0000\u01ef\u01f1\u0003f3\u0000\u01f0\u01e9"+ + "\u0001\u0000\u0000\u0000\u01f0\u01eb\u0001\u0000\u0000\u0000\u01f0\u01ed"+ + "\u0001\u0000\u0000\u0000\u01f0\u01ef\u0001\u0000\u0000\u0000\u01f1\u0019"+ + "\u0001\u0000\u0000\u0000\u01f2\u01f3\u0003\u001c\u000e\u0000\u01f3\u001b"+ + "\u0001\u0000\u0000\u0000\u01f4\u01f5\u0003^/\u0000\u01f5\u01f6\u0003\u001e"+ + "\u000f\u0000\u01f6\u001d\u0001\u0000\u0000\u0000\u01f7\u01f8\u0005D\u0000"+ + "\u0000\u01f8\u01fa\u0005f\u0000\u0000\u01f9\u01fb\u0003\u00f0x\u0000\u01fa"+ + "\u01f9\u0001\u0000\u0000\u0000\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fb"+ + "\u01fc\u0001\u0000\u0000\u0000\u01fc\u01fd\u0005g\u0000\u0000\u01fd\u001f"+ + "\u0001\u0000\u0000\u0000\u01fe\u020c\u0003F#\u0000\u01ff\u020c\u0003D"+ + "\"\u0000\u0200\u020c\u0003B!\u0000\u0201\u020c\u0003$\u0012\u0000\u0202"+ + "\u020c\u0003@ \u0000\u0203\u020c\u00038\u001c\u0000\u0204\u020c\u0003"+ + ">\u001f\u0000\u0205\u020c\u00036\u001b\u0000\u0206\u020c\u00032\u0019"+ + "\u0000\u0207\u020c\u00030\u0018\u0000\u0208\u020c\u00034\u001a\u0000\u0209"+ + "\u020c\u0003\"\u0011\u0000\u020a\u020c\u0003H$\u0000\u020b\u01fe\u0001"+ + "\u0000\u0000\u0000\u020b\u01ff\u0001\u0000\u0000\u0000\u020b\u0200\u0001"+ + "\u0000\u0000\u0000\u020b\u0201\u0001\u0000\u0000\u0000\u020b\u0202\u0001"+ + "\u0000\u0000\u0000\u020b\u0203\u0001\u0000\u0000\u0000\u020b\u0204\u0001"+ + "\u0000\u0000\u0000\u020b\u0205\u0001\u0000\u0000\u0000\u020b\u0206\u0001"+ + "\u0000\u0000\u0000\u020b\u0207\u0001\u0000\u0000\u0000\u020b\u0208\u0001"+ + "\u0000\u0000\u0000\u020b\u0209\u0001\u0000\u0000\u0000\u020b\u020a\u0001"+ + "\u0000\u0000\u0000\u020c!\u0001\u0000\u0000\u0000\u020d\u020e\u0007\u0003"+ + "\u0000\u0000\u020e#\u0001\u0000\u0000\u0000\u020f\u0210\u0005^\u0000\u0000"+ + "\u0210\u0211\u0005j\u0000\u0000\u0211\u0212\u0003\u00c2a\u0000\u0212\u0213"+ + "\u0005k\u0000\u0000\u0213%\u0001\u0000\u0000\u0000\u0214\u0219\u0003("+ + "\u0014\u0000\u0215\u0216\u0005m\u0000\u0000\u0216\u0218\u0003(\u0014\u0000"+ + "\u0217\u0215\u0001\u0000\u0000\u0000\u0218\u021b\u0001\u0000\u0000\u0000"+ + "\u0219\u0217\u0001\u0000\u0000\u0000\u0219\u021a\u0001\u0000\u0000\u0000"+ + "\u021a\u021d\u0001\u0000\u0000\u0000\u021b\u0219\u0001\u0000\u0000\u0000"+ + "\u021c\u021e\u0005m\u0000\u0000\u021d\u021c\u0001\u0000\u0000\u0000\u021d"+ + "\u021e\u0001\u0000\u0000\u0000\u021e\'\u0001\u0000\u0000\u0000\u021f\u0224"+ + "\u0005e\u0000\u0000\u0220\u0221\u0005m\u0000\u0000\u0221\u0223\u0005e"+ + "\u0000\u0000\u0222\u0220\u0001\u0000\u0000\u0000\u0223\u0226\u0001\u0000"+ + "\u0000\u0000\u0224\u0222\u0001\u0000\u0000\u0000\u0224\u0225\u0001\u0000"+ + "\u0000\u0000\u0225\u0227\u0001\u0000\u0000\u0000\u0226\u0224\u0001\u0000"+ + "\u0000\u0000\u0227\u0228\u0003\u0132\u0099\u0000\u0228)\u0001\u0000\u0000"+ + "\u0000\u0229\u022b\u0003,\u0016\u0000\u022a\u0229\u0001\u0000\u0000\u0000"+ + "\u022b\u022e\u0001\u0000\u0000\u0000\u022c\u022a\u0001\u0000\u0000\u0000"+ + "\u022c\u022d\u0001\u0000\u0000\u0000\u022d+\u0001\u0000\u0000\u0000\u022e"+ + "\u022c\u0001\u0000\u0000\u0000\u022f\u0230\u0005h\u0000\u0000\u0230\u0235"+ + "\u0003\u00a4R\u0000\u0231\u0232\u0005m\u0000\u0000\u0232\u0234\u0003\u00a4"+ + "R\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0234\u0237\u0001\u0000\u0000"+ + "\u0000\u0235\u0233\u0001\u0000\u0000\u0000\u0235\u0236\u0001\u0000\u0000"+ + "\u0000\u0236\u0238\u0001\u0000\u0000\u0000\u0237\u0235\u0001\u0000\u0000"+ + "\u0000\u0238\u0239\u0005i\u0000\u0000\u0239-\u0001\u0000\u0000\u0000\u023a"+ + "\u023b\u0003\u00b4Z\u0000\u023b/\u0001\u0000\u0000\u0000\u023c\u023d\u0005"+ + "1\u0000\u0000\u023d\u023e\u0005f\u0000\u0000\u023e\u023f\u0003\u00a4R"+ + "\u0000\u023f\u0240\u0005g\u0000\u0000\u02401\u0001\u0000\u0000\u0000\u0241"+ + "\u0242\u00057\u0000\u0000\u0242\u0243\u0005j\u0000\u0000\u0243\u0244\u0003"+ + "\u00c2a\u0000\u0244\u0245\u0005k\u0000\u0000\u02453\u0001\u0000\u0000"+ + "\u0000\u0246\u0247\u00052\u0000\u0000\u0247\u0248\u0005f\u0000\u0000\u0248"+ + "\u0249\u0003\u00a4R\u0000\u0249\u024a\u0005g\u0000\u0000\u024a5\u0001"+ + "\u0000\u0000\u0000\u024b\u024c\u0007\u0004\u0000\u0000\u024c\u024d\u0005"+ + "f\u0000\u0000\u024d\u024e\u0003\u00a4R\u0000\u024e\u024f\u0005g\u0000"+ + "\u0000\u024f7\u0001\u0000\u0000\u0000\u0250\u0255\u0005\u0011\u0000\u0000"+ + "\u0251\u0252\u0005j\u0000\u0000\u0252\u0253\u0003:\u001d\u0000\u0253\u0254"+ + "\u0005k\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255\u0251\u0001"+ + "\u0000\u0000\u0000\u0255\u0256\u0001\u0000\u0000\u0000\u0256\u0257\u0001"+ + "\u0000\u0000\u0000\u0257\u0258\u0005f\u0000\u0000\u0258\u0259\u0003\u00a4"+ + "R\u0000\u0259\u025a\u0005g\u0000\u0000\u025a9\u0001\u0000\u0000\u0000"+ + "\u025b\u025e\u0003<\u001e\u0000\u025c\u025e\u0005\u0013\u0000\u0000\u025d"+ + "\u025b\u0001\u0000\u0000\u0000\u025d\u025c\u0001\u0000\u0000\u0000\u025e"+ + ";\u0001\u0000\u0000\u0000\u025f\u0260\u0005e\u0000\u0000\u0260=\u0001"+ + "\u0000\u0000\u0000\u0261\u0262\u0005\u0012\u0000\u0000\u0262\u0263\u0005"+ + "f\u0000\u0000\u0263\u0264\u0003\u00a4R\u0000\u0264\u0265\u0005g\u0000"+ + "\u0000\u0265?\u0001\u0000\u0000\u0000\u0266\u0267\u0005:\u0000\u0000\u0267"+ + "\u0268\u0005f\u0000\u0000\u0268\u0269\u0003\u00a4R\u0000\u0269\u026a\u0005"+ + "g\u0000\u0000\u026aA\u0001\u0000\u0000\u0000\u026b\u026c\u00059\u0000"+ + "\u0000\u026c\u026d\u0005f\u0000\u0000\u026d\u026e\u0003\u00a4R\u0000\u026e"+ + "\u026f\u0005g\u0000\u0000\u026fC\u0001\u0000\u0000\u0000\u0270\u0271\u0005"+ + "\u0016\u0000\u0000\u0271\u0272\u0005f\u0000\u0000\u0272\u0275\u0003\u00a4"+ + "R\u0000\u0273\u0274\u0005m\u0000\u0000\u0274\u0276\u0003\u00a4R\u0000"+ + "\u0275\u0273\u0001\u0000\u0000\u0000\u0275\u0276\u0001\u0000\u0000\u0000"+ + "\u0276\u0277\u0001\u0000\u0000\u0000\u0277\u0278\u0005g\u0000\u0000\u0278"+ + "E\u0001\u0000\u0000\u0000\u0279\u027a\u0007\u0004\u0000\u0000\u027a\u027b"+ + "\u0005j\u0000\u0000\u027b\u027c\u0003\u00a4R\u0000\u027c\u027d\u0005="+ + "\u0000\u0000\u027d\u027e\u0003\u00a4R\u0000\u027e\u027f\u0005k\u0000\u0000"+ + "\u027fG\u0001\u0000\u0000\u0000\u0280\u0281\u00056\u0000\u0000\u0281\u0282"+ + "\u0003\u00a4R\u0000\u0282\u0288\u0005h\u0000\u0000\u0283\u0284\u0003J"+ + "%\u0000\u0284\u0285\u0003\u0170\u00b8\u0000\u0285\u0287\u0001\u0000\u0000"+ + "\u0000\u0286\u0283\u0001\u0000\u0000\u0000\u0287\u028a\u0001\u0000\u0000"+ + "\u0000\u0288\u0286\u0001\u0000\u0000\u0000\u0288\u0289\u0001\u0000\u0000"+ + "\u0000\u0289\u028b\u0001\u0000\u0000\u0000\u028a\u0288\u0001\u0000\u0000"+ + "\u0000\u028b\u028c\u0005i\u0000\u0000\u028cI\u0001\u0000\u0000\u0000\u028d"+ + "\u028e\u0003j5\u0000\u028e\u028f\u0005o\u0000\u0000\u028f\u0290\u0003"+ + "\u00a4R\u0000\u0290K\u0001\u0000\u0000\u0000\u0291\u0292\u0005j\u0000"+ + "\u0000\u0292\u0297\u0003N\'\u0000\u0293\u0294\u0005m\u0000\u0000\u0294"+ + "\u0296\u0003N\'\u0000\u0295\u0293\u0001\u0000\u0000\u0000\u0296\u0299"+ + "\u0001\u0000\u0000\u0000\u0297\u0295\u0001\u0000\u0000\u0000\u0297\u0298"+ + "\u0001\u0000\u0000\u0000\u0298\u029a\u0001\u0000\u0000\u0000\u0299\u0297"+ + "\u0001\u0000\u0000\u0000\u029a\u029b\u0005k\u0000\u0000\u029bM\u0001\u0000"+ + "\u0000\u0000\u029c\u029d\u0003\u00a4R\u0000\u029d\u029e\u0005l\u0000\u0000"+ + "\u029e\u029f\u0003\u00a4R\u0000\u029fO\u0001\u0000\u0000\u0000\u02a0\u02a5"+ + "\u0003\\.\u0000\u02a1\u02a5\u0003Z-\u0000\u02a2\u02a5\u0003R)\u0000\u02a3"+ + "\u02a5\u0003V+\u0000\u02a4\u02a0\u0001\u0000\u0000\u0000\u02a4\u02a1\u0001"+ + "\u0000\u0000\u0000\u02a4\u02a2\u0001\u0000\u0000\u0000\u02a4\u02a3\u0001"+ + "\u0000\u0000\u0000\u02a5Q\u0001\u0000\u0000\u0000\u02a6\u02a7\u00053\u0000"+ + "\u0000\u02a7\u02ad\u0005h\u0000\u0000\u02a8\u02a9\u0003T*\u0000\u02a9"+ + "\u02aa\u0003\u0170\u00b8\u0000\u02aa\u02ac\u0001\u0000\u0000\u0000\u02ab"+ + "\u02a8\u0001\u0000\u0000\u0000\u02ac\u02af\u0001\u0000\u0000\u0000\u02ad"+ + "\u02ab\u0001\u0000\u0000\u0000\u02ad\u02ae\u0001\u0000\u0000\u0000\u02ae"+ + "\u02b0\u0001\u0000\u0000\u0000\u02af\u02ad\u0001\u0000\u0000\u0000\u02b0"+ + "\u02b1\u0005i\u0000\u0000\u02b1S\u0001\u0000\u0000\u0000\u02b2\u02b3\u0005"+ + "M\u0000\u0000\u02b3\u02b4\u0005e\u0000\u0000\u02b4\u02bc\u0003\u013e\u009f"+ + "\u0000\u02b5\u02b6\u00054\u0000\u0000\u02b6\u02b7\u0005h\u0000\u0000\u02b7"+ + "\u02b8\u0003\u00a4R\u0000\u02b8\u02b9\u0003\u0170\u00b8\u0000\u02b9\u02ba"+ + "\u0005i\u0000\u0000\u02ba\u02bc\u0001\u0000\u0000\u0000\u02bb\u02b2\u0001"+ + "\u0000\u0000\u0000\u02bb\u02b5\u0001\u0000\u0000\u0000\u02bcU\u0001\u0000"+ + "\u0000\u0000\u02bd\u02be\u00055\u0000\u0000\u02be\u02c4\u0005h\u0000\u0000"+ + "\u02bf\u02c0\u0003X,\u0000\u02c0\u02c1\u0003\u0170\u00b8\u0000\u02c1\u02c3"+ + "\u0001\u0000\u0000\u0000\u02c2\u02bf\u0001\u0000\u0000\u0000\u02c3\u02c6"+ + "\u0001\u0000\u0000\u0000\u02c4\u02c2\u0001\u0000\u0000\u0000\u02c4\u02c5"+ + "\u0001\u0000\u0000\u0000\u02c5\u02c7\u0001\u0000\u0000\u0000\u02c6\u02c4"+ + "\u0001\u0000\u0000\u0000\u02c7\u02c8\u0005i\u0000\u0000\u02c8W\u0001\u0000"+ + "\u0000\u0000\u02c9\u02ca\u0005e\u0000\u0000\u02ca\u02d0\u0005h\u0000\u0000"+ + "\u02cb\u02cc\u0003\u0160\u00b0\u0000\u02cc\u02cd\u0003\u0170\u00b8\u0000"+ + "\u02cd\u02cf\u0001\u0000\u0000\u0000\u02ce\u02cb\u0001\u0000\u0000\u0000"+ + "\u02cf\u02d2\u0001\u0000\u0000\u0000\u02d0\u02ce\u0001\u0000\u0000\u0000"+ + "\u02d0\u02d1\u0001\u0000\u0000\u0000\u02d1\u02d3\u0001\u0000\u0000\u0000"+ + "\u02d2\u02d0\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005i\u0000\u0000\u02d4"+ + "Y\u0001\u0000\u0000\u0000\u02d5\u02d6\u0005\u001b\u0000\u0000\u02d6\u02d7"+ + "\u0005j\u0000\u0000\u02d7\u02d8\u0005k\u0000\u0000\u02d8\u02d9\u0003\u0132"+ + "\u0099\u0000\u02d9[\u0001\u0000\u0000\u0000\u02da\u02db\u0007\u0005\u0000"+ + "\u0000\u02db\u02dc\u0005j\u0000\u0000\u02dc\u02dd\u0003\u00c2a\u0000\u02dd"+ + "\u02de\u0005k\u0000\u0000\u02de\u02e6\u0001\u0000\u0000\u0000\u02df\u02e0"+ + "\u0005+\u0000\u0000\u02e0\u02e1\u0005j\u0000\u0000\u02e1\u02e2\u0003\u00c2"+ + "a\u0000\u02e2\u02e3\u0005k\u0000\u0000\u02e3\u02e4\u0003\u00c2a\u0000"+ + "\u02e4\u02e6\u0001\u0000\u0000\u0000\u02e5\u02da\u0001\u0000\u0000\u0000"+ + "\u02e5\u02df\u0001\u0000\u0000\u0000\u02e6]\u0001\u0000\u0000\u0000\u02e7"+ + "\u02ed\u0003`0\u0000\u02e8\u02e9\u0005\u000e\u0000\u0000\u02e9\u02ed\u0006"+ + "/\uffff\uffff\u0000\u02ea\u02eb\u0005C\u0000\u0000\u02eb\u02ed\u0006/"+ + "\uffff\uffff\u0000\u02ec\u02e7\u0001\u0000\u0000\u0000\u02ec\u02e8\u0001"+ + "\u0000\u0000\u0000\u02ec\u02ea\u0001\u0000\u0000\u0000\u02ed\u02ee\u0001"+ + "\u0000\u0000\u0000\u02ee\u02f0\u0003\u0170\u00b8\u0000\u02ef\u02ec\u0001"+ + "\u0000\u0000\u0000\u02f0\u02f3\u0001\u0000\u0000\u0000\u02f1\u02f2\u0001"+ + "\u0000\u0000\u0000\u02f1\u02ef\u0001\u0000\u0000\u0000\u02f2\u02f6\u0001"+ + "\u0000\u0000\u0000\u02f3\u02f1\u0001\u0000\u0000\u0000\u02f4\u02f5\u0005"+ + "\u000e\u0000\u0000\u02f5\u02f7\u0006/\uffff\uffff\u0000\u02f6\u02f4\u0001"+ + "\u0000\u0000\u0000\u02f6\u02f7\u0001\u0000\u0000\u0000\u02f7_\u0001\u0000"+ + "\u0000\u0000\u02f8\u02f9\u0005\t\u0000\u0000\u02f9\u0301\u0003d2\u0000"+ + "\u02fa\u02fb\u0005\n\u0000\u0000\u02fb\u0301\u0003d2\u0000\u02fc\u02fd"+ + "\u0005\u000b\u0000\u0000\u02fd\u0301\u0003d2\u0000\u02fe\u02ff\u0005\r"+ + "\u0000\u0000\u02ff\u0301\u0003b1\u0000\u0300\u02f8\u0001\u0000\u0000\u0000"+ + "\u0300\u02fa\u0001\u0000\u0000\u0000\u0300\u02fc\u0001\u0000\u0000\u0000"+ + "\u0300\u02fe\u0001\u0000\u0000\u0000\u0301a\u0001\u0000\u0000\u0000\u0302"+ + "\u0304\u0003\u00e6s\u0000\u0303\u0302\u0001\u0000\u0000\u0000\u0303\u0304"+ + "\u0001\u0000\u0000\u0000\u0304\u0307\u0001\u0000\u0000\u0000\u0305\u0306"+ + "\u0005\\\u0000\u0000\u0306\u0308\u0003\u00a4R\u0000\u0307\u0305\u0001"+ + "\u0000\u0000\u0000\u0307\u0308\u0001\u0000\u0000\u0000\u0308c\u0001\u0000"+ + "\u0000\u0000\u0309\u030c\u0001\u0000\u0000\u0000\u030a\u030c\u0003\u00a4"+ + "R\u0000\u030b\u0309\u0001\u0000\u0000\u0000\u030b\u030a\u0001\u0000\u0000"+ + "\u0000\u030ce\u0001\u0000\u0000\u0000\u030d\u030e\u00056\u0000\u0000\u030e"+ + "\u030f\u0003\u00a4R\u0000\u030f\u0313\u0005h\u0000\u0000\u0310\u0312\u0003"+ + "h4\u0000\u0311\u0310\u0001\u0000\u0000\u0000\u0312\u0315\u0001\u0000\u0000"+ + "\u0000\u0313\u0311\u0001\u0000\u0000\u0000\u0313\u0314\u0001\u0000\u0000"+ + "\u0000\u0314\u0316\u0001\u0000\u0000\u0000\u0315\u0313\u0001\u0000\u0000"+ + "\u0000\u0316\u0317\u0005i\u0000\u0000\u0317g\u0001\u0000\u0000\u0000\u0318"+ + "\u0319\u0003j5\u0000\u0319\u031b\u0005o\u0000\u0000\u031a\u031c\u0003"+ + "\u00f0x\u0000\u031b\u031a\u0001\u0000\u0000\u0000\u031b\u031c\u0001\u0000"+ + "\u0000\u0000\u031ci\u0001\u0000\u0000\u0000\u031d\u031e\u0005P\u0000\u0000"+ + "\u031e\u0321\u0003l6\u0000\u031f\u0321\u0005L\u0000\u0000\u0320\u031d"+ + "\u0001\u0000\u0000\u0000\u0320\u031f\u0001\u0000\u0000\u0000\u0321k\u0001"+ + "\u0000\u0000\u0000\u0322\u0323\u0005%\u0000\u0000\u0323\u0330\u0005e\u0000"+ + "\u0000\u0324\u0325\u0003\u00cae\u0000\u0325\u032a\u0005h\u0000\u0000\u0326"+ + "\u0328\u0003n7\u0000\u0327\u0329\u0005m\u0000\u0000\u0328\u0327\u0001"+ + "\u0000\u0000\u0000\u0328\u0329\u0001\u0000\u0000\u0000\u0329\u032b\u0001"+ + "\u0000\u0000\u0000\u032a\u0326\u0001\u0000\u0000\u0000\u032a\u032b\u0001"+ + "\u0000\u0000\u0000\u032b\u032c\u0001\u0000\u0000\u0000\u032c\u032d\u0005"+ + "i\u0000\u0000\u032d\u0330\u0001\u0000\u0000\u0000\u032e\u0330\u0003\u00a4"+ + "R\u0000\u032f\u0322\u0001\u0000\u0000\u0000\u032f\u0324\u0001\u0000\u0000"+ + "\u0000\u032f\u032e\u0001\u0000\u0000\u0000\u0330m\u0001\u0000\u0000\u0000"+ + "\u0331\u0336\u0003l6\u0000\u0332\u0333\u0005m\u0000\u0000\u0333\u0335"+ + "\u0003l6\u0000\u0334\u0332\u0001\u0000\u0000\u0000\u0335\u0338\u0001\u0000"+ + "\u0000\u0000\u0336\u0334\u0001\u0000\u0000\u0000\u0336\u0337\u0001\u0000"+ + "\u0000\u0000\u0337o\u0001\u0000\u0000\u0000\u0338\u0336\u0001\u0000\u0000"+ + "\u0000\u0339\u033e\u0005h\u0000\u0000\u033a\u033b\u0005;\u0000\u0000\u033b"+ + "\u033c\u0003\u00e4r\u0000\u033c\u033d\u0003\u0170\u00b8\u0000\u033d\u033f"+ + "\u0001\u0000\u0000\u0000\u033e\u033a\u0001\u0000\u0000\u0000\u033e\u033f"+ + "\u0001\u0000\u0000\u0000\u033f\u0341\u0001\u0000\u0000\u0000\u0340\u0342"+ + "\u0003\u00f0x\u0000\u0341\u0340\u0001\u0000\u0000\u0000\u0341\u0342\u0001"+ + "\u0000\u0000\u0000\u0342\u0343\u0001\u0000\u0000\u0000\u0343\u0344\u0005"+ + "i\u0000\u0000\u0344q\u0001\u0000\u0000\u0000\u0345\u0348\u0003\u0150\u00a8"+ + "\u0000\u0346\u0348\u0005e\u0000\u0000\u0347\u0345\u0001\u0000\u0000\u0000"+ + "\u0347\u0346\u0001\u0000\u0000\u0000\u0348\u0351\u0001\u0000\u0000\u0000"+ + "\u0349\u034e\u0005h\u0000\u0000\u034a\u034c\u0003t:\u0000\u034b\u034d"+ + "\u0005m\u0000\u0000\u034c\u034b\u0001\u0000\u0000\u0000\u034c\u034d\u0001"+ + "\u0000\u0000\u0000\u034d\u034f\u0001\u0000\u0000\u0000\u034e\u034a\u0001"+ + "\u0000\u0000\u0000\u034e\u034f\u0001\u0000\u0000\u0000\u034f\u0350\u0001"+ + "\u0000\u0000\u0000\u0350\u0352\u0005i\u0000\u0000\u0351\u0349\u0001\u0000"+ + "\u0000\u0000\u0351\u0352\u0001\u0000\u0000\u0000\u0352s\u0001\u0000\u0000"+ + "\u0000\u0353\u0358\u0003v;\u0000\u0354\u0355\u0005m\u0000\u0000\u0355"+ + "\u0357\u0003v;\u0000\u0356\u0354\u0001\u0000\u0000\u0000\u0357\u035a\u0001"+ + "\u0000\u0000\u0000\u0358\u0356\u0001\u0000\u0000\u0000\u0358\u0359\u0001"+ + "\u0000\u0000\u0000\u0359u\u0001\u0000\u0000\u0000\u035a\u0358\u0001\u0000"+ + "\u0000\u0000\u035b\u035c\u0005e\u0000\u0000\u035c\u035e\u0005o\u0000\u0000"+ + "\u035d\u035b\u0001\u0000\u0000\u0000\u035d\u035e\u0001\u0000\u0000\u0000"+ + "\u035e\u035f\u0001\u0000\u0000\u0000\u035f\u0360\u0003\u00a4R\u0000\u0360"+ + "w\u0001\u0000\u0000\u0000\u0361\u0362\u0005G\u0000\u0000\u0362\u0363\u0003"+ + "\u00a4R\u0000\u0363\u0364\u0005\u000f\u0000\u0000\u0364\u0365\u0003r9"+ + "\u0000\u0365\u0366\u0003\u00eew\u0000\u0366y\u0001\u0000\u0000\u0000\u0367"+ + "\u0368\u0003\u00c2a\u0000\u0368\u0369\u0005\u000f\u0000\u0000\u0369\u037c"+ + "\u0003\u00c2a\u0000\u036a\u0370\u0005h\u0000\u0000\u036b\u036c\u0003\u0082"+ + "A\u0000\u036c\u036d\u0003\u0170\u00b8\u0000\u036d\u036f\u0001\u0000\u0000"+ + "\u0000\u036e\u036b\u0001\u0000\u0000\u0000\u036f\u0372\u0001\u0000\u0000"+ + "\u0000\u0370\u036e\u0001\u0000\u0000\u0000\u0370\u0371\u0001\u0000\u0000"+ + "\u0000\u0371\u0378\u0001\u0000\u0000\u0000\u0372\u0370\u0001\u0000\u0000"+ + "\u0000\u0373\u0374\u0003|>\u0000\u0374\u0375\u0003\u0170\u00b8\u0000\u0375"+ + "\u0377\u0001\u0000\u0000\u0000\u0376\u0373\u0001\u0000\u0000\u0000\u0377"+ + "\u037a\u0001\u0000\u0000\u0000\u0378\u0376\u0001\u0000\u0000\u0000\u0378"+ + "\u0379\u0001\u0000\u0000\u0000\u0379\u037b\u0001\u0000\u0000\u0000\u037a"+ + "\u0378\u0001\u0000\u0000\u0000\u037b\u037d\u0005i\u0000\u0000\u037c\u036a"+ + "\u0001\u0000\u0000\u0000\u037c\u037d\u0001\u0000\u0000\u0000\u037d{\u0001"+ + "\u0000\u0000\u0000\u037e\u0380\u0005\u000e\u0000\u0000\u037f\u037e\u0001"+ + "\u0000\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380\u0381\u0001"+ + "\u0000\u0000\u0000\u0381\u0382\u0003~?\u0000\u0382\u0383\u0005e\u0000"+ + "\u0000\u0383\u0385\u0003\u013e\u009f\u0000\u0384\u0386\u0003\u00eew\u0000"+ + "\u0385\u0384\u0001\u0000\u0000\u0000\u0385\u0386\u0001\u0000\u0000\u0000"+ + "\u0386}\u0001\u0000\u0000\u0000\u0387\u0389\u0005f\u0000\u0000\u0388\u038a"+ + "\u0005e\u0000\u0000\u0389\u0388\u0001\u0000\u0000\u0000\u0389\u038a\u0001"+ + "\u0000\u0000\u0000\u038a\u038c\u0001\u0000\u0000\u0000\u038b\u038d\u0005"+ + "\u0087\u0000\u0000\u038c\u038b\u0001\u0000\u0000\u0000\u038c\u038d\u0001"+ + "\u0000\u0000\u0000\u038d\u038e\u0001\u0000\u0000\u0000\u038e\u038f\u0003"+ + "\u012c\u0096\u0000\u038f\u0390\u0005g\u0000\u0000\u0390\u007f\u0001\u0000"+ + "\u0000\u0000\u0391\u0397\u0003\u00b4Z\u0000\u0392\u0393\u0003\u00c2a\u0000"+ + "\u0393\u0394\u0005p\u0000\u0000\u0394\u0395\u0005e\u0000\u0000\u0395\u0397"+ + "\u0001\u0000\u0000\u0000\u0396\u0391\u0001\u0000\u0000\u0000\u0396\u0392"+ + "\u0001\u0000\u0000\u0000\u0397\u0081\u0001\u0000\u0000\u0000\u0398\u0399"+ + "\u00058\u0000\u0000\u0399\u039a\u0005e\u0000\u0000\u039a\u039d\u0005s"+ + "\u0000\u0000\u039b\u039e\u0003\u0080@\u0000\u039c\u039e\u0003\u014e\u00a7"+ + "\u0000\u039d\u039b\u0001\u0000\u0000\u0000\u039d\u039c\u0001\u0000\u0000"+ + "\u0000\u039e\u0083\u0001\u0000\u0000\u0000\u039f\u03a0\u0005/\u0000\u0000"+ + "\u03a0\u03a1\u0005f\u0000\u0000\u03a1\u03a4\u0003\u00c2a\u0000\u03a2\u03a3"+ + "\u0005m\u0000\u0000\u03a3\u03a5\u0003\u00e6s\u0000\u03a4\u03a2\u0001\u0000"+ + "\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6\u0001\u0000"+ + "\u0000\u0000\u03a6\u03a7\u0005g\u0000\u0000\u03a7\u0085\u0001\u0000\u0000"+ + "\u0000\u03a8\u03a9\u0005.\u0000\u0000\u03a9\u03aa\u0005f\u0000\u0000\u03aa"+ + "\u03ab\u0003\u00c2a\u0000\u03ab\u03ac\u0005g\u0000\u0000\u03ac\u0087\u0001"+ + "\u0000\u0000\u0000\u03ad\u03b0\u0003^/\u0000\u03ae\u03b1\u0003\u008aE"+ + "\u0000\u03af\u03b1\u0003\u008cF\u0000\u03b0\u03ae\u0001\u0000\u0000\u0000"+ + "\u03b0\u03af\u0001\u0000\u0000\u0000\u03b1\u0089\u0001\u0000\u0000\u0000"+ + "\u03b2\u03b3\u0005M\u0000\u0000\u03b3\u03b4\u0005e\u0000\u0000\u03b4\u03b6"+ + "\u0003\u013e\u009f\u0000\u03b5\u03b7\u0003p8\u0000\u03b6\u03b5\u0001\u0000"+ + "\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u008b\u0001\u0000"+ + "\u0000\u0000\u03b8\u03b9\u0005M\u0000\u0000\u03b9\u03ba\u0003\u009aM\u0000"+ + "\u03ba\u03bb\u0005e\u0000\u0000\u03bb\u03bd\u0003\u013e\u009f\u0000\u03bc"+ + "\u03be\u0003p8\u0000\u03bd\u03bc\u0001\u0000\u0000\u0000\u03bd\u03be\u0001"+ + "\u0000\u0000\u0000\u03be\u008d\u0001\u0000\u0000\u0000\u03bf\u03c2\u0005"+ + "\u001b\u0000\u0000\u03c0\u03c3\u0003\u0088D\u0000\u03c1\u03c3\u0003\u00de"+ + "o\u0000\u03c2\u03c0\u0001\u0000\u0000\u0000\u03c2\u03c1\u0001\u0000\u0000"+ + "\u0000\u03c3\u008f\u0001\u0000\u0000\u0000\u03c4\u03c5\u00058\u0000\u0000"+ + "\u03c5\u03c6\u0005e\u0000\u0000\u03c6\u03c8\u0003\u0142\u00a1\u0000\u03c7"+ + "\u03c9\u0003\u0092I\u0000\u03c8\u03c7\u0001\u0000\u0000\u0000\u03c8\u03c9"+ + "\u0001\u0000\u0000\u0000\u03c9\u0091\u0001\u0000\u0000\u0000\u03ca\u03cb"+ + "\u0005h\u0000\u0000\u03cb\u03cc\u0003\u00a4R\u0000\u03cc\u03cd\u0003\u0170"+ + "\u00b8\u0000\u03cd\u03ce\u0005i\u0000\u0000\u03ce\u0093\u0001\u0000\u0000"+ + "\u0000\u03cf\u03d0\u00058\u0000\u0000\u03d0\u03d1\u0003\u009aM\u0000\u03d1"+ + "\u03d2\u0005e\u0000\u0000\u03d2\u03d4\u0003\u0142\u00a1\u0000\u03d3\u03d5"+ + "\u0003\u0092I\u0000\u03d4\u03d3\u0001\u0000\u0000\u0000\u03d4\u03d5\u0001"+ + "\u0000\u0000\u0000\u03d5\u0095\u0001\u0000\u0000\u0000\u03d6\u03de\u0003"+ + "\u0006\u0003\u0000\u03d7\u03da\u0003\u00c2a\u0000\u03d8\u03d9\u0005l\u0000"+ + "\u0000\u03d9\u03db\u0003\u00e6s\u0000\u03da\u03d8\u0001\u0000\u0000\u0000"+ + "\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u03df\u0001\u0000\u0000\u0000"+ + "\u03dc\u03dd\u0005l\u0000\u0000\u03dd\u03df\u0003\u00e6s\u0000\u03de\u03d7"+ + "\u0001\u0000\u0000\u0000\u03de\u03dc\u0001\u0000\u0000\u0000\u03df\u0097"+ + "\u0001\u0000\u0000\u0000\u03e0\u03e1\u0003\u0006\u0003\u0000\u03e1\u03e2"+ + "\u0005s\u0000\u0000\u03e2\u03e3\u0003\u00e6s\u0000\u03e3\u0099\u0001\u0000"+ + "\u0000\u0000\u03e4\u03e6\u0005f\u0000\u0000\u03e5\u03e7\u0003\b\u0004"+ + "\u0000\u03e6\u03e5\u0001\u0000\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000"+ + "\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000\u03e8\u03ea\u0003\u00c2a\u0000"+ + "\u03e9\u03eb\u0005m\u0000\u0000\u03ea\u03e9\u0001\u0000\u0000\u0000\u03ea"+ + "\u03eb\u0001\u0000\u0000\u0000\u03eb\u03ec\u0001\u0000\u0000\u0000\u03ec"+ + "\u03ed\u0005g\u0000\u0000\u03ed\u009b\u0001\u0000\u0000\u0000\u03ee\u03f1"+ + "\u0003\u009eO\u0000\u03ef\u03f1\u0003\u00a0P\u0000\u03f0\u03ee\u0001\u0000"+ + "\u0000\u0000\u03f0\u03ef\u0001\u0000\u0000\u0000\u03f1\u009d\u0001\u0000"+ + "\u0000\u0000\u03f2\u03f4\u0003\u00e4r\u0000\u03f3\u03f2\u0001\u0000\u0000"+ + "\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0001\u0000\u0000"+ + "\u0000\u03f5\u03f6\u0003\u00a2Q\u0000\u03f6\u009f\u0001\u0000\u0000\u0000"+ + "\u03f7\u03f9\u0005\u001b\u0000\u0000\u03f8\u03fa\u0003\u00e4r\u0000\u03f9"+ + "\u03f8\u0001\u0000\u0000\u0000\u03f9\u03fa\u0001\u0000\u0000\u0000\u03fa"+ + "\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0003\u00a2Q\u0000\u03fc\u00a1"+ + "\u0001\u0000\u0000\u0000\u03fd\u03ff\u0005t\u0000\u0000\u03fe\u03fd\u0001"+ + "\u0000\u0000\u0000\u03fe\u03ff\u0001\u0000\u0000\u0000\u03ff\u0400\u0001"+ + "\u0000\u0000\u0000\u0400\u0401\u0003\u00c2a\u0000\u0401\u00a3\u0001\u0000"+ + "\u0000\u0000\u0402\u0403\u0006R\uffff\uffff\u0000\u0403\u0404\u0007\u0006"+ + "\u0000\u0000\u0404\u0418\u0003\u00a4R\u000f\u0405\u0418\u0003\u00b4Z\u0000"+ + "\u0406\u0407\u0005\u0019\u0000\u0000\u0407\u0408\u0003.\u0017\u0000\u0408"+ + "\u0409\u0005\u001c\u0000\u0000\u0409\u040a\u0003\u00a4R\u0003\u040a\u0418"+ + "\u0001\u0000\u0000\u0000\u040b\u040c\u0005\u001a\u0000\u0000\u040c\u040d"+ + "\u0003\u0098L\u0000\u040d\u040e\u0005\u001c\u0000\u0000\u040e\u040f\u0003"+ + "\u00a4R\u0002\u040f\u0418\u0001\u0000\u0000\u0000\u0410\u0411\u0007\u0007"+ + "\u0000\u0000\u0411\u0412\u0003&\u0013\u0000\u0412\u0413\u0005o\u0000\u0000"+ + "\u0413\u0414\u0005o\u0000\u0000\u0414\u0415\u0003*\u0015\u0000\u0415\u0416"+ + "\u0003\u00a4R\u0001\u0416\u0418\u0001\u0000\u0000\u0000\u0417\u0402\u0001"+ + "\u0000\u0000\u0000\u0417\u0405\u0001\u0000\u0000\u0000\u0417\u0406\u0001"+ + "\u0000\u0000\u0000\u0417\u040b\u0001\u0000\u0000\u0000\u0417\u0410\u0001"+ + "\u0000\u0000\u0000\u0418\u043c\u0001\u0000\u0000\u0000\u0419\u041a\n\r"+ + "\u0000\u0000\u041a\u041b\u0007\b\u0000\u0000\u041b\u043b\u0003\u00a4R"+ + "\u000e\u041c\u041d\n\f\u0000\u0000\u041d\u041e\u0007\t\u0000\u0000\u041e"+ + "\u043b\u0003\u00a4R\r\u041f\u0420\n\u000b\u0000\u0000\u0420\u0421\u0007"+ + "\n\u0000\u0000\u0421\u043b\u0003\u00a4R\f\u0422\u0423\n\n\u0000\u0000"+ + "\u0423\u0424\u0007\u000b\u0000\u0000\u0424\u043b\u0003\u00a4R\u000b\u0425"+ + "\u0426\n\t\u0000\u0000\u0426\u0427\u0007\f\u0000\u0000\u0427\u043b\u0003"+ + "\u00a4R\n\u0428\u0429\n\u0007\u0000\u0000\u0429\u042a\u0005v\u0000\u0000"+ + "\u042a\u043b\u0003\u00a4R\b\u042b\u042c\n\u0006\u0000\u0000\u042c\u042d"+ + "\u0005u\u0000\u0000\u042d\u043b\u0003\u00a4R\u0007\u042e\u042f\n\u0005"+ + "\u0000\u0000\u042f\u0430\u0005\"\u0000\u0000\u0430\u043b\u0003\u00a4R"+ + "\u0005\u0431\u0432\n\u0004\u0000\u0000\u0432\u0433\u0005%\u0000\u0000"+ + "\u0433\u0434\u0003\u00a4R\u0000\u0434\u0435\u0005o\u0000\u0000\u0435\u0436"+ + "\u0003\u00a4R\u0004\u0436\u043b\u0001\u0000\u0000\u0000\u0437\u0438\n"+ + "\b\u0000\u0000\u0438\u0439\u0005\u000f\u0000\u0000\u0439\u043b\u0003r"+ + "9\u0000\u043a\u0419\u0001\u0000\u0000\u0000\u043a\u041c\u0001\u0000\u0000"+ + "\u0000\u043a\u041f\u0001\u0000\u0000\u0000\u043a\u0422\u0001\u0000\u0000"+ + "\u0000\u043a\u0425\u0001\u0000\u0000\u0000\u043a\u0428\u0001\u0000\u0000"+ + "\u0000\u043a\u042b\u0001\u0000\u0000\u0000\u043a\u042e\u0001\u0000\u0000"+ + "\u0000\u043a\u0431\u0001\u0000\u0000\u0000\u043a\u0437\u0001\u0000\u0000"+ + "\u0000\u043b\u043e\u0001\u0000\u0000\u0000\u043c\u043a\u0001\u0000\u0000"+ + "\u0000\u043c\u043d\u0001\u0000\u0000\u0000\u043d\u00a5\u0001\u0000\u0000"+ + "\u0000\u043e\u043c\u0001\u0000\u0000\u0000\u043f\u0454\u0003\u0018\f\u0000"+ + "\u0440\u0454\u0003\u001a\r\u0000\u0441\u0454\u0003\u00aaU\u0000\u0442"+ + "\u0454\u0003\u00a8T\u0000\u0443\u0454\u0003\u00deo\u0000\u0444\u0454\u0003"+ + "\u00fe\u007f\u0000\u0445\u0454\u0003\u00f2y\u0000\u0446\u0454\u0003\u012a"+ + "\u0095\u0000\u0447\u0454\u0003\u0100\u0080\u0000\u0448\u0454\u0003\u0102"+ + "\u0081\u0000\u0449\u0454\u0003\u0104\u0082\u0000\u044a\u0454\u0003\u0106"+ + "\u0083\u0000\u044b\u0454\u0003\u0108\u0084\u0000\u044c\u0454\u0003\u00ee"+ + "w\u0000\u044d\u0454\u0003\u010a\u0085\u0000\u044e\u0454\u0003\u010c\u0086"+ + "\u0000\u044f\u0454\u0003\u011e\u008f\u0000\u0450\u0454\u0003\u00acV\u0000"+ + "\u0451\u0454\u0003\u00b0X\u0000\u0452\u0454\u0003x<\u0000\u0453\u043f"+ + "\u0001\u0000\u0000\u0000\u0453\u0440\u0001\u0000\u0000\u0000\u0453\u0441"+ + "\u0001\u0000\u0000\u0000\u0453\u0442\u0001\u0000\u0000\u0000\u0453\u0443"+ + "\u0001\u0000\u0000\u0000\u0453\u0444\u0001\u0000\u0000\u0000\u0453\u0445"+ + "\u0001\u0000\u0000\u0000\u0453\u0446\u0001\u0000\u0000\u0000\u0453\u0447"+ + "\u0001\u0000\u0000\u0000\u0453\u0448\u0001\u0000\u0000\u0000\u0453\u0449"+ + "\u0001\u0000\u0000\u0000\u0453\u044a\u0001\u0000\u0000\u0000\u0453\u044b"+ + "\u0001\u0000\u0000\u0000\u0453\u044c\u0001\u0000\u0000\u0000\u0453\u044d"+ + "\u0001\u0000\u0000\u0000\u0453\u044e\u0001\u0000\u0000\u0000\u0453\u044f"+ + "\u0001\u0000\u0000\u0000\u0453\u0450\u0001\u0000\u0000\u0000\u0453\u0451"+ + "\u0001\u0000\u0000\u0000\u0453\u0452\u0001\u0000\u0000\u0000\u0454\u00a7"+ + "\u0001\u0000\u0000\u0000\u0455\u0456\u0005$\u0000\u0000\u0456\u0457\u0003"+ + "\u00a4R\u0000\u0457\u00a9\u0001\u0000\u0000\u0000\u0458\u0459\u0005X\u0000"+ + "\u0000\u0459\u045b\u0003\u00a4R\u0000\u045a\u045c\u0003\u00eew\u0000\u045b"+ + "\u045a\u0001\u0000\u0000\u0000\u045b\u045c\u0001\u0000\u0000\u0000\u045c"+ + "\u00ab\u0001\u0000\u0000\u0000\u045d\u045e\u0003\u00aeW\u0000\u045e\u045f"+ + "\u0003\u0126\u0093\u0000\u045f\u00ad\u0001\u0000\u0000\u0000\u0460\u0461"+ + "\u0005\f\u0000\u0000\u0461\u0462\u0003\u00a4R\u0000\u0462\u0463\u0003"+ + "\u0170\u00b8\u0000\u0463\u0465\u0001\u0000\u0000\u0000\u0464\u0460\u0001"+ + "\u0000\u0000\u0000\u0465\u0468\u0001\u0000\u0000\u0000\u0466\u0464\u0001"+ + "\u0000\u0000\u0000\u0466\u0467\u0001\u0000\u0000\u0000\u0467\u046d\u0001"+ + "\u0000\u0000\u0000\u0468\u0466\u0001\u0000\u0000\u0000\u0469\u046a\u0005"+ + "\r\u0000\u0000\u046a\u046b\u0003b1\u0000\u046b\u046c\u0003\u0170\u00b8"+ + "\u0000\u046c\u046e\u0001\u0000\u0000\u0000\u046d\u0469\u0001\u0000\u0000"+ + "\u0000\u046d\u046e\u0001\u0000\u0000\u0000\u046e\u00af\u0001\u0000\u0000"+ + "\u0000\u046f\u0470\u0005Q\u0000\u0000\u0470\u0475\u0003\u00a4R\u0000\u0471"+ + "\u0472\u0005Q\u0000\u0000\u0472\u0473\u0007\u0001\u0000\u0000\u0473\u0475"+ + "\u0003.\u0017\u0000\u0474\u046f\u0001\u0000\u0000\u0000\u0474\u0471\u0001"+ + "\u0000\u0000\u0000\u0475\u00b1\u0001\u0000\u0000\u0000\u0476\u047f\u0005"+ + "\u0003\u0000\u0000\u0477\u047f\u0005\u0004\u0000\u0000\u0478\u047f\u0005"+ + "d\u0000\u0000\u0479\u047f\u0003\u014c\u00a6\u0000\u047a\u047f\u0003\u0162"+ + "\u00b1\u0000\u047b\u047f\u0005\u0001\u0000\u0000\u047c\u047f\u0005\u008f"+ + "\u0000\u0000\u047d\u047f\u0005\u0090\u0000\u0000\u047e\u0476\u0001\u0000"+ + "\u0000\u0000\u047e\u0477\u0001\u0000\u0000\u0000\u047e\u0478\u0001\u0000"+ + "\u0000\u0000\u047e\u0479\u0001\u0000\u0000\u0000\u047e\u047a\u0001\u0000"+ + "\u0000\u0000\u047e\u047b\u0001\u0000\u0000\u0000\u047e\u047c\u0001\u0000"+ + "\u0000\u0000\u047e\u047d\u0001\u0000\u0000\u0000\u047f\u00b3\u0001\u0000"+ + "\u0000\u0000\u0480\u0481\u0006Z\uffff\uffff\u0000\u0481\u048d\u0003\u0148"+ + "\u00a4\u0000\u0482\u048d\u0003\u0144\u00a2\u0000\u0483\u048d\u0003\u016c"+ + "\u00b6\u0000\u0484\u048d\u0003 \u0010\u0000\u0485\u048d\u0003\u0086C\u0000"+ + "\u0486\u048d\u0003\u0084B\u0000\u0487\u0488\u0007\r\u0000\u0000\u0488"+ + "\u0489\u0005f\u0000\u0000\u0489\u048a\u0003\u00a4R\u0000\u048a\u048b\u0005"+ + "g\u0000\u0000\u048b\u048d\u0001\u0000\u0000\u0000\u048c\u0480\u0001\u0000"+ + "\u0000\u0000\u048c\u0482\u0001\u0000\u0000\u0000\u048c\u0483\u0001\u0000"+ + "\u0000\u0000\u048c\u0484\u0001\u0000\u0000\u0000\u048c\u0485\u0001\u0000"+ + "\u0000\u0000\u048c\u0486\u0001\u0000\u0000\u0000\u048c\u0487\u0001\u0000"+ + "\u0000\u0000\u048d\u04a4\u0001\u0000\u0000\u0000\u048e\u048f\n\t\u0000"+ + "\u0000\u048f\u0490\u0005p\u0000\u0000\u0490\u04a3\u0005e\u0000\u0000\u0491"+ + "\u0492\n\b\u0000\u0000\u0492\u04a3\u0003\u0166\u00b3\u0000\u0493\u0494"+ + "\n\u0007\u0000\u0000\u0494\u04a3\u0003\u00ceg\u0000\u0495\u0496\n\u0006"+ + "\u0000\u0000\u0496\u04a3\u0003L&\u0000\u0497\u0498\n\u0005\u0000\u0000"+ + "\u0498\u04a3\u0003\u0168\u00b4\u0000\u0499\u049a\n\u0004\u0000\u0000\u049a"+ + "\u04a3\u0003\u016a\u00b5\u0000\u049b\u049c\n\u0003\u0000\u0000\u049c\u049d"+ + "\u0003\u016a\u00b5\u0000\u049d\u049e\u0005\u0010\u0000\u0000\u049e\u049f"+ + "\u0003r9\u0000\u049f\u04a3\u0001\u0000\u0000\u0000\u04a0\u04a1\n\u0002"+ + "\u0000\u0000\u04a1\u04a3\u0003\u00ba]\u0000\u04a2\u048e\u0001\u0000\u0000"+ + "\u0000\u04a2\u0491\u0001\u0000\u0000\u0000\u04a2\u0493\u0001\u0000\u0000"+ + "\u0000\u04a2\u0495\u0001\u0000\u0000\u0000\u04a2\u0497\u0001\u0000\u0000"+ + "\u0000\u04a2\u0499\u0001\u0000\u0000\u0000\u04a2\u049b\u0001\u0000\u0000"+ + "\u0000\u04a2\u04a0\u0001\u0000\u0000\u0000\u04a3\u04a6\u0001\u0000\u0000"+ + "\u0000\u04a4\u04a2\u0001\u0000\u0000\u0000\u04a4\u04a5\u0001\u0000\u0000"+ + "\u0000\u04a5\u00b5\u0001\u0000\u0000\u0000\u04a6\u04a4\u0001\u0000\u0000"+ + "\u0000\u04a7\u04a8\u0003^/\u0000\u04a8\u04a9\u0003\u00b8\\\u0000\u04a9"+ + "\u00b7\u0001\u0000\u0000\u0000\u04aa\u04ac\u0005M\u0000\u0000\u04ab\u04ad"+ + "\u0005e\u0000\u0000\u04ac\u04ab\u0001\u0000\u0000\u0000\u04ac\u04ad\u0001"+ + "\u0000\u0000\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000\u04ae\u04b0\u0003"+ + "\u013e\u009f\u0000\u04af\u04b1\u0003p8\u0000\u04b0\u04af\u0001\u0000\u0000"+ + "\u0000\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u00b9\u0001\u0000\u0000"+ + "\u0000\u04b2\u04b4\u0005&\u0000\u0000\u04b3\u04b5\u0003\u00e6s\u0000\u04b4"+ + "\u04b3\u0001\u0000\u0000\u0000\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5"+ + "\u04b7\u0001\u0000\u0000\u0000\u04b6\u04b8\u0005m\u0000\u0000\u04b7\u04b6"+ + "\u0001\u0000\u0000\u0000\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8\u04b9"+ + "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0005\'\u0000\u0000\u04ba\u00bb\u0001"+ + "\u0000\u0000\u0000\u04bb\u04bc\u0005N\u0000\u0000\u04bc\u04c6\u0005h\u0000"+ + "\u0000\u04bd\u04c1\u0003\u00c0`\u0000\u04be\u04c1\u0003\u012c\u0096\u0000"+ + "\u04bf\u04c1\u0003\u00be_\u0000\u04c0\u04bd\u0001\u0000\u0000\u0000\u04c0"+ + "\u04be\u0001\u0000\u0000\u0000\u04c0\u04bf\u0001\u0000\u0000\u0000\u04c1"+ + "\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c3\u0003\u0170\u00b8\u0000\u04c3"+ + "\u04c5\u0001\u0000\u0000\u0000\u04c4\u04c0\u0001\u0000\u0000\u0000\u04c5"+ + "\u04c8\u0001\u0000\u0000\u0000\u04c6\u04c4\u0001\u0000\u0000\u0000\u04c6"+ + "\u04c7\u0001\u0000\u0000\u0000\u04c7\u04c9\u0001\u0000\u0000\u0000\u04c8"+ + "\u04c6\u0001\u0000\u0000\u0000\u04c9\u04ca\u0005i\u0000\u0000\u04ca\u00bd"+ + "\u0001\u0000\u0000\u0000\u04cb\u04cc\u00058\u0000\u0000\u04cc\u04cd\u0005"+ + "e\u0000\u0000\u04cd\u04ce\u0003\u0142\u00a1\u0000\u04ce\u00bf\u0001\u0000"+ + "\u0000\u0000\u04cf\u04d1\u0005\u001b\u0000\u0000\u04d0\u04cf\u0001\u0000"+ + "\u0000\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d2\u0001\u0000"+ + "\u0000\u0000\u04d2\u04d3\u0003^/\u0000\u04d3\u04d4\u0005e\u0000\u0000"+ + "\u04d4\u04d5\u0003\u0142\u00a1\u0000\u04d5\u04d6\u0003\u0140\u00a0\u0000"+ + "\u04d6\u04df\u0001\u0000\u0000\u0000\u04d7\u04d9\u0005\u001b\u0000\u0000"+ + "\u04d8\u04d7\u0001\u0000\u0000\u0000\u04d8\u04d9\u0001\u0000\u0000\u0000"+ + "\u04d9\u04da\u0001\u0000\u0000\u0000\u04da\u04db\u0003^/\u0000\u04db\u04dc"+ + "\u0005e\u0000\u0000\u04dc\u04dd\u0003\u0142\u00a1\u0000\u04dd\u04df\u0001"+ + "\u0000\u0000\u0000\u04de\u04d0\u0001\u0000\u0000\u0000\u04de\u04d8\u0001"+ + "\u0000\u0000\u0000\u04df\u00c1\u0001\u0000\u0000\u0000\u04e0\u04e8\u0003"+ + "\u012c\u0096\u0000\u04e1\u04e8\u0003\u00c4b\u0000\u04e2\u04e8\u0003P("+ + "\u0000\u04e3\u04e4\u0005f\u0000\u0000\u04e4\u04e5\u0003\u00c2a\u0000\u04e5"+ + "\u04e6\u0005g\u0000\u0000\u04e6\u04e8\u0001\u0000\u0000\u0000\u04e7\u04e0"+ + "\u0001\u0000\u0000\u0000\u04e7\u04e1\u0001\u0000\u0000\u0000\u04e7\u04e2"+ + "\u0001\u0000\u0000\u0000\u04e7\u04e3\u0001\u0000\u0000\u0000\u04e8\u00c3"+ + "\u0001\u0000\u0000\u0000\u04e9\u04f3\u0003\u012e\u0097\u0000\u04ea\u04f3"+ + "\u0003\u015e\u00af\u0000\u04eb\u04f3\u0003\u0134\u009a\u0000\u04ec\u04f3"+ + "\u0003\u013c\u009e\u0000\u04ed\u04f3\u0003\u00bc^\u0000\u04ee\u04f3\u0003"+ + "\u0136\u009b\u0000\u04ef\u04f3\u0003\u0138\u009c\u0000\u04f0\u04f3\u0003"+ + "\u013a\u009d\u0000\u04f1\u04f3\u0003\u00c6c\u0000\u04f2\u04e9\u0001\u0000"+ + "\u0000\u0000\u04f2\u04ea\u0001\u0000\u0000\u0000\u04f2\u04eb\u0001\u0000"+ + "\u0000\u0000\u04f2\u04ec\u0001\u0000\u0000\u0000\u04f2\u04ed\u0001\u0000"+ + "\u0000\u0000\u04f2\u04ee\u0001\u0000\u0000\u0000\u04f2\u04ef\u0001\u0000"+ + "\u0000\u0000\u04f2\u04f0\u0001\u0000\u0000\u0000\u04f2\u04f1\u0001\u0000"+ + "\u0000\u0000\u04f3\u00c5\u0001\u0000\u0000\u0000\u04f4\u04f5\u00058\u0000"+ + "\u0000\u04f5\u04f6\u0003\u00c8d\u0000\u04f6\u00c7\u0001\u0000\u0000\u0000"+ + "\u04f7\u0503\u0005f\u0000\u0000\u04f8\u04fd\u0003\u00c2a\u0000\u04f9\u04fa"+ + "\u0005m\u0000\u0000\u04fa\u04fc\u0003\u00c2a\u0000\u04fb\u04f9\u0001\u0000"+ + "\u0000\u0000\u04fc\u04ff\u0001\u0000\u0000\u0000\u04fd\u04fb\u0001\u0000"+ + "\u0000\u0000\u04fd\u04fe\u0001\u0000\u0000\u0000\u04fe\u0501\u0001\u0000"+ + "\u0000\u0000\u04ff\u04fd\u0001\u0000\u0000\u0000\u0500\u0502\u0005m\u0000"+ + "\u0000\u0501\u0500\u0001\u0000\u0000\u0000\u0501\u0502\u0001\u0000\u0000"+ + "\u0000\u0502\u0504\u0001\u0000\u0000\u0000\u0503\u04f8\u0001\u0000\u0000"+ + "\u0000\u0503\u0504\u0001\u0000\u0000\u0000\u0504\u0505\u0001\u0000\u0000"+ + "\u0000\u0505\u0506\u0005g\u0000\u0000\u0506\u00c9\u0001\u0000\u0000\u0000"+ + "\u0507\u050f\u0003\u015e\u00af\u0000\u0508\u050f\u0003\u012e\u0097\u0000"+ + "\u0509\u050f\u0003\u00ccf\u0000\u050a\u050f\u0003\u0136\u009b\u0000\u050b"+ + "\u050f\u0003\u0138\u009c\u0000\u050c\u050f\u0003P(\u0000\u050d\u050f\u0003"+ + "\u012c\u0096\u0000\u050e\u0507\u0001\u0000\u0000\u0000\u050e\u0508\u0001"+ + "\u0000\u0000\u0000\u050e\u0509\u0001\u0000\u0000\u0000\u050e\u050a\u0001"+ + "\u0000\u0000\u0000\u050e\u050b\u0001\u0000\u0000\u0000\u050e\u050c\u0001"+ + "\u0000\u0000\u0000\u050e\u050d\u0001\u0000\u0000\u0000\u050f\u00cb\u0001"+ + "\u0000\u0000\u0000\u0510\u0511\u0005j\u0000\u0000\u0511\u0512\u0005t\u0000"+ + "\u0000\u0512\u0513\u0005k\u0000\u0000\u0513\u0514\u0003\u0132\u0099\u0000"+ + "\u0514\u00cd\u0001\u0000\u0000\u0000\u0515\u0525\u0005j\u0000\u0000\u0516"+ + "\u0518\u0003\u00d0h\u0000\u0517\u0516\u0001\u0000\u0000\u0000\u0517\u0518"+ + "\u0001\u0000\u0000\u0000\u0518\u0519\u0001\u0000\u0000\u0000\u0519\u051b"+ + "\u0005o\u0000\u0000\u051a\u051c\u0003\u00d2i\u0000\u051b\u051a\u0001\u0000"+ + "\u0000\u0000\u051b\u051c\u0001\u0000\u0000\u0000\u051c\u0526\u0001\u0000"+ + "\u0000\u0000\u051d\u051f\u0003\u00d0h\u0000\u051e\u051d\u0001\u0000\u0000"+ + "\u0000\u051e\u051f\u0001\u0000\u0000\u0000\u051f\u0520\u0001\u0000\u0000"+ + "\u0000\u0520\u0521\u0005o\u0000\u0000\u0521\u0522\u0003\u00d2i\u0000\u0522"+ + "\u0523\u0005o\u0000\u0000\u0523\u0524\u0003\u00d4j\u0000\u0524\u0526\u0001"+ + "\u0000\u0000\u0000\u0525\u0517\u0001\u0000\u0000\u0000\u0525\u051e\u0001"+ + "\u0000\u0000\u0000\u0526\u0527\u0001\u0000\u0000\u0000\u0527\u0528\u0005"+ + "k\u0000\u0000\u0528\u00cf\u0001\u0000\u0000\u0000\u0529\u052a\u0003\u00a4"+ + "R\u0000\u052a\u00d1\u0001\u0000\u0000\u0000\u052b\u052c\u0003\u00a4R\u0000"+ + "\u052c\u00d3\u0001\u0000\u0000\u0000\u052d\u052e\u0003\u00a4R\u0000\u052e"+ + "\u00d5\u0001\u0000\u0000\u0000\u052f\u0531\u0007\u000e\u0000\u0000\u0530"+ + "\u052f\u0001\u0000\u0000\u0000\u0530\u0531\u0001\u0000\u0000\u0000\u0531"+ + "\u0532\u0001\u0000\u0000\u0000\u0532\u0533\u0005l\u0000\u0000\u0533\u00d7"+ + "\u0001\u0000\u0000\u0000\u0534\u0535\u0003\u00e6s\u0000\u0535\u0536\u0005"+ + "l\u0000\u0000\u0536\u053b\u0001\u0000\u0000\u0000\u0537\u0538\u0003\u0006"+ + "\u0003\u0000\u0538\u0539\u0005s\u0000\u0000\u0539\u053b\u0001\u0000\u0000"+ + "\u0000\u053a\u0534\u0001\u0000\u0000\u0000\u053a\u0537\u0001\u0000\u0000"+ + "\u0000\u053a\u053b\u0001\u0000\u0000\u0000\u053b\u053c\u0001\u0000\u0000"+ + "\u0000\u053c\u053d\u0005]\u0000\u0000\u053d\u0542\u0003\u00a4R\u0000\u053e"+ + "\u0540\u0005J\u0000\u0000\u053f\u0541\u0005e\u0000\u0000\u0540\u053f\u0001"+ + "\u0000\u0000\u0000\u0540\u0541\u0001\u0000\u0000\u0000\u0541\u0543\u0001"+ + "\u0000\u0000\u0000\u0542\u053e\u0001\u0000\u0000\u0000\u0542\u0543\u0001"+ + "\u0000\u0000\u0000\u0543\u00d9\u0001\u0000\u0000\u0000\u0544\u0545\u0005"+ + "X\u0000\u0000\u0545\u0546\u0005e\u0000\u0000\u0546\u00db\u0001\u0000\u0000"+ + "\u0000\u0547\u0548\u0003\u0162\u00b1\u0000\u0548\u00dd\u0001\u0000\u0000"+ + "\u0000\u0549\u054d\u0003\u00e0p\u0000\u054a\u054d\u0003\u00e8t\u0000\u054b"+ + "\u054d\u0003\u00ecv\u0000\u054c\u0549\u0001\u0000\u0000\u0000\u054c\u054a"+ + "\u0001\u0000\u0000\u0000\u054c\u054b\u0001\u0000\u0000\u0000\u054d\u00df"+ + "\u0001\u0000\u0000\u0000\u054e\u055a\u0005Z\u0000\u0000\u054f\u055b\u0003"+ + "\u00e2q\u0000\u0550\u0556\u0005f\u0000\u0000\u0551\u0552\u0003\u00e2q"+ + "\u0000\u0552\u0553\u0003\u0170\u00b8\u0000\u0553\u0555\u0001\u0000\u0000"+ + "\u0000\u0554\u0551\u0001\u0000\u0000\u0000\u0555\u0558\u0001\u0000\u0000"+ + "\u0000\u0556\u0554\u0001\u0000\u0000\u0000\u0556\u0557\u0001\u0000\u0000"+ + "\u0000\u0557\u0559\u0001\u0000\u0000\u0000\u0558\u0556\u0001\u0000\u0000"+ + "\u0000\u0559\u055b\u0005g\u0000\u0000\u055a\u054f\u0001\u0000\u0000\u0000"+ + "\u055a\u0550\u0001\u0000\u0000\u0000\u055b\u00e1\u0001\u0000\u0000\u0000"+ + "\u055c\u0562\u0003\u00e4r\u0000\u055d\u055f\u0003\u00c2a\u0000\u055e\u055d"+ + "\u0001\u0000\u0000\u0000\u055e\u055f\u0001\u0000\u0000\u0000\u055f\u0560"+ + "\u0001\u0000\u0000\u0000\u0560\u0561\u0005l\u0000\u0000\u0561\u0563\u0003"+ + "\u00e6s\u0000\u0562\u055e\u0001\u0000\u0000\u0000\u0562\u0563\u0001\u0000"+ + "\u0000\u0000\u0563\u00e3\u0001\u0000\u0000\u0000\u0564\u0569\u0005e\u0000"+ + "\u0000\u0565\u0566\u0005m\u0000\u0000\u0566\u0568\u0005e\u0000\u0000\u0567"+ + "\u0565\u0001\u0000\u0000\u0000\u0568\u056b\u0001\u0000\u0000\u0000\u0569"+ + "\u0567\u0001\u0000\u0000\u0000\u0569\u056a\u0001\u0000\u0000\u0000\u056a"+ + "\u00e5\u0001\u0000\u0000\u0000\u056b\u0569\u0001\u0000\u0000\u0000\u056c"+ + "\u0571\u0003\u00a4R\u0000\u056d\u056e\u0005m\u0000\u0000\u056e\u0570\u0003"+ + "\u00a4R\u0000\u056f\u056d\u0001\u0000\u0000\u0000\u0570\u0573\u0001\u0000"+ + "\u0000\u0000\u0571\u056f\u0001\u0000\u0000\u0000\u0571\u0572\u0001\u0000"+ + "\u0000\u0000\u0572\u00e7\u0001\u0000\u0000\u0000\u0573\u0571\u0001\u0000"+ + "\u0000\u0000\u0574\u0580\u0005^\u0000\u0000\u0575\u0581\u0003\u00eau\u0000"+ + "\u0576\u057c\u0005f\u0000\u0000\u0577\u0578\u0003\u00eau\u0000\u0578\u0579"+ + "\u0003\u0170\u00b8\u0000\u0579\u057b\u0001\u0000\u0000\u0000\u057a\u0577"+ + "\u0001\u0000\u0000\u0000\u057b\u057e\u0001\u0000\u0000\u0000\u057c\u057a"+ + "\u0001\u0000\u0000\u0000\u057c\u057d\u0001\u0000\u0000\u0000\u057d\u057f"+ + "\u0001\u0000\u0000\u0000\u057e\u057c\u0001\u0000\u0000\u0000\u057f\u0581"+ + "\u0005g\u0000\u0000\u0580\u0575\u0001\u0000\u0000\u0000\u0580\u0576\u0001"+ + "\u0000\u0000\u0000\u0581\u00e9\u0001\u0000\u0000\u0000\u0582\u0584\u0005"+ + "e\u0000\u0000\u0583\u0585\u0005l\u0000\u0000\u0584\u0583\u0001\u0000\u0000"+ + "\u0000\u0584\u0585\u0001\u0000\u0000\u0000\u0585\u0586\u0001\u0000\u0000"+ + "\u0000\u0586\u0587\u0003\u00c2a\u0000\u0587\u00eb\u0001\u0000\u0000\u0000"+ + "\u0588\u0594\u0005c\u0000\u0000\u0589\u0595\u0003\u0096K\u0000\u058a\u0590"+ + "\u0005f\u0000\u0000\u058b\u058c\u0003\u0096K\u0000\u058c\u058d\u0003\u0170"+ + "\u00b8\u0000\u058d\u058f\u0001\u0000\u0000\u0000\u058e\u058b\u0001\u0000"+ + "\u0000\u0000\u058f\u0592\u0001\u0000\u0000\u0000\u0590\u058e\u0001\u0000"+ + "\u0000\u0000\u0590\u0591\u0001\u0000\u0000\u0000\u0591\u0593\u0001\u0000"+ + "\u0000\u0000\u0592\u0590\u0001\u0000\u0000\u0000\u0593\u0595\u0005g\u0000"+ + "\u0000\u0594\u0589\u0001\u0000\u0000\u0000\u0594\u058a\u0001\u0000\u0000"+ + "\u0000\u0595\u00ed\u0001\u0000\u0000\u0000\u0596\u0598\u0005h\u0000\u0000"+ + "\u0597\u0599\u0003\u00f0x\u0000\u0598\u0597\u0001\u0000\u0000\u0000\u0598"+ + "\u0599\u0001\u0000\u0000\u0000\u0599\u059a\u0001\u0000\u0000\u0000\u059a"+ + "\u059b\u0005i\u0000\u0000\u059b\u00ef\u0001\u0000\u0000\u0000\u059c\u059e"+ + "\u0005n\u0000\u0000\u059d\u059c\u0001\u0000\u0000\u0000\u059d\u059e\u0001"+ + "\u0000\u0000\u0000\u059e\u05a4\u0001\u0000\u0000\u0000\u059f\u05a1\u0005"+ + "\u009f\u0000\u0000\u05a0\u059f\u0001\u0000\u0000\u0000\u05a0\u05a1\u0001"+ + "\u0000\u0000\u0000\u05a1\u05a4\u0001\u0000\u0000\u0000\u05a2\u05a4\u0004"+ + "x\u0012\u0000\u05a3\u059d\u0001\u0000\u0000\u0000\u05a3\u05a0\u0001\u0000"+ + "\u0000\u0000\u05a3\u05a2\u0001\u0000\u0000\u0000\u05a4\u05a5\u0001\u0000"+ + "\u0000\u0000\u05a5\u05a6\u0003\u00a6S\u0000\u05a6\u05a7\u0003\u0170\u00b8"+ + "\u0000\u05a7\u05a9\u0001\u0000\u0000\u0000\u05a8\u05a3\u0001\u0000\u0000"+ + "\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000\u05aa\u05a8\u0001\u0000\u0000"+ + "\u0000\u05aa\u05ab\u0001\u0000\u0000\u0000\u05ab\u00f1\u0001\u0000\u0000"+ + "\u0000\u05ac\u05b2\u0003\u00f6{\u0000\u05ad\u05b2\u0003\u00f8|\u0000\u05ae"+ + "\u05b2\u0003\u00fa}\u0000\u05af\u05b2\u0003\u00f4z\u0000\u05b0\u05b2\u0003"+ + "\u0098L\u0000\u05b1\u05ac\u0001\u0000\u0000\u0000\u05b1\u05ad\u0001\u0000"+ + "\u0000\u0000\u05b1\u05ae\u0001\u0000\u0000\u0000\u05b1\u05af\u0001\u0000"+ + "\u0000\u0000\u05b1\u05b0\u0001\u0000\u0000\u0000\u05b2\u00f3\u0001\u0000"+ + "\u0000\u0000\u05b3\u05b4\u0003\u00a4R\u0000\u05b4\u00f5\u0001\u0000\u0000"+ + "\u0000\u05b5\u05b6\u0003\u00a4R\u0000\u05b6\u05b7\u0005\u0089\u0000\u0000"+ + "\u05b7\u05b8\u0003\u00a4R\u0000\u05b8\u00f7\u0001\u0000\u0000\u0000\u05b9"+ + "\u05ba\u0003\u00a4R\u0000\u05ba\u05bb\u0007\u000f\u0000\u0000\u05bb\u00f9"+ + "\u0001\u0000\u0000\u0000\u05bc\u05bd\u0003\u00e6s\u0000\u05bd\u05be\u0003"+ + "\u00d6k\u0000\u05be\u05bf\u0003\u00e6s\u0000\u05bf\u00fb\u0001\u0000\u0000"+ + "\u0000\u05c0\u05c1\u0007\u0010\u0000\u0000\u05c1\u00fd\u0001\u0000\u0000"+ + "\u0000\u05c2\u05c3\u0005e\u0000\u0000\u05c3\u05c5\u0005o\u0000\u0000\u05c4"+ + "\u05c6\u0003\u00a6S\u0000\u05c5\u05c4\u0001\u0000\u0000\u0000\u05c5\u05c6"+ + "\u0001\u0000\u0000\u0000\u05c6\u00ff\u0001\u0000\u0000\u0000\u05c7\u05c9"+ + "\u0005b\u0000\u0000\u05c8\u05ca\u0003\u00e6s\u0000\u05c9\u05c8\u0001\u0000"+ + "\u0000\u0000\u05c9\u05ca\u0001\u0000\u0000\u0000\u05ca\u0101\u0001\u0000"+ + "\u0000\u0000\u05cb\u05cd\u0005K\u0000\u0000\u05cc\u05ce\u0005e\u0000\u0000"+ + "\u05cd\u05cc\u0001\u0000\u0000\u0000\u05cd\u05ce\u0001\u0000\u0000\u0000"+ + "\u05ce\u0103\u0001\u0000\u0000\u0000\u05cf\u05d1\u0005_\u0000\u0000\u05d0"+ + "\u05d2\u0005e\u0000\u0000\u05d1\u05d0\u0001\u0000\u0000\u0000\u05d1\u05d2"+ + "\u0001\u0000\u0000\u0000\u05d2\u0105\u0001\u0000\u0000\u0000\u05d3\u05d4"+ + "\u0005W\u0000\u0000\u05d4\u05d5\u0005e\u0000\u0000\u05d5\u0107\u0001\u0000"+ + "\u0000\u0000\u05d6\u05d7\u0005[\u0000\u0000\u05d7\u0109\u0001\u0000\u0000"+ + "\u0000\u05d8\u05e1\u0005\\\u0000\u0000\u05d9\u05e2\u0003\u00a4R\u0000"+ + "\u05da\u05db\u0003\u0170\u00b8\u0000\u05db\u05dc\u0003\u00a4R\u0000\u05dc"+ + "\u05e2\u0001\u0000\u0000\u0000\u05dd\u05de\u0003\u00f2y\u0000\u05de\u05df"+ + "\u0003\u0170\u00b8\u0000\u05df\u05e0\u0003\u00a4R\u0000\u05e0\u05e2\u0001"+ + "\u0000\u0000\u0000\u05e1\u05d9\u0001\u0000\u0000\u0000\u05e1\u05da\u0001"+ + "\u0000\u0000\u0000\u05e1\u05dd\u0001\u0000\u0000\u0000\u05e2\u05e3\u0001"+ + "\u0000\u0000\u0000\u05e3\u05e9\u0003\u00eew\u0000\u05e4\u05e7\u0005V\u0000"+ + "\u0000\u05e5\u05e8\u0003\u010a\u0085\u0000\u05e6\u05e8\u0003\u00eew\u0000"+ + "\u05e7\u05e5\u0001\u0000\u0000\u0000\u05e7\u05e6\u0001\u0000\u0000\u0000"+ + "\u05e8\u05ea\u0001\u0000\u0000\u0000\u05e9\u05e4\u0001\u0000\u0000\u0000"+ + "\u05e9\u05ea\u0001\u0000\u0000\u0000\u05ea\u010b\u0001\u0000\u0000\u0000"+ + "\u05eb\u05ee\u0003\u010e\u0087\u0000\u05ec\u05ee\u0003\u0114\u008a\u0000"+ + "\u05ed\u05eb\u0001\u0000\u0000\u0000\u05ed\u05ec\u0001\u0000\u0000\u0000"+ + "\u05ee\u010d\u0001\u0000\u0000\u0000\u05ef\u05fa\u0005Y\u0000\u0000\u05f0"+ + "\u05f2\u0003\u00a4R\u0000\u05f1\u05f0\u0001\u0000\u0000\u0000\u05f1\u05f2"+ + "\u0001\u0000\u0000\u0000\u05f2\u05fb\u0001\u0000\u0000\u0000\u05f3\u05f5"+ + "\u0003\u00f2y\u0000\u05f4\u05f3\u0001\u0000\u0000\u0000\u05f4\u05f5\u0001"+ + "\u0000\u0000\u0000\u05f5\u05f6\u0001\u0000\u0000\u0000\u05f6\u05f8\u0003"+ + "\u0170\u00b8\u0000\u05f7\u05f9\u0003\u00a4R\u0000\u05f8\u05f7\u0001\u0000"+ + "\u0000\u0000\u05f8\u05f9\u0001\u0000\u0000\u0000\u05f9\u05fb\u0001\u0000"+ + "\u0000\u0000\u05fa\u05f1\u0001\u0000\u0000\u0000\u05fa\u05f4\u0001\u0000"+ + "\u0000\u0000\u05fb\u05fc\u0001\u0000\u0000\u0000\u05fc\u0600\u0005h\u0000"+ + "\u0000\u05fd\u05ff\u0003\u0110\u0088\u0000\u05fe\u05fd\u0001\u0000\u0000"+ + "\u0000\u05ff\u0602\u0001\u0000\u0000\u0000\u0600\u05fe\u0001\u0000\u0000"+ + "\u0000\u0600\u0601\u0001\u0000\u0000\u0000\u0601\u0603\u0001\u0000\u0000"+ + "\u0000\u0602\u0600\u0001\u0000\u0000\u0000\u0603\u0604\u0005i\u0000\u0000"+ + "\u0604\u010f\u0001\u0000\u0000\u0000\u0605\u0606\u0003\u0112\u0089\u0000"+ + "\u0606\u0608\u0005o\u0000\u0000\u0607\u0609\u0003\u00f0x\u0000\u0608\u0607"+ + "\u0001\u0000\u0000\u0000\u0608\u0609\u0001\u0000\u0000\u0000\u0609\u0111"+ + "\u0001\u0000\u0000\u0000\u060a\u060b\u0005P\u0000\u0000\u060b\u060e\u0003"+ + "\u00e6s\u0000\u060c\u060e\u0005L\u0000\u0000\u060d\u060a\u0001\u0000\u0000"+ + "\u0000\u060d\u060c\u0001\u0000\u0000\u0000\u060e\u0113\u0001\u0000\u0000"+ + "\u0000\u060f\u0618\u0005Y\u0000\u0000\u0610\u0619\u0003\u0116\u008b\u0000"+ + "\u0611\u0612\u0003\u0170\u00b8\u0000\u0612\u0613\u0003\u0116\u008b\u0000"+ + "\u0613\u0619\u0001\u0000\u0000\u0000\u0614\u0615\u0003\u00f2y\u0000\u0615"+ + "\u0616\u0003\u0170\u00b8\u0000\u0616\u0617\u0003\u0116\u008b\u0000\u0617"+ + "\u0619\u0001\u0000\u0000\u0000\u0618\u0610\u0001\u0000\u0000\u0000\u0618"+ + "\u0611\u0001\u0000\u0000\u0000\u0618\u0614\u0001\u0000\u0000\u0000\u0619"+ + "\u061a\u0001\u0000\u0000\u0000\u061a\u061e\u0005h\u0000\u0000\u061b\u061d"+ + "\u0003\u0118\u008c\u0000\u061c\u061b\u0001\u0000\u0000\u0000\u061d\u0620"+ + "\u0001\u0000\u0000\u0000\u061e\u061c\u0001\u0000\u0000\u0000\u061e\u061f"+ + "\u0001\u0000\u0000\u0000\u061f\u0621\u0001\u0000\u0000\u0000\u0620\u061e"+ + "\u0001\u0000\u0000\u0000\u0621\u0622\u0005i\u0000\u0000\u0622\u0115\u0001"+ + "\u0000\u0000\u0000\u0623\u0624\u0005e\u0000\u0000\u0624\u0626\u0005s\u0000"+ + "\u0000\u0625\u0623\u0001\u0000\u0000\u0000\u0625\u0626\u0001\u0000\u0000"+ + "\u0000\u0626\u0627\u0001\u0000\u0000\u0000\u0627\u0628\u0003\u00b4Z\u0000"+ + "\u0628\u0629\u0005p\u0000\u0000\u0629\u062a\u0005f\u0000\u0000\u062a\u062b"+ + "\u0005^\u0000\u0000\u062b\u062c\u0005g\u0000\u0000\u062c\u0117\u0001\u0000"+ + "\u0000\u0000\u062d\u062e\u0003\u011a\u008d\u0000\u062e\u0630\u0005o\u0000"+ + "\u0000\u062f\u0631\u0003\u00f0x\u0000\u0630\u062f\u0001\u0000\u0000\u0000"+ + "\u0630\u0631\u0001\u0000\u0000\u0000\u0631\u0119\u0001\u0000\u0000\u0000"+ + "\u0632\u0633\u0005P\u0000\u0000\u0633\u0636\u0003\u011c\u008e\u0000\u0634"+ + "\u0636\u0005L\u0000\u0000\u0635\u0632\u0001\u0000\u0000\u0000\u0635\u0634"+ + "\u0001\u0000\u0000\u0000\u0636\u011b\u0001\u0000\u0000\u0000\u0637\u063a"+ + "\u0003\u00c2a\u0000\u0638\u063a\u0005d\u0000\u0000\u0639\u0637\u0001\u0000"+ + "\u0000\u0000\u0639\u0638\u0001\u0000\u0000\u0000\u063a\u0642\u0001\u0000"+ + "\u0000\u0000\u063b\u063e\u0005m\u0000\u0000\u063c\u063f\u0003\u00c2a\u0000"+ + "\u063d\u063f\u0005d\u0000\u0000\u063e\u063c\u0001\u0000\u0000\u0000\u063e"+ + "\u063d\u0001\u0000\u0000\u0000\u063f\u0641\u0001\u0000\u0000\u0000\u0640"+ + "\u063b\u0001\u0000\u0000\u0000\u0641\u0644\u0001\u0000\u0000\u0000\u0642"+ + "\u0640\u0001\u0000\u0000\u0000\u0642\u0643\u0001\u0000\u0000\u0000\u0643"+ + "\u011d\u0001\u0000\u0000\u0000\u0644\u0642\u0001\u0000\u0000\u0000\u0645"+ + "\u0646\u0005O\u0000\u0000\u0646\u064a\u0005h\u0000\u0000\u0647\u0649\u0003"+ + "\u0120\u0090\u0000\u0648\u0647\u0001\u0000\u0000\u0000\u0649\u064c\u0001"+ + "\u0000\u0000\u0000\u064a\u0648\u0001\u0000\u0000\u0000\u064a\u064b\u0001"+ + "\u0000\u0000\u0000\u064b\u064d\u0001\u0000\u0000\u0000\u064c\u064a\u0001"+ + "\u0000\u0000\u0000\u064d\u064e\u0005i\u0000\u0000\u064e\u011f\u0001\u0000"+ + "\u0000\u0000\u064f\u0650\u0003\u0122\u0091\u0000\u0650\u0652\u0005o\u0000"+ + "\u0000\u0651\u0653\u0003\u00f0x\u0000\u0652\u0651\u0001\u0000\u0000\u0000"+ + "\u0652\u0653\u0001\u0000\u0000\u0000\u0653\u0121\u0001\u0000\u0000\u0000"+ + "\u0654\u0657\u0005P\u0000\u0000\u0655\u0658\u0003\u00f6{\u0000\u0656\u0658"+ + "\u0003\u0124\u0092\u0000\u0657\u0655\u0001\u0000\u0000\u0000\u0657\u0656"+ + "\u0001\u0000\u0000\u0000\u0658\u065b\u0001\u0000\u0000\u0000\u0659\u065b"+ + "\u0005L\u0000\u0000\u065a\u0654\u0001\u0000\u0000\u0000\u065a\u0659\u0001"+ + "\u0000\u0000\u0000\u065b\u0123\u0001\u0000\u0000\u0000\u065c\u065d\u0003"+ + "\u00e6s\u0000\u065d\u065e\u0005l\u0000\u0000\u065e\u0663\u0001\u0000\u0000"+ + "\u0000\u065f\u0660\u0003\u00e4r\u0000\u0660\u0661\u0005s\u0000\u0000\u0661"+ + "\u0663\u0001\u0000\u0000\u0000\u0662\u065c\u0001\u0000\u0000\u0000\u0662"+ + "\u065f\u0001\u0000\u0000\u0000\u0662\u0663\u0001\u0000\u0000\u0000\u0663"+ + "\u0664\u0001\u0000\u0000\u0000\u0664\u0665\u0003\u00a4R\u0000\u0665\u0125"+ + "\u0001\u0000\u0000\u0000\u0666\u066e\u0005`\u0000\u0000\u0667\u0669\u0003"+ + "\u00a4R\u0000\u0668\u0667\u0001\u0000\u0000\u0000\u0668\u0669\u0001\u0000"+ + "\u0000\u0000\u0669\u066f\u0001\u0000\u0000\u0000\u066a\u066f\u0003\u0128"+ + "\u0094\u0000\u066b\u066d\u0003\u00d8l\u0000\u066c\u066b\u0001\u0000\u0000"+ + "\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d\u066f\u0001\u0000\u0000"+ + "\u0000\u066e\u0668\u0001\u0000\u0000\u0000\u066e\u066a\u0001\u0000\u0000"+ + "\u0000\u066e\u066c\u0001\u0000\u0000\u0000\u066f\u0670\u0001\u0000\u0000"+ + "\u0000\u0670\u0671\u0003\u00eew\u0000\u0671\u0127\u0001\u0000\u0000\u0000"+ + "\u0672\u0674\u0003\u00f2y\u0000\u0673\u0672\u0001\u0000\u0000\u0000\u0673"+ + "\u0674\u0001\u0000\u0000\u0000\u0674\u0675\u0001\u0000\u0000\u0000\u0675"+ + "\u0677\u0003\u0170\u00b8\u0000\u0676\u0678\u0003\u00a4R\u0000\u0677\u0676"+ + "\u0001\u0000\u0000\u0000\u0677\u0678\u0001\u0000\u0000\u0000\u0678\u0679"+ + "\u0001\u0000\u0000\u0000\u0679\u067b\u0003\u0170\u00b8\u0000\u067a\u067c"+ + "\u0003\u00f2y\u0000\u067b\u067a\u0001\u0000\u0000\u0000\u067b\u067c\u0001"+ + "\u0000\u0000\u0000\u067c\u0129\u0001\u0000\u0000\u0000\u067d\u067e\u0005"+ + "R\u0000\u0000\u067e\u067f\u0003\u00a4R\u0000\u067f\u012b\u0001\u0000\u0000"+ + "\u0000\u0680\u0683\u0003\u0150\u00a8\u0000\u0681\u0683\u0005e\u0000\u0000"+ + "\u0682\u0680\u0001\u0000\u0000\u0000\u0682\u0681\u0001\u0000\u0000\u0000"+ + "\u0683\u012d\u0001\u0000\u0000\u0000\u0684\u0685\u0005j\u0000\u0000\u0685"+ + "\u0686\u0003\u0130\u0098\u0000\u0686\u0687\u0005k\u0000\u0000\u0687\u0688"+ + "\u0003\u0132\u0099\u0000\u0688\u012f\u0001\u0000\u0000\u0000\u0689\u068a"+ + "\u0003\u00a4R\u0000\u068a\u0131\u0001\u0000\u0000\u0000\u068b\u068c\u0003"+ + "\u00c2a\u0000\u068c\u0133\u0001\u0000\u0000\u0000\u068d\u068e\u0005\u0087"+ + "\u0000\u0000\u068e\u068f\u0003\u00c2a\u0000\u068f\u0135\u0001\u0000\u0000"+ + "\u0000\u0690\u0691\u0005j\u0000\u0000\u0691\u0692\u0005k\u0000\u0000\u0692"+ + "\u0693\u0003\u0132\u0099\u0000\u0693\u0137\u0001\u0000\u0000\u0000\u0694"+ + "\u0695\u0005S\u0000\u0000\u0695\u0696\u0005j\u0000\u0000\u0696\u0697\u0003"+ + "\u00c2a\u0000\u0697\u0698\u0005k\u0000\u0000\u0698\u0699\u0003\u0132\u0099"+ + "\u0000\u0699\u0139\u0001\u0000\u0000\u0000\u069a\u06a0\u0005U\u0000\u0000"+ + "\u069b\u069c\u0005U\u0000\u0000\u069c\u06a0\u0005\u0089\u0000\u0000\u069d"+ + "\u069e\u0005\u0089\u0000\u0000\u069e\u06a0\u0005U\u0000\u0000\u069f\u069a"+ + "\u0001\u0000\u0000\u0000\u069f\u069b\u0001\u0000\u0000\u0000\u069f\u069d"+ + "\u0001\u0000\u0000\u0000\u06a0\u06a1\u0001\u0000\u0000\u0000\u06a1\u06a2"+ + "\u0003\u0132\u0099\u0000\u06a2\u013b\u0001\u0000\u0000\u0000\u06a3\u06a4"+ + "\u0005M\u0000\u0000\u06a4\u06a5\u0003\u013e\u009f\u0000\u06a5\u013d\u0001"+ + "\u0000\u0000\u0000\u06a6\u06a7\u0003\u0142\u00a1\u0000\u06a7\u06a8\u0003"+ + "\u0140\u00a0\u0000\u06a8\u06ab\u0001\u0000\u0000\u0000\u06a9\u06ab\u0003"+ + "\u0142\u00a1\u0000\u06aa\u06a6\u0001\u0000\u0000\u0000\u06aa\u06a9\u0001"+ + "\u0000\u0000\u0000\u06ab\u013f\u0001\u0000\u0000\u0000\u06ac\u06af\u0003"+ + "\u0142\u00a1\u0000\u06ad\u06af\u0003\u00c2a\u0000\u06ae\u06ac\u0001\u0000"+ + "\u0000\u0000\u06ae\u06ad\u0001\u0000\u0000\u0000\u06af\u0141\u0001\u0000"+ + "\u0000\u0000\u06b0\u06bc\u0005f\u0000\u0000\u06b1\u06b6\u0003\u009cN\u0000"+ + "\u06b2\u06b3\u0005m\u0000\u0000\u06b3\u06b5\u0003\u009cN\u0000\u06b4\u06b2"+ + "\u0001\u0000\u0000\u0000\u06b5\u06b8\u0001\u0000\u0000\u0000\u06b6\u06b4"+ + "\u0001\u0000\u0000\u0000\u06b6\u06b7\u0001\u0000\u0000\u0000\u06b7\u06ba"+ + "\u0001\u0000\u0000\u0000\u06b8\u06b6\u0001\u0000\u0000\u0000\u06b9\u06bb"+ + "\u0005m\u0000\u0000\u06ba\u06b9\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001"+ + "\u0000\u0000\u0000\u06bb\u06bd\u0001\u0000\u0000\u0000\u06bc\u06b1\u0001"+ + "\u0000\u0000\u0000\u06bc\u06bd\u0001\u0000\u0000\u0000\u06bd\u06be\u0001"+ + "\u0000\u0000\u0000\u06be\u06bf\u0005g\u0000\u0000\u06bf\u0143\u0001\u0000"+ + "\u0000\u0000\u06c0\u06c1\u0003\u0146\u00a3\u0000\u06c1\u06c2\u0005f\u0000"+ + "\u0000\u06c2\u06c4\u0003\u00a4R\u0000\u06c3\u06c5\u0005m\u0000\u0000\u06c4"+ + "\u06c3\u0001\u0000\u0000\u0000\u06c4\u06c5\u0001\u0000\u0000\u0000\u06c5"+ + "\u06c6\u0001\u0000\u0000\u0000\u06c6\u06c7\u0005g\u0000\u0000\u06c7\u0145"+ + "\u0001\u0000\u0000\u0000\u06c8\u06ce\u0003\u00c4b\u0000\u06c9\u06ca\u0005"+ + "f\u0000\u0000\u06ca\u06cb\u0003\u0146\u00a3\u0000\u06cb\u06cc\u0005g\u0000"+ + "\u0000\u06cc\u06ce\u0001\u0000\u0000\u0000\u06cd\u06c8\u0001\u0000\u0000"+ + "\u0000\u06cd\u06c9\u0001\u0000\u0000\u0000\u06ce\u0147\u0001\u0000\u0000"+ + "\u0000\u06cf\u06d6\u0003\u014a\u00a5\u0000\u06d0\u06d6\u0003\u014e\u00a7"+ + "\u0000\u06d1\u06d2\u0005f\u0000\u0000\u06d2\u06d3\u0003\u00a4R\u0000\u06d3"+ + "\u06d4\u0005g\u0000\u0000\u06d4\u06d6\u0001\u0000\u0000\u0000\u06d5\u06cf"+ + "\u0001\u0000\u0000\u0000\u06d5\u06d0\u0001\u0000\u0000\u0000\u06d5\u06d1"+ + "\u0001\u0000\u0000\u0000\u06d6\u0149\u0001\u0000\u0000\u0000\u06d7\u06db"+ + "\u0003\u00b2Y\u0000\u06d8\u06db\u0003\u0152\u00a9\u0000\u06d9\u06db\u0003"+ + "\u00b6[\u0000\u06da\u06d7\u0001\u0000\u0000\u0000\u06da\u06d8\u0001\u0000"+ + "\u0000\u0000\u06da\u06d9\u0001\u0000\u0000\u0000\u06db\u014b\u0001\u0000"+ + "\u0000\u0000\u06dc\u06dd\u0007\u0011\u0000\u0000\u06dd\u014d\u0001\u0000"+ + "\u0000\u0000\u06de\u06df\u0005e\u0000\u0000\u06df\u014f\u0001\u0000\u0000"+ + "\u0000\u06e0\u06e1\u0005e\u0000\u0000\u06e1\u06e2\u0005p\u0000\u0000\u06e2"+ + "\u06e3\u0005e\u0000\u0000\u06e3\u0151\u0001\u0000\u0000\u0000\u06e4\u06e5"+ + "\u0003\u00cae\u0000\u06e5\u06e6\u0003\u0154\u00aa\u0000\u06e6\u0153\u0001"+ + "\u0000\u0000\u0000\u06e7\u06ec\u0005h\u0000\u0000\u06e8\u06ea\u0003\u0156"+ + "\u00ab\u0000\u06e9\u06eb\u0005m\u0000\u0000\u06ea\u06e9\u0001\u0000\u0000"+ + "\u0000\u06ea\u06eb\u0001\u0000\u0000\u0000\u06eb\u06ed\u0001\u0000\u0000"+ + "\u0000\u06ec\u06e8\u0001\u0000\u0000\u0000\u06ec\u06ed\u0001\u0000\u0000"+ + "\u0000\u06ed\u06ee\u0001\u0000\u0000\u0000\u06ee\u06ef\u0005i\u0000\u0000"+ + "\u06ef\u0155\u0001\u0000\u0000\u0000\u06f0\u06f5\u0003\u0158\u00ac\u0000"+ + "\u06f1\u06f2\u0005m\u0000\u0000\u06f2\u06f4\u0003\u0158\u00ac\u0000\u06f3"+ + "\u06f1\u0001\u0000\u0000\u0000\u06f4\u06f7\u0001\u0000\u0000\u0000\u06f5"+ + "\u06f3\u0001\u0000\u0000\u0000\u06f5\u06f6\u0001\u0000\u0000\u0000\u06f6"+ + "\u0157\u0001\u0000\u0000\u0000\u06f7\u06f5\u0001\u0000\u0000\u0000\u06f8"+ + "\u06f9\u0003\u015a\u00ad\u0000\u06f9\u06fa\u0005o\u0000\u0000\u06fa\u06fc"+ + "\u0001\u0000\u0000\u0000\u06fb\u06f8\u0001\u0000\u0000\u0000\u06fb\u06fc"+ + "\u0001\u0000\u0000\u0000\u06fc\u06fd\u0001\u0000\u0000\u0000\u06fd\u06fe"+ + "\u0003\u015c\u00ae\u0000\u06fe\u0159\u0001\u0000\u0000\u0000\u06ff\u0702"+ + "\u0003\u00a4R\u0000\u0700\u0702\u0003\u0154\u00aa\u0000\u0701\u06ff\u0001"+ + "\u0000\u0000\u0000\u0701\u0700\u0001\u0000\u0000\u0000\u0702\u015b\u0001"+ + "\u0000\u0000\u0000\u0703\u0706\u0003\u00a4R\u0000\u0704\u0706\u0003\u0154"+ + "\u00aa\u0000\u0705\u0703\u0001\u0000\u0000\u0000\u0705\u0704\u0001\u0000"+ + "\u0000\u0000\u0706\u015d\u0001\u0000\u0000\u0000\u0707\u0708\u0005T\u0000"+ + "\u0000\u0708\u070e\u0005h\u0000\u0000\u0709\u070a\u0003\u0160\u00b0\u0000"+ + "\u070a\u070b\u0003\u0170\u00b8\u0000\u070b\u070d\u0001\u0000\u0000\u0000"+ + "\u070c\u0709\u0001\u0000\u0000\u0000\u070d\u0710\u0001\u0000\u0000\u0000"+ + "\u070e\u070c\u0001\u0000\u0000\u0000\u070e\u070f\u0001\u0000\u0000\u0000"+ + "\u070f\u0711\u0001\u0000\u0000\u0000\u0710\u070e\u0001\u0000\u0000\u0000"+ + "\u0711\u0712\u0005i\u0000\u0000\u0712\u015f\u0001\u0000\u0000\u0000\u0713"+ + "\u0714\u0003\u00e4r\u0000\u0714\u0715\u0003\u00c2a\u0000\u0715\u0718\u0001"+ + "\u0000\u0000\u0000\u0716\u0718\u0003\u0164\u00b2\u0000\u0717\u0713\u0001"+ + "\u0000\u0000\u0000\u0717\u0716\u0001\u0000\u0000\u0000\u0718\u071a\u0001"+ + "\u0000\u0000\u0000\u0719\u071b\u0003\u0162\u00b1\u0000\u071a\u0719\u0001"+ + "\u0000\u0000\u0000\u071a\u071b\u0001\u0000\u0000\u0000\u071b\u0161\u0001"+ + "\u0000\u0000\u0000\u071c\u071d\u0007\u0012\u0000\u0000\u071d\u0163\u0001"+ + "\u0000\u0000\u0000\u071e\u0720\u0005\u0087\u0000\u0000\u071f\u071e\u0001"+ + "\u0000\u0000\u0000\u071f\u0720\u0001\u0000\u0000\u0000\u0720\u0721\u0001"+ + "\u0000\u0000\u0000\u0721\u0722\u0003\u012c\u0096\u0000\u0722\u0165\u0001"+ + "\u0000\u0000\u0000\u0723\u0724\u0005j\u0000\u0000\u0724\u0725\u0003\u00a4"+ + "R\u0000\u0725\u0726\u0005k\u0000\u0000\u0726\u0167\u0001\u0000\u0000\u0000"+ + "\u0727\u0728\u0005p\u0000\u0000\u0728\u0729\u0005f\u0000\u0000\u0729\u072a"+ + "\u0003\u00c2a\u0000\u072a\u072b\u0005g\u0000\u0000\u072b\u0169\u0001\u0000"+ + "\u0000\u0000\u072c\u073b\u0005f\u0000\u0000\u072d\u0734\u0003\u00e6s\u0000"+ + "\u072e\u0731\u0003\u0146\u00a3\u0000\u072f\u0730\u0005m\u0000\u0000\u0730"+ + "\u0732\u0003\u00e6s\u0000\u0731\u072f\u0001\u0000\u0000\u0000\u0731\u0732"+ + "\u0001\u0000\u0000\u0000\u0732\u0734\u0001\u0000\u0000\u0000\u0733\u072d"+ + "\u0001\u0000\u0000\u0000\u0733\u072e\u0001\u0000\u0000\u0000\u0734\u0736"+ + "\u0001\u0000\u0000\u0000\u0735\u0737\u0005t\u0000\u0000\u0736\u0735\u0001"+ + "\u0000\u0000\u0000\u0736\u0737\u0001\u0000\u0000\u0000\u0737\u0739\u0001"+ + "\u0000\u0000\u0000\u0738\u073a\u0005m\u0000\u0000\u0739\u0738\u0001\u0000"+ + "\u0000\u0000\u0739\u073a\u0001\u0000\u0000\u0000\u073a\u073c\u0001\u0000"+ + "\u0000\u0000\u073b\u0733\u0001\u0000\u0000\u0000\u073b\u073c\u0001\u0000"+ + "\u0000\u0000\u073c\u073d\u0001\u0000\u0000\u0000\u073d\u073e\u0005g\u0000"+ + "\u0000\u073e\u016b\u0001\u0000\u0000\u0000\u073f\u0740\u0003\u0146\u00a3"+ + "\u0000\u0740\u0741\u0005p\u0000\u0000\u0741\u0742\u0005e\u0000\u0000\u0742"+ + "\u016d\u0001\u0000\u0000\u0000\u0743\u0744\u0003\u00c2a\u0000\u0744\u016f"+ + "\u0001\u0000\u0000\u0000\u0745\u074a\u0005n\u0000\u0000\u0746\u074a\u0005"+ + "\u0000\u0000\u0001\u0747\u074a\u0005\u009f\u0000\u0000\u0748\u074a\u0004"+ + "\u00b8\u0013\u0000\u0749\u0745\u0001\u0000\u0000\u0000\u0749\u0746\u0001"+ + "\u0000\u0000\u0000\u0749\u0747\u0001\u0000\u0000\u0000\u0749\u0748\u0001"+ + "\u0000\u0000\u0000\u074a\u0171\u0001\u0000\u0000\u0000\u00c1\u0180\u0185"+ + "\u018c\u0196\u019c\u01a2\u01ac\u01b6\u01c4\u01c8\u01d1\u01dd\u01e1\u01e7"+ + "\u01f0\u01fa\u020b\u0219\u021d\u0224\u022c\u0235\u0255\u025d\u0275\u0288"+ + "\u0297\u02a4\u02ad\u02bb\u02c4\u02d0\u02e5\u02ec\u02f1\u02f6\u0300\u0303"+ + "\u0307\u030b\u0313\u031b\u0320\u0328\u032a\u032f\u0336\u033e\u0341\u0347"+ + "\u034c\u034e\u0351\u0358\u035d\u0370\u0378\u037c\u037f\u0385\u0389\u038c"+ + "\u0396\u039d\u03a4\u03b0\u03b6\u03bd\u03c2\u03c8\u03d4\u03da\u03de\u03e6"+ + "\u03ea\u03f0\u03f3\u03f9\u03fe\u0417\u043a\u043c\u0453\u045b\u0466\u046d"+ + "\u0474\u047e\u048c\u04a2\u04a4\u04ac\u04b0\u04b4\u04b7\u04c0\u04c6\u04d0"+ + "\u04d8\u04de\u04e7\u04f2\u04fd\u0501\u0503\u050e\u0517\u051b\u051e\u0525"+ + "\u0530\u053a\u0540\u0542\u054c\u0556\u055a\u055e\u0562\u0569\u0571\u057c"+ + "\u0580\u0584\u0590\u0594\u0598\u059d\u05a0\u05a3\u05aa\u05b1\u05c5\u05c9"+ + "\u05cd\u05d1\u05e1\u05e7\u05e9\u05ed\u05f1\u05f4\u05f8\u05fa\u0600\u0608"+ + "\u060d\u0618\u061e\u0625\u0630\u0635\u0639\u063e\u0642\u064a\u0652\u0657"+ + "\u065a\u0662\u0668\u066c\u066e\u0673\u0677\u067b\u0682\u069f\u06aa\u06ae"+ + "\u06b6\u06ba\u06bc\u06c4\u06cd\u06d5\u06da\u06ea\u06ec\u06f5\u06fb\u0701"+ + "\u0705\u070e\u0717\u071a\u071f\u0731\u0733\u0736\u0739\u073b\u0749"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { @@ -13655,4 +14494,4 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); } } -} +} \ No newline at end of file diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index 27688feeb..52b9990df 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,3 +1,4 @@ +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -9,6 +10,7 @@ * @param The return type of the visit operation. Use {@link Void} for * operations with no return type. */ +@SuppressWarnings("CheckReturnValue") public class GobraParserBaseVisitor extends AbstractParseTreeVisitor implements GobraParserVisitor { /** * {@inheritDoc} @@ -52,6 +54,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitSourceFile(GobraParser.SourceFileContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPreamble(GobraParser.PreambleContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1529,4 +1538,4 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitEos(GobraParser.EosContext ctx) { return visitChildren(ctx); } -} +} \ No newline at end of file diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 79f5cf002..352f76c5e 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,3 +1,4 @@ +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -45,6 +46,12 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitSourceFile(GobraParser.SourceFileContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#preamble}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPreamble(GobraParser.PreambleContext ctx); /** * Visit a parse tree produced by {@link GobraParser#initPost}. * @param ctx the parse tree @@ -1348,4 +1355,4 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitEos(GobraParser.EosContext ctx); -} +} \ No newline at end of file diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index a391465f8..f83c0deaf 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -12,11 +12,11 @@ import java.nio.file.Paths import java.util.concurrent.ExecutionException import com.typesafe.scalalogging.StrictLogging import org.slf4j.LoggerFactory -import viper.gobra.ast.frontend.PPackage import viper.gobra.ast.internal.Program import viper.gobra.ast.internal.transform.{CGEdgesTerminationTransform, ConstantPropagation, InternalTransform, OverflowChecksTransform} import viper.gobra.backend.BackendVerifier -import viper.gobra.frontend.info.Info.Context +import viper.gobra.frontend.PackageResolver.{AbstractPackage, RegularPackage} +import viper.gobra.frontend.Parser.ParseSuccessResult import viper.gobra.frontend.info.{Info, TypeInfo} import viper.gobra.frontend.{Config, Desugar, PackageInfo, Parser, ScallopGobraConfig} import viper.gobra.reporting._ @@ -28,6 +28,7 @@ import viper.silver.{ast => vpr} import java.time.format.DateTimeFormatter import java.time.LocalTime +import scala.annotation.unused import scala.concurrent.{Await, Future, TimeoutException} object GoVerifier { @@ -158,11 +159,11 @@ class Gobra extends GoVerifier with GoIdeVerifier { for { finalConfig <- getAndMergeInFileConfig(config, pkgInfo) _ = setLogLevel(finalConfig) - parsedPackage <- performParsing(pkgInfo, finalConfig) - typeInfo <- performTypeChecking(parsedPackage, executor, finalConfig) - program <- performDesugaring(parsedPackage, typeInfo, finalConfig) - program <- performInternalTransformations(program, finalConfig, pkgInfo) - viperTask <- performViperEncoding(program, finalConfig, pkgInfo) + parseResults <- performParsing(finalConfig, pkgInfo)(executor) + typeInfo <- performTypeChecking(finalConfig, pkgInfo, parseResults)(executor) + program <- performDesugaring(finalConfig, typeInfo)(executor) + program <- performInternalTransformations(finalConfig, pkgInfo, program)(executor) + viperTask <- performViperEncoding(finalConfig, pkgInfo, program)(executor) } yield (viperTask, finalConfig) } @@ -177,7 +178,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { // directly declaring the parameter implicit somehow does not work as the compiler is unable to spot the inheritance implicit val _executor: GobraExecutionContext = executor val viperTask = BackendVerifier.Task(ast, backtrack) - performVerification(viperTask, config, pkgInfo) + performVerification(config, pkgInfo, viperTask) .map(BackTranslator.backTranslate(_)(config)) .recoverWith { case e: ExecutionException if isKnownZ3Bug(e) => @@ -242,31 +243,46 @@ class Gobra extends GoVerifier with GoIdeVerifier { .setLevel(config.logLevel) } - private def performParsing(pkgInfo: PackageInfo, config: Config): Either[Vector[VerifierError], PPackage] = { + private def performParsing(config: Config, pkgInfo: PackageInfo)(executor: GobraExecutionContext): Either[Vector[VerifierError], Map[AbstractPackage, ParseSuccessResult]] = { if (config.shouldParse) { val startMs = System.currentTimeMillis() - val sourcesToParse = config.packageInfoInputMap(pkgInfo) - val res = Parser.parse(sourcesToParse, pkgInfo)(config) + val res = Parser.parse(config, pkgInfo)(executor) val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" println(s"parser phase done, took ${durationS}s") res + /* + val sourcesToParse = config.packageInfoInputMap(pkgInfo) + val res = Parser.parse(sourcesToParse, pkgInfo)(config) + */ + /* + val parseManager = Parser.parse(pkgInfo)(config, executionContext) + config.typeCheckMode match { + case TypeCheckMode.Lazy => // don't do anything + case TypeCheckMode.Sequential | TypeCheckMode.Parallel => + parseManager.awaitResults() + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + println(s"parser phase done, took ${durationS}s") + println(s"parsed packages: ${parseManager.getResults.map{ case (pkg, _) => pkg }.mkString(", ")}") + } + Right(parseManager) + */ } else { Left(Vector()) } } - private def performTypeChecking(parsedPackage: PPackage, executionContext: GobraExecutionContext, config: Config): Either[Vector[VerifierError], TypeInfo] = { + private def performTypeChecking(config: Config, pkgInfo: PackageInfo, parseResults: Map[AbstractPackage, ParseSuccessResult])(executor: GobraExecutionContext): Either[Vector[VerifierError], TypeInfo] = { if (config.shouldTypeCheck) { - Info.check(parsedPackage, config.packageInfoInputMap(parsedPackage.info), isMainContext = true, context = new Context(executionContext, config))(config) + Info.check(config, RegularPackage(pkgInfo.id), parseResults)(executor) } else { Left(Vector()) } } - private def performDesugaring(parsedPackage: PPackage, typeInfo: TypeInfo, config: Config): Either[Vector[VerifierError], Program] = { + private def performDesugaring(config: Config, typeInfo: TypeInfo)(@unused executor: GobraExecutionContext): Either[Vector[VerifierError], Program] = { if (config.shouldDesugar) { val startMs = System.currentTimeMillis() - val res = Right(Desugar.desugar(parsedPackage, typeInfo)(config)) + val res = Right(Desugar.desugar(typeInfo.tree.root, typeInfo)(config)) val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" println(s"desugaring done, took ${durationS}s") res @@ -275,19 +291,11 @@ class Gobra extends GoVerifier with GoIdeVerifier { } } - private def performVerification(config: Config, pkgInfo: PackageInfo, ast: vpr.Program, backtrack: BackTranslator.BackTrackInfo)(executor: GobraExecutionContext): Future[VerifierResult] = { - if (config.noVerify) { - Future(VerifierResult.Success)(executor) - } else { - verifyAst(config, pkgInfo, ast, backtrack)(executor) - } - } - /** * Applies transformations to programs in the internal language. Currently, only adds overflow checks but it can * be easily extended to perform more transformations */ - private def performInternalTransformations(program: Program, config: Config, pkgInfo: PackageInfo): Either[Vector[VerifierError], Program] = { + private def performInternalTransformations(config: Config, pkgInfo: PackageInfo, program: Program)(@unused executor: GobraExecutionContext): Either[Vector[VerifierError], Program] = { // constant propagation does not cause duplication of verification errors caused // by overflow checks (if enabled) because all overflows in constant declarations // can be found by the well-formedness checks. @@ -303,7 +311,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { Right(result) } - private def performViperEncoding(program: Program, config: Config, pkgInfo: PackageInfo): Either[Vector[VerifierError], BackendVerifier.Task] = { + private def performViperEncoding(config: Config, pkgInfo: PackageInfo, program: Program)(@unused executor: GobraExecutionContext): Either[Vector[VerifierError], BackendVerifier.Task] = { if (config.shouldViperEncode) { val startMs = System.currentTimeMillis() val res = Right(Translator.translate(program, pkgInfo)(config)) @@ -315,7 +323,15 @@ class Gobra extends GoVerifier with GoIdeVerifier { } } - private def performVerification(viperTask: BackendVerifier.Task, config: Config, pkgInfo: PackageInfo)(implicit executor: GobraExecutionContext): Future[BackendVerifier.Result] = { + private def performVerification(config: Config, pkgInfo: PackageInfo, ast: vpr.Program, backtrack: BackTranslator.BackTrackInfo)(executor: GobraExecutionContext): Future[VerifierResult] = { + if (config.noVerify) { + Future(VerifierResult.Success)(executor) + } else { + verifyAst(config, pkgInfo, ast, backtrack)(executor) + } + } + + private def performVerification(config: Config, pkgInfo: PackageInfo, viperTask: BackendVerifier.Task)(implicit executor: GobraExecutionContext): Future[BackendVerifier.Result] = { if (config.shouldVerify) { BackendVerifier.verify(viperTask, pkgInfo)(config) } else { diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index dcc5c3a65..e6819f68c 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -61,6 +61,15 @@ case class PProgram( ) extends PNode with PUnorderedScope // imports are in program scopes +case class PPreamble( + packageClause: PPackageClause, + // init postconditions describe the state and resources right + // after this program is initialized + initPosts: Vector[PExpression], + imports: Vector[PImport], + ) extends PNode with PUnorderedScope // imports are in program scopes + + class PositionManager(val positions: Positions) extends Messaging(positions) { def translate[E <: VerifierError]( diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index f9a1c9c59..cd2c80df7 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -16,8 +16,7 @@ import viper.gobra.backend.{ViperBackend, ViperBackends} import viper.gobra.GoVerifier import viper.gobra.frontend.PackageResolver.FileResource import viper.gobra.frontend.Source.getPackageInfo -import viper.gobra.frontend.info.Info.TypeCheckMode -import viper.gobra.frontend.info.Info.TypeCheckMode.TypeCheckMode +import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential, TaskManagerMode} import viper.gobra.reporting.{FileWriterReporter, GobraReporter, StdIOReporter} import viper.gobra.util.{TypeBounds, Violation} import viper.silver.ast.SourcePosition @@ -70,7 +69,7 @@ object ConfigDefaults { lazy val DefaultEnableLazyImports: Boolean = false lazy val DefaultNoVerify: Boolean = false lazy val DefaultNoStreamErrors: Boolean = false - lazy val DefaultTypeCheckMode: TypeCheckMode = TypeCheckMode.Parallel + lazy val DefaultTypeCheckMode: TaskManagerMode = TaskManagerMode.Parallel } case class Config( @@ -122,7 +121,7 @@ case class Config( enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, - typeCheckMode: TypeCheckMode = ConfigDefaults.DefaultTypeCheckMode, + typeCheckMode: TaskManagerMode = ConfigDefaults.DefaultTypeCheckMode, ) { def merge(other: Config): Config = { @@ -219,7 +218,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, - typeCheckMode: TypeCheckMode = ConfigDefaults.DefaultTypeCheckMode, + typeCheckMode: TaskManagerMode = ConfigDefaults.DefaultTypeCheckMode, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -646,16 +645,16 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) - val typeCheckMode: ScallopOption[TypeCheckMode] = choice( + val typeCheckMode: ScallopOption[TaskManagerMode] = choice( name = "typeCheckMode", choices = Seq("LAZY", "SEQUENTIAL", "PARALLEL"), descr = "Specifies the mode in which type-checking is performed.", default = Some("PARALLEL"), noshort = true ).map { - case "LAZY" => TypeCheckMode.Lazy - case "SEQUENTIAL" => TypeCheckMode.Sequential - case "PARALLEL" => TypeCheckMode.Parallel + case "LAZY" => Lazy + case "SEQUENTIAL" => Sequential + case "PARALLEL" => Parallel case _ => ConfigDefaults.DefaultTypeCheckMode } diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 96a372934..3bdc63c0d 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -32,8 +32,11 @@ object Desugar { val importsCollector = new PackageInitSpecCollector // independently desugar each imported package. val importedDesugaringStartMs = System.currentTimeMillis() - val importedPrograms = info.context.getContexts map { tI => { - val typeInfo: TypeInfo = tI.getTypeInfo + // val importedPrograms = info.context.getContexts map { tI => { + // val importedPrograms = info.dependentTypeInfo.map { case (abstractPackage, tIFn) => { + val importedPrograms = info.getTransitiveTypeInfos.map { tI => { + val typeInfo = tI.getTypeInfo + // val typeInfo: TypeInfo = tIFn().map(_.getTypeInfo).getOrElse(Violation.violation(s"cannot desugar package $abstractPackage for which type-checking failed")) // tI.getTypeInfo val importedPackage = typeInfo.tree.originalRoot val d = new Desugarer(importedPackage.positions, typeInfo) // registers a package to generate proof obligations for its init code @@ -3460,8 +3463,11 @@ object Desugar { } // Collect and register all import-preconditions - pkg.imports.foreach{ imp => - info.context.getTypeInfo(RegularImport(imp.importPath))(config) match { + pkg.imports.foreach{ imp => { + val importedPackage = RegularImport(imp.importPath) + Violation.violation(info.dependentTypeInfo.contains(importedPackage), s"Desugarer expects to have acess to the type information of all imported packages but could not find $importedPackage") + // info.context.getTypeInfo(RegularImport(imp.importPath))(config) match { + info.dependentTypeInfo(importedPackage)() match { // case Some(Right(tI)) => case Right(tI) => val desugaredPre = imp.importPres.map(specificationD(FunctionContext.empty(), info)) @@ -3469,7 +3475,7 @@ object Desugar { specCollector.addImportPres(tI.getTypeInfo.tree.originalRoot, desugaredPre) case e => Violation.violation(config.enableLazyImports, s"Unexpected value found $e while importing ${imp.importPath} - type information is assumed to be available for all packages when Gobra is executed with lazy imports disabled") } - } + }} // Collect and register all postconditions of all PPrograms (i.e., files) in pkg val pkgPost = pkg.programs.flatMap(_.initPosts).map(specificationD(FunctionContext.empty(), info)) diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 73425dd07..b498a1db2 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -2188,6 +2188,13 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole PProgram(packageClause, initPosts, importDecls, members ++ decls ++ ghostMembers).at(ctx) } + override def visitPreamble(ctx: GobraParser.PreambleContext): PPreamble = { + val packageClause: PPackageClause = visitNode(ctx.packageClause()) + val initPosts: Vector[PExpression] = visitListNode[PExpression](ctx.initPost()) + val importDecls = ctx.importDecl().asScala.toVector.flatMap(visitImportDecl) + PPreamble(packageClause, initPosts, importDecls).at(ctx) + } + /** * Visists an init postcondition * @param ctx the parse tree diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 947840d11..ba88bac41 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -17,7 +17,9 @@ import viper.gobra.reporting.{Source => _, _} import org.antlr.v4.runtime.{CharStreams, CommonTokenStream, DefaultErrorStrategy, ParserRuleContext} import org.antlr.v4.runtime.atn.PredictionMode import org.antlr.v4.runtime.misc.ParseCancellationException -import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} +import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, PreambleContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} +import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, RegularImport, RegularPackage} +import viper.gobra.util.GobraExecutionContext import viper.silver.ast.SourcePosition import scala.collection.mutable.ListBuffer @@ -26,6 +28,100 @@ import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} object Parser { + type ParseSuccessResult = (Vector[Source], PPackage) + type ParseResult = Either[Vector[VerifierError], ParseSuccessResult] + class ParseManager(config: Config, executionContext: GobraExecutionContext) { + private val manager = new TaskManager[AbstractPackage, ParseResult](TaskManagerMode.Parallel) + + def parse(pkgInfo: PackageInfo): Unit = { + val pkg = RegularPackage(pkgInfo.id) + val parseJob = ParseInfoJob(pkgInfo) + manager.addIfAbsent(pkg, parseJob)(executionContext) + // trigger and wait for parsing of at least this package (which will ensure that parse jobs for all dependent packages are created too) + manager.getResult(pkg) + } + + trait ParseJob extends Job[ParseResult] { + def pkgInfo: PackageInfo + def pkgSources: Vector[Source] + + override def compute(): ParseResult = { + require(pkgSources.nonEmpty) + + val startPreambleParsingMs = System.currentTimeMillis() + var endPreambleParsingMs: Option[Long] = None + // before parsing, get imports and add these parse jobs + fastParse(pkgSources) + .map(directImportTarget => { + if (endPreambleParsingMs.isEmpty) { + endPreambleParsingMs = Some(System.currentTimeMillis()) + } + val directImportPackage = AbstractPackage(directImportTarget)(config) + val pkgSources = PackageResolver.resolveSources(directImportTarget)(config) + .getOrElse(Vector()) + .map(_.source) + if (pkgSources.isEmpty) { + manager.addIfAbsent(directImportPackage, ParseFailureJob(Vector(NotFoundError(s"No source files for package '$directImportTarget found"))))(executionContext) + } else { + manager.addIfAbsent(directImportPackage, ParseSourcesJob(pkgSources, directImportPackage))(executionContext) + } + }) + + val startMs = System.currentTimeMillis() + val res = for { + parsedProgram <- Parser.parse(pkgSources, pkgInfo, specOnly = true)(config) + } yield (pkgSources, parsedProgram) + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + val preambleParsingRatio = f"${100f * (endPreambleParsingMs.get - startPreambleParsingMs) / (System.currentTimeMillis() - startMs)}%.1f" + println(s"parsing ${pkgInfo.id} done (took ${durationS}s; parsing preamble takes ${preambleParsingRatio}%)") + res + } + + private def fastParse(sources: Vector[Source]): Set[AbstractImport] = { + def getImportPaths(source: Source): Set[AbstractImport] = { + parsePreamble(source)(config) + .map(_.imports.toSet.map[AbstractImport](importNode => RegularImport(importNode.importPath))) + // we do not handle parser errors here but defer this to the time point when we actually + // parse this source + .getOrElse(Set.empty) + } + + sources.flatMap(getImportPaths).toSet + BuiltInImport + } + } + + case class ParseInfoJob(override val pkgInfo: PackageInfo) extends ParseJob { + lazy val pkgSources: Vector[Source] = config.packageInfoInputMap(pkgInfo) + } + + case class ParseSourcesJob(override val pkgSources: Vector[Source], pkg: AbstractPackage) extends ParseJob { + require(pkgSources.nonEmpty) + lazy val pkgInfo: PackageInfo = Source.getPackageInfo(pkgSources.head, config.projectRoot) + } + + case class ParseFailureJob(errs: Vector[NotFoundError]) extends Job[ParseResult] { + override def compute(): ParseResult = Left(errs) + } + /* + def awaitResults(): Iterable[ParseResult] = manager.getAllResults(executionContext) + + def getResult(pkgInfo: PackageInfo): ParseResult = + getResult(RegularPackage(pkgInfo.id)) + + def getResult(abstractPackage: AbstractPackage): ParseResult = + manager.getResult(abstractPackage) + + def getResults: Iterable[(AbstractPackage, ParseResult)] = + manager.getAllResultsWithKeys + */ + def getParseResults(executionContext: GobraExecutionContext): Either[Map[AbstractPackage, Vector[VerifierError]], Map[AbstractPackage, ParseSuccessResult]] = { + val (failedResults, successfulResults) = manager.getAllResultsWithKeys(executionContext) + .partitionMap { case (key, eitherResult) => eitherResult.fold[Either[(AbstractPackage, Vector[VerifierError]), (AbstractPackage, ParseSuccessResult)]](errs => Left((key, errs)), result => Right((key, result))) } + if (failedResults.isEmpty) Right(successfulResults.toMap) + else Left(failedResults.toMap) + } + } + /** * Parses files and returns either the parsed program if the file was parsed successfully, * otherwise returns list of error messages. @@ -42,6 +138,13 @@ object Parser { * */ + def parse(config: Config, pkgInfo: PackageInfo)(executionContext: GobraExecutionContext): Either[Vector[VerifierError], Map[AbstractPackage, ParseSuccessResult]] = { + val parseManager = new ParseManager(config, executionContext) + parseManager.parse(pkgInfo) + val res = parseManager.getParseResults(executionContext).left.map(errMap => errMap.values.flatten.toVector) + res + } + def parse(input: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean = false)(config: Config): Either[Vector[VerifierError], PPackage] = { val sources = input.map(Gobrafier.gobrafy) sources.foreach { s => config.reporter report PreprocessedInputMessage(s.name, () => s.content) } @@ -60,7 +163,8 @@ object Parser { type SourceCacheKey = String // cache maps a key (obtained by hasing file path and file content) to the parse result - private var sourceCache: ConcurrentMap[SourceCacheKey, (Either[Vector[ParserError], PProgram], Positions)] = new ConcurrentHashMap() + private val sourceCache: ConcurrentMap[SourceCacheKey, (Either[Vector[ParserError], PProgram], Positions)] = new ConcurrentHashMap() + private val preambleCache: ConcurrentMap[SourceCacheKey, Either[Vector[ParserError], PPreamble]] = new ConcurrentHashMap() /** computes the key for caching a particular source. This takes the name, the specOnly flag, and the file's contents into account */ private def getCacheKey(source: Source, specOnly: Boolean): SourceCacheKey = { @@ -72,6 +176,7 @@ object Parser { def flushCache(): Unit = { sourceCache.clear() + preambleCache.clear() } private def parseSources(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[VerifierError], PPackage] = { @@ -94,8 +199,6 @@ object Parser { } } - - def parseSourceCached(source: Source): Either[Vector[ParserError], PProgram] = { var cacheHit = true def parseAndStore(): (Either[Vector[ParserError], PProgram], Positions) = { @@ -183,6 +286,27 @@ object Parser { parser.parse(parser.sourceFile()) } + /** parses a source's preamble containing all (file-level) imports */ + def parsePreamble(source: Source)(config: Config): Either[Vector[ParserError], PPreamble] = { + // TODO: gobrafy only once + val positions = new Positions + val pom = new PositionManager(positions) + + def parseSource(source: Source): Either[Vector[ParserError], PPreamble] = { + val parser = new SyntaxAnalyzer[PreambleContext, PPreamble](Gobrafier.gobrafy(source), ListBuffer.empty[ParserError], pom, specOnly = true) + parser.parse(parser.preamble) + } + + def parseSourceCached(source: Source): Either[Vector[ParserError], PPreamble] = { + def parseAndStore(): Either[Vector[ParserError], PPreamble] = + parseSource(source) + + preambleCache.computeIfAbsent(getCacheKey(source, specOnly = true), _ => parseAndStore()) + } + + if (config.cacheParser) parseSourceCached(source) else parseSource(source) + } + def parseFunction(source: Source, specOnly: Boolean = false): Either[Vector[ParserError], PMember] = { val positions = new Positions val pom = new PositionManager(positions) diff --git a/src/main/scala/viper/gobra/frontend/TaskManager.scala b/src/main/scala/viper/gobra/frontend/TaskManager.scala index 8413d396b..1efd6d496 100644 --- a/src/main/scala/viper/gobra/frontend/TaskManager.scala +++ b/src/main/scala/viper/gobra/frontend/TaskManager.scala @@ -1,6 +1,6 @@ package viper.gobra.frontend -import viper.gobra.frontend.info.Info.TypeCheckMode +import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential, TaskManagerMode} import viper.gobra.util.{GobraExecutionContext, Violation} import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} @@ -9,13 +9,52 @@ import scala.concurrent.{Await, Future, Promise} import scala.util.{Failure, Success} import scala.jdk.CollectionConverters._ +object TaskManagerMode extends Enumeration { + type TaskManagerMode = Value + val Lazy, Sequential, Parallel = Value +} + trait Job[R] { private var compututationStarted = false private val promise: Promise[R] = Promise() def getFuture: Future[R] = promise.future protected def compute(): R + // private val lock: Object = new AnyRef def call(): R = { + // lock.synchronized { + getFuture.value match { + case Some(Success(res)) => return res // return already computed type-checker result + case Some(Failure(exception)) => Violation.violation(s"Job resulted in exception: $exception") + case _ => + } + Violation.violation(!compututationStarted, s"Job $this is already on-going") + compututationStarted = true + val res = compute() + promise.success(res) + res + } + // } +} + +/* +trait Job[R] extends DependentJob[Nothing, R] { + val dependencies = Set.empty + protected def compute(): R + + override protected def compute(dependentResults: Map[Nothing, R]): R = compute() +} + +trait DependentJob[K, R] { + val dependencies: Set[K] + private val promise: Promise[R] = Promise() + private var compututationStarted = false + + def getFuture: Future[R] = promise.future + + protected def compute(dependentResults: Map[K, R]): R + + def call(dependentResults: Map[K, R]): R = { getFuture.value match { case Some(Success(res)) => return res // return already computed type-checker result case Some(Failure(exception)) => Violation.violation(s"Job resulted in exception: $exception") @@ -23,13 +62,14 @@ trait Job[R] { } Violation.violation(!compututationStarted, s"Job is already on-going") compututationStarted = true - val res = compute() + val res = compute(dependentResults) promise.success(res) res } } + */ -class TaskManager[K, R](config: Config) { +class TaskManager[K, R](mode: TaskManagerMode) { private val jobs: ConcurrentMap[K, Job[R]] = new ConcurrentHashMap() /** @@ -44,33 +84,70 @@ class TaskManager[K, R](config: Config) { }) // now run it but only if it's a new job: if (isAbsent && !insertOnly) { - config.typeCheckMode match { - case TypeCheckMode.Lazy => // don't do anything as of now - case TypeCheckMode.Sequential => job.call() - case TypeCheckMode.Parallel => Future{ job.call() }(executionContext) + mode match { + case Lazy => // don't do anything as of now + case Sequential => job.call() + case Parallel => Future{ job.call() }(executionContext) } } isAbsent } + def getFuture(id: K): Future[R] = { + val job = jobs.get(id) + Violation.violation(job != null, s"Task $id not found") + job.getFuture + } + def getResult(id: K): R = { val job = jobs.get(id) Violation.violation(job != null, s"Task $id not found") getResultFromJob(job) } - def getAllResults: Iterable[R] = - jobs.values().asScala.map(getResultFromJob) + def getAllResults(executionContext: GobraExecutionContext): Iterable[R] = mode match { + case Lazy | Sequential => jobs.values().asScala.map(getResultFromJob) + case Parallel => + val futs = jobs.values().asScala.map(_.getFuture) + implicit val executor: GobraExecutionContext = executionContext + Await.result(Future.sequence(futs), Duration.Inf) + } - def getAllResultsWithKeys: Iterable[(K, R)] = - jobs.asScala.toVector.map { case (key, job) => (key, getResultFromJob(job)) } + def getAllResultsWithKeys(executionContext: GobraExecutionContext): Iterable[(K, R)] = mode match { + case Lazy | Sequential => jobs.asScala.toVector.map { case (key, job) => (key, getResultFromJob(job)) } + case Parallel => + implicit val executor: GobraExecutionContext = executionContext + val futs = jobs.asScala.toVector.map { case (key, job) => job.getFuture.map(res => (key, res)) } + Await.result(Future.sequence(futs), Duration.Inf) + } - private def getResultFromJob(job: Job[R]): R = config.typeCheckMode match { - case TypeCheckMode.Lazy => job.call() // we perform the computation now that we need the result - case TypeCheckMode.Sequential => + private def getResultFromJob(job: Job[R]): R = mode match { + case Lazy => job.call() // we perform the computation now that we need the result + case Sequential => // note that we cannot await the future here as type-checking of this package might not have started yet. // Thus, we use `.call()` that either returns a previously calculated type-checking result or will calculate it. job.call() - case TypeCheckMode.Parallel => Await.result(job.getFuture, Duration.Inf) + case Parallel => + Await.result(job.getFuture, Duration.Inf) + } +} + +class FutureManager[K, R]() { + private val futures: ConcurrentMap[K, Future[R]] = new ConcurrentHashMap() + + def addIfAbsent(id: K, futFn: () => Future[R]): Future[R] = { + // first insert job, then run it (if necessary) + futures.computeIfAbsent(id, _ => futFn()) + } + + def getFuture(id: K): Future[R] = { + val fut = futures.get(id) + Violation.violation(fut != null, s"Task $id not found") + fut + } + + def getAllResults(executionContext: GobraExecutionContext): Iterable[R] = { + implicit val executor: GobraExecutionContext = executionContext + Await.result(Future.sequence(futures.values().asScala), Duration.Inf) } } diff --git a/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala b/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala index 57dc3c174..d4a19fd8f 100644 --- a/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala +++ b/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala @@ -8,17 +8,23 @@ package viper.gobra.frontend.info import viper.gobra.ast.frontend.{PCodeRoot, PEmbeddedDecl, PExpression, PFieldDecl, PFunctionDecl, PFunctionOrMethodDecl, PGeneralForStmt, PIdnNode, PIdnUse, PKeyedElement, PLabelUse, PMPredicateDecl, PMPredicateSig, PMember, PMethodDecl, PMethodSig, PMisc, PNode, PParameter, PPkgDef, PScope, PType} import viper.gobra.frontend.PackageInfo +import viper.gobra.frontend.PackageResolver.AbstractImport import viper.gobra.frontend.info.base.BuiltInMemberTag.BuiltInMemberTag import viper.gobra.frontend.info.base.Type.{AbstractType, InterfaceT, StructT, Type} import viper.gobra.frontend.info.base.SymbolTable import viper.gobra.frontend.info.base.SymbolTable.{Embbed, Field, MPredicateImpl, MPredicateSpec, MethodImpl, MethodSpec, Regular, TypeMember} import viper.gobra.frontend.info.implementation.resolution.{AdvancedMemberSet, MemberPath} import viper.gobra.frontend.info.implementation.typing.ghost.separation.GhostType +import viper.gobra.reporting.VerifierError trait ExternalTypeInfo { def pkgName: PPkgDef def pkgInfo: PackageInfo + def dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]] + + /** returns this and the type information of directly and transitively dependent packages */ + def getTransitiveTypeInfos: Set[ExternalTypeInfo] /** * Gets called by the type checker to perform a symbol table lookup in an imported package diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 9c0ef6a77..3f43cebf6 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -7,26 +7,37 @@ package viper.gobra.frontend.info import org.bitbucket.inkytonik.kiama.relation.Tree -import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, message, noMessages} +import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, message} import org.bitbucket.inkytonik.kiama.util.{Position, Source} import viper.gobra.ast.frontend.{PImport, PNode, PPackage} -import viper.gobra.frontend.{Config, Job, PackageResolver, Parser, Source, TaskManager} -import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, RegularImport, RegularPackage} -import viper.gobra.frontend.info.Info.TypeCheckMode.TypeCheckMode +import viper.gobra.frontend.{Config, Job, TaskManager} +import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, BuiltInPackage, RegularImport} +import viper.gobra.frontend.Parser.ParseSuccessResult +import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.ghost.separation.{GhostLessPrinter, GoifyingPrinter} -import viper.gobra.reporting.{CyclicImportError, NotFoundError, TypeCheckDebugMessage, TypeCheckFailureMessage, TypeCheckSuccessMessage, TypeError, VerifierError} +import viper.gobra.reporting.{TypeCheckDebugMessage, TypeCheckFailureMessage, TypeCheckSuccessMessage, TypeError, VerifierError} import viper.gobra.util.{GobraExecutionContext, Violation} -import java.util.concurrent.Callable -import scala.collection.immutable.ListMap +import java.security.MessageDigest +import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} import scala.concurrent.duration.Duration -import scala.concurrent.{Await, Future, Promise} -import scala.util.{Failure, Success} +import scala.concurrent.{Await, Future} object Info { type GoTree = Tree[PNode, PPackage] + type TypeCheckResult = Either[Vector[VerifierError], TypeInfo with ExternalTypeInfo] + type DependentTypeInfo = Map[AbstractImport, () => TypeCheckResult] // values are functions such that laziness is possible + + trait GetParseResult { + def parseResults: Map[AbstractPackage, ParseSuccessResult] + + protected def getParseResult(abstractPackage: AbstractPackage): ParseSuccessResult = { + Violation.violation(parseResults.contains(abstractPackage), s"GetParseResult: expects that $abstractPackage has been parsed") + parseResults(abstractPackage) + } + } /** * ImportCycle describes a cyclic import. `importClosingCycle` is the AST node that closes the cycle and @@ -34,22 +45,59 @@ object Info { */ case class ImportCycle(importNodeCausingCycle: PImport, importNodeStart: Option[Position], cyclicPackages: Vector[AbstractImport]) - object TypeCheckMode extends Enumeration { - type TypeCheckMode = Value - val Lazy, Sequential, Parallel = Value + class CycleChecker(val config: Config, val parseResults: Map[AbstractPackage, ParseSuccessResult]) extends GetParseResult { + /** keeps track of the package dependencies that are currently resolved. This information is used to detect cycles */ + private var parserPendingPackages: Vector[AbstractImport] = Vector() + + def check(abstractPackage: AbstractPackage): Messages = { + val (_, ast) = getParseResult(abstractPackage) + ast.imports.flatMap(importNode => { + val cycles = getCycles(RegularImport(importNode.importPath)) + createImportError(importNode, cycles) + }) + } + + /** + * returns all parser errors and cyclic errors transitively found in imported packages + */ + private def getCycles(importTarget: AbstractImport): Vector[ImportCycle] = { + parserPendingPackages = parserPendingPackages :+ importTarget + val abstractPackage = AbstractPackage(importTarget)(config) + val (_, ast) = getParseResult(abstractPackage) + val res = ast.imports.flatMap(importNode => { + val directlyImportedTarget = RegularImport(importNode.importPath) + if (parserPendingPackages.contains(directlyImportedTarget)) { + // package cycle detected + val importNodeStart = ast.positions.positions.getStart(importNode) + Vector(ImportCycle(importNode, importNodeStart, parserPendingPackages)) + } else { + getCycles(directlyImportedTarget) + } + }) + parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) + res + } + + private def createImportError(importNode: PImport, cycles: Vector[ImportCycle]): Messages = { + val importTarget = RegularImport(importNode.importPath) + cycles.flatMap(cycle => { + val positionalInfo = cycle.importNodeStart.map(pos => s" at ${pos.format}").getOrElse("") + message(importNode, s"Package '$importTarget' is part of the following import cycle that involves the import ${cycle.importNodeCausingCycle}$positionalInfo: ${cycle.cyclicPackages.mkString("[", ", ", "]")}") + }) + } } /** * All TypeInfo instances share a single context instance. * Therefore, package management is centralized. */ - class Context(executionContext: GobraExecutionContext, config: Config) { + class Context(val config: Config, val parseResults: Map[AbstractPackage, ParseSuccessResult])(val executionContext: GobraExecutionContext) extends GetParseResult { /** stores the results of all imported packages that have been parsed so far */ - private var parserContextMap: Map[AbstractPackage, Either[Vector[VerifierError], (Vector[Source], PPackage)]] = ListMap() + // private var parserContextMap: Map[AbstractPackage, Either[Vector[VerifierError], (Vector[Source], PPackage)]] = ListMap() /** keeps track of the package dependencies that are currently resolved. This information is used to detect cycles */ - private var parserPendingPackages: Vector[AbstractImport] = Vector() + // private var parserPendingPackages: Vector[AbstractImport] = Vector() /** stores all cycles that have been discovered so far */ - var parserKnownImportCycles: Set[ImportCycle] = Set() + // var parserKnownImportCycles: Set[ImportCycle] = Set() /* def parseRecursively(importTarget: AbstractImport)(config: Config): Either[Vector[VerifierError], PPackage] = { @@ -82,6 +130,7 @@ object Info { res } */ + /* def parseRecursively(importTarget: AbstractImport)(config: Config): Either[Vector[VerifierError], PPackage] = { val packageTarget = AbstractPackage(importTarget)(config) @@ -103,7 +152,7 @@ object Info { nonEmptyPkgSources <- if (pkgSources.isEmpty) Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) // Left(message(importNode, s"No source files for package '$importTarget' found")) - else Right(pkgSources) + else Right(pkgSources) parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) errorsInTransitivePackages = parsedProgram.imports .map(importNode => { @@ -151,10 +200,11 @@ object Info { parserContextMap = parserContextMap + (packageTarget -> res.map(pkg => (pkgSources, pkg))) res } - + */ /** * returns all parser errors and cyclic errors transitively found in imported packages */ + /* def computeCycles(importTarget: AbstractImport): Vector[VerifierError] = { parserPendingPackages = parserPendingPackages :+ importTarget val abstractPackage = AbstractPackage(importTarget)(config) @@ -181,6 +231,7 @@ object Info { parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) res.left.getOrElse(Vector.empty) } + */ /* def parseRecursively(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = { val imports = Seq(BuiltInImport) ++ @@ -203,11 +254,14 @@ object Info { /** * Returns all package names that lie on the cycle of imports or none if no cycle was found */ + /* def getParserImportCycle(importTarget: AbstractImport): Option[ImportCycle] = parserKnownImportCycles.find(_.cyclicPackages.contains(importTarget)) + */ + /* case class ParseJob(importTarget: AbstractImport) extends Job[Either[Vector[VerifierError], (Vector[Source], PPackage)]] { - def compute(): Either[Vector[VerifierError], (Vector[Source], PPackage)] = { + override def compute(): Either[Vector[VerifierError], (Vector[Source], PPackage)] = { println(s"start parsing $importTarget") val startMs = System.currentTimeMillis() val pkgSources = PackageResolver.resolveSources(importTarget)(config) @@ -218,39 +272,311 @@ object Info { Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) // Left(message(importNode, s"No source files for package '$importTarget' found")) else Right(pkgSources) + + // before parsing, get imports and add these parse jobs + _ = fastParse(nonEmptyPkgSources) + .map(directImportTarget => { + val directImportPackage = AbstractPackage(directImportTarget)(config) + parseManager.addIfAbsent(directImportPackage, ParseJob(directImportTarget))(executionContext) + }) + parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" _ = println(s"parsing $importTarget done (took ${durationS}s)") + /* // submit jobs to parse dependent packages: _ = parsedProgram.imports.foreach(importNode => { val directImportTarget = RegularImport(importNode.importPath) val directImportPackage = AbstractPackage(directImportTarget)(config) parseManager.addIfAbsent(directImportPackage, ParseJob(directImportTarget))(executionContext) }) + */ } yield (pkgSources, parsedProgram) } } - val parseManager = new TaskManager[AbstractPackage, Either[Vector[VerifierError], (Vector[Source], PPackage)]](config) + case class SuccessParseJob(sources: Vector[Source], pkg: PPackage) extends Job[Either[Vector[VerifierError], (Vector[Source], PPackage)]] { + override def compute(): Either[Vector[VerifierError], (Vector[Source], PPackage)] = + Right((sources, pkg)) + } + + // val parseManager = new TaskManager[AbstractPackage, Either[Vector[VerifierError], (Vector[Source], PPackage)]](config) def parse(importTarget: AbstractImport): Unit = { val abstractPackage = AbstractPackage(importTarget)(config) val parseJob = ParseJob(importTarget) parseManager.addIfAbsent(abstractPackage, parseJob)(executionContext) } - - case class TypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] { - def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { + */ + trait TypeCheckJob { + protected def typeCheck(pkgSources: Vector[Source], pkg: PPackage, dependentTypeInfo: DependentTypeInfo, isMainContext: Boolean = false): TypeCheckResult = { println(s"start type-checking ${pkg.info.id}") val startMs = System.currentTimeMillis() - val res = Info.check(pkg, pkgSources, context)(config) + val res = Info.checkSources(pkgSources, pkg, dependentTypeInfo, isMainContext = isMainContext)(config) val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" println(s"type-checking ${pkg.info.id} done (took ${durationS}s)") res } } + /* + case class SimpleTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] with TypeCheckJob { + override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = typeCheck(pkgSources, pkg, context) + } + */ + /* + case class DependentTypeCheckJob(importTarget: AbstractImport, context: Context) extends Job[Future[Either[Vector[VerifierError], ExternalTypeInfo]]] with TypeCheckJob { + override def toString: String = s"DependentTypeCheckJob for $importTarget" - case class FailureJob(errs: Vector[VerifierError]) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] { - def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = Left(errs) + override def compute(): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { + val abstractPackage = AbstractPackage(importTarget)(config) + val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) + val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) + val isBuiltIn = importTarget == BuiltInImport + val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets + val dependentJobsFuts = dependencies + .map(DependentTypeCheckJob(_, context)) + // add to manager & typecheck them if not present yet + .map(dependentJob => { + val dependentAbstractPackage = AbstractPackage(dependentJob.importTarget)(config) + typeCheckManager.addIfAbsent(dependentAbstractPackage, dependentJob)(executionContext) + typeCheckManager.getFuture(dependentAbstractPackage).flatten + }) + implicit val executor: GobraExecutionContext = executionContext + val dependentJobsFut = Future.sequence(dependentJobsFuts) + dependentJobsFut.map(_ => typeCheck(sources, ast, context)) + } + } + */ + /* + case class LazyTypeCheckJob(importTarget: AbstractImport, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] with TypeCheckJob { + override def toString: String = s"LazyTypeCheckJob for $importTarget" + + override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { + // in lazy mode, this function is called exactly when this package needs to be type-checked + // we also do not care about any dependent packages, because they will be lazily type-checked + val abstractPackage = AbstractPackage(importTarget)(config) + val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) + typeCheck(sources, ast, context) + } + } + */ + + case class LazyTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[TypeCheckResult] with TypeCheckJob { + override def toString: String = s"LazyTypeCheckJob for $abstractPackage" + + override def compute(): TypeCheckResult = { + // in lazy mode, this function is called exactly when this package needs to be type-checked + // we also do not care about any dependent packages, because they will be lazily type-checked + val (sources, ast) = getParseResult(abstractPackage) + // we assume that all packages have been registered with the typeCheckManager + val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) + val isBuiltIn = abstractPackage == BuiltInPackage + val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets + val dependentTypeInfo: DependentTypeInfo = dependencies + .map(importTarget => (importTarget, () => typeCheckManager.getResult(AbstractPackage(importTarget)(config)))) + .toMap + typeCheck(sources, ast, dependentTypeInfo, isMainContext = isMainContext) + } + } + /* + case class LazyTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] with TypeCheckJob { + override def toString: String = s"LazyTypeCheckJob for ${pkg.info.id}" + + override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { + // in lazy mode, this function is called exactly when this package needs to be type-checked + // we also do not care about any dependent packages, because they will be lazily type-checked + // val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $abstractPackage failed")) + typeCheck(pkgSources, pkg, context) + } + } + */ + /* + case class SequentialTypeCheckJob(importTarget: AbstractImport, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] with TypeCheckJob { + override def toString: String = s"SequentialTypeCheckJob for $importTarget" + + override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { + // in lazy mode, this function is called exactly when this package needs to be type-checked + // we also do not care about any dependent packages, because they will be lazily type-checked + val abstractPackage = AbstractPackage(importTarget)(config) + val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) + val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) + val isBuiltIn = importTarget == BuiltInImport + val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets + // first type-check dependent packages: + dependencies + .map(SequentialTypeCheckJob(_, context)) + // add to manager & typecheck them if not present yet + .foreach(dependentJob => { + val dependentAbstractPackage = AbstractPackage(dependentJob.importTarget)(config) + typeCheckManager.addIfAbsent(dependentAbstractPackage, dependentJob)(executionContext) + }) + typeCheck(sources, ast, context) + // typeCheck(abstractPackage, context) + } + } + */ + case class SequentialTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[TypeCheckResult] with TypeCheckJob { + override def toString: String = s"SequentialTypeCheckJob for $abstractPackage" + + override def compute(): TypeCheckResult = { + val (sources, ast) = getParseResult(abstractPackage) + val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) + val isBuiltIn = abstractPackage == BuiltInPackage + val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets + // first type-check dependent packages: + val dependentTypeInfos = dependencies + .map(importTarget => { + val dependentPackage = AbstractPackage(importTarget)(config) + // add to manager & typecheck them if not present yet + val job = SequentialTypeCheckJob(dependentPackage) + typeCheckManager.addIfAbsent(dependentPackage, job)(executionContext) + (importTarget, () => typeCheckManager.getResult(dependentPackage)) + }) + + typeCheck(sources, ast, dependentTypeInfos.toMap, isMainContext = isMainContext) + } + } + /* + case class ParallelTypeCheckJob(importTarget: AbstractImport, context: Context) extends Job[Future[Either[Vector[VerifierError], ExternalTypeInfo]]] with TypeCheckJob { + override def toString: String = s"ParallelTypeCheckJob for $importTarget" + + override def compute(): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { + // in lazy mode, this function is called exactly when this package needs to be type-checked + // we also do not care about any dependent packages, because they will be lazily type-checked + val abstractPackage = AbstractPackage(importTarget)(config) + val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) + val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) + val isBuiltIn = importTarget == BuiltInImport + val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets + // first type-check dependent packages: + val dependentJobsFuts = dependencies + .map(ParallelTypeCheckJob(_, context)) + // add to manager & typecheck them if not present yet + .map(dependentJob => { + val dependentAbstractPackage = AbstractPackage(dependentJob.importTarget)(config) + parallelTypeCheckManager.addIfAbsent(dependentAbstractPackage, dependentJob)(executionContext) + parallelTypeCheckManager.getFuture(dependentAbstractPackage).flatten + }) + implicit val executor: GobraExecutionContext = executionContext + val dependentJobsFut = Future.sequence(dependentJobsFuts) + dependentJobsFut.map(_ => typeCheck(sources, ast, context)) + } + } + */ + case class ParallelTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[Future[TypeCheckResult]] with TypeCheckJob { + override def toString: String = s"ParallelTypeCheckJob for $abstractPackage" + + override def compute(): Future[TypeCheckResult] = { + val (sources, ast) = getParseResult(abstractPackage) + val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) + val isBuiltIn = abstractPackage == BuiltInPackage + val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets + // first type-check dependent packages: + val dependentJobsFuts = dependencies + .map(importTarget => { + val dependentPackage = AbstractPackage(importTarget)(config) + // add to manager & typecheck them if not present yet + val job = ParallelTypeCheckJob(dependentPackage) + parallelTypeCheckManager.addIfAbsent(dependentPackage, job)(executionContext) + parallelTypeCheckManager.getFuture(dependentPackage).flatten + .map(typeInfo => (importTarget, () => typeInfo))(executionContext) + }) + implicit val executor: GobraExecutionContext = executionContext + val dependentJobsFut = Future.sequence(dependentJobsFuts) + dependentJobsFut.map(dependentTypeInfo => typeCheck(sources, ast, dependentTypeInfo.toMap, isMainContext = isMainContext)) + } + } + /* + case class ChainingTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends Job[Future[Either[Vector[VerifierError], ExternalTypeInfo]]] with TypeCheckJob { + // case class ChainingTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] with TypeCheckJob { + // case class ChainingTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends TypeCheckJob { + override def toString: String = s"ChainingTypeCheckJob for ${pkg.info.id}" + + private def lookupPackage(importTarget: AbstractImport): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { + val abstractPackage = AbstractPackage(importTarget)(config) + val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) + val job = ChainingTypeCheckJob(sources, ast, context) + // typeCheckManager.addIfAbsent(abstractPackage, job)(executionContext) + // typeCheckManager.getFuture(abstractPackage) + // typeCheckManager.getResult(abstractPackage) + typeCheckManager.addIfAbsent(abstractPackage,() => job.compute()) + } + + // override def compute(): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { + // override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { + def compute(): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { + println(s"$this compute()") + implicit val executor: GobraExecutionContext = executionContext + // val abstractPackage = AbstractPackage(importTarget)(config) + // val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) + // for type-checking this package, we need type information for imported packages: + val importedTypeInfoFutures = // ast.imports.map(tuplesTypeCheck) + pkg.imports.map(importNode => lookupPackage(RegularImport(importNode.importPath))) + // add `BuiltInImport` since it's implicitly imported by every package + val (_, builtInAst) = parseManager.getResult(BuiltInPackage).getOrElse(() => Violation.violation(s"parsing $BuiltInImport failed")) + val isBuiltIn = pkg == builtInAst + val dependentFutures = if (isBuiltIn) importedTypeInfoFutures else lookupPackage(BuiltInImport) +: importedTypeInfoFutures + // execute call synchronously if there are no dependencies: + // if (dependentFutures.isEmpty) { + // Future { typeCheck(pkgSources, pkg, context) } + // } else { + Future.sequence(dependentFutures) + .map(packageResults => { + val errsInImportedPackages = packageResults + .collect { case Left(errs) => errs } + .flatten + if (errsInImportedPackages.isEmpty) { + typeCheck(pkgSources, pkg, context) + } else { + Left(errsInImportedPackages) + } + }) + // Await.result(fut, Duration.Inf) + // } + } + } + */ + /* + case class ChainingTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends TypeCheckJob { + private def lookupPackage(importTarget: AbstractImport): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { + val abstractPackage = AbstractPackage(importTarget)(config) + val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) + val job = ChainingTypeCheckJob(sources, ast, context) + typeCheckManager.addIfAbsent(abstractPackage, job)(executionContext) + typeCheckManager.getFuture(abstractPackage) + } + + override def getFuture: Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { + implicit val executor: GobraExecutionContext = executionContext + // val abstractPackage = AbstractPackage(importTarget)(config) + // val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) + // for type-checking this package, we need type information for imported packages: + val importedTypeInfoFutures = // ast.imports.map(tuplesTypeCheck) + pkg.imports.map(importNode => lookupPackage(RegularImport(importNode.importPath))) + // add `BuiltInImport` since it's implicitly imported by every package + val (builtInSources, builtInAst) = parseManager.getResult(BuiltInPackage).getOrElse(() => Violation.violation(s"parsing $BuiltInImport failed")) + val isBuiltIn = pkg == builtInAst + val dependentFutures = if (isBuiltIn) importedTypeInfoFutures else lookupPackage(BuiltInImport) +: importedTypeInfoFutures + Future.sequence(dependentFutures) + .map(packageResults => { + val errsInImportedPackages = packageResults + .collect { case Left(errs) => errs } + .flatten + if (errsInImportedPackages.isEmpty) { + typeCheck + } else { + Left(errsInImportedPackages) + } + }) + } + + override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { + println(s"ERROR: compute called job ${pkg.info.id}") + Left(Vector.empty) + } + } + */ + case class FailureJob(errs: Vector[VerifierError]) extends Job[TypeCheckResult] { + override def compute(): TypeCheckResult = Left(errs) } /* @@ -268,28 +594,201 @@ object Info { case Left(errs) => Future.successful(Left(errs)) })} */ - private val typeCheckManager = new TaskManager[AbstractPackage, Either[Vector[VerifierError], ExternalTypeInfo]](config) - def typeCheck(): Unit = { - /*parserContextMap.foreach { case (abstractPackage, parseResult) => - val typeCheckJob = parseResult match { - case Right((pkgSources, pkg)) => TypeCheckJob(pkgSources, pkg, this) - case Left(errs) => FailureJob(errs) - } - println(s"adding task $abstractPackage") - typeCheckManager.addIfAbsent(abstractPackage, typeCheckJob)(executionContext) + private val typeCheckManager = new TaskManager[AbstractPackage, TypeCheckResult](config.typeCheckMode) + private val parallelTypeCheckManager = new TaskManager[AbstractPackage, Future[TypeCheckResult]](config.typeCheckMode) + // private val typeCheckManager = new TaskManager[AbstractPackage, Future[Either[Vector[VerifierError], ExternalTypeInfo]]](config) + // private val typeCheckManager = new FutureManager[AbstractPackage, Either[Vector[VerifierError], ExternalTypeInfo]] + + // def typeCheck(): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { + def typeCheck(pkg: AbstractPackage): TypeCheckResult = { + config.typeCheckMode match { + case Lazy => + // we have to transitively add all packages to the typeCheckManager: + lazyTypeCheckRecursively(pkg, isMainContext = true) + typeCheckManager.getResult(pkg) + case Sequential => + typeCheckManager.addIfAbsent(pkg, SequentialTypeCheckJob(pkg, isMainContext = true))(executionContext) + typeCheckManager.getResult(pkg) + case Parallel => + parallelTypeCheckManager.addIfAbsent(pkg, ParallelTypeCheckJob(pkg, isMainContext = true))(executionContext) + // wait for result: + val fut = parallelTypeCheckManager.getResult(pkg) + Await.result(fut, Duration.Inf) } - */ - parseManager.getAllResultsWithKeys.foreach { case (abstractPackage, parseResult) => - val typeCheckJob = parseResult match { - case Right((pkgSources, pkg)) => TypeCheckJob(pkgSources, pkg, this) - case Left(errs) => FailureJob(errs) - } - println(s"adding task $abstractPackage") - // since we're adding the packages in arbitrary order, we cannot directly run the task in SEQUENTIAL mode because - // depending packages might not have been inserted yet - typeCheckManager.addIfAbsent(abstractPackage, typeCheckJob, insertOnly = config.typeCheckMode == TypeCheckMode.Sequential)(executionContext) + // typeCheckManager.addIfAbsent(mainPackage, DependentTypeCheckJob(RegularImport(""), this))(executionContext) + // typeCheckManager.getFuture(mainPackage).flatten + // typeCheckManager.getFuture(mainPackage) + } + + /* + def lazyTypeCheckRecursively(importTarget: AbstractImport): Unit = { + def allImports(importTarget: AbstractImport): Set[AbstractImport] = { + val abstractPackage = AbstractPackage(importTarget)(config) + val (_, ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $abstractPackage failed")) + ast.imports.toSet.flatMap[AbstractImport](importNode => allImports(RegularImport(importNode.importPath))) + importTarget } + + val packages = allImports(importTarget) + BuiltInImport + packages.foreach(importTarget => typeCheckManager.addIfAbsent(AbstractPackage(importTarget)(config), LazyTypeCheckJob(importTarget, this))(executionContext)) + println(s"packages added to typeCheckManager: ${packages.mkString("\n")}") } + */ + /* + def lazyTypeCheckRecursively(abstractPackage: AbstractPackage): Unit = { + def allImports(abstractPackage: AbstractPackage): Set[AbstractPackage] = { + val (_, ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $abstractPackage failed")) + ast.imports.toSet.flatMap[AbstractPackage](importNode => allImports(AbstractPackage(RegularImport(importNode.importPath))(config))) + abstractPackage + } + + val packages = allImports(abstractPackage) + BuiltInPackage + packages.foreach(pkg => typeCheckManager.addIfAbsent(pkg, LazyTypeCheckJob(pkg, this))(executionContext)) + println(s"packages added to typeCheckManager: ${packages.mkString("\n")}") + } + */ + def lazyTypeCheckRecursively(abstractPackage: AbstractPackage, isMainContext: Boolean = false): Unit = { + /** returns all transitively imported packages. However, `abstractPackage` is not included in the returned set! */ + def allImports(abstractPackage: AbstractPackage): Set[AbstractPackage] = { + val (_, ast: PPackage) = getParseResult(abstractPackage) + ast.imports + .map(importNode => AbstractPackage(RegularImport(importNode.importPath))(config)) + .toSet + .flatMap[AbstractPackage](directlyImportedPackage => allImports(directlyImportedPackage) + directlyImportedPackage) + } + + val dependentPackages = allImports(abstractPackage) + BuiltInPackage + // create jobs for all dependent packages + dependentPackages.foreach(pkg => typeCheckManager.addIfAbsent(pkg, LazyTypeCheckJob(pkg))(executionContext)) + // create job for this package: + typeCheckManager.addIfAbsent(abstractPackage, LazyTypeCheckJob(abstractPackage, isMainContext = isMainContext))(executionContext) + // println(s"packages added to typeCheckManager: ${(dependentPackages + abstractPackage).mkString("\n")}") + } +// def typeCheck(sources: Vector[Source], pkg: PPackage, importTarget: AbstractImport): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { +// /*parserContextMap.foreach { case (abstractPackage, parseResult) => +// val typeCheckJob = parseResult match { +// case Right((pkgSources, pkg)) => TypeCheckJob(pkgSources, pkg, this) +// case Left(errs) => FailureJob(errs) +// } +// println(s"adding task $abstractPackage") +// typeCheckManager.addIfAbsent(abstractPackage, typeCheckJob)(executionContext) +// } +// */ +// /* +// parseManager.getAllResultsWithKeys.foreach { case (abstractPackage, parseResult) => +// val typeCheckJob = parseResult match { +// case Right((pkgSources, pkg)) => TypeCheckJob(pkgSources, pkg, this) +// case Left(errs) => FailureJob(errs) +// } +// println(s"adding task $abstractPackage") +// // since we're adding the packages in arbitrary order, we cannot directly run the task in SEQUENTIAL mode because +// // depending packages might not have been inserted yet +// typeCheckManager.addIfAbsent(abstractPackage, typeCheckJob, insertOnly = config.typeCheckMode == TypeCheckMode.Sequential)(executionContext) +// } +// +// */ +// /* +// val job = ChainingTypeCheckJob(sources, pkg, this) +// /** this is a bit artificial as this is the top-level package, i.e. the one we want to verify */ +// val abstractPackage = AbstractPackage(RegularImport(""))(config) +// // typeCheckManager.addIfAbsent(abstractPackage, job)(executionContext) +// // typeCheckManager.getResult(abstractPackage) +// // typeCheckManager.getFuture(abstractPackage) +// typeCheckManager.addIfAbsent(abstractPackage, () => job.compute()) +// */ +// +// /* +// pkg.imports +// .map(importNode => RegularImport(importNode.importPath)) +// .map(typeCheckInternal) +// */ +// +// // TODO perform lookup in typeCheckManager before re-checking every dependent package +// val dependentTypeCheckFuts = pkg.imports +// .map(importNode => RegularImport(importNode.importPath)) +// .map(typeCheckInternal) +// +// val job = ChainingTypeCheckJob(sources, pkg, this) +// +// implicit val executor: GobraExecutionContext = executionContext +// val fut = for { +// dependentTypeChecks <- Future.sequence(dependentTypeCheckFuts) +// dependentErrs = dependentTypeChecks.flatMap { +// case Right(_) => Vector.empty +// case Left(errs) => errs +// } +// res = if (dependentErrs.isEmpty) { +// println(s"start type-checking ${pkg.info.id}") +// val startMs = System.currentTimeMillis() +// val typeCheckRes = Info.check(pkg, sources, this)(config) +// val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" +// println(s"type-checking ${pkg.info.id} done (took ${durationS}s)") +// typeCheckRes +// } else Left(dependentErrs) +// } yield res +// typeCheckManager.addIfAbsent(AbstractPackage(importTarget)(config), () => fut) +// } +// +// private def typeCheckInternal(importTarget: AbstractImport): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { +// // we iterate down to the package having no dependencies and register futures bottom up +// val parseRes = parseManager.getResult(AbstractPackage(importTarget)(config)) +// parseRes.fold(errs => Future.successful(Left(errs)), { case (sources, pkg) => typeCheck(sources, pkg, importTarget) }) +// /* +// for { +// (sources: Vector[Source], pkg: PPackage) <- parseManager.getResult(AbstractPackage(importTarget)(config)) +// // .left.map(errs => Future.successful(Left(errs))) +// dependentTypeCheckFuts = pkg.imports +// .map(importNode => RegularImport(importNode.importPath)) +// .map(typeCheckInternal) +// fut = for { +// dependentTypeChecks <- Future.sequence(dependentTypeCheckFuts) +// dependentErrs = dependentTypeChecks.flatMap { +// case Right(_) => Vector.empty +// case Left(errs) => errs +// } +// res = if (dependentErrs.isEmpty) { +// println(s"start type-checking ${pkg.info.id}") +// val startMs = System.currentTimeMillis() +// val typeCheckRes = Info.check(pkg, sources, this)(config) +// val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" +// println(s"type-checking ${pkg.info.id} done (took ${durationS}s)") +// typeCheckRes +// } else Left(dependentErrs) +// } yield res +// } yield fut +// */ +// } + + /* + def typeCheck(importTarget: AbstractImport): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { + implicit val executor: GobraExecutionContext = executionContext + *//* + def tuplesTypeCheck(importNode: PImport): Future[(PImport, Either[Vector[VerifierError], ExternalTypeInfo])] = { + val abstractPackage = RegularImport(importNode.importPath) + typeCheck(abstractPackage) + .map(res => (importNode, res)) + } + *//* + val abstractPackage = AbstractPackage(importTarget)(config) + val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) + // for type-checking this package, we need type information for imported packages: + val importedTypeInfoFutures = // ast.imports.map(tuplesTypeCheck) + ast.imports.map(importNode => typeCheck(RegularImport(importNode.importPath))) + // add `BuiltInImport` since it's implicitly imported by every package + Future.sequence(typeCheck(BuiltInImport) +: importedTypeInfoFutures) + .flatMap(packageResults => { + val errsInImportedPackages = packageResults + // .collect { case (_, Left(errs)) => errs } + .collect { case Left(errs) => errs } + .flatten + val job = if (errsInImportedPackages.isEmpty) { + TypeCheckJob(sources, ast, this) + } else { + FailureJob(errsInImportedPackages) + } + typeCheckManager.addIfAbsent(abstractPackage, job, insertOnly = config.typeCheckMode == TypeCheckMode.Sequential)(executionContext) + job.getFuture + }) + } + */ /* lazy val jobMap: Map[AbstractPackage, Job] = parserContextMap.transform { case (_, value) => value match { @@ -364,9 +863,23 @@ object Info { // // def getExternalErrors: Vector[VerifierError] = contextMap.values.collect { case Left(errs) => errs }.flatten.toVector - def getContexts: Iterable[ExternalTypeInfo] = + def getContexts: Iterable[ExternalTypeInfo] = { // typeContextMap.values.map(fut => Await.result(fut, Duration.Inf)).collect { case Right(info) => info } - typeCheckManager.getAllResults.collect { case Right(info) => info } + config.typeCheckMode match { + case Lazy | Sequential => typeCheckManager.getAllResults(executionContext).collect { case Right(info) => info } + case Parallel => + implicit val executor: GobraExecutionContext = executionContext + val results = Await.result(Future.sequence(parallelTypeCheckManager.getAllResults(executionContext)), Duration.Inf) + results.collect { case Right(info) => info } + } + // typeCheckManager.getAllResults.collect { case Right(info) => info } + // typeCheckManager.getAllResults(executionContext).collect { case Right(info) => info } + /* + implicit val executor: GobraExecutionContext = executionContext + val results = Await.result(Future.sequence(typeCheckManager.getAllResults), Duration.Inf) + results.collect { case Right(info) => info } + */ + } /* def getTypeInfoNonBlocking(importTarget: AbstractImport)(config: Config): Option[Future[Either[Vector[VerifierError], ExternalTypeInfo]]] = { val packageTarget = AbstractPackage(importTarget)(config) @@ -388,7 +901,7 @@ object Info { } */ - def getTypeInfo(importTarget: AbstractImport)(config: Config): Either[Vector[VerifierError], ExternalTypeInfo] = { + def getTypeInfo(importTarget: AbstractImport)(config: Config): TypeCheckResult = { val packageTarget = AbstractPackage(importTarget)(config) /* Violation.violation(typeContextMap.contains(packageTarget), s"expected that a job for ${packageTarget} but found none") @@ -407,33 +920,58 @@ object Info { case TypeCheckMode.Parallel => Await.result(job.getFuture, Duration.Inf) } */ - typeCheckManager.getResult(packageTarget) + /* + val future = typeCheckManager.getResult(packageTarget) + Violation.violation(future.isCompleted, s"job $importTarget is not yet completed") + Await.result(future, Duration.Inf) + */ + config.typeCheckMode match { + case Lazy | Sequential => typeCheckManager.getResult(packageTarget) + case Parallel => + val future = parallelTypeCheckManager.getFuture(packageTarget).flatten + Violation.violation(future.isCompleted, s"job $importTarget is not yet completed") + Await.result(future, Duration.Inf) + } + // typeCheckManager.getResult(packageTarget) + // val future = typeCheckManager.getFuture(packageTarget).flatten + // val future = typeCheckManager.getFuture(packageTarget) + // Violation.violation(future.isCompleted, s"job $importTarget is not yet completed") + // Await.result(future, Duration.Inf) } } - def check(pkg: PPackage, sources: Vector[Source], context: Context /*= new Context()*/, isMainContext: Boolean = false)(config: Config): Either[Vector[VerifierError], TypeInfo with ExternalTypeInfo] = { + def check(config: Config, abstractPackage: AbstractPackage, parseResults: Map[AbstractPackage, ParseSuccessResult])(executionContext: GobraExecutionContext): TypeCheckResult = { + // check for cycles + val cyclicErrors = new CycleChecker(config, parseResults).check(abstractPackage) + if (cyclicErrors.isEmpty) { + val typeCheckingStartMs = System.currentTimeMillis() + // add type-checking jobs to context: + val context = new Context(config, parseResults)(executionContext) + val res = context.typeCheck(abstractPackage) + val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" + println(s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})") + // we do not report any messages in this case, because `checkSources` will do so (for each package) + res + } else { + val (sources, pkg) = parseResults(abstractPackage) + val sourceNames = sources.map(_.name) + val errors = pkg.positions.translate(cyclicErrors, TypeError).distinct + config.reporter report TypeCheckFailureMessage(sourceNames, pkg.packageClause.id.name, () => pkg, errors) + Left(errors) + } + /* + val pkg = context.parseManager.getResult(pkgInfo) val tree = new GoTree(pkg) // println(program.declarations.head) // println("-------------------") // println(tree) val info = new TypeInfoImpl(tree, context, isMainContext)(config: Config) - def createImportError(importNode: PImport, errs: Vector[VerifierError]): Messages = { - val importTarget = RegularImport(importNode.importPath) - // create an error message located at the import statement to indicate errors in the imported package - // we distinguish between parse and type errors, cyclic imports, and packages whose source files could not be found - val notFoundErr = errs.collectFirst { case e: NotFoundError => e } - // alternativeErr is a function to compute the message only when needed - val alternativeErr = () => context.getParserImportCycle(importTarget) match { - case Some(cycle) => - val positionalInfo = cycle.importNodeStart.map(pos => s" at ${pos.format}").getOrElse("") - message(importNode, s"Package '$importTarget' is part of the following import cycle that involves the import ${cycle.importNodeCausingCycle}${positionalInfo}: ${cycle.cyclicPackages.mkString("[", ", ", "]")}") - case _ => message(importNode, s"Package '$importTarget' contains errors: $errs") - } - notFoundErr.map(e => message(importNode, e.message)) - .getOrElse(alternativeErr()) - } + + + val mainPackage = AbstractPackage(RegularImport(""))(config) + context.parseManager.addIfAbsent(mainPackage, context.SuccessParseJob(sources, pkg))(context.executionContext) //val parserMessages = noMessages val parserMessages = if (isMainContext) { @@ -474,7 +1012,7 @@ object Info { } val durationS = f"${(System.currentTimeMillis() - parsingStartMs) / 1000f}%.1f" println(s"parsing done, took ${durationS}s, ${messages.length} errors found") - /* + *//* val imports = Vector(BuiltInImport) ++ pkg.imports.map(i => RegularImport(i.importPath)) val parseResult = imports.map(importTarget => { @@ -487,7 +1025,7 @@ object Info { return Left(transitiveParseErrors) } println(s"parsing was fine") - */ + *//* messages } else { @@ -498,6 +1036,12 @@ object Info { if (isMainContext && parserMessages.isEmpty) { // context.startTypeChecking() context.typeCheck() + // val fut = context.typeCheck() + // val importTargets = BuiltInImport +: pkg.imports.map(importNode => RegularImport(importNode.importPath)) + // val typeCheckFutures = importTargets.map(importTarget => context.typeCheck(importTarget)) + // implicit val executor: GobraExecutionContext = context.executionContext + // Await.ready(Future.sequence(typeCheckFutures), Duration.Inf) + // Await.ready(fut, Duration.Inf) } // val errors = info.errors @@ -509,6 +1053,61 @@ object Info { println(s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})") } + val sourceNames = sources.map(_.name) + // use `sources` instead of `context.inputs` for reporting such that the message is correctly attributed in case of imports + config.reporter report TypeCheckDebugMessage(sourceNames, () => pkg, () => getDebugInfo(pkg, info)) + if (errors.isEmpty) { + config.reporter report TypeCheckSuccessMessage(sourceNames, config.taskName, () => info, () => pkg, () => getErasedGhostCode(pkg, info), () => getGoifiedGhostCode(pkg, info)) + Right(info) + } else { + // remove duplicates as errors related to imported packages might occur multiple times + // consider this: each error in an imported package is converted to an error at the import node with + // message 'Package contains errors'. If the imported package contains 2 errors then only a single error + // should be reported at the import node instead of two. + // however, the duplicate removal should happen after translation so that the error position is correctly + // taken into account for the equality check. + val typeErrors = pkg.positions.translate(errors, TypeError).distinct + config.reporter report TypeCheckFailureMessage(sourceNames, pkg.packageClause.id.name, () => pkg, typeErrors) + Left(typeErrors) + } + */ + } + + type TypeInfoCacheKey = String + private val typeInfoCache: ConcurrentMap[TypeInfoCacheKey, TypeInfoImpl] = new ConcurrentHashMap() + + private def getCacheKey(pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean, config: Config): TypeInfoCacheKey = { + // type-checking depends on `typeBounds` and `enableLazyImport` + val key = pkg.hashCode().toString ++ + dependentTypeInfo.hashCode().toString ++ + (if (isMainContext) "1" else "0") ++ + config.typeBounds.hashCode().toString ++ + (if (config.enableLazyImports) "1" else "0") + + val bytes = MessageDigest.getInstance("MD5").digest(key.getBytes) + // convert `bytes` to a hex string representation such that we get equality on the key while performing cache lookups + bytes.map { "%02x".format(_) }.mkString + } + + def flushCache(): Unit = { + typeInfoCache.clear() + } + + def checkSources(sources: Vector[Source], pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean = false)(config: Config): TypeCheckResult = { + def getTypeInfo(pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean, config: Config): TypeInfoImpl = { + val tree = new GoTree(pkg) + new TypeInfoImpl(tree, dependentTypeInfo, isMainContext)(config: Config) + } + + def getTypeInfoCached(pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean, config: Config): TypeInfoImpl = { + typeInfoCache.computeIfAbsent(getCacheKey(pkg, dependentTypeInfo, isMainContext, config), _ => getTypeInfo(pkg, dependentTypeInfo, isMainContext, config)) + } + + val checkFn = if (config.cacheParser) { getTypeInfoCached _ } else { getTypeInfo _ } + val info = checkFn(pkg, dependentTypeInfo, isMainContext, config) + + val errors = info.errors + val sourceNames = sources.map(_.name) // use `sources` instead of `context.inputs` for reporting such that the message is correctly attributed in case of imports config.reporter report TypeCheckDebugMessage(sourceNames, () => pkg, () => getDebugInfo(pkg, info)) diff --git a/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala b/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala index 41dd8c249..2482363c2 100644 --- a/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala +++ b/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala @@ -8,14 +8,16 @@ package viper.gobra.frontend.info import org.bitbucket.inkytonik.kiama.relation.Tree import viper.gobra.ast.frontend._ +import viper.gobra.frontend.PackageResolver.AbstractImport import viper.gobra.frontend.info.base.SymbolTable.{MethodImpl, MethodSpec, Regular, TypeMember} import viper.gobra.frontend.info.base.Type.{InterfaceT, Type} import viper.gobra.frontend.info.implementation.resolution.{AdvancedMemberSet, MemberPath} +import viper.gobra.reporting.VerifierError import viper.gobra.theory.Addressability trait TypeInfo extends ExternalTypeInfo { - def context: Info.Context + def dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]] def typOfExprOrType(expr: PExpressionOrType): Type def addressability(expr: PExpression): Addressability diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala b/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala index cc1a2863f..5c34ad774 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala @@ -9,6 +9,7 @@ package viper.gobra.frontend.info.implementation import com.typesafe.scalalogging.StrictLogging import org.bitbucket.inkytonik.kiama.attribution.Attribution import viper.gobra.ast.frontend._ +import viper.gobra.frontend.PackageResolver.AbstractImport import viper.gobra.frontend.{Config, PackageInfo} import viper.gobra.frontend.info.base.SymbolTable.{Regular, TypeMember, UnknownEntity, lookup} import viper.gobra.frontend.info.base.{SymbolTable, Type} @@ -18,8 +19,9 @@ import viper.gobra.frontend.info.implementation.typing._ import viper.gobra.frontend.info.implementation.typing.ghost._ import viper.gobra.frontend.info.implementation.typing.ghost.separation.GhostSeparation import viper.gobra.frontend.info.{ExternalTypeInfo, Info, TypeInfo} +import viper.gobra.reporting.VerifierError -class TypeInfoImpl(final val tree: Info.GoTree, final val context: Info.Context, val isMainContext: Boolean = false)(val config: Config) extends Attribution with TypeInfo with ExternalTypeInfo +class TypeInfoImpl(final val tree: Info.GoTree, final val dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], val isMainContext: Boolean = false)(val config: Config) extends Attribution with TypeInfo with ExternalTypeInfo with NameResolution with LabelResolution @@ -150,4 +152,12 @@ class TypeInfoImpl(final val tree: Info.GoTree, final val context: Info.Context, override def getTypeInfo: TypeInfo = this override def isPureExpression(expr: PExpression): Boolean = isPureExpr(expr).isEmpty + + def getTransitiveTypeInfos: Set[ExternalTypeInfo] = { + val directTypeInfos = dependentTypeInfo + .map { case (_, resultFn) => resultFn() } + .collect { case Right(info) => info } + .toSet + directTypeInfos.flatMap(directTypeInfo => directTypeInfo.getTransitiveTypeInfos) + this + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index 4dc0f9bc9..24587317e 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -13,8 +13,7 @@ import viper.gobra.ast.frontend._ import viper.gobra.frontend.PackageResolver.{AbstractImport, BuiltInImport, RegularImport} import viper.gobra.frontend.info.base.BuiltInMemberTag import viper.gobra.frontend.info.base.BuiltInMemberTag.{BuiltInMPredicateTag, BuiltInMethodTag} -import viper.gobra.frontend.{PackageResolver, Parser, Source} -import viper.gobra.frontend.info.{ExternalTypeInfo, Info} +import viper.gobra.frontend.info.ExternalTypeInfo import viper.gobra.frontend.info.base.SymbolTable._ import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl @@ -427,11 +426,13 @@ trait MemberResolution { this: TypeInfoImpl => res } */ + /* def createImportError(errs: Vector[VerifierError]): Messages = { // create an error message located at the import statement to indicate errors in the imported package // we distinguish between parse and type errors, cyclic imports, and packages whose source files could not be found val notFoundErr = errs.collectFirst { case e: NotFoundError => e } // alternativeErr is a function to compute the message only when needed + val alternativeErr = () => context.getParserImportCycle(importTarget) match { case Some(cycle) => message(errNode, s"Package '$importTarget' is part of the following import cycle that involves the import ${cycle.importNodeCausingCycle}: ${cycle.cyclicPackages.mkString("[", ", ", "]")}") @@ -440,6 +441,17 @@ trait MemberResolution { this: TypeInfoImpl => notFoundErr.map(e => message(errNode, e.message)) .getOrElse(alternativeErr()) } + */ + def createImportError(errs: Vector[VerifierError]): Messages = { + // create an error message located at the import statement to indicate errors in the imported package + // we distinguish between regular errors and packages whose source files could not be found (not that cyclic + // errors are handled before type-checking) + val notFoundErr = errs.collectFirst { case e: NotFoundError => e } + // alternativeErr is a function to compute the message only when needed + val alternativeErr = () => message(errNode, s"Package '$importTarget' contains errors: $errs") + notFoundErr.map(e => message(errNode, e.message)) + .getOrElse(alternativeErr()) + } // check if package was already parsed, otherwise do parsing and type checking: /* @@ -451,6 +463,8 @@ trait MemberResolution { this: TypeInfoImpl => cachedInfo.get.left.map(createImportError) // cachedInfo.getOrElse(parseAndTypeCheck(importTarget)).left.map(createImportError) */ - context.getTypeInfo(importTarget)(config).left.map(createImportError) + // context.getTypeInfo(importTarget)(config).left.map(createImportError) + Violation.violation(dependentTypeInfo.contains(importTarget), s"Expected that package ${tree.root.info.id} has access to the type information of package $importTarget") + dependentTypeInfo(importTarget)().left.map(createImportError) } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala index 588b0810a..f0feca5fc 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala @@ -129,16 +129,23 @@ trait GhostMemberTyping extends BaseTyping { this: TypeInfoImpl => def wellImplementationProofs: Either[Messages, Vector[(Type, InterfaceT, MethodImpl, MethodSpec)]] = { // the main context reports missing implementation proof for all packages (i.e. all packages that have been parsed & typechecked so far) if (isMainContext) { + // we not only collect the type information for directly imported packages but for all transitively imported ones: + // val typeInfos = getTransitiveTypeInfos(dependentTypeInfo) + this + val typeInfos = getTransitiveTypeInfos + // val typeInfos = dependentTypeInfo.map { case (_, resultFn) => resultFn() }.collect { case Right(info) => info }.toVector :+ this val allRequiredImplements = { - val foundRequired = localRequiredImplements ++ context.getContexts.flatMap(_.localRequiredImplements) - val foundGuaranteed = localGuaranteedImplements ++ context.getContexts.flatMap(_.localGuaranteedImplements) + // val foundRequired = localRequiredImplements ++ context.getContexts.flatMap(_.localRequiredImplements) + val foundRequired = localRequiredImplements ++ typeInfos.flatMap(_.localRequiredImplements) + // val foundGuaranteed = localGuaranteedImplements ++ context.getContexts.flatMap(_.localGuaranteedImplements) + val foundGuaranteed = localGuaranteedImplements ++ typeInfos.flatMap(_.localGuaranteedImplements) foundRequired diff foundGuaranteed } if (allRequiredImplements.nonEmpty) { // For every required implementation, check that there is at most one proof // and if not all predicates are defined, then check that there is a proof. - val providedImplProofs = localImplementationProofs ++ context.getContexts.flatMap(_.localImplementationProofs) + // val providedImplProofs = localImplementationProofs ++ context.getContexts.flatMap(_.localImplementationProofs) + val providedImplProofs = localImplementationProofs ++ typeInfos.flatMap(_.localImplementationProofs) val groupedProofs = allRequiredImplements.toVector.map{ case (impl, itf) => (impl, itf, providedImplProofs.collect{ case (`impl`, `itf`, alias, proofs) => (alias, proofs) }) } diff --git a/src/main/scala/viper/gobra/reporting/StatsCollector.scala b/src/main/scala/viper/gobra/reporting/StatsCollector.scala index c35fa4493..1ded42ceb 100644 --- a/src/main/scala/viper/gobra/reporting/StatsCollector.scala +++ b/src/main/scala/viper/gobra/reporting/StatsCollector.scala @@ -265,9 +265,18 @@ case class StatsCollector(reporter: GobraReporter) extends GobraReporter { typeInfo } else { // Try to find the correct typeInfo for the member + /* val typeInfoOption = typeInfo.context.getContexts .map(externalTypeInfo => externalTypeInfo.getTypeInfo) .find(typeInfo => treeContains(typeInfo.tree, p)) + */ + /* + val typeInfos = typeInfo.dependentTypeInfo.values + .map(typeInfoFn => typeInfoFn()) + .collect { case Right(info) => info.getTypeInfo} + */ + val typeInfos = typeInfo.getTransitiveTypeInfos.map(_.getTypeInfo) + val typeInfoOption = typeInfos.find(typeInfo => treeContains(typeInfo.tree, p)) typeInfoOption match { case Some(typeInfo) => typeInfo case None => Violation.violation("Couldn't find typeInfo for node " + p.formattedShort) From 5a4f353ac51d9195e1df393b4a709a386acbafd6 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 9 Mar 2023 15:07:44 +0100 Subject: [PATCH 105/296] fixes unit tests --- src/main/scala/viper/gobra/Gobra.scala | 44 +- .../scala/viper/gobra/frontend/Desugar.scala | 64 +- .../scala/viper/gobra/frontend/Parser.scala | 114 +-- .../frontend/info/ExternalTypeInfo.scala | 4 +- .../viper/gobra/frontend/info/Info.scala | 845 +----------------- .../info/implementation/TypeInfoImpl.scala | 8 +- .../typing/ghost/GhostMemberTyping.scala | 13 +- .../gobra/reporting/StatsCollector.scala | 13 +- .../viper/gobra/DetailedBenchmarkTests.scala | 20 +- .../gobra/erasing/GhostErasureUnitTests.scala | 3 +- .../gobra/typing/ExprTypingUnitTests.scala | 3 +- .../gobra/typing/StmtTypingUnitTests.scala | 3 +- .../gobra/typing/TypeTypingUnitTests.scala | 3 +- 13 files changed, 164 insertions(+), 973 deletions(-) diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index f83c0deaf..719e65857 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -247,25 +247,11 @@ class Gobra extends GoVerifier with GoIdeVerifier { if (config.shouldParse) { val startMs = System.currentTimeMillis() val res = Parser.parse(config, pkgInfo)(executor) - val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" - println(s"parser phase done, took ${durationS}s") - res - /* - val sourcesToParse = config.packageInfoInputMap(pkgInfo) - val res = Parser.parse(sourcesToParse, pkgInfo)(config) - */ - /* - val parseManager = Parser.parse(pkgInfo)(config, executionContext) - config.typeCheckMode match { - case TypeCheckMode.Lazy => // don't do anything - case TypeCheckMode.Sequential | TypeCheckMode.Parallel => - parseManager.awaitResults() - val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" - println(s"parser phase done, took ${durationS}s") - println(s"parsed packages: ${parseManager.getResults.map{ case (pkg, _) => pkg }.mkString(", ")}") + logger.debug { + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + s"parser phase done, took ${durationS}s" } - Right(parseManager) - */ + res } else { Left(Vector()) } @@ -279,12 +265,14 @@ class Gobra extends GoVerifier with GoIdeVerifier { } } - private def performDesugaring(config: Config, typeInfo: TypeInfo)(@unused executor: GobraExecutionContext): Either[Vector[VerifierError], Program] = { + private def performDesugaring(config: Config, typeInfo: TypeInfo)(executor: GobraExecutionContext): Either[Vector[VerifierError], Program] = { if (config.shouldDesugar) { val startMs = System.currentTimeMillis() - val res = Right(Desugar.desugar(typeInfo.tree.root, typeInfo)(config)) - val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" - println(s"desugaring done, took ${durationS}s") + val res = Right(Desugar.desugar(config, typeInfo)(executor)) + logger.debug { + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + s"desugaring done, took ${durationS}s" + } res } else { Left(Vector()) @@ -305,9 +293,11 @@ class Gobra extends GoVerifier with GoIdeVerifier { transformations :+= OverflowChecksTransform } val result = transformations.foldLeft(program)((prog, transf) => transf.transform(prog)) + logger.debug { + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + s"internal transformations done, took ${durationS}s" + } config.reporter.report(AppliedInternalTransformsMessage(config.packageInfoInputMap(pkgInfo).map(_.name), () => result)) - val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" - println(s"internal transformations done, took ${durationS}s") Right(result) } @@ -315,8 +305,10 @@ class Gobra extends GoVerifier with GoIdeVerifier { if (config.shouldViperEncode) { val startMs = System.currentTimeMillis() val res = Right(Translator.translate(program, pkgInfo)(config)) - val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" - println(s"Viper encoding done, took ${durationS}s") + logger.debug { + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + s"Viper encoding done, took ${durationS}s" + } res } else { Left(Vector()) diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 3bdc63c0d..d19d044d8 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -6,6 +6,7 @@ package viper.gobra.frontend +import com.typesafe.scalalogging.LazyLogging import viper.gobra.ast.frontend.{PExpression, AstPattern => ap, _} import viper.gobra.ast.{internal => in} import viper.gobra.frontend.PackageResolver.RegularImport @@ -20,41 +21,60 @@ import viper.gobra.reporting.{DesugaredMessage, Source} import viper.gobra.theory.Addressability import viper.gobra.translator.Names import viper.gobra.util.Violation.violation -import viper.gobra.util.{Constants, DesugarWriter, Violation} +import viper.gobra.util.{Constants, DesugarWriter, GobraExecutionContext, Violation} +import java.util.concurrent.atomic.AtomicLong import scala.annotation.{tailrec, unused} import scala.collection.{Iterable, SortedSet} +import scala.concurrent.duration.Duration +import scala.concurrent.{Await, Future} import scala.reflect.ClassTag -object Desugar { +object Desugar extends LazyLogging { - def desugar(pkg: PPackage, info: viper.gobra.frontend.info.TypeInfo)(config: Config): in.Program = { + def desugar(config: Config, info: viper.gobra.frontend.info.TypeInfo)(implicit executionContext: GobraExecutionContext): in.Program = { + val pkg = info.tree.root val importsCollector = new PackageInitSpecCollector - // independently desugar each imported package. - val importedDesugaringStartMs = System.currentTimeMillis() - // val importedPrograms = info.context.getContexts map { tI => { - // val importedPrograms = info.dependentTypeInfo.map { case (abstractPackage, tIFn) => { - val importedPrograms = info.getTransitiveTypeInfos.map { tI => { + + val importeDesugaringDurationMs = new AtomicLong(0) + val importedProgramsFuts = info.getTransitiveTypeInfos(includeThis = false).toSeq.map { tI => Future { + val importedDesugaringStartMs = System.currentTimeMillis() val typeInfo = tI.getTypeInfo - // val typeInfo: TypeInfo = tIFn().map(_.getTypeInfo).getOrElse(Violation.violation(s"cannot desugar package $abstractPackage for which type-checking failed")) // tI.getTypeInfo val importedPackage = typeInfo.tree.originalRoot val d = new Desugarer(importedPackage.positions, typeInfo) // registers a package to generate proof obligations for its init code d.registerPackage(importedPackage, importsCollector)(config) - (d, d.packageD(importedPackage)) + val res = (d, d.packageD(importedPackage)) + importeDesugaringDurationMs.addAndGet(System.currentTimeMillis() - importedDesugaringStartMs) + res }} - val importedDurationS = f"${(System.currentTimeMillis() - importedDesugaringStartMs) / 1000f}%.1f" - println(s"desugaring imported packages done, took ${importedDurationS}s") - - val desugaringStartMs = System.currentTimeMillis() - // desugar the main package, i.e. the package on which verification is performed: - val mainDesugarer = new Desugarer(pkg.positions, info) - // registers main package to generate proof obligations for its init code - mainDesugarer.registerMainPackage(pkg, importsCollector)(config) + + val mainPackageFut = Future { + val mainDesugaringStartMs = System.currentTimeMillis() + // desugar the main package, i.e. the package on which verification is performed: + val mainDesugarer = new Desugarer(pkg.positions, info) + // registers main package to generate proof obligations for its init code + mainDesugarer.registerMainPackage(pkg, importsCollector)(config) + val res = (mainDesugarer, mainDesugarer.packageD(pkg)) + logger.debug { + val durationS = f"${(System.currentTimeMillis() - mainDesugaringStartMs) / 1000f}%.1f" + s"desugaring package ${info.pkgInfo.id} done, took ${durationS}s" + } + res + } + + // we place `mainPackageFut` at index 0 + val allPackagesFut = Future.sequence(mainPackageFut +: importedProgramsFuts) + val futResults = Await.result(allPackagesFut, Duration.Inf) + val (mainDesugarer, mainProgram) = futResults.head + val importedPrograms = futResults.tail + logger.debug { + val importedDurationS = f"${importeDesugaringDurationMs.get() / 1000f}%.1f" + s"desugaring imported packages done, took ${importedDurationS}s" + } + // combine all desugared results into one Viper program: - val internalProgram = combine(mainDesugarer, mainDesugarer.packageD(pkg), importedPrograms) - val durationS = f"${(System.currentTimeMillis() - desugaringStartMs) / 1000f}%.1f" - println(s"desugaring main package done, took ${durationS}s") + val internalProgram = combine(mainDesugarer, mainProgram, importedPrograms) config.reporter report DesugaredMessage(config.packageInfoInputMap(pkg.info).map(_.name), () => internalProgram) internalProgram } @@ -3466,9 +3486,7 @@ object Desugar { pkg.imports.foreach{ imp => { val importedPackage = RegularImport(imp.importPath) Violation.violation(info.dependentTypeInfo.contains(importedPackage), s"Desugarer expects to have acess to the type information of all imported packages but could not find $importedPackage") - // info.context.getTypeInfo(RegularImport(imp.importPath))(config) match { info.dependentTypeInfo(importedPackage)() match { - // case Some(Right(tI)) => case Right(tI) => val desugaredPre = imp.importPres.map(specificationD(FunctionContext.empty(), info)) Violation.violation(!config.enableLazyImports || desugaredPre.isEmpty, s"Import precondition found despite running with ${Config.enableLazyImportOptionPrettyPrinted}") diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index ba88bac41..1e2a87f69 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -6,6 +6,7 @@ package viper.gobra.frontend +import com.typesafe.scalalogging.LazyLogging import org.bitbucket.inkytonik.kiama.rewriting.Cloner.{rewrite, topdown} import org.bitbucket.inkytonik.kiama.rewriting.PositionedRewriter.strategyWithName import org.bitbucket.inkytonik.kiama.rewriting.{Cloner, PositionedRewriter, Strategy} @@ -30,7 +31,7 @@ object Parser { type ParseSuccessResult = (Vector[Source], PPackage) type ParseResult = Either[Vector[VerifierError], ParseSuccessResult] - class ParseManager(config: Config, executionContext: GobraExecutionContext) { + class ParseManager(config: Config, executionContext: GobraExecutionContext) extends LazyLogging { private val manager = new TaskManager[AbstractPackage, ParseResult](TaskManagerMode.Parallel) def parse(pkgInfo: PackageInfo): Unit = { @@ -44,76 +45,74 @@ object Parser { trait ParseJob extends Job[ParseResult] { def pkgInfo: PackageInfo def pkgSources: Vector[Source] + def specOnly: Boolean override def compute(): ParseResult = { require(pkgSources.nonEmpty) + val preprocessedSources = preprocess(pkgSources)(config) + val startPreambleParsingMs = System.currentTimeMillis() - var endPreambleParsingMs: Option[Long] = None // before parsing, get imports and add these parse jobs - fastParse(pkgSources) - .map(directImportTarget => { - if (endPreambleParsingMs.isEmpty) { - endPreambleParsingMs = Some(System.currentTimeMillis()) - } + val imports = fastParse(preprocessedSources) + val preambleParsingDurationMs = System.currentTimeMillis() - startPreambleParsingMs + imports.foreach(directImportTarget => { val directImportPackage = AbstractPackage(directImportTarget)(config) - val pkgSources = PackageResolver.resolveSources(directImportTarget)(config) + val importedSources = PackageResolver.resolveSources(directImportTarget)(config) .getOrElse(Vector()) .map(_.source) - if (pkgSources.isEmpty) { + if (importedSources.isEmpty) { manager.addIfAbsent(directImportPackage, ParseFailureJob(Vector(NotFoundError(s"No source files for package '$directImportTarget found"))))(executionContext) } else { - manager.addIfAbsent(directImportPackage, ParseSourcesJob(pkgSources, directImportPackage))(executionContext) + manager.addIfAbsent(directImportPackage, ParseSourcesJob(importedSources, directImportPackage))(executionContext) } }) val startMs = System.currentTimeMillis() val res = for { - parsedProgram <- Parser.parse(pkgSources, pkgInfo, specOnly = true)(config) + parsedProgram <- Parser.process(preprocessedSources, pkgInfo, specOnly = specOnly)(config) } yield (pkgSources, parsedProgram) - val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" - val preambleParsingRatio = f"${100f * (endPreambleParsingMs.get - startPreambleParsingMs) / (System.currentTimeMillis() - startMs)}%.1f" - println(s"parsing ${pkgInfo.id} done (took ${durationS}s; parsing preamble takes ${preambleParsingRatio}%)") + + logger.trace { + val parsingDurationMs = System.currentTimeMillis() - startMs + val parsingDurationS = f"${parsingDurationMs / 1000f}%.1f" + val preambleParsingRatio = f"${100f * preambleParsingDurationMs / parsingDurationMs}%.1f" + s"parsing ${pkgInfo.id} done (took ${parsingDurationS}s; parsing preamble overhead is ${preambleParsingRatio}%)" + } + res } - private def fastParse(sources: Vector[Source]): Set[AbstractImport] = { - def getImportPaths(source: Source): Set[AbstractImport] = { - parsePreamble(source)(config) + private def fastParse(preprocessedInput: Vector[Source]): Set[AbstractImport] = { + def getImportPaths(preprocessedSource: Source): Set[AbstractImport] = { + processPreamble(preprocessedSource)(config) .map(_.imports.toSet.map[AbstractImport](importNode => RegularImport(importNode.importPath))) // we do not handle parser errors here but defer this to the time point when we actually // parse this source .getOrElse(Set.empty) } - sources.flatMap(getImportPaths).toSet + BuiltInImport + preprocessedInput.flatMap(getImportPaths).toSet + BuiltInImport } } + /** this job is used to parse the package that should be verified */ case class ParseInfoJob(override val pkgInfo: PackageInfo) extends ParseJob { lazy val pkgSources: Vector[Source] = config.packageInfoInputMap(pkgInfo) + lazy val specOnly: Boolean = false } + /** this job is used to parse all packages that are imported */ case class ParseSourcesJob(override val pkgSources: Vector[Source], pkg: AbstractPackage) extends ParseJob { require(pkgSources.nonEmpty) lazy val pkgInfo: PackageInfo = Source.getPackageInfo(pkgSources.head, config.projectRoot) + lazy val specOnly: Boolean = true } case class ParseFailureJob(errs: Vector[NotFoundError]) extends Job[ParseResult] { override def compute(): ParseResult = Left(errs) } - /* - def awaitResults(): Iterable[ParseResult] = manager.getAllResults(executionContext) - def getResult(pkgInfo: PackageInfo): ParseResult = - getResult(RegularPackage(pkgInfo.id)) - - def getResult(abstractPackage: AbstractPackage): ParseResult = - manager.getResult(abstractPackage) - - def getResults: Iterable[(AbstractPackage, ParseResult)] = - manager.getAllResultsWithKeys - */ def getParseResults(executionContext: GobraExecutionContext): Either[Map[AbstractPackage, Vector[VerifierError]], Map[AbstractPackage, ParseSuccessResult]] = { val (failedResults, successfulResults) = manager.getAllResultsWithKeys(executionContext) .partitionMap { case (key, eitherResult) => eitherResult.fold[Either[(AbstractPackage, Vector[VerifierError]), (AbstractPackage, ParseSuccessResult)]](errs => Left((key, errs)), result => Right((key, result))) } @@ -146,13 +145,45 @@ object Parser { } def parse(input: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean = false)(config: Config): Either[Vector[VerifierError], PPackage] = { + val preprocessedInputs = preprocess(input)(config) + process(preprocessedInputs, pkgInfo, specOnly = specOnly)(config) + } + + private def preprocess(input: Vector[Source])(config: Config): Vector[Source] = { val sources = input.map(Gobrafier.gobrafy) sources.foreach { s => config.reporter report PreprocessedInputMessage(s.name, () => s.content) } + sources + } + + /** + * Parses a source's preamble containing all (file-level) imports; This function expects that the input has already + * been preprocessed + */ + private def processPreamble(preprocessedSource: Source)(config: Config): Either[Vector[ParserError], PPreamble] = { + val positions = new Positions + val pom = new PositionManager(positions) + + def parseSource(preprocessedSource: Source): Either[Vector[ParserError], PPreamble] = { + val parser = new SyntaxAnalyzer[PreambleContext, PPreamble](preprocessedSource, ListBuffer.empty[ParserError], pom, specOnly = true) + parser.parse(parser.preamble) + } + + def parseSourceCached(preprocessedSource: Source): Either[Vector[ParserError], PPreamble] = { + def parseAndStore(): Either[Vector[ParserError], PPreamble] = + parseSource(preprocessedSource) + + preambleCache.computeIfAbsent(getCacheKey(preprocessedSource, specOnly = true), _ => parseAndStore()) + } + + if (config.cacheParser) parseSourceCached(preprocessedSource) else parseSource(preprocessedSource) + } + + private def process(preprocessedInputs: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[VerifierError], PPackage] = { for { - parseAst <- parseSources(sources, pkgInfo, specOnly)(config) + parseAst <- parseSources(preprocessedInputs, pkgInfo, specOnly = specOnly)(config) postprocessors = Seq( new ImportPostprocessor(parseAst.positions.positions), - new TerminationMeasurePostprocessor(parseAst.positions.positions, specOnly), + new TerminationMeasurePostprocessor(parseAst.positions.positions, specOnly = specOnly), ) postprocessedAst <- postprocessors.foldLeft[Either[Vector[VerifierError], PPackage]](Right(parseAst)) { case (Right(ast), postprocessor) => postprocessor.postprocess(ast)(config) @@ -286,27 +317,6 @@ object Parser { parser.parse(parser.sourceFile()) } - /** parses a source's preamble containing all (file-level) imports */ - def parsePreamble(source: Source)(config: Config): Either[Vector[ParserError], PPreamble] = { - // TODO: gobrafy only once - val positions = new Positions - val pom = new PositionManager(positions) - - def parseSource(source: Source): Either[Vector[ParserError], PPreamble] = { - val parser = new SyntaxAnalyzer[PreambleContext, PPreamble](Gobrafier.gobrafy(source), ListBuffer.empty[ParserError], pom, specOnly = true) - parser.parse(parser.preamble) - } - - def parseSourceCached(source: Source): Either[Vector[ParserError], PPreamble] = { - def parseAndStore(): Either[Vector[ParserError], PPreamble] = - parseSource(source) - - preambleCache.computeIfAbsent(getCacheKey(source, specOnly = true), _ => parseAndStore()) - } - - if (config.cacheParser) parseSourceCached(source) else parseSource(source) - } - def parseFunction(source: Source, specOnly: Boolean = false): Either[Vector[ParserError], PMember] = { val positions = new Positions val pom = new PositionManager(positions) diff --git a/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala b/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala index d4a19fd8f..fc72758b5 100644 --- a/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala +++ b/src/main/scala/viper/gobra/frontend/info/ExternalTypeInfo.scala @@ -23,8 +23,8 @@ trait ExternalTypeInfo { def pkgInfo: PackageInfo def dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]] - /** returns this and the type information of directly and transitively dependent packages */ - def getTransitiveTypeInfos: Set[ExternalTypeInfo] + /** returns this (unless disabled via parameter) and the type information of directly and transitively dependent packages */ + def getTransitiveTypeInfos(includeThis: Boolean = true): Set[ExternalTypeInfo] /** * Gets called by the type checker to perform a symbol table lookup in an imported package diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 3f43cebf6..561456e58 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -6,6 +6,7 @@ package viper.gobra.frontend.info +import com.typesafe.scalalogging.LazyLogging import org.bitbucket.inkytonik.kiama.relation.Tree import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, message} import org.bitbucket.inkytonik.kiama.util.{Position, Source} @@ -24,7 +25,7 @@ import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} import scala.concurrent.duration.Duration import scala.concurrent.{Await, Future} -object Info { +object Info extends LazyLogging { type GoTree = Tree[PNode, PPackage] type TypeCheckResult = Either[Vector[VerifierError], TypeInfo with ExternalTypeInfo] @@ -92,273 +93,20 @@ object Info { * Therefore, package management is centralized. */ class Context(val config: Config, val parseResults: Map[AbstractPackage, ParseSuccessResult])(val executionContext: GobraExecutionContext) extends GetParseResult { - /** stores the results of all imported packages that have been parsed so far */ - // private var parserContextMap: Map[AbstractPackage, Either[Vector[VerifierError], (Vector[Source], PPackage)]] = ListMap() - /** keeps track of the package dependencies that are currently resolved. This information is used to detect cycles */ - // private var parserPendingPackages: Vector[AbstractImport] = Vector() - /** stores all cycles that have been discovered so far */ - // var parserKnownImportCycles: Set[ImportCycle] = Set() - - /* - def parseRecursively(importTarget: AbstractImport)(config: Config): Either[Vector[VerifierError], PPackage] = { - val packageTarget = AbstractPackage(importTarget)(config) - parserPendingPackages = parserPendingPackages :+ importTarget - val pkgSources = PackageResolver.resolveSources(importTarget)(config) - .getOrElse(Vector()) - .map(_.source) - val res = for { - nonEmptyPkgSources <- if (pkgSources.isEmpty) - Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) - else Right(pkgSources) - parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) - directImportTargets = parsedProgram.imports.map(i => RegularImport(i.importPath)) - errorsInTransitivePackages = directImportTargets - .map(directImportTarget => { - if (parserPendingPackages.contains(directImportTarget)) { - // package cycle detected - parserKnownImportCycles += parserPendingPackages - Left(Vector(CyclicImportError(s"Cyclic package import detected starting with package '$packageTarget'"))) - } else { - parseRecursively(directImportTarget)(config) - } - }) - .flatMap(_.left.getOrElse(Vector.empty)) - res <- if (errorsInTransitivePackages.isEmpty) Right(parsedProgram) else Left(errorsInTransitivePackages) - } yield res - parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) - parserContextMap = parserContextMap + (packageTarget -> res) - res - } - */ - /* - def parseRecursively(importTarget: AbstractImport)(config: Config): Either[Vector[VerifierError], PPackage] = { - val packageTarget = AbstractPackage(importTarget)(config) - - // skip packages that we have already parsed: - if (parserContextMap.contains(packageTarget)) { - return parserContextMap(packageTarget) match { - case Right((_, pkg)) => Right(pkg) - case Left(errs) => Left(errs) - } - } - - println(s"parsing $importTarget") - parserPendingPackages = parserPendingPackages :+ importTarget - val pkgSources = PackageResolver.resolveSources(importTarget)(config) - .getOrElse(Vector()) - .map(_.source) - - val res = for { - nonEmptyPkgSources <- if (pkgSources.isEmpty) - Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) - // Left(message(importNode, s"No source files for package '$importTarget' found")) - else Right(pkgSources) - parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) - errorsInTransitivePackages = parsedProgram.imports - .map(importNode => { - val directImportTarget = RegularImport(importNode.importPath) - if (parserPendingPackages.contains(directImportTarget)) { - // package cycle detected - val importNodeStart = parsedProgram.positions.positions.getStart(importNode) - parserKnownImportCycles += ImportCycle(importNode, importNodeStart, parserPendingPackages) - println(s"cycle detected: ${importTarget} has import ${directImportTarget} that occurs in ${parserKnownImportCycles}") - Left(Vector(CyclicImportError(s"Cyclic package import detected starting with package '$packageTarget'"))) - // val cycle = parserPendingPackages - // Left(message(importNode, s"Package '$importTarget' is part of this import cycle: ${cycle.mkString("[", ", ", "]")}")) - } else { - parseRecursively(directImportTarget)(config) - } - }) - .flatMap(_.left.getOrElse(Vector.empty)) - res <- if (errorsInTransitivePackages.isEmpty) Right(parsedProgram) else Left(errorsInTransitivePackages) - } yield res - /* - val res: Either[Messages, PPackage] = for { - nonEmptyPkgSources <- if (pkgSources.isEmpty) - // Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) - Left(message(importNode, s"No source files for package '$importTarget' found")) - else Right(pkgSources) - parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) - directImportTargets = parsedProgram.imports // .map(i => RegularImport(i.importPath)) - errorsInTransitivePackages: Messages = directImportTargets - .map(directImportTarget => { - if (parserPendingPackages.contains(directImportTarget)) { - // package cycle detected - parserKnownImportCycles += parserPendingPackages - // Left(Vector(CyclicImportError(s"Cyclic package import detected starting with package '$packageTarget'"))) - val cycle = parserPendingPackages - Left(message(importNode, s"Package '$importTarget' is part of this import cycle: ${cycle.mkString("[", ", ", "]")}")) - } else { - parseRecursively(directImportTarget)(config) - } - }) - .flatMap(_.left.getOrElse(noMessages)) - res <- if (errorsInTransitivePackages.isEmpty) Right(parsedProgram) else Left(errorsInTransitivePackages) - } yield res - */ - parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) - parserContextMap = parserContextMap + (packageTarget -> res.map(pkg => (pkgSources, pkg))) - res - } - */ - /** - * returns all parser errors and cyclic errors transitively found in imported packages - */ - /* - def computeCycles(importTarget: AbstractImport): Vector[VerifierError] = { - parserPendingPackages = parserPendingPackages :+ importTarget - val abstractPackage = AbstractPackage(importTarget)(config) - val res = for { - res <- parseManager.getResult(abstractPackage) - (_, ast) = res - directImportTargets = ast.imports - errorsInTransitivePackages = directImportTargets - .flatMap(importNode => { - val directImportTarget = RegularImport(importNode.importPath) - if (parserPendingPackages.contains(directImportTarget)) { - // package cycle detected - val importNodeStart = ast.positions.positions.getStart(importNode) - parserKnownImportCycles += ImportCycle(importNode, importNodeStart, parserPendingPackages) - Vector(CyclicImportError(s"Cyclic package import detected starting with package '$directImportTarget'")) - // val cycle = parserPendingPackages - // message(importNode, s"Package '$importTarget' is part of this import cycle: ${cycle.mkString("[", ", ", "]")}") - } else { - computeCycles(directImportTarget) - } - }) - res <- if (errorsInTransitivePackages.isEmpty) Right(ast) else Left(errorsInTransitivePackages) - } yield res - parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) - res.left.getOrElse(Vector.empty) - } - */ - /* - def parseRecursively(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = { - val imports = Seq(BuiltInImport) ++ - pkg.imports.map(i => RegularImport(i.importPath)) - imports.map(importTarget => { - parserPendingPackages = parserPendingPackages :+ importTarget - val pkgSources = PackageResolver.resolveSources(importTarget)(config) - .getOrElse(Vector()) - .map(_.source) - val res = for { - nonEmptyPkgSources <- if (pkgSources.isEmpty) - Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) - else Right(pkgSources) - parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) - }) - - } - */ - - /** - * Returns all package names that lie on the cycle of imports or none if no cycle was found - */ - /* - def getParserImportCycle(importTarget: AbstractImport): Option[ImportCycle] = - parserKnownImportCycles.find(_.cyclicPackages.contains(importTarget)) - */ - - /* - case class ParseJob(importTarget: AbstractImport) extends Job[Either[Vector[VerifierError], (Vector[Source], PPackage)]] { - override def compute(): Either[Vector[VerifierError], (Vector[Source], PPackage)] = { - println(s"start parsing $importTarget") - val startMs = System.currentTimeMillis() - val pkgSources = PackageResolver.resolveSources(importTarget)(config) - .getOrElse(Vector()) - .map(_.source) - for { - nonEmptyPkgSources <- if (pkgSources.isEmpty) - Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) - // Left(message(importNode, s"No source files for package '$importTarget' found")) - else Right(pkgSources) - - // before parsing, get imports and add these parse jobs - _ = fastParse(nonEmptyPkgSources) - .map(directImportTarget => { - val directImportPackage = AbstractPackage(directImportTarget)(config) - parseManager.addIfAbsent(directImportPackage, ParseJob(directImportTarget))(executionContext) - }) - - parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) - durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" - _ = println(s"parsing $importTarget done (took ${durationS}s)") - /* - // submit jobs to parse dependent packages: - _ = parsedProgram.imports.foreach(importNode => { - val directImportTarget = RegularImport(importNode.importPath) - val directImportPackage = AbstractPackage(directImportTarget)(config) - parseManager.addIfAbsent(directImportPackage, ParseJob(directImportTarget))(executionContext) - }) - */ - } yield (pkgSources, parsedProgram) - } - } - - case class SuccessParseJob(sources: Vector[Source], pkg: PPackage) extends Job[Either[Vector[VerifierError], (Vector[Source], PPackage)]] { - override def compute(): Either[Vector[VerifierError], (Vector[Source], PPackage)] = - Right((sources, pkg)) - } + private val typeCheckManager = new TaskManager[AbstractPackage, TypeCheckResult](config.typeCheckMode) + private val parallelTypeCheckManager = new TaskManager[AbstractPackage, Future[TypeCheckResult]](config.typeCheckMode) - // val parseManager = new TaskManager[AbstractPackage, Either[Vector[VerifierError], (Vector[Source], PPackage)]](config) - def parse(importTarget: AbstractImport): Unit = { - val abstractPackage = AbstractPackage(importTarget)(config) - val parseJob = ParseJob(importTarget) - parseManager.addIfAbsent(abstractPackage, parseJob)(executionContext) - } - */ trait TypeCheckJob { protected def typeCheck(pkgSources: Vector[Source], pkg: PPackage, dependentTypeInfo: DependentTypeInfo, isMainContext: Boolean = false): TypeCheckResult = { - println(s"start type-checking ${pkg.info.id}") val startMs = System.currentTimeMillis() val res = Info.checkSources(pkgSources, pkg, dependentTypeInfo, isMainContext = isMainContext)(config) - val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" - println(s"type-checking ${pkg.info.id} done (took ${durationS}s)") + logger.trace { + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + s"type-checking ${pkg.info.id} done (took ${durationS}s)" + } res } } - /* - case class SimpleTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] with TypeCheckJob { - override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = typeCheck(pkgSources, pkg, context) - } - */ - /* - case class DependentTypeCheckJob(importTarget: AbstractImport, context: Context) extends Job[Future[Either[Vector[VerifierError], ExternalTypeInfo]]] with TypeCheckJob { - override def toString: String = s"DependentTypeCheckJob for $importTarget" - - override def compute(): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { - val abstractPackage = AbstractPackage(importTarget)(config) - val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) - val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) - val isBuiltIn = importTarget == BuiltInImport - val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets - val dependentJobsFuts = dependencies - .map(DependentTypeCheckJob(_, context)) - // add to manager & typecheck them if not present yet - .map(dependentJob => { - val dependentAbstractPackage = AbstractPackage(dependentJob.importTarget)(config) - typeCheckManager.addIfAbsent(dependentAbstractPackage, dependentJob)(executionContext) - typeCheckManager.getFuture(dependentAbstractPackage).flatten - }) - implicit val executor: GobraExecutionContext = executionContext - val dependentJobsFut = Future.sequence(dependentJobsFuts) - dependentJobsFut.map(_ => typeCheck(sources, ast, context)) - } - } - */ - /* - case class LazyTypeCheckJob(importTarget: AbstractImport, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] with TypeCheckJob { - override def toString: String = s"LazyTypeCheckJob for $importTarget" - - override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { - // in lazy mode, this function is called exactly when this package needs to be type-checked - // we also do not care about any dependent packages, because they will be lazily type-checked - val abstractPackage = AbstractPackage(importTarget)(config) - val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) - typeCheck(sources, ast, context) - } - } - */ case class LazyTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[TypeCheckResult] with TypeCheckJob { override def toString: String = s"LazyTypeCheckJob for $abstractPackage" @@ -377,43 +125,7 @@ object Info { typeCheck(sources, ast, dependentTypeInfo, isMainContext = isMainContext) } } - /* - case class LazyTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] with TypeCheckJob { - override def toString: String = s"LazyTypeCheckJob for ${pkg.info.id}" - - override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { - // in lazy mode, this function is called exactly when this package needs to be type-checked - // we also do not care about any dependent packages, because they will be lazily type-checked - // val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $abstractPackage failed")) - typeCheck(pkgSources, pkg, context) - } - } - */ - /* - case class SequentialTypeCheckJob(importTarget: AbstractImport, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] with TypeCheckJob { - override def toString: String = s"SequentialTypeCheckJob for $importTarget" - override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { - // in lazy mode, this function is called exactly when this package needs to be type-checked - // we also do not care about any dependent packages, because they will be lazily type-checked - val abstractPackage = AbstractPackage(importTarget)(config) - val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) - val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) - val isBuiltIn = importTarget == BuiltInImport - val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets - // first type-check dependent packages: - dependencies - .map(SequentialTypeCheckJob(_, context)) - // add to manager & typecheck them if not present yet - .foreach(dependentJob => { - val dependentAbstractPackage = AbstractPackage(dependentJob.importTarget)(config) - typeCheckManager.addIfAbsent(dependentAbstractPackage, dependentJob)(executionContext) - }) - typeCheck(sources, ast, context) - // typeCheck(abstractPackage, context) - } - } - */ case class SequentialTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[TypeCheckResult] with TypeCheckJob { override def toString: String = s"SequentialTypeCheckJob for $abstractPackage" @@ -435,33 +147,7 @@ object Info { typeCheck(sources, ast, dependentTypeInfos.toMap, isMainContext = isMainContext) } } - /* - case class ParallelTypeCheckJob(importTarget: AbstractImport, context: Context) extends Job[Future[Either[Vector[VerifierError], ExternalTypeInfo]]] with TypeCheckJob { - override def toString: String = s"ParallelTypeCheckJob for $importTarget" - override def compute(): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { - // in lazy mode, this function is called exactly when this package needs to be type-checked - // we also do not care about any dependent packages, because they will be lazily type-checked - val abstractPackage = AbstractPackage(importTarget)(config) - val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) - val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) - val isBuiltIn = importTarget == BuiltInImport - val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets - // first type-check dependent packages: - val dependentJobsFuts = dependencies - .map(ParallelTypeCheckJob(_, context)) - // add to manager & typecheck them if not present yet - .map(dependentJob => { - val dependentAbstractPackage = AbstractPackage(dependentJob.importTarget)(config) - parallelTypeCheckManager.addIfAbsent(dependentAbstractPackage, dependentJob)(executionContext) - parallelTypeCheckManager.getFuture(dependentAbstractPackage).flatten - }) - implicit val executor: GobraExecutionContext = executionContext - val dependentJobsFut = Future.sequence(dependentJobsFuts) - dependentJobsFut.map(_ => typeCheck(sources, ast, context)) - } - } - */ case class ParallelTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[Future[TypeCheckResult]] with TypeCheckJob { override def toString: String = s"ParallelTypeCheckJob for $abstractPackage" @@ -485,121 +171,11 @@ object Info { dependentJobsFut.map(dependentTypeInfo => typeCheck(sources, ast, dependentTypeInfo.toMap, isMainContext = isMainContext)) } } - /* - case class ChainingTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends Job[Future[Either[Vector[VerifierError], ExternalTypeInfo]]] with TypeCheckJob { - // case class ChainingTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends Job[Either[Vector[VerifierError], ExternalTypeInfo]] with TypeCheckJob { - // case class ChainingTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends TypeCheckJob { - override def toString: String = s"ChainingTypeCheckJob for ${pkg.info.id}" - - private def lookupPackage(importTarget: AbstractImport): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { - val abstractPackage = AbstractPackage(importTarget)(config) - val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) - val job = ChainingTypeCheckJob(sources, ast, context) - // typeCheckManager.addIfAbsent(abstractPackage, job)(executionContext) - // typeCheckManager.getFuture(abstractPackage) - // typeCheckManager.getResult(abstractPackage) - typeCheckManager.addIfAbsent(abstractPackage,() => job.compute()) - } - - // override def compute(): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { - // override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { - def compute(): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { - println(s"$this compute()") - implicit val executor: GobraExecutionContext = executionContext - // val abstractPackage = AbstractPackage(importTarget)(config) - // val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) - // for type-checking this package, we need type information for imported packages: - val importedTypeInfoFutures = // ast.imports.map(tuplesTypeCheck) - pkg.imports.map(importNode => lookupPackage(RegularImport(importNode.importPath))) - // add `BuiltInImport` since it's implicitly imported by every package - val (_, builtInAst) = parseManager.getResult(BuiltInPackage).getOrElse(() => Violation.violation(s"parsing $BuiltInImport failed")) - val isBuiltIn = pkg == builtInAst - val dependentFutures = if (isBuiltIn) importedTypeInfoFutures else lookupPackage(BuiltInImport) +: importedTypeInfoFutures - // execute call synchronously if there are no dependencies: - // if (dependentFutures.isEmpty) { - // Future { typeCheck(pkgSources, pkg, context) } - // } else { - Future.sequence(dependentFutures) - .map(packageResults => { - val errsInImportedPackages = packageResults - .collect { case Left(errs) => errs } - .flatten - if (errsInImportedPackages.isEmpty) { - typeCheck(pkgSources, pkg, context) - } else { - Left(errsInImportedPackages) - } - }) - // Await.result(fut, Duration.Inf) - // } - } - } - */ - /* - case class ChainingTypeCheckJob(pkgSources: Vector[Source], pkg: PPackage, context: Context) extends TypeCheckJob { - private def lookupPackage(importTarget: AbstractImport): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { - val abstractPackage = AbstractPackage(importTarget)(config) - val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) - val job = ChainingTypeCheckJob(sources, ast, context) - typeCheckManager.addIfAbsent(abstractPackage, job)(executionContext) - typeCheckManager.getFuture(abstractPackage) - } - override def getFuture: Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { - implicit val executor: GobraExecutionContext = executionContext - // val abstractPackage = AbstractPackage(importTarget)(config) - // val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) - // for type-checking this package, we need type information for imported packages: - val importedTypeInfoFutures = // ast.imports.map(tuplesTypeCheck) - pkg.imports.map(importNode => lookupPackage(RegularImport(importNode.importPath))) - // add `BuiltInImport` since it's implicitly imported by every package - val (builtInSources, builtInAst) = parseManager.getResult(BuiltInPackage).getOrElse(() => Violation.violation(s"parsing $BuiltInImport failed")) - val isBuiltIn = pkg == builtInAst - val dependentFutures = if (isBuiltIn) importedTypeInfoFutures else lookupPackage(BuiltInImport) +: importedTypeInfoFutures - Future.sequence(dependentFutures) - .map(packageResults => { - val errsInImportedPackages = packageResults - .collect { case Left(errs) => errs } - .flatten - if (errsInImportedPackages.isEmpty) { - typeCheck - } else { - Left(errsInImportedPackages) - } - }) - } - - override def compute(): Either[Vector[VerifierError], ExternalTypeInfo] = { - println(s"ERROR: compute called job ${pkg.info.id}") - Left(Vector.empty) - } - } - */ case class FailureJob(errs: Vector[VerifierError]) extends Job[TypeCheckResult] { override def compute(): TypeCheckResult = Left(errs) } - /* - lazy val typeContextMap: Map[AbstractPackage, Future[Either[Vector[VerifierError], ExternalTypeInfo]]] = - parserContextMap.map{ case (abstractPackage, value) => (abstractPackage, value match { - case Right((pkgSources, pkg)) => - if (parallelizeTypechecking) Future { typeCheck(pkgSources, pkg) }(executionContext) - else { - val res = typeCheck(pkgSources, pkg) - if (res.isLeft) { - println(s"type-checking ${abstractPackage} failed: ${res.left.get}") - } - Future.successful(res) - } - case Left(errs) => Future.successful(Left(errs)) - })} - */ - private val typeCheckManager = new TaskManager[AbstractPackage, TypeCheckResult](config.typeCheckMode) - private val parallelTypeCheckManager = new TaskManager[AbstractPackage, Future[TypeCheckResult]](config.typeCheckMode) - // private val typeCheckManager = new TaskManager[AbstractPackage, Future[Either[Vector[VerifierError], ExternalTypeInfo]]](config) - // private val typeCheckManager = new FutureManager[AbstractPackage, Either[Vector[VerifierError], ExternalTypeInfo]] - - // def typeCheck(): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { def typeCheck(pkg: AbstractPackage): TypeCheckResult = { config.typeCheckMode match { case Lazy => @@ -615,37 +191,9 @@ object Info { val fut = parallelTypeCheckManager.getResult(pkg) Await.result(fut, Duration.Inf) } - // typeCheckManager.addIfAbsent(mainPackage, DependentTypeCheckJob(RegularImport(""), this))(executionContext) - // typeCheckManager.getFuture(mainPackage).flatten - // typeCheckManager.getFuture(mainPackage) } - /* - def lazyTypeCheckRecursively(importTarget: AbstractImport): Unit = { - def allImports(importTarget: AbstractImport): Set[AbstractImport] = { - val abstractPackage = AbstractPackage(importTarget)(config) - val (_, ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $abstractPackage failed")) - ast.imports.toSet.flatMap[AbstractImport](importNode => allImports(RegularImport(importNode.importPath))) + importTarget - } - - val packages = allImports(importTarget) + BuiltInImport - packages.foreach(importTarget => typeCheckManager.addIfAbsent(AbstractPackage(importTarget)(config), LazyTypeCheckJob(importTarget, this))(executionContext)) - println(s"packages added to typeCheckManager: ${packages.mkString("\n")}") - } - */ - /* - def lazyTypeCheckRecursively(abstractPackage: AbstractPackage): Unit = { - def allImports(abstractPackage: AbstractPackage): Set[AbstractPackage] = { - val (_, ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $abstractPackage failed")) - ast.imports.toSet.flatMap[AbstractPackage](importNode => allImports(AbstractPackage(RegularImport(importNode.importPath))(config))) + abstractPackage - } - - val packages = allImports(abstractPackage) + BuiltInPackage - packages.foreach(pkg => typeCheckManager.addIfAbsent(pkg, LazyTypeCheckJob(pkg, this))(executionContext)) - println(s"packages added to typeCheckManager: ${packages.mkString("\n")}") - } - */ - def lazyTypeCheckRecursively(abstractPackage: AbstractPackage, isMainContext: Boolean = false): Unit = { + private def lazyTypeCheckRecursively(abstractPackage: AbstractPackage, isMainContext: Boolean): Unit = { /** returns all transitively imported packages. However, `abstractPackage` is not included in the returned set! */ def allImports(abstractPackage: AbstractPackage): Set[AbstractPackage] = { val (_, ast: PPackage) = getParseResult(abstractPackage) @@ -660,211 +208,9 @@ object Info { dependentPackages.foreach(pkg => typeCheckManager.addIfAbsent(pkg, LazyTypeCheckJob(pkg))(executionContext)) // create job for this package: typeCheckManager.addIfAbsent(abstractPackage, LazyTypeCheckJob(abstractPackage, isMainContext = isMainContext))(executionContext) - // println(s"packages added to typeCheckManager: ${(dependentPackages + abstractPackage).mkString("\n")}") - } -// def typeCheck(sources: Vector[Source], pkg: PPackage, importTarget: AbstractImport): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { -// /*parserContextMap.foreach { case (abstractPackage, parseResult) => -// val typeCheckJob = parseResult match { -// case Right((pkgSources, pkg)) => TypeCheckJob(pkgSources, pkg, this) -// case Left(errs) => FailureJob(errs) -// } -// println(s"adding task $abstractPackage") -// typeCheckManager.addIfAbsent(abstractPackage, typeCheckJob)(executionContext) -// } -// */ -// /* -// parseManager.getAllResultsWithKeys.foreach { case (abstractPackage, parseResult) => -// val typeCheckJob = parseResult match { -// case Right((pkgSources, pkg)) => TypeCheckJob(pkgSources, pkg, this) -// case Left(errs) => FailureJob(errs) -// } -// println(s"adding task $abstractPackage") -// // since we're adding the packages in arbitrary order, we cannot directly run the task in SEQUENTIAL mode because -// // depending packages might not have been inserted yet -// typeCheckManager.addIfAbsent(abstractPackage, typeCheckJob, insertOnly = config.typeCheckMode == TypeCheckMode.Sequential)(executionContext) -// } -// -// */ -// /* -// val job = ChainingTypeCheckJob(sources, pkg, this) -// /** this is a bit artificial as this is the top-level package, i.e. the one we want to verify */ -// val abstractPackage = AbstractPackage(RegularImport(""))(config) -// // typeCheckManager.addIfAbsent(abstractPackage, job)(executionContext) -// // typeCheckManager.getResult(abstractPackage) -// // typeCheckManager.getFuture(abstractPackage) -// typeCheckManager.addIfAbsent(abstractPackage, () => job.compute()) -// */ -// -// /* -// pkg.imports -// .map(importNode => RegularImport(importNode.importPath)) -// .map(typeCheckInternal) -// */ -// -// // TODO perform lookup in typeCheckManager before re-checking every dependent package -// val dependentTypeCheckFuts = pkg.imports -// .map(importNode => RegularImport(importNode.importPath)) -// .map(typeCheckInternal) -// -// val job = ChainingTypeCheckJob(sources, pkg, this) -// -// implicit val executor: GobraExecutionContext = executionContext -// val fut = for { -// dependentTypeChecks <- Future.sequence(dependentTypeCheckFuts) -// dependentErrs = dependentTypeChecks.flatMap { -// case Right(_) => Vector.empty -// case Left(errs) => errs -// } -// res = if (dependentErrs.isEmpty) { -// println(s"start type-checking ${pkg.info.id}") -// val startMs = System.currentTimeMillis() -// val typeCheckRes = Info.check(pkg, sources, this)(config) -// val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" -// println(s"type-checking ${pkg.info.id} done (took ${durationS}s)") -// typeCheckRes -// } else Left(dependentErrs) -// } yield res -// typeCheckManager.addIfAbsent(AbstractPackage(importTarget)(config), () => fut) -// } -// -// private def typeCheckInternal(importTarget: AbstractImport): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { -// // we iterate down to the package having no dependencies and register futures bottom up -// val parseRes = parseManager.getResult(AbstractPackage(importTarget)(config)) -// parseRes.fold(errs => Future.successful(Left(errs)), { case (sources, pkg) => typeCheck(sources, pkg, importTarget) }) -// /* -// for { -// (sources: Vector[Source], pkg: PPackage) <- parseManager.getResult(AbstractPackage(importTarget)(config)) -// // .left.map(errs => Future.successful(Left(errs))) -// dependentTypeCheckFuts = pkg.imports -// .map(importNode => RegularImport(importNode.importPath)) -// .map(typeCheckInternal) -// fut = for { -// dependentTypeChecks <- Future.sequence(dependentTypeCheckFuts) -// dependentErrs = dependentTypeChecks.flatMap { -// case Right(_) => Vector.empty -// case Left(errs) => errs -// } -// res = if (dependentErrs.isEmpty) { -// println(s"start type-checking ${pkg.info.id}") -// val startMs = System.currentTimeMillis() -// val typeCheckRes = Info.check(pkg, sources, this)(config) -// val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" -// println(s"type-checking ${pkg.info.id} done (took ${durationS}s)") -// typeCheckRes -// } else Left(dependentErrs) -// } yield res -// } yield fut -// */ -// } - - /* - def typeCheck(importTarget: AbstractImport): Future[Either[Vector[VerifierError], ExternalTypeInfo]] = { - implicit val executor: GobraExecutionContext = executionContext - *//* - def tuplesTypeCheck(importNode: PImport): Future[(PImport, Either[Vector[VerifierError], ExternalTypeInfo])] = { - val abstractPackage = RegularImport(importNode.importPath) - typeCheck(abstractPackage) - .map(res => (importNode, res)) - } - *//* - val abstractPackage = AbstractPackage(importTarget)(config) - val (sources: Vector[Source], ast: PPackage) = parseManager.getResult(abstractPackage).getOrElse(() => Violation.violation(s"parsing $importTarget failed")) - // for type-checking this package, we need type information for imported packages: - val importedTypeInfoFutures = // ast.imports.map(tuplesTypeCheck) - ast.imports.map(importNode => typeCheck(RegularImport(importNode.importPath))) - // add `BuiltInImport` since it's implicitly imported by every package - Future.sequence(typeCheck(BuiltInImport) +: importedTypeInfoFutures) - .flatMap(packageResults => { - val errsInImportedPackages = packageResults - // .collect { case (_, Left(errs)) => errs } - .collect { case Left(errs) => errs } - .flatten - val job = if (errsInImportedPackages.isEmpty) { - TypeCheckJob(sources, ast, this) - } else { - FailureJob(errsInImportedPackages) - } - typeCheckManager.addIfAbsent(abstractPackage, job, insertOnly = config.typeCheckMode == TypeCheckMode.Sequential)(executionContext) - job.getFuture - }) } - */ /* - lazy val jobMap: Map[AbstractPackage, Job] = - parserContextMap.transform { case (_, value) => value match { - case Right((pkgSources, pkg)) => TypeCheckJob(pkgSources, pkg, this) - case Left(errs) => FailureJob(errs) - }} - */ - - def typeCheckSequentially(): Unit = { - /* - val jobs = jobMap.toVector.sorted(Ordering.by[(AbstractPackage, Job), Int](_._1.hashCode())) - println(s"typeCheckSequentially: ${jobs.map(_._1)}") - jobs.foreach { case (abstractPackage, job) => - // println(s"typeCheckSequentially: $abstractPackage") - job.call() } - */ - // NOP - } - - def typeCheckInParallel(): Unit = { - // NOP - // jobMap.foreach { case (_, job) => Future{ job.call() }(executionContext) } - } - /* - lazy val typeContextMap: Map[AbstractPackage, Future[Either[Vector[VerifierError], ExternalTypeInfo]]] = - jobMap.transform { case (_, job) => job.getFuture } - */ -// /** stores the results of all imported packages that have been parsed and type checked so far */ -// private var contextMap: Map[AbstractPackage, Either[Vector[VerifierError], ExternalTypeInfo]] = ListMap[AbstractPackage, Either[Vector[VerifierError], ExternalTypeInfo]]() -// /** keeps track of the package dependencies that are currently resolved. This information is used to detect cycles */ -// private var pendingPackages: Vector[AbstractImport] = Vector() -// /** stores all cycles that have been discovered so far */ -// private var knownImportCycles: Set[Vector[AbstractImport]] = Set() -// -// def addPackage(importTarget: AbstractImport, typeInfo: ExternalTypeInfo)(config: Config): Unit = { -// val packageTarget = AbstractPackage(importTarget)(config) -// pendingPackages = pendingPackages.filterNot(_ == importTarget) -// contextMap = contextMap + (packageTarget -> Right(typeInfo)) -// } -// -// def addErrenousPackage(importTarget: AbstractImport, errors: Vector[VerifierError])(config: Config): Unit = { -// val packageTarget = AbstractPackage(importTarget)(config) -// pendingPackages = pendingPackages.filterNot(_ == importTarget) -// contextMap = contextMap + (packageTarget -> Left(errors)) -// } -// -// def getTypeInfo(importTarget: AbstractImport)(config: Config): Option[Either[Vector[VerifierError], ExternalTypeInfo]] = { -// val packageTarget = AbstractPackage(importTarget)(config) -// contextMap.get(packageTarget) match { -// case s@Some(_) => s -// case _ => { -// // there is no entry yet and package resolution might need to resolve multiple depending packages -// // keep track of these packages in pendingPackages until either type information or an error is added to contextMap -// if (pendingPackages.contains(importTarget)) { -// // package cycle detected -// knownImportCycles += pendingPackages -// Some(Left(Vector(CyclicImportError(s"Cyclic package import detected starting with package '$packageTarget'")))) -// } else { -// pendingPackages = pendingPackages :+ importTarget -// None -// } -// } -// } -// } -// -// /** -// * Returns all package names that lie on the cycle of imports or none if no cycle was found -// */ -// def getImportCycle(importTarget: AbstractImport): Option[Vector[AbstractImport]] = knownImportCycles.find(_.contains(importTarget)) -// -// def getContexts: Iterable[ExternalTypeInfo] = contextMap.values.collect { case Right(info) => info } -// -// def getExternalErrors: Vector[VerifierError] = contextMap.values.collect { case Left(errs) => errs }.flatten.toVector - def getContexts: Iterable[ExternalTypeInfo] = { - // typeContextMap.values.map(fut => Await.result(fut, Duration.Inf)).collect { case Right(info) => info } config.typeCheckMode match { case Lazy | Sequential => typeCheckManager.getAllResults(executionContext).collect { case Right(info) => info } case Parallel => @@ -872,59 +218,10 @@ object Info { val results = Await.result(Future.sequence(parallelTypeCheckManager.getAllResults(executionContext)), Duration.Inf) results.collect { case Right(info) => info } } - // typeCheckManager.getAllResults.collect { case Right(info) => info } - // typeCheckManager.getAllResults(executionContext).collect { case Right(info) => info } - /* - implicit val executor: GobraExecutionContext = executionContext - val results = Await.result(Future.sequence(typeCheckManager.getAllResults), Duration.Inf) - results.collect { case Right(info) => info } - */ - } - /* - def getTypeInfoNonBlocking(importTarget: AbstractImport)(config: Config): Option[Future[Either[Vector[VerifierError], ExternalTypeInfo]]] = { - val packageTarget = AbstractPackage(importTarget)(config) - typeContextMap.get(packageTarget) - } - - def getTypeInfo(importTarget: AbstractImport)(config: Config): Option[Either[Vector[VerifierError], ExternalTypeInfo]] = - getTypeInfoNonBlocking(importTarget)(config).map(Await.result(_, Duration.Inf)) - - */ - - /* - def startTypeChecking(): Unit = { - config.typeCheckMode match { - case TypeCheckMode.Parallel => typeCheckInParallel() - case TypeCheckMode.Sequential => typeCheckSequentially() - case TypeCheckMode.Lazy => // don't do anything yet - } } - */ def getTypeInfo(importTarget: AbstractImport)(config: Config): TypeCheckResult = { val packageTarget = AbstractPackage(importTarget)(config) - /* - Violation.violation(typeContextMap.contains(packageTarget), s"expected that a job for ${packageTarget} but found none") - val fut = typeContextMap(packageTarget) - Await.result(fut, Duration.Inf) - */ - /* - Violation.violation(jobMap.contains(packageTarget), s"expected that a job for ${packageTarget} but found none") - val job = jobMap(packageTarget) - config.typeCheckMode match { - case TypeCheckMode.Lazy => job.call() - case TypeCheckMode.Sequential => - // note that we cannot await the future here as type-checking of this package might not have started yet. - // Thus, we use `.call()` that either returns a previously calculated type-checking result or will calculate it. - job.call() - case TypeCheckMode.Parallel => Await.result(job.getFuture, Duration.Inf) - } - */ - /* - val future = typeCheckManager.getResult(packageTarget) - Violation.violation(future.isCompleted, s"job $importTarget is not yet completed") - Await.result(future, Duration.Inf) - */ config.typeCheckMode match { case Lazy | Sequential => typeCheckManager.getResult(packageTarget) case Parallel => @@ -932,15 +229,10 @@ object Info { Violation.violation(future.isCompleted, s"job $importTarget is not yet completed") Await.result(future, Duration.Inf) } - // typeCheckManager.getResult(packageTarget) - // val future = typeCheckManager.getFuture(packageTarget).flatten - // val future = typeCheckManager.getFuture(packageTarget) - // Violation.violation(future.isCompleted, s"job $importTarget is not yet completed") - // Await.result(future, Duration.Inf) } + */ } - def check(config: Config, abstractPackage: AbstractPackage, parseResults: Map[AbstractPackage, ParseSuccessResult])(executionContext: GobraExecutionContext): TypeCheckResult = { // check for cycles val cyclicErrors = new CycleChecker(config, parseResults).check(abstractPackage) @@ -949,8 +241,10 @@ object Info { // add type-checking jobs to context: val context = new Context(config, parseResults)(executionContext) val res = context.typeCheck(abstractPackage) - val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" - println(s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})") + logger.debug { + val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" + s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})" + } // we do not report any messages in this case, because `checkSources` will do so (for each package) res } else { @@ -960,117 +254,6 @@ object Info { config.reporter report TypeCheckFailureMessage(sourceNames, pkg.packageClause.id.name, () => pkg, errors) Left(errors) } - /* - val pkg = context.parseManager.getResult(pkgInfo) - val tree = new GoTree(pkg) - // println(program.declarations.head) - // println("-------------------") - // println(tree) - val info = new TypeInfoImpl(tree, context, isMainContext)(config: Config) - - - - val mainPackage = AbstractPackage(RegularImport(""))(config) - context.parseManager.addIfAbsent(mainPackage, context.SuccessParseJob(sources, pkg))(context.executionContext) - - //val parserMessages = noMessages - val parserMessages = if (isMainContext) { - val sequential = false - val parsingStartMs = System.currentTimeMillis() - val messages = if (sequential) { - // parse BuiltInImport - val builtInParseResult = context.parseRecursively(BuiltInImport)(config) - val builtInMessages = if (builtInParseResult.isRight) noMessages else message(pkg, s"Parsing package with Gobra's built-in definitions failed. This is an internal bug.") - - val importedPackagesMessages = pkg.imports.flatMap(importNode => { - val importTarget = RegularImport(importNode.importPath) - val parseResult = context.parseRecursively(importTarget)(config) - parseResult.left.map(errs => createImportError(importNode, errs)).left.getOrElse(noMessages) - }) - - builtInMessages ++ importedPackagesMessages - } else { - // parse BuiltInImport - context.parse(BuiltInImport) - - pkg.imports.foreach(importNode => { - val importTarget = RegularImport(importNode.importPath) - context.parse(importTarget) - }) - - // collect parse errors and cyclic import errors: - val builtInParseErrors = context.computeCycles(BuiltInImport) - val builtInMessages = if (builtInParseErrors.isEmpty) noMessages else message(pkg, s"Parsing package with Gobra's built-in definitions failed. This is an internal bug.") - - val importedPackagesMessages = pkg.imports.flatMap(importNode => { - val importTarget = RegularImport(importNode.importPath) - val parseErrors = context.computeCycles(importTarget) - if (parseErrors.isEmpty) noMessages else createImportError(importNode, parseErrors) - }) - - builtInMessages ++ importedPackagesMessages - } - val durationS = f"${(System.currentTimeMillis() - parsingStartMs) / 1000f}%.1f" - println(s"parsing done, took ${durationS}s, ${messages.length} errors found") - *//* - val imports = Vector(BuiltInImport) ++ - pkg.imports.map(i => RegularImport(i.importPath)) - val parseResult = imports.map(importTarget => { - context.parseRecursively(importTarget)(config) - }) - val transitiveParseErrors = parseResult.flatMap(res => res.left.getOrElse(Vector.empty)) - if (transitiveParseErrors.nonEmpty) { - println(s"parse error encountered") - println(transitiveParseErrors) - return Left(transitiveParseErrors) - } - println(s"parsing was fine") - *//* - - messages - } else { - noMessages - } - - val typeCheckingStartMs = System.currentTimeMillis() - if (isMainContext && parserMessages.isEmpty) { - // context.startTypeChecking() - context.typeCheck() - // val fut = context.typeCheck() - // val importTargets = BuiltInImport +: pkg.imports.map(importNode => RegularImport(importNode.importPath)) - // val typeCheckFutures = importTargets.map(importTarget => context.typeCheck(importTarget)) - // implicit val executor: GobraExecutionContext = context.executionContext - // Await.ready(Future.sequence(typeCheckFutures), Duration.Inf) - // Await.ready(fut, Duration.Inf) - } - - // val errors = info.errors - val errors = if (parserMessages.nonEmpty) parserMessages else { - info.errors - } - if (isMainContext && errors.isEmpty) { - val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" - println(s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})") - } - - val sourceNames = sources.map(_.name) - // use `sources` instead of `context.inputs` for reporting such that the message is correctly attributed in case of imports - config.reporter report TypeCheckDebugMessage(sourceNames, () => pkg, () => getDebugInfo(pkg, info)) - if (errors.isEmpty) { - config.reporter report TypeCheckSuccessMessage(sourceNames, config.taskName, () => info, () => pkg, () => getErasedGhostCode(pkg, info), () => getGoifiedGhostCode(pkg, info)) - Right(info) - } else { - // remove duplicates as errors related to imported packages might occur multiple times - // consider this: each error in an imported package is converted to an error at the import node with - // message 'Package contains errors'. If the imported package contains 2 errors then only a single error - // should be reported at the import node instead of two. - // however, the duplicate removal should happen after translation so that the error position is correctly - // taken into account for the equality check. - val typeErrors = pkg.positions.translate(errors, TypeError).distinct - config.reporter report TypeCheckFailureMessage(sourceNames, pkg.packageClause.id.name, () => pkg, typeErrors) - Left(typeErrors) - } - */ } type TypeInfoCacheKey = String diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala b/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala index 5c34ad774..5ca81f4c4 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala @@ -153,11 +153,15 @@ class TypeInfoImpl(final val tree: Info.GoTree, final val dependentTypeInfo: Map override def isPureExpression(expr: PExpression): Boolean = isPureExpr(expr).isEmpty - def getTransitiveTypeInfos: Set[ExternalTypeInfo] = { + def getTransitiveTypeInfos(includeThis: Boolean = true): Set[ExternalTypeInfo] = { val directTypeInfos = dependentTypeInfo .map { case (_, resultFn) => resultFn() } .collect { case Right(info) => info } .toSet - directTypeInfos.flatMap(directTypeInfo => directTypeInfo.getTransitiveTypeInfos) + this + // note that we call `getTransitiveTypeInfos` recursively with including the parameter in the results (which + // corresponds to the parameter's default value) + val dependentTypeInfos = directTypeInfos.flatMap(directTypeInfo => directTypeInfo.getTransitiveTypeInfos()) + if (includeThis) dependentTypeInfos + this + else dependentTypeInfos } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala index f0feca5fc..6ff5bef67 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala @@ -130,22 +130,17 @@ trait GhostMemberTyping extends BaseTyping { this: TypeInfoImpl => // the main context reports missing implementation proof for all packages (i.e. all packages that have been parsed & typechecked so far) if (isMainContext) { // we not only collect the type information for directly imported packages but for all transitively imported ones: - // val typeInfos = getTransitiveTypeInfos(dependentTypeInfo) + this - val typeInfos = getTransitiveTypeInfos - // val typeInfos = dependentTypeInfo.map { case (_, resultFn) => resultFn() }.collect { case Right(info) => info }.toVector :+ this + val typeInfos = getTransitiveTypeInfos() val allRequiredImplements = { - // val foundRequired = localRequiredImplements ++ context.getContexts.flatMap(_.localRequiredImplements) - val foundRequired = localRequiredImplements ++ typeInfos.flatMap(_.localRequiredImplements) - // val foundGuaranteed = localGuaranteedImplements ++ context.getContexts.flatMap(_.localGuaranteedImplements) - val foundGuaranteed = localGuaranteedImplements ++ typeInfos.flatMap(_.localGuaranteedImplements) + val foundRequired = typeInfos.flatMap(_.localRequiredImplements) + val foundGuaranteed = typeInfos.flatMap(_.localGuaranteedImplements) foundRequired diff foundGuaranteed } if (allRequiredImplements.nonEmpty) { // For every required implementation, check that there is at most one proof // and if not all predicates are defined, then check that there is a proof. - // val providedImplProofs = localImplementationProofs ++ context.getContexts.flatMap(_.localImplementationProofs) - val providedImplProofs = localImplementationProofs ++ typeInfos.flatMap(_.localImplementationProofs) + val providedImplProofs = typeInfos.flatMap(_.localImplementationProofs) val groupedProofs = allRequiredImplements.toVector.map{ case (impl, itf) => (impl, itf, providedImplProofs.collect{ case (`impl`, `itf`, alias, proofs) => (alias, proofs) }) } diff --git a/src/main/scala/viper/gobra/reporting/StatsCollector.scala b/src/main/scala/viper/gobra/reporting/StatsCollector.scala index 1ded42ceb..611689580 100644 --- a/src/main/scala/viper/gobra/reporting/StatsCollector.scala +++ b/src/main/scala/viper/gobra/reporting/StatsCollector.scala @@ -265,18 +265,9 @@ case class StatsCollector(reporter: GobraReporter) extends GobraReporter { typeInfo } else { // Try to find the correct typeInfo for the member - /* - val typeInfoOption = typeInfo.context.getContexts - .map(externalTypeInfo => externalTypeInfo.getTypeInfo) + val typeInfoOption = typeInfo.getTransitiveTypeInfos() + .map(_.getTypeInfo) .find(typeInfo => treeContains(typeInfo.tree, p)) - */ - /* - val typeInfos = typeInfo.dependentTypeInfo.values - .map(typeInfoFn => typeInfoFn()) - .collect { case Right(info) => info.getTypeInfo} - */ - val typeInfos = typeInfo.getTransitiveTypeInfos.map(_.getTypeInfo) - val typeInfoOption = typeInfos.find(typeInfo => treeContains(typeInfo.tree, p)) typeInfoOption match { case Some(typeInfo) => typeInfo case None => Violation.violation("Couldn't find typeInfo for node " + p.formattedShort) diff --git a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala index 1e2ea620f..c7e9ba31f 100644 --- a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala +++ b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala @@ -8,12 +8,12 @@ package viper.gobra import java.nio.file.Path import java.util.concurrent.TimeUnit - import org.scalatest.DoNotDiscover -import viper.gobra.ast.frontend.PPackage import viper.gobra.ast.internal.Program import viper.gobra.ast.internal.transform.OverflowChecksTransform import viper.gobra.backend.BackendVerifier +import viper.gobra.frontend.PackageResolver.{AbstractPackage, RegularPackage} +import viper.gobra.frontend.Parser.ParseSuccessResult import viper.gobra.frontend.info.{Info, TypeInfo} import viper.gobra.frontend.{Desugar, Parser} import viper.gobra.reporting.{AppliedInternalTransformsMessage, BackTranslator, VerifierError, VerifierResult} @@ -105,22 +105,24 @@ class DetailedBenchmarkTests extends BenchmarkTests { val c = config.get assert(c.packageInfoInputMap.size == 1) val pkgInfo = c.packageInfoInputMap.keys.head - Parser.parse(c.packageInfoInputMap(pkgInfo), pkgInfo)(c) + Parser.parse(c, pkgInfo)(executor) }) - private val typeChecking: NextStep[PPackage, (PPackage, TypeInfo), Vector[VerifierError]] = - NextStep("type-checking", parsing, (parsedPackage: PPackage) => { + private val typeChecking: NextStep[Map[AbstractPackage, ParseSuccessResult], TypeInfo, Vector[VerifierError]] = + NextStep("type-checking", parsing, (parseResults: Map[AbstractPackage, ParseSuccessResult]) => { assert(config.isDefined) val c = config.get assert(c.packageInfoInputMap.size == 1) val pkgInfo = c.packageInfoInputMap.keys.head - Info.check(parsedPackage, c.packageInfoInputMap(pkgInfo))(c).map(typeInfo => (parsedPackage, typeInfo)) + Info.check(c, RegularPackage(pkgInfo.id), parseResults)(executor) + // Info.check(parsedPackage, c.packageInfoInputMap(pkgInfo))(c).map(typeInfo => (parsedPackage, typeInfo)) }) - private val desugaring: NextStep[(PPackage, TypeInfo), Program, Vector[VerifierError]] = - NextStep("desugaring", typeChecking, { case (parsedPackage: PPackage, typeInfo: TypeInfo) => + private val desugaring: NextStep[TypeInfo, Program, Vector[VerifierError]] = + NextStep("desugaring", typeChecking, { case (typeInfo: TypeInfo) => assert(config.isDefined) - Right(Desugar.desugar(parsedPackage, typeInfo)(config.get)) + val c = config.get + Right(Desugar.desugar(c, typeInfo)(executor)) }) private val internalTransforming = NextStep("internal transforming", desugaring, (program: Program) => { diff --git a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala index f65633b21..b8097a222 100644 --- a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala +++ b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala @@ -342,9 +342,8 @@ class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside { new PackageInfo("pkg", "pkg", false) ) val tree = new Info.GoTree(pkg) - val context = new Info.Context() val config = Config() - val info = new TypeInfoImpl(tree, context)(config) + val info = new TypeInfoImpl(tree, Map.empty)(config) info.errors match { case Vector(msgs) => fail(s"Type-checking failed: $msgs") case _ => diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index 84f1f3aff..ed9020f20 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -3391,9 +3391,8 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { new PackageInfo("pkg", "pkg", false) ) val tree = new Info.GoTree(pkg) - val context = new Info.Context() val config = Config() - new TypeInfoImpl(tree, context)(config) + new TypeInfoImpl(tree, Map.empty)(config) } def exprType(expr : PExpression)(inArgs: Vector[(PParameter, Boolean)] = Vector()) : Type.Type = diff --git a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala index 4675ee774..dc3a3fbc7 100644 --- a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala @@ -81,9 +81,8 @@ class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside { new PackageInfo("pkg", "pkg", false) ) val tree = new Info.GoTree(pkg) - val context = new Info.Context() val config = Config() - new TypeInfoImpl(tree, context)(config) + new TypeInfoImpl(tree, Map.empty)(config) } def wellDefStmt(stmt : PStatement)(inArgs: Vector[(PParameter, Boolean)] = Vector()) = diff --git a/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala index 27f489be5..a248c2a15 100644 --- a/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala @@ -378,9 +378,8 @@ class TypeTypingUnitTests extends AnyFunSuite with Matchers with Inside { new PackageInfo("pkg", "pkg", false) ) val tree = new Info.GoTree(pkg) - val context = new Info.Context() val config = Config() - new TypeInfoImpl(tree, context)(config) + new TypeInfoImpl(tree, Map.empty)(config) } def areComparable(t1 : PType, t2 : PType) : Boolean = { From db26519b759440c90d2abca3ff1ad406f5746970 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 9 Mar 2023 15:10:54 +0100 Subject: [PATCH 106/296] fixes license headers --- src/main/antlr4/GoParser.g4 | 49 +++++++++++-------- .../viper/gobra/frontend/TaskManager.scala | 6 +++ 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/main/antlr4/GoParser.g4 b/src/main/antlr4/GoParser.g4 index d357ed404..273ed8336 100644 --- a/src/main/antlr4/GoParser.g4 +++ b/src/main/antlr4/GoParser.g4 @@ -1,25 +1,32 @@ /* - [The "BSD licence"] Copyright (c) 2017 Sasa Coh, MichaÅ‚ BÅ‚otniak Copyright (c) 2019 Ivan Kochurkin, - kvanttt@gmail.com, Positive Technologies Copyright (c) 2019 Dmitry Rassadin, - flipparassa@gmail.com,Positive Technologies All rights reserved. Copyright (c) 2021 Martin Mirchev, - mirchevmartin2203@gmail.com - - Redistribution and use in source and binary forms, with or without modification, are permitted - provided that the following conditions are met: 1. Redistributions of source code must retain the - above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in - binary form must reproduce the above copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided with the distribution. 3. The name - of the author may not be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. + [The "BSD licence"] + Copyright (c) 2017 Sasa Coh, MichaÅ‚ BÅ‚otniak + Copyright (c) 2019 Ivan Kochurkin, kvanttt@gmail.com, Positive Technologies + Copyright (c) 2019 Dmitry Rassadin, flipparassa@gmail.com, Positive Technologies + Copyright (c) 2021 Martin Mirchev, mirchevmartin2203@gmail.com + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* diff --git a/src/main/scala/viper/gobra/frontend/TaskManager.scala b/src/main/scala/viper/gobra/frontend/TaskManager.scala index 1efd6d496..4996e5155 100644 --- a/src/main/scala/viper/gobra/frontend/TaskManager.scala +++ b/src/main/scala/viper/gobra/frontend/TaskManager.scala @@ -1,3 +1,9 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2023 ETH Zurich. + package viper.gobra.frontend import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential, TaskManagerMode} From a45f58c62027502ead246e2245d477ce957b2e93 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 9 Mar 2023 15:12:10 +0100 Subject: [PATCH 107/296] fixes license headers --- src/main/antlr4/GoParser.g4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/antlr4/GoParser.g4 b/src/main/antlr4/GoParser.g4 index 273ed8336..ca03f1108 100644 --- a/src/main/antlr4/GoParser.g4 +++ b/src/main/antlr4/GoParser.g4 @@ -27,7 +27,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +*/ /* * A Go grammar for ANTLR 4 derived from the Go Language Specification https://golang.org/ref/spec From a2b9b6c1e0ccc1cb4169bac6f1691848cac144f3 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 10 Mar 2023 15:43:46 +0100 Subject: [PATCH 108/296] adds PPackage caching to parser --- .../scala/viper/gobra/frontend/Parser.scala | 107 ++++++++++-------- .../viper/gobra/frontend/TaskManager.scala | 3 + .../viper/gobra/frontend/info/Info.scala | 25 +++- 3 files changed, 84 insertions(+), 51 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 1e2a87f69..5c0aa220b 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -20,34 +20,38 @@ import org.antlr.v4.runtime.atn.PredictionMode import org.antlr.v4.runtime.misc.ParseCancellationException import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, PreambleContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, RegularImport, RegularPackage} +import viper.gobra.frontend.info.Info.{getCacheKey, typeInfoCache} import viper.gobra.util.GobraExecutionContext import viper.silver.ast.SourcePosition import scala.collection.mutable.ListBuffer import java.security.MessageDigest import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} +import scala.concurrent.duration.Duration +import scala.concurrent.{Await, Future} object Parser { type ParseSuccessResult = (Vector[Source], PPackage) type ParseResult = Either[Vector[VerifierError], ParseSuccessResult] + class ParseManager(config: Config, executionContext: GobraExecutionContext) extends LazyLogging { - private val manager = new TaskManager[AbstractPackage, ParseResult](TaskManagerMode.Parallel) + private val manager = new TaskManager[AbstractPackage, Future[ParseResult]](TaskManagerMode.Parallel) - def parse(pkgInfo: PackageInfo): Unit = { + def parse(pkgInfo: PackageInfo): ParseResult = { val pkg = RegularPackage(pkgInfo.id) val parseJob = ParseInfoJob(pkgInfo) manager.addIfAbsent(pkg, parseJob)(executionContext) // trigger and wait for parsing of at least this package (which will ensure that parse jobs for all dependent packages are created too) - manager.getResult(pkg) + Await.result(manager.getResult(pkg), Duration.Inf) } - trait ParseJob extends Job[ParseResult] { + trait ParseJob extends Job[Future[ParseResult]] { def pkgInfo: PackageInfo def pkgSources: Vector[Source] def specOnly: Boolean - override def compute(): ParseResult = { + override def compute(): Future[ParseResult] = { require(pkgSources.nonEmpty) val preprocessedSources = preprocess(pkgSources)(config) @@ -56,15 +60,17 @@ object Parser { // before parsing, get imports and add these parse jobs val imports = fastParse(preprocessedSources) val preambleParsingDurationMs = System.currentTimeMillis() - startPreambleParsingMs - imports.foreach(directImportTarget => { + val futs = imports.map(directImportTarget => { val directImportPackage = AbstractPackage(directImportTarget)(config) val importedSources = PackageResolver.resolveSources(directImportTarget)(config) .getOrElse(Vector()) .map(_.source) if (importedSources.isEmpty) { manager.addIfAbsent(directImportPackage, ParseFailureJob(Vector(NotFoundError(s"No source files for package '$directImportTarget found"))))(executionContext) + manager.getFuture(directImportPackage) // we do not flatten here as we only need to await the job's creation } else { manager.addIfAbsent(directImportPackage, ParseSourcesJob(importedSources, directImportPackage))(executionContext) + manager.getFuture(directImportPackage) // we do not flatten here as we only need to await the job's creation } }) @@ -80,7 +86,9 @@ object Parser { s"parsing ${pkgInfo.id} done (took ${parsingDurationS}s; parsing preamble overhead is ${preambleParsingRatio}%)" } - res + implicit val executor: GobraExecutionContext = executionContext + Future.sequence(futs) + .map(_ => res) } private def fastParse(preprocessedInput: Vector[Source]): Set[AbstractImport] = { @@ -109,12 +117,16 @@ object Parser { lazy val specOnly: Boolean = true } - case class ParseFailureJob(errs: Vector[NotFoundError]) extends Job[ParseResult] { - override def compute(): ParseResult = Left(errs) + case class ParseFailureJob(errs: Vector[NotFoundError]) extends Job[Future[ParseResult]] { + override def compute(): Future[ParseResult] = Future.successful[ParseResult](Left(errs)) } def getParseResults(executionContext: GobraExecutionContext): Either[Map[AbstractPackage, Vector[VerifierError]], Map[AbstractPackage, ParseSuccessResult]] = { - val (failedResults, successfulResults) = manager.getAllResultsWithKeys(executionContext) + implicit val executor: GobraExecutionContext = executionContext + // val futs = manager.getAllResultsWithKeys(executionContext).map { case (key, fut) => fut.map(res => (key, res)) } + val futs = manager.getAllFutures.map { case (key, fut) => fut.flatten.map(res => (key, res)) } + val results = Await.result(Future.sequence(futs), Duration.Inf) + val (failedResults, successfulResults) = results .partitionMap { case (key, eitherResult) => eitherResult.fold[Either[(AbstractPackage, Vector[VerifierError]), (AbstractPackage, ParseSuccessResult)]](errs => Left((key, errs)), result => Right((key, result))) } if (failedResults.isEmpty) Right(successfulResults.toMap) else Left(failedResults.toMap) @@ -168,11 +180,18 @@ object Parser { parser.parse(parser.preamble) } + var cacheHit: Boolean = true def parseSourceCached(preprocessedSource: Source): Either[Vector[ParserError], PPreamble] = { - def parseAndStore(): Either[Vector[ParserError], PPreamble] = + def parseAndStore(): Either[Vector[ParserError], PPreamble] = { + cacheHit = false parseSource(preprocessedSource) + } - preambleCache.computeIfAbsent(getCacheKey(preprocessedSource, specOnly = true), _ => parseAndStore()) + val res = preambleCache.computeIfAbsent(getCacheKey(preprocessedSource, specOnly = true), _ => parseAndStore()) + if (!cacheHit) { + println(s"No cache hit for ${res.map(_.packageClause.id.name)}'s preamble") + } + res } if (config.cacheParser) parseSourceCached(preprocessedSource) else parseSource(preprocessedSource) @@ -193,9 +212,10 @@ object Parser { } type SourceCacheKey = String - // cache maps a key (obtained by hasing file path and file content) to the parse result - private val sourceCache: ConcurrentMap[SourceCacheKey, (Either[Vector[ParserError], PProgram], Positions)] = new ConcurrentHashMap() + // cache maps a key (obtained by hashing file path and file content) to the parse result private val preambleCache: ConcurrentMap[SourceCacheKey, Either[Vector[ParserError], PPreamble]] = new ConcurrentHashMap() + type PackageCacheKey = String + private val packageCache: ConcurrentMap[PackageCacheKey, Either[Vector[VerifierError], PPackage]] = new ConcurrentHashMap() /** computes the key for caching a particular source. This takes the name, the specOnly flag, and the file's contents into account */ private def getCacheKey(source: Source, specOnly: Boolean): SourceCacheKey = { @@ -205,12 +225,37 @@ object Parser { bytes.map { "%02x".format(_) }.mkString } + private def getPackageCacheKey(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean): PackageCacheKey = { + val key = sources.map(source => source.name ++ source.content).mkString("") ++ pkgInfo.hashCode.toString ++ (if (specOnly) "1" else "0") + val bytes = MessageDigest.getInstance("MD5").digest(key.getBytes) + // convert `bytes` to a hex string representation such that we get equality on the key while performing cache lookups + bytes.map { "%02x".format(_) }.mkString + } + def flushCache(): Unit = { - sourceCache.clear() preambleCache.clear() + packageCache.clear() } private def parseSources(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[VerifierError], PPackage] = { + def parseSourcesCached(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[VerifierError], PPackage] = { + var cacheHit: Boolean = true + val res = packageCache.computeIfAbsent(getPackageCacheKey(sources, pkgInfo, specOnly), _ => { + cacheHit = false + parseSourcesUncached(sources, pkgInfo, specOnly)(config) + }) + if (!cacheHit) { + println(s"No cache hit for package ${pkgInfo.id}") + } + res + } + + val parseFn = if (config.cacheParser) { parseSourcesCached _ } else { parseSourcesUncached _ } + parseFn(sources, pkgInfo, specOnly)(config) + } + + /** parses a package not taking the package cache but only the program cache into account */ + private def parseSourcesUncached(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[VerifierError], PPackage] = { val positions = new Positions val pom = new PositionManager(positions) lazy val rewriter = new PRewriter(pom.positions) @@ -230,35 +275,6 @@ object Parser { } } - def parseSourceCached(source: Source): Either[Vector[ParserError], PProgram] = { - var cacheHit = true - def parseAndStore(): (Either[Vector[ParserError], PProgram], Positions) = { - cacheHit = false - val res = parseSource(source) - // sourceCache.put(getCacheKey(source, specOnly), (res, positions)) - (res, positions) - } - // val (res, pos) = sourceCache.getOrElse(getCacheKey(source, specOnly), parseAndStore()) - val (res, pos) = sourceCache.computeIfAbsent(getCacheKey(source, specOnly), _ => parseAndStore()) - if (cacheHit) { - // a cached AST has been found in the cache. The position manager does not yet have any positions for nodes in - // this AST. Therefore, the following strategy iterates over the entire AST and copies positional information - // from the cached positions to the position manager - val copyPosStrategy = strategyWithName[Any]("copyPositionInformation", { - case n: PNode => - val start = pos.getStart(n) - val finish = pos.getFinish(n) - start.foreach(positions.setStart(n, _)) - finish.foreach(positions.setFinish(n, _)) - Some(n): Option[Any] - case n => Some(n) - }) - res.map(prog => rewrite(topdown(copyPosStrategy))(prog)) - } else { - res - } - } - def isErrorFree(parserResults: Vector[Either[Vector[ParserError], PProgram]]): Either[Vector[ParserError], Vector[PProgram]] = { val (errors, programs) = parserResults.partitionMap(identity) if (errors.isEmpty) Right(programs) else Left(errors.flatten) @@ -290,8 +306,7 @@ object Parser { Right(parsedPackage) } - val parsingFn = if (config.cacheParser) { parseSourceCached _ } else { parseSource _ } - val parsedPrograms = sources.map(parsingFn) + val parsedPrograms = sources.map(parseSource) val res = for { // check that each of the parsed programs has the same package clause. If not, the algorithm collecting all files diff --git a/src/main/scala/viper/gobra/frontend/TaskManager.scala b/src/main/scala/viper/gobra/frontend/TaskManager.scala index 4996e5155..ec258a513 100644 --- a/src/main/scala/viper/gobra/frontend/TaskManager.scala +++ b/src/main/scala/viper/gobra/frontend/TaskManager.scala @@ -105,6 +105,9 @@ class TaskManager[K, R](mode: TaskManagerMode) { job.getFuture } + def getAllFutures: Iterable[(K, Future[R])] = + jobs.asScala.toVector.map { case (key, job) => (key, job.getFuture) } + def getResult(id: K): R = { val job = jobs.get(id) Violation.violation(job != null, s"Task $id not found") diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 561456e58..8dff14b00 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -260,13 +260,23 @@ object Info extends LazyLogging { private val typeInfoCache: ConcurrentMap[TypeInfoCacheKey, TypeInfoImpl] = new ConcurrentHashMap() private def getCacheKey(pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean, config: Config): TypeInfoCacheKey = { - // type-checking depends on `typeBounds` and `enableLazyImport` - val key = pkg.hashCode().toString ++ - dependentTypeInfo.hashCode().toString ++ - (if (isMainContext) "1" else "0") ++ - config.typeBounds.hashCode().toString ++ + // the cache key only depends on config's `typeBounds` and `enableLazyImport` + val pkgKey = pkg.hashCode().toString + // the computed key must be deterministic! + val dependentTypeInfoKey = dependentTypeInfo + .toVector + .map { case (pkg, fn) => pkg.hashCode().toString ++ fn().hashCode().toString } + .sorted + .mkString("") + val isMainContextKey = if (isMainContext) "1" else "0" + val configKey = config.typeBounds.hashCode().toString ++ (if (config.enableLazyImports) "1" else "0") + val key = pkgKey ++ + dependentTypeInfoKey ++ + isMainContextKey ++ + configKey + val bytes = MessageDigest.getInstance("MD5").digest(key.getBytes) // convert `bytes` to a hex string representation such that we get equality on the key while performing cache lookups bytes.map { "%02x".format(_) }.mkString @@ -277,7 +287,9 @@ object Info extends LazyLogging { } def checkSources(sources: Vector[Source], pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean = false)(config: Config): TypeCheckResult = { + var cacheHit: Boolean = true def getTypeInfo(pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean, config: Config): TypeInfoImpl = { + cacheHit = false val tree = new GoTree(pkg) new TypeInfoImpl(tree, dependentTypeInfo, isMainContext)(config: Config) } @@ -288,6 +300,9 @@ object Info extends LazyLogging { val checkFn = if (config.cacheParser) { getTypeInfoCached _ } else { getTypeInfo _ } val info = checkFn(pkg, dependentTypeInfo, isMainContext, config) + if (!cacheHit) { + println(s"No cache hit for type info for ${pkg.info.id}") + } val errors = info.errors From 04874c9e641438d02e399b39b3bc8401dda35ce4 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 10 Mar 2023 16:02:12 +0100 Subject: [PATCH 109/296] fixes a unit test --- .../gobra/ast/frontend/PrettyPrinter.scala | 17 ++++++++++++++--- .../scala/viper/gobra/frontend/Desugar.scala | 4 ++-- .../features/errors/error-fail2.gobra | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index eaddcec2b..a3de74798 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -24,6 +24,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter def show(node: PNode): Doc = node match { case n: PPackage => showPackage(n) case n: PProgram => showProgram(n) + case n: PPreamble => showPreamble(n) case n: PPackageClause => showPackageClause(n) case n: PImport => showImport(n) case n: PMember => showMember(n) @@ -61,12 +62,22 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter def showProgram(p: PProgram): Doc = p match { case PProgram(packageClause, progPosts, imports, declarations) => - vcat(progPosts.map("initEnsures" <+> showExpr(_))) <> - showPackageClause(packageClause) <> line <> line <> - ssep(imports map showImport, line) <> line <> + showPreamble(packageClause, progPosts, imports) <> ssep(declarations map showMember, line <> line) <> line } + // preamble + + def showPreamble(p: PPreamble): Doc = p match { + case PPreamble(packageClause, progPosts, imports) => + showPreamble(packageClause, progPosts, imports) + } + + private def showPreamble(packageClause: PPackageClause, progPosts: Vector[PExpression], imports: Vector[PImport]): Doc = + vcat(progPosts.map("initEnsures" <+> showExpr(_))) <> + showPackageClause(packageClause) <> line <> line <> + ssep(imports map showImport, line) <> line + // package def showPackageClause(node: PPackageClause): Doc = "package" <+> showPackageId(node.id) diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index d19d044d8..96a56fdc4 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -56,7 +56,7 @@ object Desugar extends LazyLogging { // registers main package to generate proof obligations for its init code mainDesugarer.registerMainPackage(pkg, importsCollector)(config) val res = (mainDesugarer, mainDesugarer.packageD(pkg)) - logger.debug { + logger.trace { val durationS = f"${(System.currentTimeMillis() - mainDesugaringStartMs) / 1000f}%.1f" s"desugaring package ${info.pkgInfo.id} done, took ${durationS}s" } @@ -68,7 +68,7 @@ object Desugar extends LazyLogging { val futResults = Await.result(allPackagesFut, Duration.Inf) val (mainDesugarer, mainProgram) = futResults.head val importedPrograms = futResults.tail - logger.debug { + logger.trace { val importedDurationS = f"${importeDesugaringDurationMs.get() / 1000f}%.1f" s"desugaring imported packages done, took ${importedDurationS}s" } diff --git a/src/test/resources/regressions/features/errors/error-fail2.gobra b/src/test/resources/regressions/features/errors/error-fail2.gobra index ec9936e10..e810d3ed8 100644 --- a/src/test/resources/regressions/features/errors/error-fail2.gobra +++ b/src/test/resources/regressions/features/errors/error-fail2.gobra @@ -3,7 +3,7 @@ package pkg -// ##(-I src/test/resources/regressions/features/errors) +// ##(-I ./) import . "bar" func foo(e error) int { From e88a9fffe3f5df4a1df3598b0fa2b07414dc492c Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Fri, 10 Mar 2023 18:35:49 +0100 Subject: [PATCH 110/296] Update Submodules (#637) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Updates submodules * Updates submodules * fix * Updates submodules * Updates submodules * Updates submodules * fix some tests * fix some tests --------- Co-authored-by: jcp19 Co-authored-by: JoĂ£o Pereira --- .../evaluation/binary_search_tree.gobra | 12 +++---- .../impl_errors/binary_search_tree.gobra | 32 +++++++++---------- .../spec_errors/binary_search_tree.gobra | 32 +++++++++---------- .../tutorial-examples/predicate.gobra | 4 +-- .../resources/regressions/issues/000416.gobra | 3 +- .../importedImplementationPkg.gobra | 8 ++--- .../shape/shape.gobra | 4 +-- viperserver | 2 +- 8 files changed, 49 insertions(+), 48 deletions(-) diff --git a/src/test/resources/regressions/examples/evaluation/binary_search_tree.gobra b/src/test/resources/regressions/examples/evaluation/binary_search_tree.gobra index 3f560953a..9ca21e1ba 100644 --- a/src/test/resources/regressions/examples/evaluation/binary_search_tree.gobra +++ b/src/test/resources/regressions/examples/evaluation/binary_search_tree.gobra @@ -29,9 +29,9 @@ pred (n *node) tree() { } ghost -requires n.tree() +requires acc(n.tree(), _) pure func (n *node) sorted(lowerBound, upperBound option[int]) bool { - return unfolding n.tree() in (lowerBound != none[int] ==> get(lowerBound) < n.value) && + return unfolding acc(n.tree(), _) in (lowerBound != none[int] ==> get(lowerBound) < n.value) && (upperBound != none[int] ==> n.value < get(upperBound)) && (n.left != nil ==> n.left.sorted(lowerBound, some(n.value))) && (n.right != nil ==> n.right.sorted(some(n.value), upperBound)) @@ -59,19 +59,19 @@ func (n *node) convert(oldLowerBound, oldUpperBound, newLowerBound, newUpperBoun } ghost -requires t.tree() +requires acc(t.tree(), _) ensures forall i int :: (0 <= i && i + 1 < len(res) ==> res[i] < res[i + 1]) // ordered pure func (t *Tree) sortedValues() (res seq[int]) { - return unfolding t.tree() in (t.root == nil) ? seq[int] { } : t.root.sortedValues(none[int], none[int]) + return unfolding acc(t.tree(), _) in (t.root == nil) ? seq[int] { } : t.root.sortedValues(none[int], none[int]) } ghost -requires n.tree() && n.sorted(lowerBound, upperBound) +requires acc(n.tree(), _) && n.sorted(lowerBound, upperBound) ensures n.sorted(lowerBound, upperBound) ensures forall i int :: (0 <= i && i < len(res) ==> ((lowerBound != none[int] ==> res[i] > get(lowerBound)) && (upperBound != none[int] ==> res[i] < get(upperBound)))) ensures forall i int :: (0 <= i && i + 1 < len(res) ==> res[i] < res[i + 1]) // ordered pure func (n *node) sortedValues(lowerBound, upperBound option[int]) (res seq[int]) { - return unfolding n.tree() in (n.left == nil ? seq[int]{ } : n.left.sortedValues(lowerBound, some(n.value))) ++ seq[int]{ n.value } ++ (n.right == nil ? seq[int]{ } : n.right.sortedValues(some(n.value), upperBound)) + return unfolding acc(n.tree(), _) in (n.left == nil ? seq[int]{ } : n.left.sortedValues(lowerBound, some(n.value))) ++ seq[int]{ n.value } ++ (n.right == nil ? seq[int]{ } : n.right.sortedValues(some(n.value), upperBound)) } ensures t.tree() && t.IsEmpty() diff --git a/src/test/resources/regressions/examples/evaluation/impl_errors/binary_search_tree.gobra b/src/test/resources/regressions/examples/evaluation/impl_errors/binary_search_tree.gobra index d8789591a..429dcb1a6 100644 --- a/src/test/resources/regressions/examples/evaluation/impl_errors/binary_search_tree.gobra +++ b/src/test/resources/regressions/examples/evaluation/impl_errors/binary_search_tree.gobra @@ -29,9 +29,9 @@ pred (n *node) tree() { } ghost -requires n.tree() +requires acc(n.tree(), _) pure func (n *node) sorted(lowerBound, upperBound option[int]) bool { - return unfolding n.tree() in (lowerBound != none[int] ==> get(lowerBound) < n.value) && + return unfolding acc(n.tree(), _) in (lowerBound != none[int] ==> get(lowerBound) < n.value) && (upperBound != none[int] ==> n.value < get(upperBound)) && (n.left != nil ==> n.left.sorted(lowerBound, some(n.value))) && (n.right != nil ==> n.right.sorted(some(n.value), upperBound)) @@ -59,19 +59,19 @@ func (n *node) convert(oldLowerBound, oldUpperBound, newLowerBound, newUpperBoun } ghost -requires t.tree() +requires acc(t.tree(), _) ensures forall i int :: (0 <= i && i + 1 < len(res) ==> res[i] < res[i + 1]) // ordered pure func (t *Tree) sortedValues() (res seq[int]) { - return unfolding t.tree() in (t.root == nil) ? seq[int] { } : t.root.sortedValues(none[int], none[int]) + return unfolding acc(t.tree(), _) in (t.root == nil) ? seq[int] { } : t.root.sortedValues(none[int], none[int]) } ghost -requires n.tree() && n.sorted(lowerBound, upperBound) +requires acc(n.tree(), _) && n.sorted(lowerBound, upperBound) ensures n.sorted(lowerBound, upperBound) ensures forall i int :: (0 <= i && i < len(res) ==> ((lowerBound != none[int] ==> res[i] > get(lowerBound)) && (upperBound != none[int] ==> res[i] < get(upperBound)))) ensures forall i int :: (0 <= i && i + 1 < len(res) ==> res[i] < res[i + 1]) // ordered pure func (n *node) sortedValues(lowerBound, upperBound option[int]) (res seq[int]) { - return unfolding n.tree() in (n.left == nil ? seq[int]{ } : n.left.sortedValues(lowerBound, some(n.value))) ++ seq[int]{ n.value } ++ (n.right == nil ? seq[int]{ } : n.right.sortedValues(some(n.value), upperBound)) + return unfolding acc(n.tree(), _) in (n.left == nil ? seq[int]{ } : n.left.sortedValues(lowerBound, some(n.value))) ++ seq[int]{ n.value } ++ (n.right == nil ? seq[int]{ } : n.right.sortedValues(some(n.value), upperBound)) } ensures t.tree() && t.IsEmpty() @@ -81,16 +81,16 @@ func NewTree() (t *Tree) { return t } -requires t.tree() -ensures res == unfolding t.tree() in t.root == nil +requires acc(t.tree(), _) +ensures res == unfolding acc(t.tree(), _) in t.root == nil pure func (t *Tree) IsEmpty() (res bool) { - return unfolding t.tree() in t.root == nil + return unfolding acc(t.tree(), _) in t.root == nil } requires dividend > 0 requires acc(t.tree(), 1/dividend) ensures acc(t.tree(), 1/dividend) -ensures res == t.pureContains(value, dividend) +ensures res == t.pureContains(value) func (t *Tree) Contains(value, dividend int) (res bool) { unfold acc(t.tree(), 1/dividend) if (t.root == nil) { @@ -103,9 +103,9 @@ func (t *Tree) Contains(value, dividend int) (res bool) { } ghost -requires dividend > 0 && acc(t.tree(), 1/dividend) -pure func (t *Tree) pureContains(value, dividend int) bool { - return unfolding acc(t.tree(), 1/dividend) in t.root != nil && value in t.root.sortedValues(none[int], none[int]) +requires acc(t.tree(), _) +pure func (t *Tree) pureContains(value int) bool { + return unfolding acc(t.tree(), _) in t.root != nil && value in t.root.sortedValues(none[int], none[int]) } requires dividend > 0 @@ -300,11 +300,11 @@ func main() { ensures t.tree() func client0(value int) (t *Tree) { t = NewTree() - assert !t.pureContains(value, 2) + assert !t.pureContains(value) t.Insert(value) assert t.sortedValues() == seq[int]{ value } t.Delete(value) - assert !t.pureContains(value, 2) + assert !t.pureContains(value) return t } @@ -324,7 +324,7 @@ func client2(t *Tree, value int) { // insert a new value t.Insert(value) var newValues = t.sortedValues() - assert t.pureContains(value, 2) + assert t.pureContains(value) ghost if (value in oldValues) { assert oldValues == newValues } else { diff --git a/src/test/resources/regressions/examples/evaluation/spec_errors/binary_search_tree.gobra b/src/test/resources/regressions/examples/evaluation/spec_errors/binary_search_tree.gobra index 56215d656..69b64eba7 100644 --- a/src/test/resources/regressions/examples/evaluation/spec_errors/binary_search_tree.gobra +++ b/src/test/resources/regressions/examples/evaluation/spec_errors/binary_search_tree.gobra @@ -29,9 +29,9 @@ pred (n *node) tree() { } ghost -requires n.tree() +requires acc(n.tree(), _) pure func (n *node) sorted(lowerBound, upperBound option[int]) bool { - return unfolding n.tree() in (lowerBound != none[int] ==> get(lowerBound) < n.value) && + return unfolding acc(n.tree(), _) in (lowerBound != none[int] ==> get(lowerBound) < n.value) && (upperBound != none[int] ==> n.value < get(upperBound)) && (n.left != nil ==> n.left.sorted(lowerBound, some(n.value))) && (n.right != nil ==> n.right.sorted(some(n.value), upperBound)) @@ -59,19 +59,19 @@ func (n *node) convert(oldLowerBound, oldUpperBound, newLowerBound, newUpperBoun } ghost -requires t.tree() +requires acc(t.tree(), _) ensures forall i int :: (0 <= i && i + 1 < len(res) ==> res[i] < res[i + 1]) // ordered pure func (t *Tree) sortedValues() (res seq[int]) { - return unfolding t.tree() in (t.root == nil) ? seq[int] { } : t.root.sortedValues(none[int], none[int]) + return unfolding acc(t.tree(), _) in (t.root == nil) ? seq[int] { } : t.root.sortedValues(none[int], none[int]) } ghost -requires n.tree() && n.sorted(lowerBound, upperBound) +requires acc(n.tree(), _) && n.sorted(lowerBound, upperBound) ensures n.sorted(lowerBound, upperBound) ensures forall i int :: (0 <= i && i < len(res) ==> ((lowerBound != none[int] ==> res[i] > get(lowerBound)) && (upperBound != none[int] ==> res[i] < get(upperBound)))) ensures forall i int :: (0 <= i && i + 1 < len(res) ==> res[i] < res[i + 1]) // ordered pure func (n *node) sortedValues(lowerBound, upperBound option[int]) (res seq[int]) { - return unfolding n.tree() in (n.left == nil ? seq[int]{ } : n.left.sortedValues(lowerBound, some(n.value))) ++ seq[int]{ n.value } ++ (n.right == nil ? seq[int]{ } : n.right.sortedValues(some(n.value), upperBound)) + return unfolding acc(n.tree(), _) in (n.left == nil ? seq[int]{ } : n.left.sortedValues(lowerBound, some(n.value))) ++ seq[int]{ n.value } ++ (n.right == nil ? seq[int]{ } : n.right.sortedValues(some(n.value), upperBound)) } ensures t.tree() && t.IsEmpty() @@ -81,16 +81,16 @@ func NewTree() (t *Tree) { return t } -requires t.tree() -ensures res == unfolding t.tree() in t.root == nil +requires acc(t.tree(), _) +ensures res == unfolding acc(t.tree(), _) in t.root == nil pure func (t *Tree) IsEmpty() (res bool) { - return unfolding t.tree() in t.root == nil + return unfolding acc(t.tree(), _) in t.root == nil } requires dividend > 0 requires acc(t.tree(), 1/dividend) ensures acc(t.tree(), 1/dividend) -ensures res == t.pureContains(value, dividend) +ensures res == t.pureContains(value) func (t *Tree) Contains(value, dividend int) (res bool) { unfold acc(t.tree(), 1/dividend) if (t.root == nil) { @@ -103,9 +103,9 @@ func (t *Tree) Contains(value, dividend int) (res bool) { } ghost -requires dividend > 0 && acc(t.tree(), 1/dividend) -pure func (t *Tree) pureContains(value, dividend int) bool { - return unfolding acc(t.tree(), 1/dividend) in t.root != nil && value in t.root.sortedValues(none[int], none[int]) +requires acc(t.tree(), _) +pure func (t *Tree) pureContains(value int) bool { + return unfolding acc(t.tree(), _) in t.root != nil && value in t.root.sortedValues(none[int], none[int]) } requires dividend > 0 @@ -300,12 +300,12 @@ func main() { ensures t.tree() func client0(value int) (t *Tree) { t = NewTree() - assert !t.pureContains(value, 2) + assert !t.pureContains(value) t.Insert(value) //:: ExpectedOutput(assert_error:assertion_error) assert t.sortedValues() == seq[int]{ value } t.Delete(value) - assert !t.pureContains(value, 2) + assert !t.pureContains(value) return t } @@ -326,7 +326,7 @@ func client2(t *Tree, value int) { t.Insert(value) var newValues = t.sortedValues() //:: ExpectedOutput(assert_error:assertion_error) - assert t.pureContains(value, 2) + assert t.pureContains(value) ghost if (value in oldValues) { assert oldValues == newValues } else { diff --git a/src/test/resources/regressions/examples/tutorial-examples/predicate.gobra b/src/test/resources/regressions/examples/tutorial-examples/predicate.gobra index f474d9392..dabd3b5ae 100644 --- a/src/test/resources/regressions/examples/tutorial-examples/predicate.gobra +++ b/src/test/resources/regressions/examples/tutorial-examples/predicate.gobra @@ -36,10 +36,10 @@ pure func head(ptr *node) int { requires p > 0 requires acc(list(ptr), p) pure func (ptr *node) contains(value int, ghost p perm) bool { - return unfolding list(ptr) in ptr.value == value || (ptr.next != nil && ptr.next.contains(value, p)) + return unfolding acc(list(ptr), p) in ptr.value == value || (ptr.next != nil && ptr.next.contains(value, p)) } requires acc(list(ptr), _) pure func (ptr *node) contains2(value int) bool { - return unfolding list(ptr) in ptr.value == value || (ptr.next != nil && ptr.next.contains2(value)) + return unfolding acc(list(ptr), _) in ptr.value == value || (ptr.next != nil && ptr.next.contains2(value)) } \ No newline at end of file diff --git a/src/test/resources/regressions/issues/000416.gobra b/src/test/resources/regressions/issues/000416.gobra index 38af7b8b2..0926f5b8f 100644 --- a/src/test/resources/regressions/issues/000416.gobra +++ b/src/test/resources/regressions/issues/000416.gobra @@ -14,7 +14,8 @@ func main () { Area(&r) } -requires s != nil && s.mem() && s.Size() +requires s != nil && s.mem() +ensures s != nil && s.mem() func Area(s shape.Shape) (ret int) { return s.Area() } \ No newline at end of file diff --git a/src/test/resources/regressions/issues/000416/importedImplementationPkg/importedImplementationPkg.gobra b/src/test/resources/regressions/issues/000416/importedImplementationPkg/importedImplementationPkg.gobra index 8de3c38d1..ea795dfba 100644 --- a/src/test/resources/regressions/issues/000416/importedImplementationPkg/importedImplementationPkg.gobra +++ b/src/test/resources/regressions/issues/000416/importedImplementationPkg/importedImplementationPkg.gobra @@ -15,13 +15,13 @@ pred (r *Rect) mem() { acc(r, 1/2) } -requires acc(r, 1/2) +requires acc(r, _) pure func (r *Rect) Size() bool { - return r.width > 0 && r.height > 0 + return r.width >= 0 && r.height >= 0 } -requires acc(r, 1/2) && r.Size() -ensures acc(r, 1/2) && ret > 0 +requires acc(r, 1/2) +ensures acc(r, 1/2) func (r *Rect) Area() (ret int) { return r.width * r.height } diff --git a/src/test/resources/regressions/issues/000416/importedImplementationPkg/shape/shape.gobra b/src/test/resources/regressions/issues/000416/importedImplementationPkg/shape/shape.gobra index 02613017c..6a57d0a3c 100644 --- a/src/test/resources/regressions/issues/000416/importedImplementationPkg/shape/shape.gobra +++ b/src/test/resources/regressions/issues/000416/importedImplementationPkg/shape/shape.gobra @@ -9,7 +9,7 @@ type Shape interface { requires acc(mem(), 1/2) pure Size() bool - requires mem() && Size() - ensures ret > 0 + requires mem() + ensures mem() Area() (ret int) } \ No newline at end of file diff --git a/viperserver b/viperserver index d5d38d628..d28e3b1d8 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit d5d38d62825e8bf4448c55f589dd8c838f33dc96 +Subproject commit d28e3b1d829bee0517aff3ad380139e8fc608dc9 From 61564b078b18c6c9f781d63aa5e2df1b7f10a808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Fri, 10 Mar 2023 19:40:29 +0100 Subject: [PATCH 111/296] Add support for more complete exhale on demand (#636) --- .../viper/gobra/backend/ViperBackends.scala | 16 ++++-- .../scala/viper/gobra/frontend/Config.scala | 55 +++++++++++++------ 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index 5726c97d2..ed4ca4f49 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -6,7 +6,7 @@ package viper.gobra.backend -import viper.gobra.frontend.Config +import viper.gobra.frontend.{Config, MCE} import viper.gobra.util.GobraExecutionContext import viper.server.ViperConfig import viper.server.core.ViperCoreServer @@ -27,9 +27,12 @@ object ViperBackends { if (config.conditionalizePermissions) { options ++= Vector("--conditionalizePermissions") } - if (!config.disableMoreCompleteExhale) { - options ++= Vector("--enableMoreCompleteExhale") + val mceSiliconOpt = config.mceMode match { + case MCE.Disabled => "0" + case MCE.Enabled => "1" + case MCE.OnDemand => "2" } + options ++= Vector(s"--exhaleMode=$mceSiliconOpt") if (config.assumeInjectivityOnInhale) { options ++= Vector("--assumeInjectivityOnInhale") } @@ -100,9 +103,12 @@ object ViperBackends { var options: Vector[String] = Vector.empty options ++= Vector("--logLevel", "ERROR") options ++= Vector("--disableCatchingExceptions") - if (!config.disableMoreCompleteExhale) { - options ++= Vector("--enableMoreCompleteExhale") + val mceSiliconOpt = config.mceMode match { + case MCE.Disabled => "0" + case MCE.Enabled => "1" + case MCE.OnDemand => "2" } + options ++= Vector(s"--exhaleMode=$mceSiliconOpt") if (config.assumeInjectivityOnInhale) { options ++= Vector("--assumeInjectivityOnInhale") } diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 51da14019..b4fd00db0 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -64,12 +64,22 @@ object ConfigDefaults { lazy val DefaultAssumeInjectivityOnInhale: Boolean = true lazy val DefaultParallelizeBranches: Boolean = false lazy val DefaultConditionalizePermissions: Boolean = false - lazy val DefaultDisableMoreCompleteExhale: Boolean = false + lazy val DefaultMCEMode: MCE.Mode = MCE.Enabled lazy val DefaultEnableLazyImports: Boolean = false lazy val DefaultNoVerify: Boolean = false lazy val DefaultNoStreamErrors: Boolean = false } +// More-complete exhale modes +object MCE { + sealed trait Mode + object Disabled extends Mode + // When running in `OnDemand`, mce will only be enabled when silicon retries a query. + // More information can be found in https://github.com/viperproject/silicon/pull/682. + object OnDemand extends Mode + object Enabled extends Mode +} + case class Config( gobraDirectory: Path = ConfigDefaults.DefaultGobraDirectory, // Used as an identifier of a verification task, ideally it shouldn't change between verifications @@ -115,10 +125,10 @@ case class Config( // branches will be verified in parallel parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, conditionalizePermissions: Boolean = ConfigDefaults.DefaultConditionalizePermissions, - disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, + mceMode: MCE.Mode = ConfigDefaults.DefaultMCEMode, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, - noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors + noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, ) { def merge(other: Config): Config = { @@ -160,7 +170,7 @@ case class Config( assumeInjectivityOnInhale = assumeInjectivityOnInhale || other.assumeInjectivityOnInhale, parallelizeBranches = parallelizeBranches, conditionalizePermissions = conditionalizePermissions, - disableMoreCompleteExhale = disableMoreCompleteExhale, + mceMode = mceMode, enableLazyImports = enableLazyImports || other.enableLazyImports, noVerify = noVerify || other.noVerify, noStreamErrors = noStreamErrors || other.noStreamErrors @@ -210,7 +220,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector assumeInjectivityOnInhale: Boolean = ConfigDefaults.DefaultAssumeInjectivityOnInhale, parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, conditionalizePermissions: Boolean = ConfigDefaults.DefaultConditionalizePermissions, - disableMoreCompleteExhale: Boolean = ConfigDefaults.DefaultDisableMoreCompleteExhale, + mceMode: MCE.Mode = ConfigDefaults.DefaultMCEMode, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, @@ -264,7 +274,7 @@ trait RawConfig { assumeInjectivityOnInhale = baseConfig.assumeInjectivityOnInhale, parallelizeBranches = baseConfig.parallelizeBranches, conditionalizePermissions = baseConfig.conditionalizePermissions, - disableMoreCompleteExhale = baseConfig.disableMoreCompleteExhale, + mceMode = baseConfig.mceMode, enableLazyImports = baseConfig.enableLazyImports, noVerify = baseConfig.noVerify, noStreamErrors = baseConfig.noStreamErrors, @@ -611,12 +621,23 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals short = 'c', ) - val disableMoreCompleteExhale: ScallopOption[Boolean] = opt[Boolean]( - name = "disableMoreCompleteExhale", - descr = "Disables the flag --enableMoreCompleteExhale passed by default to Silicon", - default = Some(ConfigDefaults.DefaultDisableMoreCompleteExhale), - noshort = true, - ) + val mceMode: ScallopOption[MCE.Mode] = { + val on = "on" + val off = "off" + val od = "od" + choice( + choices = Seq("on", "off", "od"), + name = "mceMode", + descr = s"Specifies if silicon should be run with more complete exhale enabled ($on), disabled ($off), or enabled on demand ($od).", + default = Some(on), + noshort = true + ).map{ + case `on` => MCE.Enabled + case `off` => MCE.Disabled + case `od` => MCE.OnDemand + case s => Violation.violation(s"Unexpected mode for more complete exhale: $s") + } + } val enableLazyImports: ScallopOption[Boolean] = opt[Boolean]( name = Config.enableLazyImportOptionName, @@ -685,11 +706,11 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals } } - // `disableMoreCompleteExhale` can only be enabled when using a silicon-based backend + // `mceMode` can only be provided when using a silicon-based backend addValidation { - val disableMoreCompleteExh = disableMoreCompleteExhale.toOption.contains(true) - if (disableMoreCompleteExh && !isSiliconBasedBackend) { - Left("The flag --disableMoreCompleteExhale can only be used with Silicon and ViperServer with Silicon") + val mceModeSupplied = mceMode.isSupplied + if (mceModeSupplied && !isSiliconBasedBackend) { + Left("The flag --mceMode can only be used with Silicon or ViperServer with Silicon") } else { Right(()) } @@ -781,7 +802,7 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals assumeInjectivityOnInhale = assumeInjectivityOnInhale(), parallelizeBranches = parallelizeBranches(), conditionalizePermissions = conditionalizePermissions(), - disableMoreCompleteExhale = disableMoreCompleteExhale(), + mceMode = mceMode(), enableLazyImports = enableLazyImports(), noVerify = noVerify(), noStreamErrors = noStreamErrors(), From be449b93277779803d7a8fb80627be4e6a6bcb21 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Mon, 13 Mar 2023 11:53:03 +0100 Subject: [PATCH 112/296] Updates submodules (#638) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index d28e3b1d8..fd8306be4 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit d28e3b1d829bee0517aff3ad380139e8fc608dc9 +Subproject commit fd8306be4f8451f212cb5574308aefad14cec432 From 53453f046da217a20fac34399c8300f28ab89794 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 13 Mar 2023 14:21:29 +0100 Subject: [PATCH 113/296] restricts unit tests to 'regressions/features/header_only' --- src/test/scala/viper/gobra/GobraTests.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index a719e5a26..8f6d88980 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -24,7 +24,7 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { val regressionsPropertyName = "GOBRATESTS_REGRESSIONS_DIR" - val regressionsDir: String = System.getProperty(regressionsPropertyName, "regressions") + val regressionsDir: String = System.getProperty(regressionsPropertyName, "regressions/features/header_only") val testDirectories: Seq[String] = Vector(regressionsDir) override val defaultTestPattern: String = PackageResolver.inputFilePattern From 4ac48c75c8079e158c904c8b320a0a73cc84212c Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Mon, 13 Mar 2023 15:48:09 +0100 Subject: [PATCH 114/296] Updates submodules (#639) --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index fd8306be4..8e65e7c8a 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit fd8306be4f8451f212cb5574308aefad14cec432 +Subproject commit 8e65e7c8a7bfe711cae6b8a2fbd8fbd3600b5f73 From 1d7f0cdfa4a58ced982db433aa80c947b8b85aba Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Mon, 13 Mar 2023 23:18:22 +0100 Subject: [PATCH 115/296] Updates submodules (#640) --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 8e65e7c8a..6d3bec4e9 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 8e65e7c8a7bfe711cae6b8a2fbd8fbd3600b5f73 +Subproject commit 6d3bec4e9a6f056d955f0889a3f558898211fbd9 From 9edc26ece388cd170e727638514bd502685bacdb Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 14 Mar 2023 08:54:47 +0100 Subject: [PATCH 116/296] propagates parsing exceptions, built-in files are always considered even with enabled --- .../viper/gobra/frontend/PackageResolver.scala | 15 ++++++++++++--- .../scala/viper/gobra/frontend/TaskManager.scala | 11 +++++++++-- src/test/scala/viper/gobra/GobraTests.scala | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/PackageResolver.scala b/src/main/scala/viper/gobra/frontend/PackageResolver.scala index 58e43da5d..c766fcd41 100644 --- a/src/main/scala/viper/gobra/frontend/PackageResolver.scala +++ b/src/main/scala/viper/gobra/frontend/PackageResolver.scala @@ -249,7 +249,8 @@ object PackageResolver { lazy val shouldBeConsidered = !shouldIgnoreResource(resource) // note that the following condition has to be lazily evaluated to avoid reading the file's content and applying // a regex. The first part in particular can fail when the file does not contain text! - lazy val headerIsMissing = onlyFilesWithHeader && !isResourceWithHeader(resource) + // Note that that we do not enforce the header for builtin resources (even if onlyFilesWithHeader is set to true) + lazy val headerIsMissing = onlyFilesWithHeader && !resource.builtin && !isResourceWithHeader(resource) if (validExtension && shouldBeConsidered && !headerIsMissing) Vector(resource) else Vector() } else { Vector() @@ -268,8 +269,14 @@ object PackageResolver { * Returns right with the package name used in the package clause if they do, otherwise returns left with an error message */ private def checkPackageClauses(files: Vector[InputResource], importTarget: AbstractImport): Either[String, String] = { + def isEmpty(files: Vector[InputResource]): Either[String, Vector[InputResource]] = { + if (files.isEmpty) Left(s"No files belonging to package $importTarget found") + else Right(files) + } + // importPath is only used to create an error message that is similar to the error message of the official Go compiler def getPackageClauses(files: Vector[InputResource]): Either[String, Vector[(InputResource, String)]] = { + require(files.nonEmpty) val pkgClauses = files.map(f => { getPackageClause(f.asSource()) match { case Some(pkgClause) => Right(f -> pkgClause) @@ -282,6 +289,7 @@ object PackageResolver { } def isEqual(pkgClauses: Vector[(InputResource, String)]): Either[String, String] = { + require(pkgClauses.nonEmpty) val differingClauses = pkgClauses.filter(_._2 != pkgClauses.head._2) if (differingClauses.isEmpty) Right(pkgClauses.head._2) else { @@ -291,7 +299,8 @@ object PackageResolver { } for { - pkgClauses <- getPackageClauses(files) + nonEmptyFiles <- isEmpty(files) + pkgClauses <- getPackageClauses(nonEmptyFiles) pkgName <- isEqual(pkgClauses) } yield pkgName } @@ -349,7 +358,7 @@ object PackageResolver { override def listContent(): Vector[FileResource] = { Files.newDirectoryStream(path).asScala.toVector - .map(p => FileResource(p)) + .map(p => FileResource(p, builtin)) } override def asSource(): FromFileSource = FromFileSource(path, builtin) diff --git a/src/main/scala/viper/gobra/frontend/TaskManager.scala b/src/main/scala/viper/gobra/frontend/TaskManager.scala index ec258a513..b7aa0f271 100644 --- a/src/main/scala/viper/gobra/frontend/TaskManager.scala +++ b/src/main/scala/viper/gobra/frontend/TaskManager.scala @@ -36,8 +36,15 @@ trait Job[R] { } Violation.violation(!compututationStarted, s"Job $this is already on-going") compututationStarted = true - val res = compute() - promise.success(res) + val res = try { + val res = compute() + promise.success(res) + res + } catch { + case e: Exception => + promise.failure(e) + throw e + } res } // } diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index 8f6d88980..710c116af 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -48,7 +48,7 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { override def run(input: AnnotatedTestInput): Seq[AbstractOutput] = { - val source = FromFileSource(input.file); + val source = FromFileSource(input.file) val config = Config( logLevel = Level.INFO, reporter = NoopReporter, From 66f542d33377c3b39e308685bbae8f5d0e89c357 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 14 Mar 2023 08:56:09 +0100 Subject: [PATCH 117/296] Revert "restricts unit tests to 'regressions/features/header_only'" This reverts commit 53453f046da217a20fac34399c8300f28ab89794. --- src/test/scala/viper/gobra/GobraTests.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index 710c116af..efa898916 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -24,7 +24,7 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { val regressionsPropertyName = "GOBRATESTS_REGRESSIONS_DIR" - val regressionsDir: String = System.getProperty(regressionsPropertyName, "regressions/features/header_only") + val regressionsDir: String = System.getProperty(regressionsPropertyName, "regressions") val testDirectories: Seq[String] = Vector(regressionsDir) override val defaultTestPattern: String = PackageResolver.inputFilePattern From 3ed1598d9fcec2e4ac303e56f49d62b7b261336c Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 14 Mar 2023 17:36:43 +0100 Subject: [PATCH 118/296] fixes unit tests --- .../gobra/frontend/PackageResolver.scala | 6 +-- .../scala/viper/gobra/frontend/Parser.scala | 49 ++++++++++++------- .../viper/gobra/frontend/info/Info.scala | 2 +- .../viper/gobra/reporting/VerifierError.scala | 3 +- .../import/cyclic_import/bar/bar.gobra | 2 +- .../import/cyclic_import/foo/foo.gobra | 2 +- .../regressions/features/import/import1.gobra | 11 ++++- .../regressions/features/import/import2.gobra | 2 +- .../regressions/features/import/import4.gobra | 20 -------- .../features/stubs/stubs-fail0.gobra | 2 +- 10 files changed, 48 insertions(+), 51 deletions(-) delete mode 100644 src/test/resources/regressions/features/import/import4.gobra diff --git a/src/main/scala/viper/gobra/frontend/PackageResolver.scala b/src/main/scala/viper/gobra/frontend/PackageResolver.scala index c766fcd41..962dd3718 100644 --- a/src/main/scala/viper/gobra/frontend/PackageResolver.scala +++ b/src/main/scala/viper/gobra/frontend/PackageResolver.scala @@ -42,7 +42,7 @@ object PackageResolver { sealed trait AbstractPackage /** represents an error */ - case object NoPackage extends AbstractPackage + case class NoPackage(importTarget: RegularImport) extends AbstractPackage /** represents all built-in packages together */ case object BuiltInPackage extends AbstractPackage /** represents a regular package */ @@ -54,11 +54,11 @@ object PackageResolver { case BuiltInImport => BuiltInPackage case imp: RegularImport => getLookupPath(imp)(config) match { - case Left(_) => NoPackage + case Left(_) => NoPackage(imp) case Right(inputResource) => try { RegularPackage(Source.uniquePath(inputResource.path, config.projectRoot).toString) - } catch { case _: Throwable => NoPackage } + } catch { case _: Throwable => NoPackage(imp) } } } } diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 5c0aa220b..97447e363 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -60,19 +60,19 @@ object Parser { // before parsing, get imports and add these parse jobs val imports = fastParse(preprocessedSources) val preambleParsingDurationMs = System.currentTimeMillis() - startPreambleParsingMs - val futs = imports.map(directImportTarget => { + val futs = imports.map{ case (directImportTarget, optSourcePos) => { val directImportPackage = AbstractPackage(directImportTarget)(config) val importedSources = PackageResolver.resolveSources(directImportTarget)(config) .getOrElse(Vector()) .map(_.source) if (importedSources.isEmpty) { - manager.addIfAbsent(directImportPackage, ParseFailureJob(Vector(NotFoundError(s"No source files for package '$directImportTarget found"))))(executionContext) + manager.addIfAbsent(directImportPackage, ParseFailureJob(Vector(NotFoundError(s"No source files for package '$directImportTarget' found", optSourcePos))))(executionContext) manager.getFuture(directImportPackage) // we do not flatten here as we only need to await the job's creation } else { manager.addIfAbsent(directImportPackage, ParseSourcesJob(importedSources, directImportPackage))(executionContext) manager.getFuture(directImportPackage) // we do not flatten here as we only need to await the job's creation } - }) + }} val startMs = System.currentTimeMillis() val res = for { @@ -91,16 +91,27 @@ object Parser { .map(_ => res) } - private def fastParse(preprocessedInput: Vector[Source]): Set[AbstractImport] = { - def getImportPaths(preprocessedSource: Source): Set[AbstractImport] = { + private def fastParse(preprocessedInput: Vector[Source]): Set[(AbstractImport, Option[SourcePosition])] = { + def getImportPaths(preprocessedSource: Source): Set[(RegularImport, Option[SourcePosition])] = { processPreamble(preprocessedSource)(config) - .map(_.imports.toSet.map[AbstractImport](importNode => RegularImport(importNode.importPath))) - // we do not handle parser errors here but defer this to the time point when we actually - // parse this source + .map(preambleManager => { + preambleManager.preamble.imports + .map(importNode => { + val nodeStart = preambleManager.pom.positions.getStart(importNode) + val nodeFinish = preambleManager.pom.positions.getFinish(importNode) + val nodePos = (nodeStart, nodeFinish) match { + case (Some(start), Some(finish)) => Some(preambleManager.pom.translate(start, finish)) + case _ => None + } + (RegularImport(importNode.importPath), nodePos) + }) + .toSet + }) .getOrElse(Set.empty) } - preprocessedInput.flatMap(getImportPaths).toSet + BuiltInImport + val builtInImportTuple = (BuiltInImport, None) + preprocessedInput.flatMap(getImportPaths).toSet + builtInImportTuple } } @@ -167,29 +178,29 @@ object Parser { sources } + case class PreambleManager(preamble: PPreamble, pom: PositionManager) /** * Parses a source's preamble containing all (file-level) imports; This function expects that the input has already * been preprocessed */ - private def processPreamble(preprocessedSource: Source)(config: Config): Either[Vector[ParserError], PPreamble] = { - val positions = new Positions - val pom = new PositionManager(positions) - - def parseSource(preprocessedSource: Source): Either[Vector[ParserError], PPreamble] = { + private def processPreamble(preprocessedSource: Source)(config: Config): Either[Vector[ParserError], PreambleManager] = { + def parseSource(preprocessedSource: Source): Either[Vector[ParserError], PreambleManager] = { + val positions = new Positions + val pom = new PositionManager(positions) val parser = new SyntaxAnalyzer[PreambleContext, PPreamble](preprocessedSource, ListBuffer.empty[ParserError], pom, specOnly = true) - parser.parse(parser.preamble) + parser.parse(parser.preamble).map(preamble => PreambleManager(preamble, pom)) } var cacheHit: Boolean = true - def parseSourceCached(preprocessedSource: Source): Either[Vector[ParserError], PPreamble] = { - def parseAndStore(): Either[Vector[ParserError], PPreamble] = { + def parseSourceCached(preprocessedSource: Source): Either[Vector[ParserError], PreambleManager] = { + def parseAndStore(): Either[Vector[ParserError], PreambleManager] = { cacheHit = false parseSource(preprocessedSource) } val res = preambleCache.computeIfAbsent(getCacheKey(preprocessedSource, specOnly = true), _ => parseAndStore()) if (!cacheHit) { - println(s"No cache hit for ${res.map(_.packageClause.id.name)}'s preamble") + println(s"No cache hit for ${res.map(_.preamble.packageClause.id.name)}'s preamble") } res } @@ -213,7 +224,7 @@ object Parser { type SourceCacheKey = String // cache maps a key (obtained by hashing file path and file content) to the parse result - private val preambleCache: ConcurrentMap[SourceCacheKey, Either[Vector[ParserError], PPreamble]] = new ConcurrentHashMap() + private val preambleCache: ConcurrentMap[SourceCacheKey, Either[Vector[ParserError], PreambleManager]] = new ConcurrentHashMap() type PackageCacheKey = String private val packageCache: ConcurrentMap[PackageCacheKey, Either[Vector[VerifierError], PPackage]] = new ConcurrentHashMap() diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 8dff14b00..5a68b034e 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -300,7 +300,7 @@ object Info extends LazyLogging { val checkFn = if (config.cacheParser) { getTypeInfoCached _ } else { getTypeInfo _ } val info = checkFn(pkg, dependentTypeInfo, isMainContext, config) - if (!cacheHit) { + if (!cacheHit && config.cacheParser) { println(s"No cache hit for type info for ${pkg.info.id}") } diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala index 858c2f2ae..3798941c1 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierError.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala @@ -28,8 +28,7 @@ sealed trait VerifierError { var cached: Boolean = false } -case class NotFoundError(message: String) extends VerifierError { - val position: Option[SourcePosition] = None +case class NotFoundError(message: String, position: Option[SourcePosition]) extends VerifierError { val id = "not_found_error" } diff --git a/src/test/resources/regressions/features/import/cyclic_import/bar/bar.gobra b/src/test/resources/regressions/features/import/cyclic_import/bar/bar.gobra index 443776192..4c2bacd2d 100644 --- a/src/test/resources/regressions/features/import/cyclic_import/bar/bar.gobra +++ b/src/test/resources/regressions/features/import/cyclic_import/bar/bar.gobra @@ -3,7 +3,7 @@ package bar -// ##(-I src/test/resources/regressions/features/import/cyclic_import) +// ##(-I ../) //:: ExpectedOutput(type_error) import f "foo" // this is a cyclic import diff --git a/src/test/resources/regressions/features/import/cyclic_import/foo/foo.gobra b/src/test/resources/regressions/features/import/cyclic_import/foo/foo.gobra index 8d4600ecc..d6708a3d0 100644 --- a/src/test/resources/regressions/features/import/cyclic_import/foo/foo.gobra +++ b/src/test/resources/regressions/features/import/cyclic_import/foo/foo.gobra @@ -3,7 +3,7 @@ package foo -// ##(-I src/test/resources/regressions/features/import/cyclic_import) +// ##(-I ../) //:: ExpectedOutput(type_error) import b "bar" // this is a cyclic import diff --git a/src/test/resources/regressions/features/import/import1.gobra b/src/test/resources/regressions/features/import/import1.gobra index 31810b7ec..7e8ebbc08 100644 --- a/src/test/resources/regressions/features/import/import1.gobra +++ b/src/test/resources/regressions/features/import/import1.gobra @@ -4,20 +4,27 @@ package main import fmt "fmt" +//:: ExpectedOutput(not_found_error) import a "a"; +//:: ExpectedOutput(not_found_error) import (b "b") +//:: ExpectedOutput(not_found_error) import (c "c"); import ( + //:: ExpectedOutput(not_found_error) d "d" + //:: ExpectedOutput(not_found_error) e "e") import ( + //:: ExpectedOutput(not_found_error) f "f" + //:: ExpectedOutput(not_found_error) g "g" ) -import math "lib/math" -//:: ExpectedOutput(type_error) +//:: ExpectedOutput(not_found_error) import m "lib/mathm" // wrong package name used on purpose such that this test case does not potentially depend on the configured Go path +//:: ExpectedOutput(not_found_error) import . "lib/mathn" func test() { diff --git a/src/test/resources/regressions/features/import/import2.gobra b/src/test/resources/regressions/features/import/import2.gobra index 5e99934f1..33bad9c88 100644 --- a/src/test/resources/regressions/features/import/import2.gobra +++ b/src/test/resources/regressions/features/import/import2.gobra @@ -3,7 +3,7 @@ package main -//:: ExpectedOutput(type_error) +//:: ExpectedOutput(not_found_error) import math "lib/mathm" // wrong package name used on purpose such that this test case does not potentially depend on the configured Go path type cell struct{ diff --git a/src/test/resources/regressions/features/import/import4.gobra b/src/test/resources/regressions/features/import/import4.gobra deleted file mode 100644 index afa6dcd58..000000000 --- a/src/test/resources/regressions/features/import/import4.gobra +++ /dev/null @@ -1,20 +0,0 @@ -// Any copyright is dedicated to the Public Domain. -// http://creativecommons.org/publicdomain/zero/1.0/ - -package main - -//:: ExpectedOutput(parser_error) -import "a" -//:: ExpectedOutput(parser_error) -import ("b") -//:: ExpectedOutput(parser_error) -import ("c"); -import ( - //:: ExpectedOutput(parser_error) - "d" - e "e") -import ( - f "f" - //:: ExpectedOutput(parser_error) - "g" -) diff --git a/src/test/resources/regressions/features/stubs/stubs-fail0.gobra b/src/test/resources/regressions/features/stubs/stubs-fail0.gobra index 02ea982d1..6ee25b286 100644 --- a/src/test/resources/regressions/features/stubs/stubs-fail0.gobra +++ b/src/test/resources/regressions/features/stubs/stubs-fail0.gobra @@ -4,6 +4,6 @@ package main import ( - //:: ExpectedOutput(parser_error) + //:: ExpectedOutput(not_found_error) "nopackagewhatsoever" ) \ No newline at end of file From ba5f161b41b9c0aa8caa89bd69ab7bcd8c5367c6 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 14 Mar 2023 17:59:26 +0100 Subject: [PATCH 119/296] cleans up --- .../scala/viper/gobra/ast/frontend/Ast.scala | 3 +- .../gobra/ast/frontend/PrettyPrinter.scala | 2 +- .../gobra/frontend/ParseTreeTranslator.scala | 2 +- .../scala/viper/gobra/frontend/Parser.scala | 41 +++++++------- .../viper/gobra/frontend/TaskManager.scala | 56 ++++--------------- .../resolution/MemberResolution.scala | 50 ----------------- .../viper/gobra/DetailedBenchmarkTests.scala | 1 - 7 files changed, 36 insertions(+), 119 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index e6819f68c..eb543ed16 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -67,7 +67,8 @@ case class PPreamble( // after this program is initialized initPosts: Vector[PExpression], imports: Vector[PImport], - ) extends PNode with PUnorderedScope // imports are in program scopes + positions: PositionManager, + ) extends PNode with PUnorderedScope class PositionManager(val positions: Positions) extends Messaging(positions) { diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index a3de74798..1a750fa88 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -69,7 +69,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter // preamble def showPreamble(p: PPreamble): Doc = p match { - case PPreamble(packageClause, progPosts, imports) => + case PPreamble(packageClause, progPosts, imports, _) => showPreamble(packageClause, progPosts, imports) } diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index b498a1db2..c63d3911d 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -2192,7 +2192,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole val packageClause: PPackageClause = visitNode(ctx.packageClause()) val initPosts: Vector[PExpression] = visitListNode[PExpression](ctx.initPost()) val importDecls = ctx.importDecl().asScala.toVector.flatMap(visitImportDecl) - PPreamble(packageClause, initPosts, importDecls).at(ctx) + PPreamble(packageClause, initPosts, importDecls, pom).at(ctx) } /** diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 97447e363..f83a56b86 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -7,8 +7,6 @@ package viper.gobra.frontend import com.typesafe.scalalogging.LazyLogging -import org.bitbucket.inkytonik.kiama.rewriting.Cloner.{rewrite, topdown} -import org.bitbucket.inkytonik.kiama.rewriting.PositionedRewriter.strategyWithName import org.bitbucket.inkytonik.kiama.rewriting.{Cloner, PositionedRewriter, Strategy} import org.bitbucket.inkytonik.kiama.util.{Positions, Source} import org.bitbucket.inkytonik.kiama.util.Messaging.{error, message} @@ -20,7 +18,6 @@ import org.antlr.v4.runtime.atn.PredictionMode import org.antlr.v4.runtime.misc.ParseCancellationException import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, PreambleContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, RegularImport, RegularPackage} -import viper.gobra.frontend.info.Info.{getCacheKey, typeInfoCache} import viper.gobra.util.GobraExecutionContext import viper.silver.ast.SourcePosition @@ -94,13 +91,14 @@ object Parser { private def fastParse(preprocessedInput: Vector[Source]): Set[(AbstractImport, Option[SourcePosition])] = { def getImportPaths(preprocessedSource: Source): Set[(RegularImport, Option[SourcePosition])] = { processPreamble(preprocessedSource)(config) - .map(preambleManager => { - preambleManager.preamble.imports + .map(preamble => { + val pom = preamble.positions + preamble.imports .map(importNode => { - val nodeStart = preambleManager.pom.positions.getStart(importNode) - val nodeFinish = preambleManager.pom.positions.getFinish(importNode) + val nodeStart = pom.positions.getStart(importNode) + val nodeFinish = pom.positions.getFinish(importNode) val nodePos = (nodeStart, nodeFinish) match { - case (Some(start), Some(finish)) => Some(preambleManager.pom.translate(start, finish)) + case (Some(start), Some(finish)) => Some(pom.translate(start, finish)) case _ => None } (RegularImport(importNode.importPath), nodePos) @@ -178,29 +176,28 @@ object Parser { sources } - case class PreambleManager(preamble: PPreamble, pom: PositionManager) /** * Parses a source's preamble containing all (file-level) imports; This function expects that the input has already * been preprocessed */ - private def processPreamble(preprocessedSource: Source)(config: Config): Either[Vector[ParserError], PreambleManager] = { - def parseSource(preprocessedSource: Source): Either[Vector[ParserError], PreambleManager] = { + private def processPreamble(preprocessedSource: Source)(config: Config): Either[Vector[ParserError], PPreamble] = { + def parseSource(preprocessedSource: Source): Either[Vector[ParserError], PPreamble] = { val positions = new Positions val pom = new PositionManager(positions) val parser = new SyntaxAnalyzer[PreambleContext, PPreamble](preprocessedSource, ListBuffer.empty[ParserError], pom, specOnly = true) - parser.parse(parser.preamble).map(preamble => PreambleManager(preamble, pom)) + parser.parse(parser.preamble) } var cacheHit: Boolean = true - def parseSourceCached(preprocessedSource: Source): Either[Vector[ParserError], PreambleManager] = { - def parseAndStore(): Either[Vector[ParserError], PreambleManager] = { + def parseSourceCached(preprocessedSource: Source): Either[Vector[ParserError], PPreamble] = { + def parseAndStore(): Either[Vector[ParserError], PPreamble] = { cacheHit = false parseSource(preprocessedSource) } - val res = preambleCache.computeIfAbsent(getCacheKey(preprocessedSource, specOnly = true), _ => parseAndStore()) + val res = preambleCache.computeIfAbsent(getPreambleCacheKey(preprocessedSource), _ => parseAndStore()) if (!cacheHit) { - println(s"No cache hit for ${res.map(_.preamble.packageClause.id.name)}'s preamble") + println(s"No cache hit for ${res.map(_.packageClause.id.name)}'s preamble") } res } @@ -224,18 +221,22 @@ object Parser { type SourceCacheKey = String // cache maps a key (obtained by hashing file path and file content) to the parse result - private val preambleCache: ConcurrentMap[SourceCacheKey, Either[Vector[ParserError], PreambleManager]] = new ConcurrentHashMap() + private val preambleCache: ConcurrentMap[SourceCacheKey, Either[Vector[ParserError], PPreamble]] = new ConcurrentHashMap() type PackageCacheKey = String + // we cache entire packages and not individual files (i.e. PProgram) as this saves us from copying over positional information + // from one to the other position manager. Also, this transformation of copying positional information results in + // differen PPackage instances that is problematic for caching type-check results. private val packageCache: ConcurrentMap[PackageCacheKey, Either[Vector[VerifierError], PPackage]] = new ConcurrentHashMap() - /** computes the key for caching a particular source. This takes the name, the specOnly flag, and the file's contents into account */ - private def getCacheKey(source: Source, specOnly: Boolean): SourceCacheKey = { - val key = source.name ++ (if (specOnly) "1" else "0") ++ source.content + /** computes the key for caching the preamble of a particular source. This takes the name and the source's content into account */ + private def getPreambleCacheKey(source: Source): SourceCacheKey = { + val key = source.name ++ source.content val bytes = MessageDigest.getInstance("MD5").digest(key.getBytes) // convert `bytes` to a hex string representation such that we get equality on the key while performing cache lookups bytes.map { "%02x".format(_) }.mkString } + /** computes the key for caching a package. This takes the name and the content of each source, the package info and the `specOnly` flag into account */ private def getPackageCacheKey(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean): PackageCacheKey = { val key = sources.map(source => source.name ++ source.content).mkString("") ++ pkgInfo.hashCode.toString ++ (if (specOnly) "1" else "0") val bytes = MessageDigest.getInstance("MD5").digest(key.getBytes) diff --git a/src/main/scala/viper/gobra/frontend/TaskManager.scala b/src/main/scala/viper/gobra/frontend/TaskManager.scala index b7aa0f271..83513472a 100644 --- a/src/main/scala/viper/gobra/frontend/TaskManager.scala +++ b/src/main/scala/viper/gobra/frontend/TaskManager.scala @@ -25,62 +25,28 @@ trait Job[R] { private val promise: Promise[R] = Promise() def getFuture: Future[R] = promise.future protected def compute(): R - // private val lock: Object = new AnyRef def call(): R = { - // lock.synchronized { - getFuture.value match { - case Some(Success(res)) => return res // return already computed type-checker result - case Some(Failure(exception)) => Violation.violation(s"Job resulted in exception: $exception") - case _ => - } - Violation.violation(!compututationStarted, s"Job $this is already on-going") - compututationStarted = true - val res = try { - val res = compute() - promise.success(res) - res - } catch { - case e: Exception => - promise.failure(e) - throw e - } - res - } - // } -} - -/* -trait Job[R] extends DependentJob[Nothing, R] { - val dependencies = Set.empty - protected def compute(): R - - override protected def compute(dependentResults: Map[Nothing, R]): R = compute() -} - -trait DependentJob[K, R] { - val dependencies: Set[K] - private val promise: Promise[R] = Promise() - private var compututationStarted = false - - def getFuture: Future[R] = promise.future - - protected def compute(dependentResults: Map[K, R]): R - - def call(dependentResults: Map[K, R]): R = { getFuture.value match { case Some(Success(res)) => return res // return already computed type-checker result case Some(Failure(exception)) => Violation.violation(s"Job resulted in exception: $exception") case _ => } - Violation.violation(!compututationStarted, s"Job is already on-going") + Violation.violation(!compututationStarted, s"Job $this is already on-going") compututationStarted = true - val res = compute(dependentResults) - promise.success(res) + val res = try { + val res = compute() + promise.success(res) + res + } catch { + case e: Exception => + promise.failure(e) + // propagate this exception for the case that `call` is executed synchronously: + throw e + } res } } - */ class TaskManager[K, R](mode: TaskManagerMode) { private val jobs: ConcurrentMap[K, Job[R]] = new ConcurrentHashMap() diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index 24587317e..614d2e055 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -402,46 +402,7 @@ trait MemberResolution { this: TypeInfoImpl => ) } - // TODO: move this method to another file def getTypeChecker(importTarget: AbstractImport, errNode: PNode): Either[Messages, ExternalTypeInfo] = { - /* - def parseAndTypeCheck(importTarget: AbstractImport): Either[Vector[VerifierError], ExternalTypeInfo] = { - val pkgSources = PackageResolver.resolveSources(importTarget)(config) - .getOrElse(Vector()) - .map(_.source) - val res = for { - nonEmptyPkgSources <- if (pkgSources.isEmpty) - Left(Vector(NotFoundError(s"No source files for package '$importTarget' found"))) - else Right(pkgSources) - parsedProgram <- Parser.parse(nonEmptyPkgSources, Source.getPackageInfo(nonEmptyPkgSources.head, config.projectRoot), specOnly = true)(config) - // TODO maybe don't check whole file but only members that are actually used/imported - // By parsing only declarations and their specification, there shouldn't be much left to type check anyways - // Info.check would probably need some restructuring to type check only certain members - info <- Info.check(parsedProgram, nonEmptyPkgSources, context)(config) - } yield info - res.fold( - errs => context.addErrenousPackage(importTarget, errs)(config), - info => context.addPackage(importTarget, info)(config) - ) - res - } - */ - /* - def createImportError(errs: Vector[VerifierError]): Messages = { - // create an error message located at the import statement to indicate errors in the imported package - // we distinguish between parse and type errors, cyclic imports, and packages whose source files could not be found - val notFoundErr = errs.collectFirst { case e: NotFoundError => e } - // alternativeErr is a function to compute the message only when needed - - val alternativeErr = () => context.getParserImportCycle(importTarget) match { - case Some(cycle) => - message(errNode, s"Package '$importTarget' is part of the following import cycle that involves the import ${cycle.importNodeCausingCycle}: ${cycle.cyclicPackages.mkString("[", ", ", "]")}") - case _ => message(errNode, s"Package '$importTarget' contains errors: $errs") - } - notFoundErr.map(e => message(errNode, e.message)) - .getOrElse(alternativeErr()) - } - */ def createImportError(errs: Vector[VerifierError]): Messages = { // create an error message located at the import statement to indicate errors in the imported package // we distinguish between regular errors and packages whose source files could not be found (not that cyclic @@ -453,17 +414,6 @@ trait MemberResolution { this: TypeInfoImpl => .getOrElse(alternativeErr()) } - // check if package was already parsed, otherwise do parsing and type checking: - /* - val cachedInfo = context.getTypeInfo(importTarget)(config) - if (cachedInfo.isEmpty) { - println(s"package $importTarget is not contained in context") - } - Violation.violation(cachedInfo.nonEmpty, s"package $importTarget is not contained in context") - cachedInfo.get.left.map(createImportError) - // cachedInfo.getOrElse(parseAndTypeCheck(importTarget)).left.map(createImportError) - */ - // context.getTypeInfo(importTarget)(config).left.map(createImportError) Violation.violation(dependentTypeInfo.contains(importTarget), s"Expected that package ${tree.root.info.id} has access to the type information of package $importTarget") dependentTypeInfo(importTarget)().left.map(createImportError) } diff --git a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala index c7e9ba31f..b5a6fe844 100644 --- a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala +++ b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala @@ -115,7 +115,6 @@ class DetailedBenchmarkTests extends BenchmarkTests { assert(c.packageInfoInputMap.size == 1) val pkgInfo = c.packageInfoInputMap.keys.head Info.check(c, RegularPackage(pkgInfo.id), parseResults)(executor) - // Info.check(parsedPackage, c.packageInfoInputMap(pkgInfo))(c).map(typeInfo => (parsedPackage, typeInfo)) }) private val desugaring: NextStep[TypeInfo, Program, Vector[VerifierError]] = From 169d0914282e52de162be7f801bc2b36c8c4f8d6 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 15 Mar 2023 19:46:48 +0100 Subject: [PATCH 120/296] fixes parser error messages --- .../scala/viper/gobra/frontend/Parser.scala | 152 ++++++++++++++---- .../viper/gobra/reporting/VerifierError.scala | 3 +- .../features/import/import-fail1.gobra | 10 ++ .../features/import/import-fail2.gobra | 12 ++ .../features/import/import-fail3.gobra | 12 ++ .../invalid_package_clause1.gobra | 4 + .../invalid_package_clause2.gobra | 4 + .../import/parse_error/parse_error.gobra | 8 + .../features/stubs/stubs-fail0.gobra | 9 +- .../features/stubs/stubs-fail1.gobra | 10 -- 10 files changed, 181 insertions(+), 43 deletions(-) create mode 100644 src/test/resources/regressions/features/import/import-fail1.gobra create mode 100644 src/test/resources/regressions/features/import/import-fail2.gobra create mode 100644 src/test/resources/regressions/features/import/import-fail3.gobra create mode 100644 src/test/resources/regressions/features/import/invalid_package_clause/invalid_package_clause1.gobra create mode 100644 src/test/resources/regressions/features/import/invalid_package_clause/invalid_package_clause2.gobra create mode 100644 src/test/resources/regressions/features/import/parse_error/parse_error.gobra delete mode 100644 src/test/resources/regressions/features/stubs/stubs-fail1.gobra diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index f83a56b86..e42c37afc 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -30,7 +30,7 @@ import scala.concurrent.{Await, Future} object Parser { type ParseSuccessResult = (Vector[Source], PPackage) - type ParseResult = Either[Vector[VerifierError], ParseSuccessResult] + type ParseResult = Either[Vector[ParserError], ParseSuccessResult] class ParseManager(config: Config, executionContext: GobraExecutionContext) extends LazyLogging { private val manager = new TaskManager[AbstractPackage, Future[ParseResult]](TaskManagerMode.Parallel) @@ -57,19 +57,50 @@ object Parser { // before parsing, get imports and add these parse jobs val imports = fastParse(preprocessedSources) val preambleParsingDurationMs = System.currentTimeMillis() - startPreambleParsingMs - val futs = imports.map{ case (directImportTarget, optSourcePos) => { + // val importResults: Set[Either[Vector[VerifierError], Future[ParseResult]]] = imports.map{ case (directImportTarget, importErrorFactory) => { + val importResults: Set[Future[ParseResult]] = imports.map { case (directImportTarget, importErrorFactory) => val directImportPackage = AbstractPackage(directImportTarget)(config) + val nonEmptyImportedSources = for { + resolveSourceResults <- PackageResolver.resolveSources(directImportTarget)(config) + importedSources = resolveSourceResults.map(_.source) + nonEmptyImportedSources <- if (importedSources.isEmpty) Left(s"No source files for package '$directImportTarget' found") else Right(importedSources) + } yield nonEmptyImportedSources + + nonEmptyImportedSources.fold( + errMsg => { + val errs = importErrorFactory(errMsg) + manager.addIfAbsent(directImportPackage, ParseFailureJob(errs))(executionContext) + Future.successful(Left(errs)) + }, + nonEmptySources => { + manager.addIfAbsent(directImportPackage, ParseSourcesJob(nonEmptySources, directImportPackage))(executionContext) + manager.getFuture(directImportPackage).flatten + .map { + case Left(_) => Left(importErrorFactory(s"Imported package contains errors")) + case success => success + }(executionContext) + }) + /* val importedSources = PackageResolver.resolveSources(directImportTarget)(config) .getOrElse(Vector()) .map(_.source) if (importedSources.isEmpty) { - manager.addIfAbsent(directImportPackage, ParseFailureJob(Vector(NotFoundError(s"No source files for package '$directImportTarget' found", optSourcePos))))(executionContext) - manager.getFuture(directImportPackage) // we do not flatten here as we only need to await the job's creation + val errMsg = s"No source files for package '$directImportTarget' found" + manager.addIfAbsent(directImportPackage, ParseFailureJob(Vector(NotFoundError(errMsg))))(executionContext) + Future.successful(Left(importErrorFactory(errMsg))) } else { manager.addIfAbsent(directImportPackage, ParseSourcesJob(importedSources, directImportPackage))(executionContext) - manager.getFuture(directImportPackage) // we do not flatten here as we only need to await the job's creation + manager.getFuture(directImportPackage).flatten + .map { + case Left(errs) => Left(importErrorFactory(s"Imported package contains errors")) + case success => success + }(executionContext) } - }} + */ + } + + // val (importFailures, futs) = importResults.partitionMap(identity) + // val flatImportFailures = importFailures.toVector.flatten val startMs = System.currentTimeMillis() val res = for { @@ -84,32 +115,66 @@ object Parser { } implicit val executor: GobraExecutionContext = executionContext + + Future.sequence(importResults) + .map(dependencyResults => { + val (importErrors, _) = dependencyResults.partitionMap(identity) + val flatImportFailures = importErrors.toVector.flatten + if (flatImportFailures.isEmpty) { + // we only post-process if dependent packages where successful + Parser.postprocess(res, specOnly = specOnly)(config) + } else { + config.reporter report ParserErrorMessage(flatImportFailures.head.position.get.file, flatImportFailures) + Left(flatImportFailures) + } + /* + if (dependencyResults.forall(_.isRight)) { + // we only post-process if dependent packages where successful + Parser.postprocess(res, specOnly = specOnly)(config) + } else { + // we return an empty list of errors not to duplicate errors + Left(Vector.empty) + } + */ + }) + /* Future.sequence(futs) .map(_ => res) + */ } - private def fastParse(preprocessedInput: Vector[Source]): Set[(AbstractImport, Option[SourcePosition])] = { - def getImportPaths(preprocessedSource: Source): Set[(RegularImport, Option[SourcePosition])] = { + type ImportErrorFactory = String => Vector[ParserError] + private def fastParse(preprocessedInput: Vector[Source]): Set[(AbstractImport, ImportErrorFactory)] = { + def getImportPaths(preprocessedSource: Source): Set[(RegularImport, ImportErrorFactory)] = { processPreamble(preprocessedSource)(config) .map(preamble => { val pom = preamble.positions preamble.imports .map(importNode => { - val nodeStart = pom.positions.getStart(importNode) - val nodeFinish = pom.positions.getFinish(importNode) - val nodePos = (nodeStart, nodeFinish) match { - case (Some(start), Some(finish)) => Some(pom.translate(start, finish)) - case _ => None + val importErrorFactory: ImportErrorFactory = (errMsg: String) => { + val err = pom.translate(message(importNode, errMsg), ParserError) + // config.reporter report ParserErrorMessage(err.head.position.get.file, err) + err } - (RegularImport(importNode.importPath), nodePos) + (RegularImport(importNode.importPath), importErrorFactory) }) .toSet }) .getOrElse(Set.empty) } - val builtInImportTuple = (BuiltInImport, None) - preprocessedInput.flatMap(getImportPaths).toSet + builtInImportTuple + val explicitImports: Set[(AbstractImport, ImportErrorFactory)] = preprocessedInput.flatMap(getImportPaths).toSet + if (pkgInfo.isBuiltIn) { + explicitImports + } else { + val builtInImportErrorFactory: ImportErrorFactory = (errMsg: String) => { + val err = Vector(ParserError(errMsg, None)) + config.reporter report ParserErrorMessage(err.head.position.get.file, err) + err + } + val builtInImportTuple = (BuiltInImport, builtInImportErrorFactory) + explicitImports + builtInImportTuple + } } } @@ -126,7 +191,7 @@ object Parser { lazy val specOnly: Boolean = true } - case class ParseFailureJob(errs: Vector[NotFoundError]) extends Job[Future[ParseResult]] { + case class ParseFailureJob(errs: Vector[ParserError]) extends Job[Future[ParseResult]] { override def compute(): Future[ParseResult] = Future.successful[ParseResult](Left(errs)) } @@ -140,6 +205,15 @@ object Parser { if (failedResults.isEmpty) Right(successfulResults.toMap) else Left(failedResults.toMap) } + + def getSuccessResults(executionContext: GobraExecutionContext): Map[AbstractPackage, ParseSuccessResult] = { + implicit val executor: GobraExecutionContext = executionContext + val futs = manager.getAllFutures.map { case (key, fut) => fut.flatten.map(res => (key, res)) } + val results = Await.result(Future.sequence(futs), Duration.Inf) + results + .collect { case (key, Right(res)) => (key, res) } + .toMap + } } /** @@ -160,9 +234,13 @@ object Parser { def parse(config: Config, pkgInfo: PackageInfo)(executionContext: GobraExecutionContext): Either[Vector[VerifierError], Map[AbstractPackage, ParseSuccessResult]] = { val parseManager = new ParseManager(config, executionContext) + /* parseManager.parse(pkgInfo) val res = parseManager.getParseResults(executionContext).left.map(errMap => errMap.values.flatten.toVector) res + */ + val res = parseManager.parse(pkgInfo) + res.map(_ => parseManager.getSuccessResults(executionContext)) } def parse(input: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean = false)(config: Config): Either[Vector[VerifierError], PPackage] = { @@ -205,7 +283,8 @@ object Parser { if (config.cacheParser) parseSourceCached(preprocessedSource) else parseSource(preprocessedSource) } - private def process(preprocessedInputs: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[VerifierError], PPackage] = { + private def process(preprocessedInputs: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[ParserError], PPackage] = { + /* for { parseAst <- parseSources(preprocessedInputs, pkgInfo, specOnly = specOnly)(config) postprocessors = Seq( @@ -217,6 +296,23 @@ object Parser { case (e, _) => e } } yield postprocessedAst + */ + parseSources(preprocessedInputs, pkgInfo, specOnly = specOnly)(config) + } + + private def postprocess(processResult: Either[Vector[ParserError], (Vector[Source], PPackage)], specOnly: Boolean)(config: Config): Either[Vector[ParserError], (Vector[Source], PPackage)] = { + for { + successfulProcessResult <- processResult + (preprocessedInputs, parseAst) = successfulProcessResult + postprocessors = Seq( + new ImportPostprocessor(parseAst.positions.positions), + new TerminationMeasurePostprocessor(parseAst.positions.positions, specOnly = specOnly), + ) + postprocessedAst <- postprocessors.foldLeft[Either[Vector[ParserError], PPackage]](Right(parseAst)) { + case (Right(ast), postprocessor) => postprocessor.postprocess(ast)(config) + case (e, _) => e + } + } yield (preprocessedInputs, postprocessedAst) } type SourceCacheKey = String @@ -226,7 +322,7 @@ object Parser { // we cache entire packages and not individual files (i.e. PProgram) as this saves us from copying over positional information // from one to the other position manager. Also, this transformation of copying positional information results in // differen PPackage instances that is problematic for caching type-check results. - private val packageCache: ConcurrentMap[PackageCacheKey, Either[Vector[VerifierError], PPackage]] = new ConcurrentHashMap() + private val packageCache: ConcurrentMap[PackageCacheKey, Either[Vector[ParserError], PPackage]] = new ConcurrentHashMap() /** computes the key for caching the preamble of a particular source. This takes the name and the source's content into account */ private def getPreambleCacheKey(source: Source): SourceCacheKey = { @@ -249,8 +345,8 @@ object Parser { packageCache.clear() } - private def parseSources(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[VerifierError], PPackage] = { - def parseSourcesCached(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[VerifierError], PPackage] = { + private def parseSources(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[ParserError], PPackage] = { + def parseSourcesCached(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[ParserError], PPackage] = { var cacheHit: Boolean = true val res = packageCache.computeIfAbsent(getPackageCacheKey(sources, pkgInfo, specOnly), _ => { cacheHit = false @@ -267,7 +363,7 @@ object Parser { } /** parses a package not taking the package cache but only the program cache into account */ - private def parseSourcesUncached(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[VerifierError], PPackage] = { + private def parseSourcesUncached(sources: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[ParserError], PPackage] = { val positions = new Positions val pom = new PositionManager(positions) lazy val rewriter = new PRewriter(pom.positions) @@ -388,15 +484,15 @@ object Parser { } } - def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] + def postprocess(pkg: PPackage)(config: Config): Either[Vector[ParserError], PPackage] } private class ImportPostprocessor(override val positions: Positions) extends Postprocessor { /** * Replaces all PQualifiedWoQualifierImport by PQualifiedImport nodes */ - def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = { - def createError(n: PImplicitQualifiedImport, errorMsg: String): Vector[VerifierError] = { + def postprocess(pkg: PPackage)(config: Config): Either[Vector[ParserError], PPackage] = { + def createError(n: PImplicitQualifiedImport, errorMsg: String): Vector[ParserError] = { val err = pkg.positions.translate(message(n, s"Explicit qualifier could not be derived (reason: '$errorMsg')"), ParserError) config.reporter report ParserErrorMessage(err.head.position.get.file, err) @@ -405,7 +501,7 @@ object Parser { // unfortunately Kiama does not seem to offer a way to report errors while applying the strategy // hence, we keep ourselves track of errors - var failedNodes: Vector[VerifierError] = Vector() + var failedNodes: Vector[ParserError] = Vector() def replace(n: PImplicitQualifiedImport): Option[PExplicitQualifiedImport] = { val qualifier = for { @@ -454,11 +550,11 @@ object Parser { * Note that we do not transform the body of pure functions and pure methods (e.g. by turning the body into a * postcondition) because this would result in a matching loop for recursive functions. */ - def postprocess(pkg: PPackage)(config: Config): Either[Vector[VerifierError], PPackage] = { + def postprocess(pkg: PPackage)(config: Config): Either[Vector[ParserError], PPackage] = { if (specOnly) replaceTerminationMeasures(pkg) else Right(pkg) } - private def replaceTerminationMeasures(pkg: PPackage): Either[Vector[VerifierError], PPackage] = { + private def replaceTerminationMeasures(pkg: PPackage): Either[Vector[ParserError], PPackage] = { def replace(spec: PFunctionSpec): PFunctionSpec = { val replacedMeasures = spec.terminationMeasures.map { case n@PTupleTerminationMeasure(_, cond) => PWildcardMeasure(cond).at(n) diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala index 3798941c1..858c2f2ae 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierError.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala @@ -28,7 +28,8 @@ sealed trait VerifierError { var cached: Boolean = false } -case class NotFoundError(message: String, position: Option[SourcePosition]) extends VerifierError { +case class NotFoundError(message: String) extends VerifierError { + val position: Option[SourcePosition] = None val id = "not_found_error" } diff --git a/src/test/resources/regressions/features/import/import-fail1.gobra b/src/test/resources/regressions/features/import/import-fail1.gobra new file mode 100644 index 000000000..769bcd13c --- /dev/null +++ b/src/test/resources/regressions/features/import/import-fail1.gobra @@ -0,0 +1,10 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +import ( + // the following package does not exist + //:: ExpectedOutput(parser_error) + "nopackagewhatsoever" +) \ No newline at end of file diff --git a/src/test/resources/regressions/features/import/import-fail2.gobra b/src/test/resources/regressions/features/import/import-fail2.gobra new file mode 100644 index 000000000..d39496255 --- /dev/null +++ b/src/test/resources/regressions/features/import/import-fail2.gobra @@ -0,0 +1,12 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +// ##(-I ./) + +import ( + // note that package `parse_error` contains a parser error so the qualifier cannot be resolved + //:: ExpectedOutput(parser_error) + "parse_error" +) diff --git a/src/test/resources/regressions/features/import/import-fail3.gobra b/src/test/resources/regressions/features/import/import-fail3.gobra new file mode 100644 index 000000000..436d52cd7 --- /dev/null +++ b/src/test/resources/regressions/features/import/import-fail3.gobra @@ -0,0 +1,12 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +// ##(-I ./) + +import ( + // note that `foo` contains a parser error so the qualifier cannot be resolved + //:: ExpectedOutput(parser_error) + "invalid_package_clause" +) diff --git a/src/test/resources/regressions/features/import/invalid_package_clause/invalid_package_clause1.gobra b/src/test/resources/regressions/features/import/invalid_package_clause/invalid_package_clause1.gobra new file mode 100644 index 000000000..5c8815c06 --- /dev/null +++ b/src/test/resources/regressions/features/import/invalid_package_clause/invalid_package_clause1.gobra @@ -0,0 +1,4 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package clause1 diff --git a/src/test/resources/regressions/features/import/invalid_package_clause/invalid_package_clause2.gobra b/src/test/resources/regressions/features/import/invalid_package_clause/invalid_package_clause2.gobra new file mode 100644 index 000000000..716f1038c --- /dev/null +++ b/src/test/resources/regressions/features/import/invalid_package_clause/invalid_package_clause2.gobra @@ -0,0 +1,4 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package clause2 diff --git a/src/test/resources/regressions/features/import/parse_error/parse_error.gobra b/src/test/resources/regressions/features/import/parse_error/parse_error.gobra new file mode 100644 index 000000000..142c3e3a6 --- /dev/null +++ b/src/test/resources/regressions/features/import/parse_error/parse_error.gobra @@ -0,0 +1,8 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package parseError + +// package foo has a source file but an invalid preamble, i.e., fails to parse +//:: ExpectedOutput(parser_error) +imp bla "bla" diff --git a/src/test/resources/regressions/features/stubs/stubs-fail0.gobra b/src/test/resources/regressions/features/stubs/stubs-fail0.gobra index 6ee25b286..f4a5bd7ef 100644 --- a/src/test/resources/regressions/features/stubs/stubs-fail0.gobra +++ b/src/test/resources/regressions/features/stubs/stubs-fail0.gobra @@ -3,7 +3,8 @@ package main -import ( - //:: ExpectedOutput(not_found_error) - "nopackagewhatsoever" -) \ No newline at end of file +import "net" + +// Should fail, package net does not contain member DoesNotExist +//:: ExpectedOutput(type_error) +func closePacketConn(conn net.DoesNotExist) error \ No newline at end of file diff --git a/src/test/resources/regressions/features/stubs/stubs-fail1.gobra b/src/test/resources/regressions/features/stubs/stubs-fail1.gobra deleted file mode 100644 index f4a5bd7ef..000000000 --- a/src/test/resources/regressions/features/stubs/stubs-fail1.gobra +++ /dev/null @@ -1,10 +0,0 @@ -// Any copyright is dedicated to the Public Domain. -// http://creativecommons.org/publicdomain/zero/1.0/ - -package main - -import "net" - -// Should fail, package net does not contain member DoesNotExist -//:: ExpectedOutput(type_error) -func closePacketConn(conn net.DoesNotExist) error \ No newline at end of file From 114b1fa4a5b976c1c2c2e5fd6c6f6ea103993493 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 16 Mar 2023 14:02:50 +0100 Subject: [PATCH 121/296] Updates submodules (#642) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 6d3bec4e9..8ab7defa2 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 6d3bec4e9a6f056d955f0889a3f558898211fbd9 +Subproject commit 8ab7defa210e8df3aab962e7849966ab728a4863 From c4b86a4189963a9c7e3c0d69cdd9a4d2361933f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 20 Mar 2023 20:02:49 +0100 Subject: [PATCH 122/296] add conversions (#643) --- .../property/Convertibility.scala | 2 + .../implementation/property/TypeMerging.scala | 5 +++ .../translator/encodings/FloatEncoding.scala | 38 +++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Convertibility.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Convertibility.scala index 84430465e..6352cbd6b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Convertibility.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Convertibility.scala @@ -20,6 +20,8 @@ trait Convertibility extends BaseProperty { this: TypeInfoImpl => case (left, right) if assignableTo(left, right) => true case (IntT(_), Float32T) => true case (IntT(_), Float64T) => true + case (Float32T, IntT(_)) => true + case (Float64T, IntT(_)) => true case (IntT(_), IntT(_)) => true case (SliceT(IntT(config.typeBounds.Byte)), StringT) => true case (StringT, SliceT(IntT(config.typeBounds.Byte))) => true diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala index 9ffd3e6cf..9aa0ffe51 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala @@ -6,6 +6,7 @@ package viper.gobra.frontend.info.implementation.property +import viper.gobra.ast.internal.{Float32T, Float64T} import viper.gobra.frontend.info.base.Type.{AdtClauseT, AdtT, ArrayT, ChannelT, GhostSliceT, IntT, InternalSingleMulti, InternalTupleT, MapT, MultisetT, PermissionT, PointerT, SequenceT, SetT, Single, SliceT, Type} import viper.gobra.frontend.info.implementation.TypeInfoImpl @@ -23,6 +24,10 @@ trait TypeMerging extends BaseProperty { this: TypeInfoImpl => (lst, rst) match { case (a, UNTYPED_INT_CONST) if underlyingType(a).isInstanceOf[IntT] => Some(a) case (UNTYPED_INT_CONST, b) if underlyingType(b).isInstanceOf[IntT] => Some(b) + case (a, UNTYPED_INT_CONST) if underlyingType(a).isInstanceOf[Float64T] => Some(a) + case (UNTYPED_INT_CONST, b) if underlyingType(b).isInstanceOf[Float64T] => Some(b) + case (a, UNTYPED_INT_CONST) if underlyingType(a).isInstanceOf[Float32T] => Some(a) + case (UNTYPED_INT_CONST, b) if underlyingType(b).isInstanceOf[Float32T] => Some(b) case (IntT(_), PermissionT) => Some(PermissionT) case (PermissionT, IntT(_)) => Some(PermissionT) case (SequenceT(l), SequenceT(r)) => typeMerge(l,r) map SequenceT diff --git a/src/main/scala/viper/gobra/translator/encodings/FloatEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/FloatEncoding.scala index 6ee174e5c..76ee45196 100644 --- a/src/main/scala/viper/gobra/translator/encodings/FloatEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/FloatEncoding.scala @@ -78,6 +78,10 @@ class FloatEncoding extends LeafTypeEncoding { for { e <- goE(expr) } yield withSrc(vpr.FuncApp(fromIntTo32, Seq(e)), conv) case conv@in.Conversion(in.Float64T(_), expr :: ctx.Int()) => for { e <- goE(expr) } yield withSrc(vpr.FuncApp(fromIntTo64, Seq(e)), conv) + case conv@in.Conversion(in.IntT(_, _), expr :: ctx.Float32()) => + for { e <- goE(expr) } yield withSrc(vpr.FuncApp(from32ToInt, Seq(e)), conv) + case conv@in.Conversion(in.IntT(_, _), expr :: ctx.Float64()) => + for { e <- goE(expr) } yield withSrc(vpr.FuncApp(from64ToInt, Seq(e)), conv) } } @@ -95,6 +99,8 @@ class FloatEncoding extends LeafTypeEncoding { addMemberFn(mulFloat64) addMemberFn(divFloat64) addMemberFn(fromIntTo64) + addMemberFn(from32ToInt) + addMemberFn(from64ToInt) } } private var isUsed32: Boolean = false @@ -267,4 +273,36 @@ class FloatEncoding extends LeafTypeEncoding { body = None )() } + + /** + * Generates + * function from32ToInt(l: Int): Int + */ + private lazy val from32ToInt = { + val arg = vpr.LocalVarDecl("n", floatType32)() + vpr.Function( + name = "from32ToInt", + formalArgs = Seq(arg), + typ = vpr.Int, + pres = Seq(), + posts = Seq(), + body = None + )() + } + + /** + * Generates + * function from64ToInt(l: Int): Int + */ + private lazy val from64ToInt = { + val arg = vpr.LocalVarDecl("n", floatType64)() + vpr.Function( + name = "from64ToInt", + formalArgs = Seq(arg), + typ = vpr.Int, + pres = Seq(), + posts = Seq(), + body = None + )() + } } \ No newline at end of file From cfed2ce6aa4d7f4b18b7b8e9e63cf52c4f3140b5 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 30 Mar 2023 09:50:34 +0200 Subject: [PATCH 123/296] fixes reporting of errors in imported packages and reports them as part of type-checking --- src/main/scala/viper/gobra/Gobra.scala | 6 +- .../scala/viper/gobra/frontend/Parser.scala | 48 +++++-- .../viper/gobra/frontend/info/Info.scala | 118 ++++++++++++++++-- .../features/import/import-fail2.gobra | 2 +- .../regressions/features/import/import1.gobra | 18 +-- .../regressions/features/import/import2.gobra | 2 +- .../viper/gobra/DetailedBenchmarkTests.scala | 6 +- 7 files changed, 160 insertions(+), 40 deletions(-) diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index 719e65857..b215f88d6 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -16,7 +16,7 @@ import viper.gobra.ast.internal.Program import viper.gobra.ast.internal.transform.{CGEdgesTerminationTransform, ConstantPropagation, InternalTransform, OverflowChecksTransform} import viper.gobra.backend.BackendVerifier import viper.gobra.frontend.PackageResolver.{AbstractPackage, RegularPackage} -import viper.gobra.frontend.Parser.ParseSuccessResult +import viper.gobra.frontend.Parser.{ParseResult, ParseSuccessResult} import viper.gobra.frontend.info.{Info, TypeInfo} import viper.gobra.frontend.{Config, Desugar, PackageInfo, Parser, ScallopGobraConfig} import viper.gobra.reporting._ @@ -243,7 +243,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { .setLevel(config.logLevel) } - private def performParsing(config: Config, pkgInfo: PackageInfo)(executor: GobraExecutionContext): Either[Vector[VerifierError], Map[AbstractPackage, ParseSuccessResult]] = { + private def performParsing(config: Config, pkgInfo: PackageInfo)(executor: GobraExecutionContext): Either[Vector[VerifierError], Map[AbstractPackage, ParseResult]] = { if (config.shouldParse) { val startMs = System.currentTimeMillis() val res = Parser.parse(config, pkgInfo)(executor) @@ -257,7 +257,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { } } - private def performTypeChecking(config: Config, pkgInfo: PackageInfo, parseResults: Map[AbstractPackage, ParseSuccessResult])(executor: GobraExecutionContext): Either[Vector[VerifierError], TypeInfo] = { + private def performTypeChecking(config: Config, pkgInfo: PackageInfo, parseResults: Map[AbstractPackage, ParseResult])(executor: GobraExecutionContext): Either[Vector[VerifierError], TypeInfo] = { if (config.shouldTypeCheck) { Info.check(config, RegularPackage(pkgInfo.id), parseResults)(executor) } else { diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index e42c37afc..c43610564 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -18,6 +18,7 @@ import org.antlr.v4.runtime.atn.PredictionMode import org.antlr.v4.runtime.misc.ParseCancellationException import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, PreambleContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, RegularImport, RegularPackage} +import viper.gobra.frontend.Parser.ParseSuccessResult import viper.gobra.util.GobraExecutionContext import viper.silver.ast.SourcePosition @@ -57,28 +58,30 @@ object Parser { // before parsing, get imports and add these parse jobs val imports = fastParse(preprocessedSources) val preambleParsingDurationMs = System.currentTimeMillis() - startPreambleParsingMs - // val importResults: Set[Either[Vector[VerifierError], Future[ParseResult]]] = imports.map{ case (directImportTarget, importErrorFactory) => { - val importResults: Set[Future[ParseResult]] = imports.map { case (directImportTarget, importErrorFactory) => + val importResults: Set[Either[Vector[ParserError], Future[_]]] = imports.map { case (directImportTarget, importErrorFactory) => + // val importResults: Set[Future[ParseResult]] = imports.map { case (directImportTarget, importErrorFactory) => val directImportPackage = AbstractPackage(directImportTarget)(config) val nonEmptyImportedSources = for { resolveSourceResults <- PackageResolver.resolveSources(directImportTarget)(config) importedSources = resolveSourceResults.map(_.source) nonEmptyImportedSources <- if (importedSources.isEmpty) Left(s"No source files for package '$directImportTarget' found") else Right(importedSources) } yield nonEmptyImportedSources - nonEmptyImportedSources.fold( errMsg => { val errs = importErrorFactory(errMsg) manager.addIfAbsent(directImportPackage, ParseFailureJob(errs))(executionContext) - Future.successful(Left(errs)) + Left(errs) }, nonEmptySources => { manager.addIfAbsent(directImportPackage, ParseSourcesJob(nonEmptySources, directImportPackage))(executionContext) + Right(manager.getFuture(directImportPackage)) + /* manager.getFuture(directImportPackage).flatten .map { case Left(_) => Left(importErrorFactory(s"Imported package contains errors")) case success => success }(executionContext) + */ }) /* val importedSources = PackageResolver.resolveSources(directImportTarget)(config) @@ -99,9 +102,23 @@ object Parser { */ } - // val (importFailures, futs) = importResults.partitionMap(identity) - // val flatImportFailures = importFailures.toVector.flatten + val (importFailures, futs) = importResults.partitionMap(identity) + val flatImportFailures = importFailures.toVector.flatten + + val res: ParseResult = for { + _ <- if (flatImportFailures.isEmpty) Right(()) else Left(flatImportFailures) + startMs = System.currentTimeMillis() + parsedProgram <- Parser.process(preprocessedSources, pkgInfo, specOnly = specOnly)(config) + postprocessedProgram <- Parser.postprocess(Right((preprocessedSources, parsedProgram)), specOnly = specOnly)(config) + _ = logger.trace { + val parsingDurationMs = System.currentTimeMillis() - startMs + val parsingDurationS = f"${parsingDurationMs / 1000f}%.1f" + val preambleParsingRatio = f"${100f * preambleParsingDurationMs / parsingDurationMs}%.1f" + s"parsing ${pkgInfo.id} done (took ${parsingDurationS}s; parsing preamble overhead is ${preambleParsingRatio}%)" + } + } yield (pkgSources, postprocessedProgram._2) // we use `pkgSources` as the preprocessing of sources should be transparent from the outside + /* val startMs = System.currentTimeMillis() val res = for { parsedProgram <- Parser.process(preprocessedSources, pkgInfo, specOnly = specOnly)(config) @@ -112,10 +129,10 @@ object Parser { val parsingDurationS = f"${parsingDurationMs / 1000f}%.1f" val preambleParsingRatio = f"${100f * preambleParsingDurationMs / parsingDurationMs}%.1f" s"parsing ${pkgInfo.id} done (took ${parsingDurationS}s; parsing preamble overhead is ${preambleParsingRatio}%)" - } + }*/ implicit val executor: GobraExecutionContext = executionContext - + /* Future.sequence(importResults) .map(dependencyResults => { val (importErrors, _) = dependencyResults.partitionMap(identity) @@ -137,10 +154,9 @@ object Parser { } */ }) - /* + */ Future.sequence(futs) .map(_ => res) - */ } type ImportErrorFactory = String => Vector[ParserError] @@ -214,6 +230,14 @@ object Parser { .collect { case (key, Right(res)) => (key, res) } .toMap } + + def getResults(executionContext: GobraExecutionContext): Map[AbstractPackage, ParseResult] = { + implicit val executor: GobraExecutionContext = executionContext + val futs = manager.getAllFutures.map { case (key, fut) => fut.flatten.map(res => (key, res)) } + val results = Await.result(Future.sequence(futs), Duration.Inf) + results + .toMap + } } /** @@ -232,7 +256,7 @@ object Parser { * */ - def parse(config: Config, pkgInfo: PackageInfo)(executionContext: GobraExecutionContext): Either[Vector[VerifierError], Map[AbstractPackage, ParseSuccessResult]] = { + def parse(config: Config, pkgInfo: PackageInfo)(executionContext: GobraExecutionContext): Either[Vector[VerifierError], Map[AbstractPackage, ParseResult]] = { val parseManager = new ParseManager(config, executionContext) /* parseManager.parse(pkgInfo) @@ -240,7 +264,7 @@ object Parser { res */ val res = parseManager.parse(pkgInfo) - res.map(_ => parseManager.getSuccessResults(executionContext)) + res.map(_ => parseManager.getResults(executionContext)) } def parse(input: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean = false)(config: Config): Either[Vector[VerifierError], PPackage] = { diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 5a68b034e..7512fee8b 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -13,11 +13,12 @@ import org.bitbucket.inkytonik.kiama.util.{Position, Source} import viper.gobra.ast.frontend.{PImport, PNode, PPackage} import viper.gobra.frontend.{Config, Job, TaskManager} import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, BuiltInPackage, RegularImport} -import viper.gobra.frontend.Parser.ParseSuccessResult +import viper.gobra.frontend.Parser.{ParseResult, ParseSuccessResult} import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential} +import viper.gobra.frontend.info.Info.CycleChecker import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.ghost.separation.{GhostLessPrinter, GoifyingPrinter} -import viper.gobra.reporting.{TypeCheckDebugMessage, TypeCheckFailureMessage, TypeCheckSuccessMessage, TypeError, VerifierError} +import viper.gobra.reporting.{CyclicImportError, ParserError, TypeCheckDebugMessage, TypeCheckFailureMessage, TypeCheckSuccessMessage, TypeError, VerifierError} import viper.gobra.util.{GobraExecutionContext, Violation} import java.security.MessageDigest @@ -46,24 +47,83 @@ object Info extends LazyLogging { */ case class ImportCycle(importNodeCausingCycle: PImport, importNodeStart: Option[Position], cyclicPackages: Vector[AbstractImport]) - class CycleChecker(val config: Config, val parseResults: Map[AbstractPackage, ParseSuccessResult]) extends GetParseResult { + class CycleChecker(val config: Config /*, val parseResults: Map[AbstractPackage, ParseSuccessResult]*/, val parseResults: Map[AbstractPackage, ParseResult]) { /** keeps track of the package dependencies that are currently resolved. This information is used to detect cycles */ private var parserPendingPackages: Vector[AbstractImport] = Vector() - def check(abstractPackage: AbstractPackage): Messages = { + private def getParseResult(abstractPackage: AbstractPackage): Either[Vector[ParserError], ParseSuccessResult] = { + Violation.violation(parseResults.contains(abstractPackage), s"GetParseResult: expects that $abstractPackage has been parsed") + parseResults(abstractPackage) + } + + def check(abstractPackage: AbstractPackage): Either[Vector[VerifierError], Map[AbstractPackage, ParseSuccessResult]] = { + for { + parseResult <- getParseResult(abstractPackage) + (_, ast) = parseResult + perImportResult = ast.imports.map(importNode => { + // val cycles = getCycles(RegularImport(importNode.importPath)) + /* + val cycles = getImportErrors(RegularImport(importNode.importPath)) + val msgs = createImportError(importNode, cycles) + if (msgs.isEmpty) Right(()) else Left(ast.positions.translate(msgs, TypeError).distinct) + */ + val res = getImportErrors(RegularImport(importNode.importPath)) + .left + .map(errs => { + val msgs = createImportError(importNode, errs) + ast.positions.translate(msgs, TypeError).distinct + }) + res + }) + (errs, _) = perImportResult.partitionMap(identity) + _ <- if (errs.nonEmpty) Left(errs.flatten) else Right(()) + successParseResults = parseResults.collect { + case (key, Right(res)) => (key, res) + } + } yield successParseResults + /* val (_, ast) = getParseResult(abstractPackage) - ast.imports.flatMap(importNode => { + val msgs = ast.imports.flatMap(importNode => { val cycles = getCycles(RegularImport(importNode.importPath)) createImportError(importNode, cycles) }) + if (msgs.isEmpty) { + + } else { + Left(ast.positions.translate(msgs, TypeError).distinct) + } + */ } /** * returns all parser errors and cyclic errors transitively found in imported packages */ - private def getCycles(importTarget: AbstractImport): Vector[ImportCycle] = { + private def getImportErrors(importTarget: AbstractImport): Either[Vector[VerifierError], Unit] = { parserPendingPackages = parserPendingPackages :+ importTarget val abstractPackage = AbstractPackage(importTarget)(config) + val res = for { + parseResult <- getParseResult(abstractPackage) + (_, ast) = parseResult + perImportResult = ast.imports.map(importNode => { + val directlyImportedTarget = RegularImport(importNode.importPath) + if (parserPendingPackages.contains(directlyImportedTarget)) { + // package cycle detected + val importNodeStart = ast.positions.positions.getStart(importNode) + // Vector(ImportCycle(importNode, importNodeStart, parserPendingPackages)) + val msg = s"Package '$importTarget' is part of the following import cycle that involves the import $importNode$importNodeStart: ${parserPendingPackages.mkString("[", ", ", "]")}" + Left(Vector(CyclicImportError(s"Cyclic package import detected starting with package '$msg'"))) + } else { + getImportErrors(directlyImportedTarget) + } + }) + (errs, _) = perImportResult.partitionMap(identity) + res <- if (errs.nonEmpty) Left(errs.flatten) else Right(()) + } yield res + parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) + res + } + /* + private def getCycles(importTarget: AbstractImport): Vector[ImportCycle] = { val (_, ast) = getParseResult(abstractPackage) val res = ast.imports.flatMap(importNode => { val directlyImportedTarget = RegularImport(importNode.importPath) @@ -78,13 +138,28 @@ object Info extends LazyLogging { parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) res } + */ - private def createImportError(importNode: PImport, cycles: Vector[ImportCycle]): Messages = { + private def createImportError(importNode: PImport, errorsInImportedPackage: Vector[VerifierError]): Messages = { val importTarget = RegularImport(importNode.importPath) + val (cyclicErrors, nonCyclicErrors) = errorsInImportedPackage.partitionMap { + case cyclicErr: CyclicImportError => Left(cyclicErr) + case e => Right(e) + } + if (cyclicErrors.isEmpty) { + // nonCyclicErrors.flatMap(err => message(importNode, err.message)) + message(importNode, s"Package contains ${nonCyclicErrors.length} error(s): ${nonCyclicErrors.map(_.message).mkString(", ")}") + } else { + cyclicErrors.flatMap(cycle => { + // val positionalInfo = cycle.importNodeStart.map(pos => s" at ${pos.format}").getOrElse("") + // message(importNode, s"Package '$importTarget' is part of the following import cycle that involves the import ${cycle.importNodeCausingCycle}$positionalInfo: ${cycle.cyclicPackages.mkString("[", ", ", "]")}") + message(importNode, cycle.message) + }) + }/* cycles.flatMap(cycle => { val positionalInfo = cycle.importNodeStart.map(pos => s" at ${pos.format}").getOrElse("") message(importNode, s"Package '$importTarget' is part of the following import cycle that involves the import ${cycle.importNodeCausingCycle}$positionalInfo: ${cycle.cyclicPackages.mkString("[", ", ", "]")}") - }) + })*/ } } @@ -99,10 +174,11 @@ object Info extends LazyLogging { trait TypeCheckJob { protected def typeCheck(pkgSources: Vector[Source], pkg: PPackage, dependentTypeInfo: DependentTypeInfo, isMainContext: Boolean = false): TypeCheckResult = { val startMs = System.currentTimeMillis() + logger.trace(s"start type-checking ${pkg.info.id}") val res = Info.checkSources(pkgSources, pkg, dependentTypeInfo, isMainContext = isMainContext)(config) logger.trace { val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" - s"type-checking ${pkg.info.id} done (took ${durationS}s)" + s"type-checking ${pkg.info.id} done (took ${durationS}s with ${res.map(info => info.tree.nodes.length.toString).getOrElse("_")} nodes)" } res } @@ -233,9 +309,28 @@ object Info extends LazyLogging { */ } - def check(config: Config, abstractPackage: AbstractPackage, parseResults: Map[AbstractPackage, ParseSuccessResult])(executionContext: GobraExecutionContext): TypeCheckResult = { + def check(config: Config, abstractPackage: AbstractPackage, /*parseResults: Map[AbstractPackage, ParseSuccessResult]*/ parseResults: Map[AbstractPackage, ParseResult])(executionContext: GobraExecutionContext): TypeCheckResult = { // check for cycles - val cyclicErrors = new CycleChecker(config, parseResults).check(abstractPackage) + // val cyclicErrors = new CycleChecker(config, parseResults).check(abstractPackage) + for { + successParseResult <- new CycleChecker(config, parseResults).check(abstractPackage) + .left.map(errs => { + val (sources, pkg) = parseResults(abstractPackage).right.get + val sourceNames = sources.map(_.name) + config.reporter report TypeCheckFailureMessage(sourceNames, pkg.packageClause.id.name, () => pkg, errs) + errs + }) + typeCheckingStartMs = System.currentTimeMillis() + context = new Context(config, successParseResult)(executionContext) + typeInfo <- context.typeCheck(abstractPackage) + _ = logger.debug { + val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" + s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})" + } + } yield typeInfo + + + /* if (cyclicErrors.isEmpty) { val typeCheckingStartMs = System.currentTimeMillis() // add type-checking jobs to context: @@ -254,6 +349,7 @@ object Info extends LazyLogging { config.reporter report TypeCheckFailureMessage(sourceNames, pkg.packageClause.id.name, () => pkg, errors) Left(errors) } + */ } type TypeInfoCacheKey = String diff --git a/src/test/resources/regressions/features/import/import-fail2.gobra b/src/test/resources/regressions/features/import/import-fail2.gobra index d39496255..1c91c949f 100644 --- a/src/test/resources/regressions/features/import/import-fail2.gobra +++ b/src/test/resources/regressions/features/import/import-fail2.gobra @@ -7,6 +7,6 @@ package main import ( // note that package `parse_error` contains a parser error so the qualifier cannot be resolved - //:: ExpectedOutput(parser_error) + //:: ExpectedOutput(type_error) "parse_error" ) diff --git a/src/test/resources/regressions/features/import/import1.gobra b/src/test/resources/regressions/features/import/import1.gobra index 7e8ebbc08..eb3106227 100644 --- a/src/test/resources/regressions/features/import/import1.gobra +++ b/src/test/resources/regressions/features/import/import1.gobra @@ -4,27 +4,27 @@ package main import fmt "fmt" -//:: ExpectedOutput(not_found_error) +//:: ExpectedOutput(parser_error) import a "a"; -//:: ExpectedOutput(not_found_error) +//:: ExpectedOutput(parser_error) import (b "b") -//:: ExpectedOutput(not_found_error) +//:: ExpectedOutput(parser_error) import (c "c"); import ( - //:: ExpectedOutput(not_found_error) + //:: ExpectedOutput(parser_error) d "d" - //:: ExpectedOutput(not_found_error) + //:: ExpectedOutput(parser_error) e "e") import ( - //:: ExpectedOutput(not_found_error) + //:: ExpectedOutput(parser_error) f "f" - //:: ExpectedOutput(not_found_error) + //:: ExpectedOutput(parser_error) g "g" ) -//:: ExpectedOutput(not_found_error) +//:: ExpectedOutput(parser_error) import m "lib/mathm" // wrong package name used on purpose such that this test case does not potentially depend on the configured Go path -//:: ExpectedOutput(not_found_error) +//:: ExpectedOutput(parser_error) import . "lib/mathn" func test() { diff --git a/src/test/resources/regressions/features/import/import2.gobra b/src/test/resources/regressions/features/import/import2.gobra index 33bad9c88..ae7458fc6 100644 --- a/src/test/resources/regressions/features/import/import2.gobra +++ b/src/test/resources/regressions/features/import/import2.gobra @@ -3,7 +3,7 @@ package main -//:: ExpectedOutput(not_found_error) +//:: ExpectedOutput(parser_error) import math "lib/mathm" // wrong package name used on purpose such that this test case does not potentially depend on the configured Go path type cell struct{ diff --git a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala index b5a6fe844..83c4e7747 100644 --- a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala +++ b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala @@ -13,7 +13,7 @@ import viper.gobra.ast.internal.Program import viper.gobra.ast.internal.transform.OverflowChecksTransform import viper.gobra.backend.BackendVerifier import viper.gobra.frontend.PackageResolver.{AbstractPackage, RegularPackage} -import viper.gobra.frontend.Parser.ParseSuccessResult +import viper.gobra.frontend.Parser.{ParseResult, ParseSuccessResult} import viper.gobra.frontend.info.{Info, TypeInfo} import viper.gobra.frontend.{Desugar, Parser} import viper.gobra.reporting.{AppliedInternalTransformsMessage, BackTranslator, VerifierError, VerifierResult} @@ -108,8 +108,8 @@ class DetailedBenchmarkTests extends BenchmarkTests { Parser.parse(c, pkgInfo)(executor) }) - private val typeChecking: NextStep[Map[AbstractPackage, ParseSuccessResult], TypeInfo, Vector[VerifierError]] = - NextStep("type-checking", parsing, (parseResults: Map[AbstractPackage, ParseSuccessResult]) => { + private val typeChecking: NextStep[Map[AbstractPackage, ParseResult], TypeInfo, Vector[VerifierError]] = + NextStep("type-checking", parsing, (parseResults: Map[AbstractPackage, ParseResult]) => { assert(config.isDefined) val c = config.get assert(c.packageInfoInputMap.size == 1) From c00c63691e47e182c4a983667ade94aa912d3346 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 30 Mar 2023 14:02:13 +0200 Subject: [PATCH 124/296] adds a sequential parser --- .../scala/viper/gobra/frontend/Parser.scala | 166 +++++++++++++++--- .../viper/gobra/frontend/TaskManager.scala | 86 ++++++++- .../viper/gobra/frontend/info/Info.scala | 23 ++- 3 files changed, 235 insertions(+), 40 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index c43610564..e33d07124 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -17,8 +17,9 @@ import org.antlr.v4.runtime.{CharStreams, CommonTokenStream, DefaultErrorStrateg import org.antlr.v4.runtime.atn.PredictionMode import org.antlr.v4.runtime.misc.ParseCancellationException import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, PreambleContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} -import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, RegularImport, RegularPackage} +import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, BuiltInPackage, RegularImport, RegularPackage} import viper.gobra.frontend.Parser.ParseSuccessResult +import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential} import viper.gobra.util.GobraExecutionContext import viper.silver.ast.SourcePosition @@ -34,21 +35,120 @@ object Parser { type ParseResult = Either[Vector[ParserError], ParseSuccessResult] class ParseManager(config: Config, executionContext: GobraExecutionContext) extends LazyLogging { - private val manager = new TaskManager[AbstractPackage, Future[ParseResult]](TaskManagerMode.Parallel) + private val manager = new TaskManager[AbstractPackage, ParseResult](Sequential) // we currently do not support the lazy mode + private val parallelManager = new ParallelTaskManager[AbstractPackage, ParseResult] def parse(pkgInfo: PackageInfo): ParseResult = { val pkg = RegularPackage(pkgInfo.id) - val parseJob = ParseInfoJob(pkgInfo) + /* manager.addIfAbsent(pkg, parseJob)(executionContext) // trigger and wait for parsing of at least this package (which will ensure that parse jobs for all dependent packages are created too) Await.result(manager.getResult(pkg), Duration.Inf) + */ + config.typeCheckMode match { + case Lazy | Sequential => + val parseJob = ParseInfoJob(pkgInfo) + manager.addIfAbsent(pkg, parseJob) + manager.getResult(pkg) + case Parallel => + val parseJob = ParallelParseInfoJob(pkgInfo) + val fut = parallelManager.addIfAbsent(pkg, parseJob)(executionContext) + Await.result(fut, Duration.Inf) + } + } + + trait ImportResolver { + def pkgInfo: PackageInfo + + type ImportErrorFactory = String => Vector[ParserError] + // protected def getImports(importNodes: Vector[PImport], pom: PositionManager): Set[(AbstractImport, ImportErrorFactory)] = { + protected def getImports(importNodes: Vector[PImport], pom: PositionManager): Vector[(AbstractPackage, Either[Vector[ParserError], Vector[Source]])] = { + val explicitImports: Vector[(AbstractImport, ImportErrorFactory)] = importNodes + .map(importNode => { + val importErrorFactory: ImportErrorFactory = (errMsg: String) => { + val err = pom.translate(message(importNode, errMsg), ParserError) + // config.reporter report ParserErrorMessage(err.head.position.get.file, err) + err + } + (RegularImport(importNode.importPath), importErrorFactory) + }) + val imports = if (pkgInfo.isBuiltIn) { explicitImports } else { + val builtInImportErrorFactory: ImportErrorFactory = (errMsg: String) => { + val err = Vector(ParserError(errMsg, None)) + config.reporter report ParserErrorMessage(err.head.position.get.file, err) + err + } + val builtInImportTuple = (BuiltInImport, builtInImportErrorFactory) + explicitImports :+ builtInImportTuple + } + + val errsOrSources = imports.map { case (directImportTarget, importErrorFactory) => + val directImportPackage = AbstractPackage(directImportTarget)(config) + val nonEmptyImportedSources = for { + resolveSourceResults <- PackageResolver.resolveSources(directImportTarget)(config) + importedSources = resolveSourceResults.map(_.source) + nonEmptyImportedSources <- if (importedSources.isEmpty) Left(s"No source files for package '$directImportTarget' found") else Right(importedSources) + } yield nonEmptyImportedSources + val res = nonEmptyImportedSources.left.map(importErrorFactory) + (directImportPackage, res) + } + errsOrSources + /* + val (errors, sources) = errsOrSources.partitionMap(identity) + if (errors.nonEmpty) { + Left(errors) + } else { + Right(sources) + } + */ + } + } + + trait ParseJob extends Job[ParseResult] with ImportResolver { + def pkgInfo: PackageInfo + def pkgSources: Vector[Source] + def specOnly: Boolean + + private def getImportsForPackage(p: PPackage): Vector[(AbstractPackage, Either[Vector[ParserError], Vector[Source]])] = { + getImports(p.imports, p.positions) + } + + override def compute(): ParseResult = { + require(pkgSources.nonEmpty) + + val startMs = System.currentTimeMillis() + val preprocessedSources = preprocess(pkgSources)(config) + + for { + parsedProgram <- Parser.process(preprocessedSources, pkgInfo, specOnly = specOnly)(config) + imports = getImportsForPackage(parsedProgram) + _ = imports.map { + case (directImportPackage, Right(nonEmptySources)) => manager.addIfAbsent(directImportPackage, ParseSourcesJob(nonEmptySources, directImportPackage)) + case (directImportPackage, Left(errs)) => manager.addIfAbsent(directImportPackage, ParseFailureJob(errs)) + } + postprocessedProgram <- Parser.postprocess(Right((preprocessedSources, parsedProgram)), specOnly = specOnly)(config) + _ = logger.trace { + val parsingDurationMs = System.currentTimeMillis() - startMs + val parsingDurationS = f"${parsingDurationMs / 1000f}%.1f" + s"parsing ${pkgInfo.id} done (took ${parsingDurationS}s)" + } + } yield postprocessedProgram + } } - trait ParseJob extends Job[Future[ParseResult]] { + trait ParallelParseJob extends ParallelJob[ParseResult] with ImportResolver { def pkgInfo: PackageInfo def pkgSources: Vector[Source] def specOnly: Boolean + private def getImportsForPackage(preprocessedSources: Vector[Source]): Vector[(AbstractPackage, Either[Vector[ParserError], Vector[Source]])] = { + val preambles = preprocessedSources + .map(preprocessedSource => processPreamble(preprocessedSource)(config)) + // we ignore imports in files that cannot be parsed: + .collect { case Right(p) => p } + preambles.flatMap(preamble => getImports(preamble.imports, preamble.positions)) + } + override def compute(): Future[ParseResult] = { require(pkgSources.nonEmpty) @@ -56,8 +156,10 @@ object Parser { val startPreambleParsingMs = System.currentTimeMillis() // before parsing, get imports and add these parse jobs - val imports = fastParse(preprocessedSources) + // val imports = fastParse(preprocessedSources) + val imports = getImportsForPackage(preprocessedSources) val preambleParsingDurationMs = System.currentTimeMillis() - startPreambleParsingMs + /* val importResults: Set[Either[Vector[ParserError], Future[_]]] = imports.map { case (directImportTarget, importErrorFactory) => // val importResults: Set[Future[ParseResult]] = imports.map { case (directImportTarget, importErrorFactory) => val directImportPackage = AbstractPackage(directImportTarget)(config) @@ -69,21 +171,22 @@ object Parser { nonEmptyImportedSources.fold( errMsg => { val errs = importErrorFactory(errMsg) - manager.addIfAbsent(directImportPackage, ParseFailureJob(errs))(executionContext) + parallelManager.addIfAbsent(directImportPackage, ParseFailureJob(errs))(executionContext) Left(errs) }, nonEmptySources => { - manager.addIfAbsent(directImportPackage, ParseSourcesJob(nonEmptySources, directImportPackage))(executionContext) - Right(manager.getFuture(directImportPackage)) - /* + // manager.addIfAbsent(directImportPackage, ParseSourcesJob(nonEmptySources, directImportPackage))(executionContext) + // Right(manager.getFuture(directImportPackage)) + Right(parallelManager.addIfAbsent(directImportPackage, ParseSourcesJob(nonEmptySources, directImportPackage))(executionContext)) + *//* manager.getFuture(directImportPackage).flatten .map { case Left(_) => Left(importErrorFactory(s"Imported package contains errors")) case success => success }(executionContext) - */ + *//* }) - /* + *//* val importedSources = PackageResolver.resolveSources(directImportTarget)(config) .getOrElse(Vector()) .map(_.source) @@ -99,11 +202,18 @@ object Parser { case success => success }(executionContext) } - */ + *//* + } + */ + val importResults: Vector[Either[Vector[ParserError], Future[_]]] = imports.map { + case (directImportPackage, Right(nonEmptySources)) => Right(parallelManager.addIfAbsent(directImportPackage, ParallelParseSourcesJob(nonEmptySources, directImportPackage))(executionContext)) + case (directImportPackage, Left(errs)) => + parallelManager.addIfAbsent(directImportPackage, ParallelParseFailureJob(errs))(executionContext) + Left(errs) } val (importFailures, futs) = importResults.partitionMap(identity) - val flatImportFailures = importFailures.toVector.flatten + val flatImportFailures = importFailures.flatten val res: ParseResult = for { _ <- if (flatImportFailures.isEmpty) Right(()) else Left(flatImportFailures) @@ -158,7 +268,7 @@ object Parser { Future.sequence(futs) .map(_ => res) } - + /* type ImportErrorFactory = String => Vector[ParserError] private def fastParse(preprocessedInput: Vector[Source]): Set[(AbstractImport, ImportErrorFactory)] = { def getImportPaths(preprocessedSource: Source): Set[(RegularImport, ImportErrorFactory)] = { @@ -191,7 +301,7 @@ object Parser { val builtInImportTuple = (BuiltInImport, builtInImportErrorFactory) explicitImports + builtInImportTuple } - } + }*/ } /** this job is used to parse the package that should be verified */ @@ -199,6 +309,10 @@ object Parser { lazy val pkgSources: Vector[Source] = config.packageInfoInputMap(pkgInfo) lazy val specOnly: Boolean = false } + case class ParallelParseInfoJob(override val pkgInfo: PackageInfo) extends ParallelParseJob { + lazy val pkgSources: Vector[Source] = config.packageInfoInputMap(pkgInfo) + lazy val specOnly: Boolean = false + } /** this job is used to parse all packages that are imported */ case class ParseSourcesJob(override val pkgSources: Vector[Source], pkg: AbstractPackage) extends ParseJob { @@ -206,11 +320,20 @@ object Parser { lazy val pkgInfo: PackageInfo = Source.getPackageInfo(pkgSources.head, config.projectRoot) lazy val specOnly: Boolean = true } + case class ParallelParseSourcesJob(override val pkgSources: Vector[Source], pkg: AbstractPackage) extends ParallelParseJob { + require(pkgSources.nonEmpty) + lazy val pkgInfo: PackageInfo = Source.getPackageInfo(pkgSources.head, config.projectRoot) + lazy val specOnly: Boolean = true + } - case class ParseFailureJob(errs: Vector[ParserError]) extends Job[Future[ParseResult]] { + case class ParseFailureJob(errs: Vector[ParserError]) extends Job[ParseResult] { + override def compute(): ParseResult = Left(errs) + } + case class ParallelParseFailureJob(errs: Vector[ParserError]) extends ParallelJob[ParseResult] { override def compute(): Future[ParseResult] = Future.successful[ParseResult](Left(errs)) } + /* def getParseResults(executionContext: GobraExecutionContext): Either[Map[AbstractPackage, Vector[VerifierError]], Map[AbstractPackage, ParseSuccessResult]] = { implicit val executor: GobraExecutionContext = executionContext // val futs = manager.getAllResultsWithKeys(executionContext).map { case (key, fut) => fut.map(res => (key, res)) } @@ -230,13 +353,10 @@ object Parser { .collect { case (key, Right(res)) => (key, res) } .toMap } - - def getResults(executionContext: GobraExecutionContext): Map[AbstractPackage, ParseResult] = { - implicit val executor: GobraExecutionContext = executionContext - val futs = manager.getAllFutures.map { case (key, fut) => fut.flatten.map(res => (key, res)) } - val results = Await.result(Future.sequence(futs), Duration.Inf) - results - .toMap + */ + def getResults(executionContext: GobraExecutionContext): Map[AbstractPackage, ParseResult] = config.typeCheckMode match { + case Lazy | Sequential => manager.getAllResultsWithKeys.toMap + case Parallel => parallelManager.getAllResultsWithKeys(executionContext).toMap } } diff --git a/src/main/scala/viper/gobra/frontend/TaskManager.scala b/src/main/scala/viper/gobra/frontend/TaskManager.scala index 83513472a..f3f93f963 100644 --- a/src/main/scala/viper/gobra/frontend/TaskManager.scala +++ b/src/main/scala/viper/gobra/frontend/TaskManager.scala @@ -48,13 +48,49 @@ trait Job[R] { } } +trait ParallelJob[R] { + /* + protected def compute(): Future[R] + private var compututationStarted: Option[Future[R]] = None + def call(): Future[R] = { + compututationStarted.getOrElse { + val fut = compute() + compututationStarted = Some(fut) + fut + } + } + */ + + private var compututationStarted = false + private val promise: Promise[R] = Promise() + def getFuture: Future[R] = promise.future + protected def compute(): Future[R] + + def call(executionContext: GobraExecutionContext): Future[R] = { + getFuture.value match { + case Some(Success(res)) => return Future.successful(res) // return already computed type-checker result + case Some(Failure(exception)) => Violation.violation(s"Job resulted in exception: $exception") + case _ => + } + Violation.violation(!compututationStarted, s"Job $this is already on-going") + compututationStarted = true + compute() + .map(res => { + promise.success(res) + res + })(executionContext) + } +} + class TaskManager[K, R](mode: TaskManagerMode) { + require(mode != Parallel) + private val jobs: ConcurrentMap[K, Job[R]] = new ConcurrentHashMap() /** * returns true if job has been inserted and thus was previously absent */ - def addIfAbsent(id: K, job: Job[R], insertOnly: Boolean = false)(executionContext: GobraExecutionContext): Boolean = { + def addIfAbsent(id: K, job: Job[R], insertOnly: Boolean = false): Unit = { var isAbsent = false // first insert job, then run it (if necessary) jobs.computeIfAbsent(id, _ => { @@ -66,12 +102,10 @@ class TaskManager[K, R](mode: TaskManagerMode) { mode match { case Lazy => // don't do anything as of now case Sequential => job.call() - case Parallel => Future{ job.call() }(executionContext) } } - isAbsent } - + /* def getFuture(id: K): Future[R] = { val job = jobs.get(id) Violation.violation(job != null, s"Task $id not found") @@ -80,13 +114,13 @@ class TaskManager[K, R](mode: TaskManagerMode) { def getAllFutures: Iterable[(K, Future[R])] = jobs.asScala.toVector.map { case (key, job) => (key, job.getFuture) } - + */ def getResult(id: K): R = { val job = jobs.get(id) Violation.violation(job != null, s"Task $id not found") getResultFromJob(job) } - + /* def getAllResults(executionContext: GobraExecutionContext): Iterable[R] = mode match { case Lazy | Sequential => jobs.values().asScala.map(getResultFromJob) case Parallel => @@ -94,7 +128,10 @@ class TaskManager[K, R](mode: TaskManagerMode) { implicit val executor: GobraExecutionContext = executionContext Await.result(Future.sequence(futs), Duration.Inf) } - + */ + def getAllResults: Iterable[R] = + jobs.values().asScala.map(getResultFromJob) + /* def getAllResultsWithKeys(executionContext: GobraExecutionContext): Iterable[(K, R)] = mode match { case Lazy | Sequential => jobs.asScala.toVector.map { case (key, job) => (key, getResultFromJob(job)) } case Parallel => @@ -102,6 +139,9 @@ class TaskManager[K, R](mode: TaskManagerMode) { val futs = jobs.asScala.toVector.map { case (key, job) => job.getFuture.map(res => (key, res)) } Await.result(Future.sequence(futs), Duration.Inf) } + */ + def getAllResultsWithKeys: Iterable[(K, R)] = + jobs.asScala.toVector.map { case (key, job) => (key, getResultFromJob(job)) } private def getResultFromJob(job: Job[R]): R = mode match { case Lazy => job.call() // we perform the computation now that we need the result @@ -109,8 +149,36 @@ class TaskManager[K, R](mode: TaskManagerMode) { // note that we cannot await the future here as type-checking of this package might not have started yet. // Thus, we use `.call()` that either returns a previously calculated type-checking result or will calculate it. job.call() - case Parallel => - Await.result(job.getFuture, Duration.Inf) + // case Parallel => + // Await.result(job.getFuture, Duration.Inf) + } +} + +class ParallelTaskManager[K, R] { + private val jobs: ConcurrentMap[K, ParallelJob[R]] = new ConcurrentHashMap() + + /** + * returns true if job has been inserted and thus was previously absent + */ + def addIfAbsent(id: K, job: ParallelJob[R], insertOnly: Boolean = false)(executionContext: GobraExecutionContext): Future[R] = { + var isAbsent = false + // first insert job, then run it (if necessary) + val res = jobs.computeIfAbsent(id, _ => { + isAbsent = true + job + }) + // now run it but only if it's a new job: + if (isAbsent && !insertOnly) { + job.call(executionContext) + } + // return the future (either of the inserted job or the already existing job with the same id) + res.getFuture + } + + def getAllResultsWithKeys(executionContext: GobraExecutionContext): Iterable[(K, R)] = { + implicit val executor: GobraExecutionContext = executionContext + val futs = jobs.asScala.toVector.map { case (key, job) => job.getFuture.map(res => (key, res)) } + Await.result(Future.sequence(futs), Duration.Inf) } } diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 7512fee8b..404c05d05 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -11,7 +11,7 @@ import org.bitbucket.inkytonik.kiama.relation.Tree import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, message} import org.bitbucket.inkytonik.kiama.util.{Position, Source} import viper.gobra.ast.frontend.{PImport, PNode, PPackage} -import viper.gobra.frontend.{Config, Job, TaskManager} +import viper.gobra.frontend.{Config, Job, ParallelJob, ParallelTaskManager, TaskManager} import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, BuiltInPackage, RegularImport} import viper.gobra.frontend.Parser.{ParseResult, ParseSuccessResult} import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential} @@ -168,8 +168,8 @@ object Info extends LazyLogging { * Therefore, package management is centralized. */ class Context(val config: Config, val parseResults: Map[AbstractPackage, ParseSuccessResult])(val executionContext: GobraExecutionContext) extends GetParseResult { - private val typeCheckManager = new TaskManager[AbstractPackage, TypeCheckResult](config.typeCheckMode) - private val parallelTypeCheckManager = new TaskManager[AbstractPackage, Future[TypeCheckResult]](config.typeCheckMode) + private val typeCheckManager = new TaskManager[AbstractPackage, TypeCheckResult](if (config.typeCheckMode == Parallel) Sequential else config.typeCheckMode) + private val parallelTypeCheckManager = new ParallelTaskManager[AbstractPackage, TypeCheckResult]() trait TypeCheckJob { protected def typeCheck(pkgSources: Vector[Source], pkg: PPackage, dependentTypeInfo: DependentTypeInfo, isMainContext: Boolean = false): TypeCheckResult = { @@ -216,7 +216,7 @@ object Info extends LazyLogging { val dependentPackage = AbstractPackage(importTarget)(config) // add to manager & typecheck them if not present yet val job = SequentialTypeCheckJob(dependentPackage) - typeCheckManager.addIfAbsent(dependentPackage, job)(executionContext) + typeCheckManager.addIfAbsent(dependentPackage, job) (importTarget, () => typeCheckManager.getResult(dependentPackage)) }) @@ -224,7 +224,8 @@ object Info extends LazyLogging { } } - case class ParallelTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[Future[TypeCheckResult]] with TypeCheckJob { + // case class ParallelTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[Future[TypeCheckResult]] with TypeCheckJob { + case class ParallelTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends ParallelJob[TypeCheckResult] with TypeCheckJob { override def toString: String = s"ParallelTypeCheckJob for $abstractPackage" override def compute(): Future[TypeCheckResult] = { @@ -239,8 +240,11 @@ object Info extends LazyLogging { // add to manager & typecheck them if not present yet val job = ParallelTypeCheckJob(dependentPackage) parallelTypeCheckManager.addIfAbsent(dependentPackage, job)(executionContext) + .map(typeInfo => (importTarget, () => typeInfo))(executionContext) + /* parallelTypeCheckManager.getFuture(dependentPackage).flatten .map(typeInfo => (importTarget, () => typeInfo))(executionContext) + */ }) implicit val executor: GobraExecutionContext = executionContext val dependentJobsFut = Future.sequence(dependentJobsFuts) @@ -259,12 +263,15 @@ object Info extends LazyLogging { lazyTypeCheckRecursively(pkg, isMainContext = true) typeCheckManager.getResult(pkg) case Sequential => - typeCheckManager.addIfAbsent(pkg, SequentialTypeCheckJob(pkg, isMainContext = true))(executionContext) + typeCheckManager.addIfAbsent(pkg, SequentialTypeCheckJob(pkg, isMainContext = true)) typeCheckManager.getResult(pkg) case Parallel => + /* parallelTypeCheckManager.addIfAbsent(pkg, ParallelTypeCheckJob(pkg, isMainContext = true))(executionContext) // wait for result: val fut = parallelTypeCheckManager.getResult(pkg) + */ + val fut = parallelTypeCheckManager.addIfAbsent(pkg, ParallelTypeCheckJob(pkg, isMainContext = true))(executionContext) Await.result(fut, Duration.Inf) } } @@ -281,9 +288,9 @@ object Info extends LazyLogging { val dependentPackages = allImports(abstractPackage) + BuiltInPackage // create jobs for all dependent packages - dependentPackages.foreach(pkg => typeCheckManager.addIfAbsent(pkg, LazyTypeCheckJob(pkg))(executionContext)) + dependentPackages.foreach(pkg => typeCheckManager.addIfAbsent(pkg, LazyTypeCheckJob(pkg))) // create job for this package: - typeCheckManager.addIfAbsent(abstractPackage, LazyTypeCheckJob(abstractPackage, isMainContext = isMainContext))(executionContext) + typeCheckManager.addIfAbsent(abstractPackage, LazyTypeCheckJob(abstractPackage, isMainContext = isMainContext)) } /* def getContexts: Iterable[ExternalTypeInfo] = { From 686b53d2b58906ba038fba20bb3646e05d39f352 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 14 Mar 2023 11:23:54 +0100 Subject: [PATCH 125/296] Parses all inputs to 'GobraTests' in parallel before actually starting the unit tests --- .../scala/viper/gobra/frontend/Parser.scala | 12 +++++++ src/test/scala/viper/gobra/GobraTests.scala | 32 ++++++++++++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index e33d07124..9a68e6693 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -57,6 +57,18 @@ object Parser { } } + /** this is only used for unit testing to fill the parse cache */ + def parseAll(pkgInfos: Vector[PackageInfo]): Map[PackageInfo, ParseResult] = { + val createdFuts = pkgInfos.map(pkgInfo => { + val pkg = RegularPackage(pkgInfo.id) + val parseJob = ParallelParseInfoJob(pkgInfo) + parallelManager.addIfAbsent(pkg, parseJob)(executionContext) + .map(res => (pkgInfo, res))(executionContext) + }) + implicit val executor: GobraExecutionContext = executionContext + Await.result(Future.sequence(createdFuts), Duration.Inf).toMap + } + trait ImportResolver { def pkgInfo: PackageInfo diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index efa898916..719ac1b9d 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -8,9 +8,11 @@ package viper.gobra import java.nio.file.Path import ch.qos.logback.classic.Level -import org.scalatest.BeforeAndAfterAll +import org.bitbucket.inkytonik.kiama.util.Source +import org.scalatest.{Args, BeforeAndAfterAll, Status} +import viper.gobra.frontend.Parser.ParseManager import viper.gobra.frontend.Source.FromFileSource -import viper.gobra.frontend.{Config, PackageResolver, Source} +import viper.gobra.frontend.{Config, PackageInfo, PackageResolver, Source} import viper.gobra.reporting.VerifierResult.{Failure, Success} import viper.gobra.reporting.{NoopReporter, VerifierError} import viper.silver.testing.{AbstractOutput, AnnotatedTestInput, ProjectInfo, SystemUnderTest} @@ -30,12 +32,30 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { var gobraInstance: Gobra = _ var executor: GobraExecutionContext = _ + var inputMapping: Vector[(PackageInfo, Vector[Source])] = Vector.empty + val cacheParser = true override def beforeAll(): Unit = { executor = new DefaultGobraExecutionContext() gobraInstance = new Gobra() } + override def registerTest(input: AnnotatedTestInput): Unit = { + super.registerTest(input) + val source = FromFileSource(input.file) + inputMapping = inputMapping :+ (Source.getPackageInfo(source, Path.of("")) -> Vector(source)) + } + + override def runTests(testName: Option[String], args: Args): Status = { + val inputMap = inputMapping.toMap + if (cacheParser) { + val config = Config(packageInfoInputMap = inputMap, cacheParser = true) + val parseManager = new ParseManager(config, executor) + parseManager.parseAll(inputMap.keys.toVector) + } + super.runTests(testName, args) + } + override def afterAll(): Unit = { executor.terminateAndAssertInexistanceOfTimeout() gobraInstance = null @@ -48,16 +68,18 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { override def run(input: AnnotatedTestInput): Seq[AbstractOutput] = { - val source = FromFileSource(input.file) val config = Config( logLevel = Level.INFO, reporter = NoopReporter, - packageInfoInputMap = Map(Source.getPackageInfo(source, Path.of("")) -> Vector(source)), + packageInfoInputMap = inputMapping.toMap, checkConsistency = true, + cacheParser = cacheParser, z3Exe = z3Exe ) - val (result, elapsedMilis) = time(() => Await.result(gobraInstance.verify(config.packageInfoInputMap.keys.head, config)(executor), Duration.Inf)) + val source = FromFileSource(input.file) + val pkgInfo = Source.getPackageInfo(source, Path.of("")) + val (result, elapsedMilis) = time(() => Await.result(gobraInstance.verify(pkgInfo, config)(executor), Duration.Inf)) info(s"Time required: $elapsedMilis ms") From e0b4844d2c1f3f98c89885d15901054f9bd623cc Mon Sep 17 00:00:00 2001 From: Nicolas Klose Date: Thu, 6 Apr 2023 13:09:50 +0200 Subject: [PATCH 126/296] Update README.md Co-authored-by: Linard Arquint --- README.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 45e1c5298..2d7f4ce32 100644 --- a/README.md +++ b/README.md @@ -53,11 +53,19 @@ are two workarounds: sbt normally. However, for unknown reasons, this causes issues with class resolution in the Viper backend, so actually only the parsing can really be debugged. - Attach the debugger to the forked JVM. - Run `set javaOptions += "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"` - in sbt (use any port you like, just make sure to use the same one in the debugger). Now, the forked JVM can be - debugged - instead of the sbt JVM. This requires starting the debugger again every time a new VM is created, e.g. for - every `run`. + - Create a debug configuration in IntelliJ and specify to `Attach to remote JVM`, set `localhost` as host, and + a port (e.g. 5005). + - Run `set javaOptions += "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"` + in sbt (use any port you like, just make sure to use the same one in the debugger). Now, the forked JVM can be + debugged instead of the sbt JVM. This requires starting the debugger again every time a new VM is created, + e.g. for every `run`. +- Let the debugger listen to the forked JVM. + - Create a debug configuration in IntelliJ and specify to `Listen to remote JVM`, enable auto restart, set + `localhost` as host, and a port (e.g. 5005). + - Run `set javaOptions += "-agentlib:jdwp=transport=dt_socket,server=n,address=localhost:5005,suspend=y"` in sbt. + Thanks to auto restart, the debugger keeps listening even when the JVM is restarted, e.g. for every `run`. + Note however that the debugger must be running/listening as otherwise the JVM will emit a connection + refused error. ## Licensing Most Gobra sources are licensed under the Mozilla Public License Version 2.0. From ce668a9721075d7a3676c8c415c7feabb8534865 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Wed, 12 Apr 2023 18:54:40 +0200 Subject: [PATCH 127/296] Updates submodules (#644) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 8ab7defa2..382dcb9f5 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 8ab7defa210e8df3aab962e7849966ab728a4863 +Subproject commit 382dcb9f5589b986ea8af392385aad809c9f74e1 From 9d15151c3aa2c001be158aa3c64666ed56e0de9c Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Wed, 19 Apr 2023 15:07:54 +0200 Subject: [PATCH 128/296] Updates submodules (#647) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 382dcb9f5..2091da1b6 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 382dcb9f5589b986ea8af392385aad809c9f74e1 +Subproject commit 2091da1b66e0ede0692493ccb49f08d619622586 From f4babde357501183d6417130d80b26c02dd0b5a4 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Fri, 5 May 2023 18:38:26 +0200 Subject: [PATCH 129/296] Updates submodules (#648) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 2091da1b6..830c5fb98 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 2091da1b66e0ede0692493ccb49f08d619622586 +Subproject commit 830c5fb986992b5bae718acec1fe2209fc9e7090 From c0e1c408b582105153460f776aa67f038b33e9a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Thu, 11 May 2023 19:50:47 +0200 Subject: [PATCH 130/296] Update tutorial.md (#603) --- docs/tutorial.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorial.md b/docs/tutorial.md index cace56515..d09f6bcf5 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -401,7 +401,7 @@ pure func toSeq(s []int) (res seq[int]) { Gobra supports many of Go's native types, namely integers (`int`, `int8`, `int16`, `int32`, `int64`, `byte`, `uint8`, `rune`, `uint16`, `uint32`, `uint64`, `uintptr`), strings, structs, pointers, arrays, slices, interfaces, and channels. Note that currently the support for strings and specific types of integers such as `rune` is very limited. -In addition, Gobra introduces additional ghost types for specification purposes. These are sequences (`seq[T]`), sets (`set[T]`), multisets (`mset[T]`), and permission amounts (`perm`). Gobra supports their common operations: sequence concatenation (`seq1 ++ seq2`), set union (`set1 union set2`), membership (`x in set1`), multiplicity (`x # set1`), sequence length (`len(seq1)`), and set cardinality (`|set1|`). +In addition, Gobra introduces additional ghost types for specification purposes. These are sequences (`seq[T]`), sets (`set[T]`), multisets (`mset[T]`), and permission amounts (`perm`). Gobra supports their common operations: sequence concatenation (`seq1 ++ seq2`), set union (`set1 union set2`), membership (`x in set1`), multiplicity (`x # set1`), sequence length (`len(seq1)`), and set cardinality (`len(set1)`). ## Interfaces @@ -680,4 +680,4 @@ java -Xss128m -jar gobra.jar -i [FILES_TO_VERIFY] To check the full list of flags available in Gobra, run the command ```bash java -jar gobra.jar -h -``` \ No newline at end of file +``` From 3ce34f3d02a84a227561e24b5909350aa8a3aac5 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Fri, 12 May 2023 16:59:46 +0200 Subject: [PATCH 131/296] Updates submodules (#650) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 830c5fb98..83881c346 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 830c5fb986992b5bae718acec1fe2209fc9e7090 +Subproject commit 83881c346240e8eab6d43d9794d774aace8db062 From 178f9852bb9f42bd0d3fefbd819cc06f50aee9d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Sun, 14 May 2023 17:35:44 +0200 Subject: [PATCH 132/296] Fix issue 651 (#652) * Add bug witness * Add fix * Reflect that the order of fields matter in the signature of AdtClauseT * use more general type --- .../viper/gobra/frontend/info/base/Type.scala | 4 +-- .../implementation/typing/ExprTyping.scala | 4 ++- .../info/implementation/typing/IdTyping.scala | 4 ++- .../implementation/typing/TypeTyping.scala | 2 +- .../typing/ghost/GhostIdTyping.scala | 3 ++- .../resources/regressions/issues/000651.gobra | 25 +++++++++++++++++++ 6 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/regressions/issues/000651.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala index c0eb1bdf1..4e600a0fd 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -13,7 +13,7 @@ import viper.gobra.frontend.info.ExternalTypeInfo import viper.gobra.util.TypeBounds import scala.annotation.tailrec -import scala.collection.immutable.ListMap +import scala.collection.immutable.{ListMap, SeqMap} object Type { @@ -58,7 +58,7 @@ object Type { case class AdtT(decl: PAdtType, context: ExternalTypeInfo) extends Type - case class AdtClauseT(fields: Map[String, Type], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends Type + case class AdtClauseT(fields: SeqMap[String, Type], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends Type case class MapT(key: Type, elem: Type) extends PrettyType(s"map[$key]$elem") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 979af8e2e..902d34a80 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -14,6 +14,8 @@ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.TypeBounds.{BoundedIntegerKind, UnboundedInteger} import viper.gobra.util.{Constants, TypeBounds, Violation} +import scala.collection.immutable.ListMap + trait ExprTyping extends BaseTyping { this: TypeInfoImpl => import viper.gobra.util.Violation._ @@ -145,7 +147,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(p: ap.DomainFunction) => FunctionT(p.symb.args map p.symb.context.typ, p.symb.context.typ(p.symb.result)) case Some(p: ap.AdtClause) => - val fields = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)).toMap + val fields = ListMap.from(p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ))) AdtClauseT(fields, p.symb.decl, p.symb.adtDecl, this) case Some(p: ap.AdtField) => p.symb match { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala index 0f1b234fd..492d515f8 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala @@ -14,6 +14,8 @@ import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.property.{AssignMode, StrictAssignMode} +import scala.collection.immutable.ListMap + trait IdTyping extends BaseTyping { this: TypeInfoImpl => import viper.gobra.util.Violation._ @@ -157,7 +159,7 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => // ADT clause is special since it is a type with a name that is not a named type case a: AdtClause => - val types = a.fields.map(f => f.id.name -> a.context.symbType(f.typ)).toMap + val types = ListMap.from(a.fields.map(f => f.id.name -> a.context.symbType(f.typ))) AdtClauseT(types, a.decl, a.adtDecl, this) case BuiltInType(tag, _, _) => tag.typ diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index 15f131f3c..b5eeb6518 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -155,7 +155,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => // ADT clause is special since it is a type with a name that is not a named type case Some(p: ap.AdtClause) => - val types = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)).toMap + val types = ListMap.from(p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ))) AdtClauseT(types, p.symb.decl, p.symb.adtDecl, p.symb.context) case _ => violation(s"expected type, but got $n") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala index 5e2d996ac..b2688de4d 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala @@ -14,6 +14,7 @@ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.Violation.violation import scala.annotation.unused +import scala.collection.immutable.ListMap trait GhostIdTyping { this: TypeInfoImpl => @@ -42,7 +43,7 @@ trait GhostIdTyping { this: TypeInfoImpl => case AdtClause(decl, adtDecl, context) => AdtClauseT( - decl.args.flatMap(_.fields).map(f => f.id.name -> context.symbType(f.typ)).toMap, + ListMap.from(decl.args.flatMap(_.fields).map(f => f.id.name -> context.symbType(f.typ))), decl, adtDecl, context diff --git a/src/test/resources/regressions/issues/000651.gobra b/src/test/resources/regressions/issues/000651.gobra new file mode 100644 index 000000000..d199f9546 --- /dev/null +++ b/src/test/resources/regressions/issues/000651.gobra @@ -0,0 +1,25 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package test + +type A adt { + A_ { + a uint + b set[int] + c bool + d bool + e seq[int] + } +} + +ghost +decreases +pure func f(x A) A { + return A_ { + a: x.a, + b: x.b, + c: x.c, + d: x.d, + e: x.e} +} \ No newline at end of file From 5aeb8bf72e5618cc6dadfdd08aefd6f42d0f6c8c Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Tue, 16 May 2023 12:02:56 +0200 Subject: [PATCH 133/296] Updates submodules (#653) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 83881c346..bccf9e5f5 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 83881c346240e8eab6d43d9794d774aace8db062 +Subproject commit bccf9e5f5006ab1120da304917f24d6ae4b9f893 From 5aa73b1700cd2ef713c9b62b34a53fdfbda49b5d Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Fri, 19 May 2023 15:45:09 +0200 Subject: [PATCH 134/296] Updates submodules (#654) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index bccf9e5f5..7bc6d0da0 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit bccf9e5f5006ab1120da304917f24d6ae4b9f893 +Subproject commit 7bc6d0da082e89f2d3defd7f0a20b33f12dd2c26 From ed3aaf4427da04fd26fd06718958102d90176124 Mon Sep 17 00:00:00 2001 From: Felix Wolf <60103963+Felalolf@users.noreply.github.com> Date: Wed, 31 May 2023 20:13:16 +0200 Subject: [PATCH 135/296] Fix #655 (#656) * Fix #655 * fixed reintroduced bug --- .../scala/viper/gobra/frontend/Desugar.scala | 2 +- .../viper/gobra/frontend/info/base/Type.scala | 14 ++++++++++++-- .../implementation/property/Assignability.scala | 4 ++-- .../resolution/NameResolution.scala | 7 +++++-- .../info/implementation/typing/ExprTyping.scala | 6 ++---- .../info/implementation/typing/IdTyping.scala | 6 ++---- .../info/implementation/typing/TypeTyping.scala | 4 ++-- .../typing/ghost/GhostIdTyping.scala | 11 +++++------ .../typing/ghost/GhostMiscTyping.scala | 10 ++++------ .../resources/regressions/issues/000655.gobra | 16 ++++++++++++++++ .../regressions/issues/000655/pkg/f.gobra | 14 ++++++++++++++ 11 files changed, 65 insertions(+), 29 deletions(-) create mode 100644 src/test/resources/regressions/issues/000655.gobra create mode 100644 src/test/resources/regressions/issues/000655/pkg/f.gobra diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 0eff086cd..a87ad2d99 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -3736,7 +3736,7 @@ object Desugar { case t: Type.AdtClauseT => val tAdt = Type.AdtT(t.adtT, t.context) val adt: in.AdtT = in.AdtT(nm.adt(tAdt), addrMod) - val fields: Vector[in.Field] = (t.fields map { case (key: String, typ: Type) => + val fields: Vector[in.Field] = (t.fieldsWithTypes map { case (key: String, typ: Type) => in.Field(nm.adtField(key, tAdt), typeD(typ, Addressability.mathDataStructureElement)(src), true)(src) }).toVector in.AdtClauseT(idName(t.decl.id, t.context.getTypeInfo), adt, fields, addrMod) diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala index 4e600a0fd..5604d4e22 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -13,7 +13,7 @@ import viper.gobra.frontend.info.ExternalTypeInfo import viper.gobra.util.TypeBounds import scala.annotation.tailrec -import scala.collection.immutable.{ListMap, SeqMap} +import scala.collection.immutable.ListMap object Type { @@ -58,7 +58,17 @@ object Type { case class AdtT(decl: PAdtType, context: ExternalTypeInfo) extends Type - case class AdtClauseT(fields: SeqMap[String, Type], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends Type + case class AdtClauseT(fieldsToTypes: Map[String, Type], fields: Vector[String], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends Type { + require(fields.forall(fieldsToTypes.isDefinedAt), "there must be a type for each key") + + def typeAt(idx: Int): Type = { + require(0 <= idx && idx < fields.size, s"index $idx is not within range of ADT fields (size ${fields.size})") + fieldsToTypes(fields(idx)) + } + + lazy val fieldsWithTypes: Vector[(String, Type)] = fields.map(f => (f, fieldsToTypes(f))) + lazy val fieldTypes: Vector[Type] = fieldsWithTypes.map(_._2) + } case class MapT(key: Type, elem: Type) extends PrettyType(s"map[$key]$elem") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index 4c0bd33fb..e79d3a9d3 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala @@ -184,7 +184,7 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => if (elems.isEmpty) { successProp } else if (elems.exists(_.key.nonEmpty)) { - val tmap: Map[String, Type] = a.fields + val tmap: Map[String, Type] = a.fieldsToTypes failedProp("for adt literals either all or none elements must be keyed", !elems.forall(_.key.nonEmpty)) and @@ -198,7 +198,7 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => }) } else if (elems.size == a.fields.size) { propForall( - elems.map(_.exp).zip(a.fields.values), + elems.map(_.exp).zip(a.fieldTypes), compositeValAssignableTo ) } else { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index b9b9da4db..7925531d6 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -94,9 +94,12 @@ trait NameResolution { case tree.parent.pair(decl: PAdtClause, adtDecl: PAdtType) => AdtClause(decl, adtDecl, this) - case tree.parent.pair(decl: PMatchBindVar, adt: PMatchAdt) => MatchVariable(decl, adt, this) case tree.parent.pair(decl: PMatchBindVar, tree.parent.pair(_: PMatchStmtCase, matchE: PMatchStatement)) => - MatchVariable(decl, matchE.exp, this) + MatchVariable(decl, matchE.exp, this) // match full expression of match statement + case tree.parent.pair(decl: PMatchBindVar, tree.parent.pair(_: PMatchExpCase, matchE: PMatchExp)) => + MatchVariable(decl, matchE.exp, this) // match full expression of match expression + case tree.parent.pair(decl: PMatchBindVar, adt: PMatchAdt) => + MatchVariable(decl, adt, this) // match part of subexpression case c => Violation.violation(s"This case should be unreachable, but got $c") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 902d34a80..40ad6d048 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -14,8 +14,6 @@ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.TypeBounds.{BoundedIntegerKind, UnboundedInteger} import viper.gobra.util.{Constants, TypeBounds, Violation} -import scala.collection.immutable.ListMap - trait ExprTyping extends BaseTyping { this: TypeInfoImpl => import viper.gobra.util.Violation._ @@ -147,8 +145,8 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(p: ap.DomainFunction) => FunctionT(p.symb.args map p.symb.context.typ, p.symb.context.typ(p.symb.result)) case Some(p: ap.AdtClause) => - val fields = ListMap.from(p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ))) - AdtClauseT(fields, p.symb.decl, p.symb.adtDecl, this) + val fields = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)) + AdtClauseT(fields.toMap, fields.map(_._1), p.symb.decl, p.symb.adtDecl, this) case Some(p: ap.AdtField) => p.symb match { case AdtDestructor(decl, _, context) => context.symbType(decl.typ) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala index 492d515f8..c62376ec4 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala @@ -14,8 +14,6 @@ import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.property.{AssignMode, StrictAssignMode} -import scala.collection.immutable.ListMap - trait IdTyping extends BaseTyping { this: TypeInfoImpl => import viper.gobra.util.Violation._ @@ -159,8 +157,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => // ADT clause is special since it is a type with a name that is not a named type case a: AdtClause => - val types = ListMap.from(a.fields.map(f => f.id.name -> a.context.symbType(f.typ))) - AdtClauseT(types, a.decl, a.adtDecl, this) + val fields = a.fields.map(f => f.id.name -> a.context.symbType(f.typ)) + AdtClauseT(fields.toMap, fields.map(_._1), a.decl, a.adtDecl, this) case BuiltInType(tag, _, _) => tag.typ case _ => violation(s"expected type, but got $id") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index b5eeb6518..bbfa0a00f 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -155,8 +155,8 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => // ADT clause is special since it is a type with a name that is not a named type case Some(p: ap.AdtClause) => - val types = ListMap.from(p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ))) - AdtClauseT(types, p.symb.decl, p.symb.adtDecl, p.symb.context) + val fields = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)) + AdtClauseT(fields.toMap, fields.map(_._1), p.symb.decl, p.symb.adtDecl, p.symb.context) case _ => violation(s"expected type, but got $n") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala index b2688de4d..a071b79af 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala @@ -14,7 +14,6 @@ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.Violation.violation import scala.annotation.unused -import scala.collection.immutable.ListMap trait GhostIdTyping { this: TypeInfoImpl => @@ -42,8 +41,10 @@ trait GhostIdTyping { this: TypeInfoImpl => case func: DomainFunction => FunctionT(func.args map func.context.typ, func.context.typ(func.result.outs.head)) case AdtClause(decl, adtDecl, context) => + val fields = decl.args.flatMap(_.fields).map(f => f.id.name -> context.symbType(f.typ)) AdtClauseT( - ListMap.from(decl.args.flatMap(_.fields).map(f => f.id.name -> context.symbType(f.typ))), + fields.toMap, + fields.map(_._1), decl, adtDecl, context @@ -51,10 +52,8 @@ trait GhostIdTyping { this: TypeInfoImpl => case MatchVariable(decl, p, context) => p match { case PMatchAdt(clause, fields) => - val argTypeWithIndex = context.symbType(clause).asInstanceOf[AdtClauseT].decl.args.flatMap(_.fields).map(_.typ).zipWithIndex - val fieldsWithIndex = fields.zipWithIndex - val fieldIndex = fieldsWithIndex.iterator.find(e => e._1 == decl).get._2 - context.symbType(argTypeWithIndex.iterator.find(e => e._2 == fieldIndex).get._1) + val clauseT = context.symbType(clause).asInstanceOf[AdtClauseT] + clauseT.typeAt(fields.indexOf(decl)) case e: PExpression => context.typ(e) case _ => violation("untypeable") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala index 7eff705f7..3ab5e4a53 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala @@ -54,8 +54,8 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case m: PMatchPattern => m match { case PMatchAdt(clause, fields) => symbType(clause) match { case t: AdtClauseT => - val fieldTypes = fields map typ - val clauseFieldTypes = t.decl.args.flatMap(f => f.fields).map(f => symbType(f.typ)) + val fieldTypes = fields.map(typ) + val clauseFieldTypes = t.fieldTypes error(m, s"Expected ${clauseFieldTypes.size} patterns, but got ${fieldTypes.size}", clauseFieldTypes.size != fieldTypes.size) ++ fieldTypes.zip(clauseFieldTypes).flatMap(a => assignableTo.errors(a)(m)) case _ => violation("Pattern matching only works on ADT Literals") @@ -292,10 +292,8 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => w eq _ } val adtClauseT = underlyingType(typeSymbType(c)).asInstanceOf[AdtClauseT] - val flatFields = adtClauseT.decl.args.flatMap(f => f.fields) - if (index < flatFields.size) { - val field = flatFields(index) - typeSymbType(field.typ) + if (index < adtClauseT.fields.size) { + adtClauseT.typeAt(index) } else UnknownType // Error is found when PMatchADT is checked higher up the ADT case tree.parent.pair(_: PMatchExpCase, m: PMatchExp) => exprType(m.exp) diff --git a/src/test/resources/regressions/issues/000655.gobra b/src/test/resources/regressions/issues/000655.gobra new file mode 100644 index 000000000..fcafa8991 --- /dev/null +++ b/src/test/resources/regressions/issues/000655.gobra @@ -0,0 +1,16 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package test + +// ##(-I ./000655/) +import "pkg" + +ghost +pure func foo(x pkg.List) bool { + return match x { + case pkg.Nil{}: true + case pkg.Cons{?head, pkg.Nil{}}: true + case _: false + } +} \ No newline at end of file diff --git a/src/test/resources/regressions/issues/000655/pkg/f.gobra b/src/test/resources/regressions/issues/000655/pkg/f.gobra new file mode 100644 index 000000000..2252d81b9 --- /dev/null +++ b/src/test/resources/regressions/issues/000655/pkg/f.gobra @@ -0,0 +1,14 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type List adt { + Cons { + head int + tail List + } + + Nil {} +} + From 4393ad0cc95b7403d1703aa83906595405fd501b Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Wed, 31 May 2023 20:13:50 +0200 Subject: [PATCH 136/296] Updates submodules (#657) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 7bc6d0da0..ae6a1c153 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 7bc6d0da082e89f2d3defd7f0a20b33f12dd2c26 +Subproject commit ae6a1c153152bdae0005850190b24f0212113474 From 046fe54b0db5cec24c23ab232407720782017580 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 29 Jun 2023 16:43:04 +0200 Subject: [PATCH 137/296] unifies job managers for parsing and type-checking and for the 3 modes --- src/main/scala/viper/gobra/Gobra.scala | 8 +- .../scala/viper/gobra/frontend/Parser.scala | 300 +++--------------- .../viper/gobra/frontend/TaskManager.scala | 170 ++-------- .../viper/gobra/frontend/info/Info.scala | 219 ++++--------- .../viper/gobra/DetailedBenchmarkTests.scala | 6 +- src/test/scala/viper/gobra/GobraTests.scala | 6 +- .../gobra/erasing/GhostErasureUnitTests.scala | 16 +- .../gobra/typing/ExprTypingUnitTests.scala | 16 +- .../gobra/typing/StmtTypingUnitTests.scala | 16 +- .../gobra/typing/TypeTypingUnitTests.scala | 16 +- 10 files changed, 196 insertions(+), 577 deletions(-) diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index b215f88d6..e0596f2ee 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -16,7 +16,7 @@ import viper.gobra.ast.internal.Program import viper.gobra.ast.internal.transform.{CGEdgesTerminationTransform, ConstantPropagation, InternalTransform, OverflowChecksTransform} import viper.gobra.backend.BackendVerifier import viper.gobra.frontend.PackageResolver.{AbstractPackage, RegularPackage} -import viper.gobra.frontend.Parser.{ParseResult, ParseSuccessResult} +import viper.gobra.frontend.Parser.ParseResult import viper.gobra.frontend.info.{Info, TypeInfo} import viper.gobra.frontend.{Config, Desugar, PackageInfo, Parser, ScallopGobraConfig} import viper.gobra.reporting._ @@ -159,7 +159,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { for { finalConfig <- getAndMergeInFileConfig(config, pkgInfo) _ = setLogLevel(finalConfig) - parseResults <- performParsing(finalConfig, pkgInfo)(executor) + parseResults = performParsing(finalConfig, pkgInfo)(executor) typeInfo <- performTypeChecking(finalConfig, pkgInfo, parseResults)(executor) program <- performDesugaring(finalConfig, typeInfo)(executor) program <- performInternalTransformations(finalConfig, pkgInfo, program)(executor) @@ -243,7 +243,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { .setLevel(config.logLevel) } - private def performParsing(config: Config, pkgInfo: PackageInfo)(executor: GobraExecutionContext): Either[Vector[VerifierError], Map[AbstractPackage, ParseResult]] = { + private def performParsing(config: Config, pkgInfo: PackageInfo)(executor: GobraExecutionContext): Map[AbstractPackage, ParseResult] = { if (config.shouldParse) { val startMs = System.currentTimeMillis() val res = Parser.parse(config, pkgInfo)(executor) @@ -253,7 +253,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { } res } else { - Left(Vector()) + Map.empty } } diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 9a68e6693..f7504b8a8 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -17,56 +17,39 @@ import org.antlr.v4.runtime.{CharStreams, CommonTokenStream, DefaultErrorStrateg import org.antlr.v4.runtime.atn.PredictionMode import org.antlr.v4.runtime.misc.ParseCancellationException import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, PreambleContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} -import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, BuiltInPackage, RegularImport, RegularPackage} -import viper.gobra.frontend.Parser.ParseSuccessResult -import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential} +import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, RegularImport, RegularPackage} import viper.gobra.util.GobraExecutionContext import viper.silver.ast.SourcePosition import scala.collection.mutable.ListBuffer import java.security.MessageDigest import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} -import scala.concurrent.duration.Duration -import scala.concurrent.{Await, Future} + object Parser { type ParseSuccessResult = (Vector[Source], PPackage) type ParseResult = Either[Vector[ParserError], ParseSuccessResult] + type PreprocessedSources = Vector[Source] + type ImportToSourceOrErrorMap = Vector[(AbstractPackage, Either[Vector[ParserError], Vector[Source]])] class ParseManager(config: Config, executionContext: GobraExecutionContext) extends LazyLogging { - private val manager = new TaskManager[AbstractPackage, ParseResult](Sequential) // we currently do not support the lazy mode - private val parallelManager = new ParallelTaskManager[AbstractPackage, ParseResult] + private val manager = new TaskManager[AbstractPackage, PreprocessedSources, ParseResult](config.typeCheckMode)(executionContext) - def parse(pkgInfo: PackageInfo): ParseResult = { + def parse(pkgInfo: PackageInfo): Unit = { val pkg = RegularPackage(pkgInfo.id) - /* - manager.addIfAbsent(pkg, parseJob)(executionContext) - // trigger and wait for parsing of at least this package (which will ensure that parse jobs for all dependent packages are created too) - Await.result(manager.getResult(pkg), Duration.Inf) - */ - config.typeCheckMode match { - case Lazy | Sequential => - val parseJob = ParseInfoJob(pkgInfo) - manager.addIfAbsent(pkg, parseJob) - manager.getResult(pkg) - case Parallel => - val parseJob = ParallelParseInfoJob(pkgInfo) - val fut = parallelManager.addIfAbsent(pkg, parseJob)(executionContext) - Await.result(fut, Duration.Inf) - } + val parseJob = ParseInfoJob(pkgInfo) + manager.addIfAbsent(pkg, parseJob) } /** this is only used for unit testing to fill the parse cache */ def parseAll(pkgInfos: Vector[PackageInfo]): Map[PackageInfo, ParseResult] = { - val createdFuts = pkgInfos.map(pkgInfo => { + pkgInfos.foreach(pkgInfo => parse(pkgInfo)) + val results = manager.getAllResultsWithKeys.toMap + pkgInfos.map(pkgInfo => { val pkg = RegularPackage(pkgInfo.id) - val parseJob = ParallelParseInfoJob(pkgInfo) - parallelManager.addIfAbsent(pkg, parseJob)(executionContext) - .map(res => (pkgInfo, res))(executionContext) - }) - implicit val executor: GobraExecutionContext = executionContext - Await.result(Future.sequence(createdFuts), Duration.Inf).toMap + (pkgInfo, results(pkg)) + }).toMap } trait ImportResolver { @@ -116,44 +99,13 @@ object Parser { } } - trait ParseJob extends Job[ParseResult] with ImportResolver { + trait ParseJob extends Job[PreprocessedSources, ParseResult] with ImportResolver { def pkgInfo: PackageInfo def pkgSources: Vector[Source] def specOnly: Boolean + var preambleParsingDurationMs: Long = 0 - private def getImportsForPackage(p: PPackage): Vector[(AbstractPackage, Either[Vector[ParserError], Vector[Source]])] = { - getImports(p.imports, p.positions) - } - - override def compute(): ParseResult = { - require(pkgSources.nonEmpty) - - val startMs = System.currentTimeMillis() - val preprocessedSources = preprocess(pkgSources)(config) - - for { - parsedProgram <- Parser.process(preprocessedSources, pkgInfo, specOnly = specOnly)(config) - imports = getImportsForPackage(parsedProgram) - _ = imports.map { - case (directImportPackage, Right(nonEmptySources)) => manager.addIfAbsent(directImportPackage, ParseSourcesJob(nonEmptySources, directImportPackage)) - case (directImportPackage, Left(errs)) => manager.addIfAbsent(directImportPackage, ParseFailureJob(errs)) - } - postprocessedProgram <- Parser.postprocess(Right((preprocessedSources, parsedProgram)), specOnly = specOnly)(config) - _ = logger.trace { - val parsingDurationMs = System.currentTimeMillis() - startMs - val parsingDurationS = f"${parsingDurationMs / 1000f}%.1f" - s"parsing ${pkgInfo.id} done (took ${parsingDurationS}s)" - } - } yield postprocessedProgram - } - } - - trait ParallelParseJob extends ParallelJob[ParseResult] with ImportResolver { - def pkgInfo: PackageInfo - def pkgSources: Vector[Source] - def specOnly: Boolean - - private def getImportsForPackage(preprocessedSources: Vector[Source]): Vector[(AbstractPackage, Either[Vector[ParserError], Vector[Source]])] = { + private def getImportsForPackage(preprocessedSources: Vector[Source]): ImportToSourceOrErrorMap = { val preambles = preprocessedSources .map(preprocessedSource => processPreamble(preprocessedSource)(config)) // we ignore imports in files that cannot be parsed: @@ -161,75 +113,28 @@ object Parser { preambles.flatMap(preamble => getImports(preamble.imports, preamble.positions)) } - override def compute(): Future[ParseResult] = { - require(pkgSources.nonEmpty) - + protected override def sequentialPrecompute(): PreprocessedSources = { val preprocessedSources = preprocess(pkgSources)(config) - val startPreambleParsingMs = System.currentTimeMillis() - // before parsing, get imports and add these parse jobs - // val imports = fastParse(preprocessedSources) val imports = getImportsForPackage(preprocessedSources) - val preambleParsingDurationMs = System.currentTimeMillis() - startPreambleParsingMs - /* - val importResults: Set[Either[Vector[ParserError], Future[_]]] = imports.map { case (directImportTarget, importErrorFactory) => - // val importResults: Set[Future[ParseResult]] = imports.map { case (directImportTarget, importErrorFactory) => - val directImportPackage = AbstractPackage(directImportTarget)(config) - val nonEmptyImportedSources = for { - resolveSourceResults <- PackageResolver.resolveSources(directImportTarget)(config) - importedSources = resolveSourceResults.map(_.source) - nonEmptyImportedSources <- if (importedSources.isEmpty) Left(s"No source files for package '$directImportTarget' found") else Right(importedSources) - } yield nonEmptyImportedSources - nonEmptyImportedSources.fold( - errMsg => { - val errs = importErrorFactory(errMsg) - parallelManager.addIfAbsent(directImportPackage, ParseFailureJob(errs))(executionContext) - Left(errs) - }, - nonEmptySources => { - // manager.addIfAbsent(directImportPackage, ParseSourcesJob(nonEmptySources, directImportPackage))(executionContext) - // Right(manager.getFuture(directImportPackage)) - Right(parallelManager.addIfAbsent(directImportPackage, ParseSourcesJob(nonEmptySources, directImportPackage))(executionContext)) - *//* - manager.getFuture(directImportPackage).flatten - .map { - case Left(_) => Left(importErrorFactory(s"Imported package contains errors")) - case success => success - }(executionContext) - *//* - }) - *//* - val importedSources = PackageResolver.resolveSources(directImportTarget)(config) - .getOrElse(Vector()) - .map(_.source) - if (importedSources.isEmpty) { - val errMsg = s"No source files for package '$directImportTarget' found" - manager.addIfAbsent(directImportPackage, ParseFailureJob(Vector(NotFoundError(errMsg))))(executionContext) - Future.successful(Left(importErrorFactory(errMsg))) - } else { - manager.addIfAbsent(directImportPackage, ParseSourcesJob(importedSources, directImportPackage))(executionContext) - manager.getFuture(directImportPackage).flatten - .map { - case Left(errs) => Left(importErrorFactory(s"Imported package contains errors")) - case success => success - }(executionContext) - } - *//* - } - */ - val importResults: Vector[Either[Vector[ParserError], Future[_]]] = imports.map { - case (directImportPackage, Right(nonEmptySources)) => Right(parallelManager.addIfAbsent(directImportPackage, ParallelParseSourcesJob(nonEmptySources, directImportPackage))(executionContext)) + preambleParsingDurationMs = System.currentTimeMillis() - startPreambleParsingMs + + // add imported packages to manager if not already + imports.foreach { + case (directImportPackage, Right(nonEmptySources)) => + manager.addIfAbsent(directImportPackage, ParseSourcesJob(nonEmptySources, directImportPackage)) case (directImportPackage, Left(errs)) => - parallelManager.addIfAbsent(directImportPackage, ParallelParseFailureJob(errs))(executionContext) - Left(errs) + manager.addIfAbsent(directImportPackage, ParseFailureJob(errs)) } - val (importFailures, futs) = importResults.partitionMap(identity) - val flatImportFailures = importFailures.flatten + preprocessedSources + } - val res: ParseResult = for { - _ <- if (flatImportFailures.isEmpty) Right(()) else Left(flatImportFailures) - startMs = System.currentTimeMillis() + protected def compute(preprocessedSources: PreprocessedSources): ParseResult = { + // note that we do not check here whether there have been parse errors in the imported packages as this would + // introduce additional synchronization + val startMs = System.currentTimeMillis() + for { parsedProgram <- Parser.process(preprocessedSources, pkgInfo, specOnly = specOnly)(config) postprocessedProgram <- Parser.postprocess(Right((preprocessedSources, parsedProgram)), specOnly = specOnly)(config) _ = logger.trace { @@ -239,81 +144,7 @@ object Parser { s"parsing ${pkgInfo.id} done (took ${parsingDurationS}s; parsing preamble overhead is ${preambleParsingRatio}%)" } } yield (pkgSources, postprocessedProgram._2) // we use `pkgSources` as the preprocessing of sources should be transparent from the outside - - /* - val startMs = System.currentTimeMillis() - val res = for { - parsedProgram <- Parser.process(preprocessedSources, pkgInfo, specOnly = specOnly)(config) - } yield (pkgSources, parsedProgram) - - logger.trace { - val parsingDurationMs = System.currentTimeMillis() - startMs - val parsingDurationS = f"${parsingDurationMs / 1000f}%.1f" - val preambleParsingRatio = f"${100f * preambleParsingDurationMs / parsingDurationMs}%.1f" - s"parsing ${pkgInfo.id} done (took ${parsingDurationS}s; parsing preamble overhead is ${preambleParsingRatio}%)" - }*/ - - implicit val executor: GobraExecutionContext = executionContext - /* - Future.sequence(importResults) - .map(dependencyResults => { - val (importErrors, _) = dependencyResults.partitionMap(identity) - val flatImportFailures = importErrors.toVector.flatten - if (flatImportFailures.isEmpty) { - // we only post-process if dependent packages where successful - Parser.postprocess(res, specOnly = specOnly)(config) - } else { - config.reporter report ParserErrorMessage(flatImportFailures.head.position.get.file, flatImportFailures) - Left(flatImportFailures) - } - /* - if (dependencyResults.forall(_.isRight)) { - // we only post-process if dependent packages where successful - Parser.postprocess(res, specOnly = specOnly)(config) - } else { - // we return an empty list of errors not to duplicate errors - Left(Vector.empty) - } - */ - }) - */ - Future.sequence(futs) - .map(_ => res) } - /* - type ImportErrorFactory = String => Vector[ParserError] - private def fastParse(preprocessedInput: Vector[Source]): Set[(AbstractImport, ImportErrorFactory)] = { - def getImportPaths(preprocessedSource: Source): Set[(RegularImport, ImportErrorFactory)] = { - processPreamble(preprocessedSource)(config) - .map(preamble => { - val pom = preamble.positions - preamble.imports - .map(importNode => { - val importErrorFactory: ImportErrorFactory = (errMsg: String) => { - val err = pom.translate(message(importNode, errMsg), ParserError) - // config.reporter report ParserErrorMessage(err.head.position.get.file, err) - err - } - (RegularImport(importNode.importPath), importErrorFactory) - }) - .toSet - }) - .getOrElse(Set.empty) - } - - val explicitImports: Set[(AbstractImport, ImportErrorFactory)] = preprocessedInput.flatMap(getImportPaths).toSet - if (pkgInfo.isBuiltIn) { - explicitImports - } else { - val builtInImportErrorFactory: ImportErrorFactory = (errMsg: String) => { - val err = Vector(ParserError(errMsg, None)) - config.reporter report ParserErrorMessage(err.head.position.get.file, err) - err - } - val builtInImportTuple = (BuiltInImport, builtInImportErrorFactory) - explicitImports + builtInImportTuple - } - }*/ } /** this job is used to parse the package that should be verified */ @@ -321,10 +152,6 @@ object Parser { lazy val pkgSources: Vector[Source] = config.packageInfoInputMap(pkgInfo) lazy val specOnly: Boolean = false } - case class ParallelParseInfoJob(override val pkgInfo: PackageInfo) extends ParallelParseJob { - lazy val pkgSources: Vector[Source] = config.packageInfoInputMap(pkgInfo) - lazy val specOnly: Boolean = false - } /** this job is used to parse all packages that are imported */ case class ParseSourcesJob(override val pkgSources: Vector[Source], pkg: AbstractPackage) extends ParseJob { @@ -332,44 +159,15 @@ object Parser { lazy val pkgInfo: PackageInfo = Source.getPackageInfo(pkgSources.head, config.projectRoot) lazy val specOnly: Boolean = true } - case class ParallelParseSourcesJob(override val pkgSources: Vector[Source], pkg: AbstractPackage) extends ParallelParseJob { - require(pkgSources.nonEmpty) - lazy val pkgInfo: PackageInfo = Source.getPackageInfo(pkgSources.head, config.projectRoot) - lazy val specOnly: Boolean = true - } - - case class ParseFailureJob(errs: Vector[ParserError]) extends Job[ParseResult] { - override def compute(): ParseResult = Left(errs) - } - case class ParallelParseFailureJob(errs: Vector[ParserError]) extends ParallelJob[ParseResult] { - override def compute(): Future[ParseResult] = Future.successful[ParseResult](Left(errs)) - } - /* - def getParseResults(executionContext: GobraExecutionContext): Either[Map[AbstractPackage, Vector[VerifierError]], Map[AbstractPackage, ParseSuccessResult]] = { - implicit val executor: GobraExecutionContext = executionContext - // val futs = manager.getAllResultsWithKeys(executionContext).map { case (key, fut) => fut.map(res => (key, res)) } - val futs = manager.getAllFutures.map { case (key, fut) => fut.flatten.map(res => (key, res)) } - val results = Await.result(Future.sequence(futs), Duration.Inf) - val (failedResults, successfulResults) = results - .partitionMap { case (key, eitherResult) => eitherResult.fold[Either[(AbstractPackage, Vector[VerifierError]), (AbstractPackage, ParseSuccessResult)]](errs => Left((key, errs)), result => Right((key, result))) } - if (failedResults.isEmpty) Right(successfulResults.toMap) - else Left(failedResults.toMap) + case class ParseFailureJob(errs: Vector[ParserError]) extends Job[PreprocessedSources, ParseResult] { + override protected def sequentialPrecompute(): PreprocessedSources = + Vector.empty + override protected def compute(precomputationResult: PreprocessedSources): ParseResult = + Left(errs) } - def getSuccessResults(executionContext: GobraExecutionContext): Map[AbstractPackage, ParseSuccessResult] = { - implicit val executor: GobraExecutionContext = executionContext - val futs = manager.getAllFutures.map { case (key, fut) => fut.flatten.map(res => (key, res)) } - val results = Await.result(Future.sequence(futs), Duration.Inf) - results - .collect { case (key, Right(res)) => (key, res) } - .toMap - } - */ - def getResults(executionContext: GobraExecutionContext): Map[AbstractPackage, ParseResult] = config.typeCheckMode match { - case Lazy | Sequential => manager.getAllResultsWithKeys.toMap - case Parallel => parallelManager.getAllResultsWithKeys(executionContext).toMap - } + def getResults: Map[AbstractPackage, ParseResult] = manager.getAllResultsWithKeys.toMap } /** @@ -388,15 +186,10 @@ object Parser { * */ - def parse(config: Config, pkgInfo: PackageInfo)(executionContext: GobraExecutionContext): Either[Vector[VerifierError], Map[AbstractPackage, ParseResult]] = { + def parse(config: Config, pkgInfo: PackageInfo)(executionContext: GobraExecutionContext): Map[AbstractPackage, ParseResult] = { val parseManager = new ParseManager(config, executionContext) - /* parseManager.parse(pkgInfo) - val res = parseManager.getParseResults(executionContext).left.map(errMap => errMap.values.flatten.toVector) - res - */ - val res = parseManager.parse(pkgInfo) - res.map(_ => parseManager.getResults(executionContext)) + parseManager.getResults } def parse(input: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean = false)(config: Config): Either[Vector[VerifierError], PPackage] = { @@ -431,7 +224,7 @@ object Parser { val res = preambleCache.computeIfAbsent(getPreambleCacheKey(preprocessedSource), _ => parseAndStore()) if (!cacheHit) { - println(s"No cache hit for ${res.map(_.packageClause.id.name)}'s preamble") + println(s"No cache hit for ${res.map(_.packageClause.id.name)}'s preamble (${preambleCache.size()} entries in cache)") } res } @@ -440,19 +233,6 @@ object Parser { } private def process(preprocessedInputs: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[ParserError], PPackage] = { - /* - for { - parseAst <- parseSources(preprocessedInputs, pkgInfo, specOnly = specOnly)(config) - postprocessors = Seq( - new ImportPostprocessor(parseAst.positions.positions), - new TerminationMeasurePostprocessor(parseAst.positions.positions, specOnly = specOnly), - ) - postprocessedAst <- postprocessors.foldLeft[Either[Vector[VerifierError], PPackage]](Right(parseAst)) { - case (Right(ast), postprocessor) => postprocessor.postprocess(ast)(config) - case (e, _) => e - } - } yield postprocessedAst - */ parseSources(preprocessedInputs, pkgInfo, specOnly = specOnly)(config) } diff --git a/src/main/scala/viper/gobra/frontend/TaskManager.scala b/src/main/scala/viper/gobra/frontend/TaskManager.scala index f3f93f963..cad745141 100644 --- a/src/main/scala/viper/gobra/frontend/TaskManager.scala +++ b/src/main/scala/viper/gobra/frontend/TaskManager.scala @@ -20,13 +20,20 @@ object TaskManagerMode extends Enumeration { val Lazy, Sequential, Parallel = Value } -trait Job[R] { +trait Job[I, R] { + private lazy val precomputationResult: I = sequentialPrecompute() private var compututationStarted = false private val promise: Promise[R] = Promise() def getFuture: Future[R] = promise.future - protected def compute(): R - def call(): R = { + protected def sequentialPrecompute(): I + protected def compute(precomputationResult: I): R + + def triggerPrecomputation(): I = { + precomputationResult + } + + def execute(): R = { getFuture.value match { case Some(Success(res)) => return res // return already computed type-checker result case Some(Failure(exception)) => Violation.violation(s"Job resulted in exception: $exception") @@ -34,8 +41,8 @@ trait Job[R] { } Violation.violation(!compututationStarted, s"Job $this is already on-going") compututationStarted = true - val res = try { - val res = compute() + try { + val res = compute(precomputationResult) promise.success(res) res } catch { @@ -44,160 +51,47 @@ trait Job[R] { // propagate this exception for the case that `call` is executed synchronously: throw e } - res - } -} - -trait ParallelJob[R] { - /* - protected def compute(): Future[R] - private var compututationStarted: Option[Future[R]] = None - def call(): Future[R] = { - compututationStarted.getOrElse { - val fut = compute() - compututationStarted = Some(fut) - fut - } - } - */ - - private var compututationStarted = false - private val promise: Promise[R] = Promise() - def getFuture: Future[R] = promise.future - protected def compute(): Future[R] - - def call(executionContext: GobraExecutionContext): Future[R] = { - getFuture.value match { - case Some(Success(res)) => return Future.successful(res) // return already computed type-checker result - case Some(Failure(exception)) => Violation.violation(s"Job resulted in exception: $exception") - case _ => - } - Violation.violation(!compututationStarted, s"Job $this is already on-going") - compututationStarted = true - compute() - .map(res => { - promise.success(res) - res - })(executionContext) } } -class TaskManager[K, R](mode: TaskManagerMode) { - require(mode != Parallel) - - private val jobs: ConcurrentMap[K, Job[R]] = new ConcurrentHashMap() +class TaskManager[K, I, R](mode: TaskManagerMode)(executionContext: GobraExecutionContext) { + private val jobs: ConcurrentMap[K, Job[I, R]] = new ConcurrentHashMap() - /** - * returns true if job has been inserted and thus was previously absent - */ - def addIfAbsent(id: K, job: Job[R], insertOnly: Boolean = false): Unit = { + def addIfAbsent(id: K, job: Job[I, R]): Unit = { var isAbsent = false - // first insert job, then run it (if necessary) jobs.computeIfAbsent(id, _ => { isAbsent = true job }) - // now run it but only if it's a new job: - if (isAbsent && !insertOnly) { + if (isAbsent) { + job.triggerPrecomputation() mode match { + case Sequential => job.execute() case Lazy => // don't do anything as of now - case Sequential => job.call() + case Parallel => Future{ job.execute() }(executionContext) } } } - /* - def getFuture(id: K): Future[R] = { - val job = jobs.get(id) - Violation.violation(job != null, s"Task $id not found") - job.getFuture - } - def getAllFutures: Iterable[(K, Future[R])] = - jobs.asScala.toVector.map { case (key, job) => (key, job.getFuture) } - */ def getResult(id: K): R = { val job = jobs.get(id) Violation.violation(job != null, s"Task $id not found") - getResultFromJob(job) - } - /* - def getAllResults(executionContext: GobraExecutionContext): Iterable[R] = mode match { - case Lazy | Sequential => jobs.values().asScala.map(getResultFromJob) - case Parallel => - val futs = jobs.values().asScala.map(_.getFuture) - implicit val executor: GobraExecutionContext = executionContext - Await.result(Future.sequence(futs), Duration.Inf) - } - */ - def getAllResults: Iterable[R] = - jobs.values().asScala.map(getResultFromJob) - /* - def getAllResultsWithKeys(executionContext: GobraExecutionContext): Iterable[(K, R)] = mode match { - case Lazy | Sequential => jobs.asScala.toVector.map { case (key, job) => (key, getResultFromJob(job)) } - case Parallel => - implicit val executor: GobraExecutionContext = executionContext - val futs = jobs.asScala.toVector.map { case (key, job) => job.getFuture.map(res => (key, res)) } - Await.result(Future.sequence(futs), Duration.Inf) - } - */ - def getAllResultsWithKeys: Iterable[(K, R)] = - jobs.asScala.toVector.map { case (key, job) => (key, getResultFromJob(job)) } - - private def getResultFromJob(job: Job[R]): R = mode match { - case Lazy => job.call() // we perform the computation now that we need the result - case Sequential => - // note that we cannot await the future here as type-checking of this package might not have started yet. - // Thus, we use `.call()` that either returns a previously calculated type-checking result or will calculate it. - job.call() - // case Parallel => - // Await.result(job.getFuture, Duration.Inf) - } -} - -class ParallelTaskManager[K, R] { - private val jobs: ConcurrentMap[K, ParallelJob[R]] = new ConcurrentHashMap() - - /** - * returns true if job has been inserted and thus was previously absent - */ - def addIfAbsent(id: K, job: ParallelJob[R], insertOnly: Boolean = false)(executionContext: GobraExecutionContext): Future[R] = { - var isAbsent = false - // first insert job, then run it (if necessary) - val res = jobs.computeIfAbsent(id, _ => { - isAbsent = true - job - }) - // now run it but only if it's a new job: - if (isAbsent && !insertOnly) { - job.call(executionContext) + mode match { + case Lazy => job.execute() // now we need the job's result + case _ => } - // return the future (either of the inserted job or the already existing job with the same id) - res.getFuture + Await.result(job.getFuture, Duration.Inf) } - def getAllResultsWithKeys(executionContext: GobraExecutionContext): Iterable[(K, R)] = { - implicit val executor: GobraExecutionContext = executionContext - val futs = jobs.asScala.toVector.map { case (key, job) => job.getFuture.map(res => (key, res)) } - Await.result(Future.sequence(futs), Duration.Inf) - } -} - -class FutureManager[K, R]() { - private val futures: ConcurrentMap[K, Future[R]] = new ConcurrentHashMap() - - def addIfAbsent(id: K, futFn: () => Future[R]): Future[R] = { - // first insert job, then run it (if necessary) - futures.computeIfAbsent(id, _ => futFn()) - } - - def getFuture(id: K): Future[R] = { - val fut = futures.get(id) - Violation.violation(fut != null, s"Task $id not found") - fut - } - - def getAllResults(executionContext: GobraExecutionContext): Iterable[R] = { + def getAllResultsWithKeys: Iterable[(K, R)] = { implicit val executor: GobraExecutionContext = executionContext - Await.result(Future.sequence(futures.values().asScala), Duration.Inf) + val futs = jobs.asScala.toVector.map { case (key, job) => + mode match { + case Lazy => job.execute() // now we need the job's result + case _ => + } + job.getFuture.map(res => (key, res)) + } + Await.result(Future.sequence(futs), Duration.Inf) } } diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 404c05d05..e474c1504 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -11,20 +11,18 @@ import org.bitbucket.inkytonik.kiama.relation.Tree import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, message} import org.bitbucket.inkytonik.kiama.util.{Position, Source} import viper.gobra.ast.frontend.{PImport, PNode, PPackage} -import viper.gobra.frontend.{Config, Job, ParallelJob, ParallelTaskManager, TaskManager} +import viper.gobra.frontend.{Config, Job, TaskManager} import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, BuiltInPackage, RegularImport} import viper.gobra.frontend.Parser.{ParseResult, ParseSuccessResult} import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential} -import viper.gobra.frontend.info.Info.CycleChecker import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.ghost.separation.{GhostLessPrinter, GoifyingPrinter} import viper.gobra.reporting.{CyclicImportError, ParserError, TypeCheckDebugMessage, TypeCheckFailureMessage, TypeCheckSuccessMessage, TypeError, VerifierError} import viper.gobra.util.{GobraExecutionContext, Violation} import java.security.MessageDigest +import java.util.concurrent.atomic.AtomicLong import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} -import scala.concurrent.duration.Duration -import scala.concurrent.{Await, Future} object Info extends LazyLogging { @@ -168,155 +166,68 @@ object Info extends LazyLogging { * Therefore, package management is centralized. */ class Context(val config: Config, val parseResults: Map[AbstractPackage, ParseSuccessResult])(val executionContext: GobraExecutionContext) extends GetParseResult { - private val typeCheckManager = new TaskManager[AbstractPackage, TypeCheckResult](if (config.typeCheckMode == Parallel) Sequential else config.typeCheckMode) - private val parallelTypeCheckManager = new ParallelTaskManager[AbstractPackage, TypeCheckResult]() + private val typeCheckManager = new TaskManager[AbstractPackage, (Vector[Source], PPackage, Vector[AbstractImport]), () => TypeCheckResult](config.typeCheckMode)(executionContext) - trait TypeCheckJob { - protected def typeCheck(pkgSources: Vector[Source], pkg: PPackage, dependentTypeInfo: DependentTypeInfo, isMainContext: Boolean = false): TypeCheckResult = { - val startMs = System.currentTimeMillis() - logger.trace(s"start type-checking ${pkg.info.id}") - val res = Info.checkSources(pkgSources, pkg, dependentTypeInfo, isMainContext = isMainContext)(config) - logger.trace { - val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" - s"type-checking ${pkg.info.id} done (took ${durationS}s with ${res.map(info => info.tree.nodes.length.toString).getOrElse("_")} nodes)" - } - res - } - } + var tyeCheckDurationMs = new AtomicLong(0L) - case class LazyTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[TypeCheckResult] with TypeCheckJob { - override def toString: String = s"LazyTypeCheckJob for $abstractPackage" + case class TypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[(Vector[Source], PPackage, Vector[AbstractImport]), () => TypeCheckResult] { + override def toString: String = s"TypeCheckJob for $abstractPackage" - override def compute(): TypeCheckResult = { - // in lazy mode, this function is called exactly when this package needs to be type-checked - // we also do not care about any dependent packages, because they will be lazily type-checked + protected override def sequentialPrecompute(): (Vector[Source], PPackage, Vector[AbstractImport]) = { val (sources, ast) = getParseResult(abstractPackage) - // we assume that all packages have been registered with the typeCheckManager val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) val isBuiltIn = abstractPackage == BuiltInPackage val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets - val dependentTypeInfo: DependentTypeInfo = dependencies - .map(importTarget => (importTarget, () => typeCheckManager.getResult(AbstractPackage(importTarget)(config)))) - .toMap - typeCheck(sources, ast, dependentTypeInfo, isMainContext = isMainContext) + // schedule type-checking of dependent packages: + dependencies.foreach(importTarget => { + val dependentPackage = AbstractPackage(importTarget)(config) + val job = TypeCheckJob(dependentPackage) + typeCheckManager.addIfAbsent(dependentPackage, job) + }) + (sources, ast, dependencies) } - } - - case class SequentialTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[TypeCheckResult] with TypeCheckJob { - override def toString: String = s"SequentialTypeCheckJob for $abstractPackage" - override def compute(): TypeCheckResult = { - val (sources, ast) = getParseResult(abstractPackage) - val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) - val isBuiltIn = abstractPackage == BuiltInPackage - val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets - // first type-check dependent packages: - val dependentTypeInfos = dependencies - .map(importTarget => { - val dependentPackage = AbstractPackage(importTarget)(config) - // add to manager & typecheck them if not present yet - val job = SequentialTypeCheckJob(dependentPackage) - typeCheckManager.addIfAbsent(dependentPackage, job) - (importTarget, () => typeCheckManager.getResult(dependentPackage)) - }) - - typeCheck(sources, ast, dependentTypeInfos.toMap, isMainContext = isMainContext) + protected def compute(precomputationResult: (Vector[Source], PPackage, Vector[AbstractImport])): () => TypeCheckResult = { + val (sources, ast, dependencies) = precomputationResult + val dependentTypeInfo = dependencies.map(importTarget => { + val dependentPackage = AbstractPackage(importTarget)(config) + (importTarget, typeCheckManager.getResult(dependentPackage)) + }) + config.typeCheckMode match { + case Sequential | Parallel => + val res = typeCheck(sources, ast, dependentTypeInfo.toMap, isMainContext = isMainContext) + () => res + case Lazy => + lazy val res = typeCheck(sources, ast, dependentTypeInfo.toMap, isMainContext = isMainContext) + () => res + } } - } - // case class ParallelTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[Future[TypeCheckResult]] with TypeCheckJob { - case class ParallelTypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends ParallelJob[TypeCheckResult] with TypeCheckJob { - override def toString: String = s"ParallelTypeCheckJob for $abstractPackage" - - override def compute(): Future[TypeCheckResult] = { - val (sources, ast) = getParseResult(abstractPackage) - val importTargets = ast.imports.map(importNode => RegularImport(importNode.importPath)) - val isBuiltIn = abstractPackage == BuiltInPackage - val dependencies = if (isBuiltIn) importTargets else BuiltInImport +: importTargets - // first type-check dependent packages: - val dependentJobsFuts = dependencies - .map(importTarget => { - val dependentPackage = AbstractPackage(importTarget)(config) - // add to manager & typecheck them if not present yet - val job = ParallelTypeCheckJob(dependentPackage) - parallelTypeCheckManager.addIfAbsent(dependentPackage, job)(executionContext) - .map(typeInfo => (importTarget, () => typeInfo))(executionContext) - /* - parallelTypeCheckManager.getFuture(dependentPackage).flatten - .map(typeInfo => (importTarget, () => typeInfo))(executionContext) - */ - }) - implicit val executor: GobraExecutionContext = executionContext - val dependentJobsFut = Future.sequence(dependentJobsFuts) - dependentJobsFut.map(dependentTypeInfo => typeCheck(sources, ast, dependentTypeInfo.toMap, isMainContext = isMainContext)) + private def typeCheck(pkgSources: Vector[Source], pkg: PPackage, dependentTypeInfo: DependentTypeInfo, isMainContext: Boolean = false, isLazy: Boolean = false): TypeCheckResult = { + val startMs = System.currentTimeMillis() + logger.trace(s"start type-checking ${pkg.info.id}") + val res = Info.checkSources(pkgSources, pkg, dependentTypeInfo, isMainContext = isMainContext)(config, executionContext) + logger.trace { + val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" + s"type-checking ${pkg.info.id} done (took ${durationS}s with ${res.map(info => info.tree.nodes.length.toString).getOrElse("_")} nodes)" + } + if (isLazy) { + tyeCheckDurationMs.getAndUpdate(prev => Math.max(prev, System.currentTimeMillis() - startMs)) + } else { + tyeCheckDurationMs.addAndGet(System.currentTimeMillis() - startMs) + } + res } } - case class FailureJob(errs: Vector[VerifierError]) extends Job[TypeCheckResult] { - override def compute(): TypeCheckResult = Left(errs) - } - def typeCheck(pkg: AbstractPackage): TypeCheckResult = { - config.typeCheckMode match { - case Lazy => - // we have to transitively add all packages to the typeCheckManager: - lazyTypeCheckRecursively(pkg, isMainContext = true) - typeCheckManager.getResult(pkg) - case Sequential => - typeCheckManager.addIfAbsent(pkg, SequentialTypeCheckJob(pkg, isMainContext = true)) - typeCheckManager.getResult(pkg) - case Parallel => - /* - parallelTypeCheckManager.addIfAbsent(pkg, ParallelTypeCheckJob(pkg, isMainContext = true))(executionContext) - // wait for result: - val fut = parallelTypeCheckManager.getResult(pkg) - */ - val fut = parallelTypeCheckManager.addIfAbsent(pkg, ParallelTypeCheckJob(pkg, isMainContext = true))(executionContext) - Await.result(fut, Duration.Inf) - } + typeCheckManager.addIfAbsent(pkg, TypeCheckJob(pkg, isMainContext = true)) + val resFn = typeCheckManager.getResult(pkg) + resFn() } - - private def lazyTypeCheckRecursively(abstractPackage: AbstractPackage, isMainContext: Boolean): Unit = { - /** returns all transitively imported packages. However, `abstractPackage` is not included in the returned set! */ - def allImports(abstractPackage: AbstractPackage): Set[AbstractPackage] = { - val (_, ast: PPackage) = getParseResult(abstractPackage) - ast.imports - .map(importNode => AbstractPackage(RegularImport(importNode.importPath))(config)) - .toSet - .flatMap[AbstractPackage](directlyImportedPackage => allImports(directlyImportedPackage) + directlyImportedPackage) - } - - val dependentPackages = allImports(abstractPackage) + BuiltInPackage - // create jobs for all dependent packages - dependentPackages.foreach(pkg => typeCheckManager.addIfAbsent(pkg, LazyTypeCheckJob(pkg))) - // create job for this package: - typeCheckManager.addIfAbsent(abstractPackage, LazyTypeCheckJob(abstractPackage, isMainContext = isMainContext)) - } - /* - def getContexts: Iterable[ExternalTypeInfo] = { - config.typeCheckMode match { - case Lazy | Sequential => typeCheckManager.getAllResults(executionContext).collect { case Right(info) => info } - case Parallel => - implicit val executor: GobraExecutionContext = executionContext - val results = Await.result(Future.sequence(parallelTypeCheckManager.getAllResults(executionContext)), Duration.Inf) - results.collect { case Right(info) => info } - } - } - - def getTypeInfo(importTarget: AbstractImport)(config: Config): TypeCheckResult = { - val packageTarget = AbstractPackage(importTarget)(config) - config.typeCheckMode match { - case Lazy | Sequential => typeCheckManager.getResult(packageTarget) - case Parallel => - val future = parallelTypeCheckManager.getFuture(packageTarget).flatten - Violation.violation(future.isCompleted, s"job $importTarget is not yet completed") - Await.result(future, Duration.Inf) - } - } - */ } - def check(config: Config, abstractPackage: AbstractPackage, /*parseResults: Map[AbstractPackage, ParseSuccessResult]*/ parseResults: Map[AbstractPackage, ParseResult])(executionContext: GobraExecutionContext): TypeCheckResult = { + def check(config: Config, abstractPackage: AbstractPackage, parseResults: Map[AbstractPackage, ParseResult])(executionContext: GobraExecutionContext): TypeCheckResult = { // check for cycles // val cyclicErrors = new CycleChecker(config, parseResults).check(abstractPackage) for { @@ -334,29 +245,14 @@ object Info extends LazyLogging { val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})" } - } yield typeInfo - - - /* - if (cyclicErrors.isEmpty) { - val typeCheckingStartMs = System.currentTimeMillis() - // add type-checking jobs to context: - val context = new Context(config, parseResults)(executionContext) - val res = context.typeCheck(abstractPackage) - logger.debug { - val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" - s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})" + _ = logger.debug { + val typeCheckingEndMs = System.currentTimeMillis() + val sumDurationS = f"${context.tyeCheckDurationMs.get() / 1000f}%.1f" + val overheadMs = (typeCheckingEndMs - typeCheckingStartMs) - context.tyeCheckDurationMs.get() + val overheadS = f"${overheadMs / 1000f}%.1f" + s"type-checking individual packages took ${sumDurationS}s. Overhead for tasks is thus ${overheadS}s (${(100f * overheadMs / (typeCheckingEndMs - typeCheckingStartMs)).toInt}%)" } - // we do not report any messages in this case, because `checkSources` will do so (for each package) - res - } else { - val (sources, pkg) = parseResults(abstractPackage) - val sourceNames = sources.map(_.name) - val errors = pkg.positions.translate(cyclicErrors, TypeError).distinct - config.reporter report TypeCheckFailureMessage(sourceNames, pkg.packageClause.id.name, () => pkg, errors) - Left(errors) - } - */ + } yield typeInfo } type TypeInfoCacheKey = String @@ -389,12 +285,12 @@ object Info extends LazyLogging { typeInfoCache.clear() } - def checkSources(sources: Vector[Source], pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean = false)(config: Config): TypeCheckResult = { + def checkSources(sources: Vector[Source], pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean = false)(config: Config, executionContext: GobraExecutionContext): TypeCheckResult = { var cacheHit: Boolean = true def getTypeInfo(pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean, config: Config): TypeInfoImpl = { cacheHit = false val tree = new GoTree(pkg) - new TypeInfoImpl(tree, dependentTypeInfo, isMainContext)(config: Config) + new TypeInfoImpl(tree, dependentTypeInfo, isMainContext)(config: Config, executionContext) } def getTypeInfoCached(pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean, config: Config): TypeInfoImpl = { @@ -407,7 +303,12 @@ object Info extends LazyLogging { println(s"No cache hit for type info for ${pkg.info.id}") } + val startTimeMs = System.currentTimeMillis() val errors = info.errors + logger.trace { + val durationS = f"${(System.currentTimeMillis() - startTimeMs) / 1000f}%.1f" + s"computing errors for ${pkg.info.id} done, took ${durationS}s" + } val sourceNames = sources.map(_.name) // use `sources` instead of `context.inputs` for reporting such that the message is correctly attributed in case of imports diff --git a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala index 83c4e7747..0275acafd 100644 --- a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala +++ b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala @@ -13,7 +13,7 @@ import viper.gobra.ast.internal.Program import viper.gobra.ast.internal.transform.OverflowChecksTransform import viper.gobra.backend.BackendVerifier import viper.gobra.frontend.PackageResolver.{AbstractPackage, RegularPackage} -import viper.gobra.frontend.Parser.{ParseResult, ParseSuccessResult} +import viper.gobra.frontend.Parser.ParseResult import viper.gobra.frontend.info.{Info, TypeInfo} import viper.gobra.frontend.{Desugar, Parser} import viper.gobra.reporting.{AppliedInternalTransformsMessage, BackTranslator, VerifierError, VerifierResult} @@ -100,12 +100,12 @@ class DetailedBenchmarkTests extends BenchmarkTests { config = gobra.getAndMergeInFileConfig(c, pkgInfo).toOption } - private val parsing = InitialStep("parsing", () => { + private val parsing = InitialStep[Vector[VerifierError], Map[AbstractPackage, ParseResult]]("parsing", () => { assert(config.isDefined) val c = config.get assert(c.packageInfoInputMap.size == 1) val pkgInfo = c.packageInfoInputMap.keys.head - Parser.parse(c, pkgInfo)(executor) + Right(Parser.parse(c, pkgInfo)(executor)) }) private val typeChecking: NextStep[Map[AbstractPackage, ParseResult], TypeInfo, Vector[VerifierError]] = diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index 719ac1b9d..97632dd79 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -33,7 +33,11 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { var gobraInstance: Gobra = _ var executor: GobraExecutionContext = _ var inputMapping: Vector[(PackageInfo, Vector[Source])] = Vector.empty - val cacheParser = true + // while we could pre-fetch and cache parse and maybe even type-check results, the regression test suite is designed + // in a way that each file is its own test case. However, feeding a map of package infos to Gobra results in Gobra + // considering these files in a Go way, i.e., groups them by package clause. This in turn results in testcase failures + // as errors occur in files technically not under test but in the same directory and having the same package clause. + val cacheParser = false override def beforeAll(): Unit = { executor = new DefaultGobraExecutionContext() diff --git a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala index b8097a222..5801caaa0 100644 --- a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala +++ b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala @@ -7,7 +7,7 @@ package viper.gobra.erasing import org.bitbucket.inkytonik.kiama.util.{Positions, StringSource} -import org.scalatest.{Assertion, Inside, Succeeded} +import org.scalatest.{Assertion, BeforeAndAfterAll, Inside, Succeeded} import org.scalatest.funsuite.AnyFunSuite import org.scalatest.matchers.should.Matchers import viper.gobra.ast.frontend._ @@ -15,9 +15,19 @@ import viper.gobra.frontend.{Config, PackageInfo, Parser} import viper.gobra.frontend.info.Info import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.ghost.separation.GhostLessPrinter +import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext} -class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside { +class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside with BeforeAndAfterAll { val frontend = new TestFrontend() + var executor: GobraExecutionContext = _ + + override def beforeAll(): Unit = { + executor = new DefaultGobraExecutionContext() + } + + override def afterAll(): Unit = { + executor.terminateAndAssertInexistanceOfTimeout() + } test("Ghost Erasure: variable declaration should not have a trailing equal sign") { // var value int @@ -343,7 +353,7 @@ class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside { ) val tree = new Info.GoTree(pkg) val config = Config() - val info = new TypeInfoImpl(tree, Map.empty)(config) + val info = new TypeInfoImpl(tree, Map.empty)(config, executor) info.errors match { case Vector(msgs) => fail(s"Type-checking failed: $msgs") case _ => diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index ed9020f20..1e0f7b4e8 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -8,17 +8,27 @@ package viper.gobra.typing import org.bitbucket.inkytonik.kiama.util.Positions import org.scalatest.funsuite.AnyFunSuite -import org.scalatest.Inside +import org.scalatest.{BeforeAndAfterAll, Inside} import org.scalatest.matchers.should.Matchers import viper.gobra.ast.frontend._ import viper.gobra.frontend.{Config, PackageInfo} import viper.gobra.frontend.info.Info import viper.gobra.frontend.info.base.Type import viper.gobra.frontend.info.implementation.TypeInfoImpl +import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext} import viper.gobra.util.TypeBounds.{DefaultInt, UnboundedInteger} -class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { +class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside with BeforeAndAfterAll { val frontend = new TestFrontend() + var executor: GobraExecutionContext = _ + + override def beforeAll(): Unit = { + executor = new DefaultGobraExecutionContext() + } + + override def afterAll(): Unit = { + executor.terminateAndAssertInexistanceOfTimeout() + } test("TypeChecker: should classify an integer literal as integer") { frontend.exprType(PIntLit(42))() should matchPattern { @@ -3392,7 +3402,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { ) val tree = new Info.GoTree(pkg) val config = Config() - new TypeInfoImpl(tree, Map.empty)(config) + new TypeInfoImpl(tree, Map.empty)(config, executor) } def exprType(expr : PExpression)(inArgs: Vector[(PParameter, Boolean)] = Vector()) : Type.Type = diff --git a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala index dc3a3fbc7..f4dc6562b 100644 --- a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala @@ -6,7 +6,7 @@ package viper.gobra.typing -import org.scalatest.Inside +import org.scalatest.{BeforeAndAfterAll, Inside} import org.scalatest.matchers.should.Matchers import org.scalatest.funsuite.AnyFunSuite import viper.gobra.ast.frontend._ @@ -15,9 +15,19 @@ import org.bitbucket.inkytonik.kiama.util.Positions import viper.gobra.frontend.PackageInfo import viper.gobra.frontend.info.Info import viper.gobra.frontend.Config +import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext} -class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside { +class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside with BeforeAndAfterAll { val frontend = new TestFrontend() + var executor: GobraExecutionContext = _ + + override def beforeAll(): Unit = { + executor = new DefaultGobraExecutionContext() + } + + override def afterAll(): Unit = { + executor.terminateAndAssertInexistanceOfTimeout() + } test("TypeChecker: should detect labeled continues outside of loops") { assert(!frontend.wellDefStmt(PContinue(Some(PLabelUse("l"))))().valid) @@ -82,7 +92,7 @@ class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside { ) val tree = new Info.GoTree(pkg) val config = Config() - new TypeInfoImpl(tree, Map.empty)(config) + new TypeInfoImpl(tree, Map.empty)(config, executor) } def wellDefStmt(stmt : PStatement)(inArgs: Vector[(PParameter, Boolean)] = Vector()) = diff --git a/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala index a248c2a15..4be78c86c 100644 --- a/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala @@ -9,16 +9,26 @@ package viper.gobra.typing import org.bitbucket.inkytonik.kiama.util.Positions import org.scalatest.funsuite.AnyFunSuite import org.scalatest.matchers.should.Matchers -import org.scalatest.Inside +import org.scalatest.{BeforeAndAfterAll, Inside} import viper.gobra.ast.frontend._ import viper.gobra.frontend.{Config, PackageInfo} import viper.gobra.frontend.info.Info import viper.gobra.frontend.info.base.Type import viper.gobra.frontend.info.implementation.TypeInfoImpl +import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext} import viper.gobra.util.TypeBounds.DefaultInt -class TypeTypingUnitTests extends AnyFunSuite with Matchers with Inside { +class TypeTypingUnitTests extends AnyFunSuite with Matchers with Inside with BeforeAndAfterAll { val frontend = new TestFrontend() + var executor: GobraExecutionContext = _ + + override def beforeAll(): Unit = { + executor = new DefaultGobraExecutionContext() + } + + override def afterAll(): Unit = { + executor.terminateAndAssertInexistanceOfTimeout() + } test("Typing: should correctly type an integer sequence type") { val t = PSequenceType(PIntType()) @@ -379,7 +389,7 @@ class TypeTypingUnitTests extends AnyFunSuite with Matchers with Inside { ) val tree = new Info.GoTree(pkg) val config = Config() - new TypeInfoImpl(tree, Map.empty)(config) + new TypeInfoImpl(tree, Map.empty)(config, executor) } def areComparable(t1 : PType, t2 : PType) : Boolean = { From 8d24c0149cd9ef20835ca086fe7ef459e6b7dab8 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 29 Jun 2023 17:02:23 +0200 Subject: [PATCH 138/296] fixes compilation issue and undos parser caching for unit tests --- .../scala/viper/gobra/frontend/info/Info.scala | 6 +++--- src/test/scala/viper/gobra/GobraTests.scala | 7 ++++--- .../gobra/erasing/GhostErasureUnitTests.scala | 17 +++-------------- .../gobra/typing/ExprTypingUnitTests.scala | 16 +++------------- .../gobra/typing/StmtTypingUnitTests.scala | 16 +++------------- .../gobra/typing/TypeTypingUnitTests.scala | 16 +++------------- 6 files changed, 19 insertions(+), 59 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index e474c1504..558e38a5d 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -206,7 +206,7 @@ object Info extends LazyLogging { private def typeCheck(pkgSources: Vector[Source], pkg: PPackage, dependentTypeInfo: DependentTypeInfo, isMainContext: Boolean = false, isLazy: Boolean = false): TypeCheckResult = { val startMs = System.currentTimeMillis() logger.trace(s"start type-checking ${pkg.info.id}") - val res = Info.checkSources(pkgSources, pkg, dependentTypeInfo, isMainContext = isMainContext)(config, executionContext) + val res = Info.checkSources(pkgSources, pkg, dependentTypeInfo, isMainContext = isMainContext)(config) logger.trace { val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" s"type-checking ${pkg.info.id} done (took ${durationS}s with ${res.map(info => info.tree.nodes.length.toString).getOrElse("_")} nodes)" @@ -285,12 +285,12 @@ object Info extends LazyLogging { typeInfoCache.clear() } - def checkSources(sources: Vector[Source], pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean = false)(config: Config, executionContext: GobraExecutionContext): TypeCheckResult = { + def checkSources(sources: Vector[Source], pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean = false)(config: Config): TypeCheckResult = { var cacheHit: Boolean = true def getTypeInfo(pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean, config: Config): TypeInfoImpl = { cacheHit = false val tree = new GoTree(pkg) - new TypeInfoImpl(tree, dependentTypeInfo, isMainContext)(config: Config, executionContext) + new TypeInfoImpl(tree, dependentTypeInfo, isMainContext)(config: Config) } def getTypeInfoCached(pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean, config: Config): TypeInfoImpl = { diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index 97632dd79..71b0b33ff 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -51,8 +51,8 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { } override def runTests(testName: Option[String], args: Args): Status = { - val inputMap = inputMapping.toMap if (cacheParser) { + val inputMap = inputMapping.toMap val config = Config(packageInfoInputMap = inputMap, cacheParser = true) val parseManager = new ParseManager(config, executor) parseManager.parseAll(inputMap.keys.toVector) @@ -72,16 +72,17 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { override def run(input: AnnotatedTestInput): Seq[AbstractOutput] = { + val source = FromFileSource(input.file) + val packageInfoInputMap = if (cacheParser) inputMapping.toMap else Map(Source.getPackageInfo(source, Path.of("")) -> Vector(source)) val config = Config( logLevel = Level.INFO, reporter = NoopReporter, - packageInfoInputMap = inputMapping.toMap, + packageInfoInputMap = packageInfoInputMap, checkConsistency = true, cacheParser = cacheParser, z3Exe = z3Exe ) - val source = FromFileSource(input.file) val pkgInfo = Source.getPackageInfo(source, Path.of("")) val (result, elapsedMilis) = time(() => Await.result(gobraInstance.verify(pkgInfo, config)(executor), Duration.Inf)) diff --git a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala index 5801caaa0..dd203575a 100644 --- a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala +++ b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala @@ -7,7 +7,7 @@ package viper.gobra.erasing import org.bitbucket.inkytonik.kiama.util.{Positions, StringSource} -import org.scalatest.{Assertion, BeforeAndAfterAll, Inside, Succeeded} +import org.scalatest.{Assertion, Inside, Succeeded} import org.scalatest.funsuite.AnyFunSuite import org.scalatest.matchers.should.Matchers import viper.gobra.ast.frontend._ @@ -15,20 +15,9 @@ import viper.gobra.frontend.{Config, PackageInfo, Parser} import viper.gobra.frontend.info.Info import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.ghost.separation.GhostLessPrinter -import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext} -class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside with BeforeAndAfterAll { +class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside { val frontend = new TestFrontend() - var executor: GobraExecutionContext = _ - - override def beforeAll(): Unit = { - executor = new DefaultGobraExecutionContext() - } - - override def afterAll(): Unit = { - executor.terminateAndAssertInexistanceOfTimeout() - } - test("Ghost Erasure: variable declaration should not have a trailing equal sign") { // var value int val decl = PVarDecl(Some(PIntType()), Vector(), Vector(PIdnDef("value")), Vector(false)) @@ -353,7 +342,7 @@ class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside with B ) val tree = new Info.GoTree(pkg) val config = Config() - val info = new TypeInfoImpl(tree, Map.empty)(config, executor) + val info = new TypeInfoImpl(tree, Map.empty)(config) info.errors match { case Vector(msgs) => fail(s"Type-checking failed: $msgs") case _ => diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index 1e0f7b4e8..ed9020f20 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -8,27 +8,17 @@ package viper.gobra.typing import org.bitbucket.inkytonik.kiama.util.Positions import org.scalatest.funsuite.AnyFunSuite -import org.scalatest.{BeforeAndAfterAll, Inside} +import org.scalatest.Inside import org.scalatest.matchers.should.Matchers import viper.gobra.ast.frontend._ import viper.gobra.frontend.{Config, PackageInfo} import viper.gobra.frontend.info.Info import viper.gobra.frontend.info.base.Type import viper.gobra.frontend.info.implementation.TypeInfoImpl -import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext} import viper.gobra.util.TypeBounds.{DefaultInt, UnboundedInteger} -class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside with BeforeAndAfterAll { +class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { val frontend = new TestFrontend() - var executor: GobraExecutionContext = _ - - override def beforeAll(): Unit = { - executor = new DefaultGobraExecutionContext() - } - - override def afterAll(): Unit = { - executor.terminateAndAssertInexistanceOfTimeout() - } test("TypeChecker: should classify an integer literal as integer") { frontend.exprType(PIntLit(42))() should matchPattern { @@ -3402,7 +3392,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside with Bef ) val tree = new Info.GoTree(pkg) val config = Config() - new TypeInfoImpl(tree, Map.empty)(config, executor) + new TypeInfoImpl(tree, Map.empty)(config) } def exprType(expr : PExpression)(inArgs: Vector[(PParameter, Boolean)] = Vector()) : Type.Type = diff --git a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala index f4dc6562b..dc3a3fbc7 100644 --- a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala @@ -6,7 +6,7 @@ package viper.gobra.typing -import org.scalatest.{BeforeAndAfterAll, Inside} +import org.scalatest.Inside import org.scalatest.matchers.should.Matchers import org.scalatest.funsuite.AnyFunSuite import viper.gobra.ast.frontend._ @@ -15,19 +15,9 @@ import org.bitbucket.inkytonik.kiama.util.Positions import viper.gobra.frontend.PackageInfo import viper.gobra.frontend.info.Info import viper.gobra.frontend.Config -import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext} -class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside with BeforeAndAfterAll { +class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside { val frontend = new TestFrontend() - var executor: GobraExecutionContext = _ - - override def beforeAll(): Unit = { - executor = new DefaultGobraExecutionContext() - } - - override def afterAll(): Unit = { - executor.terminateAndAssertInexistanceOfTimeout() - } test("TypeChecker: should detect labeled continues outside of loops") { assert(!frontend.wellDefStmt(PContinue(Some(PLabelUse("l"))))().valid) @@ -92,7 +82,7 @@ class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside with Bef ) val tree = new Info.GoTree(pkg) val config = Config() - new TypeInfoImpl(tree, Map.empty)(config, executor) + new TypeInfoImpl(tree, Map.empty)(config) } def wellDefStmt(stmt : PStatement)(inArgs: Vector[(PParameter, Boolean)] = Vector()) = diff --git a/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala index 4be78c86c..a248c2a15 100644 --- a/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala @@ -9,26 +9,16 @@ package viper.gobra.typing import org.bitbucket.inkytonik.kiama.util.Positions import org.scalatest.funsuite.AnyFunSuite import org.scalatest.matchers.should.Matchers -import org.scalatest.{BeforeAndAfterAll, Inside} +import org.scalatest.Inside import viper.gobra.ast.frontend._ import viper.gobra.frontend.{Config, PackageInfo} import viper.gobra.frontend.info.Info import viper.gobra.frontend.info.base.Type import viper.gobra.frontend.info.implementation.TypeInfoImpl -import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext} import viper.gobra.util.TypeBounds.DefaultInt -class TypeTypingUnitTests extends AnyFunSuite with Matchers with Inside with BeforeAndAfterAll { +class TypeTypingUnitTests extends AnyFunSuite with Matchers with Inside { val frontend = new TestFrontend() - var executor: GobraExecutionContext = _ - - override def beforeAll(): Unit = { - executor = new DefaultGobraExecutionContext() - } - - override def afterAll(): Unit = { - executor.terminateAndAssertInexistanceOfTimeout() - } test("Typing: should correctly type an integer sequence type") { val t = PSequenceType(PIntType()) @@ -389,7 +379,7 @@ class TypeTypingUnitTests extends AnyFunSuite with Matchers with Inside with Bef ) val tree = new Info.GoTree(pkg) val config = Config() - new TypeInfoImpl(tree, Map.empty)(config, executor) + new TypeInfoImpl(tree, Map.empty)(config) } def areComparable(t1 : PType, t2 : PType) : Boolean = { From 6f419979ec5370401248ccb3d048740e35813090 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 30 Jun 2023 09:51:57 +0200 Subject: [PATCH 139/296] addresses several unit test errors --- src/main/scala/viper/gobra/Gobra.scala | 8 +++++--- .../scala/viper/gobra/frontend/Parser.scala | 11 ++++++++--- .../scala/viper/gobra/frontend/info/Info.scala | 11 ++++++----- .../regressions/features/import/import1.gobra | 18 +++++++++--------- .../regressions/features/import/import2.gobra | 2 +- .../viper/gobra/DetailedBenchmarkTests.scala | 2 +- 6 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index e0596f2ee..051117256 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -159,7 +159,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { for { finalConfig <- getAndMergeInFileConfig(config, pkgInfo) _ = setLogLevel(finalConfig) - parseResults = performParsing(finalConfig, pkgInfo)(executor) + parseResults <- performParsing(finalConfig, pkgInfo)(executor) typeInfo <- performTypeChecking(finalConfig, pkgInfo, parseResults)(executor) program <- performDesugaring(finalConfig, typeInfo)(executor) program <- performInternalTransformations(finalConfig, pkgInfo, program)(executor) @@ -243,7 +243,9 @@ class Gobra extends GoVerifier with GoIdeVerifier { .setLevel(config.logLevel) } - private def performParsing(config: Config, pkgInfo: PackageInfo)(executor: GobraExecutionContext): Map[AbstractPackage, ParseResult] = { + // returns `Left(...)` if parsing of the package identified by `pkgInfo` failed. Note that `Right(...)` does not imply + // that all imported packages have been parsed successfully (this is only checked during type-checking) + private def performParsing(config: Config, pkgInfo: PackageInfo)(executor: GobraExecutionContext): Either[Vector[VerifierError], Map[AbstractPackage, ParseResult]] = { if (config.shouldParse) { val startMs = System.currentTimeMillis() val res = Parser.parse(config, pkgInfo)(executor) @@ -253,7 +255,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { } res } else { - Map.empty + Left(Vector.empty) } } diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index f7504b8a8..21604626f 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -18,7 +18,7 @@ import org.antlr.v4.runtime.atn.PredictionMode import org.antlr.v4.runtime.misc.ParseCancellationException import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, PreambleContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, RegularImport, RegularPackage} -import viper.gobra.util.GobraExecutionContext +import viper.gobra.util.{GobraExecutionContext, Violation} import viper.silver.ast.SourcePosition import scala.collection.mutable.ListBuffer @@ -186,10 +186,15 @@ object Parser { * */ - def parse(config: Config, pkgInfo: PackageInfo)(executionContext: GobraExecutionContext): Map[AbstractPackage, ParseResult] = { + def parse(config: Config, pkgInfo: PackageInfo)(executionContext: GobraExecutionContext): Either[Vector[ParserError], Map[AbstractPackage, ParseResult]] = { val parseManager = new ParseManager(config, executionContext) parseManager.parse(pkgInfo) - parseManager.getResults + val results = parseManager.getResults + results.get(RegularPackage(pkgInfo.id)) match { + case Some(Right(_)) => Right(results) + case Some(Left(errs)) => Left(errs) + case _ => Violation.violation(s"No parse result for package '$pkgInfo' found") + } } def parse(input: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean = false)(config: Config): Either[Vector[VerifierError], PPackage] = { diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 558e38a5d..160ee730c 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -228,18 +228,19 @@ object Info extends LazyLogging { } def check(config: Config, abstractPackage: AbstractPackage, parseResults: Map[AbstractPackage, ParseResult])(executionContext: GobraExecutionContext): TypeCheckResult = { - // check for cycles - // val cyclicErrors = new CycleChecker(config, parseResults).check(abstractPackage) for { - successParseResult <- new CycleChecker(config, parseResults).check(abstractPackage) + // check whether parsing of this package was successful: + parseResult <- parseResults(abstractPackage) + // check whether there are any import cycles: + cycleResult <- new CycleChecker(config, parseResults).check(abstractPackage) .left.map(errs => { - val (sources, pkg) = parseResults(abstractPackage).right.get + val (sources, pkg) = parseResult val sourceNames = sources.map(_.name) config.reporter report TypeCheckFailureMessage(sourceNames, pkg.packageClause.id.name, () => pkg, errs) errs }) typeCheckingStartMs = System.currentTimeMillis() - context = new Context(config, successParseResult)(executionContext) + context = new Context(config, cycleResult)(executionContext) typeInfo <- context.typeCheck(abstractPackage) _ = logger.debug { val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" diff --git a/src/test/resources/regressions/features/import/import1.gobra b/src/test/resources/regressions/features/import/import1.gobra index eb3106227..d0b9a720f 100644 --- a/src/test/resources/regressions/features/import/import1.gobra +++ b/src/test/resources/regressions/features/import/import1.gobra @@ -4,27 +4,27 @@ package main import fmt "fmt" -//:: ExpectedOutput(parser_error) +//:: ExpectedOutput(type_error) import a "a"; -//:: ExpectedOutput(parser_error) +//:: ExpectedOutput(type_error) import (b "b") -//:: ExpectedOutput(parser_error) +//:: ExpectedOutput(type_error) import (c "c"); import ( - //:: ExpectedOutput(parser_error) + //:: ExpectedOutput(type_error) d "d" - //:: ExpectedOutput(parser_error) + //:: ExpectedOutput(type_error) e "e") import ( - //:: ExpectedOutput(parser_error) + //:: ExpectedOutput(type_error) f "f" - //:: ExpectedOutput(parser_error) + //:: ExpectedOutput(type_error) g "g" ) -//:: ExpectedOutput(parser_error) +//:: ExpectedOutput(type_error) import m "lib/mathm" // wrong package name used on purpose such that this test case does not potentially depend on the configured Go path -//:: ExpectedOutput(parser_error) +//:: ExpectedOutput(type_error) import . "lib/mathn" func test() { diff --git a/src/test/resources/regressions/features/import/import2.gobra b/src/test/resources/regressions/features/import/import2.gobra index ae7458fc6..5e99934f1 100644 --- a/src/test/resources/regressions/features/import/import2.gobra +++ b/src/test/resources/regressions/features/import/import2.gobra @@ -3,7 +3,7 @@ package main -//:: ExpectedOutput(parser_error) +//:: ExpectedOutput(type_error) import math "lib/mathm" // wrong package name used on purpose such that this test case does not potentially depend on the configured Go path type cell struct{ diff --git a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala index 0275acafd..6537f6ec3 100644 --- a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala +++ b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala @@ -105,7 +105,7 @@ class DetailedBenchmarkTests extends BenchmarkTests { val c = config.get assert(c.packageInfoInputMap.size == 1) val pkgInfo = c.packageInfoInputMap.keys.head - Right(Parser.parse(c, pkgInfo)(executor)) + Parser.parse(c, pkgInfo)(executor) }) private val typeChecking: NextStep[Map[AbstractPackage, ParseResult], TypeInfo, Vector[VerifierError]] = From e97cbf55b58c710a4d44936bd1ebaacb0de59386 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 30 Jun 2023 11:22:00 +0200 Subject: [PATCH 140/296] pre-parses and pre-typeChecks Gobra tests --- .../scala/viper/gobra/frontend/Parser.scala | 40 ++++++++----- .../viper/gobra/frontend/TaskManager.scala | 16 +++-- .../viper/gobra/frontend/info/Info.scala | 43 ++++++++++++- .../scala/viper/gobra/GobraPackageTests.scala | 1 - src/test/scala/viper/gobra/GobraTests.scala | 60 ++++++++++++------- 5 files changed, 116 insertions(+), 44 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 21604626f..8057b047a 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -24,9 +24,10 @@ import viper.silver.ast.SourcePosition import scala.collection.mutable.ListBuffer import java.security.MessageDigest import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} +import scala.concurrent.Future -object Parser { +object Parser extends LazyLogging { type ParseSuccessResult = (Vector[Source], PPackage) type ParseResult = Either[Vector[ParserError], ParseSuccessResult] @@ -36,20 +37,13 @@ object Parser { class ParseManager(config: Config, executionContext: GobraExecutionContext) extends LazyLogging { private val manager = new TaskManager[AbstractPackage, PreprocessedSources, ParseResult](config.typeCheckMode)(executionContext) - def parse(pkgInfo: PackageInfo): Unit = { + // note that the returned future might never complete if typeCheckMode is `Lazy` and there is no trigger to actually + // execute the parsing of the specified package + def parse(pkgInfo: PackageInfo): Future[ParseResult] = { val pkg = RegularPackage(pkgInfo.id) val parseJob = ParseInfoJob(pkgInfo) manager.addIfAbsent(pkg, parseJob) - } - - /** this is only used for unit testing to fill the parse cache */ - def parseAll(pkgInfos: Vector[PackageInfo]): Map[PackageInfo, ParseResult] = { - pkgInfos.foreach(pkgInfo => parse(pkgInfo)) - val results = manager.getAllResultsWithKeys.toMap - pkgInfos.map(pkgInfo => { - val pkg = RegularPackage(pkgInfo.id) - (pkgInfo, results(pkg)) - }).toMap + parseJob.getFuture } trait ImportResolver { @@ -167,7 +161,9 @@ object Parser { Left(errs) } - def getResults: Map[AbstractPackage, ParseResult] = manager.getAllResultsWithKeys.toMap + def getResults: Map[AbstractPackage, ParseResult] = manager.getAllResultsWithKeys + + def getResultsFut: Future[Map[AbstractPackage, ParseResult]] = manager.getAllResultsWithKeysFut } /** @@ -197,6 +193,20 @@ object Parser { } } + def parseFut(config: Config, pkgInfo: PackageInfo)(executionContext: GobraExecutionContext): Future[Either[Vector[ParserError], Map[AbstractPackage, ParseResult]]] = { + val parseManager = new ParseManager(config, executionContext) + parseManager.parse(pkgInfo) + implicit val executor: GobraExecutionContext = executionContext + for { + results <- parseManager.getResultsFut + res = results.get(RegularPackage(pkgInfo.id)) match { + case Some(Right(_)) => Right(results) + case Some(Left(errs)) => Left(errs) + case _ => Violation.violation(s"No parse result for package '$pkgInfo' found") + } + } yield res + } + def parse(input: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean = false)(config: Config): Either[Vector[VerifierError], PPackage] = { val preprocessedInputs = preprocess(input)(config) process(preprocessedInputs, pkgInfo, specOnly = specOnly)(config) @@ -229,7 +239,7 @@ object Parser { val res = preambleCache.computeIfAbsent(getPreambleCacheKey(preprocessedSource), _ => parseAndStore()) if (!cacheHit) { - println(s"No cache hit for ${res.map(_.packageClause.id.name)}'s preamble (${preambleCache.size()} entries in cache)") + logger.trace(s"No cache hit for ${res.map(_.packageClause.id.name)}'s preamble") } res } @@ -294,7 +304,7 @@ object Parser { parseSourcesUncached(sources, pkgInfo, specOnly)(config) }) if (!cacheHit) { - println(s"No cache hit for package ${pkgInfo.id}") + logger.trace(s"No cache hit for package ${pkgInfo.id}'s parse AST)") } res } diff --git a/src/main/scala/viper/gobra/frontend/TaskManager.scala b/src/main/scala/viper/gobra/frontend/TaskManager.scala index cad745141..85557cfd5 100644 --- a/src/main/scala/viper/gobra/frontend/TaskManager.scala +++ b/src/main/scala/viper/gobra/frontend/TaskManager.scala @@ -73,17 +73,21 @@ class TaskManager[K, I, R](mode: TaskManagerMode)(executionContext: GobraExecuti } } - def getResult(id: K): R = { + def getResultFut(id: K): Future[R] = { val job = jobs.get(id) Violation.violation(job != null, s"Task $id not found") mode match { case Lazy => job.execute() // now we need the job's result case _ => } - Await.result(job.getFuture, Duration.Inf) + job.getFuture + } + + def getResult(id: K): R = { + Await.result(getResultFut(id), Duration.Inf) } - def getAllResultsWithKeys: Iterable[(K, R)] = { + def getAllResultsWithKeysFut: Future[Map[K, R]] = { implicit val executor: GobraExecutionContext = executionContext val futs = jobs.asScala.toVector.map { case (key, job) => mode match { @@ -92,6 +96,10 @@ class TaskManager[K, I, R](mode: TaskManagerMode)(executionContext: GobraExecuti } job.getFuture.map(res => (key, res)) } - Await.result(Future.sequence(futs), Duration.Inf) + Future.sequence(futs).map(_.toMap) + } + + def getAllResultsWithKeys: Map[K, R] = { + Await.result(getAllResultsWithKeysFut, Duration.Inf) } } diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 160ee730c..f14877ae7 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -15,6 +15,7 @@ import viper.gobra.frontend.{Config, Job, TaskManager} import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, BuiltInPackage, RegularImport} import viper.gobra.frontend.Parser.{ParseResult, ParseSuccessResult} import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential} +import viper.gobra.frontend.info.Info.Context import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.ghost.separation.{GhostLessPrinter, GoifyingPrinter} import viper.gobra.reporting.{CyclicImportError, ParserError, TypeCheckDebugMessage, TypeCheckFailureMessage, TypeCheckSuccessMessage, TypeError, VerifierError} @@ -23,6 +24,7 @@ import viper.gobra.util.{GobraExecutionContext, Violation} import java.security.MessageDigest import java.util.concurrent.atomic.AtomicLong import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} +import scala.concurrent.Future object Info extends LazyLogging { @@ -225,6 +227,12 @@ object Info extends LazyLogging { val resFn = typeCheckManager.getResult(pkg) resFn() } + + def typeCheckFut(pkg: AbstractPackage): Future[TypeCheckResult] = { + typeCheckManager.addIfAbsent(pkg, TypeCheckJob(pkg, isMainContext = true)) + typeCheckManager.getResultFut(pkg) + .map(resFn => resFn())(executionContext) + } } def check(config: Config, abstractPackage: AbstractPackage, parseResults: Map[AbstractPackage, ParseResult])(executionContext: GobraExecutionContext): TypeCheckResult = { @@ -256,6 +264,39 @@ object Info extends LazyLogging { } yield typeInfo } + def checkFut(config: Config, abstractPackage: AbstractPackage, parseResults: Map[AbstractPackage, ParseResult])(executionContext: GobraExecutionContext): Future[TypeCheckResult] = { + implicit val executor: GobraExecutionContext = executionContext + val res = for { + // check whether parsing of this package was successful: + parseResult <- parseResults(abstractPackage) + // check whether there are any import cycles: + cycleResult <- new CycleChecker(config, parseResults).check(abstractPackage) + .left.map(errs => { + val (sources, pkg) = parseResult + val sourceNames = sources.map(_.name) + config.reporter report TypeCheckFailureMessage(sourceNames, pkg.packageClause.id.name, () => pkg, errs) + errs + }) + typeCheckingStartMs = System.currentTimeMillis() + context = new Context(config, cycleResult)(executionContext) + typeInfoFut = for { + typeInfo <- context.typeCheckFut(abstractPackage) + _ = logger.debug { + val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" + s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})" + } + _ = logger.debug { + val typeCheckingEndMs = System.currentTimeMillis() + val sumDurationS = f"${context.tyeCheckDurationMs.get() / 1000f}%.1f" + val overheadMs = (typeCheckingEndMs - typeCheckingStartMs) - context.tyeCheckDurationMs.get() + val overheadS = f"${overheadMs / 1000f}%.1f" + s"type-checking individual packages took ${sumDurationS}s. Overhead for tasks is thus ${overheadS}s (${(100f * overheadMs / (typeCheckingEndMs - typeCheckingStartMs)).toInt}%)" + } + } yield typeInfo + } yield typeInfoFut + res.fold(errs => Future.successful(Left(errs)), identity) + } + type TypeInfoCacheKey = String private val typeInfoCache: ConcurrentMap[TypeInfoCacheKey, TypeInfoImpl] = new ConcurrentHashMap() @@ -301,7 +342,7 @@ object Info extends LazyLogging { val checkFn = if (config.cacheParser) { getTypeInfoCached _ } else { getTypeInfo _ } val info = checkFn(pkg, dependentTypeInfo, isMainContext, config) if (!cacheHit && config.cacheParser) { - println(s"No cache hit for type info for ${pkg.info.id}") + logger.trace(s"No cache hit for type info for ${pkg.info.id}") } val startTimeMs = System.currentTimeMillis() diff --git a/src/test/scala/viper/gobra/GobraPackageTests.scala b/src/test/scala/viper/gobra/GobraPackageTests.scala index 8b170788d..8e01bcc49 100644 --- a/src/test/scala/viper/gobra/GobraPackageTests.scala +++ b/src/test/scala/viper/gobra/GobraPackageTests.scala @@ -58,7 +58,6 @@ class GobraPackageTests extends GobraTests { // test scallop parsing by giving package name and testing whether the same set of files is created val currentDir = input.file.getParent val parsedConfig = for { - pkgName <- getPackageClause(input.file.toFile) config <- createConfig(Array( "--logLevel", "INFO", "--directory", currentDir.toFile.getPath, diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index 71b0b33ff..e22a5ab30 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -10,16 +10,18 @@ import java.nio.file.Path import ch.qos.logback.classic.Level import org.bitbucket.inkytonik.kiama.util.Source import org.scalatest.{Args, BeforeAndAfterAll, Status} -import viper.gobra.frontend.Parser.ParseManager +import viper.gobra.frontend.PackageResolver.RegularPackage import viper.gobra.frontend.Source.FromFileSource -import viper.gobra.frontend.{Config, PackageInfo, PackageResolver, Source} +import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel} +import viper.gobra.frontend.info.Info +import viper.gobra.frontend.{Config, PackageResolver, Parser, Source} import viper.gobra.reporting.VerifierResult.{Failure, Success} import viper.gobra.reporting.{NoopReporter, VerifierError} import viper.silver.testing.{AbstractOutput, AnnotatedTestInput, ProjectInfo, SystemUnderTest} import viper.silver.utility.TimingUtils import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext} -import scala.concurrent.Await +import scala.concurrent.{Await, Future} import scala.concurrent.duration.Duration class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { @@ -32,12 +34,12 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { var gobraInstance: Gobra = _ var executor: GobraExecutionContext = _ - var inputMapping: Vector[(PackageInfo, Vector[Source])] = Vector.empty + var inputs: Vector[Source] = Vector.empty // while we could pre-fetch and cache parse and maybe even type-check results, the regression test suite is designed // in a way that each file is its own test case. However, feeding a map of package infos to Gobra results in Gobra // considering these files in a Go way, i.e., groups them by package clause. This in turn results in testcase failures // as errors occur in files technically not under test but in the same directory and having the same package clause. - val cacheParser = false + val cacheParserAndTypeChecker = true override def beforeAll(): Unit = { executor = new DefaultGobraExecutionContext() @@ -47,15 +49,36 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { override def registerTest(input: AnnotatedTestInput): Unit = { super.registerTest(input) val source = FromFileSource(input.file) - inputMapping = inputMapping :+ (Source.getPackageInfo(source, Path.of("")) -> Vector(source)) + inputs = inputs :+ source } + private def getConfig(source: Source): Config = + Config( + logLevel = Level.INFO, + reporter = NoopReporter, + packageInfoInputMap = Map(Source.getPackageInfo(source, Path.of("")) -> Vector(source)), + checkConsistency = true, + cacheParser = cacheParserAndTypeChecker, + typeCheckMode = if (cacheParserAndTypeChecker) Parallel else Lazy, + z3Exe = z3Exe + ) + override def runTests(testName: Option[String], args: Args): Status = { - if (cacheParser) { - val inputMap = inputMapping.toMap - val config = Config(packageInfoInputMap = inputMap, cacheParser = true) - val parseManager = new ParseManager(config, executor) - parseManager.parseAll(inputMap.keys.toVector) + if (cacheParserAndTypeChecker) { + implicit val execContext: GobraExecutionContext = executor + val futs = inputs.map(source => { + val config = getConfig(source) + val pkgInfo = config.packageInfoInputMap.keys.head + for { + parseResultEither <- Parser.parseFut(config, pkgInfo)(executor) + pkg = RegularPackage(pkgInfo.id) + typeCheckResultEither <- parseResultEither.fold( + parseErrs => Future.successful(Left(parseErrs)), + parseResult => Info.checkFut(config, pkg, parseResult)(executor)) + } yield typeCheckResultEither + }) + Await.result(Future.sequence(futs), Duration.Inf) + println("pre-parsing and pre-typeChecking completed") } super.runTests(testName, args) } @@ -73,18 +96,9 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { override def run(input: AnnotatedTestInput): Seq[AbstractOutput] = { val source = FromFileSource(input.file) - val packageInfoInputMap = if (cacheParser) inputMapping.toMap else Map(Source.getPackageInfo(source, Path.of("")) -> Vector(source)) - val config = Config( - logLevel = Level.INFO, - reporter = NoopReporter, - packageInfoInputMap = packageInfoInputMap, - checkConsistency = true, - cacheParser = cacheParser, - z3Exe = z3Exe - ) - - val pkgInfo = Source.getPackageInfo(source, Path.of("")) - val (result, elapsedMilis) = time(() => Await.result(gobraInstance.verify(pkgInfo, config)(executor), Duration.Inf)) + val config = getConfig(source) + val pkgInfo = config.packageInfoInputMap.keys.head + val (result, elapsedMilis) = time(() => Await.result(gobraInstance.verify(pkgInfo, getConfig(source))(executor), Duration.Inf)) info(s"Time required: $elapsedMilis ms") From 7f32830b010455ff2267c6fb2adfc0a7c6539951 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 30 Jun 2023 14:43:24 +0200 Subject: [PATCH 141/296] cleanup --- build.sbt | 1 + src/main/scala/viper/gobra/Gobra.scala | 73 +++++----- .../scala/viper/gobra/frontend/Config.scala | 31 +++-- .../scala/viper/gobra/frontend/Parser.scala | 54 ++------ .../viper/gobra/frontend/TaskManager.scala | 17 +-- .../viper/gobra/frontend/info/Info.scala | 130 ++++-------------- .../scala/viper/gobra/BenchmarkTests.scala | 2 +- src/test/scala/viper/gobra/GobraTests.scala | 19 +-- 8 files changed, 103 insertions(+), 224 deletions(-) diff --git a/build.sbt b/build.sbt index dca34e1c5..ce407ccc9 100644 --- a/build.sbt +++ b/build.sbt @@ -35,6 +35,7 @@ lazy val gobra = (project in file(".")) libraryDependencies += "org.apache.commons" % "commons-text" % "1.9", // for escaping strings in parser preprocessor libraryDependencies += "commons-codec" % "commons-codec" % "1.15", // for obtaining the hex encoding of a string libraryDependencies += "org.antlr" % "antlr4-runtime" % "4.12.0", + libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.3.7", // used for EitherT scalacOptions ++= Seq( "-encoding", "UTF-8", // Enforce UTF-8, instead of relying on properly set locales diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index 051117256..38d7b7684 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -7,11 +7,13 @@ package viper.gobra import ch.qos.logback.classic.Logger +import scalaz.EitherT import java.nio.file.Paths import java.util.concurrent.ExecutionException import com.typesafe.scalalogging.StrictLogging import org.slf4j.LoggerFactory +import scalaz.Scalaz.futureInstance import viper.gobra.ast.internal.Program import viper.gobra.ast.internal.transform.{CGEdgesTerminationTransform, ConstantPropagation, InternalTransform, OverflowChecksTransform} import viper.gobra.backend.BackendVerifier @@ -28,7 +30,6 @@ import viper.silver.{ast => vpr} import java.time.format.DateTimeFormatter import java.time.LocalTime -import scala.annotation.unused import scala.concurrent.{Await, Future, TimeoutException} object GoVerifier { @@ -142,7 +143,7 @@ trait GoVerifier extends StrictLogging { if (allErrors.isEmpty) VerifierResult.Success else VerifierResult.Failure(allErrors) } - protected[this] def verify(pkgInfo: PackageInfo, config: Config)(executor: GobraExecutionContext): Future[VerifierResult] + protected[this] def verify(pkgInfo: PackageInfo, config: Config)(implicit executor: GobraExecutionContext): Future[VerifierResult] } trait GoIdeVerifier { @@ -151,27 +152,23 @@ trait GoIdeVerifier { class Gobra extends GoVerifier with GoIdeVerifier { - override def verify(pkgInfo: PackageInfo, config: Config)(executor: GobraExecutionContext): Future[VerifierResult] = { - // directly declaring the parameter implicit somehow does not work as the compiler is unable to spot the inheritance - implicit val _executor: GobraExecutionContext = executor - - val task = Future { - for { - finalConfig <- getAndMergeInFileConfig(config, pkgInfo) - _ = setLogLevel(finalConfig) - parseResults <- performParsing(finalConfig, pkgInfo)(executor) - typeInfo <- performTypeChecking(finalConfig, pkgInfo, parseResults)(executor) - program <- performDesugaring(finalConfig, typeInfo)(executor) - program <- performInternalTransformations(finalConfig, pkgInfo, program)(executor) - viperTask <- performViperEncoding(finalConfig, pkgInfo, program)(executor) - } yield (viperTask, finalConfig) - } - - task.flatMap{ - case Left(Vector()) => Future(VerifierResult.Success) - case Left(errors) => Future(VerifierResult.Failure(errors)) - case Right((job, finalConfig)) => performVerification(finalConfig, pkgInfo, job.program, job.backtrack)(executor) - } + override def verify(pkgInfo: PackageInfo, config: Config)(implicit executor: GobraExecutionContext): Future[VerifierResult] = { + val task = for { + finalConfig <- EitherT.fromEither(Future.successful(getAndMergeInFileConfig(config, pkgInfo))) + _ = setLogLevel(finalConfig) + parseResults <- performParsing(finalConfig, pkgInfo) + typeInfo <- performTypeChecking(finalConfig, pkgInfo, parseResults) + program <- performDesugaring(finalConfig, typeInfo) + program <- performInternalTransformations(finalConfig, pkgInfo, program) + viperTask <- performViperEncoding(finalConfig, pkgInfo, program) + } yield (viperTask, finalConfig) + + task.foldM({ + case Vector() => Future(VerifierResult.Success) + case errors => Future(VerifierResult.Failure(errors)) + }, { + case (job, finalConfig) => performVerification(finalConfig, pkgInfo, job.program, job.backtrack) + }) } override def verifyAst(config: Config, pkgInfo: PackageInfo, ast: vpr.Program, backtrack: BackTranslator.BackTrackInfo)(executor: GobraExecutionContext): Future[VerifierResult] = { @@ -245,39 +242,39 @@ class Gobra extends GoVerifier with GoIdeVerifier { // returns `Left(...)` if parsing of the package identified by `pkgInfo` failed. Note that `Right(...)` does not imply // that all imported packages have been parsed successfully (this is only checked during type-checking) - private def performParsing(config: Config, pkgInfo: PackageInfo)(executor: GobraExecutionContext): Either[Vector[VerifierError], Map[AbstractPackage, ParseResult]] = { + private def performParsing(config: Config, pkgInfo: PackageInfo)(implicit executor: GobraExecutionContext): EitherT[Vector[VerifierError], Future, Map[AbstractPackage, ParseResult]] = { if (config.shouldParse) { val startMs = System.currentTimeMillis() - val res = Parser.parse(config, pkgInfo)(executor) + val res = Parser.parse(config, pkgInfo) logger.debug { val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" s"parser phase done, took ${durationS}s" } res } else { - Left(Vector.empty) + EitherT.left(Vector.empty) } } - private def performTypeChecking(config: Config, pkgInfo: PackageInfo, parseResults: Map[AbstractPackage, ParseResult])(executor: GobraExecutionContext): Either[Vector[VerifierError], TypeInfo] = { + private def performTypeChecking(config: Config, pkgInfo: PackageInfo, parseResults: Map[AbstractPackage, ParseResult])(implicit executor: GobraExecutionContext): EitherT[Vector[VerifierError], Future, TypeInfo] = { if (config.shouldTypeCheck) { - Info.check(config, RegularPackage(pkgInfo.id), parseResults)(executor) + Info.check(config, RegularPackage(pkgInfo.id), parseResults) } else { - Left(Vector()) + EitherT.left(Vector.empty) } } - private def performDesugaring(config: Config, typeInfo: TypeInfo)(executor: GobraExecutionContext): Either[Vector[VerifierError], Program] = { + private def performDesugaring(config: Config, typeInfo: TypeInfo)(implicit executor: GobraExecutionContext): EitherT[Vector[VerifierError], Future, Program] = { if (config.shouldDesugar) { val startMs = System.currentTimeMillis() - val res = Right(Desugar.desugar(config, typeInfo)(executor)) + val res = EitherT.right[Vector[VerifierError], Future, Program](Desugar.desugar(config, typeInfo)(executor)) logger.debug { val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" s"desugaring done, took ${durationS}s" } res } else { - Left(Vector()) + EitherT.left(Vector.empty) } } @@ -285,7 +282,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { * Applies transformations to programs in the internal language. Currently, only adds overflow checks but it can * be easily extended to perform more transformations */ - private def performInternalTransformations(config: Config, pkgInfo: PackageInfo, program: Program)(@unused executor: GobraExecutionContext): Either[Vector[VerifierError], Program] = { + private def performInternalTransformations(config: Config, pkgInfo: PackageInfo, program: Program)(implicit executor: GobraExecutionContext): EitherT[Vector[VerifierError], Future, Program] = { // constant propagation does not cause duplication of verification errors caused // by overflow checks (if enabled) because all overflows in constant declarations // can be found by the well-formedness checks. @@ -300,24 +297,24 @@ class Gobra extends GoVerifier with GoIdeVerifier { s"internal transformations done, took ${durationS}s" } config.reporter.report(AppliedInternalTransformsMessage(config.packageInfoInputMap(pkgInfo).map(_.name), () => result)) - Right(result) + EitherT.right(result) } - private def performViperEncoding(config: Config, pkgInfo: PackageInfo, program: Program)(@unused executor: GobraExecutionContext): Either[Vector[VerifierError], BackendVerifier.Task] = { + private def performViperEncoding(config: Config, pkgInfo: PackageInfo, program: Program)(implicit executor: GobraExecutionContext): EitherT[Vector[VerifierError], Future, BackendVerifier.Task] = { if (config.shouldViperEncode) { val startMs = System.currentTimeMillis() - val res = Right(Translator.translate(program, pkgInfo)(config)) + val res = EitherT.right[Vector[VerifierError], Future, BackendVerifier.Task](Translator.translate(program, pkgInfo)(config)) logger.debug { val durationS = f"${(System.currentTimeMillis() - startMs) / 1000f}%.1f" s"Viper encoding done, took ${durationS}s" } res } else { - Left(Vector()) + EitherT.left(Vector.empty) } } - private def performVerification(config: Config, pkgInfo: PackageInfo, ast: vpr.Program, backtrack: BackTranslator.BackTrackInfo)(executor: GobraExecutionContext): Future[VerifierResult] = { + private def performVerification(config: Config, pkgInfo: PackageInfo, ast: vpr.Program, backtrack: BackTranslator.BackTrackInfo)(implicit executor: GobraExecutionContext): Future[VerifierResult] = { if (config.noVerify) { Future(VerifierResult.Success)(executor) } else { diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index cd2c80df7..e39e461fd 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -54,7 +54,7 @@ object ConfigDefaults { lazy val DefaultInt32bit: Boolean = false // the following option is currently not controllable via CLI as it is meaningless without a constantly // running JVM. It is targeted in particular to Gobra Server and Gobra IDE - lazy val DefaultCacheParser: Boolean = false + lazy val DefaultCacheParserAndTypeChecker: Boolean = false // this option introduces a mode where Gobra only considers files with a specific annotation ("// +gobra"). // this is useful when verifying large packages where some files might use some unsupported feature of Gobra, // or when the goal is to gradually verify part of a package without having to provide an explicit list of the files @@ -69,7 +69,7 @@ object ConfigDefaults { lazy val DefaultEnableLazyImports: Boolean = false lazy val DefaultNoVerify: Boolean = false lazy val DefaultNoStreamErrors: Boolean = false - lazy val DefaultTypeCheckMode: TaskManagerMode = TaskManagerMode.Parallel + lazy val DefaultParseAndTypeCheckMode: TaskManagerMode = TaskManagerMode.Parallel } case class Config( @@ -105,7 +105,7 @@ case class Config( int32bit: Boolean = ConfigDefaults.DefaultInt32bit, // the following option is currently not controllable via CLI as it is meaningless without a constantly // running JVM. It is targeted in particular to Gobra Server and Gobra IDE - cacheParser: Boolean = ConfigDefaults.DefaultCacheParser, + cacheParserAndTypeChecker: Boolean = ConfigDefaults.DefaultCacheParserAndTypeChecker, // this option introduces a mode where Gobra only considers files with a specific annotation ("// +gobra"). // this is useful when verifying large packages where some files might use some unsupported feature of Gobra, // or when the goal is to gradually verify part of a package without having to provide an explicit list of the files @@ -121,7 +121,7 @@ case class Config( enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, - typeCheckMode: TaskManagerMode = ConfigDefaults.DefaultTypeCheckMode, + parseAndTypeCheckMode: TaskManagerMode = ConfigDefaults.DefaultParseAndTypeCheckMode, ) { def merge(other: Config): Config = { @@ -159,6 +159,7 @@ case class Config( shouldVerify = shouldVerify, int32bit = int32bit || other.int32bit, checkConsistency = checkConsistency || other.checkConsistency, + cacheParserAndTypeChecker = cacheParserAndTypeChecker || other.cacheParserAndTypeChecker, onlyFilesWithHeader = onlyFilesWithHeader || other.onlyFilesWithHeader, assumeInjectivityOnInhale = assumeInjectivityOnInhale || other.assumeInjectivityOnInhale, parallelizeBranches = parallelizeBranches, @@ -167,7 +168,7 @@ case class Config( enableLazyImports = enableLazyImports || other.enableLazyImports, noVerify = noVerify || other.noVerify, noStreamErrors = noStreamErrors || other.noStreamErrors, - typeCheckMode = typeCheckMode + parseAndTypeCheckMode = parseAndTypeCheckMode ) } @@ -209,7 +210,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector checkOverflows: Boolean = ConfigDefaults.DefaultCheckOverflows, checkConsistency: Boolean = ConfigDefaults.DefaultCheckConsistency, int32bit: Boolean = ConfigDefaults.DefaultInt32bit, - cacheParser: Boolean = ConfigDefaults.DefaultCacheParser, + cacheParserAndTypeChecker: Boolean = ConfigDefaults.DefaultCacheParserAndTypeChecker, onlyFilesWithHeader: Boolean = ConfigDefaults.DefaultOnlyFilesWithHeader, assumeInjectivityOnInhale: Boolean = ConfigDefaults.DefaultAssumeInjectivityOnInhale, parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, @@ -218,7 +219,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, - typeCheckMode: TaskManagerMode = ConfigDefaults.DefaultTypeCheckMode, + parseAndTypeCheckMode: TaskManagerMode = ConfigDefaults.DefaultParseAndTypeCheckMode, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -264,7 +265,7 @@ trait RawConfig { shouldVerify = baseConfig.shouldVerify, shouldChop = baseConfig.shouldChop, int32bit = baseConfig.int32bit, - cacheParser = baseConfig.cacheParser, + cacheParserAndTypeChecker = baseConfig.cacheParserAndTypeChecker, onlyFilesWithHeader = baseConfig.onlyFilesWithHeader, assumeInjectivityOnInhale = baseConfig.assumeInjectivityOnInhale, parallelizeBranches = baseConfig.parallelizeBranches, @@ -273,7 +274,7 @@ trait RawConfig { enableLazyImports = baseConfig.enableLazyImports, noVerify = baseConfig.noVerify, noStreamErrors = baseConfig.noStreamErrors, - typeCheckMode = baseConfig.typeCheckMode, + parseAndTypeCheckMode = baseConfig.parseAndTypeCheckMode, ) } @@ -645,17 +646,17 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) - val typeCheckMode: ScallopOption[TaskManagerMode] = choice( - name = "typeCheckMode", + val parseAndTypeCheckMode: ScallopOption[TaskManagerMode] = choice( + name = "parseAndTypeCheckMode", choices = Seq("LAZY", "SEQUENTIAL", "PARALLEL"), - descr = "Specifies the mode in which type-checking is performed.", + descr = "Specifies the mode in which parsing and type-checking is performed.", default = Some("PARALLEL"), noshort = true ).map { case "LAZY" => Lazy case "SEQUENTIAL" => Sequential case "PARALLEL" => Parallel - case _ => ConfigDefaults.DefaultTypeCheckMode + case _ => ConfigDefaults.DefaultParseAndTypeCheckMode } /** @@ -795,7 +796,7 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals checkOverflows = checkOverflows(), checkConsistency = checkConsistency(), int32bit = int32Bit(), - cacheParser = false, // caching does not make sense when using the CLI. Thus, we simply set it to `false` + cacheParserAndTypeChecker = false, // caching does not make sense when using the CLI. Thus, we simply set it to `false` onlyFilesWithHeader = onlyFilesWithHeader(), assumeInjectivityOnInhale = assumeInjectivityOnInhale(), parallelizeBranches = parallelizeBranches(), @@ -804,6 +805,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals enableLazyImports = enableLazyImports(), noVerify = noVerify(), noStreamErrors = noStreamErrors(), - typeCheckMode = typeCheckMode(), + parseAndTypeCheckMode = parseAndTypeCheckMode(), ) } diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 8057b047a..9ef811c57 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -16,6 +16,8 @@ import viper.gobra.reporting.{Source => _, _} import org.antlr.v4.runtime.{CharStreams, CommonTokenStream, DefaultErrorStrategy, ParserRuleContext} import org.antlr.v4.runtime.atn.PredictionMode import org.antlr.v4.runtime.misc.ParseCancellationException +import scalaz.EitherT +import scalaz.Scalaz.futureInstance import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, PreambleContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, RegularImport, RegularPackage} import viper.gobra.util.{GobraExecutionContext, Violation} @@ -31,11 +33,11 @@ object Parser extends LazyLogging { type ParseSuccessResult = (Vector[Source], PPackage) type ParseResult = Either[Vector[ParserError], ParseSuccessResult] - type PreprocessedSources = Vector[Source] type ImportToSourceOrErrorMap = Vector[(AbstractPackage, Either[Vector[ParserError], Vector[Source]])] + type PreprocessedSources = Vector[Source] - class ParseManager(config: Config, executionContext: GobraExecutionContext) extends LazyLogging { - private val manager = new TaskManager[AbstractPackage, PreprocessedSources, ParseResult](config.typeCheckMode)(executionContext) + class ParseManager(config: Config)(implicit executor: GobraExecutionContext) extends LazyLogging { + private val manager = new TaskManager[AbstractPackage, PreprocessedSources, ParseResult](config.parseAndTypeCheckMode) // note that the returned future might never complete if typeCheckMode is `Lazy` and there is no trigger to actually // execute the parsing of the specified package @@ -50,13 +52,11 @@ object Parser extends LazyLogging { def pkgInfo: PackageInfo type ImportErrorFactory = String => Vector[ParserError] - // protected def getImports(importNodes: Vector[PImport], pom: PositionManager): Set[(AbstractImport, ImportErrorFactory)] = { - protected def getImports(importNodes: Vector[PImport], pom: PositionManager): Vector[(AbstractPackage, Either[Vector[ParserError], Vector[Source]])] = { + protected def getImports(importNodes: Vector[PImport], pom: PositionManager): ImportToSourceOrErrorMap = { val explicitImports: Vector[(AbstractImport, ImportErrorFactory)] = importNodes .map(importNode => { val importErrorFactory: ImportErrorFactory = (errMsg: String) => { val err = pom.translate(message(importNode, errMsg), ParserError) - // config.reporter report ParserErrorMessage(err.head.position.get.file, err) err } (RegularImport(importNode.importPath), importErrorFactory) @@ -82,14 +82,6 @@ object Parser extends LazyLogging { (directImportPackage, res) } errsOrSources - /* - val (errors, sources) = errsOrSources.partitionMap(identity) - if (errors.nonEmpty) { - Left(errors) - } else { - Right(sources) - } - */ } } @@ -161,9 +153,7 @@ object Parser extends LazyLogging { Left(errs) } - def getResults: Map[AbstractPackage, ParseResult] = manager.getAllResultsWithKeys - - def getResultsFut: Future[Map[AbstractPackage, ParseResult]] = manager.getAllResultsWithKeysFut + def getResults: Future[Map[AbstractPackage, ParseResult]] = manager.getAllResultsWithKeys } /** @@ -182,34 +172,18 @@ object Parser extends LazyLogging { * */ - def parse(config: Config, pkgInfo: PackageInfo)(executionContext: GobraExecutionContext): Either[Vector[ParserError], Map[AbstractPackage, ParseResult]] = { - val parseManager = new ParseManager(config, executionContext) + def parse(config: Config, pkgInfo: PackageInfo)(implicit executor: GobraExecutionContext): EitherT[Vector[VerifierError], Future, Map[AbstractPackage, ParseResult]] = { + val parseManager = new ParseManager(config) parseManager.parse(pkgInfo) - val results = parseManager.getResults - results.get(RegularPackage(pkgInfo.id)) match { - case Some(Right(_)) => Right(results) - case Some(Left(errs)) => Left(errs) - case _ => Violation.violation(s"No parse result for package '$pkgInfo' found") - } - } - - def parseFut(config: Config, pkgInfo: PackageInfo)(executionContext: GobraExecutionContext): Future[Either[Vector[ParserError], Map[AbstractPackage, ParseResult]]] = { - val parseManager = new ParseManager(config, executionContext) - parseManager.parse(pkgInfo) - implicit val executor: GobraExecutionContext = executionContext - for { - results <- parseManager.getResultsFut + val res: Future[Either[Vector[VerifierError], Map[AbstractPackage, ParseResult]]] = for { + results <- parseManager.getResults res = results.get(RegularPackage(pkgInfo.id)) match { case Some(Right(_)) => Right(results) case Some(Left(errs)) => Left(errs) case _ => Violation.violation(s"No parse result for package '$pkgInfo' found") } } yield res - } - - def parse(input: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean = false)(config: Config): Either[Vector[VerifierError], PPackage] = { - val preprocessedInputs = preprocess(input)(config) - process(preprocessedInputs, pkgInfo, specOnly = specOnly)(config) + EitherT.fromEither(res) } private def preprocess(input: Vector[Source])(config: Config): Vector[Source] = { @@ -244,7 +218,7 @@ object Parser extends LazyLogging { res } - if (config.cacheParser) parseSourceCached(preprocessedSource) else parseSource(preprocessedSource) + if (config.cacheParserAndTypeChecker) parseSourceCached(preprocessedSource) else parseSource(preprocessedSource) } private def process(preprocessedInputs: Vector[Source], pkgInfo: PackageInfo, specOnly: Boolean)(config: Config): Either[Vector[ParserError], PPackage] = { @@ -309,7 +283,7 @@ object Parser extends LazyLogging { res } - val parseFn = if (config.cacheParser) { parseSourcesCached _ } else { parseSourcesUncached _ } + val parseFn = if (config.cacheParserAndTypeChecker) { parseSourcesCached _ } else { parseSourcesUncached _ } parseFn(sources, pkgInfo, specOnly)(config) } diff --git a/src/main/scala/viper/gobra/frontend/TaskManager.scala b/src/main/scala/viper/gobra/frontend/TaskManager.scala index 85557cfd5..991949ce4 100644 --- a/src/main/scala/viper/gobra/frontend/TaskManager.scala +++ b/src/main/scala/viper/gobra/frontend/TaskManager.scala @@ -54,7 +54,7 @@ trait Job[I, R] { } } -class TaskManager[K, I, R](mode: TaskManagerMode)(executionContext: GobraExecutionContext) { +class TaskManager[K, I, R](mode: TaskManagerMode)(implicit executor: GobraExecutionContext) { private val jobs: ConcurrentMap[K, Job[I, R]] = new ConcurrentHashMap() def addIfAbsent(id: K, job: Job[I, R]): Unit = { @@ -68,12 +68,12 @@ class TaskManager[K, I, R](mode: TaskManagerMode)(executionContext: GobraExecuti mode match { case Sequential => job.execute() case Lazy => // don't do anything as of now - case Parallel => Future{ job.execute() }(executionContext) + case Parallel => Future{ job.execute() } } } } - def getResultFut(id: K): Future[R] = { + def getResult(id: K): Future[R] = { val job = jobs.get(id) Violation.violation(job != null, s"Task $id not found") mode match { @@ -83,12 +83,11 @@ class TaskManager[K, I, R](mode: TaskManagerMode)(executionContext: GobraExecuti job.getFuture } - def getResult(id: K): R = { - Await.result(getResultFut(id), Duration.Inf) + def getResultBlocking(id: K): R = { + Await.result(getResult(id), Duration.Inf) } - def getAllResultsWithKeysFut: Future[Map[K, R]] = { - implicit val executor: GobraExecutionContext = executionContext + def getAllResultsWithKeys: Future[Map[K, R]] = { val futs = jobs.asScala.toVector.map { case (key, job) => mode match { case Lazy => job.execute() // now we need the job's result @@ -98,8 +97,4 @@ class TaskManager[K, I, R](mode: TaskManagerMode)(executionContext: GobraExecuti } Future.sequence(futs).map(_.toMap) } - - def getAllResultsWithKeys: Map[K, R] = { - Await.result(getAllResultsWithKeysFut, Duration.Inf) - } } diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index f14877ae7..687730513 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -10,12 +10,13 @@ import com.typesafe.scalalogging.LazyLogging import org.bitbucket.inkytonik.kiama.relation.Tree import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, message} import org.bitbucket.inkytonik.kiama.util.{Position, Source} +import scalaz.EitherT +import scalaz.Scalaz.futureInstance import viper.gobra.ast.frontend.{PImport, PNode, PPackage} import viper.gobra.frontend.{Config, Job, TaskManager} import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, BuiltInPackage, RegularImport} import viper.gobra.frontend.Parser.{ParseResult, ParseSuccessResult} import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential} -import viper.gobra.frontend.info.Info.Context import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.ghost.separation.{GhostLessPrinter, GoifyingPrinter} import viper.gobra.reporting.{CyclicImportError, ParserError, TypeCheckDebugMessage, TypeCheckFailureMessage, TypeCheckSuccessMessage, TypeError, VerifierError} @@ -61,12 +62,6 @@ object Info extends LazyLogging { parseResult <- getParseResult(abstractPackage) (_, ast) = parseResult perImportResult = ast.imports.map(importNode => { - // val cycles = getCycles(RegularImport(importNode.importPath)) - /* - val cycles = getImportErrors(RegularImport(importNode.importPath)) - val msgs = createImportError(importNode, cycles) - if (msgs.isEmpty) Right(()) else Left(ast.positions.translate(msgs, TypeError).distinct) - */ val res = getImportErrors(RegularImport(importNode.importPath)) .left .map(errs => { @@ -81,18 +76,6 @@ object Info extends LazyLogging { case (key, Right(res)) => (key, res) } } yield successParseResults - /* - val (_, ast) = getParseResult(abstractPackage) - val msgs = ast.imports.flatMap(importNode => { - val cycles = getCycles(RegularImport(importNode.importPath)) - createImportError(importNode, cycles) - }) - if (msgs.isEmpty) { - - } else { - Left(ast.positions.translate(msgs, TypeError).distinct) - } - */ } /** @@ -109,7 +92,6 @@ object Info extends LazyLogging { if (parserPendingPackages.contains(directlyImportedTarget)) { // package cycle detected val importNodeStart = ast.positions.positions.getStart(importNode) - // Vector(ImportCycle(importNode, importNodeStart, parserPendingPackages)) val msg = s"Package '$importTarget' is part of the following import cycle that involves the import $importNode$importNodeStart: ${parserPendingPackages.mkString("[", ", ", "]")}" Left(Vector(CyclicImportError(s"Cyclic package import detected starting with package '$msg'"))) } else { @@ -122,44 +104,17 @@ object Info extends LazyLogging { parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) res } - /* - private def getCycles(importTarget: AbstractImport): Vector[ImportCycle] = { - val (_, ast) = getParseResult(abstractPackage) - val res = ast.imports.flatMap(importNode => { - val directlyImportedTarget = RegularImport(importNode.importPath) - if (parserPendingPackages.contains(directlyImportedTarget)) { - // package cycle detected - val importNodeStart = ast.positions.positions.getStart(importNode) - Vector(ImportCycle(importNode, importNodeStart, parserPendingPackages)) - } else { - getCycles(directlyImportedTarget) - } - }) - parserPendingPackages = parserPendingPackages.filterNot(_ == importTarget) - res - } - */ private def createImportError(importNode: PImport, errorsInImportedPackage: Vector[VerifierError]): Messages = { - val importTarget = RegularImport(importNode.importPath) val (cyclicErrors, nonCyclicErrors) = errorsInImportedPackage.partitionMap { case cyclicErr: CyclicImportError => Left(cyclicErr) case e => Right(e) } if (cyclicErrors.isEmpty) { - // nonCyclicErrors.flatMap(err => message(importNode, err.message)) message(importNode, s"Package contains ${nonCyclicErrors.length} error(s): ${nonCyclicErrors.map(_.message).mkString(", ")}") } else { - cyclicErrors.flatMap(cycle => { - // val positionalInfo = cycle.importNodeStart.map(pos => s" at ${pos.format}").getOrElse("") - // message(importNode, s"Package '$importTarget' is part of the following import cycle that involves the import ${cycle.importNodeCausingCycle}$positionalInfo: ${cycle.cyclicPackages.mkString("[", ", ", "]")}") - message(importNode, cycle.message) - }) - }/* - cycles.flatMap(cycle => { - val positionalInfo = cycle.importNodeStart.map(pos => s" at ${pos.format}").getOrElse("") - message(importNode, s"Package '$importTarget' is part of the following import cycle that involves the import ${cycle.importNodeCausingCycle}$positionalInfo: ${cycle.cyclicPackages.mkString("[", ", ", "]")}") - })*/ + cyclicErrors.flatMap(cycle => message(importNode, cycle.message)) + } } } @@ -167,8 +122,8 @@ object Info extends LazyLogging { * All TypeInfo instances share a single context instance. * Therefore, package management is centralized. */ - class Context(val config: Config, val parseResults: Map[AbstractPackage, ParseSuccessResult])(val executionContext: GobraExecutionContext) extends GetParseResult { - private val typeCheckManager = new TaskManager[AbstractPackage, (Vector[Source], PPackage, Vector[AbstractImport]), () => TypeCheckResult](config.typeCheckMode)(executionContext) + class Context(val config: Config, val parseResults: Map[AbstractPackage, ParseSuccessResult])(implicit executor: GobraExecutionContext) extends GetParseResult { + private val typeCheckManager = new TaskManager[AbstractPackage, (Vector[Source], PPackage, Vector[AbstractImport]), () => TypeCheckResult](config.parseAndTypeCheckMode) var tyeCheckDurationMs = new AtomicLong(0L) @@ -193,19 +148,19 @@ object Info extends LazyLogging { val (sources, ast, dependencies) = precomputationResult val dependentTypeInfo = dependencies.map(importTarget => { val dependentPackage = AbstractPackage(importTarget)(config) - (importTarget, typeCheckManager.getResult(dependentPackage)) + (importTarget, typeCheckManager.getResultBlocking(dependentPackage)) }) - config.typeCheckMode match { + config.parseAndTypeCheckMode match { case Sequential | Parallel => - val res = typeCheck(sources, ast, dependentTypeInfo.toMap, isMainContext = isMainContext) + val res = typeCheck(sources, ast, dependentTypeInfo.toMap) () => res case Lazy => - lazy val res = typeCheck(sources, ast, dependentTypeInfo.toMap, isMainContext = isMainContext) + lazy val res = typeCheck(sources, ast, dependentTypeInfo.toMap) () => res } } - private def typeCheck(pkgSources: Vector[Source], pkg: PPackage, dependentTypeInfo: DependentTypeInfo, isMainContext: Boolean = false, isLazy: Boolean = false): TypeCheckResult = { + private def typeCheck(pkgSources: Vector[Source], pkg: PPackage, dependentTypeInfo: DependentTypeInfo, isLazy: Boolean = false): TypeCheckResult = { val startMs = System.currentTimeMillis() logger.trace(s"start type-checking ${pkg.info.id}") val res = Info.checkSources(pkgSources, pkg, dependentTypeInfo, isMainContext = isMainContext)(config) @@ -222,37 +177,31 @@ object Info extends LazyLogging { } } - def typeCheck(pkg: AbstractPackage): TypeCheckResult = { + def typeCheck(pkg: AbstractPackage): Future[TypeCheckResult] = { typeCheckManager.addIfAbsent(pkg, TypeCheckJob(pkg, isMainContext = true)) - val resFn = typeCheckManager.getResult(pkg) - resFn() - } - - def typeCheckFut(pkg: AbstractPackage): Future[TypeCheckResult] = { - typeCheckManager.addIfAbsent(pkg, TypeCheckJob(pkg, isMainContext = true)) - typeCheckManager.getResultFut(pkg) - .map(resFn => resFn())(executionContext) + typeCheckManager.getResult(pkg) + .map(resFn => resFn()) } } - def check(config: Config, abstractPackage: AbstractPackage, parseResults: Map[AbstractPackage, ParseResult])(executionContext: GobraExecutionContext): TypeCheckResult = { + def check(config: Config, abstractPackage: AbstractPackage, parseResults: Map[AbstractPackage, ParseResult])(implicit executor: GobraExecutionContext): EitherT[Vector[VerifierError], Future, TypeInfo] = { for { // check whether parsing of this package was successful: - parseResult <- parseResults(abstractPackage) + parseResult <- EitherT.fromEither(Future.successful[Either[Vector[VerifierError], ParseSuccessResult]](parseResults(abstractPackage))) // check whether there are any import cycles: - cycleResult <- new CycleChecker(config, parseResults).check(abstractPackage) - .left.map(errs => { + cycleResult <- EitherT.fromEither(Future.successful(new CycleChecker(config, parseResults).check(abstractPackage))) + .leftMap(errs => { val (sources, pkg) = parseResult val sourceNames = sources.map(_.name) config.reporter report TypeCheckFailureMessage(sourceNames, pkg.packageClause.id.name, () => pkg, errs) errs }) typeCheckingStartMs = System.currentTimeMillis() - context = new Context(config, cycleResult)(executionContext) - typeInfo <- context.typeCheck(abstractPackage) + context = new Context(config, cycleResult) + typeInfo <- EitherT.fromEither(context.typeCheck(abstractPackage)) _ = logger.debug { val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" - s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})" + s"type-checking done, took ${durationS}s (in mode ${config.parseAndTypeCheckMode})" } _ = logger.debug { val typeCheckingEndMs = System.currentTimeMillis() @@ -264,39 +213,6 @@ object Info extends LazyLogging { } yield typeInfo } - def checkFut(config: Config, abstractPackage: AbstractPackage, parseResults: Map[AbstractPackage, ParseResult])(executionContext: GobraExecutionContext): Future[TypeCheckResult] = { - implicit val executor: GobraExecutionContext = executionContext - val res = for { - // check whether parsing of this package was successful: - parseResult <- parseResults(abstractPackage) - // check whether there are any import cycles: - cycleResult <- new CycleChecker(config, parseResults).check(abstractPackage) - .left.map(errs => { - val (sources, pkg) = parseResult - val sourceNames = sources.map(_.name) - config.reporter report TypeCheckFailureMessage(sourceNames, pkg.packageClause.id.name, () => pkg, errs) - errs - }) - typeCheckingStartMs = System.currentTimeMillis() - context = new Context(config, cycleResult)(executionContext) - typeInfoFut = for { - typeInfo <- context.typeCheckFut(abstractPackage) - _ = logger.debug { - val durationS = f"${(System.currentTimeMillis() - typeCheckingStartMs) / 1000f}%.1f" - s"type-checking done, took ${durationS}s (in mode ${config.typeCheckMode})" - } - _ = logger.debug { - val typeCheckingEndMs = System.currentTimeMillis() - val sumDurationS = f"${context.tyeCheckDurationMs.get() / 1000f}%.1f" - val overheadMs = (typeCheckingEndMs - typeCheckingStartMs) - context.tyeCheckDurationMs.get() - val overheadS = f"${overheadMs / 1000f}%.1f" - s"type-checking individual packages took ${sumDurationS}s. Overhead for tasks is thus ${overheadS}s (${(100f * overheadMs / (typeCheckingEndMs - typeCheckingStartMs)).toInt}%)" - } - } yield typeInfo - } yield typeInfoFut - res.fold(errs => Future.successful(Left(errs)), identity) - } - type TypeInfoCacheKey = String private val typeInfoCache: ConcurrentMap[TypeInfoCacheKey, TypeInfoImpl] = new ConcurrentHashMap() @@ -339,9 +255,9 @@ object Info extends LazyLogging { typeInfoCache.computeIfAbsent(getCacheKey(pkg, dependentTypeInfo, isMainContext, config), _ => getTypeInfo(pkg, dependentTypeInfo, isMainContext, config)) } - val checkFn = if (config.cacheParser) { getTypeInfoCached _ } else { getTypeInfo _ } + val checkFn = if (config.cacheParserAndTypeChecker) { getTypeInfoCached _ } else { getTypeInfo _ } val info = checkFn(pkg, dependentTypeInfo, isMainContext, config) - if (!cacheHit && config.cacheParser) { + if (!cacheHit && config.cacheParserAndTypeChecker) { logger.trace(s"No cache hit for type info for ${pkg.info.id}") } diff --git a/src/test/scala/viper/gobra/BenchmarkTests.scala b/src/test/scala/viper/gobra/BenchmarkTests.scala index afbe52588..089d522a2 100644 --- a/src/test/scala/viper/gobra/BenchmarkTests.scala +++ b/src/test/scala/viper/gobra/BenchmarkTests.scala @@ -56,7 +56,7 @@ trait GobraFrontendForTesting extends Frontend { val z3PropertyName = "GOBRATESTS_Z3_EXE" val z3Exe: Option[String] = Option(System.getProperty(z3PropertyName)) - protected val executor: GobraExecutionContext = new DefaultGobraExecutionContext() + protected implicit val executor: GobraExecutionContext = new DefaultGobraExecutionContext() protected var config: Option[Config] = None /** Initialize this translator with a given verifier. Only meant to be called once. */ diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index e22a5ab30..713679558 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -10,6 +10,7 @@ import java.nio.file.Path import ch.qos.logback.classic.Level import org.bitbucket.inkytonik.kiama.util.Source import org.scalatest.{Args, BeforeAndAfterAll, Status} +import scalaz.Scalaz.futureInstance import viper.gobra.frontend.PackageResolver.RegularPackage import viper.gobra.frontend.Source.FromFileSource import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel} @@ -35,10 +36,6 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { var gobraInstance: Gobra = _ var executor: GobraExecutionContext = _ var inputs: Vector[Source] = Vector.empty - // while we could pre-fetch and cache parse and maybe even type-check results, the regression test suite is designed - // in a way that each file is its own test case. However, feeding a map of package infos to Gobra results in Gobra - // considering these files in a Go way, i.e., groups them by package clause. This in turn results in testcase failures - // as errors occur in files technically not under test but in the same directory and having the same package clause. val cacheParserAndTypeChecker = true override def beforeAll(): Unit = { @@ -58,8 +55,7 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { reporter = NoopReporter, packageInfoInputMap = Map(Source.getPackageInfo(source, Path.of("")) -> Vector(source)), checkConsistency = true, - cacheParser = cacheParserAndTypeChecker, - typeCheckMode = if (cacheParserAndTypeChecker) Parallel else Lazy, + cacheParserAndTypeChecker = cacheParserAndTypeChecker, z3Exe = z3Exe ) @@ -69,13 +65,12 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { val futs = inputs.map(source => { val config = getConfig(source) val pkgInfo = config.packageInfoInputMap.keys.head - for { - parseResultEither <- Parser.parseFut(config, pkgInfo)(executor) + val fut = for { + parseResult <- Parser.parseFut(config, pkgInfo) pkg = RegularPackage(pkgInfo.id) - typeCheckResultEither <- parseResultEither.fold( - parseErrs => Future.successful(Left(parseErrs)), - parseResult => Info.checkFut(config, pkg, parseResult)(executor)) - } yield typeCheckResultEither + typeCheckResult <- Info.checkFut(config, pkg, parseResult) + } yield typeCheckResult + fut.toEither }) Await.result(Future.sequence(futs), Duration.Inf) println("pre-parsing and pre-typeChecking completed") From 52317a45e4efcf0ddb006cc7e5ed928c7fa8f64f Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 30 Jun 2023 15:48:17 +0200 Subject: [PATCH 142/296] fixes compilation errors --- .../scala/viper/gobra/BenchmarkTests.scala | 177 ++++++++++-------- .../viper/gobra/DetailedBenchmarkTests.scala | 21 +-- src/test/scala/viper/gobra/GobraTests.scala | 5 +- 3 files changed, 116 insertions(+), 87 deletions(-) diff --git a/src/test/scala/viper/gobra/BenchmarkTests.scala b/src/test/scala/viper/gobra/BenchmarkTests.scala index 089d522a2..c10ecec0a 100644 --- a/src/test/scala/viper/gobra/BenchmarkTests.scala +++ b/src/test/scala/viper/gobra/BenchmarkTests.scala @@ -10,6 +10,8 @@ import org.rogach.scallop.throwError import java.nio.file.Path import org.scalatest.{ConfigMap, DoNotDiscover} +import scalaz.EitherT +import scalaz.Scalaz.futureInstance import viper.gobra.frontend.{Config, PackageResolver, ScallopGobraConfig} import viper.gobra.reporting.{NoopReporter, VerifierError, VerifierResult} import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext, Violation} @@ -19,6 +21,10 @@ import viper.silver.testing.StatisticalTestSuite import viper.silver.verifier.{NoVerifier, Verifier} import viper.silver.{verifier => vpr} +import java.util.concurrent.TimeUnit +import scala.concurrent.duration.Duration +import scala.concurrent.{Await, Future} + @DoNotDiscover trait BenchmarkTests extends StatisticalTestSuite { @@ -50,94 +56,119 @@ trait BenchmarkTests extends StatisticalTestSuite { super.afterAll(configMap) gobraFrontend.terminate() } -} -trait GobraFrontendForTesting extends Frontend { - val z3PropertyName = "GOBRATESTS_Z3_EXE" - val z3Exe: Option[String] = Option(System.getProperty(z3PropertyName)) + trait GobraFrontendForTesting extends Frontend { + val z3PropertyName = "GOBRATESTS_Z3_EXE" + val z3Exe: Option[String] = Option(System.getProperty(z3PropertyName)) - protected implicit val executor: GobraExecutionContext = new DefaultGobraExecutionContext() - protected var config: Option[Config] = None + protected implicit val executor: GobraExecutionContext = new DefaultGobraExecutionContext() + protected var config: Option[Config] = None - /** Initialize this translator with a given verifier. Only meant to be called once. */ - override def init(verifier: Verifier): Unit = () // ignore verifier argument as we reuse the Gobra / Parser / TypeChecker / etc. instances for all tests + /** Initialize this translator with a given verifier. Only meant to be called once. */ + override def init(verifier: Verifier): Unit = () // ignore verifier argument as we reuse the Gobra / Parser / TypeChecker / etc. instances for all tests - override def reset(files: Seq[Path]): Unit = - createConfig(Array("-i", files.toVector.mkString(" "))) + override def reset(files: Seq[Path]): Unit = + createConfig(Array("-i", files.toVector.mkString(" "))) - private def createConfig(args: Array[String]): Config = { - // set throwError to true: Scallop will throw an exception instead of terminating the program in case an - // exception occurs (e.g. a validation failure) - throwError.value = true - // Simulate pick of package, Gobra normally does - val config = new ScallopGobraConfig(args.toSeq).config - Violation.violation(config.isRight, "creating the config has failed") - config.toOption.get.copy(reporter = NoopReporter, z3Exe = z3Exe) - } + private def createConfig(args: Array[String]): Config = { + // set throwError to true: Scallop will throw an exception instead of terminating the program in case an + // exception occurs (e.g. a validation failure) + throwError.value = true + // Simulate pick of package, Gobra normally does + val config = new ScallopGobraConfig(args.toSeq).config + Violation.violation(config.isRight, "creating the config has failed") + config.toOption.get.copy(reporter = NoopReporter, z3Exe = z3Exe) + } - def gobraResult: VerifierResult - - /** - * The result of the verification attempt (only available after parse, typecheck, translate and - * verify have been called). - */ - override def result: vpr.VerificationResult = { - // transform Gobra errors back to vpr.AbstractError such that the benchmarking framework automatically handles them - gobraResult match { - case VerifierResult.Success => vpr.Success - case VerifierResult.Failure(errors) => vpr.Failure(errors.map(GobraTestError)) + def gobraResult: VerifierResult + + /** + * The result of the verification attempt (only available after parse, typecheck, translate and + * verify have been called). + */ + override def result: vpr.VerificationResult = { + // transform Gobra errors back to vpr.AbstractError such that the benchmarking framework automatically handles them + gobraResult match { + case VerifierResult.Success => vpr.Success + case VerifierResult.Failure(errors) => vpr.Failure(errors.map(GobraTestError)) + } } - } - def terminate(): Unit = { - executor.terminateAndAssertInexistanceOfTimeout() - } + def terminate(): Unit = { + executor.terminateAndAssertInexistanceOfTimeout() + } - /** - * Represents a phase in Gobra producing a result of type Either[E, O]. - * As Phase is a case class defined in Frontend, this trait has to be defined here (instead of external to the Gobra frontent) - */ - trait Step[O, E] { - def res: Option[Either[E, O]] - def phase: Phase - def phases: Seq[Phase] - def reset(): Unit - } + /** + * Represents a phase in Gobra producing a result of type Either[E, O]. + * As Phase is a case class defined in Frontend, this trait has to be defined here (instead of external to the Gobra frontend) + */ + trait Step[O, E] { + def res: Option[Either[E, O]] + def phase: Phase + def phases: Seq[Phase] + def reset(): Unit + } - case class InitialStep[E, O](name: String, fn: () => Either[E, O]) extends Step[O, E] { - var res: Option[Either[E, O]] = None - override val phase: Phase = Phase(name, () => { - res = Some(fn()) - }) - override def phases: Seq[Phase] = Seq(phase) - override def reset(): Unit = + case class InitialStep[E, O](name: String, fn: () => Either[E, O]) extends Step[O, E] { + var res: Option[Either[E, O]] = None + override val phase: Phase = Phase(name, () => { + res = Some(fn()) + }) + override def phases: Seq[Phase] = Seq(phase) + override def reset(): Unit = + res = None + } + + case class InitialStepEitherT[E, O](name: String, fn: () => EitherT[E, Future, O]) extends Step[O, E] { + var res: Option[Either[E, O]] = None + override val phase: Phase = Phase(name, () => { + res = Some(Await.result(fn().toEither, Duration(timeoutSec, TimeUnit.SECONDS))) + }) + override def phases: Seq[Phase] = Seq(phase) + override def reset(): Unit = + res = None + } + + case class NextStep[I, E, O](name: String, prevStep: Step[I, E], fn: I => Either[E, O]) extends Step[O, E] { + var res: Option[Either[E, O]] = None + override val phase: Phase = Phase(name, () => { + assert(prevStep.res.isDefined) + res = prevStep.res match { + case Some(Right(output)) => Some(fn(output)) + case Some(Left(errs)) => Some(Left(errs)) // propagate errors + } + }) + override def phases: Seq[Phase] = prevStep.phases :+ phase + override def reset(): Unit = + prevStep.reset() res = None - } + } - case class NextStep[I, O, E](name: String, prevStep: Step[I, E], fn: I => Either[E, O]) extends Step[O, E] { - var res: Option[Either[E, O]] = None - override val phase: Phase = Phase(name, () => { - assert(prevStep.res.isDefined) - res = prevStep.res match { - case Some(Right(output)) => Some(fn(output)) - case Some(Left(errs)) => Some(Left(errs)) // propagate errors - } - }) - override def phases: Seq[Phase] = prevStep.phases :+ phase - override def reset(): Unit = - prevStep.reset() - res = None - } + case class NextStepEitherT[I, E, O](name: String, prevStep: Step[I, E], fn: I => EitherT[E, Future, O]) extends Step[O, E] { + var res: Option[Either[E, O]] = None + override val phase: Phase = Phase(name, () => { + assert(prevStep.res.isDefined) + res = prevStep.res match { + case Some(Right(output)) => Some(Await.result(fn(output).toEither, Duration(timeoutSec, TimeUnit.SECONDS))) + case Some(Left(errs)) => Some(Left(errs)) // propagate errors + } + }) + override def phases: Seq[Phase] = prevStep.phases :+ phase + override def reset(): Unit = + prevStep.reset() + res = None + } - case class GobraTestError(error: VerifierError) extends vpr.AbstractError { - /** The position where the error occured. */ - override def pos: Position = error.position.getOrElse(NoPosition) + case class GobraTestError(error: VerifierError) extends vpr.AbstractError { + /** The position where the error occured. */ + override def pos: Position = error.position.getOrElse(NoPosition) - /** A short and unique identifier for this error. */ - override def fullId: String = error.id + /** A short and unique identifier for this error. */ + override def fullId: String = error.id - /** A readable message describing the error. */ - override def readableMessage: String = error.formattedMessage + /** A readable message describing the error. */ + override def readableMessage: String = error.formattedMessage + } } } diff --git a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala index 6537f6ec3..f6303683b 100644 --- a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala +++ b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala @@ -7,8 +7,9 @@ package viper.gobra import java.nio.file.Path -import java.util.concurrent.TimeUnit import org.scalatest.DoNotDiscover +import scalaz.EitherT +import scalaz.Scalaz.futureInstance import viper.gobra.ast.internal.Program import viper.gobra.ast.internal.transform.OverflowChecksTransform import viper.gobra.backend.BackendVerifier @@ -19,8 +20,7 @@ import viper.gobra.frontend.{Desugar, Parser} import viper.gobra.reporting.{AppliedInternalTransformsMessage, BackTranslator, VerifierError, VerifierResult} import viper.gobra.translator.Translator -import scala.concurrent.Await -import scala.concurrent.duration.Duration +import scala.concurrent.Future /** * Tool for benchmarking Gobra's performance split into its individual steps (wrapped as a ScalaTest). @@ -100,7 +100,7 @@ class DetailedBenchmarkTests extends BenchmarkTests { config = gobra.getAndMergeInFileConfig(c, pkgInfo).toOption } - private val parsing = InitialStep[Vector[VerifierError], Map[AbstractPackage, ParseResult]]("parsing", () => { + private val parsing = InitialStepEitherT("parsing", () => { assert(config.isDefined) val c = config.get assert(c.packageInfoInputMap.size == 1) @@ -108,8 +108,7 @@ class DetailedBenchmarkTests extends BenchmarkTests { Parser.parse(c, pkgInfo)(executor) }) - private val typeChecking: NextStep[Map[AbstractPackage, ParseResult], TypeInfo, Vector[VerifierError]] = - NextStep("type-checking", parsing, (parseResults: Map[AbstractPackage, ParseResult]) => { + private val typeChecking = NextStepEitherT("type-checking", parsing, (parseResults: Map[AbstractPackage, ParseResult]) => { assert(config.isDefined) val c = config.get assert(c.packageInfoInputMap.size == 1) @@ -117,7 +116,7 @@ class DetailedBenchmarkTests extends BenchmarkTests { Info.check(c, RegularPackage(pkgInfo.id), parseResults)(executor) }) - private val desugaring: NextStep[TypeInfo, Program, Vector[VerifierError]] = + private val desugaring: NextStep[TypeInfo, Vector[VerifierError], Program] = NextStep("desugaring", typeChecking, { case (typeInfo: TypeInfo) => assert(config.isDefined) val c = config.get @@ -146,14 +145,14 @@ class DetailedBenchmarkTests extends BenchmarkTests { Right(Translator.translate(program, pkgInfo)(c)) }) - private val verifying = NextStep("Viper verification", encoding, (viperTask: BackendVerifier.Task) => { + private val verifying = NextStepEitherT("Viper verification", encoding, (viperTask: BackendVerifier.Task) => { assert(config.isDefined) val c = config.get assert(c.packageInfoInputMap.size == 1) val pkgInfo = c.packageInfoInputMap.keys.head - val resultFuture = BackendVerifier.verify(viperTask, pkgInfo)(c)(executor) - .map(BackTranslator.backTranslate(_)(c))(executor) - Right(Await.result(resultFuture, Duration(timeoutSec, TimeUnit.SECONDS))) + val resultFuture: Future[Either[Vector[VerifierError], VerifierResult]] = BackendVerifier.verify(viperTask, pkgInfo)(c) + .map(res => Right(BackTranslator.backTranslate(res)(c))) + EitherT.fromEither(resultFuture) }) private val lastStep = verifying diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index 713679558..b3ad7b95a 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -13,7 +13,6 @@ import org.scalatest.{Args, BeforeAndAfterAll, Status} import scalaz.Scalaz.futureInstance import viper.gobra.frontend.PackageResolver.RegularPackage import viper.gobra.frontend.Source.FromFileSource -import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel} import viper.gobra.frontend.info.Info import viper.gobra.frontend.{Config, PackageResolver, Parser, Source} import viper.gobra.reporting.VerifierResult.{Failure, Success} @@ -66,9 +65,9 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { val config = getConfig(source) val pkgInfo = config.packageInfoInputMap.keys.head val fut = for { - parseResult <- Parser.parseFut(config, pkgInfo) + parseResult <- Parser.parse(config, pkgInfo) pkg = RegularPackage(pkgInfo.id) - typeCheckResult <- Info.checkFut(config, pkg, parseResult) + typeCheckResult <- Info.check(config, pkg, parseResult) } yield typeCheckResult fut.toEither }) From 50f379c1b4d8b085f42165ad8a2b9ffefab8a3a2 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 30 Jun 2023 16:47:10 +0200 Subject: [PATCH 143/296] fixes unit tests by making type-check caching specific to the config's choice of 32 or 64bit ints --- src/main/scala/viper/gobra/frontend/info/Info.scala | 3 ++- src/test/scala/viper/gobra/GobraTests.scala | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 687730513..90956baf1 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -217,7 +217,7 @@ object Info extends LazyLogging { private val typeInfoCache: ConcurrentMap[TypeInfoCacheKey, TypeInfoImpl] = new ConcurrentHashMap() private def getCacheKey(pkg: PPackage, dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]], isMainContext: Boolean, config: Config): TypeInfoCacheKey = { - // the cache key only depends on config's `typeBounds` and `enableLazyImport` + // the cache key only depends on config's `typeBounds`, `int32bit`, and `enableLazyImport` val pkgKey = pkg.hashCode().toString // the computed key must be deterministic! val dependentTypeInfoKey = dependentTypeInfo @@ -227,6 +227,7 @@ object Info extends LazyLogging { .mkString("") val isMainContextKey = if (isMainContext) "1" else "0" val configKey = config.typeBounds.hashCode().toString ++ + (if (config.int32bit) "1" else "0") ++ (if (config.enableLazyImports) "1" else "0") val key = pkgKey ++ diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index b3ad7b95a..057d0fdb8 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -55,7 +55,7 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { packageInfoInputMap = Map(Source.getPackageInfo(source, Path.of("")) -> Vector(source)), checkConsistency = true, cacheParserAndTypeChecker = cacheParserAndTypeChecker, - z3Exe = z3Exe + z3Exe = z3Exe, ) override def runTests(testName: Option[String], args: Args): Status = { @@ -92,7 +92,7 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { val source = FromFileSource(input.file) val config = getConfig(source) val pkgInfo = config.packageInfoInputMap.keys.head - val (result, elapsedMilis) = time(() => Await.result(gobraInstance.verify(pkgInfo, getConfig(source))(executor), Duration.Inf)) + val (result, elapsedMilis) = time(() => Await.result(gobraInstance.verify(pkgInfo, config)(executor), Duration.Inf)) info(s"Time required: $elapsedMilis ms") From a18c45081ab98a164fa63d984d4580ff175cad8b Mon Sep 17 00:00:00 2001 From: ArquintL Date: Sat, 1 Jul 2023 06:00:52 +0000 Subject: [PATCH 144/296] Updates submodules --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index ae6a1c153..a474657fa 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit ae6a1c153152bdae0005850190b24f0212113474 +Subproject commit a474657fa402c6c88da590525be790d3e16aadd8 From bb3610b9bcc0a403ad8bd1889ab7d26c3fbcfac7 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 3 Jul 2023 09:02:29 +0200 Subject: [PATCH 145/296] fixes a typo --- src/main/scala/viper/gobra/frontend/Desugar.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index d62ab7029..ee642cc98 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -36,7 +36,7 @@ object Desugar extends LazyLogging { val pkg = info.tree.root val importsCollector = new PackageInitSpecCollector - val importeDesugaringDurationMs = new AtomicLong(0) + val importedDesugaringDurationMs = new AtomicLong(0) val importedProgramsFuts = info.getTransitiveTypeInfos(includeThis = false).toSeq.map { tI => Future { val importedDesugaringStartMs = System.currentTimeMillis() val typeInfo = tI.getTypeInfo @@ -45,7 +45,7 @@ object Desugar extends LazyLogging { // registers a package to generate proof obligations for its init code d.registerPackage(importedPackage, importsCollector)(config) val res = (d, d.packageD(importedPackage)) - importeDesugaringDurationMs.addAndGet(System.currentTimeMillis() - importedDesugaringStartMs) + importedDesugaringDurationMs.addAndGet(System.currentTimeMillis() - importedDesugaringStartMs) res }} @@ -69,7 +69,7 @@ object Desugar extends LazyLogging { val (mainDesugarer, mainProgram) = futResults.head val importedPrograms = futResults.tail logger.trace { - val importedDurationS = f"${importeDesugaringDurationMs.get() / 1000f}%.1f" + val importedDurationS = f"${importedDesugaringDurationMs.get() / 1000f}%.1f" s"desugaring imported packages done, took ${importedDurationS}s" } From 08bfba3cbd3bc4e37aaca49fe2ef8f63d156962b Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 3 Jul 2023 09:48:45 +0200 Subject: [PATCH 146/296] adapts 'builtin' and 'stubs' packages to latest changes in Viper --- src/main/resources/stubs/strconv/atoi.gobra | 1 + src/main/resources/stubs/strings/strings.gobra | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/resources/stubs/strconv/atoi.gobra b/src/main/resources/stubs/strconv/atoi.gobra index 3b94ea29d..454e456e0 100644 --- a/src/main/resources/stubs/strconv/atoi.gobra +++ b/src/main/resources/stubs/strconv/atoi.gobra @@ -44,6 +44,7 @@ pure func (e *NumError) Unwrap() error { return e.Err } ghost requires exp >= 0 ensures res == (exp == 0 ? 1 : (base * Exp(base, exp - 1))) +decreases exp pure func Exp(base int, exp int) (res int) { return exp == 0 ? 1 : (base * Exp(base, exp - 1)) } diff --git a/src/main/resources/stubs/strings/strings.gobra b/src/main/resources/stubs/strings/strings.gobra index 22dbf3819..0307bf577 100644 --- a/src/main/resources/stubs/strings/strings.gobra +++ b/src/main/resources/stubs/strings/strings.gobra @@ -202,6 +202,7 @@ func Map(mapping func(rune) rune, s string) string // the result of (len(s) * count) overflows. requires count >= 0 ensures res == (count == 0? "" : s + Repeat(s, count - 1)) +decreases count pure func Repeat(s string, count int) (res string) /*{ if count == 0 { return "" From 9772277565341634a700d78da22ad67aedd6557d Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 3 Jul 2023 12:03:33 +0200 Subject: [PATCH 147/296] improves reporting of consistency errors and errors resulting from applying Viper transformers --- src/main/scala/viper/gobra/Gobra.scala | 2 +- .../scala/viper/gobra/reporting/Message.scala | 8 +++++ .../viper/gobra/reporting/Reporter.scala | 1 + .../viper/gobra/reporting/VerifierError.scala | 6 +++- .../viper/gobra/translator/Translator.scala | 35 ++++++++++++++----- 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index cb9e18620..3012d1d16 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -293,7 +293,7 @@ class Gobra extends GoVerifier with GoIdeVerifier { private def performViperEncoding(program: Program, config: Config, pkgInfo: PackageInfo): Either[Vector[VerifierError], BackendVerifier.Task] = { if (config.shouldViperEncode) { - Right(Translator.translate(program, pkgInfo)(config)) + Translator.translate(program, pkgInfo)(config) } else { Left(Vector()) } diff --git a/src/main/scala/viper/gobra/reporting/Message.scala b/src/main/scala/viper/gobra/reporting/Message.scala index 61530d91b..418e8e4db 100644 --- a/src/main/scala/viper/gobra/reporting/Message.scala +++ b/src/main/scala/viper/gobra/reporting/Message.scala @@ -173,6 +173,14 @@ case class GeneratedViperMessage(taskName: String, inputs: Vector[String], vprAs lazy val vprAstFormatted: String = silver.ast.pretty.FastPrettyPrinter.pretty(vprAst()) } +case class TransformerFailureMessage(inputs: Vector[String], result: Vector[VerifierError]) extends GobraMessage { + override val name: String = s"transformer_failure_message" + + override def toString: String = s"transformer_failure_message(" + + s"files=$inputs, " + + s"failures=${result.map(_.toString).mkString(",")})" +} + case class ChoppedViperMessage(inputs: Vector[String], idx: Int, vprAst: () => vpr.Program, backtrack: () => BackTranslator.BackTrackInfo) extends GobraMessage { override val name: String = s"chopped_viper_message" diff --git a/src/main/scala/viper/gobra/reporting/Reporter.scala b/src/main/scala/viper/gobra/reporting/Reporter.scala index f4cffc761..0c6d7cb66 100644 --- a/src/main/scala/viper/gobra/reporting/Reporter.scala +++ b/src/main/scala/viper/gobra/reporting/Reporter.scala @@ -66,6 +66,7 @@ case class FileWriterReporter(name: String = "filewriter_reporter", } case m:ParserErrorMessage if streamErrs => m.result.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) case m:TypeCheckFailureMessage if streamErrs => m.result.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) + case m:TransformerFailureMessage if streamErrs => m.result.foreach(err => logger.error(s"Error at: ${err.formattedMessage}")) case _ => // ignore } diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala index 858c2f2ae..a2877f4cb 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierError.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala @@ -56,11 +56,15 @@ case class DiamondError(message: String) extends VerifierError { val id = "diamond_error" } -case class TimeoutError(message: String) extends VerifierError { +case class TimeoutError(message: String) extends VerifierError { val position: Option[SourcePosition] = None val id = "timeout_error" } +case class ConsistencyError(message: String, position: Option[SourcePosition]) extends VerifierError { + val id = "consistency_error" +} + sealed trait VerificationError extends VerifierError { def info: Source.Verifier.Info diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala index 537b7d94f..63334f790 100644 --- a/src/main/scala/viper/gobra/translator/Translator.scala +++ b/src/main/scala/viper/gobra/translator/Translator.scala @@ -10,17 +10,28 @@ package viper.gobra.translator import viper.gobra.ast.internal.Program import viper.gobra.backend.BackendVerifier import viper.gobra.frontend.{Config, PackageInfo} -import viper.gobra.reporting.GeneratedViperMessage +import viper.gobra.reporting.{ConsistencyError, GeneratedViperMessage, TransformerFailureMessage, VerifierError} import viper.gobra.translator.context.DfltTranslatorConfig import viper.gobra.translator.encodings.programs.ProgramsImpl import viper.gobra.translator.transformers.{AssumeTransformer, TerminationTransformer, ViperTransformer} import viper.gobra.util.Violation +import viper.silver.ast.{AbstractSourcePosition, SourcePosition} import viper.silver.ast.pretty.FastPrettyPrinter +import viper.silver.verifier.AbstractError import viper.silver.{ast => vpr} object Translator { - def translate(program: Program, pkgInfo: PackageInfo)(config: Config): BackendVerifier.Task = { + private def createConsistencyErrors(errs: Seq[AbstractError]): Vector[ConsistencyError] = + errs.map(err => { + val pos = err.pos match { + case sp: AbstractSourcePosition => Some(new SourcePosition(sp.file, sp.start, sp.end)) + case _ => None + } + ConsistencyError(err.readableMessage, pos) + }).toVector + + def translate(program: Program, pkgInfo: PackageInfo)(config: Config): Either[Vector[VerifierError], BackendVerifier.Task] = { val translationConfig = new DfltTranslatorConfig() val programTranslator = new ProgramsImpl() val task = programTranslator.translate(program)(translationConfig) @@ -30,17 +41,25 @@ object Translator { new TerminationTransformer ) - val transformedTask = transformers.foldLeft(task) { - case (t, transformer) => transformer.transform(t) - .fold(errs => Violation.violation(s"Applying transformer ${transformer.getClass.getSimpleName} resulted in errors: ${errs.toString}"), identity) + val transformedTask = transformers.foldLeft[Either[Vector[VerifierError], BackendVerifier.Task]](Right(task)) { + case (Right(t), transformer) => transformer.transform(t).left.map(createConsistencyErrors) + case (errs, _) => errs } if (config.checkConsistency) { - val errors = transformedTask.program.checkTransitively - if (errors.nonEmpty) Violation.violation(errors.toString) + transformedTask + .flatMap(task => { + val consistencyErrs = task.program.checkTransitively + if (consistencyErrs.isEmpty) Right(()) + else Left(createConsistencyErrors(consistencyErrs)) + }) + .left.map(errs => Violation.violation(errs.toString)) } - config.reporter report GeneratedViperMessage(config.taskName, config.packageInfoInputMap(pkgInfo).map(_.name), () => sortAst(transformedTask.program), () => transformedTask.backtrack) + val inputs = config.packageInfoInputMap(pkgInfo).map(_.name) + transformedTask.fold( + errs => config.reporter report TransformerFailureMessage(inputs, errs), + task => config.reporter report GeneratedViperMessage(config.taskName, inputs, () => sortAst(task.program), () => task.backtrack)) transformedTask } From d64f56a474df6f446502eb54d2fa291a9f63c1fd Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 3 Jul 2023 12:05:30 +0200 Subject: [PATCH 148/296] adapts regression tests to latest Viper changes --- .../regressions/features/closures/closures-calldesc2.gobra | 1 + .../regressions/features/closures/closures-calldesc4-map.gobra | 1 + 2 files changed, 2 insertions(+) diff --git a/src/test/resources/regressions/features/closures/closures-calldesc2.gobra b/src/test/resources/regressions/features/closures/closures-calldesc2.gobra index 6f39c6b9f..bc8ffc64c 100644 --- a/src/test/resources/regressions/features/closures/closures-calldesc2.gobra +++ b/src/test/resources/regressions/features/closures/closures-calldesc2.gobra @@ -33,6 +33,7 @@ func hof(ghost cs Calls, f func(ghost seq[int], int)int)(res int) { ghost ensures forall k int :: k > 0 && len(s) == k ==> res == s[k-1] + seqSum(s[:(k-1)]) +decreases len(s) pure func seqSum(s seq[int]) (res int) { return len(s) == 0 ? 0 : (s[len(s)-1] + seqSum(s[:(len(s)-1)])) } diff --git a/src/test/resources/regressions/features/closures/closures-calldesc4-map.gobra b/src/test/resources/regressions/features/closures/closures-calldesc4-map.gobra index ebfe9f7f8..53c6d6e88 100644 --- a/src/test/resources/regressions/features/closures/closures-calldesc4-map.gobra +++ b/src/test/resources/regressions/features/closures/closures-calldesc4-map.gobra @@ -112,6 +112,7 @@ func test2() { ghost ensures forall k int :: k > 0 && len(s) == k ==> res == s[k-1] + seqSum(s[:(k-1)]) +decreases len(s) pure func seqSum(s seq[int]) (res int) { return len(s) == 0 ? 0 : (s[len(s)-1] + seqSum(s[:(len(s)-1)])) } From fc634a43a0a5be2d3633624c74cd81f1aacaa256 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 3 Jul 2023 12:19:32 +0200 Subject: [PATCH 149/296] fixes a compiler error caused by recent error reporting improvements --- src/test/scala/viper/gobra/DetailedBenchmarkTests.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala index 1e2ea620f..09c9cdb6b 100644 --- a/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala +++ b/src/test/scala/viper/gobra/DetailedBenchmarkTests.scala @@ -142,7 +142,7 @@ class DetailedBenchmarkTests extends BenchmarkTests { val c = config.get assert(c.packageInfoInputMap.size == 1) val pkgInfo = c.packageInfoInputMap.keys.head - Right(Translator.translate(program, pkgInfo)(c)) + Translator.translate(program, pkgInfo)(c) }) private val verifying = NextStep("Viper verification", encoding, (viperTask: BackendVerifier.Task) => { From 0fdf73a7bf5566af591e159fb343dc183fbd88cd Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 4 Jul 2023 08:57:32 +0200 Subject: [PATCH 150/296] adds failing test case --- .../resources/regressions/issues/000659.gobra | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/test/resources/regressions/issues/000659.gobra diff --git a/src/test/resources/regressions/issues/000659.gobra b/src/test/resources/regressions/issues/000659.gobra new file mode 100644 index 000000000..7c6ecb2d9 --- /dev/null +++ b/src/test/resources/regressions/issues/000659.gobra @@ -0,0 +1,33 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package issue659 + +type Node struct { + ok bool +} + +pred (s *Set)mem(){ + acc(s) && + acc(s.nodes) && + forall i int:: i in domain(s.nodes) ==> acc(s.nodes[i]) +} + +type Set struct { + nodes map[int]*Node +} + +requires s.mem() +requires acc(n) +requires !(k in unfolding s.mem() in domain(s.nodes)) +func (s *Set) add2(n *Node, k int){ + unfold s.mem() + _,ok := s.nodes[0]; + if ok { + s.nodes[k] = n + fold s.mem() + //:: ExpectedOutput(assert_error:assertion_error) + assert false // should fail + return + } +} From 19296629fe75b188dbf081513da9461ef5de92c4 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 4 Jul 2023 09:30:59 +0200 Subject: [PATCH 151/296] updates ViperServer to latest commit --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index a474657fa..8ac486e32 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit a474657fa402c6c88da590525be790d3e16aadd8 +Subproject commit 8ac486e32dc2b45d82c345dfbf9602468b3b6682 From 1894cefe7a14db639b42d93b7b49eb2d7ce12962 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Wed, 12 Jul 2023 06:56:11 +0200 Subject: [PATCH 152/296] Updates submodules (#661) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 8ac486e32..7b13e90a3 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 8ac486e32dc2b45d82c345dfbf9602468b3b6682 +Subproject commit 7b13e90a37cc2e881f986fc2adbb0ff20c0f34e8 From 64389b2670a8ecff307a4f5fa878830eb091fe21 Mon Sep 17 00:00:00 2001 From: ArquintL Date: Thu, 13 Jul 2023 07:54:42 +0000 Subject: [PATCH 153/296] Updates submodules --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 7b13e90a3..53765141c 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 7b13e90a37cc2e881f986fc2adbb0ff20c0f34e8 +Subproject commit 53765141ceb3ea8e0657c0e1ed3065efd937ae71 From 940a4b5659aacd19a99132bdecd63b4d3fe5d6fc Mon Sep 17 00:00:00 2001 From: ArquintL Date: Mon, 17 Jul 2023 17:36:04 +0000 Subject: [PATCH 154/296] Updates submodules --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 53765141c..e36d0d393 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 53765141ceb3ea8e0657c0e1ed3065efd937ae71 +Subproject commit e36d0d39315f75dfdd53ab879f3e4fe755e6cd58 From 4fc3cc930923b684fb29c6aa12494049d91e4924 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 18 Jul 2023 09:06:13 +0200 Subject: [PATCH 155/296] Update src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> --- .../info/implementation/resolution/MemberResolution.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index 614d2e055..f38148c79 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -405,7 +405,7 @@ trait MemberResolution { this: TypeInfoImpl => def getTypeChecker(importTarget: AbstractImport, errNode: PNode): Either[Messages, ExternalTypeInfo] = { def createImportError(errs: Vector[VerifierError]): Messages = { // create an error message located at the import statement to indicate errors in the imported package - // we distinguish between regular errors and packages whose source files could not be found (not that cyclic + // we distinguish between regular errors and packages whose source files could not be found (note that cyclic // errors are handled before type-checking) val notFoundErr = errs.collectFirst { case e: NotFoundError => e } // alternativeErr is a function to compute the message only when needed From 716eeeb21a2c76dcd5e9851879598f9f336ff381 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 18 Jul 2023 09:23:21 +0200 Subject: [PATCH 156/296] implements CR suggestions by Felix --- .../scala/viper/gobra/frontend/Config.scala | 4 +-- .../scala/viper/gobra/frontend/Desugar.scala | 1 + .../scala/viper/gobra/frontend/Parser.scala | 18 ++++++++---- .../viper/gobra/frontend/info/Info.scala | 28 +++++++++++-------- .../viper/gobra/frontend/info/TypeInfo.scala | 4 --- .../{frontend => util}/TaskManager.scala | 15 ++++------ .../viper/gobra/parsing/ParserUnitTests.scala | 7 +++++ 7 files changed, 45 insertions(+), 32 deletions(-) rename src/main/scala/viper/gobra/{frontend => util}/TaskManager.scala (90%) diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 5dae8c252..2c26a944e 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -16,9 +16,9 @@ import viper.gobra.backend.{ViperBackend, ViperBackends} import viper.gobra.GoVerifier import viper.gobra.frontend.PackageResolver.FileResource import viper.gobra.frontend.Source.getPackageInfo -import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential, TaskManagerMode} +import viper.gobra.util.TaskManagerMode.{Lazy, Parallel, Sequential, TaskManagerMode} import viper.gobra.reporting.{FileWriterReporter, GobraReporter, StdIOReporter} -import viper.gobra.util.{TypeBounds, Violation} +import viper.gobra.util.{TaskManagerMode, TypeBounds, Violation} import viper.silver.ast.SourcePosition import scala.concurrent.duration.Duration diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index ee642cc98..9a0704d51 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -30,6 +30,7 @@ import scala.concurrent.duration.Duration import scala.concurrent.{Await, Future} import scala.reflect.ClassTag +// `LazyLogging` provides us with access to `logger` to emit log messages object Desugar extends LazyLogging { def desugar(config: Config, info: viper.gobra.frontend.info.TypeInfo)(implicit executionContext: GobraExecutionContext): in.Program = { diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 9ef811c57..5900fa9e6 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -20,7 +20,7 @@ import scalaz.EitherT import scalaz.Scalaz.futureInstance import viper.gobra.frontend.GobraParser.{ExprOnlyContext, ImportDeclContext, PreambleContext, SourceFileContext, SpecMemberContext, StmtOnlyContext, TypeOnlyContext} import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, RegularImport, RegularPackage} -import viper.gobra.util.{GobraExecutionContext, Violation} +import viper.gobra.util.{GobraExecutionContext, Job, TaskManager, Violation} import viper.silver.ast.SourcePosition import scala.collection.mutable.ListBuffer @@ -29,6 +29,7 @@ import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} import scala.concurrent.Future +// `LazyLogging` provides us with access to `logger` to emit log messages object Parser extends LazyLogging { type ParseSuccessResult = (Vector[Source], PPackage) @@ -85,7 +86,14 @@ object Parser extends LazyLogging { } } - trait ParseJob extends Job[PreprocessedSources, ParseResult] with ImportResolver { + /** + * Job that preprocesses the specified sources, parses their preambles, and creates parse jobs for all imported + * packages as part of the sequential pre-computations. + * This job then fully parses and post-processes the package (identified via `pkgInfo` and `pkgSources`) in the + * `compute` step and eventually produces this package's ParseResult. Additionally, the preprocessed sources are + * provided alongside. + */ + private trait ParseJob extends Job[PreprocessedSources, ParseResult] with ImportResolver { def pkgInfo: PackageInfo def pkgSources: Vector[Source] def specOnly: Boolean @@ -134,19 +142,19 @@ object Parser extends LazyLogging { } /** this job is used to parse the package that should be verified */ - case class ParseInfoJob(override val pkgInfo: PackageInfo) extends ParseJob { + private case class ParseInfoJob(override val pkgInfo: PackageInfo) extends ParseJob { lazy val pkgSources: Vector[Source] = config.packageInfoInputMap(pkgInfo) lazy val specOnly: Boolean = false } /** this job is used to parse all packages that are imported */ - case class ParseSourcesJob(override val pkgSources: Vector[Source], pkg: AbstractPackage) extends ParseJob { + private case class ParseSourcesJob(override val pkgSources: Vector[Source], pkg: AbstractPackage) extends ParseJob { require(pkgSources.nonEmpty) lazy val pkgInfo: PackageInfo = Source.getPackageInfo(pkgSources.head, config.projectRoot) lazy val specOnly: Boolean = true } - case class ParseFailureJob(errs: Vector[ParserError]) extends Job[PreprocessedSources, ParseResult] { + private case class ParseFailureJob(errs: Vector[ParserError]) extends Job[PreprocessedSources, ParseResult] { override protected def sequentialPrecompute(): PreprocessedSources = Vector.empty override protected def compute(precomputationResult: PreprocessedSources): ParseResult = diff --git a/src/main/scala/viper/gobra/frontend/info/Info.scala b/src/main/scala/viper/gobra/frontend/info/Info.scala index 90956baf1..dcf9f341e 100644 --- a/src/main/scala/viper/gobra/frontend/info/Info.scala +++ b/src/main/scala/viper/gobra/frontend/info/Info.scala @@ -9,24 +9,25 @@ package viper.gobra.frontend.info import com.typesafe.scalalogging.LazyLogging import org.bitbucket.inkytonik.kiama.relation.Tree import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, message} -import org.bitbucket.inkytonik.kiama.util.{Position, Source} +import org.bitbucket.inkytonik.kiama.util.Source import scalaz.EitherT import scalaz.Scalaz.futureInstance import viper.gobra.ast.frontend.{PImport, PNode, PPackage} -import viper.gobra.frontend.{Config, Job, TaskManager} +import viper.gobra.frontend.Config import viper.gobra.frontend.PackageResolver.{AbstractImport, AbstractPackage, BuiltInImport, BuiltInPackage, RegularImport} import viper.gobra.frontend.Parser.{ParseResult, ParseSuccessResult} -import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential} +import viper.gobra.util.TaskManagerMode.{Lazy, Parallel, Sequential} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.ghost.separation.{GhostLessPrinter, GoifyingPrinter} import viper.gobra.reporting.{CyclicImportError, ParserError, TypeCheckDebugMessage, TypeCheckFailureMessage, TypeCheckSuccessMessage, TypeError, VerifierError} -import viper.gobra.util.{GobraExecutionContext, Violation} +import viper.gobra.util.{GobraExecutionContext, Job, TaskManager, Violation} import java.security.MessageDigest import java.util.concurrent.atomic.AtomicLong import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} import scala.concurrent.Future +// `LazyLogging` provides us with access to `logger` to emit log messages object Info extends LazyLogging { type GoTree = Tree[PNode, PPackage] @@ -42,13 +43,8 @@ object Info extends LazyLogging { } } - /** - * ImportCycle describes a cyclic import. `importClosingCycle` is the AST node that closes the cycle and - * `cyclicPackages` stores the packages involved in the cycle. - */ - case class ImportCycle(importNodeCausingCycle: PImport, importNodeStart: Option[Position], cyclicPackages: Vector[AbstractImport]) - - class CycleChecker(val config: Config /*, val parseResults: Map[AbstractPackage, ParseSuccessResult]*/, val parseResults: Map[AbstractPackage, ParseResult]) { + /** checks whether cyclic import patterns exist in the results produced by the parser. */ + class CycleChecker(val config: Config, val parseResults: Map[AbstractPackage, ParseResult]) { /** keeps track of the package dependencies that are currently resolved. This information is used to detect cycles */ private var parserPendingPackages: Vector[AbstractImport] = Vector() @@ -127,7 +123,15 @@ object Info extends LazyLogging { var tyeCheckDurationMs = new AtomicLong(0L) - case class TypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[(Vector[Source], PPackage, Vector[AbstractImport]), () => TypeCheckResult] { + /** + * This job creates type-check jobs for all packages imported by the specified package as part of the sequential + * pre-computations. + * Then, the parse result is retrieved for the specified package and this result is type-checked. To enable lazy + * processing and type-checking, this job provides the type-check result as a closure. While the result is eagerly + * computed in `Sequential` and `Parallel` modes, the result is lazily computed on the first closure call in `Lazy` + * mode. + */ + private case class TypeCheckJob(abstractPackage: AbstractPackage, isMainContext: Boolean = false) extends Job[(Vector[Source], PPackage, Vector[AbstractImport]), () => TypeCheckResult] { override def toString: String = s"TypeCheckJob for $abstractPackage" protected override def sequentialPrecompute(): (Vector[Source], PPackage, Vector[AbstractImport]) = { diff --git a/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala b/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala index 2482363c2..09c479f9f 100644 --- a/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala +++ b/src/main/scala/viper/gobra/frontend/info/TypeInfo.scala @@ -8,17 +8,13 @@ package viper.gobra.frontend.info import org.bitbucket.inkytonik.kiama.relation.Tree import viper.gobra.ast.frontend._ -import viper.gobra.frontend.PackageResolver.AbstractImport import viper.gobra.frontend.info.base.SymbolTable.{MethodImpl, MethodSpec, Regular, TypeMember} import viper.gobra.frontend.info.base.Type.{InterfaceT, Type} import viper.gobra.frontend.info.implementation.resolution.{AdvancedMemberSet, MemberPath} -import viper.gobra.reporting.VerifierError import viper.gobra.theory.Addressability trait TypeInfo extends ExternalTypeInfo { - def dependentTypeInfo: Map[AbstractImport, () => Either[Vector[VerifierError], ExternalTypeInfo]] - def typOfExprOrType(expr: PExpressionOrType): Type def addressability(expr: PExpression): Addressability def addressableVar(id: PIdnNode): Addressability diff --git a/src/main/scala/viper/gobra/frontend/TaskManager.scala b/src/main/scala/viper/gobra/util/TaskManager.scala similarity index 90% rename from src/main/scala/viper/gobra/frontend/TaskManager.scala rename to src/main/scala/viper/gobra/util/TaskManager.scala index 991949ce4..da641b65c 100644 --- a/src/main/scala/viper/gobra/frontend/TaskManager.scala +++ b/src/main/scala/viper/gobra/util/TaskManager.scala @@ -4,16 +4,15 @@ // // Copyright (c) 2011-2023 ETH Zurich. -package viper.gobra.frontend +package viper.gobra.util -import viper.gobra.frontend.TaskManagerMode.{Lazy, Parallel, Sequential, TaskManagerMode} -import viper.gobra.util.{GobraExecutionContext, Violation} +import viper.gobra.util.TaskManagerMode.{Lazy, Parallel, Sequential, TaskManagerMode} import java.util.concurrent.{ConcurrentHashMap, ConcurrentMap} import scala.concurrent.duration.Duration import scala.concurrent.{Await, Future, Promise} -import scala.util.{Failure, Success} import scala.jdk.CollectionConverters._ +import scala.util.{Failure, Success} object TaskManagerMode extends Enumeration { type TaskManagerMode = Value @@ -58,11 +57,9 @@ class TaskManager[K, I, R](mode: TaskManagerMode)(implicit executor: GobraExecut private val jobs: ConcurrentMap[K, Job[I, R]] = new ConcurrentHashMap() def addIfAbsent(id: K, job: Job[I, R]): Unit = { - var isAbsent = false - jobs.computeIfAbsent(id, _ => { - isAbsent = true - job - }) + // `putIfAbsent` returns null if `id` does not yet exist in the map or is associated to a null value: + val oldValue = jobs.putIfAbsent(id, job) + val isAbsent = oldValue == null if (isAbsent) { job.triggerPrecomputation() mode match { diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index 6f0ea8526..a8a132b6e 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -2689,4 +2689,11 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { case PFunctionDecl(_, _, _, _, Some((_, PBlock(Vector(PContinue(Some(p))))))) if p.name == "l" => } } + + test("Parser: should be able to parse an empty for clause") { + frontend.parseStmtOrFail("for { x := 42 }") should matchPattern { + case PForStmt(None, PBoolLit(true), None, PLoopSpec(Vector(), None), PBlock(Vector(PShortVarDecl(Vector(value), Vector(PIdnUnk(varname)), Vector(false))))) + if varname == "x" && value == PIntLit(42) => + } + } } From 04a7a2acdf95bd7cd5629262cdb16a618ffdef72 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 18 Jul 2023 15:07:32 +0200 Subject: [PATCH 157/296] adapts to avoid accidental printing of ASTs --- .../scala/viper/gobra/reporting/Message.scala | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/main/scala/viper/gobra/reporting/Message.scala b/src/main/scala/viper/gobra/reporting/Message.scala index 418e8e4db..569b96cb9 100644 --- a/src/main/scala/viper/gobra/reporting/Message.scala +++ b/src/main/scala/viper/gobra/reporting/Message.scala @@ -92,16 +92,14 @@ case class PreprocessedInputMessage(input: String, preprocessedContent: () => St override val name: String = s"preprocessed_input_message" override def toString: String = s"preprocessed_input_message(" + - s"file=$input, " + - s"content=${preprocessedContent()})" + s"file=$input)" } case class ParsedInputMessage(input: String, ast: () => PProgram) extends GobraMessage { override val name: String = s"parsed_input_message" override def toString: String = s"parsed_input_message(" + - s"file=$input, " + - s"ast=${ast().formatted})" + s"file=$input)" } case class ParserErrorMessage(input: Path, result: Vector[ParserError]) extends GobraMessage { @@ -142,24 +140,21 @@ case class TypeCheckDebugMessage(inputs: Vector[String], ast: () => PPackage, de override val name: String = s"type_check_debug_message" override def toString: String = s"type_check_debug_message(" + - s"files=$inputs, " + - s"debugInfo=${debugTypeInfo()})" + s"files=$inputs)" } case class DesugaredMessage(inputs: Vector[String], internal: () => in.Program) extends GobraMessage { override val name: String = s"desugared_message" override def toString: String = s"desugared_message(" + - s"files=$inputs, " + - s"internal=${internal().formatted})" + s"files=$inputs)" } case class AppliedInternalTransformsMessage(inputs: Vector[String], internal: () => in.Program) extends GobraMessage { override val name: String = s"transform_message" override def toString: String = s"transform_message(" + - s"files=$inputs, " + - s"internal=${internal().formatted})" + s"files=$inputs)" } case class GeneratedViperMessage(taskName: String, inputs: Vector[String], vprAst: () => vpr.Program, backtrack: () => BackTranslator.BackTrackInfo) extends GobraMessage { @@ -167,8 +162,7 @@ case class GeneratedViperMessage(taskName: String, inputs: Vector[String], vprAs override def toString: String = s"generated_viper_message(" + s"taskName=$taskName" + - s"files=$inputs, " + - s"vprFormated=$vprAstFormatted)" + s"files=$inputs)" lazy val vprAstFormatted: String = silver.ast.pretty.FastPrettyPrinter.pretty(vprAst()) } @@ -185,8 +179,7 @@ case class ChoppedViperMessage(inputs: Vector[String], idx: Int, vprAst: () => v override val name: String = s"chopped_viper_message" override def toString: String = s"chopped_viper_message(" + - s"file=$inputs, " + - s"vprFormated=$vprAstFormatted)" + s"file=$inputs)" lazy val vprAstFormatted: String = silver.ast.pretty.FastPrettyPrinter.pretty(vprAst()) } From f21fe701c0a7d4600bf2c184ffc0d06e473148f2 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Wed, 2 Aug 2023 19:46:32 +0200 Subject: [PATCH 158/296] Updates submodules (#667) Co-authored-by: ArquintL --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index e36d0d393..397b43eeb 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit e36d0d39315f75dfdd53ab879f3e4fe755e6cd58 +Subproject commit 397b43eeb24f99c05811987f54da736dd8acaa66 From caca746d0ebe79fa8e7f141c9a8747f2871a995f Mon Sep 17 00:00:00 2001 From: Felix Wolf <60103963+Felalolf@users.noreply.github.com> Date: Thu, 17 Aug 2023 13:38:33 +0200 Subject: [PATCH 159/296] Fix #668 (#669) --- src/test/scala/viper/gobra/BenchmarkTests.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/scala/viper/gobra/BenchmarkTests.scala b/src/test/scala/viper/gobra/BenchmarkTests.scala index c10ecec0a..b54ea5301 100644 --- a/src/test/scala/viper/gobra/BenchmarkTests.scala +++ b/src/test/scala/viper/gobra/BenchmarkTests.scala @@ -68,7 +68,7 @@ trait BenchmarkTests extends StatisticalTestSuite { override def init(verifier: Verifier): Unit = () // ignore verifier argument as we reuse the Gobra / Parser / TypeChecker / etc. instances for all tests override def reset(files: Seq[Path]): Unit = - createConfig(Array("-i", files.toVector.mkString(" "))) + config = Some(createConfig(Array("-i", files.toVector.mkString(" ")))) private def createConfig(args: Array[String]): Config = { From d2acefbbdb9d8f7fcdf14455319d8c79b241f570 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Wed, 6 Sep 2023 02:30:17 +0200 Subject: [PATCH 160/296] Updates submodules (#673) Co-authored-by: ArquintL --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 397b43eeb..3e2f02096 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 397b43eeb24f99c05811987f54da736dd8acaa66 +Subproject commit 3e2f020964fa8d837c444ee54f933e2b577ea551 From 21bd69f423832468686ea0b484445046188f2ff4 Mon Sep 17 00:00:00 2001 From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com> Date: Tue, 12 Sep 2023 11:52:32 +0200 Subject: [PATCH 161/296] Add flag to use Z3 via API (#666) * added z3ApiMode flag * Api -> API * changed space to = * catch ugly exception when z3 java api not in path * Joao's feedback --- .../scala/viper/gobra/backend/Silicon.scala | 28 +++++++++++-------- .../viper/gobra/backend/ViperBackends.scala | 4 +++ .../scala/viper/gobra/frontend/Config.scala | 22 +++++++++++++++ 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/main/scala/viper/gobra/backend/Silicon.scala b/src/main/scala/viper/gobra/backend/Silicon.scala index a8cb1c33a..5440be1c0 100644 --- a/src/main/scala/viper/gobra/backend/Silicon.scala +++ b/src/main/scala/viper/gobra/backend/Silicon.scala @@ -11,7 +11,6 @@ import viper.silicon import viper.silver.ast.Program import viper.silver.reporter._ import viper.silver.verifier.{Failure, Success, VerificationResult} - import scala.concurrent.Future class Silicon(commandLineArguments: Seq[String]) extends ViperVerifier { @@ -23,18 +22,25 @@ class Silicon(commandLineArguments: Seq[String]) extends ViperVerifier { val backend: silicon.Silicon = silicon.Silicon.fromPartialCommandLineArguments(commandLineArguments, reporter) val startTime = System.currentTimeMillis() - backend.start() - val result = backend.verify(program) - backend.stop() + try { + backend.start() + val result = backend.verify(program) + backend.stop() - result match { - case Success => - reporter report OverallSuccessMessage(backend.name, System.currentTimeMillis() - startTime) - case f@Failure(_) => - reporter report OverallFailureMessage(backend.name, System.currentTimeMillis() - startTime, f) - } + result match { + case Success => + reporter report OverallSuccessMessage(backend.name, System.currentTimeMillis() - startTime) + case f@Failure(_) => + reporter report OverallFailureMessage(backend.name, System.currentTimeMillis() - startTime, f) + } - result + result + } catch { + case _: java.lang.UnsatisfiedLinkError => System.err.println("Couldn't find Z3 java API. No libz3java in java.library.path") + new Failure(Seq.empty) + case e: Throwable => + throw e + } } } } diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index ed4ca4f49..7746255ec 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -10,6 +10,7 @@ import viper.gobra.frontend.{Config, MCE} import viper.gobra.util.GobraExecutionContext import viper.server.ViperConfig import viper.server.core.ViperCoreServer +import viper.silicon.decider.Z3ProverAPI import viper.server.vsi.DefaultVerificationServerStart trait ViperBackend { @@ -27,6 +28,9 @@ object ViperBackends { if (config.conditionalizePermissions) { options ++= Vector("--conditionalizePermissions") } + if (config.z3APIMode) { + options = options ++ Vector(s"--prover=${Z3ProverAPI.name}") + } val mceSiliconOpt = config.mceMode match { case MCE.Disabled => "0" case MCE.Enabled => "1" diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 2c26a944e..794f86239 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -65,6 +65,7 @@ object ConfigDefaults { lazy val DefaultAssumeInjectivityOnInhale: Boolean = true lazy val DefaultParallelizeBranches: Boolean = false lazy val DefaultConditionalizePermissions: Boolean = false + lazy val DefaultZ3APIMode: Boolean = false lazy val DefaultMCEMode: MCE.Mode = MCE.Enabled lazy val DefaultEnableLazyImports: Boolean = false lazy val DefaultNoVerify: Boolean = false @@ -127,6 +128,7 @@ case class Config( // branches will be verified in parallel parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, conditionalizePermissions: Boolean = ConfigDefaults.DefaultConditionalizePermissions, + z3APIMode: Boolean = ConfigDefaults.DefaultZ3APIMode, mceMode: MCE.Mode = ConfigDefaults.DefaultMCEMode, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, @@ -174,6 +176,7 @@ case class Config( assumeInjectivityOnInhale = assumeInjectivityOnInhale || other.assumeInjectivityOnInhale, parallelizeBranches = parallelizeBranches, conditionalizePermissions = conditionalizePermissions, + z3APIMode = z3APIMode || other.z3APIMode, mceMode = mceMode, enableLazyImports = enableLazyImports || other.enableLazyImports, noVerify = noVerify || other.noVerify, @@ -225,6 +228,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector assumeInjectivityOnInhale: Boolean = ConfigDefaults.DefaultAssumeInjectivityOnInhale, parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, conditionalizePermissions: Boolean = ConfigDefaults.DefaultConditionalizePermissions, + z3APIMode: Boolean = ConfigDefaults.DefaultZ3APIMode, mceMode: MCE.Mode = ConfigDefaults.DefaultMCEMode, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, @@ -280,6 +284,7 @@ trait RawConfig { assumeInjectivityOnInhale = baseConfig.assumeInjectivityOnInhale, parallelizeBranches = baseConfig.parallelizeBranches, conditionalizePermissions = baseConfig.conditionalizePermissions, + z3APIMode = baseConfig.z3APIMode, mceMode = baseConfig.mceMode, enableLazyImports = baseConfig.enableLazyImports, noVerify = baseConfig.noVerify, @@ -628,6 +633,13 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals short = 'c', ) + val z3APIMode: ScallopOption[Boolean] = opt[Boolean]( + name = "z3APIMode", + descr = "When the backend is either SILICON or VSWITHSILICON, silicon will use Z3 via API.", + default = Some(ConfigDefaults.DefaultZ3APIMode), + noshort = true, + ) + val mceMode: ScallopOption[MCE.Mode] = { val on = "on" val off = "off" @@ -726,6 +738,15 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals } } + addValidation { + val z3APIModeOn = z3APIMode.toOption.contains(true) + if (z3APIModeOn && !isSiliconBasedBackend) { + Left("The selected backend does not support --z3APIMode.") + } else { + Right(()) + } + } + // `mceMode` can only be provided when using a silicon-based backend addValidation { val mceModeSupplied = mceMode.isSupplied @@ -822,6 +843,7 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals assumeInjectivityOnInhale = assumeInjectivityOnInhale(), parallelizeBranches = parallelizeBranches(), conditionalizePermissions = conditionalizePermissions(), + z3APIMode = z3APIMode(), mceMode = mceMode(), enableLazyImports = enableLazyImports(), noVerify = noVerify(), From 5b178fc570f09661fba1ac1bc4e987fa39b68d23 Mon Sep 17 00:00:00 2001 From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com> Date: Wed, 13 Sep 2023 21:21:16 +0200 Subject: [PATCH 162/296] Slice from array didn't have termination measure (#674) --- .../gobra/translator/encodings/slices/SliceEncoding.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala index 6171920e1..7dc2c151f 100644 --- a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala @@ -509,6 +509,7 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { * ensures slen(result) == j - i * ensures scap(result) == alen(a) - i * ensures sarray(result) == a + * decreases _ * { * sfullSliceFromArray(a, i, j, alen(a)) * } @@ -525,6 +526,7 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { val pre1 = synthesized(vpr.LeCmp(vpr.IntLit(0)(), iDecl.localVar))("The low bound of the slice might be negative") val pre2 = synthesized(vpr.LeCmp(iDecl.localVar, jDecl.localVar))("The low bound of the slice might exceed the high bound") val pre3 = synthesized(vpr.LeCmp(jDecl.localVar, ctx.array.len(aDecl.localVar)()))("The high bound of the slice might exceed the array capacity") + val pre4 = synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate") // postconditions val result = vpr.Result(ctx.slice.typ(typ))() @@ -545,7 +547,7 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { s"${Names.sliceFromArray}_${Names.serializeType(typ)}", Seq(aDecl, iDecl, jDecl), ctx.slice.typ(typ), - Seq(pre1, pre2, pre3), + Seq(pre1, pre2, pre3, pre4), Seq(post1, post2, post3, post4), if (generateFunctionBodies) Some(body) else None )() From 86529bc8dad584447a4fd5914e640ece4b6cddec Mon Sep 17 00:00:00 2001 From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com> Date: Thu, 14 Sep 2023 20:14:43 +0200 Subject: [PATCH 163/296] Missing termination measures (#675) * sadd termination * sliceconstruct termination measure * change dummy comment in synthesized --- .../gobra/translator/encodings/slices/SliceEncoding.scala | 4 +++- .../viper/gobra/translator/library/slices/SlicesImpl.scala | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala index 7dc2c151f..5590c54f7 100644 --- a/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/slices/SliceEncoding.scala @@ -342,6 +342,7 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { * ensures soffset(result) == offset * ensures slen(result) == len * ensures scap(result) == cap + * dereases _ * }}} */ private val constructGenerator : FunctionGenerator[vpr.Type] = new FunctionGenerator[vpr.Type] { @@ -357,6 +358,7 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { val pre2 = synthesized(vpr.LeCmp(vpr.IntLit(0)(), lenDecl.localVar))("Slice length might be negative") val pre3 = synthesized(vpr.LeCmp(lenDecl.localVar, capDecl.localVar))("Slice length might exceed capacity") val pre4 = synthesized(vpr.LeCmp(vpr.Add(offsetDecl.localVar, capDecl.localVar)(), ctx.array.len(aDecl.localVar)()))("Slice capacity might exceed the capacity of the underlying array") + val pre5 = synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate") // postconditions val result = vpr.Result(ctx.slice.typ(typ))() @@ -369,7 +371,7 @@ class SliceEncoding(arrayEmb : SharedArrayEmbedding) extends LeafTypeEncoding { s"${Names.sliceConstruct}_${Names.serializeType(typ)}", Seq(aDecl, offsetDecl, lenDecl, capDecl), ctx.slice.typ(typ), - Seq(pre1, pre2, pre3, pre4), + Seq(pre1, pre2, pre3, pre4, pre5), Seq(post1, post2, post3, post4), None )() diff --git a/src/main/scala/viper/gobra/translator/library/slices/SlicesImpl.scala b/src/main/scala/viper/gobra/translator/library/slices/SlicesImpl.scala index f614ab63c..aa1840cb6 100644 --- a/src/main/scala/viper/gobra/translator/library/slices/SlicesImpl.scala +++ b/src/main/scala/viper/gobra/translator/library/slices/SlicesImpl.scala @@ -7,6 +7,8 @@ package viper.gobra.translator.library.slices import viper.gobra.translator.library.arrays.Arrays +import viper.silver.plugin.standard.termination +import viper.gobra.translator.util.ViperUtil.synthesized import viper.silver.{ast => vpr} class SlicesImpl(val arrays : Arrays) extends Slices { @@ -274,6 +276,7 @@ class SlicesImpl(val arrays : Arrays) extends Slices { * {{{ * function sadd(left: Int, right: Int): Int * ensures result == left + right + * decreases * { * left + right * } @@ -284,7 +287,8 @@ class SlicesImpl(val arrays : Arrays) extends Slices { val rDecl = vpr.LocalVarDecl("right", vpr.Int)() val body : vpr.Exp = vpr.Add(lDecl.localVar, rDecl.localVar)() val post : vpr.Exp = vpr.EqCmp(vpr.Result(vpr.Int)(), body)() - vpr.Function("sadd", Seq(lDecl, rDecl), vpr.Int, Seq(), Seq(post), Some(body))() + val pre : vpr.Exp = synthesized(termination.DecreasesTuple(Seq.empty, None))("Termination measure") + vpr.Function("sadd", Seq(lDecl, rDecl), vpr.Int, Seq(pre), Seq(post), Some(body))() } /** From 0c28a113f956b888582dd07c6d533f1cf7f4f958 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 21 Sep 2023 12:00:13 +0200 Subject: [PATCH 164/296] Updates submodules (#677) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 3e2f02096..3359baca9 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 3e2f020964fa8d837c444ee54f933e2b577ea551 +Subproject commit 3359baca924861f5858cda8651b342c584f20edd From 17f510bfaf53031b0d6afc48d04200ca6f830a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Fri, 22 Sep 2023 16:08:47 +0200 Subject: [PATCH 165/296] Enable let expressions with weakly pure subexpressions (#678) * enable non-pure lets * fix tests * addressability of let --- .../gobra/ast/internal/PrettyPrinter.scala | 5 ++- .../viper/gobra/ast/internal/Program.scala | 4 ++- .../scala/viper/gobra/frontend/Desugar.scala | 33 ++++++++++++++----- .../property/Addressability.scala | 1 + .../typing/ghost/GhostExprTyping.scala | 2 +- .../viper/gobra/theory/Addressability.scala | 1 + .../typeless/AssertionEncoding.scala | 8 ++++- .../regressions/features/let/let_simple.gobra | 10 ++++++ 8 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index 4d0cc0040..b1197c095 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -428,6 +428,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter def showAss(a: Assertion): Doc = updatePositionStore(a) <> (a match { case SepAnd(left, right) => showAss(left) <+> "&&" <+> showAss(right) case ExprAssertion(exp) => showExpr(exp) + case Let(left, right, exp) => + "let" <+> showVar(left) <+> "==" <+> parens(showExpr(right)) <+> "in" <+> showAss(exp) case MagicWand(left, right) => showAss(left) <+> "--*" <+> showAss(right) case Implication(left, right) => showExpr(left) <+> "==>" <+> showAss(right) case Access(e, FullPerm(_)) => "acc" <> parens(showAcc(e)) @@ -462,7 +464,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter def showExpr(e: Expr): Doc = updatePositionStore(e) <> (e match { case Unfolding(acc, exp) => "unfolding" <+> showAss(acc) <+> "in" <+> showExpr(exp) - case Let(left, right, exp) => "let" <+> showVar(left) <+> "==" <+> parens(showExpr(right)) <+> "in" <+> showExpr(exp) + case PureLet(left, right, exp) => + "let" <+> showVar(left) <+> "==" <+> parens(showExpr(right)) <+> "in" <+> showExpr(exp) case Old(op, _) => "old" <> parens(showExpr(op)) diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index a23f14046..7012d607f 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -543,10 +543,12 @@ case class Unfolding(acc: Access, in: Expr)(val info: Source.Parser.Info) extend require(typ.addressability == Addressability.unfolding(in.typ.addressability)) } -case class Let(left: LocalVar, right: Expr, in: Expr)(val info: Source.Parser.Info) extends Expr { +case class PureLet(left: LocalVar, right: Expr, in: Expr)(val info: Source.Parser.Info) extends Expr { override def typ: Type = in.typ } +case class Let(left: LocalVar, right: Expr, in: Assertion)(val info: Source.Parser.Info) extends Assertion + case class Old(operand: Expr, typ: Type)(val info: Source.Parser.Info) extends Expr case class LabeledOld(label: LabelProxy, operand: Expr)(val info: Source.Parser.Info) extends Expr { diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 9a0704d51..a7d78f6a8 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -2446,7 +2446,6 @@ object Desugar extends LazyLogging { } } - private def indexedExprD(base : PExpression, index : PExpression)(ctx : FunctionContext, info : TypeInfo)(src : Meta) : Writer[in.IndexedExp] = { for { dbase <- exprD(ctx, info)(base) @@ -2660,14 +2659,6 @@ object Desugar extends LazyLogging { val dOp = pureExprD(ctx, info)(op) unit(in.Unfolding(dAcc, dOp)(src)) - case PLet(ass, op) => - val dOp = pureExprD(ctx, info)(op) - unit((ass.left zip ass.right).foldRight(dOp)((lr, letop) => { - val right = pureExprD(ctx, info)(lr._2) - val left = in.LocalVar(nm.variable(lr._1.name, info.scope(lr._1), info), right.typ.withAddressability(Addressability.exclusiveVariable))(src) - in.Let(left, right, letop)(src) - })) - case n : PIndexedExp => indexedExprD(n)(ctx, info) case PSliceExp(base, low, high, cap) => for { @@ -4277,6 +4268,17 @@ object Desugar extends LazyLogging { wels <- go(els) } yield in.Conditional(wcond, wthn, wels, typ)(src) + case PLet(ass, op) => + val dOp = pureExprD(ctx, info)(op) + unit((ass.left zip ass.right).foldRight(dOp)((lr, letop) => { + val right = pureExprD(ctx, info)(lr._2) + val left = in.LocalVar( + nm.variable(lr._1.name, info.scope(lr._1), info), + right.typ.withAddressability(Addressability.exclusiveVariable) + )(src) + in.PureLet(left, right, letop)(src) + })) + case PForall(vars, triggers, body) => for { (newVars, newTriggers, newBody) <- quantifierD(ctx, info)(vars, triggers, body)(ctx => exprD(ctx, info)) } yield in.PureForall(newVars, newTriggers, newBody)(src) @@ -4530,6 +4532,19 @@ object Desugar extends LazyLogging { case n: PAccess => for {e <- accessibleD(ctx, info)(n.exp); p <- permissionD(ctx, info)(n.perm)} yield in.Access(e, p)(src) case n: PPredicateAccess => predicateCallD(ctx, info)(n.pred, n.perm) + case PLet(ass, op) => + for { + dOp <- assertionD(ctx, info)(op) + lets = (ass.left zip ass.right).foldRight(dOp)((lr, letop) => { + val right = pureExprD(ctx, info)(lr._2) + val left = in.LocalVar( + nm.variable(lr._1.name, info.scope(lr._1), info), + right.typ.withAddressability(Addressability.exclusiveVariable) + )(src) + in.Let(left, right, letop)(src) + }) + } yield lets + case n: PInvoke => // a predicate invocation corresponds to a predicate access with full permissions // register the full permission AST node in the position manager such that its meta information diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala index 30ade529b..a98fe65b5 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Addressability.scala @@ -98,6 +98,7 @@ trait Addressability extends BaseProperty { this: TypeInfoImpl => case _: PPermission => AddrMod.rValue case _: PPredConstructor => AddrMod.rValue case n: PUnfolding => AddrMod.unfolding(addressability(n.op)) + case n: PLet => AddrMod.let(addressability(n.op)) case _: POld | _: PLabeledOld | _: PBefore => AddrMod.old case _: PConditional | _: PImplication | _: PForall | _: PExists => AddrMod.rValue case _: PAccess | _: PPredicateAccess | _: PMagicWand => AddrMod.rValue diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index a49c58c22..9950853e6 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -74,7 +74,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case n: PClosureImplements => isPureExpr(n.closure) ++ wellDefIfClosureMatchesSpec(n.closure, n.spec) - case n: PLet => isExpr(n.op).out ++ isPureExpr(n.op) ++ + case n: PLet => isExpr(n.op).out ++ isWeaklyPureExpr(n.op) ++ n.ass.right.foldLeft(noMessages)((a, b) => a ++ isPureExpr(b)) case n: PAccess => diff --git a/src/main/scala/viper/gobra/theory/Addressability.scala b/src/main/scala/viper/gobra/theory/Addressability.scala index 8f438518a..33ba8dc0b 100644 --- a/src/main/scala/viper/gobra/theory/Addressability.scala +++ b/src/main/scala/viper/gobra/theory/Addressability.scala @@ -119,6 +119,7 @@ object Addressability { val mathDataStructureLookup: Addressability = mathDataStructureElement def unfolding(bodyAddressability: Addressability): Addressability = bodyAddressability + def let(bodyAddressability: Addressability): Addressability = bodyAddressability val old: Addressability = rValue val make: Addressability = Exclusive val exprInAcc: Addressability = Exclusive diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala index 46c9b13d6..1b52308d2 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala @@ -55,7 +55,7 @@ class AssertionEncoding extends Encoding { case errors => Violation.violation(s"invalid trigger pattern (${errors.head.readableMessage})") } - case let: in.Let => + case let: in.PureLet => for { exp <- ctx.expression(let.in) l = ctx.variable(let.left) @@ -66,6 +66,12 @@ class AssertionEncoding extends Encoding { override def assertion(ctx: Context): in.Assertion ==> CodeWriter[vpr.Exp] = { case n@ in.SepAnd(l, r) => for {vl <- ctx.assertion(l); vr <- ctx.assertion(r)} yield withSrc(vpr.And(vl, vr), n) case in.ExprAssertion(e) => ctx.expression(e) + case n@ in.Let(left, right, op) => + for { + exp <- ctx.assertion(op) + r <- ctx.expression(right) + l = ctx.variable(left) + } yield withSrc(vpr.Let(l, r, exp), n) case n@ in.MagicWand(l, r) => for {vl <- ctx.assertion(l); vr <- ctx.assertion(r)} yield withSrc(vpr.MagicWand(vl, vr), n) case n@ in.Implication(l, r) => for {vl <- ctx.expression(l); vr <- ctx.assertion(r)} yield withSrc(vpr.Implies(vl, vr), n) diff --git a/src/test/resources/regressions/features/let/let_simple.gobra b/src/test/resources/regressions/features/let/let_simple.gobra index 030bb432d..f50a4e1b6 100644 --- a/src/test/resources/regressions/features/let/let_simple.gobra +++ b/src/test/resources/regressions/features/let/let_simple.gobra @@ -32,3 +32,13 @@ func (a *A) g(x int) { fold a.Mem() } +pred Q(x int) { + true +} + +requires acc(x) +requires Q(y) +func impureLets(x *int, y int) { + assert let z := y in Q(z) + assert let z := x in acc(z) +} \ No newline at end of file From 8895ec3cbacce1dac3d5a68a6488a0f87499153e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Fri, 22 Sep 2023 19:44:45 +0200 Subject: [PATCH 166/296] Improvements in maps (#676) * start fixing triggers maps * cleanup * fix issues with 'contains' in maps and with trigger generation * backup * backup * doc * Apply suggestions from code review Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> * feedback from Felix --------- Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> --- .../scala/viper/gobra/frontend/Desugar.scala | 1 + .../typing/ghost/GhostExprTyping.scala | 1 + .../gobra/translator/context/Context.scala | 2 + .../context/DfltTranslatorConfig.scala | 5 +- .../combinators/FinalTypeEncoding.scala | 1 + .../encodings/combinators/TypeEncoding.scala | 7 ++ .../combinators/TypeEncodingCombiner.scala | 1 + .../defaults/DefaultTriggerExprEncoding.scala | 27 ++++++++ .../encodings/maps/MapEncoding.scala | 68 +++++++++++++++++-- .../typeless/AssertionEncoding.scala | 12 +--- .../gobra/translator/util/ViperWriter.scala | 9 ++- .../features/maps/maps-simple1.gobra | 25 +++++-- 12 files changed, 135 insertions(+), 24 deletions(-) create mode 100644 src/main/scala/viper/gobra/translator/encodings/defaults/DefaultTriggerExprEncoding.scala diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index a7d78f6a8..b0e751931 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -4306,6 +4306,7 @@ object Desugar extends LazyLogging { } yield underlyingType(dright.typ) match { case _: in.SequenceT | _: in.SetT => in.Contains(dleft, dright)(src) case _: in.MultisetT => in.LessCmp(in.IntLit(0)(src), in.Contains(dleft, dright)(src))(src) + case _: in.MapT => in.Contains(dleft, dright)(src) case t => violation(s"expected a sequence or (multi)set type, but got $t") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index 9950853e6..84fcf0155 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -139,6 +139,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case PIn(left, right) => isExpr(left).out ++ isExpr(right).out ++ { underlyingType(exprType(right)) match { case t : GhostCollectionType => ghostComparableTypes.errors(exprType(left), t.elem)(expr) + case t : MapT => ghostComparableTypes.errors(exprType(left), t.key)(expr) case _ : AdtT => noMessages case t => error(right, s"expected a ghost collection, but got $t") } diff --git a/src/main/scala/viper/gobra/translator/context/Context.scala b/src/main/scala/viper/gobra/translator/context/Context.scala index 259598ebb..224a5c613 100644 --- a/src/main/scala/viper/gobra/translator/context/Context.scala +++ b/src/main/scala/viper/gobra/translator/context/Context.scala @@ -87,6 +87,8 @@ trait Context { def expression(x: in.Expr): CodeWriter[vpr.Exp] = typeEncoding.finalExpression(this)(x) + def triggerExpr(x: in.TriggerExpr): CodeWriter[vpr.Exp] = typeEncoding.triggerExpr(this)(x) + def assertion(x: in.Assertion): CodeWriter[vpr.Exp] = typeEncoding.finalAssertion(this)(x) def invariant(x: in.Assertion): (CodeWriter[Unit], vpr.Exp) = typeEncoding.invariant(this)(x) diff --git a/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala b/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala index 4361f570a..04825342f 100644 --- a/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala +++ b/src/main/scala/viper/gobra/translator/context/DfltTranslatorConfig.scala @@ -16,7 +16,7 @@ import viper.gobra.translator.encodings.closures.ClosureEncoding import viper.gobra.translator.encodings.combinators.{DefaultEncoding, FinalTypeEncoding, SafeTypeEncodingCombiner, TypeEncoding} import viper.gobra.translator.encodings.interfaces.InterfaceEncoding import viper.gobra.translator.encodings.maps.{MapEncoding, MathematicalMapEncoding} -import viper.gobra.translator.encodings.defaults.{DefaultGlobalVarEncoding, DefaultMethodEncoding, DefaultPredicateEncoding, DefaultPureMethodEncoding} +import viper.gobra.translator.encodings.defaults.{DefaultGlobalVarEncoding, DefaultMethodEncoding, DefaultPredicateEncoding, DefaultPureMethodEncoding, DefaultTriggerExprEncoding} import viper.gobra.translator.encodings.options.OptionEncoding import viper.gobra.translator.encodings.preds.PredEncoding import viper.gobra.translator.encodings.sequences.SequenceEncoding @@ -61,6 +61,7 @@ class DfltTranslatorConfig( val pureMethodEncoding = new DefaultPureMethodEncoding val predicateEncoding = new DefaultPredicateEncoding val globalVarEncoding = new DefaultGlobalVarEncoding + val triggerExprEncoding = new DefaultTriggerExprEncoding val typeEncoding: TypeEncoding = new FinalTypeEncoding( new SafeTypeEncodingCombiner(Vector( @@ -73,7 +74,7 @@ class DfltTranslatorConfig( new TerminationEncoding, new BuiltInEncoding, new OutlineEncoding, new DeferEncoding, new GlobalEncoding, new Comments, ), Vector( - methodEncoding, pureMethodEncoding, predicateEncoding, globalVarEncoding + methodEncoding, pureMethodEncoding, predicateEncoding, globalVarEncoding, triggerExprEncoding )) ) diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/FinalTypeEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/FinalTypeEncoding.scala index 3b7a49e89..b6731e0f1 100644 --- a/src/main/scala/viper/gobra/translator/encodings/combinators/FinalTypeEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/combinators/FinalTypeEncoding.scala @@ -46,6 +46,7 @@ class FinalTypeEncoding(te: TypeEncoding) extends TypeEncoding { override def equal(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = te.equal(ctx) orElse expectedMatch("equal") override def goEqual(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = te.goEqual(ctx) orElse expectedMatch("equal") override def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = te.expression(ctx) orElse expectedMatch("expression") + override def triggerExpr(ctx: Context): in.TriggerExpr ==> CodeWriter[vpr.Exp] = te.triggerExpr(ctx) orElse expectedMatch("trigger expression") override def assertion(ctx: Context): in.Assertion ==> CodeWriter[vpr.Exp] = te.assertion(ctx) orElse expectedMatch("assertion") override def reference(ctx: Context): in.Location ==> CodeWriter[vpr.Exp] = te.reference(ctx) orElse expectedMatch("reference") override def addressFootprint(ctx: Context): (in.Location, in.Expr) ==> CodeWriter[vpr.Exp] = te.addressFootprint(ctx) orElse expectedMatch("addressFootprint") diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala index b130a0c2a..1421fdcc7 100644 --- a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala @@ -233,6 +233,13 @@ trait TypeEncoding extends Generator { case in.Conversion(t2, expr :: t) if typ(ctx).isDefinedAt(t) && typ(ctx).isDefinedAt(t2) => ctx.expression(expr) } + /** + * Encodes expressions when they occur as the top-level expression in a trigger. + * The default implements an encoding for predicate instances and defers the + * encoding of all expressions to the expression encoding. + */ + def triggerExpr(@unused ctx: Context): in.TriggerExpr ==> CodeWriter[vpr.Exp] = PartialFunction.empty + /** * Encodes assertions. * diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncodingCombiner.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncodingCombiner.scala index 81b646efd..c4e80a245 100644 --- a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncodingCombiner.scala +++ b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncodingCombiner.scala @@ -49,6 +49,7 @@ abstract class TypeEncodingCombiner(encodings: Vector[TypeEncoding], defaults: V override def equal(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = combiner(_.equal(ctx)) override def goEqual(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = combiner(_.goEqual(ctx)) override def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = combiner(_.expression(ctx)) + override def triggerExpr(ctx: Context): in.TriggerExpr ==> CodeWriter[vpr.Exp] = combiner(_.triggerExpr(ctx)) override def assertion(ctx: Context): in.Assertion ==> CodeWriter[vpr.Exp] = combiner(_.assertion(ctx)) override def reference(ctx: Context): in.Location ==> CodeWriter[vpr.Exp] = combiner(_.reference(ctx)) override def addressFootprint(ctx: Context): (in.Location, in.Expr) ==> CodeWriter[vpr.Exp] = combiner(_.addressFootprint(ctx)) diff --git a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultTriggerExprEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultTriggerExprEncoding.scala new file mode 100644 index 000000000..ecca61171 --- /dev/null +++ b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultTriggerExprEncoding.scala @@ -0,0 +1,27 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2023 ETH Zurich. + +package viper.gobra.translator.encodings.defaults + +import org.bitbucket.inkytonik.kiama.==> +import viper.gobra.ast.{internal => in} +import viper.gobra.translator.context.Context +import viper.gobra.translator.encodings.combinators.Encoding +import viper.silver.{ast => vpr} + +class DefaultTriggerExprEncoding extends Encoding { + import viper.gobra.translator.util.ViperWriter._ + + override def triggerExpr(ctx: Context): in.TriggerExpr ==> CodeWriter[vpr.Exp] = { + // use predicate access encoding but then take just the predicate access, i.e. without the access predicate: + case in.Accessible.Predicate(op) => + for { + v <- ctx.assertion(in.Access(in.Accessible.Predicate(op), in.FullPerm(op.info))(op.info)) + pap = v.asInstanceOf[vpr.PredicateAccessPredicate] + } yield pap.loc + case e: in.Expr => ctx.expression(e) + } +} diff --git a/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala index f8e9116ca..d92fa27f2 100644 --- a/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/maps/MapEncoding.scala @@ -54,10 +54,11 @@ class MapEncoding extends LeafTypeEncoding { * Encodes expressions as values that do not occupy some identifiable location in memory. * R[ nil(map[K]V°) ] -> null * R[ dflt(map[K]V°) ] -> null - * R[ len(e: map[K]V) ] -> [e] == null? 0 : | getCorrespondingMap([e]) | - * R[ (e: map[K]V)[idx] ] -> [e] == null? [ dflt(V) ] : goMapLookup(e[idx]) - * R[ keySet(e: map[K]V) ] -> [e] == null? 0 : MapDomain(getCorrespondingMap(e)) - * R[ valueSet(e: map[K]V) ] -> [e] == null? 0 : MapRange(getCorrespondingMap(e)) + * R[ len(e: map[K]V) ] -> [ e ] == null? 0 : | getCorrespondingMap([ e ]) | + * R[ (e: map[K]V)[idx] ] -> [ e ] == null? [ dflt(V) ] : goMapLookup(e[idx]) + * R[ keySet(e: map[K]V) ] -> [ e ] == null? 0 : MapDomain(getCorrespondingMap([ e ])) + * R[ valueSet(e: map[K]V) ] -> [ e ] == null? 0 : MapRange(getCorrespondingMap([ e ])) + * R[ k in (e: map[K]V) ] -> [ e ] == null? false : MapContains([ k ], getCorrespondingMap([ e ])) */ override def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = { def goE(x: in.Expr): CodeWriter[vpr.Exp] = ctx.expression(x) @@ -85,6 +86,21 @@ class MapEncoding extends LeafTypeEncoding { case l@in.IndexedExp(_ :: ctx.Map(_, _), _, _) => for {(res, _) <- goMapLookup(l)(ctx)} yield res + case l@in.Contains(key, exp :: ctx.Map(keys, values)) => + for { + mapVpr <- goE(exp) + keyVpr <- goE(key) + isComp <- MapEncoding.checkKeyComparability(key)(ctx) + correspondingMap <- getCorrespondingMap(exp, keys, values)(ctx) + containsExp = + withSrc(vpr.CondExp( + withSrc(vpr.EqCmp(mapVpr, withSrc(vpr.NullLit(), l)), l), + withSrc(vpr.FalseLit(), l), + withSrc(vpr.MapContains(keyVpr, correspondingMap), l) + ), l) + checkCompAndContains <- assert(isComp, containsExp, comparabilityErrorT)(ctx) + } yield checkCompAndContains + case k@in.MapKeys(mapExp :: ctx.Map(keys, values), _) => for { vprMap <- goE(mapExp) @@ -111,6 +127,50 @@ class MapEncoding extends LeafTypeEncoding { } } + /** + * Encodes expressions when they occur as the top-level expression in a trigger. + * Notice that using the expression encoding for the following triggers, + * results in ill-formed triggers at the Viper level (e.g., because + * they have ternary operations). + * { m[i] } -> { getCorrespondingMap([ m ])[ [ i ] ] } + * { k in m } -> { [ k ] in getCorrespondingMap([ m ]) } + * { k in domain(m) } -> { [ k ] in domain(getCorrespondingMap([ m ])) } + * { k in range(m) } -> { [ k ] in range(getCorrespondingMap([ m ])) } + */ + override def triggerExpr(ctx: Context): in.TriggerExpr ==> CodeWriter[vpr.Exp] = { + default(super.triggerExpr(ctx)) { + case l@in.IndexedExp(m :: ctx.Map(keys, values), idx, _) => + for { + vIdx <- ctx.expression(idx) + correspondingMap <- getCorrespondingMap(m, keys, values)(ctx) + lookupRes = withSrc(vpr.MapLookup(correspondingMap, vIdx), l) + } yield lookupRes + + case l@in.Contains(key, m :: ctx.Map(keys, values)) => + for { + vKey <- ctx.expression(key) + correspondingMap <- getCorrespondingMap(m, keys, values)(ctx) + contains = withSrc(vpr.MapContains(vKey, correspondingMap), l) + } yield contains + + case l@in.Contains(key, in.MapKeys(m :: ctx.Map(keys, values), _)) => + for { + vKey <- ctx.expression(key) + correspondingMap <- getCorrespondingMap(m, keys, values)(ctx) + vDomainMap = withSrc(vpr.MapDomain(correspondingMap), l) + contains = withSrc(vpr.AnySetContains(vKey, vDomainMap), l) + } yield contains + + case l@in.Contains(key, in.MapValues(m :: ctx.Map(keys, values), _)) => + for { + vKey <- ctx.expression(key) + correspondingMap <- getCorrespondingMap(m, keys, values)(ctx) + vRangeMap = withSrc(vpr.MapRange(correspondingMap), l) + contains = withSrc(vpr.AnySetContains(vKey, vRangeMap), l) + } yield contains + } + } + /** * Encodes the allocation of a new map * [r := make(map[T1]T2, n)] -> diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala index 1b52308d2..6d30f79e2 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala @@ -112,20 +112,10 @@ class AssertionEncoding extends Encoding { def trigger(trigger: in.Trigger)(ctx: Context) : CodeWriter[vpr.Trigger] = { val (pos, info, errT) = trigger.vprMeta - for { expr <- sequence(trigger.exprs map (triggerExpr(_)(ctx))) } + for { expr <- sequence(trigger.exprs map ctx.triggerExpr)} yield vpr.Trigger(expr)(pos, info, errT) } - def triggerExpr(expr: in.TriggerExpr)(ctx: Context): CodeWriter[vpr.Exp] = expr match { - // use predicate access encoding but then take just the predicate access, i.e. remove `acc` and the permission amount: - case in.Accessible.Predicate(op) => - for { - v <- ctx.assertion(in.Access(in.Accessible.Predicate(op), in.FullPerm(op.info))(op.info)) - pap = v.asInstanceOf[vpr.PredicateAccessPredicate] - } yield pap.loc - case e: in.Expr => ctx.expression(e) - } - def quantifier(vars: Vector[in.BoundVar], triggers: Vector[in.Trigger], body: in.Expr)(ctx: Context) : CodeWriter[(Seq[vpr.LocalVarDecl], Seq[vpr.Trigger], vpr.Exp)] = { val newVars = vars map ctx.variable diff --git a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala index de0f8bc67..3983445f9 100644 --- a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala +++ b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala @@ -399,8 +399,13 @@ object ViperWriter { /* Can be used in expressions. */ def assert(cond: vpr.Exp, exp: vpr.Exp, reasonT: (Source.Verifier.Info, ErrorReason) => VerificationError)(ctx: Context): Writer[vpr.Exp] = { // In the future, this might do something more sophisticated - val (res, errT) = ctx.condition.assert(cond, exp, reasonT) - errorT(errT).map(_ => res) + cond match { + case vpr.TrueLit() => + unit(exp) + case _ => + val (res, errT) = ctx.condition.assert(cond, exp, reasonT) + errorT(errT).map(_ => res) + } } /* Emits Viper statements. */ diff --git a/src/test/resources/regressions/features/maps/maps-simple1.gobra b/src/test/resources/regressions/features/maps/maps-simple1.gobra index 8a53e22cd..571d8437a 100644 --- a/src/test/resources/regressions/features/maps/maps-simple1.gobra +++ b/src/test/resources/regressions/features/maps/maps-simple1.gobra @@ -52,6 +52,9 @@ func test6() { m[3] = 10 v3, ok3 := m[3] assert ok3 && v3 == 10 + + // check if key exists in the map + assert 3 in m } type T struct { @@ -110,24 +113,24 @@ func test11() { requires acc(m, _) requires "key" in domain(m) func test12(m map[string]string) (r string){ - return m["key"] + return m["key"] } requires acc(m, _) requires "value" in range(m) func test13(m map[string]string) { - assert exists k string :: m[k] == "value" + assert exists k string :: m[k] == "value" } func test14() (res map[int]int) { x := 1 y := 2 - m := map[int]int{x: y, y: x} + m := map[int]int{x: y, y: x} return m } func test15() (res map[int]int) { - m := map[int]int{C1: C2, C2: C1} + m := map[int]int{C1: C2, C2: C1} return m } @@ -137,4 +140,16 @@ func test16() { assert x == 0 x, contained := m[2] assert x == 0 && !contained -} \ No newline at end of file +} + +requires m != nil ==> acc(m) +requires forall s string :: { s in domain(m) } s in domain(m) ==> acc(m[s]) +func test17(m map[string]*int) {} + +requires m != nil ==> acc(m) +requires forall s string :: { s in m } s in m ==> acc(m[s]) +func test18(m map[string]*int) {} + +requires m != nil ==> acc(m) +requires forall i int :: { i in range(m) } i in range(m) ==> 0 < i +func test19(m map[string]int) {} \ No newline at end of file From a82655da2070d525ad9d79068f8e0beb85e18e77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Sun, 24 Sep 2023 12:26:55 +0200 Subject: [PATCH 167/296] Add flag to require triggers in all quantifiers (#679) * add --requireTriggers flag * change comment --- src/main/scala/viper/gobra/frontend/Config.scala | 16 +++++++++++++++- .../typing/ghost/GhostExprTyping.scala | 12 ++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 794f86239..29d92a022 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -71,6 +71,7 @@ object ConfigDefaults { lazy val DefaultNoVerify: Boolean = false lazy val DefaultNoStreamErrors: Boolean = false lazy val DefaultParseAndTypeCheckMode: TaskManagerMode = TaskManagerMode.Parallel + lazy val DefaultRequireTriggers: Boolean = false } // More-complete exhale modes @@ -134,6 +135,8 @@ case class Config( noVerify: Boolean = ConfigDefaults.DefaultNoVerify, noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, parseAndTypeCheckMode: TaskManagerMode = ConfigDefaults.DefaultParseAndTypeCheckMode, + // when enabled, all quantifiers without triggers are rejected + requireTriggers: Boolean = ConfigDefaults.DefaultRequireTriggers, ) { def merge(other: Config): Config = { @@ -181,7 +184,8 @@ case class Config( enableLazyImports = enableLazyImports || other.enableLazyImports, noVerify = noVerify || other.noVerify, noStreamErrors = noStreamErrors || other.noStreamErrors, - parseAndTypeCheckMode = parseAndTypeCheckMode + parseAndTypeCheckMode = parseAndTypeCheckMode, + requireTriggers = requireTriggers || other.requireTriggers ) } @@ -234,6 +238,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector noVerify: Boolean = ConfigDefaults.DefaultNoVerify, noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, parseAndTypeCheckMode: TaskManagerMode = ConfigDefaults.DefaultParseAndTypeCheckMode, + requireTriggers: Boolean = ConfigDefaults.DefaultRequireTriggers, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -290,6 +295,7 @@ trait RawConfig { noVerify = baseConfig.noVerify, noStreamErrors = baseConfig.noStreamErrors, parseAndTypeCheckMode = baseConfig.parseAndTypeCheckMode, + requireTriggers = baseConfig.requireTriggers, ) } @@ -665,6 +671,13 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) + val requireTriggers: ScallopOption[Boolean] = opt[Boolean]( + name = "requireTriggers", + descr = s"Enforces that all quantifiers have a user-provided trigger.", + default = Some(ConfigDefaults.DefaultRequireTriggers), + noshort = true, + ) + val noVerify: ScallopOption[Boolean] = opt[Boolean]( name = "noVerify", descr = s"Skip the verification step performed after encoding the Gobra program into Viper.", @@ -849,5 +862,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noVerify = noVerify(), noStreamErrors = noStreamErrors(), parseAndTypeCheckMode = parseAndTypeCheckMode(), + requireTriggers = requireTriggers(), ) } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index 84fcf0155..6713908d8 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -46,17 +46,21 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => // check that `thn` and `els` have a common type mergeableTypes.errors(exprType(thn), exprType(els))(expr) - case PForall(vars, triggers, body) => + case n@PForall(vars, triggers, body) => // check whether all triggers are valid and consistent validTriggers(vars, triggers) ++ // check that the quantifier `body` is either Boolean or an assertion - assignableToSpec(body) + assignableToSpec(body) ++ + // check that the user provided triggers when running with --requireTriggers + error(n, "found a quantifier without triggers.", config.requireTriggers && triggers.isEmpty) - case PExists(vars, triggers, body) => + case n@PExists(vars, triggers, body) => // check whether all triggers are valid and consistent validTriggers(vars, triggers) ++ // check that the quantifier `body` is Boolean - assignableToSpec(body) ++ assignableTo.errors(exprType(body), BooleanT)(expr) + assignableToSpec(body) ++ assignableTo.errors(exprType(body), BooleanT)(expr) ++ + // check that the user provided triggers when running with --requireTriggers + error(n, "found a quantifier without triggers.", config.requireTriggers && triggers.isEmpty) case n: PImplication => isExpr(n.left).out ++ isExpr(n.right).out ++ From 4389cb03fbde2276026c8df39b4c77fbf4824b5c Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Sun, 24 Sep 2023 22:07:19 +0200 Subject: [PATCH 168/296] Updates submodules (#680) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 3359baca9..6a70820f2 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 3359baca924861f5858cda8651b342c584f20edd +Subproject commit 6a70820f2a7516245e5ead2e733d30e8586ed584 From 2e8205a89b2352ce63140fa63c138adc22e74689 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 28 Sep 2023 16:16:43 +0200 Subject: [PATCH 169/296] Updates submodules (#682) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 6a70820f2..e68d7d2d8 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 6a70820f2a7516245e5ead2e733d30e8586ed584 +Subproject commit e68d7d2d8cc04f4a95d9846682425dd6e3b07ff4 From 61d0bd916d5c1b183110976e517303ca8ab88289 Mon Sep 17 00:00:00 2001 From: Felix Wolf <60103963+Felalolf@users.noreply.github.com> Date: Tue, 3 Oct 2023 10:43:51 +0200 Subject: [PATCH 170/296] Several ADT improvements (#687) * fixed reordering issue, type of constructors, implicit conversion of argument, some incorrect handling of imported adts, conversion issues with ghost data types, name space conflicts with adt types. I changed the representation of adt types, which I still need to double check. * fixed some issues * adapted parser to parse adts without field names * fixed some bugs, also fixed error message with duplicate fields and clauses for adts * fixed intendation, added comment, removed todo --- build.sbt | 2 +- src/main/antlr4/GobraParser.g4 | 4 +- .../java/viper/gobra/frontend/GobraLexer.java | 634 ++- .../viper/gobra/frontend/GobraParser.java | 5042 +++++++++-------- .../frontend/GobraParserBaseVisitor.java | 9 +- .../gobra/frontend/GobraParserVisitor.java | 8 +- .../viper/gobra/ast/frontend/AstPattern.scala | 1 + .../gobra/ast/internal/PrettyPrinter.scala | 7 +- .../viper/gobra/ast/internal/Program.scala | 67 +- .../scala/viper/gobra/frontend/Desugar.scala | 242 +- .../gobra/frontend/ParseTreeTranslator.scala | 53 +- .../frontend/info/base/SymbolTable.scala | 12 +- .../viper/gobra/frontend/info/base/Type.scala | 18 +- .../property/Assignability.scala | 18 +- .../implementation/property/Implements.scala | 7 +- .../property/TypeIdentity.scala | 1 - .../implementation/property/TypeMerging.scala | 70 +- .../resolution/AdvancedMemberSet.scala | 2 + .../resolution/AmbiguityResolution.scala | 9 +- .../resolution/MemberResolution.scala | 60 +- .../resolution/NameResolution.scala | 55 +- .../implementation/typing/ExprTyping.scala | 13 +- .../info/implementation/typing/IdTyping.scala | 2 +- .../implementation/typing/TypeTyping.scala | 6 +- .../typing/ghost/GhostExprTyping.scala | 20 +- .../typing/ghost/GhostIdTyping.scala | 12 +- .../typing/ghost/GhostMiscTyping.scala | 14 +- .../typing/ghost/GhostStmtTyping.scala | 2 +- .../typing/ghost/GhostTypeTyping.scala | 27 +- .../encodings/adts/AdtEncoding.scala | 76 +- .../sequences/SequenceEncoding.scala | 18 +- .../encodings/sets/SetEncoding.scala | 24 +- .../gobra/translator/util/ViperWriter.scala | 4 +- .../resources/regressions/issues/000589.gobra | 26 + .../resources/regressions/issues/000641.gobra | 19 + .../resources/regressions/issues/000655.gobra | 23 +- .../regressions/issues/000655/pkg/f.gobra | 8 + .../resources/regressions/issues/000685.gobra | 23 + .../regressions/issues/000686-1.gobra | 23 + .../regressions/issues/000686-2.gobra | 18 + .../regressions/issues/000686-3.gobra | 19 + .../regressions/issues/000686-4.gobra | 16 + .../regressions/issues/000686-5.gobra | 16 + .../regressions/issues/000686-6.gobra | 12 + .../ast/InternalPrettyPrinterUnitTests.scala | 77 +- 45 files changed, 3622 insertions(+), 3197 deletions(-) create mode 100644 src/test/resources/regressions/issues/000589.gobra create mode 100644 src/test/resources/regressions/issues/000641.gobra create mode 100644 src/test/resources/regressions/issues/000685.gobra create mode 100644 src/test/resources/regressions/issues/000686-1.gobra create mode 100644 src/test/resources/regressions/issues/000686-2.gobra create mode 100644 src/test/resources/regressions/issues/000686-3.gobra create mode 100644 src/test/resources/regressions/issues/000686-4.gobra create mode 100644 src/test/resources/regressions/issues/000686-5.gobra create mode 100644 src/test/resources/regressions/issues/000686-6.gobra diff --git a/build.sbt b/build.sbt index ce407ccc9..1451ceaad 100644 --- a/build.sbt +++ b/build.sbt @@ -34,7 +34,7 @@ lazy val gobra = (project in file(".")) libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.9", // for SystemUtils libraryDependencies += "org.apache.commons" % "commons-text" % "1.9", // for escaping strings in parser preprocessor libraryDependencies += "commons-codec" % "commons-codec" % "1.15", // for obtaining the hex encoding of a string - libraryDependencies += "org.antlr" % "antlr4-runtime" % "4.12.0", + libraryDependencies += "org.antlr" % "antlr4-runtime" % "4.13.0", libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.3.7", // used for EitherT scalacOptions ++= Seq( diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index c37e545ba..e6cb9b52d 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -150,7 +150,9 @@ domainClause: FUNC IDENTIFIER signature | AXIOM L_CURLY expression eos R_CURLY; adtType: ADT L_CURLY (adtClause eos)* R_CURLY; -adtClause: IDENTIFIER L_CURLY (fieldDecl eos)* R_CURLY; +adtClause: IDENTIFIER L_CURLY (adtFieldDecl eos)* R_CURLY; + +adtFieldDecl: identifierList? type_; ghostSliceType: GHOST L_BRACKET R_BRACKET elementType; diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 13027367a..67e5267c7 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.12.0 +// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.13.0 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -11,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class GobraLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.12.0", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -437,7 +437,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u0000PPpp\u0002\u0000++--\u0001\u0000``\u0002\u0000\"\"\\\\\u0002\u0000"+ "\t\t \u0002\u0000\n\n\r\r\u0003\u0000\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\"+ "abffnnrrttvv\u0001\u000007\u0003\u000009AFaf\u0001\u000001\u0002\u0000"+ - "EEee>\u000009\u0660\u0669\u06f0\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef"+ + "EEee@\u000009\u0660\u0669\u06f0\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef"+ "\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef"+ "\u0d66\u0d6f\u0de6\u0def\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049"+ "\u1090\u1099\u17e0\u17e9\u1810\u1819\u1946\u194f\u19d0\u19d9\u1a80\u1a89"+ @@ -450,115 +450,116 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u8001\u1459\u8001\u14d0\u8001\u14d9\u8001\u1650\u8001\u1659\u8001\u16c0"+ "\u8001\u16c9\u8001\u1730\u8001\u1739\u8001\u18e0\u8001\u18e9\u8001\u1950"+ "\u8001\u1959\u8001\u1c50\u8001\u1c59\u8001\u1d50\u8001\u1d59\u8001\u1da0"+ - "\u8001\u1da9\u8001\u6a60\u8001\u6a69\u8001\u6ac0\u8001\u6ac9\u8001\u6b50"+ - "\u8001\u6b59\u8001\ud7ce\u8001\ud7ff\u8001\ue140\u8001\ue149\u8001\ue2f0"+ - "\u8001\ue2f9\u8001\ue950\u8001\ue959\u8001\ufbf0\u8001\ufbf9\u0288\u0000"+ - "AZaz\u00aa\u00aa\u00b5\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8"+ - "\u02c1\u02c6\u02d1\u02e0\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376"+ - "\u0377\u037a\u037d\u037f\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e"+ - "\u03a1\u03a3\u03f5\u03f7\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560"+ - "\u0588\u05d0\u05ea\u05ef\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5"+ - "\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712"+ - "\u072f\u074d\u07a5\u07b1\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800"+ - "\u0815\u081a\u081a\u0824\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870"+ - "\u0887\u0889\u088e\u08a0\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958"+ - "\u0961\u0971\u0980\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2"+ - "\u09b2\u09b6\u09b9\u09bd\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0"+ - "\u09f1\u09fc\u09fc\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32"+ - "\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85"+ - "\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd"+ - "\u0abd\u0ad0\u0ad0\u0ae0\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13"+ - "\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f"+ - "\u0b61\u0b71\u0b71\u0b83\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99"+ - "\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0"+ - "\u0bd0\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58"+ - "\u0c5a\u0c5d\u0c5d\u0c60\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92"+ - "\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1"+ - "\u0cf2\u0d04\u0d0c\u0d0e\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54"+ - "\u0d56\u0d5f\u0d61\u0d7a\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd"+ - "\u0dbd\u0dc0\u0dc6\u0e01\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84"+ - "\u0e84\u0e86\u0e8a\u0e8c\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd"+ - "\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49"+ - "\u0f6c\u0f88\u0f8c\u1000\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061"+ - "\u1061\u1065\u1066\u106e\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7"+ - "\u10c7\u10cd\u10cd\u10d0\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258"+ - "\u1258\u125a\u125d\u1260\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8"+ - "\u12be\u12c0\u12c0\u12c2\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318"+ - "\u135a\u1380\u138f\u13a0\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681"+ - "\u169a\u16a0\u16ea\u16f1\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760"+ - "\u176c\u176e\u1770\u1780\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880"+ - "\u1884\u1887\u18a8\u18aa\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970"+ - "\u1974\u1980\u19ab\u19b0\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05"+ - "\u1b33\u1b45\u1b4c\u1b83\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d"+ - "\u1c4f\u1c5a\u1c7d\u1c80\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee"+ - "\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20"+ - "\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f"+ - "\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0"+ - "\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f"+ - "\u207f\u2090\u209c\u2102\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119"+ - "\u211d\u2124\u2124\u2126\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c"+ - "\u213f\u2145\u2149\u214e\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2"+ - "\u2cf3\u2d00\u2d25\u2d27\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80"+ - "\u2d96\u2da0\u2da6\u2da8\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8"+ - "\u2dce\u2dd0\u2dd6\u2dd8\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b"+ - "\u303c\u3041\u3096\u309d\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131"+ - "\u318e\u31a0\u31bf\u31f0\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0"+ - "\u8000\ua4fd\u8000\ua500\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a"+ - "\u8000\ua62b\u8000\ua640\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0"+ - "\u8000\ua6e5\u8000\ua717\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b"+ - "\u8000\ua7ca\u8000\ua7d0\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5"+ - "\u8000\ua7d9\u8000\ua7f2\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807"+ - "\u8000\ua80a\u8000\ua80c\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882"+ - "\u8000\ua8b3\u8000\ua8f2\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd"+ - "\u8000\ua8fe\u8000\ua90a\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960"+ - "\u8000\ua97c\u8000\ua984\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0"+ - "\u8000\ua9e4\u8000\ua9e6\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00"+ - "\u8000\uaa28\u8000\uaa40\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60"+ - "\u8000\uaa76\u8000\uaa7a\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1"+ - "\u8000\uaab1\u8000\uaab5\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0"+ - "\u8000\uaac0\u8000\uaac2\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0"+ - "\u8000\uaaea\u8000\uaaf2\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09"+ - "\u8000\uab0e\u8000\uab11\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28"+ - "\u8000\uab2e\u8000\uab30\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70"+ - "\u8000\uabe2\u8000\uac00\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb"+ - "\u8000\ud7fb\u8000\uf900\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00"+ - "\u8000\ufb06\u8000\ufb13\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f"+ - "\u8000\ufb28\u8000\ufb2a\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e"+ - "\u8000\ufb3e\u8000\ufb40\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46"+ - "\u8000\ufbb1\u8000\ufbd3\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92"+ - "\u8000\ufdc7\u8000\ufdf0\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76"+ - "\u8000\ufefc\u8000\uff21\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66"+ - "\u8000\uffbe\u8000\uffc2\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2"+ - "\u8000\uffd7\u8000\uffda\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001"+ - "&\u8001(\u8001:\u8001<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080"+ - "\u8001\u00fa\u8001\u0280\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300"+ - "\u8001\u031f\u8001\u032d\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350"+ - "\u8001\u0375\u8001\u0380\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8"+ - "\u8001\u03cf\u8001\u0400\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8"+ - "\u8001\u04fb\u8001\u0500\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570"+ - "\u8001\u057a\u8001\u057c\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594"+ - "\u8001\u0595\u8001\u0597\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3"+ - "\u8001\u05b9\u8001\u05bb\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740"+ - "\u8001\u0755\u8001\u0760\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787"+ - "\u8001\u07b0\u8001\u07b2\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808"+ - "\u8001\u0808\u8001\u080a\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c"+ - "\u8001\u083c\u8001\u083f\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880"+ - "\u8001\u089e\u8001\u08e0\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900"+ - "\u8001\u0915\u8001\u0920\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be"+ - "\u8001\u09bf\u8001\u0a00\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15"+ - "\u8001\u0a17\u8001\u0a19\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80"+ - "\u8001\u0a9c\u8001\u0ac0\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00"+ - "\u8001\u0b35\u8001\u0b40\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80"+ - "\u8001\u0b91\u8001\u0c00\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0"+ - "\u8001\u0cf2\u8001\u0d00\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0"+ - "\u8001\u0eb1\u8001\u0f00\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30"+ - "\u8001\u0f45\u8001\u0f70\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0"+ - "\u8001\u0ff6\u8001\u1003\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075"+ - "\u8001\u1075\u8001\u1083\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103"+ - "\u8001\u1126\u8001\u1144\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150"+ - "\u8001\u1172\u8001\u1176\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1"+ - "\u8001\u11c4\u8001\u11da\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200"+ - "\u8001\u1211\u8001\u1213\u8001\u122b\u8001\u1280\u8001\u1286\u8001\u1288"+ + "\u8001\u1da9\u8001\u1f50\u8001\u1f59\u8001\u6a60\u8001\u6a69\u8001\u6ac0"+ + "\u8001\u6ac9\u8001\u6b50\u8001\u6b59\u8001\ud7ce\u8001\ud7ff\u8001\ue140"+ + "\u8001\ue149\u8001\ue2f0\u8001\ue2f9\u8001\ue4f0\u8001\ue4f9\u8001\ue950"+ + "\u8001\ue959\u8001\ufbf0\u8001\ufbf9\u0293\u0000AZaz\u00aa\u00aa\u00b5"+ + "\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0"+ + "\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376\u0377\u037a\u037d\u037f"+ + "\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03f5\u03f7"+ + "\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560\u0588\u05d0\u05ea\u05ef"+ + "\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee"+ + "\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1"+ + "\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800\u0815\u081a\u081a\u0824"+ + "\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870\u0887\u0889\u088e\u08a0"+ + "\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958\u0961\u0971\u0980\u0985"+ + "\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd"+ + "\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05"+ + "\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38"+ + "\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93"+ + "\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0"+ + "\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32"+ + "\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83"+ + "\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e"+ + "\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e"+ + "\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60"+ + "\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5"+ + "\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e"+ + "\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a"+ + "\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01"+ + "\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c"+ + "\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6"+ + "\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000"+ + "\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061\u1061\u1065\u1066\u106e"+ + "\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0"+ + "\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258\u1258\u125a\u125d\u1260"+ + "\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2"+ + "\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318\u135a\u1380\u138f\u13a0"+ + "\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681\u169a\u16a0\u16ea\u16f1"+ + "\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760\u176c\u176e\u1770\u1780"+ + "\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880\u1884\u1887\u18a8\u18aa"+ + "\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0"+ + "\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83"+ + "\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80"+ + "\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa"+ + "\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50"+ + "\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6"+ + "\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0"+ + "\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f\u207f\u2090\u209c\u2102"+ + "\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119\u211d\u2124\u2124\u2126"+ + "\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c\u213f\u2145\u2149\u214e"+ + "\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27"+ + "\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8"+ + "\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8"+ + "\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b\u303c\u3041\u3096\u309d"+ + "\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131\u318e\u31a0\u31bf\u31f0"+ + "\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0\u8000\ua4fd\u8000\ua500"+ + "\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a\u8000\ua62b\u8000\ua640"+ + "\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0\u8000\ua6e5\u8000\ua717"+ + "\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b\u8000\ua7ca\u8000\ua7d0"+ + "\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2"+ + "\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c"+ + "\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882\u8000\ua8b3\u8000\ua8f2"+ + "\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000\ua90a"+ + "\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960\u8000\ua97c\u8000\ua984"+ + "\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6"+ + "\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40"+ + "\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60\u8000\uaa76\u8000\uaa7a"+ + "\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1\u8000\uaab1\u8000\uaab5"+ + "\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0\u8000\uaac0\u8000\uaac2"+ + "\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0\u8000\uaaea\u8000\uaaf2"+ + "\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09\u8000\uab0e\u8000\uab11"+ + "\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28\u8000\uab2e\u8000\uab30"+ + "\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70\u8000\uabe2\u8000\uac00"+ + "\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000\uf900"+ + "\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00\u8000\ufb06\u8000\ufb13"+ + "\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f\u8000\ufb28\u8000\ufb2a"+ + "\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000\ufb40"+ + "\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46\u8000\ufbb1\u8000\ufbd3"+ + "\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92\u8000\ufdc7\u8000\ufdf0"+ + "\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76\u8000\ufefc\u8000\uff21"+ + "\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66\u8000\uffbe\u8000\uffc2"+ + "\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2\u8000\uffd7\u8000\uffda"+ + "\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001&\u8001(\u8001:\u8001"+ + "<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080\u8001\u00fa\u8001\u0280"+ + "\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300\u8001\u031f\u8001\u032d"+ + "\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350\u8001\u0375\u8001\u0380"+ + "\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8\u8001\u03cf\u8001\u0400"+ + "\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8\u8001\u04fb\u8001\u0500"+ + "\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570\u8001\u057a\u8001\u057c"+ + "\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594\u8001\u0595\u8001\u0597"+ + "\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3\u8001\u05b9\u8001\u05bb"+ + "\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740\u8001\u0755\u8001\u0760"+ + "\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787\u8001\u07b0\u8001\u07b2"+ + "\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808\u8001\u0808\u8001\u080a"+ + "\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c\u8001\u083c\u8001\u083f"+ + "\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880\u8001\u089e\u8001\u08e0"+ + "\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900\u8001\u0915\u8001\u0920"+ + "\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be\u8001\u09bf\u8001\u0a00"+ + "\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15\u8001\u0a17\u8001\u0a19"+ + "\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80\u8001\u0a9c\u8001\u0ac0"+ + "\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00\u8001\u0b35\u8001\u0b40"+ + "\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80\u8001\u0b91\u8001\u0c00"+ + "\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0\u8001\u0cf2\u8001\u0d00"+ + "\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0\u8001\u0eb1\u8001\u0f00"+ + "\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30\u8001\u0f45\u8001\u0f70"+ + "\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0\u8001\u0ff6\u8001\u1003"+ + "\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075\u8001\u1075\u8001\u1083"+ + "\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103\u8001\u1126\u8001\u1144"+ + "\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150\u8001\u1172\u8001\u1176"+ + "\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1\u8001\u11c4\u8001\u11da"+ + "\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200\u8001\u1211\u8001\u1213"+ + "\u8001\u122b\u8001\u123f\u8001\u1240\u8001\u1280\u8001\u1286\u8001\u1288"+ "\u8001\u1288\u8001\u128a\u8001\u128d\u8001\u128f\u8001\u129d\u8001\u129f"+ "\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001\u1305\u8001\u130c\u8001\u130f"+ "\u8001\u1310\u8001\u1313\u8001\u1328\u8001\u132a\u8001\u1330\u8001\u1332"+ @@ -579,16 +580,18 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001\u1d08\u8001\u1d09\u8001\u1d0b"+ "\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001\u1d60\u8001\u1d65\u8001\u1d67"+ "\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001\u1d98\u8001\u1d98\u8001\u1ee0"+ - "\u8001\u1ef2\u8001\u1fb0\u8001\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480"+ - "\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342e\u8001\u4400"+ - "\u8001\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40\u8001\u6a5e\u8001\u6a70"+ - "\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00\u8001\u6b2f\u8001\u6b40"+ - "\u8001\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d\u8001\u6b8f\u8001\u6e40"+ - "\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50\u8001\u6f50\u8001\u6f93"+ - "\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3\u8001\u6fe3\u8001\u7000"+ - "\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00\u8001\u8d08\u8001\uaff0"+ - "\u8001\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd\u8001\uaffe\u8001\ub000"+ - "\u8001\ub122\u8001\ub150\u8001\ub152\u8001\ub164\u8001\ub167\u8001\ub170"+ + "\u8001\u1ef2\u8001\u1f02\u8001\u1f02\u8001\u1f04\u8001\u1f10\u8001\u1f12"+ + "\u8001\u1f33\u8001\u1fb0\u8001\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480"+ + "\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342f\u8001\u3441"+ + "\u8001\u3446\u8001\u4400\u8001\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40"+ + "\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00"+ + "\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d"+ + "\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50"+ + "\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3"+ + "\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00"+ + "\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd"+ + "\u8001\uaffe\u8001\ub000\u8001\ub122\u8001\ub132\u8001\ub132\u8001\ub150"+ + "\u8001\ub152\u8001\ub155\u8001\ub155\u8001\ub164\u8001\ub167\u8001\ub170"+ "\u8001\ub2fb\u8001\ubc00\u8001\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80"+ "\u8001\ubc88\u8001\ubc90\u8001\ubc99\u8001\ud400\u8001\ud454\u8001\ud456"+ "\u8001\ud49c\u8001\ud49e\u8001\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5"+ @@ -600,9 +603,10 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u8001\ud6c0\u8001\ud6c2\u8001\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc"+ "\u8001\ud714\u8001\ud716\u8001\ud734\u8001\ud736\u8001\ud74e\u8001\ud750"+ "\u8001\ud76e\u8001\ud770\u8001\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa"+ - "\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\ue100"+ - "\u8001\ue12c\u8001\ue137\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290"+ - "\u8001\ue2ad\u8001\ue2c0\u8001\ue2eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8"+ + "\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\udf25"+ + "\u8001\udf2a\u8001\ue030\u8001\ue06d\u8001\ue100\u8001\ue12c\u8001\ue137"+ + "\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290\u8001\ue2ad\u8001\ue2c0"+ + "\u8001\ue2eb\u8001\ue4d0\u8001\ue4eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8"+ "\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001\ue7f0\u8001\ue7fe\u8001\ue800"+ "\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001\ue94b\u8001\ue94b\u8001\uee00"+ "\u8001\uee03\u8001\uee05\u8001\uee1f\u8001\uee21\u8001\uee22\u8001\uee24"+ @@ -616,197 +620,197 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u8001\uee72\u8001\uee74\u8001\uee77\u8001\uee79\u8001\uee7c\u8001\uee7e"+ "\u8001\uee7e\u8001\uee80\u8001\uee89\u8001\uee8b\u8001\uee9b\u8001\ueea1"+ "\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000"+ - "\u8002\ua6df\u8002\ua700\u8002\ub738\u8002\ub740\u8002\ub81d\u8002\ub820"+ + "\u8002\ua6df\u8002\ua700\u8002\ub739\u8002\ub740\u8002\ub81d\u8002\ub820"+ "\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000"+ - "\u8003\u134a\u0607\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004\u0001"+ - "\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001\u0000"+ - "\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000\u0000"+ - "\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000\u0000"+ - "\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000"+ - "\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000"+ - "\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000"+ - "\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000"+ - "\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000"+ - "&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001"+ - "\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000"+ - "\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u0000"+ - "4\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001"+ - "\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000"+ - "\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000"+ - "B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001"+ - "\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000"+ - "\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000"+ - "P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001"+ - "\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000"+ - "\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000"+ - "\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b"+ - "\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000"+ - "\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000"+ - "\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p"+ - "\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000"+ - "\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000"+ - "\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~"+ - "\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000\u0000\u0000\u0000\u0082"+ - "\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000\u0000\u0000\u0000\u0086"+ - "\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000\u0000\u0000\u0000\u008a"+ - "\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000\u0000\u0000\u0000\u008e"+ - "\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000\u0000\u0000\u0000\u0092"+ - "\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000\u0000\u0000\u0000\u0096"+ - "\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000\u0000\u0000\u0000\u009a"+ - "\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000\u0000\u0000\u0000\u009e"+ - "\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2"+ - "\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6"+ - "\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa"+ - "\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae"+ - "\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2"+ - "\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6"+ - "\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba"+ - "\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000\u0000\u0000\u0000\u00be"+ - "\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2"+ - "\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6"+ - "\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca"+ - "\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce"+ - "\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2"+ - "\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6"+ - "\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000\u0000\u0000\u0000\u00da"+ - "\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000\u0000\u0000\u0000\u00de"+ - "\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2"+ - "\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6"+ - "\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea"+ - "\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee"+ - "\u0001\u0000\u0000\u0000\u0000\u00f0\u0001\u0000\u0000\u0000\u0000\u00f2"+ - "\u0001\u0000\u0000\u0000\u0000\u00f4\u0001\u0000\u0000\u0000\u0000\u00f6"+ - "\u0001\u0000\u0000\u0000\u0000\u00f8\u0001\u0000\u0000\u0000\u0000\u00fa"+ - "\u0001\u0000\u0000\u0000\u0000\u00fc\u0001\u0000\u0000\u0000\u0000\u00fe"+ - "\u0001\u0000\u0000\u0000\u0000\u0100\u0001\u0000\u0000\u0000\u0000\u0102"+ - "\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000\u0000\u0000\u0000\u0106"+ - "\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000\u0000\u0000\u0000\u010a"+ - "\u0001\u0000\u0000\u0000\u0000\u010c\u0001\u0000\u0000\u0000\u0000\u010e"+ - "\u0001\u0000\u0000\u0000\u0000\u0110\u0001\u0000\u0000\u0000\u0000\u0112"+ - "\u0001\u0000\u0000\u0000\u0000\u0114\u0001\u0000\u0000\u0000\u0000\u0116"+ - "\u0001\u0000\u0000\u0000\u0000\u0118\u0001\u0000\u0000\u0000\u0000\u011a"+ - "\u0001\u0000\u0000\u0000\u0000\u011c\u0001\u0000\u0000\u0000\u0000\u0122"+ - "\u0001\u0000\u0000\u0000\u0000\u0126\u0001\u0000\u0000\u0000\u0000\u0128"+ - "\u0001\u0000\u0000\u0000\u0000\u012a\u0001\u0000\u0000\u0000\u0000\u012c"+ - "\u0001\u0000\u0000\u0000\u0000\u012e\u0001\u0000\u0000\u0000\u0000\u0130"+ - "\u0001\u0000\u0000\u0000\u0000\u0132\u0001\u0000\u0000\u0000\u0000\u0134"+ - "\u0001\u0000\u0000\u0000\u0000\u0136\u0001\u0000\u0000\u0000\u0000\u0138"+ - "\u0001\u0000\u0000\u0000\u0000\u013a\u0001\u0000\u0000\u0000\u0000\u013c"+ - "\u0001\u0000\u0000\u0000\u0001\u0152\u0001\u0000\u0000\u0000\u0001\u0154"+ - "\u0001\u0000\u0000\u0000\u0001\u0156\u0001\u0000\u0000\u0000\u0001\u0158"+ - "\u0001\u0000\u0000\u0000\u0001\u015a\u0001\u0000\u0000\u0000\u0002\u015e"+ - "\u0001\u0000\u0000\u0000\u0004\u0174\u0001\u0000\u0000\u0000\u0006\u0176"+ - "\u0001\u0000\u0000\u0000\b\u017d\u0001\u0000\u0000\u0000\n\u0185\u0001"+ - "\u0000\u0000\u0000\f\u018c\u0001\u0000\u0000\u0000\u000e\u0193\u0001\u0000"+ - "\u0000\u0000\u0010\u019a\u0001\u0000\u0000\u0000\u0012\u01a1\u0001\u0000"+ - "\u0000\u0000\u0014\u01aa\u0001\u0000\u0000\u0000\u0016\u01b4\u0001\u0000"+ - "\u0000\u0000\u0018\u01bc\u0001\u0000\u0000\u0000\u001a\u01c6\u0001\u0000"+ - "\u0000\u0000\u001c\u01d2\u0001\u0000\u0000\u0000\u001e\u01d9\u0001\u0000"+ - "\u0000\u0000 \u01e4\u0001\u0000\u0000\u0000\"\u01e7\u0001\u0000\u0000"+ - "\u0000$\u01ed\u0001\u0000\u0000\u0000&\u01f6\u0001\u0000\u0000\u0000("+ - "\u01fb\u0001\u0000\u0000\u0000*\u0202\u0001\u0000\u0000\u0000,\u0209\u0001"+ - "\u0000\u0000\u0000.\u020f\u0001\u0000\u0000\u00000\u0214\u0001\u0000\u0000"+ - "\u00002\u021b\u0001\u0000\u0000\u00004\u0225\u0001\u0000\u0000\u00006"+ - "\u0229\u0001\u0000\u0000\u00008\u022f\u0001\u0000\u0000\u0000:\u0232\u0001"+ - "\u0000\u0000\u0000<\u0234\u0001\u0000\u0000\u0000>\u023b\u0001\u0000\u0000"+ - "\u0000@\u0241\u0001\u0000\u0000\u0000B\u024e\u0001\u0000\u0000\u0000D"+ - "\u0257\u0001\u0000\u0000\u0000F\u025b\u0001\u0000\u0000\u0000H\u025f\u0001"+ - "\u0000\u0000\u0000J\u0265\u0001\u0000\u0000\u0000L\u0267\u0001\u0000\u0000"+ - "\u0000N\u026a\u0001\u0000\u0000\u0000P\u026f\u0001\u0000\u0000\u0000R"+ - "\u0275\u0001\u0000\u0000\u0000T\u027b\u0001\u0000\u0000\u0000V\u0282\u0001"+ - "\u0000\u0000\u0000X\u0289\u0001\u0000\u0000\u0000Z\u0292\u0001\u0000\u0000"+ - "\u0000\\\u0298\u0001\u0000\u0000\u0000^\u029e\u0001\u0000\u0000\u0000"+ - "`\u02a5\u0001\u0000\u0000\u0000b\u02ab\u0001\u0000\u0000\u0000d\u02b2"+ - "\u0001\u0000\u0000\u0000f\u02b8\u0001\u0000\u0000\u0000h\u02c1\u0001\u0000"+ - "\u0000\u0000j\u02c9\u0001\u0000\u0000\u0000l\u02cf\u0001\u0000\u0000\u0000"+ - "n\u02d7\u0001\u0000\u0000\u0000p\u02de\u0001\u0000\u0000\u0000r\u02e3"+ - "\u0001\u0000\u0000\u0000t\u02ec\u0001\u0000\u0000\u0000v\u02fb\u0001\u0000"+ - "\u0000\u0000x\u0301\u0001\u0000\u0000\u0000z\u0305\u0001\u0000\u0000\u0000"+ - "|\u0308\u0001\u0000\u0000\u0000~\u030f\u0001\u0000\u0000\u0000\u0080\u0319"+ - "\u0001\u0000\u0000\u0000\u0082\u0323\u0001\u0000\u0000\u0000\u0084\u032f"+ - "\u0001\u0000\u0000\u0000\u0086\u0338\u0001\u0000\u0000\u0000\u0088\u0342"+ - "\u0001\u0000\u0000\u0000\u008a\u034a\u0001\u0000\u0000\u0000\u008c\u0356"+ - "\u0001\u0000\u0000\u0000\u008e\u0365\u0001\u0000\u0000\u0000\u0090\u036b"+ - "\u0001\u0000\u0000\u0000\u0092\u036f\u0001\u0000\u0000\u0000\u0094\u0373"+ - "\u0001\u0000\u0000\u0000\u0096\u0378\u0001\u0000\u0000\u0000\u0098\u0380"+ - "\u0001\u0000\u0000\u0000\u009a\u0388\u0001\u0000\u0000\u0000\u009c\u038d"+ - "\u0001\u0000\u0000\u0000\u009e\u0397\u0001\u0000\u0000\u0000\u00a0\u039e"+ - "\u0001\u0000\u0000\u0000\u00a2\u03a3\u0001\u0000\u0000\u0000\u00a4\u03a9"+ - "\u0001\u0000\u0000\u0000\u00a6\u03ac\u0001\u0000\u0000\u0000\u00a8\u03b0"+ - "\u0001\u0000\u0000\u0000\u00aa\u03b7\u0001\u0000\u0000\u0000\u00ac\u03bc"+ - "\u0001\u0000\u0000\u0000\u00ae\u03c1\u0001\u0000\u0000\u0000\u00b0\u03c6"+ - "\u0001\u0000\u0000\u0000\u00b2\u03ce\u0001\u0000\u0000\u0000\u00b4\u03d5"+ - "\u0001\u0000\u0000\u0000\u00b6\u03db\u0001\u0000\u0000\u0000\u00b8\u03e9"+ - "\u0001\u0000\u0000\u0000\u00ba\u03ec\u0001\u0000\u0000\u0000\u00bc\u03f2"+ - "\u0001\u0000\u0000\u0000\u00be\u03f7\u0001\u0000\u0000\u0000\u00c0\u0402"+ - "\u0001\u0000\u0000\u0000\u00c2\u0406\u0001\u0000\u0000\u0000\u00c4\u040d"+ - "\u0001\u0000\u0000\u0000\u00c6\u0416\u0001\u0000\u0000\u0000\u00c8\u041a"+ - "\u0001\u0000\u0000\u0000\u00ca\u0420\u0001\u0000\u0000\u0000\u00cc\u042a"+ - "\u0001\u0000\u0000\u0000\u00ce\u042c\u0001\u0000\u0000\u0000\u00d0\u0430"+ - "\u0001\u0000\u0000\u0000\u00d2\u0432\u0001\u0000\u0000\u0000\u00d4\u0436"+ - "\u0001\u0000\u0000\u0000\u00d6\u0438\u0001\u0000\u0000\u0000\u00d8\u043c"+ - "\u0001\u0000\u0000\u0000\u00da\u043e\u0001\u0000\u0000\u0000\u00dc\u0440"+ - "\u0001\u0000\u0000\u0000\u00de\u0442\u0001\u0000\u0000\u0000\u00e0\u0444"+ - "\u0001\u0000\u0000\u0000\u00e2\u0446\u0001\u0000\u0000\u0000\u00e4\u044b"+ - "\u0001\u0000\u0000\u0000\u00e6\u0450\u0001\u0000\u0000\u0000\u00e8\u0453"+ - "\u0001\u0000\u0000\u0000\u00ea\u0457\u0001\u0000\u0000\u0000\u00ec\u045a"+ - "\u0001\u0000\u0000\u0000\u00ee\u045d\u0001\u0000\u0000\u0000\u00f0\u0460"+ - "\u0001\u0000\u0000\u0000\u00f2\u0463\u0001\u0000\u0000\u0000\u00f4\u0465"+ - "\u0001\u0000\u0000\u0000\u00f6\u0468\u0001\u0000\u0000\u0000\u00f8\u046a"+ - "\u0001\u0000\u0000\u0000\u00fa\u046d\u0001\u0000\u0000\u0000\u00fc\u046f"+ - "\u0001\u0000\u0000\u0000\u00fe\u0471\u0001\u0000\u0000\u0000\u0100\u0473"+ - "\u0001\u0000\u0000\u0000\u0102\u0476\u0001\u0000\u0000\u0000\u0104\u0479"+ - "\u0001\u0000\u0000\u0000\u0106\u047c\u0001\u0000\u0000\u0000\u0108\u047e"+ - "\u0001\u0000\u0000\u0000\u010a\u0480\u0001\u0000\u0000\u0000\u010c\u0482"+ - "\u0001\u0000\u0000\u0000\u010e\u0484\u0001\u0000\u0000\u0000\u0110\u0486"+ - "\u0001\u0000\u0000\u0000\u0112\u0488\u0001\u0000\u0000\u0000\u0114\u0496"+ - "\u0001\u0000\u0000\u0000\u0116\u049a\u0001\u0000\u0000\u0000\u0118\u04a6"+ - "\u0001\u0000\u0000\u0000\u011a\u04b4\u0001\u0000\u0000\u0000\u011c\u04c0"+ - "\u0001\u0000\u0000\u0000\u011e\u04e4\u0001\u0000\u0000\u0000\u0120\u04e6"+ - "\u0001\u0000\u0000\u0000\u0122\u04f1\u0001\u0000\u0000\u0000\u0124\u04f7"+ - "\u0001\u0000\u0000\u0000\u0126\u04fe\u0001\u0000\u0000\u0000\u0128\u0504"+ - "\u0001\u0000\u0000\u0000\u012a\u0506\u0001\u0000\u0000\u0000\u012c\u050b"+ - "\u0001\u0000\u0000\u0000\u012e\u0510\u0001\u0000\u0000\u0000\u0130\u0517"+ - "\u0001\u0000\u0000\u0000\u0132\u0522\u0001\u0000\u0000\u0000\u0134\u052d"+ - "\u0001\u0000\u0000\u0000\u0136\u053a\u0001\u0000\u0000\u0000\u0138\u0540"+ - "\u0001\u0000\u0000\u0000\u013a\u054f\u0001\u0000\u0000\u0000\u013c\u0555"+ - "\u0001\u0000\u0000\u0000\u013e\u0564\u0001\u0000\u0000\u0000\u0140\u0566"+ - "\u0001\u0000\u0000\u0000\u0142\u0582\u0001\u0000\u0000\u0000\u0144\u058c"+ - "\u0001\u0000\u0000\u0000\u0146\u058e\u0001\u0000\u0000\u0000\u0148\u0590"+ - "\u0001\u0000\u0000\u0000\u014a\u0592\u0001\u0000\u0000\u0000\u014c\u059a"+ - "\u0001\u0000\u0000\u0000\u014e\u059c\u0001\u0000\u0000\u0000\u0150\u059e"+ - "\u0001\u0000\u0000\u0000\u0152\u05a1\u0001\u0000\u0000\u0000\u0154\u05a7"+ - "\u0001\u0000\u0000\u0000\u0156\u05b5\u0001\u0000\u0000\u0000\u0158\u05d2"+ - "\u0001\u0000\u0000\u0000\u015a\u05d6\u0001\u0000\u0000\u0000\u015c\u015f"+ - "\u0003\u0004\u0001\u0000\u015d\u015f\u0003\u011c\u008d\u0000\u015e\u015c"+ - "\u0001\u0000\u0000\u0000\u015e\u015d\u0001\u0000\u0000\u0000\u015f\u0160"+ - "\u0001\u0000\u0000\u0000\u0160\u0161\u0006\u0000\u0000\u0000\u0161\u0003"+ - "\u0001\u0000\u0000\u0000\u0162\u016c\u0003\u0142\u00a0\u0000\u0163\u0164"+ - "\u0005.\u0000\u0000\u0164\u0166\u0004\u0001\u0000\u0000\u0165\u0167\u0003"+ - "\u0142\u00a0\u0000\u0166\u0165\u0001\u0000\u0000\u0000\u0166\u0167\u0001"+ - "\u0000\u0000\u0000\u0167\u0169\u0001\u0000\u0000\u0000\u0168\u016a\u0003"+ - "\u014a\u00a4\u0000\u0169\u0168\u0001\u0000\u0000\u0000\u0169\u016a\u0001"+ - "\u0000\u0000\u0000\u016a\u016d\u0001\u0000\u0000\u0000\u016b\u016d\u0003"+ - "\u014a\u00a4\u0000\u016c\u0163\u0001\u0000\u0000\u0000\u016c\u016b\u0001"+ - "\u0000\u0000\u0000\u016d\u0175\u0001\u0000\u0000\u0000\u016e\u016f\u0005"+ - ".\u0000\u0000\u016f\u0170\u0004\u0001\u0001\u0000\u0170\u0172\u0003\u0142"+ - "\u00a0\u0000\u0171\u0173\u0003\u014a\u00a4\u0000\u0172\u0171\u0001\u0000"+ - "\u0000\u0000\u0172\u0173\u0001\u0000\u0000\u0000\u0173\u0175\u0001\u0000"+ - "\u0000\u0000\u0174\u0162\u0001\u0000\u0000\u0000\u0174\u016e\u0001\u0000"+ - "\u0000\u0000\u0175\u0005\u0001\u0000\u0000\u0000\u0176\u0177\u0005t\u0000"+ - "\u0000\u0177\u0178\u0005r\u0000\u0000\u0178\u0179\u0005u\u0000\u0000\u0179"+ - "\u017a\u0005e\u0000\u0000\u017a\u017b\u0001\u0000\u0000\u0000\u017b\u017c"+ - "\u0006\u0002\u0000\u0000\u017c\u0007\u0001\u0000\u0000\u0000\u017d\u017e"+ - "\u0005f\u0000\u0000\u017e\u017f\u0005a\u0000\u0000\u017f\u0180\u0005l"+ - "\u0000\u0000\u0180\u0181\u0005s\u0000\u0000\u0181\u0182\u0005e\u0000\u0000"+ - "\u0182\u0183\u0001\u0000\u0000\u0000\u0183\u0184\u0006\u0003\u0000\u0000"+ - "\u0184\t\u0001\u0000\u0000\u0000\u0185\u0186\u0005a\u0000\u0000\u0186"+ - "\u0187\u0005s\u0000\u0000\u0187\u0188\u0005s\u0000\u0000\u0188\u0189\u0005"+ - "e\u0000\u0000\u0189\u018a\u0005r\u0000\u0000\u018a\u018b\u0005t\u0000"+ - "\u0000\u018b\u000b\u0001\u0000\u0000\u0000\u018c\u018d\u0005a\u0000\u0000"+ - "\u018d\u018e\u0005s\u0000\u0000\u018e\u018f\u0005s\u0000\u0000\u018f\u0190"+ - "\u0005u\u0000\u0000\u0190\u0191\u0005m\u0000\u0000\u0191\u0192\u0005e"+ - "\u0000\u0000\u0192\r\u0001\u0000\u0000\u0000\u0193\u0194\u0005i\u0000"+ + "\u8003\u134a\u8003\u1350\u8003\u23af\u0607\u0000\u0002\u0001\u0000\u0000"+ + "\u0000\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000"+ + "\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000"+ + "\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000"+ + "\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000"+ + "\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000"+ + "\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000"+ + "\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000"+ + " \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001"+ + "\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000"+ + "\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000"+ + ".\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001"+ + "\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000"+ + "\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000"+ + "<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001"+ + "\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000"+ + "\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000"+ + "J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001"+ + "\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000"+ + "\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000"+ + "X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001"+ + "\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000"+ + "\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000"+ + "f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000j\u0001"+ + "\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001\u0000\u0000"+ + "\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000"+ + "t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001"+ + "\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000"+ + "\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000\u0000\u0000"+ + "\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000\u0000\u0000"+ + "\u0000\u0086\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000\u0000\u0000"+ + "\u0000\u008a\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000\u0000\u0000"+ + "\u0000\u008e\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000\u0000\u0000"+ + "\u0000\u0092\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000\u0000\u0000"+ + "\u0000\u0096\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000\u0000\u0000"+ + "\u0000\u009a\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000\u0000\u0000"+ + "\u0000\u009e\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000\u0000\u0000"+ + "\u0000\u00a2\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000\u0000\u0000"+ + "\u0000\u00a6\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000\u0000\u0000"+ + "\u0000\u00aa\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000\u0000\u0000"+ + "\u0000\u00ae\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000\u0000\u0000"+ + "\u0000\u00b2\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000\u0000\u0000"+ + "\u0000\u00b6\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000\u0000\u0000"+ + "\u0000\u00ba\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000\u0000\u0000"+ + "\u0000\u00be\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000\u0000\u0000"+ + "\u0000\u00c2\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000\u0000\u0000"+ + "\u0000\u00c6\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000\u0000\u0000"+ + "\u0000\u00ca\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000\u0000\u0000"+ + "\u0000\u00ce\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000\u0000\u0000"+ + "\u0000\u00d2\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000\u0000\u0000"+ + "\u0000\u00d6\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000\u0000\u0000"+ + "\u0000\u00da\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000\u0000\u0000"+ + "\u0000\u00de\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000\u0000\u0000"+ + "\u0000\u00e2\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000\u0000\u0000"+ + "\u0000\u00e6\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000\u0000\u0000"+ + "\u0000\u00ea\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000\u0000\u0000"+ + "\u0000\u00ee\u0001\u0000\u0000\u0000\u0000\u00f0\u0001\u0000\u0000\u0000"+ + "\u0000\u00f2\u0001\u0000\u0000\u0000\u0000\u00f4\u0001\u0000\u0000\u0000"+ + "\u0000\u00f6\u0001\u0000\u0000\u0000\u0000\u00f8\u0001\u0000\u0000\u0000"+ + "\u0000\u00fa\u0001\u0000\u0000\u0000\u0000\u00fc\u0001\u0000\u0000\u0000"+ + "\u0000\u00fe\u0001\u0000\u0000\u0000\u0000\u0100\u0001\u0000\u0000\u0000"+ + "\u0000\u0102\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000\u0000\u0000"+ + "\u0000\u0106\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000\u0000\u0000"+ + "\u0000\u010a\u0001\u0000\u0000\u0000\u0000\u010c\u0001\u0000\u0000\u0000"+ + "\u0000\u010e\u0001\u0000\u0000\u0000\u0000\u0110\u0001\u0000\u0000\u0000"+ + "\u0000\u0112\u0001\u0000\u0000\u0000\u0000\u0114\u0001\u0000\u0000\u0000"+ + "\u0000\u0116\u0001\u0000\u0000\u0000\u0000\u0118\u0001\u0000\u0000\u0000"+ + "\u0000\u011a\u0001\u0000\u0000\u0000\u0000\u011c\u0001\u0000\u0000\u0000"+ + "\u0000\u0122\u0001\u0000\u0000\u0000\u0000\u0126\u0001\u0000\u0000\u0000"+ + "\u0000\u0128\u0001\u0000\u0000\u0000\u0000\u012a\u0001\u0000\u0000\u0000"+ + "\u0000\u012c\u0001\u0000\u0000\u0000\u0000\u012e\u0001\u0000\u0000\u0000"+ + "\u0000\u0130\u0001\u0000\u0000\u0000\u0000\u0132\u0001\u0000\u0000\u0000"+ + "\u0000\u0134\u0001\u0000\u0000\u0000\u0000\u0136\u0001\u0000\u0000\u0000"+ + "\u0000\u0138\u0001\u0000\u0000\u0000\u0000\u013a\u0001\u0000\u0000\u0000"+ + "\u0000\u013c\u0001\u0000\u0000\u0000\u0001\u0152\u0001\u0000\u0000\u0000"+ + "\u0001\u0154\u0001\u0000\u0000\u0000\u0001\u0156\u0001\u0000\u0000\u0000"+ + "\u0001\u0158\u0001\u0000\u0000\u0000\u0001\u015a\u0001\u0000\u0000\u0000"+ + "\u0002\u015e\u0001\u0000\u0000\u0000\u0004\u0174\u0001\u0000\u0000\u0000"+ + "\u0006\u0176\u0001\u0000\u0000\u0000\b\u017d\u0001\u0000\u0000\u0000\n"+ + "\u0185\u0001\u0000\u0000\u0000\f\u018c\u0001\u0000\u0000\u0000\u000e\u0193"+ + "\u0001\u0000\u0000\u0000\u0010\u019a\u0001\u0000\u0000\u0000\u0012\u01a1"+ + "\u0001\u0000\u0000\u0000\u0014\u01aa\u0001\u0000\u0000\u0000\u0016\u01b4"+ + "\u0001\u0000\u0000\u0000\u0018\u01bc\u0001\u0000\u0000\u0000\u001a\u01c6"+ + "\u0001\u0000\u0000\u0000\u001c\u01d2\u0001\u0000\u0000\u0000\u001e\u01d9"+ + "\u0001\u0000\u0000\u0000 \u01e4\u0001\u0000\u0000\u0000\"\u01e7\u0001"+ + "\u0000\u0000\u0000$\u01ed\u0001\u0000\u0000\u0000&\u01f6\u0001\u0000\u0000"+ + "\u0000(\u01fb\u0001\u0000\u0000\u0000*\u0202\u0001\u0000\u0000\u0000,"+ + "\u0209\u0001\u0000\u0000\u0000.\u020f\u0001\u0000\u0000\u00000\u0214\u0001"+ + "\u0000\u0000\u00002\u021b\u0001\u0000\u0000\u00004\u0225\u0001\u0000\u0000"+ + "\u00006\u0229\u0001\u0000\u0000\u00008\u022f\u0001\u0000\u0000\u0000:"+ + "\u0232\u0001\u0000\u0000\u0000<\u0234\u0001\u0000\u0000\u0000>\u023b\u0001"+ + "\u0000\u0000\u0000@\u0241\u0001\u0000\u0000\u0000B\u024e\u0001\u0000\u0000"+ + "\u0000D\u0257\u0001\u0000\u0000\u0000F\u025b\u0001\u0000\u0000\u0000H"+ + "\u025f\u0001\u0000\u0000\u0000J\u0265\u0001\u0000\u0000\u0000L\u0267\u0001"+ + "\u0000\u0000\u0000N\u026a\u0001\u0000\u0000\u0000P\u026f\u0001\u0000\u0000"+ + "\u0000R\u0275\u0001\u0000\u0000\u0000T\u027b\u0001\u0000\u0000\u0000V"+ + "\u0282\u0001\u0000\u0000\u0000X\u0289\u0001\u0000\u0000\u0000Z\u0292\u0001"+ + "\u0000\u0000\u0000\\\u0298\u0001\u0000\u0000\u0000^\u029e\u0001\u0000"+ + "\u0000\u0000`\u02a5\u0001\u0000\u0000\u0000b\u02ab\u0001\u0000\u0000\u0000"+ + "d\u02b2\u0001\u0000\u0000\u0000f\u02b8\u0001\u0000\u0000\u0000h\u02c1"+ + "\u0001\u0000\u0000\u0000j\u02c9\u0001\u0000\u0000\u0000l\u02cf\u0001\u0000"+ + "\u0000\u0000n\u02d7\u0001\u0000\u0000\u0000p\u02de\u0001\u0000\u0000\u0000"+ + "r\u02e3\u0001\u0000\u0000\u0000t\u02ec\u0001\u0000\u0000\u0000v\u02fb"+ + "\u0001\u0000\u0000\u0000x\u0301\u0001\u0000\u0000\u0000z\u0305\u0001\u0000"+ + "\u0000\u0000|\u0308\u0001\u0000\u0000\u0000~\u030f\u0001\u0000\u0000\u0000"+ + "\u0080\u0319\u0001\u0000\u0000\u0000\u0082\u0323\u0001\u0000\u0000\u0000"+ + "\u0084\u032f\u0001\u0000\u0000\u0000\u0086\u0338\u0001\u0000\u0000\u0000"+ + "\u0088\u0342\u0001\u0000\u0000\u0000\u008a\u034a\u0001\u0000\u0000\u0000"+ + "\u008c\u0356\u0001\u0000\u0000\u0000\u008e\u0365\u0001\u0000\u0000\u0000"+ + "\u0090\u036b\u0001\u0000\u0000\u0000\u0092\u036f\u0001\u0000\u0000\u0000"+ + "\u0094\u0373\u0001\u0000\u0000\u0000\u0096\u0378\u0001\u0000\u0000\u0000"+ + "\u0098\u0380\u0001\u0000\u0000\u0000\u009a\u0388\u0001\u0000\u0000\u0000"+ + "\u009c\u038d\u0001\u0000\u0000\u0000\u009e\u0397\u0001\u0000\u0000\u0000"+ + "\u00a0\u039e\u0001\u0000\u0000\u0000\u00a2\u03a3\u0001\u0000\u0000\u0000"+ + "\u00a4\u03a9\u0001\u0000\u0000\u0000\u00a6\u03ac\u0001\u0000\u0000\u0000"+ + "\u00a8\u03b0\u0001\u0000\u0000\u0000\u00aa\u03b7\u0001\u0000\u0000\u0000"+ + "\u00ac\u03bc\u0001\u0000\u0000\u0000\u00ae\u03c1\u0001\u0000\u0000\u0000"+ + "\u00b0\u03c6\u0001\u0000\u0000\u0000\u00b2\u03ce\u0001\u0000\u0000\u0000"+ + "\u00b4\u03d5\u0001\u0000\u0000\u0000\u00b6\u03db\u0001\u0000\u0000\u0000"+ + "\u00b8\u03e9\u0001\u0000\u0000\u0000\u00ba\u03ec\u0001\u0000\u0000\u0000"+ + "\u00bc\u03f2\u0001\u0000\u0000\u0000\u00be\u03f7\u0001\u0000\u0000\u0000"+ + "\u00c0\u0402\u0001\u0000\u0000\u0000\u00c2\u0406\u0001\u0000\u0000\u0000"+ + "\u00c4\u040d\u0001\u0000\u0000\u0000\u00c6\u0416\u0001\u0000\u0000\u0000"+ + "\u00c8\u041a\u0001\u0000\u0000\u0000\u00ca\u0420\u0001\u0000\u0000\u0000"+ + "\u00cc\u042a\u0001\u0000\u0000\u0000\u00ce\u042c\u0001\u0000\u0000\u0000"+ + "\u00d0\u0430\u0001\u0000\u0000\u0000\u00d2\u0432\u0001\u0000\u0000\u0000"+ + "\u00d4\u0436\u0001\u0000\u0000\u0000\u00d6\u0438\u0001\u0000\u0000\u0000"+ + "\u00d8\u043c\u0001\u0000\u0000\u0000\u00da\u043e\u0001\u0000\u0000\u0000"+ + "\u00dc\u0440\u0001\u0000\u0000\u0000\u00de\u0442\u0001\u0000\u0000\u0000"+ + "\u00e0\u0444\u0001\u0000\u0000\u0000\u00e2\u0446\u0001\u0000\u0000\u0000"+ + "\u00e4\u044b\u0001\u0000\u0000\u0000\u00e6\u0450\u0001\u0000\u0000\u0000"+ + "\u00e8\u0453\u0001\u0000\u0000\u0000\u00ea\u0457\u0001\u0000\u0000\u0000"+ + "\u00ec\u045a\u0001\u0000\u0000\u0000\u00ee\u045d\u0001\u0000\u0000\u0000"+ + "\u00f0\u0460\u0001\u0000\u0000\u0000\u00f2\u0463\u0001\u0000\u0000\u0000"+ + "\u00f4\u0465\u0001\u0000\u0000\u0000\u00f6\u0468\u0001\u0000\u0000\u0000"+ + "\u00f8\u046a\u0001\u0000\u0000\u0000\u00fa\u046d\u0001\u0000\u0000\u0000"+ + "\u00fc\u046f\u0001\u0000\u0000\u0000\u00fe\u0471\u0001\u0000\u0000\u0000"+ + "\u0100\u0473\u0001\u0000\u0000\u0000\u0102\u0476\u0001\u0000\u0000\u0000"+ + "\u0104\u0479\u0001\u0000\u0000\u0000\u0106\u047c\u0001\u0000\u0000\u0000"+ + "\u0108\u047e\u0001\u0000\u0000\u0000\u010a\u0480\u0001\u0000\u0000\u0000"+ + "\u010c\u0482\u0001\u0000\u0000\u0000\u010e\u0484\u0001\u0000\u0000\u0000"+ + "\u0110\u0486\u0001\u0000\u0000\u0000\u0112\u0488\u0001\u0000\u0000\u0000"+ + "\u0114\u0496\u0001\u0000\u0000\u0000\u0116\u049a\u0001\u0000\u0000\u0000"+ + "\u0118\u04a6\u0001\u0000\u0000\u0000\u011a\u04b4\u0001\u0000\u0000\u0000"+ + "\u011c\u04c0\u0001\u0000\u0000\u0000\u011e\u04e4\u0001\u0000\u0000\u0000"+ + "\u0120\u04e6\u0001\u0000\u0000\u0000\u0122\u04f1\u0001\u0000\u0000\u0000"+ + "\u0124\u04f7\u0001\u0000\u0000\u0000\u0126\u04fe\u0001\u0000\u0000\u0000"+ + "\u0128\u0504\u0001\u0000\u0000\u0000\u012a\u0506\u0001\u0000\u0000\u0000"+ + "\u012c\u050b\u0001\u0000\u0000\u0000\u012e\u0510\u0001\u0000\u0000\u0000"+ + "\u0130\u0517\u0001\u0000\u0000\u0000\u0132\u0522\u0001\u0000\u0000\u0000"+ + "\u0134\u052d\u0001\u0000\u0000\u0000\u0136\u053a\u0001\u0000\u0000\u0000"+ + "\u0138\u0540\u0001\u0000\u0000\u0000\u013a\u054f\u0001\u0000\u0000\u0000"+ + "\u013c\u0555\u0001\u0000\u0000\u0000\u013e\u0564\u0001\u0000\u0000\u0000"+ + "\u0140\u0566\u0001\u0000\u0000\u0000\u0142\u0582\u0001\u0000\u0000\u0000"+ + "\u0144\u058c\u0001\u0000\u0000\u0000\u0146\u058e\u0001\u0000\u0000\u0000"+ + "\u0148\u0590\u0001\u0000\u0000\u0000\u014a\u0592\u0001\u0000\u0000\u0000"+ + "\u014c\u059a\u0001\u0000\u0000\u0000\u014e\u059c\u0001\u0000\u0000\u0000"+ + "\u0150\u059e\u0001\u0000\u0000\u0000\u0152\u05a1\u0001\u0000\u0000\u0000"+ + "\u0154\u05a7\u0001\u0000\u0000\u0000\u0156\u05b5\u0001\u0000\u0000\u0000"+ + "\u0158\u05d2\u0001\u0000\u0000\u0000\u015a\u05d6\u0001\u0000\u0000\u0000"+ + "\u015c\u015f\u0003\u0004\u0001\u0000\u015d\u015f\u0003\u011c\u008d\u0000"+ + "\u015e\u015c\u0001\u0000\u0000\u0000\u015e\u015d\u0001\u0000\u0000\u0000"+ + "\u015f\u0160\u0001\u0000\u0000\u0000\u0160\u0161\u0006\u0000\u0000\u0000"+ + "\u0161\u0003\u0001\u0000\u0000\u0000\u0162\u016c\u0003\u0142\u00a0\u0000"+ + "\u0163\u0164\u0005.\u0000\u0000\u0164\u0166\u0004\u0001\u0000\u0000\u0165"+ + "\u0167\u0003\u0142\u00a0\u0000\u0166\u0165\u0001\u0000\u0000\u0000\u0166"+ + "\u0167\u0001\u0000\u0000\u0000\u0167\u0169\u0001\u0000\u0000\u0000\u0168"+ + "\u016a\u0003\u014a\u00a4\u0000\u0169\u0168\u0001\u0000\u0000\u0000\u0169"+ + "\u016a\u0001\u0000\u0000\u0000\u016a\u016d\u0001\u0000\u0000\u0000\u016b"+ + "\u016d\u0003\u014a\u00a4\u0000\u016c\u0163\u0001\u0000\u0000\u0000\u016c"+ + "\u016b\u0001\u0000\u0000\u0000\u016d\u0175\u0001\u0000\u0000\u0000\u016e"+ + "\u016f\u0005.\u0000\u0000\u016f\u0170\u0004\u0001\u0001\u0000\u0170\u0172"+ + "\u0003\u0142\u00a0\u0000\u0171\u0173\u0003\u014a\u00a4\u0000\u0172\u0171"+ + "\u0001\u0000\u0000\u0000\u0172\u0173\u0001\u0000\u0000\u0000\u0173\u0175"+ + "\u0001\u0000\u0000\u0000\u0174\u0162\u0001\u0000\u0000\u0000\u0174\u016e"+ + "\u0001\u0000\u0000\u0000\u0175\u0005\u0001\u0000\u0000\u0000\u0176\u0177"+ + "\u0005t\u0000\u0000\u0177\u0178\u0005r\u0000\u0000\u0178\u0179\u0005u"+ + "\u0000\u0000\u0179\u017a\u0005e\u0000\u0000\u017a\u017b\u0001\u0000\u0000"+ + "\u0000\u017b\u017c\u0006\u0002\u0000\u0000\u017c\u0007\u0001\u0000\u0000"+ + "\u0000\u017d\u017e\u0005f\u0000\u0000\u017e\u017f\u0005a\u0000\u0000\u017f"+ + "\u0180\u0005l\u0000\u0000\u0180\u0181\u0005s\u0000\u0000\u0181\u0182\u0005"+ + "e\u0000\u0000\u0182\u0183\u0001\u0000\u0000\u0000\u0183\u0184\u0006\u0003"+ + "\u0000\u0000\u0184\t\u0001\u0000\u0000\u0000\u0185\u0186\u0005a\u0000"+ + "\u0000\u0186\u0187\u0005s\u0000\u0000\u0187\u0188\u0005s\u0000\u0000\u0188"+ + "\u0189\u0005e\u0000\u0000\u0189\u018a\u0005r\u0000\u0000\u018a\u018b\u0005"+ + "t\u0000\u0000\u018b\u000b\u0001\u0000\u0000\u0000\u018c\u018d\u0005a\u0000"+ + "\u0000\u018d\u018e\u0005s\u0000\u0000\u018e\u018f\u0005s\u0000\u0000\u018f"+ + "\u0190\u0005u\u0000\u0000\u0190\u0191\u0005m\u0000\u0000\u0191\u0192\u0005"+ + "e\u0000\u0000\u0192\r\u0001\u0000\u0000\u0000\u0193\u0194\u0005i\u0000"+ "\u0000\u0194\u0195\u0005n\u0000\u0000\u0195\u0196\u0005h\u0000\u0000\u0196"+ "\u0197\u0005a\u0000\u0000\u0197\u0198\u0005l\u0000\u0000\u0198\u0199\u0005"+ "e\u0000\u0000\u0199\u000f\u0001\u0000\u0000\u0000\u019a\u019b\u0005e\u0000"+ diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 0b583ef70..62bcff25c 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.0 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -11,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class GobraParser extends GobraParserBase { - static { RuntimeMetaData.checkVersion("4.12.0", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -56,47 +56,47 @@ public class GobraParser extends GobraParserBase { RULE_typeOf = 33, RULE_access = 34, RULE_range = 35, RULE_matchExpr = 36, RULE_matchExprClause = 37, RULE_seqUpdExp = 38, RULE_seqUpdClause = 39, RULE_ghostTypeLit = 40, RULE_domainType = 41, RULE_domainClause = 42, - RULE_adtType = 43, RULE_adtClause = 44, RULE_ghostSliceType = 45, RULE_sqType = 46, - RULE_specification = 47, RULE_specStatement = 48, RULE_terminationMeasure = 49, - RULE_assertion = 50, RULE_matchStmt = 51, RULE_matchStmtClause = 52, RULE_matchCase = 53, - RULE_matchPattern = 54, RULE_matchPatternList = 55, RULE_blockWithBodyParameterInfo = 56, - RULE_closureSpecInstance = 57, RULE_closureSpecParams = 58, RULE_closureSpecParam = 59, - RULE_closureImplProofStmt = 60, RULE_implementationProof = 61, RULE_methodImplementationProof = 62, - RULE_nonLocalReceiver = 63, RULE_selection = 64, RULE_implementationProofPredicateAlias = 65, - RULE_make = 66, RULE_new_ = 67, RULE_specMember = 68, RULE_functionDecl = 69, - RULE_methodDecl = 70, RULE_explicitGhostMember = 71, RULE_fpredicateDecl = 72, - RULE_predicateBody = 73, RULE_mpredicateDecl = 74, RULE_varSpec = 75, - RULE_shortVarDecl = 76, RULE_receiver = 77, RULE_parameterDecl = 78, RULE_actualParameterDecl = 79, - RULE_ghostParameterDecl = 80, RULE_parameterType = 81, RULE_expression = 82, - RULE_statement = 83, RULE_applyStmt = 84, RULE_packageStmt = 85, RULE_specForStmt = 86, - RULE_loopSpec = 87, RULE_deferStmt = 88, RULE_basicLit = 89, RULE_primaryExpr = 90, - RULE_functionLit = 91, RULE_closureDecl = 92, RULE_predConstructArgs = 93, - RULE_interfaceType = 94, RULE_predicateSpec = 95, RULE_methodSpec = 96, - RULE_type_ = 97, RULE_typeLit = 98, RULE_predType = 99, RULE_predTypeParams = 100, - RULE_literalType = 101, RULE_implicitArray = 102, RULE_slice_ = 103, RULE_low = 104, - RULE_high = 105, RULE_cap = 106, RULE_assign_op = 107, RULE_rangeClause = 108, - RULE_packageClause = 109, RULE_importPath = 110, RULE_declaration = 111, - RULE_constDecl = 112, RULE_constSpec = 113, RULE_identifierList = 114, - RULE_expressionList = 115, RULE_typeDecl = 116, RULE_typeSpec = 117, RULE_varDecl = 118, - RULE_block = 119, RULE_statementList = 120, RULE_simpleStmt = 121, RULE_expressionStmt = 122, - RULE_sendStmt = 123, RULE_incDecStmt = 124, RULE_assignment = 125, RULE_emptyStmt = 126, - RULE_labeledStmt = 127, RULE_returnStmt = 128, RULE_breakStmt = 129, RULE_continueStmt = 130, - RULE_gotoStmt = 131, RULE_fallthroughStmt = 132, RULE_ifStmt = 133, RULE_switchStmt = 134, - RULE_exprSwitchStmt = 135, RULE_exprCaseClause = 136, RULE_exprSwitchCase = 137, - RULE_typeSwitchStmt = 138, RULE_typeSwitchGuard = 139, RULE_typeCaseClause = 140, - RULE_typeSwitchCase = 141, RULE_typeList = 142, RULE_selectStmt = 143, - RULE_commClause = 144, RULE_commCase = 145, RULE_recvStmt = 146, RULE_forStmt = 147, - RULE_forClause = 148, RULE_goStmt = 149, RULE_typeName = 150, RULE_arrayType = 151, - RULE_arrayLength = 152, RULE_elementType = 153, RULE_pointerType = 154, - RULE_sliceType = 155, RULE_mapType = 156, RULE_channelType = 157, RULE_functionType = 158, - RULE_signature = 159, RULE_result = 160, RULE_parameters = 161, RULE_conversion = 162, - RULE_nonNamedType = 163, RULE_operand = 164, RULE_literal = 165, RULE_integer = 166, - RULE_operandName = 167, RULE_qualifiedIdent = 168, RULE_compositeLit = 169, - RULE_literalValue = 170, RULE_elementList = 171, RULE_keyedElement = 172, - RULE_key = 173, RULE_element = 174, RULE_structType = 175, RULE_fieldDecl = 176, - RULE_string_ = 177, RULE_embeddedField = 178, RULE_index = 179, RULE_typeAssertion = 180, - RULE_arguments = 181, RULE_methodExpr = 182, RULE_receiverType = 183, - RULE_eos = 184; + RULE_adtType = 43, RULE_adtClause = 44, RULE_adtFieldDecl = 45, RULE_ghostSliceType = 46, + RULE_sqType = 47, RULE_specification = 48, RULE_specStatement = 49, RULE_terminationMeasure = 50, + RULE_assertion = 51, RULE_matchStmt = 52, RULE_matchStmtClause = 53, RULE_matchCase = 54, + RULE_matchPattern = 55, RULE_matchPatternList = 56, RULE_blockWithBodyParameterInfo = 57, + RULE_closureSpecInstance = 58, RULE_closureSpecParams = 59, RULE_closureSpecParam = 60, + RULE_closureImplProofStmt = 61, RULE_implementationProof = 62, RULE_methodImplementationProof = 63, + RULE_nonLocalReceiver = 64, RULE_selection = 65, RULE_implementationProofPredicateAlias = 66, + RULE_make = 67, RULE_new_ = 68, RULE_specMember = 69, RULE_functionDecl = 70, + RULE_methodDecl = 71, RULE_explicitGhostMember = 72, RULE_fpredicateDecl = 73, + RULE_predicateBody = 74, RULE_mpredicateDecl = 75, RULE_varSpec = 76, + RULE_shortVarDecl = 77, RULE_receiver = 78, RULE_parameterDecl = 79, RULE_actualParameterDecl = 80, + RULE_ghostParameterDecl = 81, RULE_parameterType = 82, RULE_expression = 83, + RULE_statement = 84, RULE_applyStmt = 85, RULE_packageStmt = 86, RULE_specForStmt = 87, + RULE_loopSpec = 88, RULE_deferStmt = 89, RULE_basicLit = 90, RULE_primaryExpr = 91, + RULE_functionLit = 92, RULE_closureDecl = 93, RULE_predConstructArgs = 94, + RULE_interfaceType = 95, RULE_predicateSpec = 96, RULE_methodSpec = 97, + RULE_type_ = 98, RULE_typeLit = 99, RULE_predType = 100, RULE_predTypeParams = 101, + RULE_literalType = 102, RULE_implicitArray = 103, RULE_slice_ = 104, RULE_low = 105, + RULE_high = 106, RULE_cap = 107, RULE_assign_op = 108, RULE_rangeClause = 109, + RULE_packageClause = 110, RULE_importPath = 111, RULE_declaration = 112, + RULE_constDecl = 113, RULE_constSpec = 114, RULE_identifierList = 115, + RULE_expressionList = 116, RULE_typeDecl = 117, RULE_typeSpec = 118, RULE_varDecl = 119, + RULE_block = 120, RULE_statementList = 121, RULE_simpleStmt = 122, RULE_expressionStmt = 123, + RULE_sendStmt = 124, RULE_incDecStmt = 125, RULE_assignment = 126, RULE_emptyStmt = 127, + RULE_labeledStmt = 128, RULE_returnStmt = 129, RULE_breakStmt = 130, RULE_continueStmt = 131, + RULE_gotoStmt = 132, RULE_fallthroughStmt = 133, RULE_ifStmt = 134, RULE_switchStmt = 135, + RULE_exprSwitchStmt = 136, RULE_exprCaseClause = 137, RULE_exprSwitchCase = 138, + RULE_typeSwitchStmt = 139, RULE_typeSwitchGuard = 140, RULE_typeCaseClause = 141, + RULE_typeSwitchCase = 142, RULE_typeList = 143, RULE_selectStmt = 144, + RULE_commClause = 145, RULE_commCase = 146, RULE_recvStmt = 147, RULE_forStmt = 148, + RULE_forClause = 149, RULE_goStmt = 150, RULE_typeName = 151, RULE_arrayType = 152, + RULE_arrayLength = 153, RULE_elementType = 154, RULE_pointerType = 155, + RULE_sliceType = 156, RULE_mapType = 157, RULE_channelType = 158, RULE_functionType = 159, + RULE_signature = 160, RULE_result = 161, RULE_parameters = 162, RULE_conversion = 163, + RULE_nonNamedType = 164, RULE_operand = 165, RULE_literal = 166, RULE_integer = 167, + RULE_operandName = 168, RULE_qualifiedIdent = 169, RULE_compositeLit = 170, + RULE_literalValue = 171, RULE_elementList = 172, RULE_keyedElement = 173, + RULE_key = 174, RULE_element = 175, RULE_structType = 176, RULE_fieldDecl = 177, + RULE_string_ = 178, RULE_embeddedField = 179, RULE_index = 180, RULE_typeAssertion = 181, + RULE_arguments = 182, RULE_methodExpr = 183, RULE_receiverType = 184, + RULE_eos = 185; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", @@ -108,9 +108,9 @@ private static String[] makeRuleNames() { "old", "oldLabelUse", "labelUse", "before", "isComparable", "typeOf", "access", "range", "matchExpr", "matchExprClause", "seqUpdExp", "seqUpdClause", "ghostTypeLit", "domainType", "domainClause", "adtType", "adtClause", - "ghostSliceType", "sqType", "specification", "specStatement", "terminationMeasure", - "assertion", "matchStmt", "matchStmtClause", "matchCase", "matchPattern", - "matchPatternList", "blockWithBodyParameterInfo", "closureSpecInstance", + "adtFieldDecl", "ghostSliceType", "sqType", "specification", "specStatement", + "terminationMeasure", "assertion", "matchStmt", "matchStmtClause", "matchCase", + "matchPattern", "matchPatternList", "blockWithBodyParameterInfo", "closureSpecInstance", "closureSpecParams", "closureSpecParam", "closureImplProofStmt", "implementationProof", "methodImplementationProof", "nonLocalReceiver", "selection", "implementationProofPredicateAlias", "make", "new_", "specMember", "functionDecl", "methodDecl", "explicitGhostMember", @@ -267,9 +267,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(370); + setState(372); expression(0); - setState(371); + setState(373); match(EOF); } } @@ -307,9 +307,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(373); + setState(375); statement(); - setState(374); + setState(376); match(EOF); } } @@ -347,9 +347,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(376); + setState(378); type_(); - setState(377); + setState(379); match(EOF); } } @@ -394,21 +394,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis try { enterOuterAlt(_localctx, 1); { - setState(379); + setState(381); maybeAddressableIdentifier(); - setState(384); + setState(386); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(380); + setState(382); match(COMMA); - setState(381); + setState(383); maybeAddressableIdentifier(); } } - setState(386); + setState(388); _errHandler.sync(this); _la = _input.LA(1); } @@ -447,14 +447,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro try { enterOuterAlt(_localctx, 1); { - setState(387); - match(IDENTIFIER); setState(389); + match(IDENTIFIER); + setState(391); _errHandler.sync(this); _la = _input.LA(1); if (_la==ADDR_MOD) { { - setState(388); + setState(390); match(ADDR_MOD); } } @@ -532,79 +532,79 @@ public final SourceFileContext sourceFile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(396); + setState(398); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(391); + setState(393); initPost(); - setState(392); + setState(394); eos(); } } - setState(398); + setState(400); _errHandler.sync(this); _la = _input.LA(1); } - setState(399); + setState(401); packageClause(); - setState(400); + setState(402); eos(); - setState(406); + setState(408); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(401); + setState(403); importDecl(); - setState(402); + setState(404); eos(); } } - setState(408); + setState(410); _errHandler.sync(this); _la = _input.LA(1); } - setState(418); + setState(420); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & 288393170444877879L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881350095299L) != 0)) { { { - setState(412); + setState(414); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: { - setState(409); + setState(411); specMember(); } break; case 2: { - setState(410); + setState(412); declaration(); } break; case 3: { - setState(411); + setState(413); ghostMember(); } break; } - setState(414); + setState(416); eos(); } } - setState(420); + setState(422); _errHandler.sync(this); _la = _input.LA(1); } - setState(421); + setState(423); match(EOF); } } @@ -660,39 +660,39 @@ public final PreambleContext preamble() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(428); + setState(430); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(423); + setState(425); initPost(); - setState(424); + setState(426); eos(); } } - setState(430); + setState(432); _errHandler.sync(this); _la = _input.LA(1); } - setState(431); + setState(433); packageClause(); - setState(432); + setState(434); eos(); - setState(438); + setState(440); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(433); + setState(435); importDecl(); - setState(434); + setState(436); eos(); } } - setState(440); + setState(442); _errHandler.sync(this); _la = _input.LA(1); } @@ -732,9 +732,9 @@ public final InitPostContext initPost() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(441); + setState(443); match(INIT_POST); - setState(442); + setState(444); expression(0); } } @@ -772,9 +772,9 @@ public final ImportPreContext importPre() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(444); + setState(446); match(IMPORT_PRE); - setState(445); + setState(447); expression(0); } } @@ -827,28 +827,28 @@ public final ImportSpecContext importSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(452); + setState(454); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(447); + setState(449); importPre(); - setState(448); + setState(450); eos(); } } - setState(454); + setState(456); _errHandler.sync(this); _la = _input.LA(1); } - setState(456); + setState(458); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER || _la==DOT) { { - setState(455); + setState(457); ((ImportSpecContext)_localctx).alias = _input.LT(1); _la = _input.LA(1); if ( !(_la==IDENTIFIER || _la==DOT) ) { @@ -862,7 +862,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { } } - setState(458); + setState(460); importPath(); } } @@ -918,56 +918,56 @@ public final ImportDeclContext importDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(465); + setState(467); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(460); + setState(462); importPre(); - setState(461); + setState(463); eos(); } } - setState(467); + setState(469); _errHandler.sync(this); _la = _input.LA(1); } - setState(481); + setState(483); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { case 1: { - setState(468); + setState(470); match(IMPORT); - setState(469); + setState(471); importSpec(); } break; case 2: { - setState(470); + setState(472); match(IMPORT); - setState(471); + setState(473); match(L_PAREN); - setState(477); + setState(479); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & 4400193994753L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { - setState(472); + setState(474); importSpec(); - setState(473); + setState(475); eos(); } } - setState(479); + setState(481); _errHandler.sync(this); _la = _input.LA(1); } - setState(480); + setState(482); match(R_PAREN); } break; @@ -1014,34 +1014,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException { GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState()); enterRule(_localctx, 22, RULE_ghostMember); try { - setState(487); + setState(489); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(483); + setState(485); implementationProof(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(484); + setState(486); fpredicateDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(485); + setState(487); mpredicateDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(486); + setState(488); explicitGhostMember(); } break; @@ -1133,16 +1133,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException enterRule(_localctx, 24, RULE_ghostStatement); int _la; try { - setState(496); + setState(498); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: _localctx = new ExplicitGhostStatementContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(489); + setState(491); match(GHOST); - setState(490); + setState(492); statement(); } break; @@ -1151,7 +1151,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new FoldStatementContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(491); + setState(493); ((FoldStatementContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -1162,7 +1162,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(492); + setState(494); predicateAccess(); } break; @@ -1173,7 +1173,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new ProofStatementContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(493); + setState(495); ((ProofStatementContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 480L) != 0)) ) { @@ -1184,7 +1184,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(494); + setState(496); expression(0); } break; @@ -1192,7 +1192,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new MatchStmt_Context(_localctx); enterOuterAlt(_localctx, 4); { - setState(495); + setState(497); matchStmt(); } break; @@ -1233,7 +1233,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(498); + setState(500); statementWithSpec(); } } @@ -1274,10 +1274,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(500); + setState(502); ((StatementWithSpecContext)_localctx).specification = specification(); { - setState(501); + setState(503); outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure); } } @@ -1323,21 +1323,21 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu try { enterOuterAlt(_localctx, 1); { - setState(503); + setState(505); match(OUTLINE); - setState(504); - match(L_PAREN); setState(506); + match(L_PAREN); + setState(508); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(505); + setState(507); statementList(); } break; } - setState(508); + setState(510); match(R_PAREN); } } @@ -1408,97 +1408,97 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState()); enterRule(_localctx, 32, RULE_ghostPrimaryExpr); try { - setState(523); + setState(525); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(510); + setState(512); range(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(511); + setState(513); access(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(512); + setState(514); typeOf(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(513); + setState(515); typeExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(514); + setState(516); isComparable(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(515); + setState(517); old(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(516); + setState(518); before(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(517); + setState(519); sConversion(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(518); + setState(520); optionNone(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(519); + setState(521); optionSome(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(520); + setState(522); optionGet(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(521); + setState(523); permission(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(522); + setState(524); matchExpr(); } break; @@ -1537,7 +1537,7 @@ public final PermissionContext permission() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(525); + setState(527); _la = _input.LA(1); if ( !(_la==WRITEPERM || _la==NOPERM) ) { _errHandler.recoverInline(this); @@ -1585,13 +1585,13 @@ public final TypeExprContext typeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(527); + setState(529); match(TYPE); - setState(528); + setState(530); match(L_BRACKET); - setState(529); + setState(531); type_(); - setState(530); + setState(532); match(R_BRACKET); } } @@ -1637,32 +1637,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(532); + setState(534); boundVariableDecl(); - setState(537); + setState(539); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(533); + setState(535); match(COMMA); - setState(534); + setState(536); boundVariableDecl(); } } } - setState(539); + setState(541); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } - setState(541); + setState(543); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(540); + setState(542); match(COMMA); } } @@ -1711,25 +1711,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(543); + setState(545); match(IDENTIFIER); - setState(548); + setState(550); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(544); + setState(546); match(COMMA); - setState(545); + setState(547); match(IDENTIFIER); } } - setState(550); + setState(552); _errHandler.sync(this); _la = _input.LA(1); } - setState(551); + setState(553); elementType(); } } @@ -1770,17 +1770,17 @@ public final TriggersContext triggers() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(556); + setState(558); _errHandler.sync(this); _la = _input.LA(1); while (_la==L_CURLY) { { { - setState(553); + setState(555); trigger(); } } - setState(558); + setState(560); _errHandler.sync(this); _la = _input.LA(1); } @@ -1829,27 +1829,27 @@ public final TriggerContext trigger() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(559); + setState(561); match(L_CURLY); - setState(560); + setState(562); expression(0); - setState(565); + setState(567); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(561); + setState(563); match(COMMA); - setState(562); + setState(564); expression(0); } } - setState(567); + setState(569); _errHandler.sync(this); _la = _input.LA(1); } - setState(568); + setState(570); match(R_CURLY); } } @@ -1886,7 +1886,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(570); + setState(572); primaryExpr(0); } } @@ -1926,13 +1926,13 @@ public final OptionSomeContext optionSome() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(572); + setState(574); match(SOME); - setState(573); + setState(575); match(L_PAREN); - setState(574); + setState(576); expression(0); - setState(575); + setState(577); match(R_PAREN); } } @@ -1972,13 +1972,13 @@ public final OptionNoneContext optionNone() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(577); + setState(579); match(NONE); - setState(578); + setState(580); match(L_BRACKET); - setState(579); + setState(581); type_(); - setState(580); + setState(582); match(R_BRACKET); } } @@ -2018,13 +2018,13 @@ public final OptionGetContext optionGet() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(582); + setState(584); match(GET); - setState(583); + setState(585); match(L_PAREN); - setState(584); + setState(586); expression(0); - setState(585); + setState(587); match(R_PAREN); } } @@ -2068,7 +2068,7 @@ public final SConversionContext sConversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(587); + setState(589); ((SConversionContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { @@ -2079,11 +2079,11 @@ public final SConversionContext sConversion() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(588); + setState(590); match(L_PAREN); - setState(589); + setState(591); expression(0); - setState(590); + setState(592); match(R_PAREN); } } @@ -2129,27 +2129,27 @@ public final OldContext old() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(592); + setState(594); match(OLD); - setState(597); + setState(599); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(593); + setState(595); match(L_BRACKET); - setState(594); + setState(596); oldLabelUse(); - setState(595); + setState(597); match(R_BRACKET); } } - setState(599); + setState(601); match(L_PAREN); - setState(600); + setState(602); expression(0); - setState(601); + setState(603); match(R_PAREN); } } @@ -2185,20 +2185,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException { OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState()); enterRule(_localctx, 58, RULE_oldLabelUse); try { - setState(605); + setState(607); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(603); + setState(605); labelUse(); } break; case LHS: enterOuterAlt(_localctx, 2); { - setState(604); + setState(606); match(LHS); } break; @@ -2237,7 +2237,7 @@ public final LabelUseContext labelUse() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(607); + setState(609); match(IDENTIFIER); } } @@ -2277,13 +2277,13 @@ public final BeforeContext before() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(609); + setState(611); match(BEFORE); - setState(610); + setState(612); match(L_PAREN); - setState(611); + setState(613); expression(0); - setState(612); + setState(614); match(R_PAREN); } } @@ -2323,13 +2323,13 @@ public final IsComparableContext isComparable() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(614); + setState(616); match(IS_COMPARABLE); - setState(615); + setState(617); match(L_PAREN); - setState(616); + setState(618); expression(0); - setState(617); + setState(619); match(R_PAREN); } } @@ -2369,13 +2369,13 @@ public final TypeOfContext typeOf() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(619); + setState(621); match(TYPE_OF); - setState(620); + setState(622); match(L_PAREN); - setState(621); + setState(623); expression(0); - setState(622); + setState(624); match(R_PAREN); } } @@ -2420,25 +2420,25 @@ public final AccessContext access() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(624); + setState(626); match(ACCESS); - setState(625); + setState(627); match(L_PAREN); - setState(626); + setState(628); expression(0); - setState(629); + setState(631); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(627); + setState(629); match(COMMA); - setState(628); + setState(630); expression(0); } } - setState(631); + setState(633); match(R_PAREN); } } @@ -2486,7 +2486,7 @@ public final RangeContext range() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(633); + setState(635); ((RangeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { @@ -2497,15 +2497,15 @@ public final RangeContext range() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(634); - match(L_BRACKET); - setState(635); - expression(0); setState(636); - match(DOT_DOT); + match(L_BRACKET); setState(637); expression(0); setState(638); + match(DOT_DOT); + setState(639); + expression(0); + setState(640); match(R_BRACKET); } } @@ -2558,29 +2558,29 @@ public final MatchExprContext matchExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(640); + setState(642); match(MATCH); - setState(641); + setState(643); expression(0); - setState(642); + setState(644); match(L_CURLY); - setState(648); + setState(650); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(643); + setState(645); matchExprClause(); - setState(644); + setState(646); eos(); } } - setState(650); + setState(652); _errHandler.sync(this); _la = _input.LA(1); } - setState(651); + setState(653); match(R_CURLY); } } @@ -2621,11 +2621,11 @@ public final MatchExprClauseContext matchExprClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(653); + setState(655); matchCase(); - setState(654); + setState(656); match(COLON); - setState(655); + setState(657); expression(0); } } @@ -2672,29 +2672,29 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(657); + setState(659); match(L_BRACKET); { - setState(658); + setState(660); seqUpdClause(); - setState(663); + setState(665); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(659); + setState(661); match(COMMA); - setState(660); + setState(662); seqUpdClause(); } } - setState(665); + setState(667); _errHandler.sync(this); _la = _input.LA(1); } } - setState(666); + setState(668); match(R_BRACKET); } } @@ -2735,11 +2735,11 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(668); + setState(670); expression(0); - setState(669); + setState(671); match(ASSIGN); - setState(670); + setState(672); expression(0); } } @@ -2783,7 +2783,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState()); enterRule(_localctx, 80, RULE_ghostTypeLit); try { - setState(676); + setState(678); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2793,28 +2793,28 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { case OPT: enterOuterAlt(_localctx, 1); { - setState(672); + setState(674); sqType(); } break; case GHOST: enterOuterAlt(_localctx, 2); { - setState(673); + setState(675); ghostSliceType(); } break; case DOM: enterOuterAlt(_localctx, 3); { - setState(674); + setState(676); domainType(); } break; case ADT: enterOuterAlt(_localctx, 4); { - setState(675); + setState(677); adtType(); } break; @@ -2868,27 +2868,27 @@ public final DomainTypeContext domainType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(678); + setState(680); match(DOM); - setState(679); + setState(681); match(L_CURLY); - setState(685); + setState(687); _errHandler.sync(this); _la = _input.LA(1); while (_la==AXIOM || _la==FUNC) { { { - setState(680); + setState(682); domainClause(); - setState(681); + setState(683); eos(); } } - setState(687); + setState(689); _errHandler.sync(this); _la = _input.LA(1); } - setState(688); + setState(690); match(R_CURLY); } } @@ -2934,32 +2934,32 @@ public final DomainClauseContext domainClause() throws RecognitionException { DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState()); enterRule(_localctx, 84, RULE_domainClause); try { - setState(699); + setState(701); _errHandler.sync(this); switch (_input.LA(1)) { case FUNC: enterOuterAlt(_localctx, 1); { - setState(690); + setState(692); match(FUNC); - setState(691); + setState(693); match(IDENTIFIER); - setState(692); + setState(694); signature(); } break; case AXIOM: enterOuterAlt(_localctx, 2); { - setState(693); + setState(695); match(AXIOM); - setState(694); + setState(696); match(L_CURLY); - setState(695); + setState(697); expression(0); - setState(696); + setState(698); eos(); - setState(697); + setState(699); match(R_CURLY); } break; @@ -3013,27 +3013,27 @@ public final AdtTypeContext adtType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(701); + setState(703); match(ADT); - setState(702); + setState(704); match(L_CURLY); - setState(708); + setState(710); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(703); + setState(705); adtClause(); - setState(704); + setState(706); eos(); } } - setState(710); + setState(712); _errHandler.sync(this); _la = _input.LA(1); } - setState(711); + setState(713); match(R_CURLY); } } @@ -3053,11 +3053,11 @@ public static class AdtClauseContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } - public List fieldDecl() { - return getRuleContexts(FieldDeclContext.class); + public List adtFieldDecl() { + return getRuleContexts(AdtFieldDeclContext.class); } - public FieldDeclContext fieldDecl(int i) { - return getRuleContext(FieldDeclContext.class,i); + public AdtFieldDeclContext adtFieldDecl(int i) { + return getRuleContext(AdtFieldDeclContext.class,i); } public List eos() { return getRuleContexts(EosContext.class); @@ -3083,27 +3083,27 @@ public final AdtClauseContext adtClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(713); + setState(715); match(IDENTIFIER); - setState(714); + setState(716); match(L_CURLY); - setState(720); + setState(722); _errHandler.sync(this); _la = _input.LA(1); - while (_la==IDENTIFIER || _la==STAR) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { { { - setState(715); - fieldDecl(); - setState(716); + setState(717); + adtFieldDecl(); + setState(718); eos(); } } - setState(722); + setState(724); _errHandler.sync(this); _la = _input.LA(1); } - setState(723); + setState(725); match(R_CURLY); } } @@ -3118,6 +3118,56 @@ public final AdtClauseContext adtClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class AdtFieldDeclContext extends ParserRuleContext { + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public IdentifierListContext identifierList() { + return getRuleContext(IdentifierListContext.class,0); + } + public AdtFieldDeclContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_adtFieldDecl; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitAdtFieldDecl(this); + else return visitor.visitChildren(this); + } + } + + public final AdtFieldDeclContext adtFieldDecl() throws RecognitionException { + AdtFieldDeclContext _localctx = new AdtFieldDeclContext(_ctx, getState()); + enterRule(_localctx, 90, RULE_adtFieldDecl); + try { + enterOuterAlt(_localctx, 1); + { + setState(728); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { + case 1: + { + setState(727); + identifierList(); + } + break; + } + setState(730); + type_(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") public static class GhostSliceTypeContext extends ParserRuleContext { public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } @@ -3139,17 +3189,17 @@ public T accept(ParseTreeVisitor visitor) { public final GhostSliceTypeContext ghostSliceType() throws RecognitionException { GhostSliceTypeContext _localctx = new GhostSliceTypeContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_ghostSliceType); + enterRule(_localctx, 92, RULE_ghostSliceType); try { enterOuterAlt(_localctx, 1); { - setState(725); + setState(732); match(GHOST); - setState(726); + setState(733); match(L_BRACKET); - setState(727); + setState(734); match(R_BRACKET); - setState(728); + setState(735); elementType(); } } @@ -3193,10 +3243,10 @@ public T accept(ParseTreeVisitor visitor) { public final SqTypeContext sqType() throws RecognitionException { SqTypeContext _localctx = new SqTypeContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_sqType); + enterRule(_localctx, 94, RULE_sqType); int _la; try { - setState(741); + setState(748); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3206,7 +3256,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(730); + setState(737); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) { @@ -3217,11 +3267,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(731); + setState(738); match(L_BRACKET); - setState(732); + setState(739); type_(); - setState(733); + setState(740); match(R_BRACKET); } } @@ -3229,15 +3279,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(735); + setState(742); ((SqTypeContext)_localctx).kind = match(DICT); - setState(736); + setState(743); match(L_BRACKET); - setState(737); + setState(744); type_(); - setState(738); + setState(745); match(R_BRACKET); - setState(739); + setState(746); type_(); } break; @@ -3293,20 +3343,20 @@ public T accept(ParseTreeVisitor visitor) { public final SpecificationContext specification() throws RecognitionException { SpecificationContext _localctx = new SpecificationContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_specification); + enterRule(_localctx, 96, RULE_specification); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(753); + setState(760); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + _alt = getInterpreter().adaptivePredict(_input,35,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(748); + setState(755); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3314,20 +3364,20 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(743); + setState(750); specStatement(); } break; case PURE: { - setState(744); + setState(751); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(746); + setState(753); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3335,21 +3385,21 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(750); + setState(757); eos(); } } } - setState(755); + setState(762); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } - setState(758); + setState(765); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(756); + setState(763); match(PURE); ((SpecificationContext)_localctx).pure = true; } @@ -3394,44 +3444,44 @@ public T accept(ParseTreeVisitor visitor) { public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_specStatement); + enterRule(_localctx, 98, RULE_specStatement); try { - setState(768); + setState(775); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(760); + setState(767); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(761); + setState(768); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(762); + setState(769); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(763); + setState(770); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(764); + setState(771); ((SpecStatementContext)_localctx).kind = match(POST); - setState(765); + setState(772); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(766); + setState(773); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(767); + setState(774); terminationMeasure(); } break; @@ -3472,28 +3522,28 @@ public T accept(ParseTreeVisitor visitor) { public final TerminationMeasureContext terminationMeasure() throws RecognitionException { TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_terminationMeasure); + enterRule(_localctx, 100, RULE_terminationMeasure); try { enterOuterAlt(_localctx, 1); { - setState(771); + setState(778); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { case 1: { - setState(770); + setState(777); expressionList(); } break; } - setState(775); + setState(782); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { - setState(773); + setState(780); match(IF); - setState(774); + setState(781); expression(0); } break; @@ -3529,11 +3579,11 @@ public T accept(ParseTreeVisitor visitor) { public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_assertion); + enterRule(_localctx, 102, RULE_assertion); try { - setState(779); + setState(786); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { @@ -3542,7 +3592,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(778); + setState(785); expression(0); } break; @@ -3586,32 +3636,32 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtContext matchStmt() throws RecognitionException { MatchStmtContext _localctx = new MatchStmtContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_matchStmt); + enterRule(_localctx, 104, RULE_matchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(781); + setState(788); match(MATCH); - setState(782); + setState(789); expression(0); - setState(783); + setState(790); match(L_CURLY); - setState(787); + setState(794); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(784); + setState(791); matchStmtClause(); } } - setState(789); + setState(796); _errHandler.sync(this); _la = _input.LA(1); } - setState(790); + setState(797); match(R_CURLY); } } @@ -3648,20 +3698,20 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtClauseContext matchStmtClause() throws RecognitionException { MatchStmtClauseContext _localctx = new MatchStmtClauseContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_matchStmtClause); + enterRule(_localctx, 106, RULE_matchStmtClause); try { enterOuterAlt(_localctx, 1); { - setState(792); + setState(799); matchCase(); - setState(793); + setState(800); match(COLON); - setState(795); + setState(802); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { case 1: { - setState(794); + setState(801); statementList(); } break; @@ -3699,24 +3749,24 @@ public T accept(ParseTreeVisitor visitor) { public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_matchCase); + enterRule(_localctx, 108, RULE_matchCase); try { - setState(800); + setState(807); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(797); + setState(804); match(CASE); - setState(798); + setState(805); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(799); + setState(806); match(DEFAULT); } break; @@ -3791,19 +3841,19 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternContext matchPattern() throws RecognitionException { MatchPatternContext _localctx = new MatchPatternContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_matchPattern); + enterRule(_localctx, 110, RULE_matchPattern); int _la; try { - setState(815); + setState(822); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(802); + setState(809); match(QMARK); - setState(803); + setState(810); match(IDENTIFIER); } break; @@ -3811,23 +3861,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(804); + setState(811); literalType(); - setState(805); + setState(812); match(L_CURLY); - setState(810); + setState(817); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956190846021146L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(806); + setState(813); matchPatternList(); - setState(808); + setState(815); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(807); + setState(814); match(COMMA); } } @@ -3835,7 +3885,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(812); + setState(819); match(R_CURLY); } break; @@ -3843,7 +3893,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(814); + setState(821); expression(0); } break; @@ -3885,30 +3935,30 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternListContext matchPatternList() throws RecognitionException { MatchPatternListContext _localctx = new MatchPatternListContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_matchPatternList); + enterRule(_localctx, 112, RULE_matchPatternList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(817); + setState(824); matchPattern(); - setState(822); + setState(829); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,46,_ctx); + _alt = getInterpreter().adaptivePredict(_input,47,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(818); + setState(825); match(COMMA); - setState(819); + setState(826); matchPattern(); } } } - setState(824); + setState(831); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,46,_ctx); + _alt = getInterpreter().adaptivePredict(_input,47,_ctx); } } } @@ -3950,37 +4000,37 @@ public T accept(ParseTreeVisitor visitor) { public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException { BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_blockWithBodyParameterInfo); + enterRule(_localctx, 114, RULE_blockWithBodyParameterInfo); try { enterOuterAlt(_localctx, 1); { - setState(825); + setState(832); match(L_CURLY); - setState(830); + setState(837); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(826); + setState(833); match(SHARE); - setState(827); + setState(834); identifierList(); - setState(828); + setState(835); eos(); } break; } - setState(833); + setState(840); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: { - setState(832); + setState(839); statementList(); } break; } - setState(835); + setState(842); match(R_CURLY); } } @@ -4020,47 +4070,47 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecInstanceContext closureSpecInstance() throws RecognitionException { ClosureSpecInstanceContext _localctx = new ClosureSpecInstanceContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_closureSpecInstance); + enterRule(_localctx, 116, RULE_closureSpecInstance); int _la; try { enterOuterAlt(_localctx, 1); { - setState(839); + setState(846); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(837); + setState(844); qualifiedIdent(); } break; case 2: { - setState(838); + setState(845); match(IDENTIFIER); } break; } - setState(849); + setState(856); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: { - setState(841); + setState(848); match(L_CURLY); - setState(846); + setState(853); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(842); + setState(849); closureSpecParams(); - setState(844); + setState(851); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(843); + setState(850); match(COMMA); } } @@ -4068,7 +4118,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(848); + setState(855); match(R_CURLY); } break; @@ -4111,30 +4161,30 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamsContext closureSpecParams() throws RecognitionException { ClosureSpecParamsContext _localctx = new ClosureSpecParamsContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_closureSpecParams); + enterRule(_localctx, 118, RULE_closureSpecParams); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(851); + setState(858); closureSpecParam(); - setState(856); + setState(863); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,53,_ctx); + _alt = getInterpreter().adaptivePredict(_input,54,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(852); + setState(859); match(COMMA); - setState(853); + setState(860); closureSpecParam(); } } } - setState(858); + setState(865); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,53,_ctx); + _alt = getInterpreter().adaptivePredict(_input,54,_ctx); } } } @@ -4169,23 +4219,23 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamContext closureSpecParam() throws RecognitionException { ClosureSpecParamContext _localctx = new ClosureSpecParamContext(_ctx, getState()); - enterRule(_localctx, 118, RULE_closureSpecParam); + enterRule(_localctx, 120, RULE_closureSpecParam); try { enterOuterAlt(_localctx, 1); { - setState(861); + setState(868); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(859); + setState(866); match(IDENTIFIER); - setState(860); + setState(867); match(COLON); } break; } - setState(863); + setState(870); expression(0); } } @@ -4226,19 +4276,19 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureImplProofStmtContext closureImplProofStmt() throws RecognitionException { ClosureImplProofStmtContext _localctx = new ClosureImplProofStmtContext(_ctx, getState()); - enterRule(_localctx, 120, RULE_closureImplProofStmt); + enterRule(_localctx, 122, RULE_closureImplProofStmt); try { enterOuterAlt(_localctx, 1); { - setState(865); + setState(872); match(PROOF); - setState(866); + setState(873); expression(0); - setState(867); + setState(874); match(IMPL); - setState(868); + setState(875); closureSpecInstance(); - setState(869); + setState(876); block(); } } @@ -4295,57 +4345,57 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofContext implementationProof() throws RecognitionException { ImplementationProofContext _localctx = new ImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 122, RULE_implementationProof); + enterRule(_localctx, 124, RULE_implementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(871); + setState(878); type_(); - setState(872); + setState(879); match(IMPL); - setState(873); + setState(880); type_(); - setState(892); + setState(899); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { - setState(874); + setState(881); match(L_CURLY); - setState(880); + setState(887); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(875); + setState(882); implementationProofPredicateAlias(); - setState(876); + setState(883); eos(); } } - setState(882); + setState(889); _errHandler.sync(this); _la = _input.LA(1); } - setState(888); + setState(895); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(883); + setState(890); methodImplementationProof(); - setState(884); + setState(891); eos(); } } - setState(890); + setState(897); _errHandler.sync(this); _la = _input.LA(1); } - setState(891); + setState(898); match(R_CURLY); } break; @@ -4389,33 +4439,33 @@ public T accept(ParseTreeVisitor visitor) { public final MethodImplementationProofContext methodImplementationProof() throws RecognitionException { MethodImplementationProofContext _localctx = new MethodImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 124, RULE_methodImplementationProof); + enterRule(_localctx, 126, RULE_methodImplementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(895); + setState(902); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(894); + setState(901); match(PURE); } } - setState(897); + setState(904); nonLocalReceiver(); - setState(898); + setState(905); match(IDENTIFIER); - setState(899); + setState(906); signature(); - setState(901); + setState(908); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: { - setState(900); + setState(907); block(); } break; @@ -4455,36 +4505,36 @@ public T accept(ParseTreeVisitor visitor) { public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionException { NonLocalReceiverContext _localctx = new NonLocalReceiverContext(_ctx, getState()); - enterRule(_localctx, 126, RULE_nonLocalReceiver); + enterRule(_localctx, 128, RULE_nonLocalReceiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(903); + setState(910); match(L_PAREN); - setState(905); + setState(912); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(904); + setState(911); match(IDENTIFIER); } break; } - setState(908); + setState(915); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(907); + setState(914); match(STAR); } } - setState(910); + setState(917); typeName(); - setState(911); + setState(918); match(R_PAREN); } } @@ -4522,26 +4572,26 @@ public T accept(ParseTreeVisitor visitor) { public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_selection); + enterRule(_localctx, 130, RULE_selection); try { - setState(918); + setState(925); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(913); + setState(920); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(914); + setState(921); type_(); - setState(915); + setState(922); match(DOT); - setState(916); + setState(923); match(IDENTIFIER); } break; @@ -4582,28 +4632,28 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofPredicateAliasContext implementationProofPredicateAlias() throws RecognitionException { ImplementationProofPredicateAliasContext _localctx = new ImplementationProofPredicateAliasContext(_ctx, getState()); - enterRule(_localctx, 130, RULE_implementationProofPredicateAlias); + enterRule(_localctx, 132, RULE_implementationProofPredicateAlias); try { enterOuterAlt(_localctx, 1); { - setState(920); + setState(927); match(PRED); - setState(921); + setState(928); match(IDENTIFIER); - setState(922); + setState(929); match(DECLARE_ASSIGN); - setState(925); + setState(932); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { case 1: { - setState(923); + setState(930); selection(); } break; case 2: { - setState(924); + setState(931); operandName(); } break; @@ -4646,30 +4696,30 @@ public T accept(ParseTreeVisitor visitor) { public final MakeContext make() throws RecognitionException { MakeContext _localctx = new MakeContext(_ctx, getState()); - enterRule(_localctx, 132, RULE_make); + enterRule(_localctx, 134, RULE_make); int _la; try { enterOuterAlt(_localctx, 1); { - setState(927); + setState(934); match(MAKE); - setState(928); + setState(935); match(L_PAREN); - setState(929); + setState(936); type_(); - setState(932); + setState(939); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(930); + setState(937); match(COMMA); - setState(931); + setState(938); expressionList(); } } - setState(934); + setState(941); match(R_PAREN); } } @@ -4705,17 +4755,17 @@ public T accept(ParseTreeVisitor visitor) { public final New_Context new_() throws RecognitionException { New_Context _localctx = new New_Context(_ctx, getState()); - enterRule(_localctx, 134, RULE_new_); + enterRule(_localctx, 136, RULE_new_); try { enterOuterAlt(_localctx, 1); { - setState(936); + setState(943); match(NEW); - setState(937); + setState(944); match(L_PAREN); - setState(938); + setState(945); type_(); - setState(939); + setState(946); match(R_PAREN); } } @@ -4755,24 +4805,24 @@ public T accept(ParseTreeVisitor visitor) { public final SpecMemberContext specMember() throws RecognitionException { SpecMemberContext _localctx = new SpecMemberContext(_ctx, getState()); - enterRule(_localctx, 136, RULE_specMember); + enterRule(_localctx, 138, RULE_specMember); try { enterOuterAlt(_localctx, 1); { - setState(941); + setState(948); ((SpecMemberContext)_localctx).specification = specification(); - setState(944); + setState(951); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { case 1: { - setState(942); + setState(949); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; case 2: { - setState(943); + setState(950); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; @@ -4818,23 +4868,23 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) throws RecognitionException { FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 138, RULE_functionDecl); + enterRule(_localctx, 140, RULE_functionDecl); try { enterOuterAlt(_localctx, 1); { - setState(946); + setState(953); match(FUNC); - setState(947); + setState(954); match(IDENTIFIER); { - setState(948); + setState(955); signature(); - setState(950); + setState(957); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(949); + setState(956); blockWithBodyParameterInfo(); } break; @@ -4884,25 +4934,25 @@ public T accept(ParseTreeVisitor visitor) { public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws RecognitionException { MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 140, RULE_methodDecl); + enterRule(_localctx, 142, RULE_methodDecl); try { enterOuterAlt(_localctx, 1); { - setState(952); + setState(959); match(FUNC); - setState(953); + setState(960); receiver(); - setState(954); + setState(961); match(IDENTIFIER); { - setState(955); + setState(962); signature(); - setState(957); + setState(964); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(956); + setState(963); blockWithBodyParameterInfo(); } break; @@ -4943,13 +4993,13 @@ public T accept(ParseTreeVisitor visitor) { public final ExplicitGhostMemberContext explicitGhostMember() throws RecognitionException { ExplicitGhostMemberContext _localctx = new ExplicitGhostMemberContext(_ctx, getState()); - enterRule(_localctx, 142, RULE_explicitGhostMember); + enterRule(_localctx, 144, RULE_explicitGhostMember); try { enterOuterAlt(_localctx, 1); { - setState(959); + setState(966); match(GHOST); - setState(962); + setState(969); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -4960,7 +5010,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TRUSTED: case FUNC: { - setState(960); + setState(967); specMember(); } break; @@ -4968,7 +5018,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(961); + setState(968); declaration(); } break; @@ -5011,22 +5061,22 @@ public T accept(ParseTreeVisitor visitor) { public final FpredicateDeclContext fpredicateDecl() throws RecognitionException { FpredicateDeclContext _localctx = new FpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 144, RULE_fpredicateDecl); + enterRule(_localctx, 146, RULE_fpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(964); + setState(971); match(PRED); - setState(965); + setState(972); match(IDENTIFIER); - setState(966); + setState(973); parameters(); - setState(968); + setState(975); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(967); + setState(974); predicateBody(); } break; @@ -5067,17 +5117,17 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateBodyContext predicateBody() throws RecognitionException { PredicateBodyContext _localctx = new PredicateBodyContext(_ctx, getState()); - enterRule(_localctx, 146, RULE_predicateBody); + enterRule(_localctx, 148, RULE_predicateBody); try { enterOuterAlt(_localctx, 1); { - setState(970); + setState(977); match(L_CURLY); - setState(971); + setState(978); expression(0); - setState(972); + setState(979); eos(); - setState(973); + setState(980); match(R_CURLY); } } @@ -5118,24 +5168,24 @@ public T accept(ParseTreeVisitor visitor) { public final MpredicateDeclContext mpredicateDecl() throws RecognitionException { MpredicateDeclContext _localctx = new MpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 148, RULE_mpredicateDecl); + enterRule(_localctx, 150, RULE_mpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(975); + setState(982); match(PRED); - setState(976); + setState(983); receiver(); - setState(977); + setState(984); match(IDENTIFIER); - setState(978); + setState(985); parameters(); - setState(980); + setState(987); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: { - setState(979); + setState(986); predicateBody(); } break; @@ -5178,13 +5228,13 @@ public T accept(ParseTreeVisitor visitor) { public final VarSpecContext varSpec() throws RecognitionException { VarSpecContext _localctx = new VarSpecContext(_ctx, getState()); - enterRule(_localctx, 150, RULE_varSpec); + enterRule(_localctx, 152, RULE_varSpec); try { enterOuterAlt(_localctx, 1); { - setState(982); + setState(989); maybeAddressableIdentifierList(); - setState(990); + setState(997); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5207,16 +5257,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(983); + setState(990); type_(); - setState(986); + setState(993); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: { - setState(984); + setState(991); match(ASSIGN); - setState(985); + setState(992); expressionList(); } break; @@ -5225,9 +5275,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(988); + setState(995); match(ASSIGN); - setState(989); + setState(996); expressionList(); } break; @@ -5269,15 +5319,15 @@ public T accept(ParseTreeVisitor visitor) { public final ShortVarDeclContext shortVarDecl() throws RecognitionException { ShortVarDeclContext _localctx = new ShortVarDeclContext(_ctx, getState()); - enterRule(_localctx, 152, RULE_shortVarDecl); + enterRule(_localctx, 154, RULE_shortVarDecl); try { enterOuterAlt(_localctx, 1); { - setState(992); + setState(999); maybeAddressableIdentifierList(); - setState(993); + setState(1000); match(DECLARE_ASSIGN); - setState(994); + setState(1001); expressionList(); } } @@ -5316,36 +5366,36 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverContext receiver() throws RecognitionException { ReceiverContext _localctx = new ReceiverContext(_ctx, getState()); - enterRule(_localctx, 154, RULE_receiver); + enterRule(_localctx, 156, RULE_receiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(996); + setState(1003); match(L_PAREN); - setState(998); + setState(1005); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: { - setState(997); + setState(1004); maybeAddressableIdentifier(); } break; } - setState(1000); + setState(1007); type_(); - setState(1002); + setState(1009); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1001); + setState(1008); match(COMMA); } } - setState(1004); + setState(1011); match(R_PAREN); } } @@ -5381,22 +5431,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 156, RULE_parameterDecl); + enterRule(_localctx, 158, RULE_parameterDecl); try { - setState(1008); + setState(1015); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1006); + setState(1013); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1007); + setState(1014); ghostParameterDecl(); } break; @@ -5434,21 +5484,21 @@ public T accept(ParseTreeVisitor visitor) { public final ActualParameterDeclContext actualParameterDecl() throws RecognitionException { ActualParameterDeclContext _localctx = new ActualParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 158, RULE_actualParameterDecl); + enterRule(_localctx, 160, RULE_actualParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(1011); + setState(1018); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: { - setState(1010); + setState(1017); identifierList(); } break; } - setState(1013); + setState(1020); parameterType(); } } @@ -5485,23 +5535,23 @@ public T accept(ParseTreeVisitor visitor) { public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionException { GhostParameterDeclContext _localctx = new GhostParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 160, RULE_ghostParameterDecl); + enterRule(_localctx, 162, RULE_ghostParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(1015); + setState(1022); match(GHOST); - setState(1017); + setState(1024); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { - setState(1016); + setState(1023); identifierList(); } break; } - setState(1019); + setState(1026); parameterType(); } } @@ -5535,22 +5585,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterTypeContext parameterType() throws RecognitionException { ParameterTypeContext _localctx = new ParameterTypeContext(_ctx, getState()); - enterRule(_localctx, 162, RULE_parameterType); + enterRule(_localctx, 164, RULE_parameterType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1022); + setState(1029); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1021); + setState(1028); match(ELLIPSIS); } } - setState(1024); + setState(1031); type_(); } } @@ -5865,23 +5915,23 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _parentState = getState(); ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); ExpressionContext _prevctx = _localctx; - int _startState = 164; - enterRecursionRule(_localctx, 164, RULE_expression, _p); + int _startState = 166; + enterRecursionRule(_localctx, 166, RULE_expression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1047); + setState(1054); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: { _localctx = new UnaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1027); + setState(1034); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 127L) != 0)) ) { @@ -5892,7 +5942,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1028); + setState(1035); expression(15); } break; @@ -5901,7 +5951,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1029); + setState(1036); primaryExpr(0); } break; @@ -5910,13 +5960,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1030); + setState(1037); match(UNFOLDING); - setState(1031); + setState(1038); predicateAccess(); - setState(1032); + setState(1039); match(IN); - setState(1033); + setState(1040); expression(3); } break; @@ -5925,13 +5975,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1035); + setState(1042); match(LET); - setState(1036); + setState(1043); shortVarDecl(); - setState(1037); + setState(1044); match(IN); - setState(1038); + setState(1045); expression(2); } break; @@ -5940,7 +5990,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1040); + setState(1047); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -5950,38 +6000,38 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1041); + setState(1048); boundVariables(); - setState(1042); + setState(1049); match(COLON); - setState(1043); + setState(1050); match(COLON); - setState(1044); + setState(1051); triggers(); - setState(1045); + setState(1052); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1084); + setState(1091); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,81,_ctx); + _alt = getInterpreter().adaptivePredict(_input,82,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1082); + setState(1089); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1049); + setState(1056); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1050); + setState(1057); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & 1567L) != 0)) ) { @@ -5992,7 +6042,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1051); + setState(1058); expression(14); } break; @@ -6000,9 +6050,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1052); + setState(1059); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1053); + setState(1060); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); if ( !(_la==WAND || ((((_la - 113)) & ~0x3f) == 0 && ((1L << (_la - 113)) & 3674113L) != 0)) ) { @@ -6013,7 +6063,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1054); + setState(1061); expression(13); } break; @@ -6021,9 +6071,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1055); + setState(1062); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1056); + setState(1063); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { @@ -6034,7 +6084,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1057); + setState(1064); expression(12); } break; @@ -6042,9 +6092,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1058); + setState(1065); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1059); + setState(1066); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { @@ -6055,7 +6105,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1060); + setState(1067); expression(11); } break; @@ -6063,9 +6113,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1061); + setState(1068); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1062); + setState(1069); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 8866461766385667L) != 0)) ) { @@ -6076,7 +6126,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1063); + setState(1070); expression(10); } break; @@ -6084,11 +6134,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1064); + setState(1071); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1065); + setState(1072); match(LOGICAL_AND); - setState(1066); + setState(1073); expression(8); } break; @@ -6096,11 +6146,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1067); + setState(1074); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1068); + setState(1075); match(LOGICAL_OR); - setState(1069); + setState(1076); expression(7); } break; @@ -6108,11 +6158,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1070); + setState(1077); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1071); + setState(1078); match(IMPLIES); - setState(1072); + setState(1079); expression(5); } break; @@ -6120,15 +6170,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1073); + setState(1080); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1074); + setState(1081); match(QMARK); - setState(1075); + setState(1082); expression(0); - setState(1076); + setState(1083); match(COLON); - setState(1077); + setState(1084); expression(4); } break; @@ -6136,20 +6186,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1079); + setState(1086); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1080); + setState(1087); match(IMPL); - setState(1081); + setState(1088); closureSpecInstance(); } break; } } } - setState(1086); + setState(1093); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,81,_ctx); + _alt = getInterpreter().adaptivePredict(_input,82,_ctx); } } } @@ -6239,148 +6289,148 @@ public T accept(ParseTreeVisitor visitor) { public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); - enterRule(_localctx, 166, RULE_statement); + enterRule(_localctx, 168, RULE_statement); try { - setState(1107); + setState(1114); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1087); + setState(1094); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1088); + setState(1095); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1089); + setState(1096); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1090); + setState(1097); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1091); + setState(1098); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1092); + setState(1099); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1093); + setState(1100); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1094); + setState(1101); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1095); + setState(1102); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1096); + setState(1103); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1097); + setState(1104); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1098); + setState(1105); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1099); + setState(1106); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1100); + setState(1107); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1101); + setState(1108); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1102); + setState(1109); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1103); + setState(1110); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1104); + setState(1111); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1105); + setState(1112); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1106); + setState(1113); closureImplProofStmt(); } break; @@ -6416,13 +6466,13 @@ public T accept(ParseTreeVisitor visitor) { public final ApplyStmtContext applyStmt() throws RecognitionException { ApplyStmtContext _localctx = new ApplyStmtContext(_ctx, getState()); - enterRule(_localctx, 168, RULE_applyStmt); + enterRule(_localctx, 170, RULE_applyStmt); try { enterOuterAlt(_localctx, 1); { - setState(1109); + setState(1116); match(APPLY); - setState(1110); + setState(1117); expression(0); } } @@ -6459,20 +6509,20 @@ public T accept(ParseTreeVisitor visitor) { public final PackageStmtContext packageStmt() throws RecognitionException { PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState()); - enterRule(_localctx, 170, RULE_packageStmt); + enterRule(_localctx, 172, RULE_packageStmt); try { enterOuterAlt(_localctx, 1); { - setState(1112); + setState(1119); match(PACKAGE); - setState(1113); + setState(1120); expression(0); - setState(1115); + setState(1122); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: { - setState(1114); + setState(1121); block(); } break; @@ -6511,13 +6561,13 @@ public T accept(ParseTreeVisitor visitor) { public final SpecForStmtContext specForStmt() throws RecognitionException { SpecForStmtContext _localctx = new SpecForStmtContext(_ctx, getState()); - enterRule(_localctx, 172, RULE_specForStmt); + enterRule(_localctx, 174, RULE_specForStmt); try { enterOuterAlt(_localctx, 1); { - setState(1117); + setState(1124); loopSpec(); - setState(1118); + setState(1125); forStmt(); } } @@ -6567,39 +6617,39 @@ public T accept(ParseTreeVisitor visitor) { public final LoopSpecContext loopSpec() throws RecognitionException { LoopSpecContext _localctx = new LoopSpecContext(_ctx, getState()); - enterRule(_localctx, 174, RULE_loopSpec); + enterRule(_localctx, 176, RULE_loopSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1126); + setState(1133); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1120); + setState(1127); match(INV); - setState(1121); + setState(1128); expression(0); - setState(1122); + setState(1129); eos(); } } - setState(1128); + setState(1135); _errHandler.sync(this); _la = _input.LA(1); } - setState(1133); + setState(1140); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1129); + setState(1136); match(DEC); - setState(1130); + setState(1137); terminationMeasure(); - setState(1131); + setState(1138); eos(); } } @@ -6642,27 +6692,27 @@ public T accept(ParseTreeVisitor visitor) { public final DeferStmtContext deferStmt() throws RecognitionException { DeferStmtContext _localctx = new DeferStmtContext(_ctx, getState()); - enterRule(_localctx, 176, RULE_deferStmt); + enterRule(_localctx, 178, RULE_deferStmt); int _la; try { - setState(1140); + setState(1147); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1135); + setState(1142); match(DEFER); - setState(1136); + setState(1143); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1137); + setState(1144); match(DEFER); - setState(1138); + setState(1145); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -6673,7 +6723,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1139); + setState(1146); predicateAccess(); } break; @@ -6717,64 +6767,64 @@ public T accept(ParseTreeVisitor visitor) { public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); - enterRule(_localctx, 178, RULE_basicLit); + enterRule(_localctx, 180, RULE_basicLit); try { - setState(1150); + setState(1157); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1142); + setState(1149); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1143); + setState(1150); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1144); + setState(1151); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1145); + setState(1152); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1146); + setState(1153); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1147); + setState(1154); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1148); + setState(1155); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1149); + setState(1156); match(RUNE_LIT); } break; @@ -7027,23 +7077,23 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _parentState = getState(); PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, _parentState); PrimaryExprContext _prevctx = _localctx; - int _startState = 180; - enterRecursionRule(_localctx, 180, RULE_primaryExpr, _p); + int _startState = 182; + enterRecursionRule(_localctx, 182, RULE_primaryExpr, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1164); + setState(1171); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { case 1: { _localctx = new OperandPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1153); + setState(1160); operand(); } break; @@ -7052,7 +7102,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1154); + setState(1161); conversion(); } break; @@ -7061,7 +7111,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1155); + setState(1162); methodExpr(); } break; @@ -7070,7 +7120,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1156); + setState(1163); ghostPrimaryExpr(); } break; @@ -7079,7 +7129,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1157); + setState(1164); new_(); } break; @@ -7088,7 +7138,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1158); + setState(1165); make(); } break; @@ -7097,7 +7147,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1159); + setState(1166); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 281474976710729L) != 0)) ) { @@ -7108,36 +7158,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1160); + setState(1167); match(L_PAREN); - setState(1161); + setState(1168); expression(0); - setState(1162); + setState(1169); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1188); + setState(1195); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,90,_ctx); + _alt = getInterpreter().adaptivePredict(_input,91,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1186); + setState(1193); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1166); + setState(1173); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1167); + setState(1174); match(DOT); - setState(1168); + setState(1175); match(IDENTIFIER); } break; @@ -7145,9 +7195,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1169); + setState(1176); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1170); + setState(1177); index(); } break; @@ -7155,9 +7205,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1171); + setState(1178); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1172); + setState(1179); slice_(); } break; @@ -7165,9 +7215,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1173); + setState(1180); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1174); + setState(1181); seqUpdExp(); } break; @@ -7175,9 +7225,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1175); + setState(1182); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1176); + setState(1183); typeAssertion(); } break; @@ -7185,9 +7235,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1177); + setState(1184); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1178); + setState(1185); arguments(); } break; @@ -7195,13 +7245,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1179); + setState(1186); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1180); + setState(1187); arguments(); - setState(1181); + setState(1188); match(AS); - setState(1182); + setState(1189); closureSpecInstance(); } break; @@ -7209,18 +7259,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1184); + setState(1191); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1185); + setState(1192); predConstructArgs(); } break; } } } - setState(1190); + setState(1197); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,90,_ctx); + _alt = getInterpreter().adaptivePredict(_input,91,_ctx); } } } @@ -7257,13 +7307,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionLitContext functionLit() throws RecognitionException { FunctionLitContext _localctx = new FunctionLitContext(_ctx, getState()); - enterRule(_localctx, 182, RULE_functionLit); + enterRule(_localctx, 184, RULE_functionLit); try { enterOuterAlt(_localctx, 1); { - setState(1191); + setState(1198); ((FunctionLitContext)_localctx).specification = specification(); - setState(1192); + setState(1199); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7306,32 +7356,32 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws RecognitionException { ClosureDeclContext _localctx = new ClosureDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 184, RULE_closureDecl); + enterRule(_localctx, 186, RULE_closureDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1194); + setState(1201); match(FUNC); - setState(1196); + setState(1203); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1195); + setState(1202); match(IDENTIFIER); } } { - setState(1198); + setState(1205); signature(); - setState(1200); + setState(1207); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,92,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(1199); + setState(1206); blockWithBodyParameterInfo(); } break; @@ -7371,34 +7421,34 @@ public T accept(ParseTreeVisitor visitor) { public final PredConstructArgsContext predConstructArgs() throws RecognitionException { PredConstructArgsContext _localctx = new PredConstructArgsContext(_ctx, getState()); - enterRule(_localctx, 186, RULE_predConstructArgs); + enterRule(_localctx, 188, RULE_predConstructArgs); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1202); + setState(1209); match(L_PRED); - setState(1204); + setState(1211); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1203); + setState(1210); expressionList(); } } - setState(1207); + setState(1214); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1206); + setState(1213); match(COMMA); } } - setState(1209); + setState(1216); match(R_PRED); } } @@ -7455,52 +7505,52 @@ public T accept(ParseTreeVisitor visitor) { public final InterfaceTypeContext interfaceType() throws RecognitionException { InterfaceTypeContext _localctx = new InterfaceTypeContext(_ctx, getState()); - enterRule(_localctx, 188, RULE_interfaceType); + enterRule(_localctx, 190, RULE_interfaceType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1211); + setState(1218); match(INTERFACE); - setState(1212); + setState(1219); match(L_CURLY); - setState(1222); + setState(1229); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 72057594172173824L) != 0) || _la==TRUSTED || _la==IDENTIFIER) { { { - setState(1216); + setState(1223); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: { - setState(1213); + setState(1220); methodSpec(); } break; case 2: { - setState(1214); + setState(1221); typeName(); } break; case 3: { - setState(1215); + setState(1222); predicateSpec(); } break; } - setState(1218); + setState(1225); eos(); } } - setState(1224); + setState(1231); _errHandler.sync(this); _la = _input.LA(1); } - setState(1225); + setState(1232); match(R_CURLY); } } @@ -7535,15 +7585,15 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateSpecContext predicateSpec() throws RecognitionException { PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState()); - enterRule(_localctx, 190, RULE_predicateSpec); + enterRule(_localctx, 192, RULE_predicateSpec); try { enterOuterAlt(_localctx, 1); { - setState(1227); + setState(1234); match(PRED); - setState(1228); + setState(1235); match(IDENTIFIER); - setState(1229); + setState(1236); parameters(); } } @@ -7584,53 +7634,53 @@ public T accept(ParseTreeVisitor visitor) { public final MethodSpecContext methodSpec() throws RecognitionException { MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState()); - enterRule(_localctx, 192, RULE_methodSpec); + enterRule(_localctx, 194, RULE_methodSpec); int _la; try { - setState(1246); + setState(1253); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,100,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1232); + setState(1239); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1231); + setState(1238); match(GHOST); } } - setState(1234); + setState(1241); specification(); - setState(1235); + setState(1242); match(IDENTIFIER); - setState(1236); + setState(1243); parameters(); - setState(1237); + setState(1244); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1240); + setState(1247); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1239); + setState(1246); match(GHOST); } } - setState(1242); + setState(1249); specification(); - setState(1243); + setState(1250); match(IDENTIFIER); - setState(1244); + setState(1251); parameters(); } break; @@ -7676,15 +7726,15 @@ public T accept(ParseTreeVisitor visitor) { public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); - enterRule(_localctx, 194, RULE_type_); + enterRule(_localctx, 196, RULE_type_); try { - setState(1255); + setState(1262); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1248); + setState(1255); typeName(); } break; @@ -7699,7 +7749,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1249); + setState(1256); typeLit(); } break; @@ -7713,18 +7763,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1250); + setState(1257); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1251); + setState(1258); match(L_PAREN); - setState(1252); + setState(1259); type_(); - setState(1253); + setState(1260); match(R_PAREN); } break; @@ -7785,71 +7835,71 @@ public T accept(ParseTreeVisitor visitor) { public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_typeLit); + enterRule(_localctx, 198, RULE_typeLit); try { - setState(1266); + setState(1273); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1257); + setState(1264); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1258); + setState(1265); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1259); + setState(1266); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1260); + setState(1267); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1261); + setState(1268); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1262); + setState(1269); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1263); + setState(1270); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1264); + setState(1271); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1265); + setState(1272); predType(); } break; @@ -7885,13 +7935,13 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeContext predType() throws RecognitionException { PredTypeContext _localctx = new PredTypeContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_predType); + enterRule(_localctx, 200, RULE_predType); try { enterOuterAlt(_localctx, 1); { - setState(1268); + setState(1275); match(PRED); - setState(1269); + setState(1276); predTypeParams(); } } @@ -7933,45 +7983,45 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeParamsContext predTypeParams() throws RecognitionException { PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_predTypeParams); + enterRule(_localctx, 202, RULE_predTypeParams); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1271); + setState(1278); match(L_PAREN); - setState(1283); + setState(1290); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { { - setState(1272); + setState(1279); type_(); - setState(1277); + setState(1284); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,102,_ctx); + _alt = getInterpreter().adaptivePredict(_input,103,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1273); + setState(1280); match(COMMA); - setState(1274); + setState(1281); type_(); } } } - setState(1279); + setState(1286); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,102,_ctx); + _alt = getInterpreter().adaptivePredict(_input,103,_ctx); } - setState(1281); + setState(1288); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1280); + setState(1287); match(COMMA); } } @@ -7979,7 +8029,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1285); + setState(1292); match(R_PAREN); } } @@ -8030,57 +8080,57 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_literalType); + enterRule(_localctx, 204, RULE_literalType); try { - setState(1294); + setState(1301); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,105,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1287); + setState(1294); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1288); + setState(1295); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1289); + setState(1296); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1290); + setState(1297); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1291); + setState(1298); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1292); + setState(1299); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1293); + setState(1300); typeName(); } break; @@ -8118,17 +8168,17 @@ public T accept(ParseTreeVisitor visitor) { public final ImplicitArrayContext implicitArray() throws RecognitionException { ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState()); - enterRule(_localctx, 204, RULE_implicitArray); + enterRule(_localctx, 206, RULE_implicitArray); try { enterOuterAlt(_localctx, 1); { - setState(1296); + setState(1303); match(L_BRACKET); - setState(1297); + setState(1304); match(ELLIPSIS); - setState(1298); + setState(1305); match(R_BRACKET); - setState(1299); + setState(1306); elementType(); } } @@ -8173,36 +8223,36 @@ public T accept(ParseTreeVisitor visitor) { public final Slice_Context slice_() throws RecognitionException { Slice_Context _localctx = new Slice_Context(_ctx, getState()); - enterRule(_localctx, 206, RULE_slice_); + enterRule(_localctx, 208, RULE_slice_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1301); + setState(1308); match(L_BRACKET); - setState(1317); + setState(1324); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,110,_ctx) ) { case 1: { - setState(1303); + setState(1310); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1302); + setState(1309); low(); } } - setState(1305); + setState(1312); match(COLON); - setState(1307); + setState(1314); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1306); + setState(1313); high(); } } @@ -8211,28 +8261,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1310); + setState(1317); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1309); + setState(1316); low(); } } - setState(1312); + setState(1319); match(COLON); - setState(1313); + setState(1320); high(); - setState(1314); + setState(1321); match(COLON); - setState(1315); + setState(1322); cap(); } break; } - setState(1319); + setState(1326); match(R_BRACKET); } } @@ -8265,11 +8315,11 @@ public T accept(ParseTreeVisitor visitor) { public final LowContext low() throws RecognitionException { LowContext _localctx = new LowContext(_ctx, getState()); - enterRule(_localctx, 208, RULE_low); + enterRule(_localctx, 210, RULE_low); try { enterOuterAlt(_localctx, 1); { - setState(1321); + setState(1328); expression(0); } } @@ -8302,11 +8352,11 @@ public T accept(ParseTreeVisitor visitor) { public final HighContext high() throws RecognitionException { HighContext _localctx = new HighContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_high); + enterRule(_localctx, 212, RULE_high); try { enterOuterAlt(_localctx, 1); { - setState(1323); + setState(1330); expression(0); } } @@ -8339,11 +8389,11 @@ public T accept(ParseTreeVisitor visitor) { public final CapContext cap() throws RecognitionException { CapContext _localctx = new CapContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_cap); + enterRule(_localctx, 214, RULE_cap); try { enterOuterAlt(_localctx, 1); { - setState(1325); + setState(1332); expression(0); } } @@ -8386,17 +8436,17 @@ public T accept(ParseTreeVisitor visitor) { public final Assign_opContext assign_op() throws RecognitionException { Assign_opContext _localctx = new Assign_opContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_assign_op); + enterRule(_localctx, 216, RULE_assign_op); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1328); + setState(1335); _errHandler.sync(this); _la = _input.LA(1); if (((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) { { - setState(1327); + setState(1334); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) ) { @@ -8410,7 +8460,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1330); + setState(1337); match(ASSIGN); } } @@ -8454,48 +8504,48 @@ public T accept(ParseTreeVisitor visitor) { public final RangeClauseContext rangeClause() throws RecognitionException { RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_rangeClause); + enterRule(_localctx, 218, RULE_rangeClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1338); + setState(1345); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,111,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { case 1: { - setState(1332); + setState(1339); expressionList(); - setState(1333); + setState(1340); match(ASSIGN); } break; case 2: { - setState(1335); + setState(1342); maybeAddressableIdentifierList(); - setState(1336); + setState(1343); match(DECLARE_ASSIGN); } break; } - setState(1340); + setState(1347); match(RANGE); - setState(1341); + setState(1348); expression(0); - setState(1346); + setState(1353); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1342); + setState(1349); match(WITH); - setState(1344); + setState(1351); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1343); + setState(1350); match(IDENTIFIER); } } @@ -8534,13 +8584,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_packageClause); + enterRule(_localctx, 220, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1348); + setState(1355); match(PACKAGE); - setState(1349); + setState(1356); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -8573,11 +8623,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_importPath); + enterRule(_localctx, 222, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1351); + setState(1358); string_(); } } @@ -8616,29 +8666,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_declaration); + enterRule(_localctx, 224, RULE_declaration); try { - setState(1356); + setState(1363); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1353); + setState(1360); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1354); + setState(1361); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1355); + setState(1362); varDecl(); } break; @@ -8687,43 +8737,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_constDecl); + enterRule(_localctx, 226, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1358); + setState(1365); match(CONST); - setState(1370); + setState(1377); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1359); + setState(1366); constSpec(); } break; case L_PAREN: { - setState(1360); + setState(1367); match(L_PAREN); - setState(1366); + setState(1373); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1361); + setState(1368); constSpec(); - setState(1362); + setState(1369); eos(); } } - setState(1368); + setState(1375); _errHandler.sync(this); _la = _input.LA(1); } - setState(1369); + setState(1376); match(R_PAREN); } break; @@ -8768,31 +8818,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_constSpec); + enterRule(_localctx, 228, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1372); + setState(1379); identifierList(); - setState(1378); + setState(1385); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { case 1: { - setState(1374); + setState(1381); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { { - setState(1373); + setState(1380); type_(); } } - setState(1376); + setState(1383); match(ASSIGN); - setState(1377); + setState(1384); expressionList(); } break; @@ -8833,30 +8883,30 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_identifierList); + enterRule(_localctx, 230, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1380); + setState(1387); match(IDENTIFIER); - setState(1385); + setState(1392); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,119,_ctx); + _alt = getInterpreter().adaptivePredict(_input,120,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1381); + setState(1388); match(COMMA); - setState(1382); + setState(1389); match(IDENTIFIER); } } } - setState(1387); + setState(1394); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,119,_ctx); + _alt = getInterpreter().adaptivePredict(_input,120,_ctx); } } } @@ -8896,30 +8946,30 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_expressionList); + enterRule(_localctx, 232, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1388); + setState(1395); expression(0); - setState(1393); + setState(1400); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,120,_ctx); + _alt = getInterpreter().adaptivePredict(_input,121,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1389); + setState(1396); match(COMMA); - setState(1390); + setState(1397); expression(0); } } } - setState(1395); + setState(1402); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,120,_ctx); + _alt = getInterpreter().adaptivePredict(_input,121,_ctx); } } } @@ -8964,43 +9014,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_typeDecl); + enterRule(_localctx, 234, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1396); + setState(1403); match(TYPE); - setState(1408); + setState(1415); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1397); + setState(1404); typeSpec(); } break; case L_PAREN: { - setState(1398); + setState(1405); match(L_PAREN); - setState(1404); + setState(1411); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1399); + setState(1406); typeSpec(); - setState(1400); + setState(1407); eos(); } } - setState(1406); + setState(1413); _errHandler.sync(this); _la = _input.LA(1); } - setState(1407); + setState(1414); match(R_PAREN); } break; @@ -9040,24 +9090,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_typeSpec); + enterRule(_localctx, 236, RULE_typeSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1410); + setState(1417); match(IDENTIFIER); - setState(1412); + setState(1419); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1411); + setState(1418); match(ASSIGN); } } - setState(1414); + setState(1421); type_(); } } @@ -9102,43 +9152,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_varDecl); + enterRule(_localctx, 238, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1416); + setState(1423); match(VAR); - setState(1428); + setState(1435); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1417); + setState(1424); varSpec(); } break; case L_PAREN: { - setState(1418); + setState(1425); match(L_PAREN); - setState(1424); + setState(1431); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1419); + setState(1426); varSpec(); - setState(1420); + setState(1427); eos(); } } - setState(1426); + setState(1433); _errHandler.sync(this); _la = _input.LA(1); } - setState(1427); + setState(1434); match(R_PAREN); } break; @@ -9178,23 +9228,23 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_block); + enterRule(_localctx, 240, RULE_block); try { enterOuterAlt(_localctx, 1); { - setState(1430); + setState(1437); match(L_CURLY); - setState(1432); + setState(1439); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: { - setState(1431); + setState(1438); statementList(); } break; } - setState(1434); + setState(1441); match(R_CURLY); } } @@ -9244,13 +9294,13 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_statementList); + enterRule(_localctx, 242, RULE_statementList); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1448); + setState(1455); _errHandler.sync(this); _alt = 1; do { @@ -9258,17 +9308,17 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1443); + setState(1450); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: { - setState(1437); + setState(1444); _errHandler.sync(this); _la = _input.LA(1); if (_la==SEMI) { { - setState(1436); + setState(1443); match(SEMI); } } @@ -9277,12 +9327,12 @@ public final StatementListContext statementList() throws RecognitionException { break; case 2: { - setState(1440); + setState(1447); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOS) { { - setState(1439); + setState(1446); match(EOS); } } @@ -9291,14 +9341,14 @@ public final StatementListContext statementList() throws RecognitionException { break; case 3: { - setState(1442); + setState(1449); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; } - setState(1445); + setState(1452); statement(); - setState(1446); + setState(1453); eos(); } } @@ -9306,9 +9356,9 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1450); + setState(1457); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,130,_ctx); + _alt = getInterpreter().adaptivePredict(_input,131,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -9353,43 +9403,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_simpleStmt); + enterRule(_localctx, 244, RULE_simpleStmt); try { - setState(1457); + setState(1464); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1452); + setState(1459); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1453); + setState(1460); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1454); + setState(1461); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1455); + setState(1462); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1456); + setState(1463); shortVarDecl(); } break; @@ -9424,11 +9474,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_expressionStmt); + enterRule(_localctx, 246, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1459); + setState(1466); expression(0); } } @@ -9466,15 +9516,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_sendStmt); + enterRule(_localctx, 248, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1461); + setState(1468); ((SendStmtContext)_localctx).channel = expression(0); - setState(1462); + setState(1469); match(RECEIVE); - setState(1463); + setState(1470); expression(0); } } @@ -9509,14 +9559,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_incDecStmt); + enterRule(_localctx, 250, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1465); + setState(1472); expression(0); - setState(1466); + setState(1473); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -9563,15 +9613,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_assignment); + enterRule(_localctx, 252, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1468); + setState(1475); expressionList(); - setState(1469); + setState(1476); assign_op(); - setState(1470); + setState(1477); expressionList(); } } @@ -9603,12 +9653,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_emptyStmt); + enterRule(_localctx, 254, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1472); + setState(1479); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -9651,20 +9701,20 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_labeledStmt); + enterRule(_localctx, 256, RULE_labeledStmt); try { enterOuterAlt(_localctx, 1); { - setState(1474); + setState(1481); match(IDENTIFIER); - setState(1475); + setState(1482); match(COLON); - setState(1477); + setState(1484); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { case 1: { - setState(1476); + setState(1483); statement(); } break; @@ -9701,18 +9751,18 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_returnStmt); + enterRule(_localctx, 258, RULE_returnStmt); try { enterOuterAlt(_localctx, 1); { - setState(1479); + setState(1486); match(RETURN); - setState(1481); + setState(1488); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { case 1: { - setState(1480); + setState(1487); expressionList(); } break; @@ -9747,18 +9797,18 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_breakStmt); + enterRule(_localctx, 260, RULE_breakStmt); try { enterOuterAlt(_localctx, 1); { - setState(1483); + setState(1490); match(BREAK); - setState(1485); + setState(1492); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: { - setState(1484); + setState(1491); match(IDENTIFIER); } break; @@ -9793,18 +9843,18 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_continueStmt); + enterRule(_localctx, 262, RULE_continueStmt); try { enterOuterAlt(_localctx, 1); { - setState(1487); + setState(1494); match(CONTINUE); - setState(1489); + setState(1496); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { case 1: { - setState(1488); + setState(1495); match(IDENTIFIER); } break; @@ -9839,13 +9889,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_gotoStmt); + enterRule(_localctx, 264, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1491); + setState(1498); match(GOTO); - setState(1492); + setState(1499); match(IDENTIFIER); } } @@ -9876,11 +9926,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_fallthroughStmt); + enterRule(_localctx, 266, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1494); + setState(1501); match(FALLTHROUGH); } } @@ -9930,61 +9980,61 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_ifStmt); + enterRule(_localctx, 268, RULE_ifStmt); try { enterOuterAlt(_localctx, 1); { - setState(1496); + setState(1503); match(IF); - setState(1505); + setState(1512); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { case 1: { - setState(1497); + setState(1504); expression(0); } break; case 2: { - setState(1498); + setState(1505); eos(); - setState(1499); + setState(1506); expression(0); } break; case 3: { - setState(1501); + setState(1508); simpleStmt(); - setState(1502); + setState(1509); eos(); - setState(1503); + setState(1510); expression(0); } break; } - setState(1507); + setState(1514); block(); - setState(1513); + setState(1520); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: { - setState(1508); + setState(1515); match(ELSE); - setState(1511); + setState(1518); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1509); + setState(1516); ifStmt(); } break; case L_CURLY: { - setState(1510); + setState(1517); block(); } break; @@ -10028,22 +10078,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_switchStmt); + enterRule(_localctx, 270, RULE_switchStmt); try { - setState(1517); + setState(1524); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1515); + setState(1522); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1516); + setState(1523); typeSwitchStmt(); } break; @@ -10093,24 +10143,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_exprSwitchStmt); + enterRule(_localctx, 272, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1519); + setState(1526); match(SWITCH); - setState(1530); + setState(1537); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { case 1: { - setState(1521); + setState(1528); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1520); + setState(1527); expression(0); } } @@ -10119,24 +10169,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1524); + setState(1531); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1523); + setState(1530); simpleStmt(); } break; } - setState(1526); + setState(1533); eos(); - setState(1528); + setState(1535); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1527); + setState(1534); expression(0); } } @@ -10144,23 +10194,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1532); + setState(1539); match(L_CURLY); - setState(1536); + setState(1543); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1533); + setState(1540); exprCaseClause(); } } - setState(1538); + setState(1545); _errHandler.sync(this); _la = _input.LA(1); } - setState(1539); + setState(1546); match(R_CURLY); } } @@ -10197,20 +10247,20 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_exprCaseClause); + enterRule(_localctx, 274, RULE_exprCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1541); + setState(1548); exprSwitchCase(); - setState(1542); + setState(1549); match(COLON); - setState(1544); + setState(1551); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1543); + setState(1550); statementList(); } break; @@ -10248,24 +10298,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_exprSwitchCase); + enterRule(_localctx, 276, RULE_exprSwitchCase); try { - setState(1549); + setState(1556); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1546); + setState(1553); match(CASE); - setState(1547); + setState(1554); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1548); + setState(1555); match(DEFAULT); } break; @@ -10317,58 +10367,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_typeSwitchStmt); + enterRule(_localctx, 278, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1551); + setState(1558); match(SWITCH); - setState(1560); + setState(1567); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1552); + setState(1559); typeSwitchGuard(); } break; case 2: { - setState(1553); + setState(1560); eos(); - setState(1554); + setState(1561); typeSwitchGuard(); } break; case 3: { - setState(1556); + setState(1563); simpleStmt(); - setState(1557); + setState(1564); eos(); - setState(1558); + setState(1565); typeSwitchGuard(); } break; } - setState(1562); + setState(1569); match(L_CURLY); - setState(1566); + setState(1573); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1563); + setState(1570); typeCaseClause(); } } - setState(1568); + setState(1575); _errHandler.sync(this); _la = _input.LA(1); } - setState(1569); + setState(1576); match(R_CURLY); } } @@ -10407,31 +10457,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 278, RULE_typeSwitchGuard); + enterRule(_localctx, 280, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1573); + setState(1580); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { case 1: { - setState(1571); + setState(1578); match(IDENTIFIER); - setState(1572); + setState(1579); match(DECLARE_ASSIGN); } break; } - setState(1575); + setState(1582); primaryExpr(0); - setState(1576); + setState(1583); match(DOT); - setState(1577); + setState(1584); match(L_PAREN); - setState(1578); + setState(1585); match(TYPE); - setState(1579); + setState(1586); match(R_PAREN); } } @@ -10468,20 +10518,20 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 280, RULE_typeCaseClause); + enterRule(_localctx, 282, RULE_typeCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1581); + setState(1588); typeSwitchCase(); - setState(1582); + setState(1589); match(COLON); - setState(1584); + setState(1591); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { case 1: { - setState(1583); + setState(1590); statementList(); } break; @@ -10519,24 +10569,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 282, RULE_typeSwitchCase); + enterRule(_localctx, 284, RULE_typeSwitchCase); try { - setState(1589); + setState(1596); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1586); + setState(1593); match(CASE); - setState(1587); + setState(1594); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1588); + setState(1595); match(DEFAULT); } break; @@ -10584,12 +10634,12 @@ public T accept(ParseTreeVisitor visitor) { public final TypeListContext typeList() throws RecognitionException { TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 284, RULE_typeList); + enterRule(_localctx, 286, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1593); + setState(1600); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10612,28 +10662,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1591); + setState(1598); type_(); } break; case NIL_LIT: { - setState(1592); + setState(1599); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1602); + setState(1609); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1595); + setState(1602); match(COMMA); - setState(1598); + setState(1605); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10656,13 +10706,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1596); + setState(1603); type_(); } break; case NIL_LIT: { - setState(1597); + setState(1604); match(NIL_LIT); } break; @@ -10671,7 +10721,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1604); + setState(1611); _errHandler.sync(this); _la = _input.LA(1); } @@ -10712,30 +10762,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 286, RULE_selectStmt); + enterRule(_localctx, 288, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1605); + setState(1612); match(SELECT); - setState(1606); + setState(1613); match(L_CURLY); - setState(1610); + setState(1617); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1607); + setState(1614); commClause(); } } - setState(1612); + setState(1619); _errHandler.sync(this); _la = _input.LA(1); } - setState(1613); + setState(1620); match(R_CURLY); } } @@ -10772,20 +10822,20 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_commClause); + enterRule(_localctx, 290, RULE_commClause); try { enterOuterAlt(_localctx, 1); { - setState(1615); + setState(1622); commCase(); - setState(1616); + setState(1623); match(COLON); - setState(1618); + setState(1625); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: { - setState(1617); + setState(1624); statementList(); } break; @@ -10826,28 +10876,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 290, RULE_commCase); + enterRule(_localctx, 292, RULE_commCase); try { - setState(1626); + setState(1633); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1620); + setState(1627); match(CASE); - setState(1623); + setState(1630); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { case 1: { - setState(1621); + setState(1628); sendStmt(); } break; case 2: { - setState(1622); + setState(1629); recvStmt(); } break; @@ -10857,7 +10907,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1625); + setState(1632); match(DEFAULT); } break; @@ -10903,31 +10953,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 292, RULE_recvStmt); + enterRule(_localctx, 294, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1634); + setState(1641); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: { - setState(1628); + setState(1635); expressionList(); - setState(1629); + setState(1636); match(ASSIGN); } break; case 2: { - setState(1631); + setState(1638); identifierList(); - setState(1632); + setState(1639); match(DECLARE_ASSIGN); } break; } - setState(1636); + setState(1643); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -10970,24 +11020,24 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 294, RULE_forStmt); + enterRule(_localctx, 296, RULE_forStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1638); + setState(1645); match(FOR); - setState(1646); + setState(1653); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: { - setState(1640); + setState(1647); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1639); + setState(1646); expression(0); } } @@ -10996,18 +11046,18 @@ public final ForStmtContext forStmt() throws RecognitionException { break; case 2: { - setState(1642); + setState(1649); forClause(); } break; case 3: { - setState(1644); + setState(1651); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1643); + setState(1650); rangeClause(); } } @@ -11015,7 +11065,7 @@ public final ForStmtContext forStmt() throws RecognitionException { } break; } - setState(1648); + setState(1655); block(); } } @@ -11062,41 +11112,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 296, RULE_forClause); + enterRule(_localctx, 298, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1651); + setState(1658); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { case 1: { - setState(1650); + setState(1657); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1653); + setState(1660); eos(); - setState(1655); + setState(1662); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,165,_ctx) ) { case 1: { - setState(1654); + setState(1661); expression(0); } break; } - setState(1657); + setState(1664); eos(); - setState(1659); + setState(1666); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1658); + setState(1665); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -11133,13 +11183,13 @@ public T accept(ParseTreeVisitor visitor) { public final GoStmtContext goStmt() throws RecognitionException { GoStmtContext _localctx = new GoStmtContext(_ctx, getState()); - enterRule(_localctx, 298, RULE_goStmt); + enterRule(_localctx, 300, RULE_goStmt); try { enterOuterAlt(_localctx, 1); { - setState(1661); + setState(1668); match(GO); - setState(1662); + setState(1669); expression(0); } } @@ -11173,22 +11223,22 @@ public T accept(ParseTreeVisitor visitor) { public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); - enterRule(_localctx, 300, RULE_typeName); + enterRule(_localctx, 302, RULE_typeName); try { - setState(1666); + setState(1673); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1664); + setState(1671); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1665); + setState(1672); match(IDENTIFIER); } break; @@ -11228,17 +11278,17 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayTypeContext arrayType() throws RecognitionException { ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 302, RULE_arrayType); + enterRule(_localctx, 304, RULE_arrayType); try { enterOuterAlt(_localctx, 1); { - setState(1668); + setState(1675); match(L_BRACKET); - setState(1669); + setState(1676); arrayLength(); - setState(1670); + setState(1677); match(R_BRACKET); - setState(1671); + setState(1678); elementType(); } } @@ -11271,11 +11321,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayLengthContext arrayLength() throws RecognitionException { ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); - enterRule(_localctx, 304, RULE_arrayLength); + enterRule(_localctx, 306, RULE_arrayLength); try { enterOuterAlt(_localctx, 1); { - setState(1673); + setState(1680); expression(0); } } @@ -11308,11 +11358,11 @@ public T accept(ParseTreeVisitor visitor) { public final ElementTypeContext elementType() throws RecognitionException { ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_elementType); + enterRule(_localctx, 308, RULE_elementType); try { enterOuterAlt(_localctx, 1); { - setState(1675); + setState(1682); type_(); } } @@ -11346,13 +11396,13 @@ public T accept(ParseTreeVisitor visitor) { public final PointerTypeContext pointerType() throws RecognitionException { PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_pointerType); + enterRule(_localctx, 310, RULE_pointerType); try { enterOuterAlt(_localctx, 1); { - setState(1677); + setState(1684); match(STAR); - setState(1678); + setState(1685); type_(); } } @@ -11387,15 +11437,15 @@ public T accept(ParseTreeVisitor visitor) { public final SliceTypeContext sliceType() throws RecognitionException { SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_sliceType); + enterRule(_localctx, 312, RULE_sliceType); try { enterOuterAlt(_localctx, 1); { - setState(1680); + setState(1687); match(L_BRACKET); - setState(1681); + setState(1688); match(R_BRACKET); - setState(1682); + setState(1689); elementType(); } } @@ -11434,19 +11484,19 @@ public T accept(ParseTreeVisitor visitor) { public final MapTypeContext mapType() throws RecognitionException { MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_mapType); + enterRule(_localctx, 314, RULE_mapType); try { enterOuterAlt(_localctx, 1); { - setState(1684); + setState(1691); match(MAP); - setState(1685); + setState(1692); match(L_BRACKET); - setState(1686); + setState(1693); type_(); - setState(1687); + setState(1694); match(R_BRACKET); - setState(1688); + setState(1695); elementType(); } } @@ -11481,37 +11531,37 @@ public T accept(ParseTreeVisitor visitor) { public final ChannelTypeContext channelType() throws RecognitionException { ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_channelType); + enterRule(_localctx, 316, RULE_channelType); try { enterOuterAlt(_localctx, 1); { - setState(1695); + setState(1702); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { case 1: { - setState(1690); + setState(1697); match(CHAN); } break; case 2: { - setState(1691); + setState(1698); match(CHAN); - setState(1692); + setState(1699); match(RECEIVE); } break; case 3: { - setState(1693); + setState(1700); match(RECEIVE); - setState(1694); + setState(1701); match(CHAN); } break; } - setState(1697); + setState(1704); elementType(); } } @@ -11545,13 +11595,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTypeContext functionType() throws RecognitionException { FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_functionType); + enterRule(_localctx, 318, RULE_functionType); try { enterOuterAlt(_localctx, 1); { - setState(1699); + setState(1706); match(FUNC); - setState(1700); + setState(1707); signature(); } } @@ -11587,24 +11637,24 @@ public T accept(ParseTreeVisitor visitor) { public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_signature); + enterRule(_localctx, 320, RULE_signature); try { - setState(1706); + setState(1713); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1702); + setState(1709); parameters(); - setState(1703); + setState(1710); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1705); + setState(1712); parameters(); } break; @@ -11642,22 +11692,22 @@ public T accept(ParseTreeVisitor visitor) { public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_result); + enterRule(_localctx, 322, RULE_result); try { - setState(1710); + setState(1717); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1708); + setState(1715); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1709); + setState(1716); type_(); } break; @@ -11701,45 +11751,45 @@ public T accept(ParseTreeVisitor visitor) { public final ParametersContext parameters() throws RecognitionException { ParametersContext _localctx = new ParametersContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_parameters); + enterRule(_localctx, 324, RULE_parameters); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1712); + setState(1719); match(L_PAREN); - setState(1724); + setState(1731); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441152431101575619L) != 0)) { { - setState(1713); + setState(1720); parameterDecl(); - setState(1718); + setState(1725); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,170,_ctx); + _alt = getInterpreter().adaptivePredict(_input,171,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1714); + setState(1721); match(COMMA); - setState(1715); + setState(1722); parameterDecl(); } } } - setState(1720); + setState(1727); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,170,_ctx); + _alt = getInterpreter().adaptivePredict(_input,171,_ctx); } - setState(1722); + setState(1729); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1721); + setState(1728); match(COMMA); } } @@ -11747,7 +11797,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1726); + setState(1733); match(R_PAREN); } } @@ -11786,28 +11836,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConversionContext conversion() throws RecognitionException { ConversionContext _localctx = new ConversionContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_conversion); + enterRule(_localctx, 326, RULE_conversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1728); + setState(1735); nonNamedType(); - setState(1729); + setState(1736); match(L_PAREN); - setState(1730); + setState(1737); expression(0); - setState(1732); + setState(1739); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1731); + setState(1738); match(COMMA); } } - setState(1734); + setState(1741); match(R_PAREN); } } @@ -11845,9 +11895,9 @@ public T accept(ParseTreeVisitor visitor) { public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_nonNamedType); + enterRule(_localctx, 328, RULE_nonNamedType); try { - setState(1741); + setState(1748); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -11861,18 +11911,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1736); + setState(1743); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1737); + setState(1744); match(L_PAREN); - setState(1738); + setState(1745); nonNamedType(); - setState(1739); + setState(1746); match(R_PAREN); } break; @@ -11917,33 +11967,33 @@ public T accept(ParseTreeVisitor visitor) { public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_operand); + enterRule(_localctx, 330, RULE_operand); try { - setState(1749); + setState(1756); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,175,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1743); + setState(1750); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1744); + setState(1751); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1745); + setState(1752); match(L_PAREN); - setState(1746); + setState(1753); expression(0); - setState(1747); + setState(1754); match(R_PAREN); } break; @@ -11984,9 +12034,9 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_literal); + enterRule(_localctx, 332, RULE_literal); try { - setState(1754); + setState(1761); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12003,7 +12053,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1751); + setState(1758); basicLit(); } break; @@ -12021,7 +12071,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1752); + setState(1759); compositeLit(); } break; @@ -12034,7 +12084,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1753); + setState(1760); functionLit(); } break; @@ -12074,12 +12124,12 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerContext integer() throws RecognitionException { IntegerContext _localctx = new IntegerContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_integer); + enterRule(_localctx, 334, RULE_integer); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1756); + setState(1763); _la = _input.LA(1); if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & 111L) != 0)) ) { _errHandler.recoverInline(this); @@ -12118,11 +12168,11 @@ public T accept(ParseTreeVisitor visitor) { public final OperandNameContext operandName() throws RecognitionException { OperandNameContext _localctx = new OperandNameContext(_ctx, getState()); - enterRule(_localctx, 334, RULE_operandName); + enterRule(_localctx, 336, RULE_operandName); try { enterOuterAlt(_localctx, 1); { - setState(1758); + setState(1765); match(IDENTIFIER); } } @@ -12157,15 +12207,15 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedIdentContext qualifiedIdent() throws RecognitionException { QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_qualifiedIdent); + enterRule(_localctx, 338, RULE_qualifiedIdent); try { enterOuterAlt(_localctx, 1); { - setState(1760); + setState(1767); match(IDENTIFIER); - setState(1761); + setState(1768); match(DOT); - setState(1762); + setState(1769); match(IDENTIFIER); } } @@ -12201,13 +12251,13 @@ public T accept(ParseTreeVisitor visitor) { public final CompositeLitContext compositeLit() throws RecognitionException { CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState()); - enterRule(_localctx, 338, RULE_compositeLit); + enterRule(_localctx, 340, RULE_compositeLit); try { enterOuterAlt(_localctx, 1); { - setState(1764); + setState(1771); literalType(); - setState(1765); + setState(1772); literalValue(); } } @@ -12243,26 +12293,26 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralValueContext literalValue() throws RecognitionException { LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_literalValue); + enterRule(_localctx, 342, RULE_literalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1767); + setState(1774); match(L_CURLY); - setState(1772); + setState(1779); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2990104391687L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1768); + setState(1775); elementList(); - setState(1770); + setState(1777); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1769); + setState(1776); match(COMMA); } } @@ -12270,7 +12320,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1774); + setState(1781); match(R_CURLY); } } @@ -12310,30 +12360,30 @@ public T accept(ParseTreeVisitor visitor) { public final ElementListContext elementList() throws RecognitionException { ElementListContext _localctx = new ElementListContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_elementList); + enterRule(_localctx, 344, RULE_elementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1776); + setState(1783); keyedElement(); - setState(1781); + setState(1788); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,179,_ctx); + _alt = getInterpreter().adaptivePredict(_input,180,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1777); + setState(1784); match(COMMA); - setState(1778); + setState(1785); keyedElement(); } } } - setState(1783); + setState(1790); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,179,_ctx); + _alt = getInterpreter().adaptivePredict(_input,180,_ctx); } } } @@ -12370,23 +12420,23 @@ public T accept(ParseTreeVisitor visitor) { public final KeyedElementContext keyedElement() throws RecognitionException { KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_keyedElement); + enterRule(_localctx, 346, RULE_keyedElement); try { enterOuterAlt(_localctx, 1); { - setState(1787); + setState(1794); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,180,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,181,_ctx) ) { case 1: { - setState(1784); + setState(1791); key(); - setState(1785); + setState(1792); match(COLON); } break; } - setState(1789); + setState(1796); element(); } } @@ -12422,9 +12472,9 @@ public T accept(ParseTreeVisitor visitor) { public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_key); + enterRule(_localctx, 348, RULE_key); try { - setState(1793); + setState(1800); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12492,14 +12542,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1791); + setState(1798); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1792); + setState(1799); literalValue(); } break; @@ -12539,9 +12589,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_element); + enterRule(_localctx, 350, RULE_element); try { - setState(1797); + setState(1804); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12609,14 +12659,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1795); + setState(1802); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1796); + setState(1803); literalValue(); } break; @@ -12665,32 +12715,32 @@ public T accept(ParseTreeVisitor visitor) { public final StructTypeContext structType() throws RecognitionException { StructTypeContext _localctx = new StructTypeContext(_ctx, getState()); - enterRule(_localctx, 350, RULE_structType); + enterRule(_localctx, 352, RULE_structType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1799); + setState(1806); match(STRUCT); - setState(1800); + setState(1807); match(L_CURLY); - setState(1806); + setState(1813); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1801); + setState(1808); fieldDecl(); - setState(1802); + setState(1809); eos(); } } - setState(1808); + setState(1815); _errHandler.sync(this); _la = _input.LA(1); } - setState(1809); + setState(1816); match(R_CURLY); } } @@ -12733,34 +12783,34 @@ public T accept(ParseTreeVisitor visitor) { public final FieldDeclContext fieldDecl() throws RecognitionException { FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); - enterRule(_localctx, 352, RULE_fieldDecl); + enterRule(_localctx, 354, RULE_fieldDecl); try { enterOuterAlt(_localctx, 1); { - setState(1815); + setState(1822); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,184,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) { case 1: { - setState(1811); + setState(1818); identifierList(); - setState(1812); + setState(1819); type_(); } break; case 2: { - setState(1814); + setState(1821); embeddedField(); } break; } - setState(1818); + setState(1825); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { case 1: { - setState(1817); + setState(1824); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -12795,12 +12845,12 @@ public T accept(ParseTreeVisitor visitor) { public final String_Context string_() throws RecognitionException { String_Context _localctx = new String_Context(_ctx, getState()); - enterRule(_localctx, 354, RULE_string_); + enterRule(_localctx, 356, RULE_string_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1820); + setState(1827); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -12842,22 +12892,22 @@ public T accept(ParseTreeVisitor visitor) { public final EmbeddedFieldContext embeddedField() throws RecognitionException { EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState()); - enterRule(_localctx, 356, RULE_embeddedField); + enterRule(_localctx, 358, RULE_embeddedField); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1823); + setState(1830); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1822); + setState(1829); match(STAR); } } - setState(1825); + setState(1832); typeName(); } } @@ -12892,15 +12942,15 @@ public T accept(ParseTreeVisitor visitor) { public final IndexContext index() throws RecognitionException { IndexContext _localctx = new IndexContext(_ctx, getState()); - enterRule(_localctx, 358, RULE_index); + enterRule(_localctx, 360, RULE_index); try { enterOuterAlt(_localctx, 1); { - setState(1827); + setState(1834); match(L_BRACKET); - setState(1828); + setState(1835); expression(0); - setState(1829); + setState(1836); match(R_BRACKET); } } @@ -12936,17 +12986,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeAssertionContext typeAssertion() throws RecognitionException { TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState()); - enterRule(_localctx, 360, RULE_typeAssertion); + enterRule(_localctx, 362, RULE_typeAssertion); try { enterOuterAlt(_localctx, 1); { - setState(1831); + setState(1838); match(DOT); - setState(1832); + setState(1839); match(L_PAREN); - setState(1833); + setState(1840); type_(); - setState(1834); + setState(1841); match(R_PAREN); } } @@ -12989,39 +13039,39 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentsContext arguments() throws RecognitionException { ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 362, RULE_arguments); + enterRule(_localctx, 364, RULE_arguments); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1836); + setState(1843); match(L_PAREN); - setState(1851); + setState(1858); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1843); + setState(1850); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,188,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,189,_ctx) ) { case 1: { - setState(1837); + setState(1844); expressionList(); } break; case 2: { - setState(1838); + setState(1845); nonNamedType(); - setState(1841); + setState(1848); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,187,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,188,_ctx) ) { case 1: { - setState(1839); + setState(1846); match(COMMA); - setState(1840); + setState(1847); expressionList(); } break; @@ -13029,22 +13079,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1846); + setState(1853); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1845); + setState(1852); match(ELLIPSIS); } } - setState(1849); + setState(1856); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1848); + setState(1855); match(COMMA); } } @@ -13052,7 +13102,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1853); + setState(1860); match(R_PAREN); } } @@ -13087,15 +13137,15 @@ public T accept(ParseTreeVisitor visitor) { public final MethodExprContext methodExpr() throws RecognitionException { MethodExprContext _localctx = new MethodExprContext(_ctx, getState()); - enterRule(_localctx, 364, RULE_methodExpr); + enterRule(_localctx, 366, RULE_methodExpr); try { enterOuterAlt(_localctx, 1); { - setState(1855); + setState(1862); nonNamedType(); - setState(1856); + setState(1863); match(DOT); - setState(1857); + setState(1864); match(IDENTIFIER); } } @@ -13128,11 +13178,11 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverTypeContext receiverType() throws RecognitionException { ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState()); - enterRule(_localctx, 366, RULE_receiverType); + enterRule(_localctx, 368, RULE_receiverType); try { enterOuterAlt(_localctx, 1); { - setState(1859); + setState(1866); type_(); } } @@ -13165,36 +13215,36 @@ public T accept(ParseTreeVisitor visitor) { public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); - enterRule(_localctx, 368, RULE_eos); + enterRule(_localctx, 370, RULE_eos); try { - setState(1865); + setState(1872); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,192,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,193,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1861); + setState(1868); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1862); + setState(1869); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1863); + setState(1870); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1864); + setState(1871); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; @@ -13213,13 +13263,13 @@ public final EosContext eos() throws RecognitionException { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 82: + case 83: return expression_sempred((ExpressionContext)_localctx, predIndex); - case 90: + case 91: return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex); - case 120: + case 121: return statementList_sempred((StatementListContext)_localctx, predIndex); - case 184: + case 185: return eos_sempred((EosContext)_localctx, predIndex); } return true; @@ -13286,7 +13336,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a0\u074c\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a0\u0753\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -13334,197 +13384,198 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u00ad\u0002\u00ae\u0007\u00ae\u0002\u00af\u0007\u00af\u0002\u00b0\u0007"+ "\u00b0\u0002\u00b1\u0007\u00b1\u0002\u00b2\u0007\u00b2\u0002\u00b3\u0007"+ "\u00b3\u0002\u00b4\u0007\u00b4\u0002\u00b5\u0007\u00b5\u0002\u00b6\u0007"+ - "\u00b6\u0002\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001"+ - "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u017f"+ - "\b\u0003\n\u0003\f\u0003\u0182\t\u0003\u0001\u0004\u0001\u0004\u0003\u0004"+ - "\u0186\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u018b\b"+ - "\u0005\n\u0005\f\u0005\u018e\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0005\u0005\u0195\b\u0005\n\u0005\f\u0005\u0198"+ - "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u019d\b\u0005"+ - "\u0001\u0005\u0001\u0005\u0005\u0005\u01a1\b\u0005\n\u0005\f\u0005\u01a4"+ - "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0005"+ - "\u0006\u01ab\b\u0006\n\u0006\f\u0006\u01ae\t\u0006\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u01b5\b\u0006\n\u0006"+ - "\f\u0006\u01b8\t\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+ - "\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01c3\b\t\n\t\f\t\u01c6\t\t"+ - "\u0001\t\u0003\t\u01c9\b\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0005"+ - "\n\u01d0\b\n\n\n\f\n\u01d3\t\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n"+ - "\u0001\n\u0001\n\u0005\n\u01dc\b\n\n\n\f\n\u01df\t\n\u0001\n\u0003\n\u01e2"+ - "\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u01e8"+ - "\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0003"+ - "\f\u01f1\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u01fb\b\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u00b6\u0002\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8\u0002\u00b9\u0007"+ + "\u00b9\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0005\u0003\u0181\b\u0003\n\u0003\f\u0003\u0184\t\u0003\u0001\u0004"+ + "\u0001\u0004\u0003\u0004\u0188\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0005\u0005\u018d\b\u0005\n\u0005\f\u0005\u0190\t\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u0197\b\u0005\n"+ + "\u0005\f\u0005\u019a\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ + "\u0005\u019f\b\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u01a3\b\u0005"+ + "\n\u0005\f\u0005\u01a6\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0005\u0006\u01ad\b\u0006\n\u0006\f\u0006\u01b0\t\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006"+ + "\u01b7\b\u0006\n\u0006\f\u0006\u01ba\t\u0006\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01c5\b"+ + "\t\n\t\f\t\u01c8\t\t\u0001\t\u0003\t\u01cb\b\t\u0001\t\u0001\t\u0001\n"+ + "\u0001\n\u0001\n\u0005\n\u01d2\b\n\n\n\f\n\u01d5\t\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0005\n\u01de\b\n\n\n\f\n\u01e1\t\n"+ + "\u0001\n\u0003\n\u01e4\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0003\u000b\u01ea\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0003\f\u01f3\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u01fd\b\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0003\u0010\u020c\b\u0010\u0001\u0011\u0001\u0011\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0005\u0013\u0218\b\u0013\n\u0013\f\u0013\u021b\t\u0013"+ - "\u0001\u0013\u0003\u0013\u021e\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ - "\u0005\u0014\u0223\b\u0014\n\u0014\f\u0014\u0226\t\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0015\u0005\u0015\u022b\b\u0015\n\u0015\f\u0015\u022e\t\u0015"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0234\b\u0016"+ - "\n\u0016\f\u0016\u0237\t\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ - "\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0003\u001c\u0256\b\u001c\u0001\u001c\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0003\u001d\u025e\b\u001d\u0001"+ - "\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!"+ - "\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0003\"\u0276\b\"\u0001"+ - "\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001"+ - "$\u0001$\u0001$\u0001$\u0001$\u0005$\u0287\b$\n$\f$\u028a\t$\u0001$\u0001"+ - "$\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0005&\u0296"+ - "\b&\n&\f&\u0299\t&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ - "(\u0001(\u0001(\u0001(\u0003(\u02a5\b(\u0001)\u0001)\u0001)\u0001)\u0001"+ - ")\u0005)\u02ac\b)\n)\f)\u02af\t)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001"+ - "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0003*\u02bc\b*\u0001+\u0001+\u0001"+ - "+\u0001+\u0001+\u0005+\u02c3\b+\n+\f+\u02c6\t+\u0001+\u0001+\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0005,\u02cf\b,\n,\f,\u02d2\t,\u0001,\u0001,\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u02e6\b.\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0003/\u02ed\b/\u0001/\u0005/\u02f0\b/\n/\f/\u02f3\t/"+ - "\u0001/\u0001/\u0003/\u02f7\b/\u00010\u00010\u00010\u00010\u00010\u0001"+ - "0\u00010\u00010\u00030\u0301\b0\u00011\u00031\u0304\b1\u00011\u00011\u0003"+ - "1\u0308\b1\u00012\u00012\u00032\u030c\b2\u00013\u00013\u00013\u00013\u0005"+ - "3\u0312\b3\n3\f3\u0315\t3\u00013\u00013\u00014\u00014\u00014\u00034\u031c"+ - "\b4\u00015\u00015\u00015\u00035\u0321\b5\u00016\u00016\u00016\u00016\u0001"+ - "6\u00016\u00036\u0329\b6\u00036\u032b\b6\u00016\u00016\u00016\u00036\u0330"+ - "\b6\u00017\u00017\u00017\u00057\u0335\b7\n7\f7\u0338\t7\u00018\u00018"+ - "\u00018\u00018\u00018\u00038\u033f\b8\u00018\u00038\u0342\b8\u00018\u0001"+ - "8\u00019\u00019\u00039\u0348\b9\u00019\u00019\u00019\u00039\u034d\b9\u0003"+ - "9\u034f\b9\u00019\u00039\u0352\b9\u0001:\u0001:\u0001:\u0005:\u0357\b"+ - ":\n:\f:\u035a\t:\u0001;\u0001;\u0003;\u035e\b;\u0001;\u0001;\u0001<\u0001"+ - "<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ - "=\u0001=\u0005=\u036f\b=\n=\f=\u0372\t=\u0001=\u0001=\u0001=\u0005=\u0377"+ - "\b=\n=\f=\u037a\t=\u0001=\u0003=\u037d\b=\u0001>\u0003>\u0380\b>\u0001"+ - ">\u0001>\u0001>\u0001>\u0003>\u0386\b>\u0001?\u0001?\u0003?\u038a\b?\u0001"+ - "?\u0003?\u038d\b?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0003@\u0397\b@\u0001A\u0001A\u0001A\u0001A\u0001A\u0003A\u039e\bA\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0003B\u03a5\bB\u0001B\u0001B\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0003D\u03b1\bD\u0001E\u0001"+ - "E\u0001E\u0001E\u0003E\u03b7\bE\u0001F\u0001F\u0001F\u0001F\u0001F\u0003"+ - "F\u03be\bF\u0001G\u0001G\u0001G\u0003G\u03c3\bG\u0001H\u0001H\u0001H\u0001"+ - "H\u0003H\u03c9\bH\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001"+ - "J\u0001J\u0001J\u0003J\u03d5\bJ\u0001K\u0001K\u0001K\u0001K\u0003K\u03db"+ - "\bK\u0001K\u0001K\u0003K\u03df\bK\u0001L\u0001L\u0001L\u0001L\u0001M\u0001"+ - "M\u0003M\u03e7\bM\u0001M\u0001M\u0003M\u03eb\bM\u0001M\u0001M\u0001N\u0001"+ - "N\u0003N\u03f1\bN\u0001O\u0003O\u03f4\bO\u0001O\u0001O\u0001P\u0001P\u0003"+ - "P\u03fa\bP\u0001P\u0001P\u0001Q\u0003Q\u03ff\bQ\u0001Q\u0001Q\u0001R\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0003"+ - "R\u0418\bR\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0005R\u043b\bR\nR\fR\u043e\tR\u0001S\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u020e\b\u0010\u0001\u0011\u0001"+ + "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0005\u0013\u021a\b\u0013\n\u0013\f\u0013"+ + "\u021d\t\u0013\u0001\u0013\u0003\u0013\u0220\b\u0013\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0005\u0014\u0225\b\u0014\n\u0014\f\u0014\u0228\t\u0014"+ + "\u0001\u0014\u0001\u0014\u0001\u0015\u0005\u0015\u022d\b\u0015\n\u0015"+ + "\f\u0015\u0230\t\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0005\u0016\u0236\b\u0016\n\u0016\f\u0016\u0239\t\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ + "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u0258\b\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0003"+ + "\u001d\u0260\b\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\""+ + "\u0003\"\u0278\b\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#"+ + "\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0005$\u0289"+ + "\b$\n$\f$\u028c\t$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001&\u0001"+ + "&\u0001&\u0001&\u0005&\u0298\b&\n&\f&\u029b\t&\u0001&\u0001&\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0003(\u02a7\b(\u0001)"+ + "\u0001)\u0001)\u0001)\u0001)\u0005)\u02ae\b)\n)\f)\u02b1\t)\u0001)\u0001"+ + ")\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0003"+ + "*\u02be\b*\u0001+\u0001+\u0001+\u0001+\u0001+\u0005+\u02c5\b+\n+\f+\u02c8"+ + "\t+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0005,\u02d1\b,\n"+ + ",\f,\u02d4\t,\u0001,\u0001,\u0001-\u0003-\u02d9\b-\u0001-\u0001-\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u02ed\b/\u00010\u00010\u0001"+ + "0\u00010\u00010\u00030\u02f4\b0\u00010\u00050\u02f7\b0\n0\f0\u02fa\t0"+ + "\u00010\u00010\u00030\u02fe\b0\u00011\u00011\u00011\u00011\u00011\u0001"+ + "1\u00011\u00011\u00031\u0308\b1\u00012\u00032\u030b\b2\u00012\u00012\u0003"+ + "2\u030f\b2\u00013\u00013\u00033\u0313\b3\u00014\u00014\u00014\u00014\u0005"+ + "4\u0319\b4\n4\f4\u031c\t4\u00014\u00014\u00015\u00015\u00015\u00035\u0323"+ + "\b5\u00016\u00016\u00016\u00036\u0328\b6\u00017\u00017\u00017\u00017\u0001"+ + "7\u00017\u00037\u0330\b7\u00037\u0332\b7\u00017\u00017\u00017\u00037\u0337"+ + "\b7\u00018\u00018\u00018\u00058\u033c\b8\n8\f8\u033f\t8\u00019\u00019"+ + "\u00019\u00019\u00019\u00039\u0346\b9\u00019\u00039\u0349\b9\u00019\u0001"+ + "9\u0001:\u0001:\u0003:\u034f\b:\u0001:\u0001:\u0001:\u0003:\u0354\b:\u0003"+ + ":\u0356\b:\u0001:\u0003:\u0359\b:\u0001;\u0001;\u0001;\u0005;\u035e\b"+ + ";\n;\f;\u0361\t;\u0001<\u0001<\u0003<\u0365\b<\u0001<\u0001<\u0001=\u0001"+ + "=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0005>\u0376\b>\n>\f>\u0379\t>\u0001>\u0001>\u0001>\u0005>\u037e"+ + "\b>\n>\f>\u0381\t>\u0001>\u0003>\u0384\b>\u0001?\u0003?\u0387\b?\u0001"+ + "?\u0001?\u0001?\u0001?\u0003?\u038d\b?\u0001@\u0001@\u0003@\u0391\b@\u0001"+ + "@\u0003@\u0394\b@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001"+ + "A\u0003A\u039e\bA\u0001B\u0001B\u0001B\u0001B\u0001B\u0003B\u03a5\bB\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0003C\u03ac\bC\u0001C\u0001C\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0003E\u03b8\bE\u0001F\u0001"+ + "F\u0001F\u0001F\u0003F\u03be\bF\u0001G\u0001G\u0001G\u0001G\u0001G\u0003"+ + "G\u03c5\bG\u0001H\u0001H\u0001H\u0003H\u03ca\bH\u0001I\u0001I\u0001I\u0001"+ + "I\u0003I\u03d0\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001"+ + "K\u0001K\u0001K\u0003K\u03dc\bK\u0001L\u0001L\u0001L\u0001L\u0003L\u03e2"+ + "\bL\u0001L\u0001L\u0003L\u03e6\bL\u0001M\u0001M\u0001M\u0001M\u0001N\u0001"+ + "N\u0003N\u03ee\bN\u0001N\u0001N\u0003N\u03f2\bN\u0001N\u0001N\u0001O\u0001"+ + "O\u0003O\u03f8\bO\u0001P\u0003P\u03fb\bP\u0001P\u0001P\u0001Q\u0001Q\u0003"+ + "Q\u0401\bQ\u0001Q\u0001Q\u0001R\u0003R\u0406\bR\u0001R\u0001R\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0003"+ + "S\u041f\bS\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0003S\u0454"+ - "\bS\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0003U\u045c\bU\u0001V\u0001"+ - "V\u0001V\u0001W\u0001W\u0001W\u0001W\u0005W\u0465\bW\nW\fW\u0468\tW\u0001"+ - "W\u0001W\u0001W\u0001W\u0003W\u046e\bW\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0003X\u0475\bX\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0003Y\u047f\bY\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003Z\u048d\bZ\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0005Z\u04a3\bZ\nZ\fZ\u04a6"+ - "\tZ\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0003\\\u04ad\b\\\u0001\\\u0001"+ - "\\\u0003\\\u04b1\b\\\u0001]\u0001]\u0003]\u04b5\b]\u0001]\u0003]\u04b8"+ - "\b]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0003^\u04c1\b^\u0001"+ - "^\u0001^\u0005^\u04c5\b^\n^\f^\u04c8\t^\u0001^\u0001^\u0001_\u0001_\u0001"+ - "_\u0001_\u0001`\u0003`\u04d1\b`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ - "`\u0003`\u04d9\b`\u0001`\u0001`\u0001`\u0001`\u0003`\u04df\b`\u0001a\u0001"+ - "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0003a\u04e8\ba\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003b\u04f3\bb\u0001c\u0001"+ - "c\u0001c\u0001d\u0001d\u0001d\u0001d\u0005d\u04fc\bd\nd\fd\u04ff\td\u0001"+ - "d\u0003d\u0502\bd\u0003d\u0504\bd\u0001d\u0001d\u0001e\u0001e\u0001e\u0001"+ - "e\u0001e\u0001e\u0001e\u0003e\u050f\be\u0001f\u0001f\u0001f\u0001f\u0001"+ - "f\u0001g\u0001g\u0003g\u0518\bg\u0001g\u0001g\u0003g\u051c\bg\u0001g\u0003"+ - "g\u051f\bg\u0001g\u0001g\u0001g\u0001g\u0001g\u0003g\u0526\bg\u0001g\u0001"+ - "g\u0001h\u0001h\u0001i\u0001i\u0001j\u0001j\u0001k\u0003k\u0531\bk\u0001"+ - "k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0003l\u053b\bl\u0001"+ - "l\u0001l\u0001l\u0001l\u0003l\u0541\bl\u0003l\u0543\bl\u0001m\u0001m\u0001"+ - "m\u0001n\u0001n\u0001o\u0001o\u0001o\u0003o\u054d\bo\u0001p\u0001p\u0001"+ - "p\u0001p\u0001p\u0001p\u0005p\u0555\bp\np\fp\u0558\tp\u0001p\u0003p\u055b"+ - "\bp\u0001q\u0001q\u0003q\u055f\bq\u0001q\u0001q\u0003q\u0563\bq\u0001"+ - "r\u0001r\u0001r\u0005r\u0568\br\nr\fr\u056b\tr\u0001s\u0001s\u0001s\u0005"+ - "s\u0570\bs\ns\fs\u0573\ts\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0005"+ - "t\u057b\bt\nt\ft\u057e\tt\u0001t\u0003t\u0581\bt\u0001u\u0001u\u0003u"+ - "\u0585\bu\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001v\u0001v\u0005"+ - "v\u058f\bv\nv\fv\u0592\tv\u0001v\u0003v\u0595\bv\u0001w\u0001w\u0003w"+ - "\u0599\bw\u0001w\u0001w\u0001x\u0003x\u059e\bx\u0001x\u0003x\u05a1\bx"+ - "\u0001x\u0003x\u05a4\bx\u0001x\u0001x\u0001x\u0004x\u05a9\bx\u000bx\f"+ - "x\u05aa\u0001y\u0001y\u0001y\u0001y\u0001y\u0003y\u05b2\by\u0001z\u0001"+ - "z\u0001{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001}\u0001}\u0001"+ - "}\u0001}\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f\u0003\u007f"+ - "\u05c6\b\u007f\u0001\u0080\u0001\u0080\u0003\u0080\u05ca\b\u0080\u0001"+ - "\u0081\u0001\u0081\u0003\u0081\u05ce\b\u0081\u0001\u0082\u0001\u0082\u0003"+ - "\u0082\u05d2\b\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001"+ - "\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ - "\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0003\u0085\u05e2\b\u0085\u0001"+ - "\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0003\u0085\u05e8\b\u0085\u0003"+ - "\u0085\u05ea\b\u0085\u0001\u0086\u0001\u0086\u0003\u0086\u05ee\b\u0086"+ - "\u0001\u0087\u0001\u0087\u0003\u0087\u05f2\b\u0087\u0001\u0087\u0003\u0087"+ - "\u05f5\b\u0087\u0001\u0087\u0001\u0087\u0003\u0087\u05f9\b\u0087\u0003"+ - "\u0087\u05fb\b\u0087\u0001\u0087\u0001\u0087\u0005\u0087\u05ff\b\u0087"+ - "\n\u0087\f\u0087\u0602\t\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ - "\u0088\u0001\u0088\u0003\u0088\u0609\b\u0088\u0001\u0089\u0001\u0089\u0001"+ - "\u0089\u0003\u0089\u060e\b\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+ - "\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0003"+ - "\u008a\u0619\b\u008a\u0001\u008a\u0001\u008a\u0005\u008a\u061d\b\u008a"+ - "\n\u008a\f\u008a\u0620\t\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001"+ - "\u008b\u0003\u008b\u0626\b\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001"+ - "\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0003"+ - "\u008c\u0631\b\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0003\u008d\u0636"+ - "\b\u008d\u0001\u008e\u0001\u008e\u0003\u008e\u063a\b\u008e\u0001\u008e"+ - "\u0001\u008e\u0001\u008e\u0003\u008e\u063f\b\u008e\u0005\u008e\u0641\b"+ - "\u008e\n\u008e\f\u008e\u0644\t\u008e\u0001\u008f\u0001\u008f\u0001\u008f"+ - "\u0005\u008f\u0649\b\u008f\n\u008f\f\u008f\u064c\t\u008f\u0001\u008f\u0001"+ - "\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u0653\b\u0090\u0001"+ - "\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u0658\b\u0091\u0001\u0091\u0003"+ - "\u0091\u065b\b\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001"+ - "\u0092\u0001\u0092\u0003\u0092\u0663\b\u0092\u0001\u0092\u0001\u0092\u0001"+ - "\u0093\u0001\u0093\u0003\u0093\u0669\b\u0093\u0001\u0093\u0001\u0093\u0003"+ - "\u0093\u066d\b\u0093\u0003\u0093\u066f\b\u0093\u0001\u0093\u0001\u0093"+ - "\u0001\u0094\u0003\u0094\u0674\b\u0094\u0001\u0094\u0001\u0094\u0003\u0094"+ - "\u0678\b\u0094\u0001\u0094\u0001\u0094\u0003\u0094\u067c\b\u0094\u0001"+ - "\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0003\u0096\u0683"+ - "\b\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ - "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001"+ - "\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001"+ - "\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001"+ - "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0003\u009d\u06a0\b\u009d\u0001"+ - "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001"+ - "\u009f\u0001\u009f\u0001\u009f\u0003\u009f\u06ab\b\u009f\u0001\u00a0\u0001"+ - "\u00a0\u0003\u00a0\u06af\b\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0005\u00a1\u06b5\b\u00a1\n\u00a1\f\u00a1\u06b8\t\u00a1\u0001\u00a1"+ - "\u0003\u00a1\u06bb\b\u00a1\u0003\u00a1\u06bd\b\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0003\u00a2\u06c5"+ - "\b\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ - "\u00a3\u0001\u00a3\u0003\u00a3\u06ce\b\u00a3\u0001\u00a4\u0001\u00a4\u0001"+ - "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0003\u00a4\u06d6\b\u00a4\u0001"+ - "\u00a5\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06db\b\u00a5\u0001\u00a6\u0001"+ - "\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001"+ - "\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001"+ - "\u00aa\u0003\u00aa\u06eb\b\u00aa\u0003\u00aa\u06ed\b\u00aa\u0001\u00aa"+ - "\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0005\u00ab\u06f4\b\u00ab"+ - "\n\u00ab\f\u00ab\u06f7\t\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0003"+ - "\u00ac\u06fc\b\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0003"+ - "\u00ad\u0702\b\u00ad\u0001\u00ae\u0001\u00ae\u0003\u00ae\u0706\b\u00ae"+ - "\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0005\u00af"+ - "\u070d\b\u00af\n\u00af\f\u00af\u0710\t\u00af\u0001\u00af\u0001\u00af\u0001"+ - "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0003\u00b0\u0718\b\u00b0\u0001"+ - "\u00b0\u0003\u00b0\u071b\b\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0003"+ - "\u00b2\u0720\b\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001"+ - "\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001"+ - "\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0003"+ - "\u00b5\u0732\b\u00b5\u0003\u00b5\u0734\b\u00b5\u0001\u00b5\u0003\u00b5"+ - "\u0737\b\u00b5\u0001\u00b5\u0003\u00b5\u073a\b\u00b5\u0003\u00b5\u073c"+ - "\b\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001"+ - "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001"+ - "\u00b8\u0003\u00b8\u074a\b\u00b8\u0001\u00b8\u0001\u02f1\u0002\u00a4\u00b4"+ - "\u00b9\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ + "S\u0001S\u0001S\u0001S\u0001S\u0005S\u0442\bS\nS\fS\u0445\tS\u0001T\u0001"+ + "T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ + "T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0003T\u045b"+ + "\bT\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0003V\u0463\bV\u0001W\u0001"+ + "W\u0001W\u0001X\u0001X\u0001X\u0001X\u0005X\u046c\bX\nX\fX\u046f\tX\u0001"+ + "X\u0001X\u0001X\u0001X\u0003X\u0475\bX\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Y\u0003Y\u047c\bY\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0003Z\u0486\bZ\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ + "[\u0001[\u0001[\u0001[\u0001[\u0003[\u0494\b[\u0001[\u0001[\u0001[\u0001"+ + "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ + "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0005[\u04aa\b[\n[\f[\u04ad"+ + "\t[\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0003]\u04b4\b]\u0001]\u0001"+ + "]\u0003]\u04b8\b]\u0001^\u0001^\u0003^\u04bc\b^\u0001^\u0003^\u04bf\b"+ + "^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0003_\u04c8\b_\u0001"+ + "_\u0001_\u0005_\u04cc\b_\n_\f_\u04cf\t_\u0001_\u0001_\u0001`\u0001`\u0001"+ + "`\u0001`\u0001a\u0003a\u04d8\ba\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ + "a\u0003a\u04e0\ba\u0001a\u0001a\u0001a\u0001a\u0003a\u04e6\ba\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003b\u04ef\bb\u0001c\u0001c\u0001"+ + "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0003c\u04fa\bc\u0001d\u0001"+ + "d\u0001d\u0001e\u0001e\u0001e\u0001e\u0005e\u0503\be\ne\fe\u0506\te\u0001"+ + "e\u0003e\u0509\be\u0003e\u050b\be\u0001e\u0001e\u0001f\u0001f\u0001f\u0001"+ + "f\u0001f\u0001f\u0001f\u0003f\u0516\bf\u0001g\u0001g\u0001g\u0001g\u0001"+ + "g\u0001h\u0001h\u0003h\u051f\bh\u0001h\u0001h\u0003h\u0523\bh\u0001h\u0003"+ + "h\u0526\bh\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u052d\bh\u0001h\u0001"+ + "h\u0001i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001l\u0003l\u0538\bl\u0001"+ + "l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0003m\u0542\bm\u0001"+ + "m\u0001m\u0001m\u0001m\u0003m\u0548\bm\u0003m\u054a\bm\u0001n\u0001n\u0001"+ + "n\u0001o\u0001o\u0001p\u0001p\u0001p\u0003p\u0554\bp\u0001q\u0001q\u0001"+ + "q\u0001q\u0001q\u0001q\u0005q\u055c\bq\nq\fq\u055f\tq\u0001q\u0003q\u0562"+ + "\bq\u0001r\u0001r\u0003r\u0566\br\u0001r\u0001r\u0003r\u056a\br\u0001"+ + "s\u0001s\u0001s\u0005s\u056f\bs\ns\fs\u0572\ts\u0001t\u0001t\u0001t\u0005"+ + "t\u0577\bt\nt\ft\u057a\tt\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0005"+ + "u\u0582\bu\nu\fu\u0585\tu\u0001u\u0003u\u0588\bu\u0001v\u0001v\u0003v"+ + "\u058c\bv\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0005"+ + "w\u0596\bw\nw\fw\u0599\tw\u0001w\u0003w\u059c\bw\u0001x\u0001x\u0003x"+ + "\u05a0\bx\u0001x\u0001x\u0001y\u0003y\u05a5\by\u0001y\u0003y\u05a8\by"+ + "\u0001y\u0003y\u05ab\by\u0001y\u0001y\u0001y\u0004y\u05b0\by\u000by\f"+ + "y\u05b1\u0001z\u0001z\u0001z\u0001z\u0001z\u0003z\u05b9\bz\u0001{\u0001"+ + "{\u0001|\u0001|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001~\u0001~\u0001"+ + "~\u0001~\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0003"+ + "\u0080\u05cd\b\u0080\u0001\u0081\u0001\u0081\u0003\u0081\u05d1\b\u0081"+ + "\u0001\u0082\u0001\u0082\u0003\u0082\u05d5\b\u0082\u0001\u0083\u0001\u0083"+ + "\u0003\u0083\u05d9\b\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085"+ + "\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086"+ + "\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u05e9\b\u0086"+ + "\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u05ef\b\u0086"+ + "\u0003\u0086\u05f1\b\u0086\u0001\u0087\u0001\u0087\u0003\u0087\u05f5\b"+ + "\u0087\u0001\u0088\u0001\u0088\u0003\u0088\u05f9\b\u0088\u0001\u0088\u0003"+ + "\u0088\u05fc\b\u0088\u0001\u0088\u0001\u0088\u0003\u0088\u0600\b\u0088"+ + "\u0003\u0088\u0602\b\u0088\u0001\u0088\u0001\u0088\u0005\u0088\u0606\b"+ + "\u0088\n\u0088\f\u0088\u0609\t\u0088\u0001\u0088\u0001\u0088\u0001\u0089"+ + "\u0001\u0089\u0001\u0089\u0003\u0089\u0610\b\u0089\u0001\u008a\u0001\u008a"+ + "\u0001\u008a\u0003\u008a\u0615\b\u008a\u0001\u008b\u0001\u008b\u0001\u008b"+ + "\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b"+ + "\u0003\u008b\u0620\b\u008b\u0001\u008b\u0001\u008b\u0005\u008b\u0624\b"+ + "\u008b\n\u008b\f\u008b\u0627\t\u008b\u0001\u008b\u0001\u008b\u0001\u008c"+ + "\u0001\u008c\u0003\u008c\u062d\b\u008c\u0001\u008c\u0001\u008c\u0001\u008c"+ + "\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d"+ + "\u0003\u008d\u0638\b\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e"+ + "\u063d\b\u008e\u0001\u008f\u0001\u008f\u0003\u008f\u0641\b\u008f\u0001"+ + "\u008f\u0001\u008f\u0001\u008f\u0003\u008f\u0646\b\u008f\u0005\u008f\u0648"+ + "\b\u008f\n\u008f\f\u008f\u064b\t\u008f\u0001\u0090\u0001\u0090\u0001\u0090"+ + "\u0005\u0090\u0650\b\u0090\n\u0090\f\u0090\u0653\t\u0090\u0001\u0090\u0001"+ + "\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u065a\b\u0091\u0001"+ + "\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u065f\b\u0092\u0001\u0092\u0003"+ + "\u0092\u0662\b\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+ + "\u0093\u0001\u0093\u0003\u0093\u066a\b\u0093\u0001\u0093\u0001\u0093\u0001"+ + "\u0094\u0001\u0094\u0003\u0094\u0670\b\u0094\u0001\u0094\u0001\u0094\u0003"+ + "\u0094\u0674\b\u0094\u0003\u0094\u0676\b\u0094\u0001\u0094\u0001\u0094"+ + "\u0001\u0095\u0003\u0095\u067b\b\u0095\u0001\u0095\u0001\u0095\u0003\u0095"+ + "\u067f\b\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u0683\b\u0095\u0001"+ + "\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0003\u0097\u068a"+ + "\b\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ + "\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001"+ + "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001"+ + "\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0003\u009e\u06a7\b\u009e\u0001"+ + "\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001"+ + "\u00a0\u0001\u00a0\u0001\u00a0\u0003\u00a0\u06b2\b\u00a0\u0001\u00a1\u0001"+ + "\u00a1\u0003\u00a1\u06b6\b\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0005\u00a2\u06bc\b\u00a2\n\u00a2\f\u00a2\u06bf\t\u00a2\u0001\u00a2"+ + "\u0003\u00a2\u06c2\b\u00a2\u0003\u00a2\u06c4\b\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0003\u00a3\u06cc"+ + "\b\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ + "\u00a4\u0001\u00a4\u0003\u00a4\u06d5\b\u00a4\u0001\u00a5\u0001\u00a5\u0001"+ + "\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06dd\b\u00a5\u0001"+ + "\u00a6\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06e2\b\u00a6\u0001\u00a7\u0001"+ + "\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001"+ + "\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001"+ + "\u00ab\u0003\u00ab\u06f2\b\u00ab\u0003\u00ab\u06f4\b\u00ab\u0001\u00ab"+ + "\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0005\u00ac\u06fb\b\u00ac"+ + "\n\u00ac\f\u00ac\u06fe\t\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003"+ + "\u00ad\u0703\b\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0003"+ + "\u00ae\u0709\b\u00ae\u0001\u00af\u0001\u00af\u0003\u00af\u070d\b\u00af"+ + "\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0005\u00b0"+ + "\u0714\b\u00b0\n\u00b0\f\u00b0\u0717\t\u00b0\u0001\u00b0\u0001\u00b0\u0001"+ + "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0003\u00b1\u071f\b\u00b1\u0001"+ + "\u00b1\u0003\u00b1\u0722\b\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0003"+ + "\u00b3\u0727\b\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ + "\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001"+ + "\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0003"+ + "\u00b6\u0739\b\u00b6\u0003\u00b6\u073b\b\u00b6\u0001\u00b6\u0003\u00b6"+ + "\u073e\b\u00b6\u0001\u00b6\u0003\u00b6\u0741\b\u00b6\u0003\u00b6\u0743"+ + "\b\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001"+ + "\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001"+ + "\u00b9\u0003\u00b9\u0751\b\u00b9\u0001\u00b9\u0001\u02f8\u0002\u00a6\u00b6"+ + "\u00ba\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+ "\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0"+ @@ -13536,956 +13587,959 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140"+ "\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158"+ "\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170"+ - "\u0000\u0013\u0002\u0000eepp\u0001\u0000\u0017\u0018\u0001\u0000\u0005"+ - "\b\u0001\u0000AB\u0001\u0000(*\u0002\u0000(*,,\u0001\u0000\u0083\u0089"+ - "\u0001\u0000\u0014\u0015\u0002\u0000~\u0082\u0087\u0088\u0004\u0000##"+ - "qq}}\u0084\u0086\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000"+ + "\u0172\u0000\u0013\u0002\u0000eepp\u0001\u0000\u0017\u0018\u0001\u0000"+ + "\u0005\b\u0001\u0000AB\u0001\u0000(*\u0002\u0000(*,,\u0001\u0000\u0083"+ + "\u0089\u0001\u0000\u0014\u0015\u0002\u0000~\u0082\u0087\u0088\u0004\u0000"+ + "##qq}}\u0084\u0086\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000"+ "HIw|\u0004\u0000--0033]]\u0002\u0000}\u0082\u0084\u0088\u0001\u0000qr"+ "\u0002\u0000nn\u009f\u009f\u0002\u0000\u008a\u008d\u008f\u0090\u0001\u0000"+ - "\u0096\u0097\u07b5\u0000\u0172\u0001\u0000\u0000\u0000\u0002\u0175\u0001"+ - "\u0000\u0000\u0000\u0004\u0178\u0001\u0000\u0000\u0000\u0006\u017b\u0001"+ - "\u0000\u0000\u0000\b\u0183\u0001\u0000\u0000\u0000\n\u018c\u0001\u0000"+ - "\u0000\u0000\f\u01ac\u0001\u0000\u0000\u0000\u000e\u01b9\u0001\u0000\u0000"+ - "\u0000\u0010\u01bc\u0001\u0000\u0000\u0000\u0012\u01c4\u0001\u0000\u0000"+ - "\u0000\u0014\u01d1\u0001\u0000\u0000\u0000\u0016\u01e7\u0001\u0000\u0000"+ - "\u0000\u0018\u01f0\u0001\u0000\u0000\u0000\u001a\u01f2\u0001\u0000\u0000"+ - "\u0000\u001c\u01f4\u0001\u0000\u0000\u0000\u001e\u01f7\u0001\u0000\u0000"+ - "\u0000 \u020b\u0001\u0000\u0000\u0000\"\u020d\u0001\u0000\u0000\u0000"+ - "$\u020f\u0001\u0000\u0000\u0000&\u0214\u0001\u0000\u0000\u0000(\u021f"+ - "\u0001\u0000\u0000\u0000*\u022c\u0001\u0000\u0000\u0000,\u022f\u0001\u0000"+ - "\u0000\u0000.\u023a\u0001\u0000\u0000\u00000\u023c\u0001\u0000\u0000\u0000"+ - "2\u0241\u0001\u0000\u0000\u00004\u0246\u0001\u0000\u0000\u00006\u024b"+ - "\u0001\u0000\u0000\u00008\u0250\u0001\u0000\u0000\u0000:\u025d\u0001\u0000"+ - "\u0000\u0000<\u025f\u0001\u0000\u0000\u0000>\u0261\u0001\u0000\u0000\u0000"+ - "@\u0266\u0001\u0000\u0000\u0000B\u026b\u0001\u0000\u0000\u0000D\u0270"+ - "\u0001\u0000\u0000\u0000F\u0279\u0001\u0000\u0000\u0000H\u0280\u0001\u0000"+ - "\u0000\u0000J\u028d\u0001\u0000\u0000\u0000L\u0291\u0001\u0000\u0000\u0000"+ - "N\u029c\u0001\u0000\u0000\u0000P\u02a4\u0001\u0000\u0000\u0000R\u02a6"+ - "\u0001\u0000\u0000\u0000T\u02bb\u0001\u0000\u0000\u0000V\u02bd\u0001\u0000"+ - "\u0000\u0000X\u02c9\u0001\u0000\u0000\u0000Z\u02d5\u0001\u0000\u0000\u0000"+ - "\\\u02e5\u0001\u0000\u0000\u0000^\u02f1\u0001\u0000\u0000\u0000`\u0300"+ - "\u0001\u0000\u0000\u0000b\u0303\u0001\u0000\u0000\u0000d\u030b\u0001\u0000"+ - "\u0000\u0000f\u030d\u0001\u0000\u0000\u0000h\u0318\u0001\u0000\u0000\u0000"+ - "j\u0320\u0001\u0000\u0000\u0000l\u032f\u0001\u0000\u0000\u0000n\u0331"+ - "\u0001\u0000\u0000\u0000p\u0339\u0001\u0000\u0000\u0000r\u0347\u0001\u0000"+ - "\u0000\u0000t\u0353\u0001\u0000\u0000\u0000v\u035d\u0001\u0000\u0000\u0000"+ - "x\u0361\u0001\u0000\u0000\u0000z\u0367\u0001\u0000\u0000\u0000|\u037f"+ - "\u0001\u0000\u0000\u0000~\u0387\u0001\u0000\u0000\u0000\u0080\u0396\u0001"+ - "\u0000\u0000\u0000\u0082\u0398\u0001\u0000\u0000\u0000\u0084\u039f\u0001"+ - "\u0000\u0000\u0000\u0086\u03a8\u0001\u0000\u0000\u0000\u0088\u03ad\u0001"+ - "\u0000\u0000\u0000\u008a\u03b2\u0001\u0000\u0000\u0000\u008c\u03b8\u0001"+ - "\u0000\u0000\u0000\u008e\u03bf\u0001\u0000\u0000\u0000\u0090\u03c4\u0001"+ - "\u0000\u0000\u0000\u0092\u03ca\u0001\u0000\u0000\u0000\u0094\u03cf\u0001"+ - "\u0000\u0000\u0000\u0096\u03d6\u0001\u0000\u0000\u0000\u0098\u03e0\u0001"+ - "\u0000\u0000\u0000\u009a\u03e4\u0001\u0000\u0000\u0000\u009c\u03f0\u0001"+ - "\u0000\u0000\u0000\u009e\u03f3\u0001\u0000\u0000\u0000\u00a0\u03f7\u0001"+ - "\u0000\u0000\u0000\u00a2\u03fe\u0001\u0000\u0000\u0000\u00a4\u0417\u0001"+ - "\u0000\u0000\u0000\u00a6\u0453\u0001\u0000\u0000\u0000\u00a8\u0455\u0001"+ - "\u0000\u0000\u0000\u00aa\u0458\u0001\u0000\u0000\u0000\u00ac\u045d\u0001"+ - "\u0000\u0000\u0000\u00ae\u0466\u0001\u0000\u0000\u0000\u00b0\u0474\u0001"+ - "\u0000\u0000\u0000\u00b2\u047e\u0001\u0000\u0000\u0000\u00b4\u048c\u0001"+ - "\u0000\u0000\u0000\u00b6\u04a7\u0001\u0000\u0000\u0000\u00b8\u04aa\u0001"+ - "\u0000\u0000\u0000\u00ba\u04b2\u0001\u0000\u0000\u0000\u00bc\u04bb\u0001"+ - "\u0000\u0000\u0000\u00be\u04cb\u0001\u0000\u0000\u0000\u00c0\u04de\u0001"+ - "\u0000\u0000\u0000\u00c2\u04e7\u0001\u0000\u0000\u0000\u00c4\u04f2\u0001"+ - "\u0000\u0000\u0000\u00c6\u04f4\u0001\u0000\u0000\u0000\u00c8\u04f7\u0001"+ - "\u0000\u0000\u0000\u00ca\u050e\u0001\u0000\u0000\u0000\u00cc\u0510\u0001"+ - "\u0000\u0000\u0000\u00ce\u0515\u0001\u0000\u0000\u0000\u00d0\u0529\u0001"+ - "\u0000\u0000\u0000\u00d2\u052b\u0001\u0000\u0000\u0000\u00d4\u052d\u0001"+ - "\u0000\u0000\u0000\u00d6\u0530\u0001\u0000\u0000\u0000\u00d8\u053a\u0001"+ - "\u0000\u0000\u0000\u00da\u0544\u0001\u0000\u0000\u0000\u00dc\u0547\u0001"+ - "\u0000\u0000\u0000\u00de\u054c\u0001\u0000\u0000\u0000\u00e0\u054e\u0001"+ - "\u0000\u0000\u0000\u00e2\u055c\u0001\u0000\u0000\u0000\u00e4\u0564\u0001"+ - "\u0000\u0000\u0000\u00e6\u056c\u0001\u0000\u0000\u0000\u00e8\u0574\u0001"+ - "\u0000\u0000\u0000\u00ea\u0582\u0001\u0000\u0000\u0000\u00ec\u0588\u0001"+ - "\u0000\u0000\u0000\u00ee\u0596\u0001\u0000\u0000\u0000\u00f0\u05a8\u0001"+ - "\u0000\u0000\u0000\u00f2\u05b1\u0001\u0000\u0000\u0000\u00f4\u05b3\u0001"+ - "\u0000\u0000\u0000\u00f6\u05b5\u0001\u0000\u0000\u0000\u00f8\u05b9\u0001"+ - "\u0000\u0000\u0000\u00fa\u05bc\u0001\u0000\u0000\u0000\u00fc\u05c0\u0001"+ - "\u0000\u0000\u0000\u00fe\u05c2\u0001\u0000\u0000\u0000\u0100\u05c7\u0001"+ - "\u0000\u0000\u0000\u0102\u05cb\u0001\u0000\u0000\u0000\u0104\u05cf\u0001"+ - "\u0000\u0000\u0000\u0106\u05d3\u0001\u0000\u0000\u0000\u0108\u05d6\u0001"+ - "\u0000\u0000\u0000\u010a\u05d8\u0001\u0000\u0000\u0000\u010c\u05ed\u0001"+ - "\u0000\u0000\u0000\u010e\u05ef\u0001\u0000\u0000\u0000\u0110\u0605\u0001"+ - "\u0000\u0000\u0000\u0112\u060d\u0001\u0000\u0000\u0000\u0114\u060f\u0001"+ - "\u0000\u0000\u0000\u0116\u0625\u0001\u0000\u0000\u0000\u0118\u062d\u0001"+ - "\u0000\u0000\u0000\u011a\u0635\u0001\u0000\u0000\u0000\u011c\u0639\u0001"+ - "\u0000\u0000\u0000\u011e\u0645\u0001\u0000\u0000\u0000\u0120\u064f\u0001"+ - "\u0000\u0000\u0000\u0122\u065a\u0001\u0000\u0000\u0000\u0124\u0662\u0001"+ - "\u0000\u0000\u0000\u0126\u0666\u0001\u0000\u0000\u0000\u0128\u0673\u0001"+ - "\u0000\u0000\u0000\u012a\u067d\u0001\u0000\u0000\u0000\u012c\u0682\u0001"+ - "\u0000\u0000\u0000\u012e\u0684\u0001\u0000\u0000\u0000\u0130\u0689\u0001"+ - "\u0000\u0000\u0000\u0132\u068b\u0001\u0000\u0000\u0000\u0134\u068d\u0001"+ - "\u0000\u0000\u0000\u0136\u0690\u0001\u0000\u0000\u0000\u0138\u0694\u0001"+ - "\u0000\u0000\u0000\u013a\u069f\u0001\u0000\u0000\u0000\u013c\u06a3\u0001"+ - "\u0000\u0000\u0000\u013e\u06aa\u0001\u0000\u0000\u0000\u0140\u06ae\u0001"+ - "\u0000\u0000\u0000\u0142\u06b0\u0001\u0000\u0000\u0000\u0144\u06c0\u0001"+ - "\u0000\u0000\u0000\u0146\u06cd\u0001\u0000\u0000\u0000\u0148\u06d5\u0001"+ - "\u0000\u0000\u0000\u014a\u06da\u0001\u0000\u0000\u0000\u014c\u06dc\u0001"+ - "\u0000\u0000\u0000\u014e\u06de\u0001\u0000\u0000\u0000\u0150\u06e0\u0001"+ - "\u0000\u0000\u0000\u0152\u06e4\u0001\u0000\u0000\u0000\u0154\u06e7\u0001"+ - "\u0000\u0000\u0000\u0156\u06f0\u0001\u0000\u0000\u0000\u0158\u06fb\u0001"+ - "\u0000\u0000\u0000\u015a\u0701\u0001\u0000\u0000\u0000\u015c\u0705\u0001"+ - "\u0000\u0000\u0000\u015e\u0707\u0001\u0000\u0000\u0000\u0160\u0717\u0001"+ - "\u0000\u0000\u0000\u0162\u071c\u0001\u0000\u0000\u0000\u0164\u071f\u0001"+ - "\u0000\u0000\u0000\u0166\u0723\u0001\u0000\u0000\u0000\u0168\u0727\u0001"+ - "\u0000\u0000\u0000\u016a\u072c\u0001\u0000\u0000\u0000\u016c\u073f\u0001"+ - "\u0000\u0000\u0000\u016e\u0743\u0001\u0000\u0000\u0000\u0170\u0749\u0001"+ - "\u0000\u0000\u0000\u0172\u0173\u0003\u00a4R\u0000\u0173\u0174\u0005\u0000"+ - "\u0000\u0001\u0174\u0001\u0001\u0000\u0000\u0000\u0175\u0176\u0003\u00a6"+ - "S\u0000\u0176\u0177\u0005\u0000\u0000\u0001\u0177\u0003\u0001\u0000\u0000"+ - "\u0000\u0178\u0179\u0003\u00c2a\u0000\u0179\u017a\u0005\u0000\u0000\u0001"+ - "\u017a\u0005\u0001\u0000\u0000\u0000\u017b\u0180\u0003\b\u0004\u0000\u017c"+ - "\u017d\u0005m\u0000\u0000\u017d\u017f\u0003\b\u0004\u0000\u017e\u017c"+ - "\u0001\u0000\u0000\u0000\u017f\u0182\u0001\u0000\u0000\u0000\u0180\u017e"+ - "\u0001\u0000\u0000\u0000\u0180\u0181\u0001\u0000\u0000\u0000\u0181\u0007"+ - "\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0183\u0185"+ - "\u0005e\u0000\u0000\u0184\u0186\u0005<\u0000\u0000\u0185\u0184\u0001\u0000"+ - "\u0000\u0000\u0185\u0186\u0001\u0000\u0000\u0000\u0186\t\u0001\u0000\u0000"+ - "\u0000\u0187\u0188\u0003\u000e\u0007\u0000\u0188\u0189\u0003\u0170\u00b8"+ - "\u0000\u0189\u018b\u0001\u0000\u0000\u0000\u018a\u0187\u0001\u0000\u0000"+ - "\u0000\u018b\u018e\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000\u0000"+ - "\u0000\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u018f\u0001\u0000\u0000"+ - "\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018f\u0190\u0003\u00dam\u0000"+ - "\u0190\u0196\u0003\u0170\u00b8\u0000\u0191\u0192\u0003\u0014\n\u0000\u0192"+ - "\u0193\u0003\u0170\u00b8\u0000\u0193\u0195\u0001\u0000\u0000\u0000\u0194"+ - "\u0191\u0001\u0000\u0000\u0000\u0195\u0198\u0001\u0000\u0000\u0000\u0196"+ - "\u0194\u0001\u0000\u0000\u0000\u0196\u0197\u0001\u0000\u0000\u0000\u0197"+ - "\u01a2\u0001\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0199"+ - "\u019d\u0003\u0088D\u0000\u019a\u019d\u0003\u00deo\u0000\u019b\u019d\u0003"+ - "\u0016\u000b\u0000\u019c\u0199\u0001\u0000\u0000\u0000\u019c\u019a\u0001"+ - "\u0000\u0000\u0000\u019c\u019b\u0001\u0000\u0000\u0000\u019d\u019e\u0001"+ - "\u0000\u0000\u0000\u019e\u019f\u0003\u0170\u00b8\u0000\u019f\u01a1\u0001"+ - "\u0000\u0000\u0000\u01a0\u019c\u0001\u0000\u0000\u0000\u01a1\u01a4\u0001"+ - "\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000\u0000\u0000\u01a2\u01a3\u0001"+ - "\u0000\u0000\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4\u01a2\u0001"+ - "\u0000\u0000\u0000\u01a5\u01a6\u0005\u0000\u0000\u0001\u01a6\u000b\u0001"+ - "\u0000\u0000\u0000\u01a7\u01a8\u0003\u000e\u0007\u0000\u01a8\u01a9\u0003"+ - "\u0170\u00b8\u0000\u01a9\u01ab\u0001\u0000\u0000\u0000\u01aa\u01a7\u0001"+ - "\u0000\u0000\u0000\u01ab\u01ae\u0001\u0000\u0000\u0000\u01ac\u01aa\u0001"+ - "\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000\u01ad\u01af\u0001"+ - "\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01af\u01b0\u0003"+ - "\u00dam\u0000\u01b0\u01b6\u0003\u0170\u00b8\u0000\u01b1\u01b2\u0003\u0014"+ - "\n\u0000\u01b2\u01b3\u0003\u0170\u00b8\u0000\u01b3\u01b5\u0001\u0000\u0000"+ - "\u0000\u01b4\u01b1\u0001\u0000\u0000\u0000\u01b5\u01b8\u0001\u0000\u0000"+ - "\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b6\u01b7\u0001\u0000\u0000"+ - "\u0000\u01b7\r\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000"+ - "\u01b9\u01ba\u0005E\u0000\u0000\u01ba\u01bb\u0003\u00a4R\u0000\u01bb\u000f"+ - "\u0001\u0000\u0000\u0000\u01bc\u01bd\u0005F\u0000\u0000\u01bd\u01be\u0003"+ - "\u00a4R\u0000\u01be\u0011\u0001\u0000\u0000\u0000\u01bf\u01c0\u0003\u0010"+ - "\b\u0000\u01c0\u01c1\u0003\u0170\u00b8\u0000\u01c1\u01c3\u0001\u0000\u0000"+ - "\u0000\u01c2\u01bf\u0001\u0000\u0000\u0000\u01c3\u01c6\u0001\u0000\u0000"+ - "\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c4\u01c5\u0001\u0000\u0000"+ + "\u0096\u0097\u07bc\u0000\u0174\u0001\u0000\u0000\u0000\u0002\u0177\u0001"+ + "\u0000\u0000\u0000\u0004\u017a\u0001\u0000\u0000\u0000\u0006\u017d\u0001"+ + "\u0000\u0000\u0000\b\u0185\u0001\u0000\u0000\u0000\n\u018e\u0001\u0000"+ + "\u0000\u0000\f\u01ae\u0001\u0000\u0000\u0000\u000e\u01bb\u0001\u0000\u0000"+ + "\u0000\u0010\u01be\u0001\u0000\u0000\u0000\u0012\u01c6\u0001\u0000\u0000"+ + "\u0000\u0014\u01d3\u0001\u0000\u0000\u0000\u0016\u01e9\u0001\u0000\u0000"+ + "\u0000\u0018\u01f2\u0001\u0000\u0000\u0000\u001a\u01f4\u0001\u0000\u0000"+ + "\u0000\u001c\u01f6\u0001\u0000\u0000\u0000\u001e\u01f9\u0001\u0000\u0000"+ + "\u0000 \u020d\u0001\u0000\u0000\u0000\"\u020f\u0001\u0000\u0000\u0000"+ + "$\u0211\u0001\u0000\u0000\u0000&\u0216\u0001\u0000\u0000\u0000(\u0221"+ + "\u0001\u0000\u0000\u0000*\u022e\u0001\u0000\u0000\u0000,\u0231\u0001\u0000"+ + "\u0000\u0000.\u023c\u0001\u0000\u0000\u00000\u023e\u0001\u0000\u0000\u0000"+ + "2\u0243\u0001\u0000\u0000\u00004\u0248\u0001\u0000\u0000\u00006\u024d"+ + "\u0001\u0000\u0000\u00008\u0252\u0001\u0000\u0000\u0000:\u025f\u0001\u0000"+ + "\u0000\u0000<\u0261\u0001\u0000\u0000\u0000>\u0263\u0001\u0000\u0000\u0000"+ + "@\u0268\u0001\u0000\u0000\u0000B\u026d\u0001\u0000\u0000\u0000D\u0272"+ + "\u0001\u0000\u0000\u0000F\u027b\u0001\u0000\u0000\u0000H\u0282\u0001\u0000"+ + "\u0000\u0000J\u028f\u0001\u0000\u0000\u0000L\u0293\u0001\u0000\u0000\u0000"+ + "N\u029e\u0001\u0000\u0000\u0000P\u02a6\u0001\u0000\u0000\u0000R\u02a8"+ + "\u0001\u0000\u0000\u0000T\u02bd\u0001\u0000\u0000\u0000V\u02bf\u0001\u0000"+ + "\u0000\u0000X\u02cb\u0001\u0000\u0000\u0000Z\u02d8\u0001\u0000\u0000\u0000"+ + "\\\u02dc\u0001\u0000\u0000\u0000^\u02ec\u0001\u0000\u0000\u0000`\u02f8"+ + "\u0001\u0000\u0000\u0000b\u0307\u0001\u0000\u0000\u0000d\u030a\u0001\u0000"+ + "\u0000\u0000f\u0312\u0001\u0000\u0000\u0000h\u0314\u0001\u0000\u0000\u0000"+ + "j\u031f\u0001\u0000\u0000\u0000l\u0327\u0001\u0000\u0000\u0000n\u0336"+ + "\u0001\u0000\u0000\u0000p\u0338\u0001\u0000\u0000\u0000r\u0340\u0001\u0000"+ + "\u0000\u0000t\u034e\u0001\u0000\u0000\u0000v\u035a\u0001\u0000\u0000\u0000"+ + "x\u0364\u0001\u0000\u0000\u0000z\u0368\u0001\u0000\u0000\u0000|\u036e"+ + "\u0001\u0000\u0000\u0000~\u0386\u0001\u0000\u0000\u0000\u0080\u038e\u0001"+ + "\u0000\u0000\u0000\u0082\u039d\u0001\u0000\u0000\u0000\u0084\u039f\u0001"+ + "\u0000\u0000\u0000\u0086\u03a6\u0001\u0000\u0000\u0000\u0088\u03af\u0001"+ + "\u0000\u0000\u0000\u008a\u03b4\u0001\u0000\u0000\u0000\u008c\u03b9\u0001"+ + "\u0000\u0000\u0000\u008e\u03bf\u0001\u0000\u0000\u0000\u0090\u03c6\u0001"+ + "\u0000\u0000\u0000\u0092\u03cb\u0001\u0000\u0000\u0000\u0094\u03d1\u0001"+ + "\u0000\u0000\u0000\u0096\u03d6\u0001\u0000\u0000\u0000\u0098\u03dd\u0001"+ + "\u0000\u0000\u0000\u009a\u03e7\u0001\u0000\u0000\u0000\u009c\u03eb\u0001"+ + "\u0000\u0000\u0000\u009e\u03f7\u0001\u0000\u0000\u0000\u00a0\u03fa\u0001"+ + "\u0000\u0000\u0000\u00a2\u03fe\u0001\u0000\u0000\u0000\u00a4\u0405\u0001"+ + "\u0000\u0000\u0000\u00a6\u041e\u0001\u0000\u0000\u0000\u00a8\u045a\u0001"+ + "\u0000\u0000\u0000\u00aa\u045c\u0001\u0000\u0000\u0000\u00ac\u045f\u0001"+ + "\u0000\u0000\u0000\u00ae\u0464\u0001\u0000\u0000\u0000\u00b0\u046d\u0001"+ + "\u0000\u0000\u0000\u00b2\u047b\u0001\u0000\u0000\u0000\u00b4\u0485\u0001"+ + "\u0000\u0000\u0000\u00b6\u0493\u0001\u0000\u0000\u0000\u00b8\u04ae\u0001"+ + "\u0000\u0000\u0000\u00ba\u04b1\u0001\u0000\u0000\u0000\u00bc\u04b9\u0001"+ + "\u0000\u0000\u0000\u00be\u04c2\u0001\u0000\u0000\u0000\u00c0\u04d2\u0001"+ + "\u0000\u0000\u0000\u00c2\u04e5\u0001\u0000\u0000\u0000\u00c4\u04ee\u0001"+ + "\u0000\u0000\u0000\u00c6\u04f9\u0001\u0000\u0000\u0000\u00c8\u04fb\u0001"+ + "\u0000\u0000\u0000\u00ca\u04fe\u0001\u0000\u0000\u0000\u00cc\u0515\u0001"+ + "\u0000\u0000\u0000\u00ce\u0517\u0001\u0000\u0000\u0000\u00d0\u051c\u0001"+ + "\u0000\u0000\u0000\u00d2\u0530\u0001\u0000\u0000\u0000\u00d4\u0532\u0001"+ + "\u0000\u0000\u0000\u00d6\u0534\u0001\u0000\u0000\u0000\u00d8\u0537\u0001"+ + "\u0000\u0000\u0000\u00da\u0541\u0001\u0000\u0000\u0000\u00dc\u054b\u0001"+ + "\u0000\u0000\u0000\u00de\u054e\u0001\u0000\u0000\u0000\u00e0\u0553\u0001"+ + "\u0000\u0000\u0000\u00e2\u0555\u0001\u0000\u0000\u0000\u00e4\u0563\u0001"+ + "\u0000\u0000\u0000\u00e6\u056b\u0001\u0000\u0000\u0000\u00e8\u0573\u0001"+ + "\u0000\u0000\u0000\u00ea\u057b\u0001\u0000\u0000\u0000\u00ec\u0589\u0001"+ + "\u0000\u0000\u0000\u00ee\u058f\u0001\u0000\u0000\u0000\u00f0\u059d\u0001"+ + "\u0000\u0000\u0000\u00f2\u05af\u0001\u0000\u0000\u0000\u00f4\u05b8\u0001"+ + "\u0000\u0000\u0000\u00f6\u05ba\u0001\u0000\u0000\u0000\u00f8\u05bc\u0001"+ + "\u0000\u0000\u0000\u00fa\u05c0\u0001\u0000\u0000\u0000\u00fc\u05c3\u0001"+ + "\u0000\u0000\u0000\u00fe\u05c7\u0001\u0000\u0000\u0000\u0100\u05c9\u0001"+ + "\u0000\u0000\u0000\u0102\u05ce\u0001\u0000\u0000\u0000\u0104\u05d2\u0001"+ + "\u0000\u0000\u0000\u0106\u05d6\u0001\u0000\u0000\u0000\u0108\u05da\u0001"+ + "\u0000\u0000\u0000\u010a\u05dd\u0001\u0000\u0000\u0000\u010c\u05df\u0001"+ + "\u0000\u0000\u0000\u010e\u05f4\u0001\u0000\u0000\u0000\u0110\u05f6\u0001"+ + "\u0000\u0000\u0000\u0112\u060c\u0001\u0000\u0000\u0000\u0114\u0614\u0001"+ + "\u0000\u0000\u0000\u0116\u0616\u0001\u0000\u0000\u0000\u0118\u062c\u0001"+ + "\u0000\u0000\u0000\u011a\u0634\u0001\u0000\u0000\u0000\u011c\u063c\u0001"+ + "\u0000\u0000\u0000\u011e\u0640\u0001\u0000\u0000\u0000\u0120\u064c\u0001"+ + "\u0000\u0000\u0000\u0122\u0656\u0001\u0000\u0000\u0000\u0124\u0661\u0001"+ + "\u0000\u0000\u0000\u0126\u0669\u0001\u0000\u0000\u0000\u0128\u066d\u0001"+ + "\u0000\u0000\u0000\u012a\u067a\u0001\u0000\u0000\u0000\u012c\u0684\u0001"+ + "\u0000\u0000\u0000\u012e\u0689\u0001\u0000\u0000\u0000\u0130\u068b\u0001"+ + "\u0000\u0000\u0000\u0132\u0690\u0001\u0000\u0000\u0000\u0134\u0692\u0001"+ + "\u0000\u0000\u0000\u0136\u0694\u0001\u0000\u0000\u0000\u0138\u0697\u0001"+ + "\u0000\u0000\u0000\u013a\u069b\u0001\u0000\u0000\u0000\u013c\u06a6\u0001"+ + "\u0000\u0000\u0000\u013e\u06aa\u0001\u0000\u0000\u0000\u0140\u06b1\u0001"+ + "\u0000\u0000\u0000\u0142\u06b5\u0001\u0000\u0000\u0000\u0144\u06b7\u0001"+ + "\u0000\u0000\u0000\u0146\u06c7\u0001\u0000\u0000\u0000\u0148\u06d4\u0001"+ + "\u0000\u0000\u0000\u014a\u06dc\u0001\u0000\u0000\u0000\u014c\u06e1\u0001"+ + "\u0000\u0000\u0000\u014e\u06e3\u0001\u0000\u0000\u0000\u0150\u06e5\u0001"+ + "\u0000\u0000\u0000\u0152\u06e7\u0001\u0000\u0000\u0000\u0154\u06eb\u0001"+ + "\u0000\u0000\u0000\u0156\u06ee\u0001\u0000\u0000\u0000\u0158\u06f7\u0001"+ + "\u0000\u0000\u0000\u015a\u0702\u0001\u0000\u0000\u0000\u015c\u0708\u0001"+ + "\u0000\u0000\u0000\u015e\u070c\u0001\u0000\u0000\u0000\u0160\u070e\u0001"+ + "\u0000\u0000\u0000\u0162\u071e\u0001\u0000\u0000\u0000\u0164\u0723\u0001"+ + "\u0000\u0000\u0000\u0166\u0726\u0001\u0000\u0000\u0000\u0168\u072a\u0001"+ + "\u0000\u0000\u0000\u016a\u072e\u0001\u0000\u0000\u0000\u016c\u0733\u0001"+ + "\u0000\u0000\u0000\u016e\u0746\u0001\u0000\u0000\u0000\u0170\u074a\u0001"+ + "\u0000\u0000\u0000\u0172\u0750\u0001\u0000\u0000\u0000\u0174\u0175\u0003"+ + "\u00a6S\u0000\u0175\u0176\u0005\u0000\u0000\u0001\u0176\u0001\u0001\u0000"+ + "\u0000\u0000\u0177\u0178\u0003\u00a8T\u0000\u0178\u0179\u0005\u0000\u0000"+ + "\u0001\u0179\u0003\u0001\u0000\u0000\u0000\u017a\u017b\u0003\u00c4b\u0000"+ + "\u017b\u017c\u0005\u0000\u0000\u0001\u017c\u0005\u0001\u0000\u0000\u0000"+ + "\u017d\u0182\u0003\b\u0004\u0000\u017e\u017f\u0005m\u0000\u0000\u017f"+ + "\u0181\u0003\b\u0004\u0000\u0180\u017e\u0001\u0000\u0000\u0000\u0181\u0184"+ + "\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0182\u0183"+ + "\u0001\u0000\u0000\u0000\u0183\u0007\u0001\u0000\u0000\u0000\u0184\u0182"+ + "\u0001\u0000\u0000\u0000\u0185\u0187\u0005e\u0000\u0000\u0186\u0188\u0005"+ + "<\u0000\u0000\u0187\u0186\u0001\u0000\u0000\u0000\u0187\u0188\u0001\u0000"+ + "\u0000\u0000\u0188\t\u0001\u0000\u0000\u0000\u0189\u018a\u0003\u000e\u0007"+ + "\u0000\u018a\u018b\u0003\u0172\u00b9\u0000\u018b\u018d\u0001\u0000\u0000"+ + "\u0000\u018c\u0189\u0001\u0000\u0000\u0000\u018d\u0190\u0001\u0000\u0000"+ + "\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000"+ + "\u0000\u018f\u0191\u0001\u0000\u0000\u0000\u0190\u018e\u0001\u0000\u0000"+ + "\u0000\u0191\u0192\u0003\u00dcn\u0000\u0192\u0198\u0003\u0172\u00b9\u0000"+ + "\u0193\u0194\u0003\u0014\n\u0000\u0194\u0195\u0003\u0172\u00b9\u0000\u0195"+ + "\u0197\u0001\u0000\u0000\u0000\u0196\u0193\u0001\u0000\u0000\u0000\u0197"+ + "\u019a\u0001\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0198"+ + "\u0199\u0001\u0000\u0000\u0000\u0199\u01a4\u0001\u0000\u0000\u0000\u019a"+ + "\u0198\u0001\u0000\u0000\u0000\u019b\u019f\u0003\u008aE\u0000\u019c\u019f"+ + "\u0003\u00e0p\u0000\u019d\u019f\u0003\u0016\u000b\u0000\u019e\u019b\u0001"+ + "\u0000\u0000\u0000\u019e\u019c\u0001\u0000\u0000\u0000\u019e\u019d\u0001"+ + "\u0000\u0000\u0000\u019f\u01a0\u0001\u0000\u0000\u0000\u01a0\u01a1\u0003"+ + "\u0172\u00b9\u0000\u01a1\u01a3\u0001\u0000\u0000\u0000\u01a2\u019e\u0001"+ + "\u0000\u0000\u0000\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4\u01a2\u0001"+ + "\u0000\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5\u01a7\u0001"+ + "\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a7\u01a8\u0005"+ + "\u0000\u0000\u0001\u01a8\u000b\u0001\u0000\u0000\u0000\u01a9\u01aa\u0003"+ + "\u000e\u0007\u0000\u01aa\u01ab\u0003\u0172\u00b9\u0000\u01ab\u01ad\u0001"+ + "\u0000\u0000\u0000\u01ac\u01a9\u0001\u0000\u0000\u0000\u01ad\u01b0\u0001"+ + "\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01ae\u01af\u0001"+ + "\u0000\u0000\u0000\u01af\u01b1\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001"+ + "\u0000\u0000\u0000\u01b1\u01b2\u0003\u00dcn\u0000\u01b2\u01b8\u0003\u0172"+ + "\u00b9\u0000\u01b3\u01b4\u0003\u0014\n\u0000\u01b4\u01b5\u0003\u0172\u00b9"+ + "\u0000\u01b5\u01b7\u0001\u0000\u0000\u0000\u01b6\u01b3\u0001\u0000\u0000"+ + "\u0000\u01b7\u01ba\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000"+ + "\u0000\u01b8\u01b9\u0001\u0000\u0000\u0000\u01b9\r\u0001\u0000\u0000\u0000"+ + "\u01ba\u01b8\u0001\u0000\u0000\u0000\u01bb\u01bc\u0005E\u0000\u0000\u01bc"+ + "\u01bd\u0003\u00a6S\u0000\u01bd\u000f\u0001\u0000\u0000\u0000\u01be\u01bf"+ + "\u0005F\u0000\u0000\u01bf\u01c0\u0003\u00a6S\u0000\u01c0\u0011\u0001\u0000"+ + "\u0000\u0000\u01c1\u01c2\u0003\u0010\b\u0000\u01c2\u01c3\u0003\u0172\u00b9"+ + "\u0000\u01c3\u01c5\u0001\u0000\u0000\u0000\u01c4\u01c1\u0001\u0000\u0000"+ "\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6\u01c4\u0001\u0000\u0000"+ - "\u0000\u01c7\u01c9\u0007\u0000\u0000\u0000\u01c8\u01c7\u0001\u0000\u0000"+ - "\u0000\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9\u01ca\u0001\u0000\u0000"+ - "\u0000\u01ca\u01cb\u0003\u00dcn\u0000\u01cb\u0013\u0001\u0000\u0000\u0000"+ - "\u01cc\u01cd\u0003\u0010\b\u0000\u01cd\u01ce\u0003\u0170\u00b8\u0000\u01ce"+ - "\u01d0\u0001\u0000\u0000\u0000\u01cf\u01cc\u0001\u0000\u0000\u0000\u01d0"+ - "\u01d3\u0001\u0000\u0000\u0000\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1"+ - "\u01d2\u0001\u0000\u0000\u0000\u01d2\u01e1\u0001\u0000\u0000\u0000\u01d3"+ - "\u01d1\u0001\u0000\u0000\u0000\u01d4\u01d5\u0005a\u0000\u0000\u01d5\u01e2"+ - "\u0003\u0012\t\u0000\u01d6\u01d7\u0005a\u0000\u0000\u01d7\u01dd\u0005"+ - "f\u0000\u0000\u01d8\u01d9\u0003\u0012\t\u0000\u01d9\u01da\u0003\u0170"+ - "\u00b8\u0000\u01da\u01dc\u0001\u0000\u0000\u0000\u01db\u01d8\u0001\u0000"+ - "\u0000\u0000\u01dc\u01df\u0001\u0000\u0000\u0000\u01dd\u01db\u0001\u0000"+ - "\u0000\u0000\u01dd\u01de\u0001\u0000\u0000\u0000\u01de\u01e0\u0001\u0000"+ - "\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01e0\u01e2\u0005g\u0000"+ - "\u0000\u01e1\u01d4\u0001\u0000\u0000\u0000\u01e1\u01d6\u0001\u0000\u0000"+ - "\u0000\u01e2\u0015\u0001\u0000\u0000\u0000\u01e3\u01e8\u0003z=\u0000\u01e4"+ - "\u01e8\u0003\u0090H\u0000\u01e5\u01e8\u0003\u0094J\u0000\u01e6\u01e8\u0003"+ - "\u008eG\u0000\u01e7\u01e3\u0001\u0000\u0000\u0000\u01e7\u01e4\u0001\u0000"+ - "\u0000\u0000\u01e7\u01e5\u0001\u0000\u0000\u0000\u01e7\u01e6\u0001\u0000"+ - "\u0000\u0000\u01e8\u0017\u0001\u0000\u0000\u0000\u01e9\u01ea\u0005\u001b"+ - "\u0000\u0000\u01ea\u01f1\u0003\u00a6S\u0000\u01eb\u01ec\u0007\u0001\u0000"+ - "\u0000\u01ec\u01f1\u0003.\u0017\u0000\u01ed\u01ee\u0007\u0002\u0000\u0000"+ - "\u01ee\u01f1\u0003\u00a4R\u0000\u01ef\u01f1\u0003f3\u0000\u01f0\u01e9"+ - "\u0001\u0000\u0000\u0000\u01f0\u01eb\u0001\u0000\u0000\u0000\u01f0\u01ed"+ - "\u0001\u0000\u0000\u0000\u01f0\u01ef\u0001\u0000\u0000\u0000\u01f1\u0019"+ - "\u0001\u0000\u0000\u0000\u01f2\u01f3\u0003\u001c\u000e\u0000\u01f3\u001b"+ - "\u0001\u0000\u0000\u0000\u01f4\u01f5\u0003^/\u0000\u01f5\u01f6\u0003\u001e"+ - "\u000f\u0000\u01f6\u001d\u0001\u0000\u0000\u0000\u01f7\u01f8\u0005D\u0000"+ - "\u0000\u01f8\u01fa\u0005f\u0000\u0000\u01f9\u01fb\u0003\u00f0x\u0000\u01fa"+ - "\u01f9\u0001\u0000\u0000\u0000\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fb"+ - "\u01fc\u0001\u0000\u0000\u0000\u01fc\u01fd\u0005g\u0000\u0000\u01fd\u001f"+ - "\u0001\u0000\u0000\u0000\u01fe\u020c\u0003F#\u0000\u01ff\u020c\u0003D"+ - "\"\u0000\u0200\u020c\u0003B!\u0000\u0201\u020c\u0003$\u0012\u0000\u0202"+ - "\u020c\u0003@ \u0000\u0203\u020c\u00038\u001c\u0000\u0204\u020c\u0003"+ - ">\u001f\u0000\u0205\u020c\u00036\u001b\u0000\u0206\u020c\u00032\u0019"+ - "\u0000\u0207\u020c\u00030\u0018\u0000\u0208\u020c\u00034\u001a\u0000\u0209"+ - "\u020c\u0003\"\u0011\u0000\u020a\u020c\u0003H$\u0000\u020b\u01fe\u0001"+ - "\u0000\u0000\u0000\u020b\u01ff\u0001\u0000\u0000\u0000\u020b\u0200\u0001"+ - "\u0000\u0000\u0000\u020b\u0201\u0001\u0000\u0000\u0000\u020b\u0202\u0001"+ - "\u0000\u0000\u0000\u020b\u0203\u0001\u0000\u0000\u0000\u020b\u0204\u0001"+ - "\u0000\u0000\u0000\u020b\u0205\u0001\u0000\u0000\u0000\u020b\u0206\u0001"+ - "\u0000\u0000\u0000\u020b\u0207\u0001\u0000\u0000\u0000\u020b\u0208\u0001"+ - "\u0000\u0000\u0000\u020b\u0209\u0001\u0000\u0000\u0000\u020b\u020a\u0001"+ - "\u0000\u0000\u0000\u020c!\u0001\u0000\u0000\u0000\u020d\u020e\u0007\u0003"+ - "\u0000\u0000\u020e#\u0001\u0000\u0000\u0000\u020f\u0210\u0005^\u0000\u0000"+ - "\u0210\u0211\u0005j\u0000\u0000\u0211\u0212\u0003\u00c2a\u0000\u0212\u0213"+ - "\u0005k\u0000\u0000\u0213%\u0001\u0000\u0000\u0000\u0214\u0219\u0003("+ - "\u0014\u0000\u0215\u0216\u0005m\u0000\u0000\u0216\u0218\u0003(\u0014\u0000"+ - "\u0217\u0215\u0001\u0000\u0000\u0000\u0218\u021b\u0001\u0000\u0000\u0000"+ - "\u0219\u0217\u0001\u0000\u0000\u0000\u0219\u021a\u0001\u0000\u0000\u0000"+ - "\u021a\u021d\u0001\u0000\u0000\u0000\u021b\u0219\u0001\u0000\u0000\u0000"+ - "\u021c\u021e\u0005m\u0000\u0000\u021d\u021c\u0001\u0000\u0000\u0000\u021d"+ - "\u021e\u0001\u0000\u0000\u0000\u021e\'\u0001\u0000\u0000\u0000\u021f\u0224"+ - "\u0005e\u0000\u0000\u0220\u0221\u0005m\u0000\u0000\u0221\u0223\u0005e"+ - "\u0000\u0000\u0222\u0220\u0001\u0000\u0000\u0000\u0223\u0226\u0001\u0000"+ - "\u0000\u0000\u0224\u0222\u0001\u0000\u0000\u0000\u0224\u0225\u0001\u0000"+ - "\u0000\u0000\u0225\u0227\u0001\u0000\u0000\u0000\u0226\u0224\u0001\u0000"+ - "\u0000\u0000\u0227\u0228\u0003\u0132\u0099\u0000\u0228)\u0001\u0000\u0000"+ - "\u0000\u0229\u022b\u0003,\u0016\u0000\u022a\u0229\u0001\u0000\u0000\u0000"+ - "\u022b\u022e\u0001\u0000\u0000\u0000\u022c\u022a\u0001\u0000\u0000\u0000"+ - "\u022c\u022d\u0001\u0000\u0000\u0000\u022d+\u0001\u0000\u0000\u0000\u022e"+ - "\u022c\u0001\u0000\u0000\u0000\u022f\u0230\u0005h\u0000\u0000\u0230\u0235"+ - "\u0003\u00a4R\u0000\u0231\u0232\u0005m\u0000\u0000\u0232\u0234\u0003\u00a4"+ - "R\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0234\u0237\u0001\u0000\u0000"+ - "\u0000\u0235\u0233\u0001\u0000\u0000\u0000\u0235\u0236\u0001\u0000\u0000"+ - "\u0000\u0236\u0238\u0001\u0000\u0000\u0000\u0237\u0235\u0001\u0000\u0000"+ - "\u0000\u0238\u0239\u0005i\u0000\u0000\u0239-\u0001\u0000\u0000\u0000\u023a"+ - "\u023b\u0003\u00b4Z\u0000\u023b/\u0001\u0000\u0000\u0000\u023c\u023d\u0005"+ - "1\u0000\u0000\u023d\u023e\u0005f\u0000\u0000\u023e\u023f\u0003\u00a4R"+ - "\u0000\u023f\u0240\u0005g\u0000\u0000\u02401\u0001\u0000\u0000\u0000\u0241"+ - "\u0242\u00057\u0000\u0000\u0242\u0243\u0005j\u0000\u0000\u0243\u0244\u0003"+ - "\u00c2a\u0000\u0244\u0245\u0005k\u0000\u0000\u02453\u0001\u0000\u0000"+ - "\u0000\u0246\u0247\u00052\u0000\u0000\u0247\u0248\u0005f\u0000\u0000\u0248"+ - "\u0249\u0003\u00a4R\u0000\u0249\u024a\u0005g\u0000\u0000\u024a5\u0001"+ - "\u0000\u0000\u0000\u024b\u024c\u0007\u0004\u0000\u0000\u024c\u024d\u0005"+ - "f\u0000\u0000\u024d\u024e\u0003\u00a4R\u0000\u024e\u024f\u0005g\u0000"+ - "\u0000\u024f7\u0001\u0000\u0000\u0000\u0250\u0255\u0005\u0011\u0000\u0000"+ - "\u0251\u0252\u0005j\u0000\u0000\u0252\u0253\u0003:\u001d\u0000\u0253\u0254"+ - "\u0005k\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255\u0251\u0001"+ - "\u0000\u0000\u0000\u0255\u0256\u0001\u0000\u0000\u0000\u0256\u0257\u0001"+ - "\u0000\u0000\u0000\u0257\u0258\u0005f\u0000\u0000\u0258\u0259\u0003\u00a4"+ - "R\u0000\u0259\u025a\u0005g\u0000\u0000\u025a9\u0001\u0000\u0000\u0000"+ - "\u025b\u025e\u0003<\u001e\u0000\u025c\u025e\u0005\u0013\u0000\u0000\u025d"+ - "\u025b\u0001\u0000\u0000\u0000\u025d\u025c\u0001\u0000\u0000\u0000\u025e"+ - ";\u0001\u0000\u0000\u0000\u025f\u0260\u0005e\u0000\u0000\u0260=\u0001"+ - "\u0000\u0000\u0000\u0261\u0262\u0005\u0012\u0000\u0000\u0262\u0263\u0005"+ - "f\u0000\u0000\u0263\u0264\u0003\u00a4R\u0000\u0264\u0265\u0005g\u0000"+ - "\u0000\u0265?\u0001\u0000\u0000\u0000\u0266\u0267\u0005:\u0000\u0000\u0267"+ - "\u0268\u0005f\u0000\u0000\u0268\u0269\u0003\u00a4R\u0000\u0269\u026a\u0005"+ - "g\u0000\u0000\u026aA\u0001\u0000\u0000\u0000\u026b\u026c\u00059\u0000"+ - "\u0000\u026c\u026d\u0005f\u0000\u0000\u026d\u026e\u0003\u00a4R\u0000\u026e"+ - "\u026f\u0005g\u0000\u0000\u026fC\u0001\u0000\u0000\u0000\u0270\u0271\u0005"+ - "\u0016\u0000\u0000\u0271\u0272\u0005f\u0000\u0000\u0272\u0275\u0003\u00a4"+ - "R\u0000\u0273\u0274\u0005m\u0000\u0000\u0274\u0276\u0003\u00a4R\u0000"+ - "\u0275\u0273\u0001\u0000\u0000\u0000\u0275\u0276\u0001\u0000\u0000\u0000"+ - "\u0276\u0277\u0001\u0000\u0000\u0000\u0277\u0278\u0005g\u0000\u0000\u0278"+ - "E\u0001\u0000\u0000\u0000\u0279\u027a\u0007\u0004\u0000\u0000\u027a\u027b"+ - "\u0005j\u0000\u0000\u027b\u027c\u0003\u00a4R\u0000\u027c\u027d\u0005="+ - "\u0000\u0000\u027d\u027e\u0003\u00a4R\u0000\u027e\u027f\u0005k\u0000\u0000"+ - "\u027fG\u0001\u0000\u0000\u0000\u0280\u0281\u00056\u0000\u0000\u0281\u0282"+ - "\u0003\u00a4R\u0000\u0282\u0288\u0005h\u0000\u0000\u0283\u0284\u0003J"+ - "%\u0000\u0284\u0285\u0003\u0170\u00b8\u0000\u0285\u0287\u0001\u0000\u0000"+ - "\u0000\u0286\u0283\u0001\u0000\u0000\u0000\u0287\u028a\u0001\u0000\u0000"+ - "\u0000\u0288\u0286\u0001\u0000\u0000\u0000\u0288\u0289\u0001\u0000\u0000"+ - "\u0000\u0289\u028b\u0001\u0000\u0000\u0000\u028a\u0288\u0001\u0000\u0000"+ - "\u0000\u028b\u028c\u0005i\u0000\u0000\u028cI\u0001\u0000\u0000\u0000\u028d"+ - "\u028e\u0003j5\u0000\u028e\u028f\u0005o\u0000\u0000\u028f\u0290\u0003"+ - "\u00a4R\u0000\u0290K\u0001\u0000\u0000\u0000\u0291\u0292\u0005j\u0000"+ - "\u0000\u0292\u0297\u0003N\'\u0000\u0293\u0294\u0005m\u0000\u0000\u0294"+ - "\u0296\u0003N\'\u0000\u0295\u0293\u0001\u0000\u0000\u0000\u0296\u0299"+ - "\u0001\u0000\u0000\u0000\u0297\u0295\u0001\u0000\u0000\u0000\u0297\u0298"+ - "\u0001\u0000\u0000\u0000\u0298\u029a\u0001\u0000\u0000\u0000\u0299\u0297"+ - "\u0001\u0000\u0000\u0000\u029a\u029b\u0005k\u0000\u0000\u029bM\u0001\u0000"+ - "\u0000\u0000\u029c\u029d\u0003\u00a4R\u0000\u029d\u029e\u0005l\u0000\u0000"+ - "\u029e\u029f\u0003\u00a4R\u0000\u029fO\u0001\u0000\u0000\u0000\u02a0\u02a5"+ - "\u0003\\.\u0000\u02a1\u02a5\u0003Z-\u0000\u02a2\u02a5\u0003R)\u0000\u02a3"+ - "\u02a5\u0003V+\u0000\u02a4\u02a0\u0001\u0000\u0000\u0000\u02a4\u02a1\u0001"+ - "\u0000\u0000\u0000\u02a4\u02a2\u0001\u0000\u0000\u0000\u02a4\u02a3\u0001"+ - "\u0000\u0000\u0000\u02a5Q\u0001\u0000\u0000\u0000\u02a6\u02a7\u00053\u0000"+ - "\u0000\u02a7\u02ad\u0005h\u0000\u0000\u02a8\u02a9\u0003T*\u0000\u02a9"+ - "\u02aa\u0003\u0170\u00b8\u0000\u02aa\u02ac\u0001\u0000\u0000\u0000\u02ab"+ - "\u02a8\u0001\u0000\u0000\u0000\u02ac\u02af\u0001\u0000\u0000\u0000\u02ad"+ - "\u02ab\u0001\u0000\u0000\u0000\u02ad\u02ae\u0001\u0000\u0000\u0000\u02ae"+ - "\u02b0\u0001\u0000\u0000\u0000\u02af\u02ad\u0001\u0000\u0000\u0000\u02b0"+ - "\u02b1\u0005i\u0000\u0000\u02b1S\u0001\u0000\u0000\u0000\u02b2\u02b3\u0005"+ - "M\u0000\u0000\u02b3\u02b4\u0005e\u0000\u0000\u02b4\u02bc\u0003\u013e\u009f"+ - "\u0000\u02b5\u02b6\u00054\u0000\u0000\u02b6\u02b7\u0005h\u0000\u0000\u02b7"+ - "\u02b8\u0003\u00a4R\u0000\u02b8\u02b9\u0003\u0170\u00b8\u0000\u02b9\u02ba"+ - "\u0005i\u0000\u0000\u02ba\u02bc\u0001\u0000\u0000\u0000\u02bb\u02b2\u0001"+ - "\u0000\u0000\u0000\u02bb\u02b5\u0001\u0000\u0000\u0000\u02bcU\u0001\u0000"+ - "\u0000\u0000\u02bd\u02be\u00055\u0000\u0000\u02be\u02c4\u0005h\u0000\u0000"+ - "\u02bf\u02c0\u0003X,\u0000\u02c0\u02c1\u0003\u0170\u00b8\u0000\u02c1\u02c3"+ - "\u0001\u0000\u0000\u0000\u02c2\u02bf\u0001\u0000\u0000\u0000\u02c3\u02c6"+ - "\u0001\u0000\u0000\u0000\u02c4\u02c2\u0001\u0000\u0000\u0000\u02c4\u02c5"+ - "\u0001\u0000\u0000\u0000\u02c5\u02c7\u0001\u0000\u0000\u0000\u02c6\u02c4"+ - "\u0001\u0000\u0000\u0000\u02c7\u02c8\u0005i\u0000\u0000\u02c8W\u0001\u0000"+ - "\u0000\u0000\u02c9\u02ca\u0005e\u0000\u0000\u02ca\u02d0\u0005h\u0000\u0000"+ - "\u02cb\u02cc\u0003\u0160\u00b0\u0000\u02cc\u02cd\u0003\u0170\u00b8\u0000"+ - "\u02cd\u02cf\u0001\u0000\u0000\u0000\u02ce\u02cb\u0001\u0000\u0000\u0000"+ - "\u02cf\u02d2\u0001\u0000\u0000\u0000\u02d0\u02ce\u0001\u0000\u0000\u0000"+ - "\u02d0\u02d1\u0001\u0000\u0000\u0000\u02d1\u02d3\u0001\u0000\u0000\u0000"+ - "\u02d2\u02d0\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005i\u0000\u0000\u02d4"+ - "Y\u0001\u0000\u0000\u0000\u02d5\u02d6\u0005\u001b\u0000\u0000\u02d6\u02d7"+ - "\u0005j\u0000\u0000\u02d7\u02d8\u0005k\u0000\u0000\u02d8\u02d9\u0003\u0132"+ - "\u0099\u0000\u02d9[\u0001\u0000\u0000\u0000\u02da\u02db\u0007\u0005\u0000"+ - "\u0000\u02db\u02dc\u0005j\u0000\u0000\u02dc\u02dd\u0003\u00c2a\u0000\u02dd"+ - "\u02de\u0005k\u0000\u0000\u02de\u02e6\u0001\u0000\u0000\u0000\u02df\u02e0"+ - "\u0005+\u0000\u0000\u02e0\u02e1\u0005j\u0000\u0000\u02e1\u02e2\u0003\u00c2"+ - "a\u0000\u02e2\u02e3\u0005k\u0000\u0000\u02e3\u02e4\u0003\u00c2a\u0000"+ - "\u02e4\u02e6\u0001\u0000\u0000\u0000\u02e5\u02da\u0001\u0000\u0000\u0000"+ - "\u02e5\u02df\u0001\u0000\u0000\u0000\u02e6]\u0001\u0000\u0000\u0000\u02e7"+ - "\u02ed\u0003`0\u0000\u02e8\u02e9\u0005\u000e\u0000\u0000\u02e9\u02ed\u0006"+ - "/\uffff\uffff\u0000\u02ea\u02eb\u0005C\u0000\u0000\u02eb\u02ed\u0006/"+ - "\uffff\uffff\u0000\u02ec\u02e7\u0001\u0000\u0000\u0000\u02ec\u02e8\u0001"+ - "\u0000\u0000\u0000\u02ec\u02ea\u0001\u0000\u0000\u0000\u02ed\u02ee\u0001"+ - "\u0000\u0000\u0000\u02ee\u02f0\u0003\u0170\u00b8\u0000\u02ef\u02ec\u0001"+ - "\u0000\u0000\u0000\u02f0\u02f3\u0001\u0000\u0000\u0000\u02f1\u02f2\u0001"+ - "\u0000\u0000\u0000\u02f1\u02ef\u0001\u0000\u0000\u0000\u02f2\u02f6\u0001"+ - "\u0000\u0000\u0000\u02f3\u02f1\u0001\u0000\u0000\u0000\u02f4\u02f5\u0005"+ - "\u000e\u0000\u0000\u02f5\u02f7\u0006/\uffff\uffff\u0000\u02f6\u02f4\u0001"+ - "\u0000\u0000\u0000\u02f6\u02f7\u0001\u0000\u0000\u0000\u02f7_\u0001\u0000"+ - "\u0000\u0000\u02f8\u02f9\u0005\t\u0000\u0000\u02f9\u0301\u0003d2\u0000"+ - "\u02fa\u02fb\u0005\n\u0000\u0000\u02fb\u0301\u0003d2\u0000\u02fc\u02fd"+ - "\u0005\u000b\u0000\u0000\u02fd\u0301\u0003d2\u0000\u02fe\u02ff\u0005\r"+ - "\u0000\u0000\u02ff\u0301\u0003b1\u0000\u0300\u02f8\u0001\u0000\u0000\u0000"+ - "\u0300\u02fa\u0001\u0000\u0000\u0000\u0300\u02fc\u0001\u0000\u0000\u0000"+ - "\u0300\u02fe\u0001\u0000\u0000\u0000\u0301a\u0001\u0000\u0000\u0000\u0302"+ - "\u0304\u0003\u00e6s\u0000\u0303\u0302\u0001\u0000\u0000\u0000\u0303\u0304"+ - "\u0001\u0000\u0000\u0000\u0304\u0307\u0001\u0000\u0000\u0000\u0305\u0306"+ - "\u0005\\\u0000\u0000\u0306\u0308\u0003\u00a4R\u0000\u0307\u0305\u0001"+ - "\u0000\u0000\u0000\u0307\u0308\u0001\u0000\u0000\u0000\u0308c\u0001\u0000"+ - "\u0000\u0000\u0309\u030c\u0001\u0000\u0000\u0000\u030a\u030c\u0003\u00a4"+ - "R\u0000\u030b\u0309\u0001\u0000\u0000\u0000\u030b\u030a\u0001\u0000\u0000"+ - "\u0000\u030ce\u0001\u0000\u0000\u0000\u030d\u030e\u00056\u0000\u0000\u030e"+ - "\u030f\u0003\u00a4R\u0000\u030f\u0313\u0005h\u0000\u0000\u0310\u0312\u0003"+ - "h4\u0000\u0311\u0310\u0001\u0000\u0000\u0000\u0312\u0315\u0001\u0000\u0000"+ - "\u0000\u0313\u0311\u0001\u0000\u0000\u0000\u0313\u0314\u0001\u0000\u0000"+ - "\u0000\u0314\u0316\u0001\u0000\u0000\u0000\u0315\u0313\u0001\u0000\u0000"+ - "\u0000\u0316\u0317\u0005i\u0000\u0000\u0317g\u0001\u0000\u0000\u0000\u0318"+ - "\u0319\u0003j5\u0000\u0319\u031b\u0005o\u0000\u0000\u031a\u031c\u0003"+ - "\u00f0x\u0000\u031b\u031a\u0001\u0000\u0000\u0000\u031b\u031c\u0001\u0000"+ - "\u0000\u0000\u031ci\u0001\u0000\u0000\u0000\u031d\u031e\u0005P\u0000\u0000"+ - "\u031e\u0321\u0003l6\u0000\u031f\u0321\u0005L\u0000\u0000\u0320\u031d"+ - "\u0001\u0000\u0000\u0000\u0320\u031f\u0001\u0000\u0000\u0000\u0321k\u0001"+ - "\u0000\u0000\u0000\u0322\u0323\u0005%\u0000\u0000\u0323\u0330\u0005e\u0000"+ - "\u0000\u0324\u0325\u0003\u00cae\u0000\u0325\u032a\u0005h\u0000\u0000\u0326"+ - "\u0328\u0003n7\u0000\u0327\u0329\u0005m\u0000\u0000\u0328\u0327\u0001"+ - "\u0000\u0000\u0000\u0328\u0329\u0001\u0000\u0000\u0000\u0329\u032b\u0001"+ - "\u0000\u0000\u0000\u032a\u0326\u0001\u0000\u0000\u0000\u032a\u032b\u0001"+ - "\u0000\u0000\u0000\u032b\u032c\u0001\u0000\u0000\u0000\u032c\u032d\u0005"+ - "i\u0000\u0000\u032d\u0330\u0001\u0000\u0000\u0000\u032e\u0330\u0003\u00a4"+ - "R\u0000\u032f\u0322\u0001\u0000\u0000\u0000\u032f\u0324\u0001\u0000\u0000"+ - "\u0000\u032f\u032e\u0001\u0000\u0000\u0000\u0330m\u0001\u0000\u0000\u0000"+ - "\u0331\u0336\u0003l6\u0000\u0332\u0333\u0005m\u0000\u0000\u0333\u0335"+ - "\u0003l6\u0000\u0334\u0332\u0001\u0000\u0000\u0000\u0335\u0338\u0001\u0000"+ - "\u0000\u0000\u0336\u0334\u0001\u0000\u0000\u0000\u0336\u0337\u0001\u0000"+ - "\u0000\u0000\u0337o\u0001\u0000\u0000\u0000\u0338\u0336\u0001\u0000\u0000"+ - "\u0000\u0339\u033e\u0005h\u0000\u0000\u033a\u033b\u0005;\u0000\u0000\u033b"+ - "\u033c\u0003\u00e4r\u0000\u033c\u033d\u0003\u0170\u00b8\u0000\u033d\u033f"+ - "\u0001\u0000\u0000\u0000\u033e\u033a\u0001\u0000\u0000\u0000\u033e\u033f"+ - "\u0001\u0000\u0000\u0000\u033f\u0341\u0001\u0000\u0000\u0000\u0340\u0342"+ - "\u0003\u00f0x\u0000\u0341\u0340\u0001\u0000\u0000\u0000\u0341\u0342\u0001"+ - "\u0000\u0000\u0000\u0342\u0343\u0001\u0000\u0000\u0000\u0343\u0344\u0005"+ - "i\u0000\u0000\u0344q\u0001\u0000\u0000\u0000\u0345\u0348\u0003\u0150\u00a8"+ - "\u0000\u0346\u0348\u0005e\u0000\u0000\u0347\u0345\u0001\u0000\u0000\u0000"+ - "\u0347\u0346\u0001\u0000\u0000\u0000\u0348\u0351\u0001\u0000\u0000\u0000"+ - "\u0349\u034e\u0005h\u0000\u0000\u034a\u034c\u0003t:\u0000\u034b\u034d"+ - "\u0005m\u0000\u0000\u034c\u034b\u0001\u0000\u0000\u0000\u034c\u034d\u0001"+ - "\u0000\u0000\u0000\u034d\u034f\u0001\u0000\u0000\u0000\u034e\u034a\u0001"+ - "\u0000\u0000\u0000\u034e\u034f\u0001\u0000\u0000\u0000\u034f\u0350\u0001"+ - "\u0000\u0000\u0000\u0350\u0352\u0005i\u0000\u0000\u0351\u0349\u0001\u0000"+ - "\u0000\u0000\u0351\u0352\u0001\u0000\u0000\u0000\u0352s\u0001\u0000\u0000"+ - "\u0000\u0353\u0358\u0003v;\u0000\u0354\u0355\u0005m\u0000\u0000\u0355"+ - "\u0357\u0003v;\u0000\u0356\u0354\u0001\u0000\u0000\u0000\u0357\u035a\u0001"+ - "\u0000\u0000\u0000\u0358\u0356\u0001\u0000\u0000\u0000\u0358\u0359\u0001"+ - "\u0000\u0000\u0000\u0359u\u0001\u0000\u0000\u0000\u035a\u0358\u0001\u0000"+ - "\u0000\u0000\u035b\u035c\u0005e\u0000\u0000\u035c\u035e\u0005o\u0000\u0000"+ - "\u035d\u035b\u0001\u0000\u0000\u0000\u035d\u035e\u0001\u0000\u0000\u0000"+ - "\u035e\u035f\u0001\u0000\u0000\u0000\u035f\u0360\u0003\u00a4R\u0000\u0360"+ - "w\u0001\u0000\u0000\u0000\u0361\u0362\u0005G\u0000\u0000\u0362\u0363\u0003"+ - "\u00a4R\u0000\u0363\u0364\u0005\u000f\u0000\u0000\u0364\u0365\u0003r9"+ - "\u0000\u0365\u0366\u0003\u00eew\u0000\u0366y\u0001\u0000\u0000\u0000\u0367"+ - "\u0368\u0003\u00c2a\u0000\u0368\u0369\u0005\u000f\u0000\u0000\u0369\u037c"+ - "\u0003\u00c2a\u0000\u036a\u0370\u0005h\u0000\u0000\u036b\u036c\u0003\u0082"+ - "A\u0000\u036c\u036d\u0003\u0170\u00b8\u0000\u036d\u036f\u0001\u0000\u0000"+ - "\u0000\u036e\u036b\u0001\u0000\u0000\u0000\u036f\u0372\u0001\u0000\u0000"+ - "\u0000\u0370\u036e\u0001\u0000\u0000\u0000\u0370\u0371\u0001\u0000\u0000"+ - "\u0000\u0371\u0378\u0001\u0000\u0000\u0000\u0372\u0370\u0001\u0000\u0000"+ - "\u0000\u0373\u0374\u0003|>\u0000\u0374\u0375\u0003\u0170\u00b8\u0000\u0375"+ - "\u0377\u0001\u0000\u0000\u0000\u0376\u0373\u0001\u0000\u0000\u0000\u0377"+ - "\u037a\u0001\u0000\u0000\u0000\u0378\u0376\u0001\u0000\u0000\u0000\u0378"+ - "\u0379\u0001\u0000\u0000\u0000\u0379\u037b\u0001\u0000\u0000\u0000\u037a"+ - "\u0378\u0001\u0000\u0000\u0000\u037b\u037d\u0005i\u0000\u0000\u037c\u036a"+ - "\u0001\u0000\u0000\u0000\u037c\u037d\u0001\u0000\u0000\u0000\u037d{\u0001"+ - "\u0000\u0000\u0000\u037e\u0380\u0005\u000e\u0000\u0000\u037f\u037e\u0001"+ - "\u0000\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380\u0381\u0001"+ - "\u0000\u0000\u0000\u0381\u0382\u0003~?\u0000\u0382\u0383\u0005e\u0000"+ - "\u0000\u0383\u0385\u0003\u013e\u009f\u0000\u0384\u0386\u0003\u00eew\u0000"+ - "\u0385\u0384\u0001\u0000\u0000\u0000\u0385\u0386\u0001\u0000\u0000\u0000"+ - "\u0386}\u0001\u0000\u0000\u0000\u0387\u0389\u0005f\u0000\u0000\u0388\u038a"+ - "\u0005e\u0000\u0000\u0389\u0388\u0001\u0000\u0000\u0000\u0389\u038a\u0001"+ - "\u0000\u0000\u0000\u038a\u038c\u0001\u0000\u0000\u0000\u038b\u038d\u0005"+ - "\u0087\u0000\u0000\u038c\u038b\u0001\u0000\u0000\u0000\u038c\u038d\u0001"+ - "\u0000\u0000\u0000\u038d\u038e\u0001\u0000\u0000\u0000\u038e\u038f\u0003"+ - "\u012c\u0096\u0000\u038f\u0390\u0005g\u0000\u0000\u0390\u007f\u0001\u0000"+ - "\u0000\u0000\u0391\u0397\u0003\u00b4Z\u0000\u0392\u0393\u0003\u00c2a\u0000"+ - "\u0393\u0394\u0005p\u0000\u0000\u0394\u0395\u0005e\u0000\u0000\u0395\u0397"+ - "\u0001\u0000\u0000\u0000\u0396\u0391\u0001\u0000\u0000\u0000\u0396\u0392"+ - "\u0001\u0000\u0000\u0000\u0397\u0081\u0001\u0000\u0000\u0000\u0398\u0399"+ - "\u00058\u0000\u0000\u0399\u039a\u0005e\u0000\u0000\u039a\u039d\u0005s"+ - "\u0000\u0000\u039b\u039e\u0003\u0080@\u0000\u039c\u039e\u0003\u014e\u00a7"+ - "\u0000\u039d\u039b\u0001\u0000\u0000\u0000\u039d\u039c\u0001\u0000\u0000"+ - "\u0000\u039e\u0083\u0001\u0000\u0000\u0000\u039f\u03a0\u0005/\u0000\u0000"+ - "\u03a0\u03a1\u0005f\u0000\u0000\u03a1\u03a4\u0003\u00c2a\u0000\u03a2\u03a3"+ - "\u0005m\u0000\u0000\u03a3\u03a5\u0003\u00e6s\u0000\u03a4\u03a2\u0001\u0000"+ - "\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6\u0001\u0000"+ - "\u0000\u0000\u03a6\u03a7\u0005g\u0000\u0000\u03a7\u0085\u0001\u0000\u0000"+ - "\u0000\u03a8\u03a9\u0005.\u0000\u0000\u03a9\u03aa\u0005f\u0000\u0000\u03aa"+ - "\u03ab\u0003\u00c2a\u0000\u03ab\u03ac\u0005g\u0000\u0000\u03ac\u0087\u0001"+ - "\u0000\u0000\u0000\u03ad\u03b0\u0003^/\u0000\u03ae\u03b1\u0003\u008aE"+ - "\u0000\u03af\u03b1\u0003\u008cF\u0000\u03b0\u03ae\u0001\u0000\u0000\u0000"+ - "\u03b0\u03af\u0001\u0000\u0000\u0000\u03b1\u0089\u0001\u0000\u0000\u0000"+ - "\u03b2\u03b3\u0005M\u0000\u0000\u03b3\u03b4\u0005e\u0000\u0000\u03b4\u03b6"+ - "\u0003\u013e\u009f\u0000\u03b5\u03b7\u0003p8\u0000\u03b6\u03b5\u0001\u0000"+ - "\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u008b\u0001\u0000"+ - "\u0000\u0000\u03b8\u03b9\u0005M\u0000\u0000\u03b9\u03ba\u0003\u009aM\u0000"+ - "\u03ba\u03bb\u0005e\u0000\u0000\u03bb\u03bd\u0003\u013e\u009f\u0000\u03bc"+ - "\u03be\u0003p8\u0000\u03bd\u03bc\u0001\u0000\u0000\u0000\u03bd\u03be\u0001"+ - "\u0000\u0000\u0000\u03be\u008d\u0001\u0000\u0000\u0000\u03bf\u03c2\u0005"+ - "\u001b\u0000\u0000\u03c0\u03c3\u0003\u0088D\u0000\u03c1\u03c3\u0003\u00de"+ - "o\u0000\u03c2\u03c0\u0001\u0000\u0000\u0000\u03c2\u03c1\u0001\u0000\u0000"+ - "\u0000\u03c3\u008f\u0001\u0000\u0000\u0000\u03c4\u03c5\u00058\u0000\u0000"+ - "\u03c5\u03c6\u0005e\u0000\u0000\u03c6\u03c8\u0003\u0142\u00a1\u0000\u03c7"+ - "\u03c9\u0003\u0092I\u0000\u03c8\u03c7\u0001\u0000\u0000\u0000\u03c8\u03c9"+ - "\u0001\u0000\u0000\u0000\u03c9\u0091\u0001\u0000\u0000\u0000\u03ca\u03cb"+ - "\u0005h\u0000\u0000\u03cb\u03cc\u0003\u00a4R\u0000\u03cc\u03cd\u0003\u0170"+ - "\u00b8\u0000\u03cd\u03ce\u0005i\u0000\u0000\u03ce\u0093\u0001\u0000\u0000"+ - "\u0000\u03cf\u03d0\u00058\u0000\u0000\u03d0\u03d1\u0003\u009aM\u0000\u03d1"+ - "\u03d2\u0005e\u0000\u0000\u03d2\u03d4\u0003\u0142\u00a1\u0000\u03d3\u03d5"+ - "\u0003\u0092I\u0000\u03d4\u03d3\u0001\u0000\u0000\u0000\u03d4\u03d5\u0001"+ - "\u0000\u0000\u0000\u03d5\u0095\u0001\u0000\u0000\u0000\u03d6\u03de\u0003"+ - "\u0006\u0003\u0000\u03d7\u03da\u0003\u00c2a\u0000\u03d8\u03d9\u0005l\u0000"+ - "\u0000\u03d9\u03db\u0003\u00e6s\u0000\u03da\u03d8\u0001\u0000\u0000\u0000"+ - "\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u03df\u0001\u0000\u0000\u0000"+ - "\u03dc\u03dd\u0005l\u0000\u0000\u03dd\u03df\u0003\u00e6s\u0000\u03de\u03d7"+ - "\u0001\u0000\u0000\u0000\u03de\u03dc\u0001\u0000\u0000\u0000\u03df\u0097"+ - "\u0001\u0000\u0000\u0000\u03e0\u03e1\u0003\u0006\u0003\u0000\u03e1\u03e2"+ - "\u0005s\u0000\u0000\u03e2\u03e3\u0003\u00e6s\u0000\u03e3\u0099\u0001\u0000"+ - "\u0000\u0000\u03e4\u03e6\u0005f\u0000\u0000\u03e5\u03e7\u0003\b\u0004"+ - "\u0000\u03e6\u03e5\u0001\u0000\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000"+ - "\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000\u03e8\u03ea\u0003\u00c2a\u0000"+ - "\u03e9\u03eb\u0005m\u0000\u0000\u03ea\u03e9\u0001\u0000\u0000\u0000\u03ea"+ - "\u03eb\u0001\u0000\u0000\u0000\u03eb\u03ec\u0001\u0000\u0000\u0000\u03ec"+ - "\u03ed\u0005g\u0000\u0000\u03ed\u009b\u0001\u0000\u0000\u0000\u03ee\u03f1"+ - "\u0003\u009eO\u0000\u03ef\u03f1\u0003\u00a0P\u0000\u03f0\u03ee\u0001\u0000"+ - "\u0000\u0000\u03f0\u03ef\u0001\u0000\u0000\u0000\u03f1\u009d\u0001\u0000"+ - "\u0000\u0000\u03f2\u03f4\u0003\u00e4r\u0000\u03f3\u03f2\u0001\u0000\u0000"+ - "\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0001\u0000\u0000"+ - "\u0000\u03f5\u03f6\u0003\u00a2Q\u0000\u03f6\u009f\u0001\u0000\u0000\u0000"+ - "\u03f7\u03f9\u0005\u001b\u0000\u0000\u03f8\u03fa\u0003\u00e4r\u0000\u03f9"+ - "\u03f8\u0001\u0000\u0000\u0000\u03f9\u03fa\u0001\u0000\u0000\u0000\u03fa"+ - "\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0003\u00a2Q\u0000\u03fc\u00a1"+ - "\u0001\u0000\u0000\u0000\u03fd\u03ff\u0005t\u0000\u0000\u03fe\u03fd\u0001"+ - "\u0000\u0000\u0000\u03fe\u03ff\u0001\u0000\u0000\u0000\u03ff\u0400\u0001"+ - "\u0000\u0000\u0000\u0400\u0401\u0003\u00c2a\u0000\u0401\u00a3\u0001\u0000"+ - "\u0000\u0000\u0402\u0403\u0006R\uffff\uffff\u0000\u0403\u0404\u0007\u0006"+ - "\u0000\u0000\u0404\u0418\u0003\u00a4R\u000f\u0405\u0418\u0003\u00b4Z\u0000"+ - "\u0406\u0407\u0005\u0019\u0000\u0000\u0407\u0408\u0003.\u0017\u0000\u0408"+ - "\u0409\u0005\u001c\u0000\u0000\u0409\u040a\u0003\u00a4R\u0003\u040a\u0418"+ - "\u0001\u0000\u0000\u0000\u040b\u040c\u0005\u001a\u0000\u0000\u040c\u040d"+ - "\u0003\u0098L\u0000\u040d\u040e\u0005\u001c\u0000\u0000\u040e\u040f\u0003"+ - "\u00a4R\u0002\u040f\u0418\u0001\u0000\u0000\u0000\u0410\u0411\u0007\u0007"+ - "\u0000\u0000\u0411\u0412\u0003&\u0013\u0000\u0412\u0413\u0005o\u0000\u0000"+ - "\u0413\u0414\u0005o\u0000\u0000\u0414\u0415\u0003*\u0015\u0000\u0415\u0416"+ - "\u0003\u00a4R\u0001\u0416\u0418\u0001\u0000\u0000\u0000\u0417\u0402\u0001"+ - "\u0000\u0000\u0000\u0417\u0405\u0001\u0000\u0000\u0000\u0417\u0406\u0001"+ - "\u0000\u0000\u0000\u0417\u040b\u0001\u0000\u0000\u0000\u0417\u0410\u0001"+ - "\u0000\u0000\u0000\u0418\u043c\u0001\u0000\u0000\u0000\u0419\u041a\n\r"+ - "\u0000\u0000\u041a\u041b\u0007\b\u0000\u0000\u041b\u043b\u0003\u00a4R"+ - "\u000e\u041c\u041d\n\f\u0000\u0000\u041d\u041e\u0007\t\u0000\u0000\u041e"+ - "\u043b\u0003\u00a4R\r\u041f\u0420\n\u000b\u0000\u0000\u0420\u0421\u0007"+ - "\n\u0000\u0000\u0421\u043b\u0003\u00a4R\f\u0422\u0423\n\n\u0000\u0000"+ - "\u0423\u0424\u0007\u000b\u0000\u0000\u0424\u043b\u0003\u00a4R\u000b\u0425"+ - "\u0426\n\t\u0000\u0000\u0426\u0427\u0007\f\u0000\u0000\u0427\u043b\u0003"+ - "\u00a4R\n\u0428\u0429\n\u0007\u0000\u0000\u0429\u042a\u0005v\u0000\u0000"+ - "\u042a\u043b\u0003\u00a4R\b\u042b\u042c\n\u0006\u0000\u0000\u042c\u042d"+ - "\u0005u\u0000\u0000\u042d\u043b\u0003\u00a4R\u0007\u042e\u042f\n\u0005"+ - "\u0000\u0000\u042f\u0430\u0005\"\u0000\u0000\u0430\u043b\u0003\u00a4R"+ - "\u0005\u0431\u0432\n\u0004\u0000\u0000\u0432\u0433\u0005%\u0000\u0000"+ - "\u0433\u0434\u0003\u00a4R\u0000\u0434\u0435\u0005o\u0000\u0000\u0435\u0436"+ - "\u0003\u00a4R\u0004\u0436\u043b\u0001\u0000\u0000\u0000\u0437\u0438\n"+ - "\b\u0000\u0000\u0438\u0439\u0005\u000f\u0000\u0000\u0439\u043b\u0003r"+ - "9\u0000\u043a\u0419\u0001\u0000\u0000\u0000\u043a\u041c\u0001\u0000\u0000"+ - "\u0000\u043a\u041f\u0001\u0000\u0000\u0000\u043a\u0422\u0001\u0000\u0000"+ - "\u0000\u043a\u0425\u0001\u0000\u0000\u0000\u043a\u0428\u0001\u0000\u0000"+ - "\u0000\u043a\u042b\u0001\u0000\u0000\u0000\u043a\u042e\u0001\u0000\u0000"+ - "\u0000\u043a\u0431\u0001\u0000\u0000\u0000\u043a\u0437\u0001\u0000\u0000"+ - "\u0000\u043b\u043e\u0001\u0000\u0000\u0000\u043c\u043a\u0001\u0000\u0000"+ - "\u0000\u043c\u043d\u0001\u0000\u0000\u0000\u043d\u00a5\u0001\u0000\u0000"+ - "\u0000\u043e\u043c\u0001\u0000\u0000\u0000\u043f\u0454\u0003\u0018\f\u0000"+ - "\u0440\u0454\u0003\u001a\r\u0000\u0441\u0454\u0003\u00aaU\u0000\u0442"+ - "\u0454\u0003\u00a8T\u0000\u0443\u0454\u0003\u00deo\u0000\u0444\u0454\u0003"+ - "\u00fe\u007f\u0000\u0445\u0454\u0003\u00f2y\u0000\u0446\u0454\u0003\u012a"+ - "\u0095\u0000\u0447\u0454\u0003\u0100\u0080\u0000\u0448\u0454\u0003\u0102"+ - "\u0081\u0000\u0449\u0454\u0003\u0104\u0082\u0000\u044a\u0454\u0003\u0106"+ - "\u0083\u0000\u044b\u0454\u0003\u0108\u0084\u0000\u044c\u0454\u0003\u00ee"+ - "w\u0000\u044d\u0454\u0003\u010a\u0085\u0000\u044e\u0454\u0003\u010c\u0086"+ - "\u0000\u044f\u0454\u0003\u011e\u008f\u0000\u0450\u0454\u0003\u00acV\u0000"+ - "\u0451\u0454\u0003\u00b0X\u0000\u0452\u0454\u0003x<\u0000\u0453\u043f"+ - "\u0001\u0000\u0000\u0000\u0453\u0440\u0001\u0000\u0000\u0000\u0453\u0441"+ - "\u0001\u0000\u0000\u0000\u0453\u0442\u0001\u0000\u0000\u0000\u0453\u0443"+ - "\u0001\u0000\u0000\u0000\u0453\u0444\u0001\u0000\u0000\u0000\u0453\u0445"+ - "\u0001\u0000\u0000\u0000\u0453\u0446\u0001\u0000\u0000\u0000\u0453\u0447"+ - "\u0001\u0000\u0000\u0000\u0453\u0448\u0001\u0000\u0000\u0000\u0453\u0449"+ - "\u0001\u0000\u0000\u0000\u0453\u044a\u0001\u0000\u0000\u0000\u0453\u044b"+ - "\u0001\u0000\u0000\u0000\u0453\u044c\u0001\u0000\u0000\u0000\u0453\u044d"+ - "\u0001\u0000\u0000\u0000\u0453\u044e\u0001\u0000\u0000\u0000\u0453\u044f"+ - "\u0001\u0000\u0000\u0000\u0453\u0450\u0001\u0000\u0000\u0000\u0453\u0451"+ - "\u0001\u0000\u0000\u0000\u0453\u0452\u0001\u0000\u0000\u0000\u0454\u00a7"+ - "\u0001\u0000\u0000\u0000\u0455\u0456\u0005$\u0000\u0000\u0456\u0457\u0003"+ - "\u00a4R\u0000\u0457\u00a9\u0001\u0000\u0000\u0000\u0458\u0459\u0005X\u0000"+ - "\u0000\u0459\u045b\u0003\u00a4R\u0000\u045a\u045c\u0003\u00eew\u0000\u045b"+ - "\u045a\u0001\u0000\u0000\u0000\u045b\u045c\u0001\u0000\u0000\u0000\u045c"+ - "\u00ab\u0001\u0000\u0000\u0000\u045d\u045e\u0003\u00aeW\u0000\u045e\u045f"+ - "\u0003\u0126\u0093\u0000\u045f\u00ad\u0001\u0000\u0000\u0000\u0460\u0461"+ - "\u0005\f\u0000\u0000\u0461\u0462\u0003\u00a4R\u0000\u0462\u0463\u0003"+ - "\u0170\u00b8\u0000\u0463\u0465\u0001\u0000\u0000\u0000\u0464\u0460\u0001"+ - "\u0000\u0000\u0000\u0465\u0468\u0001\u0000\u0000\u0000\u0466\u0464\u0001"+ - "\u0000\u0000\u0000\u0466\u0467\u0001\u0000\u0000\u0000\u0467\u046d\u0001"+ - "\u0000\u0000\u0000\u0468\u0466\u0001\u0000\u0000\u0000\u0469\u046a\u0005"+ - "\r\u0000\u0000\u046a\u046b\u0003b1\u0000\u046b\u046c\u0003\u0170\u00b8"+ - "\u0000\u046c\u046e\u0001\u0000\u0000\u0000\u046d\u0469\u0001\u0000\u0000"+ - "\u0000\u046d\u046e\u0001\u0000\u0000\u0000\u046e\u00af\u0001\u0000\u0000"+ - "\u0000\u046f\u0470\u0005Q\u0000\u0000\u0470\u0475\u0003\u00a4R\u0000\u0471"+ - "\u0472\u0005Q\u0000\u0000\u0472\u0473\u0007\u0001\u0000\u0000\u0473\u0475"+ - "\u0003.\u0017\u0000\u0474\u046f\u0001\u0000\u0000\u0000\u0474\u0471\u0001"+ - "\u0000\u0000\u0000\u0475\u00b1\u0001\u0000\u0000\u0000\u0476\u047f\u0005"+ - "\u0003\u0000\u0000\u0477\u047f\u0005\u0004\u0000\u0000\u0478\u047f\u0005"+ - "d\u0000\u0000\u0479\u047f\u0003\u014c\u00a6\u0000\u047a\u047f\u0003\u0162"+ - "\u00b1\u0000\u047b\u047f\u0005\u0001\u0000\u0000\u047c\u047f\u0005\u008f"+ - "\u0000\u0000\u047d\u047f\u0005\u0090\u0000\u0000\u047e\u0476\u0001\u0000"+ - "\u0000\u0000\u047e\u0477\u0001\u0000\u0000\u0000\u047e\u0478\u0001\u0000"+ - "\u0000\u0000\u047e\u0479\u0001\u0000\u0000\u0000\u047e\u047a\u0001\u0000"+ - "\u0000\u0000\u047e\u047b\u0001\u0000\u0000\u0000\u047e\u047c\u0001\u0000"+ - "\u0000\u0000\u047e\u047d\u0001\u0000\u0000\u0000\u047f\u00b3\u0001\u0000"+ - "\u0000\u0000\u0480\u0481\u0006Z\uffff\uffff\u0000\u0481\u048d\u0003\u0148"+ - "\u00a4\u0000\u0482\u048d\u0003\u0144\u00a2\u0000\u0483\u048d\u0003\u016c"+ - "\u00b6\u0000\u0484\u048d\u0003 \u0010\u0000\u0485\u048d\u0003\u0086C\u0000"+ - "\u0486\u048d\u0003\u0084B\u0000\u0487\u0488\u0007\r\u0000\u0000\u0488"+ - "\u0489\u0005f\u0000\u0000\u0489\u048a\u0003\u00a4R\u0000\u048a\u048b\u0005"+ - "g\u0000\u0000\u048b\u048d\u0001\u0000\u0000\u0000\u048c\u0480\u0001\u0000"+ - "\u0000\u0000\u048c\u0482\u0001\u0000\u0000\u0000\u048c\u0483\u0001\u0000"+ - "\u0000\u0000\u048c\u0484\u0001\u0000\u0000\u0000\u048c\u0485\u0001\u0000"+ - "\u0000\u0000\u048c\u0486\u0001\u0000\u0000\u0000\u048c\u0487\u0001\u0000"+ - "\u0000\u0000\u048d\u04a4\u0001\u0000\u0000\u0000\u048e\u048f\n\t\u0000"+ - "\u0000\u048f\u0490\u0005p\u0000\u0000\u0490\u04a3\u0005e\u0000\u0000\u0491"+ - "\u0492\n\b\u0000\u0000\u0492\u04a3\u0003\u0166\u00b3\u0000\u0493\u0494"+ - "\n\u0007\u0000\u0000\u0494\u04a3\u0003\u00ceg\u0000\u0495\u0496\n\u0006"+ - "\u0000\u0000\u0496\u04a3\u0003L&\u0000\u0497\u0498\n\u0005\u0000\u0000"+ - "\u0498\u04a3\u0003\u0168\u00b4\u0000\u0499\u049a\n\u0004\u0000\u0000\u049a"+ - "\u04a3\u0003\u016a\u00b5\u0000\u049b\u049c\n\u0003\u0000\u0000\u049c\u049d"+ - "\u0003\u016a\u00b5\u0000\u049d\u049e\u0005\u0010\u0000\u0000\u049e\u049f"+ - "\u0003r9\u0000\u049f\u04a3\u0001\u0000\u0000\u0000\u04a0\u04a1\n\u0002"+ - "\u0000\u0000\u04a1\u04a3\u0003\u00ba]\u0000\u04a2\u048e\u0001\u0000\u0000"+ - "\u0000\u04a2\u0491\u0001\u0000\u0000\u0000\u04a2\u0493\u0001\u0000\u0000"+ - "\u0000\u04a2\u0495\u0001\u0000\u0000\u0000\u04a2\u0497\u0001\u0000\u0000"+ - "\u0000\u04a2\u0499\u0001\u0000\u0000\u0000\u04a2\u049b\u0001\u0000\u0000"+ - "\u0000\u04a2\u04a0\u0001\u0000\u0000\u0000\u04a3\u04a6\u0001\u0000\u0000"+ - "\u0000\u04a4\u04a2\u0001\u0000\u0000\u0000\u04a4\u04a5\u0001\u0000\u0000"+ - "\u0000\u04a5\u00b5\u0001\u0000\u0000\u0000\u04a6\u04a4\u0001\u0000\u0000"+ - "\u0000\u04a7\u04a8\u0003^/\u0000\u04a8\u04a9\u0003\u00b8\\\u0000\u04a9"+ - "\u00b7\u0001\u0000\u0000\u0000\u04aa\u04ac\u0005M\u0000\u0000\u04ab\u04ad"+ - "\u0005e\u0000\u0000\u04ac\u04ab\u0001\u0000\u0000\u0000\u04ac\u04ad\u0001"+ - "\u0000\u0000\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000\u04ae\u04b0\u0003"+ - "\u013e\u009f\u0000\u04af\u04b1\u0003p8\u0000\u04b0\u04af\u0001\u0000\u0000"+ - "\u0000\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u00b9\u0001\u0000\u0000"+ - "\u0000\u04b2\u04b4\u0005&\u0000\u0000\u04b3\u04b5\u0003\u00e6s\u0000\u04b4"+ - "\u04b3\u0001\u0000\u0000\u0000\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5"+ - "\u04b7\u0001\u0000\u0000\u0000\u04b6\u04b8\u0005m\u0000\u0000\u04b7\u04b6"+ - "\u0001\u0000\u0000\u0000\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8\u04b9"+ - "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0005\'\u0000\u0000\u04ba\u00bb\u0001"+ - "\u0000\u0000\u0000\u04bb\u04bc\u0005N\u0000\u0000\u04bc\u04c6\u0005h\u0000"+ - "\u0000\u04bd\u04c1\u0003\u00c0`\u0000\u04be\u04c1\u0003\u012c\u0096\u0000"+ - "\u04bf\u04c1\u0003\u00be_\u0000\u04c0\u04bd\u0001\u0000\u0000\u0000\u04c0"+ - "\u04be\u0001\u0000\u0000\u0000\u04c0\u04bf\u0001\u0000\u0000\u0000\u04c1"+ - "\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c3\u0003\u0170\u00b8\u0000\u04c3"+ - "\u04c5\u0001\u0000\u0000\u0000\u04c4\u04c0\u0001\u0000\u0000\u0000\u04c5"+ - "\u04c8\u0001\u0000\u0000\u0000\u04c6\u04c4\u0001\u0000\u0000\u0000\u04c6"+ - "\u04c7\u0001\u0000\u0000\u0000\u04c7\u04c9\u0001\u0000\u0000\u0000\u04c8"+ - "\u04c6\u0001\u0000\u0000\u0000\u04c9\u04ca\u0005i\u0000\u0000\u04ca\u00bd"+ - "\u0001\u0000\u0000\u0000\u04cb\u04cc\u00058\u0000\u0000\u04cc\u04cd\u0005"+ - "e\u0000\u0000\u04cd\u04ce\u0003\u0142\u00a1\u0000\u04ce\u00bf\u0001\u0000"+ - "\u0000\u0000\u04cf\u04d1\u0005\u001b\u0000\u0000\u04d0\u04cf\u0001\u0000"+ - "\u0000\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d2\u0001\u0000"+ - "\u0000\u0000\u04d2\u04d3\u0003^/\u0000\u04d3\u04d4\u0005e\u0000\u0000"+ - "\u04d4\u04d5\u0003\u0142\u00a1\u0000\u04d5\u04d6\u0003\u0140\u00a0\u0000"+ - "\u04d6\u04df\u0001\u0000\u0000\u0000\u04d7\u04d9\u0005\u001b\u0000\u0000"+ - "\u04d8\u04d7\u0001\u0000\u0000\u0000\u04d8\u04d9\u0001\u0000\u0000\u0000"+ - "\u04d9\u04da\u0001\u0000\u0000\u0000\u04da\u04db\u0003^/\u0000\u04db\u04dc"+ - "\u0005e\u0000\u0000\u04dc\u04dd\u0003\u0142\u00a1\u0000\u04dd\u04df\u0001"+ - "\u0000\u0000\u0000\u04de\u04d0\u0001\u0000\u0000\u0000\u04de\u04d8\u0001"+ - "\u0000\u0000\u0000\u04df\u00c1\u0001\u0000\u0000\u0000\u04e0\u04e8\u0003"+ - "\u012c\u0096\u0000\u04e1\u04e8\u0003\u00c4b\u0000\u04e2\u04e8\u0003P("+ - "\u0000\u04e3\u04e4\u0005f\u0000\u0000\u04e4\u04e5\u0003\u00c2a\u0000\u04e5"+ - "\u04e6\u0005g\u0000\u0000\u04e6\u04e8\u0001\u0000\u0000\u0000\u04e7\u04e0"+ - "\u0001\u0000\u0000\u0000\u04e7\u04e1\u0001\u0000\u0000\u0000\u04e7\u04e2"+ - "\u0001\u0000\u0000\u0000\u04e7\u04e3\u0001\u0000\u0000\u0000\u04e8\u00c3"+ - "\u0001\u0000\u0000\u0000\u04e9\u04f3\u0003\u012e\u0097\u0000\u04ea\u04f3"+ - "\u0003\u015e\u00af\u0000\u04eb\u04f3\u0003\u0134\u009a\u0000\u04ec\u04f3"+ - "\u0003\u013c\u009e\u0000\u04ed\u04f3\u0003\u00bc^\u0000\u04ee\u04f3\u0003"+ - "\u0136\u009b\u0000\u04ef\u04f3\u0003\u0138\u009c\u0000\u04f0\u04f3\u0003"+ - "\u013a\u009d\u0000\u04f1\u04f3\u0003\u00c6c\u0000\u04f2\u04e9\u0001\u0000"+ - "\u0000\u0000\u04f2\u04ea\u0001\u0000\u0000\u0000\u04f2\u04eb\u0001\u0000"+ - "\u0000\u0000\u04f2\u04ec\u0001\u0000\u0000\u0000\u04f2\u04ed\u0001\u0000"+ - "\u0000\u0000\u04f2\u04ee\u0001\u0000\u0000\u0000\u04f2\u04ef\u0001\u0000"+ - "\u0000\u0000\u04f2\u04f0\u0001\u0000\u0000\u0000\u04f2\u04f1\u0001\u0000"+ - "\u0000\u0000\u04f3\u00c5\u0001\u0000\u0000\u0000\u04f4\u04f5\u00058\u0000"+ - "\u0000\u04f5\u04f6\u0003\u00c8d\u0000\u04f6\u00c7\u0001\u0000\u0000\u0000"+ - "\u04f7\u0503\u0005f\u0000\u0000\u04f8\u04fd\u0003\u00c2a\u0000\u04f9\u04fa"+ - "\u0005m\u0000\u0000\u04fa\u04fc\u0003\u00c2a\u0000\u04fb\u04f9\u0001\u0000"+ - "\u0000\u0000\u04fc\u04ff\u0001\u0000\u0000\u0000\u04fd\u04fb\u0001\u0000"+ - "\u0000\u0000\u04fd\u04fe\u0001\u0000\u0000\u0000\u04fe\u0501\u0001\u0000"+ - "\u0000\u0000\u04ff\u04fd\u0001\u0000\u0000\u0000\u0500\u0502\u0005m\u0000"+ - "\u0000\u0501\u0500\u0001\u0000\u0000\u0000\u0501\u0502\u0001\u0000\u0000"+ - "\u0000\u0502\u0504\u0001\u0000\u0000\u0000\u0503\u04f8\u0001\u0000\u0000"+ - "\u0000\u0503\u0504\u0001\u0000\u0000\u0000\u0504\u0505\u0001\u0000\u0000"+ - "\u0000\u0505\u0506\u0005g\u0000\u0000\u0506\u00c9\u0001\u0000\u0000\u0000"+ - "\u0507\u050f\u0003\u015e\u00af\u0000\u0508\u050f\u0003\u012e\u0097\u0000"+ - "\u0509\u050f\u0003\u00ccf\u0000\u050a\u050f\u0003\u0136\u009b\u0000\u050b"+ - "\u050f\u0003\u0138\u009c\u0000\u050c\u050f\u0003P(\u0000\u050d\u050f\u0003"+ - "\u012c\u0096\u0000\u050e\u0507\u0001\u0000\u0000\u0000\u050e\u0508\u0001"+ - "\u0000\u0000\u0000\u050e\u0509\u0001\u0000\u0000\u0000\u050e\u050a\u0001"+ - "\u0000\u0000\u0000\u050e\u050b\u0001\u0000\u0000\u0000\u050e\u050c\u0001"+ - "\u0000\u0000\u0000\u050e\u050d\u0001\u0000\u0000\u0000\u050f\u00cb\u0001"+ - "\u0000\u0000\u0000\u0510\u0511\u0005j\u0000\u0000\u0511\u0512\u0005t\u0000"+ - "\u0000\u0512\u0513\u0005k\u0000\u0000\u0513\u0514\u0003\u0132\u0099\u0000"+ - "\u0514\u00cd\u0001\u0000\u0000\u0000\u0515\u0525\u0005j\u0000\u0000\u0516"+ - "\u0518\u0003\u00d0h\u0000\u0517\u0516\u0001\u0000\u0000\u0000\u0517\u0518"+ - "\u0001\u0000\u0000\u0000\u0518\u0519\u0001\u0000\u0000\u0000\u0519\u051b"+ - "\u0005o\u0000\u0000\u051a\u051c\u0003\u00d2i\u0000\u051b\u051a\u0001\u0000"+ - "\u0000\u0000\u051b\u051c\u0001\u0000\u0000\u0000\u051c\u0526\u0001\u0000"+ - "\u0000\u0000\u051d\u051f\u0003\u00d0h\u0000\u051e\u051d\u0001\u0000\u0000"+ - "\u0000\u051e\u051f\u0001\u0000\u0000\u0000\u051f\u0520\u0001\u0000\u0000"+ - "\u0000\u0520\u0521\u0005o\u0000\u0000\u0521\u0522\u0003\u00d2i\u0000\u0522"+ - "\u0523\u0005o\u0000\u0000\u0523\u0524\u0003\u00d4j\u0000\u0524\u0526\u0001"+ - "\u0000\u0000\u0000\u0525\u0517\u0001\u0000\u0000\u0000\u0525\u051e\u0001"+ - "\u0000\u0000\u0000\u0526\u0527\u0001\u0000\u0000\u0000\u0527\u0528\u0005"+ - "k\u0000\u0000\u0528\u00cf\u0001\u0000\u0000\u0000\u0529\u052a\u0003\u00a4"+ - "R\u0000\u052a\u00d1\u0001\u0000\u0000\u0000\u052b\u052c\u0003\u00a4R\u0000"+ - "\u052c\u00d3\u0001\u0000\u0000\u0000\u052d\u052e\u0003\u00a4R\u0000\u052e"+ - "\u00d5\u0001\u0000\u0000\u0000\u052f\u0531\u0007\u000e\u0000\u0000\u0530"+ - "\u052f\u0001\u0000\u0000\u0000\u0530\u0531\u0001\u0000\u0000\u0000\u0531"+ - "\u0532\u0001\u0000\u0000\u0000\u0532\u0533\u0005l\u0000\u0000\u0533\u00d7"+ - "\u0001\u0000\u0000\u0000\u0534\u0535\u0003\u00e6s\u0000\u0535\u0536\u0005"+ - "l\u0000\u0000\u0536\u053b\u0001\u0000\u0000\u0000\u0537\u0538\u0003\u0006"+ - "\u0003\u0000\u0538\u0539\u0005s\u0000\u0000\u0539\u053b\u0001\u0000\u0000"+ - "\u0000\u053a\u0534\u0001\u0000\u0000\u0000\u053a\u0537\u0001\u0000\u0000"+ - "\u0000\u053a\u053b\u0001\u0000\u0000\u0000\u053b\u053c\u0001\u0000\u0000"+ - "\u0000\u053c\u053d\u0005]\u0000\u0000\u053d\u0542\u0003\u00a4R\u0000\u053e"+ - "\u0540\u0005J\u0000\u0000\u053f\u0541\u0005e\u0000\u0000\u0540\u053f\u0001"+ - "\u0000\u0000\u0000\u0540\u0541\u0001\u0000\u0000\u0000\u0541\u0543\u0001"+ - "\u0000\u0000\u0000\u0542\u053e\u0001\u0000\u0000\u0000\u0542\u0543\u0001"+ - "\u0000\u0000\u0000\u0543\u00d9\u0001\u0000\u0000\u0000\u0544\u0545\u0005"+ - "X\u0000\u0000\u0545\u0546\u0005e\u0000\u0000\u0546\u00db\u0001\u0000\u0000"+ - "\u0000\u0547\u0548\u0003\u0162\u00b1\u0000\u0548\u00dd\u0001\u0000\u0000"+ - "\u0000\u0549\u054d\u0003\u00e0p\u0000\u054a\u054d\u0003\u00e8t\u0000\u054b"+ - "\u054d\u0003\u00ecv\u0000\u054c\u0549\u0001\u0000\u0000\u0000\u054c\u054a"+ - "\u0001\u0000\u0000\u0000\u054c\u054b\u0001\u0000\u0000\u0000\u054d\u00df"+ - "\u0001\u0000\u0000\u0000\u054e\u055a\u0005Z\u0000\u0000\u054f\u055b\u0003"+ - "\u00e2q\u0000\u0550\u0556\u0005f\u0000\u0000\u0551\u0552\u0003\u00e2q"+ - "\u0000\u0552\u0553\u0003\u0170\u00b8\u0000\u0553\u0555\u0001\u0000\u0000"+ - "\u0000\u0554\u0551\u0001\u0000\u0000\u0000\u0555\u0558\u0001\u0000\u0000"+ - "\u0000\u0556\u0554\u0001\u0000\u0000\u0000\u0556\u0557\u0001\u0000\u0000"+ - "\u0000\u0557\u0559\u0001\u0000\u0000\u0000\u0558\u0556\u0001\u0000\u0000"+ - "\u0000\u0559\u055b\u0005g\u0000\u0000\u055a\u054f\u0001\u0000\u0000\u0000"+ - "\u055a\u0550\u0001\u0000\u0000\u0000\u055b\u00e1\u0001\u0000\u0000\u0000"+ - "\u055c\u0562\u0003\u00e4r\u0000\u055d\u055f\u0003\u00c2a\u0000\u055e\u055d"+ - "\u0001\u0000\u0000\u0000\u055e\u055f\u0001\u0000\u0000\u0000\u055f\u0560"+ - "\u0001\u0000\u0000\u0000\u0560\u0561\u0005l\u0000\u0000\u0561\u0563\u0003"+ - "\u00e6s\u0000\u0562\u055e\u0001\u0000\u0000\u0000\u0562\u0563\u0001\u0000"+ - "\u0000\u0000\u0563\u00e3\u0001\u0000\u0000\u0000\u0564\u0569\u0005e\u0000"+ - "\u0000\u0565\u0566\u0005m\u0000\u0000\u0566\u0568\u0005e\u0000\u0000\u0567"+ - "\u0565\u0001\u0000\u0000\u0000\u0568\u056b\u0001\u0000\u0000\u0000\u0569"+ - "\u0567\u0001\u0000\u0000\u0000\u0569\u056a\u0001\u0000\u0000\u0000\u056a"+ - "\u00e5\u0001\u0000\u0000\u0000\u056b\u0569\u0001\u0000\u0000\u0000\u056c"+ - "\u0571\u0003\u00a4R\u0000\u056d\u056e\u0005m\u0000\u0000\u056e\u0570\u0003"+ - "\u00a4R\u0000\u056f\u056d\u0001\u0000\u0000\u0000\u0570\u0573\u0001\u0000"+ - "\u0000\u0000\u0571\u056f\u0001\u0000\u0000\u0000\u0571\u0572\u0001\u0000"+ - "\u0000\u0000\u0572\u00e7\u0001\u0000\u0000\u0000\u0573\u0571\u0001\u0000"+ - "\u0000\u0000\u0574\u0580\u0005^\u0000\u0000\u0575\u0581\u0003\u00eau\u0000"+ - "\u0576\u057c\u0005f\u0000\u0000\u0577\u0578\u0003\u00eau\u0000\u0578\u0579"+ - "\u0003\u0170\u00b8\u0000\u0579\u057b\u0001\u0000\u0000\u0000\u057a\u0577"+ - "\u0001\u0000\u0000\u0000\u057b\u057e\u0001\u0000\u0000\u0000\u057c\u057a"+ - "\u0001\u0000\u0000\u0000\u057c\u057d\u0001\u0000\u0000\u0000\u057d\u057f"+ - "\u0001\u0000\u0000\u0000\u057e\u057c\u0001\u0000\u0000\u0000\u057f\u0581"+ - "\u0005g\u0000\u0000\u0580\u0575\u0001\u0000\u0000\u0000\u0580\u0576\u0001"+ - "\u0000\u0000\u0000\u0581\u00e9\u0001\u0000\u0000\u0000\u0582\u0584\u0005"+ - "e\u0000\u0000\u0583\u0585\u0005l\u0000\u0000\u0584\u0583\u0001\u0000\u0000"+ - "\u0000\u0584\u0585\u0001\u0000\u0000\u0000\u0585\u0586\u0001\u0000\u0000"+ - "\u0000\u0586\u0587\u0003\u00c2a\u0000\u0587\u00eb\u0001\u0000\u0000\u0000"+ - "\u0588\u0594\u0005c\u0000\u0000\u0589\u0595\u0003\u0096K\u0000\u058a\u0590"+ - "\u0005f\u0000\u0000\u058b\u058c\u0003\u0096K\u0000\u058c\u058d\u0003\u0170"+ - "\u00b8\u0000\u058d\u058f\u0001\u0000\u0000\u0000\u058e\u058b\u0001\u0000"+ - "\u0000\u0000\u058f\u0592\u0001\u0000\u0000\u0000\u0590\u058e\u0001\u0000"+ - "\u0000\u0000\u0590\u0591\u0001\u0000\u0000\u0000\u0591\u0593\u0001\u0000"+ - "\u0000\u0000\u0592\u0590\u0001\u0000\u0000\u0000\u0593\u0595\u0005g\u0000"+ - "\u0000\u0594\u0589\u0001\u0000\u0000\u0000\u0594\u058a\u0001\u0000\u0000"+ - "\u0000\u0595\u00ed\u0001\u0000\u0000\u0000\u0596\u0598\u0005h\u0000\u0000"+ - "\u0597\u0599\u0003\u00f0x\u0000\u0598\u0597\u0001\u0000\u0000\u0000\u0598"+ - "\u0599\u0001\u0000\u0000\u0000\u0599\u059a\u0001\u0000\u0000\u0000\u059a"+ - "\u059b\u0005i\u0000\u0000\u059b\u00ef\u0001\u0000\u0000\u0000\u059c\u059e"+ - "\u0005n\u0000\u0000\u059d\u059c\u0001\u0000\u0000\u0000\u059d\u059e\u0001"+ - "\u0000\u0000\u0000\u059e\u05a4\u0001\u0000\u0000\u0000\u059f\u05a1\u0005"+ - "\u009f\u0000\u0000\u05a0\u059f\u0001\u0000\u0000\u0000\u05a0\u05a1\u0001"+ - "\u0000\u0000\u0000\u05a1\u05a4\u0001\u0000\u0000\u0000\u05a2\u05a4\u0004"+ - "x\u0012\u0000\u05a3\u059d\u0001\u0000\u0000\u0000\u05a3\u05a0\u0001\u0000"+ - "\u0000\u0000\u05a3\u05a2\u0001\u0000\u0000\u0000\u05a4\u05a5\u0001\u0000"+ - "\u0000\u0000\u05a5\u05a6\u0003\u00a6S\u0000\u05a6\u05a7\u0003\u0170\u00b8"+ - "\u0000\u05a7\u05a9\u0001\u0000\u0000\u0000\u05a8\u05a3\u0001\u0000\u0000"+ - "\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000\u05aa\u05a8\u0001\u0000\u0000"+ - "\u0000\u05aa\u05ab\u0001\u0000\u0000\u0000\u05ab\u00f1\u0001\u0000\u0000"+ - "\u0000\u05ac\u05b2\u0003\u00f6{\u0000\u05ad\u05b2\u0003\u00f8|\u0000\u05ae"+ - "\u05b2\u0003\u00fa}\u0000\u05af\u05b2\u0003\u00f4z\u0000\u05b0\u05b2\u0003"+ - "\u0098L\u0000\u05b1\u05ac\u0001\u0000\u0000\u0000\u05b1\u05ad\u0001\u0000"+ - "\u0000\u0000\u05b1\u05ae\u0001\u0000\u0000\u0000\u05b1\u05af\u0001\u0000"+ - "\u0000\u0000\u05b1\u05b0\u0001\u0000\u0000\u0000\u05b2\u00f3\u0001\u0000"+ - "\u0000\u0000\u05b3\u05b4\u0003\u00a4R\u0000\u05b4\u00f5\u0001\u0000\u0000"+ - "\u0000\u05b5\u05b6\u0003\u00a4R\u0000\u05b6\u05b7\u0005\u0089\u0000\u0000"+ - "\u05b7\u05b8\u0003\u00a4R\u0000\u05b8\u00f7\u0001\u0000\u0000\u0000\u05b9"+ - "\u05ba\u0003\u00a4R\u0000\u05ba\u05bb\u0007\u000f\u0000\u0000\u05bb\u00f9"+ - "\u0001\u0000\u0000\u0000\u05bc\u05bd\u0003\u00e6s\u0000\u05bd\u05be\u0003"+ - "\u00d6k\u0000\u05be\u05bf\u0003\u00e6s\u0000\u05bf\u00fb\u0001\u0000\u0000"+ - "\u0000\u05c0\u05c1\u0007\u0010\u0000\u0000\u05c1\u00fd\u0001\u0000\u0000"+ - "\u0000\u05c2\u05c3\u0005e\u0000\u0000\u05c3\u05c5\u0005o\u0000\u0000\u05c4"+ - "\u05c6\u0003\u00a6S\u0000\u05c5\u05c4\u0001\u0000\u0000\u0000\u05c5\u05c6"+ - "\u0001\u0000\u0000\u0000\u05c6\u00ff\u0001\u0000\u0000\u0000\u05c7\u05c9"+ - "\u0005b\u0000\u0000\u05c8\u05ca\u0003\u00e6s\u0000\u05c9\u05c8\u0001\u0000"+ - "\u0000\u0000\u05c9\u05ca\u0001\u0000\u0000\u0000\u05ca\u0101\u0001\u0000"+ - "\u0000\u0000\u05cb\u05cd\u0005K\u0000\u0000\u05cc\u05ce\u0005e\u0000\u0000"+ - "\u05cd\u05cc\u0001\u0000\u0000\u0000\u05cd\u05ce\u0001\u0000\u0000\u0000"+ - "\u05ce\u0103\u0001\u0000\u0000\u0000\u05cf\u05d1\u0005_\u0000\u0000\u05d0"+ - "\u05d2\u0005e\u0000\u0000\u05d1\u05d0\u0001\u0000\u0000\u0000\u05d1\u05d2"+ - "\u0001\u0000\u0000\u0000\u05d2\u0105\u0001\u0000\u0000\u0000\u05d3\u05d4"+ - "\u0005W\u0000\u0000\u05d4\u05d5\u0005e\u0000\u0000\u05d5\u0107\u0001\u0000"+ - "\u0000\u0000\u05d6\u05d7\u0005[\u0000\u0000\u05d7\u0109\u0001\u0000\u0000"+ - "\u0000\u05d8\u05e1\u0005\\\u0000\u0000\u05d9\u05e2\u0003\u00a4R\u0000"+ - "\u05da\u05db\u0003\u0170\u00b8\u0000\u05db\u05dc\u0003\u00a4R\u0000\u05dc"+ - "\u05e2\u0001\u0000\u0000\u0000\u05dd\u05de\u0003\u00f2y\u0000\u05de\u05df"+ - "\u0003\u0170\u00b8\u0000\u05df\u05e0\u0003\u00a4R\u0000\u05e0\u05e2\u0001"+ - "\u0000\u0000\u0000\u05e1\u05d9\u0001\u0000\u0000\u0000\u05e1\u05da\u0001"+ - "\u0000\u0000\u0000\u05e1\u05dd\u0001\u0000\u0000\u0000\u05e2\u05e3\u0001"+ - "\u0000\u0000\u0000\u05e3\u05e9\u0003\u00eew\u0000\u05e4\u05e7\u0005V\u0000"+ - "\u0000\u05e5\u05e8\u0003\u010a\u0085\u0000\u05e6\u05e8\u0003\u00eew\u0000"+ - "\u05e7\u05e5\u0001\u0000\u0000\u0000\u05e7\u05e6\u0001\u0000\u0000\u0000"+ - "\u05e8\u05ea\u0001\u0000\u0000\u0000\u05e9\u05e4\u0001\u0000\u0000\u0000"+ - "\u05e9\u05ea\u0001\u0000\u0000\u0000\u05ea\u010b\u0001\u0000\u0000\u0000"+ - "\u05eb\u05ee\u0003\u010e\u0087\u0000\u05ec\u05ee\u0003\u0114\u008a\u0000"+ - "\u05ed\u05eb\u0001\u0000\u0000\u0000\u05ed\u05ec\u0001\u0000\u0000\u0000"+ - "\u05ee\u010d\u0001\u0000\u0000\u0000\u05ef\u05fa\u0005Y\u0000\u0000\u05f0"+ - "\u05f2\u0003\u00a4R\u0000\u05f1\u05f0\u0001\u0000\u0000\u0000\u05f1\u05f2"+ - "\u0001\u0000\u0000\u0000\u05f2\u05fb\u0001\u0000\u0000\u0000\u05f3\u05f5"+ - "\u0003\u00f2y\u0000\u05f4\u05f3\u0001\u0000\u0000\u0000\u05f4\u05f5\u0001"+ - "\u0000\u0000\u0000\u05f5\u05f6\u0001\u0000\u0000\u0000\u05f6\u05f8\u0003"+ - "\u0170\u00b8\u0000\u05f7\u05f9\u0003\u00a4R\u0000\u05f8\u05f7\u0001\u0000"+ - "\u0000\u0000\u05f8\u05f9\u0001\u0000\u0000\u0000\u05f9\u05fb\u0001\u0000"+ - "\u0000\u0000\u05fa\u05f1\u0001\u0000\u0000\u0000\u05fa\u05f4\u0001\u0000"+ - "\u0000\u0000\u05fb\u05fc\u0001\u0000\u0000\u0000\u05fc\u0600\u0005h\u0000"+ - "\u0000\u05fd\u05ff\u0003\u0110\u0088\u0000\u05fe\u05fd\u0001\u0000\u0000"+ - "\u0000\u05ff\u0602\u0001\u0000\u0000\u0000\u0600\u05fe\u0001\u0000\u0000"+ - "\u0000\u0600\u0601\u0001\u0000\u0000\u0000\u0601\u0603\u0001\u0000\u0000"+ - "\u0000\u0602\u0600\u0001\u0000\u0000\u0000\u0603\u0604\u0005i\u0000\u0000"+ - "\u0604\u010f\u0001\u0000\u0000\u0000\u0605\u0606\u0003\u0112\u0089\u0000"+ - "\u0606\u0608\u0005o\u0000\u0000\u0607\u0609\u0003\u00f0x\u0000\u0608\u0607"+ - "\u0001\u0000\u0000\u0000\u0608\u0609\u0001\u0000\u0000\u0000\u0609\u0111"+ - "\u0001\u0000\u0000\u0000\u060a\u060b\u0005P\u0000\u0000\u060b\u060e\u0003"+ - "\u00e6s\u0000\u060c\u060e\u0005L\u0000\u0000\u060d\u060a\u0001\u0000\u0000"+ - "\u0000\u060d\u060c\u0001\u0000\u0000\u0000\u060e\u0113\u0001\u0000\u0000"+ - "\u0000\u060f\u0618\u0005Y\u0000\u0000\u0610\u0619\u0003\u0116\u008b\u0000"+ - "\u0611\u0612\u0003\u0170\u00b8\u0000\u0612\u0613\u0003\u0116\u008b\u0000"+ - "\u0613\u0619\u0001\u0000\u0000\u0000\u0614\u0615\u0003\u00f2y\u0000\u0615"+ - "\u0616\u0003\u0170\u00b8\u0000\u0616\u0617\u0003\u0116\u008b\u0000\u0617"+ - "\u0619\u0001\u0000\u0000\u0000\u0618\u0610\u0001\u0000\u0000\u0000\u0618"+ - "\u0611\u0001\u0000\u0000\u0000\u0618\u0614\u0001\u0000\u0000\u0000\u0619"+ - "\u061a\u0001\u0000\u0000\u0000\u061a\u061e\u0005h\u0000\u0000\u061b\u061d"+ - "\u0003\u0118\u008c\u0000\u061c\u061b\u0001\u0000\u0000\u0000\u061d\u0620"+ - "\u0001\u0000\u0000\u0000\u061e\u061c\u0001\u0000\u0000\u0000\u061e\u061f"+ - "\u0001\u0000\u0000\u0000\u061f\u0621\u0001\u0000\u0000\u0000\u0620\u061e"+ - "\u0001\u0000\u0000\u0000\u0621\u0622\u0005i\u0000\u0000\u0622\u0115\u0001"+ - "\u0000\u0000\u0000\u0623\u0624\u0005e\u0000\u0000\u0624\u0626\u0005s\u0000"+ - "\u0000\u0625\u0623\u0001\u0000\u0000\u0000\u0625\u0626\u0001\u0000\u0000"+ - "\u0000\u0626\u0627\u0001\u0000\u0000\u0000\u0627\u0628\u0003\u00b4Z\u0000"+ - "\u0628\u0629\u0005p\u0000\u0000\u0629\u062a\u0005f\u0000\u0000\u062a\u062b"+ - "\u0005^\u0000\u0000\u062b\u062c\u0005g\u0000\u0000\u062c\u0117\u0001\u0000"+ - "\u0000\u0000\u062d\u062e\u0003\u011a\u008d\u0000\u062e\u0630\u0005o\u0000"+ - "\u0000\u062f\u0631\u0003\u00f0x\u0000\u0630\u062f\u0001\u0000\u0000\u0000"+ - "\u0630\u0631\u0001\u0000\u0000\u0000\u0631\u0119\u0001\u0000\u0000\u0000"+ - "\u0632\u0633\u0005P\u0000\u0000\u0633\u0636\u0003\u011c\u008e\u0000\u0634"+ - "\u0636\u0005L\u0000\u0000\u0635\u0632\u0001\u0000\u0000\u0000\u0635\u0634"+ - "\u0001\u0000\u0000\u0000\u0636\u011b\u0001\u0000\u0000\u0000\u0637\u063a"+ - "\u0003\u00c2a\u0000\u0638\u063a\u0005d\u0000\u0000\u0639\u0637\u0001\u0000"+ - "\u0000\u0000\u0639\u0638\u0001\u0000\u0000\u0000\u063a\u0642\u0001\u0000"+ - "\u0000\u0000\u063b\u063e\u0005m\u0000\u0000\u063c\u063f\u0003\u00c2a\u0000"+ - "\u063d\u063f\u0005d\u0000\u0000\u063e\u063c\u0001\u0000\u0000\u0000\u063e"+ - "\u063d\u0001\u0000\u0000\u0000\u063f\u0641\u0001\u0000\u0000\u0000\u0640"+ - "\u063b\u0001\u0000\u0000\u0000\u0641\u0644\u0001\u0000\u0000\u0000\u0642"+ - "\u0640\u0001\u0000\u0000\u0000\u0642\u0643\u0001\u0000\u0000\u0000\u0643"+ - "\u011d\u0001\u0000\u0000\u0000\u0644\u0642\u0001\u0000\u0000\u0000\u0645"+ - "\u0646\u0005O\u0000\u0000\u0646\u064a\u0005h\u0000\u0000\u0647\u0649\u0003"+ - "\u0120\u0090\u0000\u0648\u0647\u0001\u0000\u0000\u0000\u0649\u064c\u0001"+ - "\u0000\u0000\u0000\u064a\u0648\u0001\u0000\u0000\u0000\u064a\u064b\u0001"+ - "\u0000\u0000\u0000\u064b\u064d\u0001\u0000\u0000\u0000\u064c\u064a\u0001"+ - "\u0000\u0000\u0000\u064d\u064e\u0005i\u0000\u0000\u064e\u011f\u0001\u0000"+ - "\u0000\u0000\u064f\u0650\u0003\u0122\u0091\u0000\u0650\u0652\u0005o\u0000"+ - "\u0000\u0651\u0653\u0003\u00f0x\u0000\u0652\u0651\u0001\u0000\u0000\u0000"+ - "\u0652\u0653\u0001\u0000\u0000\u0000\u0653\u0121\u0001\u0000\u0000\u0000"+ - "\u0654\u0657\u0005P\u0000\u0000\u0655\u0658\u0003\u00f6{\u0000\u0656\u0658"+ - "\u0003\u0124\u0092\u0000\u0657\u0655\u0001\u0000\u0000\u0000\u0657\u0656"+ - "\u0001\u0000\u0000\u0000\u0658\u065b\u0001\u0000\u0000\u0000\u0659\u065b"+ - "\u0005L\u0000\u0000\u065a\u0654\u0001\u0000\u0000\u0000\u065a\u0659\u0001"+ - "\u0000\u0000\u0000\u065b\u0123\u0001\u0000\u0000\u0000\u065c\u065d\u0003"+ - "\u00e6s\u0000\u065d\u065e\u0005l\u0000\u0000\u065e\u0663\u0001\u0000\u0000"+ - "\u0000\u065f\u0660\u0003\u00e4r\u0000\u0660\u0661\u0005s\u0000\u0000\u0661"+ - "\u0663\u0001\u0000\u0000\u0000\u0662\u065c\u0001\u0000\u0000\u0000\u0662"+ - "\u065f\u0001\u0000\u0000\u0000\u0662\u0663\u0001\u0000\u0000\u0000\u0663"+ - "\u0664\u0001\u0000\u0000\u0000\u0664\u0665\u0003\u00a4R\u0000\u0665\u0125"+ - "\u0001\u0000\u0000\u0000\u0666\u066e\u0005`\u0000\u0000\u0667\u0669\u0003"+ - "\u00a4R\u0000\u0668\u0667\u0001\u0000\u0000\u0000\u0668\u0669\u0001\u0000"+ - "\u0000\u0000\u0669\u066f\u0001\u0000\u0000\u0000\u066a\u066f\u0003\u0128"+ - "\u0094\u0000\u066b\u066d\u0003\u00d8l\u0000\u066c\u066b\u0001\u0000\u0000"+ - "\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d\u066f\u0001\u0000\u0000"+ - "\u0000\u066e\u0668\u0001\u0000\u0000\u0000\u066e\u066a\u0001\u0000\u0000"+ - "\u0000\u066e\u066c\u0001\u0000\u0000\u0000\u066f\u0670\u0001\u0000\u0000"+ - "\u0000\u0670\u0671\u0003\u00eew\u0000\u0671\u0127\u0001\u0000\u0000\u0000"+ - "\u0672\u0674\u0003\u00f2y\u0000\u0673\u0672\u0001\u0000\u0000\u0000\u0673"+ - "\u0674\u0001\u0000\u0000\u0000\u0674\u0675\u0001\u0000\u0000\u0000\u0675"+ - "\u0677\u0003\u0170\u00b8\u0000\u0676\u0678\u0003\u00a4R\u0000\u0677\u0676"+ - "\u0001\u0000\u0000\u0000\u0677\u0678\u0001\u0000\u0000\u0000\u0678\u0679"+ - "\u0001\u0000\u0000\u0000\u0679\u067b\u0003\u0170\u00b8\u0000\u067a\u067c"+ - "\u0003\u00f2y\u0000\u067b\u067a\u0001\u0000\u0000\u0000\u067b\u067c\u0001"+ - "\u0000\u0000\u0000\u067c\u0129\u0001\u0000\u0000\u0000\u067d\u067e\u0005"+ - "R\u0000\u0000\u067e\u067f\u0003\u00a4R\u0000\u067f\u012b\u0001\u0000\u0000"+ - "\u0000\u0680\u0683\u0003\u0150\u00a8\u0000\u0681\u0683\u0005e\u0000\u0000"+ - "\u0682\u0680\u0001\u0000\u0000\u0000\u0682\u0681\u0001\u0000\u0000\u0000"+ - "\u0683\u012d\u0001\u0000\u0000\u0000\u0684\u0685\u0005j\u0000\u0000\u0685"+ - "\u0686\u0003\u0130\u0098\u0000\u0686\u0687\u0005k\u0000\u0000\u0687\u0688"+ - "\u0003\u0132\u0099\u0000\u0688\u012f\u0001\u0000\u0000\u0000\u0689\u068a"+ - "\u0003\u00a4R\u0000\u068a\u0131\u0001\u0000\u0000\u0000\u068b\u068c\u0003"+ - "\u00c2a\u0000\u068c\u0133\u0001\u0000\u0000\u0000\u068d\u068e\u0005\u0087"+ - "\u0000\u0000\u068e\u068f\u0003\u00c2a\u0000\u068f\u0135\u0001\u0000\u0000"+ - "\u0000\u0690\u0691\u0005j\u0000\u0000\u0691\u0692\u0005k\u0000\u0000\u0692"+ - "\u0693\u0003\u0132\u0099\u0000\u0693\u0137\u0001\u0000\u0000\u0000\u0694"+ - "\u0695\u0005S\u0000\u0000\u0695\u0696\u0005j\u0000\u0000\u0696\u0697\u0003"+ - "\u00c2a\u0000\u0697\u0698\u0005k\u0000\u0000\u0698\u0699\u0003\u0132\u0099"+ - "\u0000\u0699\u0139\u0001\u0000\u0000\u0000\u069a\u06a0\u0005U\u0000\u0000"+ - "\u069b\u069c\u0005U\u0000\u0000\u069c\u06a0\u0005\u0089\u0000\u0000\u069d"+ - "\u069e\u0005\u0089\u0000\u0000\u069e\u06a0\u0005U\u0000\u0000\u069f\u069a"+ - "\u0001\u0000\u0000\u0000\u069f\u069b\u0001\u0000\u0000\u0000\u069f\u069d"+ - "\u0001\u0000\u0000\u0000\u06a0\u06a1\u0001\u0000\u0000\u0000\u06a1\u06a2"+ - "\u0003\u0132\u0099\u0000\u06a2\u013b\u0001\u0000\u0000\u0000\u06a3\u06a4"+ - "\u0005M\u0000\u0000\u06a4\u06a5\u0003\u013e\u009f\u0000\u06a5\u013d\u0001"+ - "\u0000\u0000\u0000\u06a6\u06a7\u0003\u0142\u00a1\u0000\u06a7\u06a8\u0003"+ - "\u0140\u00a0\u0000\u06a8\u06ab\u0001\u0000\u0000\u0000\u06a9\u06ab\u0003"+ - "\u0142\u00a1\u0000\u06aa\u06a6\u0001\u0000\u0000\u0000\u06aa\u06a9\u0001"+ - "\u0000\u0000\u0000\u06ab\u013f\u0001\u0000\u0000\u0000\u06ac\u06af\u0003"+ - "\u0142\u00a1\u0000\u06ad\u06af\u0003\u00c2a\u0000\u06ae\u06ac\u0001\u0000"+ - "\u0000\u0000\u06ae\u06ad\u0001\u0000\u0000\u0000\u06af\u0141\u0001\u0000"+ - "\u0000\u0000\u06b0\u06bc\u0005f\u0000\u0000\u06b1\u06b6\u0003\u009cN\u0000"+ - "\u06b2\u06b3\u0005m\u0000\u0000\u06b3\u06b5\u0003\u009cN\u0000\u06b4\u06b2"+ - "\u0001\u0000\u0000\u0000\u06b5\u06b8\u0001\u0000\u0000\u0000\u06b6\u06b4"+ - "\u0001\u0000\u0000\u0000\u06b6\u06b7\u0001\u0000\u0000\u0000\u06b7\u06ba"+ - "\u0001\u0000\u0000\u0000\u06b8\u06b6\u0001\u0000\u0000\u0000\u06b9\u06bb"+ - "\u0005m\u0000\u0000\u06ba\u06b9\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001"+ - "\u0000\u0000\u0000\u06bb\u06bd\u0001\u0000\u0000\u0000\u06bc\u06b1\u0001"+ - "\u0000\u0000\u0000\u06bc\u06bd\u0001\u0000\u0000\u0000\u06bd\u06be\u0001"+ - "\u0000\u0000\u0000\u06be\u06bf\u0005g\u0000\u0000\u06bf\u0143\u0001\u0000"+ - "\u0000\u0000\u06c0\u06c1\u0003\u0146\u00a3\u0000\u06c1\u06c2\u0005f\u0000"+ - "\u0000\u06c2\u06c4\u0003\u00a4R\u0000\u06c3\u06c5\u0005m\u0000\u0000\u06c4"+ - "\u06c3\u0001\u0000\u0000\u0000\u06c4\u06c5\u0001\u0000\u0000\u0000\u06c5"+ - "\u06c6\u0001\u0000\u0000\u0000\u06c6\u06c7\u0005g\u0000\u0000\u06c7\u0145"+ - "\u0001\u0000\u0000\u0000\u06c8\u06ce\u0003\u00c4b\u0000\u06c9\u06ca\u0005"+ - "f\u0000\u0000\u06ca\u06cb\u0003\u0146\u00a3\u0000\u06cb\u06cc\u0005g\u0000"+ - "\u0000\u06cc\u06ce\u0001\u0000\u0000\u0000\u06cd\u06c8\u0001\u0000\u0000"+ - "\u0000\u06cd\u06c9\u0001\u0000\u0000\u0000\u06ce\u0147\u0001\u0000\u0000"+ - "\u0000\u06cf\u06d6\u0003\u014a\u00a5\u0000\u06d0\u06d6\u0003\u014e\u00a7"+ - "\u0000\u06d1\u06d2\u0005f\u0000\u0000\u06d2\u06d3\u0003\u00a4R\u0000\u06d3"+ - "\u06d4\u0005g\u0000\u0000\u06d4\u06d6\u0001\u0000\u0000\u0000\u06d5\u06cf"+ - "\u0001\u0000\u0000\u0000\u06d5\u06d0\u0001\u0000\u0000\u0000\u06d5\u06d1"+ - "\u0001\u0000\u0000\u0000\u06d6\u0149\u0001\u0000\u0000\u0000\u06d7\u06db"+ - "\u0003\u00b2Y\u0000\u06d8\u06db\u0003\u0152\u00a9\u0000\u06d9\u06db\u0003"+ - "\u00b6[\u0000\u06da\u06d7\u0001\u0000\u0000\u0000\u06da\u06d8\u0001\u0000"+ - "\u0000\u0000\u06da\u06d9\u0001\u0000\u0000\u0000\u06db\u014b\u0001\u0000"+ - "\u0000\u0000\u06dc\u06dd\u0007\u0011\u0000\u0000\u06dd\u014d\u0001\u0000"+ - "\u0000\u0000\u06de\u06df\u0005e\u0000\u0000\u06df\u014f\u0001\u0000\u0000"+ - "\u0000\u06e0\u06e1\u0005e\u0000\u0000\u06e1\u06e2\u0005p\u0000\u0000\u06e2"+ - "\u06e3\u0005e\u0000\u0000\u06e3\u0151\u0001\u0000\u0000\u0000\u06e4\u06e5"+ - "\u0003\u00cae\u0000\u06e5\u06e6\u0003\u0154\u00aa\u0000\u06e6\u0153\u0001"+ - "\u0000\u0000\u0000\u06e7\u06ec\u0005h\u0000\u0000\u06e8\u06ea\u0003\u0156"+ - "\u00ab\u0000\u06e9\u06eb\u0005m\u0000\u0000\u06ea\u06e9\u0001\u0000\u0000"+ - "\u0000\u06ea\u06eb\u0001\u0000\u0000\u0000\u06eb\u06ed\u0001\u0000\u0000"+ - "\u0000\u06ec\u06e8\u0001\u0000\u0000\u0000\u06ec\u06ed\u0001\u0000\u0000"+ - "\u0000\u06ed\u06ee\u0001\u0000\u0000\u0000\u06ee\u06ef\u0005i\u0000\u0000"+ - "\u06ef\u0155\u0001\u0000\u0000\u0000\u06f0\u06f5\u0003\u0158\u00ac\u0000"+ - "\u06f1\u06f2\u0005m\u0000\u0000\u06f2\u06f4\u0003\u0158\u00ac\u0000\u06f3"+ - "\u06f1\u0001\u0000\u0000\u0000\u06f4\u06f7\u0001\u0000\u0000\u0000\u06f5"+ - "\u06f3\u0001\u0000\u0000\u0000\u06f5\u06f6\u0001\u0000\u0000\u0000\u06f6"+ - "\u0157\u0001\u0000\u0000\u0000\u06f7\u06f5\u0001\u0000\u0000\u0000\u06f8"+ - "\u06f9\u0003\u015a\u00ad\u0000\u06f9\u06fa\u0005o\u0000\u0000\u06fa\u06fc"+ - "\u0001\u0000\u0000\u0000\u06fb\u06f8\u0001\u0000\u0000\u0000\u06fb\u06fc"+ - "\u0001\u0000\u0000\u0000\u06fc\u06fd\u0001\u0000\u0000\u0000\u06fd\u06fe"+ - "\u0003\u015c\u00ae\u0000\u06fe\u0159\u0001\u0000\u0000\u0000\u06ff\u0702"+ - "\u0003\u00a4R\u0000\u0700\u0702\u0003\u0154\u00aa\u0000\u0701\u06ff\u0001"+ - "\u0000\u0000\u0000\u0701\u0700\u0001\u0000\u0000\u0000\u0702\u015b\u0001"+ - "\u0000\u0000\u0000\u0703\u0706\u0003\u00a4R\u0000\u0704\u0706\u0003\u0154"+ - "\u00aa\u0000\u0705\u0703\u0001\u0000\u0000\u0000\u0705\u0704\u0001\u0000"+ - "\u0000\u0000\u0706\u015d\u0001\u0000\u0000\u0000\u0707\u0708\u0005T\u0000"+ - "\u0000\u0708\u070e\u0005h\u0000\u0000\u0709\u070a\u0003\u0160\u00b0\u0000"+ - "\u070a\u070b\u0003\u0170\u00b8\u0000\u070b\u070d\u0001\u0000\u0000\u0000"+ - "\u070c\u0709\u0001\u0000\u0000\u0000\u070d\u0710\u0001\u0000\u0000\u0000"+ - "\u070e\u070c\u0001\u0000\u0000\u0000\u070e\u070f\u0001\u0000\u0000\u0000"+ - "\u070f\u0711\u0001\u0000\u0000\u0000\u0710\u070e\u0001\u0000\u0000\u0000"+ - "\u0711\u0712\u0005i\u0000\u0000\u0712\u015f\u0001\u0000\u0000\u0000\u0713"+ - "\u0714\u0003\u00e4r\u0000\u0714\u0715\u0003\u00c2a\u0000\u0715\u0718\u0001"+ - "\u0000\u0000\u0000\u0716\u0718\u0003\u0164\u00b2\u0000\u0717\u0713\u0001"+ - "\u0000\u0000\u0000\u0717\u0716\u0001\u0000\u0000\u0000\u0718\u071a\u0001"+ - "\u0000\u0000\u0000\u0719\u071b\u0003\u0162\u00b1\u0000\u071a\u0719\u0001"+ - "\u0000\u0000\u0000\u071a\u071b\u0001\u0000\u0000\u0000\u071b\u0161\u0001"+ - "\u0000\u0000\u0000\u071c\u071d\u0007\u0012\u0000\u0000\u071d\u0163\u0001"+ - "\u0000\u0000\u0000\u071e\u0720\u0005\u0087\u0000\u0000\u071f\u071e\u0001"+ - "\u0000\u0000\u0000\u071f\u0720\u0001\u0000\u0000\u0000\u0720\u0721\u0001"+ - "\u0000\u0000\u0000\u0721\u0722\u0003\u012c\u0096\u0000\u0722\u0165\u0001"+ - "\u0000\u0000\u0000\u0723\u0724\u0005j\u0000\u0000\u0724\u0725\u0003\u00a4"+ - "R\u0000\u0725\u0726\u0005k\u0000\u0000\u0726\u0167\u0001\u0000\u0000\u0000"+ - "\u0727\u0728\u0005p\u0000\u0000\u0728\u0729\u0005f\u0000\u0000\u0729\u072a"+ - "\u0003\u00c2a\u0000\u072a\u072b\u0005g\u0000\u0000\u072b\u0169\u0001\u0000"+ - "\u0000\u0000\u072c\u073b\u0005f\u0000\u0000\u072d\u0734\u0003\u00e6s\u0000"+ - "\u072e\u0731\u0003\u0146\u00a3\u0000\u072f\u0730\u0005m\u0000\u0000\u0730"+ - "\u0732\u0003\u00e6s\u0000\u0731\u072f\u0001\u0000\u0000\u0000\u0731\u0732"+ - "\u0001\u0000\u0000\u0000\u0732\u0734\u0001\u0000\u0000\u0000\u0733\u072d"+ - "\u0001\u0000\u0000\u0000\u0733\u072e\u0001\u0000\u0000\u0000\u0734\u0736"+ - "\u0001\u0000\u0000\u0000\u0735\u0737\u0005t\u0000\u0000\u0736\u0735\u0001"+ - "\u0000\u0000\u0000\u0736\u0737\u0001\u0000\u0000\u0000\u0737\u0739\u0001"+ - "\u0000\u0000\u0000\u0738\u073a\u0005m\u0000\u0000\u0739\u0738\u0001\u0000"+ - "\u0000\u0000\u0739\u073a\u0001\u0000\u0000\u0000\u073a\u073c\u0001\u0000"+ - "\u0000\u0000\u073b\u0733\u0001\u0000\u0000\u0000\u073b\u073c\u0001\u0000"+ - "\u0000\u0000\u073c\u073d\u0001\u0000\u0000\u0000\u073d\u073e\u0005g\u0000"+ - "\u0000\u073e\u016b\u0001\u0000\u0000\u0000\u073f\u0740\u0003\u0146\u00a3"+ - "\u0000\u0740\u0741\u0005p\u0000\u0000\u0741\u0742\u0005e\u0000\u0000\u0742"+ - "\u016d\u0001\u0000\u0000\u0000\u0743\u0744\u0003\u00c2a\u0000\u0744\u016f"+ - "\u0001\u0000\u0000\u0000\u0745\u074a\u0005n\u0000\u0000\u0746\u074a\u0005"+ - "\u0000\u0000\u0001\u0747\u074a\u0005\u009f\u0000\u0000\u0748\u074a\u0004"+ - "\u00b8\u0013\u0000\u0749\u0745\u0001\u0000\u0000\u0000\u0749\u0746\u0001"+ - "\u0000\u0000\u0000\u0749\u0747\u0001\u0000\u0000\u0000\u0749\u0748\u0001"+ - "\u0000\u0000\u0000\u074a\u0171\u0001\u0000\u0000\u0000\u00c1\u0180\u0185"+ - "\u018c\u0196\u019c\u01a2\u01ac\u01b6\u01c4\u01c8\u01d1\u01dd\u01e1\u01e7"+ - "\u01f0\u01fa\u020b\u0219\u021d\u0224\u022c\u0235\u0255\u025d\u0275\u0288"+ - "\u0297\u02a4\u02ad\u02bb\u02c4\u02d0\u02e5\u02ec\u02f1\u02f6\u0300\u0303"+ - "\u0307\u030b\u0313\u031b\u0320\u0328\u032a\u032f\u0336\u033e\u0341\u0347"+ - "\u034c\u034e\u0351\u0358\u035d\u0370\u0378\u037c\u037f\u0385\u0389\u038c"+ - "\u0396\u039d\u03a4\u03b0\u03b6\u03bd\u03c2\u03c8\u03d4\u03da\u03de\u03e6"+ - "\u03ea\u03f0\u03f3\u03f9\u03fe\u0417\u043a\u043c\u0453\u045b\u0466\u046d"+ - "\u0474\u047e\u048c\u04a2\u04a4\u04ac\u04b0\u04b4\u04b7\u04c0\u04c6\u04d0"+ - "\u04d8\u04de\u04e7\u04f2\u04fd\u0501\u0503\u050e\u0517\u051b\u051e\u0525"+ - "\u0530\u053a\u0540\u0542\u054c\u0556\u055a\u055e\u0562\u0569\u0571\u057c"+ - "\u0580\u0584\u0590\u0594\u0598\u059d\u05a0\u05a3\u05aa\u05b1\u05c5\u05c9"+ - "\u05cd\u05d1\u05e1\u05e7\u05e9\u05ed\u05f1\u05f4\u05f8\u05fa\u0600\u0608"+ - "\u060d\u0618\u061e\u0625\u0630\u0635\u0639\u063e\u0642\u064a\u0652\u0657"+ - "\u065a\u0662\u0668\u066c\u066e\u0673\u0677\u067b\u0682\u069f\u06aa\u06ae"+ - "\u06b6\u06ba\u06bc\u06c4\u06cd\u06d5\u06da\u06ea\u06ec\u06f5\u06fb\u0701"+ - "\u0705\u070e\u0717\u071a\u071f\u0731\u0733\u0736\u0739\u073b\u0749"; + "\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7\u01ca\u0001\u0000\u0000"+ + "\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9\u01cb\u0007\u0000\u0000"+ + "\u0000\u01ca\u01c9\u0001\u0000\u0000\u0000\u01ca\u01cb\u0001\u0000\u0000"+ + "\u0000\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc\u01cd\u0003\u00deo\u0000"+ + "\u01cd\u0013\u0001\u0000\u0000\u0000\u01ce\u01cf\u0003\u0010\b\u0000\u01cf"+ + "\u01d0\u0003\u0172\u00b9\u0000\u01d0\u01d2\u0001\u0000\u0000\u0000\u01d1"+ + "\u01ce\u0001\u0000\u0000\u0000\u01d2\u01d5\u0001\u0000\u0000\u0000\u01d3"+ + "\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001\u0000\u0000\u0000\u01d4"+ + "\u01e3\u0001\u0000\u0000\u0000\u01d5\u01d3\u0001\u0000\u0000\u0000\u01d6"+ + "\u01d7\u0005a\u0000\u0000\u01d7\u01e4\u0003\u0012\t\u0000\u01d8\u01d9"+ + "\u0005a\u0000\u0000\u01d9\u01df\u0005f\u0000\u0000\u01da\u01db\u0003\u0012"+ + "\t\u0000\u01db\u01dc\u0003\u0172\u00b9\u0000\u01dc\u01de\u0001\u0000\u0000"+ + "\u0000\u01dd\u01da\u0001\u0000\u0000\u0000\u01de\u01e1\u0001\u0000\u0000"+ + "\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df\u01e0\u0001\u0000\u0000"+ + "\u0000\u01e0\u01e2\u0001\u0000\u0000\u0000\u01e1\u01df\u0001\u0000\u0000"+ + "\u0000\u01e2\u01e4\u0005g\u0000\u0000\u01e3\u01d6\u0001\u0000\u0000\u0000"+ + "\u01e3\u01d8\u0001\u0000\u0000\u0000\u01e4\u0015\u0001\u0000\u0000\u0000"+ + "\u01e5\u01ea\u0003|>\u0000\u01e6\u01ea\u0003\u0092I\u0000\u01e7\u01ea"+ + "\u0003\u0096K\u0000\u01e8\u01ea\u0003\u0090H\u0000\u01e9\u01e5\u0001\u0000"+ + "\u0000\u0000\u01e9\u01e6\u0001\u0000\u0000\u0000\u01e9\u01e7\u0001\u0000"+ + "\u0000\u0000\u01e9\u01e8\u0001\u0000\u0000\u0000\u01ea\u0017\u0001\u0000"+ + "\u0000\u0000\u01eb\u01ec\u0005\u001b\u0000\u0000\u01ec\u01f3\u0003\u00a8"+ + "T\u0000\u01ed\u01ee\u0007\u0001\u0000\u0000\u01ee\u01f3\u0003.\u0017\u0000"+ + "\u01ef\u01f0\u0007\u0002\u0000\u0000\u01f0\u01f3\u0003\u00a6S\u0000\u01f1"+ + "\u01f3\u0003h4\u0000\u01f2\u01eb\u0001\u0000\u0000\u0000\u01f2\u01ed\u0001"+ + "\u0000\u0000\u0000\u01f2\u01ef\u0001\u0000\u0000\u0000\u01f2\u01f1\u0001"+ + "\u0000\u0000\u0000\u01f3\u0019\u0001\u0000\u0000\u0000\u01f4\u01f5\u0003"+ + "\u001c\u000e\u0000\u01f5\u001b\u0001\u0000\u0000\u0000\u01f6\u01f7\u0003"+ + "`0\u0000\u01f7\u01f8\u0003\u001e\u000f\u0000\u01f8\u001d\u0001\u0000\u0000"+ + "\u0000\u01f9\u01fa\u0005D\u0000\u0000\u01fa\u01fc\u0005f\u0000\u0000\u01fb"+ + "\u01fd\u0003\u00f2y\u0000\u01fc\u01fb\u0001\u0000\u0000\u0000\u01fc\u01fd"+ + "\u0001\u0000\u0000\u0000\u01fd\u01fe\u0001\u0000\u0000\u0000\u01fe\u01ff"+ + "\u0005g\u0000\u0000\u01ff\u001f\u0001\u0000\u0000\u0000\u0200\u020e\u0003"+ + "F#\u0000\u0201\u020e\u0003D\"\u0000\u0202\u020e\u0003B!\u0000\u0203\u020e"+ + "\u0003$\u0012\u0000\u0204\u020e\u0003@ \u0000\u0205\u020e\u00038\u001c"+ + "\u0000\u0206\u020e\u0003>\u001f\u0000\u0207\u020e\u00036\u001b\u0000\u0208"+ + "\u020e\u00032\u0019\u0000\u0209\u020e\u00030\u0018\u0000\u020a\u020e\u0003"+ + "4\u001a\u0000\u020b\u020e\u0003\"\u0011\u0000\u020c\u020e\u0003H$\u0000"+ + "\u020d\u0200\u0001\u0000\u0000\u0000\u020d\u0201\u0001\u0000\u0000\u0000"+ + "\u020d\u0202\u0001\u0000\u0000\u0000\u020d\u0203\u0001\u0000\u0000\u0000"+ + "\u020d\u0204\u0001\u0000\u0000\u0000\u020d\u0205\u0001\u0000\u0000\u0000"+ + "\u020d\u0206\u0001\u0000\u0000\u0000\u020d\u0207\u0001\u0000\u0000\u0000"+ + "\u020d\u0208\u0001\u0000\u0000\u0000\u020d\u0209\u0001\u0000\u0000\u0000"+ + "\u020d\u020a\u0001\u0000\u0000\u0000\u020d\u020b\u0001\u0000\u0000\u0000"+ + "\u020d\u020c\u0001\u0000\u0000\u0000\u020e!\u0001\u0000\u0000\u0000\u020f"+ + "\u0210\u0007\u0003\u0000\u0000\u0210#\u0001\u0000\u0000\u0000\u0211\u0212"+ + "\u0005^\u0000\u0000\u0212\u0213\u0005j\u0000\u0000\u0213\u0214\u0003\u00c4"+ + "b\u0000\u0214\u0215\u0005k\u0000\u0000\u0215%\u0001\u0000\u0000\u0000"+ + "\u0216\u021b\u0003(\u0014\u0000\u0217\u0218\u0005m\u0000\u0000\u0218\u021a"+ + "\u0003(\u0014\u0000\u0219\u0217\u0001\u0000\u0000\u0000\u021a\u021d\u0001"+ + "\u0000\u0000\u0000\u021b\u0219\u0001\u0000\u0000\u0000\u021b\u021c\u0001"+ + "\u0000\u0000\u0000\u021c\u021f\u0001\u0000\u0000\u0000\u021d\u021b\u0001"+ + "\u0000\u0000\u0000\u021e\u0220\u0005m\u0000\u0000\u021f\u021e\u0001\u0000"+ + "\u0000\u0000\u021f\u0220\u0001\u0000\u0000\u0000\u0220\'\u0001\u0000\u0000"+ + "\u0000\u0221\u0226\u0005e\u0000\u0000\u0222\u0223\u0005m\u0000\u0000\u0223"+ + "\u0225\u0005e\u0000\u0000\u0224\u0222\u0001\u0000\u0000\u0000\u0225\u0228"+ + "\u0001\u0000\u0000\u0000\u0226\u0224\u0001\u0000\u0000\u0000\u0226\u0227"+ + "\u0001\u0000\u0000\u0000\u0227\u0229\u0001\u0000\u0000\u0000\u0228\u0226"+ + "\u0001\u0000\u0000\u0000\u0229\u022a\u0003\u0134\u009a\u0000\u022a)\u0001"+ + "\u0000\u0000\u0000\u022b\u022d\u0003,\u0016\u0000\u022c\u022b\u0001\u0000"+ + "\u0000\u0000\u022d\u0230\u0001\u0000\u0000\u0000\u022e\u022c\u0001\u0000"+ + "\u0000\u0000\u022e\u022f\u0001\u0000\u0000\u0000\u022f+\u0001\u0000\u0000"+ + "\u0000\u0230\u022e\u0001\u0000\u0000\u0000\u0231\u0232\u0005h\u0000\u0000"+ + "\u0232\u0237\u0003\u00a6S\u0000\u0233\u0234\u0005m\u0000\u0000\u0234\u0236"+ + "\u0003\u00a6S\u0000\u0235\u0233\u0001\u0000\u0000\u0000\u0236\u0239\u0001"+ + "\u0000\u0000\u0000\u0237\u0235\u0001\u0000\u0000\u0000\u0237\u0238\u0001"+ + "\u0000\u0000\u0000\u0238\u023a\u0001\u0000\u0000\u0000\u0239\u0237\u0001"+ + "\u0000\u0000\u0000\u023a\u023b\u0005i\u0000\u0000\u023b-\u0001\u0000\u0000"+ + "\u0000\u023c\u023d\u0003\u00b6[\u0000\u023d/\u0001\u0000\u0000\u0000\u023e"+ + "\u023f\u00051\u0000\u0000\u023f\u0240\u0005f\u0000\u0000\u0240\u0241\u0003"+ + "\u00a6S\u0000\u0241\u0242\u0005g\u0000\u0000\u02421\u0001\u0000\u0000"+ + "\u0000\u0243\u0244\u00057\u0000\u0000\u0244\u0245\u0005j\u0000\u0000\u0245"+ + "\u0246\u0003\u00c4b\u0000\u0246\u0247\u0005k\u0000\u0000\u02473\u0001"+ + "\u0000\u0000\u0000\u0248\u0249\u00052\u0000\u0000\u0249\u024a\u0005f\u0000"+ + "\u0000\u024a\u024b\u0003\u00a6S\u0000\u024b\u024c\u0005g\u0000\u0000\u024c"+ + "5\u0001\u0000\u0000\u0000\u024d\u024e\u0007\u0004\u0000\u0000\u024e\u024f"+ + "\u0005f\u0000\u0000\u024f\u0250\u0003\u00a6S\u0000\u0250\u0251\u0005g"+ + "\u0000\u0000\u02517\u0001\u0000\u0000\u0000\u0252\u0257\u0005\u0011\u0000"+ + "\u0000\u0253\u0254\u0005j\u0000\u0000\u0254\u0255\u0003:\u001d\u0000\u0255"+ + "\u0256\u0005k\u0000\u0000\u0256\u0258\u0001\u0000\u0000\u0000\u0257\u0253"+ + "\u0001\u0000\u0000\u0000\u0257\u0258\u0001\u0000\u0000\u0000\u0258\u0259"+ + "\u0001\u0000\u0000\u0000\u0259\u025a\u0005f\u0000\u0000\u025a\u025b\u0003"+ + "\u00a6S\u0000\u025b\u025c\u0005g\u0000\u0000\u025c9\u0001\u0000\u0000"+ + "\u0000\u025d\u0260\u0003<\u001e\u0000\u025e\u0260\u0005\u0013\u0000\u0000"+ + "\u025f\u025d\u0001\u0000\u0000\u0000\u025f\u025e\u0001\u0000\u0000\u0000"+ + "\u0260;\u0001\u0000\u0000\u0000\u0261\u0262\u0005e\u0000\u0000\u0262="+ + "\u0001\u0000\u0000\u0000\u0263\u0264\u0005\u0012\u0000\u0000\u0264\u0265"+ + "\u0005f\u0000\u0000\u0265\u0266\u0003\u00a6S\u0000\u0266\u0267\u0005g"+ + "\u0000\u0000\u0267?\u0001\u0000\u0000\u0000\u0268\u0269\u0005:\u0000\u0000"+ + "\u0269\u026a\u0005f\u0000\u0000\u026a\u026b\u0003\u00a6S\u0000\u026b\u026c"+ + "\u0005g\u0000\u0000\u026cA\u0001\u0000\u0000\u0000\u026d\u026e\u00059"+ + "\u0000\u0000\u026e\u026f\u0005f\u0000\u0000\u026f\u0270\u0003\u00a6S\u0000"+ + "\u0270\u0271\u0005g\u0000\u0000\u0271C\u0001\u0000\u0000\u0000\u0272\u0273"+ + "\u0005\u0016\u0000\u0000\u0273\u0274\u0005f\u0000\u0000\u0274\u0277\u0003"+ + "\u00a6S\u0000\u0275\u0276\u0005m\u0000\u0000\u0276\u0278\u0003\u00a6S"+ + "\u0000\u0277\u0275\u0001\u0000\u0000\u0000\u0277\u0278\u0001\u0000\u0000"+ + "\u0000\u0278\u0279\u0001\u0000\u0000\u0000\u0279\u027a\u0005g\u0000\u0000"+ + "\u027aE\u0001\u0000\u0000\u0000\u027b\u027c\u0007\u0004\u0000\u0000\u027c"+ + "\u027d\u0005j\u0000\u0000\u027d\u027e\u0003\u00a6S\u0000\u027e\u027f\u0005"+ + "=\u0000\u0000\u027f\u0280\u0003\u00a6S\u0000\u0280\u0281\u0005k\u0000"+ + "\u0000\u0281G\u0001\u0000\u0000\u0000\u0282\u0283\u00056\u0000\u0000\u0283"+ + "\u0284\u0003\u00a6S\u0000\u0284\u028a\u0005h\u0000\u0000\u0285\u0286\u0003"+ + "J%\u0000\u0286\u0287\u0003\u0172\u00b9\u0000\u0287\u0289\u0001\u0000\u0000"+ + "\u0000\u0288\u0285\u0001\u0000\u0000\u0000\u0289\u028c\u0001\u0000\u0000"+ + "\u0000\u028a\u0288\u0001\u0000\u0000\u0000\u028a\u028b\u0001\u0000\u0000"+ + "\u0000\u028b\u028d\u0001\u0000\u0000\u0000\u028c\u028a\u0001\u0000\u0000"+ + "\u0000\u028d\u028e\u0005i\u0000\u0000\u028eI\u0001\u0000\u0000\u0000\u028f"+ + "\u0290\u0003l6\u0000\u0290\u0291\u0005o\u0000\u0000\u0291\u0292\u0003"+ + "\u00a6S\u0000\u0292K\u0001\u0000\u0000\u0000\u0293\u0294\u0005j\u0000"+ + "\u0000\u0294\u0299\u0003N\'\u0000\u0295\u0296\u0005m\u0000\u0000\u0296"+ + "\u0298\u0003N\'\u0000\u0297\u0295\u0001\u0000\u0000\u0000\u0298\u029b"+ + "\u0001\u0000\u0000\u0000\u0299\u0297\u0001\u0000\u0000\u0000\u0299\u029a"+ + "\u0001\u0000\u0000\u0000\u029a\u029c\u0001\u0000\u0000\u0000\u029b\u0299"+ + "\u0001\u0000\u0000\u0000\u029c\u029d\u0005k\u0000\u0000\u029dM\u0001\u0000"+ + "\u0000\u0000\u029e\u029f\u0003\u00a6S\u0000\u029f\u02a0\u0005l\u0000\u0000"+ + "\u02a0\u02a1\u0003\u00a6S\u0000\u02a1O\u0001\u0000\u0000\u0000\u02a2\u02a7"+ + "\u0003^/\u0000\u02a3\u02a7\u0003\\.\u0000\u02a4\u02a7\u0003R)\u0000\u02a5"+ + "\u02a7\u0003V+\u0000\u02a6\u02a2\u0001\u0000\u0000\u0000\u02a6\u02a3\u0001"+ + "\u0000\u0000\u0000\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6\u02a5\u0001"+ + "\u0000\u0000\u0000\u02a7Q\u0001\u0000\u0000\u0000\u02a8\u02a9\u00053\u0000"+ + "\u0000\u02a9\u02af\u0005h\u0000\u0000\u02aa\u02ab\u0003T*\u0000\u02ab"+ + "\u02ac\u0003\u0172\u00b9\u0000\u02ac\u02ae\u0001\u0000\u0000\u0000\u02ad"+ + "\u02aa\u0001\u0000\u0000\u0000\u02ae\u02b1\u0001\u0000\u0000\u0000\u02af"+ + "\u02ad\u0001\u0000\u0000\u0000\u02af\u02b0\u0001\u0000\u0000\u0000\u02b0"+ + "\u02b2\u0001\u0000\u0000\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2"+ + "\u02b3\u0005i\u0000\u0000\u02b3S\u0001\u0000\u0000\u0000\u02b4\u02b5\u0005"+ + "M\u0000\u0000\u02b5\u02b6\u0005e\u0000\u0000\u02b6\u02be\u0003\u0140\u00a0"+ + "\u0000\u02b7\u02b8\u00054\u0000\u0000\u02b8\u02b9\u0005h\u0000\u0000\u02b9"+ + "\u02ba\u0003\u00a6S\u0000\u02ba\u02bb\u0003\u0172\u00b9\u0000\u02bb\u02bc"+ + "\u0005i\u0000\u0000\u02bc\u02be\u0001\u0000\u0000\u0000\u02bd\u02b4\u0001"+ + "\u0000\u0000\u0000\u02bd\u02b7\u0001\u0000\u0000\u0000\u02beU\u0001\u0000"+ + "\u0000\u0000\u02bf\u02c0\u00055\u0000\u0000\u02c0\u02c6\u0005h\u0000\u0000"+ + "\u02c1\u02c2\u0003X,\u0000\u02c2\u02c3\u0003\u0172\u00b9\u0000\u02c3\u02c5"+ + "\u0001\u0000\u0000\u0000\u02c4\u02c1\u0001\u0000\u0000\u0000\u02c5\u02c8"+ + "\u0001\u0000\u0000\u0000\u02c6\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7"+ + "\u0001\u0000\u0000\u0000\u02c7\u02c9\u0001\u0000\u0000\u0000\u02c8\u02c6"+ + "\u0001\u0000\u0000\u0000\u02c9\u02ca\u0005i\u0000\u0000\u02caW\u0001\u0000"+ + "\u0000\u0000\u02cb\u02cc\u0005e\u0000\u0000\u02cc\u02d2\u0005h\u0000\u0000"+ + "\u02cd\u02ce\u0003Z-\u0000\u02ce\u02cf\u0003\u0172\u00b9\u0000\u02cf\u02d1"+ + "\u0001\u0000\u0000\u0000\u02d0\u02cd\u0001\u0000\u0000\u0000\u02d1\u02d4"+ + "\u0001\u0000\u0000\u0000\u02d2\u02d0\u0001\u0000\u0000\u0000\u02d2\u02d3"+ + "\u0001\u0000\u0000\u0000\u02d3\u02d5\u0001\u0000\u0000\u0000\u02d4\u02d2"+ + "\u0001\u0000\u0000\u0000\u02d5\u02d6\u0005i\u0000\u0000\u02d6Y\u0001\u0000"+ + "\u0000\u0000\u02d7\u02d9\u0003\u00e6s\u0000\u02d8\u02d7\u0001\u0000\u0000"+ + "\u0000\u02d8\u02d9\u0001\u0000\u0000\u0000\u02d9\u02da\u0001\u0000\u0000"+ + "\u0000\u02da\u02db\u0003\u00c4b\u0000\u02db[\u0001\u0000\u0000\u0000\u02dc"+ + "\u02dd\u0005\u001b\u0000\u0000\u02dd\u02de\u0005j\u0000\u0000\u02de\u02df"+ + "\u0005k\u0000\u0000\u02df\u02e0\u0003\u0134\u009a\u0000\u02e0]\u0001\u0000"+ + "\u0000\u0000\u02e1\u02e2\u0007\u0005\u0000\u0000\u02e2\u02e3\u0005j\u0000"+ + "\u0000\u02e3\u02e4\u0003\u00c4b\u0000\u02e4\u02e5\u0005k\u0000\u0000\u02e5"+ + "\u02ed\u0001\u0000\u0000\u0000\u02e6\u02e7\u0005+\u0000\u0000\u02e7\u02e8"+ + "\u0005j\u0000\u0000\u02e8\u02e9\u0003\u00c4b\u0000\u02e9\u02ea\u0005k"+ + "\u0000\u0000\u02ea\u02eb\u0003\u00c4b\u0000\u02eb\u02ed\u0001\u0000\u0000"+ + "\u0000\u02ec\u02e1\u0001\u0000\u0000\u0000\u02ec\u02e6\u0001\u0000\u0000"+ + "\u0000\u02ed_\u0001\u0000\u0000\u0000\u02ee\u02f4\u0003b1\u0000\u02ef"+ + "\u02f0\u0005\u000e\u0000\u0000\u02f0\u02f4\u00060\uffff\uffff\u0000\u02f1"+ + "\u02f2\u0005C\u0000\u0000\u02f2\u02f4\u00060\uffff\uffff\u0000\u02f3\u02ee"+ + "\u0001\u0000\u0000\u0000\u02f3\u02ef\u0001\u0000\u0000\u0000\u02f3\u02f1"+ + "\u0001\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5\u02f7"+ + "\u0003\u0172\u00b9\u0000\u02f6\u02f3\u0001\u0000\u0000\u0000\u02f7\u02fa"+ + "\u0001\u0000\u0000\u0000\u02f8\u02f9\u0001\u0000\u0000\u0000\u02f8\u02f6"+ + "\u0001\u0000\u0000\u0000\u02f9\u02fd\u0001\u0000\u0000\u0000\u02fa\u02f8"+ + "\u0001\u0000\u0000\u0000\u02fb\u02fc\u0005\u000e\u0000\u0000\u02fc\u02fe"+ + "\u00060\uffff\uffff\u0000\u02fd\u02fb\u0001\u0000\u0000\u0000\u02fd\u02fe"+ + "\u0001\u0000\u0000\u0000\u02fea\u0001\u0000\u0000\u0000\u02ff\u0300\u0005"+ + "\t\u0000\u0000\u0300\u0308\u0003f3\u0000\u0301\u0302\u0005\n\u0000\u0000"+ + "\u0302\u0308\u0003f3\u0000\u0303\u0304\u0005\u000b\u0000\u0000\u0304\u0308"+ + "\u0003f3\u0000\u0305\u0306\u0005\r\u0000\u0000\u0306\u0308\u0003d2\u0000"+ + "\u0307\u02ff\u0001\u0000\u0000\u0000\u0307\u0301\u0001\u0000\u0000\u0000"+ + "\u0307\u0303\u0001\u0000\u0000\u0000\u0307\u0305\u0001\u0000\u0000\u0000"+ + "\u0308c\u0001\u0000\u0000\u0000\u0309\u030b\u0003\u00e8t\u0000\u030a\u0309"+ + "\u0001\u0000\u0000\u0000\u030a\u030b\u0001\u0000\u0000\u0000\u030b\u030e"+ + "\u0001\u0000\u0000\u0000\u030c\u030d\u0005\\\u0000\u0000\u030d\u030f\u0003"+ + "\u00a6S\u0000\u030e\u030c\u0001\u0000\u0000\u0000\u030e\u030f\u0001\u0000"+ + "\u0000\u0000\u030fe\u0001\u0000\u0000\u0000\u0310\u0313\u0001\u0000\u0000"+ + "\u0000\u0311\u0313\u0003\u00a6S\u0000\u0312\u0310\u0001\u0000\u0000\u0000"+ + "\u0312\u0311\u0001\u0000\u0000\u0000\u0313g\u0001\u0000\u0000\u0000\u0314"+ + "\u0315\u00056\u0000\u0000\u0315\u0316\u0003\u00a6S\u0000\u0316\u031a\u0005"+ + "h\u0000\u0000\u0317\u0319\u0003j5\u0000\u0318\u0317\u0001\u0000\u0000"+ + "\u0000\u0319\u031c\u0001\u0000\u0000\u0000\u031a\u0318\u0001\u0000\u0000"+ + "\u0000\u031a\u031b\u0001\u0000\u0000\u0000\u031b\u031d\u0001\u0000\u0000"+ + "\u0000\u031c\u031a\u0001\u0000\u0000\u0000\u031d\u031e\u0005i\u0000\u0000"+ + "\u031ei\u0001\u0000\u0000\u0000\u031f\u0320\u0003l6\u0000\u0320\u0322"+ + "\u0005o\u0000\u0000\u0321\u0323\u0003\u00f2y\u0000\u0322\u0321\u0001\u0000"+ + "\u0000\u0000\u0322\u0323\u0001\u0000\u0000\u0000\u0323k\u0001\u0000\u0000"+ + "\u0000\u0324\u0325\u0005P\u0000\u0000\u0325\u0328\u0003n7\u0000\u0326"+ + "\u0328\u0005L\u0000\u0000\u0327\u0324\u0001\u0000\u0000\u0000\u0327\u0326"+ + "\u0001\u0000\u0000\u0000\u0328m\u0001\u0000\u0000\u0000\u0329\u032a\u0005"+ + "%\u0000\u0000\u032a\u0337\u0005e\u0000\u0000\u032b\u032c\u0003\u00ccf"+ + "\u0000\u032c\u0331\u0005h\u0000\u0000\u032d\u032f\u0003p8\u0000\u032e"+ + "\u0330\u0005m\u0000\u0000\u032f\u032e\u0001\u0000\u0000\u0000\u032f\u0330"+ + "\u0001\u0000\u0000\u0000\u0330\u0332\u0001\u0000\u0000\u0000\u0331\u032d"+ + "\u0001\u0000\u0000\u0000\u0331\u0332\u0001\u0000\u0000\u0000\u0332\u0333"+ + "\u0001\u0000\u0000\u0000\u0333\u0334\u0005i\u0000\u0000\u0334\u0337\u0001"+ + "\u0000\u0000\u0000\u0335\u0337\u0003\u00a6S\u0000\u0336\u0329\u0001\u0000"+ + "\u0000\u0000\u0336\u032b\u0001\u0000\u0000\u0000\u0336\u0335\u0001\u0000"+ + "\u0000\u0000\u0337o\u0001\u0000\u0000\u0000\u0338\u033d\u0003n7\u0000"+ + "\u0339\u033a\u0005m\u0000\u0000\u033a\u033c\u0003n7\u0000\u033b\u0339"+ + "\u0001\u0000\u0000\u0000\u033c\u033f\u0001\u0000\u0000\u0000\u033d\u033b"+ + "\u0001\u0000\u0000\u0000\u033d\u033e\u0001\u0000\u0000\u0000\u033eq\u0001"+ + "\u0000\u0000\u0000\u033f\u033d\u0001\u0000\u0000\u0000\u0340\u0345\u0005"+ + "h\u0000\u0000\u0341\u0342\u0005;\u0000\u0000\u0342\u0343\u0003\u00e6s"+ + "\u0000\u0343\u0344\u0003\u0172\u00b9\u0000\u0344\u0346\u0001\u0000\u0000"+ + "\u0000\u0345\u0341\u0001\u0000\u0000\u0000\u0345\u0346\u0001\u0000\u0000"+ + "\u0000\u0346\u0348\u0001\u0000\u0000\u0000\u0347\u0349\u0003\u00f2y\u0000"+ + "\u0348\u0347\u0001\u0000\u0000\u0000\u0348\u0349\u0001\u0000\u0000\u0000"+ + "\u0349\u034a\u0001\u0000\u0000\u0000\u034a\u034b\u0005i\u0000\u0000\u034b"+ + "s\u0001\u0000\u0000\u0000\u034c\u034f\u0003\u0152\u00a9\u0000\u034d\u034f"+ + "\u0005e\u0000\u0000\u034e\u034c\u0001\u0000\u0000\u0000\u034e\u034d\u0001"+ + "\u0000\u0000\u0000\u034f\u0358\u0001\u0000\u0000\u0000\u0350\u0355\u0005"+ + "h\u0000\u0000\u0351\u0353\u0003v;\u0000\u0352\u0354\u0005m\u0000\u0000"+ + "\u0353\u0352\u0001\u0000\u0000\u0000\u0353\u0354\u0001\u0000\u0000\u0000"+ + "\u0354\u0356\u0001\u0000\u0000\u0000\u0355\u0351\u0001\u0000\u0000\u0000"+ + "\u0355\u0356\u0001\u0000\u0000\u0000\u0356\u0357\u0001\u0000\u0000\u0000"+ + "\u0357\u0359\u0005i\u0000\u0000\u0358\u0350\u0001\u0000\u0000\u0000\u0358"+ + "\u0359\u0001\u0000\u0000\u0000\u0359u\u0001\u0000\u0000\u0000\u035a\u035f"+ + "\u0003x<\u0000\u035b\u035c\u0005m\u0000\u0000\u035c\u035e\u0003x<\u0000"+ + "\u035d\u035b\u0001\u0000\u0000\u0000\u035e\u0361\u0001\u0000\u0000\u0000"+ + "\u035f\u035d\u0001\u0000\u0000\u0000\u035f\u0360\u0001\u0000\u0000\u0000"+ + "\u0360w\u0001\u0000\u0000\u0000\u0361\u035f\u0001\u0000\u0000\u0000\u0362"+ + "\u0363\u0005e\u0000\u0000\u0363\u0365\u0005o\u0000\u0000\u0364\u0362\u0001"+ + "\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000\u0000\u0365\u0366\u0001"+ + "\u0000\u0000\u0000\u0366\u0367\u0003\u00a6S\u0000\u0367y\u0001\u0000\u0000"+ + "\u0000\u0368\u0369\u0005G\u0000\u0000\u0369\u036a\u0003\u00a6S\u0000\u036a"+ + "\u036b\u0005\u000f\u0000\u0000\u036b\u036c\u0003t:\u0000\u036c\u036d\u0003"+ + "\u00f0x\u0000\u036d{\u0001\u0000\u0000\u0000\u036e\u036f\u0003\u00c4b"+ + "\u0000\u036f\u0370\u0005\u000f\u0000\u0000\u0370\u0383\u0003\u00c4b\u0000"+ + "\u0371\u0377\u0005h\u0000\u0000\u0372\u0373\u0003\u0084B\u0000\u0373\u0374"+ + "\u0003\u0172\u00b9\u0000\u0374\u0376\u0001\u0000\u0000\u0000\u0375\u0372"+ + "\u0001\u0000\u0000\u0000\u0376\u0379\u0001\u0000\u0000\u0000\u0377\u0375"+ + "\u0001\u0000\u0000\u0000\u0377\u0378\u0001\u0000\u0000\u0000\u0378\u037f"+ + "\u0001\u0000\u0000\u0000\u0379\u0377\u0001\u0000\u0000\u0000\u037a\u037b"+ + "\u0003~?\u0000\u037b\u037c\u0003\u0172\u00b9\u0000\u037c\u037e\u0001\u0000"+ + "\u0000\u0000\u037d\u037a\u0001\u0000\u0000\u0000\u037e\u0381\u0001\u0000"+ + "\u0000\u0000\u037f\u037d\u0001\u0000\u0000\u0000\u037f\u0380\u0001\u0000"+ + "\u0000\u0000\u0380\u0382\u0001\u0000\u0000\u0000\u0381\u037f\u0001\u0000"+ + "\u0000\u0000\u0382\u0384\u0005i\u0000\u0000\u0383\u0371\u0001\u0000\u0000"+ + "\u0000\u0383\u0384\u0001\u0000\u0000\u0000\u0384}\u0001\u0000\u0000\u0000"+ + "\u0385\u0387\u0005\u000e\u0000\u0000\u0386\u0385\u0001\u0000\u0000\u0000"+ + "\u0386\u0387\u0001\u0000\u0000\u0000\u0387\u0388\u0001\u0000\u0000\u0000"+ + "\u0388\u0389\u0003\u0080@\u0000\u0389\u038a\u0005e\u0000\u0000\u038a\u038c"+ + "\u0003\u0140\u00a0\u0000\u038b\u038d\u0003\u00f0x\u0000\u038c\u038b\u0001"+ + "\u0000\u0000\u0000\u038c\u038d\u0001\u0000\u0000\u0000\u038d\u007f\u0001"+ + "\u0000\u0000\u0000\u038e\u0390\u0005f\u0000\u0000\u038f\u0391\u0005e\u0000"+ + "\u0000\u0390\u038f\u0001\u0000\u0000\u0000\u0390\u0391\u0001\u0000\u0000"+ + "\u0000\u0391\u0393\u0001\u0000\u0000\u0000\u0392\u0394\u0005\u0087\u0000"+ + "\u0000\u0393\u0392\u0001\u0000\u0000\u0000\u0393\u0394\u0001\u0000\u0000"+ + "\u0000\u0394\u0395\u0001\u0000\u0000\u0000\u0395\u0396\u0003\u012e\u0097"+ + "\u0000\u0396\u0397\u0005g\u0000\u0000\u0397\u0081\u0001\u0000\u0000\u0000"+ + "\u0398\u039e\u0003\u00b6[\u0000\u0399\u039a\u0003\u00c4b\u0000\u039a\u039b"+ + "\u0005p\u0000\u0000\u039b\u039c\u0005e\u0000\u0000\u039c\u039e\u0001\u0000"+ + "\u0000\u0000\u039d\u0398\u0001\u0000\u0000\u0000\u039d\u0399\u0001\u0000"+ + "\u0000\u0000\u039e\u0083\u0001\u0000\u0000\u0000\u039f\u03a0\u00058\u0000"+ + "\u0000\u03a0\u03a1\u0005e\u0000\u0000\u03a1\u03a4\u0005s\u0000\u0000\u03a2"+ + "\u03a5\u0003\u0082A\u0000\u03a3\u03a5\u0003\u0150\u00a8\u0000\u03a4\u03a2"+ + "\u0001\u0000\u0000\u0000\u03a4\u03a3\u0001\u0000\u0000\u0000\u03a5\u0085"+ + "\u0001\u0000\u0000\u0000\u03a6\u03a7\u0005/\u0000\u0000\u03a7\u03a8\u0005"+ + "f\u0000\u0000\u03a8\u03ab\u0003\u00c4b\u0000\u03a9\u03aa\u0005m\u0000"+ + "\u0000\u03aa\u03ac\u0003\u00e8t\u0000\u03ab\u03a9\u0001\u0000\u0000\u0000"+ + "\u03ab\u03ac\u0001\u0000\u0000\u0000\u03ac\u03ad\u0001\u0000\u0000\u0000"+ + "\u03ad\u03ae\u0005g\u0000\u0000\u03ae\u0087\u0001\u0000\u0000\u0000\u03af"+ + "\u03b0\u0005.\u0000\u0000\u03b0\u03b1\u0005f\u0000\u0000\u03b1\u03b2\u0003"+ + "\u00c4b\u0000\u03b2\u03b3\u0005g\u0000\u0000\u03b3\u0089\u0001\u0000\u0000"+ + "\u0000\u03b4\u03b7\u0003`0\u0000\u03b5\u03b8\u0003\u008cF\u0000\u03b6"+ + "\u03b8\u0003\u008eG\u0000\u03b7\u03b5\u0001\u0000\u0000\u0000\u03b7\u03b6"+ + "\u0001\u0000\u0000\u0000\u03b8\u008b\u0001\u0000\u0000\u0000\u03b9\u03ba"+ + "\u0005M\u0000\u0000\u03ba\u03bb\u0005e\u0000\u0000\u03bb\u03bd\u0003\u0140"+ + "\u00a0\u0000\u03bc\u03be\u0003r9\u0000\u03bd\u03bc\u0001\u0000\u0000\u0000"+ + "\u03bd\u03be\u0001\u0000\u0000\u0000\u03be\u008d\u0001\u0000\u0000\u0000"+ + "\u03bf\u03c0\u0005M\u0000\u0000\u03c0\u03c1\u0003\u009cN\u0000\u03c1\u03c2"+ + "\u0005e\u0000\u0000\u03c2\u03c4\u0003\u0140\u00a0\u0000\u03c3\u03c5\u0003"+ + "r9\u0000\u03c4\u03c3\u0001\u0000\u0000\u0000\u03c4\u03c5\u0001\u0000\u0000"+ + "\u0000\u03c5\u008f\u0001\u0000\u0000\u0000\u03c6\u03c9\u0005\u001b\u0000"+ + "\u0000\u03c7\u03ca\u0003\u008aE\u0000\u03c8\u03ca\u0003\u00e0p\u0000\u03c9"+ + "\u03c7\u0001\u0000\u0000\u0000\u03c9\u03c8\u0001\u0000\u0000\u0000\u03ca"+ + "\u0091\u0001\u0000\u0000\u0000\u03cb\u03cc\u00058\u0000\u0000\u03cc\u03cd"+ + "\u0005e\u0000\u0000\u03cd\u03cf\u0003\u0144\u00a2\u0000\u03ce\u03d0\u0003"+ + "\u0094J\u0000\u03cf\u03ce\u0001\u0000\u0000\u0000\u03cf\u03d0\u0001\u0000"+ + "\u0000\u0000\u03d0\u0093\u0001\u0000\u0000\u0000\u03d1\u03d2\u0005h\u0000"+ + "\u0000\u03d2\u03d3\u0003\u00a6S\u0000\u03d3\u03d4\u0003\u0172\u00b9\u0000"+ + "\u03d4\u03d5\u0005i\u0000\u0000\u03d5\u0095\u0001\u0000\u0000\u0000\u03d6"+ + "\u03d7\u00058\u0000\u0000\u03d7\u03d8\u0003\u009cN\u0000\u03d8\u03d9\u0005"+ + "e\u0000\u0000\u03d9\u03db\u0003\u0144\u00a2\u0000\u03da\u03dc\u0003\u0094"+ + "J\u0000\u03db\u03da\u0001\u0000\u0000\u0000\u03db\u03dc\u0001\u0000\u0000"+ + "\u0000\u03dc\u0097\u0001\u0000\u0000\u0000\u03dd\u03e5\u0003\u0006\u0003"+ + "\u0000\u03de\u03e1\u0003\u00c4b\u0000\u03df\u03e0\u0005l\u0000\u0000\u03e0"+ + "\u03e2\u0003\u00e8t\u0000\u03e1\u03df\u0001\u0000\u0000\u0000\u03e1\u03e2"+ + "\u0001\u0000\u0000\u0000\u03e2\u03e6\u0001\u0000\u0000\u0000\u03e3\u03e4"+ + "\u0005l\u0000\u0000\u03e4\u03e6\u0003\u00e8t\u0000\u03e5\u03de\u0001\u0000"+ + "\u0000\u0000\u03e5\u03e3\u0001\u0000\u0000\u0000\u03e6\u0099\u0001\u0000"+ + "\u0000\u0000\u03e7\u03e8\u0003\u0006\u0003\u0000\u03e8\u03e9\u0005s\u0000"+ + "\u0000\u03e9\u03ea\u0003\u00e8t\u0000\u03ea\u009b\u0001\u0000\u0000\u0000"+ + "\u03eb\u03ed\u0005f\u0000\u0000\u03ec\u03ee\u0003\b\u0004\u0000\u03ed"+ + "\u03ec\u0001\u0000\u0000\u0000\u03ed\u03ee\u0001\u0000\u0000\u0000\u03ee"+ + "\u03ef\u0001\u0000\u0000\u0000\u03ef\u03f1\u0003\u00c4b\u0000\u03f0\u03f2"+ + "\u0005m\u0000\u0000\u03f1\u03f0\u0001\u0000\u0000\u0000\u03f1\u03f2\u0001"+ + "\u0000\u0000\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000\u03f3\u03f4\u0005"+ + "g\u0000\u0000\u03f4\u009d\u0001\u0000\u0000\u0000\u03f5\u03f8\u0003\u00a0"+ + "P\u0000\u03f6\u03f8\u0003\u00a2Q\u0000\u03f7\u03f5\u0001\u0000\u0000\u0000"+ + "\u03f7\u03f6\u0001\u0000\u0000\u0000\u03f8\u009f\u0001\u0000\u0000\u0000"+ + "\u03f9\u03fb\u0003\u00e6s\u0000\u03fa\u03f9\u0001\u0000\u0000\u0000\u03fa"+ + "\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0001\u0000\u0000\u0000\u03fc"+ + "\u03fd\u0003\u00a4R\u0000\u03fd\u00a1\u0001\u0000\u0000\u0000\u03fe\u0400"+ + "\u0005\u001b\u0000\u0000\u03ff\u0401\u0003\u00e6s\u0000\u0400\u03ff\u0001"+ + "\u0000\u0000\u0000\u0400\u0401\u0001\u0000\u0000\u0000\u0401\u0402\u0001"+ + "\u0000\u0000\u0000\u0402\u0403\u0003\u00a4R\u0000\u0403\u00a3\u0001\u0000"+ + "\u0000\u0000\u0404\u0406\u0005t\u0000\u0000\u0405\u0404\u0001\u0000\u0000"+ + "\u0000\u0405\u0406\u0001\u0000\u0000\u0000\u0406\u0407\u0001\u0000\u0000"+ + "\u0000\u0407\u0408\u0003\u00c4b\u0000\u0408\u00a5\u0001\u0000\u0000\u0000"+ + "\u0409\u040a\u0006S\uffff\uffff\u0000\u040a\u040b\u0007\u0006\u0000\u0000"+ + "\u040b\u041f\u0003\u00a6S\u000f\u040c\u041f\u0003\u00b6[\u0000\u040d\u040e"+ + "\u0005\u0019\u0000\u0000\u040e\u040f\u0003.\u0017\u0000\u040f\u0410\u0005"+ + "\u001c\u0000\u0000\u0410\u0411\u0003\u00a6S\u0003\u0411\u041f\u0001\u0000"+ + "\u0000\u0000\u0412\u0413\u0005\u001a\u0000\u0000\u0413\u0414\u0003\u009a"+ + "M\u0000\u0414\u0415\u0005\u001c\u0000\u0000\u0415\u0416\u0003\u00a6S\u0002"+ + "\u0416\u041f\u0001\u0000\u0000\u0000\u0417\u0418\u0007\u0007\u0000\u0000"+ + "\u0418\u0419\u0003&\u0013\u0000\u0419\u041a\u0005o\u0000\u0000\u041a\u041b"+ + "\u0005o\u0000\u0000\u041b\u041c\u0003*\u0015\u0000\u041c\u041d\u0003\u00a6"+ + "S\u0001\u041d\u041f\u0001\u0000\u0000\u0000\u041e\u0409\u0001\u0000\u0000"+ + "\u0000\u041e\u040c\u0001\u0000\u0000\u0000\u041e\u040d\u0001\u0000\u0000"+ + "\u0000\u041e\u0412\u0001\u0000\u0000\u0000\u041e\u0417\u0001\u0000\u0000"+ + "\u0000\u041f\u0443\u0001\u0000\u0000\u0000\u0420\u0421\n\r\u0000\u0000"+ + "\u0421\u0422\u0007\b\u0000\u0000\u0422\u0442\u0003\u00a6S\u000e\u0423"+ + "\u0424\n\f\u0000\u0000\u0424\u0425\u0007\t\u0000\u0000\u0425\u0442\u0003"+ + "\u00a6S\r\u0426\u0427\n\u000b\u0000\u0000\u0427\u0428\u0007\n\u0000\u0000"+ + "\u0428\u0442\u0003\u00a6S\f\u0429\u042a\n\n\u0000\u0000\u042a\u042b\u0007"+ + "\u000b\u0000\u0000\u042b\u0442\u0003\u00a6S\u000b\u042c\u042d\n\t\u0000"+ + "\u0000\u042d\u042e\u0007\f\u0000\u0000\u042e\u0442\u0003\u00a6S\n\u042f"+ + "\u0430\n\u0007\u0000\u0000\u0430\u0431\u0005v\u0000\u0000\u0431\u0442"+ + "\u0003\u00a6S\b\u0432\u0433\n\u0006\u0000\u0000\u0433\u0434\u0005u\u0000"+ + "\u0000\u0434\u0442\u0003\u00a6S\u0007\u0435\u0436\n\u0005\u0000\u0000"+ + "\u0436\u0437\u0005\"\u0000\u0000\u0437\u0442\u0003\u00a6S\u0005\u0438"+ + "\u0439\n\u0004\u0000\u0000\u0439\u043a\u0005%\u0000\u0000\u043a\u043b"+ + "\u0003\u00a6S\u0000\u043b\u043c\u0005o\u0000\u0000\u043c\u043d\u0003\u00a6"+ + "S\u0004\u043d\u0442\u0001\u0000\u0000\u0000\u043e\u043f\n\b\u0000\u0000"+ + "\u043f\u0440\u0005\u000f\u0000\u0000\u0440\u0442\u0003t:\u0000\u0441\u0420"+ + "\u0001\u0000\u0000\u0000\u0441\u0423\u0001\u0000\u0000\u0000\u0441\u0426"+ + "\u0001\u0000\u0000\u0000\u0441\u0429\u0001\u0000\u0000\u0000\u0441\u042c"+ + "\u0001\u0000\u0000\u0000\u0441\u042f\u0001\u0000\u0000\u0000\u0441\u0432"+ + "\u0001\u0000\u0000\u0000\u0441\u0435\u0001\u0000\u0000\u0000\u0441\u0438"+ + "\u0001\u0000\u0000\u0000\u0441\u043e\u0001\u0000\u0000\u0000\u0442\u0445"+ + "\u0001\u0000\u0000\u0000\u0443\u0441\u0001\u0000\u0000\u0000\u0443\u0444"+ + "\u0001\u0000\u0000\u0000\u0444\u00a7\u0001\u0000\u0000\u0000\u0445\u0443"+ + "\u0001\u0000\u0000\u0000\u0446\u045b\u0003\u0018\f\u0000\u0447\u045b\u0003"+ + "\u001a\r\u0000\u0448\u045b\u0003\u00acV\u0000\u0449\u045b\u0003\u00aa"+ + "U\u0000\u044a\u045b\u0003\u00e0p\u0000\u044b\u045b\u0003\u0100\u0080\u0000"+ + "\u044c\u045b\u0003\u00f4z\u0000\u044d\u045b\u0003\u012c\u0096\u0000\u044e"+ + "\u045b\u0003\u0102\u0081\u0000\u044f\u045b\u0003\u0104\u0082\u0000\u0450"+ + "\u045b\u0003\u0106\u0083\u0000\u0451\u045b\u0003\u0108\u0084\u0000\u0452"+ + "\u045b\u0003\u010a\u0085\u0000\u0453\u045b\u0003\u00f0x\u0000\u0454\u045b"+ + "\u0003\u010c\u0086\u0000\u0455\u045b\u0003\u010e\u0087\u0000\u0456\u045b"+ + "\u0003\u0120\u0090\u0000\u0457\u045b\u0003\u00aeW\u0000\u0458\u045b\u0003"+ + "\u00b2Y\u0000\u0459\u045b\u0003z=\u0000\u045a\u0446\u0001\u0000\u0000"+ + "\u0000\u045a\u0447\u0001\u0000\u0000\u0000\u045a\u0448\u0001\u0000\u0000"+ + "\u0000\u045a\u0449\u0001\u0000\u0000\u0000\u045a\u044a\u0001\u0000\u0000"+ + "\u0000\u045a\u044b\u0001\u0000\u0000\u0000\u045a\u044c\u0001\u0000\u0000"+ + "\u0000\u045a\u044d\u0001\u0000\u0000\u0000\u045a\u044e\u0001\u0000\u0000"+ + "\u0000\u045a\u044f\u0001\u0000\u0000\u0000\u045a\u0450\u0001\u0000\u0000"+ + "\u0000\u045a\u0451\u0001\u0000\u0000\u0000\u045a\u0452\u0001\u0000\u0000"+ + "\u0000\u045a\u0453\u0001\u0000\u0000\u0000\u045a\u0454\u0001\u0000\u0000"+ + "\u0000\u045a\u0455\u0001\u0000\u0000\u0000\u045a\u0456\u0001\u0000\u0000"+ + "\u0000\u045a\u0457\u0001\u0000\u0000\u0000\u045a\u0458\u0001\u0000\u0000"+ + "\u0000\u045a\u0459\u0001\u0000\u0000\u0000\u045b\u00a9\u0001\u0000\u0000"+ + "\u0000\u045c\u045d\u0005$\u0000\u0000\u045d\u045e\u0003\u00a6S\u0000\u045e"+ + "\u00ab\u0001\u0000\u0000\u0000\u045f\u0460\u0005X\u0000\u0000\u0460\u0462"+ + "\u0003\u00a6S\u0000\u0461\u0463\u0003\u00f0x\u0000\u0462\u0461\u0001\u0000"+ + "\u0000\u0000\u0462\u0463\u0001\u0000\u0000\u0000\u0463\u00ad\u0001\u0000"+ + "\u0000\u0000\u0464\u0465\u0003\u00b0X\u0000\u0465\u0466\u0003\u0128\u0094"+ + "\u0000\u0466\u00af\u0001\u0000\u0000\u0000\u0467\u0468\u0005\f\u0000\u0000"+ + "\u0468\u0469\u0003\u00a6S\u0000\u0469\u046a\u0003\u0172\u00b9\u0000\u046a"+ + "\u046c\u0001\u0000\u0000\u0000\u046b\u0467\u0001\u0000\u0000\u0000\u046c"+ + "\u046f\u0001\u0000\u0000\u0000\u046d\u046b\u0001\u0000\u0000\u0000\u046d"+ + "\u046e\u0001\u0000\u0000\u0000\u046e\u0474\u0001\u0000\u0000\u0000\u046f"+ + "\u046d\u0001\u0000\u0000\u0000\u0470\u0471\u0005\r\u0000\u0000\u0471\u0472"+ + "\u0003d2\u0000\u0472\u0473\u0003\u0172\u00b9\u0000\u0473\u0475\u0001\u0000"+ + "\u0000\u0000\u0474\u0470\u0001\u0000\u0000\u0000\u0474\u0475\u0001\u0000"+ + "\u0000\u0000\u0475\u00b1\u0001\u0000\u0000\u0000\u0476\u0477\u0005Q\u0000"+ + "\u0000\u0477\u047c\u0003\u00a6S\u0000\u0478\u0479\u0005Q\u0000\u0000\u0479"+ + "\u047a\u0007\u0001\u0000\u0000\u047a\u047c\u0003.\u0017\u0000\u047b\u0476"+ + "\u0001\u0000\u0000\u0000\u047b\u0478\u0001\u0000\u0000\u0000\u047c\u00b3"+ + "\u0001\u0000\u0000\u0000\u047d\u0486\u0005\u0003\u0000\u0000\u047e\u0486"+ + "\u0005\u0004\u0000\u0000\u047f\u0486\u0005d\u0000\u0000\u0480\u0486\u0003"+ + "\u014e\u00a7\u0000\u0481\u0486\u0003\u0164\u00b2\u0000\u0482\u0486\u0005"+ + "\u0001\u0000\u0000\u0483\u0486\u0005\u008f\u0000\u0000\u0484\u0486\u0005"+ + "\u0090\u0000\u0000\u0485\u047d\u0001\u0000\u0000\u0000\u0485\u047e\u0001"+ + "\u0000\u0000\u0000\u0485\u047f\u0001\u0000\u0000\u0000\u0485\u0480\u0001"+ + "\u0000\u0000\u0000\u0485\u0481\u0001\u0000\u0000\u0000\u0485\u0482\u0001"+ + "\u0000\u0000\u0000\u0485\u0483\u0001\u0000\u0000\u0000\u0485\u0484\u0001"+ + "\u0000\u0000\u0000\u0486\u00b5\u0001\u0000\u0000\u0000\u0487\u0488\u0006"+ + "[\uffff\uffff\u0000\u0488\u0494\u0003\u014a\u00a5\u0000\u0489\u0494\u0003"+ + "\u0146\u00a3\u0000\u048a\u0494\u0003\u016e\u00b7\u0000\u048b\u0494\u0003"+ + " \u0010\u0000\u048c\u0494\u0003\u0088D\u0000\u048d\u0494\u0003\u0086C"+ + "\u0000\u048e\u048f\u0007\r\u0000\u0000\u048f\u0490\u0005f\u0000\u0000"+ + "\u0490\u0491\u0003\u00a6S\u0000\u0491\u0492\u0005g\u0000\u0000\u0492\u0494"+ + "\u0001\u0000\u0000\u0000\u0493\u0487\u0001\u0000\u0000\u0000\u0493\u0489"+ + "\u0001\u0000\u0000\u0000\u0493\u048a\u0001\u0000\u0000\u0000\u0493\u048b"+ + "\u0001\u0000\u0000\u0000\u0493\u048c\u0001\u0000\u0000\u0000\u0493\u048d"+ + "\u0001\u0000\u0000\u0000\u0493\u048e\u0001\u0000\u0000\u0000\u0494\u04ab"+ + "\u0001\u0000\u0000\u0000\u0495\u0496\n\t\u0000\u0000\u0496\u0497\u0005"+ + "p\u0000\u0000\u0497\u04aa\u0005e\u0000\u0000\u0498\u0499\n\b\u0000\u0000"+ + "\u0499\u04aa\u0003\u0168\u00b4\u0000\u049a\u049b\n\u0007\u0000\u0000\u049b"+ + "\u04aa\u0003\u00d0h\u0000\u049c\u049d\n\u0006\u0000\u0000\u049d\u04aa"+ + "\u0003L&\u0000\u049e\u049f\n\u0005\u0000\u0000\u049f\u04aa\u0003\u016a"+ + "\u00b5\u0000\u04a0\u04a1\n\u0004\u0000\u0000\u04a1\u04aa\u0003\u016c\u00b6"+ + "\u0000\u04a2\u04a3\n\u0003\u0000\u0000\u04a3\u04a4\u0003\u016c\u00b6\u0000"+ + "\u04a4\u04a5\u0005\u0010\u0000\u0000\u04a5\u04a6\u0003t:\u0000\u04a6\u04aa"+ + "\u0001\u0000\u0000\u0000\u04a7\u04a8\n\u0002\u0000\u0000\u04a8\u04aa\u0003"+ + "\u00bc^\u0000\u04a9\u0495\u0001\u0000\u0000\u0000\u04a9\u0498\u0001\u0000"+ + "\u0000\u0000\u04a9\u049a\u0001\u0000\u0000\u0000\u04a9\u049c\u0001\u0000"+ + "\u0000\u0000\u04a9\u049e\u0001\u0000\u0000\u0000\u04a9\u04a0\u0001\u0000"+ + "\u0000\u0000\u04a9\u04a2\u0001\u0000\u0000\u0000\u04a9\u04a7\u0001\u0000"+ + "\u0000\u0000\u04aa\u04ad\u0001\u0000\u0000\u0000\u04ab\u04a9\u0001\u0000"+ + "\u0000\u0000\u04ab\u04ac\u0001\u0000\u0000\u0000\u04ac\u00b7\u0001\u0000"+ + "\u0000\u0000\u04ad\u04ab\u0001\u0000\u0000\u0000\u04ae\u04af\u0003`0\u0000"+ + "\u04af\u04b0\u0003\u00ba]\u0000\u04b0\u00b9\u0001\u0000\u0000\u0000\u04b1"+ + "\u04b3\u0005M\u0000\u0000\u04b2\u04b4\u0005e\u0000\u0000\u04b3\u04b2\u0001"+ + "\u0000\u0000\u0000\u04b3\u04b4\u0001\u0000\u0000\u0000\u04b4\u04b5\u0001"+ + "\u0000\u0000\u0000\u04b5\u04b7\u0003\u0140\u00a0\u0000\u04b6\u04b8\u0003"+ + "r9\u0000\u04b7\u04b6\u0001\u0000\u0000\u0000\u04b7\u04b8\u0001\u0000\u0000"+ + "\u0000\u04b8\u00bb\u0001\u0000\u0000\u0000\u04b9\u04bb\u0005&\u0000\u0000"+ + "\u04ba\u04bc\u0003\u00e8t\u0000\u04bb\u04ba\u0001\u0000\u0000\u0000\u04bb"+ + "\u04bc\u0001\u0000\u0000\u0000\u04bc\u04be\u0001\u0000\u0000\u0000\u04bd"+ + "\u04bf\u0005m\u0000\u0000\u04be\u04bd\u0001\u0000\u0000\u0000\u04be\u04bf"+ + "\u0001\u0000\u0000\u0000\u04bf\u04c0\u0001\u0000\u0000\u0000\u04c0\u04c1"+ + "\u0005\'\u0000\u0000\u04c1\u00bd\u0001\u0000\u0000\u0000\u04c2\u04c3\u0005"+ + "N\u0000\u0000\u04c3\u04cd\u0005h\u0000\u0000\u04c4\u04c8\u0003\u00c2a"+ + "\u0000\u04c5\u04c8\u0003\u012e\u0097\u0000\u04c6\u04c8\u0003\u00c0`\u0000"+ + "\u04c7\u04c4\u0001\u0000\u0000\u0000\u04c7\u04c5\u0001\u0000\u0000\u0000"+ + "\u04c7\u04c6\u0001\u0000\u0000\u0000\u04c8\u04c9\u0001\u0000\u0000\u0000"+ + "\u04c9\u04ca\u0003\u0172\u00b9\u0000\u04ca\u04cc\u0001\u0000\u0000\u0000"+ + "\u04cb\u04c7\u0001\u0000\u0000\u0000\u04cc\u04cf\u0001\u0000\u0000\u0000"+ + "\u04cd\u04cb\u0001\u0000\u0000\u0000\u04cd\u04ce\u0001\u0000\u0000\u0000"+ + "\u04ce\u04d0\u0001\u0000\u0000\u0000\u04cf\u04cd\u0001\u0000\u0000\u0000"+ + "\u04d0\u04d1\u0005i\u0000\u0000\u04d1\u00bf\u0001\u0000\u0000\u0000\u04d2"+ + "\u04d3\u00058\u0000\u0000\u04d3\u04d4\u0005e\u0000\u0000\u04d4\u04d5\u0003"+ + "\u0144\u00a2\u0000\u04d5\u00c1\u0001\u0000\u0000\u0000\u04d6\u04d8\u0005"+ + "\u001b\u0000\u0000\u04d7\u04d6\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001"+ + "\u0000\u0000\u0000\u04d8\u04d9\u0001\u0000\u0000\u0000\u04d9\u04da\u0003"+ + "`0\u0000\u04da\u04db\u0005e\u0000\u0000\u04db\u04dc\u0003\u0144\u00a2"+ + "\u0000\u04dc\u04dd\u0003\u0142\u00a1\u0000\u04dd\u04e6\u0001\u0000\u0000"+ + "\u0000\u04de\u04e0\u0005\u001b\u0000\u0000\u04df\u04de\u0001\u0000\u0000"+ + "\u0000\u04df\u04e0\u0001\u0000\u0000\u0000\u04e0\u04e1\u0001\u0000\u0000"+ + "\u0000\u04e1\u04e2\u0003`0\u0000\u04e2\u04e3\u0005e\u0000\u0000\u04e3"+ + "\u04e4\u0003\u0144\u00a2\u0000\u04e4\u04e6\u0001\u0000\u0000\u0000\u04e5"+ + "\u04d7\u0001\u0000\u0000\u0000\u04e5\u04df\u0001\u0000\u0000\u0000\u04e6"+ + "\u00c3\u0001\u0000\u0000\u0000\u04e7\u04ef\u0003\u012e\u0097\u0000\u04e8"+ + "\u04ef\u0003\u00c6c\u0000\u04e9\u04ef\u0003P(\u0000\u04ea\u04eb\u0005"+ + "f\u0000\u0000\u04eb\u04ec\u0003\u00c4b\u0000\u04ec\u04ed\u0005g\u0000"+ + "\u0000\u04ed\u04ef\u0001\u0000\u0000\u0000\u04ee\u04e7\u0001\u0000\u0000"+ + "\u0000\u04ee\u04e8\u0001\u0000\u0000\u0000\u04ee\u04e9\u0001\u0000\u0000"+ + "\u0000\u04ee\u04ea\u0001\u0000\u0000\u0000\u04ef\u00c5\u0001\u0000\u0000"+ + "\u0000\u04f0\u04fa\u0003\u0130\u0098\u0000\u04f1\u04fa\u0003\u0160\u00b0"+ + "\u0000\u04f2\u04fa\u0003\u0136\u009b\u0000\u04f3\u04fa\u0003\u013e\u009f"+ + "\u0000\u04f4\u04fa\u0003\u00be_\u0000\u04f5\u04fa\u0003\u0138\u009c\u0000"+ + "\u04f6\u04fa\u0003\u013a\u009d\u0000\u04f7\u04fa\u0003\u013c\u009e\u0000"+ + "\u04f8\u04fa\u0003\u00c8d\u0000\u04f9\u04f0\u0001\u0000\u0000\u0000\u04f9"+ + "\u04f1\u0001\u0000\u0000\u0000\u04f9\u04f2\u0001\u0000\u0000\u0000\u04f9"+ + "\u04f3\u0001\u0000\u0000\u0000\u04f9\u04f4\u0001\u0000\u0000\u0000\u04f9"+ + "\u04f5\u0001\u0000\u0000\u0000\u04f9\u04f6\u0001\u0000\u0000\u0000\u04f9"+ + "\u04f7\u0001\u0000\u0000\u0000\u04f9\u04f8\u0001\u0000\u0000\u0000\u04fa"+ + "\u00c7\u0001\u0000\u0000\u0000\u04fb\u04fc\u00058\u0000\u0000\u04fc\u04fd"+ + "\u0003\u00cae\u0000\u04fd\u00c9\u0001\u0000\u0000\u0000\u04fe\u050a\u0005"+ + "f\u0000\u0000\u04ff\u0504\u0003\u00c4b\u0000\u0500\u0501\u0005m\u0000"+ + "\u0000\u0501\u0503\u0003\u00c4b\u0000\u0502\u0500\u0001\u0000\u0000\u0000"+ + "\u0503\u0506\u0001\u0000\u0000\u0000\u0504\u0502\u0001\u0000\u0000\u0000"+ + "\u0504\u0505\u0001\u0000\u0000\u0000\u0505\u0508\u0001\u0000\u0000\u0000"+ + "\u0506\u0504\u0001\u0000\u0000\u0000\u0507\u0509\u0005m\u0000\u0000\u0508"+ + "\u0507\u0001\u0000\u0000\u0000\u0508\u0509\u0001\u0000\u0000\u0000\u0509"+ + "\u050b\u0001\u0000\u0000\u0000\u050a\u04ff\u0001\u0000\u0000\u0000\u050a"+ + "\u050b\u0001\u0000\u0000\u0000\u050b\u050c\u0001\u0000\u0000\u0000\u050c"+ + "\u050d\u0005g\u0000\u0000\u050d\u00cb\u0001\u0000\u0000\u0000\u050e\u0516"+ + "\u0003\u0160\u00b0\u0000\u050f\u0516\u0003\u0130\u0098\u0000\u0510\u0516"+ + "\u0003\u00ceg\u0000\u0511\u0516\u0003\u0138\u009c\u0000\u0512\u0516\u0003"+ + "\u013a\u009d\u0000\u0513\u0516\u0003P(\u0000\u0514\u0516\u0003\u012e\u0097"+ + "\u0000\u0515\u050e\u0001\u0000\u0000\u0000\u0515\u050f\u0001\u0000\u0000"+ + "\u0000\u0515\u0510\u0001\u0000\u0000\u0000\u0515\u0511\u0001\u0000\u0000"+ + "\u0000\u0515\u0512\u0001\u0000\u0000\u0000\u0515\u0513\u0001\u0000\u0000"+ + "\u0000\u0515\u0514\u0001\u0000\u0000\u0000\u0516\u00cd\u0001\u0000\u0000"+ + "\u0000\u0517\u0518\u0005j\u0000\u0000\u0518\u0519\u0005t\u0000\u0000\u0519"+ + "\u051a\u0005k\u0000\u0000\u051a\u051b\u0003\u0134\u009a\u0000\u051b\u00cf"+ + "\u0001\u0000\u0000\u0000\u051c\u052c\u0005j\u0000\u0000\u051d\u051f\u0003"+ + "\u00d2i\u0000\u051e\u051d\u0001\u0000\u0000\u0000\u051e\u051f\u0001\u0000"+ + "\u0000\u0000\u051f\u0520\u0001\u0000\u0000\u0000\u0520\u0522\u0005o\u0000"+ + "\u0000\u0521\u0523\u0003\u00d4j\u0000\u0522\u0521\u0001\u0000\u0000\u0000"+ + "\u0522\u0523\u0001\u0000\u0000\u0000\u0523\u052d\u0001\u0000\u0000\u0000"+ + "\u0524\u0526\u0003\u00d2i\u0000\u0525\u0524\u0001\u0000\u0000\u0000\u0525"+ + "\u0526\u0001\u0000\u0000\u0000\u0526\u0527\u0001\u0000\u0000\u0000\u0527"+ + "\u0528\u0005o\u0000\u0000\u0528\u0529\u0003\u00d4j\u0000\u0529\u052a\u0005"+ + "o\u0000\u0000\u052a\u052b\u0003\u00d6k\u0000\u052b\u052d\u0001\u0000\u0000"+ + "\u0000\u052c\u051e\u0001\u0000\u0000\u0000\u052c\u0525\u0001\u0000\u0000"+ + "\u0000\u052d\u052e\u0001\u0000\u0000\u0000\u052e\u052f\u0005k\u0000\u0000"+ + "\u052f\u00d1\u0001\u0000\u0000\u0000\u0530\u0531\u0003\u00a6S\u0000\u0531"+ + "\u00d3\u0001\u0000\u0000\u0000\u0532\u0533\u0003\u00a6S\u0000\u0533\u00d5"+ + "\u0001\u0000\u0000\u0000\u0534\u0535\u0003\u00a6S\u0000\u0535\u00d7\u0001"+ + "\u0000\u0000\u0000\u0536\u0538\u0007\u000e\u0000\u0000\u0537\u0536\u0001"+ + "\u0000\u0000\u0000\u0537\u0538\u0001\u0000\u0000\u0000\u0538\u0539\u0001"+ + "\u0000\u0000\u0000\u0539\u053a\u0005l\u0000\u0000\u053a\u00d9\u0001\u0000"+ + "\u0000\u0000\u053b\u053c\u0003\u00e8t\u0000\u053c\u053d\u0005l\u0000\u0000"+ + "\u053d\u0542\u0001\u0000\u0000\u0000\u053e\u053f\u0003\u0006\u0003\u0000"+ + "\u053f\u0540\u0005s\u0000\u0000\u0540\u0542\u0001\u0000\u0000\u0000\u0541"+ + "\u053b\u0001\u0000\u0000\u0000\u0541\u053e\u0001\u0000\u0000\u0000\u0541"+ + "\u0542\u0001\u0000\u0000\u0000\u0542\u0543\u0001\u0000\u0000\u0000\u0543"+ + "\u0544\u0005]\u0000\u0000\u0544\u0549\u0003\u00a6S\u0000\u0545\u0547\u0005"+ + "J\u0000\u0000\u0546\u0548\u0005e\u0000\u0000\u0547\u0546\u0001\u0000\u0000"+ + "\u0000\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u054a\u0001\u0000\u0000"+ + "\u0000\u0549\u0545\u0001\u0000\u0000\u0000\u0549\u054a\u0001\u0000\u0000"+ + "\u0000\u054a\u00db\u0001\u0000\u0000\u0000\u054b\u054c\u0005X\u0000\u0000"+ + "\u054c\u054d\u0005e\u0000\u0000\u054d\u00dd\u0001\u0000\u0000\u0000\u054e"+ + "\u054f\u0003\u0164\u00b2\u0000\u054f\u00df\u0001\u0000\u0000\u0000\u0550"+ + "\u0554\u0003\u00e2q\u0000\u0551\u0554\u0003\u00eau\u0000\u0552\u0554\u0003"+ + "\u00eew\u0000\u0553\u0550\u0001\u0000\u0000\u0000\u0553\u0551\u0001\u0000"+ + "\u0000\u0000\u0553\u0552\u0001\u0000\u0000\u0000\u0554\u00e1\u0001\u0000"+ + "\u0000\u0000\u0555\u0561\u0005Z\u0000\u0000\u0556\u0562\u0003\u00e4r\u0000"+ + "\u0557\u055d\u0005f\u0000\u0000\u0558\u0559\u0003\u00e4r\u0000\u0559\u055a"+ + "\u0003\u0172\u00b9\u0000\u055a\u055c\u0001\u0000\u0000\u0000\u055b\u0558"+ + "\u0001\u0000\u0000\u0000\u055c\u055f\u0001\u0000\u0000\u0000\u055d\u055b"+ + "\u0001\u0000\u0000\u0000\u055d\u055e\u0001\u0000\u0000\u0000\u055e\u0560"+ + "\u0001\u0000\u0000\u0000\u055f\u055d\u0001\u0000\u0000\u0000\u0560\u0562"+ + "\u0005g\u0000\u0000\u0561\u0556\u0001\u0000\u0000\u0000\u0561\u0557\u0001"+ + "\u0000\u0000\u0000\u0562\u00e3\u0001\u0000\u0000\u0000\u0563\u0569\u0003"+ + "\u00e6s\u0000\u0564\u0566\u0003\u00c4b\u0000\u0565\u0564\u0001\u0000\u0000"+ + "\u0000\u0565\u0566\u0001\u0000\u0000\u0000\u0566\u0567\u0001\u0000\u0000"+ + "\u0000\u0567\u0568\u0005l\u0000\u0000\u0568\u056a\u0003\u00e8t\u0000\u0569"+ + "\u0565\u0001\u0000\u0000\u0000\u0569\u056a\u0001\u0000\u0000\u0000\u056a"+ + "\u00e5\u0001\u0000\u0000\u0000\u056b\u0570\u0005e\u0000\u0000\u056c\u056d"+ + "\u0005m\u0000\u0000\u056d\u056f\u0005e\u0000\u0000\u056e\u056c\u0001\u0000"+ + "\u0000\u0000\u056f\u0572\u0001\u0000\u0000\u0000\u0570\u056e\u0001\u0000"+ + "\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u00e7\u0001\u0000"+ + "\u0000\u0000\u0572\u0570\u0001\u0000\u0000\u0000\u0573\u0578\u0003\u00a6"+ + "S\u0000\u0574\u0575\u0005m\u0000\u0000\u0575\u0577\u0003\u00a6S\u0000"+ + "\u0576\u0574\u0001\u0000\u0000\u0000\u0577\u057a\u0001\u0000\u0000\u0000"+ + "\u0578\u0576\u0001\u0000\u0000\u0000\u0578\u0579\u0001\u0000\u0000\u0000"+ + "\u0579\u00e9\u0001\u0000\u0000\u0000\u057a\u0578\u0001\u0000\u0000\u0000"+ + "\u057b\u0587\u0005^\u0000\u0000\u057c\u0588\u0003\u00ecv\u0000\u057d\u0583"+ + "\u0005f\u0000\u0000\u057e\u057f\u0003\u00ecv\u0000\u057f\u0580\u0003\u0172"+ + "\u00b9\u0000\u0580\u0582\u0001\u0000\u0000\u0000\u0581\u057e\u0001\u0000"+ + "\u0000\u0000\u0582\u0585\u0001\u0000\u0000\u0000\u0583\u0581\u0001\u0000"+ + "\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584\u0586\u0001\u0000"+ + "\u0000\u0000\u0585\u0583\u0001\u0000\u0000\u0000\u0586\u0588\u0005g\u0000"+ + "\u0000\u0587\u057c\u0001\u0000\u0000\u0000\u0587\u057d\u0001\u0000\u0000"+ + "\u0000\u0588\u00eb\u0001\u0000\u0000\u0000\u0589\u058b\u0005e\u0000\u0000"+ + "\u058a\u058c\u0005l\u0000\u0000\u058b\u058a\u0001\u0000\u0000\u0000\u058b"+ + "\u058c\u0001\u0000\u0000\u0000\u058c\u058d\u0001\u0000\u0000\u0000\u058d"+ + "\u058e\u0003\u00c4b\u0000\u058e\u00ed\u0001\u0000\u0000\u0000\u058f\u059b"+ + "\u0005c\u0000\u0000\u0590\u059c\u0003\u0098L\u0000\u0591\u0597\u0005f"+ + "\u0000\u0000\u0592\u0593\u0003\u0098L\u0000\u0593\u0594\u0003\u0172\u00b9"+ + "\u0000\u0594\u0596\u0001\u0000\u0000\u0000\u0595\u0592\u0001\u0000\u0000"+ + "\u0000\u0596\u0599\u0001\u0000\u0000\u0000\u0597\u0595\u0001\u0000\u0000"+ + "\u0000\u0597\u0598\u0001\u0000\u0000\u0000\u0598\u059a\u0001\u0000\u0000"+ + "\u0000\u0599\u0597\u0001\u0000\u0000\u0000\u059a\u059c\u0005g\u0000\u0000"+ + "\u059b\u0590\u0001\u0000\u0000\u0000\u059b\u0591\u0001\u0000\u0000\u0000"+ + "\u059c\u00ef\u0001\u0000\u0000\u0000\u059d\u059f\u0005h\u0000\u0000\u059e"+ + "\u05a0\u0003\u00f2y\u0000\u059f\u059e\u0001\u0000\u0000\u0000\u059f\u05a0"+ + "\u0001\u0000\u0000\u0000\u05a0\u05a1\u0001\u0000\u0000\u0000\u05a1\u05a2"+ + "\u0005i\u0000\u0000\u05a2\u00f1\u0001\u0000\u0000\u0000\u05a3\u05a5\u0005"+ + "n\u0000\u0000\u05a4\u05a3\u0001\u0000\u0000\u0000\u05a4\u05a5\u0001\u0000"+ + "\u0000\u0000\u05a5\u05ab\u0001\u0000\u0000\u0000\u05a6\u05a8\u0005\u009f"+ + "\u0000\u0000\u05a7\u05a6\u0001\u0000\u0000\u0000\u05a7\u05a8\u0001\u0000"+ + "\u0000\u0000\u05a8\u05ab\u0001\u0000\u0000\u0000\u05a9\u05ab\u0004y\u0012"+ + "\u0000\u05aa\u05a4\u0001\u0000\u0000\u0000\u05aa\u05a7\u0001\u0000\u0000"+ + "\u0000\u05aa\u05a9\u0001\u0000\u0000\u0000\u05ab\u05ac\u0001\u0000\u0000"+ + "\u0000\u05ac\u05ad\u0003\u00a8T\u0000\u05ad\u05ae\u0003\u0172\u00b9\u0000"+ + "\u05ae\u05b0\u0001\u0000\u0000\u0000\u05af\u05aa\u0001\u0000\u0000\u0000"+ + "\u05b0\u05b1\u0001\u0000\u0000\u0000\u05b1\u05af\u0001\u0000\u0000\u0000"+ + "\u05b1\u05b2\u0001\u0000\u0000\u0000\u05b2\u00f3\u0001\u0000\u0000\u0000"+ + "\u05b3\u05b9\u0003\u00f8|\u0000\u05b4\u05b9\u0003\u00fa}\u0000\u05b5\u05b9"+ + "\u0003\u00fc~\u0000\u05b6\u05b9\u0003\u00f6{\u0000\u05b7\u05b9\u0003\u009a"+ + "M\u0000\u05b8\u05b3\u0001\u0000\u0000\u0000\u05b8\u05b4\u0001\u0000\u0000"+ + "\u0000\u05b8\u05b5\u0001\u0000\u0000\u0000\u05b8\u05b6\u0001\u0000\u0000"+ + "\u0000\u05b8\u05b7\u0001\u0000\u0000\u0000\u05b9\u00f5\u0001\u0000\u0000"+ + "\u0000\u05ba\u05bb\u0003\u00a6S\u0000\u05bb\u00f7\u0001\u0000\u0000\u0000"+ + "\u05bc\u05bd\u0003\u00a6S\u0000\u05bd\u05be\u0005\u0089\u0000\u0000\u05be"+ + "\u05bf\u0003\u00a6S\u0000\u05bf\u00f9\u0001\u0000\u0000\u0000\u05c0\u05c1"+ + "\u0003\u00a6S\u0000\u05c1\u05c2\u0007\u000f\u0000\u0000\u05c2\u00fb\u0001"+ + "\u0000\u0000\u0000\u05c3\u05c4\u0003\u00e8t\u0000\u05c4\u05c5\u0003\u00d8"+ + "l\u0000\u05c5\u05c6\u0003\u00e8t\u0000\u05c6\u00fd\u0001\u0000\u0000\u0000"+ + "\u05c7\u05c8\u0007\u0010\u0000\u0000\u05c8\u00ff\u0001\u0000\u0000\u0000"+ + "\u05c9\u05ca\u0005e\u0000\u0000\u05ca\u05cc\u0005o\u0000\u0000\u05cb\u05cd"+ + "\u0003\u00a8T\u0000\u05cc\u05cb\u0001\u0000\u0000\u0000\u05cc\u05cd\u0001"+ + "\u0000\u0000\u0000\u05cd\u0101\u0001\u0000\u0000\u0000\u05ce\u05d0\u0005"+ + "b\u0000\u0000\u05cf\u05d1\u0003\u00e8t\u0000\u05d0\u05cf\u0001\u0000\u0000"+ + "\u0000\u05d0\u05d1\u0001\u0000\u0000\u0000\u05d1\u0103\u0001\u0000\u0000"+ + "\u0000\u05d2\u05d4\u0005K\u0000\u0000\u05d3\u05d5\u0005e\u0000\u0000\u05d4"+ + "\u05d3\u0001\u0000\u0000\u0000\u05d4\u05d5\u0001\u0000\u0000\u0000\u05d5"+ + "\u0105\u0001\u0000\u0000\u0000\u05d6\u05d8\u0005_\u0000\u0000\u05d7\u05d9"+ + "\u0005e\u0000\u0000\u05d8\u05d7\u0001\u0000\u0000\u0000\u05d8\u05d9\u0001"+ + "\u0000\u0000\u0000\u05d9\u0107\u0001\u0000\u0000\u0000\u05da\u05db\u0005"+ + "W\u0000\u0000\u05db\u05dc\u0005e\u0000\u0000\u05dc\u0109\u0001\u0000\u0000"+ + "\u0000\u05dd\u05de\u0005[\u0000\u0000\u05de\u010b\u0001\u0000\u0000\u0000"+ + "\u05df\u05e8\u0005\\\u0000\u0000\u05e0\u05e9\u0003\u00a6S\u0000\u05e1"+ + "\u05e2\u0003\u0172\u00b9\u0000\u05e2\u05e3\u0003\u00a6S\u0000\u05e3\u05e9"+ + "\u0001\u0000\u0000\u0000\u05e4\u05e5\u0003\u00f4z\u0000\u05e5\u05e6\u0003"+ + "\u0172\u00b9\u0000\u05e6\u05e7\u0003\u00a6S\u0000\u05e7\u05e9\u0001\u0000"+ + "\u0000\u0000\u05e8\u05e0\u0001\u0000\u0000\u0000\u05e8\u05e1\u0001\u0000"+ + "\u0000\u0000\u05e8\u05e4\u0001\u0000\u0000\u0000\u05e9\u05ea\u0001\u0000"+ + "\u0000\u0000\u05ea\u05f0\u0003\u00f0x\u0000\u05eb\u05ee\u0005V\u0000\u0000"+ + "\u05ec\u05ef\u0003\u010c\u0086\u0000\u05ed\u05ef\u0003\u00f0x\u0000\u05ee"+ + "\u05ec\u0001\u0000\u0000\u0000\u05ee\u05ed\u0001\u0000\u0000\u0000\u05ef"+ + "\u05f1\u0001\u0000\u0000\u0000\u05f0\u05eb\u0001\u0000\u0000\u0000\u05f0"+ + "\u05f1\u0001\u0000\u0000\u0000\u05f1\u010d\u0001\u0000\u0000\u0000\u05f2"+ + "\u05f5\u0003\u0110\u0088\u0000\u05f3\u05f5\u0003\u0116\u008b\u0000\u05f4"+ + "\u05f2\u0001\u0000\u0000\u0000\u05f4\u05f3\u0001\u0000\u0000\u0000\u05f5"+ + "\u010f\u0001\u0000\u0000\u0000\u05f6\u0601\u0005Y\u0000\u0000\u05f7\u05f9"+ + "\u0003\u00a6S\u0000\u05f8\u05f7\u0001\u0000\u0000\u0000\u05f8\u05f9\u0001"+ + "\u0000\u0000\u0000\u05f9\u0602\u0001\u0000\u0000\u0000\u05fa\u05fc\u0003"+ + "\u00f4z\u0000\u05fb\u05fa\u0001\u0000\u0000\u0000\u05fb\u05fc\u0001\u0000"+ + "\u0000\u0000\u05fc\u05fd\u0001\u0000\u0000\u0000\u05fd\u05ff\u0003\u0172"+ + "\u00b9\u0000\u05fe\u0600\u0003\u00a6S\u0000\u05ff\u05fe\u0001\u0000\u0000"+ + "\u0000\u05ff\u0600\u0001\u0000\u0000\u0000\u0600\u0602\u0001\u0000\u0000"+ + "\u0000\u0601\u05f8\u0001\u0000\u0000\u0000\u0601\u05fb\u0001\u0000\u0000"+ + "\u0000\u0602\u0603\u0001\u0000\u0000\u0000\u0603\u0607\u0005h\u0000\u0000"+ + "\u0604\u0606\u0003\u0112\u0089\u0000\u0605\u0604\u0001\u0000\u0000\u0000"+ + "\u0606\u0609\u0001\u0000\u0000\u0000\u0607\u0605\u0001\u0000\u0000\u0000"+ + "\u0607\u0608\u0001\u0000\u0000\u0000\u0608\u060a\u0001\u0000\u0000\u0000"+ + "\u0609\u0607\u0001\u0000\u0000\u0000\u060a\u060b\u0005i\u0000\u0000\u060b"+ + "\u0111\u0001\u0000\u0000\u0000\u060c\u060d\u0003\u0114\u008a\u0000\u060d"+ + "\u060f\u0005o\u0000\u0000\u060e\u0610\u0003\u00f2y\u0000\u060f\u060e\u0001"+ + "\u0000\u0000\u0000\u060f\u0610\u0001\u0000\u0000\u0000\u0610\u0113\u0001"+ + "\u0000\u0000\u0000\u0611\u0612\u0005P\u0000\u0000\u0612\u0615\u0003\u00e8"+ + "t\u0000\u0613\u0615\u0005L\u0000\u0000\u0614\u0611\u0001\u0000\u0000\u0000"+ + "\u0614\u0613\u0001\u0000\u0000\u0000\u0615\u0115\u0001\u0000\u0000\u0000"+ + "\u0616\u061f\u0005Y\u0000\u0000\u0617\u0620\u0003\u0118\u008c\u0000\u0618"+ + "\u0619\u0003\u0172\u00b9\u0000\u0619\u061a\u0003\u0118\u008c\u0000\u061a"+ + "\u0620\u0001\u0000\u0000\u0000\u061b\u061c\u0003\u00f4z\u0000\u061c\u061d"+ + "\u0003\u0172\u00b9\u0000\u061d\u061e\u0003\u0118\u008c\u0000\u061e\u0620"+ + "\u0001\u0000\u0000\u0000\u061f\u0617\u0001\u0000\u0000\u0000\u061f\u0618"+ + "\u0001\u0000\u0000\u0000\u061f\u061b\u0001\u0000\u0000\u0000\u0620\u0621"+ + "\u0001\u0000\u0000\u0000\u0621\u0625\u0005h\u0000\u0000\u0622\u0624\u0003"+ + "\u011a\u008d\u0000\u0623\u0622\u0001\u0000\u0000\u0000\u0624\u0627\u0001"+ + "\u0000\u0000\u0000\u0625\u0623\u0001\u0000\u0000\u0000\u0625\u0626\u0001"+ + "\u0000\u0000\u0000\u0626\u0628\u0001\u0000\u0000\u0000\u0627\u0625\u0001"+ + "\u0000\u0000\u0000\u0628\u0629\u0005i\u0000\u0000\u0629\u0117\u0001\u0000"+ + "\u0000\u0000\u062a\u062b\u0005e\u0000\u0000\u062b\u062d\u0005s\u0000\u0000"+ + "\u062c\u062a\u0001\u0000\u0000\u0000\u062c\u062d\u0001\u0000\u0000\u0000"+ + "\u062d\u062e\u0001\u0000\u0000\u0000\u062e\u062f\u0003\u00b6[\u0000\u062f"+ + "\u0630\u0005p\u0000\u0000\u0630\u0631\u0005f\u0000\u0000\u0631\u0632\u0005"+ + "^\u0000\u0000\u0632\u0633\u0005g\u0000\u0000\u0633\u0119\u0001\u0000\u0000"+ + "\u0000\u0634\u0635\u0003\u011c\u008e\u0000\u0635\u0637\u0005o\u0000\u0000"+ + "\u0636\u0638\u0003\u00f2y\u0000\u0637\u0636\u0001\u0000\u0000\u0000\u0637"+ + "\u0638\u0001\u0000\u0000\u0000\u0638\u011b\u0001\u0000\u0000\u0000\u0639"+ + "\u063a\u0005P\u0000\u0000\u063a\u063d\u0003\u011e\u008f\u0000\u063b\u063d"+ + "\u0005L\u0000\u0000\u063c\u0639\u0001\u0000\u0000\u0000\u063c\u063b\u0001"+ + "\u0000\u0000\u0000\u063d\u011d\u0001\u0000\u0000\u0000\u063e\u0641\u0003"+ + "\u00c4b\u0000\u063f\u0641\u0005d\u0000\u0000\u0640\u063e\u0001\u0000\u0000"+ + "\u0000\u0640\u063f\u0001\u0000\u0000\u0000\u0641\u0649\u0001\u0000\u0000"+ + "\u0000\u0642\u0645\u0005m\u0000\u0000\u0643\u0646\u0003\u00c4b\u0000\u0644"+ + "\u0646\u0005d\u0000\u0000\u0645\u0643\u0001\u0000\u0000\u0000\u0645\u0644"+ + "\u0001\u0000\u0000\u0000\u0646\u0648\u0001\u0000\u0000\u0000\u0647\u0642"+ + "\u0001\u0000\u0000\u0000\u0648\u064b\u0001\u0000\u0000\u0000\u0649\u0647"+ + "\u0001\u0000\u0000\u0000\u0649\u064a\u0001\u0000\u0000\u0000\u064a\u011f"+ + "\u0001\u0000\u0000\u0000\u064b\u0649\u0001\u0000\u0000\u0000\u064c\u064d"+ + "\u0005O\u0000\u0000\u064d\u0651\u0005h\u0000\u0000\u064e\u0650\u0003\u0122"+ + "\u0091\u0000\u064f\u064e\u0001\u0000\u0000\u0000\u0650\u0653\u0001\u0000"+ + "\u0000\u0000\u0651\u064f\u0001\u0000\u0000\u0000\u0651\u0652\u0001\u0000"+ + "\u0000\u0000\u0652\u0654\u0001\u0000\u0000\u0000\u0653\u0651\u0001\u0000"+ + "\u0000\u0000\u0654\u0655\u0005i\u0000\u0000\u0655\u0121\u0001\u0000\u0000"+ + "\u0000\u0656\u0657\u0003\u0124\u0092\u0000\u0657\u0659\u0005o\u0000\u0000"+ + "\u0658\u065a\u0003\u00f2y\u0000\u0659\u0658\u0001\u0000\u0000\u0000\u0659"+ + "\u065a\u0001\u0000\u0000\u0000\u065a\u0123\u0001\u0000\u0000\u0000\u065b"+ + "\u065e\u0005P\u0000\u0000\u065c\u065f\u0003\u00f8|\u0000\u065d\u065f\u0003"+ + "\u0126\u0093\u0000\u065e\u065c\u0001\u0000\u0000\u0000\u065e\u065d\u0001"+ + "\u0000\u0000\u0000\u065f\u0662\u0001\u0000\u0000\u0000\u0660\u0662\u0005"+ + "L\u0000\u0000\u0661\u065b\u0001\u0000\u0000\u0000\u0661\u0660\u0001\u0000"+ + "\u0000\u0000\u0662\u0125\u0001\u0000\u0000\u0000\u0663\u0664\u0003\u00e8"+ + "t\u0000\u0664\u0665\u0005l\u0000\u0000\u0665\u066a\u0001\u0000\u0000\u0000"+ + "\u0666\u0667\u0003\u00e6s\u0000\u0667\u0668\u0005s\u0000\u0000\u0668\u066a"+ + "\u0001\u0000\u0000\u0000\u0669\u0663\u0001\u0000\u0000\u0000\u0669\u0666"+ + "\u0001\u0000\u0000\u0000\u0669\u066a\u0001\u0000\u0000\u0000\u066a\u066b"+ + "\u0001\u0000\u0000\u0000\u066b\u066c\u0003\u00a6S\u0000\u066c\u0127\u0001"+ + "\u0000\u0000\u0000\u066d\u0675\u0005`\u0000\u0000\u066e\u0670\u0003\u00a6"+ + "S\u0000\u066f\u066e\u0001\u0000\u0000\u0000\u066f\u0670\u0001\u0000\u0000"+ + "\u0000\u0670\u0676\u0001\u0000\u0000\u0000\u0671\u0676\u0003\u012a\u0095"+ + "\u0000\u0672\u0674\u0003\u00dam\u0000\u0673\u0672\u0001\u0000\u0000\u0000"+ + "\u0673\u0674\u0001\u0000\u0000\u0000\u0674\u0676\u0001\u0000\u0000\u0000"+ + "\u0675\u066f\u0001\u0000\u0000\u0000\u0675\u0671\u0001\u0000\u0000\u0000"+ + "\u0675\u0673\u0001\u0000\u0000\u0000\u0676\u0677\u0001\u0000\u0000\u0000"+ + "\u0677\u0678\u0003\u00f0x\u0000\u0678\u0129\u0001\u0000\u0000\u0000\u0679"+ + "\u067b\u0003\u00f4z\u0000\u067a\u0679\u0001\u0000\u0000\u0000\u067a\u067b"+ + "\u0001\u0000\u0000\u0000\u067b\u067c\u0001\u0000\u0000\u0000\u067c\u067e"+ + "\u0003\u0172\u00b9\u0000\u067d\u067f\u0003\u00a6S\u0000\u067e\u067d\u0001"+ + "\u0000\u0000\u0000\u067e\u067f\u0001\u0000\u0000\u0000\u067f\u0680\u0001"+ + "\u0000\u0000\u0000\u0680\u0682\u0003\u0172\u00b9\u0000\u0681\u0683\u0003"+ + "\u00f4z\u0000\u0682\u0681\u0001\u0000\u0000\u0000\u0682\u0683\u0001\u0000"+ + "\u0000\u0000\u0683\u012b\u0001\u0000\u0000\u0000\u0684\u0685\u0005R\u0000"+ + "\u0000\u0685\u0686\u0003\u00a6S\u0000\u0686\u012d\u0001\u0000\u0000\u0000"+ + "\u0687\u068a\u0003\u0152\u00a9\u0000\u0688\u068a\u0005e\u0000\u0000\u0689"+ + "\u0687\u0001\u0000\u0000\u0000\u0689\u0688\u0001\u0000\u0000\u0000\u068a"+ + "\u012f\u0001\u0000\u0000\u0000\u068b\u068c\u0005j\u0000\u0000\u068c\u068d"+ + "\u0003\u0132\u0099\u0000\u068d\u068e\u0005k\u0000\u0000\u068e\u068f\u0003"+ + "\u0134\u009a\u0000\u068f\u0131\u0001\u0000\u0000\u0000\u0690\u0691\u0003"+ + "\u00a6S\u0000\u0691\u0133\u0001\u0000\u0000\u0000\u0692\u0693\u0003\u00c4"+ + "b\u0000\u0693\u0135\u0001\u0000\u0000\u0000\u0694\u0695\u0005\u0087\u0000"+ + "\u0000\u0695\u0696\u0003\u00c4b\u0000\u0696\u0137\u0001\u0000\u0000\u0000"+ + "\u0697\u0698\u0005j\u0000\u0000\u0698\u0699\u0005k\u0000\u0000\u0699\u069a"+ + "\u0003\u0134\u009a\u0000\u069a\u0139\u0001\u0000\u0000\u0000\u069b\u069c"+ + "\u0005S\u0000\u0000\u069c\u069d\u0005j\u0000\u0000\u069d\u069e\u0003\u00c4"+ + "b\u0000\u069e\u069f\u0005k\u0000\u0000\u069f\u06a0\u0003\u0134\u009a\u0000"+ + "\u06a0\u013b\u0001\u0000\u0000\u0000\u06a1\u06a7\u0005U\u0000\u0000\u06a2"+ + "\u06a3\u0005U\u0000\u0000\u06a3\u06a7\u0005\u0089\u0000\u0000\u06a4\u06a5"+ + "\u0005\u0089\u0000\u0000\u06a5\u06a7\u0005U\u0000\u0000\u06a6\u06a1\u0001"+ + "\u0000\u0000\u0000\u06a6\u06a2\u0001\u0000\u0000\u0000\u06a6\u06a4\u0001"+ + "\u0000\u0000\u0000\u06a7\u06a8\u0001\u0000\u0000\u0000\u06a8\u06a9\u0003"+ + "\u0134\u009a\u0000\u06a9\u013d\u0001\u0000\u0000\u0000\u06aa\u06ab\u0005"+ + "M\u0000\u0000\u06ab\u06ac\u0003\u0140\u00a0\u0000\u06ac\u013f\u0001\u0000"+ + "\u0000\u0000\u06ad\u06ae\u0003\u0144\u00a2\u0000\u06ae\u06af\u0003\u0142"+ + "\u00a1\u0000\u06af\u06b2\u0001\u0000\u0000\u0000\u06b0\u06b2\u0003\u0144"+ + "\u00a2\u0000\u06b1\u06ad\u0001\u0000\u0000\u0000\u06b1\u06b0\u0001\u0000"+ + "\u0000\u0000\u06b2\u0141\u0001\u0000\u0000\u0000\u06b3\u06b6\u0003\u0144"+ + "\u00a2\u0000\u06b4\u06b6\u0003\u00c4b\u0000\u06b5\u06b3\u0001\u0000\u0000"+ + "\u0000\u06b5\u06b4\u0001\u0000\u0000\u0000\u06b6\u0143\u0001\u0000\u0000"+ + "\u0000\u06b7\u06c3\u0005f\u0000\u0000\u06b8\u06bd\u0003\u009eO\u0000\u06b9"+ + "\u06ba\u0005m\u0000\u0000\u06ba\u06bc\u0003\u009eO\u0000\u06bb\u06b9\u0001"+ + "\u0000\u0000\u0000\u06bc\u06bf\u0001\u0000\u0000\u0000\u06bd\u06bb\u0001"+ + "\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be\u06c1\u0001"+ + "\u0000\u0000\u0000\u06bf\u06bd\u0001\u0000\u0000\u0000\u06c0\u06c2\u0005"+ + "m\u0000\u0000\u06c1\u06c0\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001\u0000"+ + "\u0000\u0000\u06c2\u06c4\u0001\u0000\u0000\u0000\u06c3\u06b8\u0001\u0000"+ + "\u0000\u0000\u06c3\u06c4\u0001\u0000\u0000\u0000\u06c4\u06c5\u0001\u0000"+ + "\u0000\u0000\u06c5\u06c6\u0005g\u0000\u0000\u06c6\u0145\u0001\u0000\u0000"+ + "\u0000\u06c7\u06c8\u0003\u0148\u00a4\u0000\u06c8\u06c9\u0005f\u0000\u0000"+ + "\u06c9\u06cb\u0003\u00a6S\u0000\u06ca\u06cc\u0005m\u0000\u0000\u06cb\u06ca"+ + "\u0001\u0000\u0000\u0000\u06cb\u06cc\u0001\u0000\u0000\u0000\u06cc\u06cd"+ + "\u0001\u0000\u0000\u0000\u06cd\u06ce\u0005g\u0000\u0000\u06ce\u0147\u0001"+ + "\u0000\u0000\u0000\u06cf\u06d5\u0003\u00c6c\u0000\u06d0\u06d1\u0005f\u0000"+ + "\u0000\u06d1\u06d2\u0003\u0148\u00a4\u0000\u06d2\u06d3\u0005g\u0000\u0000"+ + "\u06d3\u06d5\u0001\u0000\u0000\u0000\u06d4\u06cf\u0001\u0000\u0000\u0000"+ + "\u06d4\u06d0\u0001\u0000\u0000\u0000\u06d5\u0149\u0001\u0000\u0000\u0000"+ + "\u06d6\u06dd\u0003\u014c\u00a6\u0000\u06d7\u06dd\u0003\u0150\u00a8\u0000"+ + "\u06d8\u06d9\u0005f\u0000\u0000\u06d9\u06da\u0003\u00a6S\u0000\u06da\u06db"+ + "\u0005g\u0000\u0000\u06db\u06dd\u0001\u0000\u0000\u0000\u06dc\u06d6\u0001"+ + "\u0000\u0000\u0000\u06dc\u06d7\u0001\u0000\u0000\u0000\u06dc\u06d8\u0001"+ + "\u0000\u0000\u0000\u06dd\u014b\u0001\u0000\u0000\u0000\u06de\u06e2\u0003"+ + "\u00b4Z\u0000\u06df\u06e2\u0003\u0154\u00aa\u0000\u06e0\u06e2\u0003\u00b8"+ + "\\\u0000\u06e1\u06de\u0001\u0000\u0000\u0000\u06e1\u06df\u0001\u0000\u0000"+ + "\u0000\u06e1\u06e0\u0001\u0000\u0000\u0000\u06e2\u014d\u0001\u0000\u0000"+ + "\u0000\u06e3\u06e4\u0007\u0011\u0000\u0000\u06e4\u014f\u0001\u0000\u0000"+ + "\u0000\u06e5\u06e6\u0005e\u0000\u0000\u06e6\u0151\u0001\u0000\u0000\u0000"+ + "\u06e7\u06e8\u0005e\u0000\u0000\u06e8\u06e9\u0005p\u0000\u0000\u06e9\u06ea"+ + "\u0005e\u0000\u0000\u06ea\u0153\u0001\u0000\u0000\u0000\u06eb\u06ec\u0003"+ + "\u00ccf\u0000\u06ec\u06ed\u0003\u0156\u00ab\u0000\u06ed\u0155\u0001\u0000"+ + "\u0000\u0000\u06ee\u06f3\u0005h\u0000\u0000\u06ef\u06f1\u0003\u0158\u00ac"+ + "\u0000\u06f0\u06f2\u0005m\u0000\u0000\u06f1\u06f0\u0001\u0000\u0000\u0000"+ + "\u06f1\u06f2\u0001\u0000\u0000\u0000\u06f2\u06f4\u0001\u0000\u0000\u0000"+ + "\u06f3\u06ef\u0001\u0000\u0000\u0000\u06f3\u06f4\u0001\u0000\u0000\u0000"+ + "\u06f4\u06f5\u0001\u0000\u0000\u0000\u06f5\u06f6\u0005i\u0000\u0000\u06f6"+ + "\u0157\u0001\u0000\u0000\u0000\u06f7\u06fc\u0003\u015a\u00ad\u0000\u06f8"+ + "\u06f9\u0005m\u0000\u0000\u06f9\u06fb\u0003\u015a\u00ad\u0000\u06fa\u06f8"+ + "\u0001\u0000\u0000\u0000\u06fb\u06fe\u0001\u0000\u0000\u0000\u06fc\u06fa"+ + "\u0001\u0000\u0000\u0000\u06fc\u06fd\u0001\u0000\u0000\u0000\u06fd\u0159"+ + "\u0001\u0000\u0000\u0000\u06fe\u06fc\u0001\u0000\u0000\u0000\u06ff\u0700"+ + "\u0003\u015c\u00ae\u0000\u0700\u0701\u0005o\u0000\u0000\u0701\u0703\u0001"+ + "\u0000\u0000\u0000\u0702\u06ff\u0001\u0000\u0000\u0000\u0702\u0703\u0001"+ + "\u0000\u0000\u0000\u0703\u0704\u0001\u0000\u0000\u0000\u0704\u0705\u0003"+ + "\u015e\u00af\u0000\u0705\u015b\u0001\u0000\u0000\u0000\u0706\u0709\u0003"+ + "\u00a6S\u0000\u0707\u0709\u0003\u0156\u00ab\u0000\u0708\u0706\u0001\u0000"+ + "\u0000\u0000\u0708\u0707\u0001\u0000\u0000\u0000\u0709\u015d\u0001\u0000"+ + "\u0000\u0000\u070a\u070d\u0003\u00a6S\u0000\u070b\u070d\u0003\u0156\u00ab"+ + "\u0000\u070c\u070a\u0001\u0000\u0000\u0000\u070c\u070b\u0001\u0000\u0000"+ + "\u0000\u070d\u015f\u0001\u0000\u0000\u0000\u070e\u070f\u0005T\u0000\u0000"+ + "\u070f\u0715\u0005h\u0000\u0000\u0710\u0711\u0003\u0162\u00b1\u0000\u0711"+ + "\u0712\u0003\u0172\u00b9\u0000\u0712\u0714\u0001\u0000\u0000\u0000\u0713"+ + "\u0710\u0001\u0000\u0000\u0000\u0714\u0717\u0001\u0000\u0000\u0000\u0715"+ + "\u0713\u0001\u0000\u0000\u0000\u0715\u0716\u0001\u0000\u0000\u0000\u0716"+ + "\u0718\u0001\u0000\u0000\u0000\u0717\u0715\u0001\u0000\u0000\u0000\u0718"+ + "\u0719\u0005i\u0000\u0000\u0719\u0161\u0001\u0000\u0000\u0000\u071a\u071b"+ + "\u0003\u00e6s\u0000\u071b\u071c\u0003\u00c4b\u0000\u071c\u071f\u0001\u0000"+ + "\u0000\u0000\u071d\u071f\u0003\u0166\u00b3\u0000\u071e\u071a\u0001\u0000"+ + "\u0000\u0000\u071e\u071d\u0001\u0000\u0000\u0000\u071f\u0721\u0001\u0000"+ + "\u0000\u0000\u0720\u0722\u0003\u0164\u00b2\u0000\u0721\u0720\u0001\u0000"+ + "\u0000\u0000\u0721\u0722\u0001\u0000\u0000\u0000\u0722\u0163\u0001\u0000"+ + "\u0000\u0000\u0723\u0724\u0007\u0012\u0000\u0000\u0724\u0165\u0001\u0000"+ + "\u0000\u0000\u0725\u0727\u0005\u0087\u0000\u0000\u0726\u0725\u0001\u0000"+ + "\u0000\u0000\u0726\u0727\u0001\u0000\u0000\u0000\u0727\u0728\u0001\u0000"+ + "\u0000\u0000\u0728\u0729\u0003\u012e\u0097\u0000\u0729\u0167\u0001\u0000"+ + "\u0000\u0000\u072a\u072b\u0005j\u0000\u0000\u072b\u072c\u0003\u00a6S\u0000"+ + "\u072c\u072d\u0005k\u0000\u0000\u072d\u0169\u0001\u0000\u0000\u0000\u072e"+ + "\u072f\u0005p\u0000\u0000\u072f\u0730\u0005f\u0000\u0000\u0730\u0731\u0003"+ + "\u00c4b\u0000\u0731\u0732\u0005g\u0000\u0000\u0732\u016b\u0001\u0000\u0000"+ + "\u0000\u0733\u0742\u0005f\u0000\u0000\u0734\u073b\u0003\u00e8t\u0000\u0735"+ + "\u0738\u0003\u0148\u00a4\u0000\u0736\u0737\u0005m\u0000\u0000\u0737\u0739"+ + "\u0003\u00e8t\u0000\u0738\u0736\u0001\u0000\u0000\u0000\u0738\u0739\u0001"+ + "\u0000\u0000\u0000\u0739\u073b\u0001\u0000\u0000\u0000\u073a\u0734\u0001"+ + "\u0000\u0000\u0000\u073a\u0735\u0001\u0000\u0000\u0000\u073b\u073d\u0001"+ + "\u0000\u0000\u0000\u073c\u073e\u0005t\u0000\u0000\u073d\u073c\u0001\u0000"+ + "\u0000\u0000\u073d\u073e\u0001\u0000\u0000\u0000\u073e\u0740\u0001\u0000"+ + "\u0000\u0000\u073f\u0741\u0005m\u0000\u0000\u0740\u073f\u0001\u0000\u0000"+ + "\u0000\u0740\u0741\u0001\u0000\u0000\u0000\u0741\u0743\u0001\u0000\u0000"+ + "\u0000\u0742\u073a\u0001\u0000\u0000\u0000\u0742\u0743\u0001\u0000\u0000"+ + "\u0000\u0743\u0744\u0001\u0000\u0000\u0000\u0744\u0745\u0005g\u0000\u0000"+ + "\u0745\u016d\u0001\u0000\u0000\u0000\u0746\u0747\u0003\u0148\u00a4\u0000"+ + "\u0747\u0748\u0005p\u0000\u0000\u0748\u0749\u0005e\u0000\u0000\u0749\u016f"+ + "\u0001\u0000\u0000\u0000\u074a\u074b\u0003\u00c4b\u0000\u074b\u0171\u0001"+ + "\u0000\u0000\u0000\u074c\u0751\u0005n\u0000\u0000\u074d\u0751\u0005\u0000"+ + "\u0000\u0001\u074e\u0751\u0005\u009f\u0000\u0000\u074f\u0751\u0004\u00b9"+ + "\u0013\u0000\u0750\u074c\u0001\u0000\u0000\u0000\u0750\u074d\u0001\u0000"+ + "\u0000\u0000\u0750\u074e\u0001\u0000\u0000\u0000\u0750\u074f\u0001\u0000"+ + "\u0000\u0000\u0751\u0173\u0001\u0000\u0000\u0000\u00c2\u0182\u0187\u018e"+ + "\u0198\u019e\u01a4\u01ae\u01b8\u01c6\u01ca\u01d3\u01df\u01e3\u01e9\u01f2"+ + "\u01fc\u020d\u021b\u021f\u0226\u022e\u0237\u0257\u025f\u0277\u028a\u0299"+ + "\u02a6\u02af\u02bd\u02c6\u02d2\u02d8\u02ec\u02f3\u02f8\u02fd\u0307\u030a"+ + "\u030e\u0312\u031a\u0322\u0327\u032f\u0331\u0336\u033d\u0345\u0348\u034e"+ + "\u0353\u0355\u0358\u035f\u0364\u0377\u037f\u0383\u0386\u038c\u0390\u0393"+ + "\u039d\u03a4\u03ab\u03b7\u03bd\u03c4\u03c9\u03cf\u03db\u03e1\u03e5\u03ed"+ + "\u03f1\u03f7\u03fa\u0400\u0405\u041e\u0441\u0443\u045a\u0462\u046d\u0474"+ + "\u047b\u0485\u0493\u04a9\u04ab\u04b3\u04b7\u04bb\u04be\u04c7\u04cd\u04d7"+ + "\u04df\u04e5\u04ee\u04f9\u0504\u0508\u050a\u0515\u051e\u0522\u0525\u052c"+ + "\u0537\u0541\u0547\u0549\u0553\u055d\u0561\u0565\u0569\u0570\u0578\u0583"+ + "\u0587\u058b\u0597\u059b\u059f\u05a4\u05a7\u05aa\u05b1\u05b8\u05cc\u05d0"+ + "\u05d4\u05d8\u05e8\u05ee\u05f0\u05f4\u05f8\u05fb\u05ff\u0601\u0607\u060f"+ + "\u0614\u061f\u0625\u062c\u0637\u063c\u0640\u0645\u0649\u0651\u0659\u065e"+ + "\u0661\u0669\u066f\u0673\u0675\u067a\u067e\u0682\u0689\u06a6\u06b1\u06b5"+ + "\u06bd\u06c1\u06c3\u06cb\u06d4\u06dc\u06e1\u06f1\u06f3\u06fc\u0702\u0708"+ + "\u070c\u0715\u071e\u0721\u0726\u0738\u073a\u073d\u0740\u0742\u0750"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index 52b9990df..e05468128 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.0 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -348,6 +348,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitAdtClause(GobraParser.AdtClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAdtFieldDecl(GobraParser.AdtFieldDeclContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 352f76c5e..c30ab42ee 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.0 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -302,6 +302,12 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitAdtClause(GobraParser.AdtClauseContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#adtFieldDecl}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAdtFieldDecl(GobraParser.AdtFieldDeclContext ctx); /** * Visit a parse tree produced by {@link GobraParser#ghostSliceType}. * @param ctx the parse tree diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala index 3a6cfdc9c..96d88e903 100644 --- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala +++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala @@ -20,6 +20,7 @@ object AstPattern { sealed trait Type extends Pattern + case class Import(id: PIdnUse, symb: st.Import) extends Type with Symbolic case class NamedType(id: PIdnUse, symb: st.ActualTypeEntity) extends Type with Symbolic case class PointerType(base: PType) extends Type case class AdtClause(id: PIdnUse, symb: st.AdtClause) extends Type with Symbolic diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index b1197c095..4a950981e 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -417,6 +417,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter def showPatternMatchCaseExp(c: PatternMatchCaseExp): Doc = "case" <+> showMatchPattern(c.mExp) <> ":" <+> showExpr(c.exp) + def showPatternMatchCaseAss(c: PatternMatchCaseAss): Doc = "case" <+> showMatchPattern(c.mExp) <> ":" <+> showAss(c.ass) + def showMatchPattern(expr: MatchPattern): Doc = expr match { case MatchBindVar(name, _) => name case MatchAdt(clause, expr) => clause.name <+> "{" <> ssep(expr map showMatchPattern, ",") <> "}" @@ -430,6 +432,9 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case ExprAssertion(exp) => showExpr(exp) case Let(left, right, exp) => "let" <+> showVar(left) <+> "==" <+> parens(showExpr(right)) <+> "in" <+> showAss(exp) + case PatternMatchAss(exp, cases, default) => "match" <+> showExpr(exp) <+> + block(ssep(cases map showPatternMatchCaseAss, line) <> (if (default.isDefined) line <> "default:" <+> showAss(default.get) else "")) + case MagicWand(left, right) => showAss(left) <+> "--*" <+> showAss(right) case Implication(left, right) => showExpr(left) <+> "==>" <+> showAss(right) case Access(e, FullPerm(_)) => "acc" <> parens(showAcc(e)) @@ -628,7 +633,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter val entriesDoc = showList(entries){ case (x,y) => showExpr(x) <> ":" <+> showExpr(y) } showType(lit.typ) <+> braces(space <> entriesDoc <> (if (entries.nonEmpty) space else emptyDoc)) - case AdtConstructorLit(typ, _, args) => showType(typ) <> braces(showExprList(args)) + case lit: AdtConstructorLit => lit.clause.name <> braces(showExprList(lit.args)) } // variables diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index 7012d607f..b24042b03 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -472,6 +472,10 @@ case class PatternMatchExp(exp: Expr, typ: Type, cases: Vector[PatternMatchCaseE case class PatternMatchCaseExp(mExp: MatchPattern, exp: Expr)(val info: Source.Parser.Info) extends Node +case class PatternMatchAss(exp: Expr, cases: Vector[PatternMatchCaseAss], default: Option[Assertion])(val info: Source.Parser.Info) extends Assertion + +case class PatternMatchCaseAss(mExp: MatchPattern, ass: Assertion)(val info: Source.Parser.Info) extends Node + case class PatternMatchStmt(exp: Expr, cases: Vector[PatternMatchCaseStmt], strict: Boolean)(val info: Source.Parser.Info) extends Stmt case class PatternMatchCaseStmt(mExp: MatchPattern, body: Stmt)(val info: Source.Parser.Info) extends Node @@ -760,11 +764,7 @@ case class RangeSequence(low : Expr, high : Expr)(val info : Source.Parser.Info) * The appending of two sequences represented by `left` and `right` * (which should be of identical types as result of type checking). */ -case class SequenceAppend(left : Expr, right : Expr)(val info: Source.Parser.Info) extends BinaryExpr("++") { - /** Should be identical to `right.typ`. */ - require(left.typ.isInstanceOf[SequenceT] && right.typ.isInstanceOf[SequenceT], s"expected two sequences, but got ${left.typ} and ${right.typ} (${info.origin})") - override val typ : Type = SequenceT(left.typ.asInstanceOf[SequenceT].t, Addressability.rValue) -} +case class SequenceAppend(left : Expr, right : Expr, typ: Type)(val info: Source.Parser.Info) extends BinaryExpr("++") /** * Denotes a ghost collection update "`col`[`left` = `right`]", which results in a @@ -772,7 +772,6 @@ case class SequenceAppend(left : Expr, right : Expr)(val info: Source.Parser.Inf * `baseUnderlyingType` is the underlyingType of `base`'s type */ case class GhostCollectionUpdate(base : Expr, left : Expr, right : Expr, baseUnderlyingType: Type)(val info: Source.Parser.Info) extends Expr { - require(baseUnderlyingType.isInstanceOf[SequenceT] || baseUnderlyingType.isInstanceOf[MathMapT], s"expected sequence or mmap, but got ${base.typ} (${info.origin})") override val typ : Type = base.typ.withAddressability(Addressability.rValue) } @@ -784,8 +783,7 @@ case class GhostCollectionUpdate(base : Expr, left : Expr, right : Expr, baseUnd */ case class SequenceDrop(left : Expr, right : Expr)(val info: Source.Parser.Info) extends Expr { /** Is equal to the type of `left`. */ - require(left.typ.isInstanceOf[SequenceT]) - override val typ : Type = SequenceT(left.typ.asInstanceOf[SequenceT].t, Addressability.rValue) + override val typ : Type = left.typ.withAddressability(Addressability.rValue) } /** @@ -796,8 +794,7 @@ case class SequenceDrop(left : Expr, right : Expr)(val info: Source.Parser.Info) */ case class SequenceTake(left : Expr, right : Expr)(val info: Source.Parser.Info) extends Expr { /** Is equal to the type of `left`. */ - require(left.typ.isInstanceOf[SequenceT]) - override val typ : Type = SequenceT(left.typ.asInstanceOf[SequenceT].t, Addressability.rValue) + override val typ : Type = left.typ.withAddressability(Addressability.rValue) } /** @@ -805,7 +802,7 @@ case class SequenceTake(left : Expr, right : Expr)(val info: Source.Parser.Info) * represented by `expr`, to a (mathematical) sequence of type 't'. * Here `expr` is assumed to be either a sequence or an exclusive array. */ -case class SequenceConversion(expr : Expr)(val info: Source.Parser.Info) extends Expr { +case class SequenceConversion(expr: Expr)(val info: Source.Parser.Info) extends Expr { override val typ : Type = expr.typ match { case t: SequenceT => t case t: ArrayT => t.sequence @@ -821,55 +818,19 @@ case class SequenceConversion(expr : Expr)(val info: Source.Parser.Info) extends * Represents a (multi)set union "`left` union `right`", * where `left` and `right` should be (multi)sets of identical types. */ -case class Union(left : Expr, right : Expr)(val info : Source.Parser.Info) extends BinaryExpr("union") { - /** `left.typ` is expected to be identical to `right.typ`. */ - require( - (left.typ.isInstanceOf[SetT] && right.typ.isInstanceOf[SetT]) - || (left.typ.isInstanceOf[MultisetT] && right.typ.isInstanceOf[MultisetT]), - s"expected set or multiset, but got ${left.typ} and ${right.typ} (${info.origin})" - ) - override val typ : Type = left.typ match { - case t: SetT => SetT(t.t, Addressability.rValue) - case t: MultisetT => MultisetT(t.t, Addressability.rValue) - case _ => Violation.violation("expected set or type") - } -} +case class Union(left : Expr, right : Expr, typ: Type)(val info : Source.Parser.Info) extends BinaryExpr("union") /** * Represents a (multi)set intersection "`left` intersection `right`", * where `left` and `right` should be (multi)sets of identical types. */ -case class Intersection(left : Expr, right : Expr)(val info : Source.Parser.Info) extends BinaryExpr("intersection") { - /** `left.typ` is expected to be identical to `right.typ`. */ - require( - (left.typ.isInstanceOf[SetT] && right.typ.isInstanceOf[SetT]) - || (left.typ.isInstanceOf[MultisetT] && right.typ.isInstanceOf[MultisetT]), - s"expected set or multiset, but got ${left.typ} and ${right.typ} (${info.origin})" - ) - override val typ : Type = left.typ match { - case t: SetT => SetT(t.t, Addressability.rValue) - case t: MultisetT => MultisetT(t.t, Addressability.rValue) - case _ => Violation.violation("expected set or type") - } -} +case class Intersection(left : Expr, right : Expr, typ: Type)(val info : Source.Parser.Info) extends BinaryExpr("intersection") /** * Represents a (multi)set difference "`left` setminus `right`", * where `left` and `right` should be (multi)sets of identical types. */ -case class SetMinus(left : Expr, right : Expr)(val info : Source.Parser.Info) extends BinaryExpr("setminus") { - /** `left.typ` is expected to be identical to `right.typ`. */ - require( - (left.typ.isInstanceOf[SetT] && right.typ.isInstanceOf[SetT]) - || (left.typ.isInstanceOf[MultisetT] && right.typ.isInstanceOf[MultisetT]), - s"expected set or multiset, but got ${left.typ} and ${right.typ} (${info.origin})" - ) - override val typ : Type = left.typ match { - case t: SetT => SetT(t.t, Addressability.rValue) - case t: MultisetT => MultisetT(t.t, Addressability.rValue) - case _ => Violation.violation("expected set or type") - } -} +case class SetMinus(left : Expr, right : Expr, typ: Type)(val info : Source.Parser.Info) extends BinaryExpr("setminus") /** * Represents a subset relation "`left` subset `right`", where @@ -1572,14 +1533,16 @@ case class DomainT(name: String, addressability: Addressability) extends PrettyT DomainT(name, newAddressability) } -case class AdtT(name: String, addressability: Addressability) extends PrettyType(s"adt{ name is $name }") with TopType { +case class AdtT(name: String, definedName: String, addressability: Addressability) extends PrettyType(s"adt{ name is $name }") with TopType { override def equalsWithoutMod(t: Type): Boolean = t match { case o: AdtT => name == o.name case _ => false } + val definedType: DefinedT = DefinedT(definedName, addressability) + override def withAddressability(newAddressability: Addressability): Type = - AdtT(name, newAddressability) + AdtT(name, definedName, newAddressability) } case class AdtClauseT(name: String, adtT: AdtT, fields: Vector[Field], addressability: Addressability) extends PrettyType(fields.mkString(s"$name{", ", ", "}")) { diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index b0e751931..241421109 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -1378,7 +1378,8 @@ object Desugar extends LazyLogging { domain = in.MapKeys(c, underlyingType(exp.typ))(src) - visited <- leftOfAssignmentD(range.enumerated, info)(in.SetT(keyType, Addressability.exclusiveVariable)) + visitedT = in.SetT(keyType, Addressability.exclusiveVariable) + visited <- leftOfAssignmentD(range.enumerated, info)(visitedT) perm <- freshDeclaredExclusiveVar(in.PermissionT(Addressability.exclusiveVariable), n, info)(src) @@ -1411,7 +1412,7 @@ object Desugar extends LazyLogging { breakLoopLabel = in.Label(breakLoopLabelProxy)(src) visitedEqDomain = in.Assert(in.ExprAssertion(in.EqCmp( - in.SetMinus(visited.op, domain)(src), + in.SetMinus(visited.op, domain, visitedT)(src), in.SetLit(keyType, Vector.empty)(src) )(src))(src))(src) @@ -1424,7 +1425,7 @@ object Desugar extends LazyLogging { in.Negation(in.Contains(k, visited.op)(src))(src))(src))(src))(src) ) ++ (if (hasValue) Vector(in.Initialization(v)(src), singleAss(in.Assignee.Var(v), in.IndexedExp(c, k, underlyingType(exp.typ))(src))(src)) else Vector()))(src) - updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k))(src))(src))(src) + updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k))(src), visitedT)(src))(src) enc = in.Seqn(Vector( singleAss(in.Assignee.Var(c), exp)(src), @@ -1458,7 +1459,8 @@ object Desugar extends LazyLogging { domain = in.MapKeys(c, underlyingType(exp.typ))(src) - visited <- leftOfAssignmentD(range.enumerated, info)(in.SetT(keyType, Addressability.exclusiveVariable)) + visitedT = in.SetT(keyType, Addressability.exclusiveVariable) + visited <- leftOfAssignmentD(range.enumerated, info)(visitedT) perm <- freshDeclaredExclusiveVar(in.PermissionT(Addressability.exclusiveVariable), n, info)(src) @@ -1491,7 +1493,7 @@ object Desugar extends LazyLogging { breakLoopLabel = in.Label(breakLoopLabelProxy)(src) visitedEqDomain = in.Assert(in.ExprAssertion(in.EqCmp( - in.SetMinus(visited.op, domain)(src), + in.SetMinus(visited.op, domain, visitedT)(src), in.SetLit(keyType, Vector.empty)(src) )(src))(src))(src) @@ -1506,7 +1508,7 @@ object Desugar extends LazyLogging { singleAss(k, tempk)(src) ) ++ (if (hasValue) Vector(singleAss(v, in.IndexedExp(c, k.op, underlyingType(exp.typ))(src))(src)) else Vector()))(src) - updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k.op))(src))(src))(src) + updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k.op))(src), visitedT)(src))(src) enc = in.Seqn(Vector( singleAss(in.Assignee.Var(c), exp)(src), @@ -1775,6 +1777,7 @@ object Desugar extends LazyLogging { in.GoClosureCall(call.closure, call.args, call.spec)(src) case Right(call: in.PureClosureCall) => in.GoClosureCall(call.closure, call.args, call.spec)(src) + case _ => unexpectedExprError(exp) } case _ => unexpectedExprError(exp) } @@ -2028,19 +2031,19 @@ object Desugar extends LazyLogging { for { base <- exprD(ctx, info)(p.base) } yield p.symb match { - case st.AdtDestructor(decl, adtDecl, context) => - val adtT: AdtT = context.symbType(adtDecl).asInstanceOf[AdtT] + case dest: st.AdtDestructor => + val adtT = dest.context.symbType(dest.adtType).asInstanceOf[AdtT] in.AdtDestructor(base, in.Field( - nm.adtField(decl.id.name, adtT), - typeD(context.symbType(decl.typ), Addressability.mathDataStructureElement)(src), + nm.adtField(dest.decl.id.name, adtT.decl), + typeD(dest.context.symbType(dest.decl.typ), Addressability.mathDataStructureElement)(src), ghost = true )(src))(src) - case st.AdtDiscriminator(decl, adtDecl, context) => - val adtT: AdtT = context.symbType(adtDecl).asInstanceOf[AdtT] + case disc: st.AdtDiscriminator => + val declT = Type.DeclaredT(disc.typeDecl, disc.context) in.AdtDiscriminator( base, - adtClauseProxy(nm.adt(adtT), decl, context.getTypeInfo) + adtClauseProxy(nm.adt(declT), disc.decl, disc.context.getTypeInfo) )(src) case _ => violation("Expected AdtDiscriminator or AdtDestructor") @@ -3039,86 +3042,19 @@ object Desugar extends LazyLogging { compositeTypeD(t) match { case CompositeKind.Struct(it, ist) => - val fields = ist.fields - - if (lit.elems.exists(_.key.isEmpty)) { - // all elements are not keyed - val wArgs = fields.zip(lit.elems).map { case (f, PKeyedElement(_, exp)) => - val wv = exp match { - case PExpCompositeVal(ev) => exprD(ctx, info)(ev) - case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f.typ) - } - wv.map{ v => implicitConversion(v.typ, f.typ, v) } - } - - for { - args <- sequence(wArgs) - } yield in.StructLit(it, args)(src) - - } else { // all elements are keyed - // maps field names to fields - val fMap = fields.map(f => nm.inverse(f.name) -> f).toMap - // maps fields to given value (if one is given) - val vMap = lit.elems.map { - case PKeyedElement(Some(PIdentifierKey(key)), exp) => - val f = fMap(key.name) - val wv = exp match { - case PExpCompositeVal(ev) => exprD(ctx, info)(ev) - case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f.typ) - } - f -> wv.map{ v => implicitConversion(v.typ, f.typ, v) } - - case _ => Violation.violation("expected identifier as a key") - }.toMap - // list of value per field - val wArgs = fields.map { - case f if vMap.isDefinedAt(f) => vMap(f) - case f => unit(in.DfltVal(f.typ)(src)) - } + val signature = ist.fields.map(f => nm.inverse(f.name) -> f.typ) - for { - args <- sequence(wArgs) - } yield in.StructLit(it, args)(src) - } + for { + args <- structLitLikeArguments(ctx, info)(lit, signature) + } yield in.StructLit(it, args)(src) case CompositeKind.Adt(t) => - val fields = t.fields + val signature = t.fields.map(f => nm.inverse(f.name) -> f.typ) val proxy = in.AdtClauseProxy(t.name, t.adtT.name)(src) - if (lit.elems.exists(_.key.isEmpty)) { - //All elements are unkeyed - - val wArgs = fields.zip(lit.elems).map { case (f, PKeyedElement(_, exp)) => exp match { - case PExpCompositeVal(ev) => exprD(ctx, info)(ev) - case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f.typ) - }} - - for { - args <- sequence(wArgs) - } yield in.AdtConstructorLit(t.adtT, proxy, args)(src) - } else { - val fMap = fields.map({ f => nm.inverse(f.name) -> f }).toMap - - val vMap = lit.elems.map { - case PKeyedElement(Some(PIdentifierKey(key)), exp) => - val f = fMap(key.name) - exp match { - case PExpCompositeVal(ev) => f -> exprD(ctx, info)(ev) - case PLitCompositeVal(lv) => f -> literalValD(ctx, info)(lv, f.typ) - } - - case _ => Violation.violation("expected identifier as a key") - }.toMap - - val wArgs = fields.map { - case f if vMap.isDefinedAt(f) => vMap(f) - case f => unit(in.DfltVal(f.typ)(src)) - } - - for { - args <- sequence(wArgs) - } yield in.AdtConstructorLit(t.adtT, proxy, args)(src) - } + for { + args <- structLitLikeArguments(ctx, info)(lit, signature) + } yield in.AdtConstructorLit(t.adtT.definedType, proxy, args)(src) case CompositeKind.Array(in.ArrayT(len, typ, addressability)) => Violation.violation(addressability == Addressability.literal, "Literals have to be exclusive") @@ -3159,6 +3095,42 @@ object Desugar extends LazyLogging { } } + private def structLitLikeArguments(ctx: FunctionContext, info: TypeInfo)(lit: PLiteralValue, signature: Vector[(String, in.Type)]): Writer[Vector[in.Expr]] = { + val src = meta(lit, info) + + val wArgs = if (lit.elems.exists(_.key.isEmpty)) { + // all elements are not keyed + signature.zip(lit.elems).map { case (f, PKeyedElement(_, exp)) => + val wv = exp match { + case PExpCompositeVal(ev) => exprD(ctx, info)(ev) + case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, f._2) + } + wv.map { v => implicitConversion(v.typ, f._2, v) } + } + } else { // all elements are keyed + // maps key names to field types + val typeMap = signature.toMap + // maps key names to given value (if one is given) + val vMap = lit.elems.map { + case PKeyedElement(Some(PIdentifierKey(key)), exp) => + val fieldType = typeMap(key.name) + val wv = exp match { + case PExpCompositeVal(ev) => exprD(ctx, info)(ev) + case PLitCompositeVal(lv) => literalValD(ctx, info)(lv, fieldType) + } + key.name -> wv.map { v => implicitConversion(v.typ, fieldType, v) } + + case _ => Violation.violation("expected identifier as a key") + }.toMap + // list of value per field + signature.map { + case f if vMap.isDefinedAt(f._1) => vMap(f._1) + case f => unit(in.DfltVal(f._2)(src)) + } + } + sequence(wArgs) + } + private def handleMapEntries(ctx: FunctionContext, info: TypeInfo)(lit: PLiteralValue, keys: in.Type, values: in.Type): Writer[Seq[(in.Expr, in.Expr)]] = { violation(keys.addressability.isExclusive, s"Map literal keys always have exclusive types, but got $keys") violation(values.addressability.isExclusive, s"Map literal values always have exclusive types, but got $values") @@ -3199,9 +3171,10 @@ object Desugar extends LazyLogging { var definedFPredicates: Map[in.FPredicateProxy, in.FPredicate] = Map.empty var definedFuncLiterals: Map[in.FunctionLitProxy, in.FunctionLitLike] = Map.empty + def registerDefinedType(t: Type.DeclaredT, addrMod: Addressability)(src: Meta): in.DefinedT = { // this type was declared in the current package - val name = nm.typ(t.decl.left.name, t.context) + val name = nm.declaredType(t) def register(addrMod: Addressability): Unit = { if (!definedTypesSet.contains(name, addrMod)) { @@ -3676,9 +3649,9 @@ object Desugar extends LazyLogging { var registeredAdts: Set[String] = Set.empty - def fieldDeclAdtD(decl: PFieldDecl, context: ExternalTypeInfo, adt: AdtT)(src: Meta): in.Field = { - val fieldName = nm.adtField(decl.id.name, adt) - val typ = typeD(context.symbType(decl.typ), Addressability.mathDataStructureElement)(src) + def fieldDeclAdtD(name: String, ftyp: Type, @unused context: ExternalTypeInfo, adt: AdtT)(src: Meta): in.Field = { + val fieldName = nm.adtField(name, adt.decl) + val typ = typeD(ftyp, Addressability.mathDataStructureElement)(src) in.Field(fieldName, typ, true)(src) } @@ -3688,11 +3661,11 @@ object Desugar extends LazyLogging { AdditionalMembers.addFinalizingComputation { () => val xInfo = t.context.getTypeInfo - - val clauses = t.decl.clauses.map { c => - val src = meta(c, xInfo) - val proxy = adtClauseProxy(aT.name, c, xInfo) - val fields = c.args.flatMap(_.fields).map(f => fieldDeclAdtD(f, t.context, t)(src)) + val adtDecl = t.adtDecl + val clauses = (adtDecl.clauses zip t.clauses).map { case (cDecl, c) => + val src = meta(cDecl, xInfo) + val proxy = adtClauseProxy(aT.name, cDecl, xInfo) + val fields = c.fields.map(f => fieldDeclAdtD(f._1, f._2, t.context, t)(src)) in.AdtClause(proxy, fields)(src) } @@ -3704,17 +3677,6 @@ object Desugar extends LazyLogging { } } - def getAdtClauseTagMap(t: Type.AdtT): Map[String, BigInt] = { - t.decl.clauses - .map(c => idName(c.id, t.context.getTypeInfo)) - .sortBy(s => s) - .zipWithIndex - .map { - case (s, i) => s -> BigInt(i) - } - .toMap - } - def embeddedTypeD(t: PEmbeddedType, addrMod: Addressability)(src: Meta): in.Type = t match { case PEmbeddedName(typ) => typeD(info.symbType(typ), addrMod)(src) case PEmbeddedPointer(typ) => @@ -3752,17 +3714,19 @@ object Desugar extends LazyLogging { registerType(in.StructT(inFields, addrMod)) case t: Type.AdtT => - val adtName = nm.adt(t) - val res = registerType(in.AdtT(adtName, addrMod)) + val adtName = nm.adt(t.declaredType) + val definedName = nm.declaredType(t.declaredType) + val res = registerType(in.AdtT(adtName, definedName, addrMod)) registerAdt(t, res) res case t: Type.AdtClauseT => - val tAdt = Type.AdtT(t.adtT, t.context) - val adt: in.AdtT = in.AdtT(nm.adt(tAdt), addrMod) - val fields: Vector[in.Field] = (t.fieldsWithTypes map { case (key: String, typ: Type) => - in.Field(nm.adtField(key, tAdt), typeD(typ, Addressability.mathDataStructureElement)(src), true)(src) - }).toVector + val adtName = nm.adt(t.declaredType) + val definedName = nm.declaredType(t.declaredType) + val adt: in.AdtT = in.AdtT(adtName, definedName, addrMod) + val fields: Vector[in.Field] = t.fields.map{ case (key: String, typ: Type) => + in.Field(nm.adtField(key, t.typeDecl), typeD(typ, Addressability.mathDataStructureElement)(src), true)(src) + } in.AdtClauseT(idName(t.decl.id, t.context.getTypeInfo), adt, fields, addrMod) case Type.PredT(args) => in.PredT(args.map(typeD(_, Addressability.rValue)(src)), Addressability.rValue) @@ -4077,7 +4041,7 @@ object Desugar extends LazyLogging { case p: PClosureImplProof => closureImplProofD(ctx)(p) case PExplicitGhostStatement(actual) => stmtD(ctx, info)(actual) - case PMatchStatement(exp, clauses, strict) => { + case PMatchStatement(exp, clauses, strict) => def goC(clause: PMatchStmtCase): Writer[in.PatternMatchCaseStmt] = { val body = block( @@ -4096,7 +4060,6 @@ object Desugar extends LazyLogging { e <- exprD(ctx, info)(exp) c <- sequence(clauses map goC) } yield in.PatternMatchStmt(e, c, strict)(src) - } case _ => ??? } @@ -4323,7 +4286,7 @@ object Desugar extends LazyLogging { case PSequenceAppend(left, right) => for { dleft <- go(left) dright <- go(right) - } yield in.SequenceAppend(dleft, dright)(src) + } yield in.SequenceAppend(dleft, dright, typ)(src) case PGhostCollectionUpdate(col, clauses) => clauses.foldLeft(go(col)) { case (dcol, clause) => for { @@ -4355,17 +4318,17 @@ object Desugar extends LazyLogging { case PUnion(left, right) => for { dleft <- go(left) dright <- go(right) - } yield in.Union(dleft, dright)(src) + } yield in.Union(dleft, dright, typ)(src) case PIntersection(left, right) => for { dleft <- go(left) dright <- go(right) - } yield in.Intersection(dleft, dright)(src) + } yield in.Intersection(dleft, dright, typ)(src) case PSetMinus(left, right) => for { dleft <- go(left) dright <- go(right) - } yield in.SetMinus(dleft, dright)(src) + } yield in.SetMinus(dleft, dright, typ)(src) case PSubset(left, right) => for { dleft <- go(left) @@ -4394,7 +4357,7 @@ object Desugar extends LazyLogging { dop <- go(op) } yield in.OptionGet(dop)(src) - case m@PMatchExp(exp, _) => + case m: PMatchExp => val defaultD: Writer[Option[in.Expr]] = if (m.hasDefault) { for { e <- exprD(ctx, info)(m.defaultClauses.head.exp) @@ -4409,7 +4372,7 @@ object Desugar extends LazyLogging { } yield in.PatternMatchCaseExp(p, e)(src) for { - e <- exprD(ctx, info)(exp) + e <- exprD(ctx, info)(m.exp) cs <- sequence(m.caseClauses map caseD) de <- defaultD } yield in.PatternMatchExp(e, typ, cs, de)(src) @@ -4546,6 +4509,27 @@ object Desugar extends LazyLogging { }) } yield lets + case m: PMatchExp => + val defaultD: Writer[Option[in.Assertion]] = if (m.hasDefault) { + for { + e <- assertionD(ctx, info)(m.defaultClauses.head.exp) + } yield Some(e) + } else { + unit(None) + } + + def caseD(c: PMatchExpCase): Writer[in.PatternMatchCaseAss] = for { + p <- matchPatternD(ctx, info)(c.pattern) + e <- assertionD(ctx, info)(c.exp) + } yield in.PatternMatchCaseAss(p, e)(src) + + for { + e <- exprD(ctx, info)(m.exp) + cs <- sequence(m.caseClauses map caseD) + de <- defaultD + } yield in.PatternMatchAss(e, cs, de)(src) + + case n: PInvoke => // a predicate invocation corresponds to a predicate access with full permissions // register the full permission AST node in the position manager such that its meta information @@ -4990,20 +4974,22 @@ object Desugar extends LazyLogging { } } + def declaredType(t: Type.DeclaredT): String = { + typ(t.decl.left.name, t.context) + } + def domain(s: DomainT): String = { val pom = s.context.getTypeInfo.tree.originalRoot.positions val hash = srcTextName(pom, s.decl.funcs, s.decl.axioms) s"$DOMAIN_PREFIX$$${topLevelName("")(hash, s.context)}" } - def adt(a: AdtT): String = { - val pom = a.context.getTypeInfo.tree.originalRoot.positions - val hash = srcTextName(pom, a.decl.clauses) - s"$ADT_PREFIX$$${topLevelName("")(hash, a.context)}" + def adt(t: Type.DeclaredT): String = { + s"$ADT_PREFIX$$${declaredType(t)}" } /** can be inversed with [[inverse]] */ - def adtField(n: String, @unused s: AdtT): String = s"$n$FIELD_PREFIX" + def adtField(n: String, @unused s: PTypeDef): String = s"$n$FIELD_PREFIX" def label(n: String): String = n match { case "#lhs" => "lhs" diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index c63d3911d..e22e611c2 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -525,14 +525,26 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole } override def visitAdtClause(ctx: AdtClauseContext): PAdtClause = { - val id = idnDef.unapply(ctx.IDENTIFIER()) - val fieldClauses = ctx.fieldDecl().asScala.toVector.map(visitFieldDecl) - val args = fieldClauses.collect{ case x: PFieldDecls => x } + val id = idnDef.unapply(ctx.IDENTIFIER()).get + val fieldClauses = ctx.adtFieldDecl().asScala.toVector.map(visitAdtFieldDecl) + val args = fieldClauses.zipWithIndex.map{ + case (AdtFieldDecl(Vector(), t), idx) => + PFieldDecls(Vector(PFieldDecl(PIdnDef(s"_${id.name}_$idx").at(t), t).at(t))).at(t) - // embedded fields and ghost struct clauses are not supported. - if (id.isEmpty || args.size != fieldClauses.size) fail(ctx) + case (AdtFieldDecl(xs, t), _) => + PFieldDecls(xs.map(x => PFieldDecl(x, t.copy).at(x))).at(t) + } - PAdtClause(id.get, args).at(ctx) + PAdtClause(id, args).at(ctx) + } + + case class AdtFieldDecl(vars: Vector[PIdnDef], typ: PType) + override def visitAdtFieldDecl(ctx: AdtFieldDeclContext): AdtFieldDecl = { + visitChildren(ctx) match { + case t: PType => AdtFieldDecl(Vector.empty, t) + case Vector(goIdnDefList(xs), t: PType) => AdtFieldDecl(xs, t) + case _ => fail(ctx) + } } override def visitMatchStmt(ctx: MatchStmtContext): PMatchStatement = { @@ -2309,21 +2321,24 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole override def visitChildren(node: RuleNode): AnyRef = { node match { - case context: ParserRuleContext => { - context.children.asScala.view.map{n => - (n.accept(this), n) match { - case (p : PNode, ctx : ParserRuleContext) => p.at(ctx) - case (p : PNode, term : TerminalNode) => p.at(term) - case (p, _) => p + case context: ParserRuleContext => + if (context.children == null) Vector.empty + else { + context.children.asScala.view.map { n => + (n.accept(this), n) match { + case (p: PNode, ctx: ParserRuleContext) => p.at(ctx) + case (p: PNode, term: TerminalNode) => p.at(term) + case (p, _) => p + } + }.toVector match { + // make sure to avoid nested vectors of single items + case Vector(res) => res + case Vector("(", res, ")") => res + case v => v } - }.toVector match { - // make sure to avoid nested vectors of single items - case Vector(res) => res - case Vector("(", res, ")") => res - case v => v } - } - case x => violation(s"Expected ParserRuleContext, but got ${x}") + + case x => violation(s"Expected ParserRuleContext, but got $x") } } diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala index d5b905bd9..8b96ff873 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala @@ -249,7 +249,7 @@ object SymbolTable extends Environments[Entity] { sealed trait GhostStructMember extends StructMember with GhostTypeMember - case class DomainFunction(decl: PDomainFunction, domain: PDomainType, context: ExternalTypeInfo) extends GhostRegular with WithArguments with WithResult { + case class DomainFunction(decl: PDomainFunction, domain: PDomainType, context: ExternalTypeInfo) extends GhostTypeMember with WithArguments with WithResult { override def rep: PNode = decl override val args: Vector[PParameter] = decl.args override val result: PResult = decl.result @@ -261,11 +261,13 @@ object SymbolTable extends Environments[Entity] { override def addressable: Boolean = false } - case class AdtClause(decl: PAdtClause, adtDecl: PAdtType, context: ExternalTypeInfo) extends GhostRegular { + case class AdtClause(decl: PAdtClause, typeDecl: PTypeDef, context: ExternalTypeInfo) extends GhostTypeMember with TypeEntity { + require(typeDecl.right.isInstanceOf[PAdtType]) + override def rep: PNode = decl + val adtDecl: PAdtType = typeDecl.right.asInstanceOf[PAdtType] def getName: String = decl.id.name - val fields: Vector[PFieldDecl] = decl.args.flatMap(f => f.fields) } @@ -273,13 +275,13 @@ object SymbolTable extends Environments[Entity] { def getName: String } - case class AdtDestructor(decl: PFieldDecl, adtType: PAdtType, context: ExternalTypeInfo) extends AdtMember { + case class AdtDestructor(decl: PFieldDecl, typeDecl: PTypeDef, adtType: PAdtType, context: ExternalTypeInfo) extends AdtMember { override def rep: PNode = decl override def getName: String = decl.id.name } - case class AdtDiscriminator(decl: PAdtClause, adtType: PAdtType, context: ExternalTypeInfo) extends AdtMember { + case class AdtDiscriminator(decl: PAdtClause, typeDecl: PTypeDef, adtType: PAdtType, context: ExternalTypeInfo) extends AdtMember { override def rep: PNode = decl override def getName: String = s"is${decl.id.name}" diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala index 5604d4e22..66cb0fa49 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -8,7 +8,7 @@ package viper.gobra.frontend.info.base import org.bitbucket.inkytonik.kiama.==> import org.bitbucket.inkytonik.kiama.util.Messaging.Messages -import viper.gobra.ast.frontend.{PAdtClause, PAdtType, PDomainType, PImport, PInterfaceType, PNode, PStructType, PTypeDecl} +import viper.gobra.ast.frontend.{PAdtClause, PAdtType, PDomainType, PImport, PInterfaceType, PNode, PStructType, PTypeDecl, PTypeDef} import viper.gobra.frontend.info.ExternalTypeInfo import viper.gobra.util.TypeBounds @@ -56,18 +56,20 @@ object Type { case class DomainT(decl: PDomainType, context: ExternalTypeInfo) extends PrettyType("domain{...}") with ContextualType - case class AdtT(decl: PAdtType, context: ExternalTypeInfo) extends Type + case class AdtT(clauses: Vector[AdtClauseT], decl: PTypeDef, context: ExternalTypeInfo) extends PrettyType(decl.left.name) { + val adtDecl: PAdtType = decl.right.asInstanceOf[PAdtType] + val declaredType: DeclaredT = DeclaredT(decl, context) + } - case class AdtClauseT(fieldsToTypes: Map[String, Type], fields: Vector[String], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends Type { - require(fields.forall(fieldsToTypes.isDefinedAt), "there must be a type for each key") + case class AdtClauseT(name: String, fields: Vector[(String, Type)], decl: PAdtClause, typeDecl: PTypeDef, context: ExternalTypeInfo) extends PrettyType(name) { + val adtDecl: PAdtType = typeDecl.right.asInstanceOf[PAdtType] + val typeMap: Map[String, Type] = fields.toMap + val declaredType: DeclaredT = DeclaredT(typeDecl, context) def typeAt(idx: Int): Type = { require(0 <= idx && idx < fields.size, s"index $idx is not within range of ADT fields (size ${fields.size})") - fieldsToTypes(fields(idx)) + fields(idx)._2 } - - lazy val fieldsWithTypes: Vector[(String, Type)] = fields.map(f => (f, fieldsToTypes(f))) - lazy val fieldTypes: Vector[Type] = fieldsWithTypes.map(_._2) } case class MapT(key: Type, elem: Type) extends PrettyType(s"map[$key]$elem") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index e79d3a9d3..1175fe801 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala @@ -98,7 +98,6 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => case (MultisetT(l), MultisetT(r)) => assignableTo.result(l,r) case (OptionT(l), OptionT(r)) => assignableTo.result(l, r) case (IntT(_), PermissionT) => successProp - case (c: AdtClauseT, UnderlyingType(t: AdtT)) if c.context == t.context && c.adtT == t.decl => successProp // conservative choice case _ => errorProp() @@ -162,18 +161,7 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => }) } else if (elems.size == s.embedded.size + s.fields.size) { propForall( - elems.map(_.exp).zip(s.fieldsAndEmbedded.values),/* - elems.map(_.exp).zip(decl.clauses.flatMap { cl => - def clauseInducedTypes(clause: PActualStructClause): Vector[Type] = clause match { - case PEmbeddedDecl(embeddedType, _) => Vector(context.typ(embeddedType)) - case PFieldDecls(fields) => fields map (f => context.typ(f.typ)) - } - - cl match { - case PExplicitGhostStructClause(c) => clauseInducedTypes(c) - case c: PActualStructClause => clauseInducedTypes(c) - } - }),*/ + elems.map(_.exp).zip(s.fieldsAndEmbedded.values), compositeValAssignableTo ) } else { @@ -184,7 +172,7 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => if (elems.isEmpty) { successProp } else if (elems.exists(_.key.nonEmpty)) { - val tmap: Map[String, Type] = a.fieldsToTypes + val tmap: Map[String, Type] = a.typeMap failedProp("for adt literals either all or none elements must be keyed", !elems.forall(_.key.nonEmpty)) and @@ -198,7 +186,7 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => }) } else if (elems.size == a.fields.size) { propForall( - elems.map(_.exp).zip(a.fieldTypes), + elems.map(_.exp).zip(a.fields.map(_._2)), compositeValAssignableTo ) } else { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala index 5129fa76e..4ab3a32ce 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala @@ -6,7 +6,7 @@ package viper.gobra.frontend.info.implementation.property -import viper.gobra.ast.frontend.{PExplicitGhostStructClause, PInterfaceType, PTypeDef, AstPattern => ap} +import viper.gobra.ast.frontend.{PInterfaceType, PTypeDef, AstPattern => ap} import viper.gobra.frontend.info.base.SymbolTable.{MPredicateSpec, Method} import viper.gobra.frontend.info.base.{Type, SymbolTable => st} import viper.gobra.frontend.info.base.Type.{GhostCollectionType, NilType, Type} @@ -104,12 +104,13 @@ trait Implements { this: TypeInfoImpl => case Type.NilType | Type.BooleanT | _: Type.IntT | Type.StringT => true case ut: Type.PointerT => go(ut.elem) case ut: Type.StructT => - ut.decl.clauses.forall(!_.isInstanceOf[PExplicitGhostStructClause]) && - ut.clauses.forall{ case (_, (_, fieldType)) => go(fieldType) } + ut.clauses.forall{ case (_, (_, fieldType)) => go(fieldType) } case ut: Type.ArrayT => go(ut.elem) case _: Type.SliceT => true case _: Type.MapT => true case ut: Type.OptionT => go(ut.elem) + case ut: Type.AdtT => + ut.clauses.forall(_.fields.forall(f => go(f._2))) case ut: GhostCollectionType => go(ut.elem) case _: Type.InterfaceT => true case _ => false diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala index d46efbb34..e8a3c564a 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala @@ -39,7 +39,6 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl => case (OptionT(l), OptionT(r)) => identicalTypes(l, r) case (l: DomainT, r: DomainT) => l == r case (l: AdtT, r: AdtT) => l == r - case (l: AdtClauseT, r: AdtClauseT) => l == r case (StructT(clausesL, _, contextL), StructT(clausesR, _, contextR)) => contextL == contextR && clausesL.size == clausesR.size && clausesL.zip(clausesR).forall { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala index 9aa0ffe51..b78a0ecda 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala @@ -7,7 +7,7 @@ package viper.gobra.frontend.info.implementation.property import viper.gobra.ast.internal.{Float32T, Float64T} -import viper.gobra.frontend.info.base.Type.{AdtClauseT, AdtT, ArrayT, ChannelT, GhostSliceT, IntT, InternalSingleMulti, InternalTupleT, MapT, MultisetT, PermissionT, PointerT, SequenceT, SetT, Single, SliceT, Type} +import viper.gobra.frontend.info.base.Type.{ArrayT, AssertionT, BooleanT, ChannelT, GhostSliceT, IntT, InternalTupleT, MapT, MultisetT, PermissionT, PointerT, SequenceT, SetT, Single, SliceT, Type} import viper.gobra.frontend.info.implementation.TypeInfoImpl trait TypeMerging extends BaseProperty { this: TypeInfoImpl => @@ -20,44 +20,40 @@ trait TypeMerging extends BaseProperty { this: TypeInfoImpl => // possible future improvement: if l is assignable to r, then return r instead of None (or vice versa) (l, r) match { case (Single(lst), Single(rst)) => - if (identicalTypes(lst, rst)) Some(lst) else { - (lst, rst) match { - case (a, UNTYPED_INT_CONST) if underlyingType(a).isInstanceOf[IntT] => Some(a) - case (UNTYPED_INT_CONST, b) if underlyingType(b).isInstanceOf[IntT] => Some(b) - case (a, UNTYPED_INT_CONST) if underlyingType(a).isInstanceOf[Float64T] => Some(a) - case (UNTYPED_INT_CONST, b) if underlyingType(b).isInstanceOf[Float64T] => Some(b) - case (a, UNTYPED_INT_CONST) if underlyingType(a).isInstanceOf[Float32T] => Some(a) - case (UNTYPED_INT_CONST, b) if underlyingType(b).isInstanceOf[Float32T] => Some(b) - case (IntT(_), PermissionT) => Some(PermissionT) - case (PermissionT, IntT(_)) => Some(PermissionT) - case (SequenceT(l), SequenceT(r)) => typeMerge(l,r) map SequenceT - case (SetT(l), SetT(r)) => typeMerge(l,r) map SetT - case (MultisetT(l), MultisetT(r)) => typeMerge(l,r) map MultisetT - case (ArrayT(len1, l), ArrayT(len2, r)) if len1 == len2 => typeMerge(l,r) map (ArrayT(len1, _)) - case (SliceT(l), SliceT(r)) => typeMerge(l,r) map SliceT - case (GhostSliceT(l), GhostSliceT(r)) => typeMerge(l,r) map GhostSliceT - case (MapT(k1, v1), MapT(k2, v2)) => for { - k <- typeMerge(k1, k2) - v <- typeMerge(v1, v2) - } yield MapT(k,v) - case (PointerT(l), PointerT(r)) => typeMerge(l,r) map PointerT - case (ChannelT(l, mod1), ChannelT(r, mod2)) if mod1 == mod2 => typeMerge(l,r) map (ChannelT(_,mod1)) - case (InternalTupleT(v1), InternalTupleT(v2)) => - val v = v1.zip(v2).map {case (l, r) => typeMerge(l, r)} - if (v.contains(None)) None else Some(InternalTupleT(v map (_.get))) - case (InternalSingleMulti(sin1, multi1), InternalSingleMulti(sin2, multi2)) => for { - sin <- typeMerge(sin1, sin2) - multi <- typeMerge(multi1, multi2) - } yield InternalSingleMulti(sin, multi.asInstanceOf[InternalTupleT]) + (lst, rst) match { + case (a, b) if identicalTypes(a,b) => Some(a) + case (a, b) if identicalTypes(underlyingType(a),b) => Some(a) + case (a, b) if identicalTypes(a,underlyingType(b)) => Some(b) - case (l: AdtClauseT, r: AdtClauseT) - if l.context == r.context && l.adtT == r.adtT => Some(AdtT(l.adtT, l.context)) - case (c: AdtClauseT, u@UnderlyingType(a: AdtT)) if c.context == a.context && c.adtT == a.decl => Some(u) - case (u@UnderlyingType(a: AdtT), c: AdtClauseT) if c.context == a.context && c.adtT == a.decl => Some(u) - - case _ => None - } + case (a, UNTYPED_INT_CONST) if underlyingType(a).isInstanceOf[IntT] => Some(a) + case (UNTYPED_INT_CONST, b) if underlyingType(b).isInstanceOf[IntT] => Some(b) + case (a, UNTYPED_INT_CONST) if underlyingType(a).isInstanceOf[Float64T] => Some(a) + case (UNTYPED_INT_CONST, b) if underlyingType(b).isInstanceOf[Float64T] => Some(b) + case (a, UNTYPED_INT_CONST) if underlyingType(a).isInstanceOf[Float32T] => Some(a) + case (UNTYPED_INT_CONST, b) if underlyingType(b).isInstanceOf[Float32T] => Some(b) + case (BooleanT, AssertionT) => Some(AssertionT) + case (AssertionT, BooleanT) => Some(AssertionT) + case (IntT(_), PermissionT) => Some(PermissionT) + case (PermissionT, IntT(_)) => Some(PermissionT) + case (SequenceT(l), SequenceT(r)) => typeMerge(l, r) map SequenceT + case (SetT(l), SetT(r)) => typeMerge(l, r) map SetT + case (MultisetT(l), MultisetT(r)) => typeMerge(l, r) map MultisetT + case (ArrayT(len1, l), ArrayT(len2, r)) if len1 == len2 => typeMerge(l, r) map (ArrayT(len1, _)) + case (SliceT(l), SliceT(r)) => typeMerge(l, r) map SliceT + case (GhostSliceT(l), GhostSliceT(r)) => typeMerge(l, r) map GhostSliceT + case (MapT(k1, v1), MapT(k2, v2)) => for { + k <- typeMerge(k1, k2) + v <- typeMerge(v1, v2) + } yield MapT(k, v) + case (PointerT(l), PointerT(r)) => typeMerge(l, r) map PointerT + case (ChannelT(l, mod1), ChannelT(r, mod2)) if mod1 == mod2 => typeMerge(l, r) map (ChannelT(_, mod1)) + case _ => None } + + case (InternalTupleT(v1), InternalTupleT(v2)) => + val v = v1.zip(v2).map { case (l, r) => typeMerge(l, r) } + if (v.contains(None)) None else Some(InternalTupleT(v map (_.get))) + case _ => None } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala index b05b5b470..43cc8d374 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala @@ -97,7 +97,9 @@ object AdvancedMemberSet { case Field(m, _, _) => m.id.name case Embbed(m, _, _) => m.id.name case t: AdtMember => t.getName + case t: AdtClause => t.getName case ml: BuiltInMethodLike => ml.tag.identifier + case f: DomainFunction => f.decl.id.name } extractMemberName(tm) -> tm diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala index 64b51d831..a6597b7e5 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala @@ -9,7 +9,7 @@ package viper.gobra.frontend.info.implementation.resolution import viper.gobra.ast.frontend._ import viper.gobra.ast.frontend.{AstPattern => ap} import viper.gobra.frontend.info.base.{SymbolTable => st} -import viper.gobra.frontend.info.base.Type.{ImportT, PredT, FunctionT} +import viper.gobra.frontend.info.base.Type.{AdtT, FunctionT, ImportT, PredT} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.Violation.violation @@ -30,8 +30,8 @@ trait AmbiguityResolution { this: TypeInfoImpl => exprOrType(n.base) .fold( _ => Left(n), - symbType(_) match { // check if base is a package qualifier and id points to a type - case _: ImportT if pointsToType(n.id) => Right(n) + baseType => underlyingType(symbType(baseType)) match { // check if base is a package qualifier and id points to a type + case _: ImportT | _: AdtT if pointsToType(n.id) => Right(n) case _ => Left(n) }) @@ -50,6 +50,7 @@ trait AmbiguityResolution { this: TypeInfoImpl => case n: PNamedOperand => entity(n.id) match { + case s: st.Import => Some(ap.Import(n.id, s)) case s: st.NamedType => Some(ap.NamedType(n.id, s)) case s: st.Variable => s match { case g: st.GlobalVariable => Some(ap.GlobalVariable(n.id, g)) @@ -88,7 +89,7 @@ trait AmbiguityResolution { this: TypeInfoImpl => case (Right(base), Some((s: st.Method, path))) => Some(ap.MethodExpr(base, n.id, path, s)) case (Right(base), Some((s: st.MPredicate, path))) => Some(ap.PredicateExpr(base, n.id, path, s)) - // imported members + // imported members (also via adt) case (Right(_), Some((s: st.ActualTypeEntity, _))) => Some(ap.NamedType(n.id, s)) case (Right(_), Some((s: st.Constant, _))) => Some(ap.Constant(n.id, s)) case (Right(_), Some((s: st.GlobalVariable, _))) => Some(ap.GlobalVariable(n.id, s)) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index f38148c79..238158abf 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -71,9 +71,9 @@ trait MemberResolution { this: TypeInfoImpl => // ADT /** Destructors and discriminator induced by adt clause */ - private def adtClauseMemberSet(decl: PAdtClause, adtDecl: PAdtType, ctx: ExternalTypeInfo): AdvancedMemberSet[AdtMember] = { - val fields = decl.args.flatMap(_.fields).map(f => AdtDestructor(f, adtDecl, ctx)) - val discriminator = AdtDiscriminator(decl, adtDecl, ctx) + private def adtClauseMemberSet(decl: PAdtClause, typeDecl: PTypeDef, adtDecl: PAdtType, ctx: ExternalTypeInfo): AdvancedMemberSet[AdtMember] = { + val fields = decl.args.flatMap(_.fields).map(f => AdtDestructor(f, typeDecl, adtDecl, ctx)) + val discriminator = AdtDiscriminator(decl, typeDecl, adtDecl, ctx) AdvancedMemberSet.init[AdtMember](discriminator +: fields) } @@ -89,13 +89,10 @@ trait MemberResolution { this: TypeInfoImpl => case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref case t: AdtT => - val clauseMemberSets = t.decl.clauses.map(adtClauseMemberSet(_, t.decl, t.context)) + val clauseMemberSets = t.adtDecl.clauses.map(adtClauseMemberSet(_, t.decl, t.adtDecl, t.context)) AdvancedMemberSet.union(clauseMemberSets) - case t: AdtClauseT => - val fields = t.decl.args.flatMap(_.fields).map(f => AdtDestructor(f, t.adtT, t.context)) - val discriminator = AdtDiscriminator(t.decl, t.adtT, t.context) - AdvancedMemberSet.init[AdtMember](discriminator +: fields) + case t: AdtClauseT => adtClauseMemberSet(t.decl, t.typeDecl, t.adtDecl, t.context) case _ => AdvancedMemberSet.empty } @@ -103,12 +100,46 @@ trait MemberResolution { this: TypeInfoImpl => go(pastDeref = false) } - val adtMemberSet: Type => AdvancedMemberSet[AdtMember] = + lazy val adtMemberSet: Type => AdvancedMemberSet[AdtMember] = attr[Type, AdvancedMemberSet[AdtMember]] { case Single(t) => adtSuffix(t) union pastPromotions(adtSuffix)(t) case _ => AdvancedMemberSet.empty } + lazy val adtConstructorSet: Type => AdvancedMemberSet[AdtClause] = { + + def constructorSuffix(t: Type): AdvancedMemberSet[AdtClause] = { + t match { + case t: AdtT => + AdvancedMemberSet.init( + t.adtDecl.clauses.map { clause => AdtClause(clause, t.decl, t.context) } + ) + case _ => AdvancedMemberSet.empty + } + } + + attr[Type, AdvancedMemberSet[AdtClause]] { + case Single(t) => constructorSuffix(t) union pastPromotions(constructorSuffix)(t) + case _ => AdvancedMemberSet.empty + } + } + + lazy val domainFunctionSet: Type => AdvancedMemberSet[DomainFunction] = { + + def domainSuffix(t: Type): AdvancedMemberSet[DomainFunction] = { + t match { + case t: DomainT => + AdvancedMemberSet.init(t.decl.funcs.map { f => DomainFunction(f, t.decl, t.context) }) + case _ => AdvancedMemberSet.empty + } + } + + attr[Type, AdvancedMemberSet[DomainFunction]] { + case Single(t) => domainSuffix(t) union pastPromotions(domainSuffix)(t) + case _ => AdvancedMemberSet.empty + } + } + // Methods private lazy val receiverMethodSetMap: Map[Type, AdvancedMemberSet[TypeMember]] = { @@ -322,7 +353,15 @@ trait MemberResolution { this: TypeInfoImpl => } case Right(typ) => // base is a type typeSymbType(typ) match { - case pkg: ImportT => tryPackageLookup(RegularImport(pkg.decl.importPath), id, pkg.decl) + case pkg: ImportT => + tryPackageLookup(RegularImport(pkg.decl.importPath), id, pkg.decl) + + case DeclaredT(PTypeDef(adt: PAdtType, _), ctx) => + adtConstructorSet(ctx.symbType(adt)).lookupWithPath(id.name) + + case DeclaredT(PTypeDef(domain: PDomainType, _), ctx) => + domainFunctionSet(ctx.symbType(domain)).lookupWithPath(id.name) + case t => tryMethodLikeLookup(t, id) } } @@ -389,7 +428,6 @@ trait MemberResolution { this: TypeInfoImpl => } } - /** lookup `id` in package `importTarget`. `errNode` is used as offending node. */ def tryPackageLookup(importTarget: AbstractImport, id: PIdnUse, errNode: PNode): Option[(Entity, Vector[MemberPath])] = { val foreignPkgResult = for { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index 7925531d6..ee076f137 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -11,7 +11,7 @@ import viper.gobra.frontend.PackageResolver.RegularImport import viper.gobra.frontend.info.base.BuiltInMemberTag import viper.gobra.frontend.info.base.BuiltInMemberTag.{BuiltInFPredicateTag, BuiltInFunctionTag, BuiltInMPredicateTag, BuiltInMethodTag, BuiltInTypeTag} import viper.gobra.frontend.info.base.SymbolTable._ -import viper.gobra.frontend.info.base.Type.{AdtClauseT, InterfaceT, StructT} +import viper.gobra.frontend.info.base.Type.{AdtT, InterfaceT, StructT} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.property.{AssignMode, StrictAssignMode} import viper.gobra.util.Violation @@ -92,7 +92,8 @@ trait NameResolution { case tree.parent.pair(decl: PDomainFunction, domain: PDomainType) => DomainFunction(decl, domain, this) - case tree.parent.pair(decl: PAdtClause, adtDecl: PAdtType) => AdtClause(decl, adtDecl, this) + case tree.parent.pair(decl: PAdtClause, tree.parent(typeDecl: PTypeDef)) => + AdtClause(decl, typeDecl, this) case tree.parent.pair(decl: PMatchBindVar, tree.parent.pair(_: PMatchStmtCase, matchE: PMatchStatement)) => MatchVariable(decl, matchE.exp, this) // match full expression of match statement @@ -249,8 +250,6 @@ trait NameResolution { private def packageLevelDefinitions(m: PMember): Vector[PIdnDef] = { /* Returns identifier definitions with a package scope occurring in a type. */ def leakingIdentifier(t: PType): Vector[PIdnDef] = t match { - case t: PDomainType => t.funcs.map(_.id) // domain functions - case t: PAdtType => t.clauses.map(_.id) // adt constructors case _ => Vector.empty } @@ -269,6 +268,36 @@ trait NameResolution { } } + /** + * returns the (package-level) identifiers defined by a member + * that have a priority lower than all other identifiers + */ + @scala.annotation.tailrec + private def latePackageLevelDefinitions(m: PMember): Vector[PIdnDef] = { + /* Returns identifier definitions with a package scope occurring in a type. */ + def leakingIdentifier(t: PType): Vector[PIdnDef] = t match { + case t: PDomainType => t.funcs.map(_.id) // domain functions + case t: PAdtType => t.clauses.map(_.id) // adt constructors + case _ => Vector.empty + } + + m match { + case a: PActualMember => a match { + case d: PTypeDecl => leakingIdentifier(d.right) + case _ => Vector.empty + } + case PExplicitGhostMember(a) => latePackageLevelDefinitions(a) + case _ => Vector.empty + } + } + + lazy val lateEnvironments: PPackage => Environment = + attr[PPackage, Environment] { p => + val definitions = p.declarations flatMap latePackageLevelDefinitions + val entities = definitions.map(d => serialize(d) -> defEntity(d)) + rootenv(entities: _*) + } + /** returns whether or not identified `id` is defined at node `n`. */ def isDefinedAt(id: PIdnNode, n: PNode): Boolean = isDefinedInScope(sequentialDefenv.in(n), serialize(id)) @@ -291,7 +320,13 @@ trait NameResolution { case c => Violation.violation(s"Only the root has no parent, but got $c") } - lazy val topLevelEnvironment: Environment = scopedDefenv(tree.originalRoot) + /** Symboltable imported by a package import. */ + lazy val topLevelEnvironment: Environment = { + val thisPkg = tree.originalRoot + val base = scopedDefenv(thisPkg) + val late = lateEnvironments(thisPkg) + base ++ late + } lazy val entity: PIdnNode => Entity = attr[PIdnNode, Entity] { @@ -321,7 +356,7 @@ trait NameResolution { // if the enclosing literal is a struct then id is a field case t: StructT => tryFieldLookup(t, id).map(_._1).getOrElse(UnknownEntity()) // if the enclosing literal is an adt clause then id is an adt field - case t: AdtClauseT => tryAdtMemberLookup(t, id).map(_._1).getOrElse(UnknownEntity()) + case t: AdtT => tryAdtMemberLookup(t, id).map(_._1).getOrElse(UnknownEntity()) // otherwise it is just a variable case _ => symbTableLookup(n) } @@ -384,8 +419,14 @@ trait NameResolution { case _ => None } + val level3: Level = n => + tryEnclosingPackage(n) match { + case Some(p) => tryLookup(lateEnvironments(p), serialize(n)) + case _ => None + } + /** order of precedence; first level has highest precedence */ - val levels: Seq[Level] = Seq(level0, level1, level2) + val levels: Seq[Level] = Seq(level0, level1, level2, level3) // returns first successfully defined entity otherwise `UnknownEntity()` levels.iterator.map(_(n)).find(_.isDefined).flatten.getOrElse(UnknownEntity()) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 40ad6d048..a050ad5a7 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -146,11 +146,12 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(p: ap.AdtClause) => val fields = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)) - AdtClauseT(fields.toMap, fields.map(_._1), p.symb.decl, p.symb.adtDecl, this) + AdtClauseT(p.symb.getName, fields, p.symb.decl, p.symb.typeDecl, p.symb.context) + case Some(p: ap.AdtField) => p.symb match { - case AdtDestructor(decl, _, context) => context.symbType(decl.typ) - case AdtDiscriminator(_, _, _) => BooleanT + case dest: AdtDestructor => dest.context.symbType(dest.decl.typ) + case _: AdtDiscriminator => BooleanT } // TODO: fully supporting packages results in further options: global variable @@ -1012,7 +1013,11 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => def expectedCompositeLitType(lit: PCompositeLit): Type = lit.typ match { case i: PImplicitSizeArrayType => ArrayT(lit.lit.elems.size, typeSymbType(i.elem)) - case t: PType => typeSymbType(t) + case t: PType => + typeSymbType(t) match { + case t: AdtClauseT => t.declaredType // adt constructors return the defined type + case t => t + } } private[typing] def wellDefIfConstExpr(expr: PExpression): Messages = underlyingType(typ(expr)) match { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala index c62376ec4..cd9c1b944 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala @@ -158,7 +158,7 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => // ADT clause is special since it is a type with a name that is not a named type case a: AdtClause => val fields = a.fields.map(f => f.id.name -> a.context.symbType(f.typ)) - AdtClauseT(fields.toMap, fields.map(_._1), a.decl, a.adtDecl, this) + AdtClauseT(a.getName, fields, a.decl, a.typeDecl, a.context) case BuiltInType(tag, _, _) => tag.typ case _ => violation(s"expected type, but got $id") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index bbfa0a00f..993be91a3 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -72,7 +72,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => isRecursiveInterface } - case t: PExpressionAndType => wellDefExprAndType(t).out + case t: PExpressionAndType => wellDefExprAndType(t).out ++ isType(t).out } lazy val typeSymbType: Typing[PType] = { @@ -156,9 +156,9 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => // ADT clause is special since it is a type with a name that is not a named type case Some(p: ap.AdtClause) => val fields = p.symb.fields.map(f => f.id.name -> p.symb.context.symbType(f.typ)) - AdtClauseT(fields.toMap, fields.map(_._1), p.symb.decl, p.symb.adtDecl, p.symb.context) + AdtClauseT(p.symb.getName, fields, p.symb.decl, p.symb.typeDecl, p.symb.context) - case _ => violation(s"expected type, but got $n") + case p => violation(s"expected type, but got $n with resolved pattern $p") } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index 6713908d8..c4880f6c8 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -131,7 +131,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case m@PMatchExp(exp, clauses) => val sameTypeE = allMergeableTypes.errors(clauses map { c => exprType(c.exp) })(exp) val patternE = m.caseClauses.flatMap(c => c.pattern match { - case PMatchAdt(clause, _) => assignableTo.errors(symbType(clause), exprType(exp))(c) + case p: PMatchAdt => assignableTo.errors(miscType(p), exprType(exp))(c) case _ => comparableTypes.errors((miscType(c.pattern), exprType(exp)))(c) }) val pureExpE = error(exp, "Expression has to be pure", !isPure(exp)(strong = false)) @@ -172,8 +172,10 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case PSequenceAppend(left, right) => isExpr(left).out ++ isExpr(right).out ++ { val t1 = exprType(left) val t2 = exprType(right) - error(left, s"expected a sequence, but got $t1", !t1.isInstanceOf[SequenceT]) ++ - error(right, s"expected a sequence, but got $t2", !t2.isInstanceOf[SequenceT]) ++ + val ut1 = underlyingType(t1) + val ut2 = underlyingType(t2) + error(left, s"expected a sequence, but got $t1", !ut1.isInstanceOf[SequenceT]) ++ + error(right, s"expected a sequence, but got $t2", !ut2.isInstanceOf[SequenceT]) ++ mergeableTypes.errors(t1, t2)(expr) } case PSequenceConversion(op) => exprType(op) match { @@ -188,15 +190,17 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case expr: PBinaryGhostExp => isExpr(expr.left).out ++ isExpr(expr.right).out ++ { val t1 = exprType(expr.left) val t2 = exprType(expr.right) - error(expr.left, s"expected an unordered collection, but got $t1", !t1.isInstanceOf[GhostUnorderedCollectionType]) ++ - error(expr.right, s"expected an unordered collection, but got $t2", !t2.isInstanceOf[GhostUnorderedCollectionType]) ++ + val ut1 = underlyingType(t1) + val ut2 = underlyingType(t2) + error(expr.left, s"expected an unordered collection, but got $t1", !ut1.isInstanceOf[GhostUnorderedCollectionType]) ++ + error(expr.right, s"expected an unordered collection, but got $t2", !ut2.isInstanceOf[GhostUnorderedCollectionType]) ++ mergeableTypes.errors(t1, t2)(expr) } - case PSetConversion(op) => exprType(op) match { + case PSetConversion(op) => underlyingType(exprType(op)) match { case SequenceT(_) | SetT(_) | OptionT(_) => isExpr(op).out case t => error(op, s"expected a sequence, set or option type, but got $t") } - case PMultisetConversion(op) => exprType(op) match { + case PMultisetConversion(op) => underlyingType(exprType(op)) match { case SequenceT(_) | MultisetT(_) | OptionT(_) => isExpr(op).out case t => error(op, s"expected a sequence, multiset or option type, but got $t") } @@ -278,7 +282,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => val lType = exprType(left) val rType = exprType(right) typeMerge(lType, rType) match { - case Some(seq@SequenceT(_)) => seq + case Some(seq) => seq case _ => violation(s"types $lType and $rType cannot be merged.") } case PSequenceConversion(op) => exprType(op) match { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala index a071b79af..5475fee63 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostIdTyping.scala @@ -40,15 +40,9 @@ trait GhostIdTyping { this: TypeInfoImpl => case predicate: Predicate => FunctionT(predicate.args map predicate.context.typ, AssertionT) case func: DomainFunction => FunctionT(func.args map func.context.typ, func.context.typ(func.result.outs.head)) - case AdtClause(decl, adtDecl, context) => - val fields = decl.args.flatMap(_.fields).map(f => f.id.name -> context.symbType(f.typ)) - AdtClauseT( - fields.toMap, - fields.map(_._1), - decl, - adtDecl, - context - ) + case c: AdtClause => + val fields = c.fields.map(f => f.id.name -> c.context.symbType(f.typ)) + AdtClauseT(c.getName, fields, c.decl, c.typeDecl, c.context) case MatchVariable(decl, p, context) => p match { case PMatchAdt(clause, fields) => diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala index 3ab5e4a53..ef273194c 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala @@ -10,7 +10,7 @@ import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, message, n import viper.gobra.ast.frontend._ import viper.gobra.frontend.info.base.SymbolTable import viper.gobra.frontend.info.base.SymbolTable.{BuiltInMPredicate, GhostTypeMember, MPredicateImpl, MPredicateSpec, MethodSpec} -import viper.gobra.frontend.info.base.Type.{AdtClauseT, AssertionT, BooleanT, FunctionT, PredT, Type, UnknownType} +import viper.gobra.frontend.info.base.Type.{AdtClauseT, AssertionT, BooleanT, DeclaredT, FunctionT, PredT, Type, UnknownType} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.BaseTyping import viper.gobra.ast.frontend.{AstPattern => ap} @@ -55,7 +55,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case PMatchAdt(clause, fields) => symbType(clause) match { case t: AdtClauseT => val fieldTypes = fields.map(typ) - val clauseFieldTypes = t.fieldTypes + val clauseFieldTypes = t.fields.map(_._2) error(m, s"Expected ${clauseFieldTypes.size} patterns, but got ${fieldTypes.size}", clauseFieldTypes.size != fieldTypes.size) ++ fieldTypes.zip(clauseFieldTypes).flatMap(a => assignableTo.errors(a)(m)) case _ => violation("Pattern matching only works on ADT Literals") @@ -191,7 +191,11 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case _: PAdtClause => UnknownType case exp: PMatchPattern => exp match { case PMatchBindVar(idn) => idType(idn) - case PMatchAdt(clause, _) => symbType(clause) + case PMatchAdt(clause, _) => + symbType(clause) match { + case t: AdtClauseT => t.declaredType + case t => t + } case PMatchValue(lit) => typ(lit) case w: PMatchWildcard => wildcardMatchType(w) } @@ -207,9 +211,11 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case MPredicateImpl(decl, ctx) => FunctionT(decl.args map ctx.typ, AssertionT) case MPredicateSpec(decl, _, ctx) => FunctionT(decl.args map ctx.typ, AssertionT) case _: SymbolTable.GhostStructMember => ??? - case SymbolTable.AdtDestructor(decl, _, ctx) => ctx.symbType(decl.typ) + case dest: SymbolTable.AdtDestructor => dest.context.symbType(dest.decl.typ) case _: SymbolTable.AdtDiscriminator => BooleanT + case const: SymbolTable.AdtClause => DeclaredT(const.typeDecl, const.context) case BuiltInMPredicate(tag, _, _) => typ(tag) + case f: SymbolTable.DomainFunction => FunctionT(f.args map f.context.typ, f.context.typ(f.result)) } implicit lazy val wellDefSpec: WellDefinedness[PSpecification] = createWellDef { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala index cceeb8f22..702adfbdf 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala @@ -29,7 +29,7 @@ trait GhostStmtTyping extends BaseTyping { this: TypeInfoImpl => error(n, "ghost error: expected ghostifiable statement", !optBlock.forall(_.isInstanceOf[PGhostifiableStatement])) case PApplyWand(wand) => assignableToSpec(wand) case PMatchStatement(exp, clauses, _) => clauses.flatMap(c => c.pattern match { - case PMatchAdt(clause, _) => assignableTo.errors(symbType(clause), exprType(exp))(c) + case p: PMatchAdt => assignableTo.errors(miscType(p), exprType(exp))(c) case _ => comparableTypes.errors((miscType(c.pattern), exprType(exp)))(c) }) ++ isPureExpr(exp) case p: PClosureImplProof => wellDefClosureImplProof(p) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala index 1c09b2279..fca06a828 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala @@ -6,11 +6,12 @@ package viper.gobra.frontend.info.implementation.typing.ghost -import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, noMessages} +import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages} import viper.gobra.ast.frontend._ import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.BaseTyping +import viper.gobra.util.Violation trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl => @@ -23,7 +24,13 @@ trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl => case n: PGhostSliceType => isType(n.elem).out case _: PDomainType => noMessages - case _: PAdtType => noMessages + case n: PAdtType => n match { + case tree.parent(_: PTypeDef) => + val t = adtSymbType(n) + adtConstructorSet(t).errors(n) ++ adtMemberSet(t).errors(n) + + case _ => error(n, "Adt types are only allowed within type declarations.") + } } private[typing] def ghostTypeSymbType(typ : PGhostType) : Type = typ match { @@ -34,6 +41,20 @@ trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl => case POptionType(elem) => OptionT(typeSymbType(elem)) case PGhostSliceType(elem) => GhostSliceT(typeSymbType(elem)) case t: PDomainType => DomainT(t, this) - case a: PAdtType => AdtT(a, this) + case a: PAdtType => adtSymbType(a) + } + + /** Requires that the parent of a is PTypeDef. */ + private def adtSymbType(a: PAdtType): Type = { + a match { + case tree.parent(decl: PTypeDef) => + val clauses = a.clauses.map { clause => + val fields = clause.args.flatMap(_.fields.map(f => f.id.name -> typeSymbType(f.typ))) + AdtClauseT(clause.id.name, fields, clause, decl, this) + } + AdtT(clauses, decl, this) + + case _ => Violation.violation(s"$a is not within a type declaration") + } } } diff --git a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala index a13be34e1..03ab482c8 100644 --- a/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/adts/AdtEncoding.scala @@ -349,6 +349,13 @@ class AdtEncoding extends LeafTypeEncoding { } } + override def assertion(ctx: Context): in.Assertion ==> CodeWriter[vpr.Exp] = { + + default(super.assertion(ctx)) { + case p: in.PatternMatchAss => translatePatternMatchAss(p)(ctx) + } + } + override def statement(ctx: Context): in.Stmt ==> CodeWriter[vpr.Stmt] = { default(super.statement(ctx)) { case p: in.PatternMatchStmt => translatePatternMatch(p)(ctx) @@ -389,25 +396,29 @@ class AdtEncoding extends LeafTypeEncoding { def translateCase(c: in.PatternMatchCaseStmt): CodeWriter[vpr.Stmt] = { val (cPos, cInfo, cErrT) = c.vprMeta - for { - check <- translateMatchPatternCheck(s.exp, c.mExp)(ctx) - setExVarV <- setExVar(cPos, cInfo, cErrT) - ass <- translateMatchPatternDeclarations(s.exp, c.mExp)(ctx) - body <- seqn(ctx.statement(c.body)) - } yield vpr.If( - vpr.And(check, vpr.Not(checkExVar)(cPos, cInfo, cErrT))(cPos, cInfo, cErrT), // Check(pi, e) && !b - vpr.Seqn(Seq(setExVarV, ass, body), Seq.empty)(cPos, cInfo, cErrT), // b := true; Assign(pi, e); [si] - vpr.Seqn(Seq(), Seq())(cPos, cInfo, cErrT) // empty else - )(cPos, cInfo, cErrT) + seqn( + for { + check <- translateMatchPatternCheck(s.exp, c.mExp)(ctx) + setExVarV <- setExVar(cPos, cInfo, cErrT) + ass <- translateMatchPatternDeclarations(s.exp, c.mExp)(ctx) + body <- ctx.statement(c.body) + } yield vpr.If( + vpr.And(check, vpr.Not(checkExVar)(cPos, cInfo, cErrT))(cPos, cInfo, cErrT), // Check(pi, e) && !b + vpr.Seqn(Seq(setExVarV, ass, body), Seq.empty)(cPos, cInfo, cErrT), // b := true; Assign(pi, e); [si] + vpr.Seqn(Seq(), Seq())(cPos, cInfo, cErrT) // empty else + )(cPos, cInfo, cErrT) + ) } - for { + val res = for { _ <- local(checkExVarDecl) _ <- write(initialExVar) cs <- sequence(s.cases map translateCase) _ <- write(cs: _*) _ <- if (s.strict) assert(checkExVar, (info, _) => MatchError(info)) else unit(()) } yield vu.nop(sPos, sInfo, sErrT) + + res } /** @@ -453,6 +464,49 @@ class AdtEncoding extends LeafTypeEncoding { } } + /** + * [e match { case1 p1: e1; ...; caseN pN: eN }] -> + * asserting Check(p1, e) || ... || Check(pN, e) in Match(case1 p1: e1; ...; caseN pN: eN; default: dflt(T), e) + * [e match { case1 p1: e1; ...; caseN pN: eN; default: e_ }] -> + * Match(case1 p1: e1; ...; caseN pN: eN; default: e_, e) + * + * Match(default: e_, e) -> e_ + * Match(case1 p1: e1; ...; caseN pN: eN; default: e_, e) -> + * Check(p1, e) ? AssignIn(p1, e, [e1]) : Match(case p2: e2; ...; caseN pN: eN; default: e_, e) + * + */ + def translatePatternMatchAss(e: in.PatternMatchAss)(ctx: Context): CodeWriter[vpr.Exp] = { + + def translateCases(cases: Vector[in.PatternMatchCaseAss], dflt: in.Assertion): CodeWriter[vpr.Exp] = { + val (ePos, eInfo, eErrT) = if (cases.isEmpty) dflt.vprMeta else cases.head.vprMeta + cases match { + case c +: cs => + for { + check <- translateMatchPatternCheck(e.exp, c.mExp)(ctx) + body <- ctx.assertion(c.ass) + decl <- declareIn(e.exp, c.mExp, body)(ctx) + el <- translateCases(cs, dflt) + } yield vpr.CondExp(check, decl, el)(ePos, eInfo, eErrT) + case _ => ctx.assertion(dflt) + } + } + + if (e.default.isDefined) { + translateCases(e.cases, e.default.get) + } else { + val (pos, info, errT) = e.vprMeta + + val checkExpressionMatchesOnePattern = + sequence(e.cases.map(c => translateMatchPatternCheck(e.exp, c.mExp)(ctx))).map(vu.bigOr(_)(pos, info, errT)) + + for { + matching <- translateCases(e.cases, in.ExprAssertion(in.BoolLit(b = true)(e.info))(e.info)) + checks <- checkExpressionMatchesOnePattern + checkedMatching <- assert(checks, matching, (info, _) => MatchError(info))(ctx) + } yield checkedMatching + } + } + /** * Encodes the check whether `expr` matches pattern * diff --git a/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala index b622f9df3..cba1ace53 100644 --- a/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala @@ -149,25 +149,25 @@ class SequenceEncoding extends LeafTypeEncoding { highT <- goE(high) } yield vpr.RangeSeq(lowT, highT)(pos, info, errT) - case n@ in.SequenceAppend(left, right) => + case n: in.SequenceAppend => val (pos, info, errT) = n.vprMeta for { - leftT <- goE(left) - rightT <- goE(right) + leftT <- goE(n.left) + rightT <- goE(n.right) } yield vpr.SeqAppend(leftT, rightT)(pos, info, errT) - case n@ in.SequenceDrop(left, right) => + case n: in.SequenceDrop => val (pos, info, errT) = n.vprMeta for { - leftT <- goE(left) - rightT <- goE(right) + leftT <- goE(n.left) + rightT <- goE(n.right) } yield vpr.SeqDrop(leftT, rightT)(pos, info, errT) - case n@ in.SequenceTake(left, right) => + case n: in.SequenceTake => val (pos, info, errT) = n.vprMeta for { - leftT <- goE(left) - rightT <- goE(right) + leftT <- goE(n.left) + rightT <- goE(n.right) } yield vpr.SeqTake(leftT, rightT)(pos, info, errT) } } diff --git a/src/main/scala/viper/gobra/translator/encodings/sets/SetEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/sets/SetEncoding.scala index d0418ce05..60075f11d 100644 --- a/src/main/scala/viper/gobra/translator/encodings/sets/SetEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/sets/SetEncoding.scala @@ -105,32 +105,32 @@ class SetEncoding extends LeafTypeEncoding { vE <- goE(e) } yield vpr.AnySetContains(vX, vE)(pos, info, errT) - case n@ in.Union(left, right) => + case n: in.Union => val (pos, info, errT) = n.vprMeta for { - leftT <- goE(left) - rightT <- goE(right) + leftT <- goE(n.left) + rightT <- goE(n.right) } yield vpr.AnySetUnion(leftT, rightT)(pos, info, errT) - case n@ in.Intersection(left, right) => + case n: in.Intersection => val (pos, info, errT) = n.vprMeta for { - leftT <- goE(left) - rightT <- goE(right) + leftT <- goE(n.left) + rightT <- goE(n.right) } yield vpr.AnySetIntersection(leftT, rightT)(pos, info, errT) - case n@ in.SetMinus(left, right) => + case n: in.SetMinus => val (pos, info, errT) = n.vprMeta for { - leftT <- goE(left) - rightT <- goE(right) + leftT <- goE(n.left) + rightT <- goE(n.right) } yield vpr.AnySetMinus(leftT, rightT)(pos, info, errT) - case n@ in.Subset(left, right) => + case n: in.Subset => val (pos, info, errT) = n.vprMeta for { - leftT <- goE(left) - rightT <- goE(right) + leftT <- goE(n.left) + rightT <- goE(n.right) } yield vpr.AnySetSubset(leftT, rightT)(pos, info, errT) } } diff --git a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala index 3983445f9..21ee86494 100644 --- a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala +++ b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala @@ -61,8 +61,8 @@ object ViperWriter { def container(data: Vector[DataKind]): DataContainer[K] = { val (own, other) = data.foldLeft[(Vector[K], Vector[DataKind])]((Vector.empty, Vector.empty)){ case ((ow, ot), e) => ownKind(e) match { - case None => (ow, e +: ot) - case Some(k) => (k +: ow, ot) + case None => (ow, ot :+ e) + case Some(k) => (ow :+ k, ot) } } diff --git a/src/test/resources/regressions/issues/000589.gobra b/src/test/resources/regressions/issues/000589.gobra new file mode 100644 index 000000000..207b2d8d4 --- /dev/null +++ b/src/test/resources/regressions/issues/000589.gobra @@ -0,0 +1,26 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type list adt { + Empty{} + + Cons{ + head any + tail list + } +} + +ghost +decreases l +func length(l list) int { + match l { + case Empty{}: + //:: ExpectedOutput(assert_error:assertion_error) + assert false // <--- assert false here should be reachable + return 0 + default: + return 0 + } +} \ No newline at end of file diff --git a/src/test/resources/regressions/issues/000641.gobra b/src/test/resources/regressions/issues/000641.gobra new file mode 100644 index 000000000..7477f710f --- /dev/null +++ b/src/test/resources/regressions/issues/000641.gobra @@ -0,0 +1,19 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type X adt { + C{ c int } +} + +ghost +func foo1(x X) + +ghost +func (x X) bar1() + +func client() { + foo1(C{}) + C{}.bar1() +} \ No newline at end of file diff --git a/src/test/resources/regressions/issues/000655.gobra b/src/test/resources/regressions/issues/000655.gobra index fcafa8991..72202eb71 100644 --- a/src/test/resources/regressions/issues/000655.gobra +++ b/src/test/resources/regressions/issues/000655.gobra @@ -13,4 +13,25 @@ pure func foo(x pkg.List) bool { case pkg.Cons{?head, pkg.Nil{}}: true case _: false } -} \ No newline at end of file +} + +ghost +func foo2() { + var x pkg.Tree = pkg.Branch{} + y := pkg.Branch{Left: x} + z := pkg.Branch{Right: x} +} + +/* +// should work in the future: + +ghost +pure func foo3(x pkg.Tree) bool { + return match x { + case pkg.Tree.Leaf{}: true + case pkg.Branch{?left, pkg.Tree.Leaf{}}: true + case pkg.Tree.Branch{pkg.Tree.Leaf{}, ?right}: true + case _: false + } +} +*/ \ No newline at end of file diff --git a/src/test/resources/regressions/issues/000655/pkg/f.gobra b/src/test/resources/regressions/issues/000655/pkg/f.gobra index 2252d81b9..6df472b61 100644 --- a/src/test/resources/regressions/issues/000655/pkg/f.gobra +++ b/src/test/resources/regressions/issues/000655/pkg/f.gobra @@ -12,3 +12,11 @@ type List adt { Nil {} } +type Tree adt { + Leaf{} + Branch{ Left, Right Tree } +} + +func Leaf() { +} + diff --git a/src/test/resources/regressions/issues/000685.gobra b/src/test/resources/regressions/issues/000685.gobra new file mode 100644 index 000000000..98a8388b2 --- /dev/null +++ b/src/test/resources/regressions/issues/000685.gobra @@ -0,0 +1,23 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type X adt { + C{ c any } +} + +func foo() { + x := C{5} + var i any = x + + assert typeOf(i) == type[X] + assert i.(X).c == 5 + assert i == C{5} + + i = C{5} + + assert typeOf(i) == type[X] + assert i.(X).c == 5 + assert i == C{5} +} \ No newline at end of file diff --git a/src/test/resources/regressions/issues/000686-1.gobra b/src/test/resources/regressions/issues/000686-1.gobra new file mode 100644 index 000000000..8c76b33ee --- /dev/null +++ b/src/test/resources/regressions/issues/000686-1.gobra @@ -0,0 +1,23 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type X adt { + A { a int } + B { b bool } +} + +requires match x { + case A{5}: acc(c) + case _: acc(c) +} +func foo1(c *int, ghost x X) { +} + +requires match x { + case A{5}: acc(c) + case _: true +} +func foo2(c *int, ghost x X) { +} \ No newline at end of file diff --git a/src/test/resources/regressions/issues/000686-2.gobra b/src/test/resources/regressions/issues/000686-2.gobra new file mode 100644 index 000000000..c7a30bfe0 --- /dev/null +++ b/src/test/resources/regressions/issues/000686-2.gobra @@ -0,0 +1,18 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type X adt { + A { a int } + B { b bool } +} + +type A int + +func client1() { + x := X.A{} + y := B{} +} + + diff --git a/src/test/resources/regressions/issues/000686-3.gobra b/src/test/resources/regressions/issues/000686-3.gobra new file mode 100644 index 000000000..c145f4ba5 --- /dev/null +++ b/src/test/resources/regressions/issues/000686-3.gobra @@ -0,0 +1,19 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type X adt { + A { int } + B { bool; bool } + C {} + D { bool; z bool } + E { bool; x, y bool } + F { q X } +} + +func client() { + x := A{3} + y := C{} +} + diff --git a/src/test/resources/regressions/issues/000686-4.gobra b/src/test/resources/regressions/issues/000686-4.gobra new file mode 100644 index 000000000..435cb1095 --- /dev/null +++ b/src/test/resources/regressions/issues/000686-4.gobra @@ -0,0 +1,16 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type X seq[int] + +ghost +requires x == x ++ y +func client1(x seq[int], y X) + +ghost +requires typeOf(y) == type[X] +requires x == x ++ y.(X) +func client2(x seq[int], y any) + diff --git a/src/test/resources/regressions/issues/000686-5.gobra b/src/test/resources/regressions/issues/000686-5.gobra new file mode 100644 index 000000000..435cb1095 --- /dev/null +++ b/src/test/resources/regressions/issues/000686-5.gobra @@ -0,0 +1,16 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +type X seq[int] + +ghost +requires x == x ++ y +func client1(x seq[int], y X) + +ghost +requires typeOf(y) == type[X] +requires x == x ++ y.(X) +func client2(x seq[int], y any) + diff --git a/src/test/resources/regressions/issues/000686-6.gobra b/src/test/resources/regressions/issues/000686-6.gobra new file mode 100644 index 000000000..289612084 --- /dev/null +++ b/src/test/resources/regressions/issues/000686-6.gobra @@ -0,0 +1,12 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +//:: ExpectedOutput(type_error) +type X adt { + A { x int } + B { x int } +} + + diff --git a/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala b/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala index 13478a06a..926b112c9 100644 --- a/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala +++ b/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala @@ -211,7 +211,8 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi test("Printer: should show a set union as expected") { val expr = Union( LocalVar("s", setT(boolT))(Internal), - LocalVar("t", setT(boolT))(Internal) + LocalVar("t", setT(boolT))(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -223,9 +224,11 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val expr = Union( Union( LocalVar("s", setT(boolT))(Internal), - LocalVar("t", setT(boolT))(Internal) + LocalVar("t", setT(boolT))(Internal), + setT(boolT) )(Internal), - LocalVar("u", setT(boolT))(Internal) + LocalVar("u", setT(boolT))(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -238,8 +241,10 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi LocalVar("s", setT(boolT))(Internal), Union( LocalVar("t", setT(boolT))(Internal), - LocalVar("u", setT(boolT))(Internal) - )(Internal) + LocalVar("u", setT(boolT))(Internal), + setT(boolT) + )(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -256,6 +261,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi LocalVar("t", sequenceT(boolT))(Internal), LocalVar("u", sequenceT(boolT))(Internal) ))(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -266,7 +272,8 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi test("Printer: should show a set intersection as expected") { val expr = Intersection( LocalVar("s", setT(boolT))(Internal), - LocalVar("t", setT(boolT))(Internal) + LocalVar("t", setT(boolT))(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -278,9 +285,11 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val expr = Intersection( Intersection( LocalVar("s", setT(boolT))(Internal), - LocalVar("t", setT(boolT))(Internal) + LocalVar("t", setT(boolT))(Internal), + setT(boolT) )(Internal), - LocalVar("u", setT(boolT))(Internal) + LocalVar("u", setT(boolT))(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -293,8 +302,10 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi LocalVar("s", setT(boolT))(Internal), Intersection( LocalVar("t", setT(boolT))(Internal), - LocalVar("u", setT(boolT))(Internal) - )(Internal) + LocalVar("u", setT(boolT))(Internal), + setT(boolT) + )(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -311,6 +322,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi LocalVar("t", boolT)(Internal), LocalVar("u", boolT)(Internal) ))(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -321,7 +333,8 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi test("Printer: should show a set difference as expected") { val expr = SetMinus( LocalVar("s", setT(boolT))(Internal), - LocalVar("t", setT(boolT))(Internal) + LocalVar("t", setT(boolT))(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -333,9 +346,11 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val expr = SetMinus( SetMinus( LocalVar("s", setT(boolT))(Internal), - LocalVar("t", setT(boolT))(Internal) + LocalVar("t", setT(boolT))(Internal), + setT(boolT) )(Internal), - LocalVar("u", setT(boolT))(Internal) + LocalVar("u", setT(boolT))(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -348,8 +363,10 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi LocalVar("s", setT(boolT))(Internal), SetMinus( LocalVar("t", setT(boolT))(Internal), - LocalVar("u", setT(boolT))(Internal) - )(Internal) + LocalVar("u", setT(boolT))(Internal), + setT(boolT) + )(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -366,6 +383,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi LocalVar("t", setT(boolT))(Internal), LocalVar("u", setT(boolT))(Internal) ))(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -487,8 +505,9 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val expr = Length( Intersection( LocalVar("s", setT(boolT))(Internal), - LocalVar("t", setT(boolT))(Internal) - )(Internal) + LocalVar("t", setT(boolT))(Internal), + setT(boolT) + )(Internal), )(Internal) frontend.show(expr) should matchPattern { @@ -584,7 +603,8 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi test("Printer: should correctly show the union of two multiset integer literals") { val expr = Union( MultisetLit(intT, Vector(IntLit(1)(Internal), IntLit(2)(Internal)))(Internal), - MultisetLit(intT, Vector(IntLit(3)(Internal)))(Internal) + MultisetLit(intT, Vector(IntLit(3)(Internal)))(Internal), + multisetT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -595,7 +615,8 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi test("Printer: should correctly show the intersection of two multiset integer literals") { val expr = Intersection( MultisetLit(intT, Vector(IntLit(1)(Internal), IntLit(2)(Internal)))(Internal), - MultisetLit(intT, Vector(IntLit(3)(Internal)))(Internal) + MultisetLit(intT, Vector(IntLit(3)(Internal)))(Internal), + multisetT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -690,7 +711,8 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val expr = SetConversion( SequenceAppend( LocalVar("xs", sequenceT(boolT))(Internal), - LocalVar("ys", sequenceT(boolT))(Internal) + LocalVar("ys", sequenceT(boolT))(Internal), + sequenceT(boolT) )(Internal) )(Internal) @@ -702,7 +724,8 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi test("Printer: should correctly show the union of two set conversions") { val expr = Union( SetConversion(LocalVar("xs", sequenceT(boolT))(Internal))(Internal), - SetConversion(LocalVar("ys", sequenceT(boolT))(Internal))(Internal) + SetConversion(LocalVar("ys", sequenceT(boolT))(Internal))(Internal), + setT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -764,7 +787,8 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val expr = MultisetConversion( SequenceAppend( LocalVar("xs", sequenceT(boolT))(Internal), - LocalVar("ys", sequenceT(boolT))(Internal) + LocalVar("ys", sequenceT(boolT))(Internal), + sequenceT(boolT) )(Internal) )(Internal) @@ -776,7 +800,8 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi test("Printer: should correctly show the union of two multiset conversions") { val expr = Union( MultisetConversion(LocalVar("xs", sequenceT(boolT))(Internal))(Internal), - MultisetConversion(LocalVar("ys", sequenceT(boolT))(Internal))(Internal) + MultisetConversion(LocalVar("ys", sequenceT(boolT))(Internal))(Internal), + multisetT(boolT) )(Internal) frontend.show(expr) should matchPattern { @@ -884,7 +909,8 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val expr = Length( SequenceAppend( SequenceLit(1, boolT, Map(BigInt(0) -> BoolLit(false)(Internal)))(Internal), - LocalVar("xs", sequenceT(boolT))(Internal) + LocalVar("xs", sequenceT(boolT))(Internal), + sequenceT(boolT) )(Internal) )(Internal) @@ -1096,7 +1122,8 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi test("Printer: should correctly show the append of two sequence conversion operations") { val expr = SequenceAppend( SequenceConversion(LocalVar("xs", sequenceT(intT))(Internal))(Internal), - SequenceConversion(LocalVar("a", exclusiveArrayT(6, intT))(Internal))(Internal) + SequenceConversion(LocalVar("a", exclusiveArrayT(6, intT))(Internal))(Internal), + sequenceT(intT) )(Internal) frontend.show(expr) should matchPattern { From ac59357695123ad47cbed04a06f106bde9c6d8b9 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Sat, 7 Oct 2023 17:55:56 +0200 Subject: [PATCH 171/296] Updates submodules (#688) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index e68d7d2d8..031099450 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit e68d7d2d8cc04f4a95d9846682425dd6e3b07ff4 +Subproject commit 0310994503fd1f6d538277b25e51ee4ef52e9b41 From b33f225ffe32d6218657dab62b6382453661e513 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 12 Oct 2023 12:30:04 +0200 Subject: [PATCH 172/296] Updates submodules (#689) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 031099450..1903805e1 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 0310994503fd1f6d538277b25e51ee4ef52e9b41 +Subproject commit 1903805e1cb3c44da5911e45f40dcd101a64f8f3 From 6c2740c945c62360427458ee61912a141079d85c Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 26 Oct 2023 15:05:28 -0700 Subject: [PATCH 173/296] removes an overly restrictive violation in the channel encoding --- .../translator/encodings/channels/ChannelEncoding.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala index 1d6567738..39ece2598 100644 --- a/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala @@ -14,7 +14,6 @@ import viper.gobra.theory.Addressability.{Exclusive, Shared} import viper.gobra.translator.encodings.combinators.LeafTypeEncoding import viper.gobra.translator.context.Context import viper.gobra.translator.util.ViperWriter.CodeWriter -import viper.gobra.util.Violation.violation import viper.silver.{ast => vpr} class ChannelEncoding extends LeafTypeEncoding { @@ -167,8 +166,8 @@ class ChannelEncoding extends LeafTypeEncoding { } yield ass ) - case stmt@in.Send(channel :: ctx.Channel(typeParam), message, sendChannel, sendGivenPerm, sendGotPerm) => - violation(message.typ == typeParam, s"message type ${message.typ} has to be the same as the channel element type $typeParam") + case stmt@in.Send(channel :: ctx.Channel(_), message, sendChannel, sendGivenPerm, sendGotPerm) => + // note that the message type might not be identical to the channel element type but is assignable (as checked by the type checker)! val (pos, info, errT) = stmt.vprMeta val sendChannelPred = in.Accessible.Predicate(in.MPredicateAccess(channel, sendChannel, Vector())(stmt.info)) seqn( From 660e662e74f331f9cb819737f183ed377cf0302f Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 26 Oct 2023 16:55:04 -0700 Subject: [PATCH 174/296] adapts channel encoding to allow assignable instead of equal message types for channel send operations --- .../viper/gobra/reporting/VerifierError.scala | 2 +- .../encodings/channels/ChannelEncoding.scala | 19 +++++------ .../resources/regressions/issues/000695.gobra | 32 +++++++++++++++++++ 3 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 src/test/resources/regressions/issues/000695.gobra diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala index a2877f4cb..dc997bd12 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierError.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala @@ -340,7 +340,7 @@ case class ChannelReceiveError(info: Source.Verifier.Info) extends VerificationE case class ChannelSendError(info: Source.Verifier.Info) extends VerificationError { override def localId: String = "send_error" - override def localMessage: String = s"The receive expression ${info.trySrc[PSendStmt](" ")}might fail" + override def localMessage: String = s"The send expression ${info.trySrc[PSendStmt](" ")}might fail" } case class FunctionTerminationError(info: Source.Verifier.Info) extends VerificationError { diff --git a/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala index 39ece2598..4a6d21074 100644 --- a/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala @@ -67,7 +67,7 @@ class ChannelEncoding extends LeafTypeEncoding { ) // exhale [c].RecvGivenPerm()() - recvGivenPermInst = getChannelInvariantAccess(channel, recvGivenPerm, Vector())(exp.info) + recvGivenPermInst = getChannelInvariantAccess(channel, recvGivenPerm, Vector.empty, Vector.empty)(exp.info) vprRecvGivenPermInst <- ctx.assertion(recvGivenPermInst) _ <- exhale(vprRecvGivenPermInst, (info, _) => ChannelReceiveError(info) dueTo InsufficientPermissionFromTagError(s"${channel.info.tag}.RecvGivenPerm()()") @@ -84,7 +84,7 @@ class ChannelEncoding extends LeafTypeEncoding { // inhale res != Dflt[T] ==> [c].RecvGotPerm()(res) isNotZero = in.UneqCmp(res, in.DfltVal(res.typ)(exp.info))(exp.info) - recvGotPermInst = getChannelInvariantAccess(channel, recvGotPerm, Vector(res))(exp.info) + recvGotPermInst = getChannelInvariantAccess(channel, recvGotPerm, Vector(res), Vector(typeParam))(exp.info) notZeroImpl = in.Implication(isNotZero, recvGotPermInst)(exp.info) vprNotZeroImpl <- ctx.assertion(notZeroImpl) vprInhaleNotZeroImpl = vpr.Inhale(vprNotZeroImpl)(pos, info, errT) @@ -166,7 +166,7 @@ class ChannelEncoding extends LeafTypeEncoding { } yield ass ) - case stmt@in.Send(channel :: ctx.Channel(_), message, sendChannel, sendGivenPerm, sendGotPerm) => + case stmt@in.Send(channel :: ctx.Channel(typeParam), message, sendChannel, sendGivenPerm, sendGotPerm) => // note that the message type might not be identical to the channel element type but is assignable (as checked by the type checker)! val (pos, info, errT) = stmt.vprMeta val sendChannelPred = in.Accessible.Predicate(in.MPredicateAccess(channel, sendChannel, Vector())(stmt.info)) @@ -179,14 +179,14 @@ class ChannelEncoding extends LeafTypeEncoding { ) // exhale [c].SendGivenPerm()([m]) - sendGivenPermInst = getChannelInvariantAccess(channel, sendGivenPerm, Vector(message))(stmt.info) + sendGivenPermInst = getChannelInvariantAccess(channel, sendGivenPerm, Vector(message), Vector(typeParam))(stmt.info) vprSendGivenPermInst <- ctx.assertion(sendGivenPermInst) _ <- exhale(vprSendGivenPermInst, (info, _) => ChannelSendError(info) dueTo InsufficientPermissionFromTagError(s"${channel.info.tag}.SendGivenPerm()(${message.info.tag})") ) // inhale [c].SendGotPerm()() - sendGotPermInst = getChannelInvariantAccess(channel, sendGotPerm, Vector())(stmt.info) + sendGotPermInst = getChannelInvariantAccess(channel, sendGotPerm, Vector.empty, Vector.empty)(stmt.info) vprSendGotPermInst <- ctx.assertion(sendGotPermInst) vprInhaleSendGotPermInst = vpr.Inhale(vprSendGotPermInst)(pos, info, errT) } yield vprInhaleSendGotPermInst @@ -208,7 +208,7 @@ class ChannelEncoding extends LeafTypeEncoding { ) // exhale [c].RecvGivenPerm()() - recvGivenPermInst = getChannelInvariantAccess(channel, recvGivenPerm, Vector())(stmt.info) + recvGivenPermInst = getChannelInvariantAccess(channel, recvGivenPerm, Vector.empty, Vector.empty)(stmt.info) vprRecvGivenPermInst <- ctx.assertion(recvGivenPermInst) _ <- exhale(vprRecvGivenPermInst, (info, _) => ChannelReceiveError(info) dueTo InsufficientPermissionFromTagError(s"${channel.info.tag}.RecvGivenPerm()()") @@ -227,7 +227,7 @@ class ChannelEncoding extends LeafTypeEncoding { _ <- write(vprInhaleRecvChannelFull) // inhale ok ==> [c].RecvGotPerm()(res) - recvGotPermInst = getChannelInvariantAccess(channel, recvGotPerm, Vector(res))(stmt.info) + recvGotPermInst = getChannelInvariantAccess(channel, recvGotPerm, Vector(res), Vector(typeParam))(stmt.info) okImpl = in.Implication(ok, recvGotPermInst)(stmt.info) vprOkImpl <- ctx.assertion(okImpl) vprInhaleOkImpl = vpr.Inhale(vprOkImpl)(pos, info, errT) @@ -259,8 +259,9 @@ class ChannelEncoding extends LeafTypeEncoding { /** * Constructs `[channel].invariant()([args])` */ - private def getChannelInvariantAccess(channel: in.Expr, invariant: in.MethodProxy, args: Vector[in.Expr])(src: Source.Parser.Info): in.Access = { - val permReturnT = in.PredT(args.map(_.typ), Addressability.outParameter) + private def getChannelInvariantAccess(channel: in.Expr, invariant: in.MethodProxy, args: Vector[in.Expr], argTypes: Vector[in.Type])(src: Source.Parser.Info): in.Access = { + require(args.length == argTypes.length) + val permReturnT = in.PredT(argTypes, Addressability.outParameter) val permPred = in.PureMethodCall(channel, invariant, Vector(), permReturnT)(src) in.Access(in.Accessible.PredExpr(in.PredExprInstance(permPred, args)(src)), in.FullPerm(src))(src) } diff --git a/src/test/resources/regressions/issues/000695.gobra b/src/test/resources/regressions/issues/000695.gobra new file mode 100644 index 000000000..4edad1b2a --- /dev/null +++ b/src/test/resources/regressions/issues/000695.gobra @@ -0,0 +1,32 @@ +package issue000695 + +type ChannelMsgType int + +const ChannelMsg1 = 42 +const ChannelMsg2 ChannelMsgType = 43 + +pred sendInvariant(v ChannelMsgType) { + true +} + +requires acc(channel.SendChannel(), 1/2) +requires channel.SendGivenPerm() == sendInvariant!<_!> +requires channel.SendGotPerm() == PredTrue! +func sendMsg1(channel chan ChannelMsgType) { + fold sendInvariant!<_!>(ChannelMsg1) + fold PredTrue!() + assert acc(channel.SendChannel(), _) && sendInvariant!<_!>(ChannelMsg1) + assert acc(channel.SendChannel(), _) && channel.SendGivenPerm()(ChannelMsg1) + channel <- ChannelMsg1 +} + +requires acc(channel.SendChannel(), 1/2) +requires channel.SendGivenPerm() == sendInvariant!<_!> +requires channel.SendGotPerm() == PredTrue! +func sendMsg2(channel chan ChannelMsgType) { + fold sendInvariant!<_!>(ChannelMsg2) + fold PredTrue!() + assert acc(channel.SendChannel(), _) && sendInvariant!<_!>(ChannelMsg2) + assert acc(channel.SendChannel(), _) && channel.SendGivenPerm()(ChannelMsg2) + channel <- ChannelMsg2 +} From 108cf4a4bec0ad164377c782085768cabee1aa0f Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 26 Oct 2023 16:57:34 -0700 Subject: [PATCH 175/296] adds necessary license header --- src/test/resources/regressions/issues/000695.gobra | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/resources/regressions/issues/000695.gobra b/src/test/resources/regressions/issues/000695.gobra index 4edad1b2a..f8832ac93 100644 --- a/src/test/resources/regressions/issues/000695.gobra +++ b/src/test/resources/regressions/issues/000695.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package issue000695 type ChannelMsgType int From e728163210de91fc4455c94577ddb853c2ef0084 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 27 Oct 2023 15:06:54 -0700 Subject: [PATCH 176/296] fixes desugarer to use correct position manager when duplicating source position for a full permission --- .../scala/viper/gobra/frontend/Desugar.scala | 4 +-- .../resources/regressions/issues/000697.gobra | 32 +++++++++++++++++++ .../regressions/issues/000697/pkg/pkg.gobra | 17 ++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/regressions/issues/000697.gobra create mode 100644 src/test/resources/regressions/issues/000697/pkg/pkg.gobra diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 241421109..f38c49dc5 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -4532,10 +4532,10 @@ object Desugar extends LazyLogging { case n: PInvoke => // a predicate invocation corresponds to a predicate access with full permissions - // register the full permission AST node in the position manager such that its meta information + // register the full permission AST node in `info`'s position manager such that its meta information // is retrievable in predicateCallD val perm = PFullPerm() - pom.positions.dupPos(n, perm) + info.tree.root.positions.positions.dupPos(n, perm) predicateCallD(ctx, info)(n, perm) case PForall(vars, triggers, body) => diff --git a/src/test/resources/regressions/issues/000697.gobra b/src/test/resources/regressions/issues/000697.gobra new file mode 100644 index 000000000..529a9dfe3 --- /dev/null +++ b/src/test/resources/regressions/issues/000697.gobra @@ -0,0 +1,32 @@ +package issue000697 + +// ##(-I ./000697/) +import pkg "pkg" + +type Impl struct{ + x *int +} + +pred (impl Impl) inv() { + acc(impl.x) +} + +func main() { + x@ := 0 + + cl := preserves acc(&x) + func closureImpl() int { + x += 42 + return x + } + + proof cl implements pkg.ClosureSpec{Impl{&x}} { + unfold Impl{&x}.inv() + res = cl() as closureImpl + fold Impl{&x}.inv() + } + + impl := Impl{&x} + fold impl.inv() + pkg.Invoke(cl, impl) +} diff --git a/src/test/resources/regressions/issues/000697/pkg/pkg.gobra b/src/test/resources/regressions/issues/000697/pkg/pkg.gobra new file mode 100644 index 000000000..74a504b36 --- /dev/null +++ b/src/test/resources/regressions/issues/000697/pkg/pkg.gobra @@ -0,0 +1,17 @@ +package pkg + +type Calls interface { + pred inv() +} + +ghost +requires cs != nil +preserves cs.inv() +func ClosureSpec(ghost cs Calls) (res int) + +requires fn implements ClosureSpec{cs} +requires cs != nil && cs.inv() +ensures cs.inv() +func Invoke(fn func () (int), ghost cs Calls) int { + return fn() as ClosureSpec{cs} +} From b4870548ebee0f532425ebfdd31c173926248f4b Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 27 Oct 2023 15:18:58 -0700 Subject: [PATCH 177/296] adds missing headers --- src/test/resources/regressions/issues/000697.gobra | 3 +++ src/test/resources/regressions/issues/000697/pkg/pkg.gobra | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/test/resources/regressions/issues/000697.gobra b/src/test/resources/regressions/issues/000697.gobra index 529a9dfe3..51528815f 100644 --- a/src/test/resources/regressions/issues/000697.gobra +++ b/src/test/resources/regressions/issues/000697.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package issue000697 // ##(-I ./000697/) diff --git a/src/test/resources/regressions/issues/000697/pkg/pkg.gobra b/src/test/resources/regressions/issues/000697/pkg/pkg.gobra index 74a504b36..aea827382 100644 --- a/src/test/resources/regressions/issues/000697/pkg/pkg.gobra +++ b/src/test/resources/regressions/issues/000697/pkg/pkg.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package pkg type Calls interface { From 78e260376c10e33c50ebe030a1bb106dc2f52ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 30 Oct 2023 11:39:02 +0100 Subject: [PATCH 178/296] Treat values of type InternalSingleMulti(t, ms) as t for nested dictionaries (#699) * backup * tests from Dionisios * cleanup --- .../implementation/typing/ExprTyping.scala | 109 ++++++++++-------- .../typing/ghost/GhostExprTyping.scala | 21 ++-- .../scala/viper/gobra/translator/Names.scala | 1 + .../features/maps/maps-nested.gobra | 11 ++ .../options/options-nested-maps.gobra | 19 +++ 5 files changed, 103 insertions(+), 58 deletions(-) create mode 100644 src/test/resources/regressions/features/maps/maps-nested.gobra create mode 100644 src/test/resources/regressions/features/options/options-nested-maps.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index a050ad5a7..6cd1831b1 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -305,49 +305,53 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val baseType = exprType(base) val idxType = exprType(index) (underlyingType(baseType), underlyingType(idxType)) match { - case (ArrayT(l, _), IntT(_)) => - val idxOpt = intConstantEval(index) - error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) - - case (PointerT(ArrayT(l, _)), IntT(_)) => - val idxOpt = intConstantEval(index) - error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) - - case (SequenceT(_), IntT(_)) => - noMessages - - case (_: SliceT | _: GhostSliceT, IntT(_)) => - noMessages - - case (VariadicT(_), IntT(_)) => - noMessages + case (Single(base), Single(idx)) => (base, idx) match { + case (ArrayT(l, _), IntT(_)) => + val idxOpt = intConstantEval(index) + error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) + + case (PointerT(ArrayT(l, _)), IntT(_)) => + val idxOpt = intConstantEval(index) + error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) + + case (SequenceT(_), IntT(_)) => + noMessages + + case (_: SliceT | _: GhostSliceT, IntT(_)) => + noMessages + + case (VariadicT(_), IntT(_)) => + noMessages + + case (StringT, IntT(_)) => + error(n, "Indexing a string is currently not supported") + + case (MapT(key, _), underlyingIdxType) => + // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation + // between two types, which is less precise. Because of this limitation, and with the goal of handling + // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go + // expressions that are not accepted by the compiler. + val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key)) + if (assignableToIdxType.nonEmpty) { + error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key)) + } else { + assignableToIdxType + } - case (StringT, IntT(_)) => - error(n, "Indexing a string is currently not supported") - - case (MapT(key, _), underlyingIdxType) => - // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation - // between two types, which is less precise. Because of this limitation, and with the goal of handling - // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go - // expressions that are not accepted by the compiler. - val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key)) - if (assignableToIdxType.nonEmpty) { - error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key)) - } else { - assignableToIdxType - } + case (MathMapT(key, _), underlyingIdxType) => + // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation + // between two types, which is less precise. Because of this limitation, and with the goal of handling + // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go + // expressions that are not accepted by the compiler. + val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key)) + if (assignableToIdxType.nonEmpty) { + error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key)) + } else { + assignableToIdxType + } - case (MathMapT(key, _), underlyingIdxType) => - // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation - // between two types, which is less precise. Because of this limitation, and with the goal of handling - // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go - // expressions that are not accepted by the compiler. - val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key)) - if (assignableToIdxType.nonEmpty) { - error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key)) - } else { - assignableToIdxType - } + case (bt, it) => error(n, s"$it index is not a proper index of $bt") + } case (bt, it) => error(n, s"$it index is not a proper index of $bt") } @@ -669,16 +673,19 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val baseType = exprType(base) val idxType = exprType(index) (underlyingType(baseType), underlyingType(idxType)) match { - case (ArrayT(_, elem), IntT(_)) => elem - case (PointerT(ArrayT(_, elem)), IntT(_)) => elem - case (SequenceT(elem), IntT(_)) => elem - case (SliceT(elem), IntT(_)) => elem - case (GhostSliceT(elem), IntT(_)) => elem - case (VariadicT(elem), IntT(_)) => elem - case (MapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) => - InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT))) - case (MathMapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) => - InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT))) + case (Single(base), Single(idx)) => (base, idx) match { + case (ArrayT(_, elem), IntT(_)) => elem + case (PointerT(ArrayT(_, elem)), IntT(_)) => elem + case (SequenceT(elem), IntT(_)) => elem + case (SliceT(elem), IntT(_)) => elem + case (GhostSliceT(elem), IntT(_)) => elem + case (VariadicT(elem), IntT(_)) => elem + case (MapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) => + InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT))) + case (MathMapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) => + InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT))) + case (bt, it) => violation(s"$it is not a valid index for the the base $bt") + } case (bt, it) => violation(s"$it is not a valid index for the the base $bt") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index c4880f6c8..afbcf63e5 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -205,11 +205,11 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case t => error(op, s"expected a sequence, multiset or option type, but got $t") } case PMapKeys(exp) => underlyingType(exprType(exp)) match { - case _: MathMapT | _: MapT => isExpr(exp).out + case Single(_: MathMapT | _: MapT) => isExpr(exp).out case t => error(expr, s"expected a map, but got $t") } case PMapValues(exp) => underlyingType(exprType(exp)) match { - case _: MathMapT | _: MapT => isExpr(exp).out + case Single(_: MathMapT | _: MapT) => isExpr(exp).out case t => error(expr, s"expected a map, but got $t") } } @@ -260,7 +260,14 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case _: PGhostEquals | _: PGhostUnequals => BooleanT case POptionNone(t) => OptionT(typeSymbType(t)) - case POptionSome(e) => OptionT(exprType(e)) + case POptionSome(e) => + val et = exprType(e) + val ut = underlyingType(et) + ut match { + case Single(t) => OptionT(t) + case t => violation(s"expected a single type, but got $t") + } + case POptionGet(e) => exprType(e) match { case OptionT(t) => t case t => violation(s"expected an option type, but got $t") @@ -308,13 +315,13 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"expected a sequence, set, multiset or option type, but got $t") } case PMapKeys(exp) => underlyingType(exprType(exp)) match { - case t: MathMapT => SetT(t.key) - case t: MapT => SetT(t.key) + case Single(t: MathMapT) => SetT(t.key) + case Single(t: MapT) => SetT(t.key) case t => violation(s"expected a map, but got $t") } case PMapValues(exp) => underlyingType(exprType(exp)) match { - case t: MathMapT => SetT(t.elem) - case t: MapT => SetT(t.elem) + case Single(t: MathMapT) => SetT(t.elem) + case Single(t: MapT) => SetT(t.elem) case t => violation(s"expected a map, but got $t") } } diff --git a/src/main/scala/viper/gobra/translator/Names.scala b/src/main/scala/viper/gobra/translator/Names.scala index 8befa7395..3168fa953 100644 --- a/src/main/scala/viper/gobra/translator/Names.scala +++ b/src/main/scala/viper/gobra/translator/Names.scala @@ -62,6 +62,7 @@ object Names { case in.ArrayT(len, elemT, addr) => s"Array$len${serializeType(elemT)}${serializeAddressability(addr)}" case in.SliceT(elemT, addr) => s"Slice${serializeType(elemT)}${serializeAddressability(addr)}" case in.MapT(keyT, valueT, addr) => s"Map${serializeType(keyT)}_${serializeType(valueT)}_${serializeAddressability(addr)}" + case in.MathMapT(keyT, valueT, addr) => s"Dict${serializeType(keyT)}_${serializeType(valueT)}_${serializeAddressability(addr)}" case in.SequenceT(elemT, addr) => s"Sequence${serializeType(elemT)}${serializeAddressability(addr)}" case in.SetT(elemT, addr) => s"Set${serializeType(elemT)}${serializeAddressability(addr)}" case in.MultisetT(elemT, addr) => s"Multiset${serializeType(elemT)}${serializeAddressability(addr)}" diff --git a/src/test/resources/regressions/features/maps/maps-nested.gobra b/src/test/resources/regressions/features/maps/maps-nested.gobra new file mode 100644 index 000000000..9d0072258 --- /dev/null +++ b/src/test/resources/regressions/features/maps/maps-nested.gobra @@ -0,0 +1,11 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +ghost +func foo(){ + mm := dict[int](dict[int]int){1 : {2:3}} + assert mm[1][2] == 3 + assert 2 in domain(mm[1]) +} diff --git a/src/test/resources/regressions/features/options/options-nested-maps.gobra b/src/test/resources/regressions/features/options/options-nested-maps.gobra new file mode 100644 index 000000000..090ff5c17 --- /dev/null +++ b/src/test/resources/regressions/features/options/options-nested-maps.gobra @@ -0,0 +1,19 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +ghost +pure func bar(m dict[int]int, idx int) option[int] { + return idx in domain(m) ? some(m[idx]) : none[int] +} + +ghost +pure func baz(m dict[int]int, idx int) option[int] { + return match idx in domain(m){ + case true: + some(m[idx]) + case false: + none[int] + } +} From 4c1c3dd530a618591465d206ad1b1b38ad4f0f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 1 Nov 2023 10:34:56 +0100 Subject: [PATCH 179/296] allow for recursive implementations of errors.Error() (#700) --- src/main/resources/builtin/builtin.gobra | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/resources/builtin/builtin.gobra b/src/main/resources/builtin/builtin.gobra index 9680d28e2..60602dda2 100644 --- a/src/main/resources/builtin/builtin.gobra +++ b/src/main/resources/builtin/builtin.gobra @@ -14,19 +14,29 @@ type error interface { pred ErrorMem() ghost - requires acc(ErrorMem(), _) - decreases + requires acc(ErrorMem(), _) + decreases Size() pure IsDuplicableMem() bool ghost preserves ErrorMem() ensures IsDuplicableMem() ==> ErrorMem() - decreases + decreases Size() Duplicate() preserves ErrorMem() - decreases + decreases Size() Error() string + + // This function indicates the size of the longest chain of nested + // errors, and restricts it to be finite. Although this sounds limiting, + // it allows one to write recursive implementations of Error(), where + // the generated error message is, in part, obtained from nested errors, + // and to prove that these functions are terminating. + ghost + requires acc(ErrorMem(), _) + ensures 0 <= res + pure Size() (res int) } // The panic built-in function stops normal execution of the current From 91739fed49dede16361590fb9357edceb3d76f64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 1 Nov 2023 16:07:07 +0100 Subject: [PATCH 180/296] do not use underlying type when inferring the type of some (#701) --- .../info/implementation/typing/ghost/GhostExprTyping.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index afbcf63e5..9629169a3 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -262,8 +262,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case POptionNone(t) => OptionT(typeSymbType(t)) case POptionSome(e) => val et = exprType(e) - val ut = underlyingType(et) - ut match { + et match { case Single(t) => OptionT(t) case t => violation(s"expected a single type, but got $t") } From 521d918c162afc3ff340129b9ab3d14b80bda674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 1 Nov 2023 23:58:48 +0100 Subject: [PATCH 181/296] backup --- src/main/resources/builtin/builtin.gobra | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/builtin/builtin.gobra b/src/main/resources/builtin/builtin.gobra index 60602dda2..ab6c7fa66 100644 --- a/src/main/resources/builtin/builtin.gobra +++ b/src/main/resources/builtin/builtin.gobra @@ -20,12 +20,14 @@ type error interface { ghost preserves ErrorMem() - ensures IsDuplicableMem() ==> ErrorMem() + ensures IsDuplicableMem() ==> ErrorMem() + ensures Size() == old(Size()) decreases Size() Duplicate() preserves ErrorMem() decreases Size() + ensures Size() == old(Size()) Error() string // This function indicates the size of the longest chain of nested From 5e2e1ad4adc76bd54ec1aac44dc35d12093490d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Fri, 3 Nov 2023 13:53:01 +0100 Subject: [PATCH 182/296] backup --- src/main/resources/builtin/builtin.gobra | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/resources/builtin/builtin.gobra b/src/main/resources/builtin/builtin.gobra index ab6c7fa66..5f915e5dc 100644 --- a/src/main/resources/builtin/builtin.gobra +++ b/src/main/resources/builtin/builtin.gobra @@ -22,12 +22,14 @@ type error interface { preserves ErrorMem() ensures IsDuplicableMem() ==> ErrorMem() ensures Size() == old(Size()) + ensures IsDuplicableMem() == old(IsDuplicableMem()) decreases Size() Duplicate() preserves ErrorMem() decreases Size() ensures Size() == old(Size()) + ensures IsDuplicableMem() == old(IsDuplicableMem()) Error() string // This function indicates the size of the longest chain of nested From 240ac44af5d6cdcd55081ece8eaa306deb55caaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Fri, 3 Nov 2023 19:02:39 +0100 Subject: [PATCH 183/296] redefine termination measure for methods in error --- src/main/resources/builtin/builtin.gobra | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/main/resources/builtin/builtin.gobra b/src/main/resources/builtin/builtin.gobra index 5f915e5dc..9abe0d891 100644 --- a/src/main/resources/builtin/builtin.gobra +++ b/src/main/resources/builtin/builtin.gobra @@ -11,36 +11,27 @@ package builtin type any = interface{} type error interface { + // To allow for recursive implementations of the + // following methods, we use ErrorMem() as the + // termination measure. pred ErrorMem() ghost requires acc(ErrorMem(), _) - decreases Size() + decreases ErrorMem() pure IsDuplicableMem() bool ghost preserves ErrorMem() - ensures IsDuplicableMem() ==> ErrorMem() - ensures Size() == old(Size()) ensures IsDuplicableMem() == old(IsDuplicableMem()) - decreases Size() + ensures IsDuplicableMem() ==> ErrorMem() + decreases ErrorMem() Duplicate() preserves ErrorMem() - decreases Size() - ensures Size() == old(Size()) ensures IsDuplicableMem() == old(IsDuplicableMem()) + decreases ErrorMem() Error() string - - // This function indicates the size of the longest chain of nested - // errors, and restricts it to be finite. Although this sounds limiting, - // it allows one to write recursive implementations of Error(), where - // the generated error message is, in part, obtained from nested errors, - // and to prove that these functions are terminating. - ghost - requires acc(ErrorMem(), _) - ensures 0 <= res - pure Size() (res int) } // The panic built-in function stops normal execution of the current From 00a85d2d1b2a792d78f84a2225bae87592fb2acc Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 13 Nov 2023 17:25:52 -0800 Subject: [PATCH 184/296] Relaxes type-checker to allow old expressions referring to a magic wand's LHS --- .../typing/ghost/GhostMiscTyping.scala | 1 + .../resources/regressions/issues/000705.gobra | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 src/test/resources/regressions/issues/000705.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala index ef273194c..29112774b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala @@ -283,6 +283,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => private def illegalPreconditionNode(n: PNode): Messages = { n match { + case PLabeledOld(PLabelUse(PLabelNode.lhsLabel), _) => noMessages case n@ (_: POld | _: PLabeledOld) => message(n, s"old not permitted in precondition") case n@ (_: PBefore) => message(n, s"old not permitted in precondition") case _ => noMessages diff --git a/src/test/resources/regressions/issues/000705.gobra b/src/test/resources/regressions/issues/000705.gobra new file mode 100644 index 000000000..1912c34c1 --- /dev/null +++ b/src/test/resources/regressions/issues/000705.gobra @@ -0,0 +1,75 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package issue000705 + +// adapted from Viper tutorial on magic wands + +type ListEntry struct { + next *ListEntry + value int +} + +pred (l *ListEntry) List() { + acc(l) && (l.next != nil ==> l.next.List()) +} + +ghost +requires acc(l.List(), _) +pure func (l *ListEntry) Elems() (res seq[int]) { + return unfolding acc(l.List(), _) in ( + l.next == nil ? seq[int]{ l.value } : + seq[int]{ l.value } ++ l.next.Elems()) +} + +requires l1.List() && l2.List() && l2 != nil +ensures l1.List() && l1.Elems() == old(l1.Elems() ++ l2.Elems()) +func (l1 *ListEntry) append(l2 *ListEntry) { + unfold l1.List() + if l1.next == nil { + l1.next = l2 + fold l1.List() + } else { + tmp := l1.next + index := 1 + + package tmp.List() --* (l1.List() && l1.Elems() == old(l1.Elems()[:index]) ++ old[#lhs](tmp.Elems())) { + fold l1.List() + } + + newTmp, newIndex := l1.appendSubroutine(tmp, old(l1.Elems())) + + unfold newTmp.List() + newTmp.next = l2 + fold newTmp.List() + apply newTmp.List() --* (l1.List() && l1.Elems() == old(l1.Elems()[:newIndex]) ++ old[#lhs](newTmp.Elems())) + } +} + +requires tmp.List() && /*acc(l1) && l1.next == tmp &&*/ tmp.Elems() == elems[1:] +requires tmp.List() --* (l1.List() && l1.Elems() == elems[:1] ++ old[#lhs](tmp.Elems())) +ensures 0 <= newIndex +ensures newTmp.List() && newTmp.Elems() == elems[newIndex:] +ensures unfolding newTmp.List() in newTmp.next == nil +ensures newTmp.List() --* (l1.List() && l1.Elems() == elems[:newIndex] ++ old[#lhs](newTmp.Elems())) +func (l1 *ListEntry) appendSubroutine(tmp *ListEntry, ghost elems seq[int]) (newTmp *ListEntry, newIndex int) { + index := 1 + + invariant 0 <= index + invariant tmp.List() && tmp.Elems() == elems[index:] + invariant tmp.List() --* (l1.List() && l1.Elems() == elems[:index] ++ old[#lhs](tmp.Elems())) + for unfolding tmp.List() in tmp.next != nil { + unfold tmp.List() + prev := tmp + tmp = tmp.next + index = index + 1 + package tmp.List() --* (l1.List() && l1.Elems() == elems[:index] ++ old[#lhs](tmp.Elems())) { + fold prev.List() + apply prev.List() --* (l1.List() && l1.Elems() == elems[:index-1] ++ old[#lhs](prev.Elems())) + } + } + + newTmp = tmp + newIndex = index + return +} From 37393b87b0f23924f2739438965ae9ae53154bef Mon Sep 17 00:00:00 2001 From: jcp19 Date: Tue, 28 Nov 2023 10:02:54 +0000 Subject: [PATCH 185/296] Updates submodules --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 1903805e1..77fed7fe7 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 1903805e1cb3c44da5911e45f40dcd101a64f8f3 +Subproject commit 77fed7fe7d8973d23ea17989f6cc83189237a45f From 9f38d64dc4dbc0dcad2de5d333200a8fd92bcb9d Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 30 Nov 2023 09:31:24 +0100 Subject: [PATCH 186/296] Updates submodules (#704) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 1903805e1..373c7a0be 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 1903805e1cb3c44da5911e45f40dcd101a64f8f3 +Subproject commit 373c7a0bec5920279b60c885c2e2c30dc2de8a58 From 625426f02f56c20f516f2a9feccd24dc5ec40f3f Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 4 Dec 2023 10:56:31 +0100 Subject: [PATCH 187/296] tests that gobra messages are printable --- src/test/scala/viper/gobra/GobraTests.scala | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index 057d0fdb8..d5ae82305 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -16,7 +16,7 @@ import viper.gobra.frontend.Source.FromFileSource import viper.gobra.frontend.info.Info import viper.gobra.frontend.{Config, PackageResolver, Parser, Source} import viper.gobra.reporting.VerifierResult.{Failure, Success} -import viper.gobra.reporting.{NoopReporter, VerifierError} +import viper.gobra.reporting.{GobraMessage, GobraReporter, VerifierError} import viper.silver.testing.{AbstractOutput, AnnotatedTestInput, ProjectInfo, SystemUnderTest} import viper.silver.utility.TimingUtils import viper.gobra.util.{DefaultGobraExecutionContext, GobraExecutionContext} @@ -51,7 +51,7 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { private def getConfig(source: Source): Config = Config( logLevel = Level.INFO, - reporter = NoopReporter, + reporter = StringifyReporter, packageInfoInputMap = Map(Source.getPackageInfo(source, Path.of("")) -> Vector(source)), checkConsistency = true, cacheParserAndTypeChecker = cacheParserAndTypeChecker, @@ -120,4 +120,13 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { /** A short and unique identifier for this output. */ override def fullId: String = error.id } + + case object StringifyReporter extends GobraReporter { + override val name: String = "StringifyReporter" + + override def report(msg: GobraMessage): Unit = { + // by invoking `toString`, we check that messages are printable, which includes pretty-printing AST nodes: + msg.toString + } + } } From ea83cd1421c7a5050ae28757180b93d63e771990 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 4 Dec 2023 13:43:21 +0100 Subject: [PATCH 188/296] fixes unhandled termination measure in pretty printer --- src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index 4a950981e..f7dd0caa5 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -140,10 +140,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter measure match { case WildcardMeasure(cond) => "_" <+> showCond(cond) case TupleTerminationMeasure(tuple, cond) => - hcat(tuple map { - case e: Expr => showExpr(e) - case n => violation(s"Unexpected node $n") - }) <+> showCond(cond) + hcat(tuple map show) <+> showCond(cond) } } From 33d001c01720c8582e8d3e56603fa93b7a2e3832 Mon Sep 17 00:00:00 2001 From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com> Date: Tue, 5 Dec 2023 12:47:10 +0100 Subject: [PATCH 189/296] submodules update (#712) --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 373c7a0be..5e5a3b24d 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 373c7a0bec5920279b60c885c2e2c30dc2de8a58 +Subproject commit 5e5a3b24d7163f90fc86f5930e436dc92cf172f6 From 6d3d65df0b570bdaa932c8834dcc3e10d26bedd7 Mon Sep 17 00:00:00 2001 From: Dionysios Spiliopoulos <32896454+Dspil@users.noreply.github.com> Date: Tue, 5 Dec 2023 14:20:53 +0100 Subject: [PATCH 190/296] Flag for non-linear integer arithmetic (#709) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * disable nlir * disable NLIR * cure dyslexia * test * Update src/main/scala/viper/gobra/frontend/Config.scala Co-authored-by: JoĂ£o Pereira * Update src/main/scala/viper/gobra/frontend/Config.scala Co-authored-by: JoĂ£o Pereira * z3 api and tests --------- Co-authored-by: JoĂ£o Pereira --- .../viper/gobra/backend/ViperBackends.scala | 3 +++ .../scala/viper/gobra/frontend/Config.scala | 22 +++++++++++++++++++ .../regressions/examples/disableNL.gobra | 13 +++++++++++ .../examples/disableNL_success.gobra | 11 ++++++++++ 4 files changed, 49 insertions(+) create mode 100644 src/test/resources/regressions/examples/disableNL.gobra create mode 100644 src/test/resources/regressions/examples/disableNL_success.gobra diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index 7746255ec..e4b0308f8 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -31,6 +31,9 @@ object ViperBackends { if (config.z3APIMode) { options = options ++ Vector(s"--prover=${Z3ProverAPI.name}") } + if (config.disableNL) { + options = options ++ Vector(s"--disableNL") + } val mceSiliconOpt = config.mceMode match { case MCE.Disabled => "0" case MCE.Enabled => "1" diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 29d92a022..42ae527e9 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -66,6 +66,7 @@ object ConfigDefaults { lazy val DefaultParallelizeBranches: Boolean = false lazy val DefaultConditionalizePermissions: Boolean = false lazy val DefaultZ3APIMode: Boolean = false + lazy val DefaultDisableNL: Boolean = false lazy val DefaultMCEMode: MCE.Mode = MCE.Enabled lazy val DefaultEnableLazyImports: Boolean = false lazy val DefaultNoVerify: Boolean = false @@ -130,6 +131,7 @@ case class Config( parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, conditionalizePermissions: Boolean = ConfigDefaults.DefaultConditionalizePermissions, z3APIMode: Boolean = ConfigDefaults.DefaultZ3APIMode, + disableNL: Boolean = ConfigDefaults.DefaultDisableNL, mceMode: MCE.Mode = ConfigDefaults.DefaultMCEMode, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, @@ -180,6 +182,7 @@ case class Config( parallelizeBranches = parallelizeBranches, conditionalizePermissions = conditionalizePermissions, z3APIMode = z3APIMode || other.z3APIMode, + disableNL = disableNL || other.disableNL, mceMode = mceMode, enableLazyImports = enableLazyImports || other.enableLazyImports, noVerify = noVerify || other.noVerify, @@ -233,6 +236,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector parallelizeBranches: Boolean = ConfigDefaults.DefaultParallelizeBranches, conditionalizePermissions: Boolean = ConfigDefaults.DefaultConditionalizePermissions, z3APIMode: Boolean = ConfigDefaults.DefaultZ3APIMode, + disableNL: Boolean = ConfigDefaults.DefaultDisableNL, mceMode: MCE.Mode = ConfigDefaults.DefaultMCEMode, enableLazyImports: Boolean = ConfigDefaults.DefaultEnableLazyImports, noVerify: Boolean = ConfigDefaults.DefaultNoVerify, @@ -290,6 +294,7 @@ trait RawConfig { parallelizeBranches = baseConfig.parallelizeBranches, conditionalizePermissions = baseConfig.conditionalizePermissions, z3APIMode = baseConfig.z3APIMode, + disableNL = baseConfig.disableNL, mceMode = baseConfig.mceMode, enableLazyImports = baseConfig.enableLazyImports, noVerify = baseConfig.noVerify, @@ -561,6 +566,7 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals default = None, noshort = true ) + lazy val packageTimeoutDuration: Duration = packageTimeout.toOption match { case Some(d) => Duration(d) case _ => Duration.Inf @@ -646,6 +652,13 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) + val disableNL: ScallopOption[Boolean] = opt[Boolean]( + name = "disableNL", + descr = "Disable non-linear integer arithmetics. Non compatible with Carbon", + default = Some(ConfigDefaults.DefaultDisableNL), + noshort = true, + ) + val mceMode: ScallopOption[MCE.Mode] = { val on = "on" val off = "off" @@ -770,6 +783,14 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals } } + addValidation { + if (!disableNL.toOption.contains(true) || isSiliconBasedBackend) { + Right(()) + } else { + Left("--disableNL is not compatible with Carbon") + } + } + /** File Validation */ validateFilesExist(cutInput) @@ -857,6 +878,7 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals parallelizeBranches = parallelizeBranches(), conditionalizePermissions = conditionalizePermissions(), z3APIMode = z3APIMode(), + disableNL = disableNL(), mceMode = mceMode(), enableLazyImports = enableLazyImports(), noVerify = noVerify(), diff --git a/src/test/resources/regressions/examples/disableNL.gobra b/src/test/resources/regressions/examples/disableNL.gobra new file mode 100644 index 000000000..53e144e85 --- /dev/null +++ b/src/test/resources/regressions/examples/disableNL.gobra @@ -0,0 +1,13 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// ##(--disableNL) +package pkg + +requires 0 <= x && x <= 10 +requires 0 <= y && y <= 10 +//:: ExpectedOutput(postcondition_error:assertion_error) +ensures 0 <= res && res <= 100 +func f(x, y int) (res int) { + return x * y +} diff --git a/src/test/resources/regressions/examples/disableNL_success.gobra b/src/test/resources/regressions/examples/disableNL_success.gobra new file mode 100644 index 000000000..f2ca41718 --- /dev/null +++ b/src/test/resources/regressions/examples/disableNL_success.gobra @@ -0,0 +1,11 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +requires 0 <= x && x <= 10 +requires 0 <= y && y <= 10 +ensures 0 <= res && res <= 100 +func f(x, y int) (res int) { + return x * y +} From d3891533be26ae8c1709a0f5c3554238144f0ed1 Mon Sep 17 00:00:00 2001 From: Daniel Nezamabadi <55559979+dnezam@users.noreply.github.com> Date: Fri, 8 Dec 2023 14:25:21 +0100 Subject: [PATCH 191/296] Add option to disable set axiomatization (#708) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add disableSetAxiomatization to Config * Add noaxioms/sets.vpr to resources * Pass noaxiom version of sets.vpr to Silicon * Clarify README.md Co-authored-by: JoĂ£o Pereira * Remove newline --------- Co-authored-by: Daniel Nezamabadi --- src/main/resources/README.md | 5 ++++ src/main/resources/noaxioms/sets.vpr | 19 ++++++++++++++ .../viper/gobra/backend/ViperBackends.scala | 18 +++++++++++++ .../scala/viper/gobra/frontend/Config.scala | 26 ++++++++++++++++++- .../sets/set-disable-axioms-fail1.gobra | 13 ++++++++++ 5 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/noaxioms/sets.vpr create mode 100644 src/test/resources/regressions/features/sets/set-disable-axioms-fail1.gobra diff --git a/src/main/resources/README.md b/src/main/resources/README.md index cdc799ba6..01cb58af9 100644 --- a/src/main/resources/README.md +++ b/src/main/resources/README.md @@ -20,3 +20,8 @@ import stubAssert "github.com/scionproto/scion/go/lib/assert" Note that the import path directly corresponds to the directory structure in `stubs`. As `assert` is a reserved keyword in Gobra and the implicit qualifier would be `assert`, the library is imported with the qualifier `stubAssert`. The implicit qualifier corresponds to the last path component (here `assert`) and is not related to the package clause used in Gobra files located in the `assert` folder. + +## noaxioms +The `.vpr` files in the `noaxioms` folder contain minimal definitions of operations on the various built-in Viper types. These files are used when we disable the built-in axiomatisation of the Viper files. +`sets.vpr` for example is used when the flag `--disableSetAxiomatization` is passed to Gobra, which in turn is useful if the user +wants to manually prove obligations using the standard library. diff --git a/src/main/resources/noaxioms/sets.vpr b/src/main/resources/noaxioms/sets.vpr new file mode 100644 index 000000000..f29cf7154 --- /dev/null +++ b/src/main/resources/noaxioms/sets.vpr @@ -0,0 +1,19 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2023 ETH Zurich. + +domain $Set[E] { + function Set_in(e: E, s: $Set[E]): Bool + function Set_card(s: $Set[E]): Int + function Set_empty(): $Set[E] + function Set_singleton(e: E): $Set[E] + function Set_unionone(s: $Set[E], e: E): $Set[E] + function Set_union(s1: $Set[E], s2: $Set[E]): $Set[E] + function Set_disjoint(s1: $Set[E], s2: $Set[E]): Bool + function Set_difference(s1: $Set[E], s2: $Set[E]): $Set[E] + function Set_intersection(s1: $Set[E], s2: $Set[E]): $Set[E] + function Set_subset(s1: $Set[E], s2: $Set[E]): Bool + function Set_equal(s1: $Set[E], s2: $Set[E]): Bool +} diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index e4b0308f8..835800ae2 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -13,6 +13,10 @@ import viper.server.core.ViperCoreServer import viper.silicon.decider.Z3ProverAPI import viper.server.vsi.DefaultVerificationServerStart +import java.nio.file.{Files, Paths} +import scala.io.Source +import scala.util.Using + trait ViperBackend { def create(exePaths: Vector[String], config: Config)(implicit executor: GobraExecutionContext): ViperVerifier } @@ -47,6 +51,20 @@ object ViperBackends { options ++= Vector("--parallelizeBranches") } options ++= exePaths + if (config.disableSetAxiomatization) { + // Since resources are stored within the .jar archive, we cannot + // directly pass the axiom file to Silicon. + val tmpPath = Paths.get("gobra_tmp") + val axiomTmpPath = tmpPath.resolve("noaxioms_sets.vpr") + val axiom: Source = Source.fromResource("noaxioms/sets.vpr") + + Files.createDirectories(tmpPath) + Using(axiom) { source => + Files.write(axiomTmpPath, source.mkString.getBytes) + } + + options ++= Vector("--setAxiomatizationFile", axiomTmpPath.toString()) + } new Silicon(options) } diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 42ae527e9..fef81bce0 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -73,6 +73,7 @@ object ConfigDefaults { lazy val DefaultNoStreamErrors: Boolean = false lazy val DefaultParseAndTypeCheckMode: TaskManagerMode = TaskManagerMode.Parallel lazy val DefaultRequireTriggers: Boolean = false + lazy val DefaultDisableSetAxiomatization: Boolean = false } // More-complete exhale modes @@ -139,6 +140,7 @@ case class Config( parseAndTypeCheckMode: TaskManagerMode = ConfigDefaults.DefaultParseAndTypeCheckMode, // when enabled, all quantifiers without triggers are rejected requireTriggers: Boolean = ConfigDefaults.DefaultRequireTriggers, + disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization, ) { def merge(other: Config): Config = { @@ -188,7 +190,8 @@ case class Config( noVerify = noVerify || other.noVerify, noStreamErrors = noStreamErrors || other.noStreamErrors, parseAndTypeCheckMode = parseAndTypeCheckMode, - requireTriggers = requireTriggers || other.requireTriggers + requireTriggers = requireTriggers || other.requireTriggers, + disableSetAxiomatization = disableSetAxiomatization || other.disableSetAxiomatization, ) } @@ -243,6 +246,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector noStreamErrors: Boolean = ConfigDefaults.DefaultNoStreamErrors, parseAndTypeCheckMode: TaskManagerMode = ConfigDefaults.DefaultParseAndTypeCheckMode, requireTriggers: Boolean = ConfigDefaults.DefaultRequireTriggers, + disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -301,6 +305,7 @@ trait RawConfig { noStreamErrors = baseConfig.noStreamErrors, parseAndTypeCheckMode = baseConfig.parseAndTypeCheckMode, requireTriggers = baseConfig.requireTriggers, + disableSetAxiomatization = baseConfig.disableSetAxiomatization, ) } @@ -718,6 +723,12 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals case _ => ConfigDefaults.DefaultParseAndTypeCheckMode } + val disableSetAxiomatization: ScallopOption[Boolean] = opt[Boolean]( + name = "disableSetAxiomatization", + descr = s"Disables set axiomatization in Silicon.", + default = Some(ConfigDefaults.DefaultDisableSetAxiomatization), + noshort = true, + ) /** * Exception handling */ @@ -782,6 +793,18 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals Right(()) } } + + // `disableSetAxiomatization` can only be provided when using a silicon-based backend + // since, at the time of writing, we rely on Silicon's setAxiomatizationFile for the + // implementation + addValidation { + val disableSetAxiomatizationOn = disableSetAxiomatization.toOption.contains(true) + if (disableSetAxiomatizationOn && !isSiliconBasedBackend) { + Left("The selected backend does not support --disableSetAxiomatization.") + } else { + Right(()) + } + } addValidation { if (!disableNL.toOption.contains(true) || isSiliconBasedBackend) { @@ -885,5 +908,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noStreamErrors = noStreamErrors(), parseAndTypeCheckMode = parseAndTypeCheckMode(), requireTriggers = requireTriggers(), + disableSetAxiomatization = disableSetAxiomatization(), ) } diff --git a/src/test/resources/regressions/features/sets/set-disable-axioms-fail1.gobra b/src/test/resources/regressions/features/sets/set-disable-axioms-fail1.gobra new file mode 100644 index 000000000..a57276179 --- /dev/null +++ b/src/test/resources/regressions/features/sets/set-disable-axioms-fail1.gobra @@ -0,0 +1,13 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +// ##(--disableSetAxiomatization) + +// From set-union-simple1.gobra, example 10 +func foo(ghost s set[int], ghost t set[int]) { + // fails: set axioms disabled (including commutativity) + //:: ExpectedOutput(assert_error:assertion_error) + assert s union t == t union s +} From e0ad929c57c9256734b5bd555806574e33607404 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 21 Dec 2023 15:04:45 +0100 Subject: [PATCH 192/296] Updates submodules (#714) Co-authored-by: jcp19 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 5e5a3b24d..b4e037236 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 5e5a3b24d7163f90fc86f5930e436dc92cf172f6 +Subproject commit b4e0372364be0dabeb3a36c63b5e464a17c0d480 From a62aac3d12e56bb6ad43c3cc841ab70637be80eb Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Tue, 9 Jan 2024 16:50:29 +0100 Subject: [PATCH 193/296] Updates submodules (#716) Co-authored-by: ArquintL --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index b4e037236..277669540 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit b4e0372364be0dabeb3a36c63b5e464a17c0d480 +Subproject commit 2776695405cc01edb13487a72b9bd903b8ac67aa From 742b1b63429f0bf276e4337efe8e652dcd1f3e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Fri, 12 Jan 2024 23:01:15 +0100 Subject: [PATCH 194/296] Check by default that all pure and ghost functions have termination measures (#718) * add desired functionality * backup * fix tests * Apply suggestions from code review Co-authored-by: Linard Arquint * fix tests * check that all ghost methods have a termination measure as well * fix tests --------- Co-authored-by: Linard Arquint --- src/main/resources/stubs/net/ip.gobra | 1 + src/main/resources/stubs/net/net.gobra | 3 +++ .../resources/stubs/strings/strings.gobra | 13 +++--------- src/main/resources/stubs/sync/mutex.gobra | 1 + src/main/resources/stubs/sync/waitgroup.gobra | 19 +++++++++++------- .../scala/viper/gobra/frontend/Config.scala | 13 ++++++++++++ .../implementation/typing/MemberTyping.scala | 11 ++++++++-- .../typing/ghost/GhostMemberTyping.scala | 20 +++++++++++++++++-- .../translator/encodings/StringEncoding.scala | 6 +++++- .../tutorial-examples/basicAnnotations.gobra | 4 ++++ .../scala/viper/gobra/GobraPackageTests.scala | 5 ++++- src/test/scala/viper/gobra/GobraTests.scala | 3 +++ .../gobra/erasing/GhostErasureUnitTests.scala | 2 +- .../gobra/reporting/StatsCollectorTests.scala | 4 ++-- 14 files changed, 79 insertions(+), 26 deletions(-) diff --git a/src/main/resources/stubs/net/ip.gobra b/src/main/resources/stubs/net/ip.gobra index f6a3ee897..0c177d6bc 100644 --- a/src/main/resources/stubs/net/ip.gobra +++ b/src/main/resources/stubs/net/ip.gobra @@ -144,6 +144,7 @@ func (ip IP) To4() (res IP) { pure preserves forall i int :: 0 <= i && i < len(s) ==> acc(&s[i], 1/100000) +decreases _ func isZeros(s []byte) bool // To16 converts the IP address ip to a 16-byte representation. diff --git a/src/main/resources/stubs/net/net.gobra b/src/main/resources/stubs/net/net.gobra index d1d1ff11e..0319d37dd 100644 --- a/src/main/resources/stubs/net/net.gobra +++ b/src/main/resources/stubs/net/net.gobra @@ -171,6 +171,7 @@ pred (op *OpError) Mem() { } requires acc(e.Mem(), _) +decreases pure func (e *OpError) Unwrap() error { return unfolding acc(e.Mem(), _) in e.Err } requires acc(e.Mem()) @@ -271,8 +272,10 @@ type UnknownNetworkError string func (e UnknownNetworkError) Error() string // { return "unknown network " + string(e) } ensures !res +decreases pure func (e UnknownNetworkError) Timeout() (res bool) { return false } ensures !res +decreases pure func (e UnknownNetworkError) Temporary() (res bool) { return false } type InvalidAddrError string diff --git a/src/main/resources/stubs/strings/strings.gobra b/src/main/resources/stubs/strings/strings.gobra index 0307bf577..2d652bc53 100644 --- a/src/main/resources/stubs/strings/strings.gobra +++ b/src/main/resources/stubs/strings/strings.gobra @@ -151,6 +151,7 @@ ensures len(elems) == 0 ==> res == "" ensures len(elems) == 1 ==> res == elems[0] // (joao) Leads to precondition of call might not hold (permission to elems[i] might not suffice) // ensures len(elems) > 1 ==> res == elems[0] + sep + Join(elems[1:], sep) +decreases _ pure func Join(elems []string, sep string) (res string) /*{ switch len(elems) { case 0: @@ -176,26 +177,18 @@ pure func Join(elems []string, sep string) (res string) /*{ // HasPrefix tests whether the string s begins with prefix. pure -ensures ret == (len(s) >= len(prefix) && s[0:len(prefix)] == prefix) +decreases func HasPrefix(s, prefix string) (ret bool) { return len(s) >= len(prefix) && (s[0:len(prefix)] == prefix) } // HasSuffix tests whether the string s ends with suffix. pure -ensures ret == (len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix) +decreases func HasSuffix(s, suffix string) (ret bool) { return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix } -// Map returns a copy of the string s with all its characters modified -// according to the mapping function. If mapping returns a negative value, the character is -// dropped from the string with no replacement. -// (joao) no support for higher-order functions -/* -func Map(mapping func(rune) rune, s string) string -*/ - // Repeat returns a new string consisting of count copies of the string s. // // It panics if count is negative or if diff --git a/src/main/resources/stubs/sync/mutex.gobra b/src/main/resources/stubs/sync/mutex.gobra index 9f400718c..94f4a2d2f 100644 --- a/src/main/resources/stubs/sync/mutex.gobra +++ b/src/main/resources/stubs/sync/mutex.gobra @@ -14,6 +14,7 @@ pred (m *Mutex) UnlockP() ghost requires acc(m.LockP(), _) +decreases _ pure func (m *Mutex) LockInv() pred() ghost diff --git a/src/main/resources/stubs/sync/waitgroup.gobra b/src/main/resources/stubs/sync/waitgroup.gobra index 2de127d4d..f42663519 100644 --- a/src/main/resources/stubs/sync/waitgroup.gobra +++ b/src/main/resources/stubs/sync/waitgroup.gobra @@ -17,17 +17,19 @@ pred (wg *WaitGroup) Token(t pred()) ghost requires acc(g.WaitGroupP(), _) +decreases _ pure func (g *WaitGroup) WaitMode() bool ghost requires acc(g) && *g == WaitGroup{} ensures g.WaitGroupP() && !g.WaitMode() -decreases +decreases _ func (g *WaitGroup) Init() ghost requires g.WaitGroupP() ensures g.WaitGroupP() && !g.WaitMode() +decreases _ func (g *WaitGroup) UnsetWaitMode() ghost @@ -35,7 +37,7 @@ requires p > 0 requires acc(g.WaitGroupP(), p) requires !g.WaitMode() && g.UnitDebt(P) ensures g.UnitDebt(P) && acc(g.WaitGroupStarted(), p) -decreases +decreases _ func (g *WaitGroup) Start(ghost p perm, ghost P pred()) ghost @@ -45,7 +47,7 @@ requires p + q == 1 requires acc(g.WaitGroupP(), p) requires acc(g.WaitGroupStarted(), q) ensures g.WaitGroupP() && g.WaitMode() -decreases +decreases _ func (g *WaitGroup) SetWaitMode(ghost p perm, ghost q perm) // Simplified version of the debt redistribution rule. The most general version cannot be written in Gobra @@ -54,7 +56,7 @@ func (g *WaitGroup) SetWaitMode(ghost p perm, ghost q perm) ghost requires P() && g.UnitDebt(P) ensures g.UnitDebt(PredTrue!) -decreases +decreases _ func (g *WaitGroup) PayDebt(ghost P pred()) // Simplified version of the debt redistribution rule, instantiated with P == { PredTrue! } and Q == { R }. @@ -62,12 +64,13 @@ func (g *WaitGroup) PayDebt(ghost P pred()) ghost requires g.UnitDebt(PredTrue!) ensures g.UnitDebt(R) && g.Token(R) -decreases +decreases _ func (g *WaitGroup) GenerateTokenAndDebt(ghost R pred()) ghost requires R() ensures g.Token(R) +decreases _ func (g *WaitGroup) GenerateToken(ghost R pred()) // Simplified version of Add as proposed in page 8 of Martin's latest document (as of 21/01/2021) @@ -80,11 +83,11 @@ ensures (n > 0 && p == 0) ==> g.UnitDebt(P) ensures n > 0 ==> acc(g.UnitDebt(PredTrue!), n/1) // this is actually necessary, otherwise Gobra cannot prove that Add does not modify the wait mode ensures (n > 0 && p > 0) ==> g.WaitMode() == old(g.WaitMode()) -decreases +decreases _ func (g *WaitGroup) Add(n int, ghost p perm, ghost P pred()) requires g.UnitDebt(PredTrue!) -decreases +decreases _ func (g *WaitGroup) Done() requires p > 0 @@ -117,6 +120,7 @@ requires len(Q) == len(permsQ) requires g.UnitDebt(CollectFractions!

) requires g.UnitDebt(PredTrue!) ensures g.UnitDebt(CollectFractions!) && g.UnitDebt(CollectFractions!) +decreases _ func (g *WaitGroup) SplitSequence(ghost P seq[pred()], ghost Q seq[pred()], ghost permsP seq[perm], ghost permsQ seq[perm]) // Special case of the debt redistribution rule @@ -131,4 +135,5 @@ requires g.UnitDebt(PredTrue!) requires forall i int :: 0 <= i && i < len(P) ==> permsP[i] + permsQ[i] == permsR[i] ensures g.UnitDebt(CollectFractions!) ensures g.UnitDebt(CollectFractions!) +decreases _ func (g *WaitGroup) SplitFractions(ghost P seq[pred()], ghost permsP seq[perm], ghost permsQ seq[perm], ghost permsR seq[perm]) diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index fef81bce0..2d503c0f9 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -74,6 +74,7 @@ object ConfigDefaults { lazy val DefaultParseAndTypeCheckMode: TaskManagerMode = TaskManagerMode.Parallel lazy val DefaultRequireTriggers: Boolean = false lazy val DefaultDisableSetAxiomatization: Boolean = false + lazy val DefaultDisableCheckTerminationPureFns: Boolean = false } // More-complete exhale modes @@ -141,6 +142,7 @@ case class Config( // when enabled, all quantifiers without triggers are rejected requireTriggers: Boolean = ConfigDefaults.DefaultRequireTriggers, disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization, + disableCheckTerminationPureFns: Boolean = ConfigDefaults.DefaultDisableCheckTerminationPureFns, ) { def merge(other: Config): Config = { @@ -192,6 +194,7 @@ case class Config( parseAndTypeCheckMode = parseAndTypeCheckMode, requireTriggers = requireTriggers || other.requireTriggers, disableSetAxiomatization = disableSetAxiomatization || other.disableSetAxiomatization, + disableCheckTerminationPureFns = disableCheckTerminationPureFns || other.disableCheckTerminationPureFns, ) } @@ -247,6 +250,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector parseAndTypeCheckMode: TaskManagerMode = ConfigDefaults.DefaultParseAndTypeCheckMode, requireTriggers: Boolean = ConfigDefaults.DefaultRequireTriggers, disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization, + disableCheckTerminationPureFns: Boolean = ConfigDefaults.DefaultDisableCheckTerminationPureFns, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -306,6 +310,7 @@ trait RawConfig { parseAndTypeCheckMode = baseConfig.parseAndTypeCheckMode, requireTriggers = baseConfig.requireTriggers, disableSetAxiomatization = baseConfig.disableSetAxiomatization, + disableCheckTerminationPureFns = baseConfig.disableCheckTerminationPureFns, ) } @@ -710,6 +715,13 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) + val disableCheckTerminationPureFns: ScallopOption[Boolean] = opt[Boolean]( + name = "disablePureFunctsTerminationRequirement", + descr = "Do not enforce that all pure functions must have termination measures", + default = Some(ConfigDefaults.DefaultDisableCheckTerminationPureFns), + noshort = true, + ) + val parseAndTypeCheckMode: ScallopOption[TaskManagerMode] = choice( name = "parseAndTypeCheckMode", choices = Seq("LAZY", "SEQUENTIAL", "PARALLEL"), @@ -909,5 +921,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals parseAndTypeCheckMode = parseAndTypeCheckMode(), requireTriggers = requireTriggers(), disableSetAxiomatization = disableSetAxiomatization(), + disableCheckTerminationPureFns = disableCheckTerminationPureFns(), ) } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala index 0fcf977b9..a8fd70d43 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala @@ -22,9 +22,16 @@ trait MemberTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def wellDefActualMember(member: PActualMember): Messages = member match { case n: PFunctionDecl => - wellDefVariadicArgs(n.args) ++ wellDefIfPureFunction(n) ++ wellDefIfInitBlock(n) ++ wellDefIfMain(n) + wellDefVariadicArgs(n.args) ++ + wellDefIfPureFunction(n) ++ + wellDefIfInitBlock(n) ++ + wellDefIfMain(n) ++ + wellFoundedIfNeeded(n) case m: PMethodDecl => - wellDefVariadicArgs(m.args) ++ isReceiverType.errors(miscType(m.receiver))(member) ++ wellDefIfPureMethod(m) + wellDefVariadicArgs(m.args) ++ + isReceiverType.errors(miscType(m.receiver))(member) ++ + wellDefIfPureMethod(m) ++ + wellFoundedIfNeeded(m) case b: PConstDecl => b.specs.flatMap(wellDefConstSpec) case g: PVarDecl if isGlobalVarDeclaration(g) => diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala index 6ff5bef67..6fefc23d1 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala @@ -7,11 +7,12 @@ package viper.gobra.frontend.info.implementation.typing.ghost import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages} -import viper.gobra.ast.frontend.{PBlock, PCodeRootWithResult, PExplicitGhostMember, PFPredicateDecl, PFunctionDecl, PFunctionSpec, PGhostMember, PIdnUse, PImplementationProof, PMPredicateDecl, PMethodDecl, PMethodImplementationProof, PParameter, PReturn, PVariadicType, PWithBody} +import viper.gobra.ast.frontend.{PBlock, PCodeRootWithResult, PExplicitGhostMember, PFPredicateDecl, PFunctionDecl, PFunctionSpec, PGhostMember, PIdnUse, PImplementationProof, PMember, PMPredicateDecl, PMethodDecl, PMethodImplementationProof, PParameter, PReturn, PVariadicType, PWithBody} import viper.gobra.frontend.info.base.SymbolTable.{MPredicateSpec, MethodImpl, MethodSpec} import viper.gobra.frontend.info.base.Type.{InterfaceT, Type, UnknownType} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.BaseTyping +import viper.gobra.util.Violation trait GhostMemberTyping extends BaseTyping { this: TypeInfoImpl => @@ -58,8 +59,23 @@ trait GhostMemberTyping extends BaseTyping { this: TypeInfoImpl => } } - private[typing] def wellDefIfPureMethod(member: PMethodDecl): Messages = { + private[typing] def wellFoundedIfNeeded(member: PMember): Messages = { + val spec = member match { + case m: PMethodDecl => m.spec + case f: PFunctionDecl => f.spec + case _ => Violation.violation("Unexpected member type") + } + val hasMeasureIfNeeded = + if (spec.isPure || isEnclosingGhost(member)) + config.disableCheckTerminationPureFns || spec.terminationMeasures.nonEmpty + else + true + val needsMeasureError = + error(member, "All pure or ghost functions and methods must have termination measures, but none was found for this member.", !hasMeasureIfNeeded) + needsMeasureError + } + private[typing] def wellDefIfPureMethod(member: PMethodDecl): Messages = { if (member.spec.isPure) { isSingleResultArg(member) ++ isSinglePureReturnExpr(member) ++ diff --git a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala index c5416a789..ba6c8abab 100644 --- a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala @@ -16,10 +16,12 @@ import viper.gobra.translator.Names import viper.gobra.translator.encodings.combinators.LeafTypeEncoding import viper.gobra.translator.context.Context import viper.gobra.translator.util.FunctionGenerator +import viper.gobra.translator.util.ViperUtil.synthesized import viper.gobra.translator.util.ViperWriter.CodeLevel._ import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.util.TypeBounds import viper.silver.{ast => vpr} +import viper.silver.plugin.standard.termination import scala.annotation.unused @@ -181,6 +183,7 @@ class StringEncoding extends LeafTypeEncoding { * requires l <= h * requires h <= len(s) * ensures strLen(s) == h - l + * decreases _ * where s is a string id and l and r are the lower and upper bounds of the slice */ private val strSliceName: String = "strSlice" @@ -197,7 +200,8 @@ class StringEncoding extends LeafTypeEncoding { pres = Seq( vpr.LeCmp(vpr.IntLit(0)(), argL.localVar)(), vpr.LeCmp(argL.localVar, argH.localVar)(), - vpr.LeCmp(argH.localVar, vpr.DomainFuncApp(lenFunc, Seq(argS.localVar), Map.empty)())() + vpr.LeCmp(argH.localVar, vpr.DomainFuncApp(lenFunc, Seq(argS.localVar), Map.empty)())(), + synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate"), ), posts = Seq( vpr.EqCmp( diff --git a/src/test/resources/regressions/examples/tutorial-examples/basicAnnotations.gobra b/src/test/resources/regressions/examples/tutorial-examples/basicAnnotations.gobra index 2c016db97..f2dd40403 100644 --- a/src/test/resources/regressions/examples/tutorial-examples/basicAnnotations.gobra +++ b/src/test/resources/regressions/examples/tutorial-examples/basicAnnotations.gobra @@ -5,11 +5,13 @@ package tutorial requires 0 <= n // precondition ensures sum == n * (n+1)/2 // postcondition +decreases func sum(n int) (sum int) { sum := 0 invariant 0 <= i && i <= n + 1 invariant sum == i * (i-1)/2 + decreases n - i for i := 0; i <= n; i++ { sum += i } @@ -17,12 +19,14 @@ func sum(n int) (sum int) { } ensures res == (n % 2 == 0) +decreases pure func isEven(n int) (res bool) { return n % 2 == 0 } ensures isEven(n) ==> res == n / 2 ensures !isEven(n) ==> res == n / 2 + 1 +decreases func halfRoundedUp(n int) (res int) { if isEven(n) { res = n / 2 diff --git a/src/test/scala/viper/gobra/GobraPackageTests.scala b/src/test/scala/viper/gobra/GobraPackageTests.scala index 8e01bcc49..49738fd19 100644 --- a/src/test/scala/viper/gobra/GobraPackageTests.scala +++ b/src/test/scala/viper/gobra/GobraPackageTests.scala @@ -62,7 +62,10 @@ class GobraPackageTests extends GobraTests { "--logLevel", "INFO", "--directory", currentDir.toFile.getPath, "--projectRoot", currentDir.toFile.getPath, // otherwise, it assumes Gobra's root directory as the project root - "-I", currentDir.toFile.getPath + "-I", currentDir.toFile.getPath, + // termination checks in functions are currently disabled in the tests. This can be enabled in the future, + // but requires some work to add termination measures all over the test suite. + "--disablePureFunctsTerminationRequirement", )) } yield config diff --git a/src/test/scala/viper/gobra/GobraTests.scala b/src/test/scala/viper/gobra/GobraTests.scala index d5ae82305..9de0ce90d 100644 --- a/src/test/scala/viper/gobra/GobraTests.scala +++ b/src/test/scala/viper/gobra/GobraTests.scala @@ -56,6 +56,9 @@ class GobraTests extends AbstractGobraTests with BeforeAndAfterAll { checkConsistency = true, cacheParserAndTypeChecker = cacheParserAndTypeChecker, z3Exe = z3Exe, + // termination checks in functions are currently disabled in the tests. This can be enabled in the future, + // but requires some work to add termination measures all over the test suite. + disableCheckTerminationPureFns = true, ) override def runTests(testName: Option[String], args: Args): Status = { diff --git a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala index dd203575a..d71f9f84a 100644 --- a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala +++ b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala @@ -341,7 +341,7 @@ class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside { new PackageInfo("pkg", "pkg", false) ) val tree = new Info.GoTree(pkg) - val config = Config() + val config = Config(disableCheckTerminationPureFns = true) val info = new TypeInfoImpl(tree, Map.empty)(config) info.errors match { case Vector(msgs) => fail(s"Type-checking failed: $msgs") diff --git a/src/test/scala/viper/gobra/reporting/StatsCollectorTests.scala b/src/test/scala/viper/gobra/reporting/StatsCollectorTests.scala index 25980a22a..a8fa3ee9f 100644 --- a/src/test/scala/viper/gobra/reporting/StatsCollectorTests.scala +++ b/src/test/scala/viper/gobra/reporting/StatsCollectorTests.scala @@ -32,12 +32,12 @@ class StatsCollectorTests extends AnyFunSuite with BeforeAndAfterAll { } test("Integration without chopper") { - val config = createConfig(Array("--recursive", "--projectRoot", statsCollectorTestDir, "-I", statsCollectorTestDir)) + val config = createConfig(Array("--recursive", "--projectRoot", statsCollectorTestDir, "-I", statsCollectorTestDir, "--disablePureFunctsTerminationRequirement")) runIntegration(config) } test("Integration with chopper") { - val config = createConfig(Array("--recursive", "--projectRoot", statsCollectorTestDir, "-I", statsCollectorTestDir, "--chop", "10")) + val config = createConfig(Array("--recursive", "--projectRoot", statsCollectorTestDir, "-I", statsCollectorTestDir, "--chop", "10", "--disablePureFunctsTerminationRequirement")) runPackagesSeparately(config) runIntegration(config) } From 9953aa520fe93d68e2b784d6279d600df3571f0d Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 25 Jan 2024 11:21:52 +0100 Subject: [PATCH 195/296] Adds dependabot for GitHub Actions --- .github/dependabot.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..13109b4af --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +version: 2 + +updates: + - package-ecosystem: github-actions + directory: "/" + schedule: + interval: monthly + day: monday + groups: + all: + patterns: + - "*" From 7ce55f5d3a204fae43e46bb17e5bbb1ada388788 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 10:22:34 +0000 Subject: [PATCH 196/296] Bump the all group with 6 updates Bumps the all group with 6 updates: | Package | From | To | | --- | --- | --- | | [actions/checkout](https://github.com/actions/checkout) | `3` | `4` | | [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) | `2` | `3` | | [docker/build-push-action](https://github.com/docker/build-push-action) | `3` | `5` | | [actions/upload-artifact](https://github.com/actions/upload-artifact) | `3` | `4` | | [docker/login-action](https://github.com/docker/login-action) | `2` | `3` | | [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) | `4` | `5` | Updates `actions/checkout` from 3 to 4 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) Updates `docker/setup-buildx-action` from 2 to 3 - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3) Updates `docker/build-push-action` from 3 to 5 - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v3...v5) Updates `actions/upload-artifact` from 3 to 4 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) Updates `docker/login-action` from 2 to 3 - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v2...v3) Updates `peter-evans/create-pull-request` from 4 to 5 - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major dependency-group: all - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-major dependency-group: all - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major dependency-group: all - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major dependency-group: all - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major dependency-group: all - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-major dependency-group: all ... Signed-off-by: dependabot[bot] --- .github/workflows/license-check.yml | 2 +- .github/workflows/test.yml | 14 +++++++------- .github/workflows/update-submodules.yml | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/license-check.yml b/.github/workflows/license-check.yml index cd73512f3..6c4e7b8dd 100644 --- a/.github/workflows/license-check.yml +++ b/.github/workflows/license-check.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Gobra - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Check license headers uses: viperproject/check-license-header@v2 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0b3d56f37..7441179aa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,7 +25,7 @@ jobs: FAILURE_LEVEL: "error" steps: - name: Checkout Gobra - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: 'recursive' - name: Check that silicon & carbon reference same silver commit @@ -49,11 +49,11 @@ jobs: # used to enable Docker caching (see https://github.com/docker/build-push-action) - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Build image up to including stage 'build' # note that the action's name is misleading: this step does NOT push - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v5 with: context: . load: true # make the built image available in docker (locally) @@ -161,13 +161,13 @@ jobs: - name: Upload RAM usage if: ${{ always() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: pidstat.txt path: sync/pidstat.txt - name: Build entire image - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v5 with: context: . load: true # make the built image available in docker (locally) @@ -203,7 +203,7 @@ jobs: - name: Login to Github Packages if: env.SHOULD_DEPLOY == 'true' - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} @@ -211,7 +211,7 @@ jobs: - name: Push entire image if: env.SHOULD_DEPLOY == 'true' - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v5 with: context: . file: workflow-container/Dockerfile diff --git a/.github/workflows/update-submodules.yml b/.github/workflows/update-submodules.yml index efc59dc7d..0b8ca8708 100644 --- a/.github/workflows/update-submodules.yml +++ b/.github/workflows/update-submodules.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out the repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true @@ -35,7 +35,7 @@ jobs: - name: Open a pull request id: pr - uses: peter-evans/create-pull-request@v4 + uses: peter-evans/create-pull-request@v5 if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF with: # Use viper-admin's token to workaround a restriction of GitHub. From 1360097ff35fd0c5bd494df3c63c05957e5b58ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:04:22 +0100 Subject: [PATCH 197/296] Bump the all group with 1 update (#722) Bumps the all group with 1 update: [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request). Updates `peter-evans/create-pull-request` from 5 to 6 - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/v5...v6) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-major dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/update-submodules.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-submodules.yml b/.github/workflows/update-submodules.yml index 0b8ca8708..209c54f00 100644 --- a/.github/workflows/update-submodules.yml +++ b/.github/workflows/update-submodules.yml @@ -35,7 +35,7 @@ jobs: - name: Open a pull request id: pr - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 if: env.PREV_VIPERSERVER_REF != env.CUR_VIPERSERVER_REF with: # Use viper-admin's token to workaround a restriction of GitHub. From 88e0a9bb6204bcf856085cea3f131a6113359ba2 Mon Sep 17 00:00:00 2001 From: Daniel Nezamabadi <55559979+dnezam@users.noreply.github.com> Date: Thu, 8 Feb 2024 14:34:43 +0100 Subject: [PATCH 198/296] Add opaque/reveal to Gobra (#715) * Port fac from Viper's opaque test * Remove auto-generated files * Roughly implement opaque * Roughly implement opaque (rest of files) * Implemented reveal? * Fix a pinch of errors * Fix PrettyPrint + Default/Call encoding errors * Fix rest of compile errors * Add typing checks * Fix parsing of opaque * Add check in wellDefSpec * Add opaque test for outline * Add missing termination measure to test * Add more tests * Fix error message in ExprTyping.scala * Add missing license header * Add test for opaque abstract function * Remove comment and fix tabs QUES in question was added as comment on PR. * Address feedback * Remove comment + test for revealing closure * Fix misplaced test annotation --- src/main/antlr4/GobraLexer.g4 | 2 + src/main/antlr4/GobraParser.g4 | 12 +- .../java/viper/gobra/frontend/GobraLexer.java | 1768 ++++---- .../viper/gobra/frontend/GobraParser.java | 4016 +++++++++-------- .../frontend/GobraParserBaseVisitor.java | 9 +- .../gobra/frontend/GobraParserVisitor.java | 9 +- .../scala/viper/gobra/ast/frontend/Ast.scala | 5 +- .../gobra/ast/frontend/PrettyPrinter.scala | 8 +- .../gobra/ast/internal/PrettyPrinter.scala | 28 +- .../viper/gobra/ast/internal/Program.scala | 10 +- .../CGEdgesTerminationTransform.scala | 4 +- .../transform/OverflowChecksTransform.scala | 8 +- .../scala/viper/gobra/frontend/Desugar.scala | 32 +- .../gobra/frontend/ParseTreeTranslator.scala | 6 +- .../frontend/info/base/SymbolTable.scala | 2 + .../implementation/typing/ExprTyping.scala | 30 +- .../implementation/typing/StmtTyping.scala | 7 +- .../typing/ghost/GhostExprTyping.scala | 14 +- .../typing/ghost/GhostMiscTyping.scala | 5 +- .../ghost/separation/GoifyingPrinter.scala | 3 +- .../translator/encodings/StringEncoding.scala | 3 +- .../encodings/channels/ChannelEncoding.scala | 4 +- .../closures/ClosureSpecsEncoder.scala | 12 +- .../defaults/DefaultPureMethodEncoding.scala | 7 +- .../interfaces/InterfaceEncoding.scala | 5 +- .../encodings/typeless/BuiltInEncoding.scala | 6 +- .../encodings/typeless/CallEncoding.scala | 13 +- .../viper/gobra/translator/util/VprInfo.scala | 31 + .../opaque/opaque-closure-fail1.gobra | 17 + .../features/opaque/opaque-fac1.gobra | 30 + .../features/opaque/opaque-fac2.gobra | 45 + .../features/opaque/opaque-fac3.gobra | 54 + .../opaque/opaque-function-fail1.gobra | 11 + .../opaque/opaque-interface-fail1.gobra | 24 + .../features/opaque/opaque-method-fail1.gobra | 13 + .../opaque/opaque-outline-fail1.gobra | 13 + .../features/opaque/opaque-spec-simple1.gobra | 13 + .../opaque/reveal-conversion-fail1.gobra | 10 + .../features/opaque/reveal-fail1.gobra | 15 + .../features/opaque/reveal-fail2.gobra | 17 + .../opaque/reveal-predicate-fail1.gobra | 28 + .../viper/gobra/parsing/ParserUnitTests.scala | 32 +- 42 files changed, 3425 insertions(+), 2956 deletions(-) create mode 100644 src/main/scala/viper/gobra/translator/util/VprInfo.scala create mode 100644 src/test/resources/regressions/features/opaque/opaque-closure-fail1.gobra create mode 100644 src/test/resources/regressions/features/opaque/opaque-fac1.gobra create mode 100644 src/test/resources/regressions/features/opaque/opaque-fac2.gobra create mode 100644 src/test/resources/regressions/features/opaque/opaque-fac3.gobra create mode 100644 src/test/resources/regressions/features/opaque/opaque-function-fail1.gobra create mode 100644 src/test/resources/regressions/features/opaque/opaque-interface-fail1.gobra create mode 100644 src/test/resources/regressions/features/opaque/opaque-method-fail1.gobra create mode 100644 src/test/resources/regressions/features/opaque/opaque-outline-fail1.gobra create mode 100644 src/test/resources/regressions/features/opaque/opaque-spec-simple1.gobra create mode 100644 src/test/resources/regressions/features/opaque/reveal-conversion-fail1.gobra create mode 100644 src/test/resources/regressions/features/opaque/reveal-fail1.gobra create mode 100644 src/test/resources/regressions/features/opaque/reveal-fail2.gobra create mode 100644 src/test/resources/regressions/features/opaque/reveal-predicate-fail1.gobra diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4 index bdd27a857..88e2f54db 100644 --- a/src/main/antlr4/GobraLexer.g4 +++ b/src/main/antlr4/GobraLexer.g4 @@ -89,3 +89,5 @@ PROOF : 'proof'; GHOST_EQUALS : '==='; GHOST_NOT_EQUALS : '!=='; WITH : 'with'; +OPAQUE : 'opaque' -> mode(NLSEMI); +REVEAL : 'reveal'; \ No newline at end of file diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index e6cb9b52d..24254bd9e 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -161,8 +161,8 @@ sqType: (kind=(SEQ | SET | MSET | OPT) L_BRACKET type_ R_BRACKET) // Specifications -specification returns[boolean trusted = false, boolean pure = false;]: - ((specStatement | PURE {$pure = true;} | TRUSTED {$trusted = true;}) eos)*? (PURE {$pure = true;})? // Non-greedily match PURE to avoid missing eos errors. +specification returns[boolean trusted = false, boolean pure = false, boolean opaque = false;]: + ((specStatement | OPAQUE {$opaque = true;} | PURE {$pure = true;} | TRUSTED {$trusted = true;}) eos)*? (PURE {$pure = true;})? // Non-greedily match PURE to avoid missing eos errors. ; specStatement @@ -226,11 +226,11 @@ new_: NEW L_PAREN type_ R_PAREN; // Added specifications and parameter info -specMember: specification (functionDecl[$specification.trusted, $specification.pure] | methodDecl[$specification.trusted, $specification.pure]); +specMember: specification (functionDecl[$specification.trusted, $specification.pure, $specification.opaque] | methodDecl[$specification.trusted, $specification.pure, $specification.opaque]); -functionDecl[boolean trusted, boolean pure]: FUNC IDENTIFIER (signature blockWithBodyParameterInfo?); +functionDecl[boolean trusted, boolean pure, boolean opaque]: FUNC IDENTIFIER (signature blockWithBodyParameterInfo?); -methodDecl[boolean trusted, boolean pure]: FUNC receiver IDENTIFIER (signature blockWithBodyParameterInfo?); +methodDecl[boolean trusted, boolean pure, boolean opaque]: FUNC receiver IDENTIFIER (signature blockWithBodyParameterInfo?); @@ -376,7 +376,9 @@ primaryExpr: | primaryExpr slice_ #slicePrimaryExpr | primaryExpr seqUpdExp #seqUpdPrimaryExpr | primaryExpr typeAssertion #typeAssertionPrimaryExpr + // "REVEAL? primaryExpr arguments" doesn't work due to mutual left recursion | primaryExpr arguments #invokePrimaryExpr + | REVEAL primaryExpr arguments #revealInvokePrimaryExpr | primaryExpr arguments AS closureSpecInstance #invokePrimaryExprWithSpec | primaryExpr predConstructArgs #predConstrPrimaryExpr | call_op=( diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 67e5267c7..66fcb0e3d 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.13.0 +// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -9,9 +9,9 @@ import org.antlr.v4.runtime.dfa.DFA; import org.antlr.v4.runtime.misc.*; -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) public class GobraLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -27,22 +27,22 @@ public class GobraLexer extends Lexer { MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, SHARE=59, ADDR_MOD=60, DOT_DOT=61, SHARED=62, EXCLUSIVE=63, PREDICATE=64, WRITEPERM=65, NOPERM=66, TRUSTED=67, OUTLINE=68, INIT_POST=69, IMPORT_PRE=70, PROOF=71, GHOST_EQUALS=72, - GHOST_NOT_EQUALS=73, WITH=74, BREAK=75, DEFAULT=76, FUNC=77, INTERFACE=78, - SELECT=79, CASE=80, DEFER=81, GO=82, MAP=83, STRUCT=84, CHAN=85, ELSE=86, - GOTO=87, PACKAGE=88, SWITCH=89, CONST=90, FALLTHROUGH=91, IF=92, RANGE=93, - TYPE=94, CONTINUE=95, FOR=96, IMPORT=97, RETURN=98, VAR=99, NIL_LIT=100, - IDENTIFIER=101, L_PAREN=102, R_PAREN=103, L_CURLY=104, R_CURLY=105, L_BRACKET=106, - R_BRACKET=107, ASSIGN=108, COMMA=109, SEMI=110, COLON=111, DOT=112, PLUS_PLUS=113, - MINUS_MINUS=114, DECLARE_ASSIGN=115, ELLIPSIS=116, LOGICAL_OR=117, LOGICAL_AND=118, - EQUALS=119, NOT_EQUALS=120, LESS=121, LESS_OR_EQUALS=122, GREATER=123, - GREATER_OR_EQUALS=124, OR=125, DIV=126, MOD=127, LSHIFT=128, RSHIFT=129, - BIT_CLEAR=130, EXCLAMATION=131, PLUS=132, MINUS=133, CARET=134, STAR=135, - AMPERSAND=136, RECEIVE=137, DECIMAL_LIT=138, BINARY_LIT=139, OCTAL_LIT=140, - HEX_LIT=141, HEX_FLOAT_LIT=142, IMAGINARY_LIT=143, RUNE_LIT=144, BYTE_VALUE=145, - OCTAL_BYTE_VALUE=146, HEX_BYTE_VALUE=147, LITTLE_U_VALUE=148, BIG_U_VALUE=149, - RAW_STRING_LIT=150, INTERPRETED_STRING_LIT=151, WS=152, COMMENT=153, TERMINATOR=154, - LINE_COMMENT=155, WS_NLSEMI=156, COMMENT_NLSEMI=157, LINE_COMMENT_NLSEMI=158, - EOS=159, OTHER=160; + GHOST_NOT_EQUALS=73, WITH=74, OPAQUE=75, REVEAL=76, BREAK=77, DEFAULT=78, + FUNC=79, INTERFACE=80, SELECT=81, CASE=82, DEFER=83, GO=84, MAP=85, STRUCT=86, + CHAN=87, ELSE=88, GOTO=89, PACKAGE=90, SWITCH=91, CONST=92, FALLTHROUGH=93, + IF=94, RANGE=95, TYPE=96, CONTINUE=97, FOR=98, IMPORT=99, RETURN=100, + VAR=101, NIL_LIT=102, IDENTIFIER=103, L_PAREN=104, R_PAREN=105, L_CURLY=106, + R_CURLY=107, L_BRACKET=108, R_BRACKET=109, ASSIGN=110, COMMA=111, SEMI=112, + COLON=113, DOT=114, PLUS_PLUS=115, MINUS_MINUS=116, DECLARE_ASSIGN=117, + ELLIPSIS=118, LOGICAL_OR=119, LOGICAL_AND=120, EQUALS=121, NOT_EQUALS=122, + LESS=123, LESS_OR_EQUALS=124, GREATER=125, GREATER_OR_EQUALS=126, OR=127, + DIV=128, MOD=129, LSHIFT=130, RSHIFT=131, BIT_CLEAR=132, EXCLAMATION=133, + PLUS=134, MINUS=135, CARET=136, STAR=137, AMPERSAND=138, RECEIVE=139, + DECIMAL_LIT=140, BINARY_LIT=141, OCTAL_LIT=142, HEX_LIT=143, HEX_FLOAT_LIT=144, + IMAGINARY_LIT=145, RUNE_LIT=146, BYTE_VALUE=147, OCTAL_BYTE_VALUE=148, + HEX_BYTE_VALUE=149, LITTLE_U_VALUE=150, BIG_U_VALUE=151, RAW_STRING_LIT=152, + INTERPRETED_STRING_LIT=153, WS=154, COMMENT=155, TERMINATOR=156, LINE_COMMENT=157, + WS_NLSEMI=158, COMMENT_NLSEMI=159, LINE_COMMENT_NLSEMI=160, EOS=161, OTHER=162; public static final int NLSEMI=1; public static String[] channelNames = { @@ -65,22 +65,22 @@ private static String[] makeRuleNames() { "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", - "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", - "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", - "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", - "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", - "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", - "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR", - "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", - "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", - "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE", - "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "HEX_FLOAT_LIT", - "HEX_MANTISSA", "HEX_EXPONENT", "IMAGINARY_LIT", "RUNE", "RUNE_LIT", - "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", - "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", - "TERMINATOR", "LINE_COMMENT", "UNICODE_VALUE", "ESCAPED_VALUE", "DECIMALS", - "OCTAL_DIGIT", "HEX_DIGIT", "BIN_DIGIT", "EXPONENT", "LETTER", "UNICODE_DIGIT", - "UNICODE_LETTER", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", + "WITH", "OPAQUE", "REVEAL", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", + "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", + "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", + "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", + "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", + "ELLIPSIS", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", + "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", "OR", "DIV", "MOD", + "LSHIFT", "RSHIFT", "BIT_CLEAR", "EXCLAMATION", "PLUS", "MINUS", "CARET", + "STAR", "AMPERSAND", "RECEIVE", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", + "HEX_LIT", "HEX_FLOAT_LIT", "HEX_MANTISSA", "HEX_EXPONENT", "IMAGINARY_LIT", + "RUNE", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", + "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", + "WS", "COMMENT", "TERMINATOR", "LINE_COMMENT", "UNICODE_VALUE", "ESCAPED_VALUE", + "DECIMALS", "OCTAL_DIGIT", "HEX_DIGIT", "BIN_DIGIT", "EXPONENT", "LETTER", + "UNICODE_DIGIT", "UNICODE_LETTER", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", "EOS", "OTHER" }; } @@ -99,14 +99,15 @@ private static String[] makeLiteralNames() { "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", - "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", - "'select'", "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", - "'else'", "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", - "'if'", "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", - "'var'", "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", - "','", "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", - "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", - "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" + "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'break'", "'default'", + "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", + "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", + "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", + "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", + "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", + "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", + "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", + "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -122,20 +123,21 @@ private static String[] makeSymbolicNames() { "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", - "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", - "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", - "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", - "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", - "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", - "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR", - "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", - "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", - "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE", - "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "HEX_FLOAT_LIT", - "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", - "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", - "WS", "COMMENT", "TERMINATOR", "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI", - "LINE_COMMENT_NLSEMI", "EOS", "OTHER" + "WITH", "OPAQUE", "REVEAL", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", + "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", + "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", + "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", + "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", + "ELLIPSIS", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", + "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", "OR", "DIV", "MOD", + "LSHIFT", "RSHIFT", "BIT_CLEAR", "EXCLAMATION", "PLUS", "MINUS", "CARET", + "STAR", "AMPERSAND", "RECEIVE", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", + "HEX_LIT", "HEX_FLOAT_LIT", "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", + "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", "BIG_U_VALUE", + "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", "TERMINATOR", + "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", + "EOS", "OTHER" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -215,7 +217,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\u0004\u0000\u00a0\u05db\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ + "\u0004\u0000\u00a2\u05ef\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ @@ -260,184 +262,187 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+ "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+ "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+ - "\u00ac\u0007\u00ac\u0001\u0000\u0001\u0000\u0003\u0000\u015f\b\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003"+ - "\u0001\u0167\b\u0001\u0001\u0001\u0003\u0001\u016a\b\u0001\u0001\u0001"+ - "\u0003\u0001\u016d\b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0003\u0001\u0173\b\u0001\u0003\u0001\u0175\b\u0001\u0001\u0002\u0001"+ - "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ - "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ - "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ - "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001d"+ - "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ - "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ - " \u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001%\u0001%\u0001%\u0001"+ - "&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'"+ - "\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001"+ - ")\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ - "*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ - "+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u0001"+ - "0\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00011\u00012\u0001"+ - "2\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00013\u00013\u0001"+ - "3\u00013\u00013\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u0001"+ - "4\u00014\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u0001"+ - "6\u00016\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ - "7\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ - "8\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001"+ - "9\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001"+ - ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001=\u0001"+ - "=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001"+ - ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ - "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001"+ - "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ - "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+ - "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ - "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001"+ - "G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001"+ - "I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001"+ - "K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001"+ - "L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+ - "M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ + "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0001"+ + "\u0000\u0001\u0000\u0003\u0000\u0163\b\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u016b\b\u0001\u0001"+ + "\u0001\u0003\u0001\u016e\b\u0001\u0001\u0001\u0003\u0001\u0171\b\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u0177\b\u0001"+ + "\u0003\u0001\u0179\b\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004"+ + "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ + "\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ + "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001"+ + "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001"+ + " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001"+ + "!\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001$\u0001$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001"+ + "&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001"+ + "(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ + ")\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001"+ + "+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00011\u0001"+ + "1\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u0001"+ + "2\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ + "3\u00013\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u0001"+ + "5\u00015\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u0001"+ + "6\u00016\u00016\u00017\u00017\u00017\u00017\u00017\u00018\u00018\u0001"+ + "8\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ + "9\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001"+ + "9\u00019\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001"+ + ";\u0001;\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ + "=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ + "A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ + "C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001"+ + "F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001"+ + "H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001"+ + "J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001"+ + "K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001"+ + "N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+ "O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+ - "Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ - "U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001"+ - "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001"+ - "X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001"+ - "\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001"+ - "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001_\u0001"+ - "_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ - "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001"+ - "b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001"+ - "d\u0001d\u0005d\u0424\bd\nd\fd\u0427\td\u0001d\u0001d\u0001e\u0001e\u0001"+ - "f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001"+ - "i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001l\u0001l\u0001"+ - "m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001"+ - "p\u0001q\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001s\u0001"+ - "s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001v\u0001"+ - "v\u0001v\u0001w\u0001w\u0001w\u0001x\u0001x\u0001y\u0001y\u0001y\u0001"+ - "z\u0001z\u0001{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001}\u0001~\u0001"+ - "~\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080"+ - "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0083"+ + "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001"+ + "V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001"+ + "[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001"+ + "]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001"+ + "_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ + "`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ + "c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001"+ + "e\u0001e\u0001e\u0001f\u0001f\u0001f\u0005f\u0438\bf\nf\ff\u043b\tf\u0001"+ + "f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001"+ + "j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001"+ + "m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001p\u0001p\u0001q\u0001q\u0001"+ + "r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001"+ + "t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001"+ + "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001z\u0001"+ + "z\u0001{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001}\u0001}\u0001~\u0001"+ + "~\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081"+ + "\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083"+ "\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0086"+ - "\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088"+ - "\u0001\u0089\u0001\u0089\u0001\u0089\u0003\u0089\u048f\b\u0089\u0001\u0089"+ - "\u0005\u0089\u0492\b\u0089\n\u0089\f\u0089\u0495\t\u0089\u0003\u0089\u0497"+ - "\b\u0089\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0003"+ - "\u008a\u049e\b\u008a\u0001\u008a\u0004\u008a\u04a1\b\u008a\u000b\u008a"+ - "\f\u008a\u04a2\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0003\u008b"+ - "\u04a9\b\u008b\u0001\u008b\u0003\u008b\u04ac\b\u008b\u0001\u008b\u0004"+ - "\u008b\u04af\b\u008b\u000b\u008b\f\u008b\u04b0\u0001\u008b\u0001\u008b"+ - "\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u04b8\b\u008c\u0001\u008c"+ - "\u0004\u008c\u04bb\b\u008c\u000b\u008c\f\u008c\u04bc\u0001\u008c\u0001"+ - "\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001"+ - "\u008e\u0003\u008e\u04c7\b\u008e\u0001\u008e\u0004\u008e\u04ca\b\u008e"+ - "\u000b\u008e\f\u008e\u04cb\u0001\u008e\u0001\u008e\u0003\u008e\u04d0\b"+ - "\u008e\u0001\u008e\u0005\u008e\u04d3\b\u008e\n\u008e\f\u008e\u04d6\t\u008e"+ - "\u0003\u008e\u04d8\b\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e"+ - "\u04dd\b\u008e\u0001\u008e\u0005\u008e\u04e0\b\u008e\n\u008e\f\u008e\u04e3"+ - "\t\u008e\u0003\u008e\u04e5\b\u008e\u0001\u008f\u0001\u008f\u0003\u008f"+ - "\u04e9\b\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090"+ - "\u0001\u0090\u0001\u0090\u0003\u0090\u04f2\b\u0090\u0001\u0090\u0001\u0090"+ - "\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091"+ - "\u04fb\b\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0092\u0001\u0093\u0001\u0093\u0003\u0093\u0505\b\u0093\u0001\u0094"+ - "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095"+ - "\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001\u0096"+ - "\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097"+ - "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097"+ - "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0005\u0098"+ - "\u0525\b\u0098\n\u0098\f\u0098\u0528\t\u0098\u0001\u0098\u0001\u0098\u0001"+ - "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0005\u0099\u0531"+ - "\b\u0099\n\u0099\f\u0099\u0534\t\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ - "\u0001\u0099\u0001\u009a\u0004\u009a\u053b\b\u009a\u000b\u009a\f\u009a"+ - "\u053c\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ - "\u009b\u0005\u009b\u0545\b\u009b\n\u009b\f\u009b\u0548\t\u009b\u0001\u009b"+ - "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0004\u009c"+ - "\u0550\b\u009c\u000b\u009c\f\u009c\u0551\u0001\u009c\u0001\u009c\u0001"+ - "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0005\u009d\u055a\b\u009d\n"+ - "\u009d\f\u009d\u055d\t\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001"+ - "\u009e\u0001\u009e\u0001\u009e\u0003\u009e\u0565\b\u009e\u0001\u009f\u0001"+ - "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ - "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ - "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ - "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ - "\u009f\u0003\u009f\u0581\b\u009f\u0001\u00a0\u0001\u00a0\u0003\u00a0\u0585"+ - "\b\u00a0\u0001\u00a0\u0005\u00a0\u0588\b\u00a0\n\u00a0\f\u00a0\u058b\t"+ - "\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001"+ - "\u00a3\u0001\u00a4\u0001\u00a4\u0003\u00a4\u0595\b\u00a4\u0001\u00a4\u0001"+ - "\u00a4\u0001\u00a5\u0001\u00a5\u0003\u00a5\u059b\b\u00a5\u0001\u00a6\u0001"+ - "\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0004\u00a8\u05a2\b\u00a8\u000b"+ - "\u00a8\f\u00a8\u05a3\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001"+ - "\u00a9\u0001\u00a9\u0005\u00a9\u05ac\b\u00a9\n\u00a9\f\u00a9\u05af\t\u00a9"+ - "\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa"+ - "\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0005\u00aa\u05ba\b\u00aa\n\u00aa"+ - "\f\u00aa\u05bd\t\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0004\u00ab"+ - "\u05c2\b\u00ab\u000b\u00ab\f\u00ab\u05c3\u0001\u00ab\u0001\u00ab\u0001"+ - "\u00ab\u0001\u00ab\u0001\u00ab\u0005\u00ab\u05cb\b\u00ab\n\u00ab\f\u00ab"+ - "\u05ce\t\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0003\u00ab\u05d3\b"+ - "\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001"+ - "\u00ac\u0001\u00ac\u0003\u0546\u05ad\u05cc\u0000\u00ad\u0002\u0001\u0004"+ - "\u0002\u0006\u0003\b\u0004\n\u0005\f\u0006\u000e\u0007\u0010\b\u0012\t"+ - "\u0014\n\u0016\u000b\u0018\f\u001a\r\u001c\u000e\u001e\u000f \u0010\""+ - "\u0011$\u0012&\u0013(\u0014*\u0015,\u0016.\u00170\u00182\u00194\u001a"+ - "6\u001b8\u001c:\u001d<\u001e>\u001f@ B!D\"F#H$J%L&N\'P(R)T*V+X,Z-\\.^"+ - "/`0b1d2f3h4j5l6n7p8r9t:v;x~?\u0080@\u0082A\u0084B\u0086C\u0088D\u008a"+ - "E\u008cF\u008eG\u0090H\u0092I\u0094J\u0096K\u0098L\u009aM\u009cN\u009e"+ - "O\u00a0P\u00a2Q\u00a4R\u00a6S\u00a8T\u00aaU\u00acV\u00aeW\u00b0X\u00b2"+ - "Y\u00b4Z\u00b6[\u00b8\\\u00ba]\u00bc^\u00be_\u00c0`\u00c2a\u00c4b\u00c6"+ - "c\u00c8d\u00cae\u00ccf\u00ceg\u00d0h\u00d2i\u00d4j\u00d6k\u00d8l\u00da"+ - "m\u00dcn\u00deo\u00e0p\u00e2q\u00e4r\u00e6s\u00e8t\u00eau\u00ecv\u00ee"+ - "w\u00f0x\u00f2y\u00f4z\u00f6{\u00f8|\u00fa}\u00fc~\u00fe\u007f\u0100\u0080"+ - "\u0102\u0081\u0104\u0082\u0106\u0083\u0108\u0084\u010a\u0085\u010c\u0086"+ - "\u010e\u0087\u0110\u0088\u0112\u0089\u0114\u008a\u0116\u008b\u0118\u008c"+ - "\u011a\u008d\u011c\u008e\u011e\u0000\u0120\u0000\u0122\u008f\u0124\u0000"+ - "\u0126\u0090\u0128\u0091\u012a\u0092\u012c\u0093\u012e\u0094\u0130\u0095"+ - "\u0132\u0096\u0134\u0097\u0136\u0098\u0138\u0099\u013a\u009a\u013c\u009b"+ - "\u013e\u0000\u0140\u0000\u0142\u0000\u0144\u0000\u0146\u0000\u0148\u0000"+ - "\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0000\u0152\u009c\u0154\u009d"+ - "\u0156\u009e\u0158\u009f\u015a\u00a0\u0002\u0000\u0001\u0013\u0001\u0000"+ - "19\u0001\u000009\u0002\u0000BBbb\u0002\u0000OOoo\u0002\u0000XXxx\u0002"+ - "\u0000PPpp\u0002\u0000++--\u0001\u0000``\u0002\u0000\"\"\\\\\u0002\u0000"+ - "\t\t \u0002\u0000\n\n\r\r\u0003\u0000\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\"+ - "abffnnrrttvv\u0001\u000007\u0003\u000009AFaf\u0001\u000001\u0002\u0000"+ - "EEee@\u000009\u0660\u0669\u06f0\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef"+ + "\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0089"+ + "\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b"+ + "\u0001\u008b\u0003\u008b\u04a3\b\u008b\u0001\u008b\u0005\u008b\u04a6\b"+ + "\u008b\n\u008b\f\u008b\u04a9\t\u008b\u0003\u008b\u04ab\b\u008b\u0001\u008b"+ + "\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u04b2\b\u008c"+ + "\u0001\u008c\u0004\u008c\u04b5\b\u008c\u000b\u008c\f\u008c\u04b6\u0001"+ + "\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0003\u008d\u04bd\b\u008d\u0001"+ + "\u008d\u0003\u008d\u04c0\b\u008d\u0001\u008d\u0004\u008d\u04c3\b\u008d"+ + "\u000b\u008d\f\u008d\u04c4\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e"+ + "\u0001\u008e\u0003\u008e\u04cc\b\u008e\u0001\u008e\u0004\u008e\u04cf\b"+ + "\u008e\u000b\u008e\f\u008e\u04d0\u0001\u008e\u0001\u008e\u0001\u008f\u0001"+ + "\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0003\u0090\u04db"+ + "\b\u0090\u0001\u0090\u0004\u0090\u04de\b\u0090\u000b\u0090\f\u0090\u04df"+ + "\u0001\u0090\u0001\u0090\u0003\u0090\u04e4\b\u0090\u0001\u0090\u0005\u0090"+ + "\u04e7\b\u0090\n\u0090\f\u0090\u04ea\t\u0090\u0003\u0090\u04ec\b\u0090"+ + "\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u04f1\b\u0090\u0001\u0090"+ + "\u0005\u0090\u04f4\b\u0090\n\u0090\f\u0090\u04f7\t\u0090\u0003\u0090\u04f9"+ + "\b\u0090\u0001\u0091\u0001\u0091\u0003\u0091\u04fd\b\u0091\u0001\u0091"+ + "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ + "\u0003\u0092\u0506\b\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0093\u0001\u0093\u0001\u0093\u0003\u0093\u050f\b\u0093\u0001\u0093"+ + "\u0001\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095"+ + "\u0001\u0095\u0003\u0095\u0519\b\u0095\u0001\u0096\u0001\u0096\u0001\u0096"+ + "\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097"+ + "\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098"+ + "\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ + "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ + "\u0001\u0099\u0001\u009a\u0001\u009a\u0005\u009a\u0539\b\u009a\n\u009a"+ + "\f\u009a\u053c\t\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a"+ + "\u0001\u009b\u0001\u009b\u0001\u009b\u0005\u009b\u0545\b\u009b\n\u009b"+ + "\f\u009b\u0548\t\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b"+ + "\u0001\u009c\u0004\u009c\u054f\b\u009c\u000b\u009c\f\u009c\u0550\u0001"+ + "\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0005"+ + "\u009d\u0559\b\u009d\n\u009d\f\u009d\u055c\t\u009d\u0001\u009d\u0001\u009d"+ + "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0004\u009e\u0564\b\u009e"+ + "\u000b\u009e\f\u009e\u0565\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f"+ + "\u0001\u009f\u0001\u009f\u0005\u009f\u056e\b\u009f\n\u009f\f\u009f\u0571"+ + "\t\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001"+ + "\u00a0\u0003\u00a0\u0579\b\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ + "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ + "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ + "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ + "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0003\u00a1\u0595"+ + "\b\u00a1\u0001\u00a2\u0001\u00a2\u0003\u00a2\u0599\b\u00a2\u0001\u00a2"+ + "\u0005\u00a2\u059c\b\u00a2\n\u00a2\f\u00a2\u059f\t\u00a2\u0001\u00a3\u0001"+ + "\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001"+ + "\u00a6\u0003\u00a6\u05a9\b\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001"+ + "\u00a7\u0003\u00a7\u05af\b\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001"+ + "\u00a9\u0001\u00aa\u0004\u00aa\u05b6\b\u00aa\u000b\u00aa\f\u00aa\u05b7"+ + "\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ + "\u0005\u00ab\u05c0\b\u00ab\n\u00ab\f\u00ab\u05c3\t\u00ab\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001"+ + "\u00ac\u0001\u00ac\u0005\u00ac\u05ce\b\u00ac\n\u00ac\f\u00ac\u05d1\t\u00ac"+ + "\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0004\u00ad\u05d6\b\u00ad\u000b\u00ad"+ + "\f\u00ad\u05d7\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ + "\u0005\u00ad\u05df\b\u00ad\n\u00ad\f\u00ad\u05e2\t\u00ad\u0001\u00ad\u0001"+ + "\u00ad\u0001\u00ad\u0003\u00ad\u05e7\b\u00ad\u0001\u00ad\u0001\u00ad\u0001"+ + "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0003\u055a\u05c1"+ + "\u05e0\u0000\u00af\u0002\u0001\u0004\u0002\u0006\u0003\b\u0004\n\u0005"+ + "\f\u0006\u000e\u0007\u0010\b\u0012\t\u0014\n\u0016\u000b\u0018\f\u001a"+ + "\r\u001c\u000e\u001e\u000f \u0010\"\u0011$\u0012&\u0013(\u0014*\u0015"+ + ",\u0016.\u00170\u00182\u00194\u001a6\u001b8\u001c:\u001d<\u001e>\u001f"+ + "@ B!D\"F#H$J%L&N\'P(R)T*V+X,Z-\\.^/`0b1d2f3h4j5l6n7p8r9t:v;x~?\u0080"+ + "@\u0082A\u0084B\u0086C\u0088D\u008aE\u008cF\u008eG\u0090H\u0092I\u0094"+ + "J\u0096K\u0098L\u009aM\u009cN\u009eO\u00a0P\u00a2Q\u00a4R\u00a6S\u00a8"+ + "T\u00aaU\u00acV\u00aeW\u00b0X\u00b2Y\u00b4Z\u00b6[\u00b8\\\u00ba]\u00bc"+ + "^\u00be_\u00c0`\u00c2a\u00c4b\u00c6c\u00c8d\u00cae\u00ccf\u00ceg\u00d0"+ + "h\u00d2i\u00d4j\u00d6k\u00d8l\u00dam\u00dcn\u00deo\u00e0p\u00e2q\u00e4"+ + "r\u00e6s\u00e8t\u00eau\u00ecv\u00eew\u00f0x\u00f2y\u00f4z\u00f6{\u00f8"+ + "|\u00fa}\u00fc~\u00fe\u007f\u0100\u0080\u0102\u0081\u0104\u0082\u0106"+ + "\u0083\u0108\u0084\u010a\u0085\u010c\u0086\u010e\u0087\u0110\u0088\u0112"+ + "\u0089\u0114\u008a\u0116\u008b\u0118\u008c\u011a\u008d\u011c\u008e\u011e"+ + "\u008f\u0120\u0090\u0122\u0000\u0124\u0000\u0126\u0091\u0128\u0000\u012a"+ + "\u0092\u012c\u0093\u012e\u0094\u0130\u0095\u0132\u0096\u0134\u0097\u0136"+ + "\u0098\u0138\u0099\u013a\u009a\u013c\u009b\u013e\u009c\u0140\u009d\u0142"+ + "\u0000\u0144\u0000\u0146\u0000\u0148\u0000\u014a\u0000\u014c\u0000\u014e"+ + "\u0000\u0150\u0000\u0152\u0000\u0154\u0000\u0156\u009e\u0158\u009f\u015a"+ + "\u00a0\u015c\u00a1\u015e\u00a2\u0002\u0000\u0001\u0013\u0001\u000019\u0001"+ + "\u000009\u0002\u0000BBbb\u0002\u0000OOoo\u0002\u0000XXxx\u0002\u0000P"+ + "Ppp\u0002\u0000++--\u0001\u0000``\u0002\u0000\"\"\\\\\u0002\u0000\t\t"+ + " \u0002\u0000\n\n\r\r\u0003\u0000\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\abf"+ + "fnnrrttvv\u0001\u000007\u0003\u000009AFaf\u0001\u000001\u0002\u0000EE"+ + "ee@\u000009\u0660\u0669\u06f0\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef"+ "\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef"+ "\u0d66\u0d6f\u0de6\u0def\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049"+ "\u1090\u1099\u17e0\u17e9\u1810\u1819\u1946\u194f\u19d0\u19d9\u1a80\u1a89"+ @@ -622,7 +627,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000"+ "\u8002\ua6df\u8002\ua700\u8002\ub739\u8002\ub740\u8002\ub81d\u8002\ub820"+ "\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000"+ - "\u8003\u134a\u8003\u1350\u8003\u23af\u0607\u0000\u0002\u0001\u0000\u0000"+ + "\u8003\u134a\u8003\u1350\u8003\u23af\u061b\u0000\u0002\u0001\u0000\u0000"+ "\u0000\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000"+ "\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000"+ "\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000"+ @@ -690,653 +695,662 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u0000\u0112\u0001\u0000\u0000\u0000\u0000\u0114\u0001\u0000\u0000\u0000"+ "\u0000\u0116\u0001\u0000\u0000\u0000\u0000\u0118\u0001\u0000\u0000\u0000"+ "\u0000\u011a\u0001\u0000\u0000\u0000\u0000\u011c\u0001\u0000\u0000\u0000"+ - "\u0000\u0122\u0001\u0000\u0000\u0000\u0000\u0126\u0001\u0000\u0000\u0000"+ - "\u0000\u0128\u0001\u0000\u0000\u0000\u0000\u012a\u0001\u0000\u0000\u0000"+ + "\u0000\u011e\u0001\u0000\u0000\u0000\u0000\u0120\u0001\u0000\u0000\u0000"+ + "\u0000\u0126\u0001\u0000\u0000\u0000\u0000\u012a\u0001\u0000\u0000\u0000"+ "\u0000\u012c\u0001\u0000\u0000\u0000\u0000\u012e\u0001\u0000\u0000\u0000"+ "\u0000\u0130\u0001\u0000\u0000\u0000\u0000\u0132\u0001\u0000\u0000\u0000"+ "\u0000\u0134\u0001\u0000\u0000\u0000\u0000\u0136\u0001\u0000\u0000\u0000"+ "\u0000\u0138\u0001\u0000\u0000\u0000\u0000\u013a\u0001\u0000\u0000\u0000"+ - "\u0000\u013c\u0001\u0000\u0000\u0000\u0001\u0152\u0001\u0000\u0000\u0000"+ - "\u0001\u0154\u0001\u0000\u0000\u0000\u0001\u0156\u0001\u0000\u0000\u0000"+ + "\u0000\u013c\u0001\u0000\u0000\u0000\u0000\u013e\u0001\u0000\u0000\u0000"+ + "\u0000\u0140\u0001\u0000\u0000\u0000\u0001\u0156\u0001\u0000\u0000\u0000"+ "\u0001\u0158\u0001\u0000\u0000\u0000\u0001\u015a\u0001\u0000\u0000\u0000"+ - "\u0002\u015e\u0001\u0000\u0000\u0000\u0004\u0174\u0001\u0000\u0000\u0000"+ - "\u0006\u0176\u0001\u0000\u0000\u0000\b\u017d\u0001\u0000\u0000\u0000\n"+ - "\u0185\u0001\u0000\u0000\u0000\f\u018c\u0001\u0000\u0000\u0000\u000e\u0193"+ - "\u0001\u0000\u0000\u0000\u0010\u019a\u0001\u0000\u0000\u0000\u0012\u01a1"+ - "\u0001\u0000\u0000\u0000\u0014\u01aa\u0001\u0000\u0000\u0000\u0016\u01b4"+ - "\u0001\u0000\u0000\u0000\u0018\u01bc\u0001\u0000\u0000\u0000\u001a\u01c6"+ - "\u0001\u0000\u0000\u0000\u001c\u01d2\u0001\u0000\u0000\u0000\u001e\u01d9"+ - "\u0001\u0000\u0000\u0000 \u01e4\u0001\u0000\u0000\u0000\"\u01e7\u0001"+ - "\u0000\u0000\u0000$\u01ed\u0001\u0000\u0000\u0000&\u01f6\u0001\u0000\u0000"+ - "\u0000(\u01fb\u0001\u0000\u0000\u0000*\u0202\u0001\u0000\u0000\u0000,"+ - "\u0209\u0001\u0000\u0000\u0000.\u020f\u0001\u0000\u0000\u00000\u0214\u0001"+ - "\u0000\u0000\u00002\u021b\u0001\u0000\u0000\u00004\u0225\u0001\u0000\u0000"+ - "\u00006\u0229\u0001\u0000\u0000\u00008\u022f\u0001\u0000\u0000\u0000:"+ - "\u0232\u0001\u0000\u0000\u0000<\u0234\u0001\u0000\u0000\u0000>\u023b\u0001"+ - "\u0000\u0000\u0000@\u0241\u0001\u0000\u0000\u0000B\u024e\u0001\u0000\u0000"+ - "\u0000D\u0257\u0001\u0000\u0000\u0000F\u025b\u0001\u0000\u0000\u0000H"+ - "\u025f\u0001\u0000\u0000\u0000J\u0265\u0001\u0000\u0000\u0000L\u0267\u0001"+ - "\u0000\u0000\u0000N\u026a\u0001\u0000\u0000\u0000P\u026f\u0001\u0000\u0000"+ - "\u0000R\u0275\u0001\u0000\u0000\u0000T\u027b\u0001\u0000\u0000\u0000V"+ - "\u0282\u0001\u0000\u0000\u0000X\u0289\u0001\u0000\u0000\u0000Z\u0292\u0001"+ - "\u0000\u0000\u0000\\\u0298\u0001\u0000\u0000\u0000^\u029e\u0001\u0000"+ - "\u0000\u0000`\u02a5\u0001\u0000\u0000\u0000b\u02ab\u0001\u0000\u0000\u0000"+ - "d\u02b2\u0001\u0000\u0000\u0000f\u02b8\u0001\u0000\u0000\u0000h\u02c1"+ - "\u0001\u0000\u0000\u0000j\u02c9\u0001\u0000\u0000\u0000l\u02cf\u0001\u0000"+ - "\u0000\u0000n\u02d7\u0001\u0000\u0000\u0000p\u02de\u0001\u0000\u0000\u0000"+ - "r\u02e3\u0001\u0000\u0000\u0000t\u02ec\u0001\u0000\u0000\u0000v\u02fb"+ - "\u0001\u0000\u0000\u0000x\u0301\u0001\u0000\u0000\u0000z\u0305\u0001\u0000"+ - "\u0000\u0000|\u0308\u0001\u0000\u0000\u0000~\u030f\u0001\u0000\u0000\u0000"+ - "\u0080\u0319\u0001\u0000\u0000\u0000\u0082\u0323\u0001\u0000\u0000\u0000"+ - "\u0084\u032f\u0001\u0000\u0000\u0000\u0086\u0338\u0001\u0000\u0000\u0000"+ - "\u0088\u0342\u0001\u0000\u0000\u0000\u008a\u034a\u0001\u0000\u0000\u0000"+ - "\u008c\u0356\u0001\u0000\u0000\u0000\u008e\u0365\u0001\u0000\u0000\u0000"+ - "\u0090\u036b\u0001\u0000\u0000\u0000\u0092\u036f\u0001\u0000\u0000\u0000"+ - "\u0094\u0373\u0001\u0000\u0000\u0000\u0096\u0378\u0001\u0000\u0000\u0000"+ - "\u0098\u0380\u0001\u0000\u0000\u0000\u009a\u0388\u0001\u0000\u0000\u0000"+ - "\u009c\u038d\u0001\u0000\u0000\u0000\u009e\u0397\u0001\u0000\u0000\u0000"+ - "\u00a0\u039e\u0001\u0000\u0000\u0000\u00a2\u03a3\u0001\u0000\u0000\u0000"+ - "\u00a4\u03a9\u0001\u0000\u0000\u0000\u00a6\u03ac\u0001\u0000\u0000\u0000"+ - "\u00a8\u03b0\u0001\u0000\u0000\u0000\u00aa\u03b7\u0001\u0000\u0000\u0000"+ - "\u00ac\u03bc\u0001\u0000\u0000\u0000\u00ae\u03c1\u0001\u0000\u0000\u0000"+ - "\u00b0\u03c6\u0001\u0000\u0000\u0000\u00b2\u03ce\u0001\u0000\u0000\u0000"+ - "\u00b4\u03d5\u0001\u0000\u0000\u0000\u00b6\u03db\u0001\u0000\u0000\u0000"+ - "\u00b8\u03e9\u0001\u0000\u0000\u0000\u00ba\u03ec\u0001\u0000\u0000\u0000"+ - "\u00bc\u03f2\u0001\u0000\u0000\u0000\u00be\u03f7\u0001\u0000\u0000\u0000"+ - "\u00c0\u0402\u0001\u0000\u0000\u0000\u00c2\u0406\u0001\u0000\u0000\u0000"+ - "\u00c4\u040d\u0001\u0000\u0000\u0000\u00c6\u0416\u0001\u0000\u0000\u0000"+ - "\u00c8\u041a\u0001\u0000\u0000\u0000\u00ca\u0420\u0001\u0000\u0000\u0000"+ - "\u00cc\u042a\u0001\u0000\u0000\u0000\u00ce\u042c\u0001\u0000\u0000\u0000"+ - "\u00d0\u0430\u0001\u0000\u0000\u0000\u00d2\u0432\u0001\u0000\u0000\u0000"+ - "\u00d4\u0436\u0001\u0000\u0000\u0000\u00d6\u0438\u0001\u0000\u0000\u0000"+ - "\u00d8\u043c\u0001\u0000\u0000\u0000\u00da\u043e\u0001\u0000\u0000\u0000"+ - "\u00dc\u0440\u0001\u0000\u0000\u0000\u00de\u0442\u0001\u0000\u0000\u0000"+ - "\u00e0\u0444\u0001\u0000\u0000\u0000\u00e2\u0446\u0001\u0000\u0000\u0000"+ - "\u00e4\u044b\u0001\u0000\u0000\u0000\u00e6\u0450\u0001\u0000\u0000\u0000"+ - "\u00e8\u0453\u0001\u0000\u0000\u0000\u00ea\u0457\u0001\u0000\u0000\u0000"+ - "\u00ec\u045a\u0001\u0000\u0000\u0000\u00ee\u045d\u0001\u0000\u0000\u0000"+ - "\u00f0\u0460\u0001\u0000\u0000\u0000\u00f2\u0463\u0001\u0000\u0000\u0000"+ - "\u00f4\u0465\u0001\u0000\u0000\u0000\u00f6\u0468\u0001\u0000\u0000\u0000"+ - "\u00f8\u046a\u0001\u0000\u0000\u0000\u00fa\u046d\u0001\u0000\u0000\u0000"+ - "\u00fc\u046f\u0001\u0000\u0000\u0000\u00fe\u0471\u0001\u0000\u0000\u0000"+ - "\u0100\u0473\u0001\u0000\u0000\u0000\u0102\u0476\u0001\u0000\u0000\u0000"+ - "\u0104\u0479\u0001\u0000\u0000\u0000\u0106\u047c\u0001\u0000\u0000\u0000"+ - "\u0108\u047e\u0001\u0000\u0000\u0000\u010a\u0480\u0001\u0000\u0000\u0000"+ - "\u010c\u0482\u0001\u0000\u0000\u0000\u010e\u0484\u0001\u0000\u0000\u0000"+ - "\u0110\u0486\u0001\u0000\u0000\u0000\u0112\u0488\u0001\u0000\u0000\u0000"+ - "\u0114\u0496\u0001\u0000\u0000\u0000\u0116\u049a\u0001\u0000\u0000\u0000"+ - "\u0118\u04a6\u0001\u0000\u0000\u0000\u011a\u04b4\u0001\u0000\u0000\u0000"+ - "\u011c\u04c0\u0001\u0000\u0000\u0000\u011e\u04e4\u0001\u0000\u0000\u0000"+ - "\u0120\u04e6\u0001\u0000\u0000\u0000\u0122\u04f1\u0001\u0000\u0000\u0000"+ - "\u0124\u04f7\u0001\u0000\u0000\u0000\u0126\u04fe\u0001\u0000\u0000\u0000"+ - "\u0128\u0504\u0001\u0000\u0000\u0000\u012a\u0506\u0001\u0000\u0000\u0000"+ - "\u012c\u050b\u0001\u0000\u0000\u0000\u012e\u0510\u0001\u0000\u0000\u0000"+ - "\u0130\u0517\u0001\u0000\u0000\u0000\u0132\u0522\u0001\u0000\u0000\u0000"+ - "\u0134\u052d\u0001\u0000\u0000\u0000\u0136\u053a\u0001\u0000\u0000\u0000"+ - "\u0138\u0540\u0001\u0000\u0000\u0000\u013a\u054f\u0001\u0000\u0000\u0000"+ - "\u013c\u0555\u0001\u0000\u0000\u0000\u013e\u0564\u0001\u0000\u0000\u0000"+ - "\u0140\u0566\u0001\u0000\u0000\u0000\u0142\u0582\u0001\u0000\u0000\u0000"+ - "\u0144\u058c\u0001\u0000\u0000\u0000\u0146\u058e\u0001\u0000\u0000\u0000"+ - "\u0148\u0590\u0001\u0000\u0000\u0000\u014a\u0592\u0001\u0000\u0000\u0000"+ - "\u014c\u059a\u0001\u0000\u0000\u0000\u014e\u059c\u0001\u0000\u0000\u0000"+ - "\u0150\u059e\u0001\u0000\u0000\u0000\u0152\u05a1\u0001\u0000\u0000\u0000"+ - "\u0154\u05a7\u0001\u0000\u0000\u0000\u0156\u05b5\u0001\u0000\u0000\u0000"+ - "\u0158\u05d2\u0001\u0000\u0000\u0000\u015a\u05d6\u0001\u0000\u0000\u0000"+ - "\u015c\u015f\u0003\u0004\u0001\u0000\u015d\u015f\u0003\u011c\u008d\u0000"+ - "\u015e\u015c\u0001\u0000\u0000\u0000\u015e\u015d\u0001\u0000\u0000\u0000"+ - "\u015f\u0160\u0001\u0000\u0000\u0000\u0160\u0161\u0006\u0000\u0000\u0000"+ - "\u0161\u0003\u0001\u0000\u0000\u0000\u0162\u016c\u0003\u0142\u00a0\u0000"+ - "\u0163\u0164\u0005.\u0000\u0000\u0164\u0166\u0004\u0001\u0000\u0000\u0165"+ - "\u0167\u0003\u0142\u00a0\u0000\u0166\u0165\u0001\u0000\u0000\u0000\u0166"+ - "\u0167\u0001\u0000\u0000\u0000\u0167\u0169\u0001\u0000\u0000\u0000\u0168"+ - "\u016a\u0003\u014a\u00a4\u0000\u0169\u0168\u0001\u0000\u0000\u0000\u0169"+ - "\u016a\u0001\u0000\u0000\u0000\u016a\u016d\u0001\u0000\u0000\u0000\u016b"+ - "\u016d\u0003\u014a\u00a4\u0000\u016c\u0163\u0001\u0000\u0000\u0000\u016c"+ - "\u016b\u0001\u0000\u0000\u0000\u016d\u0175\u0001\u0000\u0000\u0000\u016e"+ - "\u016f\u0005.\u0000\u0000\u016f\u0170\u0004\u0001\u0001\u0000\u0170\u0172"+ - "\u0003\u0142\u00a0\u0000\u0171\u0173\u0003\u014a\u00a4\u0000\u0172\u0171"+ - "\u0001\u0000\u0000\u0000\u0172\u0173\u0001\u0000\u0000\u0000\u0173\u0175"+ - "\u0001\u0000\u0000\u0000\u0174\u0162\u0001\u0000\u0000\u0000\u0174\u016e"+ - "\u0001\u0000\u0000\u0000\u0175\u0005\u0001\u0000\u0000\u0000\u0176\u0177"+ - "\u0005t\u0000\u0000\u0177\u0178\u0005r\u0000\u0000\u0178\u0179\u0005u"+ - "\u0000\u0000\u0179\u017a\u0005e\u0000\u0000\u017a\u017b\u0001\u0000\u0000"+ - "\u0000\u017b\u017c\u0006\u0002\u0000\u0000\u017c\u0007\u0001\u0000\u0000"+ - "\u0000\u017d\u017e\u0005f\u0000\u0000\u017e\u017f\u0005a\u0000\u0000\u017f"+ - "\u0180\u0005l\u0000\u0000\u0180\u0181\u0005s\u0000\u0000\u0181\u0182\u0005"+ - "e\u0000\u0000\u0182\u0183\u0001\u0000\u0000\u0000\u0183\u0184\u0006\u0003"+ - "\u0000\u0000\u0184\t\u0001\u0000\u0000\u0000\u0185\u0186\u0005a\u0000"+ - "\u0000\u0186\u0187\u0005s\u0000\u0000\u0187\u0188\u0005s\u0000\u0000\u0188"+ - "\u0189\u0005e\u0000\u0000\u0189\u018a\u0005r\u0000\u0000\u018a\u018b\u0005"+ - "t\u0000\u0000\u018b\u000b\u0001\u0000\u0000\u0000\u018c\u018d\u0005a\u0000"+ - "\u0000\u018d\u018e\u0005s\u0000\u0000\u018e\u018f\u0005s\u0000\u0000\u018f"+ - "\u0190\u0005u\u0000\u0000\u0190\u0191\u0005m\u0000\u0000\u0191\u0192\u0005"+ - "e\u0000\u0000\u0192\r\u0001\u0000\u0000\u0000\u0193\u0194\u0005i\u0000"+ - "\u0000\u0194\u0195\u0005n\u0000\u0000\u0195\u0196\u0005h\u0000\u0000\u0196"+ - "\u0197\u0005a\u0000\u0000\u0197\u0198\u0005l\u0000\u0000\u0198\u0199\u0005"+ - "e\u0000\u0000\u0199\u000f\u0001\u0000\u0000\u0000\u019a\u019b\u0005e\u0000"+ - "\u0000\u019b\u019c\u0005x\u0000\u0000\u019c\u019d\u0005h\u0000\u0000\u019d"+ - "\u019e\u0005a\u0000\u0000\u019e\u019f\u0005l\u0000\u0000\u019f\u01a0\u0005"+ - "e\u0000\u0000\u01a0\u0011\u0001\u0000\u0000\u0000\u01a1\u01a2\u0005r\u0000"+ - "\u0000\u01a2\u01a3\u0005e\u0000\u0000\u01a3\u01a4\u0005q\u0000\u0000\u01a4"+ - "\u01a5\u0005u\u0000\u0000\u01a5\u01a6\u0005i\u0000\u0000\u01a6\u01a7\u0005"+ - "r\u0000\u0000\u01a7\u01a8\u0005e\u0000\u0000\u01a8\u01a9\u0005s\u0000"+ - "\u0000\u01a9\u0013\u0001\u0000\u0000\u0000\u01aa\u01ab\u0005p\u0000\u0000"+ - "\u01ab\u01ac\u0005r\u0000\u0000\u01ac\u01ad\u0005e\u0000\u0000\u01ad\u01ae"+ - "\u0005s\u0000\u0000\u01ae\u01af\u0005e\u0000\u0000\u01af\u01b0\u0005r"+ - "\u0000\u0000\u01b0\u01b1\u0005v\u0000\u0000\u01b1\u01b2\u0005e\u0000\u0000"+ - "\u01b2\u01b3\u0005s\u0000\u0000\u01b3\u0015\u0001\u0000\u0000\u0000\u01b4"+ - "\u01b5\u0005e\u0000\u0000\u01b5\u01b6\u0005n\u0000\u0000\u01b6\u01b7\u0005"+ - "s\u0000\u0000\u01b7\u01b8\u0005u\u0000\u0000\u01b8\u01b9\u0005r\u0000"+ - "\u0000\u01b9\u01ba\u0005e\u0000\u0000\u01ba\u01bb\u0005s\u0000\u0000\u01bb"+ - "\u0017\u0001\u0000\u0000\u0000\u01bc\u01bd\u0005i\u0000\u0000\u01bd\u01be"+ - "\u0005n\u0000\u0000\u01be\u01bf\u0005v\u0000\u0000\u01bf\u01c0\u0005a"+ - "\u0000\u0000\u01c0\u01c1\u0005r\u0000\u0000\u01c1\u01c2\u0005i\u0000\u0000"+ - "\u01c2\u01c3\u0005a\u0000\u0000\u01c3\u01c4\u0005n\u0000\u0000\u01c4\u01c5"+ - "\u0005t\u0000\u0000\u01c5\u0019\u0001\u0000\u0000\u0000\u01c6\u01c7\u0005"+ - "d\u0000\u0000\u01c7\u01c8\u0005e\u0000\u0000\u01c8\u01c9\u0005c\u0000"+ - "\u0000\u01c9\u01ca\u0005r\u0000\u0000\u01ca\u01cb\u0005e\u0000\u0000\u01cb"+ - "\u01cc\u0005a\u0000\u0000\u01cc\u01cd\u0005s\u0000\u0000\u01cd\u01ce\u0005"+ - "e\u0000\u0000\u01ce\u01cf\u0005s\u0000\u0000\u01cf\u01d0\u0001\u0000\u0000"+ - "\u0000\u01d0\u01d1\u0006\f\u0000\u0000\u01d1\u001b\u0001\u0000\u0000\u0000"+ - "\u01d2\u01d3\u0005p\u0000\u0000\u01d3\u01d4\u0005u\u0000\u0000\u01d4\u01d5"+ - "\u0005r\u0000\u0000\u01d5\u01d6\u0005e\u0000\u0000\u01d6\u01d7\u0001\u0000"+ - "\u0000\u0000\u01d7\u01d8\u0006\r\u0000\u0000\u01d8\u001d\u0001\u0000\u0000"+ - "\u0000\u01d9\u01da\u0005i\u0000\u0000\u01da\u01db\u0005m\u0000\u0000\u01db"+ - "\u01dc\u0005p\u0000\u0000\u01dc\u01dd\u0005l\u0000\u0000\u01dd\u01de\u0005"+ - "e\u0000\u0000\u01de\u01df\u0005m\u0000\u0000\u01df\u01e0\u0005e\u0000"+ - "\u0000\u01e0\u01e1\u0005n\u0000\u0000\u01e1\u01e2\u0005t\u0000\u0000\u01e2"+ - "\u01e3\u0005s\u0000\u0000\u01e3\u001f\u0001\u0000\u0000\u0000\u01e4\u01e5"+ - "\u0005a\u0000\u0000\u01e5\u01e6\u0005s\u0000\u0000\u01e6!\u0001\u0000"+ - "\u0000\u0000\u01e7\u01e8\u0005o\u0000\u0000\u01e8\u01e9\u0005l\u0000\u0000"+ - "\u01e9\u01ea\u0005d\u0000\u0000\u01ea\u01eb\u0001\u0000\u0000\u0000\u01eb"+ - "\u01ec\u0006\u0010\u0000\u0000\u01ec#\u0001\u0000\u0000\u0000\u01ed\u01ee"+ - "\u0005b\u0000\u0000\u01ee\u01ef\u0005e\u0000\u0000\u01ef\u01f0\u0005f"+ - "\u0000\u0000\u01f0\u01f1\u0005o\u0000\u0000\u01f1\u01f2\u0005r\u0000\u0000"+ - "\u01f2\u01f3\u0005e\u0000\u0000\u01f3\u01f4\u0001\u0000\u0000\u0000\u01f4"+ - "\u01f5\u0006\u0011\u0000\u0000\u01f5%\u0001\u0000\u0000\u0000\u01f6\u01f7"+ - "\u0005#\u0000\u0000\u01f7\u01f8\u0005l\u0000\u0000\u01f8\u01f9\u0005h"+ - "\u0000\u0000\u01f9\u01fa\u0005s\u0000\u0000\u01fa\'\u0001\u0000\u0000"+ - "\u0000\u01fb\u01fc\u0005f\u0000\u0000\u01fc\u01fd\u0005o\u0000\u0000\u01fd"+ - "\u01fe\u0005r\u0000\u0000\u01fe\u01ff\u0005a\u0000\u0000\u01ff\u0200\u0005"+ - "l\u0000\u0000\u0200\u0201\u0005l\u0000\u0000\u0201)\u0001\u0000\u0000"+ - "\u0000\u0202\u0203\u0005e\u0000\u0000\u0203\u0204\u0005x\u0000\u0000\u0204"+ - "\u0205\u0005i\u0000\u0000\u0205\u0206\u0005s\u0000\u0000\u0206\u0207\u0005"+ - "t\u0000\u0000\u0207\u0208\u0005s\u0000\u0000\u0208+\u0001\u0000\u0000"+ - "\u0000\u0209\u020a\u0005a\u0000\u0000\u020a\u020b\u0005c\u0000\u0000\u020b"+ - "\u020c\u0005c\u0000\u0000\u020c\u020d\u0001\u0000\u0000\u0000\u020d\u020e"+ - "\u0006\u0015\u0000\u0000\u020e-\u0001\u0000\u0000\u0000\u020f\u0210\u0005"+ - "f\u0000\u0000\u0210\u0211\u0005o\u0000\u0000\u0211\u0212\u0005l\u0000"+ - "\u0000\u0212\u0213\u0005d\u0000\u0000\u0213/\u0001\u0000\u0000\u0000\u0214"+ - "\u0215\u0005u\u0000\u0000\u0215\u0216\u0005n\u0000\u0000\u0216\u0217\u0005"+ - "f\u0000\u0000\u0217\u0218\u0005o\u0000\u0000\u0218\u0219\u0005l\u0000"+ - "\u0000\u0219\u021a\u0005d\u0000\u0000\u021a1\u0001\u0000\u0000\u0000\u021b"+ - "\u021c\u0005u\u0000\u0000\u021c\u021d\u0005n\u0000\u0000\u021d\u021e\u0005"+ - "f\u0000\u0000\u021e\u021f\u0005o\u0000\u0000\u021f\u0220\u0005l\u0000"+ - "\u0000\u0220\u0221\u0005d\u0000\u0000\u0221\u0222\u0005i\u0000\u0000\u0222"+ - "\u0223\u0005n\u0000\u0000\u0223\u0224\u0005g\u0000\u0000\u02243\u0001"+ - "\u0000\u0000\u0000\u0225\u0226\u0005l\u0000\u0000\u0226\u0227\u0005e\u0000"+ - "\u0000\u0227\u0228\u0005t\u0000\u0000\u02285\u0001\u0000\u0000\u0000\u0229"+ - "\u022a\u0005g\u0000\u0000\u022a\u022b\u0005h\u0000\u0000\u022b\u022c\u0005"+ - "o\u0000\u0000\u022c\u022d\u0005s\u0000\u0000\u022d\u022e\u0005t\u0000"+ - "\u0000\u022e7\u0001\u0000\u0000\u0000\u022f\u0230\u0005i\u0000\u0000\u0230"+ - "\u0231\u0005n\u0000\u0000\u02319\u0001\u0000\u0000\u0000\u0232\u0233\u0005"+ - "#\u0000\u0000\u0233;\u0001\u0000\u0000\u0000\u0234\u0235\u0005s\u0000"+ - "\u0000\u0235\u0236\u0005u\u0000\u0000\u0236\u0237\u0005b\u0000\u0000\u0237"+ - "\u0238\u0005s\u0000\u0000\u0238\u0239\u0005e\u0000\u0000\u0239\u023a\u0005"+ - "t\u0000\u0000\u023a=\u0001\u0000\u0000\u0000\u023b\u023c\u0005u\u0000"+ - "\u0000\u023c\u023d\u0005n\u0000\u0000\u023d\u023e\u0005i\u0000\u0000\u023e"+ - "\u023f\u0005o\u0000\u0000\u023f\u0240\u0005n\u0000\u0000\u0240?\u0001"+ - "\u0000\u0000\u0000\u0241\u0242\u0005i\u0000\u0000\u0242\u0243\u0005n\u0000"+ - "\u0000\u0243\u0244\u0005t\u0000\u0000\u0244\u0245\u0005e\u0000\u0000\u0245"+ - "\u0246\u0005r\u0000\u0000\u0246\u0247\u0005s\u0000\u0000\u0247\u0248\u0005"+ - "e\u0000\u0000\u0248\u0249\u0005c\u0000\u0000\u0249\u024a\u0005t\u0000"+ - "\u0000\u024a\u024b\u0005i\u0000\u0000\u024b\u024c\u0005o\u0000\u0000\u024c"+ - "\u024d\u0005n\u0000\u0000\u024dA\u0001\u0000\u0000\u0000\u024e\u024f\u0005"+ - "s\u0000\u0000\u024f\u0250\u0005e\u0000\u0000\u0250\u0251\u0005t\u0000"+ - "\u0000\u0251\u0252\u0005m\u0000\u0000\u0252\u0253\u0005i\u0000\u0000\u0253"+ - "\u0254\u0005n\u0000\u0000\u0254\u0255\u0005u\u0000\u0000\u0255\u0256\u0005"+ - "s\u0000\u0000\u0256C\u0001\u0000\u0000\u0000\u0257\u0258\u0005=\u0000"+ - "\u0000\u0258\u0259\u0005=\u0000\u0000\u0259\u025a\u0005>\u0000\u0000\u025a"+ - "E\u0001\u0000\u0000\u0000\u025b\u025c\u0005-\u0000\u0000\u025c\u025d\u0005"+ - "-\u0000\u0000\u025d\u025e\u0005*\u0000\u0000\u025eG\u0001\u0000\u0000"+ - "\u0000\u025f\u0260\u0005a\u0000\u0000\u0260\u0261\u0005p\u0000\u0000\u0261"+ - "\u0262\u0005p\u0000\u0000\u0262\u0263\u0005l\u0000\u0000\u0263\u0264\u0005"+ - "y\u0000\u0000\u0264I\u0001\u0000\u0000\u0000\u0265\u0266\u0005?\u0000"+ - "\u0000\u0266K\u0001\u0000\u0000\u0000\u0267\u0268\u0005!\u0000\u0000\u0268"+ - "\u0269\u0005<\u0000\u0000\u0269M\u0001\u0000\u0000\u0000\u026a\u026b\u0005"+ - "!\u0000\u0000\u026b\u026c\u0005>\u0000\u0000\u026c\u026d\u0001\u0000\u0000"+ - "\u0000\u026d\u026e\u0006&\u0000\u0000\u026eO\u0001\u0000\u0000\u0000\u026f"+ - "\u0270\u0005s\u0000\u0000\u0270\u0271\u0005e\u0000\u0000\u0271\u0272\u0005"+ - "q\u0000\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0274\u0006\'"+ - "\u0000\u0000\u0274Q\u0001\u0000\u0000\u0000\u0275\u0276\u0005s\u0000\u0000"+ - "\u0276\u0277\u0005e\u0000\u0000\u0277\u0278\u0005t\u0000\u0000\u0278\u0279"+ - "\u0001\u0000\u0000\u0000\u0279\u027a\u0006(\u0000\u0000\u027aS\u0001\u0000"+ - "\u0000\u0000\u027b\u027c\u0005m\u0000\u0000\u027c\u027d\u0005s\u0000\u0000"+ - "\u027d\u027e\u0005e\u0000\u0000\u027e\u027f\u0005t\u0000\u0000\u027f\u0280"+ - "\u0001\u0000\u0000\u0000\u0280\u0281\u0006)\u0000\u0000\u0281U\u0001\u0000"+ - "\u0000\u0000\u0282\u0283\u0005d\u0000\u0000\u0283\u0284\u0005i\u0000\u0000"+ - "\u0284\u0285\u0005c\u0000\u0000\u0285\u0286\u0005t\u0000\u0000\u0286\u0287"+ - "\u0001\u0000\u0000\u0000\u0287\u0288\u0006*\u0000\u0000\u0288W\u0001\u0000"+ - "\u0000\u0000\u0289\u028a\u0005o\u0000\u0000\u028a\u028b\u0005p\u0000\u0000"+ - "\u028b\u028c\u0005t\u0000\u0000\u028c\u028d\u0005i\u0000\u0000\u028d\u028e"+ - "\u0005o\u0000\u0000\u028e\u028f\u0005n\u0000\u0000\u028f\u0290\u0001\u0000"+ - "\u0000\u0000\u0290\u0291\u0006+\u0000\u0000\u0291Y\u0001\u0000\u0000\u0000"+ - "\u0292\u0293\u0005l\u0000\u0000\u0293\u0294\u0005e\u0000\u0000\u0294\u0295"+ - "\u0005n\u0000\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296\u0297\u0006"+ - ",\u0000\u0000\u0297[\u0001\u0000\u0000\u0000\u0298\u0299\u0005n\u0000"+ - "\u0000\u0299\u029a\u0005e\u0000\u0000\u029a\u029b\u0005w\u0000\u0000\u029b"+ - "\u029c\u0001\u0000\u0000\u0000\u029c\u029d\u0006-\u0000\u0000\u029d]\u0001"+ - "\u0000\u0000\u0000\u029e\u029f\u0005m\u0000\u0000\u029f\u02a0\u0005a\u0000"+ - "\u0000\u02a0\u02a1\u0005k\u0000\u0000\u02a1\u02a2\u0005e\u0000\u0000\u02a2"+ - "\u02a3\u0001\u0000\u0000\u0000\u02a3\u02a4\u0006.\u0000\u0000\u02a4_\u0001"+ - "\u0000\u0000\u0000\u02a5\u02a6\u0005c\u0000\u0000\u02a6\u02a7\u0005a\u0000"+ - "\u0000\u02a7\u02a8\u0005p\u0000\u0000\u02a8\u02a9\u0001\u0000\u0000\u0000"+ - "\u02a9\u02aa\u0006/\u0000\u0000\u02aaa\u0001\u0000\u0000\u0000\u02ab\u02ac"+ - "\u0005s\u0000\u0000\u02ac\u02ad\u0005o\u0000\u0000\u02ad\u02ae\u0005m"+ - "\u0000\u0000\u02ae\u02af\u0005e\u0000\u0000\u02af\u02b0\u0001\u0000\u0000"+ - "\u0000\u02b0\u02b1\u00060\u0000\u0000\u02b1c\u0001\u0000\u0000\u0000\u02b2"+ - "\u02b3\u0005g\u0000\u0000\u02b3\u02b4\u0005e\u0000\u0000\u02b4\u02b5\u0005"+ - "t\u0000\u0000\u02b5\u02b6\u0001\u0000\u0000\u0000\u02b6\u02b7\u00061\u0000"+ - "\u0000\u02b7e\u0001\u0000\u0000\u0000\u02b8\u02b9\u0005d\u0000\u0000\u02b9"+ - "\u02ba\u0005o\u0000\u0000\u02ba\u02bb\u0005m\u0000\u0000\u02bb\u02bc\u0005"+ - "a\u0000\u0000\u02bc\u02bd\u0005i\u0000\u0000\u02bd\u02be\u0005n\u0000"+ - "\u0000\u02be\u02bf\u0001\u0000\u0000\u0000\u02bf\u02c0\u00062\u0000\u0000"+ - "\u02c0g\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005a\u0000\u0000\u02c2\u02c3"+ - "\u0005x\u0000\u0000\u02c3\u02c4\u0005i\u0000\u0000\u02c4\u02c5\u0005o"+ - "\u0000\u0000\u02c5\u02c6\u0005m\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000"+ - "\u0000\u02c7\u02c8\u00063\u0000\u0000\u02c8i\u0001\u0000\u0000\u0000\u02c9"+ - "\u02ca\u0005a\u0000\u0000\u02ca\u02cb\u0005d\u0000\u0000\u02cb\u02cc\u0005"+ - "t\u0000\u0000\u02cc\u02cd\u0001\u0000\u0000\u0000\u02cd\u02ce\u00064\u0000"+ - "\u0000\u02cek\u0001\u0000\u0000\u0000\u02cf\u02d0\u0005m\u0000\u0000\u02d0"+ - "\u02d1\u0005a\u0000\u0000\u02d1\u02d2\u0005t\u0000\u0000\u02d2\u02d3\u0005"+ - "c\u0000\u0000\u02d3\u02d4\u0005h\u0000\u0000\u02d4\u02d5\u0001\u0000\u0000"+ - "\u0000\u02d5\u02d6\u00065\u0000\u0000\u02d6m\u0001\u0000\u0000\u0000\u02d7"+ - "\u02d8\u0005n\u0000\u0000\u02d8\u02d9\u0005o\u0000\u0000\u02d9\u02da\u0005"+ - "n\u0000\u0000\u02da\u02db\u0005e\u0000\u0000\u02db\u02dc\u0001\u0000\u0000"+ - "\u0000\u02dc\u02dd\u00066\u0000\u0000\u02ddo\u0001\u0000\u0000\u0000\u02de"+ - "\u02df\u0005p\u0000\u0000\u02df\u02e0\u0005r\u0000\u0000\u02e0\u02e1\u0005"+ - "e\u0000\u0000\u02e1\u02e2\u0005d\u0000\u0000\u02e2q\u0001\u0000\u0000"+ - "\u0000\u02e3\u02e4\u0005t\u0000\u0000\u02e4\u02e5\u0005y\u0000\u0000\u02e5"+ - "\u02e6\u0005p\u0000\u0000\u02e6\u02e7\u0005e\u0000\u0000\u02e7\u02e8\u0005"+ - "O\u0000\u0000\u02e8\u02e9\u0005f\u0000\u0000\u02e9\u02ea\u0001\u0000\u0000"+ - "\u0000\u02ea\u02eb\u00068\u0000\u0000\u02ebs\u0001\u0000\u0000\u0000\u02ec"+ - "\u02ed\u0005i\u0000\u0000\u02ed\u02ee\u0005s\u0000\u0000\u02ee\u02ef\u0005"+ - "C\u0000\u0000\u02ef\u02f0\u0005o\u0000\u0000\u02f0\u02f1\u0005m\u0000"+ - "\u0000\u02f1\u02f2\u0005p\u0000\u0000\u02f2\u02f3\u0005a\u0000\u0000\u02f3"+ - "\u02f4\u0005r\u0000\u0000\u02f4\u02f5\u0005a\u0000\u0000\u02f5\u02f6\u0005"+ - "b\u0000\u0000\u02f6\u02f7\u0005l\u0000\u0000\u02f7\u02f8\u0005e\u0000"+ - "\u0000\u02f8\u02f9\u0001\u0000\u0000\u0000\u02f9\u02fa\u00069\u0000\u0000"+ - "\u02fau\u0001\u0000\u0000\u0000\u02fb\u02fc\u0005s\u0000\u0000\u02fc\u02fd"+ - "\u0005h\u0000\u0000\u02fd\u02fe\u0005a\u0000\u0000\u02fe\u02ff\u0005r"+ - "\u0000\u0000\u02ff\u0300\u0005e\u0000\u0000\u0300w\u0001\u0000\u0000\u0000"+ - "\u0301\u0302\u0005@\u0000\u0000\u0302\u0303\u0001\u0000\u0000\u0000\u0303"+ - "\u0304\u0006;\u0000\u0000\u0304y\u0001\u0000\u0000\u0000\u0305\u0306\u0005"+ - ".\u0000\u0000\u0306\u0307\u0005.\u0000\u0000\u0307{\u0001\u0000\u0000"+ - "\u0000\u0308\u0309\u0005s\u0000\u0000\u0309\u030a\u0005h\u0000\u0000\u030a"+ - "\u030b\u0005a\u0000\u0000\u030b\u030c\u0005r\u0000\u0000\u030c\u030d\u0005"+ - "e\u0000\u0000\u030d\u030e\u0005d\u0000\u0000\u030e}\u0001\u0000\u0000"+ - "\u0000\u030f\u0310\u0005e\u0000\u0000\u0310\u0311\u0005x\u0000\u0000\u0311"+ - "\u0312\u0005c\u0000\u0000\u0312\u0313\u0005l\u0000\u0000\u0313\u0314\u0005"+ - "u\u0000\u0000\u0314\u0315\u0005s\u0000\u0000\u0315\u0316\u0005i\u0000"+ - "\u0000\u0316\u0317\u0005v\u0000\u0000\u0317\u0318\u0005e\u0000\u0000\u0318"+ - "\u007f\u0001\u0000\u0000\u0000\u0319\u031a\u0005p\u0000\u0000\u031a\u031b"+ - "\u0005r\u0000\u0000\u031b\u031c\u0005e\u0000\u0000\u031c\u031d\u0005d"+ - "\u0000\u0000\u031d\u031e\u0005i\u0000\u0000\u031e\u031f\u0005c\u0000\u0000"+ - "\u031f\u0320\u0005a\u0000\u0000\u0320\u0321\u0005t\u0000\u0000\u0321\u0322"+ - "\u0005e\u0000\u0000\u0322\u0081\u0001\u0000\u0000\u0000\u0323\u0324\u0005"+ - "w\u0000\u0000\u0324\u0325\u0005r\u0000\u0000\u0325\u0326\u0005i\u0000"+ - "\u0000\u0326\u0327\u0005t\u0000\u0000\u0327\u0328\u0005e\u0000\u0000\u0328"+ - "\u0329\u0005P\u0000\u0000\u0329\u032a\u0005e\u0000\u0000\u032a\u032b\u0005"+ - "r\u0000\u0000\u032b\u032c\u0005m\u0000\u0000\u032c\u032d\u0001\u0000\u0000"+ - "\u0000\u032d\u032e\u0006@\u0000\u0000\u032e\u0083\u0001\u0000\u0000\u0000"+ - "\u032f\u0330\u0005n\u0000\u0000\u0330\u0331\u0005o\u0000\u0000\u0331\u0332"+ - "\u0005P\u0000\u0000\u0332\u0333\u0005e\u0000\u0000\u0333\u0334\u0005r"+ - "\u0000\u0000\u0334\u0335\u0005m\u0000\u0000\u0335\u0336\u0001\u0000\u0000"+ - "\u0000\u0336\u0337\u0006A\u0000\u0000\u0337\u0085\u0001\u0000\u0000\u0000"+ - "\u0338\u0339\u0005t\u0000\u0000\u0339\u033a\u0005r\u0000\u0000\u033a\u033b"+ - "\u0005u\u0000\u0000\u033b\u033c\u0005s\u0000\u0000\u033c\u033d\u0005t"+ - "\u0000\u0000\u033d\u033e\u0005e\u0000\u0000\u033e\u033f\u0005d\u0000\u0000"+ - "\u033f\u0340\u0001\u0000\u0000\u0000\u0340\u0341\u0006B\u0000\u0000\u0341"+ - "\u0087\u0001\u0000\u0000\u0000\u0342\u0343\u0005o\u0000\u0000\u0343\u0344"+ - "\u0005u\u0000\u0000\u0344\u0345\u0005t\u0000\u0000\u0345\u0346\u0005l"+ - "\u0000\u0000\u0346\u0347\u0005i\u0000\u0000\u0347\u0348\u0005n\u0000\u0000"+ - "\u0348\u0349\u0005e\u0000\u0000\u0349\u0089\u0001\u0000\u0000\u0000\u034a"+ - "\u034b\u0005i\u0000\u0000\u034b\u034c\u0005n\u0000\u0000\u034c\u034d\u0005"+ - "i\u0000\u0000\u034d\u034e\u0005t\u0000\u0000\u034e\u034f\u0005E\u0000"+ - "\u0000\u034f\u0350\u0005n\u0000\u0000\u0350\u0351\u0005s\u0000\u0000\u0351"+ - "\u0352\u0005u\u0000\u0000\u0352\u0353\u0005r\u0000\u0000\u0353\u0354\u0005"+ - "e\u0000\u0000\u0354\u0355\u0005s\u0000\u0000\u0355\u008b\u0001\u0000\u0000"+ - "\u0000\u0356\u0357\u0005i\u0000\u0000\u0357\u0358\u0005m\u0000\u0000\u0358"+ - "\u0359\u0005p\u0000\u0000\u0359\u035a\u0005o\u0000\u0000\u035a\u035b\u0005"+ - "r\u0000\u0000\u035b\u035c\u0005t\u0000\u0000\u035c\u035d\u0005R\u0000"+ - "\u0000\u035d\u035e\u0005e\u0000\u0000\u035e\u035f\u0005q\u0000\u0000\u035f"+ - "\u0360\u0005u\u0000\u0000\u0360\u0361\u0005i\u0000\u0000\u0361\u0362\u0005"+ - "r\u0000\u0000\u0362\u0363\u0005e\u0000\u0000\u0363\u0364\u0005s\u0000"+ - "\u0000\u0364\u008d\u0001\u0000\u0000\u0000\u0365\u0366\u0005p\u0000\u0000"+ - "\u0366\u0367\u0005r\u0000\u0000\u0367\u0368\u0005o\u0000\u0000\u0368\u0369"+ - "\u0005o\u0000\u0000\u0369\u036a\u0005f\u0000\u0000\u036a\u008f\u0001\u0000"+ - "\u0000\u0000\u036b\u036c\u0005=\u0000\u0000\u036c\u036d\u0005=\u0000\u0000"+ - "\u036d\u036e\u0005=\u0000\u0000\u036e\u0091\u0001\u0000\u0000\u0000\u036f"+ - "\u0370\u0005!\u0000\u0000\u0370\u0371\u0005=\u0000\u0000\u0371\u0372\u0005"+ - "=\u0000\u0000\u0372\u0093\u0001\u0000\u0000\u0000\u0373\u0374\u0005w\u0000"+ - "\u0000\u0374\u0375\u0005i\u0000\u0000\u0375\u0376\u0005t\u0000\u0000\u0376"+ - "\u0377\u0005h\u0000\u0000\u0377\u0095\u0001\u0000\u0000\u0000\u0378\u0379"+ - "\u0005b\u0000\u0000\u0379\u037a\u0005r\u0000\u0000\u037a\u037b\u0005e"+ - "\u0000\u0000\u037b\u037c\u0005a\u0000\u0000\u037c\u037d\u0005k\u0000\u0000"+ - "\u037d\u037e\u0001\u0000\u0000\u0000\u037e\u037f\u0006J\u0000\u0000\u037f"+ - "\u0097\u0001\u0000\u0000\u0000\u0380\u0381\u0005d\u0000\u0000\u0381\u0382"+ - "\u0005e\u0000\u0000\u0382\u0383\u0005f\u0000\u0000\u0383\u0384\u0005a"+ - "\u0000\u0000\u0384\u0385\u0005u\u0000\u0000\u0385\u0386\u0005l\u0000\u0000"+ - "\u0386\u0387\u0005t\u0000\u0000\u0387\u0099\u0001\u0000\u0000\u0000\u0388"+ - "\u0389\u0005f\u0000\u0000\u0389\u038a\u0005u\u0000\u0000\u038a\u038b\u0005"+ - "n\u0000\u0000\u038b\u038c\u0005c\u0000\u0000\u038c\u009b\u0001\u0000\u0000"+ - "\u0000\u038d\u038e\u0005i\u0000\u0000\u038e\u038f\u0005n\u0000\u0000\u038f"+ - "\u0390\u0005t\u0000\u0000\u0390\u0391\u0005e\u0000\u0000\u0391\u0392\u0005"+ - "r\u0000\u0000\u0392\u0393\u0005f\u0000\u0000\u0393\u0394\u0005a\u0000"+ - "\u0000\u0394\u0395\u0005c\u0000\u0000\u0395\u0396\u0005e\u0000\u0000\u0396"+ - "\u009d\u0001\u0000\u0000\u0000\u0397\u0398\u0005s\u0000\u0000\u0398\u0399"+ - "\u0005e\u0000\u0000\u0399\u039a\u0005l\u0000\u0000\u039a\u039b\u0005e"+ - "\u0000\u0000\u039b\u039c\u0005c\u0000\u0000\u039c\u039d\u0005t\u0000\u0000"+ - "\u039d\u009f\u0001\u0000\u0000\u0000\u039e\u039f\u0005c\u0000\u0000\u039f"+ - "\u03a0\u0005a\u0000\u0000\u03a0\u03a1\u0005s\u0000\u0000\u03a1\u03a2\u0005"+ - "e\u0000\u0000\u03a2\u00a1\u0001\u0000\u0000\u0000\u03a3\u03a4\u0005d\u0000"+ - "\u0000\u03a4\u03a5\u0005e\u0000\u0000\u03a5\u03a6\u0005f\u0000\u0000\u03a6"+ - "\u03a7\u0005e\u0000\u0000\u03a7\u03a8\u0005r\u0000\u0000\u03a8\u00a3\u0001"+ - "\u0000\u0000\u0000\u03a9\u03aa\u0005g\u0000\u0000\u03aa\u03ab\u0005o\u0000"+ - "\u0000\u03ab\u00a5\u0001\u0000\u0000\u0000\u03ac\u03ad\u0005m\u0000\u0000"+ - "\u03ad\u03ae\u0005a\u0000\u0000\u03ae\u03af\u0005p\u0000\u0000\u03af\u00a7"+ - "\u0001\u0000\u0000\u0000\u03b0\u03b1\u0005s\u0000\u0000\u03b1\u03b2\u0005"+ - "t\u0000\u0000\u03b2\u03b3\u0005r\u0000\u0000\u03b3\u03b4\u0005u\u0000"+ - "\u0000\u03b4\u03b5\u0005c\u0000\u0000\u03b5\u03b6\u0005t\u0000\u0000\u03b6"+ - "\u00a9\u0001\u0000\u0000\u0000\u03b7\u03b8\u0005c\u0000\u0000\u03b8\u03b9"+ - "\u0005h\u0000\u0000\u03b9\u03ba\u0005a\u0000\u0000\u03ba\u03bb\u0005n"+ - "\u0000\u0000\u03bb\u00ab\u0001\u0000\u0000\u0000\u03bc\u03bd\u0005e\u0000"+ - "\u0000\u03bd\u03be\u0005l\u0000\u0000\u03be\u03bf\u0005s\u0000\u0000\u03bf"+ - "\u03c0\u0005e\u0000\u0000\u03c0\u00ad\u0001\u0000\u0000\u0000\u03c1\u03c2"+ - "\u0005g\u0000\u0000\u03c2\u03c3\u0005o\u0000\u0000\u03c3\u03c4\u0005t"+ - "\u0000\u0000\u03c4\u03c5\u0005o\u0000\u0000\u03c5\u00af\u0001\u0000\u0000"+ - "\u0000\u03c6\u03c7\u0005p\u0000\u0000\u03c7\u03c8\u0005a\u0000\u0000\u03c8"+ - "\u03c9\u0005c\u0000\u0000\u03c9\u03ca\u0005k\u0000\u0000\u03ca\u03cb\u0005"+ - "a\u0000\u0000\u03cb\u03cc\u0005g\u0000\u0000\u03cc\u03cd\u0005e\u0000"+ - "\u0000\u03cd\u00b1\u0001\u0000\u0000\u0000\u03ce\u03cf\u0005s\u0000\u0000"+ - "\u03cf\u03d0\u0005w\u0000\u0000\u03d0\u03d1\u0005i\u0000\u0000\u03d1\u03d2"+ - "\u0005t\u0000\u0000\u03d2\u03d3\u0005c\u0000\u0000\u03d3\u03d4\u0005h"+ - "\u0000\u0000\u03d4\u00b3\u0001\u0000\u0000\u0000\u03d5\u03d6\u0005c\u0000"+ - "\u0000\u03d6\u03d7\u0005o\u0000\u0000\u03d7\u03d8\u0005n\u0000\u0000\u03d8"+ - "\u03d9\u0005s\u0000\u0000\u03d9\u03da\u0005t\u0000\u0000\u03da\u00b5\u0001"+ - "\u0000\u0000\u0000\u03db\u03dc\u0005f\u0000\u0000\u03dc\u03dd\u0005a\u0000"+ - "\u0000\u03dd\u03de\u0005l\u0000\u0000\u03de\u03df\u0005l\u0000\u0000\u03df"+ - "\u03e0\u0005t\u0000\u0000\u03e0\u03e1\u0005h\u0000\u0000\u03e1\u03e2\u0005"+ - "r\u0000\u0000\u03e2\u03e3\u0005o\u0000\u0000\u03e3\u03e4\u0005u\u0000"+ - "\u0000\u03e4\u03e5\u0005g\u0000\u0000\u03e5\u03e6\u0005h\u0000\u0000\u03e6"+ - "\u03e7\u0001\u0000\u0000\u0000\u03e7\u03e8\u0006Z\u0000\u0000\u03e8\u00b7"+ - "\u0001\u0000\u0000\u0000\u03e9\u03ea\u0005i\u0000\u0000\u03ea\u03eb\u0005"+ - "f\u0000\u0000\u03eb\u00b9\u0001\u0000\u0000\u0000\u03ec\u03ed\u0005r\u0000"+ - "\u0000\u03ed\u03ee\u0005a\u0000\u0000\u03ee\u03ef\u0005n\u0000\u0000\u03ef"+ - "\u03f0\u0005g\u0000\u0000\u03f0\u03f1\u0005e\u0000\u0000\u03f1\u00bb\u0001"+ - "\u0000\u0000\u0000\u03f2\u03f3\u0005t\u0000\u0000\u03f3\u03f4\u0005y\u0000"+ - "\u0000\u03f4\u03f5\u0005p\u0000\u0000\u03f5\u03f6\u0005e\u0000\u0000\u03f6"+ - "\u00bd\u0001\u0000\u0000\u0000\u03f7\u03f8\u0005c\u0000\u0000\u03f8\u03f9"+ - "\u0005o\u0000\u0000\u03f9\u03fa\u0005n\u0000\u0000\u03fa\u03fb\u0005t"+ - "\u0000\u0000\u03fb\u03fc\u0005i\u0000\u0000\u03fc\u03fd\u0005n\u0000\u0000"+ - "\u03fd\u03fe\u0005u\u0000\u0000\u03fe\u03ff\u0005e\u0000\u0000\u03ff\u0400"+ - "\u0001\u0000\u0000\u0000\u0400\u0401\u0006^\u0000\u0000\u0401\u00bf\u0001"+ - "\u0000\u0000\u0000\u0402\u0403\u0005f\u0000\u0000\u0403\u0404\u0005o\u0000"+ - "\u0000\u0404\u0405\u0005r\u0000\u0000\u0405\u00c1\u0001\u0000\u0000\u0000"+ - "\u0406\u0407\u0005i\u0000\u0000\u0407\u0408\u0005m\u0000\u0000\u0408\u0409"+ - "\u0005p\u0000\u0000\u0409\u040a\u0005o\u0000\u0000\u040a\u040b\u0005r"+ - "\u0000\u0000\u040b\u040c\u0005t\u0000\u0000\u040c\u00c3\u0001\u0000\u0000"+ - "\u0000\u040d\u040e\u0005r\u0000\u0000\u040e\u040f\u0005e\u0000\u0000\u040f"+ - "\u0410\u0005t\u0000\u0000\u0410\u0411\u0005u\u0000\u0000\u0411\u0412\u0005"+ - "r\u0000\u0000\u0412\u0413\u0005n\u0000\u0000\u0413\u0414\u0001\u0000\u0000"+ - "\u0000\u0414\u0415\u0006a\u0000\u0000\u0415\u00c5\u0001\u0000\u0000\u0000"+ - "\u0416\u0417\u0005v\u0000\u0000\u0417\u0418\u0005a\u0000\u0000\u0418\u0419"+ - "\u0005r\u0000\u0000\u0419\u00c7\u0001\u0000\u0000\u0000\u041a\u041b\u0005"+ - "n\u0000\u0000\u041b\u041c\u0005i\u0000\u0000\u041c\u041d\u0005l\u0000"+ - "\u0000\u041d\u041e\u0001\u0000\u0000\u0000\u041e\u041f\u0006c\u0000\u0000"+ - "\u041f\u00c9\u0001\u0000\u0000\u0000\u0420\u0425\u0003\u014c\u00a5\u0000"+ - "\u0421\u0424\u0003\u014c\u00a5\u0000\u0422\u0424\u0003\u014e\u00a6\u0000"+ - "\u0423\u0421\u0001\u0000\u0000\u0000\u0423\u0422\u0001\u0000\u0000\u0000"+ - "\u0424\u0427\u0001\u0000\u0000\u0000\u0425\u0423\u0001\u0000\u0000\u0000"+ - "\u0425\u0426\u0001\u0000\u0000\u0000\u0426\u0428\u0001\u0000\u0000\u0000"+ - "\u0427\u0425\u0001\u0000\u0000\u0000\u0428\u0429\u0006d\u0000\u0000\u0429"+ - "\u00cb\u0001\u0000\u0000\u0000\u042a\u042b\u0005(\u0000\u0000\u042b\u00cd"+ - "\u0001\u0000\u0000\u0000\u042c\u042d\u0005)\u0000\u0000\u042d\u042e\u0001"+ - "\u0000\u0000\u0000\u042e\u042f\u0006f\u0000\u0000\u042f\u00cf\u0001\u0000"+ - "\u0000\u0000\u0430\u0431\u0005{\u0000\u0000\u0431\u00d1\u0001\u0000\u0000"+ - "\u0000\u0432\u0433\u0005}\u0000\u0000\u0433\u0434\u0001\u0000\u0000\u0000"+ - "\u0434\u0435\u0006h\u0000\u0000\u0435\u00d3\u0001\u0000\u0000\u0000\u0436"+ - "\u0437\u0005[\u0000\u0000\u0437\u00d5\u0001\u0000\u0000\u0000\u0438\u0439"+ - "\u0005]\u0000\u0000\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0006"+ - "j\u0000\u0000\u043b\u00d7\u0001\u0000\u0000\u0000\u043c\u043d\u0005=\u0000"+ - "\u0000\u043d\u00d9\u0001\u0000\u0000\u0000\u043e\u043f\u0005,\u0000\u0000"+ - "\u043f\u00db\u0001\u0000\u0000\u0000\u0440\u0441\u0005;\u0000\u0000\u0441"+ - "\u00dd\u0001\u0000\u0000\u0000\u0442\u0443\u0005:\u0000\u0000\u0443\u00df"+ - "\u0001\u0000\u0000\u0000\u0444\u0445\u0005.\u0000\u0000\u0445\u00e1\u0001"+ - "\u0000\u0000\u0000\u0446\u0447\u0005+\u0000\u0000\u0447\u0448\u0005+\u0000"+ - "\u0000\u0448\u0449\u0001\u0000\u0000\u0000\u0449\u044a\u0006p\u0000\u0000"+ - "\u044a\u00e3\u0001\u0000\u0000\u0000\u044b\u044c\u0005-\u0000\u0000\u044c"+ - "\u044d\u0005-\u0000\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f"+ - "\u0006q\u0000\u0000\u044f\u00e5\u0001\u0000\u0000\u0000\u0450\u0451\u0005"+ - ":\u0000\u0000\u0451\u0452\u0005=\u0000\u0000\u0452\u00e7\u0001\u0000\u0000"+ - "\u0000\u0453\u0454\u0005.\u0000\u0000\u0454\u0455\u0005.\u0000\u0000\u0455"+ - "\u0456\u0005.\u0000\u0000\u0456\u00e9\u0001\u0000\u0000\u0000\u0457\u0458"+ - "\u0005|\u0000\u0000\u0458\u0459\u0005|\u0000\u0000\u0459\u00eb\u0001\u0000"+ - "\u0000\u0000\u045a\u045b\u0005&\u0000\u0000\u045b\u045c\u0005&\u0000\u0000"+ - "\u045c\u00ed\u0001\u0000\u0000\u0000\u045d\u045e\u0005=\u0000\u0000\u045e"+ - "\u045f\u0005=\u0000\u0000\u045f\u00ef\u0001\u0000\u0000\u0000\u0460\u0461"+ - "\u0005!\u0000\u0000\u0461\u0462\u0005=\u0000\u0000\u0462\u00f1\u0001\u0000"+ - "\u0000\u0000\u0463\u0464\u0005<\u0000\u0000\u0464\u00f3\u0001\u0000\u0000"+ - "\u0000\u0465\u0466\u0005<\u0000\u0000\u0466\u0467\u0005=\u0000\u0000\u0467"+ - "\u00f5\u0001\u0000\u0000\u0000\u0468\u0469\u0005>\u0000\u0000\u0469\u00f7"+ - "\u0001\u0000\u0000\u0000\u046a\u046b\u0005>\u0000\u0000\u046b\u046c\u0005"+ - "=\u0000\u0000\u046c\u00f9\u0001\u0000\u0000\u0000\u046d\u046e\u0005|\u0000"+ - "\u0000\u046e\u00fb\u0001\u0000\u0000\u0000\u046f\u0470\u0005/\u0000\u0000"+ - "\u0470\u00fd\u0001\u0000\u0000\u0000\u0471\u0472\u0005%\u0000\u0000\u0472"+ - "\u00ff\u0001\u0000\u0000\u0000\u0473\u0474\u0005<\u0000\u0000\u0474\u0475"+ - "\u0005<\u0000\u0000\u0475\u0101\u0001\u0000\u0000\u0000\u0476\u0477\u0005"+ - ">\u0000\u0000\u0477\u0478\u0005>\u0000\u0000\u0478\u0103\u0001\u0000\u0000"+ - "\u0000\u0479\u047a\u0005&\u0000\u0000\u047a\u047b\u0005^\u0000\u0000\u047b"+ - "\u0105\u0001\u0000\u0000\u0000\u047c\u047d\u0005!\u0000\u0000\u047d\u0107"+ - "\u0001\u0000\u0000\u0000\u047e\u047f\u0005+\u0000\u0000\u047f\u0109\u0001"+ - "\u0000\u0000\u0000\u0480\u0481\u0005-\u0000\u0000\u0481\u010b\u0001\u0000"+ - "\u0000\u0000\u0482\u0483\u0005^\u0000\u0000\u0483\u010d\u0001\u0000\u0000"+ - "\u0000\u0484\u0485\u0005*\u0000\u0000\u0485\u010f\u0001\u0000\u0000\u0000"+ - "\u0486\u0487\u0005&\u0000\u0000\u0487\u0111\u0001\u0000\u0000\u0000\u0488"+ - "\u0489\u0005<\u0000\u0000\u0489\u048a\u0005-\u0000\u0000\u048a\u0113\u0001"+ - "\u0000\u0000\u0000\u048b\u0497\u00050\u0000\u0000\u048c\u0493\u0007\u0000"+ - "\u0000\u0000\u048d\u048f\u0005_\u0000\u0000\u048e\u048d\u0001\u0000\u0000"+ - "\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f\u0490\u0001\u0000\u0000"+ - "\u0000\u0490\u0492\u0007\u0001\u0000\u0000\u0491\u048e\u0001\u0000\u0000"+ - "\u0000\u0492\u0495\u0001\u0000\u0000\u0000\u0493\u0491\u0001\u0000\u0000"+ - "\u0000\u0493\u0494\u0001\u0000\u0000\u0000\u0494\u0497\u0001\u0000\u0000"+ - "\u0000\u0495\u0493\u0001\u0000\u0000\u0000\u0496\u048b\u0001\u0000\u0000"+ - "\u0000\u0496\u048c\u0001\u0000\u0000\u0000\u0497\u0498\u0001\u0000\u0000"+ - "\u0000\u0498\u0499\u0006\u0089\u0000\u0000\u0499\u0115\u0001\u0000\u0000"+ - "\u0000\u049a\u049b\u00050\u0000\u0000\u049b\u04a0\u0007\u0002\u0000\u0000"+ - "\u049c\u049e\u0005_\u0000\u0000\u049d\u049c\u0001\u0000\u0000\u0000\u049d"+ - "\u049e\u0001\u0000\u0000\u0000\u049e\u049f\u0001\u0000\u0000\u0000\u049f"+ - "\u04a1\u0003\u0148\u00a3\u0000\u04a0\u049d\u0001\u0000\u0000\u0000\u04a1"+ - "\u04a2\u0001\u0000\u0000\u0000\u04a2\u04a0\u0001\u0000\u0000\u0000\u04a2"+ - "\u04a3\u0001\u0000\u0000\u0000\u04a3\u04a4\u0001\u0000\u0000\u0000\u04a4"+ - "\u04a5\u0006\u008a\u0000\u0000\u04a5\u0117\u0001\u0000\u0000\u0000\u04a6"+ - "\u04a8\u00050\u0000\u0000\u04a7\u04a9\u0007\u0003\u0000\u0000\u04a8\u04a7"+ - "\u0001\u0000\u0000\u0000\u04a8\u04a9\u0001\u0000\u0000\u0000\u04a9\u04ae"+ - "\u0001\u0000\u0000\u0000\u04aa\u04ac\u0005_\u0000\u0000\u04ab\u04aa\u0001"+ - "\u0000\u0000\u0000\u04ab\u04ac\u0001\u0000\u0000\u0000\u04ac\u04ad\u0001"+ - "\u0000\u0000\u0000\u04ad\u04af\u0003\u0144\u00a1\u0000\u04ae\u04ab\u0001"+ - "\u0000\u0000\u0000\u04af\u04b0\u0001\u0000\u0000\u0000\u04b0\u04ae\u0001"+ - "\u0000\u0000\u0000\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u04b2\u0001"+ - "\u0000\u0000\u0000\u04b2\u04b3\u0006\u008b\u0000\u0000\u04b3\u0119\u0001"+ - "\u0000\u0000\u0000\u04b4\u04b5\u00050\u0000\u0000\u04b5\u04ba\u0007\u0004"+ - "\u0000\u0000\u04b6\u04b8\u0005_\u0000\u0000\u04b7\u04b6\u0001\u0000\u0000"+ - "\u0000\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8\u04b9\u0001\u0000\u0000"+ - "\u0000\u04b9\u04bb\u0003\u0146\u00a2\u0000\u04ba\u04b7\u0001\u0000\u0000"+ - "\u0000\u04bb\u04bc\u0001\u0000\u0000\u0000\u04bc\u04ba\u0001\u0000\u0000"+ - "\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04be\u0001\u0000\u0000"+ - "\u0000\u04be\u04bf\u0006\u008c\u0000\u0000\u04bf\u011b\u0001\u0000\u0000"+ - "\u0000\u04c0\u04c1\u00050\u0000\u0000\u04c1\u04c2\u0007\u0004\u0000\u0000"+ - "\u04c2\u04c3\u0003\u011e\u008e\u0000\u04c3\u04c4\u0003\u0120\u008f\u0000"+ - "\u04c4\u011d\u0001\u0000\u0000\u0000\u04c5\u04c7\u0005_\u0000\u0000\u04c6"+ - "\u04c5\u0001\u0000\u0000\u0000\u04c6\u04c7\u0001\u0000\u0000\u0000\u04c7"+ - "\u04c8\u0001\u0000\u0000\u0000\u04c8\u04ca\u0003\u0146\u00a2\u0000\u04c9"+ - "\u04c6\u0001\u0000\u0000\u0000\u04ca\u04cb\u0001\u0000\u0000\u0000\u04cb"+ - "\u04c9\u0001\u0000\u0000\u0000\u04cb\u04cc\u0001\u0000\u0000\u0000\u04cc"+ - "\u04d7\u0001\u0000\u0000\u0000\u04cd\u04d4\u0005.\u0000\u0000\u04ce\u04d0"+ - "\u0005_\u0000\u0000\u04cf\u04ce\u0001\u0000\u0000\u0000\u04cf\u04d0\u0001"+ - "\u0000\u0000\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d3\u0003"+ - "\u0146\u00a2\u0000\u04d2\u04cf\u0001\u0000\u0000\u0000\u04d3\u04d6\u0001"+ - "\u0000\u0000\u0000\u04d4\u04d2\u0001\u0000\u0000\u0000\u04d4\u04d5\u0001"+ - "\u0000\u0000\u0000\u04d5\u04d8\u0001\u0000\u0000\u0000\u04d6\u04d4\u0001"+ - "\u0000\u0000\u0000\u04d7\u04cd\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001"+ - "\u0000\u0000\u0000\u04d8\u04e5\u0001\u0000\u0000\u0000\u04d9\u04da\u0005"+ - ".\u0000\u0000\u04da\u04e1\u0003\u0146\u00a2\u0000\u04db\u04dd\u0005_\u0000"+ - "\u0000\u04dc\u04db\u0001\u0000\u0000\u0000\u04dc\u04dd\u0001\u0000\u0000"+ - "\u0000\u04dd\u04de\u0001\u0000\u0000\u0000\u04de\u04e0\u0003\u0146\u00a2"+ - "\u0000\u04df\u04dc\u0001\u0000\u0000\u0000\u04e0\u04e3\u0001\u0000\u0000"+ - "\u0000\u04e1\u04df\u0001\u0000\u0000\u0000\u04e1\u04e2\u0001\u0000\u0000"+ - "\u0000\u04e2\u04e5\u0001\u0000\u0000\u0000\u04e3\u04e1\u0001\u0000\u0000"+ - "\u0000\u04e4\u04c9\u0001\u0000\u0000\u0000\u04e4\u04d9\u0001\u0000\u0000"+ - "\u0000\u04e5\u011f\u0001\u0000\u0000\u0000\u04e6\u04e8\u0007\u0005\u0000"+ - "\u0000\u04e7\u04e9\u0007\u0006\u0000\u0000\u04e8\u04e7\u0001\u0000\u0000"+ - "\u0000\u04e8\u04e9\u0001\u0000\u0000\u0000\u04e9\u04ea\u0001\u0000\u0000"+ - "\u0000\u04ea\u04eb\u0003\u0142\u00a0\u0000\u04eb\u0121\u0001\u0000\u0000"+ - "\u0000\u04ec\u04f2\u0003\u0114\u0089\u0000\u04ed\u04f2\u0003\u0116\u008a"+ - "\u0000\u04ee\u04f2\u0003\u0118\u008b\u0000\u04ef\u04f2\u0003\u011a\u008c"+ - "\u0000\u04f0\u04f2\u0003\u0002\u0000\u0000\u04f1\u04ec\u0001\u0000\u0000"+ - "\u0000\u04f1\u04ed\u0001\u0000\u0000\u0000\u04f1\u04ee\u0001\u0000\u0000"+ - "\u0000\u04f1\u04ef\u0001\u0000\u0000\u0000\u04f1\u04f0\u0001\u0000\u0000"+ - "\u0000\u04f2\u04f3\u0001\u0000\u0000\u0000\u04f3\u04f4\u0005i\u0000\u0000"+ - "\u04f4\u04f5\u0001\u0000\u0000\u0000\u04f5\u04f6\u0006\u0090\u0000\u0000"+ - "\u04f6\u0123\u0001\u0000\u0000\u0000\u04f7\u04fa\u0005\'\u0000\u0000\u04f8"+ - "\u04fb\u0003\u013e\u009e\u0000\u04f9\u04fb\u0003\u0128\u0093\u0000\u04fa"+ - "\u04f8\u0001\u0000\u0000\u0000\u04fa\u04f9\u0001\u0000\u0000\u0000\u04fb"+ - "\u04fc\u0001\u0000\u0000\u0000\u04fc\u04fd\u0005\'\u0000\u0000\u04fd\u0125"+ - "\u0001\u0000\u0000\u0000\u04fe\u04ff\u0003\u0124\u0091\u0000\u04ff\u0500"+ - "\u0001\u0000\u0000\u0000\u0500\u0501\u0006\u0092\u0000\u0000\u0501\u0127"+ - "\u0001\u0000\u0000\u0000\u0502\u0505\u0003\u012a\u0094\u0000\u0503\u0505"+ - "\u0003\u012c\u0095\u0000\u0504\u0502\u0001\u0000\u0000\u0000\u0504\u0503"+ - "\u0001\u0000\u0000\u0000\u0505\u0129\u0001\u0000\u0000\u0000\u0506\u0507"+ - "\u0005\\\u0000\u0000\u0507\u0508\u0003\u0144\u00a1\u0000\u0508\u0509\u0003"+ - "\u0144\u00a1\u0000\u0509\u050a\u0003\u0144\u00a1\u0000\u050a\u012b\u0001"+ - "\u0000\u0000\u0000\u050b\u050c\u0005\\\u0000\u0000\u050c\u050d\u0005x"+ - "\u0000\u0000\u050d\u050e\u0003\u0146\u00a2\u0000\u050e\u050f\u0003\u0146"+ - "\u00a2\u0000\u050f\u012d\u0001\u0000\u0000\u0000\u0510\u0511\u0005\\\u0000"+ - "\u0000\u0511\u0512\u0005u\u0000\u0000\u0512\u0513\u0003\u0146\u00a2\u0000"+ - "\u0513\u0514\u0003\u0146\u00a2\u0000\u0514\u0515\u0003\u0146\u00a2\u0000"+ - "\u0515\u0516\u0003\u0146\u00a2\u0000\u0516\u012f\u0001\u0000\u0000\u0000"+ - "\u0517\u0518\u0005\\\u0000\u0000\u0518\u0519\u0005U\u0000\u0000\u0519"+ - "\u051a\u0003\u0146\u00a2\u0000\u051a\u051b\u0003\u0146\u00a2\u0000\u051b"+ - "\u051c\u0003\u0146\u00a2\u0000\u051c\u051d\u0003\u0146\u00a2\u0000\u051d"+ - "\u051e\u0003\u0146\u00a2\u0000\u051e\u051f\u0003\u0146\u00a2\u0000\u051f"+ - "\u0520\u0003\u0146\u00a2\u0000\u0520\u0521\u0003\u0146\u00a2\u0000\u0521"+ - "\u0131\u0001\u0000\u0000\u0000\u0522\u0526\u0005`\u0000\u0000\u0523\u0525"+ - "\b\u0007\u0000\u0000\u0524\u0523\u0001\u0000\u0000\u0000\u0525\u0528\u0001"+ - "\u0000\u0000\u0000\u0526\u0524\u0001\u0000\u0000\u0000\u0526\u0527\u0001"+ - "\u0000\u0000\u0000\u0527\u0529\u0001\u0000\u0000\u0000\u0528\u0526\u0001"+ - "\u0000\u0000\u0000\u0529\u052a\u0005`\u0000\u0000\u052a\u052b\u0001\u0000"+ - "\u0000\u0000\u052b\u052c\u0006\u0098\u0000\u0000\u052c\u0133\u0001\u0000"+ - "\u0000\u0000\u052d\u0532\u0005\"\u0000\u0000\u052e\u0531\b\b\u0000\u0000"+ - "\u052f\u0531\u0003\u0140\u009f\u0000\u0530\u052e\u0001\u0000\u0000\u0000"+ - "\u0530\u052f\u0001\u0000\u0000\u0000\u0531\u0534\u0001\u0000\u0000\u0000"+ - "\u0532\u0530\u0001\u0000\u0000\u0000\u0532\u0533\u0001\u0000\u0000\u0000"+ - "\u0533\u0535\u0001\u0000\u0000\u0000\u0534\u0532\u0001\u0000\u0000\u0000"+ - "\u0535\u0536\u0005\"\u0000\u0000\u0536\u0537\u0001\u0000\u0000\u0000\u0537"+ - "\u0538\u0006\u0099\u0000\u0000\u0538\u0135\u0001\u0000\u0000\u0000\u0539"+ - "\u053b\u0007\t\u0000\u0000\u053a\u0539\u0001\u0000\u0000\u0000\u053b\u053c"+ - "\u0001\u0000\u0000\u0000\u053c\u053a\u0001\u0000\u0000\u0000\u053c\u053d"+ - "\u0001\u0000\u0000\u0000\u053d\u053e\u0001\u0000\u0000\u0000\u053e\u053f"+ - "\u0006\u009a\u0001\u0000\u053f\u0137\u0001\u0000\u0000\u0000\u0540\u0541"+ - "\u0005/\u0000\u0000\u0541\u0542\u0005*\u0000\u0000\u0542\u0546\u0001\u0000"+ - "\u0000\u0000\u0543\u0545\t\u0000\u0000\u0000\u0544\u0543\u0001\u0000\u0000"+ - "\u0000\u0545\u0548\u0001\u0000\u0000\u0000\u0546\u0547\u0001\u0000\u0000"+ - "\u0000\u0546\u0544\u0001\u0000\u0000\u0000\u0547\u0549\u0001\u0000\u0000"+ - "\u0000\u0548\u0546\u0001\u0000\u0000\u0000\u0549\u054a\u0005*\u0000\u0000"+ - "\u054a\u054b\u0005/\u0000\u0000\u054b\u054c\u0001\u0000\u0000\u0000\u054c"+ - "\u054d\u0006\u009b\u0001\u0000\u054d\u0139\u0001\u0000\u0000\u0000\u054e"+ - "\u0550\u0007\n\u0000\u0000\u054f\u054e\u0001\u0000\u0000\u0000\u0550\u0551"+ - "\u0001\u0000\u0000\u0000\u0551\u054f\u0001\u0000\u0000\u0000\u0551\u0552"+ - "\u0001\u0000\u0000\u0000\u0552\u0553\u0001\u0000\u0000\u0000\u0553\u0554"+ - "\u0006\u009c\u0001\u0000\u0554\u013b\u0001\u0000\u0000\u0000\u0555\u0556"+ - "\u0005/\u0000\u0000\u0556\u0557\u0005/\u0000\u0000\u0557\u055b\u0001\u0000"+ - "\u0000\u0000\u0558\u055a\b\n\u0000\u0000\u0559\u0558\u0001\u0000\u0000"+ - "\u0000\u055a\u055d\u0001\u0000\u0000\u0000\u055b\u0559\u0001\u0000\u0000"+ - "\u0000\u055b\u055c\u0001\u0000\u0000\u0000\u055c\u055e\u0001\u0000\u0000"+ - "\u0000\u055d\u055b\u0001\u0000\u0000\u0000\u055e\u055f\u0006\u009d\u0001"+ - "\u0000\u055f\u013d\u0001\u0000\u0000\u0000\u0560\u0565\b\u000b\u0000\u0000"+ - "\u0561\u0565\u0003\u012e\u0096\u0000\u0562\u0565\u0003\u0130\u0097\u0000"+ - "\u0563\u0565\u0003\u0140\u009f\u0000\u0564\u0560\u0001\u0000\u0000\u0000"+ - "\u0564\u0561\u0001\u0000\u0000\u0000\u0564\u0562\u0001\u0000\u0000\u0000"+ - "\u0564\u0563\u0001\u0000\u0000\u0000\u0565\u013f\u0001\u0000\u0000\u0000"+ - "\u0566\u0580\u0005\\\u0000\u0000\u0567\u0568\u0005u\u0000\u0000\u0568"+ - "\u0569\u0003\u0146\u00a2\u0000\u0569\u056a\u0003\u0146\u00a2\u0000\u056a"+ - "\u056b\u0003\u0146\u00a2\u0000\u056b\u056c\u0003\u0146\u00a2\u0000\u056c"+ - "\u0581\u0001\u0000\u0000\u0000\u056d\u056e\u0005U\u0000\u0000\u056e\u056f"+ - "\u0003\u0146\u00a2\u0000\u056f\u0570\u0003\u0146\u00a2\u0000\u0570\u0571"+ - "\u0003\u0146\u00a2\u0000\u0571\u0572\u0003\u0146\u00a2\u0000\u0572\u0573"+ - "\u0003\u0146\u00a2\u0000\u0573\u0574\u0003\u0146\u00a2\u0000\u0574\u0575"+ - "\u0003\u0146\u00a2\u0000\u0575\u0576\u0003\u0146\u00a2\u0000\u0576\u0581"+ - "\u0001\u0000\u0000\u0000\u0577\u0581\u0007\f\u0000\u0000\u0578\u0579\u0003"+ - "\u0144\u00a1\u0000\u0579\u057a\u0003\u0144\u00a1\u0000\u057a\u057b\u0003"+ - "\u0144\u00a1\u0000\u057b\u0581\u0001\u0000\u0000\u0000\u057c\u057d\u0005"+ - "x\u0000\u0000\u057d\u057e\u0003\u0146\u00a2\u0000\u057e\u057f\u0003\u0146"+ - "\u00a2\u0000\u057f\u0581\u0001\u0000\u0000\u0000\u0580\u0567\u0001\u0000"+ - "\u0000\u0000\u0580\u056d\u0001\u0000\u0000\u0000\u0580\u0577\u0001\u0000"+ - "\u0000\u0000\u0580\u0578\u0001\u0000\u0000\u0000\u0580\u057c\u0001\u0000"+ - "\u0000\u0000\u0581\u0141\u0001\u0000\u0000\u0000\u0582\u0589\u0007\u0001"+ - "\u0000\u0000\u0583\u0585\u0005_\u0000\u0000\u0584\u0583\u0001\u0000\u0000"+ - "\u0000\u0584\u0585\u0001\u0000\u0000\u0000\u0585\u0586\u0001\u0000\u0000"+ - "\u0000\u0586\u0588\u0007\u0001\u0000\u0000\u0587\u0584\u0001\u0000\u0000"+ - "\u0000\u0588\u058b\u0001\u0000\u0000\u0000\u0589\u0587\u0001\u0000\u0000"+ - "\u0000\u0589\u058a\u0001\u0000\u0000\u0000\u058a\u0143\u0001\u0000\u0000"+ - "\u0000\u058b\u0589\u0001\u0000\u0000\u0000\u058c\u058d\u0007\r\u0000\u0000"+ - "\u058d\u0145\u0001\u0000\u0000\u0000\u058e\u058f\u0007\u000e\u0000\u0000"+ - "\u058f\u0147\u0001\u0000\u0000\u0000\u0590\u0591\u0007\u000f\u0000\u0000"+ - "\u0591\u0149\u0001\u0000\u0000\u0000\u0592\u0594\u0007\u0010\u0000\u0000"+ - "\u0593\u0595\u0007\u0006\u0000\u0000\u0594\u0593\u0001\u0000\u0000\u0000"+ - "\u0594\u0595\u0001\u0000\u0000\u0000\u0595\u0596\u0001\u0000\u0000\u0000"+ - "\u0596\u0597\u0003\u0142\u00a0\u0000\u0597\u014b\u0001\u0000\u0000\u0000"+ - "\u0598\u059b\u0003\u0150\u00a7\u0000\u0599\u059b\u0005_\u0000\u0000\u059a"+ - "\u0598\u0001\u0000\u0000\u0000\u059a\u0599\u0001\u0000\u0000\u0000\u059b"+ - "\u014d\u0001\u0000\u0000\u0000\u059c\u059d\u0007\u0011\u0000\u0000\u059d"+ - "\u014f\u0001\u0000\u0000\u0000\u059e\u059f\u0007\u0012\u0000\u0000\u059f"+ - "\u0151\u0001\u0000\u0000\u0000\u05a0\u05a2\u0007\t\u0000\u0000\u05a1\u05a0"+ - "\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000\u0000\u05a3\u05a1"+ - "\u0001\u0000\u0000\u0000\u05a3\u05a4\u0001\u0000\u0000\u0000\u05a4\u05a5"+ - "\u0001\u0000\u0000\u0000\u05a5\u05a6\u0006\u00a8\u0001\u0000\u05a6\u0153"+ - "\u0001\u0000\u0000\u0000\u05a7\u05a8\u0005/\u0000\u0000\u05a8\u05a9\u0005"+ - "*\u0000\u0000\u05a9\u05ad\u0001\u0000\u0000\u0000\u05aa\u05ac\b\n\u0000"+ - "\u0000\u05ab\u05aa\u0001\u0000\u0000\u0000\u05ac\u05af\u0001\u0000\u0000"+ - "\u0000\u05ad\u05ae\u0001\u0000\u0000\u0000\u05ad\u05ab\u0001\u0000\u0000"+ - "\u0000\u05ae\u05b0\u0001\u0000\u0000\u0000\u05af\u05ad\u0001\u0000\u0000"+ - "\u0000\u05b0\u05b1\u0005*\u0000\u0000\u05b1\u05b2\u0005/\u0000\u0000\u05b2"+ - "\u05b3\u0001\u0000\u0000\u0000\u05b3\u05b4\u0006\u00a9\u0001\u0000\u05b4"+ - "\u0155\u0001\u0000\u0000\u0000\u05b5\u05b6\u0005/\u0000\u0000\u05b6\u05b7"+ - "\u0005/\u0000\u0000\u05b7\u05bb\u0001\u0000\u0000\u0000\u05b8\u05ba\b"+ - "\n\u0000\u0000\u05b9\u05b8\u0001\u0000\u0000\u0000\u05ba\u05bd\u0001\u0000"+ - "\u0000\u0000\u05bb\u05b9\u0001\u0000\u0000\u0000\u05bb\u05bc\u0001\u0000"+ - "\u0000\u0000\u05bc\u05be\u0001\u0000\u0000\u0000\u05bd\u05bb\u0001\u0000"+ - "\u0000\u0000\u05be\u05bf\u0006\u00aa\u0001\u0000\u05bf\u0157\u0001\u0000"+ - "\u0000\u0000\u05c0\u05c2\u0007\n\u0000\u0000\u05c1\u05c0\u0001\u0000\u0000"+ - "\u0000\u05c2\u05c3\u0001\u0000\u0000\u0000\u05c3\u05c1\u0001\u0000\u0000"+ - "\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000\u05c4\u05d3\u0001\u0000\u0000"+ - "\u0000\u05c5\u05d3\u0005;\u0000\u0000\u05c6\u05c7\u0005/\u0000\u0000\u05c7"+ - "\u05c8\u0005*\u0000\u0000\u05c8\u05cc\u0001\u0000\u0000\u0000\u05c9\u05cb"+ - "\t\u0000\u0000\u0000\u05ca\u05c9\u0001\u0000\u0000\u0000\u05cb\u05ce\u0001"+ - "\u0000\u0000\u0000\u05cc\u05cd\u0001\u0000\u0000\u0000\u05cc\u05ca\u0001"+ - "\u0000\u0000\u0000\u05cd\u05cf\u0001\u0000\u0000\u0000\u05ce\u05cc\u0001"+ - "\u0000\u0000\u0000\u05cf\u05d0\u0005*\u0000\u0000\u05d0\u05d3\u0005/\u0000"+ - "\u0000\u05d1\u05d3\u0005\u0000\u0000\u0001\u05d2\u05c1\u0001\u0000\u0000"+ - "\u0000\u05d2\u05c5\u0001\u0000\u0000\u0000\u05d2\u05c6\u0001\u0000\u0000"+ - "\u0000\u05d2\u05d1\u0001\u0000\u0000\u0000\u05d3\u05d4\u0001\u0000\u0000"+ - "\u0000\u05d4\u05d5\u0006\u00ab\u0002\u0000\u05d5\u0159\u0001\u0000\u0000"+ - "\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000\u05d7\u05d8\u0001\u0000\u0000"+ - "\u0000\u05d8\u05d9\u0006\u00ac\u0002\u0000\u05d9\u05da\u0006\u00ac\u0001"+ - "\u0000\u05da\u015b\u0001\u0000\u0000\u00003\u0000\u0001\u015e\u0166\u0169"+ - "\u016c\u0172\u0174\u0423\u0425\u048e\u0493\u0496\u049d\u04a2\u04a8\u04ab"+ - "\u04b0\u04b7\u04bc\u04c6\u04cb\u04cf\u04d4\u04d7\u04dc\u04e1\u04e4\u04e8"+ - "\u04f1\u04fa\u0504\u0526\u0530\u0532\u053c\u0546\u0551\u055b\u0564\u0580"+ - "\u0584\u0589\u0594\u059a\u05a3\u05ad\u05bb\u05c3\u05cc\u05d2\u0003\u0002"+ + "\u0001\u015c\u0001\u0000\u0000\u0000\u0001\u015e\u0001\u0000\u0000\u0000"+ + "\u0002\u0162\u0001\u0000\u0000\u0000\u0004\u0178\u0001\u0000\u0000\u0000"+ + "\u0006\u017a\u0001\u0000\u0000\u0000\b\u0181\u0001\u0000\u0000\u0000\n"+ + "\u0189\u0001\u0000\u0000\u0000\f\u0190\u0001\u0000\u0000\u0000\u000e\u0197"+ + "\u0001\u0000\u0000\u0000\u0010\u019e\u0001\u0000\u0000\u0000\u0012\u01a5"+ + "\u0001\u0000\u0000\u0000\u0014\u01ae\u0001\u0000\u0000\u0000\u0016\u01b8"+ + "\u0001\u0000\u0000\u0000\u0018\u01c0\u0001\u0000\u0000\u0000\u001a\u01ca"+ + "\u0001\u0000\u0000\u0000\u001c\u01d6\u0001\u0000\u0000\u0000\u001e\u01dd"+ + "\u0001\u0000\u0000\u0000 \u01e8\u0001\u0000\u0000\u0000\"\u01eb\u0001"+ + "\u0000\u0000\u0000$\u01f1\u0001\u0000\u0000\u0000&\u01fa\u0001\u0000\u0000"+ + "\u0000(\u01ff\u0001\u0000\u0000\u0000*\u0206\u0001\u0000\u0000\u0000,"+ + "\u020d\u0001\u0000\u0000\u0000.\u0213\u0001\u0000\u0000\u00000\u0218\u0001"+ + "\u0000\u0000\u00002\u021f\u0001\u0000\u0000\u00004\u0229\u0001\u0000\u0000"+ + "\u00006\u022d\u0001\u0000\u0000\u00008\u0233\u0001\u0000\u0000\u0000:"+ + "\u0236\u0001\u0000\u0000\u0000<\u0238\u0001\u0000\u0000\u0000>\u023f\u0001"+ + "\u0000\u0000\u0000@\u0245\u0001\u0000\u0000\u0000B\u0252\u0001\u0000\u0000"+ + "\u0000D\u025b\u0001\u0000\u0000\u0000F\u025f\u0001\u0000\u0000\u0000H"+ + "\u0263\u0001\u0000\u0000\u0000J\u0269\u0001\u0000\u0000\u0000L\u026b\u0001"+ + "\u0000\u0000\u0000N\u026e\u0001\u0000\u0000\u0000P\u0273\u0001\u0000\u0000"+ + "\u0000R\u0279\u0001\u0000\u0000\u0000T\u027f\u0001\u0000\u0000\u0000V"+ + "\u0286\u0001\u0000\u0000\u0000X\u028d\u0001\u0000\u0000\u0000Z\u0296\u0001"+ + "\u0000\u0000\u0000\\\u029c\u0001\u0000\u0000\u0000^\u02a2\u0001\u0000"+ + "\u0000\u0000`\u02a9\u0001\u0000\u0000\u0000b\u02af\u0001\u0000\u0000\u0000"+ + "d\u02b6\u0001\u0000\u0000\u0000f\u02bc\u0001\u0000\u0000\u0000h\u02c5"+ + "\u0001\u0000\u0000\u0000j\u02cd\u0001\u0000\u0000\u0000l\u02d3\u0001\u0000"+ + "\u0000\u0000n\u02db\u0001\u0000\u0000\u0000p\u02e2\u0001\u0000\u0000\u0000"+ + "r\u02e7\u0001\u0000\u0000\u0000t\u02f0\u0001\u0000\u0000\u0000v\u02ff"+ + "\u0001\u0000\u0000\u0000x\u0305\u0001\u0000\u0000\u0000z\u0309\u0001\u0000"+ + "\u0000\u0000|\u030c\u0001\u0000\u0000\u0000~\u0313\u0001\u0000\u0000\u0000"+ + "\u0080\u031d\u0001\u0000\u0000\u0000\u0082\u0327\u0001\u0000\u0000\u0000"+ + "\u0084\u0333\u0001\u0000\u0000\u0000\u0086\u033c\u0001\u0000\u0000\u0000"+ + "\u0088\u0346\u0001\u0000\u0000\u0000\u008a\u034e\u0001\u0000\u0000\u0000"+ + "\u008c\u035a\u0001\u0000\u0000\u0000\u008e\u0369\u0001\u0000\u0000\u0000"+ + "\u0090\u036f\u0001\u0000\u0000\u0000\u0092\u0373\u0001\u0000\u0000\u0000"+ + "\u0094\u0377\u0001\u0000\u0000\u0000\u0096\u037c\u0001\u0000\u0000\u0000"+ + "\u0098\u0385\u0001\u0000\u0000\u0000\u009a\u038c\u0001\u0000\u0000\u0000"+ + "\u009c\u0394\u0001\u0000\u0000\u0000\u009e\u039c\u0001\u0000\u0000\u0000"+ + "\u00a0\u03a1\u0001\u0000\u0000\u0000\u00a2\u03ab\u0001\u0000\u0000\u0000"+ + "\u00a4\u03b2\u0001\u0000\u0000\u0000\u00a6\u03b7\u0001\u0000\u0000\u0000"+ + "\u00a8\u03bd\u0001\u0000\u0000\u0000\u00aa\u03c0\u0001\u0000\u0000\u0000"+ + "\u00ac\u03c4\u0001\u0000\u0000\u0000\u00ae\u03cb\u0001\u0000\u0000\u0000"+ + "\u00b0\u03d0\u0001\u0000\u0000\u0000\u00b2\u03d5\u0001\u0000\u0000\u0000"+ + "\u00b4\u03da\u0001\u0000\u0000\u0000\u00b6\u03e2\u0001\u0000\u0000\u0000"+ + "\u00b8\u03e9\u0001\u0000\u0000\u0000\u00ba\u03ef\u0001\u0000\u0000\u0000"+ + "\u00bc\u03fd\u0001\u0000\u0000\u0000\u00be\u0400\u0001\u0000\u0000\u0000"+ + "\u00c0\u0406\u0001\u0000\u0000\u0000\u00c2\u040b\u0001\u0000\u0000\u0000"+ + "\u00c4\u0416\u0001\u0000\u0000\u0000\u00c6\u041a\u0001\u0000\u0000\u0000"+ + "\u00c8\u0421\u0001\u0000\u0000\u0000\u00ca\u042a\u0001\u0000\u0000\u0000"+ + "\u00cc\u042e\u0001\u0000\u0000\u0000\u00ce\u0434\u0001\u0000\u0000\u0000"+ + "\u00d0\u043e\u0001\u0000\u0000\u0000\u00d2\u0440\u0001\u0000\u0000\u0000"+ + "\u00d4\u0444\u0001\u0000\u0000\u0000\u00d6\u0446\u0001\u0000\u0000\u0000"+ + "\u00d8\u044a\u0001\u0000\u0000\u0000\u00da\u044c\u0001\u0000\u0000\u0000"+ + "\u00dc\u0450\u0001\u0000\u0000\u0000\u00de\u0452\u0001\u0000\u0000\u0000"+ + "\u00e0\u0454\u0001\u0000\u0000\u0000\u00e2\u0456\u0001\u0000\u0000\u0000"+ + "\u00e4\u0458\u0001\u0000\u0000\u0000\u00e6\u045a\u0001\u0000\u0000\u0000"+ + "\u00e8\u045f\u0001\u0000\u0000\u0000\u00ea\u0464\u0001\u0000\u0000\u0000"+ + "\u00ec\u0467\u0001\u0000\u0000\u0000\u00ee\u046b\u0001\u0000\u0000\u0000"+ + "\u00f0\u046e\u0001\u0000\u0000\u0000\u00f2\u0471\u0001\u0000\u0000\u0000"+ + "\u00f4\u0474\u0001\u0000\u0000\u0000\u00f6\u0477\u0001\u0000\u0000\u0000"+ + "\u00f8\u0479\u0001\u0000\u0000\u0000\u00fa\u047c\u0001\u0000\u0000\u0000"+ + "\u00fc\u047e\u0001\u0000\u0000\u0000\u00fe\u0481\u0001\u0000\u0000\u0000"+ + "\u0100\u0483\u0001\u0000\u0000\u0000\u0102\u0485\u0001\u0000\u0000\u0000"+ + "\u0104\u0487\u0001\u0000\u0000\u0000\u0106\u048a\u0001\u0000\u0000\u0000"+ + "\u0108\u048d\u0001\u0000\u0000\u0000\u010a\u0490\u0001\u0000\u0000\u0000"+ + "\u010c\u0492\u0001\u0000\u0000\u0000\u010e\u0494\u0001\u0000\u0000\u0000"+ + "\u0110\u0496\u0001\u0000\u0000\u0000\u0112\u0498\u0001\u0000\u0000\u0000"+ + "\u0114\u049a\u0001\u0000\u0000\u0000\u0116\u049c\u0001\u0000\u0000\u0000"+ + "\u0118\u04aa\u0001\u0000\u0000\u0000\u011a\u04ae\u0001\u0000\u0000\u0000"+ + "\u011c\u04ba\u0001\u0000\u0000\u0000\u011e\u04c8\u0001\u0000\u0000\u0000"+ + "\u0120\u04d4\u0001\u0000\u0000\u0000\u0122\u04f8\u0001\u0000\u0000\u0000"+ + "\u0124\u04fa\u0001\u0000\u0000\u0000\u0126\u0505\u0001\u0000\u0000\u0000"+ + "\u0128\u050b\u0001\u0000\u0000\u0000\u012a\u0512\u0001\u0000\u0000\u0000"+ + "\u012c\u0518\u0001\u0000\u0000\u0000\u012e\u051a\u0001\u0000\u0000\u0000"+ + "\u0130\u051f\u0001\u0000\u0000\u0000\u0132\u0524\u0001\u0000\u0000\u0000"+ + "\u0134\u052b\u0001\u0000\u0000\u0000\u0136\u0536\u0001\u0000\u0000\u0000"+ + "\u0138\u0541\u0001\u0000\u0000\u0000\u013a\u054e\u0001\u0000\u0000\u0000"+ + "\u013c\u0554\u0001\u0000\u0000\u0000\u013e\u0563\u0001\u0000\u0000\u0000"+ + "\u0140\u0569\u0001\u0000\u0000\u0000\u0142\u0578\u0001\u0000\u0000\u0000"+ + "\u0144\u057a\u0001\u0000\u0000\u0000\u0146\u0596\u0001\u0000\u0000\u0000"+ + "\u0148\u05a0\u0001\u0000\u0000\u0000\u014a\u05a2\u0001\u0000\u0000\u0000"+ + "\u014c\u05a4\u0001\u0000\u0000\u0000\u014e\u05a6\u0001\u0000\u0000\u0000"+ + "\u0150\u05ae\u0001\u0000\u0000\u0000\u0152\u05b0\u0001\u0000\u0000\u0000"+ + "\u0154\u05b2\u0001\u0000\u0000\u0000\u0156\u05b5\u0001\u0000\u0000\u0000"+ + "\u0158\u05bb\u0001\u0000\u0000\u0000\u015a\u05c9\u0001\u0000\u0000\u0000"+ + "\u015c\u05e6\u0001\u0000\u0000\u0000\u015e\u05ea\u0001\u0000\u0000\u0000"+ + "\u0160\u0163\u0003\u0004\u0001\u0000\u0161\u0163\u0003\u0120\u008f\u0000"+ + "\u0162\u0160\u0001\u0000\u0000\u0000\u0162\u0161\u0001\u0000\u0000\u0000"+ + "\u0163\u0164\u0001\u0000\u0000\u0000\u0164\u0165\u0006\u0000\u0000\u0000"+ + "\u0165\u0003\u0001\u0000\u0000\u0000\u0166\u0170\u0003\u0146\u00a2\u0000"+ + "\u0167\u0168\u0005.\u0000\u0000\u0168\u016a\u0004\u0001\u0000\u0000\u0169"+ + "\u016b\u0003\u0146\u00a2\u0000\u016a\u0169\u0001\u0000\u0000\u0000\u016a"+ + "\u016b\u0001\u0000\u0000\u0000\u016b\u016d\u0001\u0000\u0000\u0000\u016c"+ + "\u016e\u0003\u014e\u00a6\u0000\u016d\u016c\u0001\u0000\u0000\u0000\u016d"+ + "\u016e\u0001\u0000\u0000\u0000\u016e\u0171\u0001\u0000\u0000\u0000\u016f"+ + "\u0171\u0003\u014e\u00a6\u0000\u0170\u0167\u0001\u0000\u0000\u0000\u0170"+ + "\u016f\u0001\u0000\u0000\u0000\u0171\u0179\u0001\u0000\u0000\u0000\u0172"+ + "\u0173\u0005.\u0000\u0000\u0173\u0174\u0004\u0001\u0001\u0000\u0174\u0176"+ + "\u0003\u0146\u00a2\u0000\u0175\u0177\u0003\u014e\u00a6\u0000\u0176\u0175"+ + "\u0001\u0000\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000\u0177\u0179"+ + "\u0001\u0000\u0000\u0000\u0178\u0166\u0001\u0000\u0000\u0000\u0178\u0172"+ + "\u0001\u0000\u0000\u0000\u0179\u0005\u0001\u0000\u0000\u0000\u017a\u017b"+ + "\u0005t\u0000\u0000\u017b\u017c\u0005r\u0000\u0000\u017c\u017d\u0005u"+ + "\u0000\u0000\u017d\u017e\u0005e\u0000\u0000\u017e\u017f\u0001\u0000\u0000"+ + "\u0000\u017f\u0180\u0006\u0002\u0000\u0000\u0180\u0007\u0001\u0000\u0000"+ + "\u0000\u0181\u0182\u0005f\u0000\u0000\u0182\u0183\u0005a\u0000\u0000\u0183"+ + "\u0184\u0005l\u0000\u0000\u0184\u0185\u0005s\u0000\u0000\u0185\u0186\u0005"+ + "e\u0000\u0000\u0186\u0187\u0001\u0000\u0000\u0000\u0187\u0188\u0006\u0003"+ + "\u0000\u0000\u0188\t\u0001\u0000\u0000\u0000\u0189\u018a\u0005a\u0000"+ + "\u0000\u018a\u018b\u0005s\u0000\u0000\u018b\u018c\u0005s\u0000\u0000\u018c"+ + "\u018d\u0005e\u0000\u0000\u018d\u018e\u0005r\u0000\u0000\u018e\u018f\u0005"+ + "t\u0000\u0000\u018f\u000b\u0001\u0000\u0000\u0000\u0190\u0191\u0005a\u0000"+ + "\u0000\u0191\u0192\u0005s\u0000\u0000\u0192\u0193\u0005s\u0000\u0000\u0193"+ + "\u0194\u0005u\u0000\u0000\u0194\u0195\u0005m\u0000\u0000\u0195\u0196\u0005"+ + "e\u0000\u0000\u0196\r\u0001\u0000\u0000\u0000\u0197\u0198\u0005i\u0000"+ + "\u0000\u0198\u0199\u0005n\u0000\u0000\u0199\u019a\u0005h\u0000\u0000\u019a"+ + "\u019b\u0005a\u0000\u0000\u019b\u019c\u0005l\u0000\u0000\u019c\u019d\u0005"+ + "e\u0000\u0000\u019d\u000f\u0001\u0000\u0000\u0000\u019e\u019f\u0005e\u0000"+ + "\u0000\u019f\u01a0\u0005x\u0000\u0000\u01a0\u01a1\u0005h\u0000\u0000\u01a1"+ + "\u01a2\u0005a\u0000\u0000\u01a2\u01a3\u0005l\u0000\u0000\u01a3\u01a4\u0005"+ + "e\u0000\u0000\u01a4\u0011\u0001\u0000\u0000\u0000\u01a5\u01a6\u0005r\u0000"+ + "\u0000\u01a6\u01a7\u0005e\u0000\u0000\u01a7\u01a8\u0005q\u0000\u0000\u01a8"+ + "\u01a9\u0005u\u0000\u0000\u01a9\u01aa\u0005i\u0000\u0000\u01aa\u01ab\u0005"+ + "r\u0000\u0000\u01ab\u01ac\u0005e\u0000\u0000\u01ac\u01ad\u0005s\u0000"+ + "\u0000\u01ad\u0013\u0001\u0000\u0000\u0000\u01ae\u01af\u0005p\u0000\u0000"+ + "\u01af\u01b0\u0005r\u0000\u0000\u01b0\u01b1\u0005e\u0000\u0000\u01b1\u01b2"+ + "\u0005s\u0000\u0000\u01b2\u01b3\u0005e\u0000\u0000\u01b3\u01b4\u0005r"+ + "\u0000\u0000\u01b4\u01b5\u0005v\u0000\u0000\u01b5\u01b6\u0005e\u0000\u0000"+ + "\u01b6\u01b7\u0005s\u0000\u0000\u01b7\u0015\u0001\u0000\u0000\u0000\u01b8"+ + "\u01b9\u0005e\u0000\u0000\u01b9\u01ba\u0005n\u0000\u0000\u01ba\u01bb\u0005"+ + "s\u0000\u0000\u01bb\u01bc\u0005u\u0000\u0000\u01bc\u01bd\u0005r\u0000"+ + "\u0000\u01bd\u01be\u0005e\u0000\u0000\u01be\u01bf\u0005s\u0000\u0000\u01bf"+ + "\u0017\u0001\u0000\u0000\u0000\u01c0\u01c1\u0005i\u0000\u0000\u01c1\u01c2"+ + "\u0005n\u0000\u0000\u01c2\u01c3\u0005v\u0000\u0000\u01c3\u01c4\u0005a"+ + "\u0000\u0000\u01c4\u01c5\u0005r\u0000\u0000\u01c5\u01c6\u0005i\u0000\u0000"+ + "\u01c6\u01c7\u0005a\u0000\u0000\u01c7\u01c8\u0005n\u0000\u0000\u01c8\u01c9"+ + "\u0005t\u0000\u0000\u01c9\u0019\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005"+ + "d\u0000\u0000\u01cb\u01cc\u0005e\u0000\u0000\u01cc\u01cd\u0005c\u0000"+ + "\u0000\u01cd\u01ce\u0005r\u0000\u0000\u01ce\u01cf\u0005e\u0000\u0000\u01cf"+ + "\u01d0\u0005a\u0000\u0000\u01d0\u01d1\u0005s\u0000\u0000\u01d1\u01d2\u0005"+ + "e\u0000\u0000\u01d2\u01d3\u0005s\u0000\u0000\u01d3\u01d4\u0001\u0000\u0000"+ + "\u0000\u01d4\u01d5\u0006\f\u0000\u0000\u01d5\u001b\u0001\u0000\u0000\u0000"+ + "\u01d6\u01d7\u0005p\u0000\u0000\u01d7\u01d8\u0005u\u0000\u0000\u01d8\u01d9"+ + "\u0005r\u0000\u0000\u01d9\u01da\u0005e\u0000\u0000\u01da\u01db\u0001\u0000"+ + "\u0000\u0000\u01db\u01dc\u0006\r\u0000\u0000\u01dc\u001d\u0001\u0000\u0000"+ + "\u0000\u01dd\u01de\u0005i\u0000\u0000\u01de\u01df\u0005m\u0000\u0000\u01df"+ + "\u01e0\u0005p\u0000\u0000\u01e0\u01e1\u0005l\u0000\u0000\u01e1\u01e2\u0005"+ + "e\u0000\u0000\u01e2\u01e3\u0005m\u0000\u0000\u01e3\u01e4\u0005e\u0000"+ + "\u0000\u01e4\u01e5\u0005n\u0000\u0000\u01e5\u01e6\u0005t\u0000\u0000\u01e6"+ + "\u01e7\u0005s\u0000\u0000\u01e7\u001f\u0001\u0000\u0000\u0000\u01e8\u01e9"+ + "\u0005a\u0000\u0000\u01e9\u01ea\u0005s\u0000\u0000\u01ea!\u0001\u0000"+ + "\u0000\u0000\u01eb\u01ec\u0005o\u0000\u0000\u01ec\u01ed\u0005l\u0000\u0000"+ + "\u01ed\u01ee\u0005d\u0000\u0000\u01ee\u01ef\u0001\u0000\u0000\u0000\u01ef"+ + "\u01f0\u0006\u0010\u0000\u0000\u01f0#\u0001\u0000\u0000\u0000\u01f1\u01f2"+ + "\u0005b\u0000\u0000\u01f2\u01f3\u0005e\u0000\u0000\u01f3\u01f4\u0005f"+ + "\u0000\u0000\u01f4\u01f5\u0005o\u0000\u0000\u01f5\u01f6\u0005r\u0000\u0000"+ + "\u01f6\u01f7\u0005e\u0000\u0000\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f8"+ + "\u01f9\u0006\u0011\u0000\u0000\u01f9%\u0001\u0000\u0000\u0000\u01fa\u01fb"+ + "\u0005#\u0000\u0000\u01fb\u01fc\u0005l\u0000\u0000\u01fc\u01fd\u0005h"+ + "\u0000\u0000\u01fd\u01fe\u0005s\u0000\u0000\u01fe\'\u0001\u0000\u0000"+ + "\u0000\u01ff\u0200\u0005f\u0000\u0000\u0200\u0201\u0005o\u0000\u0000\u0201"+ + "\u0202\u0005r\u0000\u0000\u0202\u0203\u0005a\u0000\u0000\u0203\u0204\u0005"+ + "l\u0000\u0000\u0204\u0205\u0005l\u0000\u0000\u0205)\u0001\u0000\u0000"+ + "\u0000\u0206\u0207\u0005e\u0000\u0000\u0207\u0208\u0005x\u0000\u0000\u0208"+ + "\u0209\u0005i\u0000\u0000\u0209\u020a\u0005s\u0000\u0000\u020a\u020b\u0005"+ + "t\u0000\u0000\u020b\u020c\u0005s\u0000\u0000\u020c+\u0001\u0000\u0000"+ + "\u0000\u020d\u020e\u0005a\u0000\u0000\u020e\u020f\u0005c\u0000\u0000\u020f"+ + "\u0210\u0005c\u0000\u0000\u0210\u0211\u0001\u0000\u0000\u0000\u0211\u0212"+ + "\u0006\u0015\u0000\u0000\u0212-\u0001\u0000\u0000\u0000\u0213\u0214\u0005"+ + "f\u0000\u0000\u0214\u0215\u0005o\u0000\u0000\u0215\u0216\u0005l\u0000"+ + "\u0000\u0216\u0217\u0005d\u0000\u0000\u0217/\u0001\u0000\u0000\u0000\u0218"+ + "\u0219\u0005u\u0000\u0000\u0219\u021a\u0005n\u0000\u0000\u021a\u021b\u0005"+ + "f\u0000\u0000\u021b\u021c\u0005o\u0000\u0000\u021c\u021d\u0005l\u0000"+ + "\u0000\u021d\u021e\u0005d\u0000\u0000\u021e1\u0001\u0000\u0000\u0000\u021f"+ + "\u0220\u0005u\u0000\u0000\u0220\u0221\u0005n\u0000\u0000\u0221\u0222\u0005"+ + "f\u0000\u0000\u0222\u0223\u0005o\u0000\u0000\u0223\u0224\u0005l\u0000"+ + "\u0000\u0224\u0225\u0005d\u0000\u0000\u0225\u0226\u0005i\u0000\u0000\u0226"+ + "\u0227\u0005n\u0000\u0000\u0227\u0228\u0005g\u0000\u0000\u02283\u0001"+ + "\u0000\u0000\u0000\u0229\u022a\u0005l\u0000\u0000\u022a\u022b\u0005e\u0000"+ + "\u0000\u022b\u022c\u0005t\u0000\u0000\u022c5\u0001\u0000\u0000\u0000\u022d"+ + "\u022e\u0005g\u0000\u0000\u022e\u022f\u0005h\u0000\u0000\u022f\u0230\u0005"+ + "o\u0000\u0000\u0230\u0231\u0005s\u0000\u0000\u0231\u0232\u0005t\u0000"+ + "\u0000\u02327\u0001\u0000\u0000\u0000\u0233\u0234\u0005i\u0000\u0000\u0234"+ + "\u0235\u0005n\u0000\u0000\u02359\u0001\u0000\u0000\u0000\u0236\u0237\u0005"+ + "#\u0000\u0000\u0237;\u0001\u0000\u0000\u0000\u0238\u0239\u0005s\u0000"+ + "\u0000\u0239\u023a\u0005u\u0000\u0000\u023a\u023b\u0005b\u0000\u0000\u023b"+ + "\u023c\u0005s\u0000\u0000\u023c\u023d\u0005e\u0000\u0000\u023d\u023e\u0005"+ + "t\u0000\u0000\u023e=\u0001\u0000\u0000\u0000\u023f\u0240\u0005u\u0000"+ + "\u0000\u0240\u0241\u0005n\u0000\u0000\u0241\u0242\u0005i\u0000\u0000\u0242"+ + "\u0243\u0005o\u0000\u0000\u0243\u0244\u0005n\u0000\u0000\u0244?\u0001"+ + "\u0000\u0000\u0000\u0245\u0246\u0005i\u0000\u0000\u0246\u0247\u0005n\u0000"+ + "\u0000\u0247\u0248\u0005t\u0000\u0000\u0248\u0249\u0005e\u0000\u0000\u0249"+ + "\u024a\u0005r\u0000\u0000\u024a\u024b\u0005s\u0000\u0000\u024b\u024c\u0005"+ + "e\u0000\u0000\u024c\u024d\u0005c\u0000\u0000\u024d\u024e\u0005t\u0000"+ + "\u0000\u024e\u024f\u0005i\u0000\u0000\u024f\u0250\u0005o\u0000\u0000\u0250"+ + "\u0251\u0005n\u0000\u0000\u0251A\u0001\u0000\u0000\u0000\u0252\u0253\u0005"+ + "s\u0000\u0000\u0253\u0254\u0005e\u0000\u0000\u0254\u0255\u0005t\u0000"+ + "\u0000\u0255\u0256\u0005m\u0000\u0000\u0256\u0257\u0005i\u0000\u0000\u0257"+ + "\u0258\u0005n\u0000\u0000\u0258\u0259\u0005u\u0000\u0000\u0259\u025a\u0005"+ + "s\u0000\u0000\u025aC\u0001\u0000\u0000\u0000\u025b\u025c\u0005=\u0000"+ + "\u0000\u025c\u025d\u0005=\u0000\u0000\u025d\u025e\u0005>\u0000\u0000\u025e"+ + "E\u0001\u0000\u0000\u0000\u025f\u0260\u0005-\u0000\u0000\u0260\u0261\u0005"+ + "-\u0000\u0000\u0261\u0262\u0005*\u0000\u0000\u0262G\u0001\u0000\u0000"+ + "\u0000\u0263\u0264\u0005a\u0000\u0000\u0264\u0265\u0005p\u0000\u0000\u0265"+ + "\u0266\u0005p\u0000\u0000\u0266\u0267\u0005l\u0000\u0000\u0267\u0268\u0005"+ + "y\u0000\u0000\u0268I\u0001\u0000\u0000\u0000\u0269\u026a\u0005?\u0000"+ + "\u0000\u026aK\u0001\u0000\u0000\u0000\u026b\u026c\u0005!\u0000\u0000\u026c"+ + "\u026d\u0005<\u0000\u0000\u026dM\u0001\u0000\u0000\u0000\u026e\u026f\u0005"+ + "!\u0000\u0000\u026f\u0270\u0005>\u0000\u0000\u0270\u0271\u0001\u0000\u0000"+ + "\u0000\u0271\u0272\u0006&\u0000\u0000\u0272O\u0001\u0000\u0000\u0000\u0273"+ + "\u0274\u0005s\u0000\u0000\u0274\u0275\u0005e\u0000\u0000\u0275\u0276\u0005"+ + "q\u0000\u0000\u0276\u0277\u0001\u0000\u0000\u0000\u0277\u0278\u0006\'"+ + "\u0000\u0000\u0278Q\u0001\u0000\u0000\u0000\u0279\u027a\u0005s\u0000\u0000"+ + "\u027a\u027b\u0005e\u0000\u0000\u027b\u027c\u0005t\u0000\u0000\u027c\u027d"+ + "\u0001\u0000\u0000\u0000\u027d\u027e\u0006(\u0000\u0000\u027eS\u0001\u0000"+ + "\u0000\u0000\u027f\u0280\u0005m\u0000\u0000\u0280\u0281\u0005s\u0000\u0000"+ + "\u0281\u0282\u0005e\u0000\u0000\u0282\u0283\u0005t\u0000\u0000\u0283\u0284"+ + "\u0001\u0000\u0000\u0000\u0284\u0285\u0006)\u0000\u0000\u0285U\u0001\u0000"+ + "\u0000\u0000\u0286\u0287\u0005d\u0000\u0000\u0287\u0288\u0005i\u0000\u0000"+ + "\u0288\u0289\u0005c\u0000\u0000\u0289\u028a\u0005t\u0000\u0000\u028a\u028b"+ + "\u0001\u0000\u0000\u0000\u028b\u028c\u0006*\u0000\u0000\u028cW\u0001\u0000"+ + "\u0000\u0000\u028d\u028e\u0005o\u0000\u0000\u028e\u028f\u0005p\u0000\u0000"+ + "\u028f\u0290\u0005t\u0000\u0000\u0290\u0291\u0005i\u0000\u0000\u0291\u0292"+ + "\u0005o\u0000\u0000\u0292\u0293\u0005n\u0000\u0000\u0293\u0294\u0001\u0000"+ + "\u0000\u0000\u0294\u0295\u0006+\u0000\u0000\u0295Y\u0001\u0000\u0000\u0000"+ + "\u0296\u0297\u0005l\u0000\u0000\u0297\u0298\u0005e\u0000\u0000\u0298\u0299"+ + "\u0005n\u0000\u0000\u0299\u029a\u0001\u0000\u0000\u0000\u029a\u029b\u0006"+ + ",\u0000\u0000\u029b[\u0001\u0000\u0000\u0000\u029c\u029d\u0005n\u0000"+ + "\u0000\u029d\u029e\u0005e\u0000\u0000\u029e\u029f\u0005w\u0000\u0000\u029f"+ + "\u02a0\u0001\u0000\u0000\u0000\u02a0\u02a1\u0006-\u0000\u0000\u02a1]\u0001"+ + "\u0000\u0000\u0000\u02a2\u02a3\u0005m\u0000\u0000\u02a3\u02a4\u0005a\u0000"+ + "\u0000\u02a4\u02a5\u0005k\u0000\u0000\u02a5\u02a6\u0005e\u0000\u0000\u02a6"+ + "\u02a7\u0001\u0000\u0000\u0000\u02a7\u02a8\u0006.\u0000\u0000\u02a8_\u0001"+ + "\u0000\u0000\u0000\u02a9\u02aa\u0005c\u0000\u0000\u02aa\u02ab\u0005a\u0000"+ + "\u0000\u02ab\u02ac\u0005p\u0000\u0000\u02ac\u02ad\u0001\u0000\u0000\u0000"+ + "\u02ad\u02ae\u0006/\u0000\u0000\u02aea\u0001\u0000\u0000\u0000\u02af\u02b0"+ + "\u0005s\u0000\u0000\u02b0\u02b1\u0005o\u0000\u0000\u02b1\u02b2\u0005m"+ + "\u0000\u0000\u02b2\u02b3\u0005e\u0000\u0000\u02b3\u02b4\u0001\u0000\u0000"+ + "\u0000\u02b4\u02b5\u00060\u0000\u0000\u02b5c\u0001\u0000\u0000\u0000\u02b6"+ + "\u02b7\u0005g\u0000\u0000\u02b7\u02b8\u0005e\u0000\u0000\u02b8\u02b9\u0005"+ + "t\u0000\u0000\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bb\u00061\u0000"+ + "\u0000\u02bbe\u0001\u0000\u0000\u0000\u02bc\u02bd\u0005d\u0000\u0000\u02bd"+ + "\u02be\u0005o\u0000\u0000\u02be\u02bf\u0005m\u0000\u0000\u02bf\u02c0\u0005"+ + "a\u0000\u0000\u02c0\u02c1\u0005i\u0000\u0000\u02c1\u02c2\u0005n\u0000"+ + "\u0000\u02c2\u02c3\u0001\u0000\u0000\u0000\u02c3\u02c4\u00062\u0000\u0000"+ + "\u02c4g\u0001\u0000\u0000\u0000\u02c5\u02c6\u0005a\u0000\u0000\u02c6\u02c7"+ + "\u0005x\u0000\u0000\u02c7\u02c8\u0005i\u0000\u0000\u02c8\u02c9\u0005o"+ + "\u0000\u0000\u02c9\u02ca\u0005m\u0000\u0000\u02ca\u02cb\u0001\u0000\u0000"+ + "\u0000\u02cb\u02cc\u00063\u0000\u0000\u02cci\u0001\u0000\u0000\u0000\u02cd"+ + "\u02ce\u0005a\u0000\u0000\u02ce\u02cf\u0005d\u0000\u0000\u02cf\u02d0\u0005"+ + "t\u0000\u0000\u02d0\u02d1\u0001\u0000\u0000\u0000\u02d1\u02d2\u00064\u0000"+ + "\u0000\u02d2k\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005m\u0000\u0000\u02d4"+ + "\u02d5\u0005a\u0000\u0000\u02d5\u02d6\u0005t\u0000\u0000\u02d6\u02d7\u0005"+ + "c\u0000\u0000\u02d7\u02d8\u0005h\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000"+ + "\u0000\u02d9\u02da\u00065\u0000\u0000\u02dam\u0001\u0000\u0000\u0000\u02db"+ + "\u02dc\u0005n\u0000\u0000\u02dc\u02dd\u0005o\u0000\u0000\u02dd\u02de\u0005"+ + "n\u0000\u0000\u02de\u02df\u0005e\u0000\u0000\u02df\u02e0\u0001\u0000\u0000"+ + "\u0000\u02e0\u02e1\u00066\u0000\u0000\u02e1o\u0001\u0000\u0000\u0000\u02e2"+ + "\u02e3\u0005p\u0000\u0000\u02e3\u02e4\u0005r\u0000\u0000\u02e4\u02e5\u0005"+ + "e\u0000\u0000\u02e5\u02e6\u0005d\u0000\u0000\u02e6q\u0001\u0000\u0000"+ + "\u0000\u02e7\u02e8\u0005t\u0000\u0000\u02e8\u02e9\u0005y\u0000\u0000\u02e9"+ + "\u02ea\u0005p\u0000\u0000\u02ea\u02eb\u0005e\u0000\u0000\u02eb\u02ec\u0005"+ + "O\u0000\u0000\u02ec\u02ed\u0005f\u0000\u0000\u02ed\u02ee\u0001\u0000\u0000"+ + "\u0000\u02ee\u02ef\u00068\u0000\u0000\u02efs\u0001\u0000\u0000\u0000\u02f0"+ + "\u02f1\u0005i\u0000\u0000\u02f1\u02f2\u0005s\u0000\u0000\u02f2\u02f3\u0005"+ + "C\u0000\u0000\u02f3\u02f4\u0005o\u0000\u0000\u02f4\u02f5\u0005m\u0000"+ + "\u0000\u02f5\u02f6\u0005p\u0000\u0000\u02f6\u02f7\u0005a\u0000\u0000\u02f7"+ + "\u02f8\u0005r\u0000\u0000\u02f8\u02f9\u0005a\u0000\u0000\u02f9\u02fa\u0005"+ + "b\u0000\u0000\u02fa\u02fb\u0005l\u0000\u0000\u02fb\u02fc\u0005e\u0000"+ + "\u0000\u02fc\u02fd\u0001\u0000\u0000\u0000\u02fd\u02fe\u00069\u0000\u0000"+ + "\u02feu\u0001\u0000\u0000\u0000\u02ff\u0300\u0005s\u0000\u0000\u0300\u0301"+ + "\u0005h\u0000\u0000\u0301\u0302\u0005a\u0000\u0000\u0302\u0303\u0005r"+ + "\u0000\u0000\u0303\u0304\u0005e\u0000\u0000\u0304w\u0001\u0000\u0000\u0000"+ + "\u0305\u0306\u0005@\u0000\u0000\u0306\u0307\u0001\u0000\u0000\u0000\u0307"+ + "\u0308\u0006;\u0000\u0000\u0308y\u0001\u0000\u0000\u0000\u0309\u030a\u0005"+ + ".\u0000\u0000\u030a\u030b\u0005.\u0000\u0000\u030b{\u0001\u0000\u0000"+ + "\u0000\u030c\u030d\u0005s\u0000\u0000\u030d\u030e\u0005h\u0000\u0000\u030e"+ + "\u030f\u0005a\u0000\u0000\u030f\u0310\u0005r\u0000\u0000\u0310\u0311\u0005"+ + "e\u0000\u0000\u0311\u0312\u0005d\u0000\u0000\u0312}\u0001\u0000\u0000"+ + "\u0000\u0313\u0314\u0005e\u0000\u0000\u0314\u0315\u0005x\u0000\u0000\u0315"+ + "\u0316\u0005c\u0000\u0000\u0316\u0317\u0005l\u0000\u0000\u0317\u0318\u0005"+ + "u\u0000\u0000\u0318\u0319\u0005s\u0000\u0000\u0319\u031a\u0005i\u0000"+ + "\u0000\u031a\u031b\u0005v\u0000\u0000\u031b\u031c\u0005e\u0000\u0000\u031c"+ + "\u007f\u0001\u0000\u0000\u0000\u031d\u031e\u0005p\u0000\u0000\u031e\u031f"+ + "\u0005r\u0000\u0000\u031f\u0320\u0005e\u0000\u0000\u0320\u0321\u0005d"+ + "\u0000\u0000\u0321\u0322\u0005i\u0000\u0000\u0322\u0323\u0005c\u0000\u0000"+ + "\u0323\u0324\u0005a\u0000\u0000\u0324\u0325\u0005t\u0000\u0000\u0325\u0326"+ + "\u0005e\u0000\u0000\u0326\u0081\u0001\u0000\u0000\u0000\u0327\u0328\u0005"+ + "w\u0000\u0000\u0328\u0329\u0005r\u0000\u0000\u0329\u032a\u0005i\u0000"+ + "\u0000\u032a\u032b\u0005t\u0000\u0000\u032b\u032c\u0005e\u0000\u0000\u032c"+ + "\u032d\u0005P\u0000\u0000\u032d\u032e\u0005e\u0000\u0000\u032e\u032f\u0005"+ + "r\u0000\u0000\u032f\u0330\u0005m\u0000\u0000\u0330\u0331\u0001\u0000\u0000"+ + "\u0000\u0331\u0332\u0006@\u0000\u0000\u0332\u0083\u0001\u0000\u0000\u0000"+ + "\u0333\u0334\u0005n\u0000\u0000\u0334\u0335\u0005o\u0000\u0000\u0335\u0336"+ + "\u0005P\u0000\u0000\u0336\u0337\u0005e\u0000\u0000\u0337\u0338\u0005r"+ + "\u0000\u0000\u0338\u0339\u0005m\u0000\u0000\u0339\u033a\u0001\u0000\u0000"+ + "\u0000\u033a\u033b\u0006A\u0000\u0000\u033b\u0085\u0001\u0000\u0000\u0000"+ + "\u033c\u033d\u0005t\u0000\u0000\u033d\u033e\u0005r\u0000\u0000\u033e\u033f"+ + "\u0005u\u0000\u0000\u033f\u0340\u0005s\u0000\u0000\u0340\u0341\u0005t"+ + "\u0000\u0000\u0341\u0342\u0005e\u0000\u0000\u0342\u0343\u0005d\u0000\u0000"+ + "\u0343\u0344\u0001\u0000\u0000\u0000\u0344\u0345\u0006B\u0000\u0000\u0345"+ + "\u0087\u0001\u0000\u0000\u0000\u0346\u0347\u0005o\u0000\u0000\u0347\u0348"+ + "\u0005u\u0000\u0000\u0348\u0349\u0005t\u0000\u0000\u0349\u034a\u0005l"+ + "\u0000\u0000\u034a\u034b\u0005i\u0000\u0000\u034b\u034c\u0005n\u0000\u0000"+ + "\u034c\u034d\u0005e\u0000\u0000\u034d\u0089\u0001\u0000\u0000\u0000\u034e"+ + "\u034f\u0005i\u0000\u0000\u034f\u0350\u0005n\u0000\u0000\u0350\u0351\u0005"+ + "i\u0000\u0000\u0351\u0352\u0005t\u0000\u0000\u0352\u0353\u0005E\u0000"+ + "\u0000\u0353\u0354\u0005n\u0000\u0000\u0354\u0355\u0005s\u0000\u0000\u0355"+ + "\u0356\u0005u\u0000\u0000\u0356\u0357\u0005r\u0000\u0000\u0357\u0358\u0005"+ + "e\u0000\u0000\u0358\u0359\u0005s\u0000\u0000\u0359\u008b\u0001\u0000\u0000"+ + "\u0000\u035a\u035b\u0005i\u0000\u0000\u035b\u035c\u0005m\u0000\u0000\u035c"+ + "\u035d\u0005p\u0000\u0000\u035d\u035e\u0005o\u0000\u0000\u035e\u035f\u0005"+ + "r\u0000\u0000\u035f\u0360\u0005t\u0000\u0000\u0360\u0361\u0005R\u0000"+ + "\u0000\u0361\u0362\u0005e\u0000\u0000\u0362\u0363\u0005q\u0000\u0000\u0363"+ + "\u0364\u0005u\u0000\u0000\u0364\u0365\u0005i\u0000\u0000\u0365\u0366\u0005"+ + "r\u0000\u0000\u0366\u0367\u0005e\u0000\u0000\u0367\u0368\u0005s\u0000"+ + "\u0000\u0368\u008d\u0001\u0000\u0000\u0000\u0369\u036a\u0005p\u0000\u0000"+ + "\u036a\u036b\u0005r\u0000\u0000\u036b\u036c\u0005o\u0000\u0000\u036c\u036d"+ + "\u0005o\u0000\u0000\u036d\u036e\u0005f\u0000\u0000\u036e\u008f\u0001\u0000"+ + "\u0000\u0000\u036f\u0370\u0005=\u0000\u0000\u0370\u0371\u0005=\u0000\u0000"+ + "\u0371\u0372\u0005=\u0000\u0000\u0372\u0091\u0001\u0000\u0000\u0000\u0373"+ + "\u0374\u0005!\u0000\u0000\u0374\u0375\u0005=\u0000\u0000\u0375\u0376\u0005"+ + "=\u0000\u0000\u0376\u0093\u0001\u0000\u0000\u0000\u0377\u0378\u0005w\u0000"+ + "\u0000\u0378\u0379\u0005i\u0000\u0000\u0379\u037a\u0005t\u0000\u0000\u037a"+ + "\u037b\u0005h\u0000\u0000\u037b\u0095\u0001\u0000\u0000\u0000\u037c\u037d"+ + "\u0005o\u0000\u0000\u037d\u037e\u0005p\u0000\u0000\u037e\u037f\u0005a"+ + "\u0000\u0000\u037f\u0380\u0005q\u0000\u0000\u0380\u0381\u0005u\u0000\u0000"+ + "\u0381\u0382\u0005e\u0000\u0000\u0382\u0383\u0001\u0000\u0000\u0000\u0383"+ + "\u0384\u0006J\u0000\u0000\u0384\u0097\u0001\u0000\u0000\u0000\u0385\u0386"+ + "\u0005r\u0000\u0000\u0386\u0387\u0005e\u0000\u0000\u0387\u0388\u0005v"+ + "\u0000\u0000\u0388\u0389\u0005e\u0000\u0000\u0389\u038a\u0005a\u0000\u0000"+ + "\u038a\u038b\u0005l\u0000\u0000\u038b\u0099\u0001\u0000\u0000\u0000\u038c"+ + "\u038d\u0005b\u0000\u0000\u038d\u038e\u0005r\u0000\u0000\u038e\u038f\u0005"+ + "e\u0000\u0000\u038f\u0390\u0005a\u0000\u0000\u0390\u0391\u0005k\u0000"+ + "\u0000\u0391\u0392\u0001\u0000\u0000\u0000\u0392\u0393\u0006L\u0000\u0000"+ + "\u0393\u009b\u0001\u0000\u0000\u0000\u0394\u0395\u0005d\u0000\u0000\u0395"+ + "\u0396\u0005e\u0000\u0000\u0396\u0397\u0005f\u0000\u0000\u0397\u0398\u0005"+ + "a\u0000\u0000\u0398\u0399\u0005u\u0000\u0000\u0399\u039a\u0005l\u0000"+ + "\u0000\u039a\u039b\u0005t\u0000\u0000\u039b\u009d\u0001\u0000\u0000\u0000"+ + "\u039c\u039d\u0005f\u0000\u0000\u039d\u039e\u0005u\u0000\u0000\u039e\u039f"+ + "\u0005n\u0000\u0000\u039f\u03a0\u0005c\u0000\u0000\u03a0\u009f\u0001\u0000"+ + "\u0000\u0000\u03a1\u03a2\u0005i\u0000\u0000\u03a2\u03a3\u0005n\u0000\u0000"+ + "\u03a3\u03a4\u0005t\u0000\u0000\u03a4\u03a5\u0005e\u0000\u0000\u03a5\u03a6"+ + "\u0005r\u0000\u0000\u03a6\u03a7\u0005f\u0000\u0000\u03a7\u03a8\u0005a"+ + "\u0000\u0000\u03a8\u03a9\u0005c\u0000\u0000\u03a9\u03aa\u0005e\u0000\u0000"+ + "\u03aa\u00a1\u0001\u0000\u0000\u0000\u03ab\u03ac\u0005s\u0000\u0000\u03ac"+ + "\u03ad\u0005e\u0000\u0000\u03ad\u03ae\u0005l\u0000\u0000\u03ae\u03af\u0005"+ + "e\u0000\u0000\u03af\u03b0\u0005c\u0000\u0000\u03b0\u03b1\u0005t\u0000"+ + "\u0000\u03b1\u00a3\u0001\u0000\u0000\u0000\u03b2\u03b3\u0005c\u0000\u0000"+ + "\u03b3\u03b4\u0005a\u0000\u0000\u03b4\u03b5\u0005s\u0000\u0000\u03b5\u03b6"+ + "\u0005e\u0000\u0000\u03b6\u00a5\u0001\u0000\u0000\u0000\u03b7\u03b8\u0005"+ + "d\u0000\u0000\u03b8\u03b9\u0005e\u0000\u0000\u03b9\u03ba\u0005f\u0000"+ + "\u0000\u03ba\u03bb\u0005e\u0000\u0000\u03bb\u03bc\u0005r\u0000\u0000\u03bc"+ + "\u00a7\u0001\u0000\u0000\u0000\u03bd\u03be\u0005g\u0000\u0000\u03be\u03bf"+ + "\u0005o\u0000\u0000\u03bf\u00a9\u0001\u0000\u0000\u0000\u03c0\u03c1\u0005"+ + "m\u0000\u0000\u03c1\u03c2\u0005a\u0000\u0000\u03c2\u03c3\u0005p\u0000"+ + "\u0000\u03c3\u00ab\u0001\u0000\u0000\u0000\u03c4\u03c5\u0005s\u0000\u0000"+ + "\u03c5\u03c6\u0005t\u0000\u0000\u03c6\u03c7\u0005r\u0000\u0000\u03c7\u03c8"+ + "\u0005u\u0000\u0000\u03c8\u03c9\u0005c\u0000\u0000\u03c9\u03ca\u0005t"+ + "\u0000\u0000\u03ca\u00ad\u0001\u0000\u0000\u0000\u03cb\u03cc\u0005c\u0000"+ + "\u0000\u03cc\u03cd\u0005h\u0000\u0000\u03cd\u03ce\u0005a\u0000\u0000\u03ce"+ + "\u03cf\u0005n\u0000\u0000\u03cf\u00af\u0001\u0000\u0000\u0000\u03d0\u03d1"+ + "\u0005e\u0000\u0000\u03d1\u03d2\u0005l\u0000\u0000\u03d2\u03d3\u0005s"+ + "\u0000\u0000\u03d3\u03d4\u0005e\u0000\u0000\u03d4\u00b1\u0001\u0000\u0000"+ + "\u0000\u03d5\u03d6\u0005g\u0000\u0000\u03d6\u03d7\u0005o\u0000\u0000\u03d7"+ + "\u03d8\u0005t\u0000\u0000\u03d8\u03d9\u0005o\u0000\u0000\u03d9\u00b3\u0001"+ + "\u0000\u0000\u0000\u03da\u03db\u0005p\u0000\u0000\u03db\u03dc\u0005a\u0000"+ + "\u0000\u03dc\u03dd\u0005c\u0000\u0000\u03dd\u03de\u0005k\u0000\u0000\u03de"+ + "\u03df\u0005a\u0000\u0000\u03df\u03e0\u0005g\u0000\u0000\u03e0\u03e1\u0005"+ + "e\u0000\u0000\u03e1\u00b5\u0001\u0000\u0000\u0000\u03e2\u03e3\u0005s\u0000"+ + "\u0000\u03e3\u03e4\u0005w\u0000\u0000\u03e4\u03e5\u0005i\u0000\u0000\u03e5"+ + "\u03e6\u0005t\u0000\u0000\u03e6\u03e7\u0005c\u0000\u0000\u03e7\u03e8\u0005"+ + "h\u0000\u0000\u03e8\u00b7\u0001\u0000\u0000\u0000\u03e9\u03ea\u0005c\u0000"+ + "\u0000\u03ea\u03eb\u0005o\u0000\u0000\u03eb\u03ec\u0005n\u0000\u0000\u03ec"+ + "\u03ed\u0005s\u0000\u0000\u03ed\u03ee\u0005t\u0000\u0000\u03ee\u00b9\u0001"+ + "\u0000\u0000\u0000\u03ef\u03f0\u0005f\u0000\u0000\u03f0\u03f1\u0005a\u0000"+ + "\u0000\u03f1\u03f2\u0005l\u0000\u0000\u03f2\u03f3\u0005l\u0000\u0000\u03f3"+ + "\u03f4\u0005t\u0000\u0000\u03f4\u03f5\u0005h\u0000\u0000\u03f5\u03f6\u0005"+ + "r\u0000\u0000\u03f6\u03f7\u0005o\u0000\u0000\u03f7\u03f8\u0005u\u0000"+ + "\u0000\u03f8\u03f9\u0005g\u0000\u0000\u03f9\u03fa\u0005h\u0000\u0000\u03fa"+ + "\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0006\\\u0000\u0000\u03fc\u00bb"+ + "\u0001\u0000\u0000\u0000\u03fd\u03fe\u0005i\u0000\u0000\u03fe\u03ff\u0005"+ + "f\u0000\u0000\u03ff\u00bd\u0001\u0000\u0000\u0000\u0400\u0401\u0005r\u0000"+ + "\u0000\u0401\u0402\u0005a\u0000\u0000\u0402\u0403\u0005n\u0000\u0000\u0403"+ + "\u0404\u0005g\u0000\u0000\u0404\u0405\u0005e\u0000\u0000\u0405\u00bf\u0001"+ + "\u0000\u0000\u0000\u0406\u0407\u0005t\u0000\u0000\u0407\u0408\u0005y\u0000"+ + "\u0000\u0408\u0409\u0005p\u0000\u0000\u0409\u040a\u0005e\u0000\u0000\u040a"+ + "\u00c1\u0001\u0000\u0000\u0000\u040b\u040c\u0005c\u0000\u0000\u040c\u040d"+ + "\u0005o\u0000\u0000\u040d\u040e\u0005n\u0000\u0000\u040e\u040f\u0005t"+ + "\u0000\u0000\u040f\u0410\u0005i\u0000\u0000\u0410\u0411\u0005n\u0000\u0000"+ + "\u0411\u0412\u0005u\u0000\u0000\u0412\u0413\u0005e\u0000\u0000\u0413\u0414"+ + "\u0001\u0000\u0000\u0000\u0414\u0415\u0006`\u0000\u0000\u0415\u00c3\u0001"+ + "\u0000\u0000\u0000\u0416\u0417\u0005f\u0000\u0000\u0417\u0418\u0005o\u0000"+ + "\u0000\u0418\u0419\u0005r\u0000\u0000\u0419\u00c5\u0001\u0000\u0000\u0000"+ + "\u041a\u041b\u0005i\u0000\u0000\u041b\u041c\u0005m\u0000\u0000\u041c\u041d"+ + "\u0005p\u0000\u0000\u041d\u041e\u0005o\u0000\u0000\u041e\u041f\u0005r"+ + "\u0000\u0000\u041f\u0420\u0005t\u0000\u0000\u0420\u00c7\u0001\u0000\u0000"+ + "\u0000\u0421\u0422\u0005r\u0000\u0000\u0422\u0423\u0005e\u0000\u0000\u0423"+ + "\u0424\u0005t\u0000\u0000\u0424\u0425\u0005u\u0000\u0000\u0425\u0426\u0005"+ + "r\u0000\u0000\u0426\u0427\u0005n\u0000\u0000\u0427\u0428\u0001\u0000\u0000"+ + "\u0000\u0428\u0429\u0006c\u0000\u0000\u0429\u00c9\u0001\u0000\u0000\u0000"+ + "\u042a\u042b\u0005v\u0000\u0000\u042b\u042c\u0005a\u0000\u0000\u042c\u042d"+ + "\u0005r\u0000\u0000\u042d\u00cb\u0001\u0000\u0000\u0000\u042e\u042f\u0005"+ + "n\u0000\u0000\u042f\u0430\u0005i\u0000\u0000\u0430\u0431\u0005l\u0000"+ + "\u0000\u0431\u0432\u0001\u0000\u0000\u0000\u0432\u0433\u0006e\u0000\u0000"+ + "\u0433\u00cd\u0001\u0000\u0000\u0000\u0434\u0439\u0003\u0150\u00a7\u0000"+ + "\u0435\u0438\u0003\u0150\u00a7\u0000\u0436\u0438\u0003\u0152\u00a8\u0000"+ + "\u0437\u0435\u0001\u0000\u0000\u0000\u0437\u0436\u0001\u0000\u0000\u0000"+ + "\u0438\u043b\u0001\u0000\u0000\u0000\u0439\u0437\u0001\u0000\u0000\u0000"+ + "\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043c\u0001\u0000\u0000\u0000"+ + "\u043b\u0439\u0001\u0000\u0000\u0000\u043c\u043d\u0006f\u0000\u0000\u043d"+ + "\u00cf\u0001\u0000\u0000\u0000\u043e\u043f\u0005(\u0000\u0000\u043f\u00d1"+ + "\u0001\u0000\u0000\u0000\u0440\u0441\u0005)\u0000\u0000\u0441\u0442\u0001"+ + "\u0000\u0000\u0000\u0442\u0443\u0006h\u0000\u0000\u0443\u00d3\u0001\u0000"+ + "\u0000\u0000\u0444\u0445\u0005{\u0000\u0000\u0445\u00d5\u0001\u0000\u0000"+ + "\u0000\u0446\u0447\u0005}\u0000\u0000\u0447\u0448\u0001\u0000\u0000\u0000"+ + "\u0448\u0449\u0006j\u0000\u0000\u0449\u00d7\u0001\u0000\u0000\u0000\u044a"+ + "\u044b\u0005[\u0000\u0000\u044b\u00d9\u0001\u0000\u0000\u0000\u044c\u044d"+ + "\u0005]\u0000\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f\u0006"+ + "l\u0000\u0000\u044f\u00db\u0001\u0000\u0000\u0000\u0450\u0451\u0005=\u0000"+ + "\u0000\u0451\u00dd\u0001\u0000\u0000\u0000\u0452\u0453\u0005,\u0000\u0000"+ + "\u0453\u00df\u0001\u0000\u0000\u0000\u0454\u0455\u0005;\u0000\u0000\u0455"+ + "\u00e1\u0001\u0000\u0000\u0000\u0456\u0457\u0005:\u0000\u0000\u0457\u00e3"+ + "\u0001\u0000\u0000\u0000\u0458\u0459\u0005.\u0000\u0000\u0459\u00e5\u0001"+ + "\u0000\u0000\u0000\u045a\u045b\u0005+\u0000\u0000\u045b\u045c\u0005+\u0000"+ + "\u0000\u045c\u045d\u0001\u0000\u0000\u0000\u045d\u045e\u0006r\u0000\u0000"+ + "\u045e\u00e7\u0001\u0000\u0000\u0000\u045f\u0460\u0005-\u0000\u0000\u0460"+ + "\u0461\u0005-\u0000\u0000\u0461\u0462\u0001\u0000\u0000\u0000\u0462\u0463"+ + "\u0006s\u0000\u0000\u0463\u00e9\u0001\u0000\u0000\u0000\u0464\u0465\u0005"+ + ":\u0000\u0000\u0465\u0466\u0005=\u0000\u0000\u0466\u00eb\u0001\u0000\u0000"+ + "\u0000\u0467\u0468\u0005.\u0000\u0000\u0468\u0469\u0005.\u0000\u0000\u0469"+ + "\u046a\u0005.\u0000\u0000\u046a\u00ed\u0001\u0000\u0000\u0000\u046b\u046c"+ + "\u0005|\u0000\u0000\u046c\u046d\u0005|\u0000\u0000\u046d\u00ef\u0001\u0000"+ + "\u0000\u0000\u046e\u046f\u0005&\u0000\u0000\u046f\u0470\u0005&\u0000\u0000"+ + "\u0470\u00f1\u0001\u0000\u0000\u0000\u0471\u0472\u0005=\u0000\u0000\u0472"+ + "\u0473\u0005=\u0000\u0000\u0473\u00f3\u0001\u0000\u0000\u0000\u0474\u0475"+ + "\u0005!\u0000\u0000\u0475\u0476\u0005=\u0000\u0000\u0476\u00f5\u0001\u0000"+ + "\u0000\u0000\u0477\u0478\u0005<\u0000\u0000\u0478\u00f7\u0001\u0000\u0000"+ + "\u0000\u0479\u047a\u0005<\u0000\u0000\u047a\u047b\u0005=\u0000\u0000\u047b"+ + "\u00f9\u0001\u0000\u0000\u0000\u047c\u047d\u0005>\u0000\u0000\u047d\u00fb"+ + "\u0001\u0000\u0000\u0000\u047e\u047f\u0005>\u0000\u0000\u047f\u0480\u0005"+ + "=\u0000\u0000\u0480\u00fd\u0001\u0000\u0000\u0000\u0481\u0482\u0005|\u0000"+ + "\u0000\u0482\u00ff\u0001\u0000\u0000\u0000\u0483\u0484\u0005/\u0000\u0000"+ + "\u0484\u0101\u0001\u0000\u0000\u0000\u0485\u0486\u0005%\u0000\u0000\u0486"+ + "\u0103\u0001\u0000\u0000\u0000\u0487\u0488\u0005<\u0000\u0000\u0488\u0489"+ + "\u0005<\u0000\u0000\u0489\u0105\u0001\u0000\u0000\u0000\u048a\u048b\u0005"+ + ">\u0000\u0000\u048b\u048c\u0005>\u0000\u0000\u048c\u0107\u0001\u0000\u0000"+ + "\u0000\u048d\u048e\u0005&\u0000\u0000\u048e\u048f\u0005^\u0000\u0000\u048f"+ + "\u0109\u0001\u0000\u0000\u0000\u0490\u0491\u0005!\u0000\u0000\u0491\u010b"+ + "\u0001\u0000\u0000\u0000\u0492\u0493\u0005+\u0000\u0000\u0493\u010d\u0001"+ + "\u0000\u0000\u0000\u0494\u0495\u0005-\u0000\u0000\u0495\u010f\u0001\u0000"+ + "\u0000\u0000\u0496\u0497\u0005^\u0000\u0000\u0497\u0111\u0001\u0000\u0000"+ + "\u0000\u0498\u0499\u0005*\u0000\u0000\u0499\u0113\u0001\u0000\u0000\u0000"+ + "\u049a\u049b\u0005&\u0000\u0000\u049b\u0115\u0001\u0000\u0000\u0000\u049c"+ + "\u049d\u0005<\u0000\u0000\u049d\u049e\u0005-\u0000\u0000\u049e\u0117\u0001"+ + "\u0000\u0000\u0000\u049f\u04ab\u00050\u0000\u0000\u04a0\u04a7\u0007\u0000"+ + "\u0000\u0000\u04a1\u04a3\u0005_\u0000\u0000\u04a2\u04a1\u0001\u0000\u0000"+ + "\u0000\u04a2\u04a3\u0001\u0000\u0000\u0000\u04a3\u04a4\u0001\u0000\u0000"+ + "\u0000\u04a4\u04a6\u0007\u0001\u0000\u0000\u04a5\u04a2\u0001\u0000\u0000"+ + "\u0000\u04a6\u04a9\u0001\u0000\u0000\u0000\u04a7\u04a5\u0001\u0000\u0000"+ + "\u0000\u04a7\u04a8\u0001\u0000\u0000\u0000\u04a8\u04ab\u0001\u0000\u0000"+ + "\u0000\u04a9\u04a7\u0001\u0000\u0000\u0000\u04aa\u049f\u0001\u0000\u0000"+ + "\u0000\u04aa\u04a0\u0001\u0000\u0000\u0000\u04ab\u04ac\u0001\u0000\u0000"+ + "\u0000\u04ac\u04ad\u0006\u008b\u0000\u0000\u04ad\u0119\u0001\u0000\u0000"+ + "\u0000\u04ae\u04af\u00050\u0000\u0000\u04af\u04b4\u0007\u0002\u0000\u0000"+ + "\u04b0\u04b2\u0005_\u0000\u0000\u04b1\u04b0\u0001\u0000\u0000\u0000\u04b1"+ + "\u04b2\u0001\u0000\u0000\u0000\u04b2\u04b3\u0001\u0000\u0000\u0000\u04b3"+ + "\u04b5\u0003\u014c\u00a5\u0000\u04b4\u04b1\u0001\u0000\u0000\u0000\u04b5"+ + "\u04b6\u0001\u0000\u0000\u0000\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b6"+ + "\u04b7\u0001\u0000\u0000\u0000\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8"+ + "\u04b9\u0006\u008c\u0000\u0000\u04b9\u011b\u0001\u0000\u0000\u0000\u04ba"+ + "\u04bc\u00050\u0000\u0000\u04bb\u04bd\u0007\u0003\u0000\u0000\u04bc\u04bb"+ + "\u0001\u0000\u0000\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04c2"+ + "\u0001\u0000\u0000\u0000\u04be\u04c0\u0005_\u0000\u0000\u04bf\u04be\u0001"+ + "\u0000\u0000\u0000\u04bf\u04c0\u0001\u0000\u0000\u0000\u04c0\u04c1\u0001"+ + "\u0000\u0000\u0000\u04c1\u04c3\u0003\u0148\u00a3\u0000\u04c2\u04bf\u0001"+ + "\u0000\u0000\u0000\u04c3\u04c4\u0001\u0000\u0000\u0000\u04c4\u04c2\u0001"+ + "\u0000\u0000\u0000\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c6\u0001"+ + "\u0000\u0000\u0000\u04c6\u04c7\u0006\u008d\u0000\u0000\u04c7\u011d\u0001"+ + "\u0000\u0000\u0000\u04c8\u04c9\u00050\u0000\u0000\u04c9\u04ce\u0007\u0004"+ + "\u0000\u0000\u04ca\u04cc\u0005_\u0000\u0000\u04cb\u04ca\u0001\u0000\u0000"+ + "\u0000\u04cb\u04cc\u0001\u0000\u0000\u0000\u04cc\u04cd\u0001\u0000\u0000"+ + "\u0000\u04cd\u04cf\u0003\u014a\u00a4\u0000\u04ce\u04cb\u0001\u0000\u0000"+ + "\u0000\u04cf\u04d0\u0001\u0000\u0000\u0000\u04d0\u04ce\u0001\u0000\u0000"+ + "\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d2\u0001\u0000\u0000"+ + "\u0000\u04d2\u04d3\u0006\u008e\u0000\u0000\u04d3\u011f\u0001\u0000\u0000"+ + "\u0000\u04d4\u04d5\u00050\u0000\u0000\u04d5\u04d6\u0007\u0004\u0000\u0000"+ + "\u04d6\u04d7\u0003\u0122\u0090\u0000\u04d7\u04d8\u0003\u0124\u0091\u0000"+ + "\u04d8\u0121\u0001\u0000\u0000\u0000\u04d9\u04db\u0005_\u0000\u0000\u04da"+ + "\u04d9\u0001\u0000\u0000\u0000\u04da\u04db\u0001\u0000\u0000\u0000\u04db"+ + "\u04dc\u0001\u0000\u0000\u0000\u04dc\u04de\u0003\u014a\u00a4\u0000\u04dd"+ + "\u04da\u0001\u0000\u0000\u0000\u04de\u04df\u0001\u0000\u0000\u0000\u04df"+ + "\u04dd\u0001\u0000\u0000\u0000\u04df\u04e0\u0001\u0000\u0000\u0000\u04e0"+ + "\u04eb\u0001\u0000\u0000\u0000\u04e1\u04e8\u0005.\u0000\u0000\u04e2\u04e4"+ + "\u0005_\u0000\u0000\u04e3\u04e2\u0001\u0000\u0000\u0000\u04e3\u04e4\u0001"+ + "\u0000\u0000\u0000\u04e4\u04e5\u0001\u0000\u0000\u0000\u04e5\u04e7\u0003"+ + "\u014a\u00a4\u0000\u04e6\u04e3\u0001\u0000\u0000\u0000\u04e7\u04ea\u0001"+ + "\u0000\u0000\u0000\u04e8\u04e6\u0001\u0000\u0000\u0000\u04e8\u04e9\u0001"+ + "\u0000\u0000\u0000\u04e9\u04ec\u0001\u0000\u0000\u0000\u04ea\u04e8\u0001"+ + "\u0000\u0000\u0000\u04eb\u04e1\u0001\u0000\u0000\u0000\u04eb\u04ec\u0001"+ + "\u0000\u0000\u0000\u04ec\u04f9\u0001\u0000\u0000\u0000\u04ed\u04ee\u0005"+ + ".\u0000\u0000\u04ee\u04f5\u0003\u014a\u00a4\u0000\u04ef\u04f1\u0005_\u0000"+ + "\u0000\u04f0\u04ef\u0001\u0000\u0000\u0000\u04f0\u04f1\u0001\u0000\u0000"+ + "\u0000\u04f1\u04f2\u0001\u0000\u0000\u0000\u04f2\u04f4\u0003\u014a\u00a4"+ + "\u0000\u04f3\u04f0\u0001\u0000\u0000\u0000\u04f4\u04f7\u0001\u0000\u0000"+ + "\u0000\u04f5\u04f3\u0001\u0000\u0000\u0000\u04f5\u04f6\u0001\u0000\u0000"+ + "\u0000\u04f6\u04f9\u0001\u0000\u0000\u0000\u04f7\u04f5\u0001\u0000\u0000"+ + "\u0000\u04f8\u04dd\u0001\u0000\u0000\u0000\u04f8\u04ed\u0001\u0000\u0000"+ + "\u0000\u04f9\u0123\u0001\u0000\u0000\u0000\u04fa\u04fc\u0007\u0005\u0000"+ + "\u0000\u04fb\u04fd\u0007\u0006\u0000\u0000\u04fc\u04fb\u0001\u0000\u0000"+ + "\u0000\u04fc\u04fd\u0001\u0000\u0000\u0000\u04fd\u04fe\u0001\u0000\u0000"+ + "\u0000\u04fe\u04ff\u0003\u0146\u00a2\u0000\u04ff\u0125\u0001\u0000\u0000"+ + "\u0000\u0500\u0506\u0003\u0118\u008b\u0000\u0501\u0506\u0003\u011a\u008c"+ + "\u0000\u0502\u0506\u0003\u011c\u008d\u0000\u0503\u0506\u0003\u011e\u008e"+ + "\u0000\u0504\u0506\u0003\u0002\u0000\u0000\u0505\u0500\u0001\u0000\u0000"+ + "\u0000\u0505\u0501\u0001\u0000\u0000\u0000\u0505\u0502\u0001\u0000\u0000"+ + "\u0000\u0505\u0503\u0001\u0000\u0000\u0000\u0505\u0504\u0001\u0000\u0000"+ + "\u0000\u0506\u0507\u0001\u0000\u0000\u0000\u0507\u0508\u0005i\u0000\u0000"+ + "\u0508\u0509\u0001\u0000\u0000\u0000\u0509\u050a\u0006\u0092\u0000\u0000"+ + "\u050a\u0127\u0001\u0000\u0000\u0000\u050b\u050e\u0005\'\u0000\u0000\u050c"+ + "\u050f\u0003\u0142\u00a0\u0000\u050d\u050f\u0003\u012c\u0095\u0000\u050e"+ + "\u050c\u0001\u0000\u0000\u0000\u050e\u050d\u0001\u0000\u0000\u0000\u050f"+ + "\u0510\u0001\u0000\u0000\u0000\u0510\u0511\u0005\'\u0000\u0000\u0511\u0129"+ + "\u0001\u0000\u0000\u0000\u0512\u0513\u0003\u0128\u0093\u0000\u0513\u0514"+ + "\u0001\u0000\u0000\u0000\u0514\u0515\u0006\u0094\u0000\u0000\u0515\u012b"+ + "\u0001\u0000\u0000\u0000\u0516\u0519\u0003\u012e\u0096\u0000\u0517\u0519"+ + "\u0003\u0130\u0097\u0000\u0518\u0516\u0001\u0000\u0000\u0000\u0518\u0517"+ + "\u0001\u0000\u0000\u0000\u0519\u012d\u0001\u0000\u0000\u0000\u051a\u051b"+ + "\u0005\\\u0000\u0000\u051b\u051c\u0003\u0148\u00a3\u0000\u051c\u051d\u0003"+ + "\u0148\u00a3\u0000\u051d\u051e\u0003\u0148\u00a3\u0000\u051e\u012f\u0001"+ + "\u0000\u0000\u0000\u051f\u0520\u0005\\\u0000\u0000\u0520\u0521\u0005x"+ + "\u0000\u0000\u0521\u0522\u0003\u014a\u00a4\u0000\u0522\u0523\u0003\u014a"+ + "\u00a4\u0000\u0523\u0131\u0001\u0000\u0000\u0000\u0524\u0525\u0005\\\u0000"+ + "\u0000\u0525\u0526\u0005u\u0000\u0000\u0526\u0527\u0003\u014a\u00a4\u0000"+ + "\u0527\u0528\u0003\u014a\u00a4\u0000\u0528\u0529\u0003\u014a\u00a4\u0000"+ + "\u0529\u052a\u0003\u014a\u00a4\u0000\u052a\u0133\u0001\u0000\u0000\u0000"+ + "\u052b\u052c\u0005\\\u0000\u0000\u052c\u052d\u0005U\u0000\u0000\u052d"+ + "\u052e\u0003\u014a\u00a4\u0000\u052e\u052f\u0003\u014a\u00a4\u0000\u052f"+ + "\u0530\u0003\u014a\u00a4\u0000\u0530\u0531\u0003\u014a\u00a4\u0000\u0531"+ + "\u0532\u0003\u014a\u00a4\u0000\u0532\u0533\u0003\u014a\u00a4\u0000\u0533"+ + "\u0534\u0003\u014a\u00a4\u0000\u0534\u0535\u0003\u014a\u00a4\u0000\u0535"+ + "\u0135\u0001\u0000\u0000\u0000\u0536\u053a\u0005`\u0000\u0000\u0537\u0539"+ + "\b\u0007\u0000\u0000\u0538\u0537\u0001\u0000\u0000\u0000\u0539\u053c\u0001"+ + "\u0000\u0000\u0000\u053a\u0538\u0001\u0000\u0000\u0000\u053a\u053b\u0001"+ + "\u0000\u0000\u0000\u053b\u053d\u0001\u0000\u0000\u0000\u053c\u053a\u0001"+ + "\u0000\u0000\u0000\u053d\u053e\u0005`\u0000\u0000\u053e\u053f\u0001\u0000"+ + "\u0000\u0000\u053f\u0540\u0006\u009a\u0000\u0000\u0540\u0137\u0001\u0000"+ + "\u0000\u0000\u0541\u0546\u0005\"\u0000\u0000\u0542\u0545\b\b\u0000\u0000"+ + "\u0543\u0545\u0003\u0144\u00a1\u0000\u0544\u0542\u0001\u0000\u0000\u0000"+ + "\u0544\u0543\u0001\u0000\u0000\u0000\u0545\u0548\u0001\u0000\u0000\u0000"+ + "\u0546\u0544\u0001\u0000\u0000\u0000\u0546\u0547\u0001\u0000\u0000\u0000"+ + "\u0547\u0549\u0001\u0000\u0000\u0000\u0548\u0546\u0001\u0000\u0000\u0000"+ + "\u0549\u054a\u0005\"\u0000\u0000\u054a\u054b\u0001\u0000\u0000\u0000\u054b"+ + "\u054c\u0006\u009b\u0000\u0000\u054c\u0139\u0001\u0000\u0000\u0000\u054d"+ + "\u054f\u0007\t\u0000\u0000\u054e\u054d\u0001\u0000\u0000\u0000\u054f\u0550"+ + "\u0001\u0000\u0000\u0000\u0550\u054e\u0001\u0000\u0000\u0000\u0550\u0551"+ + "\u0001\u0000\u0000\u0000\u0551\u0552\u0001\u0000\u0000\u0000\u0552\u0553"+ + "\u0006\u009c\u0001\u0000\u0553\u013b\u0001\u0000\u0000\u0000\u0554\u0555"+ + "\u0005/\u0000\u0000\u0555\u0556\u0005*\u0000\u0000\u0556\u055a\u0001\u0000"+ + "\u0000\u0000\u0557\u0559\t\u0000\u0000\u0000\u0558\u0557\u0001\u0000\u0000"+ + "\u0000\u0559\u055c\u0001\u0000\u0000\u0000\u055a\u055b\u0001\u0000\u0000"+ + "\u0000\u055a\u0558\u0001\u0000\u0000\u0000\u055b\u055d\u0001\u0000\u0000"+ + "\u0000\u055c\u055a\u0001\u0000\u0000\u0000\u055d\u055e\u0005*\u0000\u0000"+ + "\u055e\u055f\u0005/\u0000\u0000\u055f\u0560\u0001\u0000\u0000\u0000\u0560"+ + "\u0561\u0006\u009d\u0001\u0000\u0561\u013d\u0001\u0000\u0000\u0000\u0562"+ + "\u0564\u0007\n\u0000\u0000\u0563\u0562\u0001\u0000\u0000\u0000\u0564\u0565"+ + "\u0001\u0000\u0000\u0000\u0565\u0563\u0001\u0000\u0000\u0000\u0565\u0566"+ + "\u0001\u0000\u0000\u0000\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u0568"+ + "\u0006\u009e\u0001\u0000\u0568\u013f\u0001\u0000\u0000\u0000\u0569\u056a"+ + "\u0005/\u0000\u0000\u056a\u056b\u0005/\u0000\u0000\u056b\u056f\u0001\u0000"+ + "\u0000\u0000\u056c\u056e\b\n\u0000\u0000\u056d\u056c\u0001\u0000\u0000"+ + "\u0000\u056e\u0571\u0001\u0000\u0000\u0000\u056f\u056d\u0001\u0000\u0000"+ + "\u0000\u056f\u0570\u0001\u0000\u0000\u0000\u0570\u0572\u0001\u0000\u0000"+ + "\u0000\u0571\u056f\u0001\u0000\u0000\u0000\u0572\u0573\u0006\u009f\u0001"+ + "\u0000\u0573\u0141\u0001\u0000\u0000\u0000\u0574\u0579\b\u000b\u0000\u0000"+ + "\u0575\u0579\u0003\u0132\u0098\u0000\u0576\u0579\u0003\u0134\u0099\u0000"+ + "\u0577\u0579\u0003\u0144\u00a1\u0000\u0578\u0574\u0001\u0000\u0000\u0000"+ + "\u0578\u0575\u0001\u0000\u0000\u0000\u0578\u0576\u0001\u0000\u0000\u0000"+ + "\u0578\u0577\u0001\u0000\u0000\u0000\u0579\u0143\u0001\u0000\u0000\u0000"+ + "\u057a\u0594\u0005\\\u0000\u0000\u057b\u057c\u0005u\u0000\u0000\u057c"+ + "\u057d\u0003\u014a\u00a4\u0000\u057d\u057e\u0003\u014a\u00a4\u0000\u057e"+ + "\u057f\u0003\u014a\u00a4\u0000\u057f\u0580\u0003\u014a\u00a4\u0000\u0580"+ + "\u0595\u0001\u0000\u0000\u0000\u0581\u0582\u0005U\u0000\u0000\u0582\u0583"+ + "\u0003\u014a\u00a4\u0000\u0583\u0584\u0003\u014a\u00a4\u0000\u0584\u0585"+ + "\u0003\u014a\u00a4\u0000\u0585\u0586\u0003\u014a\u00a4\u0000\u0586\u0587"+ + "\u0003\u014a\u00a4\u0000\u0587\u0588\u0003\u014a\u00a4\u0000\u0588\u0589"+ + "\u0003\u014a\u00a4\u0000\u0589\u058a\u0003\u014a\u00a4\u0000\u058a\u0595"+ + "\u0001\u0000\u0000\u0000\u058b\u0595\u0007\f\u0000\u0000\u058c\u058d\u0003"+ + "\u0148\u00a3\u0000\u058d\u058e\u0003\u0148\u00a3\u0000\u058e\u058f\u0003"+ + "\u0148\u00a3\u0000\u058f\u0595\u0001\u0000\u0000\u0000\u0590\u0591\u0005"+ + "x\u0000\u0000\u0591\u0592\u0003\u014a\u00a4\u0000\u0592\u0593\u0003\u014a"+ + "\u00a4\u0000\u0593\u0595\u0001\u0000\u0000\u0000\u0594\u057b\u0001\u0000"+ + "\u0000\u0000\u0594\u0581\u0001\u0000\u0000\u0000\u0594\u058b\u0001\u0000"+ + "\u0000\u0000\u0594\u058c\u0001\u0000\u0000\u0000\u0594\u0590\u0001\u0000"+ + "\u0000\u0000\u0595\u0145\u0001\u0000\u0000\u0000\u0596\u059d\u0007\u0001"+ + "\u0000\u0000\u0597\u0599\u0005_\u0000\u0000\u0598\u0597\u0001\u0000\u0000"+ + "\u0000\u0598\u0599\u0001\u0000\u0000\u0000\u0599\u059a\u0001\u0000\u0000"+ + "\u0000\u059a\u059c\u0007\u0001\u0000\u0000\u059b\u0598\u0001\u0000\u0000"+ + "\u0000\u059c\u059f\u0001\u0000\u0000\u0000\u059d\u059b\u0001\u0000\u0000"+ + "\u0000\u059d\u059e\u0001\u0000\u0000\u0000\u059e\u0147\u0001\u0000\u0000"+ + "\u0000\u059f\u059d\u0001\u0000\u0000\u0000\u05a0\u05a1\u0007\r\u0000\u0000"+ + "\u05a1\u0149\u0001\u0000\u0000\u0000\u05a2\u05a3\u0007\u000e\u0000\u0000"+ + "\u05a3\u014b\u0001\u0000\u0000\u0000\u05a4\u05a5\u0007\u000f\u0000\u0000"+ + "\u05a5\u014d\u0001\u0000\u0000\u0000\u05a6\u05a8\u0007\u0010\u0000\u0000"+ + "\u05a7\u05a9\u0007\u0006\u0000\u0000\u05a8\u05a7\u0001\u0000\u0000\u0000"+ + "\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000"+ + "\u05aa\u05ab\u0003\u0146\u00a2\u0000\u05ab\u014f\u0001\u0000\u0000\u0000"+ + "\u05ac\u05af\u0003\u0154\u00a9\u0000\u05ad\u05af\u0005_\u0000\u0000\u05ae"+ + "\u05ac\u0001\u0000\u0000\u0000\u05ae\u05ad\u0001\u0000\u0000\u0000\u05af"+ + "\u0151\u0001\u0000\u0000\u0000\u05b0\u05b1\u0007\u0011\u0000\u0000\u05b1"+ + "\u0153\u0001\u0000\u0000\u0000\u05b2\u05b3\u0007\u0012\u0000\u0000\u05b3"+ + "\u0155\u0001\u0000\u0000\u0000\u05b4\u05b6\u0007\t\u0000\u0000\u05b5\u05b4"+ + "\u0001\u0000\u0000\u0000\u05b6\u05b7\u0001\u0000\u0000\u0000\u05b7\u05b5"+ + "\u0001\u0000\u0000\u0000\u05b7\u05b8\u0001\u0000\u0000\u0000\u05b8\u05b9"+ + "\u0001\u0000\u0000\u0000\u05b9\u05ba\u0006\u00aa\u0001\u0000\u05ba\u0157"+ + "\u0001\u0000\u0000\u0000\u05bb\u05bc\u0005/\u0000\u0000\u05bc\u05bd\u0005"+ + "*\u0000\u0000\u05bd\u05c1\u0001\u0000\u0000\u0000\u05be\u05c0\b\n\u0000"+ + "\u0000\u05bf\u05be\u0001\u0000\u0000\u0000\u05c0\u05c3\u0001\u0000\u0000"+ + "\u0000\u05c1\u05c2\u0001\u0000\u0000\u0000\u05c1\u05bf\u0001\u0000\u0000"+ + "\u0000\u05c2\u05c4\u0001\u0000\u0000\u0000\u05c3\u05c1\u0001\u0000\u0000"+ + "\u0000\u05c4\u05c5\u0005*\u0000\u0000\u05c5\u05c6\u0005/\u0000\u0000\u05c6"+ + "\u05c7\u0001\u0000\u0000\u0000\u05c7\u05c8\u0006\u00ab\u0001\u0000\u05c8"+ + "\u0159\u0001\u0000\u0000\u0000\u05c9\u05ca\u0005/\u0000\u0000\u05ca\u05cb"+ + "\u0005/\u0000\u0000\u05cb\u05cf\u0001\u0000\u0000\u0000\u05cc\u05ce\b"+ + "\n\u0000\u0000\u05cd\u05cc\u0001\u0000\u0000\u0000\u05ce\u05d1\u0001\u0000"+ + "\u0000\u0000\u05cf\u05cd\u0001\u0000\u0000\u0000\u05cf\u05d0\u0001\u0000"+ + "\u0000\u0000\u05d0\u05d2\u0001\u0000\u0000\u0000\u05d1\u05cf\u0001\u0000"+ + "\u0000\u0000\u05d2\u05d3\u0006\u00ac\u0001\u0000\u05d3\u015b\u0001\u0000"+ + "\u0000\u0000\u05d4\u05d6\u0007\n\u0000\u0000\u05d5\u05d4\u0001\u0000\u0000"+ + "\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000\u05d7\u05d5\u0001\u0000\u0000"+ + "\u0000\u05d7\u05d8\u0001\u0000\u0000\u0000\u05d8\u05e7\u0001\u0000\u0000"+ + "\u0000\u05d9\u05e7\u0005;\u0000\u0000\u05da\u05db\u0005/\u0000\u0000\u05db"+ + "\u05dc\u0005*\u0000\u0000\u05dc\u05e0\u0001\u0000\u0000\u0000\u05dd\u05df"+ + "\t\u0000\u0000\u0000\u05de\u05dd\u0001\u0000\u0000\u0000\u05df\u05e2\u0001"+ + "\u0000\u0000\u0000\u05e0\u05e1\u0001\u0000\u0000\u0000\u05e0\u05de\u0001"+ + "\u0000\u0000\u0000\u05e1\u05e3\u0001\u0000\u0000\u0000\u05e2\u05e0\u0001"+ + "\u0000\u0000\u0000\u05e3\u05e4\u0005*\u0000\u0000\u05e4\u05e7\u0005/\u0000"+ + "\u0000\u05e5\u05e7\u0005\u0000\u0000\u0001\u05e6\u05d5\u0001\u0000\u0000"+ + "\u0000\u05e6\u05d9\u0001\u0000\u0000\u0000\u05e6\u05da\u0001\u0000\u0000"+ + "\u0000\u05e6\u05e5\u0001\u0000\u0000\u0000\u05e7\u05e8\u0001\u0000\u0000"+ + "\u0000\u05e8\u05e9\u0006\u00ad\u0002\u0000\u05e9\u015d\u0001\u0000\u0000"+ + "\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb\u05ec\u0001\u0000\u0000"+ + "\u0000\u05ec\u05ed\u0006\u00ae\u0002\u0000\u05ed\u05ee\u0006\u00ae\u0001"+ + "\u0000\u05ee\u015f\u0001\u0000\u0000\u00003\u0000\u0001\u0162\u016a\u016d"+ + "\u0170\u0176\u0178\u0437\u0439\u04a2\u04a7\u04aa\u04b1\u04b6\u04bc\u04bf"+ + "\u04c4\u04cb\u04d0\u04da\u04df\u04e3\u04e8\u04eb\u04f0\u04f5\u04f8\u04fc"+ + "\u0505\u050e\u0518\u053a\u0544\u0546\u0550\u055a\u0565\u056f\u0578\u0594"+ + "\u0598\u059d\u05a8\u05ae\u05b7\u05c1\u05cf\u05d7\u05e0\u05e6\u0003\u0002"+ "\u0001\u0000\u0000\u0001\u0000\u0002\u0000\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 62bcff25c..eee260acd 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.0 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -11,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class GobraParser extends GobraParserBase { - static { RuntimeMetaData.checkVersion("4.13.0", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -27,22 +27,22 @@ public class GobraParser extends GobraParserBase { MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, SHARE=59, ADDR_MOD=60, DOT_DOT=61, SHARED=62, EXCLUSIVE=63, PREDICATE=64, WRITEPERM=65, NOPERM=66, TRUSTED=67, OUTLINE=68, INIT_POST=69, IMPORT_PRE=70, PROOF=71, GHOST_EQUALS=72, - GHOST_NOT_EQUALS=73, WITH=74, BREAK=75, DEFAULT=76, FUNC=77, INTERFACE=78, - SELECT=79, CASE=80, DEFER=81, GO=82, MAP=83, STRUCT=84, CHAN=85, ELSE=86, - GOTO=87, PACKAGE=88, SWITCH=89, CONST=90, FALLTHROUGH=91, IF=92, RANGE=93, - TYPE=94, CONTINUE=95, FOR=96, IMPORT=97, RETURN=98, VAR=99, NIL_LIT=100, - IDENTIFIER=101, L_PAREN=102, R_PAREN=103, L_CURLY=104, R_CURLY=105, L_BRACKET=106, - R_BRACKET=107, ASSIGN=108, COMMA=109, SEMI=110, COLON=111, DOT=112, PLUS_PLUS=113, - MINUS_MINUS=114, DECLARE_ASSIGN=115, ELLIPSIS=116, LOGICAL_OR=117, LOGICAL_AND=118, - EQUALS=119, NOT_EQUALS=120, LESS=121, LESS_OR_EQUALS=122, GREATER=123, - GREATER_OR_EQUALS=124, OR=125, DIV=126, MOD=127, LSHIFT=128, RSHIFT=129, - BIT_CLEAR=130, EXCLAMATION=131, PLUS=132, MINUS=133, CARET=134, STAR=135, - AMPERSAND=136, RECEIVE=137, DECIMAL_LIT=138, BINARY_LIT=139, OCTAL_LIT=140, - HEX_LIT=141, HEX_FLOAT_LIT=142, IMAGINARY_LIT=143, RUNE_LIT=144, BYTE_VALUE=145, - OCTAL_BYTE_VALUE=146, HEX_BYTE_VALUE=147, LITTLE_U_VALUE=148, BIG_U_VALUE=149, - RAW_STRING_LIT=150, INTERPRETED_STRING_LIT=151, WS=152, COMMENT=153, TERMINATOR=154, - LINE_COMMENT=155, WS_NLSEMI=156, COMMENT_NLSEMI=157, LINE_COMMENT_NLSEMI=158, - EOS=159, OTHER=160; + GHOST_NOT_EQUALS=73, WITH=74, OPAQUE=75, REVEAL=76, BREAK=77, DEFAULT=78, + FUNC=79, INTERFACE=80, SELECT=81, CASE=82, DEFER=83, GO=84, MAP=85, STRUCT=86, + CHAN=87, ELSE=88, GOTO=89, PACKAGE=90, SWITCH=91, CONST=92, FALLTHROUGH=93, + IF=94, RANGE=95, TYPE=96, CONTINUE=97, FOR=98, IMPORT=99, RETURN=100, + VAR=101, NIL_LIT=102, IDENTIFIER=103, L_PAREN=104, R_PAREN=105, L_CURLY=106, + R_CURLY=107, L_BRACKET=108, R_BRACKET=109, ASSIGN=110, COMMA=111, SEMI=112, + COLON=113, DOT=114, PLUS_PLUS=115, MINUS_MINUS=116, DECLARE_ASSIGN=117, + ELLIPSIS=118, LOGICAL_OR=119, LOGICAL_AND=120, EQUALS=121, NOT_EQUALS=122, + LESS=123, LESS_OR_EQUALS=124, GREATER=125, GREATER_OR_EQUALS=126, OR=127, + DIV=128, MOD=129, LSHIFT=130, RSHIFT=131, BIT_CLEAR=132, EXCLAMATION=133, + PLUS=134, MINUS=135, CARET=136, STAR=137, AMPERSAND=138, RECEIVE=139, + DECIMAL_LIT=140, BINARY_LIT=141, OCTAL_LIT=142, HEX_LIT=143, HEX_FLOAT_LIT=144, + IMAGINARY_LIT=145, RUNE_LIT=146, BYTE_VALUE=147, OCTAL_BYTE_VALUE=148, + HEX_BYTE_VALUE=149, LITTLE_U_VALUE=150, BIG_U_VALUE=151, RAW_STRING_LIT=152, + INTERPRETED_STRING_LIT=153, WS=154, COMMENT=155, TERMINATOR=156, LINE_COMMENT=157, + WS_NLSEMI=158, COMMENT_NLSEMI=159, LINE_COMMENT_NLSEMI=160, EOS=161, OTHER=162; public static final int RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3, RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_preamble = 6, @@ -153,14 +153,15 @@ private static String[] makeLiteralNames() { "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", - "'==='", "'!=='", "'with'", "'break'", "'default'", "'func'", "'interface'", - "'select'", "'case'", "'defer'", "'go'", "'map'", "'struct'", "'chan'", - "'else'", "'goto'", "'package'", "'switch'", "'const'", "'fallthrough'", - "'if'", "'range'", "'type'", "'continue'", "'for'", "'import'", "'return'", - "'var'", "'nil'", null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", - "','", "';'", "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", - "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", - "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" + "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'break'", "'default'", + "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", + "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", + "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", + "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", + "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", + "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", + "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", + "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -176,20 +177,21 @@ private static String[] makeSymbolicNames() { "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", - "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", - "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", - "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", - "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", - "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", - "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR", - "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", - "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", - "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE", - "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "HEX_FLOAT_LIT", - "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", - "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", - "WS", "COMMENT", "TERMINATOR", "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI", - "LINE_COMMENT_NLSEMI", "EOS", "OTHER" + "WITH", "OPAQUE", "REVEAL", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", + "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", + "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", + "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", + "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", + "ELLIPSIS", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", + "LESS_OR_EQUALS", "GREATER", "GREATER_OR_EQUALS", "OR", "DIV", "MOD", + "LSHIFT", "RSHIFT", "BIT_CLEAR", "EXCLAMATION", "PLUS", "MINUS", "CARET", + "STAR", "AMPERSAND", "RECEIVE", "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", + "HEX_LIT", "HEX_FLOAT_LIT", "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", + "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", "BIG_U_VALUE", + "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", "TERMINATOR", + "LINE_COMMENT", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", + "EOS", "OTHER" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -571,7 +573,7 @@ public final SourceFileContext sourceFile() throws RecognitionException { setState(420); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & 288393170444877879L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881350095299L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101061120L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2422933827841L) != 0) || _la==STAR || _la==RECEIVE) { { { setState(414); @@ -954,7 +956,7 @@ public final ImportDeclContext importDecl() throws RecognitionException { setState(479); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & 4400193994753L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { + while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & 17600775979009L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { setState(474); @@ -3090,7 +3092,7 @@ public final AdtClauseContext adtClause() throws RecognitionException { setState(722); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) { { { setState(717); @@ -3309,7 +3311,8 @@ public final SqTypeContext sqType() throws RecognitionException { @SuppressWarnings("CheckReturnValue") public static class SpecificationContext extends ParserRuleContext { public boolean trusted = false; - public boolean pure = false;; + public boolean pure = false; + public boolean opaque = false;; public List eos() { return getRuleContexts(EosContext.class); } @@ -3326,6 +3329,10 @@ public List specStatement() { public SpecStatementContext specStatement(int i) { return getRuleContext(SpecStatementContext.class,i); } + public List OPAQUE() { return getTokens(GobraParser.OPAQUE); } + public TerminalNode OPAQUE(int i) { + return getToken(GobraParser.OPAQUE, i); + } public List TRUSTED() { return getTokens(GobraParser.TRUSTED); } public TerminalNode TRUSTED(int i) { return getToken(GobraParser.TRUSTED, i); @@ -3349,14 +3356,14 @@ public final SpecificationContext specification() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(760); + setState(762); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(755); + setState(757); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3368,16 +3375,23 @@ public final SpecificationContext specification() throws RecognitionException { specStatement(); } break; - case PURE: + case OPAQUE: { setState(751); + match(OPAQUE); + ((SpecificationContext)_localctx).opaque = true; + } + break; + case PURE: + { + setState(753); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(753); + setState(755); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3385,21 +3399,21 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(757); + setState(759); eos(); } } } - setState(762); + setState(764); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } - setState(765); + setState(767); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(763); + setState(765); match(PURE); ((SpecificationContext)_localctx).pure = true; } @@ -3446,42 +3460,42 @@ public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); enterRule(_localctx, 98, RULE_specStatement); try { - setState(775); + setState(777); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(767); + setState(769); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(768); + setState(770); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(769); + setState(771); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(770); + setState(772); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(771); + setState(773); ((SpecStatementContext)_localctx).kind = match(POST); - setState(772); + setState(774); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(773); + setState(775); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(774); + setState(776); terminationMeasure(); } break; @@ -3526,24 +3540,24 @@ public final TerminationMeasureContext terminationMeasure() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(778); + setState(780); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { case 1: { - setState(777); + setState(779); expressionList(); } break; } - setState(782); + setState(784); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { - setState(780); + setState(782); match(IF); - setState(781); + setState(783); expression(0); } break; @@ -3581,7 +3595,7 @@ public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); enterRule(_localctx, 102, RULE_assertion); try { - setState(786); + setState(788); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { case 1: @@ -3592,7 +3606,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(785); + setState(787); expression(0); } break; @@ -3641,27 +3655,27 @@ public final MatchStmtContext matchStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(788); + setState(790); match(MATCH); - setState(789); + setState(791); expression(0); - setState(790); + setState(792); match(L_CURLY); - setState(794); + setState(796); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(791); + setState(793); matchStmtClause(); } } - setState(796); + setState(798); _errHandler.sync(this); _la = _input.LA(1); } - setState(797); + setState(799); match(R_CURLY); } } @@ -3702,16 +3716,16 @@ public final MatchStmtClauseContext matchStmtClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(799); + setState(801); matchCase(); - setState(800); - match(COLON); setState(802); + match(COLON); + setState(804); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { case 1: { - setState(801); + setState(803); statementList(); } break; @@ -3751,22 +3765,22 @@ public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); enterRule(_localctx, 108, RULE_matchCase); try { - setState(807); + setState(809); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(804); + setState(806); match(CASE); - setState(805); + setState(807); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(806); + setState(808); match(DEFAULT); } break; @@ -3844,16 +3858,16 @@ public final MatchPatternContext matchPattern() throws RecognitionException { enterRule(_localctx, 110, RULE_matchPattern); int _la; try { - setState(822); + setState(824); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(809); + setState(811); match(QMARK); - setState(810); + setState(812); match(IDENTIFIER); } break; @@ -3861,23 +3875,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(811); + setState(813); literalType(); - setState(812); + setState(814); match(L_CURLY); - setState(817); + setState(819); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956190846021146L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956190846021146L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(813); - matchPatternList(); setState(815); + matchPatternList(); + setState(817); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(814); + setState(816); match(COMMA); } } @@ -3885,7 +3899,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(819); + setState(821); match(R_CURLY); } break; @@ -3893,7 +3907,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(821); + setState(823); expression(0); } break; @@ -3940,23 +3954,23 @@ public final MatchPatternListContext matchPatternList() throws RecognitionExcept int _alt; enterOuterAlt(_localctx, 1); { - setState(824); + setState(826); matchPattern(); - setState(829); + setState(831); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,47,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(825); + setState(827); match(COMMA); - setState(826); + setState(828); matchPattern(); } } } - setState(831); + setState(833); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,47,_ctx); } @@ -4004,33 +4018,33 @@ public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() thro try { enterOuterAlt(_localctx, 1); { - setState(832); + setState(834); match(L_CURLY); - setState(837); + setState(839); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(833); + setState(835); match(SHARE); - setState(834); + setState(836); identifierList(); - setState(835); + setState(837); eos(); } break; } - setState(840); + setState(842); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: { - setState(839); + setState(841); statementList(); } break; } - setState(842); + setState(844); match(R_CURLY); } } @@ -4075,42 +4089,42 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(846); + setState(848); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(844); + setState(846); qualifiedIdent(); } break; case 2: { - setState(845); + setState(847); match(IDENTIFIER); } break; } - setState(856); + setState(858); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: { - setState(848); + setState(850); match(L_CURLY); - setState(853); + setState(855); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(849); - closureSpecParams(); setState(851); + closureSpecParams(); + setState(853); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(850); + setState(852); match(COMMA); } } @@ -4118,7 +4132,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(855); + setState(857); match(R_CURLY); } break; @@ -4166,23 +4180,23 @@ public final ClosureSpecParamsContext closureSpecParams() throws RecognitionExce int _alt; enterOuterAlt(_localctx, 1); { - setState(858); + setState(860); closureSpecParam(); - setState(863); + setState(865); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,54,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(859); + setState(861); match(COMMA); - setState(860); + setState(862); closureSpecParam(); } } } - setState(865); + setState(867); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,54,_ctx); } @@ -4223,19 +4237,19 @@ public final ClosureSpecParamContext closureSpecParam() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(868); + setState(870); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(866); + setState(868); match(IDENTIFIER); - setState(867); + setState(869); match(COLON); } break; } - setState(870); + setState(872); expression(0); } } @@ -4280,15 +4294,15 @@ public final ClosureImplProofStmtContext closureImplProofStmt() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(872); + setState(874); match(PROOF); - setState(873); + setState(875); expression(0); - setState(874); + setState(876); match(IMPL); - setState(875); + setState(877); closureSpecInstance(); - setState(876); + setState(878); block(); } } @@ -4350,52 +4364,52 @@ public final ImplementationProofContext implementationProof() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(878); + setState(880); type_(); - setState(879); + setState(881); match(IMPL); - setState(880); + setState(882); type_(); - setState(899); + setState(901); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { - setState(881); + setState(883); match(L_CURLY); - setState(887); + setState(889); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(882); + setState(884); implementationProofPredicateAlias(); - setState(883); + setState(885); eos(); } } - setState(889); + setState(891); _errHandler.sync(this); _la = _input.LA(1); } - setState(895); + setState(897); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(890); + setState(892); methodImplementationProof(); - setState(891); + setState(893); eos(); } } - setState(897); + setState(899); _errHandler.sync(this); _la = _input.LA(1); } - setState(898); + setState(900); match(R_CURLY); } break; @@ -4444,28 +4458,28 @@ public final MethodImplementationProofContext methodImplementationProof() throws try { enterOuterAlt(_localctx, 1); { - setState(902); + setState(904); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(901); + setState(903); match(PURE); } } - setState(904); + setState(906); nonLocalReceiver(); - setState(905); + setState(907); match(IDENTIFIER); - setState(906); - signature(); setState(908); + signature(); + setState(910); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: { - setState(907); + setState(909); block(); } break; @@ -4510,31 +4524,31 @@ public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(910); - match(L_PAREN); setState(912); + match(L_PAREN); + setState(914); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(911); + setState(913); match(IDENTIFIER); } break; } - setState(915); + setState(917); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(914); + setState(916); match(STAR); } } - setState(917); + setState(919); typeName(); - setState(918); + setState(920); match(R_PAREN); } } @@ -4574,24 +4588,24 @@ public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); enterRule(_localctx, 130, RULE_selection); try { - setState(925); + setState(927); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(920); + setState(922); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(921); + setState(923); type_(); - setState(922); + setState(924); match(DOT); - setState(923); + setState(925); match(IDENTIFIER); } break; @@ -4636,24 +4650,24 @@ public final ImplementationProofPredicateAliasContext implementationProofPredica try { enterOuterAlt(_localctx, 1); { - setState(927); + setState(929); match(PRED); - setState(928); + setState(930); match(IDENTIFIER); - setState(929); + setState(931); match(DECLARE_ASSIGN); - setState(932); + setState(934); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { case 1: { - setState(930); + setState(932); selection(); } break; case 2: { - setState(931); + setState(933); operandName(); } break; @@ -4701,25 +4715,25 @@ public final MakeContext make() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(934); + setState(936); match(MAKE); - setState(935); + setState(937); match(L_PAREN); - setState(936); + setState(938); type_(); - setState(939); + setState(941); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(937); + setState(939); match(COMMA); - setState(938); + setState(940); expressionList(); } } - setState(941); + setState(943); match(R_PAREN); } } @@ -4759,13 +4773,13 @@ public final New_Context new_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(943); + setState(945); match(NEW); - setState(944); + setState(946); match(L_PAREN); - setState(945); + setState(947); type_(); - setState(946); + setState(948); match(R_PAREN); } } @@ -4809,21 +4823,21 @@ public final SpecMemberContext specMember() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(948); + setState(950); ((SpecMemberContext)_localctx).specification = specification(); - setState(951); + setState(953); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { case 1: { - setState(949); - functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); + setState(951); + functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; case 2: { - setState(950); - methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); + setState(952); + methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; } @@ -4844,6 +4858,7 @@ public final SpecMemberContext specMember() throws RecognitionException { public static class FunctionDeclContext extends ParserRuleContext { public boolean trusted; public boolean pure; + public boolean opaque; public TerminalNode FUNC() { return getToken(GobraParser.FUNC, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public SignatureContext signature() { @@ -4853,10 +4868,11 @@ public BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() { return getRuleContext(BlockWithBodyParameterInfoContext.class,0); } public FunctionDeclContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - public FunctionDeclContext(ParserRuleContext parent, int invokingState, boolean trusted, boolean pure) { + public FunctionDeclContext(ParserRuleContext parent, int invokingState, boolean trusted, boolean pure, boolean opaque) { super(parent, invokingState); this.trusted = trusted; this.pure = pure; + this.opaque = opaque; } @Override public int getRuleIndex() { return RULE_functionDecl; } @Override @@ -4866,25 +4882,25 @@ public T accept(ParseTreeVisitor visitor) { } } - public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) throws RecognitionException { - FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure); + public final FunctionDeclContext functionDecl(boolean trusted,boolean pure,boolean opaque) throws RecognitionException { + FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure, opaque); enterRule(_localctx, 140, RULE_functionDecl); try { enterOuterAlt(_localctx, 1); { - setState(953); + setState(955); match(FUNC); - setState(954); + setState(956); match(IDENTIFIER); { - setState(955); - signature(); setState(957); + signature(); + setState(959); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(956); + setState(958); blockWithBodyParameterInfo(); } break; @@ -4907,6 +4923,7 @@ public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) thro public static class MethodDeclContext extends ParserRuleContext { public boolean trusted; public boolean pure; + public boolean opaque; public TerminalNode FUNC() { return getToken(GobraParser.FUNC, 0); } public ReceiverContext receiver() { return getRuleContext(ReceiverContext.class,0); @@ -4919,10 +4936,11 @@ public BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() { return getRuleContext(BlockWithBodyParameterInfoContext.class,0); } public MethodDeclContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - public MethodDeclContext(ParserRuleContext parent, int invokingState, boolean trusted, boolean pure) { + public MethodDeclContext(ParserRuleContext parent, int invokingState, boolean trusted, boolean pure, boolean opaque) { super(parent, invokingState); this.trusted = trusted; this.pure = pure; + this.opaque = opaque; } @Override public int getRuleIndex() { return RULE_methodDecl; } @Override @@ -4932,27 +4950,27 @@ public T accept(ParseTreeVisitor visitor) { } } - public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws RecognitionException { - MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure); + public final MethodDeclContext methodDecl(boolean trusted,boolean pure,boolean opaque) throws RecognitionException { + MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure, opaque); enterRule(_localctx, 142, RULE_methodDecl); try { enterOuterAlt(_localctx, 1); { - setState(959); + setState(961); match(FUNC); - setState(960); + setState(962); receiver(); - setState(961); + setState(963); match(IDENTIFIER); { - setState(962); - signature(); setState(964); + signature(); + setState(966); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(963); + setState(965); blockWithBodyParameterInfo(); } break; @@ -4997,9 +5015,9 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(966); + setState(968); match(GHOST); - setState(969); + setState(971); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -5008,9 +5026,10 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case DEC: case PURE: case TRUSTED: + case OPAQUE: case FUNC: { - setState(967); + setState(969); specMember(); } break; @@ -5018,7 +5037,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(968); + setState(970); declaration(); } break; @@ -5065,18 +5084,18 @@ public final FpredicateDeclContext fpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(971); + setState(973); match(PRED); - setState(972); + setState(974); match(IDENTIFIER); - setState(973); - parameters(); setState(975); + parameters(); + setState(977); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(974); + setState(976); predicateBody(); } break; @@ -5121,13 +5140,13 @@ public final PredicateBodyContext predicateBody() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(977); + setState(979); match(L_CURLY); - setState(978); + setState(980); expression(0); - setState(979); + setState(981); eos(); - setState(980); + setState(982); match(R_CURLY); } } @@ -5172,20 +5191,20 @@ public final MpredicateDeclContext mpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(982); + setState(984); match(PRED); - setState(983); + setState(985); receiver(); - setState(984); + setState(986); match(IDENTIFIER); - setState(985); - parameters(); setState(987); + parameters(); + setState(989); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: { - setState(986); + setState(988); predicateBody(); } break; @@ -5232,9 +5251,9 @@ public final VarSpecContext varSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(989); + setState(991); maybeAddressableIdentifierList(); - setState(997); + setState(999); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5257,16 +5276,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(990); + setState(992); type_(); - setState(993); + setState(995); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: { - setState(991); + setState(993); match(ASSIGN); - setState(992); + setState(994); expressionList(); } break; @@ -5275,9 +5294,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(995); + setState(997); match(ASSIGN); - setState(996); + setState(998); expressionList(); } break; @@ -5323,11 +5342,11 @@ public final ShortVarDeclContext shortVarDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(999); + setState(1001); maybeAddressableIdentifierList(); - setState(1000); + setState(1002); match(DECLARE_ASSIGN); - setState(1001); + setState(1003); expressionList(); } } @@ -5371,31 +5390,31 @@ public final ReceiverContext receiver() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1003); - match(L_PAREN); setState(1005); + match(L_PAREN); + setState(1007); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: { - setState(1004); + setState(1006); maybeAddressableIdentifier(); } break; } - setState(1007); - type_(); setState(1009); + type_(); + setState(1011); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1008); + setState(1010); match(COMMA); } } - setState(1011); + setState(1013); match(R_PAREN); } } @@ -5433,20 +5452,20 @@ public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); enterRule(_localctx, 158, RULE_parameterDecl); try { - setState(1015); + setState(1017); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1013); + setState(1015); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1014); + setState(1016); ghostParameterDecl(); } break; @@ -5488,17 +5507,17 @@ public final ActualParameterDeclContext actualParameterDecl() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(1018); + setState(1020); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: { - setState(1017); + setState(1019); identifierList(); } break; } - setState(1020); + setState(1022); parameterType(); } } @@ -5539,19 +5558,19 @@ public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1022); - match(GHOST); setState(1024); + match(GHOST); + setState(1026); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { - setState(1023); + setState(1025); identifierList(); } break; } - setState(1026); + setState(1028); parameterType(); } } @@ -5590,17 +5609,17 @@ public final ParameterTypeContext parameterType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1029); + setState(1031); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1028); + setState(1030); match(ELLIPSIS); } } - setState(1031); + setState(1033); type_(); } } @@ -5922,7 +5941,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1054); + setState(1056); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: @@ -5931,10 +5950,10 @@ private ExpressionContext expression(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(1034); + setState(1036); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 127L) != 0)) ) { + if ( !(((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 127L) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -5942,7 +5961,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1035); + setState(1037); expression(15); } break; @@ -5951,7 +5970,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1036); + setState(1038); primaryExpr(0); } break; @@ -5960,13 +5979,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1037); + setState(1039); match(UNFOLDING); - setState(1038); + setState(1040); predicateAccess(); - setState(1039); + setState(1041); match(IN); - setState(1040); + setState(1042); expression(3); } break; @@ -5975,13 +5994,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1042); + setState(1044); match(LET); - setState(1043); + setState(1045); shortVarDecl(); - setState(1044); + setState(1046); match(IN); - setState(1045); + setState(1047); expression(2); } break; @@ -5990,7 +6009,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1047); + setState(1049); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -6000,21 +6019,21 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1048); + setState(1050); boundVariables(); - setState(1049); + setState(1051); match(COLON); - setState(1050); + setState(1052); match(COLON); - setState(1051); + setState(1053); triggers(); - setState(1052); + setState(1054); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1091); + setState(1093); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,82,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -6022,19 +6041,19 @@ private ExpressionContext expression(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1089); + setState(1091); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1056); + setState(1058); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1057); + setState(1059); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & 1567L) != 0)) ) { + if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 1567L) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -6042,7 +6061,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1058); + setState(1060); expression(14); } break; @@ -6050,12 +6069,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1059); + setState(1061); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1060); + setState(1062); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 113)) & ~0x3f) == 0 && ((1L << (_la - 113)) & 3674113L) != 0)) ) { + if ( !(_la==WAND || ((((_la - 115)) & ~0x3f) == 0 && ((1L << (_la - 115)) & 3674113L) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -6063,7 +6082,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1061); + setState(1063); expression(13); } break; @@ -6071,9 +6090,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1062); + setState(1064); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1063); + setState(1065); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { @@ -6084,7 +6103,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1064); + setState(1066); expression(12); } break; @@ -6092,9 +6111,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1065); + setState(1067); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1066); + setState(1068); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { @@ -6105,7 +6124,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1067); + setState(1069); expression(11); } break; @@ -6113,12 +6132,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1068); + setState(1070); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1069); + setState(1071); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 8866461766385667L) != 0)) ) { + if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 35465847065542659L) != 0)) ) { ((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this); } else { @@ -6126,7 +6145,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1070); + setState(1072); expression(10); } break; @@ -6134,11 +6153,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1071); + setState(1073); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1072); + setState(1074); match(LOGICAL_AND); - setState(1073); + setState(1075); expression(8); } break; @@ -6146,11 +6165,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1074); + setState(1076); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1075); + setState(1077); match(LOGICAL_OR); - setState(1076); + setState(1078); expression(7); } break; @@ -6158,11 +6177,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1077); + setState(1079); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1078); + setState(1080); match(IMPLIES); - setState(1079); + setState(1081); expression(5); } break; @@ -6170,15 +6189,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1080); + setState(1082); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1081); + setState(1083); match(QMARK); - setState(1082); + setState(1084); expression(0); - setState(1083); + setState(1085); match(COLON); - setState(1084); + setState(1086); expression(4); } break; @@ -6186,18 +6205,18 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1086); + setState(1088); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1087); + setState(1089); match(IMPL); - setState(1088); + setState(1090); closureSpecInstance(); } break; } } } - setState(1093); + setState(1095); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,82,_ctx); } @@ -6291,146 +6310,146 @@ public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 168, RULE_statement); try { - setState(1114); + setState(1116); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1094); + setState(1096); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1095); + setState(1097); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1096); + setState(1098); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1097); + setState(1099); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1098); + setState(1100); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1099); + setState(1101); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1100); + setState(1102); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1101); + setState(1103); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1102); + setState(1104); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1103); + setState(1105); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1104); + setState(1106); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1105); + setState(1107); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1106); + setState(1108); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1107); + setState(1109); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1108); + setState(1110); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1109); + setState(1111); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1110); + setState(1112); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1111); + setState(1113); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1112); + setState(1114); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1113); + setState(1115); closureImplProofStmt(); } break; @@ -6470,9 +6489,9 @@ public final ApplyStmtContext applyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1116); + setState(1118); match(APPLY); - setState(1117); + setState(1119); expression(0); } } @@ -6513,16 +6532,16 @@ public final PackageStmtContext packageStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1119); + setState(1121); match(PACKAGE); - setState(1120); - expression(0); setState(1122); + expression(0); + setState(1124); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: { - setState(1121); + setState(1123); block(); } break; @@ -6565,9 +6584,9 @@ public final SpecForStmtContext specForStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1124); + setState(1126); loopSpec(); - setState(1125); + setState(1127); forStmt(); } } @@ -6622,34 +6641,34 @@ public final LoopSpecContext loopSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1133); + setState(1135); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1127); + setState(1129); match(INV); - setState(1128); + setState(1130); expression(0); - setState(1129); + setState(1131); eos(); } } - setState(1135); + setState(1137); _errHandler.sync(this); _la = _input.LA(1); } - setState(1140); + setState(1142); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1136); + setState(1138); match(DEC); - setState(1137); + setState(1139); terminationMeasure(); - setState(1138); + setState(1140); eos(); } } @@ -6695,24 +6714,24 @@ public final DeferStmtContext deferStmt() throws RecognitionException { enterRule(_localctx, 178, RULE_deferStmt); int _la; try { - setState(1147); + setState(1149); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1142); + setState(1144); match(DEFER); - setState(1143); + setState(1145); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1144); + setState(1146); match(DEFER); - setState(1145); + setState(1147); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -6723,7 +6742,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1146); + setState(1148); predicateAccess(); } break; @@ -6769,62 +6788,62 @@ public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); enterRule(_localctx, 180, RULE_basicLit); try { - setState(1157); + setState(1159); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1149); + setState(1151); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1150); + setState(1152); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1151); + setState(1153); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1152); + setState(1154); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1153); + setState(1155); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1154); + setState(1156); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1155); + setState(1157); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1156); + setState(1158); match(RUNE_LIT); } break; @@ -6966,6 +6985,22 @@ public T accept(ParseTreeVisitor visitor) { } } @SuppressWarnings("CheckReturnValue") + public static class RevealInvokePrimaryExprContext extends PrimaryExprContext { + public TerminalNode REVEAL() { return getToken(GobraParser.REVEAL, 0); } + public PrimaryExprContext primaryExpr() { + return getRuleContext(PrimaryExprContext.class,0); + } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public RevealInvokePrimaryExprContext(PrimaryExprContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitRevealInvokePrimaryExpr(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") public static class InvokePrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -7084,7 +7119,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1171); + setState(1177); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { case 1: @@ -7093,7 +7128,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(1160); + setState(1162); operand(); } break; @@ -7102,7 +7137,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1161); + setState(1163); conversion(); } break; @@ -7111,7 +7146,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1162); + setState(1164); methodExpr(); } break; @@ -7120,7 +7155,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1163); + setState(1165); ghostPrimaryExpr(); } break; @@ -7129,7 +7164,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1164); + setState(1166); new_(); } break; @@ -7138,19 +7173,32 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1165); + setState(1167); make(); } break; case 7: + { + _localctx = new RevealInvokePrimaryExprContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(1168); + match(REVEAL); + setState(1169); + primaryExpr(0); + setState(1170); + arguments(); + } + break; + case 8: { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1166); + setState(1172); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 281474976710729L) != 0)) ) { + if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 1125899906842697L) != 0)) ) { ((BuiltInCallExprContext)_localctx).call_op = (Token)_errHandler.recoverInline(this); } else { @@ -7158,17 +7206,17 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1167); + setState(1173); match(L_PAREN); - setState(1168); + setState(1174); expression(0); - setState(1169); + setState(1175); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1195); + setState(1201); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,91,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -7176,18 +7224,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1193); + setState(1199); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1173); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1174); + setState(1179); + if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); + setState(1180); match(DOT); - setState(1175); + setState(1181); match(IDENTIFIER); } break; @@ -7195,9 +7243,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1176); - if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1177); + setState(1182); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); + setState(1183); index(); } break; @@ -7205,9 +7253,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1178); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1179); + setState(1184); + if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); + setState(1185); slice_(); } break; @@ -7215,9 +7263,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1180); - if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1181); + setState(1186); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); + setState(1187); seqUpdExp(); } break; @@ -7225,9 +7273,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1182); - if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1183); + setState(1188); + if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); + setState(1189); typeAssertion(); } break; @@ -7235,9 +7283,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1184); - if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1185); + setState(1190); + if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); + setState(1191); arguments(); } break; @@ -7245,13 +7293,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1186); + setState(1192); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1187); + setState(1193); arguments(); - setState(1188); + setState(1194); match(AS); - setState(1189); + setState(1195); closureSpecInstance(); } break; @@ -7259,16 +7307,16 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1191); + setState(1197); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1192); + setState(1198); predConstructArgs(); } break; } } } - setState(1197); + setState(1203); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,91,_ctx); } @@ -7311,9 +7359,9 @@ public final FunctionLitContext functionLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1198); + setState(1204); ((FunctionLitContext)_localctx).specification = specification(); - setState(1199); + setState(1205); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7361,27 +7409,27 @@ public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws try { enterOuterAlt(_localctx, 1); { - setState(1201); + setState(1207); match(FUNC); - setState(1203); + setState(1209); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1202); + setState(1208); match(IDENTIFIER); } } { - setState(1205); + setState(1211); signature(); - setState(1207); + setState(1213); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(1206); + setState(1212); blockWithBodyParameterInfo(); } break; @@ -7426,29 +7474,29 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1209); + setState(1215); match(L_PRED); - setState(1211); + setState(1217); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(1210); + setState(1216); expressionList(); } } - setState(1214); + setState(1220); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1213); + setState(1219); match(COMMA); } } - setState(1216); + setState(1222); match(R_PRED); } } @@ -7510,47 +7558,47 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1218); + setState(1224); match(INTERFACE); - setState(1219); + setState(1225); match(L_CURLY); - setState(1229); + setState(1235); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 72057594172173824L) != 0) || _la==TRUSTED || _la==IDENTIFIER) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 72057594172173824L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 68719476993L) != 0)) { { { - setState(1223); + setState(1229); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: { - setState(1220); + setState(1226); methodSpec(); } break; case 2: { - setState(1221); + setState(1227); typeName(); } break; case 3: { - setState(1222); + setState(1228); predicateSpec(); } break; } - setState(1225); + setState(1231); eos(); } } - setState(1231); + setState(1237); _errHandler.sync(this); _la = _input.LA(1); } - setState(1232); + setState(1238); match(R_CURLY); } } @@ -7589,11 +7637,11 @@ public final PredicateSpecContext predicateSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1234); + setState(1240); match(PRED); - setState(1235); + setState(1241); match(IDENTIFIER); - setState(1236); + setState(1242); parameters(); } } @@ -7637,50 +7685,50 @@ public final MethodSpecContext methodSpec() throws RecognitionException { enterRule(_localctx, 194, RULE_methodSpec); int _la; try { - setState(1253); + setState(1259); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,100,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1239); + setState(1245); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1238); + setState(1244); match(GHOST); } } - setState(1241); + setState(1247); specification(); - setState(1242); + setState(1248); match(IDENTIFIER); - setState(1243); + setState(1249); parameters(); - setState(1244); + setState(1250); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1247); + setState(1253); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1246); + setState(1252); match(GHOST); } } - setState(1249); + setState(1255); specification(); - setState(1250); + setState(1256); match(IDENTIFIER); - setState(1251); + setState(1257); parameters(); } break; @@ -7728,13 +7776,13 @@ public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); enterRule(_localctx, 196, RULE_type_); try { - setState(1262); + setState(1268); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1255); + setState(1261); typeName(); } break; @@ -7749,7 +7797,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1256); + setState(1262); typeLit(); } break; @@ -7763,18 +7811,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1257); + setState(1263); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1258); + setState(1264); match(L_PAREN); - setState(1259); + setState(1265); type_(); - setState(1260); + setState(1266); match(R_PAREN); } break; @@ -7837,69 +7885,69 @@ public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); enterRule(_localctx, 198, RULE_typeLit); try { - setState(1273); + setState(1279); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1264); + setState(1270); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1265); + setState(1271); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1266); + setState(1272); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1267); + setState(1273); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1268); + setState(1274); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1269); + setState(1275); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1270); + setState(1276); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1271); + setState(1277); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1272); + setState(1278); predType(); } break; @@ -7939,9 +7987,9 @@ public final PredTypeContext predType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1275); + setState(1281); match(PRED); - setState(1276); + setState(1282); predTypeParams(); } } @@ -7989,39 +8037,39 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1278); + setState(1284); match(L_PAREN); - setState(1290); + setState(1296); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) { { - setState(1279); + setState(1285); type_(); - setState(1284); + setState(1290); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,103,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1280); + setState(1286); match(COMMA); - setState(1281); + setState(1287); type_(); } } } - setState(1286); + setState(1292); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,103,_ctx); } - setState(1288); + setState(1294); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1287); + setState(1293); match(COMMA); } } @@ -8029,7 +8077,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1292); + setState(1298); match(R_PAREN); } } @@ -8082,55 +8130,55 @@ public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); enterRule(_localctx, 204, RULE_literalType); try { - setState(1301); + setState(1307); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1294); + setState(1300); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1295); + setState(1301); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1296); + setState(1302); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1297); + setState(1303); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1298); + setState(1304); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1299); + setState(1305); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1300); + setState(1306); typeName(); } break; @@ -8172,13 +8220,13 @@ public final ImplicitArrayContext implicitArray() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1303); + setState(1309); match(L_BRACKET); - setState(1304); + setState(1310); match(ELLIPSIS); - setState(1305); + setState(1311); match(R_BRACKET); - setState(1306); + setState(1312); elementType(); } } @@ -8228,31 +8276,31 @@ public final Slice_Context slice_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1308); + setState(1314); match(L_BRACKET); - setState(1324); + setState(1330); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,110,_ctx) ) { case 1: { - setState(1310); + setState(1316); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(1309); + setState(1315); low(); } } - setState(1312); + setState(1318); match(COLON); - setState(1314); + setState(1320); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(1313); + setState(1319); high(); } } @@ -8261,28 +8309,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1317); + setState(1323); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(1316); + setState(1322); low(); } } - setState(1319); + setState(1325); match(COLON); - setState(1320); + setState(1326); high(); - setState(1321); + setState(1327); match(COLON); - setState(1322); + setState(1328); cap(); } break; } - setState(1326); + setState(1332); match(R_BRACKET); } } @@ -8319,7 +8367,7 @@ public final LowContext low() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1328); + setState(1334); expression(0); } } @@ -8356,7 +8404,7 @@ public final HighContext high() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1330); + setState(1336); expression(0); } } @@ -8393,7 +8441,7 @@ public final CapContext cap() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1332); + setState(1338); expression(0); } } @@ -8441,15 +8489,15 @@ public final Assign_opContext assign_op() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1335); + setState(1341); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) { + if (((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & 4031L) != 0)) { { - setState(1334); + setState(1340); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) ) { + if ( !(((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & 4031L) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -8460,7 +8508,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1337); + setState(1343); match(ASSIGN); } } @@ -8509,43 +8557,43 @@ public final RangeClauseContext rangeClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1345); + setState(1351); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { case 1: { - setState(1339); + setState(1345); expressionList(); - setState(1340); + setState(1346); match(ASSIGN); } break; case 2: { - setState(1342); + setState(1348); maybeAddressableIdentifierList(); - setState(1343); + setState(1349); match(DECLARE_ASSIGN); } break; } - setState(1347); + setState(1353); match(RANGE); - setState(1348); + setState(1354); expression(0); - setState(1353); + setState(1359); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1349); + setState(1355); match(WITH); - setState(1351); + setState(1357); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1350); + setState(1356); match(IDENTIFIER); } } @@ -8588,9 +8636,9 @@ public final PackageClauseContext packageClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1355); + setState(1361); match(PACKAGE); - setState(1356); + setState(1362); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -8627,7 +8675,7 @@ public final ImportPathContext importPath() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1358); + setState(1364); string_(); } } @@ -8668,27 +8716,27 @@ public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); enterRule(_localctx, 224, RULE_declaration); try { - setState(1363); + setState(1369); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1360); + setState(1366); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1361); + setState(1367); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1362); + setState(1368); varDecl(); } break; @@ -8742,38 +8790,38 @@ public final ConstDeclContext constDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1365); + setState(1371); match(CONST); - setState(1377); + setState(1383); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1366); + setState(1372); constSpec(); } break; case L_PAREN: { - setState(1367); - match(L_PAREN); setState(1373); + match(L_PAREN); + setState(1379); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1368); + setState(1374); constSpec(); - setState(1369); + setState(1375); eos(); } } - setState(1375); + setState(1381); _errHandler.sync(this); _la = _input.LA(1); } - setState(1376); + setState(1382); match(R_PAREN); } break; @@ -8823,26 +8871,26 @@ public final ConstSpecContext constSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1379); - identifierList(); setState(1385); + identifierList(); + setState(1391); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { case 1: { - setState(1381); + setState(1387); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) { { - setState(1380); + setState(1386); type_(); } } - setState(1383); + setState(1389); match(ASSIGN); - setState(1384); + setState(1390); expressionList(); } break; @@ -8888,23 +8936,23 @@ public final IdentifierListContext identifierList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1387); + setState(1393); match(IDENTIFIER); - setState(1392); + setState(1398); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,120,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1388); + setState(1394); match(COMMA); - setState(1389); + setState(1395); match(IDENTIFIER); } } } - setState(1394); + setState(1400); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,120,_ctx); } @@ -8951,23 +8999,23 @@ public final ExpressionListContext expressionList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1395); + setState(1401); expression(0); - setState(1400); + setState(1406); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,121,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1396); + setState(1402); match(COMMA); - setState(1397); + setState(1403); expression(0); } } } - setState(1402); + setState(1408); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,121,_ctx); } @@ -9019,38 +9067,38 @@ public final TypeDeclContext typeDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1403); + setState(1409); match(TYPE); - setState(1415); + setState(1421); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1404); + setState(1410); typeSpec(); } break; case L_PAREN: { - setState(1405); - match(L_PAREN); setState(1411); + match(L_PAREN); + setState(1417); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1406); + setState(1412); typeSpec(); - setState(1407); + setState(1413); eos(); } } - setState(1413); + setState(1419); _errHandler.sync(this); _la = _input.LA(1); } - setState(1414); + setState(1420); match(R_PAREN); } break; @@ -9095,19 +9143,19 @@ public final TypeSpecContext typeSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1417); + setState(1423); match(IDENTIFIER); - setState(1419); + setState(1425); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1418); + setState(1424); match(ASSIGN); } } - setState(1421); + setState(1427); type_(); } } @@ -9157,38 +9205,38 @@ public final VarDeclContext varDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1423); + setState(1429); match(VAR); - setState(1435); + setState(1441); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1424); + setState(1430); varSpec(); } break; case L_PAREN: { - setState(1425); - match(L_PAREN); setState(1431); + match(L_PAREN); + setState(1437); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1426); + setState(1432); varSpec(); - setState(1427); + setState(1433); eos(); } } - setState(1433); + setState(1439); _errHandler.sync(this); _la = _input.LA(1); } - setState(1434); + setState(1440); match(R_PAREN); } break; @@ -9232,19 +9280,19 @@ public final BlockContext block() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1437); + setState(1443); match(L_CURLY); - setState(1439); + setState(1445); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: { - setState(1438); + setState(1444); statementList(); } break; } - setState(1441); + setState(1447); match(R_CURLY); } } @@ -9300,7 +9348,7 @@ public final StatementListContext statementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1455); + setState(1461); _errHandler.sync(this); _alt = 1; do { @@ -9308,17 +9356,17 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1450); + setState(1456); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: { - setState(1444); + setState(1450); _errHandler.sync(this); _la = _input.LA(1); if (_la==SEMI) { { - setState(1443); + setState(1449); match(SEMI); } } @@ -9327,12 +9375,12 @@ public final StatementListContext statementList() throws RecognitionException { break; case 2: { - setState(1447); + setState(1453); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOS) { { - setState(1446); + setState(1452); match(EOS); } } @@ -9341,14 +9389,14 @@ public final StatementListContext statementList() throws RecognitionException { break; case 3: { - setState(1449); + setState(1455); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; } - setState(1452); + setState(1458); statement(); - setState(1453); + setState(1459); eos(); } } @@ -9356,7 +9404,7 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1457); + setState(1463); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,131,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -9405,41 +9453,41 @@ public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); enterRule(_localctx, 244, RULE_simpleStmt); try { - setState(1464); + setState(1470); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1459); + setState(1465); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1460); + setState(1466); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1461); + setState(1467); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1462); + setState(1468); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1463); + setState(1469); shortVarDecl(); } break; @@ -9478,7 +9526,7 @@ public final ExpressionStmtContext expressionStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1466); + setState(1472); expression(0); } } @@ -9520,11 +9568,11 @@ public final SendStmtContext sendStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1468); + setState(1474); ((SendStmtContext)_localctx).channel = expression(0); - setState(1469); + setState(1475); match(RECEIVE); - setState(1470); + setState(1476); expression(0); } } @@ -9564,9 +9612,9 @@ public final IncDecStmtContext incDecStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1472); + setState(1478); expression(0); - setState(1473); + setState(1479); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -9617,11 +9665,11 @@ public final AssignmentContext assignment() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1475); + setState(1481); expressionList(); - setState(1476); + setState(1482); assign_op(); - setState(1477); + setState(1483); expressionList(); } } @@ -9658,7 +9706,7 @@ public final EmptyStmtContext emptyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1479); + setState(1485); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -9705,16 +9753,16 @@ public final LabeledStmtContext labeledStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1481); + setState(1487); match(IDENTIFIER); - setState(1482); + setState(1488); match(COLON); - setState(1484); + setState(1490); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { case 1: { - setState(1483); + setState(1489); statement(); } break; @@ -9755,14 +9803,14 @@ public final ReturnStmtContext returnStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1486); + setState(1492); match(RETURN); - setState(1488); + setState(1494); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { case 1: { - setState(1487); + setState(1493); expressionList(); } break; @@ -9801,14 +9849,14 @@ public final BreakStmtContext breakStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1490); + setState(1496); match(BREAK); - setState(1492); + setState(1498); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: { - setState(1491); + setState(1497); match(IDENTIFIER); } break; @@ -9847,14 +9895,14 @@ public final ContinueStmtContext continueStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1494); + setState(1500); match(CONTINUE); - setState(1496); + setState(1502); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { case 1: { - setState(1495); + setState(1501); match(IDENTIFIER); } break; @@ -9893,9 +9941,9 @@ public final GotoStmtContext gotoStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1498); + setState(1504); match(GOTO); - setState(1499); + setState(1505); match(IDENTIFIER); } } @@ -9930,7 +9978,7 @@ public final FallthroughStmtContext fallthroughStmt() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1501); + setState(1507); match(FALLTHROUGH); } } @@ -9984,57 +10032,57 @@ public final IfStmtContext ifStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1503); + setState(1509); match(IF); - setState(1512); + setState(1518); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { case 1: { - setState(1504); + setState(1510); expression(0); } break; case 2: { - setState(1505); + setState(1511); eos(); - setState(1506); + setState(1512); expression(0); } break; case 3: { - setState(1508); + setState(1514); simpleStmt(); - setState(1509); + setState(1515); eos(); - setState(1510); + setState(1516); expression(0); } break; } - setState(1514); - block(); setState(1520); + block(); + setState(1526); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: { - setState(1515); + setState(1521); match(ELSE); - setState(1518); + setState(1524); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1516); + setState(1522); ifStmt(); } break; case L_CURLY: { - setState(1517); + setState(1523); block(); } break; @@ -10080,20 +10128,20 @@ public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); enterRule(_localctx, 270, RULE_switchStmt); try { - setState(1524); + setState(1530); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1522); + setState(1528); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1523); + setState(1529); typeSwitchStmt(); } break; @@ -10148,19 +10196,19 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1526); + setState(1532); match(SWITCH); - setState(1537); + setState(1543); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { case 1: { - setState(1528); + setState(1534); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(1527); + setState(1533); expression(0); } } @@ -10169,24 +10217,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1531); + setState(1537); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1530); + setState(1536); simpleStmt(); } break; } - setState(1533); + setState(1539); eos(); - setState(1535); + setState(1541); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(1534); + setState(1540); expression(0); } } @@ -10194,23 +10242,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1539); + setState(1545); match(L_CURLY); - setState(1543); + setState(1549); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1540); + setState(1546); exprCaseClause(); } } - setState(1545); + setState(1551); _errHandler.sync(this); _la = _input.LA(1); } - setState(1546); + setState(1552); match(R_CURLY); } } @@ -10251,16 +10299,16 @@ public final ExprCaseClauseContext exprCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1548); + setState(1554); exprSwitchCase(); - setState(1549); + setState(1555); match(COLON); - setState(1551); + setState(1557); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1550); + setState(1556); statementList(); } break; @@ -10300,22 +10348,22 @@ public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 276, RULE_exprSwitchCase); try { - setState(1556); + setState(1562); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1553); + setState(1559); match(CASE); - setState(1554); + setState(1560); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1555); + setState(1561); match(DEFAULT); } break; @@ -10372,53 +10420,53 @@ public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1558); + setState(1564); match(SWITCH); - setState(1567); + setState(1573); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1559); + setState(1565); typeSwitchGuard(); } break; case 2: { - setState(1560); + setState(1566); eos(); - setState(1561); + setState(1567); typeSwitchGuard(); } break; case 3: { - setState(1563); + setState(1569); simpleStmt(); - setState(1564); + setState(1570); eos(); - setState(1565); + setState(1571); typeSwitchGuard(); } break; } - setState(1569); + setState(1575); match(L_CURLY); - setState(1573); + setState(1579); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1570); + setState(1576); typeCaseClause(); } } - setState(1575); + setState(1581); _errHandler.sync(this); _la = _input.LA(1); } - setState(1576); + setState(1582); match(R_CURLY); } } @@ -10461,27 +10509,27 @@ public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1580); + setState(1586); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { case 1: { - setState(1578); + setState(1584); match(IDENTIFIER); - setState(1579); + setState(1585); match(DECLARE_ASSIGN); } break; } - setState(1582); + setState(1588); primaryExpr(0); - setState(1583); + setState(1589); match(DOT); - setState(1584); + setState(1590); match(L_PAREN); - setState(1585); + setState(1591); match(TYPE); - setState(1586); + setState(1592); match(R_PAREN); } } @@ -10522,16 +10570,16 @@ public final TypeCaseClauseContext typeCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1588); + setState(1594); typeSwitchCase(); - setState(1589); + setState(1595); match(COLON); - setState(1591); + setState(1597); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { case 1: { - setState(1590); + setState(1596); statementList(); } break; @@ -10571,22 +10619,22 @@ public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 284, RULE_typeSwitchCase); try { - setState(1596); + setState(1602); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1593); + setState(1599); match(CASE); - setState(1594); + setState(1600); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1595); + setState(1601); match(DEFAULT); } break; @@ -10639,7 +10687,7 @@ public final TypeListContext typeList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1600); + setState(1606); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10662,28 +10710,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1598); + setState(1604); type_(); } break; case NIL_LIT: { - setState(1599); + setState(1605); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1609); + setState(1615); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1602); + setState(1608); match(COMMA); - setState(1605); + setState(1611); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10706,13 +10754,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1603); + setState(1609); type_(); } break; case NIL_LIT: { - setState(1604); + setState(1610); match(NIL_LIT); } break; @@ -10721,7 +10769,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1611); + setState(1617); _errHandler.sync(this); _la = _input.LA(1); } @@ -10767,25 +10815,25 @@ public final SelectStmtContext selectStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1612); + setState(1618); match(SELECT); - setState(1613); + setState(1619); match(L_CURLY); - setState(1617); + setState(1623); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1614); + setState(1620); commClause(); } } - setState(1619); + setState(1625); _errHandler.sync(this); _la = _input.LA(1); } - setState(1620); + setState(1626); match(R_CURLY); } } @@ -10826,16 +10874,16 @@ public final CommClauseContext commClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1622); + setState(1628); commCase(); - setState(1623); + setState(1629); match(COLON); - setState(1625); + setState(1631); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: { - setState(1624); + setState(1630); statementList(); } break; @@ -10878,26 +10926,26 @@ public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); enterRule(_localctx, 292, RULE_commCase); try { - setState(1633); + setState(1639); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1627); + setState(1633); match(CASE); - setState(1630); + setState(1636); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { case 1: { - setState(1628); + setState(1634); sendStmt(); } break; case 2: { - setState(1629); + setState(1635); recvStmt(); } break; @@ -10907,7 +10955,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1632); + setState(1638); match(DEFAULT); } break; @@ -10957,27 +11005,27 @@ public final RecvStmtContext recvStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1641); + setState(1647); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: { - setState(1635); + setState(1641); expressionList(); - setState(1636); + setState(1642); match(ASSIGN); } break; case 2: { - setState(1638); + setState(1644); identifierList(); - setState(1639); + setState(1645); match(DECLARE_ASSIGN); } break; } - setState(1643); + setState(1649); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -11025,19 +11073,19 @@ public final ForStmtContext forStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1645); + setState(1651); match(FOR); - setState(1653); + setState(1659); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: { - setState(1647); + setState(1653); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(1646); + setState(1652); expression(0); } } @@ -11046,18 +11094,18 @@ public final ForStmtContext forStmt() throws RecognitionException { break; case 2: { - setState(1649); + setState(1655); forClause(); } break; case 3: { - setState(1651); + setState(1657); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(1650); + setState(1656); rangeClause(); } } @@ -11065,7 +11113,7 @@ public final ForStmtContext forStmt() throws RecognitionException { } break; } - setState(1655); + setState(1661); block(); } } @@ -11117,36 +11165,36 @@ public final ForClauseContext forClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1658); + setState(1664); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { case 1: { - setState(1657); + setState(1663); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1660); + setState(1666); eos(); - setState(1662); + setState(1668); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,165,_ctx) ) { case 1: { - setState(1661); + setState(1667); expression(0); } break; } - setState(1664); + setState(1670); eos(); - setState(1666); + setState(1672); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(1665); + setState(1671); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -11187,9 +11235,9 @@ public final GoStmtContext goStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1668); + setState(1674); match(GO); - setState(1669); + setState(1675); expression(0); } } @@ -11225,20 +11273,20 @@ public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); enterRule(_localctx, 302, RULE_typeName); try { - setState(1673); + setState(1679); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1671); + setState(1677); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1672); + setState(1678); match(IDENTIFIER); } break; @@ -11282,13 +11330,13 @@ public final ArrayTypeContext arrayType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1675); + setState(1681); match(L_BRACKET); - setState(1676); + setState(1682); arrayLength(); - setState(1677); + setState(1683); match(R_BRACKET); - setState(1678); + setState(1684); elementType(); } } @@ -11325,7 +11373,7 @@ public final ArrayLengthContext arrayLength() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1680); + setState(1686); expression(0); } } @@ -11362,7 +11410,7 @@ public final ElementTypeContext elementType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1682); + setState(1688); type_(); } } @@ -11400,9 +11448,9 @@ public final PointerTypeContext pointerType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1684); + setState(1690); match(STAR); - setState(1685); + setState(1691); type_(); } } @@ -11441,11 +11489,11 @@ public final SliceTypeContext sliceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1687); + setState(1693); match(L_BRACKET); - setState(1688); + setState(1694); match(R_BRACKET); - setState(1689); + setState(1695); elementType(); } } @@ -11488,15 +11536,15 @@ public final MapTypeContext mapType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1691); + setState(1697); match(MAP); - setState(1692); + setState(1698); match(L_BRACKET); - setState(1693); + setState(1699); type_(); - setState(1694); + setState(1700); match(R_BRACKET); - setState(1695); + setState(1701); elementType(); } } @@ -11535,33 +11583,33 @@ public final ChannelTypeContext channelType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1702); + setState(1708); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { case 1: { - setState(1697); + setState(1703); match(CHAN); } break; case 2: { - setState(1698); + setState(1704); match(CHAN); - setState(1699); + setState(1705); match(RECEIVE); } break; case 3: { - setState(1700); + setState(1706); match(RECEIVE); - setState(1701); + setState(1707); match(CHAN); } break; } - setState(1704); + setState(1710); elementType(); } } @@ -11599,9 +11647,9 @@ public final FunctionTypeContext functionType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1706); + setState(1712); match(FUNC); - setState(1707); + setState(1713); signature(); } } @@ -11639,22 +11687,22 @@ public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); enterRule(_localctx, 320, RULE_signature); try { - setState(1713); + setState(1719); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1709); + setState(1715); parameters(); - setState(1710); + setState(1716); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1712); + setState(1718); parameters(); } break; @@ -11694,20 +11742,20 @@ public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); enterRule(_localctx, 322, RULE_result); try { - setState(1717); + setState(1723); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1715); + setState(1721); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1716); + setState(1722); type_(); } break; @@ -11757,39 +11805,39 @@ public final ParametersContext parameters() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1719); + setState(1725); match(L_PAREN); - setState(1731); + setState(1737); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441152431101575619L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441152431101575619L) != 0)) { { - setState(1720); + setState(1726); parameterDecl(); - setState(1725); + setState(1731); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,171,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1721); + setState(1727); match(COMMA); - setState(1722); + setState(1728); parameterDecl(); } } } - setState(1727); + setState(1733); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,171,_ctx); } - setState(1729); + setState(1735); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1728); + setState(1734); match(COMMA); } } @@ -11797,7 +11845,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1733); + setState(1739); match(R_PAREN); } } @@ -11841,23 +11889,23 @@ public final ConversionContext conversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1735); + setState(1741); nonNamedType(); - setState(1736); + setState(1742); match(L_PAREN); - setState(1737); + setState(1743); expression(0); - setState(1739); + setState(1745); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1738); + setState(1744); match(COMMA); } } - setState(1741); + setState(1747); match(R_PAREN); } } @@ -11897,7 +11945,7 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); enterRule(_localctx, 328, RULE_nonNamedType); try { - setState(1748); + setState(1754); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -11911,18 +11959,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1743); + setState(1749); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1744); + setState(1750); match(L_PAREN); - setState(1745); + setState(1751); nonNamedType(); - setState(1746); + setState(1752); match(R_PAREN); } break; @@ -11969,31 +12017,31 @@ public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); enterRule(_localctx, 330, RULE_operand); try { - setState(1756); + setState(1762); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1750); + setState(1756); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1751); + setState(1757); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1752); + setState(1758); match(L_PAREN); - setState(1753); + setState(1759); expression(0); - setState(1754); + setState(1760); match(R_PAREN); } break; @@ -12036,7 +12084,7 @@ public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); enterRule(_localctx, 332, RULE_literal); try { - setState(1761); + setState(1767); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12053,7 +12101,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1758); + setState(1764); basicLit(); } break; @@ -12071,7 +12119,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1759); + setState(1765); compositeLit(); } break; @@ -12081,10 +12129,11 @@ public final LiteralContext literal() throws RecognitionException { case DEC: case PURE: case TRUSTED: + case OPAQUE: case FUNC: enterOuterAlt(_localctx, 3); { - setState(1760); + setState(1766); functionLit(); } break; @@ -12129,9 +12178,9 @@ public final IntegerContext integer() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1763); + setState(1769); _la = _input.LA(1); - if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & 111L) != 0)) ) { + if ( !(((((_la - 140)) & ~0x3f) == 0 && ((1L << (_la - 140)) & 111L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -12172,7 +12221,7 @@ public final OperandNameContext operandName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1765); + setState(1771); match(IDENTIFIER); } } @@ -12211,11 +12260,11 @@ public final QualifiedIdentContext qualifiedIdent() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1767); + setState(1773); match(IDENTIFIER); - setState(1768); + setState(1774); match(DOT); - setState(1769); + setState(1775); match(IDENTIFIER); } } @@ -12255,9 +12304,9 @@ public final CompositeLitContext compositeLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1771); + setState(1777); literalType(); - setState(1772); + setState(1778); literalValue(); } } @@ -12298,21 +12347,21 @@ public final LiteralValueContext literalValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1774); + setState(1780); match(L_CURLY); - setState(1779); + setState(1785); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2990104391687L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 11960417569799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(1775); + setState(1781); elementList(); - setState(1777); + setState(1783); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1776); + setState(1782); match(COMMA); } } @@ -12320,7 +12369,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1781); + setState(1787); match(R_CURLY); } } @@ -12365,23 +12414,23 @@ public final ElementListContext elementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1783); + setState(1789); keyedElement(); - setState(1788); + setState(1794); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,180,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1784); + setState(1790); match(COMMA); - setState(1785); + setState(1791); keyedElement(); } } } - setState(1790); + setState(1796); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,180,_ctx); } @@ -12424,19 +12473,19 @@ public final KeyedElementContext keyedElement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1794); + setState(1800); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,181,_ctx) ) { case 1: { - setState(1791); + setState(1797); key(); - setState(1792); + setState(1798); match(COLON); } break; } - setState(1796); + setState(1802); element(); } } @@ -12474,7 +12523,7 @@ public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); enterRule(_localctx, 348, RULE_key); try { - setState(1800); + setState(1806); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12514,6 +12563,8 @@ public final KeyContext key() throws RecognitionException { case WRITEPERM: case NOPERM: case TRUSTED: + case OPAQUE: + case REVEAL: case FUNC: case INTERFACE: case MAP: @@ -12542,14 +12593,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1798); + setState(1804); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1799); + setState(1805); literalValue(); } break; @@ -12591,7 +12642,7 @@ public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); enterRule(_localctx, 350, RULE_element); try { - setState(1804); + setState(1810); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12631,6 +12682,8 @@ public final ElementContext element() throws RecognitionException { case WRITEPERM: case NOPERM: case TRUSTED: + case OPAQUE: + case REVEAL: case FUNC: case INTERFACE: case MAP: @@ -12659,14 +12712,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1802); + setState(1808); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1803); + setState(1809); literalValue(); } break; @@ -12720,27 +12773,27 @@ public final StructTypeContext structType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1806); + setState(1812); match(STRUCT); - setState(1807); - match(L_CURLY); setState(1813); + match(L_CURLY); + setState(1819); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1808); + setState(1814); fieldDecl(); - setState(1809); + setState(1815); eos(); } } - setState(1815); + setState(1821); _errHandler.sync(this); _la = _input.LA(1); } - setState(1816); + setState(1822); match(R_CURLY); } } @@ -12787,30 +12840,30 @@ public final FieldDeclContext fieldDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1822); + setState(1828); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) { case 1: { - setState(1818); + setState(1824); identifierList(); - setState(1819); + setState(1825); type_(); } break; case 2: { - setState(1821); + setState(1827); embeddedField(); } break; } - setState(1825); + setState(1831); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { case 1: { - setState(1824); + setState(1830); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -12850,7 +12903,7 @@ public final String_Context string_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1827); + setState(1833); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -12897,17 +12950,17 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1830); + setState(1836); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1829); + setState(1835); match(STAR); } } - setState(1832); + setState(1838); typeName(); } } @@ -12946,11 +12999,11 @@ public final IndexContext index() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1834); + setState(1840); match(L_BRACKET); - setState(1835); + setState(1841); expression(0); - setState(1836); + setState(1842); match(R_BRACKET); } } @@ -12990,13 +13043,13 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1838); + setState(1844); match(DOT); - setState(1839); + setState(1845); match(L_PAREN); - setState(1840); + setState(1846); type_(); - setState(1841); + setState(1847); match(R_PAREN); } } @@ -13044,34 +13097,34 @@ public final ArgumentsContext arguments() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1843); + setState(1849); match(L_PAREN); - setState(1858); + setState(1864); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { { - setState(1850); + setState(1856); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,189,_ctx) ) { case 1: { - setState(1844); + setState(1850); expressionList(); } break; case 2: { - setState(1845); + setState(1851); nonNamedType(); - setState(1848); + setState(1854); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,188,_ctx) ) { case 1: { - setState(1846); + setState(1852); match(COMMA); - setState(1847); + setState(1853); expressionList(); } break; @@ -13079,22 +13132,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1853); + setState(1859); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1852); + setState(1858); match(ELLIPSIS); } } - setState(1856); + setState(1862); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1855); + setState(1861); match(COMMA); } } @@ -13102,7 +13155,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1860); + setState(1866); match(R_PAREN); } } @@ -13141,11 +13194,11 @@ public final MethodExprContext methodExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1862); + setState(1868); nonNamedType(); - setState(1863); + setState(1869); match(DOT); - setState(1864); + setState(1870); match(IDENTIFIER); } } @@ -13182,7 +13235,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1866); + setState(1872); type_(); } } @@ -13217,34 +13270,34 @@ public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); enterRule(_localctx, 370, RULE_eos); try { - setState(1872); + setState(1878); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,193,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1868); + setState(1874); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1869); + setState(1875); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1870); + setState(1876); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1871); + setState(1877); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; @@ -13302,17 +13355,17 @@ private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { private boolean primaryExpr_sempred(PrimaryExprContext _localctx, int predIndex) { switch (predIndex) { case 10: - return precpred(_ctx, 9); + return precpred(_ctx, 10); case 11: - return precpred(_ctx, 8); + return precpred(_ctx, 9); case 12: - return precpred(_ctx, 7); + return precpred(_ctx, 8); case 13: - return precpred(_ctx, 6); + return precpred(_ctx, 7); case 14: - return precpred(_ctx, 5); + return precpred(_ctx, 6); case 15: - return precpred(_ctx, 4); + return precpred(_ctx, 5); case 16: return precpred(_ctx, 3); case 17: @@ -13336,7 +13389,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a0\u0753\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a2\u0759\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -13436,145 +13489,146 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { ",\f,\u02d4\t,\u0001,\u0001,\u0001-\u0003-\u02d9\b-\u0001-\u0001-\u0001"+ ".\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u02ed\b/\u00010\u00010\u0001"+ - "0\u00010\u00010\u00030\u02f4\b0\u00010\u00050\u02f7\b0\n0\f0\u02fa\t0"+ - "\u00010\u00010\u00030\u02fe\b0\u00011\u00011\u00011\u00011\u00011\u0001"+ - "1\u00011\u00011\u00031\u0308\b1\u00012\u00032\u030b\b2\u00012\u00012\u0003"+ - "2\u030f\b2\u00013\u00013\u00033\u0313\b3\u00014\u00014\u00014\u00014\u0005"+ - "4\u0319\b4\n4\f4\u031c\t4\u00014\u00014\u00015\u00015\u00015\u00035\u0323"+ - "\b5\u00016\u00016\u00016\u00036\u0328\b6\u00017\u00017\u00017\u00017\u0001"+ - "7\u00017\u00037\u0330\b7\u00037\u0332\b7\u00017\u00017\u00017\u00037\u0337"+ - "\b7\u00018\u00018\u00018\u00058\u033c\b8\n8\f8\u033f\t8\u00019\u00019"+ - "\u00019\u00019\u00019\u00039\u0346\b9\u00019\u00039\u0349\b9\u00019\u0001"+ - "9\u0001:\u0001:\u0003:\u034f\b:\u0001:\u0001:\u0001:\u0003:\u0354\b:\u0003"+ - ":\u0356\b:\u0001:\u0003:\u0359\b:\u0001;\u0001;\u0001;\u0005;\u035e\b"+ - ";\n;\f;\u0361\t;\u0001<\u0001<\u0003<\u0365\b<\u0001<\u0001<\u0001=\u0001"+ - "=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ - ">\u0001>\u0005>\u0376\b>\n>\f>\u0379\t>\u0001>\u0001>\u0001>\u0005>\u037e"+ - "\b>\n>\f>\u0381\t>\u0001>\u0003>\u0384\b>\u0001?\u0003?\u0387\b?\u0001"+ - "?\u0001?\u0001?\u0001?\u0003?\u038d\b?\u0001@\u0001@\u0003@\u0391\b@\u0001"+ - "@\u0003@\u0394\b@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001"+ - "A\u0003A\u039e\bA\u0001B\u0001B\u0001B\u0001B\u0001B\u0003B\u03a5\bB\u0001"+ - "C\u0001C\u0001C\u0001C\u0001C\u0003C\u03ac\bC\u0001C\u0001C\u0001D\u0001"+ - "D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0003E\u03b8\bE\u0001F\u0001"+ - "F\u0001F\u0001F\u0003F\u03be\bF\u0001G\u0001G\u0001G\u0001G\u0001G\u0003"+ - "G\u03c5\bG\u0001H\u0001H\u0001H\u0003H\u03ca\bH\u0001I\u0001I\u0001I\u0001"+ - "I\u0003I\u03d0\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001"+ - "K\u0001K\u0001K\u0003K\u03dc\bK\u0001L\u0001L\u0001L\u0001L\u0003L\u03e2"+ - "\bL\u0001L\u0001L\u0003L\u03e6\bL\u0001M\u0001M\u0001M\u0001M\u0001N\u0001"+ - "N\u0003N\u03ee\bN\u0001N\u0001N\u0003N\u03f2\bN\u0001N\u0001N\u0001O\u0001"+ - "O\u0003O\u03f8\bO\u0001P\u0003P\u03fb\bP\u0001P\u0001P\u0001Q\u0001Q\u0003"+ - "Q\u0401\bQ\u0001Q\u0001Q\u0001R\u0003R\u0406\bR\u0001R\u0001R\u0001S\u0001"+ + "0\u00010\u00010\u00010\u00010\u00030\u02f6\b0\u00010\u00050\u02f9\b0\n"+ + "0\f0\u02fc\t0\u00010\u00010\u00030\u0300\b0\u00011\u00011\u00011\u0001"+ + "1\u00011\u00011\u00011\u00011\u00031\u030a\b1\u00012\u00032\u030d\b2\u0001"+ + "2\u00012\u00032\u0311\b2\u00013\u00013\u00033\u0315\b3\u00014\u00014\u0001"+ + "4\u00014\u00054\u031b\b4\n4\f4\u031e\t4\u00014\u00014\u00015\u00015\u0001"+ + "5\u00035\u0325\b5\u00016\u00016\u00016\u00036\u032a\b6\u00017\u00017\u0001"+ + "7\u00017\u00017\u00017\u00037\u0332\b7\u00037\u0334\b7\u00017\u00017\u0001"+ + "7\u00037\u0339\b7\u00018\u00018\u00018\u00058\u033e\b8\n8\f8\u0341\t8"+ + "\u00019\u00019\u00019\u00019\u00019\u00039\u0348\b9\u00019\u00039\u034b"+ + "\b9\u00019\u00019\u0001:\u0001:\u0003:\u0351\b:\u0001:\u0001:\u0001:\u0003"+ + ":\u0356\b:\u0003:\u0358\b:\u0001:\u0003:\u035b\b:\u0001;\u0001;\u0001"+ + ";\u0005;\u0360\b;\n;\f;\u0363\t;\u0001<\u0001<\u0003<\u0367\b<\u0001<"+ + "\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0005>\u0378\b>\n>\f>\u037b\t>\u0001>\u0001"+ + ">\u0001>\u0005>\u0380\b>\n>\f>\u0383\t>\u0001>\u0003>\u0386\b>\u0001?"+ + "\u0003?\u0389\b?\u0001?\u0001?\u0001?\u0001?\u0003?\u038f\b?\u0001@\u0001"+ + "@\u0003@\u0393\b@\u0001@\u0003@\u0396\b@\u0001@\u0001@\u0001@\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0003A\u03a0\bA\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0003B\u03a7\bB\u0001C\u0001C\u0001C\u0001C\u0001C\u0003C\u03ae\bC\u0001"+ + "C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0003"+ + "E\u03ba\bE\u0001F\u0001F\u0001F\u0001F\u0003F\u03c0\bF\u0001G\u0001G\u0001"+ + "G\u0001G\u0001G\u0003G\u03c7\bG\u0001H\u0001H\u0001H\u0003H\u03cc\bH\u0001"+ + "I\u0001I\u0001I\u0001I\u0003I\u03d2\bI\u0001J\u0001J\u0001J\u0001J\u0001"+ + "J\u0001K\u0001K\u0001K\u0001K\u0001K\u0003K\u03de\bK\u0001L\u0001L\u0001"+ + "L\u0001L\u0003L\u03e4\bL\u0001L\u0001L\u0003L\u03e8\bL\u0001M\u0001M\u0001"+ + "M\u0001M\u0001N\u0001N\u0003N\u03f0\bN\u0001N\u0001N\u0003N\u03f4\bN\u0001"+ + "N\u0001N\u0001O\u0001O\u0003O\u03fa\bO\u0001P\u0003P\u03fd\bP\u0001P\u0001"+ + "P\u0001Q\u0001Q\u0003Q\u0403\bQ\u0001Q\u0001Q\u0001R\u0003R\u0408\bR\u0001"+ + "R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0003"+ - "S\u041f\bS\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0003S\u0421\bS\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0005S\u0442\bS\nS\fS\u0445\tS\u0001T\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0005S\u0444\bS\nS"+ + "\fS\u0447\tS\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ "T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ - "T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0003T\u045b"+ - "\bT\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0003V\u0463\bV\u0001W\u0001"+ - "W\u0001W\u0001X\u0001X\u0001X\u0001X\u0005X\u046c\bX\nX\fX\u046f\tX\u0001"+ - "X\u0001X\u0001X\u0001X\u0003X\u0475\bX\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0003Y\u047c\bY\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0003Z\u0486\bZ\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001[\u0003[\u0494\b[\u0001[\u0001[\u0001[\u0001"+ + "T\u0001T\u0003T\u045d\bT\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0003"+ + "V\u0465\bV\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0005X\u046e"+ + "\bX\nX\fX\u0471\tX\u0001X\u0001X\u0001X\u0001X\u0003X\u0477\bX\u0001Y"+ + "\u0001Y\u0001Y\u0001Y\u0001Y\u0003Y\u047e\bY\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003Z\u0488\bZ\u0001[\u0001[\u0001[\u0001"+ + "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ + "[\u0001[\u0001[\u0003[\u049a\b[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0005[\u04aa\b[\n[\f[\u04ad"+ - "\t[\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0003]\u04b4\b]\u0001]\u0001"+ - "]\u0003]\u04b8\b]\u0001^\u0001^\u0003^\u04bc\b^\u0001^\u0003^\u04bf\b"+ - "^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0003_\u04c8\b_\u0001"+ - "_\u0001_\u0005_\u04cc\b_\n_\f_\u04cf\t_\u0001_\u0001_\u0001`\u0001`\u0001"+ - "`\u0001`\u0001a\u0003a\u04d8\ba\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ - "a\u0003a\u04e0\ba\u0001a\u0001a\u0001a\u0001a\u0003a\u04e6\ba\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003b\u04ef\bb\u0001c\u0001c\u0001"+ - "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0003c\u04fa\bc\u0001d\u0001"+ - "d\u0001d\u0001e\u0001e\u0001e\u0001e\u0005e\u0503\be\ne\fe\u0506\te\u0001"+ - "e\u0003e\u0509\be\u0003e\u050b\be\u0001e\u0001e\u0001f\u0001f\u0001f\u0001"+ - "f\u0001f\u0001f\u0001f\u0003f\u0516\bf\u0001g\u0001g\u0001g\u0001g\u0001"+ - "g\u0001h\u0001h\u0003h\u051f\bh\u0001h\u0001h\u0003h\u0523\bh\u0001h\u0003"+ - "h\u0526\bh\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u052d\bh\u0001h\u0001"+ - "h\u0001i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001l\u0003l\u0538\bl\u0001"+ - "l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0003m\u0542\bm\u0001"+ - "m\u0001m\u0001m\u0001m\u0003m\u0548\bm\u0003m\u054a\bm\u0001n\u0001n\u0001"+ - "n\u0001o\u0001o\u0001p\u0001p\u0001p\u0003p\u0554\bp\u0001q\u0001q\u0001"+ - "q\u0001q\u0001q\u0001q\u0005q\u055c\bq\nq\fq\u055f\tq\u0001q\u0003q\u0562"+ - "\bq\u0001r\u0001r\u0003r\u0566\br\u0001r\u0001r\u0003r\u056a\br\u0001"+ - "s\u0001s\u0001s\u0005s\u056f\bs\ns\fs\u0572\ts\u0001t\u0001t\u0001t\u0005"+ - "t\u0577\bt\nt\ft\u057a\tt\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0005"+ - "u\u0582\bu\nu\fu\u0585\tu\u0001u\u0003u\u0588\bu\u0001v\u0001v\u0003v"+ - "\u058c\bv\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0005"+ - "w\u0596\bw\nw\fw\u0599\tw\u0001w\u0003w\u059c\bw\u0001x\u0001x\u0003x"+ - "\u05a0\bx\u0001x\u0001x\u0001y\u0003y\u05a5\by\u0001y\u0003y\u05a8\by"+ - "\u0001y\u0003y\u05ab\by\u0001y\u0001y\u0001y\u0004y\u05b0\by\u000by\f"+ - "y\u05b1\u0001z\u0001z\u0001z\u0001z\u0001z\u0003z\u05b9\bz\u0001{\u0001"+ - "{\u0001|\u0001|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001~\u0001~\u0001"+ - "~\u0001~\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0003"+ - "\u0080\u05cd\b\u0080\u0001\u0081\u0001\u0081\u0003\u0081\u05d1\b\u0081"+ - "\u0001\u0082\u0001\u0082\u0003\u0082\u05d5\b\u0082\u0001\u0083\u0001\u0083"+ - "\u0003\u0083\u05d9\b\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085"+ - "\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086"+ - "\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u05e9\b\u0086"+ - "\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u05ef\b\u0086"+ - "\u0003\u0086\u05f1\b\u0086\u0001\u0087\u0001\u0087\u0003\u0087\u05f5\b"+ - "\u0087\u0001\u0088\u0001\u0088\u0003\u0088\u05f9\b\u0088\u0001\u0088\u0003"+ - "\u0088\u05fc\b\u0088\u0001\u0088\u0001\u0088\u0003\u0088\u0600\b\u0088"+ - "\u0003\u0088\u0602\b\u0088\u0001\u0088\u0001\u0088\u0005\u0088\u0606\b"+ - "\u0088\n\u0088\f\u0088\u0609\t\u0088\u0001\u0088\u0001\u0088\u0001\u0089"+ - "\u0001\u0089\u0001\u0089\u0003\u0089\u0610\b\u0089\u0001\u008a\u0001\u008a"+ - "\u0001\u008a\u0003\u008a\u0615\b\u008a\u0001\u008b\u0001\u008b\u0001\u008b"+ - "\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b"+ - "\u0003\u008b\u0620\b\u008b\u0001\u008b\u0001\u008b\u0005\u008b\u0624\b"+ - "\u008b\n\u008b\f\u008b\u0627\t\u008b\u0001\u008b\u0001\u008b\u0001\u008c"+ - "\u0001\u008c\u0003\u008c\u062d\b\u008c\u0001\u008c\u0001\u008c\u0001\u008c"+ - "\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d"+ - "\u0003\u008d\u0638\b\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e"+ - "\u063d\b\u008e\u0001\u008f\u0001\u008f\u0003\u008f\u0641\b\u008f\u0001"+ - "\u008f\u0001\u008f\u0001\u008f\u0003\u008f\u0646\b\u008f\u0005\u008f\u0648"+ - "\b\u008f\n\u008f\f\u008f\u064b\t\u008f\u0001\u0090\u0001\u0090\u0001\u0090"+ - "\u0005\u0090\u0650\b\u0090\n\u0090\f\u0090\u0653\t\u0090\u0001\u0090\u0001"+ - "\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u065a\b\u0091\u0001"+ - "\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u065f\b\u0092\u0001\u0092\u0003"+ - "\u0092\u0662\b\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+ - "\u0093\u0001\u0093\u0003\u0093\u066a\b\u0093\u0001\u0093\u0001\u0093\u0001"+ - "\u0094\u0001\u0094\u0003\u0094\u0670\b\u0094\u0001\u0094\u0001\u0094\u0003"+ - "\u0094\u0674\b\u0094\u0003\u0094\u0676\b\u0094\u0001\u0094\u0001\u0094"+ - "\u0001\u0095\u0003\u0095\u067b\b\u0095\u0001\u0095\u0001\u0095\u0003\u0095"+ - "\u067f\b\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u0683\b\u0095\u0001"+ - "\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0003\u0097\u068a"+ - "\b\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ - "\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001"+ - "\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001"+ - "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001"+ - "\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0003\u009e\u06a7\b\u009e\u0001"+ - "\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001"+ - "\u00a0\u0001\u00a0\u0001\u00a0\u0003\u00a0\u06b2\b\u00a0\u0001\u00a1\u0001"+ - "\u00a1\u0003\u00a1\u06b6\b\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ - "\u00a2\u0005\u00a2\u06bc\b\u00a2\n\u00a2\f\u00a2\u06bf\t\u00a2\u0001\u00a2"+ - "\u0003\u00a2\u06c2\b\u00a2\u0003\u00a2\u06c4\b\u00a2\u0001\u00a2\u0001"+ - "\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0003\u00a3\u06cc"+ - "\b\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ - "\u00a4\u0001\u00a4\u0003\u00a4\u06d5\b\u00a4\u0001\u00a5\u0001\u00a5\u0001"+ - "\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06dd\b\u00a5\u0001"+ - "\u00a6\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06e2\b\u00a6\u0001\u00a7\u0001"+ - "\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001"+ - "\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001"+ - "\u00ab\u0003\u00ab\u06f2\b\u00ab\u0003\u00ab\u06f4\b\u00ab\u0001\u00ab"+ - "\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0005\u00ac\u06fb\b\u00ac"+ - "\n\u00ac\f\u00ac\u06fe\t\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003"+ - "\u00ad\u0703\b\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0003"+ - "\u00ae\u0709\b\u00ae\u0001\u00af\u0001\u00af\u0003\u00af\u070d\b\u00af"+ + "[\u0001[\u0001[\u0001[\u0001[\u0005[\u04b0\b[\n[\f[\u04b3\t[\u0001\\\u0001"+ + "\\\u0001\\\u0001]\u0001]\u0003]\u04ba\b]\u0001]\u0001]\u0003]\u04be\b"+ + "]\u0001^\u0001^\u0003^\u04c2\b^\u0001^\u0003^\u04c5\b^\u0001^\u0001^\u0001"+ + "_\u0001_\u0001_\u0001_\u0001_\u0003_\u04ce\b_\u0001_\u0001_\u0005_\u04d2"+ + "\b_\n_\f_\u04d5\t_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001a\u0003"+ + "a\u04de\ba\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0003a\u04e6\ba\u0001"+ + "a\u0001a\u0001a\u0001a\u0003a\u04ec\ba\u0001b\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0003b\u04f5\bb\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ + "c\u0001c\u0001c\u0001c\u0003c\u0500\bc\u0001d\u0001d\u0001d\u0001e\u0001"+ + "e\u0001e\u0001e\u0005e\u0509\be\ne\fe\u050c\te\u0001e\u0003e\u050f\be"+ + "\u0003e\u0511\be\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001f\u0001"+ + "f\u0001f\u0003f\u051c\bf\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001"+ + "h\u0003h\u0525\bh\u0001h\u0001h\u0003h\u0529\bh\u0001h\u0003h\u052c\b"+ + "h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u0533\bh\u0001h\u0001h\u0001"+ + "i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001l\u0003l\u053e\bl\u0001l\u0001"+ + "l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0003m\u0548\bm\u0001m\u0001"+ + "m\u0001m\u0001m\u0003m\u054e\bm\u0003m\u0550\bm\u0001n\u0001n\u0001n\u0001"+ + "o\u0001o\u0001p\u0001p\u0001p\u0003p\u055a\bp\u0001q\u0001q\u0001q\u0001"+ + "q\u0001q\u0001q\u0005q\u0562\bq\nq\fq\u0565\tq\u0001q\u0003q\u0568\bq"+ + "\u0001r\u0001r\u0003r\u056c\br\u0001r\u0001r\u0003r\u0570\br\u0001s\u0001"+ + "s\u0001s\u0005s\u0575\bs\ns\fs\u0578\ts\u0001t\u0001t\u0001t\u0005t\u057d"+ + "\bt\nt\ft\u0580\tt\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0005u\u0588"+ + "\bu\nu\fu\u058b\tu\u0001u\u0003u\u058e\bu\u0001v\u0001v\u0003v\u0592\b"+ + "v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0005w\u059c"+ + "\bw\nw\fw\u059f\tw\u0001w\u0003w\u05a2\bw\u0001x\u0001x\u0003x\u05a6\b"+ + "x\u0001x\u0001x\u0001y\u0003y\u05ab\by\u0001y\u0003y\u05ae\by\u0001y\u0003"+ + "y\u05b1\by\u0001y\u0001y\u0001y\u0004y\u05b6\by\u000by\fy\u05b7\u0001"+ + "z\u0001z\u0001z\u0001z\u0001z\u0003z\u05bf\bz\u0001{\u0001{\u0001|\u0001"+ + "|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001"+ + "\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0003\u0080\u05d3"+ + "\b\u0080\u0001\u0081\u0001\u0081\u0003\u0081\u05d7\b\u0081\u0001\u0082"+ + "\u0001\u0082\u0003\u0082\u05db\b\u0082\u0001\u0083\u0001\u0083\u0003\u0083"+ + "\u05df\b\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085"+ + "\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086"+ + "\u0001\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u05ef\b\u0086\u0001\u0086"+ + "\u0001\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u05f5\b\u0086\u0003\u0086"+ + "\u05f7\b\u0086\u0001\u0087\u0001\u0087\u0003\u0087\u05fb\b\u0087\u0001"+ + "\u0088\u0001\u0088\u0003\u0088\u05ff\b\u0088\u0001\u0088\u0003\u0088\u0602"+ + "\b\u0088\u0001\u0088\u0001\u0088\u0003\u0088\u0606\b\u0088\u0003\u0088"+ + "\u0608\b\u0088\u0001\u0088\u0001\u0088\u0005\u0088\u060c\b\u0088\n\u0088"+ + "\f\u0088\u060f\t\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089"+ + "\u0001\u0089\u0003\u0089\u0616\b\u0089\u0001\u008a\u0001\u008a\u0001\u008a"+ + "\u0003\u008a\u061b\b\u008a\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b"+ + "\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0003\u008b"+ + "\u0626\b\u008b\u0001\u008b\u0001\u008b\u0005\u008b\u062a\b\u008b\n\u008b"+ + "\f\u008b\u062d\t\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c"+ + "\u0003\u008c\u0633\b\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c"+ + "\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0003\u008d"+ + "\u063e\b\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u0643\b"+ + "\u008e\u0001\u008f\u0001\u008f\u0003\u008f\u0647\b\u008f\u0001\u008f\u0001"+ + "\u008f\u0001\u008f\u0003\u008f\u064c\b\u008f\u0005\u008f\u064e\b\u008f"+ + "\n\u008f\f\u008f\u0651\t\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0005"+ + "\u0090\u0656\b\u0090\n\u0090\f\u0090\u0659\t\u0090\u0001\u0090\u0001\u0090"+ + "\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u0660\b\u0091\u0001\u0092"+ + "\u0001\u0092\u0001\u0092\u0003\u0092\u0665\b\u0092\u0001\u0092\u0003\u0092"+ + "\u0668\b\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093"+ + "\u0001\u0093\u0003\u0093\u0670\b\u0093\u0001\u0093\u0001\u0093\u0001\u0094"+ + "\u0001\u0094\u0003\u0094\u0676\b\u0094\u0001\u0094\u0001\u0094\u0003\u0094"+ + "\u067a\b\u0094\u0003\u0094\u067c\b\u0094\u0001\u0094\u0001\u0094\u0001"+ + "\u0095\u0003\u0095\u0681\b\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u0685"+ + "\b\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u0689\b\u0095\u0001\u0096"+ + "\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0003\u0097\u0690\b\u0097"+ + "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099"+ + "\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b"+ + "\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d"+ + "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e"+ + "\u0001\u009e\u0001\u009e\u0001\u009e\u0003\u009e\u06ad\b\u009e\u0001\u009e"+ + "\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0"+ + "\u0001\u00a0\u0001\u00a0\u0003\u00a0\u06b8\b\u00a0\u0001\u00a1\u0001\u00a1"+ + "\u0003\u00a1\u06bc\b\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2"+ + "\u0005\u00a2\u06c2\b\u00a2\n\u00a2\f\u00a2\u06c5\t\u00a2\u0001\u00a2\u0003"+ + "\u00a2\u06c8\b\u00a2\u0003\u00a2\u06ca\b\u00a2\u0001\u00a2\u0001\u00a2"+ + "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0003\u00a3\u06d2\b\u00a3"+ + "\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4"+ + "\u0001\u00a4\u0003\u00a4\u06db\b\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06e3\b\u00a5\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06e8\b\u00a6\u0001\u00a7\u0001\u00a7"+ + "\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9"+ + "\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ + "\u0003\u00ab\u06f8\b\u00ab\u0003\u00ab\u06fa\b\u00ab\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0005\u00ac\u0701\b\u00ac\n"+ + "\u00ac\f\u00ac\u0704\t\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003"+ + "\u00ad\u0709\b\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0003"+ + "\u00ae\u070f\b\u00ae\u0001\u00af\u0001\u00af\u0003\u00af\u0713\b\u00af"+ "\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0005\u00b0"+ - "\u0714\b\u00b0\n\u00b0\f\u00b0\u0717\t\u00b0\u0001\u00b0\u0001\u00b0\u0001"+ - "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0003\u00b1\u071f\b\u00b1\u0001"+ - "\u00b1\u0003\u00b1\u0722\b\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0003"+ - "\u00b3\u0727\b\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ + "\u071a\b\u00b0\n\u00b0\f\u00b0\u071d\t\u00b0\u0001\u00b0\u0001\u00b0\u0001"+ + "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0003\u00b1\u0725\b\u00b1\u0001"+ + "\u00b1\u0003\u00b1\u0728\b\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0003"+ + "\u00b3\u072d\b\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ "\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001"+ "\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0003"+ - "\u00b6\u0739\b\u00b6\u0003\u00b6\u073b\b\u00b6\u0001\u00b6\u0003\u00b6"+ - "\u073e\b\u00b6\u0001\u00b6\u0003\u00b6\u0741\b\u00b6\u0003\u00b6\u0743"+ + "\u00b6\u073f\b\u00b6\u0003\u00b6\u0741\b\u00b6\u0001\u00b6\u0003\u00b6"+ + "\u0744\b\u00b6\u0001\u00b6\u0003\u00b6\u0747\b\u00b6\u0003\u00b6\u0749"+ "\b\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001"+ "\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001"+ - "\u00b9\u0003\u00b9\u0751\b\u00b9\u0001\u00b9\u0001\u02f8\u0002\u00a6\u00b6"+ + "\u00b9\u0003\u00b9\u0757\b\u00b9\u0001\u00b9\u0001\u02fa\u0002\u00a6\u00b6"+ "\u00ba\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+ @@ -13587,959 +13641,963 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140"+ "\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158"+ "\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170"+ - "\u0172\u0000\u0013\u0002\u0000eepp\u0001\u0000\u0017\u0018\u0001\u0000"+ - "\u0005\b\u0001\u0000AB\u0001\u0000(*\u0002\u0000(*,,\u0001\u0000\u0083"+ - "\u0089\u0001\u0000\u0014\u0015\u0002\u0000~\u0082\u0087\u0088\u0004\u0000"+ - "##qq}}\u0084\u0086\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000"+ - "HIw|\u0004\u0000--0033]]\u0002\u0000}\u0082\u0084\u0088\u0001\u0000qr"+ - "\u0002\u0000nn\u009f\u009f\u0002\u0000\u008a\u008d\u008f\u0090\u0001\u0000"+ - "\u0096\u0097\u07bc\u0000\u0174\u0001\u0000\u0000\u0000\u0002\u0177\u0001"+ - "\u0000\u0000\u0000\u0004\u017a\u0001\u0000\u0000\u0000\u0006\u017d\u0001"+ - "\u0000\u0000\u0000\b\u0185\u0001\u0000\u0000\u0000\n\u018e\u0001\u0000"+ - "\u0000\u0000\f\u01ae\u0001\u0000\u0000\u0000\u000e\u01bb\u0001\u0000\u0000"+ - "\u0000\u0010\u01be\u0001\u0000\u0000\u0000\u0012\u01c6\u0001\u0000\u0000"+ - "\u0000\u0014\u01d3\u0001\u0000\u0000\u0000\u0016\u01e9\u0001\u0000\u0000"+ - "\u0000\u0018\u01f2\u0001\u0000\u0000\u0000\u001a\u01f4\u0001\u0000\u0000"+ - "\u0000\u001c\u01f6\u0001\u0000\u0000\u0000\u001e\u01f9\u0001\u0000\u0000"+ - "\u0000 \u020d\u0001\u0000\u0000\u0000\"\u020f\u0001\u0000\u0000\u0000"+ - "$\u0211\u0001\u0000\u0000\u0000&\u0216\u0001\u0000\u0000\u0000(\u0221"+ - "\u0001\u0000\u0000\u0000*\u022e\u0001\u0000\u0000\u0000,\u0231\u0001\u0000"+ - "\u0000\u0000.\u023c\u0001\u0000\u0000\u00000\u023e\u0001\u0000\u0000\u0000"+ - "2\u0243\u0001\u0000\u0000\u00004\u0248\u0001\u0000\u0000\u00006\u024d"+ - "\u0001\u0000\u0000\u00008\u0252\u0001\u0000\u0000\u0000:\u025f\u0001\u0000"+ - "\u0000\u0000<\u0261\u0001\u0000\u0000\u0000>\u0263\u0001\u0000\u0000\u0000"+ - "@\u0268\u0001\u0000\u0000\u0000B\u026d\u0001\u0000\u0000\u0000D\u0272"+ - "\u0001\u0000\u0000\u0000F\u027b\u0001\u0000\u0000\u0000H\u0282\u0001\u0000"+ - "\u0000\u0000J\u028f\u0001\u0000\u0000\u0000L\u0293\u0001\u0000\u0000\u0000"+ - "N\u029e\u0001\u0000\u0000\u0000P\u02a6\u0001\u0000\u0000\u0000R\u02a8"+ - "\u0001\u0000\u0000\u0000T\u02bd\u0001\u0000\u0000\u0000V\u02bf\u0001\u0000"+ - "\u0000\u0000X\u02cb\u0001\u0000\u0000\u0000Z\u02d8\u0001\u0000\u0000\u0000"+ - "\\\u02dc\u0001\u0000\u0000\u0000^\u02ec\u0001\u0000\u0000\u0000`\u02f8"+ - "\u0001\u0000\u0000\u0000b\u0307\u0001\u0000\u0000\u0000d\u030a\u0001\u0000"+ - "\u0000\u0000f\u0312\u0001\u0000\u0000\u0000h\u0314\u0001\u0000\u0000\u0000"+ - "j\u031f\u0001\u0000\u0000\u0000l\u0327\u0001\u0000\u0000\u0000n\u0336"+ - "\u0001\u0000\u0000\u0000p\u0338\u0001\u0000\u0000\u0000r\u0340\u0001\u0000"+ - "\u0000\u0000t\u034e\u0001\u0000\u0000\u0000v\u035a\u0001\u0000\u0000\u0000"+ - "x\u0364\u0001\u0000\u0000\u0000z\u0368\u0001\u0000\u0000\u0000|\u036e"+ - "\u0001\u0000\u0000\u0000~\u0386\u0001\u0000\u0000\u0000\u0080\u038e\u0001"+ - "\u0000\u0000\u0000\u0082\u039d\u0001\u0000\u0000\u0000\u0084\u039f\u0001"+ - "\u0000\u0000\u0000\u0086\u03a6\u0001\u0000\u0000\u0000\u0088\u03af\u0001"+ - "\u0000\u0000\u0000\u008a\u03b4\u0001\u0000\u0000\u0000\u008c\u03b9\u0001"+ - "\u0000\u0000\u0000\u008e\u03bf\u0001\u0000\u0000\u0000\u0090\u03c6\u0001"+ - "\u0000\u0000\u0000\u0092\u03cb\u0001\u0000\u0000\u0000\u0094\u03d1\u0001"+ - "\u0000\u0000\u0000\u0096\u03d6\u0001\u0000\u0000\u0000\u0098\u03dd\u0001"+ - "\u0000\u0000\u0000\u009a\u03e7\u0001\u0000\u0000\u0000\u009c\u03eb\u0001"+ - "\u0000\u0000\u0000\u009e\u03f7\u0001\u0000\u0000\u0000\u00a0\u03fa\u0001"+ - "\u0000\u0000\u0000\u00a2\u03fe\u0001\u0000\u0000\u0000\u00a4\u0405\u0001"+ - "\u0000\u0000\u0000\u00a6\u041e\u0001\u0000\u0000\u0000\u00a8\u045a\u0001"+ - "\u0000\u0000\u0000\u00aa\u045c\u0001\u0000\u0000\u0000\u00ac\u045f\u0001"+ - "\u0000\u0000\u0000\u00ae\u0464\u0001\u0000\u0000\u0000\u00b0\u046d\u0001"+ - "\u0000\u0000\u0000\u00b2\u047b\u0001\u0000\u0000\u0000\u00b4\u0485\u0001"+ - "\u0000\u0000\u0000\u00b6\u0493\u0001\u0000\u0000\u0000\u00b8\u04ae\u0001"+ - "\u0000\u0000\u0000\u00ba\u04b1\u0001\u0000\u0000\u0000\u00bc\u04b9\u0001"+ - "\u0000\u0000\u0000\u00be\u04c2\u0001\u0000\u0000\u0000\u00c0\u04d2\u0001"+ - "\u0000\u0000\u0000\u00c2\u04e5\u0001\u0000\u0000\u0000\u00c4\u04ee\u0001"+ - "\u0000\u0000\u0000\u00c6\u04f9\u0001\u0000\u0000\u0000\u00c8\u04fb\u0001"+ - "\u0000\u0000\u0000\u00ca\u04fe\u0001\u0000\u0000\u0000\u00cc\u0515\u0001"+ - "\u0000\u0000\u0000\u00ce\u0517\u0001\u0000\u0000\u0000\u00d0\u051c\u0001"+ - "\u0000\u0000\u0000\u00d2\u0530\u0001\u0000\u0000\u0000\u00d4\u0532\u0001"+ - "\u0000\u0000\u0000\u00d6\u0534\u0001\u0000\u0000\u0000\u00d8\u0537\u0001"+ - "\u0000\u0000\u0000\u00da\u0541\u0001\u0000\u0000\u0000\u00dc\u054b\u0001"+ - "\u0000\u0000\u0000\u00de\u054e\u0001\u0000\u0000\u0000\u00e0\u0553\u0001"+ - "\u0000\u0000\u0000\u00e2\u0555\u0001\u0000\u0000\u0000\u00e4\u0563\u0001"+ - "\u0000\u0000\u0000\u00e6\u056b\u0001\u0000\u0000\u0000\u00e8\u0573\u0001"+ - "\u0000\u0000\u0000\u00ea\u057b\u0001\u0000\u0000\u0000\u00ec\u0589\u0001"+ - "\u0000\u0000\u0000\u00ee\u058f\u0001\u0000\u0000\u0000\u00f0\u059d\u0001"+ - "\u0000\u0000\u0000\u00f2\u05af\u0001\u0000\u0000\u0000\u00f4\u05b8\u0001"+ - "\u0000\u0000\u0000\u00f6\u05ba\u0001\u0000\u0000\u0000\u00f8\u05bc\u0001"+ - "\u0000\u0000\u0000\u00fa\u05c0\u0001\u0000\u0000\u0000\u00fc\u05c3\u0001"+ - "\u0000\u0000\u0000\u00fe\u05c7\u0001\u0000\u0000\u0000\u0100\u05c9\u0001"+ - "\u0000\u0000\u0000\u0102\u05ce\u0001\u0000\u0000\u0000\u0104\u05d2\u0001"+ - "\u0000\u0000\u0000\u0106\u05d6\u0001\u0000\u0000\u0000\u0108\u05da\u0001"+ - "\u0000\u0000\u0000\u010a\u05dd\u0001\u0000\u0000\u0000\u010c\u05df\u0001"+ - "\u0000\u0000\u0000\u010e\u05f4\u0001\u0000\u0000\u0000\u0110\u05f6\u0001"+ - "\u0000\u0000\u0000\u0112\u060c\u0001\u0000\u0000\u0000\u0114\u0614\u0001"+ - "\u0000\u0000\u0000\u0116\u0616\u0001\u0000\u0000\u0000\u0118\u062c\u0001"+ - "\u0000\u0000\u0000\u011a\u0634\u0001\u0000\u0000\u0000\u011c\u063c\u0001"+ - "\u0000\u0000\u0000\u011e\u0640\u0001\u0000\u0000\u0000\u0120\u064c\u0001"+ - "\u0000\u0000\u0000\u0122\u0656\u0001\u0000\u0000\u0000\u0124\u0661\u0001"+ - "\u0000\u0000\u0000\u0126\u0669\u0001\u0000\u0000\u0000\u0128\u066d\u0001"+ - "\u0000\u0000\u0000\u012a\u067a\u0001\u0000\u0000\u0000\u012c\u0684\u0001"+ - "\u0000\u0000\u0000\u012e\u0689\u0001\u0000\u0000\u0000\u0130\u068b\u0001"+ - "\u0000\u0000\u0000\u0132\u0690\u0001\u0000\u0000\u0000\u0134\u0692\u0001"+ - "\u0000\u0000\u0000\u0136\u0694\u0001\u0000\u0000\u0000\u0138\u0697\u0001"+ - "\u0000\u0000\u0000\u013a\u069b\u0001\u0000\u0000\u0000\u013c\u06a6\u0001"+ - "\u0000\u0000\u0000\u013e\u06aa\u0001\u0000\u0000\u0000\u0140\u06b1\u0001"+ - "\u0000\u0000\u0000\u0142\u06b5\u0001\u0000\u0000\u0000\u0144\u06b7\u0001"+ - "\u0000\u0000\u0000\u0146\u06c7\u0001\u0000\u0000\u0000\u0148\u06d4\u0001"+ - "\u0000\u0000\u0000\u014a\u06dc\u0001\u0000\u0000\u0000\u014c\u06e1\u0001"+ - "\u0000\u0000\u0000\u014e\u06e3\u0001\u0000\u0000\u0000\u0150\u06e5\u0001"+ - "\u0000\u0000\u0000\u0152\u06e7\u0001\u0000\u0000\u0000\u0154\u06eb\u0001"+ - "\u0000\u0000\u0000\u0156\u06ee\u0001\u0000\u0000\u0000\u0158\u06f7\u0001"+ - "\u0000\u0000\u0000\u015a\u0702\u0001\u0000\u0000\u0000\u015c\u0708\u0001"+ - "\u0000\u0000\u0000\u015e\u070c\u0001\u0000\u0000\u0000\u0160\u070e\u0001"+ - "\u0000\u0000\u0000\u0162\u071e\u0001\u0000\u0000\u0000\u0164\u0723\u0001"+ - "\u0000\u0000\u0000\u0166\u0726\u0001\u0000\u0000\u0000\u0168\u072a\u0001"+ - "\u0000\u0000\u0000\u016a\u072e\u0001\u0000\u0000\u0000\u016c\u0733\u0001"+ - "\u0000\u0000\u0000\u016e\u0746\u0001\u0000\u0000\u0000\u0170\u074a\u0001"+ - "\u0000\u0000\u0000\u0172\u0750\u0001\u0000\u0000\u0000\u0174\u0175\u0003"+ - "\u00a6S\u0000\u0175\u0176\u0005\u0000\u0000\u0001\u0176\u0001\u0001\u0000"+ - "\u0000\u0000\u0177\u0178\u0003\u00a8T\u0000\u0178\u0179\u0005\u0000\u0000"+ - "\u0001\u0179\u0003\u0001\u0000\u0000\u0000\u017a\u017b\u0003\u00c4b\u0000"+ - "\u017b\u017c\u0005\u0000\u0000\u0001\u017c\u0005\u0001\u0000\u0000\u0000"+ - "\u017d\u0182\u0003\b\u0004\u0000\u017e\u017f\u0005m\u0000\u0000\u017f"+ - "\u0181\u0003\b\u0004\u0000\u0180\u017e\u0001\u0000\u0000\u0000\u0181\u0184"+ - "\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0182\u0183"+ - "\u0001\u0000\u0000\u0000\u0183\u0007\u0001\u0000\u0000\u0000\u0184\u0182"+ - "\u0001\u0000\u0000\u0000\u0185\u0187\u0005e\u0000\u0000\u0186\u0188\u0005"+ - "<\u0000\u0000\u0187\u0186\u0001\u0000\u0000\u0000\u0187\u0188\u0001\u0000"+ - "\u0000\u0000\u0188\t\u0001\u0000\u0000\u0000\u0189\u018a\u0003\u000e\u0007"+ - "\u0000\u018a\u018b\u0003\u0172\u00b9\u0000\u018b\u018d\u0001\u0000\u0000"+ - "\u0000\u018c\u0189\u0001\u0000\u0000\u0000\u018d\u0190\u0001\u0000\u0000"+ - "\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000"+ - "\u0000\u018f\u0191\u0001\u0000\u0000\u0000\u0190\u018e\u0001\u0000\u0000"+ - "\u0000\u0191\u0192\u0003\u00dcn\u0000\u0192\u0198\u0003\u0172\u00b9\u0000"+ - "\u0193\u0194\u0003\u0014\n\u0000\u0194\u0195\u0003\u0172\u00b9\u0000\u0195"+ - "\u0197\u0001\u0000\u0000\u0000\u0196\u0193\u0001\u0000\u0000\u0000\u0197"+ - "\u019a\u0001\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0198"+ - "\u0199\u0001\u0000\u0000\u0000\u0199\u01a4\u0001\u0000\u0000\u0000\u019a"+ - "\u0198\u0001\u0000\u0000\u0000\u019b\u019f\u0003\u008aE\u0000\u019c\u019f"+ - "\u0003\u00e0p\u0000\u019d\u019f\u0003\u0016\u000b\u0000\u019e\u019b\u0001"+ - "\u0000\u0000\u0000\u019e\u019c\u0001\u0000\u0000\u0000\u019e\u019d\u0001"+ - "\u0000\u0000\u0000\u019f\u01a0\u0001\u0000\u0000\u0000\u01a0\u01a1\u0003"+ - "\u0172\u00b9\u0000\u01a1\u01a3\u0001\u0000\u0000\u0000\u01a2\u019e\u0001"+ - "\u0000\u0000\u0000\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4\u01a2\u0001"+ - "\u0000\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5\u01a7\u0001"+ - "\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a7\u01a8\u0005"+ - "\u0000\u0000\u0001\u01a8\u000b\u0001\u0000\u0000\u0000\u01a9\u01aa\u0003"+ - "\u000e\u0007\u0000\u01aa\u01ab\u0003\u0172\u00b9\u0000\u01ab\u01ad\u0001"+ - "\u0000\u0000\u0000\u01ac\u01a9\u0001\u0000\u0000\u0000\u01ad\u01b0\u0001"+ - "\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01ae\u01af\u0001"+ - "\u0000\u0000\u0000\u01af\u01b1\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001"+ - "\u0000\u0000\u0000\u01b1\u01b2\u0003\u00dcn\u0000\u01b2\u01b8\u0003\u0172"+ - "\u00b9\u0000\u01b3\u01b4\u0003\u0014\n\u0000\u01b4\u01b5\u0003\u0172\u00b9"+ - "\u0000\u01b5\u01b7\u0001\u0000\u0000\u0000\u01b6\u01b3\u0001\u0000\u0000"+ - "\u0000\u01b7\u01ba\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000"+ - "\u0000\u01b8\u01b9\u0001\u0000\u0000\u0000\u01b9\r\u0001\u0000\u0000\u0000"+ - "\u01ba\u01b8\u0001\u0000\u0000\u0000\u01bb\u01bc\u0005E\u0000\u0000\u01bc"+ - "\u01bd\u0003\u00a6S\u0000\u01bd\u000f\u0001\u0000\u0000\u0000\u01be\u01bf"+ - "\u0005F\u0000\u0000\u01bf\u01c0\u0003\u00a6S\u0000\u01c0\u0011\u0001\u0000"+ - "\u0000\u0000\u01c1\u01c2\u0003\u0010\b\u0000\u01c2\u01c3\u0003\u0172\u00b9"+ - "\u0000\u01c3\u01c5\u0001\u0000\u0000\u0000\u01c4\u01c1\u0001\u0000\u0000"+ - "\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6\u01c4\u0001\u0000\u0000"+ - "\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7\u01ca\u0001\u0000\u0000"+ - "\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9\u01cb\u0007\u0000\u0000"+ - "\u0000\u01ca\u01c9\u0001\u0000\u0000\u0000\u01ca\u01cb\u0001\u0000\u0000"+ - "\u0000\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc\u01cd\u0003\u00deo\u0000"+ - "\u01cd\u0013\u0001\u0000\u0000\u0000\u01ce\u01cf\u0003\u0010\b\u0000\u01cf"+ - "\u01d0\u0003\u0172\u00b9\u0000\u01d0\u01d2\u0001\u0000\u0000\u0000\u01d1"+ - "\u01ce\u0001\u0000\u0000\u0000\u01d2\u01d5\u0001\u0000\u0000\u0000\u01d3"+ - "\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001\u0000\u0000\u0000\u01d4"+ - "\u01e3\u0001\u0000\u0000\u0000\u01d5\u01d3\u0001\u0000\u0000\u0000\u01d6"+ - "\u01d7\u0005a\u0000\u0000\u01d7\u01e4\u0003\u0012\t\u0000\u01d8\u01d9"+ - "\u0005a\u0000\u0000\u01d9\u01df\u0005f\u0000\u0000\u01da\u01db\u0003\u0012"+ - "\t\u0000\u01db\u01dc\u0003\u0172\u00b9\u0000\u01dc\u01de\u0001\u0000\u0000"+ - "\u0000\u01dd\u01da\u0001\u0000\u0000\u0000\u01de\u01e1\u0001\u0000\u0000"+ - "\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df\u01e0\u0001\u0000\u0000"+ - "\u0000\u01e0\u01e2\u0001\u0000\u0000\u0000\u01e1\u01df\u0001\u0000\u0000"+ - "\u0000\u01e2\u01e4\u0005g\u0000\u0000\u01e3\u01d6\u0001\u0000\u0000\u0000"+ - "\u01e3\u01d8\u0001\u0000\u0000\u0000\u01e4\u0015\u0001\u0000\u0000\u0000"+ - "\u01e5\u01ea\u0003|>\u0000\u01e6\u01ea\u0003\u0092I\u0000\u01e7\u01ea"+ - "\u0003\u0096K\u0000\u01e8\u01ea\u0003\u0090H\u0000\u01e9\u01e5\u0001\u0000"+ - "\u0000\u0000\u01e9\u01e6\u0001\u0000\u0000\u0000\u01e9\u01e7\u0001\u0000"+ - "\u0000\u0000\u01e9\u01e8\u0001\u0000\u0000\u0000\u01ea\u0017\u0001\u0000"+ - "\u0000\u0000\u01eb\u01ec\u0005\u001b\u0000\u0000\u01ec\u01f3\u0003\u00a8"+ - "T\u0000\u01ed\u01ee\u0007\u0001\u0000\u0000\u01ee\u01f3\u0003.\u0017\u0000"+ - "\u01ef\u01f0\u0007\u0002\u0000\u0000\u01f0\u01f3\u0003\u00a6S\u0000\u01f1"+ - "\u01f3\u0003h4\u0000\u01f2\u01eb\u0001\u0000\u0000\u0000\u01f2\u01ed\u0001"+ - "\u0000\u0000\u0000\u01f2\u01ef\u0001\u0000\u0000\u0000\u01f2\u01f1\u0001"+ - "\u0000\u0000\u0000\u01f3\u0019\u0001\u0000\u0000\u0000\u01f4\u01f5\u0003"+ - "\u001c\u000e\u0000\u01f5\u001b\u0001\u0000\u0000\u0000\u01f6\u01f7\u0003"+ - "`0\u0000\u01f7\u01f8\u0003\u001e\u000f\u0000\u01f8\u001d\u0001\u0000\u0000"+ - "\u0000\u01f9\u01fa\u0005D\u0000\u0000\u01fa\u01fc\u0005f\u0000\u0000\u01fb"+ - "\u01fd\u0003\u00f2y\u0000\u01fc\u01fb\u0001\u0000\u0000\u0000\u01fc\u01fd"+ - "\u0001\u0000\u0000\u0000\u01fd\u01fe\u0001\u0000\u0000\u0000\u01fe\u01ff"+ - "\u0005g\u0000\u0000\u01ff\u001f\u0001\u0000\u0000\u0000\u0200\u020e\u0003"+ - "F#\u0000\u0201\u020e\u0003D\"\u0000\u0202\u020e\u0003B!\u0000\u0203\u020e"+ - "\u0003$\u0012\u0000\u0204\u020e\u0003@ \u0000\u0205\u020e\u00038\u001c"+ - "\u0000\u0206\u020e\u0003>\u001f\u0000\u0207\u020e\u00036\u001b\u0000\u0208"+ - "\u020e\u00032\u0019\u0000\u0209\u020e\u00030\u0018\u0000\u020a\u020e\u0003"+ - "4\u001a\u0000\u020b\u020e\u0003\"\u0011\u0000\u020c\u020e\u0003H$\u0000"+ - "\u020d\u0200\u0001\u0000\u0000\u0000\u020d\u0201\u0001\u0000\u0000\u0000"+ - "\u020d\u0202\u0001\u0000\u0000\u0000\u020d\u0203\u0001\u0000\u0000\u0000"+ - "\u020d\u0204\u0001\u0000\u0000\u0000\u020d\u0205\u0001\u0000\u0000\u0000"+ - "\u020d\u0206\u0001\u0000\u0000\u0000\u020d\u0207\u0001\u0000\u0000\u0000"+ - "\u020d\u0208\u0001\u0000\u0000\u0000\u020d\u0209\u0001\u0000\u0000\u0000"+ - "\u020d\u020a\u0001\u0000\u0000\u0000\u020d\u020b\u0001\u0000\u0000\u0000"+ - "\u020d\u020c\u0001\u0000\u0000\u0000\u020e!\u0001\u0000\u0000\u0000\u020f"+ - "\u0210\u0007\u0003\u0000\u0000\u0210#\u0001\u0000\u0000\u0000\u0211\u0212"+ - "\u0005^\u0000\u0000\u0212\u0213\u0005j\u0000\u0000\u0213\u0214\u0003\u00c4"+ - "b\u0000\u0214\u0215\u0005k\u0000\u0000\u0215%\u0001\u0000\u0000\u0000"+ - "\u0216\u021b\u0003(\u0014\u0000\u0217\u0218\u0005m\u0000\u0000\u0218\u021a"+ - "\u0003(\u0014\u0000\u0219\u0217\u0001\u0000\u0000\u0000\u021a\u021d\u0001"+ - "\u0000\u0000\u0000\u021b\u0219\u0001\u0000\u0000\u0000\u021b\u021c\u0001"+ - "\u0000\u0000\u0000\u021c\u021f\u0001\u0000\u0000\u0000\u021d\u021b\u0001"+ - "\u0000\u0000\u0000\u021e\u0220\u0005m\u0000\u0000\u021f\u021e\u0001\u0000"+ - "\u0000\u0000\u021f\u0220\u0001\u0000\u0000\u0000\u0220\'\u0001\u0000\u0000"+ - "\u0000\u0221\u0226\u0005e\u0000\u0000\u0222\u0223\u0005m\u0000\u0000\u0223"+ - "\u0225\u0005e\u0000\u0000\u0224\u0222\u0001\u0000\u0000\u0000\u0225\u0228"+ - "\u0001\u0000\u0000\u0000\u0226\u0224\u0001\u0000\u0000\u0000\u0226\u0227"+ - "\u0001\u0000\u0000\u0000\u0227\u0229\u0001\u0000\u0000\u0000\u0228\u0226"+ - "\u0001\u0000\u0000\u0000\u0229\u022a\u0003\u0134\u009a\u0000\u022a)\u0001"+ - "\u0000\u0000\u0000\u022b\u022d\u0003,\u0016\u0000\u022c\u022b\u0001\u0000"+ - "\u0000\u0000\u022d\u0230\u0001\u0000\u0000\u0000\u022e\u022c\u0001\u0000"+ - "\u0000\u0000\u022e\u022f\u0001\u0000\u0000\u0000\u022f+\u0001\u0000\u0000"+ - "\u0000\u0230\u022e\u0001\u0000\u0000\u0000\u0231\u0232\u0005h\u0000\u0000"+ - "\u0232\u0237\u0003\u00a6S\u0000\u0233\u0234\u0005m\u0000\u0000\u0234\u0236"+ - "\u0003\u00a6S\u0000\u0235\u0233\u0001\u0000\u0000\u0000\u0236\u0239\u0001"+ - "\u0000\u0000\u0000\u0237\u0235\u0001\u0000\u0000\u0000\u0237\u0238\u0001"+ - "\u0000\u0000\u0000\u0238\u023a\u0001\u0000\u0000\u0000\u0239\u0237\u0001"+ - "\u0000\u0000\u0000\u023a\u023b\u0005i\u0000\u0000\u023b-\u0001\u0000\u0000"+ - "\u0000\u023c\u023d\u0003\u00b6[\u0000\u023d/\u0001\u0000\u0000\u0000\u023e"+ - "\u023f\u00051\u0000\u0000\u023f\u0240\u0005f\u0000\u0000\u0240\u0241\u0003"+ - "\u00a6S\u0000\u0241\u0242\u0005g\u0000\u0000\u02421\u0001\u0000\u0000"+ - "\u0000\u0243\u0244\u00057\u0000\u0000\u0244\u0245\u0005j\u0000\u0000\u0245"+ - "\u0246\u0003\u00c4b\u0000\u0246\u0247\u0005k\u0000\u0000\u02473\u0001"+ - "\u0000\u0000\u0000\u0248\u0249\u00052\u0000\u0000\u0249\u024a\u0005f\u0000"+ - "\u0000\u024a\u024b\u0003\u00a6S\u0000\u024b\u024c\u0005g\u0000\u0000\u024c"+ - "5\u0001\u0000\u0000\u0000\u024d\u024e\u0007\u0004\u0000\u0000\u024e\u024f"+ - "\u0005f\u0000\u0000\u024f\u0250\u0003\u00a6S\u0000\u0250\u0251\u0005g"+ - "\u0000\u0000\u02517\u0001\u0000\u0000\u0000\u0252\u0257\u0005\u0011\u0000"+ - "\u0000\u0253\u0254\u0005j\u0000\u0000\u0254\u0255\u0003:\u001d\u0000\u0255"+ - "\u0256\u0005k\u0000\u0000\u0256\u0258\u0001\u0000\u0000\u0000\u0257\u0253"+ - "\u0001\u0000\u0000\u0000\u0257\u0258\u0001\u0000\u0000\u0000\u0258\u0259"+ - "\u0001\u0000\u0000\u0000\u0259\u025a\u0005f\u0000\u0000\u025a\u025b\u0003"+ - "\u00a6S\u0000\u025b\u025c\u0005g\u0000\u0000\u025c9\u0001\u0000\u0000"+ - "\u0000\u025d\u0260\u0003<\u001e\u0000\u025e\u0260\u0005\u0013\u0000\u0000"+ - "\u025f\u025d\u0001\u0000\u0000\u0000\u025f\u025e\u0001\u0000\u0000\u0000"+ - "\u0260;\u0001\u0000\u0000\u0000\u0261\u0262\u0005e\u0000\u0000\u0262="+ - "\u0001\u0000\u0000\u0000\u0263\u0264\u0005\u0012\u0000\u0000\u0264\u0265"+ - "\u0005f\u0000\u0000\u0265\u0266\u0003\u00a6S\u0000\u0266\u0267\u0005g"+ - "\u0000\u0000\u0267?\u0001\u0000\u0000\u0000\u0268\u0269\u0005:\u0000\u0000"+ - "\u0269\u026a\u0005f\u0000\u0000\u026a\u026b\u0003\u00a6S\u0000\u026b\u026c"+ - "\u0005g\u0000\u0000\u026cA\u0001\u0000\u0000\u0000\u026d\u026e\u00059"+ - "\u0000\u0000\u026e\u026f\u0005f\u0000\u0000\u026f\u0270\u0003\u00a6S\u0000"+ - "\u0270\u0271\u0005g\u0000\u0000\u0271C\u0001\u0000\u0000\u0000\u0272\u0273"+ - "\u0005\u0016\u0000\u0000\u0273\u0274\u0005f\u0000\u0000\u0274\u0277\u0003"+ - "\u00a6S\u0000\u0275\u0276\u0005m\u0000\u0000\u0276\u0278\u0003\u00a6S"+ - "\u0000\u0277\u0275\u0001\u0000\u0000\u0000\u0277\u0278\u0001\u0000\u0000"+ - "\u0000\u0278\u0279\u0001\u0000\u0000\u0000\u0279\u027a\u0005g\u0000\u0000"+ - "\u027aE\u0001\u0000\u0000\u0000\u027b\u027c\u0007\u0004\u0000\u0000\u027c"+ - "\u027d\u0005j\u0000\u0000\u027d\u027e\u0003\u00a6S\u0000\u027e\u027f\u0005"+ - "=\u0000\u0000\u027f\u0280\u0003\u00a6S\u0000\u0280\u0281\u0005k\u0000"+ - "\u0000\u0281G\u0001\u0000\u0000\u0000\u0282\u0283\u00056\u0000\u0000\u0283"+ - "\u0284\u0003\u00a6S\u0000\u0284\u028a\u0005h\u0000\u0000\u0285\u0286\u0003"+ - "J%\u0000\u0286\u0287\u0003\u0172\u00b9\u0000\u0287\u0289\u0001\u0000\u0000"+ - "\u0000\u0288\u0285\u0001\u0000\u0000\u0000\u0289\u028c\u0001\u0000\u0000"+ - "\u0000\u028a\u0288\u0001\u0000\u0000\u0000\u028a\u028b\u0001\u0000\u0000"+ - "\u0000\u028b\u028d\u0001\u0000\u0000\u0000\u028c\u028a\u0001\u0000\u0000"+ - "\u0000\u028d\u028e\u0005i\u0000\u0000\u028eI\u0001\u0000\u0000\u0000\u028f"+ - "\u0290\u0003l6\u0000\u0290\u0291\u0005o\u0000\u0000\u0291\u0292\u0003"+ - "\u00a6S\u0000\u0292K\u0001\u0000\u0000\u0000\u0293\u0294\u0005j\u0000"+ - "\u0000\u0294\u0299\u0003N\'\u0000\u0295\u0296\u0005m\u0000\u0000\u0296"+ - "\u0298\u0003N\'\u0000\u0297\u0295\u0001\u0000\u0000\u0000\u0298\u029b"+ - "\u0001\u0000\u0000\u0000\u0299\u0297\u0001\u0000\u0000\u0000\u0299\u029a"+ - "\u0001\u0000\u0000\u0000\u029a\u029c\u0001\u0000\u0000\u0000\u029b\u0299"+ - "\u0001\u0000\u0000\u0000\u029c\u029d\u0005k\u0000\u0000\u029dM\u0001\u0000"+ - "\u0000\u0000\u029e\u029f\u0003\u00a6S\u0000\u029f\u02a0\u0005l\u0000\u0000"+ - "\u02a0\u02a1\u0003\u00a6S\u0000\u02a1O\u0001\u0000\u0000\u0000\u02a2\u02a7"+ - "\u0003^/\u0000\u02a3\u02a7\u0003\\.\u0000\u02a4\u02a7\u0003R)\u0000\u02a5"+ - "\u02a7\u0003V+\u0000\u02a6\u02a2\u0001\u0000\u0000\u0000\u02a6\u02a3\u0001"+ - "\u0000\u0000\u0000\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6\u02a5\u0001"+ - "\u0000\u0000\u0000\u02a7Q\u0001\u0000\u0000\u0000\u02a8\u02a9\u00053\u0000"+ - "\u0000\u02a9\u02af\u0005h\u0000\u0000\u02aa\u02ab\u0003T*\u0000\u02ab"+ - "\u02ac\u0003\u0172\u00b9\u0000\u02ac\u02ae\u0001\u0000\u0000\u0000\u02ad"+ - "\u02aa\u0001\u0000\u0000\u0000\u02ae\u02b1\u0001\u0000\u0000\u0000\u02af"+ - "\u02ad\u0001\u0000\u0000\u0000\u02af\u02b0\u0001\u0000\u0000\u0000\u02b0"+ - "\u02b2\u0001\u0000\u0000\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2"+ - "\u02b3\u0005i\u0000\u0000\u02b3S\u0001\u0000\u0000\u0000\u02b4\u02b5\u0005"+ - "M\u0000\u0000\u02b5\u02b6\u0005e\u0000\u0000\u02b6\u02be\u0003\u0140\u00a0"+ - "\u0000\u02b7\u02b8\u00054\u0000\u0000\u02b8\u02b9\u0005h\u0000\u0000\u02b9"+ - "\u02ba\u0003\u00a6S\u0000\u02ba\u02bb\u0003\u0172\u00b9\u0000\u02bb\u02bc"+ - "\u0005i\u0000\u0000\u02bc\u02be\u0001\u0000\u0000\u0000\u02bd\u02b4\u0001"+ - "\u0000\u0000\u0000\u02bd\u02b7\u0001\u0000\u0000\u0000\u02beU\u0001\u0000"+ - "\u0000\u0000\u02bf\u02c0\u00055\u0000\u0000\u02c0\u02c6\u0005h\u0000\u0000"+ - "\u02c1\u02c2\u0003X,\u0000\u02c2\u02c3\u0003\u0172\u00b9\u0000\u02c3\u02c5"+ - "\u0001\u0000\u0000\u0000\u02c4\u02c1\u0001\u0000\u0000\u0000\u02c5\u02c8"+ - "\u0001\u0000\u0000\u0000\u02c6\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7"+ - "\u0001\u0000\u0000\u0000\u02c7\u02c9\u0001\u0000\u0000\u0000\u02c8\u02c6"+ - "\u0001\u0000\u0000\u0000\u02c9\u02ca\u0005i\u0000\u0000\u02caW\u0001\u0000"+ - "\u0000\u0000\u02cb\u02cc\u0005e\u0000\u0000\u02cc\u02d2\u0005h\u0000\u0000"+ - "\u02cd\u02ce\u0003Z-\u0000\u02ce\u02cf\u0003\u0172\u00b9\u0000\u02cf\u02d1"+ - "\u0001\u0000\u0000\u0000\u02d0\u02cd\u0001\u0000\u0000\u0000\u02d1\u02d4"+ - "\u0001\u0000\u0000\u0000\u02d2\u02d0\u0001\u0000\u0000\u0000\u02d2\u02d3"+ - "\u0001\u0000\u0000\u0000\u02d3\u02d5\u0001\u0000\u0000\u0000\u02d4\u02d2"+ - "\u0001\u0000\u0000\u0000\u02d5\u02d6\u0005i\u0000\u0000\u02d6Y\u0001\u0000"+ - "\u0000\u0000\u02d7\u02d9\u0003\u00e6s\u0000\u02d8\u02d7\u0001\u0000\u0000"+ - "\u0000\u02d8\u02d9\u0001\u0000\u0000\u0000\u02d9\u02da\u0001\u0000\u0000"+ - "\u0000\u02da\u02db\u0003\u00c4b\u0000\u02db[\u0001\u0000\u0000\u0000\u02dc"+ - "\u02dd\u0005\u001b\u0000\u0000\u02dd\u02de\u0005j\u0000\u0000\u02de\u02df"+ - "\u0005k\u0000\u0000\u02df\u02e0\u0003\u0134\u009a\u0000\u02e0]\u0001\u0000"+ - "\u0000\u0000\u02e1\u02e2\u0007\u0005\u0000\u0000\u02e2\u02e3\u0005j\u0000"+ - "\u0000\u02e3\u02e4\u0003\u00c4b\u0000\u02e4\u02e5\u0005k\u0000\u0000\u02e5"+ - "\u02ed\u0001\u0000\u0000\u0000\u02e6\u02e7\u0005+\u0000\u0000\u02e7\u02e8"+ - "\u0005j\u0000\u0000\u02e8\u02e9\u0003\u00c4b\u0000\u02e9\u02ea\u0005k"+ - "\u0000\u0000\u02ea\u02eb\u0003\u00c4b\u0000\u02eb\u02ed\u0001\u0000\u0000"+ - "\u0000\u02ec\u02e1\u0001\u0000\u0000\u0000\u02ec\u02e6\u0001\u0000\u0000"+ - "\u0000\u02ed_\u0001\u0000\u0000\u0000\u02ee\u02f4\u0003b1\u0000\u02ef"+ - "\u02f0\u0005\u000e\u0000\u0000\u02f0\u02f4\u00060\uffff\uffff\u0000\u02f1"+ - "\u02f2\u0005C\u0000\u0000\u02f2\u02f4\u00060\uffff\uffff\u0000\u02f3\u02ee"+ - "\u0001\u0000\u0000\u0000\u02f3\u02ef\u0001\u0000\u0000\u0000\u02f3\u02f1"+ - "\u0001\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5\u02f7"+ - "\u0003\u0172\u00b9\u0000\u02f6\u02f3\u0001\u0000\u0000\u0000\u02f7\u02fa"+ - "\u0001\u0000\u0000\u0000\u02f8\u02f9\u0001\u0000\u0000\u0000\u02f8\u02f6"+ - "\u0001\u0000\u0000\u0000\u02f9\u02fd\u0001\u0000\u0000\u0000\u02fa\u02f8"+ - "\u0001\u0000\u0000\u0000\u02fb\u02fc\u0005\u000e\u0000\u0000\u02fc\u02fe"+ - "\u00060\uffff\uffff\u0000\u02fd\u02fb\u0001\u0000\u0000\u0000\u02fd\u02fe"+ - "\u0001\u0000\u0000\u0000\u02fea\u0001\u0000\u0000\u0000\u02ff\u0300\u0005"+ - "\t\u0000\u0000\u0300\u0308\u0003f3\u0000\u0301\u0302\u0005\n\u0000\u0000"+ - "\u0302\u0308\u0003f3\u0000\u0303\u0304\u0005\u000b\u0000\u0000\u0304\u0308"+ - "\u0003f3\u0000\u0305\u0306\u0005\r\u0000\u0000\u0306\u0308\u0003d2\u0000"+ - "\u0307\u02ff\u0001\u0000\u0000\u0000\u0307\u0301\u0001\u0000\u0000\u0000"+ - "\u0307\u0303\u0001\u0000\u0000\u0000\u0307\u0305\u0001\u0000\u0000\u0000"+ - "\u0308c\u0001\u0000\u0000\u0000\u0309\u030b\u0003\u00e8t\u0000\u030a\u0309"+ - "\u0001\u0000\u0000\u0000\u030a\u030b\u0001\u0000\u0000\u0000\u030b\u030e"+ - "\u0001\u0000\u0000\u0000\u030c\u030d\u0005\\\u0000\u0000\u030d\u030f\u0003"+ - "\u00a6S\u0000\u030e\u030c\u0001\u0000\u0000\u0000\u030e\u030f\u0001\u0000"+ - "\u0000\u0000\u030fe\u0001\u0000\u0000\u0000\u0310\u0313\u0001\u0000\u0000"+ - "\u0000\u0311\u0313\u0003\u00a6S\u0000\u0312\u0310\u0001\u0000\u0000\u0000"+ - "\u0312\u0311\u0001\u0000\u0000\u0000\u0313g\u0001\u0000\u0000\u0000\u0314"+ - "\u0315\u00056\u0000\u0000\u0315\u0316\u0003\u00a6S\u0000\u0316\u031a\u0005"+ - "h\u0000\u0000\u0317\u0319\u0003j5\u0000\u0318\u0317\u0001\u0000\u0000"+ - "\u0000\u0319\u031c\u0001\u0000\u0000\u0000\u031a\u0318\u0001\u0000\u0000"+ - "\u0000\u031a\u031b\u0001\u0000\u0000\u0000\u031b\u031d\u0001\u0000\u0000"+ - "\u0000\u031c\u031a\u0001\u0000\u0000\u0000\u031d\u031e\u0005i\u0000\u0000"+ - "\u031ei\u0001\u0000\u0000\u0000\u031f\u0320\u0003l6\u0000\u0320\u0322"+ - "\u0005o\u0000\u0000\u0321\u0323\u0003\u00f2y\u0000\u0322\u0321\u0001\u0000"+ - "\u0000\u0000\u0322\u0323\u0001\u0000\u0000\u0000\u0323k\u0001\u0000\u0000"+ - "\u0000\u0324\u0325\u0005P\u0000\u0000\u0325\u0328\u0003n7\u0000\u0326"+ - "\u0328\u0005L\u0000\u0000\u0327\u0324\u0001\u0000\u0000\u0000\u0327\u0326"+ - "\u0001\u0000\u0000\u0000\u0328m\u0001\u0000\u0000\u0000\u0329\u032a\u0005"+ - "%\u0000\u0000\u032a\u0337\u0005e\u0000\u0000\u032b\u032c\u0003\u00ccf"+ - "\u0000\u032c\u0331\u0005h\u0000\u0000\u032d\u032f\u0003p8\u0000\u032e"+ - "\u0330\u0005m\u0000\u0000\u032f\u032e\u0001\u0000\u0000\u0000\u032f\u0330"+ - "\u0001\u0000\u0000\u0000\u0330\u0332\u0001\u0000\u0000\u0000\u0331\u032d"+ - "\u0001\u0000\u0000\u0000\u0331\u0332\u0001\u0000\u0000\u0000\u0332\u0333"+ - "\u0001\u0000\u0000\u0000\u0333\u0334\u0005i\u0000\u0000\u0334\u0337\u0001"+ - "\u0000\u0000\u0000\u0335\u0337\u0003\u00a6S\u0000\u0336\u0329\u0001\u0000"+ - "\u0000\u0000\u0336\u032b\u0001\u0000\u0000\u0000\u0336\u0335\u0001\u0000"+ - "\u0000\u0000\u0337o\u0001\u0000\u0000\u0000\u0338\u033d\u0003n7\u0000"+ - "\u0339\u033a\u0005m\u0000\u0000\u033a\u033c\u0003n7\u0000\u033b\u0339"+ - "\u0001\u0000\u0000\u0000\u033c\u033f\u0001\u0000\u0000\u0000\u033d\u033b"+ - "\u0001\u0000\u0000\u0000\u033d\u033e\u0001\u0000\u0000\u0000\u033eq\u0001"+ - "\u0000\u0000\u0000\u033f\u033d\u0001\u0000\u0000\u0000\u0340\u0345\u0005"+ - "h\u0000\u0000\u0341\u0342\u0005;\u0000\u0000\u0342\u0343\u0003\u00e6s"+ - "\u0000\u0343\u0344\u0003\u0172\u00b9\u0000\u0344\u0346\u0001\u0000\u0000"+ - "\u0000\u0345\u0341\u0001\u0000\u0000\u0000\u0345\u0346\u0001\u0000\u0000"+ - "\u0000\u0346\u0348\u0001\u0000\u0000\u0000\u0347\u0349\u0003\u00f2y\u0000"+ - "\u0348\u0347\u0001\u0000\u0000\u0000\u0348\u0349\u0001\u0000\u0000\u0000"+ - "\u0349\u034a\u0001\u0000\u0000\u0000\u034a\u034b\u0005i\u0000\u0000\u034b"+ - "s\u0001\u0000\u0000\u0000\u034c\u034f\u0003\u0152\u00a9\u0000\u034d\u034f"+ - "\u0005e\u0000\u0000\u034e\u034c\u0001\u0000\u0000\u0000\u034e\u034d\u0001"+ - "\u0000\u0000\u0000\u034f\u0358\u0001\u0000\u0000\u0000\u0350\u0355\u0005"+ - "h\u0000\u0000\u0351\u0353\u0003v;\u0000\u0352\u0354\u0005m\u0000\u0000"+ - "\u0353\u0352\u0001\u0000\u0000\u0000\u0353\u0354\u0001\u0000\u0000\u0000"+ - "\u0354\u0356\u0001\u0000\u0000\u0000\u0355\u0351\u0001\u0000\u0000\u0000"+ - "\u0355\u0356\u0001\u0000\u0000\u0000\u0356\u0357\u0001\u0000\u0000\u0000"+ - "\u0357\u0359\u0005i\u0000\u0000\u0358\u0350\u0001\u0000\u0000\u0000\u0358"+ - "\u0359\u0001\u0000\u0000\u0000\u0359u\u0001\u0000\u0000\u0000\u035a\u035f"+ - "\u0003x<\u0000\u035b\u035c\u0005m\u0000\u0000\u035c\u035e\u0003x<\u0000"+ - "\u035d\u035b\u0001\u0000\u0000\u0000\u035e\u0361\u0001\u0000\u0000\u0000"+ - "\u035f\u035d\u0001\u0000\u0000\u0000\u035f\u0360\u0001\u0000\u0000\u0000"+ - "\u0360w\u0001\u0000\u0000\u0000\u0361\u035f\u0001\u0000\u0000\u0000\u0362"+ - "\u0363\u0005e\u0000\u0000\u0363\u0365\u0005o\u0000\u0000\u0364\u0362\u0001"+ - "\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000\u0000\u0365\u0366\u0001"+ - "\u0000\u0000\u0000\u0366\u0367\u0003\u00a6S\u0000\u0367y\u0001\u0000\u0000"+ - "\u0000\u0368\u0369\u0005G\u0000\u0000\u0369\u036a\u0003\u00a6S\u0000\u036a"+ - "\u036b\u0005\u000f\u0000\u0000\u036b\u036c\u0003t:\u0000\u036c\u036d\u0003"+ - "\u00f0x\u0000\u036d{\u0001\u0000\u0000\u0000\u036e\u036f\u0003\u00c4b"+ - "\u0000\u036f\u0370\u0005\u000f\u0000\u0000\u0370\u0383\u0003\u00c4b\u0000"+ - "\u0371\u0377\u0005h\u0000\u0000\u0372\u0373\u0003\u0084B\u0000\u0373\u0374"+ - "\u0003\u0172\u00b9\u0000\u0374\u0376\u0001\u0000\u0000\u0000\u0375\u0372"+ - "\u0001\u0000\u0000\u0000\u0376\u0379\u0001\u0000\u0000\u0000\u0377\u0375"+ - "\u0001\u0000\u0000\u0000\u0377\u0378\u0001\u0000\u0000\u0000\u0378\u037f"+ - "\u0001\u0000\u0000\u0000\u0379\u0377\u0001\u0000\u0000\u0000\u037a\u037b"+ - "\u0003~?\u0000\u037b\u037c\u0003\u0172\u00b9\u0000\u037c\u037e\u0001\u0000"+ - "\u0000\u0000\u037d\u037a\u0001\u0000\u0000\u0000\u037e\u0381\u0001\u0000"+ - "\u0000\u0000\u037f\u037d\u0001\u0000\u0000\u0000\u037f\u0380\u0001\u0000"+ - "\u0000\u0000\u0380\u0382\u0001\u0000\u0000\u0000\u0381\u037f\u0001\u0000"+ - "\u0000\u0000\u0382\u0384\u0005i\u0000\u0000\u0383\u0371\u0001\u0000\u0000"+ - "\u0000\u0383\u0384\u0001\u0000\u0000\u0000\u0384}\u0001\u0000\u0000\u0000"+ - "\u0385\u0387\u0005\u000e\u0000\u0000\u0386\u0385\u0001\u0000\u0000\u0000"+ - "\u0386\u0387\u0001\u0000\u0000\u0000\u0387\u0388\u0001\u0000\u0000\u0000"+ - "\u0388\u0389\u0003\u0080@\u0000\u0389\u038a\u0005e\u0000\u0000\u038a\u038c"+ - "\u0003\u0140\u00a0\u0000\u038b\u038d\u0003\u00f0x\u0000\u038c\u038b\u0001"+ - "\u0000\u0000\u0000\u038c\u038d\u0001\u0000\u0000\u0000\u038d\u007f\u0001"+ - "\u0000\u0000\u0000\u038e\u0390\u0005f\u0000\u0000\u038f\u0391\u0005e\u0000"+ - "\u0000\u0390\u038f\u0001\u0000\u0000\u0000\u0390\u0391\u0001\u0000\u0000"+ - "\u0000\u0391\u0393\u0001\u0000\u0000\u0000\u0392\u0394\u0005\u0087\u0000"+ - "\u0000\u0393\u0392\u0001\u0000\u0000\u0000\u0393\u0394\u0001\u0000\u0000"+ - "\u0000\u0394\u0395\u0001\u0000\u0000\u0000\u0395\u0396\u0003\u012e\u0097"+ - "\u0000\u0396\u0397\u0005g\u0000\u0000\u0397\u0081\u0001\u0000\u0000\u0000"+ - "\u0398\u039e\u0003\u00b6[\u0000\u0399\u039a\u0003\u00c4b\u0000\u039a\u039b"+ - "\u0005p\u0000\u0000\u039b\u039c\u0005e\u0000\u0000\u039c\u039e\u0001\u0000"+ - "\u0000\u0000\u039d\u0398\u0001\u0000\u0000\u0000\u039d\u0399\u0001\u0000"+ - "\u0000\u0000\u039e\u0083\u0001\u0000\u0000\u0000\u039f\u03a0\u00058\u0000"+ - "\u0000\u03a0\u03a1\u0005e\u0000\u0000\u03a1\u03a4\u0005s\u0000\u0000\u03a2"+ - "\u03a5\u0003\u0082A\u0000\u03a3\u03a5\u0003\u0150\u00a8\u0000\u03a4\u03a2"+ - "\u0001\u0000\u0000\u0000\u03a4\u03a3\u0001\u0000\u0000\u0000\u03a5\u0085"+ - "\u0001\u0000\u0000\u0000\u03a6\u03a7\u0005/\u0000\u0000\u03a7\u03a8\u0005"+ - "f\u0000\u0000\u03a8\u03ab\u0003\u00c4b\u0000\u03a9\u03aa\u0005m\u0000"+ - "\u0000\u03aa\u03ac\u0003\u00e8t\u0000\u03ab\u03a9\u0001\u0000\u0000\u0000"+ - "\u03ab\u03ac\u0001\u0000\u0000\u0000\u03ac\u03ad\u0001\u0000\u0000\u0000"+ - "\u03ad\u03ae\u0005g\u0000\u0000\u03ae\u0087\u0001\u0000\u0000\u0000\u03af"+ - "\u03b0\u0005.\u0000\u0000\u03b0\u03b1\u0005f\u0000\u0000\u03b1\u03b2\u0003"+ - "\u00c4b\u0000\u03b2\u03b3\u0005g\u0000\u0000\u03b3\u0089\u0001\u0000\u0000"+ - "\u0000\u03b4\u03b7\u0003`0\u0000\u03b5\u03b8\u0003\u008cF\u0000\u03b6"+ - "\u03b8\u0003\u008eG\u0000\u03b7\u03b5\u0001\u0000\u0000\u0000\u03b7\u03b6"+ - "\u0001\u0000\u0000\u0000\u03b8\u008b\u0001\u0000\u0000\u0000\u03b9\u03ba"+ - "\u0005M\u0000\u0000\u03ba\u03bb\u0005e\u0000\u0000\u03bb\u03bd\u0003\u0140"+ - "\u00a0\u0000\u03bc\u03be\u0003r9\u0000\u03bd\u03bc\u0001\u0000\u0000\u0000"+ - "\u03bd\u03be\u0001\u0000\u0000\u0000\u03be\u008d\u0001\u0000\u0000\u0000"+ - "\u03bf\u03c0\u0005M\u0000\u0000\u03c0\u03c1\u0003\u009cN\u0000\u03c1\u03c2"+ - "\u0005e\u0000\u0000\u03c2\u03c4\u0003\u0140\u00a0\u0000\u03c3\u03c5\u0003"+ - "r9\u0000\u03c4\u03c3\u0001\u0000\u0000\u0000\u03c4\u03c5\u0001\u0000\u0000"+ - "\u0000\u03c5\u008f\u0001\u0000\u0000\u0000\u03c6\u03c9\u0005\u001b\u0000"+ - "\u0000\u03c7\u03ca\u0003\u008aE\u0000\u03c8\u03ca\u0003\u00e0p\u0000\u03c9"+ - "\u03c7\u0001\u0000\u0000\u0000\u03c9\u03c8\u0001\u0000\u0000\u0000\u03ca"+ - "\u0091\u0001\u0000\u0000\u0000\u03cb\u03cc\u00058\u0000\u0000\u03cc\u03cd"+ - "\u0005e\u0000\u0000\u03cd\u03cf\u0003\u0144\u00a2\u0000\u03ce\u03d0\u0003"+ - "\u0094J\u0000\u03cf\u03ce\u0001\u0000\u0000\u0000\u03cf\u03d0\u0001\u0000"+ - "\u0000\u0000\u03d0\u0093\u0001\u0000\u0000\u0000\u03d1\u03d2\u0005h\u0000"+ - "\u0000\u03d2\u03d3\u0003\u00a6S\u0000\u03d3\u03d4\u0003\u0172\u00b9\u0000"+ - "\u03d4\u03d5\u0005i\u0000\u0000\u03d5\u0095\u0001\u0000\u0000\u0000\u03d6"+ - "\u03d7\u00058\u0000\u0000\u03d7\u03d8\u0003\u009cN\u0000\u03d8\u03d9\u0005"+ - "e\u0000\u0000\u03d9\u03db\u0003\u0144\u00a2\u0000\u03da\u03dc\u0003\u0094"+ - "J\u0000\u03db\u03da\u0001\u0000\u0000\u0000\u03db\u03dc\u0001\u0000\u0000"+ - "\u0000\u03dc\u0097\u0001\u0000\u0000\u0000\u03dd\u03e5\u0003\u0006\u0003"+ - "\u0000\u03de\u03e1\u0003\u00c4b\u0000\u03df\u03e0\u0005l\u0000\u0000\u03e0"+ - "\u03e2\u0003\u00e8t\u0000\u03e1\u03df\u0001\u0000\u0000\u0000\u03e1\u03e2"+ - "\u0001\u0000\u0000\u0000\u03e2\u03e6\u0001\u0000\u0000\u0000\u03e3\u03e4"+ - "\u0005l\u0000\u0000\u03e4\u03e6\u0003\u00e8t\u0000\u03e5\u03de\u0001\u0000"+ - "\u0000\u0000\u03e5\u03e3\u0001\u0000\u0000\u0000\u03e6\u0099\u0001\u0000"+ - "\u0000\u0000\u03e7\u03e8\u0003\u0006\u0003\u0000\u03e8\u03e9\u0005s\u0000"+ - "\u0000\u03e9\u03ea\u0003\u00e8t\u0000\u03ea\u009b\u0001\u0000\u0000\u0000"+ - "\u03eb\u03ed\u0005f\u0000\u0000\u03ec\u03ee\u0003\b\u0004\u0000\u03ed"+ - "\u03ec\u0001\u0000\u0000\u0000\u03ed\u03ee\u0001\u0000\u0000\u0000\u03ee"+ - "\u03ef\u0001\u0000\u0000\u0000\u03ef\u03f1\u0003\u00c4b\u0000\u03f0\u03f2"+ - "\u0005m\u0000\u0000\u03f1\u03f0\u0001\u0000\u0000\u0000\u03f1\u03f2\u0001"+ - "\u0000\u0000\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000\u03f3\u03f4\u0005"+ - "g\u0000\u0000\u03f4\u009d\u0001\u0000\u0000\u0000\u03f5\u03f8\u0003\u00a0"+ - "P\u0000\u03f6\u03f8\u0003\u00a2Q\u0000\u03f7\u03f5\u0001\u0000\u0000\u0000"+ - "\u03f7\u03f6\u0001\u0000\u0000\u0000\u03f8\u009f\u0001\u0000\u0000\u0000"+ - "\u03f9\u03fb\u0003\u00e6s\u0000\u03fa\u03f9\u0001\u0000\u0000\u0000\u03fa"+ - "\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0001\u0000\u0000\u0000\u03fc"+ - "\u03fd\u0003\u00a4R\u0000\u03fd\u00a1\u0001\u0000\u0000\u0000\u03fe\u0400"+ - "\u0005\u001b\u0000\u0000\u03ff\u0401\u0003\u00e6s\u0000\u0400\u03ff\u0001"+ - "\u0000\u0000\u0000\u0400\u0401\u0001\u0000\u0000\u0000\u0401\u0402\u0001"+ - "\u0000\u0000\u0000\u0402\u0403\u0003\u00a4R\u0000\u0403\u00a3\u0001\u0000"+ - "\u0000\u0000\u0404\u0406\u0005t\u0000\u0000\u0405\u0404\u0001\u0000\u0000"+ - "\u0000\u0405\u0406\u0001\u0000\u0000\u0000\u0406\u0407\u0001\u0000\u0000"+ - "\u0000\u0407\u0408\u0003\u00c4b\u0000\u0408\u00a5\u0001\u0000\u0000\u0000"+ - "\u0409\u040a\u0006S\uffff\uffff\u0000\u040a\u040b\u0007\u0006\u0000\u0000"+ - "\u040b\u041f\u0003\u00a6S\u000f\u040c\u041f\u0003\u00b6[\u0000\u040d\u040e"+ - "\u0005\u0019\u0000\u0000\u040e\u040f\u0003.\u0017\u0000\u040f\u0410\u0005"+ - "\u001c\u0000\u0000\u0410\u0411\u0003\u00a6S\u0003\u0411\u041f\u0001\u0000"+ - "\u0000\u0000\u0412\u0413\u0005\u001a\u0000\u0000\u0413\u0414\u0003\u009a"+ - "M\u0000\u0414\u0415\u0005\u001c\u0000\u0000\u0415\u0416\u0003\u00a6S\u0002"+ - "\u0416\u041f\u0001\u0000\u0000\u0000\u0417\u0418\u0007\u0007\u0000\u0000"+ - "\u0418\u0419\u0003&\u0013\u0000\u0419\u041a\u0005o\u0000\u0000\u041a\u041b"+ - "\u0005o\u0000\u0000\u041b\u041c\u0003*\u0015\u0000\u041c\u041d\u0003\u00a6"+ - "S\u0001\u041d\u041f\u0001\u0000\u0000\u0000\u041e\u0409\u0001\u0000\u0000"+ - "\u0000\u041e\u040c\u0001\u0000\u0000\u0000\u041e\u040d\u0001\u0000\u0000"+ - "\u0000\u041e\u0412\u0001\u0000\u0000\u0000\u041e\u0417\u0001\u0000\u0000"+ - "\u0000\u041f\u0443\u0001\u0000\u0000\u0000\u0420\u0421\n\r\u0000\u0000"+ - "\u0421\u0422\u0007\b\u0000\u0000\u0422\u0442\u0003\u00a6S\u000e\u0423"+ - "\u0424\n\f\u0000\u0000\u0424\u0425\u0007\t\u0000\u0000\u0425\u0442\u0003"+ - "\u00a6S\r\u0426\u0427\n\u000b\u0000\u0000\u0427\u0428\u0007\n\u0000\u0000"+ - "\u0428\u0442\u0003\u00a6S\f\u0429\u042a\n\n\u0000\u0000\u042a\u042b\u0007"+ - "\u000b\u0000\u0000\u042b\u0442\u0003\u00a6S\u000b\u042c\u042d\n\t\u0000"+ - "\u0000\u042d\u042e\u0007\f\u0000\u0000\u042e\u0442\u0003\u00a6S\n\u042f"+ - "\u0430\n\u0007\u0000\u0000\u0430\u0431\u0005v\u0000\u0000\u0431\u0442"+ - "\u0003\u00a6S\b\u0432\u0433\n\u0006\u0000\u0000\u0433\u0434\u0005u\u0000"+ - "\u0000\u0434\u0442\u0003\u00a6S\u0007\u0435\u0436\n\u0005\u0000\u0000"+ - "\u0436\u0437\u0005\"\u0000\u0000\u0437\u0442\u0003\u00a6S\u0005\u0438"+ - "\u0439\n\u0004\u0000\u0000\u0439\u043a\u0005%\u0000\u0000\u043a\u043b"+ - "\u0003\u00a6S\u0000\u043b\u043c\u0005o\u0000\u0000\u043c\u043d\u0003\u00a6"+ - "S\u0004\u043d\u0442\u0001\u0000\u0000\u0000\u043e\u043f\n\b\u0000\u0000"+ - "\u043f\u0440\u0005\u000f\u0000\u0000\u0440\u0442\u0003t:\u0000\u0441\u0420"+ - "\u0001\u0000\u0000\u0000\u0441\u0423\u0001\u0000\u0000\u0000\u0441\u0426"+ - "\u0001\u0000\u0000\u0000\u0441\u0429\u0001\u0000\u0000\u0000\u0441\u042c"+ - "\u0001\u0000\u0000\u0000\u0441\u042f\u0001\u0000\u0000\u0000\u0441\u0432"+ - "\u0001\u0000\u0000\u0000\u0441\u0435\u0001\u0000\u0000\u0000\u0441\u0438"+ - "\u0001\u0000\u0000\u0000\u0441\u043e\u0001\u0000\u0000\u0000\u0442\u0445"+ - "\u0001\u0000\u0000\u0000\u0443\u0441\u0001\u0000\u0000\u0000\u0443\u0444"+ - "\u0001\u0000\u0000\u0000\u0444\u00a7\u0001\u0000\u0000\u0000\u0445\u0443"+ - "\u0001\u0000\u0000\u0000\u0446\u045b\u0003\u0018\f\u0000\u0447\u045b\u0003"+ - "\u001a\r\u0000\u0448\u045b\u0003\u00acV\u0000\u0449\u045b\u0003\u00aa"+ - "U\u0000\u044a\u045b\u0003\u00e0p\u0000\u044b\u045b\u0003\u0100\u0080\u0000"+ - "\u044c\u045b\u0003\u00f4z\u0000\u044d\u045b\u0003\u012c\u0096\u0000\u044e"+ - "\u045b\u0003\u0102\u0081\u0000\u044f\u045b\u0003\u0104\u0082\u0000\u0450"+ - "\u045b\u0003\u0106\u0083\u0000\u0451\u045b\u0003\u0108\u0084\u0000\u0452"+ - "\u045b\u0003\u010a\u0085\u0000\u0453\u045b\u0003\u00f0x\u0000\u0454\u045b"+ - "\u0003\u010c\u0086\u0000\u0455\u045b\u0003\u010e\u0087\u0000\u0456\u045b"+ - "\u0003\u0120\u0090\u0000\u0457\u045b\u0003\u00aeW\u0000\u0458\u045b\u0003"+ - "\u00b2Y\u0000\u0459\u045b\u0003z=\u0000\u045a\u0446\u0001\u0000\u0000"+ - "\u0000\u045a\u0447\u0001\u0000\u0000\u0000\u045a\u0448\u0001\u0000\u0000"+ - "\u0000\u045a\u0449\u0001\u0000\u0000\u0000\u045a\u044a\u0001\u0000\u0000"+ - "\u0000\u045a\u044b\u0001\u0000\u0000\u0000\u045a\u044c\u0001\u0000\u0000"+ - "\u0000\u045a\u044d\u0001\u0000\u0000\u0000\u045a\u044e\u0001\u0000\u0000"+ - "\u0000\u045a\u044f\u0001\u0000\u0000\u0000\u045a\u0450\u0001\u0000\u0000"+ - "\u0000\u045a\u0451\u0001\u0000\u0000\u0000\u045a\u0452\u0001\u0000\u0000"+ - "\u0000\u045a\u0453\u0001\u0000\u0000\u0000\u045a\u0454\u0001\u0000\u0000"+ - "\u0000\u045a\u0455\u0001\u0000\u0000\u0000\u045a\u0456\u0001\u0000\u0000"+ - "\u0000\u045a\u0457\u0001\u0000\u0000\u0000\u045a\u0458\u0001\u0000\u0000"+ - "\u0000\u045a\u0459\u0001\u0000\u0000\u0000\u045b\u00a9\u0001\u0000\u0000"+ - "\u0000\u045c\u045d\u0005$\u0000\u0000\u045d\u045e\u0003\u00a6S\u0000\u045e"+ - "\u00ab\u0001\u0000\u0000\u0000\u045f\u0460\u0005X\u0000\u0000\u0460\u0462"+ - "\u0003\u00a6S\u0000\u0461\u0463\u0003\u00f0x\u0000\u0462\u0461\u0001\u0000"+ - "\u0000\u0000\u0462\u0463\u0001\u0000\u0000\u0000\u0463\u00ad\u0001\u0000"+ - "\u0000\u0000\u0464\u0465\u0003\u00b0X\u0000\u0465\u0466\u0003\u0128\u0094"+ - "\u0000\u0466\u00af\u0001\u0000\u0000\u0000\u0467\u0468\u0005\f\u0000\u0000"+ - "\u0468\u0469\u0003\u00a6S\u0000\u0469\u046a\u0003\u0172\u00b9\u0000\u046a"+ - "\u046c\u0001\u0000\u0000\u0000\u046b\u0467\u0001\u0000\u0000\u0000\u046c"+ - "\u046f\u0001\u0000\u0000\u0000\u046d\u046b\u0001\u0000\u0000\u0000\u046d"+ - "\u046e\u0001\u0000\u0000\u0000\u046e\u0474\u0001\u0000\u0000\u0000\u046f"+ - "\u046d\u0001\u0000\u0000\u0000\u0470\u0471\u0005\r\u0000\u0000\u0471\u0472"+ - "\u0003d2\u0000\u0472\u0473\u0003\u0172\u00b9\u0000\u0473\u0475\u0001\u0000"+ - "\u0000\u0000\u0474\u0470\u0001\u0000\u0000\u0000\u0474\u0475\u0001\u0000"+ - "\u0000\u0000\u0475\u00b1\u0001\u0000\u0000\u0000\u0476\u0477\u0005Q\u0000"+ - "\u0000\u0477\u047c\u0003\u00a6S\u0000\u0478\u0479\u0005Q\u0000\u0000\u0479"+ - "\u047a\u0007\u0001\u0000\u0000\u047a\u047c\u0003.\u0017\u0000\u047b\u0476"+ - "\u0001\u0000\u0000\u0000\u047b\u0478\u0001\u0000\u0000\u0000\u047c\u00b3"+ - "\u0001\u0000\u0000\u0000\u047d\u0486\u0005\u0003\u0000\u0000\u047e\u0486"+ - "\u0005\u0004\u0000\u0000\u047f\u0486\u0005d\u0000\u0000\u0480\u0486\u0003"+ - "\u014e\u00a7\u0000\u0481\u0486\u0003\u0164\u00b2\u0000\u0482\u0486\u0005"+ - "\u0001\u0000\u0000\u0483\u0486\u0005\u008f\u0000\u0000\u0484\u0486\u0005"+ - "\u0090\u0000\u0000\u0485\u047d\u0001\u0000\u0000\u0000\u0485\u047e\u0001"+ - "\u0000\u0000\u0000\u0485\u047f\u0001\u0000\u0000\u0000\u0485\u0480\u0001"+ - "\u0000\u0000\u0000\u0485\u0481\u0001\u0000\u0000\u0000\u0485\u0482\u0001"+ - "\u0000\u0000\u0000\u0485\u0483\u0001\u0000\u0000\u0000\u0485\u0484\u0001"+ - "\u0000\u0000\u0000\u0486\u00b5\u0001\u0000\u0000\u0000\u0487\u0488\u0006"+ - "[\uffff\uffff\u0000\u0488\u0494\u0003\u014a\u00a5\u0000\u0489\u0494\u0003"+ - "\u0146\u00a3\u0000\u048a\u0494\u0003\u016e\u00b7\u0000\u048b\u0494\u0003"+ - " \u0010\u0000\u048c\u0494\u0003\u0088D\u0000\u048d\u0494\u0003\u0086C"+ - "\u0000\u048e\u048f\u0007\r\u0000\u0000\u048f\u0490\u0005f\u0000\u0000"+ - "\u0490\u0491\u0003\u00a6S\u0000\u0491\u0492\u0005g\u0000\u0000\u0492\u0494"+ - "\u0001\u0000\u0000\u0000\u0493\u0487\u0001\u0000\u0000\u0000\u0493\u0489"+ - "\u0001\u0000\u0000\u0000\u0493\u048a\u0001\u0000\u0000\u0000\u0493\u048b"+ - "\u0001\u0000\u0000\u0000\u0493\u048c\u0001\u0000\u0000\u0000\u0493\u048d"+ - "\u0001\u0000\u0000\u0000\u0493\u048e\u0001\u0000\u0000\u0000\u0494\u04ab"+ - "\u0001\u0000\u0000\u0000\u0495\u0496\n\t\u0000\u0000\u0496\u0497\u0005"+ - "p\u0000\u0000\u0497\u04aa\u0005e\u0000\u0000\u0498\u0499\n\b\u0000\u0000"+ - "\u0499\u04aa\u0003\u0168\u00b4\u0000\u049a\u049b\n\u0007\u0000\u0000\u049b"+ - "\u04aa\u0003\u00d0h\u0000\u049c\u049d\n\u0006\u0000\u0000\u049d\u04aa"+ - "\u0003L&\u0000\u049e\u049f\n\u0005\u0000\u0000\u049f\u04aa\u0003\u016a"+ - "\u00b5\u0000\u04a0\u04a1\n\u0004\u0000\u0000\u04a1\u04aa\u0003\u016c\u00b6"+ - "\u0000\u04a2\u04a3\n\u0003\u0000\u0000\u04a3\u04a4\u0003\u016c\u00b6\u0000"+ - "\u04a4\u04a5\u0005\u0010\u0000\u0000\u04a5\u04a6\u0003t:\u0000\u04a6\u04aa"+ - "\u0001\u0000\u0000\u0000\u04a7\u04a8\n\u0002\u0000\u0000\u04a8\u04aa\u0003"+ - "\u00bc^\u0000\u04a9\u0495\u0001\u0000\u0000\u0000\u04a9\u0498\u0001\u0000"+ - "\u0000\u0000\u04a9\u049a\u0001\u0000\u0000\u0000\u04a9\u049c\u0001\u0000"+ - "\u0000\u0000\u04a9\u049e\u0001\u0000\u0000\u0000\u04a9\u04a0\u0001\u0000"+ - "\u0000\u0000\u04a9\u04a2\u0001\u0000\u0000\u0000\u04a9\u04a7\u0001\u0000"+ - "\u0000\u0000\u04aa\u04ad\u0001\u0000\u0000\u0000\u04ab\u04a9\u0001\u0000"+ - "\u0000\u0000\u04ab\u04ac\u0001\u0000\u0000\u0000\u04ac\u00b7\u0001\u0000"+ - "\u0000\u0000\u04ad\u04ab\u0001\u0000\u0000\u0000\u04ae\u04af\u0003`0\u0000"+ - "\u04af\u04b0\u0003\u00ba]\u0000\u04b0\u00b9\u0001\u0000\u0000\u0000\u04b1"+ - "\u04b3\u0005M\u0000\u0000\u04b2\u04b4\u0005e\u0000\u0000\u04b3\u04b2\u0001"+ - "\u0000\u0000\u0000\u04b3\u04b4\u0001\u0000\u0000\u0000\u04b4\u04b5\u0001"+ - "\u0000\u0000\u0000\u04b5\u04b7\u0003\u0140\u00a0\u0000\u04b6\u04b8\u0003"+ - "r9\u0000\u04b7\u04b6\u0001\u0000\u0000\u0000\u04b7\u04b8\u0001\u0000\u0000"+ - "\u0000\u04b8\u00bb\u0001\u0000\u0000\u0000\u04b9\u04bb\u0005&\u0000\u0000"+ - "\u04ba\u04bc\u0003\u00e8t\u0000\u04bb\u04ba\u0001\u0000\u0000\u0000\u04bb"+ - "\u04bc\u0001\u0000\u0000\u0000\u04bc\u04be\u0001\u0000\u0000\u0000\u04bd"+ - "\u04bf\u0005m\u0000\u0000\u04be\u04bd\u0001\u0000\u0000\u0000\u04be\u04bf"+ - "\u0001\u0000\u0000\u0000\u04bf\u04c0\u0001\u0000\u0000\u0000\u04c0\u04c1"+ - "\u0005\'\u0000\u0000\u04c1\u00bd\u0001\u0000\u0000\u0000\u04c2\u04c3\u0005"+ - "N\u0000\u0000\u04c3\u04cd\u0005h\u0000\u0000\u04c4\u04c8\u0003\u00c2a"+ - "\u0000\u04c5\u04c8\u0003\u012e\u0097\u0000\u04c6\u04c8\u0003\u00c0`\u0000"+ - "\u04c7\u04c4\u0001\u0000\u0000\u0000\u04c7\u04c5\u0001\u0000\u0000\u0000"+ - "\u04c7\u04c6\u0001\u0000\u0000\u0000\u04c8\u04c9\u0001\u0000\u0000\u0000"+ - "\u04c9\u04ca\u0003\u0172\u00b9\u0000\u04ca\u04cc\u0001\u0000\u0000\u0000"+ - "\u04cb\u04c7\u0001\u0000\u0000\u0000\u04cc\u04cf\u0001\u0000\u0000\u0000"+ - "\u04cd\u04cb\u0001\u0000\u0000\u0000\u04cd\u04ce\u0001\u0000\u0000\u0000"+ - "\u04ce\u04d0\u0001\u0000\u0000\u0000\u04cf\u04cd\u0001\u0000\u0000\u0000"+ - "\u04d0\u04d1\u0005i\u0000\u0000\u04d1\u00bf\u0001\u0000\u0000\u0000\u04d2"+ - "\u04d3\u00058\u0000\u0000\u04d3\u04d4\u0005e\u0000\u0000\u04d4\u04d5\u0003"+ - "\u0144\u00a2\u0000\u04d5\u00c1\u0001\u0000\u0000\u0000\u04d6\u04d8\u0005"+ - "\u001b\u0000\u0000\u04d7\u04d6\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001"+ - "\u0000\u0000\u0000\u04d8\u04d9\u0001\u0000\u0000\u0000\u04d9\u04da\u0003"+ - "`0\u0000\u04da\u04db\u0005e\u0000\u0000\u04db\u04dc\u0003\u0144\u00a2"+ - "\u0000\u04dc\u04dd\u0003\u0142\u00a1\u0000\u04dd\u04e6\u0001\u0000\u0000"+ - "\u0000\u04de\u04e0\u0005\u001b\u0000\u0000\u04df\u04de\u0001\u0000\u0000"+ - "\u0000\u04df\u04e0\u0001\u0000\u0000\u0000\u04e0\u04e1\u0001\u0000\u0000"+ - "\u0000\u04e1\u04e2\u0003`0\u0000\u04e2\u04e3\u0005e\u0000\u0000\u04e3"+ - "\u04e4\u0003\u0144\u00a2\u0000\u04e4\u04e6\u0001\u0000\u0000\u0000\u04e5"+ - "\u04d7\u0001\u0000\u0000\u0000\u04e5\u04df\u0001\u0000\u0000\u0000\u04e6"+ - "\u00c3\u0001\u0000\u0000\u0000\u04e7\u04ef\u0003\u012e\u0097\u0000\u04e8"+ - "\u04ef\u0003\u00c6c\u0000\u04e9\u04ef\u0003P(\u0000\u04ea\u04eb\u0005"+ - "f\u0000\u0000\u04eb\u04ec\u0003\u00c4b\u0000\u04ec\u04ed\u0005g\u0000"+ - "\u0000\u04ed\u04ef\u0001\u0000\u0000\u0000\u04ee\u04e7\u0001\u0000\u0000"+ - "\u0000\u04ee\u04e8\u0001\u0000\u0000\u0000\u04ee\u04e9\u0001\u0000\u0000"+ - "\u0000\u04ee\u04ea\u0001\u0000\u0000\u0000\u04ef\u00c5\u0001\u0000\u0000"+ - "\u0000\u04f0\u04fa\u0003\u0130\u0098\u0000\u04f1\u04fa\u0003\u0160\u00b0"+ - "\u0000\u04f2\u04fa\u0003\u0136\u009b\u0000\u04f3\u04fa\u0003\u013e\u009f"+ - "\u0000\u04f4\u04fa\u0003\u00be_\u0000\u04f5\u04fa\u0003\u0138\u009c\u0000"+ - "\u04f6\u04fa\u0003\u013a\u009d\u0000\u04f7\u04fa\u0003\u013c\u009e\u0000"+ - "\u04f8\u04fa\u0003\u00c8d\u0000\u04f9\u04f0\u0001\u0000\u0000\u0000\u04f9"+ - "\u04f1\u0001\u0000\u0000\u0000\u04f9\u04f2\u0001\u0000\u0000\u0000\u04f9"+ - "\u04f3\u0001\u0000\u0000\u0000\u04f9\u04f4\u0001\u0000\u0000\u0000\u04f9"+ - "\u04f5\u0001\u0000\u0000\u0000\u04f9\u04f6\u0001\u0000\u0000\u0000\u04f9"+ - "\u04f7\u0001\u0000\u0000\u0000\u04f9\u04f8\u0001\u0000\u0000\u0000\u04fa"+ - "\u00c7\u0001\u0000\u0000\u0000\u04fb\u04fc\u00058\u0000\u0000\u04fc\u04fd"+ - "\u0003\u00cae\u0000\u04fd\u00c9\u0001\u0000\u0000\u0000\u04fe\u050a\u0005"+ - "f\u0000\u0000\u04ff\u0504\u0003\u00c4b\u0000\u0500\u0501\u0005m\u0000"+ - "\u0000\u0501\u0503\u0003\u00c4b\u0000\u0502\u0500\u0001\u0000\u0000\u0000"+ - "\u0503\u0506\u0001\u0000\u0000\u0000\u0504\u0502\u0001\u0000\u0000\u0000"+ - "\u0504\u0505\u0001\u0000\u0000\u0000\u0505\u0508\u0001\u0000\u0000\u0000"+ - "\u0506\u0504\u0001\u0000\u0000\u0000\u0507\u0509\u0005m\u0000\u0000\u0508"+ - "\u0507\u0001\u0000\u0000\u0000\u0508\u0509\u0001\u0000\u0000\u0000\u0509"+ - "\u050b\u0001\u0000\u0000\u0000\u050a\u04ff\u0001\u0000\u0000\u0000\u050a"+ - "\u050b\u0001\u0000\u0000\u0000\u050b\u050c\u0001\u0000\u0000\u0000\u050c"+ - "\u050d\u0005g\u0000\u0000\u050d\u00cb\u0001\u0000\u0000\u0000\u050e\u0516"+ - "\u0003\u0160\u00b0\u0000\u050f\u0516\u0003\u0130\u0098\u0000\u0510\u0516"+ - "\u0003\u00ceg\u0000\u0511\u0516\u0003\u0138\u009c\u0000\u0512\u0516\u0003"+ - "\u013a\u009d\u0000\u0513\u0516\u0003P(\u0000\u0514\u0516\u0003\u012e\u0097"+ - "\u0000\u0515\u050e\u0001\u0000\u0000\u0000\u0515\u050f\u0001\u0000\u0000"+ - "\u0000\u0515\u0510\u0001\u0000\u0000\u0000\u0515\u0511\u0001\u0000\u0000"+ - "\u0000\u0515\u0512\u0001\u0000\u0000\u0000\u0515\u0513\u0001\u0000\u0000"+ - "\u0000\u0515\u0514\u0001\u0000\u0000\u0000\u0516\u00cd\u0001\u0000\u0000"+ - "\u0000\u0517\u0518\u0005j\u0000\u0000\u0518\u0519\u0005t\u0000\u0000\u0519"+ - "\u051a\u0005k\u0000\u0000\u051a\u051b\u0003\u0134\u009a\u0000\u051b\u00cf"+ - "\u0001\u0000\u0000\u0000\u051c\u052c\u0005j\u0000\u0000\u051d\u051f\u0003"+ - "\u00d2i\u0000\u051e\u051d\u0001\u0000\u0000\u0000\u051e\u051f\u0001\u0000"+ - "\u0000\u0000\u051f\u0520\u0001\u0000\u0000\u0000\u0520\u0522\u0005o\u0000"+ - "\u0000\u0521\u0523\u0003\u00d4j\u0000\u0522\u0521\u0001\u0000\u0000\u0000"+ - "\u0522\u0523\u0001\u0000\u0000\u0000\u0523\u052d\u0001\u0000\u0000\u0000"+ - "\u0524\u0526\u0003\u00d2i\u0000\u0525\u0524\u0001\u0000\u0000\u0000\u0525"+ - "\u0526\u0001\u0000\u0000\u0000\u0526\u0527\u0001\u0000\u0000\u0000\u0527"+ - "\u0528\u0005o\u0000\u0000\u0528\u0529\u0003\u00d4j\u0000\u0529\u052a\u0005"+ - "o\u0000\u0000\u052a\u052b\u0003\u00d6k\u0000\u052b\u052d\u0001\u0000\u0000"+ - "\u0000\u052c\u051e\u0001\u0000\u0000\u0000\u052c\u0525\u0001\u0000\u0000"+ - "\u0000\u052d\u052e\u0001\u0000\u0000\u0000\u052e\u052f\u0005k\u0000\u0000"+ - "\u052f\u00d1\u0001\u0000\u0000\u0000\u0530\u0531\u0003\u00a6S\u0000\u0531"+ - "\u00d3\u0001\u0000\u0000\u0000\u0532\u0533\u0003\u00a6S\u0000\u0533\u00d5"+ - "\u0001\u0000\u0000\u0000\u0534\u0535\u0003\u00a6S\u0000\u0535\u00d7\u0001"+ - "\u0000\u0000\u0000\u0536\u0538\u0007\u000e\u0000\u0000\u0537\u0536\u0001"+ - "\u0000\u0000\u0000\u0537\u0538\u0001\u0000\u0000\u0000\u0538\u0539\u0001"+ - "\u0000\u0000\u0000\u0539\u053a\u0005l\u0000\u0000\u053a\u00d9\u0001\u0000"+ - "\u0000\u0000\u053b\u053c\u0003\u00e8t\u0000\u053c\u053d\u0005l\u0000\u0000"+ - "\u053d\u0542\u0001\u0000\u0000\u0000\u053e\u053f\u0003\u0006\u0003\u0000"+ - "\u053f\u0540\u0005s\u0000\u0000\u0540\u0542\u0001\u0000\u0000\u0000\u0541"+ - "\u053b\u0001\u0000\u0000\u0000\u0541\u053e\u0001\u0000\u0000\u0000\u0541"+ - "\u0542\u0001\u0000\u0000\u0000\u0542\u0543\u0001\u0000\u0000\u0000\u0543"+ - "\u0544\u0005]\u0000\u0000\u0544\u0549\u0003\u00a6S\u0000\u0545\u0547\u0005"+ - "J\u0000\u0000\u0546\u0548\u0005e\u0000\u0000\u0547\u0546\u0001\u0000\u0000"+ - "\u0000\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u054a\u0001\u0000\u0000"+ - "\u0000\u0549\u0545\u0001\u0000\u0000\u0000\u0549\u054a\u0001\u0000\u0000"+ - "\u0000\u054a\u00db\u0001\u0000\u0000\u0000\u054b\u054c\u0005X\u0000\u0000"+ - "\u054c\u054d\u0005e\u0000\u0000\u054d\u00dd\u0001\u0000\u0000\u0000\u054e"+ - "\u054f\u0003\u0164\u00b2\u0000\u054f\u00df\u0001\u0000\u0000\u0000\u0550"+ - "\u0554\u0003\u00e2q\u0000\u0551\u0554\u0003\u00eau\u0000\u0552\u0554\u0003"+ - "\u00eew\u0000\u0553\u0550\u0001\u0000\u0000\u0000\u0553\u0551\u0001\u0000"+ - "\u0000\u0000\u0553\u0552\u0001\u0000\u0000\u0000\u0554\u00e1\u0001\u0000"+ - "\u0000\u0000\u0555\u0561\u0005Z\u0000\u0000\u0556\u0562\u0003\u00e4r\u0000"+ - "\u0557\u055d\u0005f\u0000\u0000\u0558\u0559\u0003\u00e4r\u0000\u0559\u055a"+ - "\u0003\u0172\u00b9\u0000\u055a\u055c\u0001\u0000\u0000\u0000\u055b\u0558"+ - "\u0001\u0000\u0000\u0000\u055c\u055f\u0001\u0000\u0000\u0000\u055d\u055b"+ - "\u0001\u0000\u0000\u0000\u055d\u055e\u0001\u0000\u0000\u0000\u055e\u0560"+ - "\u0001\u0000\u0000\u0000\u055f\u055d\u0001\u0000\u0000\u0000\u0560\u0562"+ - "\u0005g\u0000\u0000\u0561\u0556\u0001\u0000\u0000\u0000\u0561\u0557\u0001"+ - "\u0000\u0000\u0000\u0562\u00e3\u0001\u0000\u0000\u0000\u0563\u0569\u0003"+ - "\u00e6s\u0000\u0564\u0566\u0003\u00c4b\u0000\u0565\u0564\u0001\u0000\u0000"+ - "\u0000\u0565\u0566\u0001\u0000\u0000\u0000\u0566\u0567\u0001\u0000\u0000"+ - "\u0000\u0567\u0568\u0005l\u0000\u0000\u0568\u056a\u0003\u00e8t\u0000\u0569"+ - "\u0565\u0001\u0000\u0000\u0000\u0569\u056a\u0001\u0000\u0000\u0000\u056a"+ - "\u00e5\u0001\u0000\u0000\u0000\u056b\u0570\u0005e\u0000\u0000\u056c\u056d"+ - "\u0005m\u0000\u0000\u056d\u056f\u0005e\u0000\u0000\u056e\u056c\u0001\u0000"+ - "\u0000\u0000\u056f\u0572\u0001\u0000\u0000\u0000\u0570\u056e\u0001\u0000"+ - "\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u00e7\u0001\u0000"+ - "\u0000\u0000\u0572\u0570\u0001\u0000\u0000\u0000\u0573\u0578\u0003\u00a6"+ - "S\u0000\u0574\u0575\u0005m\u0000\u0000\u0575\u0577\u0003\u00a6S\u0000"+ - "\u0576\u0574\u0001\u0000\u0000\u0000\u0577\u057a\u0001\u0000\u0000\u0000"+ - "\u0578\u0576\u0001\u0000\u0000\u0000\u0578\u0579\u0001\u0000\u0000\u0000"+ - "\u0579\u00e9\u0001\u0000\u0000\u0000\u057a\u0578\u0001\u0000\u0000\u0000"+ - "\u057b\u0587\u0005^\u0000\u0000\u057c\u0588\u0003\u00ecv\u0000\u057d\u0583"+ - "\u0005f\u0000\u0000\u057e\u057f\u0003\u00ecv\u0000\u057f\u0580\u0003\u0172"+ - "\u00b9\u0000\u0580\u0582\u0001\u0000\u0000\u0000\u0581\u057e\u0001\u0000"+ - "\u0000\u0000\u0582\u0585\u0001\u0000\u0000\u0000\u0583\u0581\u0001\u0000"+ - "\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584\u0586\u0001\u0000"+ - "\u0000\u0000\u0585\u0583\u0001\u0000\u0000\u0000\u0586\u0588\u0005g\u0000"+ - "\u0000\u0587\u057c\u0001\u0000\u0000\u0000\u0587\u057d\u0001\u0000\u0000"+ - "\u0000\u0588\u00eb\u0001\u0000\u0000\u0000\u0589\u058b\u0005e\u0000\u0000"+ - "\u058a\u058c\u0005l\u0000\u0000\u058b\u058a\u0001\u0000\u0000\u0000\u058b"+ - "\u058c\u0001\u0000\u0000\u0000\u058c\u058d\u0001\u0000\u0000\u0000\u058d"+ - "\u058e\u0003\u00c4b\u0000\u058e\u00ed\u0001\u0000\u0000\u0000\u058f\u059b"+ - "\u0005c\u0000\u0000\u0590\u059c\u0003\u0098L\u0000\u0591\u0597\u0005f"+ - "\u0000\u0000\u0592\u0593\u0003\u0098L\u0000\u0593\u0594\u0003\u0172\u00b9"+ - "\u0000\u0594\u0596\u0001\u0000\u0000\u0000\u0595\u0592\u0001\u0000\u0000"+ - "\u0000\u0596\u0599\u0001\u0000\u0000\u0000\u0597\u0595\u0001\u0000\u0000"+ - "\u0000\u0597\u0598\u0001\u0000\u0000\u0000\u0598\u059a\u0001\u0000\u0000"+ - "\u0000\u0599\u0597\u0001\u0000\u0000\u0000\u059a\u059c\u0005g\u0000\u0000"+ - "\u059b\u0590\u0001\u0000\u0000\u0000\u059b\u0591\u0001\u0000\u0000\u0000"+ - "\u059c\u00ef\u0001\u0000\u0000\u0000\u059d\u059f\u0005h\u0000\u0000\u059e"+ - "\u05a0\u0003\u00f2y\u0000\u059f\u059e\u0001\u0000\u0000\u0000\u059f\u05a0"+ - "\u0001\u0000\u0000\u0000\u05a0\u05a1\u0001\u0000\u0000\u0000\u05a1\u05a2"+ - "\u0005i\u0000\u0000\u05a2\u00f1\u0001\u0000\u0000\u0000\u05a3\u05a5\u0005"+ - "n\u0000\u0000\u05a4\u05a3\u0001\u0000\u0000\u0000\u05a4\u05a5\u0001\u0000"+ - "\u0000\u0000\u05a5\u05ab\u0001\u0000\u0000\u0000\u05a6\u05a8\u0005\u009f"+ - "\u0000\u0000\u05a7\u05a6\u0001\u0000\u0000\u0000\u05a7\u05a8\u0001\u0000"+ - "\u0000\u0000\u05a8\u05ab\u0001\u0000\u0000\u0000\u05a9\u05ab\u0004y\u0012"+ - "\u0000\u05aa\u05a4\u0001\u0000\u0000\u0000\u05aa\u05a7\u0001\u0000\u0000"+ - "\u0000\u05aa\u05a9\u0001\u0000\u0000\u0000\u05ab\u05ac\u0001\u0000\u0000"+ - "\u0000\u05ac\u05ad\u0003\u00a8T\u0000\u05ad\u05ae\u0003\u0172\u00b9\u0000"+ - "\u05ae\u05b0\u0001\u0000\u0000\u0000\u05af\u05aa\u0001\u0000\u0000\u0000"+ - "\u05b0\u05b1\u0001\u0000\u0000\u0000\u05b1\u05af\u0001\u0000\u0000\u0000"+ - "\u05b1\u05b2\u0001\u0000\u0000\u0000\u05b2\u00f3\u0001\u0000\u0000\u0000"+ - "\u05b3\u05b9\u0003\u00f8|\u0000\u05b4\u05b9\u0003\u00fa}\u0000\u05b5\u05b9"+ - "\u0003\u00fc~\u0000\u05b6\u05b9\u0003\u00f6{\u0000\u05b7\u05b9\u0003\u009a"+ - "M\u0000\u05b8\u05b3\u0001\u0000\u0000\u0000\u05b8\u05b4\u0001\u0000\u0000"+ - "\u0000\u05b8\u05b5\u0001\u0000\u0000\u0000\u05b8\u05b6\u0001\u0000\u0000"+ - "\u0000\u05b8\u05b7\u0001\u0000\u0000\u0000\u05b9\u00f5\u0001\u0000\u0000"+ - "\u0000\u05ba\u05bb\u0003\u00a6S\u0000\u05bb\u00f7\u0001\u0000\u0000\u0000"+ - "\u05bc\u05bd\u0003\u00a6S\u0000\u05bd\u05be\u0005\u0089\u0000\u0000\u05be"+ - "\u05bf\u0003\u00a6S\u0000\u05bf\u00f9\u0001\u0000\u0000\u0000\u05c0\u05c1"+ - "\u0003\u00a6S\u0000\u05c1\u05c2\u0007\u000f\u0000\u0000\u05c2\u00fb\u0001"+ - "\u0000\u0000\u0000\u05c3\u05c4\u0003\u00e8t\u0000\u05c4\u05c5\u0003\u00d8"+ - "l\u0000\u05c5\u05c6\u0003\u00e8t\u0000\u05c6\u00fd\u0001\u0000\u0000\u0000"+ - "\u05c7\u05c8\u0007\u0010\u0000\u0000\u05c8\u00ff\u0001\u0000\u0000\u0000"+ - "\u05c9\u05ca\u0005e\u0000\u0000\u05ca\u05cc\u0005o\u0000\u0000\u05cb\u05cd"+ - "\u0003\u00a8T\u0000\u05cc\u05cb\u0001\u0000\u0000\u0000\u05cc\u05cd\u0001"+ - "\u0000\u0000\u0000\u05cd\u0101\u0001\u0000\u0000\u0000\u05ce\u05d0\u0005"+ - "b\u0000\u0000\u05cf\u05d1\u0003\u00e8t\u0000\u05d0\u05cf\u0001\u0000\u0000"+ - "\u0000\u05d0\u05d1\u0001\u0000\u0000\u0000\u05d1\u0103\u0001\u0000\u0000"+ - "\u0000\u05d2\u05d4\u0005K\u0000\u0000\u05d3\u05d5\u0005e\u0000\u0000\u05d4"+ - "\u05d3\u0001\u0000\u0000\u0000\u05d4\u05d5\u0001\u0000\u0000\u0000\u05d5"+ - "\u0105\u0001\u0000\u0000\u0000\u05d6\u05d8\u0005_\u0000\u0000\u05d7\u05d9"+ - "\u0005e\u0000\u0000\u05d8\u05d7\u0001\u0000\u0000\u0000\u05d8\u05d9\u0001"+ - "\u0000\u0000\u0000\u05d9\u0107\u0001\u0000\u0000\u0000\u05da\u05db\u0005"+ - "W\u0000\u0000\u05db\u05dc\u0005e\u0000\u0000\u05dc\u0109\u0001\u0000\u0000"+ - "\u0000\u05dd\u05de\u0005[\u0000\u0000\u05de\u010b\u0001\u0000\u0000\u0000"+ - "\u05df\u05e8\u0005\\\u0000\u0000\u05e0\u05e9\u0003\u00a6S\u0000\u05e1"+ - "\u05e2\u0003\u0172\u00b9\u0000\u05e2\u05e3\u0003\u00a6S\u0000\u05e3\u05e9"+ - "\u0001\u0000\u0000\u0000\u05e4\u05e5\u0003\u00f4z\u0000\u05e5\u05e6\u0003"+ - "\u0172\u00b9\u0000\u05e6\u05e7\u0003\u00a6S\u0000\u05e7\u05e9\u0001\u0000"+ - "\u0000\u0000\u05e8\u05e0\u0001\u0000\u0000\u0000\u05e8\u05e1\u0001\u0000"+ - "\u0000\u0000\u05e8\u05e4\u0001\u0000\u0000\u0000\u05e9\u05ea\u0001\u0000"+ - "\u0000\u0000\u05ea\u05f0\u0003\u00f0x\u0000\u05eb\u05ee\u0005V\u0000\u0000"+ - "\u05ec\u05ef\u0003\u010c\u0086\u0000\u05ed\u05ef\u0003\u00f0x\u0000\u05ee"+ - "\u05ec\u0001\u0000\u0000\u0000\u05ee\u05ed\u0001\u0000\u0000\u0000\u05ef"+ - "\u05f1\u0001\u0000\u0000\u0000\u05f0\u05eb\u0001\u0000\u0000\u0000\u05f0"+ - "\u05f1\u0001\u0000\u0000\u0000\u05f1\u010d\u0001\u0000\u0000\u0000\u05f2"+ - "\u05f5\u0003\u0110\u0088\u0000\u05f3\u05f5\u0003\u0116\u008b\u0000\u05f4"+ - "\u05f2\u0001\u0000\u0000\u0000\u05f4\u05f3\u0001\u0000\u0000\u0000\u05f5"+ - "\u010f\u0001\u0000\u0000\u0000\u05f6\u0601\u0005Y\u0000\u0000\u05f7\u05f9"+ - "\u0003\u00a6S\u0000\u05f8\u05f7\u0001\u0000\u0000\u0000\u05f8\u05f9\u0001"+ - "\u0000\u0000\u0000\u05f9\u0602\u0001\u0000\u0000\u0000\u05fa\u05fc\u0003"+ - "\u00f4z\u0000\u05fb\u05fa\u0001\u0000\u0000\u0000\u05fb\u05fc\u0001\u0000"+ - "\u0000\u0000\u05fc\u05fd\u0001\u0000\u0000\u0000\u05fd\u05ff\u0003\u0172"+ - "\u00b9\u0000\u05fe\u0600\u0003\u00a6S\u0000\u05ff\u05fe\u0001\u0000\u0000"+ - "\u0000\u05ff\u0600\u0001\u0000\u0000\u0000\u0600\u0602\u0001\u0000\u0000"+ - "\u0000\u0601\u05f8\u0001\u0000\u0000\u0000\u0601\u05fb\u0001\u0000\u0000"+ - "\u0000\u0602\u0603\u0001\u0000\u0000\u0000\u0603\u0607\u0005h\u0000\u0000"+ - "\u0604\u0606\u0003\u0112\u0089\u0000\u0605\u0604\u0001\u0000\u0000\u0000"+ - "\u0606\u0609\u0001\u0000\u0000\u0000\u0607\u0605\u0001\u0000\u0000\u0000"+ - "\u0607\u0608\u0001\u0000\u0000\u0000\u0608\u060a\u0001\u0000\u0000\u0000"+ - "\u0609\u0607\u0001\u0000\u0000\u0000\u060a\u060b\u0005i\u0000\u0000\u060b"+ - "\u0111\u0001\u0000\u0000\u0000\u060c\u060d\u0003\u0114\u008a\u0000\u060d"+ - "\u060f\u0005o\u0000\u0000\u060e\u0610\u0003\u00f2y\u0000\u060f\u060e\u0001"+ - "\u0000\u0000\u0000\u060f\u0610\u0001\u0000\u0000\u0000\u0610\u0113\u0001"+ - "\u0000\u0000\u0000\u0611\u0612\u0005P\u0000\u0000\u0612\u0615\u0003\u00e8"+ - "t\u0000\u0613\u0615\u0005L\u0000\u0000\u0614\u0611\u0001\u0000\u0000\u0000"+ - "\u0614\u0613\u0001\u0000\u0000\u0000\u0615\u0115\u0001\u0000\u0000\u0000"+ - "\u0616\u061f\u0005Y\u0000\u0000\u0617\u0620\u0003\u0118\u008c\u0000\u0618"+ - "\u0619\u0003\u0172\u00b9\u0000\u0619\u061a\u0003\u0118\u008c\u0000\u061a"+ - "\u0620\u0001\u0000\u0000\u0000\u061b\u061c\u0003\u00f4z\u0000\u061c\u061d"+ - "\u0003\u0172\u00b9\u0000\u061d\u061e\u0003\u0118\u008c\u0000\u061e\u0620"+ - "\u0001\u0000\u0000\u0000\u061f\u0617\u0001\u0000\u0000\u0000\u061f\u0618"+ - "\u0001\u0000\u0000\u0000\u061f\u061b\u0001\u0000\u0000\u0000\u0620\u0621"+ - "\u0001\u0000\u0000\u0000\u0621\u0625\u0005h\u0000\u0000\u0622\u0624\u0003"+ - "\u011a\u008d\u0000\u0623\u0622\u0001\u0000\u0000\u0000\u0624\u0627\u0001"+ - "\u0000\u0000\u0000\u0625\u0623\u0001\u0000\u0000\u0000\u0625\u0626\u0001"+ - "\u0000\u0000\u0000\u0626\u0628\u0001\u0000\u0000\u0000\u0627\u0625\u0001"+ - "\u0000\u0000\u0000\u0628\u0629\u0005i\u0000\u0000\u0629\u0117\u0001\u0000"+ - "\u0000\u0000\u062a\u062b\u0005e\u0000\u0000\u062b\u062d\u0005s\u0000\u0000"+ - "\u062c\u062a\u0001\u0000\u0000\u0000\u062c\u062d\u0001\u0000\u0000\u0000"+ - "\u062d\u062e\u0001\u0000\u0000\u0000\u062e\u062f\u0003\u00b6[\u0000\u062f"+ - "\u0630\u0005p\u0000\u0000\u0630\u0631\u0005f\u0000\u0000\u0631\u0632\u0005"+ - "^\u0000\u0000\u0632\u0633\u0005g\u0000\u0000\u0633\u0119\u0001\u0000\u0000"+ - "\u0000\u0634\u0635\u0003\u011c\u008e\u0000\u0635\u0637\u0005o\u0000\u0000"+ - "\u0636\u0638\u0003\u00f2y\u0000\u0637\u0636\u0001\u0000\u0000\u0000\u0637"+ - "\u0638\u0001\u0000\u0000\u0000\u0638\u011b\u0001\u0000\u0000\u0000\u0639"+ - "\u063a\u0005P\u0000\u0000\u063a\u063d\u0003\u011e\u008f\u0000\u063b\u063d"+ - "\u0005L\u0000\u0000\u063c\u0639\u0001\u0000\u0000\u0000\u063c\u063b\u0001"+ - "\u0000\u0000\u0000\u063d\u011d\u0001\u0000\u0000\u0000\u063e\u0641\u0003"+ - "\u00c4b\u0000\u063f\u0641\u0005d\u0000\u0000\u0640\u063e\u0001\u0000\u0000"+ - "\u0000\u0640\u063f\u0001\u0000\u0000\u0000\u0641\u0649\u0001\u0000\u0000"+ - "\u0000\u0642\u0645\u0005m\u0000\u0000\u0643\u0646\u0003\u00c4b\u0000\u0644"+ - "\u0646\u0005d\u0000\u0000\u0645\u0643\u0001\u0000\u0000\u0000\u0645\u0644"+ - "\u0001\u0000\u0000\u0000\u0646\u0648\u0001\u0000\u0000\u0000\u0647\u0642"+ - "\u0001\u0000\u0000\u0000\u0648\u064b\u0001\u0000\u0000\u0000\u0649\u0647"+ - "\u0001\u0000\u0000\u0000\u0649\u064a\u0001\u0000\u0000\u0000\u064a\u011f"+ - "\u0001\u0000\u0000\u0000\u064b\u0649\u0001\u0000\u0000\u0000\u064c\u064d"+ - "\u0005O\u0000\u0000\u064d\u0651\u0005h\u0000\u0000\u064e\u0650\u0003\u0122"+ - "\u0091\u0000\u064f\u064e\u0001\u0000\u0000\u0000\u0650\u0653\u0001\u0000"+ - "\u0000\u0000\u0651\u064f\u0001\u0000\u0000\u0000\u0651\u0652\u0001\u0000"+ - "\u0000\u0000\u0652\u0654\u0001\u0000\u0000\u0000\u0653\u0651\u0001\u0000"+ - "\u0000\u0000\u0654\u0655\u0005i\u0000\u0000\u0655\u0121\u0001\u0000\u0000"+ - "\u0000\u0656\u0657\u0003\u0124\u0092\u0000\u0657\u0659\u0005o\u0000\u0000"+ - "\u0658\u065a\u0003\u00f2y\u0000\u0659\u0658\u0001\u0000\u0000\u0000\u0659"+ - "\u065a\u0001\u0000\u0000\u0000\u065a\u0123\u0001\u0000\u0000\u0000\u065b"+ - "\u065e\u0005P\u0000\u0000\u065c\u065f\u0003\u00f8|\u0000\u065d\u065f\u0003"+ - "\u0126\u0093\u0000\u065e\u065c\u0001\u0000\u0000\u0000\u065e\u065d\u0001"+ - "\u0000\u0000\u0000\u065f\u0662\u0001\u0000\u0000\u0000\u0660\u0662\u0005"+ - "L\u0000\u0000\u0661\u065b\u0001\u0000\u0000\u0000\u0661\u0660\u0001\u0000"+ - "\u0000\u0000\u0662\u0125\u0001\u0000\u0000\u0000\u0663\u0664\u0003\u00e8"+ - "t\u0000\u0664\u0665\u0005l\u0000\u0000\u0665\u066a\u0001\u0000\u0000\u0000"+ - "\u0666\u0667\u0003\u00e6s\u0000\u0667\u0668\u0005s\u0000\u0000\u0668\u066a"+ - "\u0001\u0000\u0000\u0000\u0669\u0663\u0001\u0000\u0000\u0000\u0669\u0666"+ - "\u0001\u0000\u0000\u0000\u0669\u066a\u0001\u0000\u0000\u0000\u066a\u066b"+ - "\u0001\u0000\u0000\u0000\u066b\u066c\u0003\u00a6S\u0000\u066c\u0127\u0001"+ - "\u0000\u0000\u0000\u066d\u0675\u0005`\u0000\u0000\u066e\u0670\u0003\u00a6"+ - "S\u0000\u066f\u066e\u0001\u0000\u0000\u0000\u066f\u0670\u0001\u0000\u0000"+ - "\u0000\u0670\u0676\u0001\u0000\u0000\u0000\u0671\u0676\u0003\u012a\u0095"+ - "\u0000\u0672\u0674\u0003\u00dam\u0000\u0673\u0672\u0001\u0000\u0000\u0000"+ - "\u0673\u0674\u0001\u0000\u0000\u0000\u0674\u0676\u0001\u0000\u0000\u0000"+ - "\u0675\u066f\u0001\u0000\u0000\u0000\u0675\u0671\u0001\u0000\u0000\u0000"+ - "\u0675\u0673\u0001\u0000\u0000\u0000\u0676\u0677\u0001\u0000\u0000\u0000"+ - "\u0677\u0678\u0003\u00f0x\u0000\u0678\u0129\u0001\u0000\u0000\u0000\u0679"+ - "\u067b\u0003\u00f4z\u0000\u067a\u0679\u0001\u0000\u0000\u0000\u067a\u067b"+ - "\u0001\u0000\u0000\u0000\u067b\u067c\u0001\u0000\u0000\u0000\u067c\u067e"+ - "\u0003\u0172\u00b9\u0000\u067d\u067f\u0003\u00a6S\u0000\u067e\u067d\u0001"+ - "\u0000\u0000\u0000\u067e\u067f\u0001\u0000\u0000\u0000\u067f\u0680\u0001"+ - "\u0000\u0000\u0000\u0680\u0682\u0003\u0172\u00b9\u0000\u0681\u0683\u0003"+ - "\u00f4z\u0000\u0682\u0681\u0001\u0000\u0000\u0000\u0682\u0683\u0001\u0000"+ - "\u0000\u0000\u0683\u012b\u0001\u0000\u0000\u0000\u0684\u0685\u0005R\u0000"+ - "\u0000\u0685\u0686\u0003\u00a6S\u0000\u0686\u012d\u0001\u0000\u0000\u0000"+ - "\u0687\u068a\u0003\u0152\u00a9\u0000\u0688\u068a\u0005e\u0000\u0000\u0689"+ - "\u0687\u0001\u0000\u0000\u0000\u0689\u0688\u0001\u0000\u0000\u0000\u068a"+ - "\u012f\u0001\u0000\u0000\u0000\u068b\u068c\u0005j\u0000\u0000\u068c\u068d"+ - "\u0003\u0132\u0099\u0000\u068d\u068e\u0005k\u0000\u0000\u068e\u068f\u0003"+ - "\u0134\u009a\u0000\u068f\u0131\u0001\u0000\u0000\u0000\u0690\u0691\u0003"+ - "\u00a6S\u0000\u0691\u0133\u0001\u0000\u0000\u0000\u0692\u0693\u0003\u00c4"+ - "b\u0000\u0693\u0135\u0001\u0000\u0000\u0000\u0694\u0695\u0005\u0087\u0000"+ - "\u0000\u0695\u0696\u0003\u00c4b\u0000\u0696\u0137\u0001\u0000\u0000\u0000"+ - "\u0697\u0698\u0005j\u0000\u0000\u0698\u0699\u0005k\u0000\u0000\u0699\u069a"+ - "\u0003\u0134\u009a\u0000\u069a\u0139\u0001\u0000\u0000\u0000\u069b\u069c"+ - "\u0005S\u0000\u0000\u069c\u069d\u0005j\u0000\u0000\u069d\u069e\u0003\u00c4"+ - "b\u0000\u069e\u069f\u0005k\u0000\u0000\u069f\u06a0\u0003\u0134\u009a\u0000"+ - "\u06a0\u013b\u0001\u0000\u0000\u0000\u06a1\u06a7\u0005U\u0000\u0000\u06a2"+ - "\u06a3\u0005U\u0000\u0000\u06a3\u06a7\u0005\u0089\u0000\u0000\u06a4\u06a5"+ - "\u0005\u0089\u0000\u0000\u06a5\u06a7\u0005U\u0000\u0000\u06a6\u06a1\u0001"+ - "\u0000\u0000\u0000\u06a6\u06a2\u0001\u0000\u0000\u0000\u06a6\u06a4\u0001"+ - "\u0000\u0000\u0000\u06a7\u06a8\u0001\u0000\u0000\u0000\u06a8\u06a9\u0003"+ - "\u0134\u009a\u0000\u06a9\u013d\u0001\u0000\u0000\u0000\u06aa\u06ab\u0005"+ - "M\u0000\u0000\u06ab\u06ac\u0003\u0140\u00a0\u0000\u06ac\u013f\u0001\u0000"+ - "\u0000\u0000\u06ad\u06ae\u0003\u0144\u00a2\u0000\u06ae\u06af\u0003\u0142"+ - "\u00a1\u0000\u06af\u06b2\u0001\u0000\u0000\u0000\u06b0\u06b2\u0003\u0144"+ - "\u00a2\u0000\u06b1\u06ad\u0001\u0000\u0000\u0000\u06b1\u06b0\u0001\u0000"+ - "\u0000\u0000\u06b2\u0141\u0001\u0000\u0000\u0000\u06b3\u06b6\u0003\u0144"+ - "\u00a2\u0000\u06b4\u06b6\u0003\u00c4b\u0000\u06b5\u06b3\u0001\u0000\u0000"+ - "\u0000\u06b5\u06b4\u0001\u0000\u0000\u0000\u06b6\u0143\u0001\u0000\u0000"+ - "\u0000\u06b7\u06c3\u0005f\u0000\u0000\u06b8\u06bd\u0003\u009eO\u0000\u06b9"+ - "\u06ba\u0005m\u0000\u0000\u06ba\u06bc\u0003\u009eO\u0000\u06bb\u06b9\u0001"+ - "\u0000\u0000\u0000\u06bc\u06bf\u0001\u0000\u0000\u0000\u06bd\u06bb\u0001"+ - "\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be\u06c1\u0001"+ - "\u0000\u0000\u0000\u06bf\u06bd\u0001\u0000\u0000\u0000\u06c0\u06c2\u0005"+ - "m\u0000\u0000\u06c1\u06c0\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001\u0000"+ - "\u0000\u0000\u06c2\u06c4\u0001\u0000\u0000\u0000\u06c3\u06b8\u0001\u0000"+ - "\u0000\u0000\u06c3\u06c4\u0001\u0000\u0000\u0000\u06c4\u06c5\u0001\u0000"+ - "\u0000\u0000\u06c5\u06c6\u0005g\u0000\u0000\u06c6\u0145\u0001\u0000\u0000"+ - "\u0000\u06c7\u06c8\u0003\u0148\u00a4\u0000\u06c8\u06c9\u0005f\u0000\u0000"+ - "\u06c9\u06cb\u0003\u00a6S\u0000\u06ca\u06cc\u0005m\u0000\u0000\u06cb\u06ca"+ - "\u0001\u0000\u0000\u0000\u06cb\u06cc\u0001\u0000\u0000\u0000\u06cc\u06cd"+ - "\u0001\u0000\u0000\u0000\u06cd\u06ce\u0005g\u0000\u0000\u06ce\u0147\u0001"+ - "\u0000\u0000\u0000\u06cf\u06d5\u0003\u00c6c\u0000\u06d0\u06d1\u0005f\u0000"+ - "\u0000\u06d1\u06d2\u0003\u0148\u00a4\u0000\u06d2\u06d3\u0005g\u0000\u0000"+ - "\u06d3\u06d5\u0001\u0000\u0000\u0000\u06d4\u06cf\u0001\u0000\u0000\u0000"+ - "\u06d4\u06d0\u0001\u0000\u0000\u0000\u06d5\u0149\u0001\u0000\u0000\u0000"+ - "\u06d6\u06dd\u0003\u014c\u00a6\u0000\u06d7\u06dd\u0003\u0150\u00a8\u0000"+ - "\u06d8\u06d9\u0005f\u0000\u0000\u06d9\u06da\u0003\u00a6S\u0000\u06da\u06db"+ - "\u0005g\u0000\u0000\u06db\u06dd\u0001\u0000\u0000\u0000\u06dc\u06d6\u0001"+ - "\u0000\u0000\u0000\u06dc\u06d7\u0001\u0000\u0000\u0000\u06dc\u06d8\u0001"+ - "\u0000\u0000\u0000\u06dd\u014b\u0001\u0000\u0000\u0000\u06de\u06e2\u0003"+ - "\u00b4Z\u0000\u06df\u06e2\u0003\u0154\u00aa\u0000\u06e0\u06e2\u0003\u00b8"+ - "\\\u0000\u06e1\u06de\u0001\u0000\u0000\u0000\u06e1\u06df\u0001\u0000\u0000"+ - "\u0000\u06e1\u06e0\u0001\u0000\u0000\u0000\u06e2\u014d\u0001\u0000\u0000"+ - "\u0000\u06e3\u06e4\u0007\u0011\u0000\u0000\u06e4\u014f\u0001\u0000\u0000"+ - "\u0000\u06e5\u06e6\u0005e\u0000\u0000\u06e6\u0151\u0001\u0000\u0000\u0000"+ - "\u06e7\u06e8\u0005e\u0000\u0000\u06e8\u06e9\u0005p\u0000\u0000\u06e9\u06ea"+ - "\u0005e\u0000\u0000\u06ea\u0153\u0001\u0000\u0000\u0000\u06eb\u06ec\u0003"+ - "\u00ccf\u0000\u06ec\u06ed\u0003\u0156\u00ab\u0000\u06ed\u0155\u0001\u0000"+ - "\u0000\u0000\u06ee\u06f3\u0005h\u0000\u0000\u06ef\u06f1\u0003\u0158\u00ac"+ - "\u0000\u06f0\u06f2\u0005m\u0000\u0000\u06f1\u06f0\u0001\u0000\u0000\u0000"+ - "\u06f1\u06f2\u0001\u0000\u0000\u0000\u06f2\u06f4\u0001\u0000\u0000\u0000"+ - "\u06f3\u06ef\u0001\u0000\u0000\u0000\u06f3\u06f4\u0001\u0000\u0000\u0000"+ - "\u06f4\u06f5\u0001\u0000\u0000\u0000\u06f5\u06f6\u0005i\u0000\u0000\u06f6"+ - "\u0157\u0001\u0000\u0000\u0000\u06f7\u06fc\u0003\u015a\u00ad\u0000\u06f8"+ - "\u06f9\u0005m\u0000\u0000\u06f9\u06fb\u0003\u015a\u00ad\u0000\u06fa\u06f8"+ - "\u0001\u0000\u0000\u0000\u06fb\u06fe\u0001\u0000\u0000\u0000\u06fc\u06fa"+ - "\u0001\u0000\u0000\u0000\u06fc\u06fd\u0001\u0000\u0000\u0000\u06fd\u0159"+ - "\u0001\u0000\u0000\u0000\u06fe\u06fc\u0001\u0000\u0000\u0000\u06ff\u0700"+ - "\u0003\u015c\u00ae\u0000\u0700\u0701\u0005o\u0000\u0000\u0701\u0703\u0001"+ - "\u0000\u0000\u0000\u0702\u06ff\u0001\u0000\u0000\u0000\u0702\u0703\u0001"+ - "\u0000\u0000\u0000\u0703\u0704\u0001\u0000\u0000\u0000\u0704\u0705\u0003"+ - "\u015e\u00af\u0000\u0705\u015b\u0001\u0000\u0000\u0000\u0706\u0709\u0003"+ - "\u00a6S\u0000\u0707\u0709\u0003\u0156\u00ab\u0000\u0708\u0706\u0001\u0000"+ - "\u0000\u0000\u0708\u0707\u0001\u0000\u0000\u0000\u0709\u015d\u0001\u0000"+ - "\u0000\u0000\u070a\u070d\u0003\u00a6S\u0000\u070b\u070d\u0003\u0156\u00ab"+ - "\u0000\u070c\u070a\u0001\u0000\u0000\u0000\u070c\u070b\u0001\u0000\u0000"+ - "\u0000\u070d\u015f\u0001\u0000\u0000\u0000\u070e\u070f\u0005T\u0000\u0000"+ - "\u070f\u0715\u0005h\u0000\u0000\u0710\u0711\u0003\u0162\u00b1\u0000\u0711"+ - "\u0712\u0003\u0172\u00b9\u0000\u0712\u0714\u0001\u0000\u0000\u0000\u0713"+ - "\u0710\u0001\u0000\u0000\u0000\u0714\u0717\u0001\u0000\u0000\u0000\u0715"+ - "\u0713\u0001\u0000\u0000\u0000\u0715\u0716\u0001\u0000\u0000\u0000\u0716"+ - "\u0718\u0001\u0000\u0000\u0000\u0717\u0715\u0001\u0000\u0000\u0000\u0718"+ - "\u0719\u0005i\u0000\u0000\u0719\u0161\u0001\u0000\u0000\u0000\u071a\u071b"+ - "\u0003\u00e6s\u0000\u071b\u071c\u0003\u00c4b\u0000\u071c\u071f\u0001\u0000"+ - "\u0000\u0000\u071d\u071f\u0003\u0166\u00b3\u0000\u071e\u071a\u0001\u0000"+ - "\u0000\u0000\u071e\u071d\u0001\u0000\u0000\u0000\u071f\u0721\u0001\u0000"+ - "\u0000\u0000\u0720\u0722\u0003\u0164\u00b2\u0000\u0721\u0720\u0001\u0000"+ - "\u0000\u0000\u0721\u0722\u0001\u0000\u0000\u0000\u0722\u0163\u0001\u0000"+ - "\u0000\u0000\u0723\u0724\u0007\u0012\u0000\u0000\u0724\u0165\u0001\u0000"+ - "\u0000\u0000\u0725\u0727\u0005\u0087\u0000\u0000\u0726\u0725\u0001\u0000"+ - "\u0000\u0000\u0726\u0727\u0001\u0000\u0000\u0000\u0727\u0728\u0001\u0000"+ - "\u0000\u0000\u0728\u0729\u0003\u012e\u0097\u0000\u0729\u0167\u0001\u0000"+ - "\u0000\u0000\u072a\u072b\u0005j\u0000\u0000\u072b\u072c\u0003\u00a6S\u0000"+ - "\u072c\u072d\u0005k\u0000\u0000\u072d\u0169\u0001\u0000\u0000\u0000\u072e"+ - "\u072f\u0005p\u0000\u0000\u072f\u0730\u0005f\u0000\u0000\u0730\u0731\u0003"+ - "\u00c4b\u0000\u0731\u0732\u0005g\u0000\u0000\u0732\u016b\u0001\u0000\u0000"+ - "\u0000\u0733\u0742\u0005f\u0000\u0000\u0734\u073b\u0003\u00e8t\u0000\u0735"+ - "\u0738\u0003\u0148\u00a4\u0000\u0736\u0737\u0005m\u0000\u0000\u0737\u0739"+ - "\u0003\u00e8t\u0000\u0738\u0736\u0001\u0000\u0000\u0000\u0738\u0739\u0001"+ - "\u0000\u0000\u0000\u0739\u073b\u0001\u0000\u0000\u0000\u073a\u0734\u0001"+ - "\u0000\u0000\u0000\u073a\u0735\u0001\u0000\u0000\u0000\u073b\u073d\u0001"+ - "\u0000\u0000\u0000\u073c\u073e\u0005t\u0000\u0000\u073d\u073c\u0001\u0000"+ - "\u0000\u0000\u073d\u073e\u0001\u0000\u0000\u0000\u073e\u0740\u0001\u0000"+ - "\u0000\u0000\u073f\u0741\u0005m\u0000\u0000\u0740\u073f\u0001\u0000\u0000"+ - "\u0000\u0740\u0741\u0001\u0000\u0000\u0000\u0741\u0743\u0001\u0000\u0000"+ - "\u0000\u0742\u073a\u0001\u0000\u0000\u0000\u0742\u0743\u0001\u0000\u0000"+ - "\u0000\u0743\u0744\u0001\u0000\u0000\u0000\u0744\u0745\u0005g\u0000\u0000"+ - "\u0745\u016d\u0001\u0000\u0000\u0000\u0746\u0747\u0003\u0148\u00a4\u0000"+ - "\u0747\u0748\u0005p\u0000\u0000\u0748\u0749\u0005e\u0000\u0000\u0749\u016f"+ - "\u0001\u0000\u0000\u0000\u074a\u074b\u0003\u00c4b\u0000\u074b\u0171\u0001"+ - "\u0000\u0000\u0000\u074c\u0751\u0005n\u0000\u0000\u074d\u0751\u0005\u0000"+ - "\u0000\u0001\u074e\u0751\u0005\u009f\u0000\u0000\u074f\u0751\u0004\u00b9"+ - "\u0013\u0000\u0750\u074c\u0001\u0000\u0000\u0000\u0750\u074d\u0001\u0000"+ - "\u0000\u0000\u0750\u074e\u0001\u0000\u0000\u0000\u0750\u074f\u0001\u0000"+ - "\u0000\u0000\u0751\u0173\u0001\u0000\u0000\u0000\u00c2\u0182\u0187\u018e"+ + "\u0172\u0000\u0013\u0002\u0000ggrr\u0001\u0000\u0017\u0018\u0001\u0000"+ + "\u0005\b\u0001\u0000AB\u0001\u0000(*\u0002\u0000(*,,\u0001\u0000\u0085"+ + "\u008b\u0001\u0000\u0014\u0015\u0002\u0000\u0080\u0084\u0089\u008a\u0004"+ + "\u0000##ss\u007f\u007f\u0086\u0088\u0001\u0000\u001f!\u0001\u0000\u001c"+ + "\u001e\u0002\u0000HIy~\u0004\u0000--0033__\u0002\u0000\u007f\u0084\u0086"+ + "\u008a\u0001\u0000st\u0002\u0000pp\u00a1\u00a1\u0002\u0000\u008c\u008f"+ + "\u0091\u0092\u0001\u0000\u0098\u0099\u07c4\u0000\u0174\u0001\u0000\u0000"+ + "\u0000\u0002\u0177\u0001\u0000\u0000\u0000\u0004\u017a\u0001\u0000\u0000"+ + "\u0000\u0006\u017d\u0001\u0000\u0000\u0000\b\u0185\u0001\u0000\u0000\u0000"+ + "\n\u018e\u0001\u0000\u0000\u0000\f\u01ae\u0001\u0000\u0000\u0000\u000e"+ + "\u01bb\u0001\u0000\u0000\u0000\u0010\u01be\u0001\u0000\u0000\u0000\u0012"+ + "\u01c6\u0001\u0000\u0000\u0000\u0014\u01d3\u0001\u0000\u0000\u0000\u0016"+ + "\u01e9\u0001\u0000\u0000\u0000\u0018\u01f2\u0001\u0000\u0000\u0000\u001a"+ + "\u01f4\u0001\u0000\u0000\u0000\u001c\u01f6\u0001\u0000\u0000\u0000\u001e"+ + "\u01f9\u0001\u0000\u0000\u0000 \u020d\u0001\u0000\u0000\u0000\"\u020f"+ + "\u0001\u0000\u0000\u0000$\u0211\u0001\u0000\u0000\u0000&\u0216\u0001\u0000"+ + "\u0000\u0000(\u0221\u0001\u0000\u0000\u0000*\u022e\u0001\u0000\u0000\u0000"+ + ",\u0231\u0001\u0000\u0000\u0000.\u023c\u0001\u0000\u0000\u00000\u023e"+ + "\u0001\u0000\u0000\u00002\u0243\u0001\u0000\u0000\u00004\u0248\u0001\u0000"+ + "\u0000\u00006\u024d\u0001\u0000\u0000\u00008\u0252\u0001\u0000\u0000\u0000"+ + ":\u025f\u0001\u0000\u0000\u0000<\u0261\u0001\u0000\u0000\u0000>\u0263"+ + "\u0001\u0000\u0000\u0000@\u0268\u0001\u0000\u0000\u0000B\u026d\u0001\u0000"+ + "\u0000\u0000D\u0272\u0001\u0000\u0000\u0000F\u027b\u0001\u0000\u0000\u0000"+ + "H\u0282\u0001\u0000\u0000\u0000J\u028f\u0001\u0000\u0000\u0000L\u0293"+ + "\u0001\u0000\u0000\u0000N\u029e\u0001\u0000\u0000\u0000P\u02a6\u0001\u0000"+ + "\u0000\u0000R\u02a8\u0001\u0000\u0000\u0000T\u02bd\u0001\u0000\u0000\u0000"+ + "V\u02bf\u0001\u0000\u0000\u0000X\u02cb\u0001\u0000\u0000\u0000Z\u02d8"+ + "\u0001\u0000\u0000\u0000\\\u02dc\u0001\u0000\u0000\u0000^\u02ec\u0001"+ + "\u0000\u0000\u0000`\u02fa\u0001\u0000\u0000\u0000b\u0309\u0001\u0000\u0000"+ + "\u0000d\u030c\u0001\u0000\u0000\u0000f\u0314\u0001\u0000\u0000\u0000h"+ + "\u0316\u0001\u0000\u0000\u0000j\u0321\u0001\u0000\u0000\u0000l\u0329\u0001"+ + "\u0000\u0000\u0000n\u0338\u0001\u0000\u0000\u0000p\u033a\u0001\u0000\u0000"+ + "\u0000r\u0342\u0001\u0000\u0000\u0000t\u0350\u0001\u0000\u0000\u0000v"+ + "\u035c\u0001\u0000\u0000\u0000x\u0366\u0001\u0000\u0000\u0000z\u036a\u0001"+ + "\u0000\u0000\u0000|\u0370\u0001\u0000\u0000\u0000~\u0388\u0001\u0000\u0000"+ + "\u0000\u0080\u0390\u0001\u0000\u0000\u0000\u0082\u039f\u0001\u0000\u0000"+ + "\u0000\u0084\u03a1\u0001\u0000\u0000\u0000\u0086\u03a8\u0001\u0000\u0000"+ + "\u0000\u0088\u03b1\u0001\u0000\u0000\u0000\u008a\u03b6\u0001\u0000\u0000"+ + "\u0000\u008c\u03bb\u0001\u0000\u0000\u0000\u008e\u03c1\u0001\u0000\u0000"+ + "\u0000\u0090\u03c8\u0001\u0000\u0000\u0000\u0092\u03cd\u0001\u0000\u0000"+ + "\u0000\u0094\u03d3\u0001\u0000\u0000\u0000\u0096\u03d8\u0001\u0000\u0000"+ + "\u0000\u0098\u03df\u0001\u0000\u0000\u0000\u009a\u03e9\u0001\u0000\u0000"+ + "\u0000\u009c\u03ed\u0001\u0000\u0000\u0000\u009e\u03f9\u0001\u0000\u0000"+ + "\u0000\u00a0\u03fc\u0001\u0000\u0000\u0000\u00a2\u0400\u0001\u0000\u0000"+ + "\u0000\u00a4\u0407\u0001\u0000\u0000\u0000\u00a6\u0420\u0001\u0000\u0000"+ + "\u0000\u00a8\u045c\u0001\u0000\u0000\u0000\u00aa\u045e\u0001\u0000\u0000"+ + "\u0000\u00ac\u0461\u0001\u0000\u0000\u0000\u00ae\u0466\u0001\u0000\u0000"+ + "\u0000\u00b0\u046f\u0001\u0000\u0000\u0000\u00b2\u047d\u0001\u0000\u0000"+ + "\u0000\u00b4\u0487\u0001\u0000\u0000\u0000\u00b6\u0499\u0001\u0000\u0000"+ + "\u0000\u00b8\u04b4\u0001\u0000\u0000\u0000\u00ba\u04b7\u0001\u0000\u0000"+ + "\u0000\u00bc\u04bf\u0001\u0000\u0000\u0000\u00be\u04c8\u0001\u0000\u0000"+ + "\u0000\u00c0\u04d8\u0001\u0000\u0000\u0000\u00c2\u04eb\u0001\u0000\u0000"+ + "\u0000\u00c4\u04f4\u0001\u0000\u0000\u0000\u00c6\u04ff\u0001\u0000\u0000"+ + "\u0000\u00c8\u0501\u0001\u0000\u0000\u0000\u00ca\u0504\u0001\u0000\u0000"+ + "\u0000\u00cc\u051b\u0001\u0000\u0000\u0000\u00ce\u051d\u0001\u0000\u0000"+ + "\u0000\u00d0\u0522\u0001\u0000\u0000\u0000\u00d2\u0536\u0001\u0000\u0000"+ + "\u0000\u00d4\u0538\u0001\u0000\u0000\u0000\u00d6\u053a\u0001\u0000\u0000"+ + "\u0000\u00d8\u053d\u0001\u0000\u0000\u0000\u00da\u0547\u0001\u0000\u0000"+ + "\u0000\u00dc\u0551\u0001\u0000\u0000\u0000\u00de\u0554\u0001\u0000\u0000"+ + "\u0000\u00e0\u0559\u0001\u0000\u0000\u0000\u00e2\u055b\u0001\u0000\u0000"+ + "\u0000\u00e4\u0569\u0001\u0000\u0000\u0000\u00e6\u0571\u0001\u0000\u0000"+ + "\u0000\u00e8\u0579\u0001\u0000\u0000\u0000\u00ea\u0581\u0001\u0000\u0000"+ + "\u0000\u00ec\u058f\u0001\u0000\u0000\u0000\u00ee\u0595\u0001\u0000\u0000"+ + "\u0000\u00f0\u05a3\u0001\u0000\u0000\u0000\u00f2\u05b5\u0001\u0000\u0000"+ + "\u0000\u00f4\u05be\u0001\u0000\u0000\u0000\u00f6\u05c0\u0001\u0000\u0000"+ + "\u0000\u00f8\u05c2\u0001\u0000\u0000\u0000\u00fa\u05c6\u0001\u0000\u0000"+ + "\u0000\u00fc\u05c9\u0001\u0000\u0000\u0000\u00fe\u05cd\u0001\u0000\u0000"+ + "\u0000\u0100\u05cf\u0001\u0000\u0000\u0000\u0102\u05d4\u0001\u0000\u0000"+ + "\u0000\u0104\u05d8\u0001\u0000\u0000\u0000\u0106\u05dc\u0001\u0000\u0000"+ + "\u0000\u0108\u05e0\u0001\u0000\u0000\u0000\u010a\u05e3\u0001\u0000\u0000"+ + "\u0000\u010c\u05e5\u0001\u0000\u0000\u0000\u010e\u05fa\u0001\u0000\u0000"+ + "\u0000\u0110\u05fc\u0001\u0000\u0000\u0000\u0112\u0612\u0001\u0000\u0000"+ + "\u0000\u0114\u061a\u0001\u0000\u0000\u0000\u0116\u061c\u0001\u0000\u0000"+ + "\u0000\u0118\u0632\u0001\u0000\u0000\u0000\u011a\u063a\u0001\u0000\u0000"+ + "\u0000\u011c\u0642\u0001\u0000\u0000\u0000\u011e\u0646\u0001\u0000\u0000"+ + "\u0000\u0120\u0652\u0001\u0000\u0000\u0000\u0122\u065c\u0001\u0000\u0000"+ + "\u0000\u0124\u0667\u0001\u0000\u0000\u0000\u0126\u066f\u0001\u0000\u0000"+ + "\u0000\u0128\u0673\u0001\u0000\u0000\u0000\u012a\u0680\u0001\u0000\u0000"+ + "\u0000\u012c\u068a\u0001\u0000\u0000\u0000\u012e\u068f\u0001\u0000\u0000"+ + "\u0000\u0130\u0691\u0001\u0000\u0000\u0000\u0132\u0696\u0001\u0000\u0000"+ + "\u0000\u0134\u0698\u0001\u0000\u0000\u0000\u0136\u069a\u0001\u0000\u0000"+ + "\u0000\u0138\u069d\u0001\u0000\u0000\u0000\u013a\u06a1\u0001\u0000\u0000"+ + "\u0000\u013c\u06ac\u0001\u0000\u0000\u0000\u013e\u06b0\u0001\u0000\u0000"+ + "\u0000\u0140\u06b7\u0001\u0000\u0000\u0000\u0142\u06bb\u0001\u0000\u0000"+ + "\u0000\u0144\u06bd\u0001\u0000\u0000\u0000\u0146\u06cd\u0001\u0000\u0000"+ + "\u0000\u0148\u06da\u0001\u0000\u0000\u0000\u014a\u06e2\u0001\u0000\u0000"+ + "\u0000\u014c\u06e7\u0001\u0000\u0000\u0000\u014e\u06e9\u0001\u0000\u0000"+ + "\u0000\u0150\u06eb\u0001\u0000\u0000\u0000\u0152\u06ed\u0001\u0000\u0000"+ + "\u0000\u0154\u06f1\u0001\u0000\u0000\u0000\u0156\u06f4\u0001\u0000\u0000"+ + "\u0000\u0158\u06fd\u0001\u0000\u0000\u0000\u015a\u0708\u0001\u0000\u0000"+ + "\u0000\u015c\u070e\u0001\u0000\u0000\u0000\u015e\u0712\u0001\u0000\u0000"+ + "\u0000\u0160\u0714\u0001\u0000\u0000\u0000\u0162\u0724\u0001\u0000\u0000"+ + "\u0000\u0164\u0729\u0001\u0000\u0000\u0000\u0166\u072c\u0001\u0000\u0000"+ + "\u0000\u0168\u0730\u0001\u0000\u0000\u0000\u016a\u0734\u0001\u0000\u0000"+ + "\u0000\u016c\u0739\u0001\u0000\u0000\u0000\u016e\u074c\u0001\u0000\u0000"+ + "\u0000\u0170\u0750\u0001\u0000\u0000\u0000\u0172\u0756\u0001\u0000\u0000"+ + "\u0000\u0174\u0175\u0003\u00a6S\u0000\u0175\u0176\u0005\u0000\u0000\u0001"+ + "\u0176\u0001\u0001\u0000\u0000\u0000\u0177\u0178\u0003\u00a8T\u0000\u0178"+ + "\u0179\u0005\u0000\u0000\u0001\u0179\u0003\u0001\u0000\u0000\u0000\u017a"+ + "\u017b\u0003\u00c4b\u0000\u017b\u017c\u0005\u0000\u0000\u0001\u017c\u0005"+ + "\u0001\u0000\u0000\u0000\u017d\u0182\u0003\b\u0004\u0000\u017e\u017f\u0005"+ + "o\u0000\u0000\u017f\u0181\u0003\b\u0004\u0000\u0180\u017e\u0001\u0000"+ + "\u0000\u0000\u0181\u0184\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000"+ + "\u0000\u0000\u0182\u0183\u0001\u0000\u0000\u0000\u0183\u0007\u0001\u0000"+ + "\u0000\u0000\u0184\u0182\u0001\u0000\u0000\u0000\u0185\u0187\u0005g\u0000"+ + "\u0000\u0186\u0188\u0005<\u0000\u0000\u0187\u0186\u0001\u0000\u0000\u0000"+ + "\u0187\u0188\u0001\u0000\u0000\u0000\u0188\t\u0001\u0000\u0000\u0000\u0189"+ + "\u018a\u0003\u000e\u0007\u0000\u018a\u018b\u0003\u0172\u00b9\u0000\u018b"+ + "\u018d\u0001\u0000\u0000\u0000\u018c\u0189\u0001\u0000\u0000\u0000\u018d"+ + "\u0190\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e"+ + "\u018f\u0001\u0000\u0000\u0000\u018f\u0191\u0001\u0000\u0000\u0000\u0190"+ + "\u018e\u0001\u0000\u0000\u0000\u0191\u0192\u0003\u00dcn\u0000\u0192\u0198"+ + "\u0003\u0172\u00b9\u0000\u0193\u0194\u0003\u0014\n\u0000\u0194\u0195\u0003"+ + "\u0172\u00b9\u0000\u0195\u0197\u0001\u0000\u0000\u0000\u0196\u0193\u0001"+ + "\u0000\u0000\u0000\u0197\u019a\u0001\u0000\u0000\u0000\u0198\u0196\u0001"+ + "\u0000\u0000\u0000\u0198\u0199\u0001\u0000\u0000\u0000\u0199\u01a4\u0001"+ + "\u0000\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000\u019b\u019f\u0003"+ + "\u008aE\u0000\u019c\u019f\u0003\u00e0p\u0000\u019d\u019f\u0003\u0016\u000b"+ + "\u0000\u019e\u019b\u0001\u0000\u0000\u0000\u019e\u019c\u0001\u0000\u0000"+ + "\u0000\u019e\u019d\u0001\u0000\u0000\u0000\u019f\u01a0\u0001\u0000\u0000"+ + "\u0000\u01a0\u01a1\u0003\u0172\u00b9\u0000\u01a1\u01a3\u0001\u0000\u0000"+ + "\u0000\u01a2\u019e\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001\u0000\u0000"+ + "\u0000\u01a4\u01a2\u0001\u0000\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000"+ + "\u0000\u01a5\u01a7\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000"+ + "\u0000\u01a7\u01a8\u0005\u0000\u0000\u0001\u01a8\u000b\u0001\u0000\u0000"+ + "\u0000\u01a9\u01aa\u0003\u000e\u0007\u0000\u01aa\u01ab\u0003\u0172\u00b9"+ + "\u0000\u01ab\u01ad\u0001\u0000\u0000\u0000\u01ac\u01a9\u0001\u0000\u0000"+ + "\u0000\u01ad\u01b0\u0001\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000"+ + "\u0000\u01ae\u01af\u0001\u0000\u0000\u0000\u01af\u01b1\u0001\u0000\u0000"+ + "\u0000\u01b0\u01ae\u0001\u0000\u0000\u0000\u01b1\u01b2\u0003\u00dcn\u0000"+ + "\u01b2\u01b8\u0003\u0172\u00b9\u0000\u01b3\u01b4\u0003\u0014\n\u0000\u01b4"+ + "\u01b5\u0003\u0172\u00b9\u0000\u01b5\u01b7\u0001\u0000\u0000\u0000\u01b6"+ + "\u01b3\u0001\u0000\u0000\u0000\u01b7\u01ba\u0001\u0000\u0000\u0000\u01b8"+ + "\u01b6\u0001\u0000\u0000\u0000\u01b8\u01b9\u0001\u0000\u0000\u0000\u01b9"+ + "\r\u0001\u0000\u0000\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01bb\u01bc"+ + "\u0005E\u0000\u0000\u01bc\u01bd\u0003\u00a6S\u0000\u01bd\u000f\u0001\u0000"+ + "\u0000\u0000\u01be\u01bf\u0005F\u0000\u0000\u01bf\u01c0\u0003\u00a6S\u0000"+ + "\u01c0\u0011\u0001\u0000\u0000\u0000\u01c1\u01c2\u0003\u0010\b\u0000\u01c2"+ + "\u01c3\u0003\u0172\u00b9\u0000\u01c3\u01c5\u0001\u0000\u0000\u0000\u01c4"+ + "\u01c1\u0001\u0000\u0000\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6"+ + "\u01c4\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7"+ + "\u01ca\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9"+ + "\u01cb\u0007\u0000\u0000\u0000\u01ca\u01c9\u0001\u0000\u0000\u0000\u01ca"+ + "\u01cb\u0001\u0000\u0000\u0000\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc"+ + "\u01cd\u0003\u00deo\u0000\u01cd\u0013\u0001\u0000\u0000\u0000\u01ce\u01cf"+ + "\u0003\u0010\b\u0000\u01cf\u01d0\u0003\u0172\u00b9\u0000\u01d0\u01d2\u0001"+ + "\u0000\u0000\u0000\u01d1\u01ce\u0001\u0000\u0000\u0000\u01d2\u01d5\u0001"+ + "\u0000\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001"+ + "\u0000\u0000\u0000\u01d4\u01e3\u0001\u0000\u0000\u0000\u01d5\u01d3\u0001"+ + "\u0000\u0000\u0000\u01d6\u01d7\u0005c\u0000\u0000\u01d7\u01e4\u0003\u0012"+ + "\t\u0000\u01d8\u01d9\u0005c\u0000\u0000\u01d9\u01df\u0005h\u0000\u0000"+ + "\u01da\u01db\u0003\u0012\t\u0000\u01db\u01dc\u0003\u0172\u00b9\u0000\u01dc"+ + "\u01de\u0001\u0000\u0000\u0000\u01dd\u01da\u0001\u0000\u0000\u0000\u01de"+ + "\u01e1\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df"+ + "\u01e0\u0001\u0000\u0000\u0000\u01e0\u01e2\u0001\u0000\u0000\u0000\u01e1"+ + "\u01df\u0001\u0000\u0000\u0000\u01e2\u01e4\u0005i\u0000\u0000\u01e3\u01d6"+ + "\u0001\u0000\u0000\u0000\u01e3\u01d8\u0001\u0000\u0000\u0000\u01e4\u0015"+ + "\u0001\u0000\u0000\u0000\u01e5\u01ea\u0003|>\u0000\u01e6\u01ea\u0003\u0092"+ + "I\u0000\u01e7\u01ea\u0003\u0096K\u0000\u01e8\u01ea\u0003\u0090H\u0000"+ + "\u01e9\u01e5\u0001\u0000\u0000\u0000\u01e9\u01e6\u0001\u0000\u0000\u0000"+ + "\u01e9\u01e7\u0001\u0000\u0000\u0000\u01e9\u01e8\u0001\u0000\u0000\u0000"+ + "\u01ea\u0017\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005\u001b\u0000\u0000"+ + "\u01ec\u01f3\u0003\u00a8T\u0000\u01ed\u01ee\u0007\u0001\u0000\u0000\u01ee"+ + "\u01f3\u0003.\u0017\u0000\u01ef\u01f0\u0007\u0002\u0000\u0000\u01f0\u01f3"+ + "\u0003\u00a6S\u0000\u01f1\u01f3\u0003h4\u0000\u01f2\u01eb\u0001\u0000"+ + "\u0000\u0000\u01f2\u01ed\u0001\u0000\u0000\u0000\u01f2\u01ef\u0001\u0000"+ + "\u0000\u0000\u01f2\u01f1\u0001\u0000\u0000\u0000\u01f3\u0019\u0001\u0000"+ + "\u0000\u0000\u01f4\u01f5\u0003\u001c\u000e\u0000\u01f5\u001b\u0001\u0000"+ + "\u0000\u0000\u01f6\u01f7\u0003`0\u0000\u01f7\u01f8\u0003\u001e\u000f\u0000"+ + "\u01f8\u001d\u0001\u0000\u0000\u0000\u01f9\u01fa\u0005D\u0000\u0000\u01fa"+ + "\u01fc\u0005h\u0000\u0000\u01fb\u01fd\u0003\u00f2y\u0000\u01fc\u01fb\u0001"+ + "\u0000\u0000\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd\u01fe\u0001"+ + "\u0000\u0000\u0000\u01fe\u01ff\u0005i\u0000\u0000\u01ff\u001f\u0001\u0000"+ + "\u0000\u0000\u0200\u020e\u0003F#\u0000\u0201\u020e\u0003D\"\u0000\u0202"+ + "\u020e\u0003B!\u0000\u0203\u020e\u0003$\u0012\u0000\u0204\u020e\u0003"+ + "@ \u0000\u0205\u020e\u00038\u001c\u0000\u0206\u020e\u0003>\u001f\u0000"+ + "\u0207\u020e\u00036\u001b\u0000\u0208\u020e\u00032\u0019\u0000\u0209\u020e"+ + "\u00030\u0018\u0000\u020a\u020e\u00034\u001a\u0000\u020b\u020e\u0003\""+ + "\u0011\u0000\u020c\u020e\u0003H$\u0000\u020d\u0200\u0001\u0000\u0000\u0000"+ + "\u020d\u0201\u0001\u0000\u0000\u0000\u020d\u0202\u0001\u0000\u0000\u0000"+ + "\u020d\u0203\u0001\u0000\u0000\u0000\u020d\u0204\u0001\u0000\u0000\u0000"+ + "\u020d\u0205\u0001\u0000\u0000\u0000\u020d\u0206\u0001\u0000\u0000\u0000"+ + "\u020d\u0207\u0001\u0000\u0000\u0000\u020d\u0208\u0001\u0000\u0000\u0000"+ + "\u020d\u0209\u0001\u0000\u0000\u0000\u020d\u020a\u0001\u0000\u0000\u0000"+ + "\u020d\u020b\u0001\u0000\u0000\u0000\u020d\u020c\u0001\u0000\u0000\u0000"+ + "\u020e!\u0001\u0000\u0000\u0000\u020f\u0210\u0007\u0003\u0000\u0000\u0210"+ + "#\u0001\u0000\u0000\u0000\u0211\u0212\u0005`\u0000\u0000\u0212\u0213\u0005"+ + "l\u0000\u0000\u0213\u0214\u0003\u00c4b\u0000\u0214\u0215\u0005m\u0000"+ + "\u0000\u0215%\u0001\u0000\u0000\u0000\u0216\u021b\u0003(\u0014\u0000\u0217"+ + "\u0218\u0005o\u0000\u0000\u0218\u021a\u0003(\u0014\u0000\u0219\u0217\u0001"+ + "\u0000\u0000\u0000\u021a\u021d\u0001\u0000\u0000\u0000\u021b\u0219\u0001"+ + "\u0000\u0000\u0000\u021b\u021c\u0001\u0000\u0000\u0000\u021c\u021f\u0001"+ + "\u0000\u0000\u0000\u021d\u021b\u0001\u0000\u0000\u0000\u021e\u0220\u0005"+ + "o\u0000\u0000\u021f\u021e\u0001\u0000\u0000\u0000\u021f\u0220\u0001\u0000"+ + "\u0000\u0000\u0220\'\u0001\u0000\u0000\u0000\u0221\u0226\u0005g\u0000"+ + "\u0000\u0222\u0223\u0005o\u0000\u0000\u0223\u0225\u0005g\u0000\u0000\u0224"+ + "\u0222\u0001\u0000\u0000\u0000\u0225\u0228\u0001\u0000\u0000\u0000\u0226"+ + "\u0224\u0001\u0000\u0000\u0000\u0226\u0227\u0001\u0000\u0000\u0000\u0227"+ + "\u0229\u0001\u0000\u0000\u0000\u0228\u0226\u0001\u0000\u0000\u0000\u0229"+ + "\u022a\u0003\u0134\u009a\u0000\u022a)\u0001\u0000\u0000\u0000\u022b\u022d"+ + "\u0003,\u0016\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d\u0230\u0001"+ + "\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e\u022f\u0001"+ + "\u0000\u0000\u0000\u022f+\u0001\u0000\u0000\u0000\u0230\u022e\u0001\u0000"+ + "\u0000\u0000\u0231\u0232\u0005j\u0000\u0000\u0232\u0237\u0003\u00a6S\u0000"+ + "\u0233\u0234\u0005o\u0000\u0000\u0234\u0236\u0003\u00a6S\u0000\u0235\u0233"+ + "\u0001\u0000\u0000\u0000\u0236\u0239\u0001\u0000\u0000\u0000\u0237\u0235"+ + "\u0001\u0000\u0000\u0000\u0237\u0238\u0001\u0000\u0000\u0000\u0238\u023a"+ + "\u0001\u0000\u0000\u0000\u0239\u0237\u0001\u0000\u0000\u0000\u023a\u023b"+ + "\u0005k\u0000\u0000\u023b-\u0001\u0000\u0000\u0000\u023c\u023d\u0003\u00b6"+ + "[\u0000\u023d/\u0001\u0000\u0000\u0000\u023e\u023f\u00051\u0000\u0000"+ + "\u023f\u0240\u0005h\u0000\u0000\u0240\u0241\u0003\u00a6S\u0000\u0241\u0242"+ + "\u0005i\u0000\u0000\u02421\u0001\u0000\u0000\u0000\u0243\u0244\u00057"+ + "\u0000\u0000\u0244\u0245\u0005l\u0000\u0000\u0245\u0246\u0003\u00c4b\u0000"+ + "\u0246\u0247\u0005m\u0000\u0000\u02473\u0001\u0000\u0000\u0000\u0248\u0249"+ + "\u00052\u0000\u0000\u0249\u024a\u0005h\u0000\u0000\u024a\u024b\u0003\u00a6"+ + "S\u0000\u024b\u024c\u0005i\u0000\u0000\u024c5\u0001\u0000\u0000\u0000"+ + "\u024d\u024e\u0007\u0004\u0000\u0000\u024e\u024f\u0005h\u0000\u0000\u024f"+ + "\u0250\u0003\u00a6S\u0000\u0250\u0251\u0005i\u0000\u0000\u02517\u0001"+ + "\u0000\u0000\u0000\u0252\u0257\u0005\u0011\u0000\u0000\u0253\u0254\u0005"+ + "l\u0000\u0000\u0254\u0255\u0003:\u001d\u0000\u0255\u0256\u0005m\u0000"+ + "\u0000\u0256\u0258\u0001\u0000\u0000\u0000\u0257\u0253\u0001\u0000\u0000"+ + "\u0000\u0257\u0258\u0001\u0000\u0000\u0000\u0258\u0259\u0001\u0000\u0000"+ + "\u0000\u0259\u025a\u0005h\u0000\u0000\u025a\u025b\u0003\u00a6S\u0000\u025b"+ + "\u025c\u0005i\u0000\u0000\u025c9\u0001\u0000\u0000\u0000\u025d\u0260\u0003"+ + "<\u001e\u0000\u025e\u0260\u0005\u0013\u0000\u0000\u025f\u025d\u0001\u0000"+ + "\u0000\u0000\u025f\u025e\u0001\u0000\u0000\u0000\u0260;\u0001\u0000\u0000"+ + "\u0000\u0261\u0262\u0005g\u0000\u0000\u0262=\u0001\u0000\u0000\u0000\u0263"+ + "\u0264\u0005\u0012\u0000\u0000\u0264\u0265\u0005h\u0000\u0000\u0265\u0266"+ + "\u0003\u00a6S\u0000\u0266\u0267\u0005i\u0000\u0000\u0267?\u0001\u0000"+ + "\u0000\u0000\u0268\u0269\u0005:\u0000\u0000\u0269\u026a\u0005h\u0000\u0000"+ + "\u026a\u026b\u0003\u00a6S\u0000\u026b\u026c\u0005i\u0000\u0000\u026cA"+ + "\u0001\u0000\u0000\u0000\u026d\u026e\u00059\u0000\u0000\u026e\u026f\u0005"+ + "h\u0000\u0000\u026f\u0270\u0003\u00a6S\u0000\u0270\u0271\u0005i\u0000"+ + "\u0000\u0271C\u0001\u0000\u0000\u0000\u0272\u0273\u0005\u0016\u0000\u0000"+ + "\u0273\u0274\u0005h\u0000\u0000\u0274\u0277\u0003\u00a6S\u0000\u0275\u0276"+ + "\u0005o\u0000\u0000\u0276\u0278\u0003\u00a6S\u0000\u0277\u0275\u0001\u0000"+ + "\u0000\u0000\u0277\u0278\u0001\u0000\u0000\u0000\u0278\u0279\u0001\u0000"+ + "\u0000\u0000\u0279\u027a\u0005i\u0000\u0000\u027aE\u0001\u0000\u0000\u0000"+ + "\u027b\u027c\u0007\u0004\u0000\u0000\u027c\u027d\u0005l\u0000\u0000\u027d"+ + "\u027e\u0003\u00a6S\u0000\u027e\u027f\u0005=\u0000\u0000\u027f\u0280\u0003"+ + "\u00a6S\u0000\u0280\u0281\u0005m\u0000\u0000\u0281G\u0001\u0000\u0000"+ + "\u0000\u0282\u0283\u00056\u0000\u0000\u0283\u0284\u0003\u00a6S\u0000\u0284"+ + "\u028a\u0005j\u0000\u0000\u0285\u0286\u0003J%\u0000\u0286\u0287\u0003"+ + "\u0172\u00b9\u0000\u0287\u0289\u0001\u0000\u0000\u0000\u0288\u0285\u0001"+ + "\u0000\u0000\u0000\u0289\u028c\u0001\u0000\u0000\u0000\u028a\u0288\u0001"+ + "\u0000\u0000\u0000\u028a\u028b\u0001\u0000\u0000\u0000\u028b\u028d\u0001"+ + "\u0000\u0000\u0000\u028c\u028a\u0001\u0000\u0000\u0000\u028d\u028e\u0005"+ + "k\u0000\u0000\u028eI\u0001\u0000\u0000\u0000\u028f\u0290\u0003l6\u0000"+ + "\u0290\u0291\u0005q\u0000\u0000\u0291\u0292\u0003\u00a6S\u0000\u0292K"+ + "\u0001\u0000\u0000\u0000\u0293\u0294\u0005l\u0000\u0000\u0294\u0299\u0003"+ + "N\'\u0000\u0295\u0296\u0005o\u0000\u0000\u0296\u0298\u0003N\'\u0000\u0297"+ + "\u0295\u0001\u0000\u0000\u0000\u0298\u029b\u0001\u0000\u0000\u0000\u0299"+ + "\u0297\u0001\u0000\u0000\u0000\u0299\u029a\u0001\u0000\u0000\u0000\u029a"+ + "\u029c\u0001\u0000\u0000\u0000\u029b\u0299\u0001\u0000\u0000\u0000\u029c"+ + "\u029d\u0005m\u0000\u0000\u029dM\u0001\u0000\u0000\u0000\u029e\u029f\u0003"+ + "\u00a6S\u0000\u029f\u02a0\u0005n\u0000\u0000\u02a0\u02a1\u0003\u00a6S"+ + "\u0000\u02a1O\u0001\u0000\u0000\u0000\u02a2\u02a7\u0003^/\u0000\u02a3"+ + "\u02a7\u0003\\.\u0000\u02a4\u02a7\u0003R)\u0000\u02a5\u02a7\u0003V+\u0000"+ + "\u02a6\u02a2\u0001\u0000\u0000\u0000\u02a6\u02a3\u0001\u0000\u0000\u0000"+ + "\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6\u02a5\u0001\u0000\u0000\u0000"+ + "\u02a7Q\u0001\u0000\u0000\u0000\u02a8\u02a9\u00053\u0000\u0000\u02a9\u02af"+ + "\u0005j\u0000\u0000\u02aa\u02ab\u0003T*\u0000\u02ab\u02ac\u0003\u0172"+ + "\u00b9\u0000\u02ac\u02ae\u0001\u0000\u0000\u0000\u02ad\u02aa\u0001\u0000"+ + "\u0000\u0000\u02ae\u02b1\u0001\u0000\u0000\u0000\u02af\u02ad\u0001\u0000"+ + "\u0000\u0000\u02af\u02b0\u0001\u0000\u0000\u0000\u02b0\u02b2\u0001\u0000"+ + "\u0000\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2\u02b3\u0005k\u0000"+ + "\u0000\u02b3S\u0001\u0000\u0000\u0000\u02b4\u02b5\u0005O\u0000\u0000\u02b5"+ + "\u02b6\u0005g\u0000\u0000\u02b6\u02be\u0003\u0140\u00a0\u0000\u02b7\u02b8"+ + "\u00054\u0000\u0000\u02b8\u02b9\u0005j\u0000\u0000\u02b9\u02ba\u0003\u00a6"+ + "S\u0000\u02ba\u02bb\u0003\u0172\u00b9\u0000\u02bb\u02bc\u0005k\u0000\u0000"+ + "\u02bc\u02be\u0001\u0000\u0000\u0000\u02bd\u02b4\u0001\u0000\u0000\u0000"+ + "\u02bd\u02b7\u0001\u0000\u0000\u0000\u02beU\u0001\u0000\u0000\u0000\u02bf"+ + "\u02c0\u00055\u0000\u0000\u02c0\u02c6\u0005j\u0000\u0000\u02c1\u02c2\u0003"+ + "X,\u0000\u02c2\u02c3\u0003\u0172\u00b9\u0000\u02c3\u02c5\u0001\u0000\u0000"+ + "\u0000\u02c4\u02c1\u0001\u0000\u0000\u0000\u02c5\u02c8\u0001\u0000\u0000"+ + "\u0000\u02c6\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000"+ + "\u0000\u02c7\u02c9\u0001\u0000\u0000\u0000\u02c8\u02c6\u0001\u0000\u0000"+ + "\u0000\u02c9\u02ca\u0005k\u0000\u0000\u02caW\u0001\u0000\u0000\u0000\u02cb"+ + "\u02cc\u0005g\u0000\u0000\u02cc\u02d2\u0005j\u0000\u0000\u02cd\u02ce\u0003"+ + "Z-\u0000\u02ce\u02cf\u0003\u0172\u00b9\u0000\u02cf\u02d1\u0001\u0000\u0000"+ + "\u0000\u02d0\u02cd\u0001\u0000\u0000\u0000\u02d1\u02d4\u0001\u0000\u0000"+ + "\u0000\u02d2\u02d0\u0001\u0000\u0000\u0000\u02d2\u02d3\u0001\u0000\u0000"+ + "\u0000\u02d3\u02d5\u0001\u0000\u0000\u0000\u02d4\u02d2\u0001\u0000\u0000"+ + "\u0000\u02d5\u02d6\u0005k\u0000\u0000\u02d6Y\u0001\u0000\u0000\u0000\u02d7"+ + "\u02d9\u0003\u00e6s\u0000\u02d8\u02d7\u0001\u0000\u0000\u0000\u02d8\u02d9"+ + "\u0001\u0000\u0000\u0000\u02d9\u02da\u0001\u0000\u0000\u0000\u02da\u02db"+ + "\u0003\u00c4b\u0000\u02db[\u0001\u0000\u0000\u0000\u02dc\u02dd\u0005\u001b"+ + "\u0000\u0000\u02dd\u02de\u0005l\u0000\u0000\u02de\u02df\u0005m\u0000\u0000"+ + "\u02df\u02e0\u0003\u0134\u009a\u0000\u02e0]\u0001\u0000\u0000\u0000\u02e1"+ + "\u02e2\u0007\u0005\u0000\u0000\u02e2\u02e3\u0005l\u0000\u0000\u02e3\u02e4"+ + "\u0003\u00c4b\u0000\u02e4\u02e5\u0005m\u0000\u0000\u02e5\u02ed\u0001\u0000"+ + "\u0000\u0000\u02e6\u02e7\u0005+\u0000\u0000\u02e7\u02e8\u0005l\u0000\u0000"+ + "\u02e8\u02e9\u0003\u00c4b\u0000\u02e9\u02ea\u0005m\u0000\u0000\u02ea\u02eb"+ + "\u0003\u00c4b\u0000\u02eb\u02ed\u0001\u0000\u0000\u0000\u02ec\u02e1\u0001"+ + "\u0000\u0000\u0000\u02ec\u02e6\u0001\u0000\u0000\u0000\u02ed_\u0001\u0000"+ + "\u0000\u0000\u02ee\u02f6\u0003b1\u0000\u02ef\u02f0\u0005K\u0000\u0000"+ + "\u02f0\u02f6\u00060\uffff\uffff\u0000\u02f1\u02f2\u0005\u000e\u0000\u0000"+ + "\u02f2\u02f6\u00060\uffff\uffff\u0000\u02f3\u02f4\u0005C\u0000\u0000\u02f4"+ + "\u02f6\u00060\uffff\uffff\u0000\u02f5\u02ee\u0001\u0000\u0000\u0000\u02f5"+ + "\u02ef\u0001\u0000\u0000\u0000\u02f5\u02f1\u0001\u0000\u0000\u0000\u02f5"+ + "\u02f3\u0001\u0000\u0000\u0000\u02f6\u02f7\u0001\u0000\u0000\u0000\u02f7"+ + "\u02f9\u0003\u0172\u00b9\u0000\u02f8\u02f5\u0001\u0000\u0000\u0000\u02f9"+ + "\u02fc\u0001\u0000\u0000\u0000\u02fa\u02fb\u0001\u0000\u0000\u0000\u02fa"+ + "\u02f8\u0001\u0000\u0000\u0000\u02fb\u02ff\u0001\u0000\u0000\u0000\u02fc"+ + "\u02fa\u0001\u0000\u0000\u0000\u02fd\u02fe\u0005\u000e\u0000\u0000\u02fe"+ + "\u0300\u00060\uffff\uffff\u0000\u02ff\u02fd\u0001\u0000\u0000\u0000\u02ff"+ + "\u0300\u0001\u0000\u0000\u0000\u0300a\u0001\u0000\u0000\u0000\u0301\u0302"+ + "\u0005\t\u0000\u0000\u0302\u030a\u0003f3\u0000\u0303\u0304\u0005\n\u0000"+ + "\u0000\u0304\u030a\u0003f3\u0000\u0305\u0306\u0005\u000b\u0000\u0000\u0306"+ + "\u030a\u0003f3\u0000\u0307\u0308\u0005\r\u0000\u0000\u0308\u030a\u0003"+ + "d2\u0000\u0309\u0301\u0001\u0000\u0000\u0000\u0309\u0303\u0001\u0000\u0000"+ + "\u0000\u0309\u0305\u0001\u0000\u0000\u0000\u0309\u0307\u0001\u0000\u0000"+ + "\u0000\u030ac\u0001\u0000\u0000\u0000\u030b\u030d\u0003\u00e8t\u0000\u030c"+ + "\u030b\u0001\u0000\u0000\u0000\u030c\u030d\u0001\u0000\u0000\u0000\u030d"+ + "\u0310\u0001\u0000\u0000\u0000\u030e\u030f\u0005^\u0000\u0000\u030f\u0311"+ + "\u0003\u00a6S\u0000\u0310\u030e\u0001\u0000\u0000\u0000\u0310\u0311\u0001"+ + "\u0000\u0000\u0000\u0311e\u0001\u0000\u0000\u0000\u0312\u0315\u0001\u0000"+ + "\u0000\u0000\u0313\u0315\u0003\u00a6S\u0000\u0314\u0312\u0001\u0000\u0000"+ + "\u0000\u0314\u0313\u0001\u0000\u0000\u0000\u0315g\u0001\u0000\u0000\u0000"+ + "\u0316\u0317\u00056\u0000\u0000\u0317\u0318\u0003\u00a6S\u0000\u0318\u031c"+ + "\u0005j\u0000\u0000\u0319\u031b\u0003j5\u0000\u031a\u0319\u0001\u0000"+ + "\u0000\u0000\u031b\u031e\u0001\u0000\u0000\u0000\u031c\u031a\u0001\u0000"+ + "\u0000\u0000\u031c\u031d\u0001\u0000\u0000\u0000\u031d\u031f\u0001\u0000"+ + "\u0000\u0000\u031e\u031c\u0001\u0000\u0000\u0000\u031f\u0320\u0005k\u0000"+ + "\u0000\u0320i\u0001\u0000\u0000\u0000\u0321\u0322\u0003l6\u0000\u0322"+ + "\u0324\u0005q\u0000\u0000\u0323\u0325\u0003\u00f2y\u0000\u0324\u0323\u0001"+ + "\u0000\u0000\u0000\u0324\u0325\u0001\u0000\u0000\u0000\u0325k\u0001\u0000"+ + "\u0000\u0000\u0326\u0327\u0005R\u0000\u0000\u0327\u032a\u0003n7\u0000"+ + "\u0328\u032a\u0005N\u0000\u0000\u0329\u0326\u0001\u0000\u0000\u0000\u0329"+ + "\u0328\u0001\u0000\u0000\u0000\u032am\u0001\u0000\u0000\u0000\u032b\u032c"+ + "\u0005%\u0000\u0000\u032c\u0339\u0005g\u0000\u0000\u032d\u032e\u0003\u00cc"+ + "f\u0000\u032e\u0333\u0005j\u0000\u0000\u032f\u0331\u0003p8\u0000\u0330"+ + "\u0332\u0005o\u0000\u0000\u0331\u0330\u0001\u0000\u0000\u0000\u0331\u0332"+ + "\u0001\u0000\u0000\u0000\u0332\u0334\u0001\u0000\u0000\u0000\u0333\u032f"+ + "\u0001\u0000\u0000\u0000\u0333\u0334\u0001\u0000\u0000\u0000\u0334\u0335"+ + "\u0001\u0000\u0000\u0000\u0335\u0336\u0005k\u0000\u0000\u0336\u0339\u0001"+ + "\u0000\u0000\u0000\u0337\u0339\u0003\u00a6S\u0000\u0338\u032b\u0001\u0000"+ + "\u0000\u0000\u0338\u032d\u0001\u0000\u0000\u0000\u0338\u0337\u0001\u0000"+ + "\u0000\u0000\u0339o\u0001\u0000\u0000\u0000\u033a\u033f\u0003n7\u0000"+ + "\u033b\u033c\u0005o\u0000\u0000\u033c\u033e\u0003n7\u0000\u033d\u033b"+ + "\u0001\u0000\u0000\u0000\u033e\u0341\u0001\u0000\u0000\u0000\u033f\u033d"+ + "\u0001\u0000\u0000\u0000\u033f\u0340\u0001\u0000\u0000\u0000\u0340q\u0001"+ + "\u0000\u0000\u0000\u0341\u033f\u0001\u0000\u0000\u0000\u0342\u0347\u0005"+ + "j\u0000\u0000\u0343\u0344\u0005;\u0000\u0000\u0344\u0345\u0003\u00e6s"+ + "\u0000\u0345\u0346\u0003\u0172\u00b9\u0000\u0346\u0348\u0001\u0000\u0000"+ + "\u0000\u0347\u0343\u0001\u0000\u0000\u0000\u0347\u0348\u0001\u0000\u0000"+ + "\u0000\u0348\u034a\u0001\u0000\u0000\u0000\u0349\u034b\u0003\u00f2y\u0000"+ + "\u034a\u0349\u0001\u0000\u0000\u0000\u034a\u034b\u0001\u0000\u0000\u0000"+ + "\u034b\u034c\u0001\u0000\u0000\u0000\u034c\u034d\u0005k\u0000\u0000\u034d"+ + "s\u0001\u0000\u0000\u0000\u034e\u0351\u0003\u0152\u00a9\u0000\u034f\u0351"+ + "\u0005g\u0000\u0000\u0350\u034e\u0001\u0000\u0000\u0000\u0350\u034f\u0001"+ + "\u0000\u0000\u0000\u0351\u035a\u0001\u0000\u0000\u0000\u0352\u0357\u0005"+ + "j\u0000\u0000\u0353\u0355\u0003v;\u0000\u0354\u0356\u0005o\u0000\u0000"+ + "\u0355\u0354\u0001\u0000\u0000\u0000\u0355\u0356\u0001\u0000\u0000\u0000"+ + "\u0356\u0358\u0001\u0000\u0000\u0000\u0357\u0353\u0001\u0000\u0000\u0000"+ + "\u0357\u0358\u0001\u0000\u0000\u0000\u0358\u0359\u0001\u0000\u0000\u0000"+ + "\u0359\u035b\u0005k\u0000\u0000\u035a\u0352\u0001\u0000\u0000\u0000\u035a"+ + "\u035b\u0001\u0000\u0000\u0000\u035bu\u0001\u0000\u0000\u0000\u035c\u0361"+ + "\u0003x<\u0000\u035d\u035e\u0005o\u0000\u0000\u035e\u0360\u0003x<\u0000"+ + "\u035f\u035d\u0001\u0000\u0000\u0000\u0360\u0363\u0001\u0000\u0000\u0000"+ + "\u0361\u035f\u0001\u0000\u0000\u0000\u0361\u0362\u0001\u0000\u0000\u0000"+ + "\u0362w\u0001\u0000\u0000\u0000\u0363\u0361\u0001\u0000\u0000\u0000\u0364"+ + "\u0365\u0005g\u0000\u0000\u0365\u0367\u0005q\u0000\u0000\u0366\u0364\u0001"+ + "\u0000\u0000\u0000\u0366\u0367\u0001\u0000\u0000\u0000\u0367\u0368\u0001"+ + "\u0000\u0000\u0000\u0368\u0369\u0003\u00a6S\u0000\u0369y\u0001\u0000\u0000"+ + "\u0000\u036a\u036b\u0005G\u0000\u0000\u036b\u036c\u0003\u00a6S\u0000\u036c"+ + "\u036d\u0005\u000f\u0000\u0000\u036d\u036e\u0003t:\u0000\u036e\u036f\u0003"+ + "\u00f0x\u0000\u036f{\u0001\u0000\u0000\u0000\u0370\u0371\u0003\u00c4b"+ + "\u0000\u0371\u0372\u0005\u000f\u0000\u0000\u0372\u0385\u0003\u00c4b\u0000"+ + "\u0373\u0379\u0005j\u0000\u0000\u0374\u0375\u0003\u0084B\u0000\u0375\u0376"+ + "\u0003\u0172\u00b9\u0000\u0376\u0378\u0001\u0000\u0000\u0000\u0377\u0374"+ + "\u0001\u0000\u0000\u0000\u0378\u037b\u0001\u0000\u0000\u0000\u0379\u0377"+ + "\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000\u037a\u0381"+ + "\u0001\u0000\u0000\u0000\u037b\u0379\u0001\u0000\u0000\u0000\u037c\u037d"+ + "\u0003~?\u0000\u037d\u037e\u0003\u0172\u00b9\u0000\u037e\u0380\u0001\u0000"+ + "\u0000\u0000\u037f\u037c\u0001\u0000\u0000\u0000\u0380\u0383\u0001\u0000"+ + "\u0000\u0000\u0381\u037f\u0001\u0000\u0000\u0000\u0381\u0382\u0001\u0000"+ + "\u0000\u0000\u0382\u0384\u0001\u0000\u0000\u0000\u0383\u0381\u0001\u0000"+ + "\u0000\u0000\u0384\u0386\u0005k\u0000\u0000\u0385\u0373\u0001\u0000\u0000"+ + "\u0000\u0385\u0386\u0001\u0000\u0000\u0000\u0386}\u0001\u0000\u0000\u0000"+ + "\u0387\u0389\u0005\u000e\u0000\u0000\u0388\u0387\u0001\u0000\u0000\u0000"+ + "\u0388\u0389\u0001\u0000\u0000\u0000\u0389\u038a\u0001\u0000\u0000\u0000"+ + "\u038a\u038b\u0003\u0080@\u0000\u038b\u038c\u0005g\u0000\u0000\u038c\u038e"+ + "\u0003\u0140\u00a0\u0000\u038d\u038f\u0003\u00f0x\u0000\u038e\u038d\u0001"+ + "\u0000\u0000\u0000\u038e\u038f\u0001\u0000\u0000\u0000\u038f\u007f\u0001"+ + "\u0000\u0000\u0000\u0390\u0392\u0005h\u0000\u0000\u0391\u0393\u0005g\u0000"+ + "\u0000\u0392\u0391\u0001\u0000\u0000\u0000\u0392\u0393\u0001\u0000\u0000"+ + "\u0000\u0393\u0395\u0001\u0000\u0000\u0000\u0394\u0396\u0005\u0089\u0000"+ + "\u0000\u0395\u0394\u0001\u0000\u0000\u0000\u0395\u0396\u0001\u0000\u0000"+ + "\u0000\u0396\u0397\u0001\u0000\u0000\u0000\u0397\u0398\u0003\u012e\u0097"+ + "\u0000\u0398\u0399\u0005i\u0000\u0000\u0399\u0081\u0001\u0000\u0000\u0000"+ + "\u039a\u03a0\u0003\u00b6[\u0000\u039b\u039c\u0003\u00c4b\u0000\u039c\u039d"+ + "\u0005r\u0000\u0000\u039d\u039e\u0005g\u0000\u0000\u039e\u03a0\u0001\u0000"+ + "\u0000\u0000\u039f\u039a\u0001\u0000\u0000\u0000\u039f\u039b\u0001\u0000"+ + "\u0000\u0000\u03a0\u0083\u0001\u0000\u0000\u0000\u03a1\u03a2\u00058\u0000"+ + "\u0000\u03a2\u03a3\u0005g\u0000\u0000\u03a3\u03a6\u0005u\u0000\u0000\u03a4"+ + "\u03a7\u0003\u0082A\u0000\u03a5\u03a7\u0003\u0150\u00a8\u0000\u03a6\u03a4"+ + "\u0001\u0000\u0000\u0000\u03a6\u03a5\u0001\u0000\u0000\u0000\u03a7\u0085"+ + "\u0001\u0000\u0000\u0000\u03a8\u03a9\u0005/\u0000\u0000\u03a9\u03aa\u0005"+ + "h\u0000\u0000\u03aa\u03ad\u0003\u00c4b\u0000\u03ab\u03ac\u0005o\u0000"+ + "\u0000\u03ac\u03ae\u0003\u00e8t\u0000\u03ad\u03ab\u0001\u0000\u0000\u0000"+ + "\u03ad\u03ae\u0001\u0000\u0000\u0000\u03ae\u03af\u0001\u0000\u0000\u0000"+ + "\u03af\u03b0\u0005i\u0000\u0000\u03b0\u0087\u0001\u0000\u0000\u0000\u03b1"+ + "\u03b2\u0005.\u0000\u0000\u03b2\u03b3\u0005h\u0000\u0000\u03b3\u03b4\u0003"+ + "\u00c4b\u0000\u03b4\u03b5\u0005i\u0000\u0000\u03b5\u0089\u0001\u0000\u0000"+ + "\u0000\u03b6\u03b9\u0003`0\u0000\u03b7\u03ba\u0003\u008cF\u0000\u03b8"+ + "\u03ba\u0003\u008eG\u0000\u03b9\u03b7\u0001\u0000\u0000\u0000\u03b9\u03b8"+ + "\u0001\u0000\u0000\u0000\u03ba\u008b\u0001\u0000\u0000\u0000\u03bb\u03bc"+ + "\u0005O\u0000\u0000\u03bc\u03bd\u0005g\u0000\u0000\u03bd\u03bf\u0003\u0140"+ + "\u00a0\u0000\u03be\u03c0\u0003r9\u0000\u03bf\u03be\u0001\u0000\u0000\u0000"+ + "\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0\u008d\u0001\u0000\u0000\u0000"+ + "\u03c1\u03c2\u0005O\u0000\u0000\u03c2\u03c3\u0003\u009cN\u0000\u03c3\u03c4"+ + "\u0005g\u0000\u0000\u03c4\u03c6\u0003\u0140\u00a0\u0000\u03c5\u03c7\u0003"+ + "r9\u0000\u03c6\u03c5\u0001\u0000\u0000\u0000\u03c6\u03c7\u0001\u0000\u0000"+ + "\u0000\u03c7\u008f\u0001\u0000\u0000\u0000\u03c8\u03cb\u0005\u001b\u0000"+ + "\u0000\u03c9\u03cc\u0003\u008aE\u0000\u03ca\u03cc\u0003\u00e0p\u0000\u03cb"+ + "\u03c9\u0001\u0000\u0000\u0000\u03cb\u03ca\u0001\u0000\u0000\u0000\u03cc"+ + "\u0091\u0001\u0000\u0000\u0000\u03cd\u03ce\u00058\u0000\u0000\u03ce\u03cf"+ + "\u0005g\u0000\u0000\u03cf\u03d1\u0003\u0144\u00a2\u0000\u03d0\u03d2\u0003"+ + "\u0094J\u0000\u03d1\u03d0\u0001\u0000\u0000\u0000\u03d1\u03d2\u0001\u0000"+ + "\u0000\u0000\u03d2\u0093\u0001\u0000\u0000\u0000\u03d3\u03d4\u0005j\u0000"+ + "\u0000\u03d4\u03d5\u0003\u00a6S\u0000\u03d5\u03d6\u0003\u0172\u00b9\u0000"+ + "\u03d6\u03d7\u0005k\u0000\u0000\u03d7\u0095\u0001\u0000\u0000\u0000\u03d8"+ + "\u03d9\u00058\u0000\u0000\u03d9\u03da\u0003\u009cN\u0000\u03da\u03db\u0005"+ + "g\u0000\u0000\u03db\u03dd\u0003\u0144\u00a2\u0000\u03dc\u03de\u0003\u0094"+ + "J\u0000\u03dd\u03dc\u0001\u0000\u0000\u0000\u03dd\u03de\u0001\u0000\u0000"+ + "\u0000\u03de\u0097\u0001\u0000\u0000\u0000\u03df\u03e7\u0003\u0006\u0003"+ + "\u0000\u03e0\u03e3\u0003\u00c4b\u0000\u03e1\u03e2\u0005n\u0000\u0000\u03e2"+ + "\u03e4\u0003\u00e8t\u0000\u03e3\u03e1\u0001\u0000\u0000\u0000\u03e3\u03e4"+ + "\u0001\u0000\u0000\u0000\u03e4\u03e8\u0001\u0000\u0000\u0000\u03e5\u03e6"+ + "\u0005n\u0000\u0000\u03e6\u03e8\u0003\u00e8t\u0000\u03e7\u03e0\u0001\u0000"+ + "\u0000\u0000\u03e7\u03e5\u0001\u0000\u0000\u0000\u03e8\u0099\u0001\u0000"+ + "\u0000\u0000\u03e9\u03ea\u0003\u0006\u0003\u0000\u03ea\u03eb\u0005u\u0000"+ + "\u0000\u03eb\u03ec\u0003\u00e8t\u0000\u03ec\u009b\u0001\u0000\u0000\u0000"+ + "\u03ed\u03ef\u0005h\u0000\u0000\u03ee\u03f0\u0003\b\u0004\u0000\u03ef"+ + "\u03ee\u0001\u0000\u0000\u0000\u03ef\u03f0\u0001\u0000\u0000\u0000\u03f0"+ + "\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f3\u0003\u00c4b\u0000\u03f2\u03f4"+ + "\u0005o\u0000\u0000\u03f3\u03f2\u0001\u0000\u0000\u0000\u03f3\u03f4\u0001"+ + "\u0000\u0000\u0000\u03f4\u03f5\u0001\u0000\u0000\u0000\u03f5\u03f6\u0005"+ + "i\u0000\u0000\u03f6\u009d\u0001\u0000\u0000\u0000\u03f7\u03fa\u0003\u00a0"+ + "P\u0000\u03f8\u03fa\u0003\u00a2Q\u0000\u03f9\u03f7\u0001\u0000\u0000\u0000"+ + "\u03f9\u03f8\u0001\u0000\u0000\u0000\u03fa\u009f\u0001\u0000\u0000\u0000"+ + "\u03fb\u03fd\u0003\u00e6s\u0000\u03fc\u03fb\u0001\u0000\u0000\u0000\u03fc"+ + "\u03fd\u0001\u0000\u0000\u0000\u03fd\u03fe\u0001\u0000\u0000\u0000\u03fe"+ + "\u03ff\u0003\u00a4R\u0000\u03ff\u00a1\u0001\u0000\u0000\u0000\u0400\u0402"+ + "\u0005\u001b\u0000\u0000\u0401\u0403\u0003\u00e6s\u0000\u0402\u0401\u0001"+ + "\u0000\u0000\u0000\u0402\u0403\u0001\u0000\u0000\u0000\u0403\u0404\u0001"+ + "\u0000\u0000\u0000\u0404\u0405\u0003\u00a4R\u0000\u0405\u00a3\u0001\u0000"+ + "\u0000\u0000\u0406\u0408\u0005v\u0000\u0000\u0407\u0406\u0001\u0000\u0000"+ + "\u0000\u0407\u0408\u0001\u0000\u0000\u0000\u0408\u0409\u0001\u0000\u0000"+ + "\u0000\u0409\u040a\u0003\u00c4b\u0000\u040a\u00a5\u0001\u0000\u0000\u0000"+ + "\u040b\u040c\u0006S\uffff\uffff\u0000\u040c\u040d\u0007\u0006\u0000\u0000"+ + "\u040d\u0421\u0003\u00a6S\u000f\u040e\u0421\u0003\u00b6[\u0000\u040f\u0410"+ + "\u0005\u0019\u0000\u0000\u0410\u0411\u0003.\u0017\u0000\u0411\u0412\u0005"+ + "\u001c\u0000\u0000\u0412\u0413\u0003\u00a6S\u0003\u0413\u0421\u0001\u0000"+ + "\u0000\u0000\u0414\u0415\u0005\u001a\u0000\u0000\u0415\u0416\u0003\u009a"+ + "M\u0000\u0416\u0417\u0005\u001c\u0000\u0000\u0417\u0418\u0003\u00a6S\u0002"+ + "\u0418\u0421\u0001\u0000\u0000\u0000\u0419\u041a\u0007\u0007\u0000\u0000"+ + "\u041a\u041b\u0003&\u0013\u0000\u041b\u041c\u0005q\u0000\u0000\u041c\u041d"+ + "\u0005q\u0000\u0000\u041d\u041e\u0003*\u0015\u0000\u041e\u041f\u0003\u00a6"+ + "S\u0001\u041f\u0421\u0001\u0000\u0000\u0000\u0420\u040b\u0001\u0000\u0000"+ + "\u0000\u0420\u040e\u0001\u0000\u0000\u0000\u0420\u040f\u0001\u0000\u0000"+ + "\u0000\u0420\u0414\u0001\u0000\u0000\u0000\u0420\u0419\u0001\u0000\u0000"+ + "\u0000\u0421\u0445\u0001\u0000\u0000\u0000\u0422\u0423\n\r\u0000\u0000"+ + "\u0423\u0424\u0007\b\u0000\u0000\u0424\u0444\u0003\u00a6S\u000e\u0425"+ + "\u0426\n\f\u0000\u0000\u0426\u0427\u0007\t\u0000\u0000\u0427\u0444\u0003"+ + "\u00a6S\r\u0428\u0429\n\u000b\u0000\u0000\u0429\u042a\u0007\n\u0000\u0000"+ + "\u042a\u0444\u0003\u00a6S\f\u042b\u042c\n\n\u0000\u0000\u042c\u042d\u0007"+ + "\u000b\u0000\u0000\u042d\u0444\u0003\u00a6S\u000b\u042e\u042f\n\t\u0000"+ + "\u0000\u042f\u0430\u0007\f\u0000\u0000\u0430\u0444\u0003\u00a6S\n\u0431"+ + "\u0432\n\u0007\u0000\u0000\u0432\u0433\u0005x\u0000\u0000\u0433\u0444"+ + "\u0003\u00a6S\b\u0434\u0435\n\u0006\u0000\u0000\u0435\u0436\u0005w\u0000"+ + "\u0000\u0436\u0444\u0003\u00a6S\u0007\u0437\u0438\n\u0005\u0000\u0000"+ + "\u0438\u0439\u0005\"\u0000\u0000\u0439\u0444\u0003\u00a6S\u0005\u043a"+ + "\u043b\n\u0004\u0000\u0000\u043b\u043c\u0005%\u0000\u0000\u043c\u043d"+ + "\u0003\u00a6S\u0000\u043d\u043e\u0005q\u0000\u0000\u043e\u043f\u0003\u00a6"+ + "S\u0004\u043f\u0444\u0001\u0000\u0000\u0000\u0440\u0441\n\b\u0000\u0000"+ + "\u0441\u0442\u0005\u000f\u0000\u0000\u0442\u0444\u0003t:\u0000\u0443\u0422"+ + "\u0001\u0000\u0000\u0000\u0443\u0425\u0001\u0000\u0000\u0000\u0443\u0428"+ + "\u0001\u0000\u0000\u0000\u0443\u042b\u0001\u0000\u0000\u0000\u0443\u042e"+ + "\u0001\u0000\u0000\u0000\u0443\u0431\u0001\u0000\u0000\u0000\u0443\u0434"+ + "\u0001\u0000\u0000\u0000\u0443\u0437\u0001\u0000\u0000\u0000\u0443\u043a"+ + "\u0001\u0000\u0000\u0000\u0443\u0440\u0001\u0000\u0000\u0000\u0444\u0447"+ + "\u0001\u0000\u0000\u0000\u0445\u0443\u0001\u0000\u0000\u0000\u0445\u0446"+ + "\u0001\u0000\u0000\u0000\u0446\u00a7\u0001\u0000\u0000\u0000\u0447\u0445"+ + "\u0001\u0000\u0000\u0000\u0448\u045d\u0003\u0018\f\u0000\u0449\u045d\u0003"+ + "\u001a\r\u0000\u044a\u045d\u0003\u00acV\u0000\u044b\u045d\u0003\u00aa"+ + "U\u0000\u044c\u045d\u0003\u00e0p\u0000\u044d\u045d\u0003\u0100\u0080\u0000"+ + "\u044e\u045d\u0003\u00f4z\u0000\u044f\u045d\u0003\u012c\u0096\u0000\u0450"+ + "\u045d\u0003\u0102\u0081\u0000\u0451\u045d\u0003\u0104\u0082\u0000\u0452"+ + "\u045d\u0003\u0106\u0083\u0000\u0453\u045d\u0003\u0108\u0084\u0000\u0454"+ + "\u045d\u0003\u010a\u0085\u0000\u0455\u045d\u0003\u00f0x\u0000\u0456\u045d"+ + "\u0003\u010c\u0086\u0000\u0457\u045d\u0003\u010e\u0087\u0000\u0458\u045d"+ + "\u0003\u0120\u0090\u0000\u0459\u045d\u0003\u00aeW\u0000\u045a\u045d\u0003"+ + "\u00b2Y\u0000\u045b\u045d\u0003z=\u0000\u045c\u0448\u0001\u0000\u0000"+ + "\u0000\u045c\u0449\u0001\u0000\u0000\u0000\u045c\u044a\u0001\u0000\u0000"+ + "\u0000\u045c\u044b\u0001\u0000\u0000\u0000\u045c\u044c\u0001\u0000\u0000"+ + "\u0000\u045c\u044d\u0001\u0000\u0000\u0000\u045c\u044e\u0001\u0000\u0000"+ + "\u0000\u045c\u044f\u0001\u0000\u0000\u0000\u045c\u0450\u0001\u0000\u0000"+ + "\u0000\u045c\u0451\u0001\u0000\u0000\u0000\u045c\u0452\u0001\u0000\u0000"+ + "\u0000\u045c\u0453\u0001\u0000\u0000\u0000\u045c\u0454\u0001\u0000\u0000"+ + "\u0000\u045c\u0455\u0001\u0000\u0000\u0000\u045c\u0456\u0001\u0000\u0000"+ + "\u0000\u045c\u0457\u0001\u0000\u0000\u0000\u045c\u0458\u0001\u0000\u0000"+ + "\u0000\u045c\u0459\u0001\u0000\u0000\u0000\u045c\u045a\u0001\u0000\u0000"+ + "\u0000\u045c\u045b\u0001\u0000\u0000\u0000\u045d\u00a9\u0001\u0000\u0000"+ + "\u0000\u045e\u045f\u0005$\u0000\u0000\u045f\u0460\u0003\u00a6S\u0000\u0460"+ + "\u00ab\u0001\u0000\u0000\u0000\u0461\u0462\u0005Z\u0000\u0000\u0462\u0464"+ + "\u0003\u00a6S\u0000\u0463\u0465\u0003\u00f0x\u0000\u0464\u0463\u0001\u0000"+ + "\u0000\u0000\u0464\u0465\u0001\u0000\u0000\u0000\u0465\u00ad\u0001\u0000"+ + "\u0000\u0000\u0466\u0467\u0003\u00b0X\u0000\u0467\u0468\u0003\u0128\u0094"+ + "\u0000\u0468\u00af\u0001\u0000\u0000\u0000\u0469\u046a\u0005\f\u0000\u0000"+ + "\u046a\u046b\u0003\u00a6S\u0000\u046b\u046c\u0003\u0172\u00b9\u0000\u046c"+ + "\u046e\u0001\u0000\u0000\u0000\u046d\u0469\u0001\u0000\u0000\u0000\u046e"+ + "\u0471\u0001\u0000\u0000\u0000\u046f\u046d\u0001\u0000\u0000\u0000\u046f"+ + "\u0470\u0001\u0000\u0000\u0000\u0470\u0476\u0001\u0000\u0000\u0000\u0471"+ + "\u046f\u0001\u0000\u0000\u0000\u0472\u0473\u0005\r\u0000\u0000\u0473\u0474"+ + "\u0003d2\u0000\u0474\u0475\u0003\u0172\u00b9\u0000\u0475\u0477\u0001\u0000"+ + "\u0000\u0000\u0476\u0472\u0001\u0000\u0000\u0000\u0476\u0477\u0001\u0000"+ + "\u0000\u0000\u0477\u00b1\u0001\u0000\u0000\u0000\u0478\u0479\u0005S\u0000"+ + "\u0000\u0479\u047e\u0003\u00a6S\u0000\u047a\u047b\u0005S\u0000\u0000\u047b"+ + "\u047c\u0007\u0001\u0000\u0000\u047c\u047e\u0003.\u0017\u0000\u047d\u0478"+ + "\u0001\u0000\u0000\u0000\u047d\u047a\u0001\u0000\u0000\u0000\u047e\u00b3"+ + "\u0001\u0000\u0000\u0000\u047f\u0488\u0005\u0003\u0000\u0000\u0480\u0488"+ + "\u0005\u0004\u0000\u0000\u0481\u0488\u0005f\u0000\u0000\u0482\u0488\u0003"+ + "\u014e\u00a7\u0000\u0483\u0488\u0003\u0164\u00b2\u0000\u0484\u0488\u0005"+ + "\u0001\u0000\u0000\u0485\u0488\u0005\u0091\u0000\u0000\u0486\u0488\u0005"+ + "\u0092\u0000\u0000\u0487\u047f\u0001\u0000\u0000\u0000\u0487\u0480\u0001"+ + "\u0000\u0000\u0000\u0487\u0481\u0001\u0000\u0000\u0000\u0487\u0482\u0001"+ + "\u0000\u0000\u0000\u0487\u0483\u0001\u0000\u0000\u0000\u0487\u0484\u0001"+ + "\u0000\u0000\u0000\u0487\u0485\u0001\u0000\u0000\u0000\u0487\u0486\u0001"+ + "\u0000\u0000\u0000\u0488\u00b5\u0001\u0000\u0000\u0000\u0489\u048a\u0006"+ + "[\uffff\uffff\u0000\u048a\u049a\u0003\u014a\u00a5\u0000\u048b\u049a\u0003"+ + "\u0146\u00a3\u0000\u048c\u049a\u0003\u016e\u00b7\u0000\u048d\u049a\u0003"+ + " \u0010\u0000\u048e\u049a\u0003\u0088D\u0000\u048f\u049a\u0003\u0086C"+ + "\u0000\u0490\u0491\u0005L\u0000\u0000\u0491\u0492\u0003\u00b6[\u0000\u0492"+ + "\u0493\u0003\u016c\u00b6\u0000\u0493\u049a\u0001\u0000\u0000\u0000\u0494"+ + "\u0495\u0007\r\u0000\u0000\u0495\u0496\u0005h\u0000\u0000\u0496\u0497"+ + "\u0003\u00a6S\u0000\u0497\u0498\u0005i\u0000\u0000\u0498\u049a\u0001\u0000"+ + "\u0000\u0000\u0499\u0489\u0001\u0000\u0000\u0000\u0499\u048b\u0001\u0000"+ + "\u0000\u0000\u0499\u048c\u0001\u0000\u0000\u0000\u0499\u048d\u0001\u0000"+ + "\u0000\u0000\u0499\u048e\u0001\u0000\u0000\u0000\u0499\u048f\u0001\u0000"+ + "\u0000\u0000\u0499\u0490\u0001\u0000\u0000\u0000\u0499\u0494\u0001\u0000"+ + "\u0000\u0000\u049a\u04b1\u0001\u0000\u0000\u0000\u049b\u049c\n\n\u0000"+ + "\u0000\u049c\u049d\u0005r\u0000\u0000\u049d\u04b0\u0005g\u0000\u0000\u049e"+ + "\u049f\n\t\u0000\u0000\u049f\u04b0\u0003\u0168\u00b4\u0000\u04a0\u04a1"+ + "\n\b\u0000\u0000\u04a1\u04b0\u0003\u00d0h\u0000\u04a2\u04a3\n\u0007\u0000"+ + "\u0000\u04a3\u04b0\u0003L&\u0000\u04a4\u04a5\n\u0006\u0000\u0000\u04a5"+ + "\u04b0\u0003\u016a\u00b5\u0000\u04a6\u04a7\n\u0005\u0000\u0000\u04a7\u04b0"+ + "\u0003\u016c\u00b6\u0000\u04a8\u04a9\n\u0003\u0000\u0000\u04a9\u04aa\u0003"+ + "\u016c\u00b6\u0000\u04aa\u04ab\u0005\u0010\u0000\u0000\u04ab\u04ac\u0003"+ + "t:\u0000\u04ac\u04b0\u0001\u0000\u0000\u0000\u04ad\u04ae\n\u0002\u0000"+ + "\u0000\u04ae\u04b0\u0003\u00bc^\u0000\u04af\u049b\u0001\u0000\u0000\u0000"+ + "\u04af\u049e\u0001\u0000\u0000\u0000\u04af\u04a0\u0001\u0000\u0000\u0000"+ + "\u04af\u04a2\u0001\u0000\u0000\u0000\u04af\u04a4\u0001\u0000\u0000\u0000"+ + "\u04af\u04a6\u0001\u0000\u0000\u0000\u04af\u04a8\u0001\u0000\u0000\u0000"+ + "\u04af\u04ad\u0001\u0000\u0000\u0000\u04b0\u04b3\u0001\u0000\u0000\u0000"+ + "\u04b1\u04af\u0001\u0000\u0000\u0000\u04b1\u04b2\u0001\u0000\u0000\u0000"+ + "\u04b2\u00b7\u0001\u0000\u0000\u0000\u04b3\u04b1\u0001\u0000\u0000\u0000"+ + "\u04b4\u04b5\u0003`0\u0000\u04b5\u04b6\u0003\u00ba]\u0000\u04b6\u00b9"+ + "\u0001\u0000\u0000\u0000\u04b7\u04b9\u0005O\u0000\u0000\u04b8\u04ba\u0005"+ + "g\u0000\u0000\u04b9\u04b8\u0001\u0000\u0000\u0000\u04b9\u04ba\u0001\u0000"+ + "\u0000\u0000\u04ba\u04bb\u0001\u0000\u0000\u0000\u04bb\u04bd\u0003\u0140"+ + "\u00a0\u0000\u04bc\u04be\u0003r9\u0000\u04bd\u04bc\u0001\u0000\u0000\u0000"+ + "\u04bd\u04be\u0001\u0000\u0000\u0000\u04be\u00bb\u0001\u0000\u0000\u0000"+ + "\u04bf\u04c1\u0005&\u0000\u0000\u04c0\u04c2\u0003\u00e8t\u0000\u04c1\u04c0"+ + "\u0001\u0000\u0000\u0000\u04c1\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c4"+ + "\u0001\u0000\u0000\u0000\u04c3\u04c5\u0005o\u0000\u0000\u04c4\u04c3\u0001"+ + "\u0000\u0000\u0000\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c6\u0001"+ + "\u0000\u0000\u0000\u04c6\u04c7\u0005\'\u0000\u0000\u04c7\u00bd\u0001\u0000"+ + "\u0000\u0000\u04c8\u04c9\u0005P\u0000\u0000\u04c9\u04d3\u0005j\u0000\u0000"+ + "\u04ca\u04ce\u0003\u00c2a\u0000\u04cb\u04ce\u0003\u012e\u0097\u0000\u04cc"+ + "\u04ce\u0003\u00c0`\u0000\u04cd\u04ca\u0001\u0000\u0000\u0000\u04cd\u04cb"+ + "\u0001\u0000\u0000\u0000\u04cd\u04cc\u0001\u0000\u0000\u0000\u04ce\u04cf"+ + "\u0001\u0000\u0000\u0000\u04cf\u04d0\u0003\u0172\u00b9\u0000\u04d0\u04d2"+ + "\u0001\u0000\u0000\u0000\u04d1\u04cd\u0001\u0000\u0000\u0000\u04d2\u04d5"+ + "\u0001\u0000\u0000\u0000\u04d3\u04d1\u0001\u0000\u0000\u0000\u04d3\u04d4"+ + "\u0001\u0000\u0000\u0000\u04d4\u04d6\u0001\u0000\u0000\u0000\u04d5\u04d3"+ + "\u0001\u0000\u0000\u0000\u04d6\u04d7\u0005k\u0000\u0000\u04d7\u00bf\u0001"+ + "\u0000\u0000\u0000\u04d8\u04d9\u00058\u0000\u0000\u04d9\u04da\u0005g\u0000"+ + "\u0000\u04da\u04db\u0003\u0144\u00a2\u0000\u04db\u00c1\u0001\u0000\u0000"+ + "\u0000\u04dc\u04de\u0005\u001b\u0000\u0000\u04dd\u04dc\u0001\u0000\u0000"+ + "\u0000\u04dd\u04de\u0001\u0000\u0000\u0000\u04de\u04df\u0001\u0000\u0000"+ + "\u0000\u04df\u04e0\u0003`0\u0000\u04e0\u04e1\u0005g\u0000\u0000\u04e1"+ + "\u04e2\u0003\u0144\u00a2\u0000\u04e2\u04e3\u0003\u0142\u00a1\u0000\u04e3"+ + "\u04ec\u0001\u0000\u0000\u0000\u04e4\u04e6\u0005\u001b\u0000\u0000\u04e5"+ + "\u04e4\u0001\u0000\u0000\u0000\u04e5\u04e6\u0001\u0000\u0000\u0000\u04e6"+ + "\u04e7\u0001\u0000\u0000\u0000\u04e7\u04e8\u0003`0\u0000\u04e8\u04e9\u0005"+ + "g\u0000\u0000\u04e9\u04ea\u0003\u0144\u00a2\u0000\u04ea\u04ec\u0001\u0000"+ + "\u0000\u0000\u04eb\u04dd\u0001\u0000\u0000\u0000\u04eb\u04e5\u0001\u0000"+ + "\u0000\u0000\u04ec\u00c3\u0001\u0000\u0000\u0000\u04ed\u04f5\u0003\u012e"+ + "\u0097\u0000\u04ee\u04f5\u0003\u00c6c\u0000\u04ef\u04f5\u0003P(\u0000"+ + "\u04f0\u04f1\u0005h\u0000\u0000\u04f1\u04f2\u0003\u00c4b\u0000\u04f2\u04f3"+ + "\u0005i\u0000\u0000\u04f3\u04f5\u0001\u0000\u0000\u0000\u04f4\u04ed\u0001"+ + "\u0000\u0000\u0000\u04f4\u04ee\u0001\u0000\u0000\u0000\u04f4\u04ef\u0001"+ + "\u0000\u0000\u0000\u04f4\u04f0\u0001\u0000\u0000\u0000\u04f5\u00c5\u0001"+ + "\u0000\u0000\u0000\u04f6\u0500\u0003\u0130\u0098\u0000\u04f7\u0500\u0003"+ + "\u0160\u00b0\u0000\u04f8\u0500\u0003\u0136\u009b\u0000\u04f9\u0500\u0003"+ + "\u013e\u009f\u0000\u04fa\u0500\u0003\u00be_\u0000\u04fb\u0500\u0003\u0138"+ + "\u009c\u0000\u04fc\u0500\u0003\u013a\u009d\u0000\u04fd\u0500\u0003\u013c"+ + "\u009e\u0000\u04fe\u0500\u0003\u00c8d\u0000\u04ff\u04f6\u0001\u0000\u0000"+ + "\u0000\u04ff\u04f7\u0001\u0000\u0000\u0000\u04ff\u04f8\u0001\u0000\u0000"+ + "\u0000\u04ff\u04f9\u0001\u0000\u0000\u0000\u04ff\u04fa\u0001\u0000\u0000"+ + "\u0000\u04ff\u04fb\u0001\u0000\u0000\u0000\u04ff\u04fc\u0001\u0000\u0000"+ + "\u0000\u04ff\u04fd\u0001\u0000\u0000\u0000\u04ff\u04fe\u0001\u0000\u0000"+ + "\u0000\u0500\u00c7\u0001\u0000\u0000\u0000\u0501\u0502\u00058\u0000\u0000"+ + "\u0502\u0503\u0003\u00cae\u0000\u0503\u00c9\u0001\u0000\u0000\u0000\u0504"+ + "\u0510\u0005h\u0000\u0000\u0505\u050a\u0003\u00c4b\u0000\u0506\u0507\u0005"+ + "o\u0000\u0000\u0507\u0509\u0003\u00c4b\u0000\u0508\u0506\u0001\u0000\u0000"+ + "\u0000\u0509\u050c\u0001\u0000\u0000\u0000\u050a\u0508\u0001\u0000\u0000"+ + "\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050e\u0001\u0000\u0000"+ + "\u0000\u050c\u050a\u0001\u0000\u0000\u0000\u050d\u050f\u0005o\u0000\u0000"+ + "\u050e\u050d\u0001\u0000\u0000\u0000\u050e\u050f\u0001\u0000\u0000\u0000"+ + "\u050f\u0511\u0001\u0000\u0000\u0000\u0510\u0505\u0001\u0000\u0000\u0000"+ + "\u0510\u0511\u0001\u0000\u0000\u0000\u0511\u0512\u0001\u0000\u0000\u0000"+ + "\u0512\u0513\u0005i\u0000\u0000\u0513\u00cb\u0001\u0000\u0000\u0000\u0514"+ + "\u051c\u0003\u0160\u00b0\u0000\u0515\u051c\u0003\u0130\u0098\u0000\u0516"+ + "\u051c\u0003\u00ceg\u0000\u0517\u051c\u0003\u0138\u009c\u0000\u0518\u051c"+ + "\u0003\u013a\u009d\u0000\u0519\u051c\u0003P(\u0000\u051a\u051c\u0003\u012e"+ + "\u0097\u0000\u051b\u0514\u0001\u0000\u0000\u0000\u051b\u0515\u0001\u0000"+ + "\u0000\u0000\u051b\u0516\u0001\u0000\u0000\u0000\u051b\u0517\u0001\u0000"+ + "\u0000\u0000\u051b\u0518\u0001\u0000\u0000\u0000\u051b\u0519\u0001\u0000"+ + "\u0000\u0000\u051b\u051a\u0001\u0000\u0000\u0000\u051c\u00cd\u0001\u0000"+ + "\u0000\u0000\u051d\u051e\u0005l\u0000\u0000\u051e\u051f\u0005v\u0000\u0000"+ + "\u051f\u0520\u0005m\u0000\u0000\u0520\u0521\u0003\u0134\u009a\u0000\u0521"+ + "\u00cf\u0001\u0000\u0000\u0000\u0522\u0532\u0005l\u0000\u0000\u0523\u0525"+ + "\u0003\u00d2i\u0000\u0524\u0523\u0001\u0000\u0000\u0000\u0524\u0525\u0001"+ + "\u0000\u0000\u0000\u0525\u0526\u0001\u0000\u0000\u0000\u0526\u0528\u0005"+ + "q\u0000\u0000\u0527\u0529\u0003\u00d4j\u0000\u0528\u0527\u0001\u0000\u0000"+ + "\u0000\u0528\u0529\u0001\u0000\u0000\u0000\u0529\u0533\u0001\u0000\u0000"+ + "\u0000\u052a\u052c\u0003\u00d2i\u0000\u052b\u052a\u0001\u0000\u0000\u0000"+ + "\u052b\u052c\u0001\u0000\u0000\u0000\u052c\u052d\u0001\u0000\u0000\u0000"+ + "\u052d\u052e\u0005q\u0000\u0000\u052e\u052f\u0003\u00d4j\u0000\u052f\u0530"+ + "\u0005q\u0000\u0000\u0530\u0531\u0003\u00d6k\u0000\u0531\u0533\u0001\u0000"+ + "\u0000\u0000\u0532\u0524\u0001\u0000\u0000\u0000\u0532\u052b\u0001\u0000"+ + "\u0000\u0000\u0533\u0534\u0001\u0000\u0000\u0000\u0534\u0535\u0005m\u0000"+ + "\u0000\u0535\u00d1\u0001\u0000\u0000\u0000\u0536\u0537\u0003\u00a6S\u0000"+ + "\u0537\u00d3\u0001\u0000\u0000\u0000\u0538\u0539\u0003\u00a6S\u0000\u0539"+ + "\u00d5\u0001\u0000\u0000\u0000\u053a\u053b\u0003\u00a6S\u0000\u053b\u00d7"+ + "\u0001\u0000\u0000\u0000\u053c\u053e\u0007\u000e\u0000\u0000\u053d\u053c"+ + "\u0001\u0000\u0000\u0000\u053d\u053e\u0001\u0000\u0000\u0000\u053e\u053f"+ + "\u0001\u0000\u0000\u0000\u053f\u0540\u0005n\u0000\u0000\u0540\u00d9\u0001"+ + "\u0000\u0000\u0000\u0541\u0542\u0003\u00e8t\u0000\u0542\u0543\u0005n\u0000"+ + "\u0000\u0543\u0548\u0001\u0000\u0000\u0000\u0544\u0545\u0003\u0006\u0003"+ + "\u0000\u0545\u0546\u0005u\u0000\u0000\u0546\u0548\u0001\u0000\u0000\u0000"+ + "\u0547\u0541\u0001\u0000\u0000\u0000\u0547\u0544\u0001\u0000\u0000\u0000"+ + "\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u0549\u0001\u0000\u0000\u0000"+ + "\u0549\u054a\u0005_\u0000\u0000\u054a\u054f\u0003\u00a6S\u0000\u054b\u054d"+ + "\u0005J\u0000\u0000\u054c\u054e\u0005g\u0000\u0000\u054d\u054c\u0001\u0000"+ + "\u0000\u0000\u054d\u054e\u0001\u0000\u0000\u0000\u054e\u0550\u0001\u0000"+ + "\u0000\u0000\u054f\u054b\u0001\u0000\u0000\u0000\u054f\u0550\u0001\u0000"+ + "\u0000\u0000\u0550\u00db\u0001\u0000\u0000\u0000\u0551\u0552\u0005Z\u0000"+ + "\u0000\u0552\u0553\u0005g\u0000\u0000\u0553\u00dd\u0001\u0000\u0000\u0000"+ + "\u0554\u0555\u0003\u0164\u00b2\u0000\u0555\u00df\u0001\u0000\u0000\u0000"+ + "\u0556\u055a\u0003\u00e2q\u0000\u0557\u055a\u0003\u00eau\u0000\u0558\u055a"+ + "\u0003\u00eew\u0000\u0559\u0556\u0001\u0000\u0000\u0000\u0559\u0557\u0001"+ + "\u0000\u0000\u0000\u0559\u0558\u0001\u0000\u0000\u0000\u055a\u00e1\u0001"+ + "\u0000\u0000\u0000\u055b\u0567\u0005\\\u0000\u0000\u055c\u0568\u0003\u00e4"+ + "r\u0000\u055d\u0563\u0005h\u0000\u0000\u055e\u055f\u0003\u00e4r\u0000"+ + "\u055f\u0560\u0003\u0172\u00b9\u0000\u0560\u0562\u0001\u0000\u0000\u0000"+ + "\u0561\u055e\u0001\u0000\u0000\u0000\u0562\u0565\u0001\u0000\u0000\u0000"+ + "\u0563\u0561\u0001\u0000\u0000\u0000\u0563\u0564\u0001\u0000\u0000\u0000"+ + "\u0564\u0566\u0001\u0000\u0000\u0000\u0565\u0563\u0001\u0000\u0000\u0000"+ + "\u0566\u0568\u0005i\u0000\u0000\u0567\u055c\u0001\u0000\u0000\u0000\u0567"+ + "\u055d\u0001\u0000\u0000\u0000\u0568\u00e3\u0001\u0000\u0000\u0000\u0569"+ + "\u056f\u0003\u00e6s\u0000\u056a\u056c\u0003\u00c4b\u0000\u056b\u056a\u0001"+ + "\u0000\u0000\u0000\u056b\u056c\u0001\u0000\u0000\u0000\u056c\u056d\u0001"+ + "\u0000\u0000\u0000\u056d\u056e\u0005n\u0000\u0000\u056e\u0570\u0003\u00e8"+ + "t\u0000\u056f\u056b\u0001\u0000\u0000\u0000\u056f\u0570\u0001\u0000\u0000"+ + "\u0000\u0570\u00e5\u0001\u0000\u0000\u0000\u0571\u0576\u0005g\u0000\u0000"+ + "\u0572\u0573\u0005o\u0000\u0000\u0573\u0575\u0005g\u0000\u0000\u0574\u0572"+ + "\u0001\u0000\u0000\u0000\u0575\u0578\u0001\u0000\u0000\u0000\u0576\u0574"+ + "\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000\u0000\u0577\u00e7"+ + "\u0001\u0000\u0000\u0000\u0578\u0576\u0001\u0000\u0000\u0000\u0579\u057e"+ + "\u0003\u00a6S\u0000\u057a\u057b\u0005o\u0000\u0000\u057b\u057d\u0003\u00a6"+ + "S\u0000\u057c\u057a\u0001\u0000\u0000\u0000\u057d\u0580\u0001\u0000\u0000"+ + "\u0000\u057e\u057c\u0001\u0000\u0000\u0000\u057e\u057f\u0001\u0000\u0000"+ + "\u0000\u057f\u00e9\u0001\u0000\u0000\u0000\u0580\u057e\u0001\u0000\u0000"+ + "\u0000\u0581\u058d\u0005`\u0000\u0000\u0582\u058e\u0003\u00ecv\u0000\u0583"+ + "\u0589\u0005h\u0000\u0000\u0584\u0585\u0003\u00ecv\u0000\u0585\u0586\u0003"+ + "\u0172\u00b9\u0000\u0586\u0588\u0001\u0000\u0000\u0000\u0587\u0584\u0001"+ + "\u0000\u0000\u0000\u0588\u058b\u0001\u0000\u0000\u0000\u0589\u0587\u0001"+ + "\u0000\u0000\u0000\u0589\u058a\u0001\u0000\u0000\u0000\u058a\u058c\u0001"+ + "\u0000\u0000\u0000\u058b\u0589\u0001\u0000\u0000\u0000\u058c\u058e\u0005"+ + "i\u0000\u0000\u058d\u0582\u0001\u0000\u0000\u0000\u058d\u0583\u0001\u0000"+ + "\u0000\u0000\u058e\u00eb\u0001\u0000\u0000\u0000\u058f\u0591\u0005g\u0000"+ + "\u0000\u0590\u0592\u0005n\u0000\u0000\u0591\u0590\u0001\u0000\u0000\u0000"+ + "\u0591\u0592\u0001\u0000\u0000\u0000\u0592\u0593\u0001\u0000\u0000\u0000"+ + "\u0593\u0594\u0003\u00c4b\u0000\u0594\u00ed\u0001\u0000\u0000\u0000\u0595"+ + "\u05a1\u0005e\u0000\u0000\u0596\u05a2\u0003\u0098L\u0000\u0597\u059d\u0005"+ + "h\u0000\u0000\u0598\u0599\u0003\u0098L\u0000\u0599\u059a\u0003\u0172\u00b9"+ + "\u0000\u059a\u059c\u0001\u0000\u0000\u0000\u059b\u0598\u0001\u0000\u0000"+ + "\u0000\u059c\u059f\u0001\u0000\u0000\u0000\u059d\u059b\u0001\u0000\u0000"+ + "\u0000\u059d\u059e\u0001\u0000\u0000\u0000\u059e\u05a0\u0001\u0000\u0000"+ + "\u0000\u059f\u059d\u0001\u0000\u0000\u0000\u05a0\u05a2\u0005i\u0000\u0000"+ + "\u05a1\u0596\u0001\u0000\u0000\u0000\u05a1\u0597\u0001\u0000\u0000\u0000"+ + "\u05a2\u00ef\u0001\u0000\u0000\u0000\u05a3\u05a5\u0005j\u0000\u0000\u05a4"+ + "\u05a6\u0003\u00f2y\u0000\u05a5\u05a4\u0001\u0000\u0000\u0000\u05a5\u05a6"+ + "\u0001\u0000\u0000\u0000\u05a6\u05a7\u0001\u0000\u0000\u0000\u05a7\u05a8"+ + "\u0005k\u0000\u0000\u05a8\u00f1\u0001\u0000\u0000\u0000\u05a9\u05ab\u0005"+ + "p\u0000\u0000\u05aa\u05a9\u0001\u0000\u0000\u0000\u05aa\u05ab\u0001\u0000"+ + "\u0000\u0000\u05ab\u05b1\u0001\u0000\u0000\u0000\u05ac\u05ae\u0005\u00a1"+ + "\u0000\u0000\u05ad\u05ac\u0001\u0000\u0000\u0000\u05ad\u05ae\u0001\u0000"+ + "\u0000\u0000\u05ae\u05b1\u0001\u0000\u0000\u0000\u05af\u05b1\u0004y\u0012"+ + "\u0000\u05b0\u05aa\u0001\u0000\u0000\u0000\u05b0\u05ad\u0001\u0000\u0000"+ + "\u0000\u05b0\u05af\u0001\u0000\u0000\u0000\u05b1\u05b2\u0001\u0000\u0000"+ + "\u0000\u05b2\u05b3\u0003\u00a8T\u0000\u05b3\u05b4\u0003\u0172\u00b9\u0000"+ + "\u05b4\u05b6\u0001\u0000\u0000\u0000\u05b5\u05b0\u0001\u0000\u0000\u0000"+ + "\u05b6\u05b7\u0001\u0000\u0000\u0000\u05b7\u05b5\u0001\u0000\u0000\u0000"+ + "\u05b7\u05b8\u0001\u0000\u0000\u0000\u05b8\u00f3\u0001\u0000\u0000\u0000"+ + "\u05b9\u05bf\u0003\u00f8|\u0000\u05ba\u05bf\u0003\u00fa}\u0000\u05bb\u05bf"+ + "\u0003\u00fc~\u0000\u05bc\u05bf\u0003\u00f6{\u0000\u05bd\u05bf\u0003\u009a"+ + "M\u0000\u05be\u05b9\u0001\u0000\u0000\u0000\u05be\u05ba\u0001\u0000\u0000"+ + "\u0000\u05be\u05bb\u0001\u0000\u0000\u0000\u05be\u05bc\u0001\u0000\u0000"+ + "\u0000\u05be\u05bd\u0001\u0000\u0000\u0000\u05bf\u00f5\u0001\u0000\u0000"+ + "\u0000\u05c0\u05c1\u0003\u00a6S\u0000\u05c1\u00f7\u0001\u0000\u0000\u0000"+ + "\u05c2\u05c3\u0003\u00a6S\u0000\u05c3\u05c4\u0005\u008b\u0000\u0000\u05c4"+ + "\u05c5\u0003\u00a6S\u0000\u05c5\u00f9\u0001\u0000\u0000\u0000\u05c6\u05c7"+ + "\u0003\u00a6S\u0000\u05c7\u05c8\u0007\u000f\u0000\u0000\u05c8\u00fb\u0001"+ + "\u0000\u0000\u0000\u05c9\u05ca\u0003\u00e8t\u0000\u05ca\u05cb\u0003\u00d8"+ + "l\u0000\u05cb\u05cc\u0003\u00e8t\u0000\u05cc\u00fd\u0001\u0000\u0000\u0000"+ + "\u05cd\u05ce\u0007\u0010\u0000\u0000\u05ce\u00ff\u0001\u0000\u0000\u0000"+ + "\u05cf\u05d0\u0005g\u0000\u0000\u05d0\u05d2\u0005q\u0000\u0000\u05d1\u05d3"+ + "\u0003\u00a8T\u0000\u05d2\u05d1\u0001\u0000\u0000\u0000\u05d2\u05d3\u0001"+ + "\u0000\u0000\u0000\u05d3\u0101\u0001\u0000\u0000\u0000\u05d4\u05d6\u0005"+ + "d\u0000\u0000\u05d5\u05d7\u0003\u00e8t\u0000\u05d6\u05d5\u0001\u0000\u0000"+ + "\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000\u05d7\u0103\u0001\u0000\u0000"+ + "\u0000\u05d8\u05da\u0005M\u0000\u0000\u05d9\u05db\u0005g\u0000\u0000\u05da"+ + "\u05d9\u0001\u0000\u0000\u0000\u05da\u05db\u0001\u0000\u0000\u0000\u05db"+ + "\u0105\u0001\u0000\u0000\u0000\u05dc\u05de\u0005a\u0000\u0000\u05dd\u05df"+ + "\u0005g\u0000\u0000\u05de\u05dd\u0001\u0000\u0000\u0000\u05de\u05df\u0001"+ + "\u0000\u0000\u0000\u05df\u0107\u0001\u0000\u0000\u0000\u05e0\u05e1\u0005"+ + "Y\u0000\u0000\u05e1\u05e2\u0005g\u0000\u0000\u05e2\u0109\u0001\u0000\u0000"+ + "\u0000\u05e3\u05e4\u0005]\u0000\u0000\u05e4\u010b\u0001\u0000\u0000\u0000"+ + "\u05e5\u05ee\u0005^\u0000\u0000\u05e6\u05ef\u0003\u00a6S\u0000\u05e7\u05e8"+ + "\u0003\u0172\u00b9\u0000\u05e8\u05e9\u0003\u00a6S\u0000\u05e9\u05ef\u0001"+ + "\u0000\u0000\u0000\u05ea\u05eb\u0003\u00f4z\u0000\u05eb\u05ec\u0003\u0172"+ + "\u00b9\u0000\u05ec\u05ed\u0003\u00a6S\u0000\u05ed\u05ef\u0001\u0000\u0000"+ + "\u0000\u05ee\u05e6\u0001\u0000\u0000\u0000\u05ee\u05e7\u0001\u0000\u0000"+ + "\u0000\u05ee\u05ea\u0001\u0000\u0000\u0000\u05ef\u05f0\u0001\u0000\u0000"+ + "\u0000\u05f0\u05f6\u0003\u00f0x\u0000\u05f1\u05f4\u0005X\u0000\u0000\u05f2"+ + "\u05f5\u0003\u010c\u0086\u0000\u05f3\u05f5\u0003\u00f0x\u0000\u05f4\u05f2"+ + "\u0001\u0000\u0000\u0000\u05f4\u05f3\u0001\u0000\u0000\u0000\u05f5\u05f7"+ + "\u0001\u0000\u0000\u0000\u05f6\u05f1\u0001\u0000\u0000\u0000\u05f6\u05f7"+ + "\u0001\u0000\u0000\u0000\u05f7\u010d\u0001\u0000\u0000\u0000\u05f8\u05fb"+ + "\u0003\u0110\u0088\u0000\u05f9\u05fb\u0003\u0116\u008b\u0000\u05fa\u05f8"+ + "\u0001\u0000\u0000\u0000\u05fa\u05f9\u0001\u0000\u0000\u0000\u05fb\u010f"+ + "\u0001\u0000\u0000\u0000\u05fc\u0607\u0005[\u0000\u0000\u05fd\u05ff\u0003"+ + "\u00a6S\u0000\u05fe\u05fd\u0001\u0000\u0000\u0000\u05fe\u05ff\u0001\u0000"+ + "\u0000\u0000\u05ff\u0608\u0001\u0000\u0000\u0000\u0600\u0602\u0003\u00f4"+ + "z\u0000\u0601\u0600\u0001\u0000\u0000\u0000\u0601\u0602\u0001\u0000\u0000"+ + "\u0000\u0602\u0603\u0001\u0000\u0000\u0000\u0603\u0605\u0003\u0172\u00b9"+ + "\u0000\u0604\u0606\u0003\u00a6S\u0000\u0605\u0604\u0001\u0000\u0000\u0000"+ + "\u0605\u0606\u0001\u0000\u0000\u0000\u0606\u0608\u0001\u0000\u0000\u0000"+ + "\u0607\u05fe\u0001\u0000\u0000\u0000\u0607\u0601\u0001\u0000\u0000\u0000"+ + "\u0608\u0609\u0001\u0000\u0000\u0000\u0609\u060d\u0005j\u0000\u0000\u060a"+ + "\u060c\u0003\u0112\u0089\u0000\u060b\u060a\u0001\u0000\u0000\u0000\u060c"+ + "\u060f\u0001\u0000\u0000\u0000\u060d\u060b\u0001\u0000\u0000\u0000\u060d"+ + "\u060e\u0001\u0000\u0000\u0000\u060e\u0610\u0001\u0000\u0000\u0000\u060f"+ + "\u060d\u0001\u0000\u0000\u0000\u0610\u0611\u0005k\u0000\u0000\u0611\u0111"+ + "\u0001\u0000\u0000\u0000\u0612\u0613\u0003\u0114\u008a\u0000\u0613\u0615"+ + "\u0005q\u0000\u0000\u0614\u0616\u0003\u00f2y\u0000\u0615\u0614\u0001\u0000"+ + "\u0000\u0000\u0615\u0616\u0001\u0000\u0000\u0000\u0616\u0113\u0001\u0000"+ + "\u0000\u0000\u0617\u0618\u0005R\u0000\u0000\u0618\u061b\u0003\u00e8t\u0000"+ + "\u0619\u061b\u0005N\u0000\u0000\u061a\u0617\u0001\u0000\u0000\u0000\u061a"+ + "\u0619\u0001\u0000\u0000\u0000\u061b\u0115\u0001\u0000\u0000\u0000\u061c"+ + "\u0625\u0005[\u0000\u0000\u061d\u0626\u0003\u0118\u008c\u0000\u061e\u061f"+ + "\u0003\u0172\u00b9\u0000\u061f\u0620\u0003\u0118\u008c\u0000\u0620\u0626"+ + "\u0001\u0000\u0000\u0000\u0621\u0622\u0003\u00f4z\u0000\u0622\u0623\u0003"+ + "\u0172\u00b9\u0000\u0623\u0624\u0003\u0118\u008c\u0000\u0624\u0626\u0001"+ + "\u0000\u0000\u0000\u0625\u061d\u0001\u0000\u0000\u0000\u0625\u061e\u0001"+ + "\u0000\u0000\u0000\u0625\u0621\u0001\u0000\u0000\u0000\u0626\u0627\u0001"+ + "\u0000\u0000\u0000\u0627\u062b\u0005j\u0000\u0000\u0628\u062a\u0003\u011a"+ + "\u008d\u0000\u0629\u0628\u0001\u0000\u0000\u0000\u062a\u062d\u0001\u0000"+ + "\u0000\u0000\u062b\u0629\u0001\u0000\u0000\u0000\u062b\u062c\u0001\u0000"+ + "\u0000\u0000\u062c\u062e\u0001\u0000\u0000\u0000\u062d\u062b\u0001\u0000"+ + "\u0000\u0000\u062e\u062f\u0005k\u0000\u0000\u062f\u0117\u0001\u0000\u0000"+ + "\u0000\u0630\u0631\u0005g\u0000\u0000\u0631\u0633\u0005u\u0000\u0000\u0632"+ + "\u0630\u0001\u0000\u0000\u0000\u0632\u0633\u0001\u0000\u0000\u0000\u0633"+ + "\u0634\u0001\u0000\u0000\u0000\u0634\u0635\u0003\u00b6[\u0000\u0635\u0636"+ + "\u0005r\u0000\u0000\u0636\u0637\u0005h\u0000\u0000\u0637\u0638\u0005`"+ + "\u0000\u0000\u0638\u0639\u0005i\u0000\u0000\u0639\u0119\u0001\u0000\u0000"+ + "\u0000\u063a\u063b\u0003\u011c\u008e\u0000\u063b\u063d\u0005q\u0000\u0000"+ + "\u063c\u063e\u0003\u00f2y\u0000\u063d\u063c\u0001\u0000\u0000\u0000\u063d"+ + "\u063e\u0001\u0000\u0000\u0000\u063e\u011b\u0001\u0000\u0000\u0000\u063f"+ + "\u0640\u0005R\u0000\u0000\u0640\u0643\u0003\u011e\u008f\u0000\u0641\u0643"+ + "\u0005N\u0000\u0000\u0642\u063f\u0001\u0000\u0000\u0000\u0642\u0641\u0001"+ + "\u0000\u0000\u0000\u0643\u011d\u0001\u0000\u0000\u0000\u0644\u0647\u0003"+ + "\u00c4b\u0000\u0645\u0647\u0005f\u0000\u0000\u0646\u0644\u0001\u0000\u0000"+ + "\u0000\u0646\u0645\u0001\u0000\u0000\u0000\u0647\u064f\u0001\u0000\u0000"+ + "\u0000\u0648\u064b\u0005o\u0000\u0000\u0649\u064c\u0003\u00c4b\u0000\u064a"+ + "\u064c\u0005f\u0000\u0000\u064b\u0649\u0001\u0000\u0000\u0000\u064b\u064a"+ + "\u0001\u0000\u0000\u0000\u064c\u064e\u0001\u0000\u0000\u0000\u064d\u0648"+ + "\u0001\u0000\u0000\u0000\u064e\u0651\u0001\u0000\u0000\u0000\u064f\u064d"+ + "\u0001\u0000\u0000\u0000\u064f\u0650\u0001\u0000\u0000\u0000\u0650\u011f"+ + "\u0001\u0000\u0000\u0000\u0651\u064f\u0001\u0000\u0000\u0000\u0652\u0653"+ + "\u0005Q\u0000\u0000\u0653\u0657\u0005j\u0000\u0000\u0654\u0656\u0003\u0122"+ + "\u0091\u0000\u0655\u0654\u0001\u0000\u0000\u0000\u0656\u0659\u0001\u0000"+ + "\u0000\u0000\u0657\u0655\u0001\u0000\u0000\u0000\u0657\u0658\u0001\u0000"+ + "\u0000\u0000\u0658\u065a\u0001\u0000\u0000\u0000\u0659\u0657\u0001\u0000"+ + "\u0000\u0000\u065a\u065b\u0005k\u0000\u0000\u065b\u0121\u0001\u0000\u0000"+ + "\u0000\u065c\u065d\u0003\u0124\u0092\u0000\u065d\u065f\u0005q\u0000\u0000"+ + "\u065e\u0660\u0003\u00f2y\u0000\u065f\u065e\u0001\u0000\u0000\u0000\u065f"+ + "\u0660\u0001\u0000\u0000\u0000\u0660\u0123\u0001\u0000\u0000\u0000\u0661"+ + "\u0664\u0005R\u0000\u0000\u0662\u0665\u0003\u00f8|\u0000\u0663\u0665\u0003"+ + "\u0126\u0093\u0000\u0664\u0662\u0001\u0000\u0000\u0000\u0664\u0663\u0001"+ + "\u0000\u0000\u0000\u0665\u0668\u0001\u0000\u0000\u0000\u0666\u0668\u0005"+ + "N\u0000\u0000\u0667\u0661\u0001\u0000\u0000\u0000\u0667\u0666\u0001\u0000"+ + "\u0000\u0000\u0668\u0125\u0001\u0000\u0000\u0000\u0669\u066a\u0003\u00e8"+ + "t\u0000\u066a\u066b\u0005n\u0000\u0000\u066b\u0670\u0001\u0000\u0000\u0000"+ + "\u066c\u066d\u0003\u00e6s\u0000\u066d\u066e\u0005u\u0000\u0000\u066e\u0670"+ + "\u0001\u0000\u0000\u0000\u066f\u0669\u0001\u0000\u0000\u0000\u066f\u066c"+ + "\u0001\u0000\u0000\u0000\u066f\u0670\u0001\u0000\u0000\u0000\u0670\u0671"+ + "\u0001\u0000\u0000\u0000\u0671\u0672\u0003\u00a6S\u0000\u0672\u0127\u0001"+ + "\u0000\u0000\u0000\u0673\u067b\u0005b\u0000\u0000\u0674\u0676\u0003\u00a6"+ + "S\u0000\u0675\u0674\u0001\u0000\u0000\u0000\u0675\u0676\u0001\u0000\u0000"+ + "\u0000\u0676\u067c\u0001\u0000\u0000\u0000\u0677\u067c\u0003\u012a\u0095"+ + "\u0000\u0678\u067a\u0003\u00dam\u0000\u0679\u0678\u0001\u0000\u0000\u0000"+ + "\u0679\u067a\u0001\u0000\u0000\u0000\u067a\u067c\u0001\u0000\u0000\u0000"+ + "\u067b\u0675\u0001\u0000\u0000\u0000\u067b\u0677\u0001\u0000\u0000\u0000"+ + "\u067b\u0679\u0001\u0000\u0000\u0000\u067c\u067d\u0001\u0000\u0000\u0000"+ + "\u067d\u067e\u0003\u00f0x\u0000\u067e\u0129\u0001\u0000\u0000\u0000\u067f"+ + "\u0681\u0003\u00f4z\u0000\u0680\u067f\u0001\u0000\u0000\u0000\u0680\u0681"+ + "\u0001\u0000\u0000\u0000\u0681\u0682\u0001\u0000\u0000\u0000\u0682\u0684"+ + "\u0003\u0172\u00b9\u0000\u0683\u0685\u0003\u00a6S\u0000\u0684\u0683\u0001"+ + "\u0000\u0000\u0000\u0684\u0685\u0001\u0000\u0000\u0000\u0685\u0686\u0001"+ + "\u0000\u0000\u0000\u0686\u0688\u0003\u0172\u00b9\u0000\u0687\u0689\u0003"+ + "\u00f4z\u0000\u0688\u0687\u0001\u0000\u0000\u0000\u0688\u0689\u0001\u0000"+ + "\u0000\u0000\u0689\u012b\u0001\u0000\u0000\u0000\u068a\u068b\u0005T\u0000"+ + "\u0000\u068b\u068c\u0003\u00a6S\u0000\u068c\u012d\u0001\u0000\u0000\u0000"+ + "\u068d\u0690\u0003\u0152\u00a9\u0000\u068e\u0690\u0005g\u0000\u0000\u068f"+ + "\u068d\u0001\u0000\u0000\u0000\u068f\u068e\u0001\u0000\u0000\u0000\u0690"+ + "\u012f\u0001\u0000\u0000\u0000\u0691\u0692\u0005l\u0000\u0000\u0692\u0693"+ + "\u0003\u0132\u0099\u0000\u0693\u0694\u0005m\u0000\u0000\u0694\u0695\u0003"+ + "\u0134\u009a\u0000\u0695\u0131\u0001\u0000\u0000\u0000\u0696\u0697\u0003"+ + "\u00a6S\u0000\u0697\u0133\u0001\u0000\u0000\u0000\u0698\u0699\u0003\u00c4"+ + "b\u0000\u0699\u0135\u0001\u0000\u0000\u0000\u069a\u069b\u0005\u0089\u0000"+ + "\u0000\u069b\u069c\u0003\u00c4b\u0000\u069c\u0137\u0001\u0000\u0000\u0000"+ + "\u069d\u069e\u0005l\u0000\u0000\u069e\u069f\u0005m\u0000\u0000\u069f\u06a0"+ + "\u0003\u0134\u009a\u0000\u06a0\u0139\u0001\u0000\u0000\u0000\u06a1\u06a2"+ + "\u0005U\u0000\u0000\u06a2\u06a3\u0005l\u0000\u0000\u06a3\u06a4\u0003\u00c4"+ + "b\u0000\u06a4\u06a5\u0005m\u0000\u0000\u06a5\u06a6\u0003\u0134\u009a\u0000"+ + "\u06a6\u013b\u0001\u0000\u0000\u0000\u06a7\u06ad\u0005W\u0000\u0000\u06a8"+ + "\u06a9\u0005W\u0000\u0000\u06a9\u06ad\u0005\u008b\u0000\u0000\u06aa\u06ab"+ + "\u0005\u008b\u0000\u0000\u06ab\u06ad\u0005W\u0000\u0000\u06ac\u06a7\u0001"+ + "\u0000\u0000\u0000\u06ac\u06a8\u0001\u0000\u0000\u0000\u06ac\u06aa\u0001"+ + "\u0000\u0000\u0000\u06ad\u06ae\u0001\u0000\u0000\u0000\u06ae\u06af\u0003"+ + "\u0134\u009a\u0000\u06af\u013d\u0001\u0000\u0000\u0000\u06b0\u06b1\u0005"+ + "O\u0000\u0000\u06b1\u06b2\u0003\u0140\u00a0\u0000\u06b2\u013f\u0001\u0000"+ + "\u0000\u0000\u06b3\u06b4\u0003\u0144\u00a2\u0000\u06b4\u06b5\u0003\u0142"+ + "\u00a1\u0000\u06b5\u06b8\u0001\u0000\u0000\u0000\u06b6\u06b8\u0003\u0144"+ + "\u00a2\u0000\u06b7\u06b3\u0001\u0000\u0000\u0000\u06b7\u06b6\u0001\u0000"+ + "\u0000\u0000\u06b8\u0141\u0001\u0000\u0000\u0000\u06b9\u06bc\u0003\u0144"+ + "\u00a2\u0000\u06ba\u06bc\u0003\u00c4b\u0000\u06bb\u06b9\u0001\u0000\u0000"+ + "\u0000\u06bb\u06ba\u0001\u0000\u0000\u0000\u06bc\u0143\u0001\u0000\u0000"+ + "\u0000\u06bd\u06c9\u0005h\u0000\u0000\u06be\u06c3\u0003\u009eO\u0000\u06bf"+ + "\u06c0\u0005o\u0000\u0000\u06c0\u06c2\u0003\u009eO\u0000\u06c1\u06bf\u0001"+ + "\u0000\u0000\u0000\u06c2\u06c5\u0001\u0000\u0000\u0000\u06c3\u06c1\u0001"+ + "\u0000\u0000\u0000\u06c3\u06c4\u0001\u0000\u0000\u0000\u06c4\u06c7\u0001"+ + "\u0000\u0000\u0000\u06c5\u06c3\u0001\u0000\u0000\u0000\u06c6\u06c8\u0005"+ + "o\u0000\u0000\u06c7\u06c6\u0001\u0000\u0000\u0000\u06c7\u06c8\u0001\u0000"+ + "\u0000\u0000\u06c8\u06ca\u0001\u0000\u0000\u0000\u06c9\u06be\u0001\u0000"+ + "\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000"+ + "\u0000\u0000\u06cb\u06cc\u0005i\u0000\u0000\u06cc\u0145\u0001\u0000\u0000"+ + "\u0000\u06cd\u06ce\u0003\u0148\u00a4\u0000\u06ce\u06cf\u0005h\u0000\u0000"+ + "\u06cf\u06d1\u0003\u00a6S\u0000\u06d0\u06d2\u0005o\u0000\u0000\u06d1\u06d0"+ + "\u0001\u0000\u0000\u0000\u06d1\u06d2\u0001\u0000\u0000\u0000\u06d2\u06d3"+ + "\u0001\u0000\u0000\u0000\u06d3\u06d4\u0005i\u0000\u0000\u06d4\u0147\u0001"+ + "\u0000\u0000\u0000\u06d5\u06db\u0003\u00c6c\u0000\u06d6\u06d7\u0005h\u0000"+ + "\u0000\u06d7\u06d8\u0003\u0148\u00a4\u0000\u06d8\u06d9\u0005i\u0000\u0000"+ + "\u06d9\u06db\u0001\u0000\u0000\u0000\u06da\u06d5\u0001\u0000\u0000\u0000"+ + "\u06da\u06d6\u0001\u0000\u0000\u0000\u06db\u0149\u0001\u0000\u0000\u0000"+ + "\u06dc\u06e3\u0003\u014c\u00a6\u0000\u06dd\u06e3\u0003\u0150\u00a8\u0000"+ + "\u06de\u06df\u0005h\u0000\u0000\u06df\u06e0\u0003\u00a6S\u0000\u06e0\u06e1"+ + "\u0005i\u0000\u0000\u06e1\u06e3\u0001\u0000\u0000\u0000\u06e2\u06dc\u0001"+ + "\u0000\u0000\u0000\u06e2\u06dd\u0001\u0000\u0000\u0000\u06e2\u06de\u0001"+ + "\u0000\u0000\u0000\u06e3\u014b\u0001\u0000\u0000\u0000\u06e4\u06e8\u0003"+ + "\u00b4Z\u0000\u06e5\u06e8\u0003\u0154\u00aa\u0000\u06e6\u06e8\u0003\u00b8"+ + "\\\u0000\u06e7\u06e4\u0001\u0000\u0000\u0000\u06e7\u06e5\u0001\u0000\u0000"+ + "\u0000\u06e7\u06e6\u0001\u0000\u0000\u0000\u06e8\u014d\u0001\u0000\u0000"+ + "\u0000\u06e9\u06ea\u0007\u0011\u0000\u0000\u06ea\u014f\u0001\u0000\u0000"+ + "\u0000\u06eb\u06ec\u0005g\u0000\u0000\u06ec\u0151\u0001\u0000\u0000\u0000"+ + "\u06ed\u06ee\u0005g\u0000\u0000\u06ee\u06ef\u0005r\u0000\u0000\u06ef\u06f0"+ + "\u0005g\u0000\u0000\u06f0\u0153\u0001\u0000\u0000\u0000\u06f1\u06f2\u0003"+ + "\u00ccf\u0000\u06f2\u06f3\u0003\u0156\u00ab\u0000\u06f3\u0155\u0001\u0000"+ + "\u0000\u0000\u06f4\u06f9\u0005j\u0000\u0000\u06f5\u06f7\u0003\u0158\u00ac"+ + "\u0000\u06f6\u06f8\u0005o\u0000\u0000\u06f7\u06f6\u0001\u0000\u0000\u0000"+ + "\u06f7\u06f8\u0001\u0000\u0000\u0000\u06f8\u06fa\u0001\u0000\u0000\u0000"+ + "\u06f9\u06f5\u0001\u0000\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000"+ + "\u06fa\u06fb\u0001\u0000\u0000\u0000\u06fb\u06fc\u0005k\u0000\u0000\u06fc"+ + "\u0157\u0001\u0000\u0000\u0000\u06fd\u0702\u0003\u015a\u00ad\u0000\u06fe"+ + "\u06ff\u0005o\u0000\u0000\u06ff\u0701\u0003\u015a\u00ad\u0000\u0700\u06fe"+ + "\u0001\u0000\u0000\u0000\u0701\u0704\u0001\u0000\u0000\u0000\u0702\u0700"+ + "\u0001\u0000\u0000\u0000\u0702\u0703\u0001\u0000\u0000\u0000\u0703\u0159"+ + "\u0001\u0000\u0000\u0000\u0704\u0702\u0001\u0000\u0000\u0000\u0705\u0706"+ + "\u0003\u015c\u00ae\u0000\u0706\u0707\u0005q\u0000\u0000\u0707\u0709\u0001"+ + "\u0000\u0000\u0000\u0708\u0705\u0001\u0000\u0000\u0000\u0708\u0709\u0001"+ + "\u0000\u0000\u0000\u0709\u070a\u0001\u0000\u0000\u0000\u070a\u070b\u0003"+ + "\u015e\u00af\u0000\u070b\u015b\u0001\u0000\u0000\u0000\u070c\u070f\u0003"+ + "\u00a6S\u0000\u070d\u070f\u0003\u0156\u00ab\u0000\u070e\u070c\u0001\u0000"+ + "\u0000\u0000\u070e\u070d\u0001\u0000\u0000\u0000\u070f\u015d\u0001\u0000"+ + "\u0000\u0000\u0710\u0713\u0003\u00a6S\u0000\u0711\u0713\u0003\u0156\u00ab"+ + "\u0000\u0712\u0710\u0001\u0000\u0000\u0000\u0712\u0711\u0001\u0000\u0000"+ + "\u0000\u0713\u015f\u0001\u0000\u0000\u0000\u0714\u0715\u0005V\u0000\u0000"+ + "\u0715\u071b\u0005j\u0000\u0000\u0716\u0717\u0003\u0162\u00b1\u0000\u0717"+ + "\u0718\u0003\u0172\u00b9\u0000\u0718\u071a\u0001\u0000\u0000\u0000\u0719"+ + "\u0716\u0001\u0000\u0000\u0000\u071a\u071d\u0001\u0000\u0000\u0000\u071b"+ + "\u0719\u0001\u0000\u0000\u0000\u071b\u071c\u0001\u0000\u0000\u0000\u071c"+ + "\u071e\u0001\u0000\u0000\u0000\u071d\u071b\u0001\u0000\u0000\u0000\u071e"+ + "\u071f\u0005k\u0000\u0000\u071f\u0161\u0001\u0000\u0000\u0000\u0720\u0721"+ + "\u0003\u00e6s\u0000\u0721\u0722\u0003\u00c4b\u0000\u0722\u0725\u0001\u0000"+ + "\u0000\u0000\u0723\u0725\u0003\u0166\u00b3\u0000\u0724\u0720\u0001\u0000"+ + "\u0000\u0000\u0724\u0723\u0001\u0000\u0000\u0000\u0725\u0727\u0001\u0000"+ + "\u0000\u0000\u0726\u0728\u0003\u0164\u00b2\u0000\u0727\u0726\u0001\u0000"+ + "\u0000\u0000\u0727\u0728\u0001\u0000\u0000\u0000\u0728\u0163\u0001\u0000"+ + "\u0000\u0000\u0729\u072a\u0007\u0012\u0000\u0000\u072a\u0165\u0001\u0000"+ + "\u0000\u0000\u072b\u072d\u0005\u0089\u0000\u0000\u072c\u072b\u0001\u0000"+ + "\u0000\u0000\u072c\u072d\u0001\u0000\u0000\u0000\u072d\u072e\u0001\u0000"+ + "\u0000\u0000\u072e\u072f\u0003\u012e\u0097\u0000\u072f\u0167\u0001\u0000"+ + "\u0000\u0000\u0730\u0731\u0005l\u0000\u0000\u0731\u0732\u0003\u00a6S\u0000"+ + "\u0732\u0733\u0005m\u0000\u0000\u0733\u0169\u0001\u0000\u0000\u0000\u0734"+ + "\u0735\u0005r\u0000\u0000\u0735\u0736\u0005h\u0000\u0000\u0736\u0737\u0003"+ + "\u00c4b\u0000\u0737\u0738\u0005i\u0000\u0000\u0738\u016b\u0001\u0000\u0000"+ + "\u0000\u0739\u0748\u0005h\u0000\u0000\u073a\u0741\u0003\u00e8t\u0000\u073b"+ + "\u073e\u0003\u0148\u00a4\u0000\u073c\u073d\u0005o\u0000\u0000\u073d\u073f"+ + "\u0003\u00e8t\u0000\u073e\u073c\u0001\u0000\u0000\u0000\u073e\u073f\u0001"+ + "\u0000\u0000\u0000\u073f\u0741\u0001\u0000\u0000\u0000\u0740\u073a\u0001"+ + "\u0000\u0000\u0000\u0740\u073b\u0001\u0000\u0000\u0000\u0741\u0743\u0001"+ + "\u0000\u0000\u0000\u0742\u0744\u0005v\u0000\u0000\u0743\u0742\u0001\u0000"+ + "\u0000\u0000\u0743\u0744\u0001\u0000\u0000\u0000\u0744\u0746\u0001\u0000"+ + "\u0000\u0000\u0745\u0747\u0005o\u0000\u0000\u0746\u0745\u0001\u0000\u0000"+ + "\u0000\u0746\u0747\u0001\u0000\u0000\u0000\u0747\u0749\u0001\u0000\u0000"+ + "\u0000\u0748\u0740\u0001\u0000\u0000\u0000\u0748\u0749\u0001\u0000\u0000"+ + "\u0000\u0749\u074a\u0001\u0000\u0000\u0000\u074a\u074b\u0005i\u0000\u0000"+ + "\u074b\u016d\u0001\u0000\u0000\u0000\u074c\u074d\u0003\u0148\u00a4\u0000"+ + "\u074d\u074e\u0005r\u0000\u0000\u074e\u074f\u0005g\u0000\u0000\u074f\u016f"+ + "\u0001\u0000\u0000\u0000\u0750\u0751\u0003\u00c4b\u0000\u0751\u0171\u0001"+ + "\u0000\u0000\u0000\u0752\u0757\u0005p\u0000\u0000\u0753\u0757\u0005\u0000"+ + "\u0000\u0001\u0754\u0757\u0005\u00a1\u0000\u0000\u0755\u0757\u0004\u00b9"+ + "\u0013\u0000\u0756\u0752\u0001\u0000\u0000\u0000\u0756\u0753\u0001\u0000"+ + "\u0000\u0000\u0756\u0754\u0001\u0000\u0000\u0000\u0756\u0755\u0001\u0000"+ + "\u0000\u0000\u0757\u0173\u0001\u0000\u0000\u0000\u00c2\u0182\u0187\u018e"+ "\u0198\u019e\u01a4\u01ae\u01b8\u01c6\u01ca\u01d3\u01df\u01e3\u01e9\u01f2"+ "\u01fc\u020d\u021b\u021f\u0226\u022e\u0237\u0257\u025f\u0277\u028a\u0299"+ - "\u02a6\u02af\u02bd\u02c6\u02d2\u02d8\u02ec\u02f3\u02f8\u02fd\u0307\u030a"+ - "\u030e\u0312\u031a\u0322\u0327\u032f\u0331\u0336\u033d\u0345\u0348\u034e"+ - "\u0353\u0355\u0358\u035f\u0364\u0377\u037f\u0383\u0386\u038c\u0390\u0393"+ - "\u039d\u03a4\u03ab\u03b7\u03bd\u03c4\u03c9\u03cf\u03db\u03e1\u03e5\u03ed"+ - "\u03f1\u03f7\u03fa\u0400\u0405\u041e\u0441\u0443\u045a\u0462\u046d\u0474"+ - "\u047b\u0485\u0493\u04a9\u04ab\u04b3\u04b7\u04bb\u04be\u04c7\u04cd\u04d7"+ - "\u04df\u04e5\u04ee\u04f9\u0504\u0508\u050a\u0515\u051e\u0522\u0525\u052c"+ - "\u0537\u0541\u0547\u0549\u0553\u055d\u0561\u0565\u0569\u0570\u0578\u0583"+ - "\u0587\u058b\u0597\u059b\u059f\u05a4\u05a7\u05aa\u05b1\u05b8\u05cc\u05d0"+ - "\u05d4\u05d8\u05e8\u05ee\u05f0\u05f4\u05f8\u05fb\u05ff\u0601\u0607\u060f"+ - "\u0614\u061f\u0625\u062c\u0637\u063c\u0640\u0645\u0649\u0651\u0659\u065e"+ - "\u0661\u0669\u066f\u0673\u0675\u067a\u067e\u0682\u0689\u06a6\u06b1\u06b5"+ - "\u06bd\u06c1\u06c3\u06cb\u06d4\u06dc\u06e1\u06f1\u06f3\u06fc\u0702\u0708"+ - "\u070c\u0715\u071e\u0721\u0726\u0738\u073a\u073d\u0740\u0742\u0750"; + "\u02a6\u02af\u02bd\u02c6\u02d2\u02d8\u02ec\u02f5\u02fa\u02ff\u0309\u030c"+ + "\u0310\u0314\u031c\u0324\u0329\u0331\u0333\u0338\u033f\u0347\u034a\u0350"+ + "\u0355\u0357\u035a\u0361\u0366\u0379\u0381\u0385\u0388\u038e\u0392\u0395"+ + "\u039f\u03a6\u03ad\u03b9\u03bf\u03c6\u03cb\u03d1\u03dd\u03e3\u03e7\u03ef"+ + "\u03f3\u03f9\u03fc\u0402\u0407\u0420\u0443\u0445\u045c\u0464\u046f\u0476"+ + "\u047d\u0487\u0499\u04af\u04b1\u04b9\u04bd\u04c1\u04c4\u04cd\u04d3\u04dd"+ + "\u04e5\u04eb\u04f4\u04ff\u050a\u050e\u0510\u051b\u0524\u0528\u052b\u0532"+ + "\u053d\u0547\u054d\u054f\u0559\u0563\u0567\u056b\u056f\u0576\u057e\u0589"+ + "\u058d\u0591\u059d\u05a1\u05a5\u05aa\u05ad\u05b0\u05b7\u05be\u05d2\u05d6"+ + "\u05da\u05de\u05ee\u05f4\u05f6\u05fa\u05fe\u0601\u0605\u0607\u060d\u0615"+ + "\u061a\u0625\u062b\u0632\u063d\u0642\u0646\u064b\u064f\u0657\u065f\u0664"+ + "\u0667\u066f\u0675\u0679\u067b\u0680\u0684\u0688\u068f\u06ac\u06b7\u06bb"+ + "\u06c3\u06c7\u06c9\u06d1\u06da\u06e2\u06e7\u06f7\u06f9\u0702\u0708\u070e"+ + "\u0712\u071b\u0724\u0727\u072c\u073e\u0740\u0743\u0746\u0748\u0756"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index e05468128..3705ddec4 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.0 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -838,6 +838,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitPredConstrPrimaryExpr(GobraParser.PredConstrPrimaryExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRevealInvokePrimaryExpr(GobraParser.RevealInvokePrimaryExprContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index c30ab42ee..5fa3adab8 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.0 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -748,6 +748,13 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitPredConstrPrimaryExpr(GobraParser.PredConstrPrimaryExprContext ctx); + /** + * Visit a parse tree produced by the {@code revealInvokePrimaryExpr} + * labeled alternative in {@link GobraParser#primaryExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRevealInvokePrimaryExpr(GobraParser.RevealInvokePrimaryExprContext ctx); /** * Visit a parse tree produced by the {@code invokePrimaryExpr} * labeled alternative in {@link GobraParser#primaryExpr}. diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index eb543ed16..3e40ac9ed 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -467,7 +467,7 @@ case class PClosureImplements(closure: PExpression, spec: PClosureSpecInstance) case class PClosureImplProof(impl: PClosureImplements, block: PBlock) extends PGhostStatement with PScope -case class PInvoke(base: PExpressionOrType, args: Vector[PExpression], spec: Option[PClosureSpecInstance]) extends PActualExpression { +case class PInvoke(base: PExpressionOrType, args: Vector[PExpression], spec: Option[PClosureSpecInstance], reveal: Boolean = false) extends PActualExpression { require(base.isInstanceOf[PExpression] || spec.isEmpty) // `base` is a type for conversions only, for which `spec` is empty } @@ -882,7 +882,8 @@ case class PFunctionSpec( posts: Vector[PExpression], terminationMeasures: Vector[PTerminationMeasure], isPure: Boolean = false, - isTrusted: Boolean = false + isTrusted: Boolean = false, + isOpaque: Boolean = false, ) extends PSpecification case class PBodyParameterInfo( diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index 1a750fa88..62cd318fe 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -128,6 +128,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter } def showPure: Doc = "pure" <> line + def showOpaque: Doc = "opaque" <> line def showTrusted: Doc = "trusted" <> line def showPre(pre: PExpression): Doc = "requires" <+> showExpr(pre) def showPreserves(preserves: PExpression): Doc = "preserves" <+> showExpr(preserves) @@ -143,8 +144,9 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter } def showSpec(spec: PSpecification): Doc = spec match { - case PFunctionSpec(pres, preserves, posts, measures, isPure, isTrusted) => + case PFunctionSpec(pres, preserves, posts, measures, isPure, isTrusted, isOpaque) => (if (isPure) showPure else emptyDoc) <> + (if (isOpaque) showOpaque else emptyDoc) <> (if (isTrusted) showTrusted else emptyDoc) <> hcat(pres map (showPre(_) <> line)) <> hcat(preserves map (showPreserves(_) <> line)) <> @@ -453,7 +455,9 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PStringLit(lit) => "\"" <> lit <> "\"" case PCompositeLit(typ, lit) => showLiteralType(typ) <+> showLiteralValue(lit) case lit: PFunctionLit => showFunctionLit(lit) - case PInvoke(base, args, spec) => showExprOrType(base) <> parens(showExprList(args)) <> opt(spec)(s => emptyDoc <+> "as" <+> showMisc(s)) + case PInvoke(base, args, spec, reveal) => + val revealDoc: Doc = if (reveal) "reveal" else emptyDoc + revealDoc <+> showExprOrType(base) <> parens(showExprList(args)) <> opt(spec)(s => emptyDoc <+> "as" <+> showMisc(s)) case PIndexedExp(base, index) => showExpr(base) <> brackets(showExpr(index)) case PSliceExp(base, low, high, cap) => { diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index f7dd0caa5..76f58d794 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -151,8 +151,9 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter } def showPureFunction(f: PureFunction): Doc = f match { - case PureFunction(name, args, results, pres, posts, measures, body) => - "pure func" <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> + case PureFunction(name, args, results, pres, posts, measures, body, isOpaque) => + val funcPrefix = (if (isOpaque) text("opaque ") else emptyDoc) <> "pure func" + funcPrefix <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block("return" <+> showExpr(b))) } @@ -163,8 +164,9 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter } def showPureMethod(m: PureMethod): Doc = m match { - case PureMethod(receiver, name, args, results, pres, posts, measures, body) => - "pure func" <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> + case PureMethod(receiver, name, args, results, pres, posts, measures, body, isOpaque) => + val funcPrefix = (if (isOpaque) text("opaque ") else emptyDoc) <> "pure func" + funcPrefix <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block("return" <+> showExpr(b))) } @@ -488,9 +490,13 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case c: CurrentPerm => "perm" <> parens(showAcc(c.acc)) case PermMinus(exp) => "-" <> showExpr(exp) - case PureFunctionCall(func, args, _) => func.name <> parens(showExprList(args)) + case PureFunctionCall(func, args, _, reveal) => + val revealDoc: Doc = if (reveal) "reveal" else emptyDoc + revealDoc <+> func.name <> parens(showExprList(args)) - case PureMethodCall(recv, meth, args, _) => showExpr(recv) <> dot <> meth.name <> parens(showExprList(args)) + case PureMethodCall(recv, meth, args, _, reveal) => + val revealDoc: Doc = if (reveal) "reveal " else emptyDoc + revealDoc <> showExpr(recv) <> dot <> meth.name <> parens(showExprList(args)) case PureClosureCall(closure, args, spec, _) => showExpr(closure) <> parens(showExprList(args)) <+> "as" <+> showClosureSpec(spec) @@ -681,8 +687,9 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter { } override def showPureFunction(f: PureFunction): Doc = f match { - case PureFunction(name, args, results, pres, posts, measures, _) => - "pure func" <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> + case PureFunction(name, args, results, pres, posts, measures, _, isOpaque) => + val funcPrefix = if (isOpaque) "pure opaque func" else "pure func" + funcPrefix <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) } @@ -693,8 +700,9 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter { } override def showPureMethod(m: PureMethod): Doc = m match { - case PureMethod(receiver, name, args, results, pres, posts, measures, _) => - "pure func" <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> + case PureMethod(receiver, name, args, results, pres, posts, measures, _, isOpaque) => + val funcPrefix = if (isOpaque) "pure opaque func" else "pure func" + funcPrefix <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) } diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index b24042b03..0bda28b5a 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -196,7 +196,8 @@ case class PureMethod( override val pres: Vector[Assertion], override val posts: Vector[Assertion], override val terminationMeasures: Vector[TerminationMeasure], - body: Option[Expr] + body: Option[Expr], + isOpaque: Boolean )(val info: Source.Parser.Info) extends Member with MethodMember { require(results.size <= 1) } @@ -251,7 +252,8 @@ case class PureFunction( override val pres: Vector[Assertion], override val posts: Vector[Assertion], override val terminationMeasures: Vector[TerminationMeasure], - body: Option[Expr] + body: Option[Expr], + isOpaque: Boolean )(val info: Source.Parser.Info) extends Member with FunctionMember { require(results.size <= 1) } @@ -925,8 +927,8 @@ case class MapValues(exp : Expr, expUnderlyingType: Type)(val info : Source.Pars } } -case class PureFunctionCall(func: FunctionProxy, args: Vector[Expr], typ: Type)(val info: Source.Parser.Info) extends Expr -case class PureMethodCall(recv: Expr, meth: MethodProxy, args: Vector[Expr], typ: Type)(val info: Source.Parser.Info) extends Expr +case class PureFunctionCall(func: FunctionProxy, args: Vector[Expr], typ: Type, reveal: Boolean = false)(val info: Source.Parser.Info) extends Expr +case class PureMethodCall(recv: Expr, meth: MethodProxy, args: Vector[Expr], typ: Type, reveal: Boolean = false)(val info: Source.Parser.Info) extends Expr case class PureClosureCall(closure: Expr, args: Vector[Expr], spec: ClosureSpec, typ: Type)(val info: Source.Parser.Info) extends Expr case class DomainFunctionCall(func: DomainFuncProxy, args: Vector[Expr], typ: Type)(val info: Source.Parser.Info) extends Expr diff --git a/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala b/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala index dbbce3b7b..1fa123add 100644 --- a/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala +++ b/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala @@ -156,7 +156,7 @@ object CGEdgesTerminationTransform extends InternalTransform { // new body to check termination val terminationCheckBody = { val returnType = m.results.head.typ - val fallbackProxyCall = in.PureMethodCall(m.receiver, fallbackProxy, m.args, returnType)(src) + val fallbackProxyCall = in.PureMethodCall(m.receiver, fallbackProxy, m.args, returnType, false)(src) val implProxies: Vector[(in.Type, in.MemberProxy)] = implementations.toVector.flatMap{ impl => table.lookup(impl, proxy.name).map(implProxy => (impl, implProxy)) } @@ -166,7 +166,7 @@ object CGEdgesTerminationTransform extends InternalTransform { case implProxy: in.MethodProxy if !subT.isInstanceOf[in.InterfaceT] => in.Conditional( in.EqCmp(in.TypeOf(m.receiver)(src), typeAsExpr(subT)(src))(src), - in.PureMethodCall(in.TypeAssertion(m.receiver, subT)(src), implProxy, m.args, returnType)(src), + in.PureMethodCall(in.TypeAssertion(m.receiver, subT)(src), implProxy, m.args, returnType, false)(src), accum, returnType )(src) diff --git a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala index 883d861b6..96cd1051d 100644 --- a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala +++ b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala @@ -34,18 +34,18 @@ object OverflowChecksTransform extends InternalTransform { // Adds pre-conditions stating the bounds of each argument and a post-condition to check if the body expression // overflows - case f@PureFunction(name, args, results, pres, posts, terminationMeasure, body) => body match { + case f@PureFunction(name, args, results, pres, posts, terminationMeasure, body, isOpaque) => body match { case Some(expr) => val newPost = posts ++ getPureBlockPosts(expr, results) - PureFunction(name, args, results, pres, newPost, terminationMeasure, body)(f.info) + PureFunction(name, args, results, pres, newPost, terminationMeasure, body, isOpaque)(f.info) case None => f } // Same as pure functions - case m@PureMethod(receiver, name, args, results, pres, posts, terminationMeasure, body) => body match { + case m@PureMethod(receiver, name, args, results, pres, posts, terminationMeasure, body, isOpaque) => body match { case Some(expr) => val newPost = posts ++ getPureBlockPosts(expr, results) - PureMethod(receiver, name, args, results, pres, newPost, terminationMeasure, body)(m.info) + PureMethod(receiver, name, args, results, pres, newPost, terminationMeasure, body, isOpaque)(m.info) case None => m } diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index f38c49dc5..0cca01882 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -701,7 +701,7 @@ object Desugar extends LazyLogging { val fsrc = meta(decl, info) val funcInfo = pureFunctionMemberOrLitD(decl, fsrc, new FunctionContext(_ => _ => in.Seqn(Vector.empty)(fsrc)), info) - in.PureFunction(name, funcInfo.args, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.body)(fsrc) + in.PureFunction(name, funcInfo.args, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.body, funcInfo.isOpaque)(fsrc) } private case class PureFunctionInfo(args: Vector[in.Parameter.In], @@ -710,7 +710,8 @@ object Desugar extends LazyLogging { pres: Vector[in.Assertion], posts: Vector[in.Assertion], terminationMeasures: Vector[in.TerminationMeasure], - body: Option[in.Expr]) + body: Option[in.Expr], + isOpaque: Boolean) private def pureFunctionMemberOrLitD(decl: PFunctionOrClosureDecl, fsrc: Meta, outerCtx: FunctionContext, info: TypeInfo): PureFunctionInfo = { @@ -756,6 +757,8 @@ object Desugar extends LazyLogging { val posts = decl.spec.posts map postconditionD(ctx, info) val terminationMeasure = sequence(decl.spec.terminationMeasures map terminationMeasureD(ctx, info)).res + val isOpaque = decl.spec.isOpaque + val capturedWithAliases = (captured.map { v => in.Ref(localVarD(outerCtx, info)(v))(meta(v, info)) } zip capturedPar) val bodyOpt = decl.body.map { @@ -767,7 +770,7 @@ object Desugar extends LazyLogging { implicitConversion(res.typ, returns.head.typ, res) } - PureFunctionInfo(args, capturedWithAliases, returns, pres, posts, terminationMeasure, bodyOpt) + PureFunctionInfo(args, capturedWithAliases, returns, pres, posts, terminationMeasure, bodyOpt, isOpaque) } @@ -924,6 +927,8 @@ object Desugar extends LazyLogging { val posts = (decl.spec.preserves ++ decl.spec.posts) map postconditionD(ctx, info) val terminationMeasure = sequence(decl.spec.terminationMeasures map terminationMeasureD(ctx, info)).res + val isOpaque = decl.spec.isOpaque + val bodyOpt = decl.body.map { case (_, b: PBlock) => val res = b.nonEmptyStmts match { @@ -932,8 +937,7 @@ object Desugar extends LazyLogging { } implicitConversion(res.typ, returns.head.typ, res) } - - in.PureMethod(recv, name, args, returns, pres, posts, terminationMeasure, bodyOpt)(fsrc) + in.PureMethod(recv, name, args, returns, pres, posts, terminationMeasure, bodyOpt, isOpaque)(fsrc) } def fpredicateD(decl: PFPredicateDecl): in.FPredicate = { @@ -2096,11 +2100,11 @@ object Desugar extends LazyLogging { case _ => in.FunctionCall(targets, getFunctionProxy(func, args), args)(src) } - def pureFunctionCall(func: ap.FunctionKind, args: Vector[in.Expr], spec: Option[in.ClosureSpec], resT: in.Type): in.Expr = spec match { + def pureFunctionCall(func: ap.FunctionKind, args: Vector[in.Expr], spec: Option[in.ClosureSpec], resT: in.Type, reveal: Boolean): in.Expr = spec match { case Some(spec) => val funcObject = in.FunctionObject(getFunctionProxy(func, args), typeD(info.typ(func.id), Addressability.rValue)(src))(src) in.PureClosureCall(funcObject, args, spec, resT)(src) - case _ => in.PureFunctionCall(getFunctionProxy(func, args), args, resT)(src) + case _ => in.PureFunctionCall(getFunctionProxy(func, args), args, resT, reveal)(src) } def getMethodProxy(f: ap.FunctionKind, recv: in.Expr, args: Vector[in.Expr]): in.MethodProxy = f match { @@ -2121,7 +2125,7 @@ object Desugar extends LazyLogging { case _ => in.MethodCall(targets, recv, meth, args)(src) } - def pureMethodCall(recv: in.Expr, meth: in.MethodProxy, args: Vector[in.Expr], spec: Option[in.ClosureSpec], resT: in.Type): in.Expr = spec match { + def pureMethodCall(recv: in.Expr, meth: in.MethodProxy, args: Vector[in.Expr], spec: Option[in.ClosureSpec], resT: in.Type, reveal: Boolean): in.Expr = spec match { case Some(spec) => val resType = resT match { case in.TupleT(ts, _) => ts @@ -2129,7 +2133,7 @@ object Desugar extends LazyLogging { } val methObject = in.MethodObject(recv, meth, in.FunctionT(args.map(_.typ), resType, Addressability.rValue))(src) in.PureClosureCall(methObject, args, spec, resT)(src) - case _ => in.PureMethodCall(recv, meth, args, resT)(src) + case _ => in.PureMethodCall(recv, meth, args, resT, reveal)(src) } def convertArgs(args: Vector[in.Expr]): Vector[in.Expr] = { @@ -2194,11 +2198,12 @@ object Desugar extends LazyLogging { case base: ap.FunctionKind => base match { case _: ap.Function | _: ap.BuiltInFunction => if (isPure) { + for { args <- dArgs convertedArgs = convertArgs(args) spec = p.maybeSpec.map(closureSpecD(ctx, info)) - } yield Right(pureFunctionCall(base, convertedArgs, spec, resT)) + } yield Right(pureFunctionCall(base, convertedArgs, spec, resT, expr.reveal)) } else { for { args <- dArgs @@ -2218,7 +2223,7 @@ object Desugar extends LazyLogging { proxy = methodProxy(iim.id, iim.symb.context.getTypeInfo) recvType = typeD(iim.symb.itfType, Addressability.receiver)(src) spec = p.maybeSpec.map(closureSpecD(ctx, info)) - } yield Right(pureMethodCall(implicitThisD(recvType)(src), proxy, args, spec, resT)) + } yield Right(pureMethodCall(implicitThisD(recvType)(src), proxy, args, spec, resT, expr.reveal)) } else { for { args <- dArgs @@ -2263,7 +2268,7 @@ object Desugar extends LazyLogging { convertedArgs = convertArgs(args) mproxy = getMethodProxy(base, recv, convertedArgs) spec = p.maybeSpec.map(closureSpecD(ctx, info)) - } yield Right(pureMethodCall(recv, mproxy, convertedArgs, spec, resT)) + } yield Right(pureMethodCall(recv, mproxy, convertedArgs, spec, resT, expr.reveal)) } else { for { (recv, args) <- dRecvWithArgs @@ -3231,9 +3236,10 @@ object Desugar extends LazyLogging { val pres = (m.spec.pres ++ m.spec.preserves) map preconditionD(specCtx, info) val posts = (m.spec.preserves ++ m.spec.posts) map postconditionD(specCtx, info) val terminationMeasures = sequence(m.spec.terminationMeasures map terminationMeasureD(specCtx, info)).res + val isOpaque = m.spec.isOpaque val mem = if (m.spec.isPure) { - in.PureMethod(recv, proxy, args, returns, pres, posts, terminationMeasures, None)(src) + in.PureMethod(recv, proxy, args, returns, pres, posts, terminationMeasures, None, isOpaque)(src) } else { in.Method(recv, proxy, args, returns, pres, posts, terminationMeasures, None)(src) } diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index e22e611c2..ff64e3de1 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -877,7 +877,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole val posts = groups.getOrElse(GobraParser.POST, Vector.empty).toVector.map(s => visitNode[PExpression](s.assertion().expression())) val terms = groups.getOrElse(GobraParser.DEC, Vector.empty).toVector.map(s => visitTerminationMeasure(s.terminationMeasure())) - PFunctionSpec(pres, preserves, posts, terms, isPure = ctx.pure, isTrusted = ctx.trusted) + PFunctionSpec(pres, preserves, posts, terms, isPure = ctx.pure, isTrusted = ctx.trusted, isOpaque = ctx.opaque) } /** @@ -1225,6 +1225,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole case Vector(pe : PExpression, InvokeArgs(args)) => PInvoke(pe, args, None) } + override def visitRevealInvokePrimaryExpr(ctx: RevealInvokePrimaryExprContext): AnyRef = super.visitRevealInvokePrimaryExpr(ctx) match { + case Vector(_, pe : PExpression, InvokeArgs(args)) => PInvoke(pe, args, None, true) + } + override def visitInvokePrimaryExprWithSpec(ctx: InvokePrimaryExprWithSpecContext): AnyRef = super.visitInvokePrimaryExprWithSpec(ctx) match { case Vector(pe: PExpression, InvokeArgs(args), "as", pcs: PClosureSpecInstance) => PInvoke(pe, args, Some(pcs)) } diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala index 8b96ff873..79c948a97 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala @@ -72,6 +72,7 @@ object SymbolTable extends Environments[Entity] { override val args: Vector[PParameter] = decl.args override val result: PResult = decl.result def isPure: Boolean = decl.spec.isPure + def isOpaque: Boolean = decl.spec.isOpaque } case class Closure(lit: PFunctionLit, ghost: Boolean, context: ExternalTypeInfo) extends ActualDataEntity with WithArguments with WithResult { @@ -190,6 +191,7 @@ object SymbolTable extends Environments[Entity] { override def isPure: Boolean = decl.spec.isPure override val args: Vector[PParameter] = decl.args override val result: PResult = decl.result + def isOpaque: Boolean = decl.spec.isOpaque } case class MethodSpec(spec: PMethodSig, itfDef: PInterfaceType, ghost: Boolean, context: ExternalTypeInfo) extends Method { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 6cd1831b1..0bf0223f1 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -8,6 +8,7 @@ package viper.gobra.frontend.info.implementation.typing import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, check, error, noMessages} import viper.gobra.ast.frontend.{AstPattern => ap, _} +import viper.gobra.frontend.info.base.{SymbolTable => st} import viper.gobra.frontend.info.base.SymbolTable.{AdtDestructor, AdtDiscriminator, GlobalVariable, SingleConstant} import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl @@ -233,22 +234,33 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case f: PFunctionLit => capturedLocalVariables(f.decl).flatMap(v => addressable.errors(enclosingExpr(v).get)(v)) ++ wellDefVariadicArgs(f.args) ++ - f.id.fold(noMessages)(id => wellDefID(id).out) + f.id.fold(noMessages)(id => wellDefID(id).out) ++ + error(f, "Opaque function literals are not yet supported.", f.spec.isOpaque) case n: PInvoke => { val (l, r) = (exprOrType(n.base), resolve(n)) (l,r) match { - case (Right(_), Some(p: ap.Conversion)) => val typ = typeSymbType(p.typ) val argWithinBounds: Messages = underlyingTypeP(p.typ) match { case Some(_: PIntegerType) => intExprWithinTypeBounds(p.arg, typ) case _ => noMessages } - convertibleTo.errors(exprType(p.arg), typ)(n) ++ isExpr(p.arg).out ++ argWithinBounds - + error(n, "Only calls to pure functions and pure methods can be revealed: Cannot reveal a conversion.", n.reveal) ++ + convertibleTo.errors(exprType(p.arg), typ)(n) ++ + isExpr(p.arg).out ++ + argWithinBounds case (Left(callee), Some(c: ap.FunctionCall)) => + val isOpaque = c.callee match { + case base: ap.Symbolic => base.symb match { + case f: st.Function => f.isOpaque + case m: st.MethodImpl => m.isOpaque + case _ => false + } + } + val onlyRevealOpaqueFunc = + error(n, "Cannot reveal call to non-opaque function.", n.reveal && !isOpaque) val isCallToInit = error(n, s"${Constants.INIT_FUNC_NAME} function is not callable", c.callee.isInstanceOf[ap.Function] && c.callee.id.name == Constants.INIT_FUNC_NAME) @@ -261,9 +273,10 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case t: AbstractType => t.messages(n, n.args map exprType) case t => error(n, s"type error: got $t but expected function type or AbstractType") } - isCallToInit ++ wellTypedArgs + onlyRevealOpaqueFunc ++ isCallToInit ++ wellTypedArgs - case (Left(_), Some(_: ap.ClosureCall)) => wellDefCallWithSpec(n) + case (Left(_), Some(_: ap.ClosureCall)) => + error(n, "Only calls to pure functions and pure methods can be revealed: Cannot reveal a closure call.", n.reveal) ++ wellDefCallWithSpec(n) case (Left(callee), Some(p: ap.PredicateCall)) => // TODO: Maybe move case to other file val pureReceiverMsgs = p.predicate match { @@ -284,15 +297,16 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case t: AbstractType => t.messages(n, n.args map exprType) case t => error(n, s"type error: got $t but expected function type or AbstractType") } - pureReceiverMsgs ++ pureArgsMsgs ++ argAssignMsgs + error(n, "Only calls to pure functions and pure methods can be revealed: Cannot reveal a predicate instance.", n.reveal) ++ pureReceiverMsgs ++ pureArgsMsgs ++ argAssignMsgs case (Left(callee), Some(_: ap.PredExprInstance)) => - exprType(callee) match { + val wellTypedArguments = exprType(callee) match { case PredT(args) => if (n.args.isEmpty && args.isEmpty) noMessages else multiAssignableTo.errors(n.args map exprType, args)(n) ++ n.args.flatMap(isExpr(_).out) case c => Violation.violation(s"This case should be unreachable, but got $c") } + error(n, "Only calls to pure functions and pure methods can be revealed: Cannot reveal a predicate expression instance.", n.reveal) ++ wellTypedArguments case _ => error(n, s"expected a call to a conversion, function, or predicate, but got $n") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala index ad6c39039..5330c4cb4 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala @@ -35,7 +35,8 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl => case n: PTypeDecl => isType(n.right).out ++ (n.right match { case s: PStructType => error(n, s"invalid recursive type ${n.left.name}", cyclicStructDef(s, Some(n.left))) - case s: PInterfaceType => + case s@PInterfaceType(_, methSpecs, _) => + methSpecs.flatMap(m => error(m, "Interface method signatures cannot be opaque.", m.spec.isOpaque)) ++ error(n, s"invalid recursive type ${n.left.name}", cyclicInterfaceDef(s, Some(n.left))) case _ => noMessages }) @@ -156,7 +157,9 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl => case n: PDeferStmt => error(n, "Currently, outline statements are not allowed to contain defer statements.") case n: PReturn => error(n, "outline statements must not contain return statements.") } - error(n, s"pure outline statements are not supported.", n.spec.isPure) ++ invalidNodes.flatten + error(n, s"pure outline statements are not supported.", n.spec.isPure) ++ + error(n, "Opaque outline statements are not supported.", n.spec.isOpaque) ++ + invalidNodes.flatten case _: PEmptyStmt => noMessages case _: PGoto => ??? diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index 9629169a3..7161c528c 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -97,11 +97,13 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => } permWellDef ++ expWellDef - case n: PPredicateAccess => resolve(n.pred) match { - case Some(_: ap.PredicateCall) => noMessages - case Some(_: ap.PredExprInstance) => noMessages - case _ => error(n, s"expected reference, dereference, field selection, or predicate expression instance, but got ${n.pred}") - } + case n: PPredicateAccess => + val predWellDef = resolve(n.pred) match { + case Some(_: ap.PredicateCall) => noMessages + case Some(_: ap.PredExprInstance) => noMessages + case _ => error(n, s"expected reference, dereference, field selection, or predicate expression instance, but got ${n.pred}") + } + predWellDef ++ error(n, "Cannot reveal a predicate access.", n.pred.reveal) case PTypeOf(e) => isExpr(e).out case PTypeExpr(t) => isType(t).out @@ -554,7 +556,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => expr match { case PDot(base, _) => goEorT(base) - case PInvoke(base, args, None) => { + case PInvoke(base, args, None, _) => { val res1 = goEorT(base) val res2 = combineTriggerResults(args.map(validTriggerPattern)) combineTriggerResults(res1, res2) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala index 29112774b..528e45d63 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala @@ -219,7 +219,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => } implicit lazy val wellDefSpec: WellDefinedness[PSpecification] = createWellDef { - case n@ PFunctionSpec(pres, preserves, posts, terminationMeasures, _, _) => + case n@ PFunctionSpec(pres, preserves, posts, terminationMeasures, isPure, _, isOpaque) => pres.flatMap(assignableToSpec) ++ preserves.flatMap(assignableToSpec) ++ posts.flatMap(assignableToSpec) ++ preserves.flatMap(e => allChildren(e).flatMap(illegalPreconditionNode)) ++ pres.flatMap(e => allChildren(e).flatMap(illegalPreconditionNode)) ++ @@ -228,7 +228,8 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => // can only have one non-conditional clause error(n, "Specifications can either contain one non-conditional termination measure or multiple conditional-termination measures.", terminationMeasures.length > 1 && !terminationMeasures.forall(isConditional)) ++ // measures must have the same type - error(n, "Termination measures must all have the same type.", !hasSameMeasureType(terminationMeasures)) + error(n, "Termination measures must all have the same type.", !hasSameMeasureType(terminationMeasures)) ++ + error(n, "Opaque can only be used in combination with pure.", isOpaque && !isPure) case n@ PLoopSpec(invariants, terminationMeasure) => invariants.flatMap(assignableToSpec) ++ terminationMeasure.toVector.flatMap(wellDefTerminationMeasure) ++ diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala index b524fc44c..c28e33755 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala @@ -77,8 +77,9 @@ class GoifyingPrinter(info: TypeInfoImpl) extends DefaultPrettyPrinter { * Shows the Goified version of the function / method specification */ override def showSpec(spec: PSpecification): Doc = spec match { - case PFunctionSpec(pres, preserves, posts, measures, isPure, isTrusted) => + case PFunctionSpec(pres, preserves, posts, measures, isPure, isTrusted, isOpaque) => (if (isPure) specComment <+> showPure else emptyDoc) <> + (if (isOpaque) specComment <+> showOpaque else emptyDoc) <> (if (isTrusted) specComment <+> showTrusted else emptyDoc) <> hcat(pres map (p => specComment <+> showPre(p) <> line)) <> hcat(preserves map (p => specComment <+> showPreserves(p) <> line)) <> diff --git a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala index ba6c8abab..56049875b 100644 --- a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala @@ -302,7 +302,8 @@ class StringEncoding extends LeafTypeEncoding { pres = Vector(pre), posts = Vector(), terminationMeasures = Vector(in.WildcardMeasure(None)(info)), - body = None + body = None, + isOpaque = false )(info) val translatedFunc = ctx.function(func) translatedFunc.res diff --git a/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala index 4a6d21074..d13147fa5 100644 --- a/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/channels/ChannelEncoding.scala @@ -155,7 +155,7 @@ class ChannelEncoding extends LeafTypeEncoding { _ <- write(vprIsChannelInhale) // inhale [a].BufferSize() == [bufferSize] - bufferSizeCall = in.PureMethodCall(a, bufferSizeMProxy, Vector(), in.IntT(Addressability.outParameter))(makeStmt.info) + bufferSizeCall = in.PureMethodCall(a, bufferSizeMProxy, Vector(), in.IntT(Addressability.outParameter), false)(makeStmt.info) bufferSizeEq = in.EqCmp(bufferSizeCall, bufferSizeArg)(makeStmt.info) vprBufferSizeEq <- ctx.expression(bufferSizeEq) vprBufferSizeInhale = vpr.Inhale(vprBufferSizeEq)(pos, info, errT) @@ -262,7 +262,7 @@ class ChannelEncoding extends LeafTypeEncoding { private def getChannelInvariantAccess(channel: in.Expr, invariant: in.MethodProxy, args: Vector[in.Expr], argTypes: Vector[in.Type])(src: Source.Parser.Info): in.Access = { require(args.length == argTypes.length) val permReturnT = in.PredT(argTypes, Addressability.outParameter) - val permPred = in.PureMethodCall(channel, invariant, Vector(), permReturnT)(src) + val permPred = in.PureMethodCall(channel, invariant, Vector(), permReturnT, false)(src) in.Access(in.Accessible.PredExpr(in.PredExprInstance(permPred, args)(src)), in.FullPerm(src))(src) } } diff --git a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala index 3a35fcd57..3b12c07bc 100644 --- a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala +++ b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala @@ -48,7 +48,7 @@ protected class ClosureSpecsEncoder { def callToClosureGetter(func: in.FunctionMemberOrLitProxy, captured: Vector[(in.Expr, in.Parameter.In)] = Vector.empty)(ctx: Context): CodeWriter[vpr.Exp] = { val errorTransformers = register(in.ClosureSpec(func, Map.empty)(func.info))(ctx, func.info) for { - exp <- ctx.expression(in.PureFunctionCall(closureGetterFunctionProxy(func), captured.map(c => c._1), genericFuncType)(func.info)) + exp <- ctx.expression(in.PureFunctionCall(closureGetterFunctionProxy(func), captured.map(c => c._1), genericFuncType, false)(func.info)) _ <- errorT(errorTransformers: _*) } yield exp } @@ -77,7 +77,7 @@ protected class ClosureSpecsEncoder { register(c.spec)(ctx, c.spec.info) for { - exp <- ctx.expression(in.PureFunctionCall(closureCallProxy(c.spec)(c.info), closureCallArgs(c.closure, c.args, c.spec)(ctx), c.typ)(c.info)) + exp <- ctx.expression(in.PureFunctionCall(closureCallProxy(c.spec)(c.info), closureCallArgs(c.closure, c.args, c.spec)(ctx), c.typ, false)(c.info)) callNode = exp.deepCollect{ case funcApp: vpr.FuncApp => funcApp }.head _ <- errorT(doesNotImplementSpecErr(callNode, c.closure.info.tag)) } yield exp @@ -208,7 +208,7 @@ protected class ClosureSpecsEncoder { val result = in.Parameter.Out(Names.closureArg, genericFuncType)(info) val satisfiesSpec = in.ExprAssertion(in.ClosureImplements(result, in.ClosureSpec(func, Map.empty)(info))(info))(info) val (args, captAssertions) = capturedArgsAndAssertions(ctx)(result, captured(ctx)(func), info) - val getter = in.PureFunction(proxy, args, Vector(result), Vector.empty, Vector(satisfiesSpec) ++ captAssertions, Vector.empty, None)(memberOrLit(ctx)(func).info) + val getter = in.PureFunction(proxy, args, Vector(result), Vector.empty, Vector(satisfiesSpec) ++ captAssertions, Vector.empty, None, false)(memberOrLit(ctx)(func).info) ctx.defaultEncoding.pureFunction(getter)(ctx) } @@ -282,7 +282,7 @@ protected class ClosureSpecsEncoder { Some(in.ExprAssertion(in.ClosureImplements(closurePar, specWithFuncArgs(spec, func))(spec.info))(spec.info)) else None val fromClosureGetter = if (captArgs.nonEmpty) Some(in.ExprAssertion(in.EqCmp(closurePar, - in.PureFunctionCall(closureGetterFunctionProxy(spec.func), captArgs, genericFuncType)(spec.info))(spec.info) + in.PureFunctionCall(closureGetterFunctionProxy(spec.func), captArgs, genericFuncType, false)(spec.info))(spec.info) )(spec.info)) else None val args = Vector(closurePar) ++ captArgs ++ func.args val pres = implementsAssertion.toVector ++ fromClosureGetter ++ func.pres @@ -300,12 +300,12 @@ protected class ClosureSpecsEncoder { ctx.defaultEncoding.function(func)(ctx) case f: in.PureFunction => val posts = func.posts ++ assertionFromPureFunctionBody(f.body, f.results.head) - val m = in.PureFunction(proxy, args, f.results, pres, posts, f.terminationMeasures, None)(spec.info) + val m = in.PureFunction(proxy, args, f.results, pres, posts, f.terminationMeasures, None, f.isOpaque)(spec.info) ctx.defaultEncoding.pureFunction(m)(ctx) case lit: in.PureFunctionLit => val body = if (spec.params.isEmpty) lit.body else None val posts = lit.posts ++ (if (spec.params.isEmpty) Vector.empty else assertionFromPureFunctionBody(lit.body, lit.results.head).toVector) - val func = in.PureFunction(proxy, args, lit.results, pres, posts, lit.terminationMeasures, body)(lit.info) + val func = in.PureFunction(proxy, args, lit.results, pres, posts, lit.terminationMeasures, body, false)(lit.info) ctx.defaultEncoding.pureFunction(func)(ctx) } } diff --git a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala index 5f97f2807..518a9f446 100644 --- a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala @@ -10,6 +10,7 @@ import org.bitbucket.inkytonik.kiama.==> import viper.gobra.ast.{internal => in} import viper.gobra.translator.encodings.combinators.Encoding import viper.gobra.translator.context.Context +import viper.gobra.translator.util.VprInfo import viper.silver.{ast => vpr} class DefaultPureMethodEncoding extends Encoding { @@ -26,6 +27,7 @@ class DefaultPureMethodEncoding extends Encoding { require(meth.results.size == 1) val (pos, info, errT) = meth.vprMeta + val annotatedInfo = VprInfo.maybeAttachOpaque(info, meth.isOpaque) val vRecv = ctx.variable(meth.receiver) val vRecvPres = ctx.varPrecondition(meth.receiver).toVector @@ -62,7 +64,7 @@ class DefaultPureMethodEncoding extends Encoding { pres = pres ++ measures, posts = posts, body = body - )(pos, info, errT) + )(pos, annotatedInfo, errT) } yield function } @@ -71,6 +73,7 @@ class DefaultPureMethodEncoding extends Encoding { require(func.results.size == 1) val (pos, info, errT) = func.vprMeta + val annotatedInfo = VprInfo.maybeAttachOpaque(info, func.isOpaque) val vArgs = func.args.map(ctx.variable) val vArgPres = func.args.flatMap(ctx.varPrecondition) @@ -104,7 +107,7 @@ class DefaultPureMethodEncoding extends Encoding { pres = pres ++ measures, posts = posts, body = body - )(pos, info, errT) + )(pos, annotatedInfo, errT) } yield function } diff --git a/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala index 1f70d737f..03828766f 100644 --- a/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala @@ -742,7 +742,7 @@ class InterfaceEncoding extends LeafTypeEncoding { val itfSymb = ctx.lookup(p.superProxy).asInstanceOf[in.PureMethod] val vItfFun = ctx.defaultEncoding.pureMethod(itfSymb)(ctx).res - val body = p.body.getOrElse(in.PureMethodCall(p.receiver, p.subProxy, p.args, p.results.head.typ)(p.info)) + val body = p.body.getOrElse(in.PureMethodCall(p.receiver, p.subProxy, p.args, p.results.head.typ, false)(p.info)) val pureMethodDummy = ctx.defaultEncoding.pureMethod(in.PureMethod( receiver = p.receiver, @@ -752,7 +752,8 @@ class InterfaceEncoding extends LeafTypeEncoding { pres = Vector.empty, posts = Vector.empty, terminationMeasures = Vector.empty, - body = Some(body) + body = Some(body), + isOpaque = false )(p.info))(ctx) val pres = vItfFun.pres.map { pre => diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala index df86ccff2..0299e76cc 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala @@ -216,7 +216,7 @@ class BuiltInEncoding extends Encoding { val pres: Vector[in.Assertion] = Vector( in.Access(isChannelInst, in.WildcardPerm(src))(src), ) - in.PureMethod(recvParam, x.name, Vector(), Vector(kParam), pres, Vector(), Vector(), None)(src) + in.PureMethod(recvParam, x.name, Vector(), Vector(kParam), pres, Vector(), Vector(), None, false)(src) case (tag: ChannelInvariantMethodTag, recv: in.ChannelT) => /** @@ -242,7 +242,7 @@ class BuiltInEncoding extends Encoding { val pres: Vector[in.Assertion] = Vector( in.Access(chanPredicate, in.WildcardPerm(src))(src) ) - in.PureMethod(recvParam, x.name, Vector(), Vector(resParam), pres, Vector(), Vector(), None)(src) + in.PureMethod(recvParam, x.name, Vector(), Vector(resParam), pres, Vector(), Vector(), None, false)(src) case (InitChannelMethodTag, recv: in.ChannelT) => /** @@ -680,6 +680,6 @@ class BuiltInEncoding extends Encoding { */ private def builtInPureMethodCall(tag: BuiltInMethodTag, recv: in.Expr, args: Vector[in.Expr], retType: in.Type)(src: Source.Parser.Info)(ctx: Context): in.PureMethodCall = { val method = getOrGenerateMethod(tag, recv.typ, args.map(_.typ))(src)(ctx) - in.PureMethodCall(recv, method, args, retType)(src) + in.PureMethodCall(recv, method, args, retType, false)(src) } } diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/CallEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/CallEncoding.scala index b7209627b..5cd633fd4 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/CallEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/CallEncoding.scala @@ -13,6 +13,7 @@ import viper.gobra.translator.encodings.combinators.Encoding import viper.gobra.translator.context.Context import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.translator.util.{ViperUtil => vu} +import viper.gobra.translator.util.VprInfo import viper.gobra.util.Violation import viper.silver.{ast => vpr} @@ -21,23 +22,27 @@ class CallEncoding extends Encoding { import viper.gobra.translator.util.ViperWriter.CodeLevel._ override def expression(ctx: Context): in.Expr ==> CodeWriter[vpr.Exp] = { - case x@in.PureFunctionCall(func, args, typ) => + case x@in.PureFunctionCall(func, args, typ, reveal) => val (pos, info, errT) = x.vprMeta + val annotatedInfo = VprInfo.maybeAttachReveal(info, reveal) + val resultType = ctx.typ(typ) for { vArgs <- sequence(args map ctx.expression) - app = vpr.FuncApp(func.name, vArgs)(pos, info, resultType, errT) + app = vpr.FuncApp(func.name, vArgs)(pos, annotatedInfo, resultType, errT) } yield app - case x@in.PureMethodCall(recv, meth, args, typ) => + case x@in.PureMethodCall(recv, meth, args, typ, reveal) => val (pos, info, errT) = x.vprMeta + val annotatedInfo = VprInfo.maybeAttachReveal(info, reveal) + val resultType = ctx.typ(typ) for { vRecv <- ctx.expression(recv) vArgs <- sequence(args map ctx.expression) - app = vpr.FuncApp(meth.uniqueName, vRecv +: vArgs)(pos, info, resultType, errT) + app = vpr.FuncApp(meth.uniqueName, vRecv +: vArgs)(pos, annotatedInfo, resultType, errT) } yield app } diff --git a/src/main/scala/viper/gobra/translator/util/VprInfo.scala b/src/main/scala/viper/gobra/translator/util/VprInfo.scala new file mode 100644 index 000000000..58956d0fe --- /dev/null +++ b/src/main/scala/viper/gobra/translator/util/VprInfo.scala @@ -0,0 +1,31 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2023 ETH Zurich. + +package viper.gobra.translator.util +import viper.silver.{ast => vpr} + +object VprInfo { + def maybeAttachOpaque(info: vpr.Info, isOpaque: Boolean): vpr.Info = { + if (isOpaque) { + attachAnnotation(info, "opaque") + } else { + info + } + } + + def maybeAttachReveal(info: vpr.Info, reveal: Boolean): vpr.Info = { + if (reveal) { + attachAnnotation(info, "reveal") + } else { + info + } + } + + private def attachAnnotation(info: vpr.Info, key: String, values: String*) : vpr.Info = { + val annotation = vpr.AnnotationInfo(Map(key -> values)) + vpr.ConsInfo(annotation, info) + } +} diff --git a/src/test/resources/regressions/features/opaque/opaque-closure-fail1.gobra b/src/test/resources/regressions/features/opaque/opaque-closure-fail1.gobra new file mode 100644 index 000000000..86f1f5272 --- /dev/null +++ b/src/test/resources/regressions/features/opaque/opaque-closure-fail1.gobra @@ -0,0 +1,17 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +func main() { + x@ := 0 + // Closure cannot be made opaque + //:: ExpectedOutput(type_error) + c := preserves acc(&x) + ensures x == old(x) + n && m == x + opaque + pure func f(n int) (m int) { + x += n; + return x + } +} diff --git a/src/test/resources/regressions/features/opaque/opaque-fac1.gobra b/src/test/resources/regressions/features/opaque/opaque-fac1.gobra new file mode 100644 index 000000000..fd18aa19a --- /dev/null +++ b/src/test/resources/regressions/features/opaque/opaque-fac1.gobra @@ -0,0 +1,30 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// This file does not exercise opaque. Rather, it serves as a base case +// compared to the files opaque-fac2.gobra and opaque-fac3.gobra. + +package pkg + +ghost +decreases i +pure func fac(i int) int { + return i <= 1 ? 1 : i * fac(i - 1) +} + +ghost +decreases +func example1 (i int) int { + tmp := fac(3) + //:: ExpectedOutput(assert_error:assertion_error) + assert tmp == 6 +} + +ghost +decreases +func example2 (i int) int { + tmp := fac(3) + assert tmp == 3 * fac(2) + assert tmp == 3 * 2 * fac(1) + assert tmp == 6 +} diff --git a/src/test/resources/regressions/features/opaque/opaque-fac2.gobra b/src/test/resources/regressions/features/opaque/opaque-fac2.gobra new file mode 100644 index 000000000..2dd755485 --- /dev/null +++ b/src/test/resources/regressions/features/opaque/opaque-fac2.gobra @@ -0,0 +1,45 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +ghost +decreases i +opaque +pure func fac(i int) int { + return i <= 1 ? 1 : i * fac(i - 1) +} + +ghost +decreases +func example1 (i int) int { + tmp := fac(3) + //:: ExpectedOutput(assert_error:assertion_error) + assert tmp == 6 +} + +ghost +decreases +func example2 (i int) int { + tmp := fac(3) + //:: ExpectedOutput(assert_error:assertion_error) + assert tmp == 3 * fac(2) +} + +ghost +decreases +func example3 (i int) int { + tmp := reveal fac(3) + assert tmp == 3 * reveal fac(2) + assert tmp == 3 * 2 * reveal fac(1) + assert tmp == 6 +} + +ghost +decreases +func example4 (i int) int { + tmp := reveal fac(3) + assert tmp == 3 * fac(2) + //:: ExpectedOutput(assert_error:assertion_error) + assert tmp == 3 * 2 * reveal fac(1) +} diff --git a/src/test/resources/regressions/features/opaque/opaque-fac3.gobra b/src/test/resources/regressions/features/opaque/opaque-fac3.gobra new file mode 100644 index 000000000..68447ed0f --- /dev/null +++ b/src/test/resources/regressions/features/opaque/opaque-fac3.gobra @@ -0,0 +1,54 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +ghost +decreases i +opaque +pure func fac(i int) int { + return i <= 1 ? 1 : i * (reveal fac(i - 1)) +} + +ghost +decreases +func example1 (i int) int { + tmp := fac(3) + //:: ExpectedOutput(assert_error:assertion_error) + assert tmp == 6 +} + +ghost +decreases +func example2 (i int) int { + tmp := fac(3) + //:: ExpectedOutput(assert_error:assertion_error) + assert tmp == 3 * fac(2) +} + +ghost +decreases +func example3 (i int) int { + tmp := reveal fac(3) + assert tmp == 3 * reveal fac(2) + assert tmp == 3 * 2 * reveal fac(1) + assert tmp == 6 +} + +ghost +decreases +func example4 (i int) int { + tmp := reveal fac(3) + assert tmp == 3 * fac(2) + //:: ExpectedOutput(assert_error:assertion_error) + assert tmp == 3 * 2 * reveal fac(1) +} + +ghost +decreases +func example5 (i int) int { + tmp := reveal fac(3) + //:: ExpectedOutput(assert_error:assertion_error) + assert tmp == 6 +} + diff --git a/src/test/resources/regressions/features/opaque/opaque-function-fail1.gobra b/src/test/resources/regressions/features/opaque/opaque-function-fail1.gobra new file mode 100644 index 000000000..10e05ece8 --- /dev/null +++ b/src/test/resources/regressions/features/opaque/opaque-function-fail1.gobra @@ -0,0 +1,11 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +// Cannot make non-pure function opaque +//:: ExpectedOutput(type_error) +opaque +func A() int { + return 42 +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/opaque/opaque-interface-fail1.gobra b/src/test/resources/regressions/features/opaque/opaque-interface-fail1.gobra new file mode 100644 index 000000000..edd5fbcdf --- /dev/null +++ b/src/test/resources/regressions/features/opaque/opaque-interface-fail1.gobra @@ -0,0 +1,24 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +// This does not parse: +// type foo interface { +// opaque pure bar() (res int) +// } + +// Interface method signatures cannot be opaque. +type foo interface { + //:: ExpectedOutput(type_error) + opaque + pure bar() (res int) +} + +type test int + +test implements foo + +ensures res == 5 +decreases +pure func (x test) bar() (res int) \ No newline at end of file diff --git a/src/test/resources/regressions/features/opaque/opaque-method-fail1.gobra b/src/test/resources/regressions/features/opaque/opaque-method-fail1.gobra new file mode 100644 index 000000000..fa035ccac --- /dev/null +++ b/src/test/resources/regressions/features/opaque/opaque-method-fail1.gobra @@ -0,0 +1,13 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg; + +type IntType int + +// Cannot make non-pure method opaque +//:: ExpectedOutput(type_error) +opaque +func (x IntType) negateCorrectSpec() (ret IntType) { + return -x +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/opaque/opaque-outline-fail1.gobra b/src/test/resources/regressions/features/opaque/opaque-outline-fail1.gobra new file mode 100644 index 000000000..c70af8c0c --- /dev/null +++ b/src/test/resources/regressions/features/opaque/opaque-outline-fail1.gobra @@ -0,0 +1,13 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +func test1() { + // Cannot make outline opaque + //:: ExpectedOutput(type_error) + opaque + outline ( + x := 10 + ) +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/opaque/opaque-spec-simple1.gobra b/src/test/resources/regressions/features/opaque/opaque-spec-simple1.gobra new file mode 100644 index 000000000..fa321e4fc --- /dev/null +++ b/src/test/resources/regressions/features/opaque/opaque-spec-simple1.gobra @@ -0,0 +1,13 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +ensures res == (x > 0) +decreases +opaque +pure func foo(x int) (res bool) + +func bar() { + t := reveal foo(3) +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/opaque/reveal-conversion-fail1.gobra b/src/test/resources/regressions/features/opaque/reveal-conversion-fail1.gobra new file mode 100644 index 000000000..37d8a769c --- /dev/null +++ b/src/test/resources/regressions/features/opaque/reveal-conversion-fail1.gobra @@ -0,0 +1,10 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +func foo(i int) { + // Cannot reveal conversions + //:: ExpectedOutput(type_error) + f := reveal float64(i) +} diff --git a/src/test/resources/regressions/features/opaque/reveal-fail1.gobra b/src/test/resources/regressions/features/opaque/reveal-fail1.gobra new file mode 100644 index 000000000..55930330a --- /dev/null +++ b/src/test/resources/regressions/features/opaque/reveal-fail1.gobra @@ -0,0 +1,15 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +decreases +pure func A() int { + return 42 +} + +func B() { + // Cannot reveal non-opaque function + //:: ExpectedOutput(type_error) + a := reveal A() +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/opaque/reveal-fail2.gobra b/src/test/resources/regressions/features/opaque/reveal-fail2.gobra new file mode 100644 index 000000000..09cd2078c --- /dev/null +++ b/src/test/resources/regressions/features/opaque/reveal-fail2.gobra @@ -0,0 +1,17 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg; + +type IntType int + +decreases +pure func (x IntType) negateCorrectSpec() (ret IntType) { + return -x +} + +func test(x IntType) { + // Cannot reveal non-opaque method + //:: ExpectedOutput(type_error) + nx := reveal x.negateCorrectSpec() +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/opaque/reveal-predicate-fail1.gobra b/src/test/resources/regressions/features/opaque/reveal-predicate-fail1.gobra new file mode 100644 index 000000000..d5112a3a8 --- /dev/null +++ b/src/test/resources/regressions/features/opaque/reveal-predicate-fail1.gobra @@ -0,0 +1,28 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg; + +type coordinate struct{ + x, y, val int; +}; + +pred cooMem(self *coordinate) { + acc(&self.x) && acc(&self.y) && acc(&self.val) +}; + + +requires cooMem(self); +decreases +pure func (self *coordinate) value() int { + return unfolding cooMem(self) in self.val; +}; + +func test1() { + coo := &coordinate{1,2,3}; + fold cooMem(coo); + assert coo.value() == 3; + // Cannot reveal predicate + //:: ExpectedOutput(type_error) + unfold reveal cooMem(coo); +}; diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index a8a132b6e..c704199b8 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -24,13 +24,13 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: Invoke") { frontend.parseExpOrFail("Contains(v)") should matchPattern { - case PInvoke(PNamedOperand(PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None) => + case PInvoke(PNamedOperand(PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None, false) => } } test("Parser: DotInvoke") { frontend.parseExpOrFail("self.Contains(v)") should matchPattern { - case PInvoke(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None) => + case PInvoke(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None, false) => } } @@ -42,13 +42,13 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: DoubleDotInvoke1") { frontend.parseExpOrFail("(self.Left).Contains(v)") should matchPattern { - case PInvoke(PDot(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Left")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None) => + case PInvoke(PDot(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Left")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None, false) => } } test("Parser: DoubleDotInvoke2") { frontend.parseExpOrFail("self.Left.Contains(v)") should matchPattern { - case PInvoke(PDot(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Left")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None) => + case PInvoke(PDot(PDot(PNamedOperand(PIdnUse("self")), PIdnUse("Left")), PIdnUse("Contains")), Vector(PNamedOperand(PIdnUse("v"))), None, false) => } } @@ -120,13 +120,13 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: spec only function") { frontend.parseFunctionDecl("func foo() { b.bar() }", specOnly = true) should matchPattern { - case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) => + case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false, false), None) => } } test("Parser: spec only function with nested blocks") { frontend.parseFunctionDecl("func foo() { if(true) { b.bar() } else { foo() } }", specOnly = true) should matchPattern { - case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) => + case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false, false), None) => } } @@ -145,13 +145,13 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: fold mpredicate call") { frontend.parseStmtOrFail("fold (*(b.Rectangle)).RectMem(&r)") should matchPattern { - case PFold(PPredicateAccess(PInvoke(PDot(PDeref(PDot(PNamedOperand(PIdnUse("b")), PIdnUse("Rectangle"))), PIdnUse("RectMem")), Vector(PReference(PNamedOperand(PIdnUse("r")))), None), PFullPerm())) => + case PFold(PPredicateAccess(PInvoke(PDot(PDeref(PDot(PNamedOperand(PIdnUse("b")), PIdnUse("Rectangle"))), PIdnUse("RectMem")), Vector(PReference(PNamedOperand(PIdnUse("r")))), None, false), PFullPerm())) => } } test("Parser: fold fpredicate call") { frontend.parseStmtOrFail("fold b.RectMem(&r)") should matchPattern { - case PFold(PPredicateAccess(PInvoke(PDot(PNamedOperand(PIdnUse("b")), PIdnUse("RectMem")), Vector(PReference(PNamedOperand(PIdnUse("r")))), None), PFullPerm())) => + case PFold(PPredicateAccess(PInvoke(PDot(PNamedOperand(PIdnUse("b")), PIdnUse("RectMem")), Vector(PReference(PNamedOperand(PIdnUse("r")))), None, false), PFullPerm())) => } } @@ -159,7 +159,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { val modes: Set[Boolean] = Set(false, true) modes.foreach(specOnly => { frontend.parseFunctionDecl("func bar()", specOnly) should matchPattern { - case PFunctionDecl(PIdnDef("bar"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) => + case PFunctionDecl(PIdnDef("bar"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false, false), None) => } }) } @@ -2516,7 +2516,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should be able to parse an explicit short var decl") { frontend.parseStmtOrFail("ghost res := test(s)") should matchPattern { case PExplicitGhostStatement(PShortVarDecl( - Vector(PInvoke(PNamedOperand(PIdnUse("test")), Vector(PNamedOperand(PIdnUse("s"))), None)), + Vector(PInvoke(PNamedOperand(PIdnUse("test")), Vector(PNamedOperand(PIdnUse("s"))), None, false)), Vector(PIdnUnk("res")), Vector(false))) => } @@ -2525,7 +2525,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should be able to parse an explicit short var decl with ghost in the declaration") { frontend.parseStmtOrFail("ghost ghostRes := test(s)") should matchPattern { case PExplicitGhostStatement(PShortVarDecl( - Vector(PInvoke(PNamedOperand(PIdnUse("test")), Vector(PNamedOperand(PIdnUse("s"))), None)), + Vector(PInvoke(PNamedOperand(PIdnUse("test")), Vector(PNamedOperand(PIdnUse("s"))), None, false)), Vector(PIdnUnk("ghostRes")), Vector(false))) => } @@ -2619,7 +2619,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { // 0xf8 == 248 val parseRes = frontend.parseExp("string(248)") inside (parseRes) { - case Right(PInvoke(PNamedOperand(PIdnUse("string")), Vector(PIntLit(value, Decimal)), None)) => value should be (0xf8) + case Right(PInvoke(PNamedOperand(PIdnUse("string")), Vector(PIntLit(value, Decimal)), None, false)) => value should be (0xf8) } } @@ -2643,19 +2643,19 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should be able to parse normal termination measure") { frontend.parseFunctionDecl("decreases n; func factorial (n int) int") should matchPattern { - case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), None)), false, false), None) => + case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), None)), false, false, false), None) => } } test("Parser: should be able to parse underscore termination measure") { frontend.parseFunctionDecl("decreases _; func factorial (n int) int") should matchPattern { - case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PWildcardMeasure(None)), false, false), None) => + case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PWildcardMeasure(None)), false, false, false), None) => } } test("Parser: should be able to parse conditional termination measure" ) { frontend.parseFunctionDecl("decreases n if n>1; decreases _ if n<2; func factorial (n int) int") should matchPattern { - case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), Some(PGreater(PNamedOperand(PIdnUse("n")), PIntLit(one, Decimal)))), PWildcardMeasure(Some(PLess(PNamedOperand(PIdnUse("n")), PIntLit(two, Decimal))))), false, false), None) if one == 1 && two == 2 => + case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), Some(PGreater(PNamedOperand(PIdnUse("n")), PIntLit(one, Decimal)))), PWildcardMeasure(Some(PLess(PNamedOperand(PIdnUse("n")), PIntLit(two, Decimal))))), false, false, false), None) if one == 1 && two == 2 => } } @@ -2674,7 +2674,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should be able to parse type conversions") { frontend.parseExpOrFail("uint8(1)") should matchPattern { - case PInvoke(PNamedOperand(PIdnUse("uint8")), Vector(x), None) if x == PIntLit(1) => + case PInvoke(PNamedOperand(PIdnUse("uint8")), Vector(x), None, false) if x == PIntLit(1) => } } From 0191885007cb4ea798ee9395434bc2b8f3b1d5f0 Mon Sep 17 00:00:00 2001 From: jcp19 <6281876+jcp19@users.noreply.github.com> Date: Thu, 8 Feb 2024 15:02:11 +0000 Subject: [PATCH 199/296] Updates submodules --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 277669540..b7f581a5e 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 2776695405cc01edb13487a72b9bd903b8ac67aa +Subproject commit b7f581a5e74899be27d12359375e7a194d8c89ab From aec90962d14b75b7970227d79c66f87bb0c77a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Thu, 8 Feb 2024 16:25:47 +0100 Subject: [PATCH 200/296] Use old axiomatization in silicon --- src/main/scala/viper/gobra/backend/ViperBackends.scala | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index 7746255ec..6fa5d6ea0 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -37,6 +37,9 @@ object ViperBackends { case MCE.OnDemand => "2" } options ++= Vector(s"--exhaleMode=$mceSiliconOpt") + // Gobra seems to be much slower with the new silicon axiomatization of collections. + // For now, we stick to the old one. + options ++= "--useOldAxiomatization" if (config.assumeInjectivityOnInhale) { options ++= Vector("--assumeInjectivityOnInhale") } @@ -107,6 +110,9 @@ object ViperBackends { var options: Vector[String] = Vector.empty options ++= Vector("--logLevel", "ERROR") options ++= Vector("--disableCatchingExceptions") + // Gobra seems to be much slower with the new silicon axiomatization of collections. + // For now, we stick to the old one. + options ++= "--useOldAxiomatization" val mceSiliconOpt = config.mceMode match { case MCE.Disabled => "0" case MCE.Enabled => "1" From 7d4c78ecc04054fc28a742a125cbbf5a4cf7c10f Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 13:57:15 +0100 Subject: [PATCH 201/296] adds official labels to Gobra container --- .github/workflows/test.yml | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7441179aa..ec0544384 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,7 +33,7 @@ jobs: SILICON_SILVER_REF=$(git -C viperserver/silicon/silver rev-parse HEAD) && \ CARBON_SILVER_REF=$(git -C viperserver/carbon/silver rev-parse HEAD) && \ if [ "$SILICON_SILVER_REF" != "$CARBON_SILVER_REF" ]; then echo "Silicon and Carbon reference different Silver commits ($SILICON_SILVER_REF and $CARBON_SILVER_REF)" && exit 1 ; fi - - name: Create image tag + - name: Create image tag and labels run: | IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME @@ -46,6 +46,15 @@ jobs: # Use Docker `latest` tag convention [ "$VERSION" == "master" ] && VERSION=latest echo "IMAGE_TAG=$IMAGE_ID:$VERSION" >> $GITHUB_ENV + # image labels are new-line separated key value pairs (according to https://specs.opencontainers.org/image-spec/annotations/) + CREATED_LABEL="org.opencontainers.image.created=$(date --rfc-3339=seconds)" + AUTHORS_LABEL="org.opencontainers.image.authors=Viper Project (https://viper.ethz.ch)" + URL_LABEL="org.opencontainers.image.url=https://github.com/viperproject/gobra/pkgs/container/gobra" + SOURCE_LABEL="org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}" + REVISION_LABEL="org.opencontainers.image.revision=${{ github.sha }}" + LICENSE_LABEL="org.opencontainers.image.licenses=MPL-2.0" + DESCRIPTION_LABEL="org.opencontainers.image.description=Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }}" + echo "IMAGE_LABELS=CREATED_LABEL\nAUTHORS_LABEL\nURL_LABEL\nSOURCE_LABEL\nREVISION_LABEL\nLICENSE_LABEL\nDESCRIPTION_LABEL" >> $GITHUB_ENV # used to enable Docker caching (see https://github.com/docker/build-push-action) - name: Set up Docker Buildx @@ -60,7 +69,7 @@ jobs: target: build # only build up to and including stage 'build' file: workflow-container/Dockerfile tags: ${{ env.IMAGE_TAG }} - labels: "runnumber=${{ github.run_id }}" + labels: ${{ env.IMAGE_LABELS }} push: false # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} @@ -173,7 +182,7 @@ jobs: load: true # make the built image available in docker (locally) file: workflow-container/Dockerfile tags: ${{ env.IMAGE_TAG }} - labels: "runnumber=${{ github.run_id }}" + labels: ${{ env.IMAGE_LABELS }} push: false # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} @@ -202,7 +211,7 @@ jobs: echo "SHOULD_DEPLOY=$SHOULD_DEPLOY" >> $GITHUB_ENV - name: Login to Github Packages - if: env.SHOULD_DEPLOY == 'true' + # if: env.SHOULD_DEPLOY == 'true' uses: docker/login-action@v3 with: registry: ghcr.io @@ -210,13 +219,13 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Push entire image - if: env.SHOULD_DEPLOY == 'true' + # if: env.SHOULD_DEPLOY == 'true' uses: docker/build-push-action@v5 with: context: . file: workflow-container/Dockerfile tags: ${{ env.IMAGE_TAG }} - labels: "runnumber=${{ github.run_id }}" + labels: ${{ env.IMAGE_LABELS }} push: true # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} From 76a6c138320eaa6b1a174a75a5e7a9225b1e5e4e Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 13:59:20 +0100 Subject: [PATCH 202/296] temporarily disables tests --- .github/workflows/test.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ec0544384..38204bc73 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -82,7 +82,12 @@ jobs: docker run \ --mount type=volume,dst=/build/gobra/sync,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=$PWD/sync \ ${{ env.IMAGE_TAG }} \ - /bin/sh -c "$(cat .github/test-and-measure-ram.sh)" + /bin/sh -c "echo 'Test'" + + # docker run \ + # --mount type=volume,dst=/build/gobra/sync,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=$PWD/sync \ + # ${{ env.IMAGE_TAG }} \ + # /bin/sh -c "$(cat .github/test-and-measure-ram.sh)" - name: Get max RAM usage by Java and Z3 if: ${{ always() }} From 78ef782e2083432e6c7fc8a4bea4f3f33a4b5f7c Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 14:00:50 +0100 Subject: [PATCH 203/296] fixes container labels --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 38204bc73..33612df48 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -54,7 +54,7 @@ jobs: REVISION_LABEL="org.opencontainers.image.revision=${{ github.sha }}" LICENSE_LABEL="org.opencontainers.image.licenses=MPL-2.0" DESCRIPTION_LABEL="org.opencontainers.image.description=Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }}" - echo "IMAGE_LABELS=CREATED_LABEL\nAUTHORS_LABEL\nURL_LABEL\nSOURCE_LABEL\nREVISION_LABEL\nLICENSE_LABEL\nDESCRIPTION_LABEL" >> $GITHUB_ENV + echo "IMAGE_LABELS=$CREATED_LABEL\n$AUTHORS_LABEL\n$URL_LABEL\n$SOURCE_LABEL\n$REVISION_LABEL\n$LICENSE_LABEL\n$DESCRIPTION_LABEL" >> $GITHUB_ENV # used to enable Docker caching (see https://github.com/docker/build-push-action) - name: Set up Docker Buildx From d0c96a8bc2e3c76e2b88bf09a3d5be3603989925 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 14:18:05 +0100 Subject: [PATCH 204/296] alternative approach to setting container labels --- .github/workflows/test.yml | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 33612df48..255d55ef2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,6 +16,14 @@ jobs: runs-on: ubuntu-latest env: IMAGE_NAME: gobra + IMAGE_LABELS: | + org.opencontainers.image.created=$(date --rfc-3339=seconds) + org.opencontainers.image.authors=Viper Project (https://viper.ethz.ch) + org.opencontainers.image.url=https://github.com/viperproject/gobra/pkgs/container/gobra + org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} + org.opencontainers.image.revision=${{ github.sha }} + org.opencontainers.image.licenses=MPL-2.0 + org.opencontainers.image.description=Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }} CONCLUSION_SUCCESS: "success" CONCLUSION_FAILURE: "failure" # Output levels according to severity. @@ -47,14 +55,14 @@ jobs: [ "$VERSION" == "master" ] && VERSION=latest echo "IMAGE_TAG=$IMAGE_ID:$VERSION" >> $GITHUB_ENV # image labels are new-line separated key value pairs (according to https://specs.opencontainers.org/image-spec/annotations/) - CREATED_LABEL="org.opencontainers.image.created=$(date --rfc-3339=seconds)" - AUTHORS_LABEL="org.opencontainers.image.authors=Viper Project (https://viper.ethz.ch)" - URL_LABEL="org.opencontainers.image.url=https://github.com/viperproject/gobra/pkgs/container/gobra" - SOURCE_LABEL="org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}" - REVISION_LABEL="org.opencontainers.image.revision=${{ github.sha }}" - LICENSE_LABEL="org.opencontainers.image.licenses=MPL-2.0" - DESCRIPTION_LABEL="org.opencontainers.image.description=Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }}" - echo "IMAGE_LABELS=$CREATED_LABEL\n$AUTHORS_LABEL\n$URL_LABEL\n$SOURCE_LABEL\n$REVISION_LABEL\n$LICENSE_LABEL\n$DESCRIPTION_LABEL" >> $GITHUB_ENV + # CREATED_LABEL="org.opencontainers.image.created=$(date --rfc-3339=seconds)" + # AUTHORS_LABEL="org.opencontainers.image.authors=Viper Project (https://viper.ethz.ch)" + # URL_LABEL="org.opencontainers.image.url=https://github.com/viperproject/gobra/pkgs/container/gobra" + # SOURCE_LABEL="org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}" + # REVISION_LABEL="org.opencontainers.image.revision=${{ github.sha }}" + # LICENSE_LABEL="org.opencontainers.image.licenses=MPL-2.0" + # DESCRIPTION_LABEL="org.opencontainers.image.description=Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }}" + # echo "IMAGE_LABELS=$CREATED_LABEL\n$AUTHORS_LABEL\n$URL_LABEL\n$SOURCE_LABEL\n$REVISION_LABEL\n$LICENSE_LABEL\n$DESCRIPTION_LABEL" >> $GITHUB_ENV # used to enable Docker caching (see https://github.com/docker/build-push-action) - name: Set up Docker Buildx From 28551ce838c5f5f642122ef517e1ef96082242d7 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 14:24:28 +0100 Subject: [PATCH 205/296] properly evaluates image creation time --- .github/workflows/test.yml | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 255d55ef2..5ebcc448c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,13 +17,12 @@ jobs: env: IMAGE_NAME: gobra IMAGE_LABELS: | - org.opencontainers.image.created=$(date --rfc-3339=seconds) - org.opencontainers.image.authors=Viper Project (https://viper.ethz.ch) - org.opencontainers.image.url=https://github.com/viperproject/gobra/pkgs/container/gobra - org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} - org.opencontainers.image.revision=${{ github.sha }} - org.opencontainers.image.licenses=MPL-2.0 - org.opencontainers.image.description=Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }} + org.opencontainers.image.authors="Viper Project (https://viper.ethz.ch)" + org.opencontainers.image.url="https://github.com/viperproject/gobra/pkgs/container/gobra" + org.opencontainers.image.source="${{ github.server_url }}/${{ github.repository }}" + org.opencontainers.image.revision="${{ github.sha }}" + org.opencontainers.image.licenses="MPL-2.0" + org.opencontainers.image.description="Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }}" CONCLUSION_SUCCESS: "success" CONCLUSION_FAILURE: "failure" # Output levels according to severity. @@ -55,7 +54,7 @@ jobs: [ "$VERSION" == "master" ] && VERSION=latest echo "IMAGE_TAG=$IMAGE_ID:$VERSION" >> $GITHUB_ENV # image labels are new-line separated key value pairs (according to https://specs.opencontainers.org/image-spec/annotations/) - # CREATED_LABEL="org.opencontainers.image.created=$(date --rfc-3339=seconds)" + CREATED_LABEL="org.opencontainers.image.created=$(date --rfc-3339=seconds)" # AUTHORS_LABEL="org.opencontainers.image.authors=Viper Project (https://viper.ethz.ch)" # URL_LABEL="org.opencontainers.image.url=https://github.com/viperproject/gobra/pkgs/container/gobra" # SOURCE_LABEL="org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}" @@ -63,6 +62,7 @@ jobs: # LICENSE_LABEL="org.opencontainers.image.licenses=MPL-2.0" # DESCRIPTION_LABEL="org.opencontainers.image.description=Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }}" # echo "IMAGE_LABELS=$CREATED_LABEL\n$AUTHORS_LABEL\n$URL_LABEL\n$SOURCE_LABEL\n$REVISION_LABEL\n$LICENSE_LABEL\n$DESCRIPTION_LABEL" >> $GITHUB_ENV + echo "CREATED_LABEL=$CREATED_LABEL" >> $GITHUB_ENV # used to enable Docker caching (see https://github.com/docker/build-push-action) - name: Set up Docker Buildx @@ -77,7 +77,9 @@ jobs: target: build # only build up to and including stage 'build' file: workflow-container/Dockerfile tags: ${{ env.IMAGE_TAG }} - labels: ${{ env.IMAGE_LABELS }} + labels: | + ${{ env.IMAGE_LABELS }} + ${{ env.CREATED_LABEL }} push: false # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} @@ -195,7 +197,9 @@ jobs: load: true # make the built image available in docker (locally) file: workflow-container/Dockerfile tags: ${{ env.IMAGE_TAG }} - labels: ${{ env.IMAGE_LABELS }} + labels: | + ${{ env.IMAGE_LABELS }} + ${{ env.CREATED_LABEL }} push: false # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} @@ -238,7 +242,9 @@ jobs: context: . file: workflow-container/Dockerfile tags: ${{ env.IMAGE_TAG }} - labels: ${{ env.IMAGE_LABELS }} + labels: | + ${{ env.IMAGE_LABELS }} + ${{ env.CREATED_LABEL }} push: true # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} From af67c564c2c8c8828e56b4d96069b4d70a6ac1d6 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 14:32:48 +0100 Subject: [PATCH 206/296] slightly improves image creation label --- .github/workflows/test.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5ebcc448c..36209adc1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,6 +16,7 @@ jobs: runs-on: ubuntu-latest env: IMAGE_NAME: gobra + # image labels are new-line separated key value pairs (according to https://specs.opencontainers.org/image-spec/annotations/): IMAGE_LABELS: | org.opencontainers.image.authors="Viper Project (https://viper.ethz.ch)" org.opencontainers.image.url="https://github.com/viperproject/gobra/pkgs/container/gobra" @@ -40,7 +41,7 @@ jobs: SILICON_SILVER_REF=$(git -C viperserver/silicon/silver rev-parse HEAD) && \ CARBON_SILVER_REF=$(git -C viperserver/carbon/silver rev-parse HEAD) && \ if [ "$SILICON_SILVER_REF" != "$CARBON_SILVER_REF" ]; then echo "Silicon and Carbon reference different Silver commits ($SILICON_SILVER_REF and $CARBON_SILVER_REF)" && exit 1 ; fi - - name: Create image tag and labels + - name: Create image tag run: | IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME @@ -53,21 +54,16 @@ jobs: # Use Docker `latest` tag convention [ "$VERSION" == "master" ] && VERSION=latest echo "IMAGE_TAG=$IMAGE_ID:$VERSION" >> $GITHUB_ENV - # image labels are new-line separated key value pairs (according to https://specs.opencontainers.org/image-spec/annotations/) - CREATED_LABEL="org.opencontainers.image.created=$(date --rfc-3339=seconds)" - # AUTHORS_LABEL="org.opencontainers.image.authors=Viper Project (https://viper.ethz.ch)" - # URL_LABEL="org.opencontainers.image.url=https://github.com/viperproject/gobra/pkgs/container/gobra" - # SOURCE_LABEL="org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}" - # REVISION_LABEL="org.opencontainers.image.revision=${{ github.sha }}" - # LICENSE_LABEL="org.opencontainers.image.licenses=MPL-2.0" - # DESCRIPTION_LABEL="org.opencontainers.image.description=Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }}" - # echo "IMAGE_LABELS=$CREATED_LABEL\n$AUTHORS_LABEL\n$URL_LABEL\n$SOURCE_LABEL\n$REVISION_LABEL\n$LICENSE_LABEL\n$DESCRIPTION_LABEL" >> $GITHUB_ENV - echo "CREATED_LABEL=$CREATED_LABEL" >> $GITHUB_ENV # used to enable Docker caching (see https://github.com/docker/build-push-action) - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Create image creation label + run: | + CREATED_LABEL="org.opencontainers.image.created=\"$(date --rfc-3339=seconds)\"" + echo "CREATED_LABEL=$CREATED_LABEL" >> $GITHUB_ENV + - name: Build image up to including stage 'build' # note that the action's name is misleading: this step does NOT push uses: docker/build-push-action@v5 From a5595a9a72b99bf0883fb6e8bac608e3aca47267 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 14:42:55 +0100 Subject: [PATCH 207/296] prints image metadata during CI --- .github/workflows/test.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 36209adc1..8278c7085 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -65,6 +65,7 @@ jobs: echo "CREATED_LABEL=$CREATED_LABEL" >> $GITHUB_ENV - name: Build image up to including stage 'build' + id: image-build # note that the action's name is misleading: this step does NOT push uses: docker/build-push-action@v5 with: @@ -81,6 +82,9 @@ jobs: cache-from: type=gha, scope=${{ github.workflow }} cache-to: type=gha, scope=${{ github.workflow }} + - name: Print metadata + run: echo ${{ steps.image-build.outputs.metadata }} + - name: Execute all tests run: | # create a directory to sync with the docker container and to store the created pidstats From 97675ac2bb794d0e5d84b25f79235ec2a05a0c9a Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 14:59:17 +0100 Subject: [PATCH 208/296] switches to using metadata action --- .github/workflows/test.yml | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8278c7085..6354dcb8d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -53,6 +53,7 @@ jobs: [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v\.?//') # Use Docker `latest` tag convention [ "$VERSION" == "master" ] && VERSION=latest + echo "IMAGE_ID=$IMAGE_ID" >> $GITHUB_ENV echo "IMAGE_TAG=$IMAGE_ID:$VERSION" >> $GITHUB_ENV # used to enable Docker caching (see https://github.com/docker/build-push-action) @@ -64,6 +65,15 @@ jobs: CREATED_LABEL="org.opencontainers.image.created=\"$(date --rfc-3339=seconds)\"" echo "CREATED_LABEL=$CREATED_LABEL" >> $GITHUB_ENV + - name: Create image metadata + id: image-metadata + uses: docker/metadata-action@v5 + with: + images: ${{ env.IMAGE_ID }} + labels: | + ${{ env.IMAGE_LABELS }} + ${{ env.CREATED_LABEL }} + - name: Build image up to including stage 'build' id: image-build # note that the action's name is misleading: this step does NOT push @@ -73,10 +83,8 @@ jobs: load: true # make the built image available in docker (locally) target: build # only build up to and including stage 'build' file: workflow-container/Dockerfile - tags: ${{ env.IMAGE_TAG }} - labels: | - ${{ env.IMAGE_LABELS }} - ${{ env.CREATED_LABEL }} + tags: ${{ steps.image-metadata.outputs.tags }} + labels: ${{ steps.image-metadata.outputs.labels }} push: false # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} @@ -196,10 +204,8 @@ jobs: context: . load: true # make the built image available in docker (locally) file: workflow-container/Dockerfile - tags: ${{ env.IMAGE_TAG }} - labels: | - ${{ env.IMAGE_LABELS }} - ${{ env.CREATED_LABEL }} + tags: ${{ steps.image-metadata.outputs.tags }} + labels: ${{ steps.image-metadata.outputs.labels }} push: false # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} @@ -241,10 +247,8 @@ jobs: with: context: . file: workflow-container/Dockerfile - tags: ${{ env.IMAGE_TAG }} - labels: | - ${{ env.IMAGE_LABELS }} - ${{ env.CREATED_LABEL }} + tags: ${{ steps.image-metadata.outputs.tags }} + labels: ${{ steps.image-metadata.outputs.labels }} push: true # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} From 8be5644e61715ba03f9a7ac4673ee94374e0e1ee Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 15:45:23 +0100 Subject: [PATCH 209/296] remove printing of metadata --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6354dcb8d..d766f806a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -90,8 +90,8 @@ jobs: cache-from: type=gha, scope=${{ github.workflow }} cache-to: type=gha, scope=${{ github.workflow }} - - name: Print metadata - run: echo ${{ steps.image-build.outputs.metadata }} + # - name: Print metadata + # run: echo ${{ steps.image-build.outputs.metadata }} - name: Execute all tests run: | From d8021fc21897af38d42c39d7d6cae1a381bf1dbc Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 17:03:12 +0100 Subject: [PATCH 210/296] disables provenance attestation --- .github/workflows/test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d766f806a..5e7349397 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -86,6 +86,7 @@ jobs: tags: ${{ steps.image-metadata.outputs.tags }} labels: ${{ steps.image-metadata.outputs.labels }} push: false + provenance: false # without this, GH displays 2 architecture (unknown/unknown) and omits labels # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} cache-to: type=gha, scope=${{ github.workflow }} @@ -207,6 +208,7 @@ jobs: tags: ${{ steps.image-metadata.outputs.tags }} labels: ${{ steps.image-metadata.outputs.labels }} push: false + provenance: false # without this, GH displays 2 architecture (unknown/unknown) and omits labels # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} cache-to: type=gha, scope=${{ github.workflow }} @@ -250,6 +252,7 @@ jobs: tags: ${{ steps.image-metadata.outputs.tags }} labels: ${{ steps.image-metadata.outputs.labels }} push: true + provenance: false # without this, GH displays 2 architecture (unknown/unknown) and omits labels # use GitHub cache: cache-from: type=gha, scope=${{ github.workflow }} cache-to: type=gha, scope=${{ github.workflow }} From 71562ca464c1780c21573dc521f8c2390c53d107 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 21:56:50 +0100 Subject: [PATCH 211/296] removes quites for image labels --- .github/workflows/test.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5e7349397..2b5297835 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,12 +18,12 @@ jobs: IMAGE_NAME: gobra # image labels are new-line separated key value pairs (according to https://specs.opencontainers.org/image-spec/annotations/): IMAGE_LABELS: | - org.opencontainers.image.authors="Viper Project (https://viper.ethz.ch)" - org.opencontainers.image.url="https://github.com/viperproject/gobra/pkgs/container/gobra" - org.opencontainers.image.source="${{ github.server_url }}/${{ github.repository }}" - org.opencontainers.image.revision="${{ github.sha }}" - org.opencontainers.image.licenses="MPL-2.0" - org.opencontainers.image.description="Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }}" + org.opencontainers.image.authors=Viper Project + org.opencontainers.image.url=https://github.com/viperproject/gobra/pkgs/container/gobra + org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} + org.opencontainers.image.revision=${{ github.sha }} + org.opencontainers.image.licenses=MPL-2.0 + org.opencontainers.image.description=Gobra image for revision ${{ github.sha }} built by workflow run ${{ github.run_id }} CONCLUSION_SUCCESS: "success" CONCLUSION_FAILURE: "failure" # Output levels according to severity. @@ -62,7 +62,7 @@ jobs: - name: Create image creation label run: | - CREATED_LABEL="org.opencontainers.image.created=\"$(date --rfc-3339=seconds)\"" + CREATED_LABEL="org.opencontainers.image.created=$(date --rfc-3339=seconds)" echo "CREATED_LABEL=$CREATED_LABEL" >> $GITHUB_ENV - name: Create image metadata From 983c49401f592eaf7a5eafa5d63f079182663d00 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 22:12:08 +0100 Subject: [PATCH 212/296] simplifies workflow --- .github/workflows/test.yml | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2b5297835..0b72690e6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,6 +16,7 @@ jobs: runs-on: ubuntu-latest env: IMAGE_NAME: gobra + IMAGE_ID: ghcr.io/${{ github.repository_owner }}/${{ env.IMAGE_NAME }} # image labels are new-line separated key value pairs (according to https://specs.opencontainers.org/image-spec/annotations/): IMAGE_LABELS: | org.opencontainers.image.authors=Viper Project @@ -41,20 +42,6 @@ jobs: SILICON_SILVER_REF=$(git -C viperserver/silicon/silver rev-parse HEAD) && \ CARBON_SILVER_REF=$(git -C viperserver/carbon/silver rev-parse HEAD) && \ if [ "$SILICON_SILVER_REF" != "$CARBON_SILVER_REF" ]; then echo "Silicon and Carbon reference different Silver commits ($SILICON_SILVER_REF and $CARBON_SILVER_REF)" && exit 1 ; fi - - name: Create image tag - run: | - IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME - - # Change all uppercase to lowercase - IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') - # Strip git ref prefix from version - VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') - # Strip "v" prefix from tag name - [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v\.?//') - # Use Docker `latest` tag convention - [ "$VERSION" == "master" ] && VERSION=latest - echo "IMAGE_ID=$IMAGE_ID" >> $GITHUB_ENV - echo "IMAGE_TAG=$IMAGE_ID:$VERSION" >> $GITHUB_ENV # used to enable Docker caching (see https://github.com/docker/build-push-action) - name: Set up Docker Buildx @@ -73,6 +60,13 @@ jobs: labels: | ${{ env.IMAGE_LABELS }} ${{ env.CREATED_LABEL }} + tags: + type=schedule + type=ref,event=branch + type=ref,event=tag + type=ref,event=pr + # these are the default options so far. We additionally add the commit hash: + type=sha - name: Build image up to including stage 'build' id: image-build @@ -100,12 +94,12 @@ jobs: mkdir -p $PWD/sync docker run \ --mount type=volume,dst=/build/gobra/sync,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=$PWD/sync \ - ${{ env.IMAGE_TAG }} \ + ${{ steps.image-metadata.outputs.tags[0] }} \ /bin/sh -c "echo 'Test'" # docker run \ # --mount type=volume,dst=/build/gobra/sync,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=$PWD/sync \ - # ${{ env.IMAGE_TAG }} \ + # ${{ steps.image-metadata.outputs.tags[0] }} \ # /bin/sh -c "$(cat .github/test-and-measure-ram.sh)" - name: Get max RAM usage by Java and Z3 @@ -216,7 +210,7 @@ jobs: - name: Test final container by verifying a file run: | docker run \ - ${{ env.IMAGE_TAG }} \ + ${{ steps.image-metadata.outputs.tags[0] }} \ -i tutorial-examples/basicAnnotations.gobra - name: Decide whether image should be deployed or not From fe7e84d9eb738f485d595d3bf395849ea0ce0400 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 22:13:39 +0100 Subject: [PATCH 213/296] fixes syntax error in workflow --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0b72690e6..7151368be 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -60,13 +60,13 @@ jobs: labels: | ${{ env.IMAGE_LABELS }} ${{ env.CREATED_LABEL }} - tags: + tags: | type=schedule type=ref,event=branch type=ref,event=tag type=ref,event=pr - # these are the default options so far. We additionally add the commit hash: type=sha + # the first 4 tags correspond to the default options. We additionally add the commit hash - name: Build image up to including stage 'build' id: image-build From fa9d6e6b83fa4d217320e62aa1cd0727c9ab9848 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 22:15:19 +0100 Subject: [PATCH 214/296] attempts to fix dependencies within environment variables --- .github/workflows/test.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7151368be..741c47cc5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,12 +10,14 @@ on: push: # run this workflow on every push pull_request: # run this workflow on every pull_request +env: + IMAGE_NAME: gobra + jobs: # there is a single job to avoid copying the built docker image from one job to the other build-test-deploy-container: runs-on: ubuntu-latest env: - IMAGE_NAME: gobra IMAGE_ID: ghcr.io/${{ github.repository_owner }}/${{ env.IMAGE_NAME }} # image labels are new-line separated key value pairs (according to https://specs.opencontainers.org/image-spec/annotations/): IMAGE_LABELS: | From 37e98777dad159c7abd2a8400cc4277bd3a8c09a Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 22:18:16 +0100 Subject: [PATCH 215/296] fixes syntax error in workflow file --- .github/workflows/test.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 741c47cc5..4b19454d3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,15 +10,12 @@ on: push: # run this workflow on every push pull_request: # run this workflow on every pull_request -env: - IMAGE_NAME: gobra - jobs: # there is a single job to avoid copying the built docker image from one job to the other build-test-deploy-container: runs-on: ubuntu-latest env: - IMAGE_ID: ghcr.io/${{ github.repository_owner }}/${{ env.IMAGE_NAME }} + IMAGE_ID: ghcr.io/${{ github.repository_owner }}/gobra # image labels are new-line separated key value pairs (according to https://specs.opencontainers.org/image-spec/annotations/): IMAGE_LABELS: | org.opencontainers.image.authors=Viper Project From 77cd1ca898ed05ad3277a88871936d9ff9f967fa Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 22:23:13 +0100 Subject: [PATCH 216/296] adds debug output --- .github/workflows/test.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4b19454d3..3f4b28b03 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -84,8 +84,11 @@ jobs: cache-from: type=gha, scope=${{ github.workflow }} cache-to: type=gha, scope=${{ github.workflow }} - # - name: Print metadata - # run: echo ${{ steps.image-build.outputs.metadata }} + - name: Print metadata + run: | + echo "${{ steps.image-metadata.outputs.tags }}" + echo "${{ steps.image-metadata.outputs.tags[0] }}" + echo "${{ steps.image-metadata.outputs.tags[1] }}" - name: Execute all tests run: | From a1dcfab5864cdd481a2abcfb5ff58e3acdfc2221 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 22:30:28 +0100 Subject: [PATCH 217/296] fixes extraction of first image label --- .github/workflows/test.yml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3f4b28b03..dabaaef4c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -67,6 +67,9 @@ jobs: type=sha # the first 4 tags correspond to the default options. We additionally add the commit hash + - name: Get first tag + run: echo "IMAGE_TAG=$(echo "${{ steps.image-metadata.outputs.tags }}" | head -1)" >> $GITHUB_ENV + - name: Build image up to including stage 'build' id: image-build # note that the action's name is misleading: this step does NOT push @@ -84,24 +87,18 @@ jobs: cache-from: type=gha, scope=${{ github.workflow }} cache-to: type=gha, scope=${{ github.workflow }} - - name: Print metadata - run: | - echo "${{ steps.image-metadata.outputs.tags }}" - echo "${{ steps.image-metadata.outputs.tags[0] }}" - echo "${{ steps.image-metadata.outputs.tags[1] }}" - - name: Execute all tests run: | # create a directory to sync with the docker container and to store the created pidstats mkdir -p $PWD/sync docker run \ --mount type=volume,dst=/build/gobra/sync,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=$PWD/sync \ - ${{ steps.image-metadata.outputs.tags[0] }} \ + ${{ env.IMAGE_TAG }} \ /bin/sh -c "echo 'Test'" # docker run \ # --mount type=volume,dst=/build/gobra/sync,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=$PWD/sync \ - # ${{ steps.image-metadata.outputs.tags[0] }} \ + # ${{ env.IMAGE_TAG }} \ # /bin/sh -c "$(cat .github/test-and-measure-ram.sh)" - name: Get max RAM usage by Java and Z3 @@ -212,7 +209,7 @@ jobs: - name: Test final container by verifying a file run: | docker run \ - ${{ steps.image-metadata.outputs.tags[0] }} \ + ${{ env.IMAGE_TAG }} \ -i tutorial-examples/basicAnnotations.gobra - name: Decide whether image should be deployed or not From 2dd0d3dc57e1aa48f6881b939097d8f8ad9a90fa Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 22:36:05 +0100 Subject: [PATCH 218/296] Reverts "temporarily disables tests" This reverts commit 76a6c138320eaa6b1a174a75a5e7a9225b1e5e4e. --- .github/workflows/test.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index dabaaef4c..67bdbca4b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -94,12 +94,7 @@ jobs: docker run \ --mount type=volume,dst=/build/gobra/sync,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=$PWD/sync \ ${{ env.IMAGE_TAG }} \ - /bin/sh -c "echo 'Test'" - - # docker run \ - # --mount type=volume,dst=/build/gobra/sync,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=$PWD/sync \ - # ${{ env.IMAGE_TAG }} \ - # /bin/sh -c "$(cat .github/test-and-measure-ram.sh)" + /bin/sh -c "$(cat .github/test-and-measure-ram.sh)" - name: Get max RAM usage by Java and Z3 if: ${{ always() }} From 1372041042a14a681ff8ff285d3d9bc19dba3554 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 22:37:19 +0100 Subject: [PATCH 219/296] reverts to publishing the built image only on certain branches --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 67bdbca4b..3b5b442fe 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -224,7 +224,7 @@ jobs: echo "SHOULD_DEPLOY=$SHOULD_DEPLOY" >> $GITHUB_ENV - name: Login to Github Packages - # if: env.SHOULD_DEPLOY == 'true' + if: env.SHOULD_DEPLOY == 'true' uses: docker/login-action@v3 with: registry: ghcr.io @@ -232,7 +232,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Push entire image - # if: env.SHOULD_DEPLOY == 'true' + if: env.SHOULD_DEPLOY == 'true' uses: docker/build-push-action@v5 with: context: . From 5d8361aa3e5a87e7c0edb7fd3e2c6f9d1ed4d36b Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 22:53:28 +0100 Subject: [PATCH 220/296] adds 'latest' for images created on the default branch --- .github/workflows/test.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3b5b442fe..6cbf5ec09 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -60,12 +60,15 @@ jobs: ${{ env.IMAGE_LABELS }} ${{ env.CREATED_LABEL }} tags: | + # the first 4 tags correspond to the default options type=schedule type=ref,event=branch type=ref,event=tag type=ref,event=pr + # use (short) commit hash as tag: type=sha - # the first 4 tags correspond to the default options. We additionally add the commit hash + # set latest tag for default branch: + type=raw,value=latest,enable={{is_default_branch}} - name: Get first tag run: echo "IMAGE_TAG=$(echo "${{ steps.image-metadata.outputs.tags }}" | head -1)" >> $GITHUB_ENV From e46c19ee410f122c6484aef69b7189c6f8f21090 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 9 Feb 2024 22:59:52 +0100 Subject: [PATCH 221/296] sets priorities for image tags --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6cbf5ec09..dc3743fb0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -67,8 +67,8 @@ jobs: type=ref,event=pr # use (short) commit hash as tag: type=sha - # set latest tag for default branch: - type=raw,value=latest,enable={{is_default_branch}} + # use latest tag for default branch and with highest priority (1000 is the highest default priority for the other types): + type=raw,value=latest,priority=1100,enable={{is_default_branch}} - name: Get first tag run: echo "IMAGE_TAG=$(echo "${{ steps.image-metadata.outputs.tags }}" | head -1)" >> $GITHUB_ENV From 495c9f6f4f870894e300f00481a78fa3b6d614b1 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Sun, 11 Feb 2024 13:59:04 +0100 Subject: [PATCH 222/296] fixes a compiler error --- src/main/scala/viper/gobra/backend/ViperBackends.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index 43c0727f1..4a3fad8a6 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -46,7 +46,7 @@ object ViperBackends { options ++= Vector(s"--exhaleMode=$mceSiliconOpt") // Gobra seems to be much slower with the new silicon axiomatization of collections. // For now, we stick to the old one. - options ++= "--useOldAxiomatization" + options ++= Vector("--useOldAxiomatization") if (config.assumeInjectivityOnInhale) { options ++= Vector("--assumeInjectivityOnInhale") } @@ -133,7 +133,7 @@ object ViperBackends { options ++= Vector("--disableCatchingExceptions") // Gobra seems to be much slower with the new silicon axiomatization of collections. // For now, we stick to the old one. - options ++= "--useOldAxiomatization" + options ++= Vector("--useOldAxiomatization") val mceSiliconOpt = config.mceMode match { case MCE.Disabled => "0" case MCE.Enabled => "1" From ea5754271eb771d75050ea3f4d4e4fc19943822e Mon Sep 17 00:00:00 2001 From: ArquintL <3762537+ArquintL@users.noreply.github.com> Date: Thu, 15 Feb 2024 17:06:59 +0000 Subject: [PATCH 223/296] Updates submodules --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index b7f581a5e..fdb01a12f 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit b7f581a5e74899be27d12359375e7a194d8c89ab +Subproject commit fdb01a12f270855f12bd0d0ff6f38ed763849024 From c5885a63bae6119ebd4cea8ef7d58280b339f3c8 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 15 Feb 2024 18:10:01 +0100 Subject: [PATCH 224/296] updates ViperServer to 24.01-RC1 --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index fdb01a12f..f59e00c39 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit fdb01a12f270855f12bd0d0ff6f38ed763849024 +Subproject commit f59e00c39c17a4d91c9bc1d6055a24b0814fdb1a From b2e675d3d9be8cfc8e6bdcb04eb3cfb38904308a Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 15 Feb 2024 18:23:37 +0100 Subject: [PATCH 225/296] adapts to latest Silver changes --- .../translator/encodings/typeless/TerminationEncoding.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/TerminationEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/TerminationEncoding.scala index 9254170b7..7c95a1442 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/TerminationEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/TerminationEncoding.scala @@ -44,6 +44,6 @@ class TerminationEncoding extends Encoding { for { v <- ctx.assertion(in.Access(in.Accessible.Predicate(x), in.FullPerm(x.info))(x.info)) pap = v.asInstanceOf[vpr.PredicateAccessPredicate] - } yield predicateinstance.PredicateInstance(pap.loc.args, pap.loc.predicateName)(pos, info, errT) + } yield predicateinstance.PredicateInstance(pap.loc.predicateName, pap.loc.args)(pos, info, errT) } } From 4eefd5cc58cbfe652775621ce5374cc13670407c Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 16 Feb 2024 09:36:28 +0100 Subject: [PATCH 226/296] adapts to SilFrontend API changes --- .../translator/transformers/TerminationTransformer.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala index c140dd988..3c57baefc 100644 --- a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala +++ b/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala @@ -8,6 +8,7 @@ package viper.gobra.translator.transformers import java.nio.file.Path import viper.gobra.backend.BackendVerifier import viper.silicon.Silicon +import viper.silver.ast.utility.FileLoader import viper.silver.{ast => vpr} import viper.silver.frontend.{DefaultStates, ViperAstProvider} import viper.silver.plugin.SilverPlugin @@ -134,8 +135,8 @@ class TerminationTransformer extends ViperTransformer { resetMessages() } - override def execute(args: Seq[String] = Seq()): Unit = { - super.execute(args ++ Seq("--ignoreFile", Silicon.dummyInputFilename)) + override def execute(args: Seq[String] = Seq(), loader: Option[FileLoader] = None): Unit = { + super.execute(args ++ Seq("--ignoreFile", Silicon.dummyInputFilename), loader) } } } From ad7449efe040c315ea1dd80dba89ed108f69948b Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 16 Feb 2024 09:36:54 +0100 Subject: [PATCH 227/296] fixes a warning --- src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index 76f58d794..9ea862d50 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -15,7 +15,6 @@ import viper.silver.ast.{Position => GobraPosition} import scala.collection.mutable import scala.collection.mutable.ListBuffer -import viper.gobra.util.Violation.violation trait PrettyPrinter { def format(node : Node): String From a205f7b5a8422696a792b7f1504f1eb33668905a Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Mon, 19 Feb 2024 23:55:37 +0100 Subject: [PATCH 228/296] Updates submodules (#728) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index f59e00c39..79fa60b13 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit f59e00c39c17a4d91c9bc1d6055a24b0814fdb1a +Subproject commit 79fa60b1360fb2fc0f3dd1458da34f355fe8cb5a From cccff562dc5e411ee40f44c9350fc33c10585647 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 20 Feb 2024 08:39:23 +0100 Subject: [PATCH 229/296] updates ViperServer to 'v.24.01-release' --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index f59e00c39..1a1fcff2e 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit f59e00c39c17a4d91c9bc1d6055a24b0814fdb1a +Subproject commit 1a1fcff2ecda88b3c6ea9875583f3abcd790dcaf From 7c271a0fd563003499641de150cdf6d167a76603 Mon Sep 17 00:00:00 2001 From: Felix Wolf <60103963+Felalolf@users.noreply.github.com> Date: Fri, 23 Feb 2024 22:45:33 +0100 Subject: [PATCH 230/296] Fix #713 (#732) --- .../encodings/closures/ClosureSpecsEncoder.scala | 3 ++- src/test/resources/regressions/issues/000713.gobra | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/regressions/issues/000713.gobra diff --git a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala index 3b12c07bc..1719ca9c2 100644 --- a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala +++ b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala @@ -208,7 +208,8 @@ protected class ClosureSpecsEncoder { val result = in.Parameter.Out(Names.closureArg, genericFuncType)(info) val satisfiesSpec = in.ExprAssertion(in.ClosureImplements(result, in.ClosureSpec(func, Map.empty)(info))(info))(info) val (args, captAssertions) = capturedArgsAndAssertions(ctx)(result, captured(ctx)(func), info) - val getter = in.PureFunction(proxy, args, Vector(result), Vector.empty, Vector(satisfiesSpec) ++ captAssertions, Vector.empty, None, false)(memberOrLit(ctx)(func).info) + val notNil = in.ExprAssertion(in.UneqCmp(result, in.NilLit(genericFuncType)(info))(info))(info) + val getter = in.PureFunction(proxy, args, Vector(result), Vector.empty, Vector(satisfiesSpec) ++ captAssertions :+ notNil, Vector.empty, None, false)(memberOrLit(ctx)(func).info) ctx.defaultEncoding.pureFunction(getter)(ctx) } diff --git a/src/test/resources/regressions/issues/000713.gobra b/src/test/resources/regressions/issues/000713.gobra new file mode 100644 index 000000000..601f9dc1c --- /dev/null +++ b/src/test/resources/regressions/issues/000713.gobra @@ -0,0 +1,9 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package issue000713 + +func foo() { + f := func g() {} + assert f != nil +} \ No newline at end of file From 41adcb45a28c455b700ebfad68a08a3358d7f8a5 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Mon, 26 Feb 2024 13:21:18 +0100 Subject: [PATCH 231/296] Updates submodules (#733) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 79fa60b13..df3420336 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 79fa60b1360fb2fc0f3dd1458da34f355fe8cb5a +Subproject commit df3420336316b49f56de02743e843a7e73946fcd From d6b136336266dec07da716dc99a5859301b79885 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Wed, 28 Feb 2024 11:38:22 +0100 Subject: [PATCH 232/296] Updates submodules (#736) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index df3420336..f9c11eb11 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit df3420336316b49f56de02743e843a7e73946fcd +Subproject commit f9c11eb111389e4f7a45a41ffc53a14d5549da4b From c86fb0186e78f36dc32bb3339f6534bc07405844 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 29 Feb 2024 22:27:33 +0100 Subject: [PATCH 233/296] Updates submodules (#737) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index f9c11eb11..0c7aee077 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit f9c11eb111389e4f7a45a41ffc53a14d5549da4b +Subproject commit 0c7aee0774190e0bfb95d04d60aa3388ab004c19 From d8770ec76ea23ca9b2cdba5171a0e8f9764d3307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 4 Mar 2024 11:20:52 +0100 Subject: [PATCH 234/296] add support for the wildcard mult (#739) --- .../viper/gobra/backend/ViperBackends.scala | 16 +++- .../scala/viper/gobra/frontend/Config.scala | 90 ++++++++++++------- 2 files changed, 70 insertions(+), 36 deletions(-) diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index 4a3fad8a6..f1e76897f 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -33,10 +33,13 @@ object ViperBackends { options ++= Vector("--conditionalizePermissions") } if (config.z3APIMode) { - options = options ++ Vector(s"--prover=${Z3ProverAPI.name}") + options ++= Vector(s"--prover=${Z3ProverAPI.name}") } if (config.disableNL) { - options = options ++ Vector(s"--disableNL") + options ++= Vector(s"--disableNL") + } + if (config.unsafeWildcardOptimization) { + options ++= Vector(s"--unsafeWildcardOptimization") } val mceSiliconOpt = config.mceMode match { case MCE.Disabled => "0" @@ -134,6 +137,15 @@ object ViperBackends { // Gobra seems to be much slower with the new silicon axiomatization of collections. // For now, we stick to the old one. options ++= Vector("--useOldAxiomatization") + if (config.z3APIMode) { + options ++= Vector(s"--prover=${Z3ProverAPI.name}") + } + if (config.disableNL) { + options ++= Vector(s"--disableNL") + } + if (config.unsafeWildcardOptimization) { + options ++= Vector(s"--unsafeWildcardOptimization") + } val mceSiliconOpt = config.mceMode match { case MCE.Disabled => "0" case MCE.Enabled => "1" diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 2d503c0f9..d94c61ff7 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -29,52 +29,53 @@ object LoggerDefaults { } object ConfigDefaults { - lazy val DefaultModuleName: String = "" + val DefaultModuleName: String = "" lazy val DefaultProjectRoot: File = new File("").getAbsoluteFile // current working directory - lazy val DefaultIncludePackages: List[String] = List.empty - lazy val DefaultExcludePackages: List[String] = List.empty - lazy val DefaultIncludeDirs: List[File] = List.empty + val DefaultIncludePackages: List[String] = List.empty + val DefaultExcludePackages: List[String] = List.empty + val DefaultIncludeDirs: List[File] = List.empty lazy val DefaultReporter: GobraReporter = StdIOReporter() - lazy val DefaultBackend: ViperBackend = ViperBackends.SiliconBackend - lazy val DefaultIsolate: List[(Path, List[Int])] = List.empty - lazy val DefaultChoppingUpperBound: Int = 1 - lazy val DefaultPackageTimeout: Duration = Duration.Inf - lazy val DefaultZ3Exe: Option[String] = None - lazy val DefaultBoogieExe: Option[String] = None - lazy val DefaultLogLevel: Level = LoggerDefaults.DefaultLevel - lazy val DefaultCacheFile: Option[File] = None - lazy val DefaultParseOnly: Boolean = false - lazy val DefaultStopAfterEncoding: Boolean = false - lazy val DefaultCheckOverflows: Boolean = false - lazy val DefaultCheckConsistency: Boolean = false - lazy val DefaultShouldChop: Boolean = false + val DefaultBackend: ViperBackend = ViperBackends.SiliconBackend + val DefaultIsolate: List[(Path, List[Int])] = List.empty + val DefaultChoppingUpperBound: Int = 1 + val DefaultPackageTimeout: Duration = Duration.Inf + val DefaultZ3Exe: Option[String] = None + val DefaultBoogieExe: Option[String] = None + val DefaultLogLevel: Level = LoggerDefaults.DefaultLevel + val DefaultCacheFile: Option[File] = None + val DefaultParseOnly: Boolean = false + val DefaultStopAfterEncoding: Boolean = false + val DefaultCheckOverflows: Boolean = false + val DefaultCheckConsistency: Boolean = false + val DefaultShouldChop: Boolean = false // The go language specification states that int and uint variables can have either 32bit or 64, as long // as they have the same size. This flag allows users to pick the size of int's and uints's: 32 if true, // 64 bit otherwise. - lazy val DefaultInt32bit: Boolean = false + val DefaultInt32bit: Boolean = false // the following option is currently not controllable via CLI as it is meaningless without a constantly // running JVM. It is targeted in particular to Gobra Server and Gobra IDE - lazy val DefaultCacheParserAndTypeChecker: Boolean = false + val DefaultCacheParserAndTypeChecker: Boolean = false // this option introduces a mode where Gobra only considers files with a specific annotation ("// +gobra"). // this is useful when verifying large packages where some files might use some unsupported feature of Gobra, // or when the goal is to gradually verify part of a package without having to provide an explicit list of the files // to verify. - lazy val DefaultOnlyFilesWithHeader: Boolean = false + val DefaultOnlyFilesWithHeader: Boolean = false lazy val DefaultGobraDirectory: Path = Path.of(".gobra") - lazy val DefaultTaskName: String = "gobra-task" - lazy val DefaultAssumeInjectivityOnInhale: Boolean = true - lazy val DefaultParallelizeBranches: Boolean = false - lazy val DefaultConditionalizePermissions: Boolean = false - lazy val DefaultZ3APIMode: Boolean = false - lazy val DefaultDisableNL: Boolean = false - lazy val DefaultMCEMode: MCE.Mode = MCE.Enabled - lazy val DefaultEnableLazyImports: Boolean = false - lazy val DefaultNoVerify: Boolean = false - lazy val DefaultNoStreamErrors: Boolean = false - lazy val DefaultParseAndTypeCheckMode: TaskManagerMode = TaskManagerMode.Parallel - lazy val DefaultRequireTriggers: Boolean = false - lazy val DefaultDisableSetAxiomatization: Boolean = false - lazy val DefaultDisableCheckTerminationPureFns: Boolean = false + val DefaultTaskName: String = "gobra-task" + val DefaultAssumeInjectivityOnInhale: Boolean = true + val DefaultParallelizeBranches: Boolean = false + val DefaultConditionalizePermissions: Boolean = false + val DefaultZ3APIMode: Boolean = false + val DefaultDisableNL: Boolean = false + val DefaultMCEMode: MCE.Mode = MCE.Enabled + val DefaultEnableLazyImports: Boolean = false + val DefaultNoVerify: Boolean = false + val DefaultNoStreamErrors: Boolean = false + val DefaultParseAndTypeCheckMode: TaskManagerMode = TaskManagerMode.Parallel + val DefaultRequireTriggers: Boolean = false + val DefaultDisableSetAxiomatization: Boolean = false + val DefaultDisableCheckTerminationPureFns: Boolean = false + val DefaultUnsafeWildcardOptimization: Boolean = false } // More-complete exhale modes @@ -143,6 +144,8 @@ case class Config( requireTriggers: Boolean = ConfigDefaults.DefaultRequireTriggers, disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization, disableCheckTerminationPureFns: Boolean = ConfigDefaults.DefaultDisableCheckTerminationPureFns, + unsafeWildcardOptimization: Boolean = ConfigDefaults.DefaultUnsafeWildcardOptimization, + ) { def merge(other: Config): Config = { @@ -195,6 +198,7 @@ case class Config( requireTriggers = requireTriggers || other.requireTriggers, disableSetAxiomatization = disableSetAxiomatization || other.disableSetAxiomatization, disableCheckTerminationPureFns = disableCheckTerminationPureFns || other.disableCheckTerminationPureFns, + unsafeWildcardOptimization = unsafeWildcardOptimization && other.unsafeWildcardOptimization, ) } @@ -251,6 +255,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector requireTriggers: Boolean = ConfigDefaults.DefaultRequireTriggers, disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization, disableCheckTerminationPureFns: Boolean = ConfigDefaults.DefaultDisableCheckTerminationPureFns, + unsafeWildcardOptimization: Boolean = ConfigDefaults.DefaultUnsafeWildcardOptimization, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -311,6 +316,7 @@ trait RawConfig { requireTriggers = baseConfig.requireTriggers, disableSetAxiomatization = baseConfig.disableSetAxiomatization, disableCheckTerminationPureFns = baseConfig.disableCheckTerminationPureFns, + unsafeWildcardOptimization = baseConfig.unsafeWildcardOptimization, ) } @@ -669,6 +675,12 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true, ) + val unsafeWildcardOptimization: ScallopOption[Boolean] = opt[Boolean]("unsafeWildcardOptimization", + descr = "Simplify wildcard terms in a way that might be unsafe. Only use this if you know what you are doing! See Silicon PR #756 for details.", + default = Some(false), + noshort = true + ) + val mceMode: ScallopOption[MCE.Mode] = { val on = "on" val off = "off" @@ -805,6 +817,15 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals Right(()) } } + + addValidation { + val unsafeWildcardOptSupplied = unsafeWildcardOptimization.isSupplied + if (unsafeWildcardOptSupplied && !isSiliconBasedBackend) { + Left("The flag --unsafeWildcardOptimization can only be used with Silicon or ViperServer with Silicon") + } else { + Right(()) + } + } // `disableSetAxiomatization` can only be provided when using a silicon-based backend // since, at the time of writing, we rely on Silicon's setAxiomatizationFile for the @@ -922,5 +943,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals requireTriggers = requireTriggers(), disableSetAxiomatization = disableSetAxiomatization(), disableCheckTerminationPureFns = disableCheckTerminationPureFns(), + unsafeWildcardOptimization = unsafeWildcardOptimization(), ) } From da25624a260e5dbe86035ab9df42154e59c55567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 4 Mar 2024 13:56:48 +0100 Subject: [PATCH 235/296] add projects (#738) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 2d7f4ce32..8c27d1f04 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,10 @@ are two workarounds: Note however that the debugger must be running/listening as otherwise the JVM will emit a connection refused error. +## Projects verified with Gobra +- [VerifiedSCION](https://github.com/viperproject/VerifiedSCION) +- [Verified implementations of Diffie-Hellman and WireGuard](https://github.com/viperproject/protocol-verification-refinement) + ## Licensing Most Gobra sources are licensed under the Mozilla Public License Version 2.0. The [LICENSE](./LICENSE) lists the exceptions to this rule. From 9288975856d8e6395823392b3e25b6a4646acfec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Tue, 12 Mar 2024 17:05:56 +0100 Subject: [PATCH 236/296] Fix issue 511 (#740) * add bug witness * add fix * feedback from Felix --- .../scala/viper/gobra/frontend/Desugar.scala | 49 ++++++++++++++++++- .../resources/regressions/issues/000511.gobra | 46 +++++++++++++++++ 2 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/regressions/issues/000511.gobra diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 0cca01882..2dafaa58e 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -2643,8 +2643,53 @@ object Desugar extends LazyLogging { for {l <- go(left); r <- go(right)} yield in.AtLeastCmp(l, r)(src) } - case PAnd(left, right) => for {l <- go(left); r <- go(right)} yield in.And(l, r)(src) - case POr(left, right) => for {l <- go(left); r <- go(right)} yield in.Or(l, r)(src) + case PAnd(left, right) => + val isPure = info.isPureExpression(expr) + if (isPure) { + // in this case, the generated expression will already be short-circuiting + for { l <- go(left); r <- go(right) } yield in.And(l, r)(src) + } else { + // here, we implement short-circuiting manually, as we need to be careful about + // when the side-effectful operations may run + for { + l <- go(left) + rightW = go(right) + res = freshExclusiveVar(in.BoolT(Addressability.Exclusive), expr, info)(src) + fstAssign = singleAss(in.Assignee.Var(res), l)(src) + sndAssign = singleAss(in.Assignee.Var(res), rightW.res)(src) + condStmt = in.If( + l, + in.Block(rightW.decls, rightW.stmts :+ sndAssign)(src), + in.Block(Vector.empty, Vector.empty)(src), + )(src) + _ <- declaredExclusiveVar(res) + _ <- write(fstAssign, condStmt) + } yield res + } + + case POr(left, right) => + val isPure = info.isPureExpression(expr) + if (isPure) { + // in this case, the generated expression will already be short-circuiting + for {l <- go(left); r <- go(right)} yield in.Or(l, r)(src) + } else { + // here, we implement short-circuiting manually, as we need to be careful about + // when the side-effectful operations may run + for { + l <- go(left) + rightW = go(right) + res = freshExclusiveVar(in.BoolT(Addressability.Exclusive), expr, info)(src) + fstAssign = singleAss(in.Assignee.Var(res), l)(src) + sndAssign = singleAss(in.Assignee.Var(res), rightW.res)(src) + condStmt = in.If( + l, + in.Block(Vector.empty, Vector.empty)(src), + in.Block(rightW.decls, rightW.stmts :+ sndAssign)(src), + )(src) + _ <- declaredExclusiveVar(res) + _ <- write(fstAssign, condStmt) + } yield res + } case PAdd(left, right) => for {l <- go(left); r <- go(right)} yield in.Add(l, r)(src) case PSub(left, right) => for {l <- go(left); r <- go(right)} yield in.Sub(l, r)(src) diff --git a/src/test/resources/regressions/issues/000511.gobra b/src/test/resources/regressions/issues/000511.gobra new file mode 100644 index 000000000..fee6442c0 --- /dev/null +++ b/src/test/resources/regressions/issues/000511.gobra @@ -0,0 +1,46 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package issues + +preserves acc(x) +ensures *x == old(*x) + 1 +ensures !res +func incF(x *int) (res bool) { + *x += 1 + return false +} + +func clientAnd1() { + x@ := 1 + if incF(&x) && incT(&x) { + assert false + } + assert x == 2 +} + +func clientAnd2() { + x@ := 1 + if incT(&x) && incT(&x) {} + assert x == 3 +} + +preserves acc(x) +ensures *x == old(*x) + 1 +ensures res +func incT(x *int) (res bool) { + *x += 1 + return true +} + +func clientOr1() { + x@ := 1 + if incT(&x) || incT(&x) {} + assert x == 2 +} + +func clientOr2() { + x@ := 1 + if incF(&x) || incT(&x) {} + assert x == 3 +} \ No newline at end of file From 229de2bf67c9c2bac1e2ecf56c2e0e760c146fc8 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 13 Mar 2024 10:17:34 +0100 Subject: [PATCH 237/296] adds additional Gobra projects --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c27d1f04..a7898f6d9 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,8 @@ are two workarounds: ## Projects verified with Gobra - [VerifiedSCION](https://github.com/viperproject/VerifiedSCION) -- [Verified implementations of Diffie-Hellman and WireGuard](https://github.com/viperproject/protocol-verification-refinement) +- [Security of protocol implementations via refinement w.r.t. a Tamarin model](https://github.com/viperproject/protocol-verification-refinement). In particular, implementations of the signed Diffie-Hellman and WireGuard protocols have been verified. +- [Security of protocol implementations relying only on Gobra](https://github.com/viperproject/SecurityProtocolImplementations). In particular, implementations of the Needham-Schroeder-Lowe, signed Diffie-Hellman, and WireGuard protocols have been verified. ## Licensing Most Gobra sources are licensed under the Mozilla Public License Version 2.0. From 5e60b4ece5392a8925d499b54c6551292bf66468 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 13 Mar 2024 11:10:04 +0100 Subject: [PATCH 238/296] implements CR suggestion by Felix Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a7898f6d9..e63cfd4c2 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ are two workarounds: ## Projects verified with Gobra - [VerifiedSCION](https://github.com/viperproject/VerifiedSCION) - [Security of protocol implementations via refinement w.r.t. a Tamarin model](https://github.com/viperproject/protocol-verification-refinement). In particular, implementations of the signed Diffie-Hellman and WireGuard protocols have been verified. -- [Security of protocol implementations relying only on Gobra](https://github.com/viperproject/SecurityProtocolImplementations). In particular, implementations of the Needham-Schroeder-Lowe, signed Diffie-Hellman, and WireGuard protocols have been verified. +- [Security of protocol implementations verified entirely within Gobra](https://github.com/viperproject/SecurityProtocolImplementations). In particular, implementations of the Needham-Schroeder-Lowe, signed Diffie-Hellman, and WireGuard protocols have been verified. ## Licensing Most Gobra sources are licensed under the Mozilla Public License Version 2.0. From 131f8f4d2be43c0dd53f0eabc10fd6df2c40671b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Fri, 15 Mar 2024 14:16:11 +0100 Subject: [PATCH 239/296] add --moreJoins (#742) --- .../viper/gobra/backend/ViperBackends.scala | 6 +++++ .../scala/viper/gobra/frontend/Config.scala | 22 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index f1e76897f..7d457ec9b 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -41,6 +41,9 @@ object ViperBackends { if (config.unsafeWildcardOptimization) { options ++= Vector(s"--unsafeWildcardOptimization") } + if (config.enableMoreJoins) { + options ++= Vector(s"--moreJoins") + } val mceSiliconOpt = config.mceMode match { case MCE.Disabled => "0" case MCE.Enabled => "1" @@ -146,6 +149,9 @@ object ViperBackends { if (config.unsafeWildcardOptimization) { options ++= Vector(s"--unsafeWildcardOptimization") } + if (config.enableMoreJoins) { + options ++= Vector(s"--moreJoins") + } val mceSiliconOpt = config.mceMode match { case MCE.Disabled => "0" case MCE.Enabled => "1" diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index d94c61ff7..95d12bdc2 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -76,6 +76,7 @@ object ConfigDefaults { val DefaultDisableSetAxiomatization: Boolean = false val DefaultDisableCheckTerminationPureFns: Boolean = false val DefaultUnsafeWildcardOptimization: Boolean = false + val DefaultEnableMoreJoins: Boolean = false } // More-complete exhale modes @@ -145,6 +146,7 @@ case class Config( disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization, disableCheckTerminationPureFns: Boolean = ConfigDefaults.DefaultDisableCheckTerminationPureFns, unsafeWildcardOptimization: Boolean = ConfigDefaults.DefaultUnsafeWildcardOptimization, + enableMoreJoins: Boolean = ConfigDefaults.DefaultEnableMoreJoins, ) { @@ -199,6 +201,7 @@ case class Config( disableSetAxiomatization = disableSetAxiomatization || other.disableSetAxiomatization, disableCheckTerminationPureFns = disableCheckTerminationPureFns || other.disableCheckTerminationPureFns, unsafeWildcardOptimization = unsafeWildcardOptimization && other.unsafeWildcardOptimization, + enableMoreJoins = enableMoreJoins || other.enableMoreJoins, ) } @@ -256,6 +259,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization, disableCheckTerminationPureFns: Boolean = ConfigDefaults.DefaultDisableCheckTerminationPureFns, unsafeWildcardOptimization: Boolean = ConfigDefaults.DefaultUnsafeWildcardOptimization, + enableMoreJoins: Boolean = ConfigDefaults.DefaultEnableMoreJoins, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -317,6 +321,7 @@ trait RawConfig { disableSetAxiomatization = baseConfig.disableSetAxiomatization, disableCheckTerminationPureFns = baseConfig.disableCheckTerminationPureFns, unsafeWildcardOptimization = baseConfig.unsafeWildcardOptimization, + enableMoreJoins = baseConfig.enableMoreJoins, ) } @@ -681,6 +686,13 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true ) + val enableMoreJoins: ScallopOption[Boolean] = opt[Boolean]( + name = "moreJoins", + descr = "Enable more joins using a more complete implementation of state merging.", + default = Some(false), + noshort = true + ) + val mceMode: ScallopOption[MCE.Mode] = { val on = "on" val off = "off" @@ -826,6 +838,15 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals Right(()) } } + + addValidation { + val enableMoreJoinsOptSupplied = enableMoreJoins.isSupplied + if (enableMoreJoinsOptSupplied && !isSiliconBasedBackend) { + Left("The flag --moreJoins can only be used with Silicon or ViperServer with Silicon") + } else { + Right(()) + } + } // `disableSetAxiomatization` can only be provided when using a silicon-based backend // since, at the time of writing, we rely on Silicon's setAxiomatizationFile for the @@ -944,5 +965,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals disableSetAxiomatization = disableSetAxiomatization(), disableCheckTerminationPureFns = disableCheckTerminationPureFns(), unsafeWildcardOptimization = unsafeWildcardOptimization(), + enableMoreJoins = enableMoreJoins(), ) } From 072c62a2a985fd7eb2e5865de7456da560bb6262 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Fri, 15 Mar 2024 17:33:20 +0100 Subject: [PATCH 240/296] Update Submodules (#743) * Updates submodules * changes to fit with new version of chopper * removed entry from penalty config that will is going to be necessary for the next submodule update --------- Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> Co-authored-by: Felix A. Wolf --- .../viper/gobra/reporting/StatsCollector.scala | 17 ++++++++++------- .../scala/viper/gobra/util/ChopperUtil.scala | 10 +++++----- viperserver | 2 +- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/scala/viper/gobra/reporting/StatsCollector.scala b/src/main/scala/viper/gobra/reporting/StatsCollector.scala index 611689580..ffc915ba8 100644 --- a/src/main/scala/viper/gobra/reporting/StatsCollector.scala +++ b/src/main/scala/viper/gobra/reporting/StatsCollector.scala @@ -14,7 +14,8 @@ import viper.gobra.frontend.Config import viper.gobra.frontend.info.{Info, TypeInfo} import viper.gobra.util.Violation import viper.silver.ast.{Function, Member, Method, Predicate} -import viper.silver.ast.utility.Chopper.{Edges, Vertex} +import viper.silver.ast.utility.chopper.{Edges, Vertices} +import viper.silver.ast.utility.chopper.Vertices.Vertex import viper.silver.reporter.Time import scala.collection.concurrent.{Map, TrieMap} @@ -162,7 +163,7 @@ case class StatsCollector(reporter: GobraReporter) extends GobraReporter { taskName, time, ViperNodeType.withName(viperMember.getClass.getSimpleName), - Edges.dependencies(viperMember).flatMap(edge => vertexToName(edge._2)).toSet, + EdgesImpl.dependencies(viperMember).flatMap(edge => vertexToName(edge._2)).toSet, success, cached, memberInfo.isImported, @@ -193,6 +194,8 @@ case class StatsCollector(reporter: GobraReporter) extends GobraReporter { reporter.report(msg) } + private object EdgesImpl extends Edges with Vertices + private def gobraMemberKey(pkgId: String,memberName: String, args: String): String = pkgId + "." + memberName + args private def viperMemberKey(taskName: String, viperMemberName: String): String = taskName + "-" + viperMemberName @@ -241,11 +244,11 @@ case class StatsCollector(reporter: GobraReporter) extends GobraReporter { * for the statistics */ private def vertexToName(vertex: Vertex): Option[String] = vertex match { - case Vertex.Method(name) => Some(name) - case Vertex.MethodSpec(name) => Some(name) - case Vertex.Function(name) => Some(name) - case Vertex.PredicateBody(name) => Some(name) - case Vertex.PredicateSig(name) => Some(name) + case Vertices.Method(name) => Some(name) + case Vertices.MethodSpec(name) => Some(name) + case Vertices.Function(name) => Some(name) + case Vertices.PredicateBody(name) => Some(name) + case Vertices.PredicateSig(name) => Some(name) case _ => None } diff --git a/src/main/scala/viper/gobra/util/ChopperUtil.scala b/src/main/scala/viper/gobra/util/ChopperUtil.scala index 0489716ac..d69291bf9 100644 --- a/src/main/scala/viper/gobra/util/ChopperUtil.scala +++ b/src/main/scala/viper/gobra/util/ChopperUtil.scala @@ -12,7 +12,7 @@ import java.nio.file.Files import java.util.Properties import viper.silver.{ast => vpr} import viper.silver.ast.SourcePosition -import viper.silver.ast.utility.Chopper +import viper.silver.ast.utility.chopper import viper.gobra.frontend.{Config, PackageInfo} import viper.gobra.reporting.ChoppedViperMessage import viper.gobra.backend.BackendVerifier.Task @@ -25,7 +25,7 @@ object ChopperUtil { def computeChoppedPrograms(task: Task, pkgInfo: PackageInfo)(config: Config): Vector[vpr.Program] = { - val programs = Chopper.chop(task.program)( + val programs = chopper.Chopper.chop(task.program)( selection = computeIsolateMap(config, pkgInfo), bound = Some(config.choppingUpperBound), penalty = getPenalty @@ -71,9 +71,9 @@ object ChopperUtil { * then a penalty object using this configuration is created and returned. * Otherwise, if no configuration is present, the default configuration is returned. * */ - def getPenalty: Chopper.Penalty[Chopper.Vertex] = { + def getPenalty: chopper.Penalty[chopper.Vertices.Vertex] = { import scala.io.Source - import viper.silver.ast.utility.Chopper.Penalty + import viper.silver.ast.utility.chopper.Penalty val file = new File(GobraChopperFileLocation) if (!file.exists()) { @@ -90,7 +90,7 @@ object ChopperUtil { val penaltyConf = Penalty.PenaltyConfig( method = get("method_body", dfltConf.method), methodSpec = get("method_spec", dfltConf.methodSpec), - function = get("function", dfltConf.function), + function = get("function_body", dfltConf.function), predicate = get("predicate_body", dfltConf.predicate), predicateSig = get("predicate_spec", dfltConf.predicateSig), field = get("field", dfltConf.field), diff --git a/viperserver b/viperserver index 0c7aee077..cadcb1c5a 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 0c7aee0774190e0bfb95d04d60aa3388ab004c19 +Subproject commit cadcb1c5aa887ace1d4b0afb6586afdeca6c0da1 From c5457c87d7fb8c23ef1d149b5ceeab28608d2ad7 Mon Sep 17 00:00:00 2001 From: Felix Wolf <60103963+Felalolf@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:22:23 +0100 Subject: [PATCH 241/296] Fix #734 (#735) * Fix #734 * adapted printer tests --- .../gobra/ast/internal/PrettyPrinter.scala | 2 +- .../ast/InternalPrettyPrinterUnitTests.scala | 158 ++++-------------- 2 files changed, 36 insertions(+), 124 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index 9ea862d50..9d9721c35 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -580,7 +580,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case StructUpdate(base, field, newVal) => showExpr(base) <> brackets(showField(field) <+> ":=" <+> showExpr(newVal)) case Negation(op) => "!" <> showExpr(op) case BitNeg(op) => "^" <> showExpr(op) - case BinaryExpr(left, op, right, _) => showExpr(left) <+> op <+> showExpr(right) + case BinaryExpr(left, op, right, _) => parens(showExpr(left) <+> op <+> showExpr(right)) case lit: Lit => showLit(lit) case v: Var => showVar(v) }) diff --git a/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala b/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala index 926b112c9..1bd7bb920 100644 --- a/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala +++ b/src/test/scala/viper/gobra/ast/InternalPrettyPrinterUnitTests.scala @@ -216,7 +216,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "s union t" => + case "(s union t)" => } } @@ -232,7 +232,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "s union t union u" => + case "((s union t) union u)" => } } @@ -248,7 +248,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "s union t union u" => + case "(s union (t union u))" => } } @@ -265,7 +265,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set[bool°] { s } union set[bool°] { t, u }" => + case "(set[bool°] { s } union set[bool°] { t, u })" => } } @@ -277,7 +277,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "s intersection t" => + case "(s intersection t)" => } } @@ -293,7 +293,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "s intersection t intersection u" => + case "((s intersection t) intersection u)" => } } @@ -309,7 +309,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "s intersection t intersection u" => + case "(s intersection (t intersection u))" => } } @@ -326,7 +326,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set[bool°] { s } intersection set[bool°] { t, u }" => + case "(set[bool°] { s } intersection set[bool°] { t, u })" => } } @@ -338,7 +338,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "s setminus t" => + case "(s setminus t)" => } } @@ -354,7 +354,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "s setminus t setminus u" => + case "((s setminus t) setminus u)" => } } @@ -370,7 +370,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "s setminus t setminus u" => + case "(s setminus (t setminus u))" => } } @@ -387,7 +387,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set[bool°] { s } setminus set[bool°] { t, u }" => + case "(set[bool°] { s } setminus set[bool°] { t, u })" => } } @@ -398,7 +398,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "s subset t" => + case "(s subset t)" => } } @@ -412,7 +412,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "s subset t subset u" => + case "((s subset t) subset u)" => } } @@ -423,7 +423,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set[int°] { 42 } subset set[bool°] { }" => + case "(set[int°] { 42 } subset set[bool°] { })" => } } @@ -434,7 +434,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "x in xs" => + case "(x in xs)" => } } @@ -448,32 +448,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "x in xs in ys" => - } - } - - test("Printer: should correctly show a simple set membership expression") { - val expr = Contains( - LocalVar("x", sequenceT(boolT))(Internal), - LocalVar("s", sequenceT(boolT))(Internal) - )(Internal) - - frontend.show(expr) should matchPattern { - case "x in s" => - } - } - - test("Printer: should correctly show a small 'chain' of set membership expressions") { - val expr = Contains( - Contains( - LocalVar("x", boolT)(Internal), - LocalVar("s", setT(boolT))(Internal) - )(Internal), - LocalVar("t", setT(boolT))(Internal), - )(Internal) - - frontend.show(expr) should matchPattern { - case "x in s in t" => + case "((x in xs) in ys)" => } } @@ -487,7 +462,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set[bool°] { true, false } in set[set[set[int°]°]°] { }" => + case "(set[bool°] { true, false } in set[set[set[int°]°]°] { })" => } } @@ -511,7 +486,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "len(s intersection t)" => + case "len((s intersection t))" => } } @@ -608,7 +583,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "mset[int°] { 1, 2 } union mset[int°] { 3 }" => + case "(mset[int°] { 1, 2 } union mset[int°] { 3 })" => } } @@ -620,7 +595,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "mset[int°] { 1, 2 } intersection mset[int°] { 3 }" => + case "(mset[int°] { 1, 2 } intersection mset[int°] { 3 })" => } } @@ -631,7 +606,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "mset[int°] { 1, 2 } subset mset[int°] { 3 }" => + case "(mset[int°] { 1, 2 } subset mset[int°] { 3 })" => } } @@ -664,23 +639,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "2 in mset[int°] { 1, 2, 3 }" => - } - } - - test("Printer: should correctly show a multiset inclusion expression (2)") { - val expr = Contains( - MultisetLit(intT, Vector( - IntLit(1)(Internal) - ))(Internal), - MultisetLit(intT, Vector( - IntLit(2)(Internal), - IntLit(3)(Internal), - ))(Internal) - )(Internal) - - frontend.show(expr) should matchPattern { - case "mset[int°] { 1 } in mset[int°] { 2, 3 }" => + case "(2 in mset[int°] { 1, 2, 3 })" => } } @@ -717,7 +676,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set(xs ++ ys)" => + case "set((xs ++ ys))" => } } @@ -729,7 +688,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "set(xs) union set(ys)" => + case "(set(xs) union set(ys))" => } } @@ -740,7 +699,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "x # xs" => + case "(x # xs)" => } } @@ -755,7 +714,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "40 + 2 # seq[int°] { 0:1, 1:2, 2:3 }" => + case "((40 + 2) # seq[int°] { 0:1, 1:2, 2:3 })" => } } @@ -769,7 +728,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "x # xs # ys" => + case "((x # xs) # ys)" => } } @@ -793,7 +752,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "mset(xs ++ ys)" => + case "mset((xs ++ ys))" => } } @@ -805,7 +764,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "mset(xs) union mset(ys)" => + case "(mset(xs) union mset(ys))" => } } @@ -863,27 +822,6 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi } } - test("Printer: should correctly show a slightly more complex array length expression") { - val expr = Length( - Add( - Length(LocalVar("s", setT(boolT))(Internal))(Internal), - IntLit(42)(Internal) - )(Internal) - )(Internal) - - frontend.show(expr) should matchPattern { - case "len(len(s) + 42)" => - } - } - - test("Printer: should correctly show a nested array length expression") { - val expr = Length(Length(IntLit(42)(Internal))(Internal))(Internal) - - frontend.show(expr) should matchPattern { - case "len(len(42))" => - } - } - test("Printer: should be able to show the addition of two uses of the array length function") { val expr = Add( Length(LocalVar("a", exclusiveArrayT(24, boolT))(Internal))(Internal), @@ -891,7 +829,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "len(a) + len(b)" => + case "(len(a) + len(b))" => } } @@ -915,7 +853,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "len(seq[bool°] { 0:false } ++ xs)" => + case "len((seq[bool°] { 0:false } ++ xs))" => } } @@ -929,17 +867,6 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi } } - test("Printer: should correctly show a composition of two sequence length function applications") { - val expr = Add( - Length(LocalVar("xs", sequenceT(intT))(Internal))(Internal), - Length(LocalVar("ys", sequenceT(intT))(Internal))(Internal) - )(Internal) - - frontend.show(expr) should matchPattern { - case "len(xs) + len(ys)" => - } - } - test("Printer: should correctly show a simple array indexing expression") { val expr = IndexedExp( LocalVar("a", exclusiveArrayT(124, intT))(Internal), @@ -964,7 +891,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "a[x + 2]" => + case "a[(x + 2)]" => } } @@ -1004,21 +931,6 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi } } - test("Printer: should correctly show a simple assignee indexed expression") { - val typ = sharedArrayT(12, sharedArrayT(24, BoolT(Addressability.Shared))) - val expr = Assignee.Index( - IndexedExp( - LocalVar("a", typ)(Internal), - Add(IntLit(2)(Internal), IntLit(3)(Internal))(Internal), - typ - )(Internal) - ) - - frontend.show(expr) should matchPattern { - case "a[2 + 3]" => - } - } - test("Printer: should correctly show a simple integer array literal") { val expr = ArrayLit(3, intT, Map( BigInt(0) -> IntLit(12)(Internal), @@ -1127,7 +1039,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi )(Internal) frontend.show(expr) should matchPattern { - case "seq(xs) ++ seq(a)" => + case "(seq(xs) ++ seq(a))" => } } @@ -1161,7 +1073,7 @@ class InternalPrettyPrinterUnitTests extends AnyFunSuite with Matchers with Insi val exp = OptionSome(And(BoolLit(true)(Internal), BoolLit(false)(Internal))(Internal))(Internal) frontend.show(exp) should matchPattern { - case "some(true && false)" => + case "some((true && false))" => } } From cc786c5c6606df2065d9907045db48797cfd706c Mon Sep 17 00:00:00 2001 From: Felix Wolf <60103963+Felalolf@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:35:15 +0100 Subject: [PATCH 242/296] Fixes #745 (#746) --- .../DefaultErrorBackTranslator.scala | 5 +-- .../scala/viper/gobra/reporting/Source.scala | 10 ++++++ .../viper/gobra/reporting/VerifierError.scala | 5 +++ .../encodings/arrays/ArrayEncoding.scala | 8 +++-- .../encodings/combinators/TypeEncoding.scala | 4 +-- .../gobra/translator/util/ViperWriter.scala | 10 ++++++ .../resources/regressions/issues/000745.gobra | 32 +++++++++++++++++++ 7 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/regressions/issues/000745.gobra diff --git a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala index 2cc79ddc3..96da68382 100644 --- a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala +++ b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala @@ -6,8 +6,7 @@ package viper.gobra.reporting -import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, MainPreNotEstablished, OverflowCheckAnnotation, ReceiverNotNilCheckAnnotation, InsufficientPermissionToRangeExpressionAnnotation, LoopInvariantNotEstablishedAnnotation} - +import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, InsufficientPermissionToRangeExpressionAnnotation, LoopInvariantNotEstablishedAnnotation, MainPreNotEstablished, OverflowCheckAnnotation, OverwriteErrorAnnotation, ReceiverNotNilCheckAnnotation} import viper.gobra.reporting.Source.Verifier./ import viper.silver import viper.silver.ast.Not @@ -163,6 +162,8 @@ class DefaultErrorBackTranslator( } val transformAnnotatedError: VerificationError => VerificationError = x => x.info match { + case _ / (an: OverwriteErrorAnnotation) => an(x) + case _ / OverflowCheckAnnotation => x.reasons.foldLeft(OverflowError(x.info): VerificationError){ case (err, reason) => err dueTo reason } diff --git a/src/main/scala/viper/gobra/reporting/Source.scala b/src/main/scala/viper/gobra/reporting/Source.scala index 6204aa50d..5c1a2bbc3 100644 --- a/src/main/scala/viper/gobra/reporting/Source.scala +++ b/src/main/scala/viper/gobra/reporting/Source.scala @@ -33,6 +33,16 @@ object Source { case class NoPermissionToRangeExpressionAnnotation() extends Annotation case class InsufficientPermissionToRangeExpressionAnnotation() extends Annotation case class AutoImplProofAnnotation(subT: String, superT: String) extends Annotation + class OverwriteErrorAnnotation( + newError: VerificationError => VerificationError, + attachReasons: Boolean = true + ) extends Annotation { + def apply(err: VerificationError): VerificationError = { + if (attachReasons) { + err.reasons.foldLeft(newError(err)){ case (err, reason) => err dueTo reason } + } else newError(err) + } + } object Parser { diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala index dc997bd12..067334e5e 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierError.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala @@ -161,6 +161,11 @@ case class CallError(info: Source.Verifier.Info) extends VerificationError { override def localMessage: String = "Call might fail" } +case class LoadError(info: Source.Verifier.Info) extends VerificationError { + override def localId: String = "load_error" + override def localMessage: String = "Reading might fail" +} + case class PostconditionError(info: Source.Verifier.Info) extends VerificationError { override def localId: String = "postcondition_error" override def localMessage: String = "Postcondition might not hold" diff --git a/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala index 3ad28b2a8..551450ec2 100644 --- a/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala @@ -8,7 +8,7 @@ package viper.gobra.translator.encodings.arrays import org.bitbucket.inkytonik.kiama.==> import viper.gobra.ast.{internal => in} -import viper.gobra.reporting.Source +import viper.gobra.reporting.{LoadError, InsufficientPermissionError, Source} import viper.gobra.theory.Addressability import viper.gobra.theory.Addressability.{Exclusive, Shared} import viper.gobra.translator.Names @@ -230,7 +230,11 @@ class ArrayEncoding extends TypeEncoding with SharedArrayEmbedding { val (pos, info, errT) = loc.vprMeta for { arg <- ctx.reference(loc) - } yield conversionFunc(Vector(arg), cptParam(len, t)(ctx))(pos, info, errT)(ctx) + res <- funcAppPrecondition( + conversionFunc(Vector(arg), cptParam(len, t)(ctx))(pos, info, errT)(ctx), + { case (info, _) => LoadError(info) dueTo InsufficientPermissionError(info) } + ) + } yield res } /** diff --git a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala index 1421fdcc7..377b54000 100644 --- a/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/combinators/TypeEncoding.scala @@ -10,7 +10,7 @@ import org.bitbucket.inkytonik.kiama.==> import viper.gobra.ast.{internal => in} import viper.gobra.ast.internal.theory.Comparability import viper.gobra.reporting.BackTranslator.{ErrorTransformer, RichErrorMessage} -import viper.gobra.reporting.{DefaultErrorBackTranslator, LoopInvariantNotWellFormedError, MethodContractNotWellFormedError, NoPermissionToRangeExpressionError, Source} +import viper.gobra.reporting.{AssignmentError, DefaultErrorBackTranslator, LoopInvariantNotWellFormedError, MethodContractNotWellFormedError, NoPermissionToRangeExpressionError, Source} import viper.gobra.theory.Addressability.{Exclusive, Shared} import viper.gobra.translator.library.Generator import viper.gobra.translator.context.Context @@ -175,7 +175,7 @@ trait TypeEncoding extends Generator { for { footprint <- addressFootprint(ctx)(loc, in.FullPerm(loc.info)) eq <- ctx.equal(loc, rhs)(src) - _ <- write(vpr.Exhale(footprint)(pos, info, errT)) + _ <- exhaleWithDefaultReason(footprint, AssignmentError) inhale = vpr.Inhale(vpr.And(footprint, eq)(pos, info, errT))(pos, info, errT) } yield inhale ) diff --git a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala index 21ee86494..c5387b74b 100644 --- a/src/main/scala/viper/gobra/translator/util/ViperWriter.scala +++ b/src/main/scala/viper/gobra/translator/util/ViperWriter.scala @@ -408,6 +408,16 @@ object ViperWriter { } } + /* Can be used in expressions. */ + def funcAppPrecondition(call: vpr.FuncApp, reasonT: (Source.Verifier.Info, ErrorReason) => VerificationError): Writer[vpr.Exp] = { + for { + _ <- errorT({ + case e@vprerr.PreconditionInAppFalse(Source(info), reason, _) if e causedBy call => + reasonT(info, reason) + }) + } yield call + } + /* Emits Viper statements. */ def assert(cond: vpr.Exp, reasonT: (Source.Verifier.Info, ErrorReason) => VerificationError): Writer[Unit] = { val res = vpr.Assert(cond)(cond.pos, cond.info, cond.errT) diff --git a/src/test/resources/regressions/issues/000745.gobra b/src/test/resources/regressions/issues/000745.gobra new file mode 100644 index 000000000..92eab1ecc --- /dev/null +++ b/src/test/resources/regressions/issues/000745.gobra @@ -0,0 +1,32 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package issue000745 + +func assignment() int { + var x@, y [10]int + exhale acc(&x) + //:: ExpectedOutput(assignment_error:permission_error) + x = y +} + +func load0() int { + var x@, y int + exhale acc(&x) + //:: ExpectedOutput(assignment_error:permission_error) + y = x +} + +func load1() int { + var x@, y struct{ f,g int } + exhale acc(&x) + //:: ExpectedOutput(assignment_error:permission_error) + y = x +} + +func load2() int { + var x@, y [10]int + exhale acc(&x) + //:: ExpectedOutput(load_error:permission_error) + y = x +} \ No newline at end of file From 25a7f212a9c51042b48fb70776b56d609712fcaa Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 20 Mar 2024 16:34:51 +0100 Subject: [PATCH 243/296] disallows write to actual heap locations in ghost code --- .../property/Assignability.scala | 6 +++- .../ghost_pointer/ghost-write-fail01.gobra | 32 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-write-fail01.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index 1175fe801..f414d92fe 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala @@ -105,8 +105,12 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => case _ => errorProp() } - lazy val assignable: Property[PExpression] = createBinaryProperty("assignable") { + lazy val assignable: Property[PExpression] = createFlatProperty[PExpression]{ + case e if isEnclosingGhost(e) => s"got $e that is not assignable in ghost code" + case e => s"got $e that is not assignable" + } { case e if !isMutable(e) => false + case e: PDeref if isEnclosingGhost(e) => false // TODO allow derefs of ghost pointers case PIndexedExp(b, _) => underlyingType(exprType(b)) match { case _: ArrayT => assignable(b) case _: SliceT | _: GhostSliceT => assignable(b) diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-write-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-write-fail01.gobra new file mode 100644 index 000000000..590dd9623 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-write-fail01.gobra @@ -0,0 +1,32 @@ +package GhostWriteFail01 + +// x is a pointer to a location on the actual heap +// thus, writing in ghost code is forbidden as effects +// are observable (via aliasing). + +ghost +decreases +requires acc(x) +func ghostWriteFunc(x *int) { + //:: ExpectedOutput(type_error) + *x = 42 +} + +decreases +requires acc(x) +func actualWriteFunc(x *int) { + *x = 42 +} + +ghost +decreases +requires acc(x) +func ghostReadFunc(x *int) int { + return *x +} + +decreases +requires acc(x) +func actualReadFunc(x *int) int { + return *x +} From f9f5c4317635908dbd04826f69acd1fb3e1a3728 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 20 Mar 2024 18:16:58 +0100 Subject: [PATCH 244/296] adds ghost pointers --- src/main/antlr4/GobraLexer.g4 | 1 + src/main/antlr4/GobraParser.g4 | 4 +- .../java/viper/gobra/frontend/GobraLexer.java | 2265 ++++---- .../viper/gobra/frontend/GobraParser.java | 5071 +++++++++-------- .../frontend/GobraParserBaseVisitor.java | 9 +- .../gobra/frontend/GobraParserVisitor.java | 8 +- .../scala/viper/gobra/ast/frontend/Ast.scala | 3 + .../gobra/ast/frontend/PrettyPrinter.scala | 1 + .../scala/viper/gobra/frontend/Desugar.scala | 6 +- .../gobra/frontend/ParseTreeTranslator.scala | 11 + .../viper/gobra/frontend/info/base/Type.scala | 8 +- .../property/Assignability.scala | 9 +- .../property/Convertibility.scala | 6 +- .../property/TypeIdentity.scala | 3 +- .../implementation/property/TypeMerging.scala | 5 +- .../property/UnderlyingType.scala | 6 +- .../resolution/MemberResolution.scala | 18 +- .../implementation/typing/ExprTyping.scala | 16 +- .../implementation/typing/MiscTyping.scala | 8 +- .../implementation/typing/TypeTyping.scala | 5 +- .../typing/ghost/GhostTypeTyping.scala | 2 + .../ghost/separation/GhostWellDef.scala | 7 +- .../ghost_pointer/ghost-fields-fail01.gobra | 9 + .../ghost_pointer/ghost-read-fail01.gobra | 12 + .../ghost-reference-simple01.gobra | 22 + .../ghost_pointer/ghost-write-simple01.gobra | 33 + .../pointer-creation-fail01.gobra | 30 + .../pointer-creation-simple01.gobra | 21 + 28 files changed, 3927 insertions(+), 3672 deletions(-) create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-fields-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra create mode 100644 src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4 index 88e2f54db..548d70575 100644 --- a/src/main/antlr4/GobraLexer.g4 +++ b/src/main/antlr4/GobraLexer.g4 @@ -59,6 +59,7 @@ SET : 'set'-> mode(NLSEMI); MSET : 'mset'-> mode(NLSEMI); DICT : 'dict'-> mode(NLSEMI); OPT : 'option'-> mode(NLSEMI); +GPOINTER : 'gpointer'-> mode(NLSEMI); LEN : 'len'-> mode(NLSEMI); NEW : 'new'-> mode(NLSEMI); MAKE : 'make'-> mode(NLSEMI); diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 24254bd9e..a6d975072 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -142,7 +142,7 @@ seqUpdClause: expression ASSIGN expression; // Ghost Type Literals -ghostTypeLit: sqType | ghostSliceType | domainType | adtType; +ghostTypeLit: sqType | ghostSliceType | ghostPointerType | domainType | adtType; domainType: DOM L_CURLY (domainClause eos)* R_CURLY; @@ -156,6 +156,8 @@ adtFieldDecl: identifierList? type_; ghostSliceType: GHOST L_BRACKET R_BRACKET elementType; +ghostPointerType: GPOINTER L_BRACKET elementType R_BRACKET; + sqType: (kind=(SEQ | SET | MSET | OPT) L_BRACKET type_ R_BRACKET) | kind=DICT L_BRACKET type_ R_BRACKET type_; diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 66fcb0e3d..a3dea4892 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.13.1 +// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -9,9 +9,9 @@ import org.antlr.v4.runtime.dfa.DFA; import org.antlr.v4.runtime.misc.*; -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class GobraLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.12.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -23,26 +23,26 @@ public class GobraLexer extends Lexer { FOLD=23, UNFOLD=24, UNFOLDING=25, LET=26, GHOST=27, IN=28, MULTI=29, SUBSET=30, UNION=31, INTERSECTION=32, SETMINUS=33, IMPLIES=34, WAND=35, APPLY=36, QMARK=37, L_PRED=38, R_PRED=39, SEQ=40, SET=41, MSET=42, DICT=43, OPT=44, - LEN=45, NEW=46, MAKE=47, CAP=48, SOME=49, GET=50, DOM=51, AXIOM=52, ADT=53, - MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, SHARE=59, ADDR_MOD=60, - DOT_DOT=61, SHARED=62, EXCLUSIVE=63, PREDICATE=64, WRITEPERM=65, NOPERM=66, - TRUSTED=67, OUTLINE=68, INIT_POST=69, IMPORT_PRE=70, PROOF=71, GHOST_EQUALS=72, - GHOST_NOT_EQUALS=73, WITH=74, OPAQUE=75, REVEAL=76, BREAK=77, DEFAULT=78, - FUNC=79, INTERFACE=80, SELECT=81, CASE=82, DEFER=83, GO=84, MAP=85, STRUCT=86, - CHAN=87, ELSE=88, GOTO=89, PACKAGE=90, SWITCH=91, CONST=92, FALLTHROUGH=93, - IF=94, RANGE=95, TYPE=96, CONTINUE=97, FOR=98, IMPORT=99, RETURN=100, - VAR=101, NIL_LIT=102, IDENTIFIER=103, L_PAREN=104, R_PAREN=105, L_CURLY=106, - R_CURLY=107, L_BRACKET=108, R_BRACKET=109, ASSIGN=110, COMMA=111, SEMI=112, - COLON=113, DOT=114, PLUS_PLUS=115, MINUS_MINUS=116, DECLARE_ASSIGN=117, - ELLIPSIS=118, LOGICAL_OR=119, LOGICAL_AND=120, EQUALS=121, NOT_EQUALS=122, - LESS=123, LESS_OR_EQUALS=124, GREATER=125, GREATER_OR_EQUALS=126, OR=127, - DIV=128, MOD=129, LSHIFT=130, RSHIFT=131, BIT_CLEAR=132, EXCLAMATION=133, - PLUS=134, MINUS=135, CARET=136, STAR=137, AMPERSAND=138, RECEIVE=139, - DECIMAL_LIT=140, BINARY_LIT=141, OCTAL_LIT=142, HEX_LIT=143, HEX_FLOAT_LIT=144, - IMAGINARY_LIT=145, RUNE_LIT=146, BYTE_VALUE=147, OCTAL_BYTE_VALUE=148, - HEX_BYTE_VALUE=149, LITTLE_U_VALUE=150, BIG_U_VALUE=151, RAW_STRING_LIT=152, - INTERPRETED_STRING_LIT=153, WS=154, COMMENT=155, TERMINATOR=156, LINE_COMMENT=157, - WS_NLSEMI=158, COMMENT_NLSEMI=159, LINE_COMMENT_NLSEMI=160, EOS=161, OTHER=162; + GPOINTER=45, LEN=46, NEW=47, MAKE=48, CAP=49, SOME=50, GET=51, DOM=52, + AXIOM=53, ADT=54, MATCH=55, NONE=56, PRED=57, TYPE_OF=58, IS_COMPARABLE=59, + SHARE=60, ADDR_MOD=61, DOT_DOT=62, SHARED=63, EXCLUSIVE=64, PREDICATE=65, + WRITEPERM=66, NOPERM=67, TRUSTED=68, OUTLINE=69, INIT_POST=70, IMPORT_PRE=71, + PROOF=72, GHOST_EQUALS=73, GHOST_NOT_EQUALS=74, WITH=75, OPAQUE=76, REVEAL=77, + BREAK=78, DEFAULT=79, FUNC=80, INTERFACE=81, SELECT=82, CASE=83, DEFER=84, + GO=85, MAP=86, STRUCT=87, CHAN=88, ELSE=89, GOTO=90, PACKAGE=91, SWITCH=92, + CONST=93, FALLTHROUGH=94, IF=95, RANGE=96, TYPE=97, CONTINUE=98, FOR=99, + IMPORT=100, RETURN=101, VAR=102, NIL_LIT=103, IDENTIFIER=104, L_PAREN=105, + R_PAREN=106, L_CURLY=107, R_CURLY=108, L_BRACKET=109, R_BRACKET=110, ASSIGN=111, + COMMA=112, SEMI=113, COLON=114, DOT=115, PLUS_PLUS=116, MINUS_MINUS=117, + DECLARE_ASSIGN=118, ELLIPSIS=119, LOGICAL_OR=120, LOGICAL_AND=121, EQUALS=122, + NOT_EQUALS=123, LESS=124, LESS_OR_EQUALS=125, GREATER=126, GREATER_OR_EQUALS=127, + OR=128, DIV=129, MOD=130, LSHIFT=131, RSHIFT=132, BIT_CLEAR=133, EXCLAMATION=134, + PLUS=135, MINUS=136, CARET=137, STAR=138, AMPERSAND=139, RECEIVE=140, + DECIMAL_LIT=141, BINARY_LIT=142, OCTAL_LIT=143, HEX_LIT=144, HEX_FLOAT_LIT=145, + IMAGINARY_LIT=146, RUNE_LIT=147, BYTE_VALUE=148, OCTAL_BYTE_VALUE=149, + HEX_BYTE_VALUE=150, LITTLE_U_VALUE=151, BIG_U_VALUE=152, RAW_STRING_LIT=153, + INTERPRETED_STRING_LIT=154, WS=155, COMMENT=156, TERMINATOR=157, LINE_COMMENT=158, + WS_NLSEMI=159, COMMENT_NLSEMI=160, LINE_COMMENT_NLSEMI=161, EOS=162, OTHER=163; public static final int NLSEMI=1; public static String[] channelNames = { @@ -60,9 +60,9 @@ private static String[] makeRuleNames() { "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", "FOLD", "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", - "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", - "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", - "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", + "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "GPOINTER", "LEN", "NEW", + "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", + "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "OPAQUE", "REVEAL", "BREAK", "DEFAULT", "FUNC", "INTERFACE", @@ -94,20 +94,20 @@ private static String[] makeLiteralNames() { "'#lhs'", "'forall'", "'exists'", "'acc'", "'fold'", "'unfold'", "'unfolding'", "'let'", "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'", "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", - "'set'", "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", - "'cap'", "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", - "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", - "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", - "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", - "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'break'", "'default'", - "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", - "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", - "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", - "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", - "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", - "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", - "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", - "'^'", "'*'", "'&'", "'<-'" + "'set'", "'mset'", "'dict'", "'option'", "'gpointer'", "'len'", "'new'", + "'make'", "'cap'", "'some'", "'get'", "'domain'", "'axiom'", "'adt'", + "'match'", "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", + "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", + "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", + "'proof'", "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'break'", + "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", + "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'", + "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", + "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, + "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", + "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", + "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", + "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -118,9 +118,9 @@ private static String[] makeSymbolicNames() { "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", "FOLD", "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", - "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", - "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", - "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", + "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "GPOINTER", "LEN", "NEW", + "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", + "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "OPAQUE", "REVEAL", "BREAK", "DEFAULT", "FUNC", "INTERFACE", @@ -217,7 +217,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\u0004\u0000\u00a2\u05ef\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ + "\u0004\u0000\u00a3\u05fc\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ @@ -262,1096 +262,1099 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+ "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+ "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+ - "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0001"+ - "\u0000\u0001\u0000\u0003\u0000\u0163\b\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u016b\b\u0001\u0001"+ - "\u0001\u0003\u0001\u016e\b\u0001\u0001\u0001\u0003\u0001\u0171\b\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u0177\b\u0001"+ - "\u0003\u0001\u0179\b\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ - "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001"+ - "\u001b\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001"+ - "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001"+ - "!\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001$\u0001$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001"+ - "&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001"+ - "(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ - ")\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001"+ - "+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00011\u0001"+ - "1\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u0001"+ - "2\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ - "3\u00013\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u0001"+ - "5\u00015\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u0001"+ - "6\u00016\u00016\u00017\u00017\u00017\u00017\u00017\u00018\u00018\u0001"+ - "8\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ - "9\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001"+ - "9\u00019\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001"+ - ";\u0001;\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ - "=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ - ">\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ - "?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ - "A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ - "D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002"+ + "\u00af\u0007\u00af\u0001\u0000\u0001\u0000\u0003\u0000\u0165\b\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003"+ + "\u0001\u016d\b\u0001\u0001\u0001\u0003\u0001\u0170\b\u0001\u0001\u0001"+ + "\u0003\u0001\u0173\b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0003\u0001\u0179\b\u0001\u0003\u0001\u017b\b\u0001\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001%\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'"+ + "\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + "+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u00010\u00010\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u0001"+ + "1\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u00012\u0001"+ + "3\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00014\u0001"+ + "4\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u00015\u0001"+ + "5\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ + "6\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00018\u00018\u0001"+ + "8\u00018\u00018\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001"+ + "9\u00019\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001"+ + ":\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001"+ + ";\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001"+ + "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001"+ "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001"+ - "F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001"+ - "H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001"+ - "J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001"+ - "K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001"+ - "N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+ - "O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+ - "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001R\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ - "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001"+ + "F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ + "F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001"+ + "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001"+ + "J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+ + "K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001"+ + "M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001"+ + "N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001"+ + "P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001"+ + "U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ "V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ - "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001"+ - "]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001"+ - "_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ - "`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ - "c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001"+ - "e\u0001e\u0001e\u0001f\u0001f\u0001f\u0005f\u0438\bf\nf\ff\u043b\tf\u0001"+ - "f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001"+ - "j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001"+ - "m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001p\u0001p\u0001q\u0001q\u0001"+ - "r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001"+ - "t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001"+ - "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001z\u0001"+ - "z\u0001{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001}\u0001}\u0001~\u0001"+ - "~\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081"+ - "\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083"+ - "\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0086"+ - "\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0089"+ - "\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b"+ - "\u0001\u008b\u0003\u008b\u04a3\b\u008b\u0001\u008b\u0005\u008b\u04a6\b"+ - "\u008b\n\u008b\f\u008b\u04a9\t\u008b\u0003\u008b\u04ab\b\u008b\u0001\u008b"+ - "\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u04b2\b\u008c"+ - "\u0001\u008c\u0004\u008c\u04b5\b\u008c\u000b\u008c\f\u008c\u04b6\u0001"+ - "\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0003\u008d\u04bd\b\u008d\u0001"+ - "\u008d\u0003\u008d\u04c0\b\u008d\u0001\u008d\u0004\u008d\u04c3\b\u008d"+ - "\u000b\u008d\f\u008d\u04c4\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e"+ - "\u0001\u008e\u0003\u008e\u04cc\b\u008e\u0001\u008e\u0004\u008e\u04cf\b"+ - "\u008e\u000b\u008e\f\u008e\u04d0\u0001\u008e\u0001\u008e\u0001\u008f\u0001"+ - "\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0003\u0090\u04db"+ - "\b\u0090\u0001\u0090\u0004\u0090\u04de\b\u0090\u000b\u0090\f\u0090\u04df"+ - "\u0001\u0090\u0001\u0090\u0003\u0090\u04e4\b\u0090\u0001\u0090\u0005\u0090"+ - "\u04e7\b\u0090\n\u0090\f\u0090\u04ea\t\u0090\u0003\u0090\u04ec\b\u0090"+ - "\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u04f1\b\u0090\u0001\u0090"+ - "\u0005\u0090\u04f4\b\u0090\n\u0090\f\u0090\u04f7\t\u0090\u0003\u0090\u04f9"+ - "\b\u0090\u0001\u0091\u0001\u0091\u0003\u0091\u04fd\b\u0091\u0001\u0091"+ - "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0003\u0092\u0506\b\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0093\u0001\u0093\u0001\u0093\u0003\u0093\u050f\b\u0093\u0001\u0093"+ - "\u0001\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095"+ - "\u0001\u0095\u0003\u0095\u0519\b\u0095\u0001\u0096\u0001\u0096\u0001\u0096"+ - "\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097"+ - "\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098"+ - "\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ + "X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ + "[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001"+ + "]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+ + "_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001"+ + "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001"+ + "b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001"+ + "d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001"+ + "e\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0005"+ + "g\u0445\bg\ng\fg\u0448\tg\u0001g\u0001g\u0001h\u0001h\u0001i\u0001i\u0001"+ + "i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001"+ + "m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001p\u0001p\u0001"+ + "q\u0001q\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001t\u0001"+ + "t\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001"+ + "v\u0001w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001"+ + "z\u0001z\u0001z\u0001{\u0001{\u0001|\u0001|\u0001|\u0001}\u0001}\u0001"+ + "~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001"+ + "\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001"+ + "\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001"+ + "\u0085\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ + "\u0088\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008b\u0001"+ + "\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u04b0"+ + "\b\u008c\u0001\u008c\u0005\u008c\u04b3\b\u008c\n\u008c\f\u008c\u04b6\t"+ + "\u008c\u0003\u008c\u04b8\b\u008c\u0001\u008c\u0001\u008c\u0001\u008d\u0001"+ + "\u008d\u0001\u008d\u0003\u008d\u04bf\b\u008d\u0001\u008d\u0004\u008d\u04c2"+ + "\b\u008d\u000b\u008d\f\u008d\u04c3\u0001\u008d\u0001\u008d\u0001\u008e"+ + "\u0001\u008e\u0003\u008e\u04ca\b\u008e\u0001\u008e\u0003\u008e\u04cd\b"+ + "\u008e\u0001\u008e\u0004\u008e\u04d0\b\u008e\u000b\u008e\f\u008e\u04d1"+ + "\u0001\u008e\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0003\u008f"+ + "\u04d9\b\u008f\u0001\u008f\u0004\u008f\u04dc\b\u008f\u000b\u008f\f\u008f"+ + "\u04dd\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001"+ + "\u0090\u0001\u0090\u0001\u0091\u0003\u0091\u04e8\b\u0091\u0001\u0091\u0004"+ + "\u0091\u04eb\b\u0091\u000b\u0091\f\u0091\u04ec\u0001\u0091\u0001\u0091"+ + "\u0003\u0091\u04f1\b\u0091\u0001\u0091\u0005\u0091\u04f4\b\u0091\n\u0091"+ + "\f\u0091\u04f7\t\u0091\u0003\u0091\u04f9\b\u0091\u0001\u0091\u0001\u0091"+ + "\u0001\u0091\u0003\u0091\u04fe\b\u0091\u0001\u0091\u0005\u0091\u0501\b"+ + "\u0091\n\u0091\f\u0091\u0504\t\u0091\u0003\u0091\u0506\b\u0091\u0001\u0092"+ + "\u0001\u0092\u0003\u0092\u050a\b\u0092\u0001\u0092\u0001\u0092\u0001\u0093"+ + "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0003\u0093\u0513\b\u0093"+ + "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0003\u0094\u051c\b\u0094\u0001\u0094\u0001\u0094\u0001\u0095"+ + "\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0003\u0096"+ + "\u0526\b\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097"+ + "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099"+ "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ - "\u0001\u0099\u0001\u009a\u0001\u009a\u0005\u009a\u0539\b\u009a\n\u009a"+ - "\f\u009a\u053c\t\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a"+ - "\u0001\u009b\u0001\u009b\u0001\u009b\u0005\u009b\u0545\b\u009b\n\u009b"+ - "\f\u009b\u0548\t\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b"+ - "\u0001\u009c\u0004\u009c\u054f\b\u009c\u000b\u009c\f\u009c\u0550\u0001"+ - "\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0005"+ - "\u009d\u0559\b\u009d\n\u009d\f\u009d\u055c\t\u009d\u0001\u009d\u0001\u009d"+ - "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0004\u009e\u0564\b\u009e"+ - "\u000b\u009e\f\u009e\u0565\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f"+ - "\u0001\u009f\u0001\u009f\u0005\u009f\u056e\b\u009f\n\u009f\f\u009f\u0571"+ - "\t\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001"+ - "\u00a0\u0003\u00a0\u0579\b\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0003\u00a1\u0595"+ - "\b\u00a1\u0001\u00a2\u0001\u00a2\u0003\u00a2\u0599\b\u00a2\u0001\u00a2"+ - "\u0005\u00a2\u059c\b\u00a2\n\u00a2\f\u00a2\u059f\t\u00a2\u0001\u00a3\u0001"+ - "\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001"+ - "\u00a6\u0003\u00a6\u05a9\b\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001"+ - "\u00a7\u0003\u00a7\u05af\b\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001"+ - "\u00a9\u0001\u00aa\u0004\u00aa\u05b6\b\u00aa\u000b\u00aa\f\u00aa\u05b7"+ - "\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ - "\u0005\u00ab\u05c0\b\u00ab\n\u00ab\f\u00ab\u05c3\t\u00ab\u0001\u00ab\u0001"+ - "\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001"+ - "\u00ac\u0001\u00ac\u0005\u00ac\u05ce\b\u00ac\n\u00ac\f\u00ac\u05d1\t\u00ac"+ - "\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0004\u00ad\u05d6\b\u00ad\u000b\u00ad"+ - "\f\u00ad\u05d7\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ - "\u0005\u00ad\u05df\b\u00ad\n\u00ad\f\u00ad\u05e2\t\u00ad\u0001\u00ad\u0001"+ - "\u00ad\u0001\u00ad\u0003\u00ad\u05e7\b\u00ad\u0001\u00ad\u0001\u00ad\u0001"+ - "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0003\u055a\u05c1"+ - "\u05e0\u0000\u00af\u0002\u0001\u0004\u0002\u0006\u0003\b\u0004\n\u0005"+ - "\f\u0006\u000e\u0007\u0010\b\u0012\t\u0014\n\u0016\u000b\u0018\f\u001a"+ - "\r\u001c\u000e\u001e\u000f \u0010\"\u0011$\u0012&\u0013(\u0014*\u0015"+ - ",\u0016.\u00170\u00182\u00194\u001a6\u001b8\u001c:\u001d<\u001e>\u001f"+ - "@ B!D\"F#H$J%L&N\'P(R)T*V+X,Z-\\.^/`0b1d2f3h4j5l6n7p8r9t:v;x~?\u0080"+ - "@\u0082A\u0084B\u0086C\u0088D\u008aE\u008cF\u008eG\u0090H\u0092I\u0094"+ - "J\u0096K\u0098L\u009aM\u009cN\u009eO\u00a0P\u00a2Q\u00a4R\u00a6S\u00a8"+ - "T\u00aaU\u00acV\u00aeW\u00b0X\u00b2Y\u00b4Z\u00b6[\u00b8\\\u00ba]\u00bc"+ - "^\u00be_\u00c0`\u00c2a\u00c4b\u00c6c\u00c8d\u00cae\u00ccf\u00ceg\u00d0"+ - "h\u00d2i\u00d4j\u00d6k\u00d8l\u00dam\u00dcn\u00deo\u00e0p\u00e2q\u00e4"+ - "r\u00e6s\u00e8t\u00eau\u00ecv\u00eew\u00f0x\u00f2y\u00f4z\u00f6{\u00f8"+ - "|\u00fa}\u00fc~\u00fe\u007f\u0100\u0080\u0102\u0081\u0104\u0082\u0106"+ - "\u0083\u0108\u0084\u010a\u0085\u010c\u0086\u010e\u0087\u0110\u0088\u0112"+ - "\u0089\u0114\u008a\u0116\u008b\u0118\u008c\u011a\u008d\u011c\u008e\u011e"+ - "\u008f\u0120\u0090\u0122\u0000\u0124\u0000\u0126\u0091\u0128\u0000\u012a"+ - "\u0092\u012c\u0093\u012e\u0094\u0130\u0095\u0132\u0096\u0134\u0097\u0136"+ - "\u0098\u0138\u0099\u013a\u009a\u013c\u009b\u013e\u009c\u0140\u009d\u0142"+ - "\u0000\u0144\u0000\u0146\u0000\u0148\u0000\u014a\u0000\u014c\u0000\u014e"+ - "\u0000\u0150\u0000\u0152\u0000\u0154\u0000\u0156\u009e\u0158\u009f\u015a"+ - "\u00a0\u015c\u00a1\u015e\u00a2\u0002\u0000\u0001\u0013\u0001\u000019\u0001"+ - "\u000009\u0002\u0000BBbb\u0002\u0000OOoo\u0002\u0000XXxx\u0002\u0000P"+ - "Ppp\u0002\u0000++--\u0001\u0000``\u0002\u0000\"\"\\\\\u0002\u0000\t\t"+ - " \u0002\u0000\n\n\r\r\u0003\u0000\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\abf"+ - "fnnrrttvv\u0001\u000007\u0003\u000009AFaf\u0001\u000001\u0002\u0000EE"+ - "ee@\u000009\u0660\u0669\u06f0\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef"+ - "\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef"+ - "\u0d66\u0d6f\u0de6\u0def\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049"+ - "\u1090\u1099\u17e0\u17e9\u1810\u1819\u1946\u194f\u19d0\u19d9\u1a80\u1a89"+ - "\u1a90\u1a99\u1b50\u1b59\u1bb0\u1bb9\u1c40\u1c49\u1c50\u1c59\u8000\ua620"+ - "\u8000\ua629\u8000\ua8d0\u8000\ua8d9\u8000\ua900\u8000\ua909\u8000\ua9d0"+ - "\u8000\ua9d9\u8000\ua9f0\u8000\ua9f9\u8000\uaa50\u8000\uaa59\u8000\uabf0"+ - "\u8000\uabf9\u8000\uff10\u8000\uff19\u8001\u04a0\u8001\u04a9\u8001\u0d30"+ - "\u8001\u0d39\u8001\u1066\u8001\u106f\u8001\u10f0\u8001\u10f9\u8001\u1136"+ - "\u8001\u113f\u8001\u11d0\u8001\u11d9\u8001\u12f0\u8001\u12f9\u8001\u1450"+ - "\u8001\u1459\u8001\u14d0\u8001\u14d9\u8001\u1650\u8001\u1659\u8001\u16c0"+ - "\u8001\u16c9\u8001\u1730\u8001\u1739\u8001\u18e0\u8001\u18e9\u8001\u1950"+ - "\u8001\u1959\u8001\u1c50\u8001\u1c59\u8001\u1d50\u8001\u1d59\u8001\u1da0"+ - "\u8001\u1da9\u8001\u1f50\u8001\u1f59\u8001\u6a60\u8001\u6a69\u8001\u6ac0"+ - "\u8001\u6ac9\u8001\u6b50\u8001\u6b59\u8001\ud7ce\u8001\ud7ff\u8001\ue140"+ - "\u8001\ue149\u8001\ue2f0\u8001\ue2f9\u8001\ue4f0\u8001\ue4f9\u8001\ue950"+ - "\u8001\ue959\u8001\ufbf0\u8001\ufbf9\u0293\u0000AZaz\u00aa\u00aa\u00b5"+ - "\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0"+ - "\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376\u0377\u037a\u037d\u037f"+ - "\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03f5\u03f7"+ - "\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560\u0588\u05d0\u05ea\u05ef"+ - "\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee"+ - "\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1"+ - "\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800\u0815\u081a\u081a\u0824"+ - "\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870\u0887\u0889\u088e\u08a0"+ - "\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958\u0961\u0971\u0980\u0985"+ - "\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd"+ - "\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05"+ - "\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38"+ - "\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93"+ - "\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0"+ - "\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32"+ - "\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83"+ - "\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e"+ - "\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e"+ - "\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60"+ - "\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5"+ - "\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e"+ - "\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a"+ - "\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01"+ - "\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c"+ - "\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6"+ - "\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000"+ - "\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061\u1061\u1065\u1066\u106e"+ - "\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0"+ - "\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258\u1258\u125a\u125d\u1260"+ - "\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2"+ - "\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318\u135a\u1380\u138f\u13a0"+ - "\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681\u169a\u16a0\u16ea\u16f1"+ - "\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760\u176c\u176e\u1770\u1780"+ - "\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880\u1884\u1887\u18a8\u18aa"+ - "\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0"+ - "\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83"+ - "\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80"+ - "\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa"+ - "\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50"+ - "\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6"+ - "\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0"+ - "\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f\u207f\u2090\u209c\u2102"+ - "\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119\u211d\u2124\u2124\u2126"+ - "\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c\u213f\u2145\u2149\u214e"+ - "\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27"+ - "\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8"+ - "\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8"+ - "\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b\u303c\u3041\u3096\u309d"+ - "\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131\u318e\u31a0\u31bf\u31f0"+ - "\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0\u8000\ua4fd\u8000\ua500"+ - "\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a\u8000\ua62b\u8000\ua640"+ - "\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0\u8000\ua6e5\u8000\ua717"+ - "\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b\u8000\ua7ca\u8000\ua7d0"+ - "\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2"+ - "\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c"+ - "\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882\u8000\ua8b3\u8000\ua8f2"+ - "\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000\ua90a"+ - "\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960\u8000\ua97c\u8000\ua984"+ - "\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6"+ - "\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40"+ - "\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60\u8000\uaa76\u8000\uaa7a"+ - "\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1\u8000\uaab1\u8000\uaab5"+ - "\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0\u8000\uaac0\u8000\uaac2"+ - "\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0\u8000\uaaea\u8000\uaaf2"+ - "\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09\u8000\uab0e\u8000\uab11"+ - "\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28\u8000\uab2e\u8000\uab30"+ - "\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70\u8000\uabe2\u8000\uac00"+ - "\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000\uf900"+ - "\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00\u8000\ufb06\u8000\ufb13"+ - "\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f\u8000\ufb28\u8000\ufb2a"+ - "\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000\ufb40"+ - "\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46\u8000\ufbb1\u8000\ufbd3"+ - "\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92\u8000\ufdc7\u8000\ufdf0"+ - "\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76\u8000\ufefc\u8000\uff21"+ - "\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66\u8000\uffbe\u8000\uffc2"+ - "\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2\u8000\uffd7\u8000\uffda"+ - "\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001&\u8001(\u8001:\u8001"+ - "<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080\u8001\u00fa\u8001\u0280"+ - "\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300\u8001\u031f\u8001\u032d"+ - "\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350\u8001\u0375\u8001\u0380"+ - "\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8\u8001\u03cf\u8001\u0400"+ - "\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8\u8001\u04fb\u8001\u0500"+ - "\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570\u8001\u057a\u8001\u057c"+ - "\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594\u8001\u0595\u8001\u0597"+ - "\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3\u8001\u05b9\u8001\u05bb"+ - "\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740\u8001\u0755\u8001\u0760"+ - "\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787\u8001\u07b0\u8001\u07b2"+ - "\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808\u8001\u0808\u8001\u080a"+ - "\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c\u8001\u083c\u8001\u083f"+ - "\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880\u8001\u089e\u8001\u08e0"+ - "\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900\u8001\u0915\u8001\u0920"+ - "\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be\u8001\u09bf\u8001\u0a00"+ - "\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15\u8001\u0a17\u8001\u0a19"+ - "\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80\u8001\u0a9c\u8001\u0ac0"+ - "\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00\u8001\u0b35\u8001\u0b40"+ - "\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80\u8001\u0b91\u8001\u0c00"+ - "\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0\u8001\u0cf2\u8001\u0d00"+ - "\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0\u8001\u0eb1\u8001\u0f00"+ - "\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30\u8001\u0f45\u8001\u0f70"+ - "\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0\u8001\u0ff6\u8001\u1003"+ - "\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075\u8001\u1075\u8001\u1083"+ - "\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103\u8001\u1126\u8001\u1144"+ - "\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150\u8001\u1172\u8001\u1176"+ - "\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1\u8001\u11c4\u8001\u11da"+ - "\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200\u8001\u1211\u8001\u1213"+ - "\u8001\u122b\u8001\u123f\u8001\u1240\u8001\u1280\u8001\u1286\u8001\u1288"+ - "\u8001\u1288\u8001\u128a\u8001\u128d\u8001\u128f\u8001\u129d\u8001\u129f"+ - "\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001\u1305\u8001\u130c\u8001\u130f"+ - "\u8001\u1310\u8001\u1313\u8001\u1328\u8001\u132a\u8001\u1330\u8001\u1332"+ - "\u8001\u1333\u8001\u1335\u8001\u1339\u8001\u133d\u8001\u133d\u8001\u1350"+ - "\u8001\u1350\u8001\u135d\u8001\u1361\u8001\u1400\u8001\u1434\u8001\u1447"+ - "\u8001\u144a\u8001\u145f\u8001\u1461\u8001\u1480\u8001\u14af\u8001\u14c4"+ - "\u8001\u14c5\u8001\u14c7\u8001\u14c7\u8001\u1580\u8001\u15ae\u8001\u15d8"+ - "\u8001\u15db\u8001\u1600\u8001\u162f\u8001\u1644\u8001\u1644\u8001\u1680"+ - "\u8001\u16aa\u8001\u16b8\u8001\u16b8\u8001\u1700\u8001\u171a\u8001\u1740"+ - "\u8001\u1746\u8001\u1800\u8001\u182b\u8001\u18a0\u8001\u18df\u8001\u18ff"+ - "\u8001\u1906\u8001\u1909\u8001\u1909\u8001\u190c\u8001\u1913\u8001\u1915"+ - "\u8001\u1916\u8001\u1918\u8001\u192f\u8001\u193f\u8001\u193f\u8001\u1941"+ - "\u8001\u1941\u8001\u19a0\u8001\u19a7\u8001\u19aa\u8001\u19d0\u8001\u19e1"+ - "\u8001\u19e1\u8001\u19e3\u8001\u19e3\u8001\u1a00\u8001\u1a00\u8001\u1a0b"+ - "\u8001\u1a32\u8001\u1a3a\u8001\u1a3a\u8001\u1a50\u8001\u1a50\u8001\u1a5c"+ - "\u8001\u1a89\u8001\u1a9d\u8001\u1a9d\u8001\u1ab0\u8001\u1af8\u8001\u1c00"+ - "\u8001\u1c08\u8001\u1c0a\u8001\u1c2e\u8001\u1c40\u8001\u1c40\u8001\u1c72"+ - "\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001\u1d08\u8001\u1d09\u8001\u1d0b"+ - "\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001\u1d60\u8001\u1d65\u8001\u1d67"+ - "\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001\u1d98\u8001\u1d98\u8001\u1ee0"+ - "\u8001\u1ef2\u8001\u1f02\u8001\u1f02\u8001\u1f04\u8001\u1f10\u8001\u1f12"+ - "\u8001\u1f33\u8001\u1fb0\u8001\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480"+ - "\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342f\u8001\u3441"+ - "\u8001\u3446\u8001\u4400\u8001\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40"+ - "\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00"+ - "\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d"+ - "\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50"+ - "\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3"+ - "\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00"+ - "\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd"+ - "\u8001\uaffe\u8001\ub000\u8001\ub122\u8001\ub132\u8001\ub132\u8001\ub150"+ - "\u8001\ub152\u8001\ub155\u8001\ub155\u8001\ub164\u8001\ub167\u8001\ub170"+ - "\u8001\ub2fb\u8001\ubc00\u8001\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80"+ - "\u8001\ubc88\u8001\ubc90\u8001\ubc99\u8001\ud400\u8001\ud454\u8001\ud456"+ - "\u8001\ud49c\u8001\ud49e\u8001\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5"+ - "\u8001\ud4a6\u8001\ud4a9\u8001\ud4ac\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb"+ - "\u8001\ud4bb\u8001\ud4bd\u8001\ud4c3\u8001\ud4c5\u8001\ud505\u8001\ud507"+ - "\u8001\ud50a\u8001\ud50d\u8001\ud514\u8001\ud516\u8001\ud51c\u8001\ud51e"+ - "\u8001\ud539\u8001\ud53b\u8001\ud53e\u8001\ud540\u8001\ud544\u8001\ud546"+ - "\u8001\ud546\u8001\ud54a\u8001\ud550\u8001\ud552\u8001\ud6a5\u8001\ud6a8"+ - "\u8001\ud6c0\u8001\ud6c2\u8001\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc"+ - "\u8001\ud714\u8001\ud716\u8001\ud734\u8001\ud736\u8001\ud74e\u8001\ud750"+ - "\u8001\ud76e\u8001\ud770\u8001\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa"+ - "\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\udf25"+ - "\u8001\udf2a\u8001\ue030\u8001\ue06d\u8001\ue100\u8001\ue12c\u8001\ue137"+ - "\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290\u8001\ue2ad\u8001\ue2c0"+ - "\u8001\ue2eb\u8001\ue4d0\u8001\ue4eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8"+ - "\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001\ue7f0\u8001\ue7fe\u8001\ue800"+ - "\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001\ue94b\u8001\ue94b\u8001\uee00"+ - "\u8001\uee03\u8001\uee05\u8001\uee1f\u8001\uee21\u8001\uee22\u8001\uee24"+ - "\u8001\uee24\u8001\uee27\u8001\uee27\u8001\uee29\u8001\uee32\u8001\uee34"+ - "\u8001\uee37\u8001\uee39\u8001\uee39\u8001\uee3b\u8001\uee3b\u8001\uee42"+ - "\u8001\uee42\u8001\uee47\u8001\uee47\u8001\uee49\u8001\uee49\u8001\uee4b"+ - "\u8001\uee4b\u8001\uee4d\u8001\uee4f\u8001\uee51\u8001\uee52\u8001\uee54"+ - "\u8001\uee54\u8001\uee57\u8001\uee57\u8001\uee59\u8001\uee59\u8001\uee5b"+ - "\u8001\uee5b\u8001\uee5d\u8001\uee5d\u8001\uee5f\u8001\uee5f\u8001\uee61"+ - "\u8001\uee62\u8001\uee64\u8001\uee64\u8001\uee67\u8001\uee6a\u8001\uee6c"+ - "\u8001\uee72\u8001\uee74\u8001\uee77\u8001\uee79\u8001\uee7c\u8001\uee7e"+ - "\u8001\uee7e\u8001\uee80\u8001\uee89\u8001\uee8b\u8001\uee9b\u8001\ueea1"+ - "\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000"+ - "\u8002\ua6df\u8002\ua700\u8002\ub739\u8002\ub740\u8002\ub81d\u8002\ub820"+ - "\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000"+ - "\u8003\u134a\u8003\u1350\u8003\u23af\u061b\u0000\u0002\u0001\u0000\u0000"+ - "\u0000\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000"+ - "\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000"+ - "\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000"+ - "\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000"+ - "\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000"+ - "\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000"+ - "\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000"+ - " \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001"+ - "\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000"+ - "\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000"+ - ".\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001"+ - "\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000"+ - "\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000"+ - "<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001"+ - "\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000"+ - "\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000"+ - "J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001"+ - "\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000"+ - "\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000"+ - "X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001"+ - "\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000"+ - "\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000"+ - "f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000j\u0001"+ - "\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001\u0000\u0000"+ - "\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000"+ - "t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001"+ - "\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000"+ - "\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000\u0000\u0000"+ - "\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000\u0000\u0000"+ - "\u0000\u0086\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000\u0000\u0000"+ - "\u0000\u008a\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000\u0000\u0000"+ - "\u0000\u008e\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000\u0000\u0000"+ - "\u0000\u0092\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000\u0000\u0000"+ - "\u0000\u0096\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000\u0000\u0000"+ - "\u0000\u009a\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000\u0000\u0000"+ - "\u0000\u009e\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000\u0000\u0000"+ - "\u0000\u00a2\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000\u0000\u0000"+ - "\u0000\u00a6\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000\u0000\u0000"+ - "\u0000\u00aa\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000\u0000\u0000"+ - "\u0000\u00ae\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000\u0000\u0000"+ - "\u0000\u00b2\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000\u0000\u0000"+ - "\u0000\u00b6\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000\u0000\u0000"+ - "\u0000\u00ba\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000\u0000\u0000"+ - "\u0000\u00be\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000\u0000\u0000"+ - "\u0000\u00c2\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000\u0000\u0000"+ - "\u0000\u00c6\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000\u0000\u0000"+ - "\u0000\u00ca\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000\u0000\u0000"+ - "\u0000\u00ce\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000\u0000\u0000"+ - "\u0000\u00d2\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000\u0000\u0000"+ - "\u0000\u00d6\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000\u0000\u0000"+ - "\u0000\u00da\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000\u0000\u0000"+ - "\u0000\u00de\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000\u0000\u0000"+ - "\u0000\u00e2\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000\u0000\u0000"+ - "\u0000\u00e6\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000\u0000\u0000"+ - "\u0000\u00ea\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000\u0000\u0000"+ - "\u0000\u00ee\u0001\u0000\u0000\u0000\u0000\u00f0\u0001\u0000\u0000\u0000"+ - "\u0000\u00f2\u0001\u0000\u0000\u0000\u0000\u00f4\u0001\u0000\u0000\u0000"+ - "\u0000\u00f6\u0001\u0000\u0000\u0000\u0000\u00f8\u0001\u0000\u0000\u0000"+ - "\u0000\u00fa\u0001\u0000\u0000\u0000\u0000\u00fc\u0001\u0000\u0000\u0000"+ - "\u0000\u00fe\u0001\u0000\u0000\u0000\u0000\u0100\u0001\u0000\u0000\u0000"+ - "\u0000\u0102\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000\u0000\u0000"+ - "\u0000\u0106\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000\u0000\u0000"+ - "\u0000\u010a\u0001\u0000\u0000\u0000\u0000\u010c\u0001\u0000\u0000\u0000"+ - "\u0000\u010e\u0001\u0000\u0000\u0000\u0000\u0110\u0001\u0000\u0000\u0000"+ - "\u0000\u0112\u0001\u0000\u0000\u0000\u0000\u0114\u0001\u0000\u0000\u0000"+ - "\u0000\u0116\u0001\u0000\u0000\u0000\u0000\u0118\u0001\u0000\u0000\u0000"+ - "\u0000\u011a\u0001\u0000\u0000\u0000\u0000\u011c\u0001\u0000\u0000\u0000"+ - "\u0000\u011e\u0001\u0000\u0000\u0000\u0000\u0120\u0001\u0000\u0000\u0000"+ - "\u0000\u0126\u0001\u0000\u0000\u0000\u0000\u012a\u0001\u0000\u0000\u0000"+ - "\u0000\u012c\u0001\u0000\u0000\u0000\u0000\u012e\u0001\u0000\u0000\u0000"+ - "\u0000\u0130\u0001\u0000\u0000\u0000\u0000\u0132\u0001\u0000\u0000\u0000"+ - "\u0000\u0134\u0001\u0000\u0000\u0000\u0000\u0136\u0001\u0000\u0000\u0000"+ - "\u0000\u0138\u0001\u0000\u0000\u0000\u0000\u013a\u0001\u0000\u0000\u0000"+ - "\u0000\u013c\u0001\u0000\u0000\u0000\u0000\u013e\u0001\u0000\u0000\u0000"+ - "\u0000\u0140\u0001\u0000\u0000\u0000\u0001\u0156\u0001\u0000\u0000\u0000"+ - "\u0001\u0158\u0001\u0000\u0000\u0000\u0001\u015a\u0001\u0000\u0000\u0000"+ - "\u0001\u015c\u0001\u0000\u0000\u0000\u0001\u015e\u0001\u0000\u0000\u0000"+ - "\u0002\u0162\u0001\u0000\u0000\u0000\u0004\u0178\u0001\u0000\u0000\u0000"+ - "\u0006\u017a\u0001\u0000\u0000\u0000\b\u0181\u0001\u0000\u0000\u0000\n"+ - "\u0189\u0001\u0000\u0000\u0000\f\u0190\u0001\u0000\u0000\u0000\u000e\u0197"+ - "\u0001\u0000\u0000\u0000\u0010\u019e\u0001\u0000\u0000\u0000\u0012\u01a5"+ - "\u0001\u0000\u0000\u0000\u0014\u01ae\u0001\u0000\u0000\u0000\u0016\u01b8"+ - "\u0001\u0000\u0000\u0000\u0018\u01c0\u0001\u0000\u0000\u0000\u001a\u01ca"+ - "\u0001\u0000\u0000\u0000\u001c\u01d6\u0001\u0000\u0000\u0000\u001e\u01dd"+ - "\u0001\u0000\u0000\u0000 \u01e8\u0001\u0000\u0000\u0000\"\u01eb\u0001"+ - "\u0000\u0000\u0000$\u01f1\u0001\u0000\u0000\u0000&\u01fa\u0001\u0000\u0000"+ - "\u0000(\u01ff\u0001\u0000\u0000\u0000*\u0206\u0001\u0000\u0000\u0000,"+ - "\u020d\u0001\u0000\u0000\u0000.\u0213\u0001\u0000\u0000\u00000\u0218\u0001"+ - "\u0000\u0000\u00002\u021f\u0001\u0000\u0000\u00004\u0229\u0001\u0000\u0000"+ - "\u00006\u022d\u0001\u0000\u0000\u00008\u0233\u0001\u0000\u0000\u0000:"+ - "\u0236\u0001\u0000\u0000\u0000<\u0238\u0001\u0000\u0000\u0000>\u023f\u0001"+ - "\u0000\u0000\u0000@\u0245\u0001\u0000\u0000\u0000B\u0252\u0001\u0000\u0000"+ - "\u0000D\u025b\u0001\u0000\u0000\u0000F\u025f\u0001\u0000\u0000\u0000H"+ - "\u0263\u0001\u0000\u0000\u0000J\u0269\u0001\u0000\u0000\u0000L\u026b\u0001"+ - "\u0000\u0000\u0000N\u026e\u0001\u0000\u0000\u0000P\u0273\u0001\u0000\u0000"+ - "\u0000R\u0279\u0001\u0000\u0000\u0000T\u027f\u0001\u0000\u0000\u0000V"+ - "\u0286\u0001\u0000\u0000\u0000X\u028d\u0001\u0000\u0000\u0000Z\u0296\u0001"+ - "\u0000\u0000\u0000\\\u029c\u0001\u0000\u0000\u0000^\u02a2\u0001\u0000"+ - "\u0000\u0000`\u02a9\u0001\u0000\u0000\u0000b\u02af\u0001\u0000\u0000\u0000"+ - "d\u02b6\u0001\u0000\u0000\u0000f\u02bc\u0001\u0000\u0000\u0000h\u02c5"+ - "\u0001\u0000\u0000\u0000j\u02cd\u0001\u0000\u0000\u0000l\u02d3\u0001\u0000"+ - "\u0000\u0000n\u02db\u0001\u0000\u0000\u0000p\u02e2\u0001\u0000\u0000\u0000"+ - "r\u02e7\u0001\u0000\u0000\u0000t\u02f0\u0001\u0000\u0000\u0000v\u02ff"+ - "\u0001\u0000\u0000\u0000x\u0305\u0001\u0000\u0000\u0000z\u0309\u0001\u0000"+ - "\u0000\u0000|\u030c\u0001\u0000\u0000\u0000~\u0313\u0001\u0000\u0000\u0000"+ - "\u0080\u031d\u0001\u0000\u0000\u0000\u0082\u0327\u0001\u0000\u0000\u0000"+ - "\u0084\u0333\u0001\u0000\u0000\u0000\u0086\u033c\u0001\u0000\u0000\u0000"+ - "\u0088\u0346\u0001\u0000\u0000\u0000\u008a\u034e\u0001\u0000\u0000\u0000"+ - "\u008c\u035a\u0001\u0000\u0000\u0000\u008e\u0369\u0001\u0000\u0000\u0000"+ - "\u0090\u036f\u0001\u0000\u0000\u0000\u0092\u0373\u0001\u0000\u0000\u0000"+ - "\u0094\u0377\u0001\u0000\u0000\u0000\u0096\u037c\u0001\u0000\u0000\u0000"+ - "\u0098\u0385\u0001\u0000\u0000\u0000\u009a\u038c\u0001\u0000\u0000\u0000"+ - "\u009c\u0394\u0001\u0000\u0000\u0000\u009e\u039c\u0001\u0000\u0000\u0000"+ - "\u00a0\u03a1\u0001\u0000\u0000\u0000\u00a2\u03ab\u0001\u0000\u0000\u0000"+ - "\u00a4\u03b2\u0001\u0000\u0000\u0000\u00a6\u03b7\u0001\u0000\u0000\u0000"+ - "\u00a8\u03bd\u0001\u0000\u0000\u0000\u00aa\u03c0\u0001\u0000\u0000\u0000"+ - "\u00ac\u03c4\u0001\u0000\u0000\u0000\u00ae\u03cb\u0001\u0000\u0000\u0000"+ - "\u00b0\u03d0\u0001\u0000\u0000\u0000\u00b2\u03d5\u0001\u0000\u0000\u0000"+ - "\u00b4\u03da\u0001\u0000\u0000\u0000\u00b6\u03e2\u0001\u0000\u0000\u0000"+ - "\u00b8\u03e9\u0001\u0000\u0000\u0000\u00ba\u03ef\u0001\u0000\u0000\u0000"+ - "\u00bc\u03fd\u0001\u0000\u0000\u0000\u00be\u0400\u0001\u0000\u0000\u0000"+ - "\u00c0\u0406\u0001\u0000\u0000\u0000\u00c2\u040b\u0001\u0000\u0000\u0000"+ - "\u00c4\u0416\u0001\u0000\u0000\u0000\u00c6\u041a\u0001\u0000\u0000\u0000"+ - "\u00c8\u0421\u0001\u0000\u0000\u0000\u00ca\u042a\u0001\u0000\u0000\u0000"+ - "\u00cc\u042e\u0001\u0000\u0000\u0000\u00ce\u0434\u0001\u0000\u0000\u0000"+ - "\u00d0\u043e\u0001\u0000\u0000\u0000\u00d2\u0440\u0001\u0000\u0000\u0000"+ - "\u00d4\u0444\u0001\u0000\u0000\u0000\u00d6\u0446\u0001\u0000\u0000\u0000"+ - "\u00d8\u044a\u0001\u0000\u0000\u0000\u00da\u044c\u0001\u0000\u0000\u0000"+ - "\u00dc\u0450\u0001\u0000\u0000\u0000\u00de\u0452\u0001\u0000\u0000\u0000"+ - "\u00e0\u0454\u0001\u0000\u0000\u0000\u00e2\u0456\u0001\u0000\u0000\u0000"+ - "\u00e4\u0458\u0001\u0000\u0000\u0000\u00e6\u045a\u0001\u0000\u0000\u0000"+ - "\u00e8\u045f\u0001\u0000\u0000\u0000\u00ea\u0464\u0001\u0000\u0000\u0000"+ - "\u00ec\u0467\u0001\u0000\u0000\u0000\u00ee\u046b\u0001\u0000\u0000\u0000"+ - "\u00f0\u046e\u0001\u0000\u0000\u0000\u00f2\u0471\u0001\u0000\u0000\u0000"+ - "\u00f4\u0474\u0001\u0000\u0000\u0000\u00f6\u0477\u0001\u0000\u0000\u0000"+ - "\u00f8\u0479\u0001\u0000\u0000\u0000\u00fa\u047c\u0001\u0000\u0000\u0000"+ - "\u00fc\u047e\u0001\u0000\u0000\u0000\u00fe\u0481\u0001\u0000\u0000\u0000"+ - "\u0100\u0483\u0001\u0000\u0000\u0000\u0102\u0485\u0001\u0000\u0000\u0000"+ - "\u0104\u0487\u0001\u0000\u0000\u0000\u0106\u048a\u0001\u0000\u0000\u0000"+ - "\u0108\u048d\u0001\u0000\u0000\u0000\u010a\u0490\u0001\u0000\u0000\u0000"+ - "\u010c\u0492\u0001\u0000\u0000\u0000\u010e\u0494\u0001\u0000\u0000\u0000"+ - "\u0110\u0496\u0001\u0000\u0000\u0000\u0112\u0498\u0001\u0000\u0000\u0000"+ - "\u0114\u049a\u0001\u0000\u0000\u0000\u0116\u049c\u0001\u0000\u0000\u0000"+ - "\u0118\u04aa\u0001\u0000\u0000\u0000\u011a\u04ae\u0001\u0000\u0000\u0000"+ - "\u011c\u04ba\u0001\u0000\u0000\u0000\u011e\u04c8\u0001\u0000\u0000\u0000"+ - "\u0120\u04d4\u0001\u0000\u0000\u0000\u0122\u04f8\u0001\u0000\u0000\u0000"+ - "\u0124\u04fa\u0001\u0000\u0000\u0000\u0126\u0505\u0001\u0000\u0000\u0000"+ - "\u0128\u050b\u0001\u0000\u0000\u0000\u012a\u0512\u0001\u0000\u0000\u0000"+ - "\u012c\u0518\u0001\u0000\u0000\u0000\u012e\u051a\u0001\u0000\u0000\u0000"+ - "\u0130\u051f\u0001\u0000\u0000\u0000\u0132\u0524\u0001\u0000\u0000\u0000"+ - "\u0134\u052b\u0001\u0000\u0000\u0000\u0136\u0536\u0001\u0000\u0000\u0000"+ - "\u0138\u0541\u0001\u0000\u0000\u0000\u013a\u054e\u0001\u0000\u0000\u0000"+ - "\u013c\u0554\u0001\u0000\u0000\u0000\u013e\u0563\u0001\u0000\u0000\u0000"+ - "\u0140\u0569\u0001\u0000\u0000\u0000\u0142\u0578\u0001\u0000\u0000\u0000"+ - "\u0144\u057a\u0001\u0000\u0000\u0000\u0146\u0596\u0001\u0000\u0000\u0000"+ - "\u0148\u05a0\u0001\u0000\u0000\u0000\u014a\u05a2\u0001\u0000\u0000\u0000"+ - "\u014c\u05a4\u0001\u0000\u0000\u0000\u014e\u05a6\u0001\u0000\u0000\u0000"+ - "\u0150\u05ae\u0001\u0000\u0000\u0000\u0152\u05b0\u0001\u0000\u0000\u0000"+ - "\u0154\u05b2\u0001\u0000\u0000\u0000\u0156\u05b5\u0001\u0000\u0000\u0000"+ - "\u0158\u05bb\u0001\u0000\u0000\u0000\u015a\u05c9\u0001\u0000\u0000\u0000"+ - "\u015c\u05e6\u0001\u0000\u0000\u0000\u015e\u05ea\u0001\u0000\u0000\u0000"+ - "\u0160\u0163\u0003\u0004\u0001\u0000\u0161\u0163\u0003\u0120\u008f\u0000"+ - "\u0162\u0160\u0001\u0000\u0000\u0000\u0162\u0161\u0001\u0000\u0000\u0000"+ - "\u0163\u0164\u0001\u0000\u0000\u0000\u0164\u0165\u0006\u0000\u0000\u0000"+ - "\u0165\u0003\u0001\u0000\u0000\u0000\u0166\u0170\u0003\u0146\u00a2\u0000"+ - "\u0167\u0168\u0005.\u0000\u0000\u0168\u016a\u0004\u0001\u0000\u0000\u0169"+ - "\u016b\u0003\u0146\u00a2\u0000\u016a\u0169\u0001\u0000\u0000\u0000\u016a"+ - "\u016b\u0001\u0000\u0000\u0000\u016b\u016d\u0001\u0000\u0000\u0000\u016c"+ - "\u016e\u0003\u014e\u00a6\u0000\u016d\u016c\u0001\u0000\u0000\u0000\u016d"+ - "\u016e\u0001\u0000\u0000\u0000\u016e\u0171\u0001\u0000\u0000\u0000\u016f"+ - "\u0171\u0003\u014e\u00a6\u0000\u0170\u0167\u0001\u0000\u0000\u0000\u0170"+ - "\u016f\u0001\u0000\u0000\u0000\u0171\u0179\u0001\u0000\u0000\u0000\u0172"+ - "\u0173\u0005.\u0000\u0000\u0173\u0174\u0004\u0001\u0001\u0000\u0174\u0176"+ - "\u0003\u0146\u00a2\u0000\u0175\u0177\u0003\u014e\u00a6\u0000\u0176\u0175"+ - "\u0001\u0000\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000\u0177\u0179"+ - "\u0001\u0000\u0000\u0000\u0178\u0166\u0001\u0000\u0000\u0000\u0178\u0172"+ - "\u0001\u0000\u0000\u0000\u0179\u0005\u0001\u0000\u0000\u0000\u017a\u017b"+ - "\u0005t\u0000\u0000\u017b\u017c\u0005r\u0000\u0000\u017c\u017d\u0005u"+ - "\u0000\u0000\u017d\u017e\u0005e\u0000\u0000\u017e\u017f\u0001\u0000\u0000"+ - "\u0000\u017f\u0180\u0006\u0002\u0000\u0000\u0180\u0007\u0001\u0000\u0000"+ - "\u0000\u0181\u0182\u0005f\u0000\u0000\u0182\u0183\u0005a\u0000\u0000\u0183"+ - "\u0184\u0005l\u0000\u0000\u0184\u0185\u0005s\u0000\u0000\u0185\u0186\u0005"+ - "e\u0000\u0000\u0186\u0187\u0001\u0000\u0000\u0000\u0187\u0188\u0006\u0003"+ - "\u0000\u0000\u0188\t\u0001\u0000\u0000\u0000\u0189\u018a\u0005a\u0000"+ - "\u0000\u018a\u018b\u0005s\u0000\u0000\u018b\u018c\u0005s\u0000\u0000\u018c"+ - "\u018d\u0005e\u0000\u0000\u018d\u018e\u0005r\u0000\u0000\u018e\u018f\u0005"+ - "t\u0000\u0000\u018f\u000b\u0001\u0000\u0000\u0000\u0190\u0191\u0005a\u0000"+ - "\u0000\u0191\u0192\u0005s\u0000\u0000\u0192\u0193\u0005s\u0000\u0000\u0193"+ - "\u0194\u0005u\u0000\u0000\u0194\u0195\u0005m\u0000\u0000\u0195\u0196\u0005"+ - "e\u0000\u0000\u0196\r\u0001\u0000\u0000\u0000\u0197\u0198\u0005i\u0000"+ - "\u0000\u0198\u0199\u0005n\u0000\u0000\u0199\u019a\u0005h\u0000\u0000\u019a"+ - "\u019b\u0005a\u0000\u0000\u019b\u019c\u0005l\u0000\u0000\u019c\u019d\u0005"+ - "e\u0000\u0000\u019d\u000f\u0001\u0000\u0000\u0000\u019e\u019f\u0005e\u0000"+ - "\u0000\u019f\u01a0\u0005x\u0000\u0000\u01a0\u01a1\u0005h\u0000\u0000\u01a1"+ - "\u01a2\u0005a\u0000\u0000\u01a2\u01a3\u0005l\u0000\u0000\u01a3\u01a4\u0005"+ - "e\u0000\u0000\u01a4\u0011\u0001\u0000\u0000\u0000\u01a5\u01a6\u0005r\u0000"+ - "\u0000\u01a6\u01a7\u0005e\u0000\u0000\u01a7\u01a8\u0005q\u0000\u0000\u01a8"+ - "\u01a9\u0005u\u0000\u0000\u01a9\u01aa\u0005i\u0000\u0000\u01aa\u01ab\u0005"+ - "r\u0000\u0000\u01ab\u01ac\u0005e\u0000\u0000\u01ac\u01ad\u0005s\u0000"+ - "\u0000\u01ad\u0013\u0001\u0000\u0000\u0000\u01ae\u01af\u0005p\u0000\u0000"+ - "\u01af\u01b0\u0005r\u0000\u0000\u01b0\u01b1\u0005e\u0000\u0000\u01b1\u01b2"+ - "\u0005s\u0000\u0000\u01b2\u01b3\u0005e\u0000\u0000\u01b3\u01b4\u0005r"+ - "\u0000\u0000\u01b4\u01b5\u0005v\u0000\u0000\u01b5\u01b6\u0005e\u0000\u0000"+ - "\u01b6\u01b7\u0005s\u0000\u0000\u01b7\u0015\u0001\u0000\u0000\u0000\u01b8"+ - "\u01b9\u0005e\u0000\u0000\u01b9\u01ba\u0005n\u0000\u0000\u01ba\u01bb\u0005"+ - "s\u0000\u0000\u01bb\u01bc\u0005u\u0000\u0000\u01bc\u01bd\u0005r\u0000"+ - "\u0000\u01bd\u01be\u0005e\u0000\u0000\u01be\u01bf\u0005s\u0000\u0000\u01bf"+ - "\u0017\u0001\u0000\u0000\u0000\u01c0\u01c1\u0005i\u0000\u0000\u01c1\u01c2"+ - "\u0005n\u0000\u0000\u01c2\u01c3\u0005v\u0000\u0000\u01c3\u01c4\u0005a"+ - "\u0000\u0000\u01c4\u01c5\u0005r\u0000\u0000\u01c5\u01c6\u0005i\u0000\u0000"+ - "\u01c6\u01c7\u0005a\u0000\u0000\u01c7\u01c8\u0005n\u0000\u0000\u01c8\u01c9"+ - "\u0005t\u0000\u0000\u01c9\u0019\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005"+ - "d\u0000\u0000\u01cb\u01cc\u0005e\u0000\u0000\u01cc\u01cd\u0005c\u0000"+ - "\u0000\u01cd\u01ce\u0005r\u0000\u0000\u01ce\u01cf\u0005e\u0000\u0000\u01cf"+ - "\u01d0\u0005a\u0000\u0000\u01d0\u01d1\u0005s\u0000\u0000\u01d1\u01d2\u0005"+ - "e\u0000\u0000\u01d2\u01d3\u0005s\u0000\u0000\u01d3\u01d4\u0001\u0000\u0000"+ - "\u0000\u01d4\u01d5\u0006\f\u0000\u0000\u01d5\u001b\u0001\u0000\u0000\u0000"+ - "\u01d6\u01d7\u0005p\u0000\u0000\u01d7\u01d8\u0005u\u0000\u0000\u01d8\u01d9"+ - "\u0005r\u0000\u0000\u01d9\u01da\u0005e\u0000\u0000\u01da\u01db\u0001\u0000"+ - "\u0000\u0000\u01db\u01dc\u0006\r\u0000\u0000\u01dc\u001d\u0001\u0000\u0000"+ - "\u0000\u01dd\u01de\u0005i\u0000\u0000\u01de\u01df\u0005m\u0000\u0000\u01df"+ - "\u01e0\u0005p\u0000\u0000\u01e0\u01e1\u0005l\u0000\u0000\u01e1\u01e2\u0005"+ - "e\u0000\u0000\u01e2\u01e3\u0005m\u0000\u0000\u01e3\u01e4\u0005e\u0000"+ - "\u0000\u01e4\u01e5\u0005n\u0000\u0000\u01e5\u01e6\u0005t\u0000\u0000\u01e6"+ - "\u01e7\u0005s\u0000\u0000\u01e7\u001f\u0001\u0000\u0000\u0000\u01e8\u01e9"+ - "\u0005a\u0000\u0000\u01e9\u01ea\u0005s\u0000\u0000\u01ea!\u0001\u0000"+ - "\u0000\u0000\u01eb\u01ec\u0005o\u0000\u0000\u01ec\u01ed\u0005l\u0000\u0000"+ - "\u01ed\u01ee\u0005d\u0000\u0000\u01ee\u01ef\u0001\u0000\u0000\u0000\u01ef"+ - "\u01f0\u0006\u0010\u0000\u0000\u01f0#\u0001\u0000\u0000\u0000\u01f1\u01f2"+ - "\u0005b\u0000\u0000\u01f2\u01f3\u0005e\u0000\u0000\u01f3\u01f4\u0005f"+ - "\u0000\u0000\u01f4\u01f5\u0005o\u0000\u0000\u01f5\u01f6\u0005r\u0000\u0000"+ - "\u01f6\u01f7\u0005e\u0000\u0000\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f8"+ - "\u01f9\u0006\u0011\u0000\u0000\u01f9%\u0001\u0000\u0000\u0000\u01fa\u01fb"+ - "\u0005#\u0000\u0000\u01fb\u01fc\u0005l\u0000\u0000\u01fc\u01fd\u0005h"+ - "\u0000\u0000\u01fd\u01fe\u0005s\u0000\u0000\u01fe\'\u0001\u0000\u0000"+ - "\u0000\u01ff\u0200\u0005f\u0000\u0000\u0200\u0201\u0005o\u0000\u0000\u0201"+ - "\u0202\u0005r\u0000\u0000\u0202\u0203\u0005a\u0000\u0000\u0203\u0204\u0005"+ - "l\u0000\u0000\u0204\u0205\u0005l\u0000\u0000\u0205)\u0001\u0000\u0000"+ - "\u0000\u0206\u0207\u0005e\u0000\u0000\u0207\u0208\u0005x\u0000\u0000\u0208"+ - "\u0209\u0005i\u0000\u0000\u0209\u020a\u0005s\u0000\u0000\u020a\u020b\u0005"+ - "t\u0000\u0000\u020b\u020c\u0005s\u0000\u0000\u020c+\u0001\u0000\u0000"+ - "\u0000\u020d\u020e\u0005a\u0000\u0000\u020e\u020f\u0005c\u0000\u0000\u020f"+ - "\u0210\u0005c\u0000\u0000\u0210\u0211\u0001\u0000\u0000\u0000\u0211\u0212"+ - "\u0006\u0015\u0000\u0000\u0212-\u0001\u0000\u0000\u0000\u0213\u0214\u0005"+ - "f\u0000\u0000\u0214\u0215\u0005o\u0000\u0000\u0215\u0216\u0005l\u0000"+ - "\u0000\u0216\u0217\u0005d\u0000\u0000\u0217/\u0001\u0000\u0000\u0000\u0218"+ - "\u0219\u0005u\u0000\u0000\u0219\u021a\u0005n\u0000\u0000\u021a\u021b\u0005"+ - "f\u0000\u0000\u021b\u021c\u0005o\u0000\u0000\u021c\u021d\u0005l\u0000"+ - "\u0000\u021d\u021e\u0005d\u0000\u0000\u021e1\u0001\u0000\u0000\u0000\u021f"+ - "\u0220\u0005u\u0000\u0000\u0220\u0221\u0005n\u0000\u0000\u0221\u0222\u0005"+ - "f\u0000\u0000\u0222\u0223\u0005o\u0000\u0000\u0223\u0224\u0005l\u0000"+ - "\u0000\u0224\u0225\u0005d\u0000\u0000\u0225\u0226\u0005i\u0000\u0000\u0226"+ - "\u0227\u0005n\u0000\u0000\u0227\u0228\u0005g\u0000\u0000\u02283\u0001"+ - "\u0000\u0000\u0000\u0229\u022a\u0005l\u0000\u0000\u022a\u022b\u0005e\u0000"+ - "\u0000\u022b\u022c\u0005t\u0000\u0000\u022c5\u0001\u0000\u0000\u0000\u022d"+ - "\u022e\u0005g\u0000\u0000\u022e\u022f\u0005h\u0000\u0000\u022f\u0230\u0005"+ - "o\u0000\u0000\u0230\u0231\u0005s\u0000\u0000\u0231\u0232\u0005t\u0000"+ - "\u0000\u02327\u0001\u0000\u0000\u0000\u0233\u0234\u0005i\u0000\u0000\u0234"+ - "\u0235\u0005n\u0000\u0000\u02359\u0001\u0000\u0000\u0000\u0236\u0237\u0005"+ - "#\u0000\u0000\u0237;\u0001\u0000\u0000\u0000\u0238\u0239\u0005s\u0000"+ - "\u0000\u0239\u023a\u0005u\u0000\u0000\u023a\u023b\u0005b\u0000\u0000\u023b"+ - "\u023c\u0005s\u0000\u0000\u023c\u023d\u0005e\u0000\u0000\u023d\u023e\u0005"+ - "t\u0000\u0000\u023e=\u0001\u0000\u0000\u0000\u023f\u0240\u0005u\u0000"+ - "\u0000\u0240\u0241\u0005n\u0000\u0000\u0241\u0242\u0005i\u0000\u0000\u0242"+ - "\u0243\u0005o\u0000\u0000\u0243\u0244\u0005n\u0000\u0000\u0244?\u0001"+ - "\u0000\u0000\u0000\u0245\u0246\u0005i\u0000\u0000\u0246\u0247\u0005n\u0000"+ - "\u0000\u0247\u0248\u0005t\u0000\u0000\u0248\u0249\u0005e\u0000\u0000\u0249"+ - "\u024a\u0005r\u0000\u0000\u024a\u024b\u0005s\u0000\u0000\u024b\u024c\u0005"+ - "e\u0000\u0000\u024c\u024d\u0005c\u0000\u0000\u024d\u024e\u0005t\u0000"+ - "\u0000\u024e\u024f\u0005i\u0000\u0000\u024f\u0250\u0005o\u0000\u0000\u0250"+ - "\u0251\u0005n\u0000\u0000\u0251A\u0001\u0000\u0000\u0000\u0252\u0253\u0005"+ - "s\u0000\u0000\u0253\u0254\u0005e\u0000\u0000\u0254\u0255\u0005t\u0000"+ - "\u0000\u0255\u0256\u0005m\u0000\u0000\u0256\u0257\u0005i\u0000\u0000\u0257"+ - "\u0258\u0005n\u0000\u0000\u0258\u0259\u0005u\u0000\u0000\u0259\u025a\u0005"+ - "s\u0000\u0000\u025aC\u0001\u0000\u0000\u0000\u025b\u025c\u0005=\u0000"+ - "\u0000\u025c\u025d\u0005=\u0000\u0000\u025d\u025e\u0005>\u0000\u0000\u025e"+ - "E\u0001\u0000\u0000\u0000\u025f\u0260\u0005-\u0000\u0000\u0260\u0261\u0005"+ - "-\u0000\u0000\u0261\u0262\u0005*\u0000\u0000\u0262G\u0001\u0000\u0000"+ - "\u0000\u0263\u0264\u0005a\u0000\u0000\u0264\u0265\u0005p\u0000\u0000\u0265"+ - "\u0266\u0005p\u0000\u0000\u0266\u0267\u0005l\u0000\u0000\u0267\u0268\u0005"+ - "y\u0000\u0000\u0268I\u0001\u0000\u0000\u0000\u0269\u026a\u0005?\u0000"+ - "\u0000\u026aK\u0001\u0000\u0000\u0000\u026b\u026c\u0005!\u0000\u0000\u026c"+ - "\u026d\u0005<\u0000\u0000\u026dM\u0001\u0000\u0000\u0000\u026e\u026f\u0005"+ - "!\u0000\u0000\u026f\u0270\u0005>\u0000\u0000\u0270\u0271\u0001\u0000\u0000"+ - "\u0000\u0271\u0272\u0006&\u0000\u0000\u0272O\u0001\u0000\u0000\u0000\u0273"+ - "\u0274\u0005s\u0000\u0000\u0274\u0275\u0005e\u0000\u0000\u0275\u0276\u0005"+ - "q\u0000\u0000\u0276\u0277\u0001\u0000\u0000\u0000\u0277\u0278\u0006\'"+ - "\u0000\u0000\u0278Q\u0001\u0000\u0000\u0000\u0279\u027a\u0005s\u0000\u0000"+ - "\u027a\u027b\u0005e\u0000\u0000\u027b\u027c\u0005t\u0000\u0000\u027c\u027d"+ - "\u0001\u0000\u0000\u0000\u027d\u027e\u0006(\u0000\u0000\u027eS\u0001\u0000"+ - "\u0000\u0000\u027f\u0280\u0005m\u0000\u0000\u0280\u0281\u0005s\u0000\u0000"+ - "\u0281\u0282\u0005e\u0000\u0000\u0282\u0283\u0005t\u0000\u0000\u0283\u0284"+ - "\u0001\u0000\u0000\u0000\u0284\u0285\u0006)\u0000\u0000\u0285U\u0001\u0000"+ - "\u0000\u0000\u0286\u0287\u0005d\u0000\u0000\u0287\u0288\u0005i\u0000\u0000"+ - "\u0288\u0289\u0005c\u0000\u0000\u0289\u028a\u0005t\u0000\u0000\u028a\u028b"+ - "\u0001\u0000\u0000\u0000\u028b\u028c\u0006*\u0000\u0000\u028cW\u0001\u0000"+ - "\u0000\u0000\u028d\u028e\u0005o\u0000\u0000\u028e\u028f\u0005p\u0000\u0000"+ - "\u028f\u0290\u0005t\u0000\u0000\u0290\u0291\u0005i\u0000\u0000\u0291\u0292"+ - "\u0005o\u0000\u0000\u0292\u0293\u0005n\u0000\u0000\u0293\u0294\u0001\u0000"+ - "\u0000\u0000\u0294\u0295\u0006+\u0000\u0000\u0295Y\u0001\u0000\u0000\u0000"+ - "\u0296\u0297\u0005l\u0000\u0000\u0297\u0298\u0005e\u0000\u0000\u0298\u0299"+ - "\u0005n\u0000\u0000\u0299\u029a\u0001\u0000\u0000\u0000\u029a\u029b\u0006"+ - ",\u0000\u0000\u029b[\u0001\u0000\u0000\u0000\u029c\u029d\u0005n\u0000"+ - "\u0000\u029d\u029e\u0005e\u0000\u0000\u029e\u029f\u0005w\u0000\u0000\u029f"+ - "\u02a0\u0001\u0000\u0000\u0000\u02a0\u02a1\u0006-\u0000\u0000\u02a1]\u0001"+ - "\u0000\u0000\u0000\u02a2\u02a3\u0005m\u0000\u0000\u02a3\u02a4\u0005a\u0000"+ - "\u0000\u02a4\u02a5\u0005k\u0000\u0000\u02a5\u02a6\u0005e\u0000\u0000\u02a6"+ - "\u02a7\u0001\u0000\u0000\u0000\u02a7\u02a8\u0006.\u0000\u0000\u02a8_\u0001"+ - "\u0000\u0000\u0000\u02a9\u02aa\u0005c\u0000\u0000\u02aa\u02ab\u0005a\u0000"+ - "\u0000\u02ab\u02ac\u0005p\u0000\u0000\u02ac\u02ad\u0001\u0000\u0000\u0000"+ - "\u02ad\u02ae\u0006/\u0000\u0000\u02aea\u0001\u0000\u0000\u0000\u02af\u02b0"+ - "\u0005s\u0000\u0000\u02b0\u02b1\u0005o\u0000\u0000\u02b1\u02b2\u0005m"+ - "\u0000\u0000\u02b2\u02b3\u0005e\u0000\u0000\u02b3\u02b4\u0001\u0000\u0000"+ - "\u0000\u02b4\u02b5\u00060\u0000\u0000\u02b5c\u0001\u0000\u0000\u0000\u02b6"+ - "\u02b7\u0005g\u0000\u0000\u02b7\u02b8\u0005e\u0000\u0000\u02b8\u02b9\u0005"+ - "t\u0000\u0000\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bb\u00061\u0000"+ - "\u0000\u02bbe\u0001\u0000\u0000\u0000\u02bc\u02bd\u0005d\u0000\u0000\u02bd"+ - "\u02be\u0005o\u0000\u0000\u02be\u02bf\u0005m\u0000\u0000\u02bf\u02c0\u0005"+ - "a\u0000\u0000\u02c0\u02c1\u0005i\u0000\u0000\u02c1\u02c2\u0005n\u0000"+ - "\u0000\u02c2\u02c3\u0001\u0000\u0000\u0000\u02c3\u02c4\u00062\u0000\u0000"+ - "\u02c4g\u0001\u0000\u0000\u0000\u02c5\u02c6\u0005a\u0000\u0000\u02c6\u02c7"+ - "\u0005x\u0000\u0000\u02c7\u02c8\u0005i\u0000\u0000\u02c8\u02c9\u0005o"+ - "\u0000\u0000\u02c9\u02ca\u0005m\u0000\u0000\u02ca\u02cb\u0001\u0000\u0000"+ - "\u0000\u02cb\u02cc\u00063\u0000\u0000\u02cci\u0001\u0000\u0000\u0000\u02cd"+ - "\u02ce\u0005a\u0000\u0000\u02ce\u02cf\u0005d\u0000\u0000\u02cf\u02d0\u0005"+ - "t\u0000\u0000\u02d0\u02d1\u0001\u0000\u0000\u0000\u02d1\u02d2\u00064\u0000"+ - "\u0000\u02d2k\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005m\u0000\u0000\u02d4"+ - "\u02d5\u0005a\u0000\u0000\u02d5\u02d6\u0005t\u0000\u0000\u02d6\u02d7\u0005"+ - "c\u0000\u0000\u02d7\u02d8\u0005h\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000"+ - "\u0000\u02d9\u02da\u00065\u0000\u0000\u02dam\u0001\u0000\u0000\u0000\u02db"+ - "\u02dc\u0005n\u0000\u0000\u02dc\u02dd\u0005o\u0000\u0000\u02dd\u02de\u0005"+ - "n\u0000\u0000\u02de\u02df\u0005e\u0000\u0000\u02df\u02e0\u0001\u0000\u0000"+ - "\u0000\u02e0\u02e1\u00066\u0000\u0000\u02e1o\u0001\u0000\u0000\u0000\u02e2"+ - "\u02e3\u0005p\u0000\u0000\u02e3\u02e4\u0005r\u0000\u0000\u02e4\u02e5\u0005"+ - "e\u0000\u0000\u02e5\u02e6\u0005d\u0000\u0000\u02e6q\u0001\u0000\u0000"+ - "\u0000\u02e7\u02e8\u0005t\u0000\u0000\u02e8\u02e9\u0005y\u0000\u0000\u02e9"+ - "\u02ea\u0005p\u0000\u0000\u02ea\u02eb\u0005e\u0000\u0000\u02eb\u02ec\u0005"+ - "O\u0000\u0000\u02ec\u02ed\u0005f\u0000\u0000\u02ed\u02ee\u0001\u0000\u0000"+ - "\u0000\u02ee\u02ef\u00068\u0000\u0000\u02efs\u0001\u0000\u0000\u0000\u02f0"+ - "\u02f1\u0005i\u0000\u0000\u02f1\u02f2\u0005s\u0000\u0000\u02f2\u02f3\u0005"+ - "C\u0000\u0000\u02f3\u02f4\u0005o\u0000\u0000\u02f4\u02f5\u0005m\u0000"+ - "\u0000\u02f5\u02f6\u0005p\u0000\u0000\u02f6\u02f7\u0005a\u0000\u0000\u02f7"+ - "\u02f8\u0005r\u0000\u0000\u02f8\u02f9\u0005a\u0000\u0000\u02f9\u02fa\u0005"+ - "b\u0000\u0000\u02fa\u02fb\u0005l\u0000\u0000\u02fb\u02fc\u0005e\u0000"+ - "\u0000\u02fc\u02fd\u0001\u0000\u0000\u0000\u02fd\u02fe\u00069\u0000\u0000"+ - "\u02feu\u0001\u0000\u0000\u0000\u02ff\u0300\u0005s\u0000\u0000\u0300\u0301"+ - "\u0005h\u0000\u0000\u0301\u0302\u0005a\u0000\u0000\u0302\u0303\u0005r"+ - "\u0000\u0000\u0303\u0304\u0005e\u0000\u0000\u0304w\u0001\u0000\u0000\u0000"+ - "\u0305\u0306\u0005@\u0000\u0000\u0306\u0307\u0001\u0000\u0000\u0000\u0307"+ - "\u0308\u0006;\u0000\u0000\u0308y\u0001\u0000\u0000\u0000\u0309\u030a\u0005"+ - ".\u0000\u0000\u030a\u030b\u0005.\u0000\u0000\u030b{\u0001\u0000\u0000"+ - "\u0000\u030c\u030d\u0005s\u0000\u0000\u030d\u030e\u0005h\u0000\u0000\u030e"+ - "\u030f\u0005a\u0000\u0000\u030f\u0310\u0005r\u0000\u0000\u0310\u0311\u0005"+ - "e\u0000\u0000\u0311\u0312\u0005d\u0000\u0000\u0312}\u0001\u0000\u0000"+ - "\u0000\u0313\u0314\u0005e\u0000\u0000\u0314\u0315\u0005x\u0000\u0000\u0315"+ - "\u0316\u0005c\u0000\u0000\u0316\u0317\u0005l\u0000\u0000\u0317\u0318\u0005"+ - "u\u0000\u0000\u0318\u0319\u0005s\u0000\u0000\u0319\u031a\u0005i\u0000"+ - "\u0000\u031a\u031b\u0005v\u0000\u0000\u031b\u031c\u0005e\u0000\u0000\u031c"+ - "\u007f\u0001\u0000\u0000\u0000\u031d\u031e\u0005p\u0000\u0000\u031e\u031f"+ - "\u0005r\u0000\u0000\u031f\u0320\u0005e\u0000\u0000\u0320\u0321\u0005d"+ - "\u0000\u0000\u0321\u0322\u0005i\u0000\u0000\u0322\u0323\u0005c\u0000\u0000"+ - "\u0323\u0324\u0005a\u0000\u0000\u0324\u0325\u0005t\u0000\u0000\u0325\u0326"+ - "\u0005e\u0000\u0000\u0326\u0081\u0001\u0000\u0000\u0000\u0327\u0328\u0005"+ - "w\u0000\u0000\u0328\u0329\u0005r\u0000\u0000\u0329\u032a\u0005i\u0000"+ - "\u0000\u032a\u032b\u0005t\u0000\u0000\u032b\u032c\u0005e\u0000\u0000\u032c"+ - "\u032d\u0005P\u0000\u0000\u032d\u032e\u0005e\u0000\u0000\u032e\u032f\u0005"+ - "r\u0000\u0000\u032f\u0330\u0005m\u0000\u0000\u0330\u0331\u0001\u0000\u0000"+ - "\u0000\u0331\u0332\u0006@\u0000\u0000\u0332\u0083\u0001\u0000\u0000\u0000"+ - "\u0333\u0334\u0005n\u0000\u0000\u0334\u0335\u0005o\u0000\u0000\u0335\u0336"+ - "\u0005P\u0000\u0000\u0336\u0337\u0005e\u0000\u0000\u0337\u0338\u0005r"+ - "\u0000\u0000\u0338\u0339\u0005m\u0000\u0000\u0339\u033a\u0001\u0000\u0000"+ - "\u0000\u033a\u033b\u0006A\u0000\u0000\u033b\u0085\u0001\u0000\u0000\u0000"+ - "\u033c\u033d\u0005t\u0000\u0000\u033d\u033e\u0005r\u0000\u0000\u033e\u033f"+ - "\u0005u\u0000\u0000\u033f\u0340\u0005s\u0000\u0000\u0340\u0341\u0005t"+ - "\u0000\u0000\u0341\u0342\u0005e\u0000\u0000\u0342\u0343\u0005d\u0000\u0000"+ - "\u0343\u0344\u0001\u0000\u0000\u0000\u0344\u0345\u0006B\u0000\u0000\u0345"+ - "\u0087\u0001\u0000\u0000\u0000\u0346\u0347\u0005o\u0000\u0000\u0347\u0348"+ - "\u0005u\u0000\u0000\u0348\u0349\u0005t\u0000\u0000\u0349\u034a\u0005l"+ - "\u0000\u0000\u034a\u034b\u0005i\u0000\u0000\u034b\u034c\u0005n\u0000\u0000"+ - "\u034c\u034d\u0005e\u0000\u0000\u034d\u0089\u0001\u0000\u0000\u0000\u034e"+ - "\u034f\u0005i\u0000\u0000\u034f\u0350\u0005n\u0000\u0000\u0350\u0351\u0005"+ - "i\u0000\u0000\u0351\u0352\u0005t\u0000\u0000\u0352\u0353\u0005E\u0000"+ - "\u0000\u0353\u0354\u0005n\u0000\u0000\u0354\u0355\u0005s\u0000\u0000\u0355"+ - "\u0356\u0005u\u0000\u0000\u0356\u0357\u0005r\u0000\u0000\u0357\u0358\u0005"+ - "e\u0000\u0000\u0358\u0359\u0005s\u0000\u0000\u0359\u008b\u0001\u0000\u0000"+ - "\u0000\u035a\u035b\u0005i\u0000\u0000\u035b\u035c\u0005m\u0000\u0000\u035c"+ - "\u035d\u0005p\u0000\u0000\u035d\u035e\u0005o\u0000\u0000\u035e\u035f\u0005"+ - "r\u0000\u0000\u035f\u0360\u0005t\u0000\u0000\u0360\u0361\u0005R\u0000"+ - "\u0000\u0361\u0362\u0005e\u0000\u0000\u0362\u0363\u0005q\u0000\u0000\u0363"+ - "\u0364\u0005u\u0000\u0000\u0364\u0365\u0005i\u0000\u0000\u0365\u0366\u0005"+ - "r\u0000\u0000\u0366\u0367\u0005e\u0000\u0000\u0367\u0368\u0005s\u0000"+ - "\u0000\u0368\u008d\u0001\u0000\u0000\u0000\u0369\u036a\u0005p\u0000\u0000"+ - "\u036a\u036b\u0005r\u0000\u0000\u036b\u036c\u0005o\u0000\u0000\u036c\u036d"+ - "\u0005o\u0000\u0000\u036d\u036e\u0005f\u0000\u0000\u036e\u008f\u0001\u0000"+ - "\u0000\u0000\u036f\u0370\u0005=\u0000\u0000\u0370\u0371\u0005=\u0000\u0000"+ - "\u0371\u0372\u0005=\u0000\u0000\u0372\u0091\u0001\u0000\u0000\u0000\u0373"+ - "\u0374\u0005!\u0000\u0000\u0374\u0375\u0005=\u0000\u0000\u0375\u0376\u0005"+ - "=\u0000\u0000\u0376\u0093\u0001\u0000\u0000\u0000\u0377\u0378\u0005w\u0000"+ - "\u0000\u0378\u0379\u0005i\u0000\u0000\u0379\u037a\u0005t\u0000\u0000\u037a"+ - "\u037b\u0005h\u0000\u0000\u037b\u0095\u0001\u0000\u0000\u0000\u037c\u037d"+ - "\u0005o\u0000\u0000\u037d\u037e\u0005p\u0000\u0000\u037e\u037f\u0005a"+ - "\u0000\u0000\u037f\u0380\u0005q\u0000\u0000\u0380\u0381\u0005u\u0000\u0000"+ - "\u0381\u0382\u0005e\u0000\u0000\u0382\u0383\u0001\u0000\u0000\u0000\u0383"+ - "\u0384\u0006J\u0000\u0000\u0384\u0097\u0001\u0000\u0000\u0000\u0385\u0386"+ - "\u0005r\u0000\u0000\u0386\u0387\u0005e\u0000\u0000\u0387\u0388\u0005v"+ - "\u0000\u0000\u0388\u0389\u0005e\u0000\u0000\u0389\u038a\u0005a\u0000\u0000"+ - "\u038a\u038b\u0005l\u0000\u0000\u038b\u0099\u0001\u0000\u0000\u0000\u038c"+ - "\u038d\u0005b\u0000\u0000\u038d\u038e\u0005r\u0000\u0000\u038e\u038f\u0005"+ - "e\u0000\u0000\u038f\u0390\u0005a\u0000\u0000\u0390\u0391\u0005k\u0000"+ - "\u0000\u0391\u0392\u0001\u0000\u0000\u0000\u0392\u0393\u0006L\u0000\u0000"+ - "\u0393\u009b\u0001\u0000\u0000\u0000\u0394\u0395\u0005d\u0000\u0000\u0395"+ - "\u0396\u0005e\u0000\u0000\u0396\u0397\u0005f\u0000\u0000\u0397\u0398\u0005"+ - "a\u0000\u0000\u0398\u0399\u0005u\u0000\u0000\u0399\u039a\u0005l\u0000"+ - "\u0000\u039a\u039b\u0005t\u0000\u0000\u039b\u009d\u0001\u0000\u0000\u0000"+ - "\u039c\u039d\u0005f\u0000\u0000\u039d\u039e\u0005u\u0000\u0000\u039e\u039f"+ - "\u0005n\u0000\u0000\u039f\u03a0\u0005c\u0000\u0000\u03a0\u009f\u0001\u0000"+ - "\u0000\u0000\u03a1\u03a2\u0005i\u0000\u0000\u03a2\u03a3\u0005n\u0000\u0000"+ - "\u03a3\u03a4\u0005t\u0000\u0000\u03a4\u03a5\u0005e\u0000\u0000\u03a5\u03a6"+ - "\u0005r\u0000\u0000\u03a6\u03a7\u0005f\u0000\u0000\u03a7\u03a8\u0005a"+ - "\u0000\u0000\u03a8\u03a9\u0005c\u0000\u0000\u03a9\u03aa\u0005e\u0000\u0000"+ - "\u03aa\u00a1\u0001\u0000\u0000\u0000\u03ab\u03ac\u0005s\u0000\u0000\u03ac"+ - "\u03ad\u0005e\u0000\u0000\u03ad\u03ae\u0005l\u0000\u0000\u03ae\u03af\u0005"+ - "e\u0000\u0000\u03af\u03b0\u0005c\u0000\u0000\u03b0\u03b1\u0005t\u0000"+ - "\u0000\u03b1\u00a3\u0001\u0000\u0000\u0000\u03b2\u03b3\u0005c\u0000\u0000"+ - "\u03b3\u03b4\u0005a\u0000\u0000\u03b4\u03b5\u0005s\u0000\u0000\u03b5\u03b6"+ - "\u0005e\u0000\u0000\u03b6\u00a5\u0001\u0000\u0000\u0000\u03b7\u03b8\u0005"+ - "d\u0000\u0000\u03b8\u03b9\u0005e\u0000\u0000\u03b9\u03ba\u0005f\u0000"+ - "\u0000\u03ba\u03bb\u0005e\u0000\u0000\u03bb\u03bc\u0005r\u0000\u0000\u03bc"+ - "\u00a7\u0001\u0000\u0000\u0000\u03bd\u03be\u0005g\u0000\u0000\u03be\u03bf"+ - "\u0005o\u0000\u0000\u03bf\u00a9\u0001\u0000\u0000\u0000\u03c0\u03c1\u0005"+ - "m\u0000\u0000\u03c1\u03c2\u0005a\u0000\u0000\u03c2\u03c3\u0005p\u0000"+ - "\u0000\u03c3\u00ab\u0001\u0000\u0000\u0000\u03c4\u03c5\u0005s\u0000\u0000"+ - "\u03c5\u03c6\u0005t\u0000\u0000\u03c6\u03c7\u0005r\u0000\u0000\u03c7\u03c8"+ - "\u0005u\u0000\u0000\u03c8\u03c9\u0005c\u0000\u0000\u03c9\u03ca\u0005t"+ - "\u0000\u0000\u03ca\u00ad\u0001\u0000\u0000\u0000\u03cb\u03cc\u0005c\u0000"+ - "\u0000\u03cc\u03cd\u0005h\u0000\u0000\u03cd\u03ce\u0005a\u0000\u0000\u03ce"+ - "\u03cf\u0005n\u0000\u0000\u03cf\u00af\u0001\u0000\u0000\u0000\u03d0\u03d1"+ - "\u0005e\u0000\u0000\u03d1\u03d2\u0005l\u0000\u0000\u03d2\u03d3\u0005s"+ - "\u0000\u0000\u03d3\u03d4\u0005e\u0000\u0000\u03d4\u00b1\u0001\u0000\u0000"+ - "\u0000\u03d5\u03d6\u0005g\u0000\u0000\u03d6\u03d7\u0005o\u0000\u0000\u03d7"+ - "\u03d8\u0005t\u0000\u0000\u03d8\u03d9\u0005o\u0000\u0000\u03d9\u00b3\u0001"+ - "\u0000\u0000\u0000\u03da\u03db\u0005p\u0000\u0000\u03db\u03dc\u0005a\u0000"+ - "\u0000\u03dc\u03dd\u0005c\u0000\u0000\u03dd\u03de\u0005k\u0000\u0000\u03de"+ - "\u03df\u0005a\u0000\u0000\u03df\u03e0\u0005g\u0000\u0000\u03e0\u03e1\u0005"+ - "e\u0000\u0000\u03e1\u00b5\u0001\u0000\u0000\u0000\u03e2\u03e3\u0005s\u0000"+ - "\u0000\u03e3\u03e4\u0005w\u0000\u0000\u03e4\u03e5\u0005i\u0000\u0000\u03e5"+ - "\u03e6\u0005t\u0000\u0000\u03e6\u03e7\u0005c\u0000\u0000\u03e7\u03e8\u0005"+ - "h\u0000\u0000\u03e8\u00b7\u0001\u0000\u0000\u0000\u03e9\u03ea\u0005c\u0000"+ - "\u0000\u03ea\u03eb\u0005o\u0000\u0000\u03eb\u03ec\u0005n\u0000\u0000\u03ec"+ - "\u03ed\u0005s\u0000\u0000\u03ed\u03ee\u0005t\u0000\u0000\u03ee\u00b9\u0001"+ - "\u0000\u0000\u0000\u03ef\u03f0\u0005f\u0000\u0000\u03f0\u03f1\u0005a\u0000"+ - "\u0000\u03f1\u03f2\u0005l\u0000\u0000\u03f2\u03f3\u0005l\u0000\u0000\u03f3"+ - "\u03f4\u0005t\u0000\u0000\u03f4\u03f5\u0005h\u0000\u0000\u03f5\u03f6\u0005"+ - "r\u0000\u0000\u03f6\u03f7\u0005o\u0000\u0000\u03f7\u03f8\u0005u\u0000"+ - "\u0000\u03f8\u03f9\u0005g\u0000\u0000\u03f9\u03fa\u0005h\u0000\u0000\u03fa"+ - "\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0006\\\u0000\u0000\u03fc\u00bb"+ - "\u0001\u0000\u0000\u0000\u03fd\u03fe\u0005i\u0000\u0000\u03fe\u03ff\u0005"+ - "f\u0000\u0000\u03ff\u00bd\u0001\u0000\u0000\u0000\u0400\u0401\u0005r\u0000"+ - "\u0000\u0401\u0402\u0005a\u0000\u0000\u0402\u0403\u0005n\u0000\u0000\u0403"+ - "\u0404\u0005g\u0000\u0000\u0404\u0405\u0005e\u0000\u0000\u0405\u00bf\u0001"+ - "\u0000\u0000\u0000\u0406\u0407\u0005t\u0000\u0000\u0407\u0408\u0005y\u0000"+ - "\u0000\u0408\u0409\u0005p\u0000\u0000\u0409\u040a\u0005e\u0000\u0000\u040a"+ - "\u00c1\u0001\u0000\u0000\u0000\u040b\u040c\u0005c\u0000\u0000\u040c\u040d"+ - "\u0005o\u0000\u0000\u040d\u040e\u0005n\u0000\u0000\u040e\u040f\u0005t"+ - "\u0000\u0000\u040f\u0410\u0005i\u0000\u0000\u0410\u0411\u0005n\u0000\u0000"+ - "\u0411\u0412\u0005u\u0000\u0000\u0412\u0413\u0005e\u0000\u0000\u0413\u0414"+ - "\u0001\u0000\u0000\u0000\u0414\u0415\u0006`\u0000\u0000\u0415\u00c3\u0001"+ - "\u0000\u0000\u0000\u0416\u0417\u0005f\u0000\u0000\u0417\u0418\u0005o\u0000"+ - "\u0000\u0418\u0419\u0005r\u0000\u0000\u0419\u00c5\u0001\u0000\u0000\u0000"+ - "\u041a\u041b\u0005i\u0000\u0000\u041b\u041c\u0005m\u0000\u0000\u041c\u041d"+ - "\u0005p\u0000\u0000\u041d\u041e\u0005o\u0000\u0000\u041e\u041f\u0005r"+ - "\u0000\u0000\u041f\u0420\u0005t\u0000\u0000\u0420\u00c7\u0001\u0000\u0000"+ - "\u0000\u0421\u0422\u0005r\u0000\u0000\u0422\u0423\u0005e\u0000\u0000\u0423"+ - "\u0424\u0005t\u0000\u0000\u0424\u0425\u0005u\u0000\u0000\u0425\u0426\u0005"+ - "r\u0000\u0000\u0426\u0427\u0005n\u0000\u0000\u0427\u0428\u0001\u0000\u0000"+ - "\u0000\u0428\u0429\u0006c\u0000\u0000\u0429\u00c9\u0001\u0000\u0000\u0000"+ - "\u042a\u042b\u0005v\u0000\u0000\u042b\u042c\u0005a\u0000\u0000\u042c\u042d"+ - "\u0005r\u0000\u0000\u042d\u00cb\u0001\u0000\u0000\u0000\u042e\u042f\u0005"+ - "n\u0000\u0000\u042f\u0430\u0005i\u0000\u0000\u0430\u0431\u0005l\u0000"+ - "\u0000\u0431\u0432\u0001\u0000\u0000\u0000\u0432\u0433\u0006e\u0000\u0000"+ - "\u0433\u00cd\u0001\u0000\u0000\u0000\u0434\u0439\u0003\u0150\u00a7\u0000"+ - "\u0435\u0438\u0003\u0150\u00a7\u0000\u0436\u0438\u0003\u0152\u00a8\u0000"+ - "\u0437\u0435\u0001\u0000\u0000\u0000\u0437\u0436\u0001\u0000\u0000\u0000"+ - "\u0438\u043b\u0001\u0000\u0000\u0000\u0439\u0437\u0001\u0000\u0000\u0000"+ - "\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043c\u0001\u0000\u0000\u0000"+ - "\u043b\u0439\u0001\u0000\u0000\u0000\u043c\u043d\u0006f\u0000\u0000\u043d"+ - "\u00cf\u0001\u0000\u0000\u0000\u043e\u043f\u0005(\u0000\u0000\u043f\u00d1"+ - "\u0001\u0000\u0000\u0000\u0440\u0441\u0005)\u0000\u0000\u0441\u0442\u0001"+ - "\u0000\u0000\u0000\u0442\u0443\u0006h\u0000\u0000\u0443\u00d3\u0001\u0000"+ - "\u0000\u0000\u0444\u0445\u0005{\u0000\u0000\u0445\u00d5\u0001\u0000\u0000"+ - "\u0000\u0446\u0447\u0005}\u0000\u0000\u0447\u0448\u0001\u0000\u0000\u0000"+ - "\u0448\u0449\u0006j\u0000\u0000\u0449\u00d7\u0001\u0000\u0000\u0000\u044a"+ - "\u044b\u0005[\u0000\u0000\u044b\u00d9\u0001\u0000\u0000\u0000\u044c\u044d"+ - "\u0005]\u0000\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f\u0006"+ - "l\u0000\u0000\u044f\u00db\u0001\u0000\u0000\u0000\u0450\u0451\u0005=\u0000"+ - "\u0000\u0451\u00dd\u0001\u0000\u0000\u0000\u0452\u0453\u0005,\u0000\u0000"+ - "\u0453\u00df\u0001\u0000\u0000\u0000\u0454\u0455\u0005;\u0000\u0000\u0455"+ - "\u00e1\u0001\u0000\u0000\u0000\u0456\u0457\u0005:\u0000\u0000\u0457\u00e3"+ - "\u0001\u0000\u0000\u0000\u0458\u0459\u0005.\u0000\u0000\u0459\u00e5\u0001"+ - "\u0000\u0000\u0000\u045a\u045b\u0005+\u0000\u0000\u045b\u045c\u0005+\u0000"+ - "\u0000\u045c\u045d\u0001\u0000\u0000\u0000\u045d\u045e\u0006r\u0000\u0000"+ - "\u045e\u00e7\u0001\u0000\u0000\u0000\u045f\u0460\u0005-\u0000\u0000\u0460"+ - "\u0461\u0005-\u0000\u0000\u0461\u0462\u0001\u0000\u0000\u0000\u0462\u0463"+ - "\u0006s\u0000\u0000\u0463\u00e9\u0001\u0000\u0000\u0000\u0464\u0465\u0005"+ - ":\u0000\u0000\u0465\u0466\u0005=\u0000\u0000\u0466\u00eb\u0001\u0000\u0000"+ - "\u0000\u0467\u0468\u0005.\u0000\u0000\u0468\u0469\u0005.\u0000\u0000\u0469"+ - "\u046a\u0005.\u0000\u0000\u046a\u00ed\u0001\u0000\u0000\u0000\u046b\u046c"+ - "\u0005|\u0000\u0000\u046c\u046d\u0005|\u0000\u0000\u046d\u00ef\u0001\u0000"+ - "\u0000\u0000\u046e\u046f\u0005&\u0000\u0000\u046f\u0470\u0005&\u0000\u0000"+ - "\u0470\u00f1\u0001\u0000\u0000\u0000\u0471\u0472\u0005=\u0000\u0000\u0472"+ - "\u0473\u0005=\u0000\u0000\u0473\u00f3\u0001\u0000\u0000\u0000\u0474\u0475"+ - "\u0005!\u0000\u0000\u0475\u0476\u0005=\u0000\u0000\u0476\u00f5\u0001\u0000"+ - "\u0000\u0000\u0477\u0478\u0005<\u0000\u0000\u0478\u00f7\u0001\u0000\u0000"+ - "\u0000\u0479\u047a\u0005<\u0000\u0000\u047a\u047b\u0005=\u0000\u0000\u047b"+ - "\u00f9\u0001\u0000\u0000\u0000\u047c\u047d\u0005>\u0000\u0000\u047d\u00fb"+ - "\u0001\u0000\u0000\u0000\u047e\u047f\u0005>\u0000\u0000\u047f\u0480\u0005"+ - "=\u0000\u0000\u0480\u00fd\u0001\u0000\u0000\u0000\u0481\u0482\u0005|\u0000"+ - "\u0000\u0482\u00ff\u0001\u0000\u0000\u0000\u0483\u0484\u0005/\u0000\u0000"+ - "\u0484\u0101\u0001\u0000\u0000\u0000\u0485\u0486\u0005%\u0000\u0000\u0486"+ - "\u0103\u0001\u0000\u0000\u0000\u0487\u0488\u0005<\u0000\u0000\u0488\u0489"+ - "\u0005<\u0000\u0000\u0489\u0105\u0001\u0000\u0000\u0000\u048a\u048b\u0005"+ - ">\u0000\u0000\u048b\u048c\u0005>\u0000\u0000\u048c\u0107\u0001\u0000\u0000"+ - "\u0000\u048d\u048e\u0005&\u0000\u0000\u048e\u048f\u0005^\u0000\u0000\u048f"+ - "\u0109\u0001\u0000\u0000\u0000\u0490\u0491\u0005!\u0000\u0000\u0491\u010b"+ - "\u0001\u0000\u0000\u0000\u0492\u0493\u0005+\u0000\u0000\u0493\u010d\u0001"+ - "\u0000\u0000\u0000\u0494\u0495\u0005-\u0000\u0000\u0495\u010f\u0001\u0000"+ - "\u0000\u0000\u0496\u0497\u0005^\u0000\u0000\u0497\u0111\u0001\u0000\u0000"+ - "\u0000\u0498\u0499\u0005*\u0000\u0000\u0499\u0113\u0001\u0000\u0000\u0000"+ - "\u049a\u049b\u0005&\u0000\u0000\u049b\u0115\u0001\u0000\u0000\u0000\u049c"+ - "\u049d\u0005<\u0000\u0000\u049d\u049e\u0005-\u0000\u0000\u049e\u0117\u0001"+ - "\u0000\u0000\u0000\u049f\u04ab\u00050\u0000\u0000\u04a0\u04a7\u0007\u0000"+ - "\u0000\u0000\u04a1\u04a3\u0005_\u0000\u0000\u04a2\u04a1\u0001\u0000\u0000"+ - "\u0000\u04a2\u04a3\u0001\u0000\u0000\u0000\u04a3\u04a4\u0001\u0000\u0000"+ - "\u0000\u04a4\u04a6\u0007\u0001\u0000\u0000\u04a5\u04a2\u0001\u0000\u0000"+ - "\u0000\u04a6\u04a9\u0001\u0000\u0000\u0000\u04a7\u04a5\u0001\u0000\u0000"+ - "\u0000\u04a7\u04a8\u0001\u0000\u0000\u0000\u04a8\u04ab\u0001\u0000\u0000"+ - "\u0000\u04a9\u04a7\u0001\u0000\u0000\u0000\u04aa\u049f\u0001\u0000\u0000"+ - "\u0000\u04aa\u04a0\u0001\u0000\u0000\u0000\u04ab\u04ac\u0001\u0000\u0000"+ - "\u0000\u04ac\u04ad\u0006\u008b\u0000\u0000\u04ad\u0119\u0001\u0000\u0000"+ - "\u0000\u04ae\u04af\u00050\u0000\u0000\u04af\u04b4\u0007\u0002\u0000\u0000"+ - "\u04b0\u04b2\u0005_\u0000\u0000\u04b1\u04b0\u0001\u0000\u0000\u0000\u04b1"+ - "\u04b2\u0001\u0000\u0000\u0000\u04b2\u04b3\u0001\u0000\u0000\u0000\u04b3"+ - "\u04b5\u0003\u014c\u00a5\u0000\u04b4\u04b1\u0001\u0000\u0000\u0000\u04b5"+ - "\u04b6\u0001\u0000\u0000\u0000\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b6"+ - "\u04b7\u0001\u0000\u0000\u0000\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8"+ - "\u04b9\u0006\u008c\u0000\u0000\u04b9\u011b\u0001\u0000\u0000\u0000\u04ba"+ - "\u04bc\u00050\u0000\u0000\u04bb\u04bd\u0007\u0003\u0000\u0000\u04bc\u04bb"+ - "\u0001\u0000\u0000\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04c2"+ - "\u0001\u0000\u0000\u0000\u04be\u04c0\u0005_\u0000\u0000\u04bf\u04be\u0001"+ - "\u0000\u0000\u0000\u04bf\u04c0\u0001\u0000\u0000\u0000\u04c0\u04c1\u0001"+ - "\u0000\u0000\u0000\u04c1\u04c3\u0003\u0148\u00a3\u0000\u04c2\u04bf\u0001"+ - "\u0000\u0000\u0000\u04c3\u04c4\u0001\u0000\u0000\u0000\u04c4\u04c2\u0001"+ - "\u0000\u0000\u0000\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c6\u0001"+ - "\u0000\u0000\u0000\u04c6\u04c7\u0006\u008d\u0000\u0000\u04c7\u011d\u0001"+ - "\u0000\u0000\u0000\u04c8\u04c9\u00050\u0000\u0000\u04c9\u04ce\u0007\u0004"+ - "\u0000\u0000\u04ca\u04cc\u0005_\u0000\u0000\u04cb\u04ca\u0001\u0000\u0000"+ - "\u0000\u04cb\u04cc\u0001\u0000\u0000\u0000\u04cc\u04cd\u0001\u0000\u0000"+ - "\u0000\u04cd\u04cf\u0003\u014a\u00a4\u0000\u04ce\u04cb\u0001\u0000\u0000"+ - "\u0000\u04cf\u04d0\u0001\u0000\u0000\u0000\u04d0\u04ce\u0001\u0000\u0000"+ - "\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d2\u0001\u0000\u0000"+ - "\u0000\u04d2\u04d3\u0006\u008e\u0000\u0000\u04d3\u011f\u0001\u0000\u0000"+ - "\u0000\u04d4\u04d5\u00050\u0000\u0000\u04d5\u04d6\u0007\u0004\u0000\u0000"+ - "\u04d6\u04d7\u0003\u0122\u0090\u0000\u04d7\u04d8\u0003\u0124\u0091\u0000"+ - "\u04d8\u0121\u0001\u0000\u0000\u0000\u04d9\u04db\u0005_\u0000\u0000\u04da"+ - "\u04d9\u0001\u0000\u0000\u0000\u04da\u04db\u0001\u0000\u0000\u0000\u04db"+ - "\u04dc\u0001\u0000\u0000\u0000\u04dc\u04de\u0003\u014a\u00a4\u0000\u04dd"+ - "\u04da\u0001\u0000\u0000\u0000\u04de\u04df\u0001\u0000\u0000\u0000\u04df"+ - "\u04dd\u0001\u0000\u0000\u0000\u04df\u04e0\u0001\u0000\u0000\u0000\u04e0"+ - "\u04eb\u0001\u0000\u0000\u0000\u04e1\u04e8\u0005.\u0000\u0000\u04e2\u04e4"+ - "\u0005_\u0000\u0000\u04e3\u04e2\u0001\u0000\u0000\u0000\u04e3\u04e4\u0001"+ - "\u0000\u0000\u0000\u04e4\u04e5\u0001\u0000\u0000\u0000\u04e5\u04e7\u0003"+ - "\u014a\u00a4\u0000\u04e6\u04e3\u0001\u0000\u0000\u0000\u04e7\u04ea\u0001"+ - "\u0000\u0000\u0000\u04e8\u04e6\u0001\u0000\u0000\u0000\u04e8\u04e9\u0001"+ - "\u0000\u0000\u0000\u04e9\u04ec\u0001\u0000\u0000\u0000\u04ea\u04e8\u0001"+ - "\u0000\u0000\u0000\u04eb\u04e1\u0001\u0000\u0000\u0000\u04eb\u04ec\u0001"+ - "\u0000\u0000\u0000\u04ec\u04f9\u0001\u0000\u0000\u0000\u04ed\u04ee\u0005"+ - ".\u0000\u0000\u04ee\u04f5\u0003\u014a\u00a4\u0000\u04ef\u04f1\u0005_\u0000"+ - "\u0000\u04f0\u04ef\u0001\u0000\u0000\u0000\u04f0\u04f1\u0001\u0000\u0000"+ - "\u0000\u04f1\u04f2\u0001\u0000\u0000\u0000\u04f2\u04f4\u0003\u014a\u00a4"+ - "\u0000\u04f3\u04f0\u0001\u0000\u0000\u0000\u04f4\u04f7\u0001\u0000\u0000"+ - "\u0000\u04f5\u04f3\u0001\u0000\u0000\u0000\u04f5\u04f6\u0001\u0000\u0000"+ - "\u0000\u04f6\u04f9\u0001\u0000\u0000\u0000\u04f7\u04f5\u0001\u0000\u0000"+ - "\u0000\u04f8\u04dd\u0001\u0000\u0000\u0000\u04f8\u04ed\u0001\u0000\u0000"+ - "\u0000\u04f9\u0123\u0001\u0000\u0000\u0000\u04fa\u04fc\u0007\u0005\u0000"+ - "\u0000\u04fb\u04fd\u0007\u0006\u0000\u0000\u04fc\u04fb\u0001\u0000\u0000"+ - "\u0000\u04fc\u04fd\u0001\u0000\u0000\u0000\u04fd\u04fe\u0001\u0000\u0000"+ - "\u0000\u04fe\u04ff\u0003\u0146\u00a2\u0000\u04ff\u0125\u0001\u0000\u0000"+ - "\u0000\u0500\u0506\u0003\u0118\u008b\u0000\u0501\u0506\u0003\u011a\u008c"+ - "\u0000\u0502\u0506\u0003\u011c\u008d\u0000\u0503\u0506\u0003\u011e\u008e"+ - "\u0000\u0504\u0506\u0003\u0002\u0000\u0000\u0505\u0500\u0001\u0000\u0000"+ - "\u0000\u0505\u0501\u0001\u0000\u0000\u0000\u0505\u0502\u0001\u0000\u0000"+ - "\u0000\u0505\u0503\u0001\u0000\u0000\u0000\u0505\u0504\u0001\u0000\u0000"+ - "\u0000\u0506\u0507\u0001\u0000\u0000\u0000\u0507\u0508\u0005i\u0000\u0000"+ - "\u0508\u0509\u0001\u0000\u0000\u0000\u0509\u050a\u0006\u0092\u0000\u0000"+ - "\u050a\u0127\u0001\u0000\u0000\u0000\u050b\u050e\u0005\'\u0000\u0000\u050c"+ - "\u050f\u0003\u0142\u00a0\u0000\u050d\u050f\u0003\u012c\u0095\u0000\u050e"+ - "\u050c\u0001\u0000\u0000\u0000\u050e\u050d\u0001\u0000\u0000\u0000\u050f"+ - "\u0510\u0001\u0000\u0000\u0000\u0510\u0511\u0005\'\u0000\u0000\u0511\u0129"+ - "\u0001\u0000\u0000\u0000\u0512\u0513\u0003\u0128\u0093\u0000\u0513\u0514"+ - "\u0001\u0000\u0000\u0000\u0514\u0515\u0006\u0094\u0000\u0000\u0515\u012b"+ - "\u0001\u0000\u0000\u0000\u0516\u0519\u0003\u012e\u0096\u0000\u0517\u0519"+ - "\u0003\u0130\u0097\u0000\u0518\u0516\u0001\u0000\u0000\u0000\u0518\u0517"+ - "\u0001\u0000\u0000\u0000\u0519\u012d\u0001\u0000\u0000\u0000\u051a\u051b"+ - "\u0005\\\u0000\u0000\u051b\u051c\u0003\u0148\u00a3\u0000\u051c\u051d\u0003"+ - "\u0148\u00a3\u0000\u051d\u051e\u0003\u0148\u00a3\u0000\u051e\u012f\u0001"+ - "\u0000\u0000\u0000\u051f\u0520\u0005\\\u0000\u0000\u0520\u0521\u0005x"+ - "\u0000\u0000\u0521\u0522\u0003\u014a\u00a4\u0000\u0522\u0523\u0003\u014a"+ - "\u00a4\u0000\u0523\u0131\u0001\u0000\u0000\u0000\u0524\u0525\u0005\\\u0000"+ - "\u0000\u0525\u0526\u0005u\u0000\u0000\u0526\u0527\u0003\u014a\u00a4\u0000"+ - "\u0527\u0528\u0003\u014a\u00a4\u0000\u0528\u0529\u0003\u014a\u00a4\u0000"+ - "\u0529\u052a\u0003\u014a\u00a4\u0000\u052a\u0133\u0001\u0000\u0000\u0000"+ - "\u052b\u052c\u0005\\\u0000\u0000\u052c\u052d\u0005U\u0000\u0000\u052d"+ - "\u052e\u0003\u014a\u00a4\u0000\u052e\u052f\u0003\u014a\u00a4\u0000\u052f"+ - "\u0530\u0003\u014a\u00a4\u0000\u0530\u0531\u0003\u014a\u00a4\u0000\u0531"+ - "\u0532\u0003\u014a\u00a4\u0000\u0532\u0533\u0003\u014a\u00a4\u0000\u0533"+ - "\u0534\u0003\u014a\u00a4\u0000\u0534\u0535\u0003\u014a\u00a4\u0000\u0535"+ - "\u0135\u0001\u0000\u0000\u0000\u0536\u053a\u0005`\u0000\u0000\u0537\u0539"+ - "\b\u0007\u0000\u0000\u0538\u0537\u0001\u0000\u0000\u0000\u0539\u053c\u0001"+ - "\u0000\u0000\u0000\u053a\u0538\u0001\u0000\u0000\u0000\u053a\u053b\u0001"+ - "\u0000\u0000\u0000\u053b\u053d\u0001\u0000\u0000\u0000\u053c\u053a\u0001"+ - "\u0000\u0000\u0000\u053d\u053e\u0005`\u0000\u0000\u053e\u053f\u0001\u0000"+ - "\u0000\u0000\u053f\u0540\u0006\u009a\u0000\u0000\u0540\u0137\u0001\u0000"+ - "\u0000\u0000\u0541\u0546\u0005\"\u0000\u0000\u0542\u0545\b\b\u0000\u0000"+ - "\u0543\u0545\u0003\u0144\u00a1\u0000\u0544\u0542\u0001\u0000\u0000\u0000"+ - "\u0544\u0543\u0001\u0000\u0000\u0000\u0545\u0548\u0001\u0000\u0000\u0000"+ - "\u0546\u0544\u0001\u0000\u0000\u0000\u0546\u0547\u0001\u0000\u0000\u0000"+ - "\u0547\u0549\u0001\u0000\u0000\u0000\u0548\u0546\u0001\u0000\u0000\u0000"+ - "\u0549\u054a\u0005\"\u0000\u0000\u054a\u054b\u0001\u0000\u0000\u0000\u054b"+ - "\u054c\u0006\u009b\u0000\u0000\u054c\u0139\u0001\u0000\u0000\u0000\u054d"+ - "\u054f\u0007\t\u0000\u0000\u054e\u054d\u0001\u0000\u0000\u0000\u054f\u0550"+ - "\u0001\u0000\u0000\u0000\u0550\u054e\u0001\u0000\u0000\u0000\u0550\u0551"+ - "\u0001\u0000\u0000\u0000\u0551\u0552\u0001\u0000\u0000\u0000\u0552\u0553"+ - "\u0006\u009c\u0001\u0000\u0553\u013b\u0001\u0000\u0000\u0000\u0554\u0555"+ - "\u0005/\u0000\u0000\u0555\u0556\u0005*\u0000\u0000\u0556\u055a\u0001\u0000"+ - "\u0000\u0000\u0557\u0559\t\u0000\u0000\u0000\u0558\u0557\u0001\u0000\u0000"+ - "\u0000\u0559\u055c\u0001\u0000\u0000\u0000\u055a\u055b\u0001\u0000\u0000"+ - "\u0000\u055a\u0558\u0001\u0000\u0000\u0000\u055b\u055d\u0001\u0000\u0000"+ - "\u0000\u055c\u055a\u0001\u0000\u0000\u0000\u055d\u055e\u0005*\u0000\u0000"+ - "\u055e\u055f\u0005/\u0000\u0000\u055f\u0560\u0001\u0000\u0000\u0000\u0560"+ - "\u0561\u0006\u009d\u0001\u0000\u0561\u013d\u0001\u0000\u0000\u0000\u0562"+ - "\u0564\u0007\n\u0000\u0000\u0563\u0562\u0001\u0000\u0000\u0000\u0564\u0565"+ - "\u0001\u0000\u0000\u0000\u0565\u0563\u0001\u0000\u0000\u0000\u0565\u0566"+ - "\u0001\u0000\u0000\u0000\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u0568"+ - "\u0006\u009e\u0001\u0000\u0568\u013f\u0001\u0000\u0000\u0000\u0569\u056a"+ - "\u0005/\u0000\u0000\u056a\u056b\u0005/\u0000\u0000\u056b\u056f\u0001\u0000"+ - "\u0000\u0000\u056c\u056e\b\n\u0000\u0000\u056d\u056c\u0001\u0000\u0000"+ - "\u0000\u056e\u0571\u0001\u0000\u0000\u0000\u056f\u056d\u0001\u0000\u0000"+ - "\u0000\u056f\u0570\u0001\u0000\u0000\u0000\u0570\u0572\u0001\u0000\u0000"+ - "\u0000\u0571\u056f\u0001\u0000\u0000\u0000\u0572\u0573\u0006\u009f\u0001"+ - "\u0000\u0573\u0141\u0001\u0000\u0000\u0000\u0574\u0579\b\u000b\u0000\u0000"+ - "\u0575\u0579\u0003\u0132\u0098\u0000\u0576\u0579\u0003\u0134\u0099\u0000"+ - "\u0577\u0579\u0003\u0144\u00a1\u0000\u0578\u0574\u0001\u0000\u0000\u0000"+ - "\u0578\u0575\u0001\u0000\u0000\u0000\u0578\u0576\u0001\u0000\u0000\u0000"+ - "\u0578\u0577\u0001\u0000\u0000\u0000\u0579\u0143\u0001\u0000\u0000\u0000"+ - "\u057a\u0594\u0005\\\u0000\u0000\u057b\u057c\u0005u\u0000\u0000\u057c"+ - "\u057d\u0003\u014a\u00a4\u0000\u057d\u057e\u0003\u014a\u00a4\u0000\u057e"+ - "\u057f\u0003\u014a\u00a4\u0000\u057f\u0580\u0003\u014a\u00a4\u0000\u0580"+ - "\u0595\u0001\u0000\u0000\u0000\u0581\u0582\u0005U\u0000\u0000\u0582\u0583"+ - "\u0003\u014a\u00a4\u0000\u0583\u0584\u0003\u014a\u00a4\u0000\u0584\u0585"+ - "\u0003\u014a\u00a4\u0000\u0585\u0586\u0003\u014a\u00a4\u0000\u0586\u0587"+ - "\u0003\u014a\u00a4\u0000\u0587\u0588\u0003\u014a\u00a4\u0000\u0588\u0589"+ - "\u0003\u014a\u00a4\u0000\u0589\u058a\u0003\u014a\u00a4\u0000\u058a\u0595"+ - "\u0001\u0000\u0000\u0000\u058b\u0595\u0007\f\u0000\u0000\u058c\u058d\u0003"+ - "\u0148\u00a3\u0000\u058d\u058e\u0003\u0148\u00a3\u0000\u058e\u058f\u0003"+ - "\u0148\u00a3\u0000\u058f\u0595\u0001\u0000\u0000\u0000\u0590\u0591\u0005"+ - "x\u0000\u0000\u0591\u0592\u0003\u014a\u00a4\u0000\u0592\u0593\u0003\u014a"+ - "\u00a4\u0000\u0593\u0595\u0001\u0000\u0000\u0000\u0594\u057b\u0001\u0000"+ - "\u0000\u0000\u0594\u0581\u0001\u0000\u0000\u0000\u0594\u058b\u0001\u0000"+ - "\u0000\u0000\u0594\u058c\u0001\u0000\u0000\u0000\u0594\u0590\u0001\u0000"+ - "\u0000\u0000\u0595\u0145\u0001\u0000\u0000\u0000\u0596\u059d\u0007\u0001"+ - "\u0000\u0000\u0597\u0599\u0005_\u0000\u0000\u0598\u0597\u0001\u0000\u0000"+ - "\u0000\u0598\u0599\u0001\u0000\u0000\u0000\u0599\u059a\u0001\u0000\u0000"+ - "\u0000\u059a\u059c\u0007\u0001\u0000\u0000\u059b\u0598\u0001\u0000\u0000"+ - "\u0000\u059c\u059f\u0001\u0000\u0000\u0000\u059d\u059b\u0001\u0000\u0000"+ - "\u0000\u059d\u059e\u0001\u0000\u0000\u0000\u059e\u0147\u0001\u0000\u0000"+ - "\u0000\u059f\u059d\u0001\u0000\u0000\u0000\u05a0\u05a1\u0007\r\u0000\u0000"+ - "\u05a1\u0149\u0001\u0000\u0000\u0000\u05a2\u05a3\u0007\u000e\u0000\u0000"+ - "\u05a3\u014b\u0001\u0000\u0000\u0000\u05a4\u05a5\u0007\u000f\u0000\u0000"+ - "\u05a5\u014d\u0001\u0000\u0000\u0000\u05a6\u05a8\u0007\u0010\u0000\u0000"+ - "\u05a7\u05a9\u0007\u0006\u0000\u0000\u05a8\u05a7\u0001\u0000\u0000\u0000"+ - "\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000"+ - "\u05aa\u05ab\u0003\u0146\u00a2\u0000\u05ab\u014f\u0001\u0000\u0000\u0000"+ - "\u05ac\u05af\u0003\u0154\u00a9\u0000\u05ad\u05af\u0005_\u0000\u0000\u05ae"+ - "\u05ac\u0001\u0000\u0000\u0000\u05ae\u05ad\u0001\u0000\u0000\u0000\u05af"+ - "\u0151\u0001\u0000\u0000\u0000\u05b0\u05b1\u0007\u0011\u0000\u0000\u05b1"+ - "\u0153\u0001\u0000\u0000\u0000\u05b2\u05b3\u0007\u0012\u0000\u0000\u05b3"+ - "\u0155\u0001\u0000\u0000\u0000\u05b4\u05b6\u0007\t\u0000\u0000\u05b5\u05b4"+ - "\u0001\u0000\u0000\u0000\u05b6\u05b7\u0001\u0000\u0000\u0000\u05b7\u05b5"+ - "\u0001\u0000\u0000\u0000\u05b7\u05b8\u0001\u0000\u0000\u0000\u05b8\u05b9"+ - "\u0001\u0000\u0000\u0000\u05b9\u05ba\u0006\u00aa\u0001\u0000\u05ba\u0157"+ - "\u0001\u0000\u0000\u0000\u05bb\u05bc\u0005/\u0000\u0000\u05bc\u05bd\u0005"+ - "*\u0000\u0000\u05bd\u05c1\u0001\u0000\u0000\u0000\u05be\u05c0\b\n\u0000"+ - "\u0000\u05bf\u05be\u0001\u0000\u0000\u0000\u05c0\u05c3\u0001\u0000\u0000"+ - "\u0000\u05c1\u05c2\u0001\u0000\u0000\u0000\u05c1\u05bf\u0001\u0000\u0000"+ - "\u0000\u05c2\u05c4\u0001\u0000\u0000\u0000\u05c3\u05c1\u0001\u0000\u0000"+ - "\u0000\u05c4\u05c5\u0005*\u0000\u0000\u05c5\u05c6\u0005/\u0000\u0000\u05c6"+ - "\u05c7\u0001\u0000\u0000\u0000\u05c7\u05c8\u0006\u00ab\u0001\u0000\u05c8"+ - "\u0159\u0001\u0000\u0000\u0000\u05c9\u05ca\u0005/\u0000\u0000\u05ca\u05cb"+ - "\u0005/\u0000\u0000\u05cb\u05cf\u0001\u0000\u0000\u0000\u05cc\u05ce\b"+ - "\n\u0000\u0000\u05cd\u05cc\u0001\u0000\u0000\u0000\u05ce\u05d1\u0001\u0000"+ - "\u0000\u0000\u05cf\u05cd\u0001\u0000\u0000\u0000\u05cf\u05d0\u0001\u0000"+ - "\u0000\u0000\u05d0\u05d2\u0001\u0000\u0000\u0000\u05d1\u05cf\u0001\u0000"+ - "\u0000\u0000\u05d2\u05d3\u0006\u00ac\u0001\u0000\u05d3\u015b\u0001\u0000"+ - "\u0000\u0000\u05d4\u05d6\u0007\n\u0000\u0000\u05d5\u05d4\u0001\u0000\u0000"+ - "\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000\u05d7\u05d5\u0001\u0000\u0000"+ - "\u0000\u05d7\u05d8\u0001\u0000\u0000\u0000\u05d8\u05e7\u0001\u0000\u0000"+ - "\u0000\u05d9\u05e7\u0005;\u0000\u0000\u05da\u05db\u0005/\u0000\u0000\u05db"+ - "\u05dc\u0005*\u0000\u0000\u05dc\u05e0\u0001\u0000\u0000\u0000\u05dd\u05df"+ - "\t\u0000\u0000\u0000\u05de\u05dd\u0001\u0000\u0000\u0000\u05df\u05e2\u0001"+ - "\u0000\u0000\u0000\u05e0\u05e1\u0001\u0000\u0000\u0000\u05e0\u05de\u0001"+ - "\u0000\u0000\u0000\u05e1\u05e3\u0001\u0000\u0000\u0000\u05e2\u05e0\u0001"+ - "\u0000\u0000\u0000\u05e3\u05e4\u0005*\u0000\u0000\u05e4\u05e7\u0005/\u0000"+ - "\u0000\u05e5\u05e7\u0005\u0000\u0000\u0001\u05e6\u05d5\u0001\u0000\u0000"+ - "\u0000\u05e6\u05d9\u0001\u0000\u0000\u0000\u05e6\u05da\u0001\u0000\u0000"+ - "\u0000\u05e6\u05e5\u0001\u0000\u0000\u0000\u05e7\u05e8\u0001\u0000\u0000"+ - "\u0000\u05e8\u05e9\u0006\u00ad\u0002\u0000\u05e9\u015d\u0001\u0000\u0000"+ - "\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb\u05ec\u0001\u0000\u0000"+ - "\u0000\u05ec\u05ed\u0006\u00ae\u0002\u0000\u05ed\u05ee\u0006\u00ae\u0001"+ - "\u0000\u05ee\u015f\u0001\u0000\u0000\u00003\u0000\u0001\u0162\u016a\u016d"+ - "\u0170\u0176\u0178\u0437\u0439\u04a2\u04a7\u04aa\u04b1\u04b6\u04bc\u04bf"+ - "\u04c4\u04cb\u04d0\u04da\u04df\u04e3\u04e8\u04eb\u04f0\u04f5\u04f8\u04fc"+ - "\u0505\u050e\u0518\u053a\u0544\u0546\u0550\u055a\u0565\u056f\u0578\u0594"+ - "\u0598\u059d\u05a8\u05ae\u05b7\u05c1\u05cf\u05d7\u05e0\u05e6\u0003\u0002"+ - "\u0001\u0000\u0000\u0001\u0000\u0002\u0000\u0000"; + "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a"+ + "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b"+ + "\u0001\u009b\u0005\u009b\u0546\b\u009b\n\u009b\f\u009b\u0549\t\u009b\u0001"+ + "\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001"+ + "\u009c\u0005\u009c\u0552\b\u009c\n\u009c\f\u009c\u0555\t\u009c\u0001\u009c"+ + "\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0004\u009d\u055c\b\u009d"+ + "\u000b\u009d\f\u009d\u055d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e"+ + "\u0001\u009e\u0001\u009e\u0005\u009e\u0566\b\u009e\n\u009e\f\u009e\u0569"+ + "\t\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ + "\u009f\u0004\u009f\u0571\b\u009f\u000b\u009f\f\u009f\u0572\u0001\u009f"+ + "\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0005\u00a0"+ + "\u057b\b\u00a0\n\u00a0\f\u00a0\u057e\t\u00a0\u0001\u00a0\u0001\u00a0\u0001"+ + "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0003\u00a1\u0586\b\u00a1\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0003\u00a2\u05a2\b\u00a2\u0001\u00a3\u0001\u00a3\u0003"+ + "\u00a3\u05a6\b\u00a3\u0001\u00a3\u0005\u00a3\u05a9\b\u00a3\n\u00a3\f\u00a3"+ + "\u05ac\t\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0003\u00a7\u05b6\b\u00a7\u0001\u00a7"+ + "\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0003\u00a8\u05bc\b\u00a8\u0001\u00a9"+ + "\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0004\u00ab\u05c3\b\u00ab"+ + "\u000b\u00ab\f\u00ab\u05c4\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac"+ + "\u0001\u00ac\u0001\u00ac\u0005\u00ac\u05cd\b\u00ac\n\u00ac\f\u00ac\u05d0"+ + "\t\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001"+ + "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0005\u00ad\u05db\b\u00ad\n"+ + "\u00ad\f\u00ad\u05de\t\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0004"+ + "\u00ae\u05e3\b\u00ae\u000b\u00ae\f\u00ae\u05e4\u0001\u00ae\u0001\u00ae"+ + "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0005\u00ae\u05ec\b\u00ae\n\u00ae"+ + "\f\u00ae\u05ef\t\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0003\u00ae"+ + "\u05f4\b\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af"+ + "\u0001\u00af\u0001\u00af\u0003\u0567\u05ce\u05ed\u0000\u00b0\u0002\u0001"+ + "\u0004\u0002\u0006\u0003\b\u0004\n\u0005\f\u0006\u000e\u0007\u0010\b\u0012"+ + "\t\u0014\n\u0016\u000b\u0018\f\u001a\r\u001c\u000e\u001e\u000f \u0010"+ + "\"\u0011$\u0012&\u0013(\u0014*\u0015,\u0016.\u00170\u00182\u00194\u001a"+ + "6\u001b8\u001c:\u001d<\u001e>\u001f@ B!D\"F#H$J%L&N\'P(R)T*V+X,Z-\\.^"+ + "/`0b1d2f3h4j5l6n7p8r9t:v;x~?\u0080@\u0082A\u0084B\u0086C\u0088D\u008a"+ + "E\u008cF\u008eG\u0090H\u0092I\u0094J\u0096K\u0098L\u009aM\u009cN\u009e"+ + "O\u00a0P\u00a2Q\u00a4R\u00a6S\u00a8T\u00aaU\u00acV\u00aeW\u00b0X\u00b2"+ + "Y\u00b4Z\u00b6[\u00b8\\\u00ba]\u00bc^\u00be_\u00c0`\u00c2a\u00c4b\u00c6"+ + "c\u00c8d\u00cae\u00ccf\u00ceg\u00d0h\u00d2i\u00d4j\u00d6k\u00d8l\u00da"+ + "m\u00dcn\u00deo\u00e0p\u00e2q\u00e4r\u00e6s\u00e8t\u00eau\u00ecv\u00ee"+ + "w\u00f0x\u00f2y\u00f4z\u00f6{\u00f8|\u00fa}\u00fc~\u00fe\u007f\u0100\u0080"+ + "\u0102\u0081\u0104\u0082\u0106\u0083\u0108\u0084\u010a\u0085\u010c\u0086"+ + "\u010e\u0087\u0110\u0088\u0112\u0089\u0114\u008a\u0116\u008b\u0118\u008c"+ + "\u011a\u008d\u011c\u008e\u011e\u008f\u0120\u0090\u0122\u0091\u0124\u0000"+ + "\u0126\u0000\u0128\u0092\u012a\u0000\u012c\u0093\u012e\u0094\u0130\u0095"+ + "\u0132\u0096\u0134\u0097\u0136\u0098\u0138\u0099\u013a\u009a\u013c\u009b"+ + "\u013e\u009c\u0140\u009d\u0142\u009e\u0144\u0000\u0146\u0000\u0148\u0000"+ + "\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0000\u0152\u0000\u0154\u0000"+ + "\u0156\u0000\u0158\u009f\u015a\u00a0\u015c\u00a1\u015e\u00a2\u0160\u00a3"+ + "\u0002\u0000\u0001\u0013\u0001\u000019\u0001\u000009\u0002\u0000BBbb\u0002"+ + "\u0000OOoo\u0002\u0000XXxx\u0002\u0000PPpp\u0002\u0000++--\u0001\u0000"+ + "``\u0002\u0000\"\"\\\\\u0002\u0000\t\t \u0002\u0000\n\n\r\r\u0003\u0000"+ + "\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\abffnnrrttvv\u0001\u000007\u0003\u0000"+ + "09AFaf\u0001\u000001\u0002\u0000EEee>\u000009\u0660\u0669\u06f0\u06f9"+ + "\u07c0\u07c9\u0966\u096f\u09e6\u09ef\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f"+ + "\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef\u0d66\u0d6f\u0de6\u0def\u0e50\u0e59"+ + "\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049\u1090\u1099\u17e0\u17e9\u1810\u1819"+ + "\u1946\u194f\u19d0\u19d9\u1a80\u1a89\u1a90\u1a99\u1b50\u1b59\u1bb0\u1bb9"+ + "\u1c40\u1c49\u1c50\u1c59\u8000\ua620\u8000\ua629\u8000\ua8d0\u8000\ua8d9"+ + "\u8000\ua900\u8000\ua909\u8000\ua9d0\u8000\ua9d9\u8000\ua9f0\u8000\ua9f9"+ + "\u8000\uaa50\u8000\uaa59\u8000\uabf0\u8000\uabf9\u8000\uff10\u8000\uff19"+ + "\u8001\u04a0\u8001\u04a9\u8001\u0d30\u8001\u0d39\u8001\u1066\u8001\u106f"+ + "\u8001\u10f0\u8001\u10f9\u8001\u1136\u8001\u113f\u8001\u11d0\u8001\u11d9"+ + "\u8001\u12f0\u8001\u12f9\u8001\u1450\u8001\u1459\u8001\u14d0\u8001\u14d9"+ + "\u8001\u1650\u8001\u1659\u8001\u16c0\u8001\u16c9\u8001\u1730\u8001\u1739"+ + "\u8001\u18e0\u8001\u18e9\u8001\u1950\u8001\u1959\u8001\u1c50\u8001\u1c59"+ + "\u8001\u1d50\u8001\u1d59\u8001\u1da0\u8001\u1da9\u8001\u6a60\u8001\u6a69"+ + "\u8001\u6ac0\u8001\u6ac9\u8001\u6b50\u8001\u6b59\u8001\ud7ce\u8001\ud7ff"+ + "\u8001\ue140\u8001\ue149\u8001\ue2f0\u8001\ue2f9\u8001\ue950\u8001\ue959"+ + "\u8001\ufbf0\u8001\ufbf9\u0288\u0000AZaz\u00aa\u00aa\u00b5\u00b5\u00ba"+ + "\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0\u02e4\u02ec"+ + "\u02ec\u02ee\u02ee\u0370\u0374\u0376\u0377\u037a\u037d\u037f\u037f\u0386"+ + "\u0386\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03f5\u03f7\u0481\u048a"+ + "\u052f\u0531\u0556\u0559\u0559\u0560\u0588\u05d0\u05ea\u05ef\u05f2\u0620"+ + "\u064a\u066e\u066f\u0671\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa"+ + "\u06fc\u06ff\u06ff\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1\u07b1\u07ca"+ + "\u07ea\u07f4\u07f5\u07fa\u07fa\u0800\u0815\u081a\u081a\u0824\u0824\u0828"+ + "\u0828\u0840\u0858\u0860\u086a\u0870\u0887\u0889\u088e\u08a0\u08c9\u0904"+ + "\u0939\u093d\u093d\u0950\u0950\u0958\u0961\u0971\u0980\u0985\u098c\u098f"+ + "\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd\u09bd\u09ce"+ + "\u09ce\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05\u0a0a\u0a0f"+ + "\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59"+ + "\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa"+ + "\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0\u0ae1\u0af9"+ + "\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b35"+ + "\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83\u0b83\u0b85"+ + "\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3"+ + "\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e\u0c10\u0c12"+ + "\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60\u0c61\u0c80"+ + "\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbd"+ + "\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e\u0d10\u0d12"+ + "\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a\u0d7f\u0d85"+ + "\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01\u0e30\u0e32"+ + "\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c\u0ea3\u0ea5"+ + "\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0edc"+ + "\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000\u102a\u103f"+ + "\u103f\u1050\u1055\u105a\u105d\u1061\u1061\u1065\u1066\u106e\u1070\u1075"+ + "\u1081\u108e\u108e\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0\u10fa\u10fc"+ + "\u1248\u124a\u124d\u1250\u1256\u1258\u1258\u125a\u125d\u1260\u1288\u128a"+ + "\u128d\u1290\u12b0\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2\u12c5\u12c8"+ + "\u12d6\u12d8\u1310\u1312\u1315\u1318\u135a\u1380\u138f\u13a0\u13f5\u13f8"+ + "\u13fd\u1401\u166c\u166f\u167f\u1681\u169a\u16a0\u16ea\u16f1\u16f8\u1700"+ + "\u1711\u171f\u1731\u1740\u1751\u1760\u176c\u176e\u1770\u1780\u17b3\u17d7"+ + "\u17d7\u17dc\u17dc\u1820\u1878\u1880\u1884\u1887\u18a8\u18aa\u18aa\u18b0"+ + "\u18f5\u1900\u191e\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0\u19c9\u1a00"+ + "\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83\u1ba0\u1bae"+ + "\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80\u1c88\u1c90"+ + "\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa\u1d00"+ + "\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59"+ + "\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe"+ + "\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2"+ + "\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f\u207f\u2090\u209c\u2102\u2102\u2107"+ + "\u2107\u210a\u2113\u2115\u2115\u2119\u211d\u2124\u2124\u2126\u2126\u2128"+ + "\u2128\u212a\u212d\u212f\u2139\u213c\u213f\u2145\u2149\u214e\u214e\u2183"+ + "\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27\u2d27\u2d2d"+ + "\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8\u2dae\u2db0"+ + "\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8\u2dde\u2e2f"+ + "\u2e2f\u3005\u3006\u3031\u3035\u303b\u303c\u3041\u3096\u309d\u309f\u30a1"+ + "\u30fa\u30fc\u30ff\u3105\u312f\u3131\u318e\u31a0\u31bf\u31f0\u31ff\u3400"+ + "\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0\u8000\ua4fd\u8000\ua500\u8000\ua60c"+ + "\u8000\ua610\u8000\ua61f\u8000\ua62a\u8000\ua62b\u8000\ua640\u8000\ua66e"+ + "\u8000\ua67f\u8000\ua69d\u8000\ua6a0\u8000\ua6e5\u8000\ua717\u8000\ua71f"+ + "\u8000\ua722\u8000\ua788\u8000\ua78b\u8000\ua7ca\u8000\ua7d0\u8000\ua7d1"+ + "\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2\u8000\ua801"+ + "\u8000\ua803\u8000\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c\u8000\ua822"+ + "\u8000\ua840\u8000\ua873\u8000\ua882\u8000\ua8b3\u8000\ua8f2\u8000\ua8f7"+ + "\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000\ua90a\u8000\ua925"+ + "\u8000\ua930\u8000\ua946\u8000\ua960\u8000\ua97c\u8000\ua984\u8000\ua9b2"+ + "\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6\u8000\ua9ef"+ + "\u8000\ua9fa\u8000\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40\u8000\uaa42"+ + "\u8000\uaa44\u8000\uaa4b\u8000\uaa60\u8000\uaa76\u8000\uaa7a\u8000\uaa7a"+ + "\u8000\uaa7e\u8000\uaaaf\u8000\uaab1\u8000\uaab1\u8000\uaab5\u8000\uaab6"+ + "\u8000\uaab9\u8000\uaabd\u8000\uaac0\u8000\uaac0\u8000\uaac2\u8000\uaac2"+ + "\u8000\uaadb\u8000\uaadd\u8000\uaae0\u8000\uaaea\u8000\uaaf2\u8000\uaaf4"+ + "\u8000\uab01\u8000\uab06\u8000\uab09\u8000\uab0e\u8000\uab11\u8000\uab16"+ + "\u8000\uab20\u8000\uab26\u8000\uab28\u8000\uab2e\u8000\uab30\u8000\uab5a"+ + "\u8000\uab5c\u8000\uab69\u8000\uab70\u8000\uabe2\u8000\uac00\u8000\ud7a3"+ + "\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000\uf900\u8000\ufa6d"+ + "\u8000\ufa70\u8000\ufad9\u8000\ufb00\u8000\ufb06\u8000\ufb13\u8000\ufb17"+ + "\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f\u8000\ufb28\u8000\ufb2a\u8000\ufb36"+ + "\u8000\ufb38\u8000\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000\ufb40\u8000\ufb41"+ + "\u8000\ufb43\u8000\ufb44\u8000\ufb46\u8000\ufbb1\u8000\ufbd3\u8000\ufd3d"+ + "\u8000\ufd50\u8000\ufd8f\u8000\ufd92\u8000\ufdc7\u8000\ufdf0\u8000\ufdfb"+ + "\u8000\ufe70\u8000\ufe74\u8000\ufe76\u8000\ufefc\u8000\uff21\u8000\uff3a"+ + "\u8000\uff41\u8000\uff5a\u8000\uff66\u8000\uffbe\u8000\uffc2\u8000\uffc7"+ + "\u8000\uffca\u8000\uffcf\u8000\uffd2\u8000\uffd7\u8000\uffda\u8000\uffdc"+ + "\u8001\u0000\u8001\u000b\u8001\r\u8001&\u8001(\u8001:\u8001<\u8001=\u8001"+ + "?\u8001M\u8001P\u8001]\u8001\u0080\u8001\u00fa\u8001\u0280\u8001\u029c"+ + "\u8001\u02a0\u8001\u02d0\u8001\u0300\u8001\u031f\u8001\u032d\u8001\u0340"+ + "\u8001\u0342\u8001\u0349\u8001\u0350\u8001\u0375\u8001\u0380\u8001\u039d"+ + "\u8001\u03a0\u8001\u03c3\u8001\u03c8\u8001\u03cf\u8001\u0400\u8001\u049d"+ + "\u8001\u04b0\u8001\u04d3\u8001\u04d8\u8001\u04fb\u8001\u0500\u8001\u0527"+ + "\u8001\u0530\u8001\u0563\u8001\u0570\u8001\u057a\u8001\u057c\u8001\u058a"+ + "\u8001\u058c\u8001\u0592\u8001\u0594\u8001\u0595\u8001\u0597\u8001\u05a1"+ + "\u8001\u05a3\u8001\u05b1\u8001\u05b3\u8001\u05b9\u8001\u05bb\u8001\u05bc"+ + "\u8001\u0600\u8001\u0736\u8001\u0740\u8001\u0755\u8001\u0760\u8001\u0767"+ + "\u8001\u0780\u8001\u0785\u8001\u0787\u8001\u07b0\u8001\u07b2\u8001\u07ba"+ + "\u8001\u0800\u8001\u0805\u8001\u0808\u8001\u0808\u8001\u080a\u8001\u0835"+ + "\u8001\u0837\u8001\u0838\u8001\u083c\u8001\u083c\u8001\u083f\u8001\u0855"+ + "\u8001\u0860\u8001\u0876\u8001\u0880\u8001\u089e\u8001\u08e0\u8001\u08f2"+ + "\u8001\u08f4\u8001\u08f5\u8001\u0900\u8001\u0915\u8001\u0920\u8001\u0939"+ + "\u8001\u0980\u8001\u09b7\u8001\u09be\u8001\u09bf\u8001\u0a00\u8001\u0a00"+ + "\u8001\u0a10\u8001\u0a13\u8001\u0a15\u8001\u0a17\u8001\u0a19\u8001\u0a35"+ + "\u8001\u0a60\u8001\u0a7c\u8001\u0a80\u8001\u0a9c\u8001\u0ac0\u8001\u0ac7"+ + "\u8001\u0ac9\u8001\u0ae4\u8001\u0b00\u8001\u0b35\u8001\u0b40\u8001\u0b55"+ + "\u8001\u0b60\u8001\u0b72\u8001\u0b80\u8001\u0b91\u8001\u0c00\u8001\u0c48"+ + "\u8001\u0c80\u8001\u0cb2\u8001\u0cc0\u8001\u0cf2\u8001\u0d00\u8001\u0d23"+ + "\u8001\u0e80\u8001\u0ea9\u8001\u0eb0\u8001\u0eb1\u8001\u0f00\u8001\u0f1c"+ + "\u8001\u0f27\u8001\u0f27\u8001\u0f30\u8001\u0f45\u8001\u0f70\u8001\u0f81"+ + "\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0\u8001\u0ff6\u8001\u1003\u8001\u1037"+ + "\u8001\u1071\u8001\u1072\u8001\u1075\u8001\u1075\u8001\u1083\u8001\u10af"+ + "\u8001\u10d0\u8001\u10e8\u8001\u1103\u8001\u1126\u8001\u1144\u8001\u1144"+ + "\u8001\u1147\u8001\u1147\u8001\u1150\u8001\u1172\u8001\u1176\u8001\u1176"+ + "\u8001\u1183\u8001\u11b2\u8001\u11c1\u8001\u11c4\u8001\u11da\u8001\u11da"+ + "\u8001\u11dc\u8001\u11dc\u8001\u1200\u8001\u1211\u8001\u1213\u8001\u122b"+ + "\u8001\u1280\u8001\u1286\u8001\u1288\u8001\u1288\u8001\u128a\u8001\u128d"+ + "\u8001\u128f\u8001\u129d\u8001\u129f\u8001\u12a8\u8001\u12b0\u8001\u12de"+ + "\u8001\u1305\u8001\u130c\u8001\u130f\u8001\u1310\u8001\u1313\u8001\u1328"+ + "\u8001\u132a\u8001\u1330\u8001\u1332\u8001\u1333\u8001\u1335\u8001\u1339"+ + "\u8001\u133d\u8001\u133d\u8001\u1350\u8001\u1350\u8001\u135d\u8001\u1361"+ + "\u8001\u1400\u8001\u1434\u8001\u1447\u8001\u144a\u8001\u145f\u8001\u1461"+ + "\u8001\u1480\u8001\u14af\u8001\u14c4\u8001\u14c5\u8001\u14c7\u8001\u14c7"+ + "\u8001\u1580\u8001\u15ae\u8001\u15d8\u8001\u15db\u8001\u1600\u8001\u162f"+ + "\u8001\u1644\u8001\u1644\u8001\u1680\u8001\u16aa\u8001\u16b8\u8001\u16b8"+ + "\u8001\u1700\u8001\u171a\u8001\u1740\u8001\u1746\u8001\u1800\u8001\u182b"+ + "\u8001\u18a0\u8001\u18df\u8001\u18ff\u8001\u1906\u8001\u1909\u8001\u1909"+ + "\u8001\u190c\u8001\u1913\u8001\u1915\u8001\u1916\u8001\u1918\u8001\u192f"+ + "\u8001\u193f\u8001\u193f\u8001\u1941\u8001\u1941\u8001\u19a0\u8001\u19a7"+ + "\u8001\u19aa\u8001\u19d0\u8001\u19e1\u8001\u19e1\u8001\u19e3\u8001\u19e3"+ + "\u8001\u1a00\u8001\u1a00\u8001\u1a0b\u8001\u1a32\u8001\u1a3a\u8001\u1a3a"+ + "\u8001\u1a50\u8001\u1a50\u8001\u1a5c\u8001\u1a89\u8001\u1a9d\u8001\u1a9d"+ + "\u8001\u1ab0\u8001\u1af8\u8001\u1c00\u8001\u1c08\u8001\u1c0a\u8001\u1c2e"+ + "\u8001\u1c40\u8001\u1c40\u8001\u1c72\u8001\u1c8f\u8001\u1d00\u8001\u1d06"+ + "\u8001\u1d08\u8001\u1d09\u8001\u1d0b\u8001\u1d30\u8001\u1d46\u8001\u1d46"+ + "\u8001\u1d60\u8001\u1d65\u8001\u1d67\u8001\u1d68\u8001\u1d6a\u8001\u1d89"+ + "\u8001\u1d98\u8001\u1d98\u8001\u1ee0\u8001\u1ef2\u8001\u1fb0\u8001\u1fb0"+ + "\u8001\u2000\u8001\u2399\u8001\u2480\u8001\u2543\u8001\u2f90\u8001\u2ff0"+ + "\u8001\u3000\u8001\u342e\u8001\u4400\u8001\u4646\u8001\u6800\u8001\u6a38"+ + "\u8001\u6a40\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0\u8001\u6aed"+ + "\u8001\u6b00\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001\u6b63\u8001\u6b77"+ + "\u8001\u6b7d\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001\u6f00\u8001\u6f4a"+ + "\u8001\u6f50\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1"+ + "\u8001\u6fe3\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001\u8800\u8001\u8cd5"+ + "\u8001\u8d00\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001\uaff5\u8001\uaffb"+ + "\u8001\uaffd\u8001\uaffe\u8001\ub000\u8001\ub122\u8001\ub150\u8001\ub152"+ + "\u8001\ub164\u8001\ub167\u8001\ub170\u8001\ub2fb\u8001\ubc00\u8001\ubc6a"+ + "\u8001\ubc70\u8001\ubc7c\u8001\ubc80\u8001\ubc88\u8001\ubc90\u8001\ubc99"+ + "\u8001\ud400\u8001\ud454\u8001\ud456\u8001\ud49c\u8001\ud49e\u8001\ud49f"+ + "\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5\u8001\ud4a6\u8001\ud4a9\u8001\ud4ac"+ + "\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb\u8001\ud4bb\u8001\ud4bd\u8001\ud4c3"+ + "\u8001\ud4c5\u8001\ud505\u8001\ud507\u8001\ud50a\u8001\ud50d\u8001\ud514"+ + "\u8001\ud516\u8001\ud51c\u8001\ud51e\u8001\ud539\u8001\ud53b\u8001\ud53e"+ + "\u8001\ud540\u8001\ud544\u8001\ud546\u8001\ud546\u8001\ud54a\u8001\ud550"+ + "\u8001\ud552\u8001\ud6a5\u8001\ud6a8\u8001\ud6c0\u8001\ud6c2\u8001\ud6da"+ + "\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc\u8001\ud714\u8001\ud716\u8001\ud734"+ + "\u8001\ud736\u8001\ud74e\u8001\ud750\u8001\ud76e\u8001\ud770\u8001\ud788"+ + "\u8001\ud78a\u8001\ud7a8\u8001\ud7aa\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb"+ + "\u8001\udf00\u8001\udf1e\u8001\ue100\u8001\ue12c\u8001\ue137\u8001\ue13d"+ + "\u8001\ue14e\u8001\ue14e\u8001\ue290\u8001\ue2ad\u8001\ue2c0\u8001\ue2eb"+ + "\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee"+ + "\u8001\ue7f0\u8001\ue7fe\u8001\ue800\u8001\ue8c4\u8001\ue900\u8001\ue943"+ + "\u8001\ue94b\u8001\ue94b\u8001\uee00\u8001\uee03\u8001\uee05\u8001\uee1f"+ + "\u8001\uee21\u8001\uee22\u8001\uee24\u8001\uee24\u8001\uee27\u8001\uee27"+ + "\u8001\uee29\u8001\uee32\u8001\uee34\u8001\uee37\u8001\uee39\u8001\uee39"+ + "\u8001\uee3b\u8001\uee3b\u8001\uee42\u8001\uee42\u8001\uee47\u8001\uee47"+ + "\u8001\uee49\u8001\uee49\u8001\uee4b\u8001\uee4b\u8001\uee4d\u8001\uee4f"+ + "\u8001\uee51\u8001\uee52\u8001\uee54\u8001\uee54\u8001\uee57\u8001\uee57"+ + "\u8001\uee59\u8001\uee59\u8001\uee5b\u8001\uee5b\u8001\uee5d\u8001\uee5d"+ + "\u8001\uee5f\u8001\uee5f\u8001\uee61\u8001\uee62\u8001\uee64\u8001\uee64"+ + "\u8001\uee67\u8001\uee6a\u8001\uee6c\u8001\uee72\u8001\uee74\u8001\uee77"+ + "\u8001\uee79\u8001\uee7c\u8001\uee7e\u8001\uee7e\u8001\uee80\u8001\uee89"+ + "\u8001\uee8b\u8001\uee9b\u8001\ueea1\u8001\ueea3\u8001\ueea5\u8001\ueea9"+ + "\u8001\ueeab\u8001\ueebb\u8002\u0000\u8002\ua6df\u8002\ua700\u8002\ub738"+ + "\u8002\ub740\u8002\ub81d\u8002\ub820\u8002\ucea1\u8002\uceb0\u8002\uebe0"+ + "\u8002\uf800\u8002\ufa1d\u8003\u0000\u8003\u134a\u0628\u0000\u0002\u0001"+ + "\u0000\u0000\u0000\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001"+ + "\u0000\u0000\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000"+ + "\u0000\u0000\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000"+ + "\u0000\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000"+ + "\u0000\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000"+ + "\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000"+ + "\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000"+ + "\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000"+ + "\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000("+ + "\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000"+ + "\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000"+ + "\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006"+ + "\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000"+ + "\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000"+ + "\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D"+ + "\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000"+ + "\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000"+ + "\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R"+ + "\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000"+ + "\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000"+ + "\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000"+ + "`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001"+ + "\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000"+ + "\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000"+ + "n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001"+ + "\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000"+ + "\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0000"+ + "|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080\u0001"+ + "\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084\u0001"+ + "\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000\u0088\u0001"+ + "\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000\u008c\u0001"+ + "\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000\u0090\u0001"+ + "\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000\u0094\u0001"+ + "\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000\u0098\u0001"+ + "\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000\u009c\u0001"+ + "\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000\u00a0\u0001"+ + "\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000\u00a4\u0001"+ + "\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000\u00a8\u0001"+ + "\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000\u00ac\u0001"+ + "\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000\u00b0\u0001"+ + "\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000\u00b4\u0001"+ + "\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000\u00b8\u0001"+ + "\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000\u00bc\u0001"+ + "\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000\u00c0\u0001"+ + "\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000\u00c4\u0001"+ + "\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000\u00c8\u0001"+ + "\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000\u00cc\u0001"+ + "\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000\u00d0\u0001"+ + "\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000\u00d4\u0001"+ + "\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000\u00d8\u0001"+ + "\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000\u00dc\u0001"+ + "\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000\u00e0\u0001"+ + "\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000\u00e4\u0001"+ + "\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000\u00e8\u0001"+ + "\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000\u00ec\u0001"+ + "\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000\u00f0\u0001"+ + "\u0000\u0000\u0000\u0000\u00f2\u0001\u0000\u0000\u0000\u0000\u00f4\u0001"+ + "\u0000\u0000\u0000\u0000\u00f6\u0001\u0000\u0000\u0000\u0000\u00f8\u0001"+ + "\u0000\u0000\u0000\u0000\u00fa\u0001\u0000\u0000\u0000\u0000\u00fc\u0001"+ + "\u0000\u0000\u0000\u0000\u00fe\u0001\u0000\u0000\u0000\u0000\u0100\u0001"+ + "\u0000\u0000\u0000\u0000\u0102\u0001\u0000\u0000\u0000\u0000\u0104\u0001"+ + "\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000\u0108\u0001"+ + "\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0000\u010c\u0001"+ + "\u0000\u0000\u0000\u0000\u010e\u0001\u0000\u0000\u0000\u0000\u0110\u0001"+ + "\u0000\u0000\u0000\u0000\u0112\u0001\u0000\u0000\u0000\u0000\u0114\u0001"+ + "\u0000\u0000\u0000\u0000\u0116\u0001\u0000\u0000\u0000\u0000\u0118\u0001"+ + "\u0000\u0000\u0000\u0000\u011a\u0001\u0000\u0000\u0000\u0000\u011c\u0001"+ + "\u0000\u0000\u0000\u0000\u011e\u0001\u0000\u0000\u0000\u0000\u0120\u0001"+ + "\u0000\u0000\u0000\u0000\u0122\u0001\u0000\u0000\u0000\u0000\u0128\u0001"+ + "\u0000\u0000\u0000\u0000\u012c\u0001\u0000\u0000\u0000\u0000\u012e\u0001"+ + "\u0000\u0000\u0000\u0000\u0130\u0001\u0000\u0000\u0000\u0000\u0132\u0001"+ + "\u0000\u0000\u0000\u0000\u0134\u0001\u0000\u0000\u0000\u0000\u0136\u0001"+ + "\u0000\u0000\u0000\u0000\u0138\u0001\u0000\u0000\u0000\u0000\u013a\u0001"+ + "\u0000\u0000\u0000\u0000\u013c\u0001\u0000\u0000\u0000\u0000\u013e\u0001"+ + "\u0000\u0000\u0000\u0000\u0140\u0001\u0000\u0000\u0000\u0000\u0142\u0001"+ + "\u0000\u0000\u0000\u0001\u0158\u0001\u0000\u0000\u0000\u0001\u015a\u0001"+ + "\u0000\u0000\u0000\u0001\u015c\u0001\u0000\u0000\u0000\u0001\u015e\u0001"+ + "\u0000\u0000\u0000\u0001\u0160\u0001\u0000\u0000\u0000\u0002\u0164\u0001"+ + "\u0000\u0000\u0000\u0004\u017a\u0001\u0000\u0000\u0000\u0006\u017c\u0001"+ + "\u0000\u0000\u0000\b\u0183\u0001\u0000\u0000\u0000\n\u018b\u0001\u0000"+ + "\u0000\u0000\f\u0192\u0001\u0000\u0000\u0000\u000e\u0199\u0001\u0000\u0000"+ + "\u0000\u0010\u01a0\u0001\u0000\u0000\u0000\u0012\u01a7\u0001\u0000\u0000"+ + "\u0000\u0014\u01b0\u0001\u0000\u0000\u0000\u0016\u01ba\u0001\u0000\u0000"+ + "\u0000\u0018\u01c2\u0001\u0000\u0000\u0000\u001a\u01cc\u0001\u0000\u0000"+ + "\u0000\u001c\u01d8\u0001\u0000\u0000\u0000\u001e\u01df\u0001\u0000\u0000"+ + "\u0000 \u01ea\u0001\u0000\u0000\u0000\"\u01ed\u0001\u0000\u0000\u0000"+ + "$\u01f3\u0001\u0000\u0000\u0000&\u01fc\u0001\u0000\u0000\u0000(\u0201"+ + "\u0001\u0000\u0000\u0000*\u0208\u0001\u0000\u0000\u0000,\u020f\u0001\u0000"+ + "\u0000\u0000.\u0215\u0001\u0000\u0000\u00000\u021a\u0001\u0000\u0000\u0000"+ + "2\u0221\u0001\u0000\u0000\u00004\u022b\u0001\u0000\u0000\u00006\u022f"+ + "\u0001\u0000\u0000\u00008\u0235\u0001\u0000\u0000\u0000:\u0238\u0001\u0000"+ + "\u0000\u0000<\u023a\u0001\u0000\u0000\u0000>\u0241\u0001\u0000\u0000\u0000"+ + "@\u0247\u0001\u0000\u0000\u0000B\u0254\u0001\u0000\u0000\u0000D\u025d"+ + "\u0001\u0000\u0000\u0000F\u0261\u0001\u0000\u0000\u0000H\u0265\u0001\u0000"+ + "\u0000\u0000J\u026b\u0001\u0000\u0000\u0000L\u026d\u0001\u0000\u0000\u0000"+ + "N\u0270\u0001\u0000\u0000\u0000P\u0275\u0001\u0000\u0000\u0000R\u027b"+ + "\u0001\u0000\u0000\u0000T\u0281\u0001\u0000\u0000\u0000V\u0288\u0001\u0000"+ + "\u0000\u0000X\u028f\u0001\u0000\u0000\u0000Z\u0298\u0001\u0000\u0000\u0000"+ + "\\\u02a3\u0001\u0000\u0000\u0000^\u02a9\u0001\u0000\u0000\u0000`\u02af"+ + "\u0001\u0000\u0000\u0000b\u02b6\u0001\u0000\u0000\u0000d\u02bc\u0001\u0000"+ + "\u0000\u0000f\u02c3\u0001\u0000\u0000\u0000h\u02c9\u0001\u0000\u0000\u0000"+ + "j\u02d2\u0001\u0000\u0000\u0000l\u02da\u0001\u0000\u0000\u0000n\u02e0"+ + "\u0001\u0000\u0000\u0000p\u02e8\u0001\u0000\u0000\u0000r\u02ef\u0001\u0000"+ + "\u0000\u0000t\u02f4\u0001\u0000\u0000\u0000v\u02fd\u0001\u0000\u0000\u0000"+ + "x\u030c\u0001\u0000\u0000\u0000z\u0312\u0001\u0000\u0000\u0000|\u0316"+ + "\u0001\u0000\u0000\u0000~\u0319\u0001\u0000\u0000\u0000\u0080\u0320\u0001"+ + "\u0000\u0000\u0000\u0082\u032a\u0001\u0000\u0000\u0000\u0084\u0334\u0001"+ + "\u0000\u0000\u0000\u0086\u0340\u0001\u0000\u0000\u0000\u0088\u0349\u0001"+ + "\u0000\u0000\u0000\u008a\u0353\u0001\u0000\u0000\u0000\u008c\u035b\u0001"+ + "\u0000\u0000\u0000\u008e\u0367\u0001\u0000\u0000\u0000\u0090\u0376\u0001"+ + "\u0000\u0000\u0000\u0092\u037c\u0001\u0000\u0000\u0000\u0094\u0380\u0001"+ + "\u0000\u0000\u0000\u0096\u0384\u0001\u0000\u0000\u0000\u0098\u0389\u0001"+ + "\u0000\u0000\u0000\u009a\u0392\u0001\u0000\u0000\u0000\u009c\u0399\u0001"+ + "\u0000\u0000\u0000\u009e\u03a1\u0001\u0000\u0000\u0000\u00a0\u03a9\u0001"+ + "\u0000\u0000\u0000\u00a2\u03ae\u0001\u0000\u0000\u0000\u00a4\u03b8\u0001"+ + "\u0000\u0000\u0000\u00a6\u03bf\u0001\u0000\u0000\u0000\u00a8\u03c4\u0001"+ + "\u0000\u0000\u0000\u00aa\u03ca\u0001\u0000\u0000\u0000\u00ac\u03cd\u0001"+ + "\u0000\u0000\u0000\u00ae\u03d1\u0001\u0000\u0000\u0000\u00b0\u03d8\u0001"+ + "\u0000\u0000\u0000\u00b2\u03dd\u0001\u0000\u0000\u0000\u00b4\u03e2\u0001"+ + "\u0000\u0000\u0000\u00b6\u03e7\u0001\u0000\u0000\u0000\u00b8\u03ef\u0001"+ + "\u0000\u0000\u0000\u00ba\u03f6\u0001\u0000\u0000\u0000\u00bc\u03fc\u0001"+ + "\u0000\u0000\u0000\u00be\u040a\u0001\u0000\u0000\u0000\u00c0\u040d\u0001"+ + "\u0000\u0000\u0000\u00c2\u0413\u0001\u0000\u0000\u0000\u00c4\u0418\u0001"+ + "\u0000\u0000\u0000\u00c6\u0423\u0001\u0000\u0000\u0000\u00c8\u0427\u0001"+ + "\u0000\u0000\u0000\u00ca\u042e\u0001\u0000\u0000\u0000\u00cc\u0437\u0001"+ + "\u0000\u0000\u0000\u00ce\u043b\u0001\u0000\u0000\u0000\u00d0\u0441\u0001"+ + "\u0000\u0000\u0000\u00d2\u044b\u0001\u0000\u0000\u0000\u00d4\u044d\u0001"+ + "\u0000\u0000\u0000\u00d6\u0451\u0001\u0000\u0000\u0000\u00d8\u0453\u0001"+ + "\u0000\u0000\u0000\u00da\u0457\u0001\u0000\u0000\u0000\u00dc\u0459\u0001"+ + "\u0000\u0000\u0000\u00de\u045d\u0001\u0000\u0000\u0000\u00e0\u045f\u0001"+ + "\u0000\u0000\u0000\u00e2\u0461\u0001\u0000\u0000\u0000\u00e4\u0463\u0001"+ + "\u0000\u0000\u0000\u00e6\u0465\u0001\u0000\u0000\u0000\u00e8\u0467\u0001"+ + "\u0000\u0000\u0000\u00ea\u046c\u0001\u0000\u0000\u0000\u00ec\u0471\u0001"+ + "\u0000\u0000\u0000\u00ee\u0474\u0001\u0000\u0000\u0000\u00f0\u0478\u0001"+ + "\u0000\u0000\u0000\u00f2\u047b\u0001\u0000\u0000\u0000\u00f4\u047e\u0001"+ + "\u0000\u0000\u0000\u00f6\u0481\u0001\u0000\u0000\u0000\u00f8\u0484\u0001"+ + "\u0000\u0000\u0000\u00fa\u0486\u0001\u0000\u0000\u0000\u00fc\u0489\u0001"+ + "\u0000\u0000\u0000\u00fe\u048b\u0001\u0000\u0000\u0000\u0100\u048e\u0001"+ + "\u0000\u0000\u0000\u0102\u0490\u0001\u0000\u0000\u0000\u0104\u0492\u0001"+ + "\u0000\u0000\u0000\u0106\u0494\u0001\u0000\u0000\u0000\u0108\u0497\u0001"+ + "\u0000\u0000\u0000\u010a\u049a\u0001\u0000\u0000\u0000\u010c\u049d\u0001"+ + "\u0000\u0000\u0000\u010e\u049f\u0001\u0000\u0000\u0000\u0110\u04a1\u0001"+ + "\u0000\u0000\u0000\u0112\u04a3\u0001\u0000\u0000\u0000\u0114\u04a5\u0001"+ + "\u0000\u0000\u0000\u0116\u04a7\u0001\u0000\u0000\u0000\u0118\u04a9\u0001"+ + "\u0000\u0000\u0000\u011a\u04b7\u0001\u0000\u0000\u0000\u011c\u04bb\u0001"+ + "\u0000\u0000\u0000\u011e\u04c7\u0001\u0000\u0000\u0000\u0120\u04d5\u0001"+ + "\u0000\u0000\u0000\u0122\u04e1\u0001\u0000\u0000\u0000\u0124\u0505\u0001"+ + "\u0000\u0000\u0000\u0126\u0507\u0001\u0000\u0000\u0000\u0128\u0512\u0001"+ + "\u0000\u0000\u0000\u012a\u0518\u0001\u0000\u0000\u0000\u012c\u051f\u0001"+ + "\u0000\u0000\u0000\u012e\u0525\u0001\u0000\u0000\u0000\u0130\u0527\u0001"+ + "\u0000\u0000\u0000\u0132\u052c\u0001\u0000\u0000\u0000\u0134\u0531\u0001"+ + "\u0000\u0000\u0000\u0136\u0538\u0001\u0000\u0000\u0000\u0138\u0543\u0001"+ + "\u0000\u0000\u0000\u013a\u054e\u0001\u0000\u0000\u0000\u013c\u055b\u0001"+ + "\u0000\u0000\u0000\u013e\u0561\u0001\u0000\u0000\u0000\u0140\u0570\u0001"+ + "\u0000\u0000\u0000\u0142\u0576\u0001\u0000\u0000\u0000\u0144\u0585\u0001"+ + "\u0000\u0000\u0000\u0146\u0587\u0001\u0000\u0000\u0000\u0148\u05a3\u0001"+ + "\u0000\u0000\u0000\u014a\u05ad\u0001\u0000\u0000\u0000\u014c\u05af\u0001"+ + "\u0000\u0000\u0000\u014e\u05b1\u0001\u0000\u0000\u0000\u0150\u05b3\u0001"+ + "\u0000\u0000\u0000\u0152\u05bb\u0001\u0000\u0000\u0000\u0154\u05bd\u0001"+ + "\u0000\u0000\u0000\u0156\u05bf\u0001\u0000\u0000\u0000\u0158\u05c2\u0001"+ + "\u0000\u0000\u0000\u015a\u05c8\u0001\u0000\u0000\u0000\u015c\u05d6\u0001"+ + "\u0000\u0000\u0000\u015e\u05f3\u0001\u0000\u0000\u0000\u0160\u05f7\u0001"+ + "\u0000\u0000\u0000\u0162\u0165\u0003\u0004\u0001\u0000\u0163\u0165\u0003"+ + "\u0122\u0090\u0000\u0164\u0162\u0001\u0000\u0000\u0000\u0164\u0163\u0001"+ + "\u0000\u0000\u0000\u0165\u0166\u0001\u0000\u0000\u0000\u0166\u0167\u0006"+ + "\u0000\u0000\u0000\u0167\u0003\u0001\u0000\u0000\u0000\u0168\u0172\u0003"+ + "\u0148\u00a3\u0000\u0169\u016a\u0005.\u0000\u0000\u016a\u016c\u0004\u0001"+ + "\u0000\u0000\u016b\u016d\u0003\u0148\u00a3\u0000\u016c\u016b\u0001\u0000"+ + "\u0000\u0000\u016c\u016d\u0001\u0000\u0000\u0000\u016d\u016f\u0001\u0000"+ + "\u0000\u0000\u016e\u0170\u0003\u0150\u00a7\u0000\u016f\u016e\u0001\u0000"+ + "\u0000\u0000\u016f\u0170\u0001\u0000\u0000\u0000\u0170\u0173\u0001\u0000"+ + "\u0000\u0000\u0171\u0173\u0003\u0150\u00a7\u0000\u0172\u0169\u0001\u0000"+ + "\u0000\u0000\u0172\u0171\u0001\u0000\u0000\u0000\u0173\u017b\u0001\u0000"+ + "\u0000\u0000\u0174\u0175\u0005.\u0000\u0000\u0175\u0176\u0004\u0001\u0001"+ + "\u0000\u0176\u0178\u0003\u0148\u00a3\u0000\u0177\u0179\u0003\u0150\u00a7"+ + "\u0000\u0178\u0177\u0001\u0000\u0000\u0000\u0178\u0179\u0001\u0000\u0000"+ + "\u0000\u0179\u017b\u0001\u0000\u0000\u0000\u017a\u0168\u0001\u0000\u0000"+ + "\u0000\u017a\u0174\u0001\u0000\u0000\u0000\u017b\u0005\u0001\u0000\u0000"+ + "\u0000\u017c\u017d\u0005t\u0000\u0000\u017d\u017e\u0005r\u0000\u0000\u017e"+ + "\u017f\u0005u\u0000\u0000\u017f\u0180\u0005e\u0000\u0000\u0180\u0181\u0001"+ + "\u0000\u0000\u0000\u0181\u0182\u0006\u0002\u0000\u0000\u0182\u0007\u0001"+ + "\u0000\u0000\u0000\u0183\u0184\u0005f\u0000\u0000\u0184\u0185\u0005a\u0000"+ + "\u0000\u0185\u0186\u0005l\u0000\u0000\u0186\u0187\u0005s\u0000\u0000\u0187"+ + "\u0188\u0005e\u0000\u0000\u0188\u0189\u0001\u0000\u0000\u0000\u0189\u018a"+ + "\u0006\u0003\u0000\u0000\u018a\t\u0001\u0000\u0000\u0000\u018b\u018c\u0005"+ + "a\u0000\u0000\u018c\u018d\u0005s\u0000\u0000\u018d\u018e\u0005s\u0000"+ + "\u0000\u018e\u018f\u0005e\u0000\u0000\u018f\u0190\u0005r\u0000\u0000\u0190"+ + "\u0191\u0005t\u0000\u0000\u0191\u000b\u0001\u0000\u0000\u0000\u0192\u0193"+ + "\u0005a\u0000\u0000\u0193\u0194\u0005s\u0000\u0000\u0194\u0195\u0005s"+ + "\u0000\u0000\u0195\u0196\u0005u\u0000\u0000\u0196\u0197\u0005m\u0000\u0000"+ + "\u0197\u0198\u0005e\u0000\u0000\u0198\r\u0001\u0000\u0000\u0000\u0199"+ + "\u019a\u0005i\u0000\u0000\u019a\u019b\u0005n\u0000\u0000\u019b\u019c\u0005"+ + "h\u0000\u0000\u019c\u019d\u0005a\u0000\u0000\u019d\u019e\u0005l\u0000"+ + "\u0000\u019e\u019f\u0005e\u0000\u0000\u019f\u000f\u0001\u0000\u0000\u0000"+ + "\u01a0\u01a1\u0005e\u0000\u0000\u01a1\u01a2\u0005x\u0000\u0000\u01a2\u01a3"+ + "\u0005h\u0000\u0000\u01a3\u01a4\u0005a\u0000\u0000\u01a4\u01a5\u0005l"+ + "\u0000\u0000\u01a5\u01a6\u0005e\u0000\u0000\u01a6\u0011\u0001\u0000\u0000"+ + "\u0000\u01a7\u01a8\u0005r\u0000\u0000\u01a8\u01a9\u0005e\u0000\u0000\u01a9"+ + "\u01aa\u0005q\u0000\u0000\u01aa\u01ab\u0005u\u0000\u0000\u01ab\u01ac\u0005"+ + "i\u0000\u0000\u01ac\u01ad\u0005r\u0000\u0000\u01ad\u01ae\u0005e\u0000"+ + "\u0000\u01ae\u01af\u0005s\u0000\u0000\u01af\u0013\u0001\u0000\u0000\u0000"+ + "\u01b0\u01b1\u0005p\u0000\u0000\u01b1\u01b2\u0005r\u0000\u0000\u01b2\u01b3"+ + "\u0005e\u0000\u0000\u01b3\u01b4\u0005s\u0000\u0000\u01b4\u01b5\u0005e"+ + "\u0000\u0000\u01b5\u01b6\u0005r\u0000\u0000\u01b6\u01b7\u0005v\u0000\u0000"+ + "\u01b7\u01b8\u0005e\u0000\u0000\u01b8\u01b9\u0005s\u0000\u0000\u01b9\u0015"+ + "\u0001\u0000\u0000\u0000\u01ba\u01bb\u0005e\u0000\u0000\u01bb\u01bc\u0005"+ + "n\u0000\u0000\u01bc\u01bd\u0005s\u0000\u0000\u01bd\u01be\u0005u\u0000"+ + "\u0000\u01be\u01bf\u0005r\u0000\u0000\u01bf\u01c0\u0005e\u0000\u0000\u01c0"+ + "\u01c1\u0005s\u0000\u0000\u01c1\u0017\u0001\u0000\u0000\u0000\u01c2\u01c3"+ + "\u0005i\u0000\u0000\u01c3\u01c4\u0005n\u0000\u0000\u01c4\u01c5\u0005v"+ + "\u0000\u0000\u01c5\u01c6\u0005a\u0000\u0000\u01c6\u01c7\u0005r\u0000\u0000"+ + "\u01c7\u01c8\u0005i\u0000\u0000\u01c8\u01c9\u0005a\u0000\u0000\u01c9\u01ca"+ + "\u0005n\u0000\u0000\u01ca\u01cb\u0005t\u0000\u0000\u01cb\u0019\u0001\u0000"+ + "\u0000\u0000\u01cc\u01cd\u0005d\u0000\u0000\u01cd\u01ce\u0005e\u0000\u0000"+ + "\u01ce\u01cf\u0005c\u0000\u0000\u01cf\u01d0\u0005r\u0000\u0000\u01d0\u01d1"+ + "\u0005e\u0000\u0000\u01d1\u01d2\u0005a\u0000\u0000\u01d2\u01d3\u0005s"+ + "\u0000\u0000\u01d3\u01d4\u0005e\u0000\u0000\u01d4\u01d5\u0005s\u0000\u0000"+ + "\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0006\f\u0000\u0000\u01d7"+ + "\u001b\u0001\u0000\u0000\u0000\u01d8\u01d9\u0005p\u0000\u0000\u01d9\u01da"+ + "\u0005u\u0000\u0000\u01da\u01db\u0005r\u0000\u0000\u01db\u01dc\u0005e"+ + "\u0000\u0000\u01dc\u01dd\u0001\u0000\u0000\u0000\u01dd\u01de\u0006\r\u0000"+ + "\u0000\u01de\u001d\u0001\u0000\u0000\u0000\u01df\u01e0\u0005i\u0000\u0000"+ + "\u01e0\u01e1\u0005m\u0000\u0000\u01e1\u01e2\u0005p\u0000\u0000\u01e2\u01e3"+ + "\u0005l\u0000\u0000\u01e3\u01e4\u0005e\u0000\u0000\u01e4\u01e5\u0005m"+ + "\u0000\u0000\u01e5\u01e6\u0005e\u0000\u0000\u01e6\u01e7\u0005n\u0000\u0000"+ + "\u01e7\u01e8\u0005t\u0000\u0000\u01e8\u01e9\u0005s\u0000\u0000\u01e9\u001f"+ + "\u0001\u0000\u0000\u0000\u01ea\u01eb\u0005a\u0000\u0000\u01eb\u01ec\u0005"+ + "s\u0000\u0000\u01ec!\u0001\u0000\u0000\u0000\u01ed\u01ee\u0005o\u0000"+ + "\u0000\u01ee\u01ef\u0005l\u0000\u0000\u01ef\u01f0\u0005d\u0000\u0000\u01f0"+ + "\u01f1\u0001\u0000\u0000\u0000\u01f1\u01f2\u0006\u0010\u0000\u0000\u01f2"+ + "#\u0001\u0000\u0000\u0000\u01f3\u01f4\u0005b\u0000\u0000\u01f4\u01f5\u0005"+ + "e\u0000\u0000\u01f5\u01f6\u0005f\u0000\u0000\u01f6\u01f7\u0005o\u0000"+ + "\u0000\u01f7\u01f8\u0005r\u0000\u0000\u01f8\u01f9\u0005e\u0000\u0000\u01f9"+ + "\u01fa\u0001\u0000\u0000\u0000\u01fa\u01fb\u0006\u0011\u0000\u0000\u01fb"+ + "%\u0001\u0000\u0000\u0000\u01fc\u01fd\u0005#\u0000\u0000\u01fd\u01fe\u0005"+ + "l\u0000\u0000\u01fe\u01ff\u0005h\u0000\u0000\u01ff\u0200\u0005s\u0000"+ + "\u0000\u0200\'\u0001\u0000\u0000\u0000\u0201\u0202\u0005f\u0000\u0000"+ + "\u0202\u0203\u0005o\u0000\u0000\u0203\u0204\u0005r\u0000\u0000\u0204\u0205"+ + "\u0005a\u0000\u0000\u0205\u0206\u0005l\u0000\u0000\u0206\u0207\u0005l"+ + "\u0000\u0000\u0207)\u0001\u0000\u0000\u0000\u0208\u0209\u0005e\u0000\u0000"+ + "\u0209\u020a\u0005x\u0000\u0000\u020a\u020b\u0005i\u0000\u0000\u020b\u020c"+ + "\u0005s\u0000\u0000\u020c\u020d\u0005t\u0000\u0000\u020d\u020e\u0005s"+ + "\u0000\u0000\u020e+\u0001\u0000\u0000\u0000\u020f\u0210\u0005a\u0000\u0000"+ + "\u0210\u0211\u0005c\u0000\u0000\u0211\u0212\u0005c\u0000\u0000\u0212\u0213"+ + "\u0001\u0000\u0000\u0000\u0213\u0214\u0006\u0015\u0000\u0000\u0214-\u0001"+ + "\u0000\u0000\u0000\u0215\u0216\u0005f\u0000\u0000\u0216\u0217\u0005o\u0000"+ + "\u0000\u0217\u0218\u0005l\u0000\u0000\u0218\u0219\u0005d\u0000\u0000\u0219"+ + "/\u0001\u0000\u0000\u0000\u021a\u021b\u0005u\u0000\u0000\u021b\u021c\u0005"+ + "n\u0000\u0000\u021c\u021d\u0005f\u0000\u0000\u021d\u021e\u0005o\u0000"+ + "\u0000\u021e\u021f\u0005l\u0000\u0000\u021f\u0220\u0005d\u0000\u0000\u0220"+ + "1\u0001\u0000\u0000\u0000\u0221\u0222\u0005u\u0000\u0000\u0222\u0223\u0005"+ + "n\u0000\u0000\u0223\u0224\u0005f\u0000\u0000\u0224\u0225\u0005o\u0000"+ + "\u0000\u0225\u0226\u0005l\u0000\u0000\u0226\u0227\u0005d\u0000\u0000\u0227"+ + "\u0228\u0005i\u0000\u0000\u0228\u0229\u0005n\u0000\u0000\u0229\u022a\u0005"+ + "g\u0000\u0000\u022a3\u0001\u0000\u0000\u0000\u022b\u022c\u0005l\u0000"+ + "\u0000\u022c\u022d\u0005e\u0000\u0000\u022d\u022e\u0005t\u0000\u0000\u022e"+ + "5\u0001\u0000\u0000\u0000\u022f\u0230\u0005g\u0000\u0000\u0230\u0231\u0005"+ + "h\u0000\u0000\u0231\u0232\u0005o\u0000\u0000\u0232\u0233\u0005s\u0000"+ + "\u0000\u0233\u0234\u0005t\u0000\u0000\u02347\u0001\u0000\u0000\u0000\u0235"+ + "\u0236\u0005i\u0000\u0000\u0236\u0237\u0005n\u0000\u0000\u02379\u0001"+ + "\u0000\u0000\u0000\u0238\u0239\u0005#\u0000\u0000\u0239;\u0001\u0000\u0000"+ + "\u0000\u023a\u023b\u0005s\u0000\u0000\u023b\u023c\u0005u\u0000\u0000\u023c"+ + "\u023d\u0005b\u0000\u0000\u023d\u023e\u0005s\u0000\u0000\u023e\u023f\u0005"+ + "e\u0000\u0000\u023f\u0240\u0005t\u0000\u0000\u0240=\u0001\u0000\u0000"+ + "\u0000\u0241\u0242\u0005u\u0000\u0000\u0242\u0243\u0005n\u0000\u0000\u0243"+ + "\u0244\u0005i\u0000\u0000\u0244\u0245\u0005o\u0000\u0000\u0245\u0246\u0005"+ + "n\u0000\u0000\u0246?\u0001\u0000\u0000\u0000\u0247\u0248\u0005i\u0000"+ + "\u0000\u0248\u0249\u0005n\u0000\u0000\u0249\u024a\u0005t\u0000\u0000\u024a"+ + "\u024b\u0005e\u0000\u0000\u024b\u024c\u0005r\u0000\u0000\u024c\u024d\u0005"+ + "s\u0000\u0000\u024d\u024e\u0005e\u0000\u0000\u024e\u024f\u0005c\u0000"+ + "\u0000\u024f\u0250\u0005t\u0000\u0000\u0250\u0251\u0005i\u0000\u0000\u0251"+ + "\u0252\u0005o\u0000\u0000\u0252\u0253\u0005n\u0000\u0000\u0253A\u0001"+ + "\u0000\u0000\u0000\u0254\u0255\u0005s\u0000\u0000\u0255\u0256\u0005e\u0000"+ + "\u0000\u0256\u0257\u0005t\u0000\u0000\u0257\u0258\u0005m\u0000\u0000\u0258"+ + "\u0259\u0005i\u0000\u0000\u0259\u025a\u0005n\u0000\u0000\u025a\u025b\u0005"+ + "u\u0000\u0000\u025b\u025c\u0005s\u0000\u0000\u025cC\u0001\u0000\u0000"+ + "\u0000\u025d\u025e\u0005=\u0000\u0000\u025e\u025f\u0005=\u0000\u0000\u025f"+ + "\u0260\u0005>\u0000\u0000\u0260E\u0001\u0000\u0000\u0000\u0261\u0262\u0005"+ + "-\u0000\u0000\u0262\u0263\u0005-\u0000\u0000\u0263\u0264\u0005*\u0000"+ + "\u0000\u0264G\u0001\u0000\u0000\u0000\u0265\u0266\u0005a\u0000\u0000\u0266"+ + "\u0267\u0005p\u0000\u0000\u0267\u0268\u0005p\u0000\u0000\u0268\u0269\u0005"+ + "l\u0000\u0000\u0269\u026a\u0005y\u0000\u0000\u026aI\u0001\u0000\u0000"+ + "\u0000\u026b\u026c\u0005?\u0000\u0000\u026cK\u0001\u0000\u0000\u0000\u026d"+ + "\u026e\u0005!\u0000\u0000\u026e\u026f\u0005<\u0000\u0000\u026fM\u0001"+ + "\u0000\u0000\u0000\u0270\u0271\u0005!\u0000\u0000\u0271\u0272\u0005>\u0000"+ + "\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0274\u0006&\u0000\u0000"+ + "\u0274O\u0001\u0000\u0000\u0000\u0275\u0276\u0005s\u0000\u0000\u0276\u0277"+ + "\u0005e\u0000\u0000\u0277\u0278\u0005q\u0000\u0000\u0278\u0279\u0001\u0000"+ + "\u0000\u0000\u0279\u027a\u0006\'\u0000\u0000\u027aQ\u0001\u0000\u0000"+ + "\u0000\u027b\u027c\u0005s\u0000\u0000\u027c\u027d\u0005e\u0000\u0000\u027d"+ + "\u027e\u0005t\u0000\u0000\u027e\u027f\u0001\u0000\u0000\u0000\u027f\u0280"+ + "\u0006(\u0000\u0000\u0280S\u0001\u0000\u0000\u0000\u0281\u0282\u0005m"+ + "\u0000\u0000\u0282\u0283\u0005s\u0000\u0000\u0283\u0284\u0005e\u0000\u0000"+ + "\u0284\u0285\u0005t\u0000\u0000\u0285\u0286\u0001\u0000\u0000\u0000\u0286"+ + "\u0287\u0006)\u0000\u0000\u0287U\u0001\u0000\u0000\u0000\u0288\u0289\u0005"+ + "d\u0000\u0000\u0289\u028a\u0005i\u0000\u0000\u028a\u028b\u0005c\u0000"+ + "\u0000\u028b\u028c\u0005t\u0000\u0000\u028c\u028d\u0001\u0000\u0000\u0000"+ + "\u028d\u028e\u0006*\u0000\u0000\u028eW\u0001\u0000\u0000\u0000\u028f\u0290"+ + "\u0005o\u0000\u0000\u0290\u0291\u0005p\u0000\u0000\u0291\u0292\u0005t"+ + "\u0000\u0000\u0292\u0293\u0005i\u0000\u0000\u0293\u0294\u0005o\u0000\u0000"+ + "\u0294\u0295\u0005n\u0000\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296"+ + "\u0297\u0006+\u0000\u0000\u0297Y\u0001\u0000\u0000\u0000\u0298\u0299\u0005"+ + "g\u0000\u0000\u0299\u029a\u0005p\u0000\u0000\u029a\u029b\u0005o\u0000"+ + "\u0000\u029b\u029c\u0005i\u0000\u0000\u029c\u029d\u0005n\u0000\u0000\u029d"+ + "\u029e\u0005t\u0000\u0000\u029e\u029f\u0005e\u0000\u0000\u029f\u02a0\u0005"+ + "r\u0000\u0000\u02a0\u02a1\u0001\u0000\u0000\u0000\u02a1\u02a2\u0006,\u0000"+ + "\u0000\u02a2[\u0001\u0000\u0000\u0000\u02a3\u02a4\u0005l\u0000\u0000\u02a4"+ + "\u02a5\u0005e\u0000\u0000\u02a5\u02a6\u0005n\u0000\u0000\u02a6\u02a7\u0001"+ + "\u0000\u0000\u0000\u02a7\u02a8\u0006-\u0000\u0000\u02a8]\u0001\u0000\u0000"+ + "\u0000\u02a9\u02aa\u0005n\u0000\u0000\u02aa\u02ab\u0005e\u0000\u0000\u02ab"+ + "\u02ac\u0005w\u0000\u0000\u02ac\u02ad\u0001\u0000\u0000\u0000\u02ad\u02ae"+ + "\u0006.\u0000\u0000\u02ae_\u0001\u0000\u0000\u0000\u02af\u02b0\u0005m"+ + "\u0000\u0000\u02b0\u02b1\u0005a\u0000\u0000\u02b1\u02b2\u0005k\u0000\u0000"+ + "\u02b2\u02b3\u0005e\u0000\u0000\u02b3\u02b4\u0001\u0000\u0000\u0000\u02b4"+ + "\u02b5\u0006/\u0000\u0000\u02b5a\u0001\u0000\u0000\u0000\u02b6\u02b7\u0005"+ + "c\u0000\u0000\u02b7\u02b8\u0005a\u0000\u0000\u02b8\u02b9\u0005p\u0000"+ + "\u0000\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bb\u00060\u0000\u0000"+ + "\u02bbc\u0001\u0000\u0000\u0000\u02bc\u02bd\u0005s\u0000\u0000\u02bd\u02be"+ + "\u0005o\u0000\u0000\u02be\u02bf\u0005m\u0000\u0000\u02bf\u02c0\u0005e"+ + "\u0000\u0000\u02c0\u02c1\u0001\u0000\u0000\u0000\u02c1\u02c2\u00061\u0000"+ + "\u0000\u02c2e\u0001\u0000\u0000\u0000\u02c3\u02c4\u0005g\u0000\u0000\u02c4"+ + "\u02c5\u0005e\u0000\u0000\u02c5\u02c6\u0005t\u0000\u0000\u02c6\u02c7\u0001"+ + "\u0000\u0000\u0000\u02c7\u02c8\u00062\u0000\u0000\u02c8g\u0001\u0000\u0000"+ + "\u0000\u02c9\u02ca\u0005d\u0000\u0000\u02ca\u02cb\u0005o\u0000\u0000\u02cb"+ + "\u02cc\u0005m\u0000\u0000\u02cc\u02cd\u0005a\u0000\u0000\u02cd\u02ce\u0005"+ + "i\u0000\u0000\u02ce\u02cf\u0005n\u0000\u0000\u02cf\u02d0\u0001\u0000\u0000"+ + "\u0000\u02d0\u02d1\u00063\u0000\u0000\u02d1i\u0001\u0000\u0000\u0000\u02d2"+ + "\u02d3\u0005a\u0000\u0000\u02d3\u02d4\u0005x\u0000\u0000\u02d4\u02d5\u0005"+ + "i\u0000\u0000\u02d5\u02d6\u0005o\u0000\u0000\u02d6\u02d7\u0005m\u0000"+ + "\u0000\u02d7\u02d8\u0001\u0000\u0000\u0000\u02d8\u02d9\u00064\u0000\u0000"+ + "\u02d9k\u0001\u0000\u0000\u0000\u02da\u02db\u0005a\u0000\u0000\u02db\u02dc"+ + "\u0005d\u0000\u0000\u02dc\u02dd\u0005t\u0000\u0000\u02dd\u02de\u0001\u0000"+ + "\u0000\u0000\u02de\u02df\u00065\u0000\u0000\u02dfm\u0001\u0000\u0000\u0000"+ + "\u02e0\u02e1\u0005m\u0000\u0000\u02e1\u02e2\u0005a\u0000\u0000\u02e2\u02e3"+ + "\u0005t\u0000\u0000\u02e3\u02e4\u0005c\u0000\u0000\u02e4\u02e5\u0005h"+ + "\u0000\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u02e7\u00066\u0000"+ + "\u0000\u02e7o\u0001\u0000\u0000\u0000\u02e8\u02e9\u0005n\u0000\u0000\u02e9"+ + "\u02ea\u0005o\u0000\u0000\u02ea\u02eb\u0005n\u0000\u0000\u02eb\u02ec\u0005"+ + "e\u0000\u0000\u02ec\u02ed\u0001\u0000\u0000\u0000\u02ed\u02ee\u00067\u0000"+ + "\u0000\u02eeq\u0001\u0000\u0000\u0000\u02ef\u02f0\u0005p\u0000\u0000\u02f0"+ + "\u02f1\u0005r\u0000\u0000\u02f1\u02f2\u0005e\u0000\u0000\u02f2\u02f3\u0005"+ + "d\u0000\u0000\u02f3s\u0001\u0000\u0000\u0000\u02f4\u02f5\u0005t\u0000"+ + "\u0000\u02f5\u02f6\u0005y\u0000\u0000\u02f6\u02f7\u0005p\u0000\u0000\u02f7"+ + "\u02f8\u0005e\u0000\u0000\u02f8\u02f9\u0005O\u0000\u0000\u02f9\u02fa\u0005"+ + "f\u0000\u0000\u02fa\u02fb\u0001\u0000\u0000\u0000\u02fb\u02fc\u00069\u0000"+ + "\u0000\u02fcu\u0001\u0000\u0000\u0000\u02fd\u02fe\u0005i\u0000\u0000\u02fe"+ + "\u02ff\u0005s\u0000\u0000\u02ff\u0300\u0005C\u0000\u0000\u0300\u0301\u0005"+ + "o\u0000\u0000\u0301\u0302\u0005m\u0000\u0000\u0302\u0303\u0005p\u0000"+ + "\u0000\u0303\u0304\u0005a\u0000\u0000\u0304\u0305\u0005r\u0000\u0000\u0305"+ + "\u0306\u0005a\u0000\u0000\u0306\u0307\u0005b\u0000\u0000\u0307\u0308\u0005"+ + "l\u0000\u0000\u0308\u0309\u0005e\u0000\u0000\u0309\u030a\u0001\u0000\u0000"+ + "\u0000\u030a\u030b\u0006:\u0000\u0000\u030bw\u0001\u0000\u0000\u0000\u030c"+ + "\u030d\u0005s\u0000\u0000\u030d\u030e\u0005h\u0000\u0000\u030e\u030f\u0005"+ + "a\u0000\u0000\u030f\u0310\u0005r\u0000\u0000\u0310\u0311\u0005e\u0000"+ + "\u0000\u0311y\u0001\u0000\u0000\u0000\u0312\u0313\u0005@\u0000\u0000\u0313"+ + "\u0314\u0001\u0000\u0000\u0000\u0314\u0315\u0006<\u0000\u0000\u0315{\u0001"+ + "\u0000\u0000\u0000\u0316\u0317\u0005.\u0000\u0000\u0317\u0318\u0005.\u0000"+ + "\u0000\u0318}\u0001\u0000\u0000\u0000\u0319\u031a\u0005s\u0000\u0000\u031a"+ + "\u031b\u0005h\u0000\u0000\u031b\u031c\u0005a\u0000\u0000\u031c\u031d\u0005"+ + "r\u0000\u0000\u031d\u031e\u0005e\u0000\u0000\u031e\u031f\u0005d\u0000"+ + "\u0000\u031f\u007f\u0001\u0000\u0000\u0000\u0320\u0321\u0005e\u0000\u0000"+ + "\u0321\u0322\u0005x\u0000\u0000\u0322\u0323\u0005c\u0000\u0000\u0323\u0324"+ + "\u0005l\u0000\u0000\u0324\u0325\u0005u\u0000\u0000\u0325\u0326\u0005s"+ + "\u0000\u0000\u0326\u0327\u0005i\u0000\u0000\u0327\u0328\u0005v\u0000\u0000"+ + "\u0328\u0329\u0005e\u0000\u0000\u0329\u0081\u0001\u0000\u0000\u0000\u032a"+ + "\u032b\u0005p\u0000\u0000\u032b\u032c\u0005r\u0000\u0000\u032c\u032d\u0005"+ + "e\u0000\u0000\u032d\u032e\u0005d\u0000\u0000\u032e\u032f\u0005i\u0000"+ + "\u0000\u032f\u0330\u0005c\u0000\u0000\u0330\u0331\u0005a\u0000\u0000\u0331"+ + "\u0332\u0005t\u0000\u0000\u0332\u0333\u0005e\u0000\u0000\u0333\u0083\u0001"+ + "\u0000\u0000\u0000\u0334\u0335\u0005w\u0000\u0000\u0335\u0336\u0005r\u0000"+ + "\u0000\u0336\u0337\u0005i\u0000\u0000\u0337\u0338\u0005t\u0000\u0000\u0338"+ + "\u0339\u0005e\u0000\u0000\u0339\u033a\u0005P\u0000\u0000\u033a\u033b\u0005"+ + "e\u0000\u0000\u033b\u033c\u0005r\u0000\u0000\u033c\u033d\u0005m\u0000"+ + "\u0000\u033d\u033e\u0001\u0000\u0000\u0000\u033e\u033f\u0006A\u0000\u0000"+ + "\u033f\u0085\u0001\u0000\u0000\u0000\u0340\u0341\u0005n\u0000\u0000\u0341"+ + "\u0342\u0005o\u0000\u0000\u0342\u0343\u0005P\u0000\u0000\u0343\u0344\u0005"+ + "e\u0000\u0000\u0344\u0345\u0005r\u0000\u0000\u0345\u0346\u0005m\u0000"+ + "\u0000\u0346\u0347\u0001\u0000\u0000\u0000\u0347\u0348\u0006B\u0000\u0000"+ + "\u0348\u0087\u0001\u0000\u0000\u0000\u0349\u034a\u0005t\u0000\u0000\u034a"+ + "\u034b\u0005r\u0000\u0000\u034b\u034c\u0005u\u0000\u0000\u034c\u034d\u0005"+ + "s\u0000\u0000\u034d\u034e\u0005t\u0000\u0000\u034e\u034f\u0005e\u0000"+ + "\u0000\u034f\u0350\u0005d\u0000\u0000\u0350\u0351\u0001\u0000\u0000\u0000"+ + "\u0351\u0352\u0006C\u0000\u0000\u0352\u0089\u0001\u0000\u0000\u0000\u0353"+ + "\u0354\u0005o\u0000\u0000\u0354\u0355\u0005u\u0000\u0000\u0355\u0356\u0005"+ + "t\u0000\u0000\u0356\u0357\u0005l\u0000\u0000\u0357\u0358\u0005i\u0000"+ + "\u0000\u0358\u0359\u0005n\u0000\u0000\u0359\u035a\u0005e\u0000\u0000\u035a"+ + "\u008b\u0001\u0000\u0000\u0000\u035b\u035c\u0005i\u0000\u0000\u035c\u035d"+ + "\u0005n\u0000\u0000\u035d\u035e\u0005i\u0000\u0000\u035e\u035f\u0005t"+ + "\u0000\u0000\u035f\u0360\u0005E\u0000\u0000\u0360\u0361\u0005n\u0000\u0000"+ + "\u0361\u0362\u0005s\u0000\u0000\u0362\u0363\u0005u\u0000\u0000\u0363\u0364"+ + "\u0005r\u0000\u0000\u0364\u0365\u0005e\u0000\u0000\u0365\u0366\u0005s"+ + "\u0000\u0000\u0366\u008d\u0001\u0000\u0000\u0000\u0367\u0368\u0005i\u0000"+ + "\u0000\u0368\u0369\u0005m\u0000\u0000\u0369\u036a\u0005p\u0000\u0000\u036a"+ + "\u036b\u0005o\u0000\u0000\u036b\u036c\u0005r\u0000\u0000\u036c\u036d\u0005"+ + "t\u0000\u0000\u036d\u036e\u0005R\u0000\u0000\u036e\u036f\u0005e\u0000"+ + "\u0000\u036f\u0370\u0005q\u0000\u0000\u0370\u0371\u0005u\u0000\u0000\u0371"+ + "\u0372\u0005i\u0000\u0000\u0372\u0373\u0005r\u0000\u0000\u0373\u0374\u0005"+ + "e\u0000\u0000\u0374\u0375\u0005s\u0000\u0000\u0375\u008f\u0001\u0000\u0000"+ + "\u0000\u0376\u0377\u0005p\u0000\u0000\u0377\u0378\u0005r\u0000\u0000\u0378"+ + "\u0379\u0005o\u0000\u0000\u0379\u037a\u0005o\u0000\u0000\u037a\u037b\u0005"+ + "f\u0000\u0000\u037b\u0091\u0001\u0000\u0000\u0000\u037c\u037d\u0005=\u0000"+ + "\u0000\u037d\u037e\u0005=\u0000\u0000\u037e\u037f\u0005=\u0000\u0000\u037f"+ + "\u0093\u0001\u0000\u0000\u0000\u0380\u0381\u0005!\u0000\u0000\u0381\u0382"+ + "\u0005=\u0000\u0000\u0382\u0383\u0005=\u0000\u0000\u0383\u0095\u0001\u0000"+ + "\u0000\u0000\u0384\u0385\u0005w\u0000\u0000\u0385\u0386\u0005i\u0000\u0000"+ + "\u0386\u0387\u0005t\u0000\u0000\u0387\u0388\u0005h\u0000\u0000\u0388\u0097"+ + "\u0001\u0000\u0000\u0000\u0389\u038a\u0005o\u0000\u0000\u038a\u038b\u0005"+ + "p\u0000\u0000\u038b\u038c\u0005a\u0000\u0000\u038c\u038d\u0005q\u0000"+ + "\u0000\u038d\u038e\u0005u\u0000\u0000\u038e\u038f\u0005e\u0000\u0000\u038f"+ + "\u0390\u0001\u0000\u0000\u0000\u0390\u0391\u0006K\u0000\u0000\u0391\u0099"+ + "\u0001\u0000\u0000\u0000\u0392\u0393\u0005r\u0000\u0000\u0393\u0394\u0005"+ + "e\u0000\u0000\u0394\u0395\u0005v\u0000\u0000\u0395\u0396\u0005e\u0000"+ + "\u0000\u0396\u0397\u0005a\u0000\u0000\u0397\u0398\u0005l\u0000\u0000\u0398"+ + "\u009b\u0001\u0000\u0000\u0000\u0399\u039a\u0005b\u0000\u0000\u039a\u039b"+ + "\u0005r\u0000\u0000\u039b\u039c\u0005e\u0000\u0000\u039c\u039d\u0005a"+ + "\u0000\u0000\u039d\u039e\u0005k\u0000\u0000\u039e\u039f\u0001\u0000\u0000"+ + "\u0000\u039f\u03a0\u0006M\u0000\u0000\u03a0\u009d\u0001\u0000\u0000\u0000"+ + "\u03a1\u03a2\u0005d\u0000\u0000\u03a2\u03a3\u0005e\u0000\u0000\u03a3\u03a4"+ + "\u0005f\u0000\u0000\u03a4\u03a5\u0005a\u0000\u0000\u03a5\u03a6\u0005u"+ + "\u0000\u0000\u03a6\u03a7\u0005l\u0000\u0000\u03a7\u03a8\u0005t\u0000\u0000"+ + "\u03a8\u009f\u0001\u0000\u0000\u0000\u03a9\u03aa\u0005f\u0000\u0000\u03aa"+ + "\u03ab\u0005u\u0000\u0000\u03ab\u03ac\u0005n\u0000\u0000\u03ac\u03ad\u0005"+ + "c\u0000\u0000\u03ad\u00a1\u0001\u0000\u0000\u0000\u03ae\u03af\u0005i\u0000"+ + "\u0000\u03af\u03b0\u0005n\u0000\u0000\u03b0\u03b1\u0005t\u0000\u0000\u03b1"+ + "\u03b2\u0005e\u0000\u0000\u03b2\u03b3\u0005r\u0000\u0000\u03b3\u03b4\u0005"+ + "f\u0000\u0000\u03b4\u03b5\u0005a\u0000\u0000\u03b5\u03b6\u0005c\u0000"+ + "\u0000\u03b6\u03b7\u0005e\u0000\u0000\u03b7\u00a3\u0001\u0000\u0000\u0000"+ + "\u03b8\u03b9\u0005s\u0000\u0000\u03b9\u03ba\u0005e\u0000\u0000\u03ba\u03bb"+ + "\u0005l\u0000\u0000\u03bb\u03bc\u0005e\u0000\u0000\u03bc\u03bd\u0005c"+ + "\u0000\u0000\u03bd\u03be\u0005t\u0000\u0000\u03be\u00a5\u0001\u0000\u0000"+ + "\u0000\u03bf\u03c0\u0005c\u0000\u0000\u03c0\u03c1\u0005a\u0000\u0000\u03c1"+ + "\u03c2\u0005s\u0000\u0000\u03c2\u03c3\u0005e\u0000\u0000\u03c3\u00a7\u0001"+ + "\u0000\u0000\u0000\u03c4\u03c5\u0005d\u0000\u0000\u03c5\u03c6\u0005e\u0000"+ + "\u0000\u03c6\u03c7\u0005f\u0000\u0000\u03c7\u03c8\u0005e\u0000\u0000\u03c8"+ + "\u03c9\u0005r\u0000\u0000\u03c9\u00a9\u0001\u0000\u0000\u0000\u03ca\u03cb"+ + "\u0005g\u0000\u0000\u03cb\u03cc\u0005o\u0000\u0000\u03cc\u00ab\u0001\u0000"+ + "\u0000\u0000\u03cd\u03ce\u0005m\u0000\u0000\u03ce\u03cf\u0005a\u0000\u0000"+ + "\u03cf\u03d0\u0005p\u0000\u0000\u03d0\u00ad\u0001\u0000\u0000\u0000\u03d1"+ + "\u03d2\u0005s\u0000\u0000\u03d2\u03d3\u0005t\u0000\u0000\u03d3\u03d4\u0005"+ + "r\u0000\u0000\u03d4\u03d5\u0005u\u0000\u0000\u03d5\u03d6\u0005c\u0000"+ + "\u0000\u03d6\u03d7\u0005t\u0000\u0000\u03d7\u00af\u0001\u0000\u0000\u0000"+ + "\u03d8\u03d9\u0005c\u0000\u0000\u03d9\u03da\u0005h\u0000\u0000\u03da\u03db"+ + "\u0005a\u0000\u0000\u03db\u03dc\u0005n\u0000\u0000\u03dc\u00b1\u0001\u0000"+ + "\u0000\u0000\u03dd\u03de\u0005e\u0000\u0000\u03de\u03df\u0005l\u0000\u0000"+ + "\u03df\u03e0\u0005s\u0000\u0000\u03e0\u03e1\u0005e\u0000\u0000\u03e1\u00b3"+ + "\u0001\u0000\u0000\u0000\u03e2\u03e3\u0005g\u0000\u0000\u03e3\u03e4\u0005"+ + "o\u0000\u0000\u03e4\u03e5\u0005t\u0000\u0000\u03e5\u03e6\u0005o\u0000"+ + "\u0000\u03e6\u00b5\u0001\u0000\u0000\u0000\u03e7\u03e8\u0005p\u0000\u0000"+ + "\u03e8\u03e9\u0005a\u0000\u0000\u03e9\u03ea\u0005c\u0000\u0000\u03ea\u03eb"+ + "\u0005k\u0000\u0000\u03eb\u03ec\u0005a\u0000\u0000\u03ec\u03ed\u0005g"+ + "\u0000\u0000\u03ed\u03ee\u0005e\u0000\u0000\u03ee\u00b7\u0001\u0000\u0000"+ + "\u0000\u03ef\u03f0\u0005s\u0000\u0000\u03f0\u03f1\u0005w\u0000\u0000\u03f1"+ + "\u03f2\u0005i\u0000\u0000\u03f2\u03f3\u0005t\u0000\u0000\u03f3\u03f4\u0005"+ + "c\u0000\u0000\u03f4\u03f5\u0005h\u0000\u0000\u03f5\u00b9\u0001\u0000\u0000"+ + "\u0000\u03f6\u03f7\u0005c\u0000\u0000\u03f7\u03f8\u0005o\u0000\u0000\u03f8"+ + "\u03f9\u0005n\u0000\u0000\u03f9\u03fa\u0005s\u0000\u0000\u03fa\u03fb\u0005"+ + "t\u0000\u0000\u03fb\u00bb\u0001\u0000\u0000\u0000\u03fc\u03fd\u0005f\u0000"+ + "\u0000\u03fd\u03fe\u0005a\u0000\u0000\u03fe\u03ff\u0005l\u0000\u0000\u03ff"+ + "\u0400\u0005l\u0000\u0000\u0400\u0401\u0005t\u0000\u0000\u0401\u0402\u0005"+ + "h\u0000\u0000\u0402\u0403\u0005r\u0000\u0000\u0403\u0404\u0005o\u0000"+ + "\u0000\u0404\u0405\u0005u\u0000\u0000\u0405\u0406\u0005g\u0000\u0000\u0406"+ + "\u0407\u0005h\u0000\u0000\u0407\u0408\u0001\u0000\u0000\u0000\u0408\u0409"+ + "\u0006]\u0000\u0000\u0409\u00bd\u0001\u0000\u0000\u0000\u040a\u040b\u0005"+ + "i\u0000\u0000\u040b\u040c\u0005f\u0000\u0000\u040c\u00bf\u0001\u0000\u0000"+ + "\u0000\u040d\u040e\u0005r\u0000\u0000\u040e\u040f\u0005a\u0000\u0000\u040f"+ + "\u0410\u0005n\u0000\u0000\u0410\u0411\u0005g\u0000\u0000\u0411\u0412\u0005"+ + "e\u0000\u0000\u0412\u00c1\u0001\u0000\u0000\u0000\u0413\u0414\u0005t\u0000"+ + "\u0000\u0414\u0415\u0005y\u0000\u0000\u0415\u0416\u0005p\u0000\u0000\u0416"+ + "\u0417\u0005e\u0000\u0000\u0417\u00c3\u0001\u0000\u0000\u0000\u0418\u0419"+ + "\u0005c\u0000\u0000\u0419\u041a\u0005o\u0000\u0000\u041a\u041b\u0005n"+ + "\u0000\u0000\u041b\u041c\u0005t\u0000\u0000\u041c\u041d\u0005i\u0000\u0000"+ + "\u041d\u041e\u0005n\u0000\u0000\u041e\u041f\u0005u\u0000\u0000\u041f\u0420"+ + "\u0005e\u0000\u0000\u0420\u0421\u0001\u0000\u0000\u0000\u0421\u0422\u0006"+ + "a\u0000\u0000\u0422\u00c5\u0001\u0000\u0000\u0000\u0423\u0424\u0005f\u0000"+ + "\u0000\u0424\u0425\u0005o\u0000\u0000\u0425\u0426\u0005r\u0000\u0000\u0426"+ + "\u00c7\u0001\u0000\u0000\u0000\u0427\u0428\u0005i\u0000\u0000\u0428\u0429"+ + "\u0005m\u0000\u0000\u0429\u042a\u0005p\u0000\u0000\u042a\u042b\u0005o"+ + "\u0000\u0000\u042b\u042c\u0005r\u0000\u0000\u042c\u042d\u0005t\u0000\u0000"+ + "\u042d\u00c9\u0001\u0000\u0000\u0000\u042e\u042f\u0005r\u0000\u0000\u042f"+ + "\u0430\u0005e\u0000\u0000\u0430\u0431\u0005t\u0000\u0000\u0431\u0432\u0005"+ + "u\u0000\u0000\u0432\u0433\u0005r\u0000\u0000\u0433\u0434\u0005n\u0000"+ + "\u0000\u0434\u0435\u0001\u0000\u0000\u0000\u0435\u0436\u0006d\u0000\u0000"+ + "\u0436\u00cb\u0001\u0000\u0000\u0000\u0437\u0438\u0005v\u0000\u0000\u0438"+ + "\u0439\u0005a\u0000\u0000\u0439\u043a\u0005r\u0000\u0000\u043a\u00cd\u0001"+ + "\u0000\u0000\u0000\u043b\u043c\u0005n\u0000\u0000\u043c\u043d\u0005i\u0000"+ + "\u0000\u043d\u043e\u0005l\u0000\u0000\u043e\u043f\u0001\u0000\u0000\u0000"+ + "\u043f\u0440\u0006f\u0000\u0000\u0440\u00cf\u0001\u0000\u0000\u0000\u0441"+ + "\u0446\u0003\u0152\u00a8\u0000\u0442\u0445\u0003\u0152\u00a8\u0000\u0443"+ + "\u0445\u0003\u0154\u00a9\u0000\u0444\u0442\u0001\u0000\u0000\u0000\u0444"+ + "\u0443\u0001\u0000\u0000\u0000\u0445\u0448\u0001\u0000\u0000\u0000\u0446"+ + "\u0444\u0001\u0000\u0000\u0000\u0446\u0447\u0001\u0000\u0000\u0000\u0447"+ + "\u0449\u0001\u0000\u0000\u0000\u0448\u0446\u0001\u0000\u0000\u0000\u0449"+ + "\u044a\u0006g\u0000\u0000\u044a\u00d1\u0001\u0000\u0000\u0000\u044b\u044c"+ + "\u0005(\u0000\u0000\u044c\u00d3\u0001\u0000\u0000\u0000\u044d\u044e\u0005"+ + ")\u0000\u0000\u044e\u044f\u0001\u0000\u0000\u0000\u044f\u0450\u0006i\u0000"+ + "\u0000\u0450\u00d5\u0001\u0000\u0000\u0000\u0451\u0452\u0005{\u0000\u0000"+ + "\u0452\u00d7\u0001\u0000\u0000\u0000\u0453\u0454\u0005}\u0000\u0000\u0454"+ + "\u0455\u0001\u0000\u0000\u0000\u0455\u0456\u0006k\u0000\u0000\u0456\u00d9"+ + "\u0001\u0000\u0000\u0000\u0457\u0458\u0005[\u0000\u0000\u0458\u00db\u0001"+ + "\u0000\u0000\u0000\u0459\u045a\u0005]\u0000\u0000\u045a\u045b\u0001\u0000"+ + "\u0000\u0000\u045b\u045c\u0006m\u0000\u0000\u045c\u00dd\u0001\u0000\u0000"+ + "\u0000\u045d\u045e\u0005=\u0000\u0000\u045e\u00df\u0001\u0000\u0000\u0000"+ + "\u045f\u0460\u0005,\u0000\u0000\u0460\u00e1\u0001\u0000\u0000\u0000\u0461"+ + "\u0462\u0005;\u0000\u0000\u0462\u00e3\u0001\u0000\u0000\u0000\u0463\u0464"+ + "\u0005:\u0000\u0000\u0464\u00e5\u0001\u0000\u0000\u0000\u0465\u0466\u0005"+ + ".\u0000\u0000\u0466\u00e7\u0001\u0000\u0000\u0000\u0467\u0468\u0005+\u0000"+ + "\u0000\u0468\u0469\u0005+\u0000\u0000\u0469\u046a\u0001\u0000\u0000\u0000"+ + "\u046a\u046b\u0006s\u0000\u0000\u046b\u00e9\u0001\u0000\u0000\u0000\u046c"+ + "\u046d\u0005-\u0000\u0000\u046d\u046e\u0005-\u0000\u0000\u046e\u046f\u0001"+ + "\u0000\u0000\u0000\u046f\u0470\u0006t\u0000\u0000\u0470\u00eb\u0001\u0000"+ + "\u0000\u0000\u0471\u0472\u0005:\u0000\u0000\u0472\u0473\u0005=\u0000\u0000"+ + "\u0473\u00ed\u0001\u0000\u0000\u0000\u0474\u0475\u0005.\u0000\u0000\u0475"+ + "\u0476\u0005.\u0000\u0000\u0476\u0477\u0005.\u0000\u0000\u0477\u00ef\u0001"+ + "\u0000\u0000\u0000\u0478\u0479\u0005|\u0000\u0000\u0479\u047a\u0005|\u0000"+ + "\u0000\u047a\u00f1\u0001\u0000\u0000\u0000\u047b\u047c\u0005&\u0000\u0000"+ + "\u047c\u047d\u0005&\u0000\u0000\u047d\u00f3\u0001\u0000\u0000\u0000\u047e"+ + "\u047f\u0005=\u0000\u0000\u047f\u0480\u0005=\u0000\u0000\u0480\u00f5\u0001"+ + "\u0000\u0000\u0000\u0481\u0482\u0005!\u0000\u0000\u0482\u0483\u0005=\u0000"+ + "\u0000\u0483\u00f7\u0001\u0000\u0000\u0000\u0484\u0485\u0005<\u0000\u0000"+ + "\u0485\u00f9\u0001\u0000\u0000\u0000\u0486\u0487\u0005<\u0000\u0000\u0487"+ + "\u0488\u0005=\u0000\u0000\u0488\u00fb\u0001\u0000\u0000\u0000\u0489\u048a"+ + "\u0005>\u0000\u0000\u048a\u00fd\u0001\u0000\u0000\u0000\u048b\u048c\u0005"+ + ">\u0000\u0000\u048c\u048d\u0005=\u0000\u0000\u048d\u00ff\u0001\u0000\u0000"+ + "\u0000\u048e\u048f\u0005|\u0000\u0000\u048f\u0101\u0001\u0000\u0000\u0000"+ + "\u0490\u0491\u0005/\u0000\u0000\u0491\u0103\u0001\u0000\u0000\u0000\u0492"+ + "\u0493\u0005%\u0000\u0000\u0493\u0105\u0001\u0000\u0000\u0000\u0494\u0495"+ + "\u0005<\u0000\u0000\u0495\u0496\u0005<\u0000\u0000\u0496\u0107\u0001\u0000"+ + "\u0000\u0000\u0497\u0498\u0005>\u0000\u0000\u0498\u0499\u0005>\u0000\u0000"+ + "\u0499\u0109\u0001\u0000\u0000\u0000\u049a\u049b\u0005&\u0000\u0000\u049b"+ + "\u049c\u0005^\u0000\u0000\u049c\u010b\u0001\u0000\u0000\u0000\u049d\u049e"+ + "\u0005!\u0000\u0000\u049e\u010d\u0001\u0000\u0000\u0000\u049f\u04a0\u0005"+ + "+\u0000\u0000\u04a0\u010f\u0001\u0000\u0000\u0000\u04a1\u04a2\u0005-\u0000"+ + "\u0000\u04a2\u0111\u0001\u0000\u0000\u0000\u04a3\u04a4\u0005^\u0000\u0000"+ + "\u04a4\u0113\u0001\u0000\u0000\u0000\u04a5\u04a6\u0005*\u0000\u0000\u04a6"+ + "\u0115\u0001\u0000\u0000\u0000\u04a7\u04a8\u0005&\u0000\u0000\u04a8\u0117"+ + "\u0001\u0000\u0000\u0000\u04a9\u04aa\u0005<\u0000\u0000\u04aa\u04ab\u0005"+ + "-\u0000\u0000\u04ab\u0119\u0001\u0000\u0000\u0000\u04ac\u04b8\u00050\u0000"+ + "\u0000\u04ad\u04b4\u0007\u0000\u0000\u0000\u04ae\u04b0\u0005_\u0000\u0000"+ + "\u04af\u04ae\u0001\u0000\u0000\u0000\u04af\u04b0\u0001\u0000\u0000\u0000"+ + "\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u04b3\u0007\u0001\u0000\u0000"+ + "\u04b2\u04af\u0001\u0000\u0000\u0000\u04b3\u04b6\u0001\u0000\u0000\u0000"+ + "\u04b4\u04b2\u0001\u0000\u0000\u0000\u04b4\u04b5\u0001\u0000\u0000\u0000"+ + "\u04b5\u04b8\u0001\u0000\u0000\u0000\u04b6\u04b4\u0001\u0000\u0000\u0000"+ + "\u04b7\u04ac\u0001\u0000\u0000\u0000\u04b7\u04ad\u0001\u0000\u0000\u0000"+ + "\u04b8\u04b9\u0001\u0000\u0000\u0000\u04b9\u04ba\u0006\u008c\u0000\u0000"+ + "\u04ba\u011b\u0001\u0000\u0000\u0000\u04bb\u04bc\u00050\u0000\u0000\u04bc"+ + "\u04c1\u0007\u0002\u0000\u0000\u04bd\u04bf\u0005_\u0000\u0000\u04be\u04bd"+ + "\u0001\u0000\u0000\u0000\u04be\u04bf\u0001\u0000\u0000\u0000\u04bf\u04c0"+ + "\u0001\u0000\u0000\u0000\u04c0\u04c2\u0003\u014e\u00a6\u0000\u04c1\u04be"+ + "\u0001\u0000\u0000\u0000\u04c2\u04c3\u0001\u0000\u0000\u0000\u04c3\u04c1"+ + "\u0001\u0000\u0000\u0000\u04c3\u04c4\u0001\u0000\u0000\u0000\u04c4\u04c5"+ + "\u0001\u0000\u0000\u0000\u04c5\u04c6\u0006\u008d\u0000\u0000\u04c6\u011d"+ + "\u0001\u0000\u0000\u0000\u04c7\u04c9\u00050\u0000\u0000\u04c8\u04ca\u0007"+ + "\u0003\u0000\u0000\u04c9\u04c8\u0001\u0000\u0000\u0000\u04c9\u04ca\u0001"+ + "\u0000\u0000\u0000\u04ca\u04cf\u0001\u0000\u0000\u0000\u04cb\u04cd\u0005"+ + "_\u0000\u0000\u04cc\u04cb\u0001\u0000\u0000\u0000\u04cc\u04cd\u0001\u0000"+ + "\u0000\u0000\u04cd\u04ce\u0001\u0000\u0000\u0000\u04ce\u04d0\u0003\u014a"+ + "\u00a4\u0000\u04cf\u04cc\u0001\u0000\u0000\u0000\u04d0\u04d1\u0001\u0000"+ + "\u0000\u0000\u04d1\u04cf\u0001\u0000\u0000\u0000\u04d1\u04d2\u0001\u0000"+ + "\u0000\u0000\u04d2\u04d3\u0001\u0000\u0000\u0000\u04d3\u04d4\u0006\u008e"+ + "\u0000\u0000\u04d4\u011f\u0001\u0000\u0000\u0000\u04d5\u04d6\u00050\u0000"+ + "\u0000\u04d6\u04db\u0007\u0004\u0000\u0000\u04d7\u04d9\u0005_\u0000\u0000"+ + "\u04d8\u04d7\u0001\u0000\u0000\u0000\u04d8\u04d9\u0001\u0000\u0000\u0000"+ + "\u04d9\u04da\u0001\u0000\u0000\u0000\u04da\u04dc\u0003\u014c\u00a5\u0000"+ + "\u04db\u04d8\u0001\u0000\u0000\u0000\u04dc\u04dd\u0001\u0000\u0000\u0000"+ + "\u04dd\u04db\u0001\u0000\u0000\u0000\u04dd\u04de\u0001\u0000\u0000\u0000"+ + "\u04de\u04df\u0001\u0000\u0000\u0000\u04df\u04e0\u0006\u008f\u0000\u0000"+ + "\u04e0\u0121\u0001\u0000\u0000\u0000\u04e1\u04e2\u00050\u0000\u0000\u04e2"+ + "\u04e3\u0007\u0004\u0000\u0000\u04e3\u04e4\u0003\u0124\u0091\u0000\u04e4"+ + "\u04e5\u0003\u0126\u0092\u0000\u04e5\u0123\u0001\u0000\u0000\u0000\u04e6"+ + "\u04e8\u0005_\u0000\u0000\u04e7\u04e6\u0001\u0000\u0000\u0000\u04e7\u04e8"+ + "\u0001\u0000\u0000\u0000\u04e8\u04e9\u0001\u0000\u0000\u0000\u04e9\u04eb"+ + "\u0003\u014c\u00a5\u0000\u04ea\u04e7\u0001\u0000\u0000\u0000\u04eb\u04ec"+ + "\u0001\u0000\u0000\u0000\u04ec\u04ea\u0001\u0000\u0000\u0000\u04ec\u04ed"+ + "\u0001\u0000\u0000\u0000\u04ed\u04f8\u0001\u0000\u0000\u0000\u04ee\u04f5"+ + "\u0005.\u0000\u0000\u04ef\u04f1\u0005_\u0000\u0000\u04f0\u04ef\u0001\u0000"+ + "\u0000\u0000\u04f0\u04f1\u0001\u0000\u0000\u0000\u04f1\u04f2\u0001\u0000"+ + "\u0000\u0000\u04f2\u04f4\u0003\u014c\u00a5\u0000\u04f3\u04f0\u0001\u0000"+ + "\u0000\u0000\u04f4\u04f7\u0001\u0000\u0000\u0000\u04f5\u04f3\u0001\u0000"+ + "\u0000\u0000\u04f5\u04f6\u0001\u0000\u0000\u0000\u04f6\u04f9\u0001\u0000"+ + "\u0000\u0000\u04f7\u04f5\u0001\u0000\u0000\u0000\u04f8\u04ee\u0001\u0000"+ + "\u0000\u0000\u04f8\u04f9\u0001\u0000\u0000\u0000\u04f9\u0506\u0001\u0000"+ + "\u0000\u0000\u04fa\u04fb\u0005.\u0000\u0000\u04fb\u0502\u0003\u014c\u00a5"+ + "\u0000\u04fc\u04fe\u0005_\u0000\u0000\u04fd\u04fc\u0001\u0000\u0000\u0000"+ + "\u04fd\u04fe\u0001\u0000\u0000\u0000\u04fe\u04ff\u0001\u0000\u0000\u0000"+ + "\u04ff\u0501\u0003\u014c\u00a5\u0000\u0500\u04fd\u0001\u0000\u0000\u0000"+ + "\u0501\u0504\u0001\u0000\u0000\u0000\u0502\u0500\u0001\u0000\u0000\u0000"+ + "\u0502\u0503\u0001\u0000\u0000\u0000\u0503\u0506\u0001\u0000\u0000\u0000"+ + "\u0504\u0502\u0001\u0000\u0000\u0000\u0505\u04ea\u0001\u0000\u0000\u0000"+ + "\u0505\u04fa\u0001\u0000\u0000\u0000\u0506\u0125\u0001\u0000\u0000\u0000"+ + "\u0507\u0509\u0007\u0005\u0000\u0000\u0508\u050a\u0007\u0006\u0000\u0000"+ + "\u0509\u0508\u0001\u0000\u0000\u0000\u0509\u050a\u0001\u0000\u0000\u0000"+ + "\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050c\u0003\u0148\u00a3\u0000"+ + "\u050c\u0127\u0001\u0000\u0000\u0000\u050d\u0513\u0003\u011a\u008c\u0000"+ + "\u050e\u0513\u0003\u011c\u008d\u0000\u050f\u0513\u0003\u011e\u008e\u0000"+ + "\u0510\u0513\u0003\u0120\u008f\u0000\u0511\u0513\u0003\u0002\u0000\u0000"+ + "\u0512\u050d\u0001\u0000\u0000\u0000\u0512\u050e\u0001\u0000\u0000\u0000"+ + "\u0512\u050f\u0001\u0000\u0000\u0000\u0512\u0510\u0001\u0000\u0000\u0000"+ + "\u0512\u0511\u0001\u0000\u0000\u0000\u0513\u0514\u0001\u0000\u0000\u0000"+ + "\u0514\u0515\u0005i\u0000\u0000\u0515\u0516\u0001\u0000\u0000\u0000\u0516"+ + "\u0517\u0006\u0093\u0000\u0000\u0517\u0129\u0001\u0000\u0000\u0000\u0518"+ + "\u051b\u0005\'\u0000\u0000\u0519\u051c\u0003\u0144\u00a1\u0000\u051a\u051c"+ + "\u0003\u012e\u0096\u0000\u051b\u0519\u0001\u0000\u0000\u0000\u051b\u051a"+ + "\u0001\u0000\u0000\u0000\u051c\u051d\u0001\u0000\u0000\u0000\u051d\u051e"+ + "\u0005\'\u0000\u0000\u051e\u012b\u0001\u0000\u0000\u0000\u051f\u0520\u0003"+ + "\u012a\u0094\u0000\u0520\u0521\u0001\u0000\u0000\u0000\u0521\u0522\u0006"+ + "\u0095\u0000\u0000\u0522\u012d\u0001\u0000\u0000\u0000\u0523\u0526\u0003"+ + "\u0130\u0097\u0000\u0524\u0526\u0003\u0132\u0098\u0000\u0525\u0523\u0001"+ + "\u0000\u0000\u0000\u0525\u0524\u0001\u0000\u0000\u0000\u0526\u012f\u0001"+ + "\u0000\u0000\u0000\u0527\u0528\u0005\\\u0000\u0000\u0528\u0529\u0003\u014a"+ + "\u00a4\u0000\u0529\u052a\u0003\u014a\u00a4\u0000\u052a\u052b\u0003\u014a"+ + "\u00a4\u0000\u052b\u0131\u0001\u0000\u0000\u0000\u052c\u052d\u0005\\\u0000"+ + "\u0000\u052d\u052e\u0005x\u0000\u0000\u052e\u052f\u0003\u014c\u00a5\u0000"+ + "\u052f\u0530\u0003\u014c\u00a5\u0000\u0530\u0133\u0001\u0000\u0000\u0000"+ + "\u0531\u0532\u0005\\\u0000\u0000\u0532\u0533\u0005u\u0000\u0000\u0533"+ + "\u0534\u0003\u014c\u00a5\u0000\u0534\u0535\u0003\u014c\u00a5\u0000\u0535"+ + "\u0536\u0003\u014c\u00a5\u0000\u0536\u0537\u0003\u014c\u00a5\u0000\u0537"+ + "\u0135\u0001\u0000\u0000\u0000\u0538\u0539\u0005\\\u0000\u0000\u0539\u053a"+ + "\u0005U\u0000\u0000\u053a\u053b\u0003\u014c\u00a5\u0000\u053b\u053c\u0003"+ + "\u014c\u00a5\u0000\u053c\u053d\u0003\u014c\u00a5\u0000\u053d\u053e\u0003"+ + "\u014c\u00a5\u0000\u053e\u053f\u0003\u014c\u00a5\u0000\u053f\u0540\u0003"+ + "\u014c\u00a5\u0000\u0540\u0541\u0003\u014c\u00a5\u0000\u0541\u0542\u0003"+ + "\u014c\u00a5\u0000\u0542\u0137\u0001\u0000\u0000\u0000\u0543\u0547\u0005"+ + "`\u0000\u0000\u0544\u0546\b\u0007\u0000\u0000\u0545\u0544\u0001\u0000"+ + "\u0000\u0000\u0546\u0549\u0001\u0000\u0000\u0000\u0547\u0545\u0001\u0000"+ + "\u0000\u0000\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u054a\u0001\u0000"+ + "\u0000\u0000\u0549\u0547\u0001\u0000\u0000\u0000\u054a\u054b\u0005`\u0000"+ + "\u0000\u054b\u054c\u0001\u0000\u0000\u0000\u054c\u054d\u0006\u009b\u0000"+ + "\u0000\u054d\u0139\u0001\u0000\u0000\u0000\u054e\u0553\u0005\"\u0000\u0000"+ + "\u054f\u0552\b\b\u0000\u0000\u0550\u0552\u0003\u0146\u00a2\u0000\u0551"+ + "\u054f\u0001\u0000\u0000\u0000\u0551\u0550\u0001\u0000\u0000\u0000\u0552"+ + "\u0555\u0001\u0000\u0000\u0000\u0553\u0551\u0001\u0000\u0000\u0000\u0553"+ + "\u0554\u0001\u0000\u0000\u0000\u0554\u0556\u0001\u0000\u0000\u0000\u0555"+ + "\u0553\u0001\u0000\u0000\u0000\u0556\u0557\u0005\"\u0000\u0000\u0557\u0558"+ + "\u0001\u0000\u0000\u0000\u0558\u0559\u0006\u009c\u0000\u0000\u0559\u013b"+ + "\u0001\u0000\u0000\u0000\u055a\u055c\u0007\t\u0000\u0000\u055b\u055a\u0001"+ + "\u0000\u0000\u0000\u055c\u055d\u0001\u0000\u0000\u0000\u055d\u055b\u0001"+ + "\u0000\u0000\u0000\u055d\u055e\u0001\u0000\u0000\u0000\u055e\u055f\u0001"+ + "\u0000\u0000\u0000\u055f\u0560\u0006\u009d\u0001\u0000\u0560\u013d\u0001"+ + "\u0000\u0000\u0000\u0561\u0562\u0005/\u0000\u0000\u0562\u0563\u0005*\u0000"+ + "\u0000\u0563\u0567\u0001\u0000\u0000\u0000\u0564\u0566\t\u0000\u0000\u0000"+ + "\u0565\u0564\u0001\u0000\u0000\u0000\u0566\u0569\u0001\u0000\u0000\u0000"+ + "\u0567\u0568\u0001\u0000\u0000\u0000\u0567\u0565\u0001\u0000\u0000\u0000"+ + "\u0568\u056a\u0001\u0000\u0000\u0000\u0569\u0567\u0001\u0000\u0000\u0000"+ + "\u056a\u056b\u0005*\u0000\u0000\u056b\u056c\u0005/\u0000\u0000\u056c\u056d"+ + "\u0001\u0000\u0000\u0000\u056d\u056e\u0006\u009e\u0001\u0000\u056e\u013f"+ + "\u0001\u0000\u0000\u0000\u056f\u0571\u0007\n\u0000\u0000\u0570\u056f\u0001"+ + "\u0000\u0000\u0000\u0571\u0572\u0001\u0000\u0000\u0000\u0572\u0570\u0001"+ + "\u0000\u0000\u0000\u0572\u0573\u0001\u0000\u0000\u0000\u0573\u0574\u0001"+ + "\u0000\u0000\u0000\u0574\u0575\u0006\u009f\u0001\u0000\u0575\u0141\u0001"+ + "\u0000\u0000\u0000\u0576\u0577\u0005/\u0000\u0000\u0577\u0578\u0005/\u0000"+ + "\u0000\u0578\u057c\u0001\u0000\u0000\u0000\u0579\u057b\b\n\u0000\u0000"+ + "\u057a\u0579\u0001\u0000\u0000\u0000\u057b\u057e\u0001\u0000\u0000\u0000"+ + "\u057c\u057a\u0001\u0000\u0000\u0000\u057c\u057d\u0001\u0000\u0000\u0000"+ + "\u057d\u057f\u0001\u0000\u0000\u0000\u057e\u057c\u0001\u0000\u0000\u0000"+ + "\u057f\u0580\u0006\u00a0\u0001\u0000\u0580\u0143\u0001\u0000\u0000\u0000"+ + "\u0581\u0586\b\u000b\u0000\u0000\u0582\u0586\u0003\u0134\u0099\u0000\u0583"+ + "\u0586\u0003\u0136\u009a\u0000\u0584\u0586\u0003\u0146\u00a2\u0000\u0585"+ + "\u0581\u0001\u0000\u0000\u0000\u0585\u0582\u0001\u0000\u0000\u0000\u0585"+ + "\u0583\u0001\u0000\u0000\u0000\u0585\u0584\u0001\u0000\u0000\u0000\u0586"+ + "\u0145\u0001\u0000\u0000\u0000\u0587\u05a1\u0005\\\u0000\u0000\u0588\u0589"+ + "\u0005u\u0000\u0000\u0589\u058a\u0003\u014c\u00a5\u0000\u058a\u058b\u0003"+ + "\u014c\u00a5\u0000\u058b\u058c\u0003\u014c\u00a5\u0000\u058c\u058d\u0003"+ + "\u014c\u00a5\u0000\u058d\u05a2\u0001\u0000\u0000\u0000\u058e\u058f\u0005"+ + "U\u0000\u0000\u058f\u0590\u0003\u014c\u00a5\u0000\u0590\u0591\u0003\u014c"+ + "\u00a5\u0000\u0591\u0592\u0003\u014c\u00a5\u0000\u0592\u0593\u0003\u014c"+ + "\u00a5\u0000\u0593\u0594\u0003\u014c\u00a5\u0000\u0594\u0595\u0003\u014c"+ + "\u00a5\u0000\u0595\u0596\u0003\u014c\u00a5\u0000\u0596\u0597\u0003\u014c"+ + "\u00a5\u0000\u0597\u05a2\u0001\u0000\u0000\u0000\u0598\u05a2\u0007\f\u0000"+ + "\u0000\u0599\u059a\u0003\u014a\u00a4\u0000\u059a\u059b\u0003\u014a\u00a4"+ + "\u0000\u059b\u059c\u0003\u014a\u00a4\u0000\u059c\u05a2\u0001\u0000\u0000"+ + "\u0000\u059d\u059e\u0005x\u0000\u0000\u059e\u059f\u0003\u014c\u00a5\u0000"+ + "\u059f\u05a0\u0003\u014c\u00a5\u0000\u05a0\u05a2\u0001\u0000\u0000\u0000"+ + "\u05a1\u0588\u0001\u0000\u0000\u0000\u05a1\u058e\u0001\u0000\u0000\u0000"+ + "\u05a1\u0598\u0001\u0000\u0000\u0000\u05a1\u0599\u0001\u0000\u0000\u0000"+ + "\u05a1\u059d\u0001\u0000\u0000\u0000\u05a2\u0147\u0001\u0000\u0000\u0000"+ + "\u05a3\u05aa\u0007\u0001\u0000\u0000\u05a4\u05a6\u0005_\u0000\u0000\u05a5"+ + "\u05a4\u0001\u0000\u0000\u0000\u05a5\u05a6\u0001\u0000\u0000\u0000\u05a6"+ + "\u05a7\u0001\u0000\u0000\u0000\u05a7\u05a9\u0007\u0001\u0000\u0000\u05a8"+ + "\u05a5\u0001\u0000\u0000\u0000\u05a9\u05ac\u0001\u0000\u0000\u0000\u05aa"+ + "\u05a8\u0001\u0000\u0000\u0000\u05aa\u05ab\u0001\u0000\u0000\u0000\u05ab"+ + "\u0149\u0001\u0000\u0000\u0000\u05ac\u05aa\u0001\u0000\u0000\u0000\u05ad"+ + "\u05ae\u0007\r\u0000\u0000\u05ae\u014b\u0001\u0000\u0000\u0000\u05af\u05b0"+ + "\u0007\u000e\u0000\u0000\u05b0\u014d\u0001\u0000\u0000\u0000\u05b1\u05b2"+ + "\u0007\u000f\u0000\u0000\u05b2\u014f\u0001\u0000\u0000\u0000\u05b3\u05b5"+ + "\u0007\u0010\u0000\u0000\u05b4\u05b6\u0007\u0006\u0000\u0000\u05b5\u05b4"+ + "\u0001\u0000\u0000\u0000\u05b5\u05b6\u0001\u0000\u0000\u0000\u05b6\u05b7"+ + "\u0001\u0000\u0000\u0000\u05b7\u05b8\u0003\u0148\u00a3\u0000\u05b8\u0151"+ + "\u0001\u0000\u0000\u0000\u05b9\u05bc\u0003\u0156\u00aa\u0000\u05ba\u05bc"+ + "\u0005_\u0000\u0000\u05bb\u05b9\u0001\u0000\u0000\u0000\u05bb\u05ba\u0001"+ + "\u0000\u0000\u0000\u05bc\u0153\u0001\u0000\u0000\u0000\u05bd\u05be\u0007"+ + "\u0011\u0000\u0000\u05be\u0155\u0001\u0000\u0000\u0000\u05bf\u05c0\u0007"+ + "\u0012\u0000\u0000\u05c0\u0157\u0001\u0000\u0000\u0000\u05c1\u05c3\u0007"+ + "\t\u0000\u0000\u05c2\u05c1\u0001\u0000\u0000\u0000\u05c3\u05c4\u0001\u0000"+ + "\u0000\u0000\u05c4\u05c2\u0001\u0000\u0000\u0000\u05c4\u05c5\u0001\u0000"+ + "\u0000\u0000\u05c5\u05c6\u0001\u0000\u0000\u0000\u05c6\u05c7\u0006\u00ab"+ + "\u0001\u0000\u05c7\u0159\u0001\u0000\u0000\u0000\u05c8\u05c9\u0005/\u0000"+ + "\u0000\u05c9\u05ca\u0005*\u0000\u0000\u05ca\u05ce\u0001\u0000\u0000\u0000"+ + "\u05cb\u05cd\b\n\u0000\u0000\u05cc\u05cb\u0001\u0000\u0000\u0000\u05cd"+ + "\u05d0\u0001\u0000\u0000\u0000\u05ce\u05cf\u0001\u0000\u0000\u0000\u05ce"+ + "\u05cc\u0001\u0000\u0000\u0000\u05cf\u05d1\u0001\u0000\u0000\u0000\u05d0"+ + "\u05ce\u0001\u0000\u0000\u0000\u05d1\u05d2\u0005*\u0000\u0000\u05d2\u05d3"+ + "\u0005/\u0000\u0000\u05d3\u05d4\u0001\u0000\u0000\u0000\u05d4\u05d5\u0006"+ + "\u00ac\u0001\u0000\u05d5\u015b\u0001\u0000\u0000\u0000\u05d6\u05d7\u0005"+ + "/\u0000\u0000\u05d7\u05d8\u0005/\u0000\u0000\u05d8\u05dc\u0001\u0000\u0000"+ + "\u0000\u05d9\u05db\b\n\u0000\u0000\u05da\u05d9\u0001\u0000\u0000\u0000"+ + "\u05db\u05de\u0001\u0000\u0000\u0000\u05dc\u05da\u0001\u0000\u0000\u0000"+ + "\u05dc\u05dd\u0001\u0000\u0000\u0000\u05dd\u05df\u0001\u0000\u0000\u0000"+ + "\u05de\u05dc\u0001\u0000\u0000\u0000\u05df\u05e0\u0006\u00ad\u0001\u0000"+ + "\u05e0\u015d\u0001\u0000\u0000\u0000\u05e1\u05e3\u0007\n\u0000\u0000\u05e2"+ + "\u05e1\u0001\u0000\u0000\u0000\u05e3\u05e4\u0001\u0000\u0000\u0000\u05e4"+ + "\u05e2\u0001\u0000\u0000\u0000\u05e4\u05e5\u0001\u0000\u0000\u0000\u05e5"+ + "\u05f4\u0001\u0000\u0000\u0000\u05e6\u05f4\u0005;\u0000\u0000\u05e7\u05e8"+ + "\u0005/\u0000\u0000\u05e8\u05e9\u0005*\u0000\u0000\u05e9\u05ed\u0001\u0000"+ + "\u0000\u0000\u05ea\u05ec\t\u0000\u0000\u0000\u05eb\u05ea\u0001\u0000\u0000"+ + "\u0000\u05ec\u05ef\u0001\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000"+ + "\u0000\u05ed\u05eb\u0001\u0000\u0000\u0000\u05ee\u05f0\u0001\u0000\u0000"+ + "\u0000\u05ef\u05ed\u0001\u0000\u0000\u0000\u05f0\u05f1\u0005*\u0000\u0000"+ + "\u05f1\u05f4\u0005/\u0000\u0000\u05f2\u05f4\u0005\u0000\u0000\u0001\u05f3"+ + "\u05e2\u0001\u0000\u0000\u0000\u05f3\u05e6\u0001\u0000\u0000\u0000\u05f3"+ + "\u05e7\u0001\u0000\u0000\u0000\u05f3\u05f2\u0001\u0000\u0000\u0000\u05f4"+ + "\u05f5\u0001\u0000\u0000\u0000\u05f5\u05f6\u0006\u00ae\u0002\u0000\u05f6"+ + "\u015f\u0001\u0000\u0000\u0000\u05f7\u05f8\u0001\u0000\u0000\u0000\u05f8"+ + "\u05f9\u0001\u0000\u0000\u0000\u05f9\u05fa\u0006\u00af\u0002\u0000\u05fa"+ + "\u05fb\u0006\u00af\u0001\u0000\u05fb\u0161\u0001\u0000\u0000\u00003\u0000"+ + "\u0001\u0164\u016c\u016f\u0172\u0178\u017a\u0444\u0446\u04af\u04b4\u04b7"+ + "\u04be\u04c3\u04c9\u04cc\u04d1\u04d8\u04dd\u04e7\u04ec\u04f0\u04f5\u04f8"+ + "\u04fd\u0502\u0505\u0509\u0512\u051b\u0525\u0547\u0551\u0553\u055d\u0567"+ + "\u0572\u057c\u0585\u05a1\u05a5\u05aa\u05b5\u05bb\u05c4\u05ce\u05dc\u05e4"+ + "\u05ed\u05f3\u0003\u0002\u0001\u0000\u0000\u0001\u0000\u0002\u0000\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index eee260acd..07123362b 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -11,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class GobraParser extends GobraParserBase { - static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.12.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -23,26 +23,26 @@ public class GobraParser extends GobraParserBase { FOLD=23, UNFOLD=24, UNFOLDING=25, LET=26, GHOST=27, IN=28, MULTI=29, SUBSET=30, UNION=31, INTERSECTION=32, SETMINUS=33, IMPLIES=34, WAND=35, APPLY=36, QMARK=37, L_PRED=38, R_PRED=39, SEQ=40, SET=41, MSET=42, DICT=43, OPT=44, - LEN=45, NEW=46, MAKE=47, CAP=48, SOME=49, GET=50, DOM=51, AXIOM=52, ADT=53, - MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, SHARE=59, ADDR_MOD=60, - DOT_DOT=61, SHARED=62, EXCLUSIVE=63, PREDICATE=64, WRITEPERM=65, NOPERM=66, - TRUSTED=67, OUTLINE=68, INIT_POST=69, IMPORT_PRE=70, PROOF=71, GHOST_EQUALS=72, - GHOST_NOT_EQUALS=73, WITH=74, OPAQUE=75, REVEAL=76, BREAK=77, DEFAULT=78, - FUNC=79, INTERFACE=80, SELECT=81, CASE=82, DEFER=83, GO=84, MAP=85, STRUCT=86, - CHAN=87, ELSE=88, GOTO=89, PACKAGE=90, SWITCH=91, CONST=92, FALLTHROUGH=93, - IF=94, RANGE=95, TYPE=96, CONTINUE=97, FOR=98, IMPORT=99, RETURN=100, - VAR=101, NIL_LIT=102, IDENTIFIER=103, L_PAREN=104, R_PAREN=105, L_CURLY=106, - R_CURLY=107, L_BRACKET=108, R_BRACKET=109, ASSIGN=110, COMMA=111, SEMI=112, - COLON=113, DOT=114, PLUS_PLUS=115, MINUS_MINUS=116, DECLARE_ASSIGN=117, - ELLIPSIS=118, LOGICAL_OR=119, LOGICAL_AND=120, EQUALS=121, NOT_EQUALS=122, - LESS=123, LESS_OR_EQUALS=124, GREATER=125, GREATER_OR_EQUALS=126, OR=127, - DIV=128, MOD=129, LSHIFT=130, RSHIFT=131, BIT_CLEAR=132, EXCLAMATION=133, - PLUS=134, MINUS=135, CARET=136, STAR=137, AMPERSAND=138, RECEIVE=139, - DECIMAL_LIT=140, BINARY_LIT=141, OCTAL_LIT=142, HEX_LIT=143, HEX_FLOAT_LIT=144, - IMAGINARY_LIT=145, RUNE_LIT=146, BYTE_VALUE=147, OCTAL_BYTE_VALUE=148, - HEX_BYTE_VALUE=149, LITTLE_U_VALUE=150, BIG_U_VALUE=151, RAW_STRING_LIT=152, - INTERPRETED_STRING_LIT=153, WS=154, COMMENT=155, TERMINATOR=156, LINE_COMMENT=157, - WS_NLSEMI=158, COMMENT_NLSEMI=159, LINE_COMMENT_NLSEMI=160, EOS=161, OTHER=162; + GPOINTER=45, LEN=46, NEW=47, MAKE=48, CAP=49, SOME=50, GET=51, DOM=52, + AXIOM=53, ADT=54, MATCH=55, NONE=56, PRED=57, TYPE_OF=58, IS_COMPARABLE=59, + SHARE=60, ADDR_MOD=61, DOT_DOT=62, SHARED=63, EXCLUSIVE=64, PREDICATE=65, + WRITEPERM=66, NOPERM=67, TRUSTED=68, OUTLINE=69, INIT_POST=70, IMPORT_PRE=71, + PROOF=72, GHOST_EQUALS=73, GHOST_NOT_EQUALS=74, WITH=75, OPAQUE=76, REVEAL=77, + BREAK=78, DEFAULT=79, FUNC=80, INTERFACE=81, SELECT=82, CASE=83, DEFER=84, + GO=85, MAP=86, STRUCT=87, CHAN=88, ELSE=89, GOTO=90, PACKAGE=91, SWITCH=92, + CONST=93, FALLTHROUGH=94, IF=95, RANGE=96, TYPE=97, CONTINUE=98, FOR=99, + IMPORT=100, RETURN=101, VAR=102, NIL_LIT=103, IDENTIFIER=104, L_PAREN=105, + R_PAREN=106, L_CURLY=107, R_CURLY=108, L_BRACKET=109, R_BRACKET=110, ASSIGN=111, + COMMA=112, SEMI=113, COLON=114, DOT=115, PLUS_PLUS=116, MINUS_MINUS=117, + DECLARE_ASSIGN=118, ELLIPSIS=119, LOGICAL_OR=120, LOGICAL_AND=121, EQUALS=122, + NOT_EQUALS=123, LESS=124, LESS_OR_EQUALS=125, GREATER=126, GREATER_OR_EQUALS=127, + OR=128, DIV=129, MOD=130, LSHIFT=131, RSHIFT=132, BIT_CLEAR=133, EXCLAMATION=134, + PLUS=135, MINUS=136, CARET=137, STAR=138, AMPERSAND=139, RECEIVE=140, + DECIMAL_LIT=141, BINARY_LIT=142, OCTAL_LIT=143, HEX_LIT=144, HEX_FLOAT_LIT=145, + IMAGINARY_LIT=146, RUNE_LIT=147, BYTE_VALUE=148, OCTAL_BYTE_VALUE=149, + HEX_BYTE_VALUE=150, LITTLE_U_VALUE=151, BIG_U_VALUE=152, RAW_STRING_LIT=153, + INTERPRETED_STRING_LIT=154, WS=155, COMMENT=156, TERMINATOR=157, LINE_COMMENT=158, + WS_NLSEMI=159, COMMENT_NLSEMI=160, LINE_COMMENT_NLSEMI=161, EOS=162, OTHER=163; public static final int RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3, RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_preamble = 6, @@ -57,46 +57,46 @@ public class GobraParser extends GobraParserBase { RULE_matchExprClause = 37, RULE_seqUpdExp = 38, RULE_seqUpdClause = 39, RULE_ghostTypeLit = 40, RULE_domainType = 41, RULE_domainClause = 42, RULE_adtType = 43, RULE_adtClause = 44, RULE_adtFieldDecl = 45, RULE_ghostSliceType = 46, - RULE_sqType = 47, RULE_specification = 48, RULE_specStatement = 49, RULE_terminationMeasure = 50, - RULE_assertion = 51, RULE_matchStmt = 52, RULE_matchStmtClause = 53, RULE_matchCase = 54, - RULE_matchPattern = 55, RULE_matchPatternList = 56, RULE_blockWithBodyParameterInfo = 57, - RULE_closureSpecInstance = 58, RULE_closureSpecParams = 59, RULE_closureSpecParam = 60, - RULE_closureImplProofStmt = 61, RULE_implementationProof = 62, RULE_methodImplementationProof = 63, - RULE_nonLocalReceiver = 64, RULE_selection = 65, RULE_implementationProofPredicateAlias = 66, - RULE_make = 67, RULE_new_ = 68, RULE_specMember = 69, RULE_functionDecl = 70, - RULE_methodDecl = 71, RULE_explicitGhostMember = 72, RULE_fpredicateDecl = 73, - RULE_predicateBody = 74, RULE_mpredicateDecl = 75, RULE_varSpec = 76, - RULE_shortVarDecl = 77, RULE_receiver = 78, RULE_parameterDecl = 79, RULE_actualParameterDecl = 80, - RULE_ghostParameterDecl = 81, RULE_parameterType = 82, RULE_expression = 83, - RULE_statement = 84, RULE_applyStmt = 85, RULE_packageStmt = 86, RULE_specForStmt = 87, - RULE_loopSpec = 88, RULE_deferStmt = 89, RULE_basicLit = 90, RULE_primaryExpr = 91, - RULE_functionLit = 92, RULE_closureDecl = 93, RULE_predConstructArgs = 94, - RULE_interfaceType = 95, RULE_predicateSpec = 96, RULE_methodSpec = 97, - RULE_type_ = 98, RULE_typeLit = 99, RULE_predType = 100, RULE_predTypeParams = 101, - RULE_literalType = 102, RULE_implicitArray = 103, RULE_slice_ = 104, RULE_low = 105, - RULE_high = 106, RULE_cap = 107, RULE_assign_op = 108, RULE_rangeClause = 109, - RULE_packageClause = 110, RULE_importPath = 111, RULE_declaration = 112, - RULE_constDecl = 113, RULE_constSpec = 114, RULE_identifierList = 115, - RULE_expressionList = 116, RULE_typeDecl = 117, RULE_typeSpec = 118, RULE_varDecl = 119, - RULE_block = 120, RULE_statementList = 121, RULE_simpleStmt = 122, RULE_expressionStmt = 123, - RULE_sendStmt = 124, RULE_incDecStmt = 125, RULE_assignment = 126, RULE_emptyStmt = 127, - RULE_labeledStmt = 128, RULE_returnStmt = 129, RULE_breakStmt = 130, RULE_continueStmt = 131, - RULE_gotoStmt = 132, RULE_fallthroughStmt = 133, RULE_ifStmt = 134, RULE_switchStmt = 135, - RULE_exprSwitchStmt = 136, RULE_exprCaseClause = 137, RULE_exprSwitchCase = 138, - RULE_typeSwitchStmt = 139, RULE_typeSwitchGuard = 140, RULE_typeCaseClause = 141, - RULE_typeSwitchCase = 142, RULE_typeList = 143, RULE_selectStmt = 144, - RULE_commClause = 145, RULE_commCase = 146, RULE_recvStmt = 147, RULE_forStmt = 148, - RULE_forClause = 149, RULE_goStmt = 150, RULE_typeName = 151, RULE_arrayType = 152, - RULE_arrayLength = 153, RULE_elementType = 154, RULE_pointerType = 155, - RULE_sliceType = 156, RULE_mapType = 157, RULE_channelType = 158, RULE_functionType = 159, - RULE_signature = 160, RULE_result = 161, RULE_parameters = 162, RULE_conversion = 163, - RULE_nonNamedType = 164, RULE_operand = 165, RULE_literal = 166, RULE_integer = 167, - RULE_operandName = 168, RULE_qualifiedIdent = 169, RULE_compositeLit = 170, - RULE_literalValue = 171, RULE_elementList = 172, RULE_keyedElement = 173, - RULE_key = 174, RULE_element = 175, RULE_structType = 176, RULE_fieldDecl = 177, - RULE_string_ = 178, RULE_embeddedField = 179, RULE_index = 180, RULE_typeAssertion = 181, - RULE_arguments = 182, RULE_methodExpr = 183, RULE_receiverType = 184, - RULE_eos = 185; + RULE_ghostPointerType = 47, RULE_sqType = 48, RULE_specification = 49, + RULE_specStatement = 50, RULE_terminationMeasure = 51, RULE_assertion = 52, + RULE_matchStmt = 53, RULE_matchStmtClause = 54, RULE_matchCase = 55, RULE_matchPattern = 56, + RULE_matchPatternList = 57, RULE_blockWithBodyParameterInfo = 58, RULE_closureSpecInstance = 59, + RULE_closureSpecParams = 60, RULE_closureSpecParam = 61, RULE_closureImplProofStmt = 62, + RULE_implementationProof = 63, RULE_methodImplementationProof = 64, RULE_nonLocalReceiver = 65, + RULE_selection = 66, RULE_implementationProofPredicateAlias = 67, RULE_make = 68, + RULE_new_ = 69, RULE_specMember = 70, RULE_functionDecl = 71, RULE_methodDecl = 72, + RULE_explicitGhostMember = 73, RULE_fpredicateDecl = 74, RULE_predicateBody = 75, + RULE_mpredicateDecl = 76, RULE_varSpec = 77, RULE_shortVarDecl = 78, RULE_receiver = 79, + RULE_parameterDecl = 80, RULE_actualParameterDecl = 81, RULE_ghostParameterDecl = 82, + RULE_parameterType = 83, RULE_expression = 84, RULE_statement = 85, RULE_applyStmt = 86, + RULE_packageStmt = 87, RULE_specForStmt = 88, RULE_loopSpec = 89, RULE_deferStmt = 90, + RULE_basicLit = 91, RULE_primaryExpr = 92, RULE_functionLit = 93, RULE_closureDecl = 94, + RULE_predConstructArgs = 95, RULE_interfaceType = 96, RULE_predicateSpec = 97, + RULE_methodSpec = 98, RULE_type_ = 99, RULE_typeLit = 100, RULE_predType = 101, + RULE_predTypeParams = 102, RULE_literalType = 103, RULE_implicitArray = 104, + RULE_slice_ = 105, RULE_low = 106, RULE_high = 107, RULE_cap = 108, RULE_assign_op = 109, + RULE_rangeClause = 110, RULE_packageClause = 111, RULE_importPath = 112, + RULE_declaration = 113, RULE_constDecl = 114, RULE_constSpec = 115, RULE_identifierList = 116, + RULE_expressionList = 117, RULE_typeDecl = 118, RULE_typeSpec = 119, RULE_varDecl = 120, + RULE_block = 121, RULE_statementList = 122, RULE_simpleStmt = 123, RULE_expressionStmt = 124, + RULE_sendStmt = 125, RULE_incDecStmt = 126, RULE_assignment = 127, RULE_emptyStmt = 128, + RULE_labeledStmt = 129, RULE_returnStmt = 130, RULE_breakStmt = 131, RULE_continueStmt = 132, + RULE_gotoStmt = 133, RULE_fallthroughStmt = 134, RULE_ifStmt = 135, RULE_switchStmt = 136, + RULE_exprSwitchStmt = 137, RULE_exprCaseClause = 138, RULE_exprSwitchCase = 139, + RULE_typeSwitchStmt = 140, RULE_typeSwitchGuard = 141, RULE_typeCaseClause = 142, + RULE_typeSwitchCase = 143, RULE_typeList = 144, RULE_selectStmt = 145, + RULE_commClause = 146, RULE_commCase = 147, RULE_recvStmt = 148, RULE_forStmt = 149, + RULE_forClause = 150, RULE_goStmt = 151, RULE_typeName = 152, RULE_arrayType = 153, + RULE_arrayLength = 154, RULE_elementType = 155, RULE_pointerType = 156, + RULE_sliceType = 157, RULE_mapType = 158, RULE_channelType = 159, RULE_functionType = 160, + RULE_signature = 161, RULE_result = 162, RULE_parameters = 163, RULE_conversion = 164, + RULE_nonNamedType = 165, RULE_operand = 166, RULE_literal = 167, RULE_integer = 168, + RULE_operandName = 169, RULE_qualifiedIdent = 170, RULE_compositeLit = 171, + RULE_literalValue = 172, RULE_elementList = 173, RULE_keyedElement = 174, + RULE_key = 175, RULE_element = 176, RULE_structType = 177, RULE_fieldDecl = 178, + RULE_string_ = 179, RULE_embeddedField = 180, RULE_index = 181, RULE_typeAssertion = 182, + RULE_arguments = 183, RULE_methodExpr = 184, RULE_receiverType = 185, + RULE_eos = 186; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", @@ -108,34 +108,35 @@ private static String[] makeRuleNames() { "old", "oldLabelUse", "labelUse", "before", "isComparable", "typeOf", "access", "range", "matchExpr", "matchExprClause", "seqUpdExp", "seqUpdClause", "ghostTypeLit", "domainType", "domainClause", "adtType", "adtClause", - "adtFieldDecl", "ghostSliceType", "sqType", "specification", "specStatement", - "terminationMeasure", "assertion", "matchStmt", "matchStmtClause", "matchCase", - "matchPattern", "matchPatternList", "blockWithBodyParameterInfo", "closureSpecInstance", - "closureSpecParams", "closureSpecParam", "closureImplProofStmt", "implementationProof", - "methodImplementationProof", "nonLocalReceiver", "selection", "implementationProofPredicateAlias", - "make", "new_", "specMember", "functionDecl", "methodDecl", "explicitGhostMember", - "fpredicateDecl", "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl", - "receiver", "parameterDecl", "actualParameterDecl", "ghostParameterDecl", - "parameterType", "expression", "statement", "applyStmt", "packageStmt", - "specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", - "closureDecl", "predConstructArgs", "interfaceType", "predicateSpec", - "methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType", - "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause", - "packageClause", "importPath", "declaration", "constDecl", "constSpec", - "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl", - "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt", - "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt", - "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt", - "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", - "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", - "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt", - "typeName", "arrayType", "arrayLength", "elementType", "pointerType", - "sliceType", "mapType", "channelType", "functionType", "signature", "result", - "parameters", "conversion", "nonNamedType", "operand", "literal", "integer", - "operandName", "qualifiedIdent", "compositeLit", "literalValue", "elementList", - "keyedElement", "key", "element", "structType", "fieldDecl", "string_", - "embeddedField", "index", "typeAssertion", "arguments", "methodExpr", - "receiverType", "eos" + "adtFieldDecl", "ghostSliceType", "ghostPointerType", "sqType", "specification", + "specStatement", "terminationMeasure", "assertion", "matchStmt", "matchStmtClause", + "matchCase", "matchPattern", "matchPatternList", "blockWithBodyParameterInfo", + "closureSpecInstance", "closureSpecParams", "closureSpecParam", "closureImplProofStmt", + "implementationProof", "methodImplementationProof", "nonLocalReceiver", + "selection", "implementationProofPredicateAlias", "make", "new_", "specMember", + "functionDecl", "methodDecl", "explicitGhostMember", "fpredicateDecl", + "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl", "receiver", + "parameterDecl", "actualParameterDecl", "ghostParameterDecl", "parameterType", + "expression", "statement", "applyStmt", "packageStmt", "specForStmt", + "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", "closureDecl", + "predConstructArgs", "interfaceType", "predicateSpec", "methodSpec", + "type_", "typeLit", "predType", "predTypeParams", "literalType", "implicitArray", + "slice_", "low", "high", "cap", "assign_op", "rangeClause", "packageClause", + "importPath", "declaration", "constDecl", "constSpec", "identifierList", + "expressionList", "typeDecl", "typeSpec", "varDecl", "block", "statementList", + "simpleStmt", "expressionStmt", "sendStmt", "incDecStmt", "assignment", + "emptyStmt", "labeledStmt", "returnStmt", "breakStmt", "continueStmt", + "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt", + "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard", + "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", "commClause", + "commCase", "recvStmt", "forStmt", "forClause", "goStmt", "typeName", + "arrayType", "arrayLength", "elementType", "pointerType", "sliceType", + "mapType", "channelType", "functionType", "signature", "result", "parameters", + "conversion", "nonNamedType", "operand", "literal", "integer", "operandName", + "qualifiedIdent", "compositeLit", "literalValue", "elementList", "keyedElement", + "key", "element", "structType", "fieldDecl", "string_", "embeddedField", + "index", "typeAssertion", "arguments", "methodExpr", "receiverType", + "eos" }; } public static final String[] ruleNames = makeRuleNames(); @@ -148,20 +149,20 @@ private static String[] makeLiteralNames() { "'#lhs'", "'forall'", "'exists'", "'acc'", "'fold'", "'unfold'", "'unfolding'", "'let'", "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", "'setminus'", "'==>'", "'--*'", "'apply'", "'?'", "'!<'", "'!>'", "'seq'", - "'set'", "'mset'", "'dict'", "'option'", "'len'", "'new'", "'make'", - "'cap'", "'some'", "'get'", "'domain'", "'axiom'", "'adt'", "'match'", - "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", - "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", - "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", - "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'break'", "'default'", - "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", - "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", - "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", - "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", - "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", - "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", - "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", - "'^'", "'*'", "'&'", "'<-'" + "'set'", "'mset'", "'dict'", "'option'", "'gpointer'", "'len'", "'new'", + "'make'", "'cap'", "'some'", "'get'", "'domain'", "'axiom'", "'adt'", + "'match'", "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", + "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", + "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", + "'proof'", "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'break'", + "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", + "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'", + "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", + "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, + "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", + "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", + "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", + "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -172,9 +173,9 @@ private static String[] makeSymbolicNames() { "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", "FOLD", "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", - "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "LEN", "NEW", "MAKE", - "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", "PRED", - "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", + "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "GPOINTER", "LEN", "NEW", + "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", + "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "OPAQUE", "REVEAL", "BREAK", "DEFAULT", "FUNC", "INTERFACE", @@ -269,9 +270,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(372); + setState(374); expression(0); - setState(373); + setState(375); match(EOF); } } @@ -309,9 +310,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(375); + setState(377); statement(); - setState(376); + setState(378); match(EOF); } } @@ -349,9 +350,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(378); + setState(380); type_(); - setState(379); + setState(381); match(EOF); } } @@ -396,21 +397,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis try { enterOuterAlt(_localctx, 1); { - setState(381); + setState(383); maybeAddressableIdentifier(); - setState(386); + setState(388); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(382); + setState(384); match(COMMA); - setState(383); + setState(385); maybeAddressableIdentifier(); } } - setState(388); + setState(390); _errHandler.sync(this); _la = _input.LA(1); } @@ -449,14 +450,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro try { enterOuterAlt(_localctx, 1); { - setState(389); - match(IDENTIFIER); setState(391); + match(IDENTIFIER); + setState(393); _errHandler.sync(this); _la = _input.LA(1); if (_la==ADDR_MOD) { { - setState(390); + setState(392); match(ADDR_MOD); } } @@ -534,79 +535,79 @@ public final SourceFileContext sourceFile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(398); + setState(400); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(393); + setState(395); initPost(); - setState(394); + setState(396); eos(); } } - setState(400); + setState(402); _errHandler.sync(this); _la = _input.LA(1); } - setState(401); + setState(403); packageClause(); - setState(402); + setState(404); eos(); - setState(408); + setState(410); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(403); + setState(405); importDecl(); - setState(404); + setState(406); eos(); } } - setState(410); + setState(412); _errHandler.sync(this); _la = _input.LA(1); } - setState(420); + setState(422); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101061120L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2422933827841L) != 0) || _la==STAR || _la==RECEIVE) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579504128L) != 0) || ((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & 2422933827841L) != 0) || _la==STAR || _la==RECEIVE) { { { - setState(414); + setState(416); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: { - setState(411); + setState(413); specMember(); } break; case 2: { - setState(412); + setState(414); declaration(); } break; case 3: { - setState(413); + setState(415); ghostMember(); } break; } - setState(416); + setState(418); eos(); } } - setState(422); + setState(424); _errHandler.sync(this); _la = _input.LA(1); } - setState(423); + setState(425); match(EOF); } } @@ -662,39 +663,39 @@ public final PreambleContext preamble() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(430); + setState(432); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(425); + setState(427); initPost(); - setState(426); + setState(428); eos(); } } - setState(432); + setState(434); _errHandler.sync(this); _la = _input.LA(1); } - setState(433); + setState(435); packageClause(); - setState(434); + setState(436); eos(); - setState(440); + setState(442); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(435); + setState(437); importDecl(); - setState(436); + setState(438); eos(); } } - setState(442); + setState(444); _errHandler.sync(this); _la = _input.LA(1); } @@ -734,9 +735,9 @@ public final InitPostContext initPost() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(443); + setState(445); match(INIT_POST); - setState(444); + setState(446); expression(0); } } @@ -774,9 +775,9 @@ public final ImportPreContext importPre() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(446); + setState(448); match(IMPORT_PRE); - setState(447); + setState(449); expression(0); } } @@ -829,28 +830,28 @@ public final ImportSpecContext importSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(454); + setState(456); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(449); + setState(451); importPre(); - setState(450); + setState(452); eos(); } } - setState(456); + setState(458); _errHandler.sync(this); _la = _input.LA(1); } - setState(458); + setState(460); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER || _la==DOT) { { - setState(457); + setState(459); ((ImportSpecContext)_localctx).alias = _input.LT(1); _la = _input.LA(1); if ( !(_la==IDENTIFIER || _la==DOT) ) { @@ -864,7 +865,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { } } - setState(460); + setState(462); importPath(); } } @@ -920,56 +921,56 @@ public final ImportDeclContext importDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(467); + setState(469); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(462); + setState(464); importPre(); - setState(463); + setState(465); eos(); } } - setState(469); + setState(471); _errHandler.sync(this); _la = _input.LA(1); } - setState(483); + setState(485); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { case 1: { - setState(470); + setState(472); match(IMPORT); - setState(471); + setState(473); importSpec(); } break; case 2: { - setState(472); + setState(474); match(IMPORT); - setState(473); + setState(475); match(L_PAREN); - setState(479); + setState(481); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & 17600775979009L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { + while (((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & 17600775979009L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { - setState(474); + setState(476); importSpec(); - setState(475); + setState(477); eos(); } } - setState(481); + setState(483); _errHandler.sync(this); _la = _input.LA(1); } - setState(482); + setState(484); match(R_PAREN); } break; @@ -1016,34 +1017,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException { GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState()); enterRule(_localctx, 22, RULE_ghostMember); try { - setState(489); + setState(491); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(485); + setState(487); implementationProof(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(486); + setState(488); fpredicateDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(487); + setState(489); mpredicateDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(488); + setState(490); explicitGhostMember(); } break; @@ -1135,16 +1136,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException enterRule(_localctx, 24, RULE_ghostStatement); int _la; try { - setState(498); + setState(500); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: _localctx = new ExplicitGhostStatementContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(491); + setState(493); match(GHOST); - setState(492); + setState(494); statement(); } break; @@ -1153,7 +1154,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new FoldStatementContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(493); + setState(495); ((FoldStatementContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -1164,7 +1165,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(494); + setState(496); predicateAccess(); } break; @@ -1175,7 +1176,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new ProofStatementContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(495); + setState(497); ((ProofStatementContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 480L) != 0)) ) { @@ -1186,7 +1187,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(496); + setState(498); expression(0); } break; @@ -1194,7 +1195,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new MatchStmt_Context(_localctx); enterOuterAlt(_localctx, 4); { - setState(497); + setState(499); matchStmt(); } break; @@ -1235,7 +1236,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(500); + setState(502); statementWithSpec(); } } @@ -1276,10 +1277,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(502); + setState(504); ((StatementWithSpecContext)_localctx).specification = specification(); { - setState(503); + setState(505); outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure); } } @@ -1325,21 +1326,21 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu try { enterOuterAlt(_localctx, 1); { - setState(505); + setState(507); match(OUTLINE); - setState(506); - match(L_PAREN); setState(508); + match(L_PAREN); + setState(510); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(507); + setState(509); statementList(); } break; } - setState(510); + setState(512); match(R_PAREN); } } @@ -1410,97 +1411,97 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState()); enterRule(_localctx, 32, RULE_ghostPrimaryExpr); try { - setState(525); + setState(527); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(512); + setState(514); range(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(513); + setState(515); access(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(514); + setState(516); typeOf(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(515); + setState(517); typeExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(516); + setState(518); isComparable(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(517); + setState(519); old(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(518); + setState(520); before(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(519); + setState(521); sConversion(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(520); + setState(522); optionNone(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(521); + setState(523); optionSome(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(522); + setState(524); optionGet(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(523); + setState(525); permission(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(524); + setState(526); matchExpr(); } break; @@ -1539,7 +1540,7 @@ public final PermissionContext permission() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(527); + setState(529); _la = _input.LA(1); if ( !(_la==WRITEPERM || _la==NOPERM) ) { _errHandler.recoverInline(this); @@ -1587,13 +1588,13 @@ public final TypeExprContext typeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(529); + setState(531); match(TYPE); - setState(530); + setState(532); match(L_BRACKET); - setState(531); + setState(533); type_(); - setState(532); + setState(534); match(R_BRACKET); } } @@ -1639,32 +1640,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(534); + setState(536); boundVariableDecl(); - setState(539); + setState(541); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(535); + setState(537); match(COMMA); - setState(536); + setState(538); boundVariableDecl(); } } } - setState(541); + setState(543); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } - setState(543); + setState(545); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(542); + setState(544); match(COMMA); } } @@ -1713,25 +1714,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(545); + setState(547); match(IDENTIFIER); - setState(550); + setState(552); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(546); + setState(548); match(COMMA); - setState(547); + setState(549); match(IDENTIFIER); } } - setState(552); + setState(554); _errHandler.sync(this); _la = _input.LA(1); } - setState(553); + setState(555); elementType(); } } @@ -1772,17 +1773,17 @@ public final TriggersContext triggers() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(558); + setState(560); _errHandler.sync(this); _la = _input.LA(1); while (_la==L_CURLY) { { { - setState(555); + setState(557); trigger(); } } - setState(560); + setState(562); _errHandler.sync(this); _la = _input.LA(1); } @@ -1831,27 +1832,27 @@ public final TriggerContext trigger() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(561); + setState(563); match(L_CURLY); - setState(562); + setState(564); expression(0); - setState(567); + setState(569); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(563); + setState(565); match(COMMA); - setState(564); + setState(566); expression(0); } } - setState(569); + setState(571); _errHandler.sync(this); _la = _input.LA(1); } - setState(570); + setState(572); match(R_CURLY); } } @@ -1888,7 +1889,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(572); + setState(574); primaryExpr(0); } } @@ -1928,13 +1929,13 @@ public final OptionSomeContext optionSome() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(574); + setState(576); match(SOME); - setState(575); + setState(577); match(L_PAREN); - setState(576); + setState(578); expression(0); - setState(577); + setState(579); match(R_PAREN); } } @@ -1974,13 +1975,13 @@ public final OptionNoneContext optionNone() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(579); + setState(581); match(NONE); - setState(580); + setState(582); match(L_BRACKET); - setState(581); + setState(583); type_(); - setState(582); + setState(584); match(R_BRACKET); } } @@ -2020,13 +2021,13 @@ public final OptionGetContext optionGet() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(584); + setState(586); match(GET); - setState(585); + setState(587); match(L_PAREN); - setState(586); + setState(588); expression(0); - setState(587); + setState(589); match(R_PAREN); } } @@ -2070,7 +2071,7 @@ public final SConversionContext sConversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(589); + setState(591); ((SConversionContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { @@ -2081,11 +2082,11 @@ public final SConversionContext sConversion() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(590); + setState(592); match(L_PAREN); - setState(591); + setState(593); expression(0); - setState(592); + setState(594); match(R_PAREN); } } @@ -2131,27 +2132,27 @@ public final OldContext old() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(594); + setState(596); match(OLD); - setState(599); + setState(601); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(595); + setState(597); match(L_BRACKET); - setState(596); + setState(598); oldLabelUse(); - setState(597); + setState(599); match(R_BRACKET); } } - setState(601); + setState(603); match(L_PAREN); - setState(602); + setState(604); expression(0); - setState(603); + setState(605); match(R_PAREN); } } @@ -2187,20 +2188,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException { OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState()); enterRule(_localctx, 58, RULE_oldLabelUse); try { - setState(607); + setState(609); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(605); + setState(607); labelUse(); } break; case LHS: enterOuterAlt(_localctx, 2); { - setState(606); + setState(608); match(LHS); } break; @@ -2239,7 +2240,7 @@ public final LabelUseContext labelUse() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(609); + setState(611); match(IDENTIFIER); } } @@ -2279,13 +2280,13 @@ public final BeforeContext before() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(611); + setState(613); match(BEFORE); - setState(612); + setState(614); match(L_PAREN); - setState(613); + setState(615); expression(0); - setState(614); + setState(616); match(R_PAREN); } } @@ -2325,13 +2326,13 @@ public final IsComparableContext isComparable() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(616); + setState(618); match(IS_COMPARABLE); - setState(617); + setState(619); match(L_PAREN); - setState(618); + setState(620); expression(0); - setState(619); + setState(621); match(R_PAREN); } } @@ -2371,13 +2372,13 @@ public final TypeOfContext typeOf() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(621); + setState(623); match(TYPE_OF); - setState(622); + setState(624); match(L_PAREN); - setState(623); + setState(625); expression(0); - setState(624); + setState(626); match(R_PAREN); } } @@ -2422,25 +2423,25 @@ public final AccessContext access() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(626); + setState(628); match(ACCESS); - setState(627); + setState(629); match(L_PAREN); - setState(628); + setState(630); expression(0); - setState(631); + setState(633); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(629); + setState(631); match(COMMA); - setState(630); + setState(632); expression(0); } } - setState(633); + setState(635); match(R_PAREN); } } @@ -2488,7 +2489,7 @@ public final RangeContext range() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(635); + setState(637); ((RangeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { @@ -2499,15 +2500,15 @@ public final RangeContext range() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(636); - match(L_BRACKET); - setState(637); - expression(0); setState(638); - match(DOT_DOT); + match(L_BRACKET); setState(639); expression(0); setState(640); + match(DOT_DOT); + setState(641); + expression(0); + setState(642); match(R_BRACKET); } } @@ -2560,29 +2561,29 @@ public final MatchExprContext matchExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(642); + setState(644); match(MATCH); - setState(643); + setState(645); expression(0); - setState(644); + setState(646); match(L_CURLY); - setState(650); + setState(652); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(645); + setState(647); matchExprClause(); - setState(646); + setState(648); eos(); } } - setState(652); + setState(654); _errHandler.sync(this); _la = _input.LA(1); } - setState(653); + setState(655); match(R_CURLY); } } @@ -2623,11 +2624,11 @@ public final MatchExprClauseContext matchExprClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(655); + setState(657); matchCase(); - setState(656); + setState(658); match(COLON); - setState(657); + setState(659); expression(0); } } @@ -2674,29 +2675,29 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(659); + setState(661); match(L_BRACKET); { - setState(660); + setState(662); seqUpdClause(); - setState(665); + setState(667); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(661); + setState(663); match(COMMA); - setState(662); + setState(664); seqUpdClause(); } } - setState(667); + setState(669); _errHandler.sync(this); _la = _input.LA(1); } } - setState(668); + setState(670); match(R_BRACKET); } } @@ -2737,11 +2738,11 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(670); + setState(672); expression(0); - setState(671); + setState(673); match(ASSIGN); - setState(672); + setState(674); expression(0); } } @@ -2764,6 +2765,9 @@ public SqTypeContext sqType() { public GhostSliceTypeContext ghostSliceType() { return getRuleContext(GhostSliceTypeContext.class,0); } + public GhostPointerTypeContext ghostPointerType() { + return getRuleContext(GhostPointerTypeContext.class,0); + } public DomainTypeContext domainType() { return getRuleContext(DomainTypeContext.class,0); } @@ -2785,7 +2789,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState()); enterRule(_localctx, 80, RULE_ghostTypeLit); try { - setState(678); + setState(681); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2795,28 +2799,35 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { case OPT: enterOuterAlt(_localctx, 1); { - setState(674); + setState(676); sqType(); } break; case GHOST: enterOuterAlt(_localctx, 2); { - setState(675); + setState(677); ghostSliceType(); } break; - case DOM: + case GPOINTER: enterOuterAlt(_localctx, 3); { - setState(676); + setState(678); + ghostPointerType(); + } + break; + case DOM: + enterOuterAlt(_localctx, 4); + { + setState(679); domainType(); } break; case ADT: - enterOuterAlt(_localctx, 4); + enterOuterAlt(_localctx, 5); { - setState(677); + setState(680); adtType(); } break; @@ -2870,27 +2881,27 @@ public final DomainTypeContext domainType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(680); + setState(683); match(DOM); - setState(681); + setState(684); match(L_CURLY); - setState(687); + setState(690); _errHandler.sync(this); _la = _input.LA(1); while (_la==AXIOM || _la==FUNC) { { { - setState(682); + setState(685); domainClause(); - setState(683); + setState(686); eos(); } } - setState(689); + setState(692); _errHandler.sync(this); _la = _input.LA(1); } - setState(690); + setState(693); match(R_CURLY); } } @@ -2936,32 +2947,32 @@ public final DomainClauseContext domainClause() throws RecognitionException { DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState()); enterRule(_localctx, 84, RULE_domainClause); try { - setState(701); + setState(704); _errHandler.sync(this); switch (_input.LA(1)) { case FUNC: enterOuterAlt(_localctx, 1); { - setState(692); + setState(695); match(FUNC); - setState(693); + setState(696); match(IDENTIFIER); - setState(694); + setState(697); signature(); } break; case AXIOM: enterOuterAlt(_localctx, 2); { - setState(695); + setState(698); match(AXIOM); - setState(696); + setState(699); match(L_CURLY); - setState(697); + setState(700); expression(0); - setState(698); + setState(701); eos(); - setState(699); + setState(702); match(R_CURLY); } break; @@ -3015,27 +3026,27 @@ public final AdtTypeContext adtType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(703); + setState(706); match(ADT); - setState(704); + setState(707); match(L_CURLY); - setState(710); + setState(713); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(705); + setState(708); adtClause(); - setState(706); + setState(709); eos(); } } - setState(712); + setState(715); _errHandler.sync(this); _la = _input.LA(1); } - setState(713); + setState(716); match(R_CURLY); } } @@ -3085,27 +3096,27 @@ public final AdtClauseContext adtClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(715); + setState(718); match(IDENTIFIER); - setState(716); + setState(719); match(L_CURLY); - setState(722); + setState(725); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & 1441151881345761731L) != 0)) { { { - setState(717); + setState(720); adtFieldDecl(); - setState(718); + setState(721); eos(); } } - setState(724); + setState(727); _errHandler.sync(this); _la = _input.LA(1); } - setState(725); + setState(728); match(R_CURLY); } } @@ -3145,17 +3156,17 @@ public final AdtFieldDeclContext adtFieldDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(728); + setState(731); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { - setState(727); + setState(730); identifierList(); } break; } - setState(730); + setState(733); type_(); } } @@ -3195,14 +3206,60 @@ public final GhostSliceTypeContext ghostSliceType() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(732); + setState(735); match(GHOST); - setState(733); + setState(736); match(L_BRACKET); - setState(734); + setState(737); match(R_BRACKET); - setState(735); + setState(738); + elementType(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class GhostPointerTypeContext extends ParserRuleContext { + public TerminalNode GPOINTER() { return getToken(GobraParser.GPOINTER, 0); } + public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } + public ElementTypeContext elementType() { + return getRuleContext(ElementTypeContext.class,0); + } + public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } + public GhostPointerTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ghostPointerType; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitGhostPointerType(this); + else return visitor.visitChildren(this); + } + } + + public final GhostPointerTypeContext ghostPointerType() throws RecognitionException { + GhostPointerTypeContext _localctx = new GhostPointerTypeContext(_ctx, getState()); + enterRule(_localctx, 94, RULE_ghostPointerType); + try { + enterOuterAlt(_localctx, 1); + { + setState(740); + match(GPOINTER); + setState(741); + match(L_BRACKET); + setState(742); elementType(); + setState(743); + match(R_BRACKET); } } catch (RecognitionException re) { @@ -3245,10 +3302,10 @@ public T accept(ParseTreeVisitor visitor) { public final SqTypeContext sqType() throws RecognitionException { SqTypeContext _localctx = new SqTypeContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_sqType); + enterRule(_localctx, 96, RULE_sqType); int _la; try { - setState(748); + setState(756); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3258,7 +3315,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(737); + setState(745); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) { @@ -3269,11 +3326,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(738); + setState(746); match(L_BRACKET); - setState(739); + setState(747); type_(); - setState(740); + setState(748); match(R_BRACKET); } } @@ -3281,15 +3338,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(742); + setState(750); ((SqTypeContext)_localctx).kind = match(DICT); - setState(743); + setState(751); match(L_BRACKET); - setState(744); + setState(752); type_(); - setState(745); + setState(753); match(R_BRACKET); - setState(746); + setState(754); type_(); } break; @@ -3350,20 +3407,20 @@ public T accept(ParseTreeVisitor visitor) { public final SpecificationContext specification() throws RecognitionException { SpecificationContext _localctx = new SpecificationContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_specification); + enterRule(_localctx, 98, RULE_specification); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(762); + setState(770); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(757); + setState(765); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3371,27 +3428,27 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(750); + setState(758); specStatement(); } break; case OPAQUE: { - setState(751); + setState(759); match(OPAQUE); ((SpecificationContext)_localctx).opaque = true; } break; case PURE: { - setState(753); + setState(761); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(755); + setState(763); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3399,21 +3456,21 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(759); + setState(767); eos(); } } } - setState(764); + setState(772); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } - setState(767); + setState(775); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(765); + setState(773); match(PURE); ((SpecificationContext)_localctx).pure = true; } @@ -3458,44 +3515,44 @@ public T accept(ParseTreeVisitor visitor) { public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_specStatement); + enterRule(_localctx, 100, RULE_specStatement); try { - setState(777); + setState(785); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(769); + setState(777); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(770); + setState(778); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(771); + setState(779); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(772); + setState(780); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(773); + setState(781); ((SpecStatementContext)_localctx).kind = match(POST); - setState(774); + setState(782); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(775); + setState(783); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(776); + setState(784); terminationMeasure(); } break; @@ -3536,28 +3593,28 @@ public T accept(ParseTreeVisitor visitor) { public final TerminationMeasureContext terminationMeasure() throws RecognitionException { TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_terminationMeasure); + enterRule(_localctx, 102, RULE_terminationMeasure); try { enterOuterAlt(_localctx, 1); { - setState(780); + setState(788); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { case 1: { - setState(779); + setState(787); expressionList(); } break; } - setState(784); + setState(792); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { - setState(782); + setState(790); match(IF); - setState(783); + setState(791); expression(0); } break; @@ -3593,9 +3650,9 @@ public T accept(ParseTreeVisitor visitor) { public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_assertion); + enterRule(_localctx, 104, RULE_assertion); try { - setState(788); + setState(796); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { case 1: @@ -3606,7 +3663,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(787); + setState(795); expression(0); } break; @@ -3650,32 +3707,32 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtContext matchStmt() throws RecognitionException { MatchStmtContext _localctx = new MatchStmtContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_matchStmt); + enterRule(_localctx, 106, RULE_matchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(790); + setState(798); match(MATCH); - setState(791); + setState(799); expression(0); - setState(792); + setState(800); match(L_CURLY); - setState(796); + setState(804); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(793); + setState(801); matchStmtClause(); } } - setState(798); + setState(806); _errHandler.sync(this); _la = _input.LA(1); } - setState(799); + setState(807); match(R_CURLY); } } @@ -3712,20 +3769,20 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtClauseContext matchStmtClause() throws RecognitionException { MatchStmtClauseContext _localctx = new MatchStmtClauseContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_matchStmtClause); + enterRule(_localctx, 108, RULE_matchStmtClause); try { enterOuterAlt(_localctx, 1); { - setState(801); + setState(809); matchCase(); - setState(802); + setState(810); match(COLON); - setState(804); + setState(812); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { case 1: { - setState(803); + setState(811); statementList(); } break; @@ -3763,24 +3820,24 @@ public T accept(ParseTreeVisitor visitor) { public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_matchCase); + enterRule(_localctx, 110, RULE_matchCase); try { - setState(809); + setState(817); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(806); + setState(814); match(CASE); - setState(807); + setState(815); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(808); + setState(816); match(DEFAULT); } break; @@ -3855,19 +3912,19 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternContext matchPattern() throws RecognitionException { MatchPatternContext _localctx = new MatchPatternContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_matchPattern); + enterRule(_localctx, 112, RULE_matchPattern); int _la; try { - setState(824); + setState(832); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(811); + setState(819); match(QMARK); - setState(812); + setState(820); match(IDENTIFIER); } break; @@ -3875,23 +3932,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(813); + setState(821); literalType(); - setState(814); + setState(822); match(L_CURLY); - setState(819); + setState(827); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956190846021146L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913343522074138L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(815); + setState(823); matchPatternList(); - setState(817); + setState(825); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(816); + setState(824); match(COMMA); } } @@ -3899,7 +3956,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(821); + setState(829); match(R_CURLY); } break; @@ -3907,7 +3964,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(823); + setState(831); expression(0); } break; @@ -3949,28 +4006,28 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternListContext matchPatternList() throws RecognitionException { MatchPatternListContext _localctx = new MatchPatternListContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_matchPatternList); + enterRule(_localctx, 114, RULE_matchPatternList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(826); + setState(834); matchPattern(); - setState(831); + setState(839); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,47,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(827); + setState(835); match(COMMA); - setState(828); + setState(836); matchPattern(); } } } - setState(833); + setState(841); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,47,_ctx); } @@ -4014,37 +4071,37 @@ public T accept(ParseTreeVisitor visitor) { public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException { BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_blockWithBodyParameterInfo); + enterRule(_localctx, 116, RULE_blockWithBodyParameterInfo); try { enterOuterAlt(_localctx, 1); { - setState(834); + setState(842); match(L_CURLY); - setState(839); + setState(847); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(835); + setState(843); match(SHARE); - setState(836); + setState(844); identifierList(); - setState(837); + setState(845); eos(); } break; } - setState(842); + setState(850); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: { - setState(841); + setState(849); statementList(); } break; } - setState(844); + setState(852); match(R_CURLY); } } @@ -4084,47 +4141,47 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecInstanceContext closureSpecInstance() throws RecognitionException { ClosureSpecInstanceContext _localctx = new ClosureSpecInstanceContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_closureSpecInstance); + enterRule(_localctx, 118, RULE_closureSpecInstance); int _la; try { enterOuterAlt(_localctx, 1); { - setState(848); + setState(856); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(846); + setState(854); qualifiedIdent(); } break; case 2: { - setState(847); + setState(855); match(IDENTIFIER); } break; } - setState(858); + setState(866); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: { - setState(850); + setState(858); match(L_CURLY); - setState(855); + setState(863); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(851); + setState(859); closureSpecParams(); - setState(853); + setState(861); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(852); + setState(860); match(COMMA); } } @@ -4132,7 +4189,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(857); + setState(865); match(R_CURLY); } break; @@ -4175,28 +4232,28 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamsContext closureSpecParams() throws RecognitionException { ClosureSpecParamsContext _localctx = new ClosureSpecParamsContext(_ctx, getState()); - enterRule(_localctx, 118, RULE_closureSpecParams); + enterRule(_localctx, 120, RULE_closureSpecParams); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(860); + setState(868); closureSpecParam(); - setState(865); + setState(873); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,54,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(861); + setState(869); match(COMMA); - setState(862); + setState(870); closureSpecParam(); } } } - setState(867); + setState(875); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,54,_ctx); } @@ -4233,23 +4290,23 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamContext closureSpecParam() throws RecognitionException { ClosureSpecParamContext _localctx = new ClosureSpecParamContext(_ctx, getState()); - enterRule(_localctx, 120, RULE_closureSpecParam); + enterRule(_localctx, 122, RULE_closureSpecParam); try { enterOuterAlt(_localctx, 1); { - setState(870); + setState(878); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(868); + setState(876); match(IDENTIFIER); - setState(869); + setState(877); match(COLON); } break; } - setState(872); + setState(880); expression(0); } } @@ -4290,19 +4347,19 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureImplProofStmtContext closureImplProofStmt() throws RecognitionException { ClosureImplProofStmtContext _localctx = new ClosureImplProofStmtContext(_ctx, getState()); - enterRule(_localctx, 122, RULE_closureImplProofStmt); + enterRule(_localctx, 124, RULE_closureImplProofStmt); try { enterOuterAlt(_localctx, 1); { - setState(874); + setState(882); match(PROOF); - setState(875); + setState(883); expression(0); - setState(876); + setState(884); match(IMPL); - setState(877); + setState(885); closureSpecInstance(); - setState(878); + setState(886); block(); } } @@ -4359,57 +4416,57 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofContext implementationProof() throws RecognitionException { ImplementationProofContext _localctx = new ImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 124, RULE_implementationProof); + enterRule(_localctx, 126, RULE_implementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(880); + setState(888); type_(); - setState(881); + setState(889); match(IMPL); - setState(882); + setState(890); type_(); - setState(901); + setState(909); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { - setState(883); + setState(891); match(L_CURLY); - setState(889); + setState(897); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(884); + setState(892); implementationProofPredicateAlias(); - setState(885); + setState(893); eos(); } } - setState(891); + setState(899); _errHandler.sync(this); _la = _input.LA(1); } - setState(897); + setState(905); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(892); + setState(900); methodImplementationProof(); - setState(893); + setState(901); eos(); } } - setState(899); + setState(907); _errHandler.sync(this); _la = _input.LA(1); } - setState(900); + setState(908); match(R_CURLY); } break; @@ -4453,33 +4510,33 @@ public T accept(ParseTreeVisitor visitor) { public final MethodImplementationProofContext methodImplementationProof() throws RecognitionException { MethodImplementationProofContext _localctx = new MethodImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 126, RULE_methodImplementationProof); + enterRule(_localctx, 128, RULE_methodImplementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(904); + setState(912); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(903); + setState(911); match(PURE); } } - setState(906); + setState(914); nonLocalReceiver(); - setState(907); + setState(915); match(IDENTIFIER); - setState(908); + setState(916); signature(); - setState(910); + setState(918); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: { - setState(909); + setState(917); block(); } break; @@ -4519,36 +4576,36 @@ public T accept(ParseTreeVisitor visitor) { public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionException { NonLocalReceiverContext _localctx = new NonLocalReceiverContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_nonLocalReceiver); + enterRule(_localctx, 130, RULE_nonLocalReceiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(912); + setState(920); match(L_PAREN); - setState(914); + setState(922); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(913); + setState(921); match(IDENTIFIER); } break; } - setState(917); + setState(925); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(916); + setState(924); match(STAR); } } - setState(919); + setState(927); typeName(); - setState(920); + setState(928); match(R_PAREN); } } @@ -4586,26 +4643,26 @@ public T accept(ParseTreeVisitor visitor) { public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); - enterRule(_localctx, 130, RULE_selection); + enterRule(_localctx, 132, RULE_selection); try { - setState(927); + setState(935); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(922); + setState(930); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(923); + setState(931); type_(); - setState(924); + setState(932); match(DOT); - setState(925); + setState(933); match(IDENTIFIER); } break; @@ -4646,28 +4703,28 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofPredicateAliasContext implementationProofPredicateAlias() throws RecognitionException { ImplementationProofPredicateAliasContext _localctx = new ImplementationProofPredicateAliasContext(_ctx, getState()); - enterRule(_localctx, 132, RULE_implementationProofPredicateAlias); + enterRule(_localctx, 134, RULE_implementationProofPredicateAlias); try { enterOuterAlt(_localctx, 1); { - setState(929); + setState(937); match(PRED); - setState(930); + setState(938); match(IDENTIFIER); - setState(931); + setState(939); match(DECLARE_ASSIGN); - setState(934); + setState(942); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { case 1: { - setState(932); + setState(940); selection(); } break; case 2: { - setState(933); + setState(941); operandName(); } break; @@ -4710,30 +4767,30 @@ public T accept(ParseTreeVisitor visitor) { public final MakeContext make() throws RecognitionException { MakeContext _localctx = new MakeContext(_ctx, getState()); - enterRule(_localctx, 134, RULE_make); + enterRule(_localctx, 136, RULE_make); int _la; try { enterOuterAlt(_localctx, 1); { - setState(936); + setState(944); match(MAKE); - setState(937); + setState(945); match(L_PAREN); - setState(938); + setState(946); type_(); - setState(941); + setState(949); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(939); + setState(947); match(COMMA); - setState(940); + setState(948); expressionList(); } } - setState(943); + setState(951); match(R_PAREN); } } @@ -4769,17 +4826,17 @@ public T accept(ParseTreeVisitor visitor) { public final New_Context new_() throws RecognitionException { New_Context _localctx = new New_Context(_ctx, getState()); - enterRule(_localctx, 136, RULE_new_); + enterRule(_localctx, 138, RULE_new_); try { enterOuterAlt(_localctx, 1); { - setState(945); + setState(953); match(NEW); - setState(946); + setState(954); match(L_PAREN); - setState(947); + setState(955); type_(); - setState(948); + setState(956); match(R_PAREN); } } @@ -4819,24 +4876,24 @@ public T accept(ParseTreeVisitor visitor) { public final SpecMemberContext specMember() throws RecognitionException { SpecMemberContext _localctx = new SpecMemberContext(_ctx, getState()); - enterRule(_localctx, 138, RULE_specMember); + enterRule(_localctx, 140, RULE_specMember); try { enterOuterAlt(_localctx, 1); { - setState(950); + setState(958); ((SpecMemberContext)_localctx).specification = specification(); - setState(953); + setState(961); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { case 1: { - setState(951); + setState(959); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; case 2: { - setState(952); + setState(960); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; @@ -4884,23 +4941,23 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionDeclContext functionDecl(boolean trusted,boolean pure,boolean opaque) throws RecognitionException { FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure, opaque); - enterRule(_localctx, 140, RULE_functionDecl); + enterRule(_localctx, 142, RULE_functionDecl); try { enterOuterAlt(_localctx, 1); { - setState(955); + setState(963); match(FUNC); - setState(956); + setState(964); match(IDENTIFIER); { - setState(957); + setState(965); signature(); - setState(959); + setState(967); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(958); + setState(966); blockWithBodyParameterInfo(); } break; @@ -4952,25 +5009,25 @@ public T accept(ParseTreeVisitor visitor) { public final MethodDeclContext methodDecl(boolean trusted,boolean pure,boolean opaque) throws RecognitionException { MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure, opaque); - enterRule(_localctx, 142, RULE_methodDecl); + enterRule(_localctx, 144, RULE_methodDecl); try { enterOuterAlt(_localctx, 1); { - setState(961); + setState(969); match(FUNC); - setState(962); + setState(970); receiver(); - setState(963); + setState(971); match(IDENTIFIER); { - setState(964); + setState(972); signature(); - setState(966); + setState(974); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(965); + setState(973); blockWithBodyParameterInfo(); } break; @@ -5011,13 +5068,13 @@ public T accept(ParseTreeVisitor visitor) { public final ExplicitGhostMemberContext explicitGhostMember() throws RecognitionException { ExplicitGhostMemberContext _localctx = new ExplicitGhostMemberContext(_ctx, getState()); - enterRule(_localctx, 144, RULE_explicitGhostMember); + enterRule(_localctx, 146, RULE_explicitGhostMember); try { enterOuterAlt(_localctx, 1); { - setState(968); + setState(976); match(GHOST); - setState(971); + setState(979); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -5029,7 +5086,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case OPAQUE: case FUNC: { - setState(969); + setState(977); specMember(); } break; @@ -5037,7 +5094,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(970); + setState(978); declaration(); } break; @@ -5080,22 +5137,22 @@ public T accept(ParseTreeVisitor visitor) { public final FpredicateDeclContext fpredicateDecl() throws RecognitionException { FpredicateDeclContext _localctx = new FpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 146, RULE_fpredicateDecl); + enterRule(_localctx, 148, RULE_fpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(973); + setState(981); match(PRED); - setState(974); + setState(982); match(IDENTIFIER); - setState(975); + setState(983); parameters(); - setState(977); + setState(985); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(976); + setState(984); predicateBody(); } break; @@ -5136,17 +5193,17 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateBodyContext predicateBody() throws RecognitionException { PredicateBodyContext _localctx = new PredicateBodyContext(_ctx, getState()); - enterRule(_localctx, 148, RULE_predicateBody); + enterRule(_localctx, 150, RULE_predicateBody); try { enterOuterAlt(_localctx, 1); { - setState(979); + setState(987); match(L_CURLY); - setState(980); + setState(988); expression(0); - setState(981); + setState(989); eos(); - setState(982); + setState(990); match(R_CURLY); } } @@ -5187,24 +5244,24 @@ public T accept(ParseTreeVisitor visitor) { public final MpredicateDeclContext mpredicateDecl() throws RecognitionException { MpredicateDeclContext _localctx = new MpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 150, RULE_mpredicateDecl); + enterRule(_localctx, 152, RULE_mpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(984); + setState(992); match(PRED); - setState(985); + setState(993); receiver(); - setState(986); + setState(994); match(IDENTIFIER); - setState(987); + setState(995); parameters(); - setState(989); + setState(997); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: { - setState(988); + setState(996); predicateBody(); } break; @@ -5247,13 +5304,13 @@ public T accept(ParseTreeVisitor visitor) { public final VarSpecContext varSpec() throws RecognitionException { VarSpecContext _localctx = new VarSpecContext(_ctx, getState()); - enterRule(_localctx, 152, RULE_varSpec); + enterRule(_localctx, 154, RULE_varSpec); try { enterOuterAlt(_localctx, 1); { - setState(991); - maybeAddressableIdentifierList(); setState(999); + maybeAddressableIdentifierList(); + setState(1007); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5262,6 +5319,7 @@ public final VarSpecContext varSpec() throws RecognitionException { case MSET: case DICT: case OPT: + case GPOINTER: case DOM: case ADT: case PRED: @@ -5276,16 +5334,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(992); + setState(1000); type_(); - setState(995); + setState(1003); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: { - setState(993); + setState(1001); match(ASSIGN); - setState(994); + setState(1002); expressionList(); } break; @@ -5294,9 +5352,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(997); + setState(1005); match(ASSIGN); - setState(998); + setState(1006); expressionList(); } break; @@ -5338,15 +5396,15 @@ public T accept(ParseTreeVisitor visitor) { public final ShortVarDeclContext shortVarDecl() throws RecognitionException { ShortVarDeclContext _localctx = new ShortVarDeclContext(_ctx, getState()); - enterRule(_localctx, 154, RULE_shortVarDecl); + enterRule(_localctx, 156, RULE_shortVarDecl); try { enterOuterAlt(_localctx, 1); { - setState(1001); + setState(1009); maybeAddressableIdentifierList(); - setState(1002); + setState(1010); match(DECLARE_ASSIGN); - setState(1003); + setState(1011); expressionList(); } } @@ -5385,36 +5443,36 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverContext receiver() throws RecognitionException { ReceiverContext _localctx = new ReceiverContext(_ctx, getState()); - enterRule(_localctx, 156, RULE_receiver); + enterRule(_localctx, 158, RULE_receiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1005); + setState(1013); match(L_PAREN); - setState(1007); + setState(1015); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: { - setState(1006); + setState(1014); maybeAddressableIdentifier(); } break; } - setState(1009); + setState(1017); type_(); - setState(1011); + setState(1019); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1010); + setState(1018); match(COMMA); } } - setState(1013); + setState(1021); match(R_PAREN); } } @@ -5450,22 +5508,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 158, RULE_parameterDecl); + enterRule(_localctx, 160, RULE_parameterDecl); try { - setState(1017); + setState(1025); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1015); + setState(1023); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1016); + setState(1024); ghostParameterDecl(); } break; @@ -5503,21 +5561,21 @@ public T accept(ParseTreeVisitor visitor) { public final ActualParameterDeclContext actualParameterDecl() throws RecognitionException { ActualParameterDeclContext _localctx = new ActualParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 160, RULE_actualParameterDecl); + enterRule(_localctx, 162, RULE_actualParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(1020); + setState(1028); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: { - setState(1019); + setState(1027); identifierList(); } break; } - setState(1022); + setState(1030); parameterType(); } } @@ -5554,23 +5612,23 @@ public T accept(ParseTreeVisitor visitor) { public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionException { GhostParameterDeclContext _localctx = new GhostParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 162, RULE_ghostParameterDecl); + enterRule(_localctx, 164, RULE_ghostParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(1024); + setState(1032); match(GHOST); - setState(1026); + setState(1034); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { - setState(1025); + setState(1033); identifierList(); } break; } - setState(1028); + setState(1036); parameterType(); } } @@ -5604,22 +5662,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterTypeContext parameterType() throws RecognitionException { ParameterTypeContext _localctx = new ParameterTypeContext(_ctx, getState()); - enterRule(_localctx, 164, RULE_parameterType); + enterRule(_localctx, 166, RULE_parameterType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1031); + setState(1039); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1030); + setState(1038); match(ELLIPSIS); } } - setState(1033); + setState(1041); type_(); } } @@ -5934,14 +5992,14 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _parentState = getState(); ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); ExpressionContext _prevctx = _localctx; - int _startState = 166; - enterRecursionRule(_localctx, 166, RULE_expression, _p); + int _startState = 168; + enterRecursionRule(_localctx, 168, RULE_expression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1056); + setState(1064); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: @@ -5950,10 +6008,10 @@ private ExpressionContext expression(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(1036); + setState(1044); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 127L) != 0)) ) { + if ( !(((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 127L) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -5961,7 +6019,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1037); + setState(1045); expression(15); } break; @@ -5970,7 +6028,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1038); + setState(1046); primaryExpr(0); } break; @@ -5979,13 +6037,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1039); + setState(1047); match(UNFOLDING); - setState(1040); + setState(1048); predicateAccess(); - setState(1041); + setState(1049); match(IN); - setState(1042); + setState(1050); expression(3); } break; @@ -5994,13 +6052,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1044); + setState(1052); match(LET); - setState(1045); + setState(1053); shortVarDecl(); - setState(1046); + setState(1054); match(IN); - setState(1047); + setState(1055); expression(2); } break; @@ -6009,7 +6067,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1049); + setState(1057); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -6019,21 +6077,21 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1050); + setState(1058); boundVariables(); - setState(1051); + setState(1059); match(COLON); - setState(1052); + setState(1060); match(COLON); - setState(1053); + setState(1061); triggers(); - setState(1054); + setState(1062); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1093); + setState(1101); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,82,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -6041,19 +6099,19 @@ private ExpressionContext expression(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1091); + setState(1099); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1058); + setState(1066); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1059); + setState(1067); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 1567L) != 0)) ) { + if ( !(((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & 1567L) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -6061,7 +6119,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1060); + setState(1068); expression(14); } break; @@ -6069,12 +6127,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1061); + setState(1069); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1062); + setState(1070); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 115)) & ~0x3f) == 0 && ((1L << (_la - 115)) & 3674113L) != 0)) ) { + if ( !(_la==WAND || ((((_la - 116)) & ~0x3f) == 0 && ((1L << (_la - 116)) & 3674113L) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -6082,7 +6140,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1063); + setState(1071); expression(13); } break; @@ -6090,9 +6148,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1064); + setState(1072); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1065); + setState(1073); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { @@ -6103,7 +6161,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1066); + setState(1074); expression(12); } break; @@ -6111,9 +6169,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1067); + setState(1075); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1068); + setState(1076); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { @@ -6124,7 +6182,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1069); + setState(1077); expression(11); } break; @@ -6132,12 +6190,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1070); + setState(1078); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1071); + setState(1079); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 35465847065542659L) != 0)) ) { + if ( !(((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 35465847065542659L) != 0)) ) { ((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this); } else { @@ -6145,7 +6203,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1072); + setState(1080); expression(10); } break; @@ -6153,11 +6211,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1073); + setState(1081); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1074); + setState(1082); match(LOGICAL_AND); - setState(1075); + setState(1083); expression(8); } break; @@ -6165,11 +6223,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1076); + setState(1084); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1077); + setState(1085); match(LOGICAL_OR); - setState(1078); + setState(1086); expression(7); } break; @@ -6177,11 +6235,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1079); + setState(1087); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1080); + setState(1088); match(IMPLIES); - setState(1081); + setState(1089); expression(5); } break; @@ -6189,15 +6247,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1082); + setState(1090); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1083); + setState(1091); match(QMARK); - setState(1084); + setState(1092); expression(0); - setState(1085); + setState(1093); match(COLON); - setState(1086); + setState(1094); expression(4); } break; @@ -6205,18 +6263,18 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1088); + setState(1096); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1089); + setState(1097); match(IMPL); - setState(1090); + setState(1098); closureSpecInstance(); } break; } } } - setState(1095); + setState(1103); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,82,_ctx); } @@ -6308,148 +6366,148 @@ public T accept(ParseTreeVisitor visitor) { public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); - enterRule(_localctx, 168, RULE_statement); + enterRule(_localctx, 170, RULE_statement); try { - setState(1116); + setState(1124); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1096); + setState(1104); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1097); + setState(1105); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1098); + setState(1106); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1099); + setState(1107); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1100); + setState(1108); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1101); + setState(1109); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1102); + setState(1110); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1103); + setState(1111); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1104); + setState(1112); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1105); + setState(1113); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1106); + setState(1114); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1107); + setState(1115); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1108); + setState(1116); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1109); + setState(1117); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1110); + setState(1118); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1111); + setState(1119); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1112); + setState(1120); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1113); + setState(1121); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1114); + setState(1122); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1115); + setState(1123); closureImplProofStmt(); } break; @@ -6485,13 +6543,13 @@ public T accept(ParseTreeVisitor visitor) { public final ApplyStmtContext applyStmt() throws RecognitionException { ApplyStmtContext _localctx = new ApplyStmtContext(_ctx, getState()); - enterRule(_localctx, 170, RULE_applyStmt); + enterRule(_localctx, 172, RULE_applyStmt); try { enterOuterAlt(_localctx, 1); { - setState(1118); + setState(1126); match(APPLY); - setState(1119); + setState(1127); expression(0); } } @@ -6528,20 +6586,20 @@ public T accept(ParseTreeVisitor visitor) { public final PackageStmtContext packageStmt() throws RecognitionException { PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState()); - enterRule(_localctx, 172, RULE_packageStmt); + enterRule(_localctx, 174, RULE_packageStmt); try { enterOuterAlt(_localctx, 1); { - setState(1121); + setState(1129); match(PACKAGE); - setState(1122); + setState(1130); expression(0); - setState(1124); + setState(1132); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: { - setState(1123); + setState(1131); block(); } break; @@ -6580,13 +6638,13 @@ public T accept(ParseTreeVisitor visitor) { public final SpecForStmtContext specForStmt() throws RecognitionException { SpecForStmtContext _localctx = new SpecForStmtContext(_ctx, getState()); - enterRule(_localctx, 174, RULE_specForStmt); + enterRule(_localctx, 176, RULE_specForStmt); try { enterOuterAlt(_localctx, 1); { - setState(1126); + setState(1134); loopSpec(); - setState(1127); + setState(1135); forStmt(); } } @@ -6636,39 +6694,39 @@ public T accept(ParseTreeVisitor visitor) { public final LoopSpecContext loopSpec() throws RecognitionException { LoopSpecContext _localctx = new LoopSpecContext(_ctx, getState()); - enterRule(_localctx, 176, RULE_loopSpec); + enterRule(_localctx, 178, RULE_loopSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1135); + setState(1143); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1129); + setState(1137); match(INV); - setState(1130); + setState(1138); expression(0); - setState(1131); + setState(1139); eos(); } } - setState(1137); + setState(1145); _errHandler.sync(this); _la = _input.LA(1); } - setState(1142); + setState(1150); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1138); + setState(1146); match(DEC); - setState(1139); + setState(1147); terminationMeasure(); - setState(1140); + setState(1148); eos(); } } @@ -6711,27 +6769,27 @@ public T accept(ParseTreeVisitor visitor) { public final DeferStmtContext deferStmt() throws RecognitionException { DeferStmtContext _localctx = new DeferStmtContext(_ctx, getState()); - enterRule(_localctx, 178, RULE_deferStmt); + enterRule(_localctx, 180, RULE_deferStmt); int _la; try { - setState(1149); + setState(1157); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1144); + setState(1152); match(DEFER); - setState(1145); + setState(1153); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1146); + setState(1154); match(DEFER); - setState(1147); + setState(1155); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -6742,7 +6800,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1148); + setState(1156); predicateAccess(); } break; @@ -6786,64 +6844,64 @@ public T accept(ParseTreeVisitor visitor) { public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); - enterRule(_localctx, 180, RULE_basicLit); + enterRule(_localctx, 182, RULE_basicLit); try { - setState(1159); + setState(1167); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1151); + setState(1159); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1152); + setState(1160); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1153); + setState(1161); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1154); + setState(1162); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1155); + setState(1163); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1156); + setState(1164); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1157); + setState(1165); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1158); + setState(1166); match(RUNE_LIT); } break; @@ -7112,14 +7170,14 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _parentState = getState(); PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, _parentState); PrimaryExprContext _prevctx = _localctx; - int _startState = 182; - enterRecursionRule(_localctx, 182, RULE_primaryExpr, _p); + int _startState = 184; + enterRecursionRule(_localctx, 184, RULE_primaryExpr, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1177); + setState(1185); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { case 1: @@ -7128,7 +7186,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(1162); + setState(1170); operand(); } break; @@ -7137,7 +7195,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1163); + setState(1171); conversion(); } break; @@ -7146,7 +7204,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1164); + setState(1172); methodExpr(); } break; @@ -7155,7 +7213,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1165); + setState(1173); ghostPrimaryExpr(); } break; @@ -7164,7 +7222,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1166); + setState(1174); new_(); } break; @@ -7173,7 +7231,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1167); + setState(1175); make(); } break; @@ -7182,11 +7240,11 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new RevealInvokePrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1168); + setState(1176); match(REVEAL); - setState(1169); + setState(1177); primaryExpr(0); - setState(1170); + setState(1178); arguments(); } break; @@ -7195,10 +7253,10 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1172); + setState(1180); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 1125899906842697L) != 0)) ) { + if ( !(((((_la - 46)) & ~0x3f) == 0 && ((1L << (_la - 46)) & 1125899906842697L) != 0)) ) { ((BuiltInCallExprContext)_localctx).call_op = (Token)_errHandler.recoverInline(this); } else { @@ -7206,17 +7264,17 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1173); + setState(1181); match(L_PAREN); - setState(1174); + setState(1182); expression(0); - setState(1175); + setState(1183); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1201); + setState(1209); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,91,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -7224,18 +7282,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1199); + setState(1207); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1179); + setState(1187); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1180); + setState(1188); match(DOT); - setState(1181); + setState(1189); match(IDENTIFIER); } break; @@ -7243,9 +7301,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1182); + setState(1190); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1183); + setState(1191); index(); } break; @@ -7253,9 +7311,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1184); + setState(1192); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1185); + setState(1193); slice_(); } break; @@ -7263,9 +7321,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1186); + setState(1194); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1187); + setState(1195); seqUpdExp(); } break; @@ -7273,9 +7331,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1188); + setState(1196); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1189); + setState(1197); typeAssertion(); } break; @@ -7283,9 +7341,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1190); + setState(1198); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1191); + setState(1199); arguments(); } break; @@ -7293,13 +7351,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1192); + setState(1200); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1193); + setState(1201); arguments(); - setState(1194); + setState(1202); match(AS); - setState(1195); + setState(1203); closureSpecInstance(); } break; @@ -7307,16 +7365,16 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1197); + setState(1205); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1198); + setState(1206); predConstructArgs(); } break; } } } - setState(1203); + setState(1211); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,91,_ctx); } @@ -7355,13 +7413,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionLitContext functionLit() throws RecognitionException { FunctionLitContext _localctx = new FunctionLitContext(_ctx, getState()); - enterRule(_localctx, 184, RULE_functionLit); + enterRule(_localctx, 186, RULE_functionLit); try { enterOuterAlt(_localctx, 1); { - setState(1204); + setState(1212); ((FunctionLitContext)_localctx).specification = specification(); - setState(1205); + setState(1213); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7404,32 +7462,32 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws RecognitionException { ClosureDeclContext _localctx = new ClosureDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 186, RULE_closureDecl); + enterRule(_localctx, 188, RULE_closureDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1207); + setState(1215); match(FUNC); - setState(1209); + setState(1217); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1208); + setState(1216); match(IDENTIFIER); } } { - setState(1211); + setState(1219); signature(); - setState(1213); + setState(1221); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(1212); + setState(1220); blockWithBodyParameterInfo(); } break; @@ -7469,34 +7527,34 @@ public T accept(ParseTreeVisitor visitor) { public final PredConstructArgsContext predConstructArgs() throws RecognitionException { PredConstructArgsContext _localctx = new PredConstructArgsContext(_ctx, getState()); - enterRule(_localctx, 188, RULE_predConstructArgs); + enterRule(_localctx, 190, RULE_predConstructArgs); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1215); + setState(1223); match(L_PRED); - setState(1217); + setState(1225); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1216); + setState(1224); expressionList(); } } - setState(1220); + setState(1228); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1219); + setState(1227); match(COMMA); } } - setState(1222); + setState(1230); match(R_PRED); } } @@ -7553,52 +7611,52 @@ public T accept(ParseTreeVisitor visitor) { public final InterfaceTypeContext interfaceType() throws RecognitionException { InterfaceTypeContext _localctx = new InterfaceTypeContext(_ctx, getState()); - enterRule(_localctx, 190, RULE_interfaceType); + enterRule(_localctx, 192, RULE_interfaceType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1224); + setState(1232); match(INTERFACE); - setState(1225); + setState(1233); match(L_CURLY); - setState(1235); + setState(1243); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 72057594172173824L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 68719476993L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 144115188210101760L) != 0) || ((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & 68719476993L) != 0)) { { { - setState(1229); + setState(1237); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: { - setState(1226); + setState(1234); methodSpec(); } break; case 2: { - setState(1227); + setState(1235); typeName(); } break; case 3: { - setState(1228); + setState(1236); predicateSpec(); } break; } - setState(1231); + setState(1239); eos(); } } - setState(1237); + setState(1245); _errHandler.sync(this); _la = _input.LA(1); } - setState(1238); + setState(1246); match(R_CURLY); } } @@ -7633,15 +7691,15 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateSpecContext predicateSpec() throws RecognitionException { PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState()); - enterRule(_localctx, 192, RULE_predicateSpec); + enterRule(_localctx, 194, RULE_predicateSpec); try { enterOuterAlt(_localctx, 1); { - setState(1240); + setState(1248); match(PRED); - setState(1241); + setState(1249); match(IDENTIFIER); - setState(1242); + setState(1250); parameters(); } } @@ -7682,53 +7740,53 @@ public T accept(ParseTreeVisitor visitor) { public final MethodSpecContext methodSpec() throws RecognitionException { MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState()); - enterRule(_localctx, 194, RULE_methodSpec); + enterRule(_localctx, 196, RULE_methodSpec); int _la; try { - setState(1259); + setState(1267); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,100,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1245); + setState(1253); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1244); + setState(1252); match(GHOST); } } - setState(1247); + setState(1255); specification(); - setState(1248); + setState(1256); match(IDENTIFIER); - setState(1249); + setState(1257); parameters(); - setState(1250); + setState(1258); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1253); + setState(1261); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1252); + setState(1260); match(GHOST); } } - setState(1255); + setState(1263); specification(); - setState(1256); + setState(1264); match(IDENTIFIER); - setState(1257); + setState(1265); parameters(); } break; @@ -7774,15 +7832,15 @@ public T accept(ParseTreeVisitor visitor) { public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); - enterRule(_localctx, 196, RULE_type_); + enterRule(_localctx, 198, RULE_type_); try { - setState(1268); + setState(1276); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1261); + setState(1269); typeName(); } break; @@ -7797,7 +7855,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1262); + setState(1270); typeLit(); } break; @@ -7807,22 +7865,23 @@ public final Type_Context type_() throws RecognitionException { case MSET: case DICT: case OPT: + case GPOINTER: case DOM: case ADT: enterOuterAlt(_localctx, 3); { - setState(1263); + setState(1271); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1264); + setState(1272); match(L_PAREN); - setState(1265); + setState(1273); type_(); - setState(1266); + setState(1274); match(R_PAREN); } break; @@ -7883,71 +7942,71 @@ public T accept(ParseTreeVisitor visitor) { public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_typeLit); + enterRule(_localctx, 200, RULE_typeLit); try { - setState(1279); + setState(1287); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1270); + setState(1278); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1271); + setState(1279); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1272); + setState(1280); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1273); + setState(1281); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1274); + setState(1282); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1275); + setState(1283); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1276); + setState(1284); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1277); + setState(1285); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1278); + setState(1286); predType(); } break; @@ -7983,13 +8042,13 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeContext predType() throws RecognitionException { PredTypeContext _localctx = new PredTypeContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_predType); + enterRule(_localctx, 202, RULE_predType); try { enterOuterAlt(_localctx, 1); { - setState(1281); + setState(1289); match(PRED); - setState(1282); + setState(1290); predTypeParams(); } } @@ -8031,45 +8090,45 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeParamsContext predTypeParams() throws RecognitionException { PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_predTypeParams); + enterRule(_localctx, 204, RULE_predTypeParams); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1284); + setState(1292); match(L_PAREN); - setState(1296); + setState(1304); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & 1441151881345761731L) != 0)) { { - setState(1285); + setState(1293); type_(); - setState(1290); + setState(1298); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,103,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1286); + setState(1294); match(COMMA); - setState(1287); + setState(1295); type_(); } } } - setState(1292); + setState(1300); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,103,_ctx); } - setState(1294); + setState(1302); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1293); + setState(1301); match(COMMA); } } @@ -8077,7 +8136,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1298); + setState(1306); match(R_PAREN); } } @@ -8128,57 +8187,57 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); - enterRule(_localctx, 204, RULE_literalType); + enterRule(_localctx, 206, RULE_literalType); try { - setState(1307); + setState(1315); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1300); + setState(1308); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1301); + setState(1309); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1302); + setState(1310); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1303); + setState(1311); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1304); + setState(1312); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1305); + setState(1313); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1306); + setState(1314); typeName(); } break; @@ -8216,17 +8275,17 @@ public T accept(ParseTreeVisitor visitor) { public final ImplicitArrayContext implicitArray() throws RecognitionException { ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_implicitArray); + enterRule(_localctx, 208, RULE_implicitArray); try { enterOuterAlt(_localctx, 1); { - setState(1309); + setState(1317); match(L_BRACKET); - setState(1310); + setState(1318); match(ELLIPSIS); - setState(1311); + setState(1319); match(R_BRACKET); - setState(1312); + setState(1320); elementType(); } } @@ -8271,36 +8330,36 @@ public T accept(ParseTreeVisitor visitor) { public final Slice_Context slice_() throws RecognitionException { Slice_Context _localctx = new Slice_Context(_ctx, getState()); - enterRule(_localctx, 208, RULE_slice_); + enterRule(_localctx, 210, RULE_slice_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1314); + setState(1322); match(L_BRACKET); - setState(1330); + setState(1338); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,110,_ctx) ) { case 1: { - setState(1316); + setState(1324); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1315); + setState(1323); low(); } } - setState(1318); + setState(1326); match(COLON); - setState(1320); + setState(1328); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1319); + setState(1327); high(); } } @@ -8309,28 +8368,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1323); + setState(1331); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1322); + setState(1330); low(); } } - setState(1325); + setState(1333); match(COLON); - setState(1326); + setState(1334); high(); - setState(1327); + setState(1335); match(COLON); - setState(1328); + setState(1336); cap(); } break; } - setState(1332); + setState(1340); match(R_BRACKET); } } @@ -8363,11 +8422,11 @@ public T accept(ParseTreeVisitor visitor) { public final LowContext low() throws RecognitionException { LowContext _localctx = new LowContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_low); + enterRule(_localctx, 212, RULE_low); try { enterOuterAlt(_localctx, 1); { - setState(1334); + setState(1342); expression(0); } } @@ -8400,11 +8459,11 @@ public T accept(ParseTreeVisitor visitor) { public final HighContext high() throws RecognitionException { HighContext _localctx = new HighContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_high); + enterRule(_localctx, 214, RULE_high); try { enterOuterAlt(_localctx, 1); { - setState(1336); + setState(1344); expression(0); } } @@ -8437,11 +8496,11 @@ public T accept(ParseTreeVisitor visitor) { public final CapContext cap() throws RecognitionException { CapContext _localctx = new CapContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_cap); + enterRule(_localctx, 216, RULE_cap); try { enterOuterAlt(_localctx, 1); { - setState(1338); + setState(1346); expression(0); } } @@ -8484,20 +8543,20 @@ public T accept(ParseTreeVisitor visitor) { public final Assign_opContext assign_op() throws RecognitionException { Assign_opContext _localctx = new Assign_opContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_assign_op); + enterRule(_localctx, 218, RULE_assign_op); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1341); + setState(1349); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & 4031L) != 0)) { + if (((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 4031L) != 0)) { { - setState(1340); + setState(1348); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & 4031L) != 0)) ) { + if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 4031L) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -8508,7 +8567,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1343); + setState(1351); match(ASSIGN); } } @@ -8552,48 +8611,48 @@ public T accept(ParseTreeVisitor visitor) { public final RangeClauseContext rangeClause() throws RecognitionException { RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_rangeClause); + enterRule(_localctx, 220, RULE_rangeClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1351); + setState(1359); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { case 1: { - setState(1345); + setState(1353); expressionList(); - setState(1346); + setState(1354); match(ASSIGN); } break; case 2: { - setState(1348); + setState(1356); maybeAddressableIdentifierList(); - setState(1349); + setState(1357); match(DECLARE_ASSIGN); } break; } - setState(1353); + setState(1361); match(RANGE); - setState(1354); + setState(1362); expression(0); - setState(1359); + setState(1367); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1355); + setState(1363); match(WITH); - setState(1357); + setState(1365); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1356); + setState(1364); match(IDENTIFIER); } } @@ -8632,13 +8691,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_packageClause); + enterRule(_localctx, 222, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1361); + setState(1369); match(PACKAGE); - setState(1362); + setState(1370); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -8671,11 +8730,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_importPath); + enterRule(_localctx, 224, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1364); + setState(1372); string_(); } } @@ -8714,29 +8773,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_declaration); + enterRule(_localctx, 226, RULE_declaration); try { - setState(1369); + setState(1377); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1366); + setState(1374); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1367); + setState(1375); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1368); + setState(1376); varDecl(); } break; @@ -8785,43 +8844,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_constDecl); + enterRule(_localctx, 228, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1371); + setState(1379); match(CONST); - setState(1383); + setState(1391); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1372); + setState(1380); constSpec(); } break; case L_PAREN: { - setState(1373); + setState(1381); match(L_PAREN); - setState(1379); + setState(1387); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1374); + setState(1382); constSpec(); - setState(1375); + setState(1383); eos(); } } - setState(1381); + setState(1389); _errHandler.sync(this); _la = _input.LA(1); } - setState(1382); + setState(1390); match(R_PAREN); } break; @@ -8866,31 +8925,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_constSpec); + enterRule(_localctx, 230, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1385); + setState(1393); identifierList(); - setState(1391); + setState(1399); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { case 1: { - setState(1387); + setState(1395); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & 1441151881345761731L) != 0)) { { - setState(1386); + setState(1394); type_(); } } - setState(1389); + setState(1397); match(ASSIGN); - setState(1390); + setState(1398); expressionList(); } break; @@ -8931,28 +8990,28 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_identifierList); + enterRule(_localctx, 232, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1393); + setState(1401); match(IDENTIFIER); - setState(1398); + setState(1406); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,120,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1394); + setState(1402); match(COMMA); - setState(1395); + setState(1403); match(IDENTIFIER); } } } - setState(1400); + setState(1408); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,120,_ctx); } @@ -8994,28 +9053,28 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_expressionList); + enterRule(_localctx, 234, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1401); + setState(1409); expression(0); - setState(1406); + setState(1414); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,121,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1402); + setState(1410); match(COMMA); - setState(1403); + setState(1411); expression(0); } } } - setState(1408); + setState(1416); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,121,_ctx); } @@ -9062,43 +9121,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_typeDecl); + enterRule(_localctx, 236, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1409); + setState(1417); match(TYPE); - setState(1421); + setState(1429); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1410); + setState(1418); typeSpec(); } break; case L_PAREN: { - setState(1411); + setState(1419); match(L_PAREN); - setState(1417); + setState(1425); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1412); + setState(1420); typeSpec(); - setState(1413); + setState(1421); eos(); } } - setState(1419); + setState(1427); _errHandler.sync(this); _la = _input.LA(1); } - setState(1420); + setState(1428); match(R_PAREN); } break; @@ -9138,24 +9197,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_typeSpec); + enterRule(_localctx, 238, RULE_typeSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1423); + setState(1431); match(IDENTIFIER); - setState(1425); + setState(1433); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1424); + setState(1432); match(ASSIGN); } } - setState(1427); + setState(1435); type_(); } } @@ -9200,43 +9259,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_varDecl); + enterRule(_localctx, 240, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1429); + setState(1437); match(VAR); - setState(1441); + setState(1449); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1430); + setState(1438); varSpec(); } break; case L_PAREN: { - setState(1431); + setState(1439); match(L_PAREN); - setState(1437); + setState(1445); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1432); + setState(1440); varSpec(); - setState(1433); + setState(1441); eos(); } } - setState(1439); + setState(1447); _errHandler.sync(this); _la = _input.LA(1); } - setState(1440); + setState(1448); match(R_PAREN); } break; @@ -9276,23 +9335,23 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_block); + enterRule(_localctx, 242, RULE_block); try { enterOuterAlt(_localctx, 1); { - setState(1443); + setState(1451); match(L_CURLY); - setState(1445); + setState(1453); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: { - setState(1444); + setState(1452); statementList(); } break; } - setState(1447); + setState(1455); match(R_CURLY); } } @@ -9342,13 +9401,13 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_statementList); + enterRule(_localctx, 244, RULE_statementList); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1461); + setState(1469); _errHandler.sync(this); _alt = 1; do { @@ -9356,17 +9415,17 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1456); + setState(1464); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: { - setState(1450); + setState(1458); _errHandler.sync(this); _la = _input.LA(1); if (_la==SEMI) { { - setState(1449); + setState(1457); match(SEMI); } } @@ -9375,12 +9434,12 @@ public final StatementListContext statementList() throws RecognitionException { break; case 2: { - setState(1453); + setState(1461); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOS) { { - setState(1452); + setState(1460); match(EOS); } } @@ -9389,14 +9448,14 @@ public final StatementListContext statementList() throws RecognitionException { break; case 3: { - setState(1455); + setState(1463); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; } - setState(1458); + setState(1466); statement(); - setState(1459); + setState(1467); eos(); } } @@ -9404,7 +9463,7 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1463); + setState(1471); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,131,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -9451,43 +9510,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_simpleStmt); + enterRule(_localctx, 246, RULE_simpleStmt); try { - setState(1470); + setState(1478); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1465); + setState(1473); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1466); + setState(1474); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1467); + setState(1475); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1468); + setState(1476); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1469); + setState(1477); shortVarDecl(); } break; @@ -9522,11 +9581,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_expressionStmt); + enterRule(_localctx, 248, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1472); + setState(1480); expression(0); } } @@ -9564,15 +9623,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_sendStmt); + enterRule(_localctx, 250, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1474); + setState(1482); ((SendStmtContext)_localctx).channel = expression(0); - setState(1475); + setState(1483); match(RECEIVE); - setState(1476); + setState(1484); expression(0); } } @@ -9607,14 +9666,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_incDecStmt); + enterRule(_localctx, 252, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1478); + setState(1486); expression(0); - setState(1479); + setState(1487); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -9661,15 +9720,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_assignment); + enterRule(_localctx, 254, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1481); + setState(1489); expressionList(); - setState(1482); + setState(1490); assign_op(); - setState(1483); + setState(1491); expressionList(); } } @@ -9701,12 +9760,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_emptyStmt); + enterRule(_localctx, 256, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1485); + setState(1493); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -9749,20 +9808,20 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_labeledStmt); + enterRule(_localctx, 258, RULE_labeledStmt); try { enterOuterAlt(_localctx, 1); { - setState(1487); + setState(1495); match(IDENTIFIER); - setState(1488); + setState(1496); match(COLON); - setState(1490); + setState(1498); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { case 1: { - setState(1489); + setState(1497); statement(); } break; @@ -9799,18 +9858,18 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_returnStmt); + enterRule(_localctx, 260, RULE_returnStmt); try { enterOuterAlt(_localctx, 1); { - setState(1492); + setState(1500); match(RETURN); - setState(1494); + setState(1502); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { case 1: { - setState(1493); + setState(1501); expressionList(); } break; @@ -9845,18 +9904,18 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_breakStmt); + enterRule(_localctx, 262, RULE_breakStmt); try { enterOuterAlt(_localctx, 1); { - setState(1496); + setState(1504); match(BREAK); - setState(1498); + setState(1506); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: { - setState(1497); + setState(1505); match(IDENTIFIER); } break; @@ -9891,18 +9950,18 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_continueStmt); + enterRule(_localctx, 264, RULE_continueStmt); try { enterOuterAlt(_localctx, 1); { - setState(1500); + setState(1508); match(CONTINUE); - setState(1502); + setState(1510); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { case 1: { - setState(1501); + setState(1509); match(IDENTIFIER); } break; @@ -9937,13 +9996,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_gotoStmt); + enterRule(_localctx, 266, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1504); + setState(1512); match(GOTO); - setState(1505); + setState(1513); match(IDENTIFIER); } } @@ -9974,11 +10033,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_fallthroughStmt); + enterRule(_localctx, 268, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1507); + setState(1515); match(FALLTHROUGH); } } @@ -10028,61 +10087,61 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_ifStmt); + enterRule(_localctx, 270, RULE_ifStmt); try { enterOuterAlt(_localctx, 1); { - setState(1509); + setState(1517); match(IF); - setState(1518); + setState(1526); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { case 1: { - setState(1510); + setState(1518); expression(0); } break; case 2: { - setState(1511); + setState(1519); eos(); - setState(1512); + setState(1520); expression(0); } break; case 3: { - setState(1514); + setState(1522); simpleStmt(); - setState(1515); + setState(1523); eos(); - setState(1516); + setState(1524); expression(0); } break; } - setState(1520); + setState(1528); block(); - setState(1526); + setState(1534); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: { - setState(1521); + setState(1529); match(ELSE); - setState(1524); + setState(1532); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1522); + setState(1530); ifStmt(); } break; case L_CURLY: { - setState(1523); + setState(1531); block(); } break; @@ -10126,22 +10185,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_switchStmt); + enterRule(_localctx, 272, RULE_switchStmt); try { - setState(1530); + setState(1538); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1528); + setState(1536); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1529); + setState(1537); typeSwitchStmt(); } break; @@ -10191,24 +10250,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_exprSwitchStmt); + enterRule(_localctx, 274, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1532); + setState(1540); match(SWITCH); - setState(1543); + setState(1551); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { case 1: { - setState(1534); + setState(1542); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1533); + setState(1541); expression(0); } } @@ -10217,24 +10276,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1537); + setState(1545); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1536); + setState(1544); simpleStmt(); } break; } - setState(1539); + setState(1547); eos(); - setState(1541); + setState(1549); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1540); + setState(1548); expression(0); } } @@ -10242,23 +10301,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1545); + setState(1553); match(L_CURLY); - setState(1549); + setState(1557); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1546); + setState(1554); exprCaseClause(); } } - setState(1551); + setState(1559); _errHandler.sync(this); _la = _input.LA(1); } - setState(1552); + setState(1560); match(R_CURLY); } } @@ -10295,20 +10354,20 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_exprCaseClause); + enterRule(_localctx, 276, RULE_exprCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1554); + setState(1562); exprSwitchCase(); - setState(1555); + setState(1563); match(COLON); - setState(1557); + setState(1565); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1556); + setState(1564); statementList(); } break; @@ -10346,24 +10405,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_exprSwitchCase); + enterRule(_localctx, 278, RULE_exprSwitchCase); try { - setState(1562); + setState(1570); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1559); + setState(1567); match(CASE); - setState(1560); + setState(1568); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1561); + setState(1569); match(DEFAULT); } break; @@ -10415,58 +10474,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 278, RULE_typeSwitchStmt); + enterRule(_localctx, 280, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1564); + setState(1572); match(SWITCH); - setState(1573); + setState(1581); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1565); + setState(1573); typeSwitchGuard(); } break; case 2: { - setState(1566); + setState(1574); eos(); - setState(1567); + setState(1575); typeSwitchGuard(); } break; case 3: { - setState(1569); + setState(1577); simpleStmt(); - setState(1570); + setState(1578); eos(); - setState(1571); + setState(1579); typeSwitchGuard(); } break; } - setState(1575); + setState(1583); match(L_CURLY); - setState(1579); + setState(1587); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1576); + setState(1584); typeCaseClause(); } } - setState(1581); + setState(1589); _errHandler.sync(this); _la = _input.LA(1); } - setState(1582); + setState(1590); match(R_CURLY); } } @@ -10505,31 +10564,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 280, RULE_typeSwitchGuard); + enterRule(_localctx, 282, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1586); + setState(1594); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { case 1: { - setState(1584); + setState(1592); match(IDENTIFIER); - setState(1585); + setState(1593); match(DECLARE_ASSIGN); } break; } - setState(1588); + setState(1596); primaryExpr(0); - setState(1589); + setState(1597); match(DOT); - setState(1590); + setState(1598); match(L_PAREN); - setState(1591); + setState(1599); match(TYPE); - setState(1592); + setState(1600); match(R_PAREN); } } @@ -10566,20 +10625,20 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 282, RULE_typeCaseClause); + enterRule(_localctx, 284, RULE_typeCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1594); + setState(1602); typeSwitchCase(); - setState(1595); + setState(1603); match(COLON); - setState(1597); + setState(1605); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { case 1: { - setState(1596); + setState(1604); statementList(); } break; @@ -10617,24 +10676,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 284, RULE_typeSwitchCase); + enterRule(_localctx, 286, RULE_typeSwitchCase); try { - setState(1602); + setState(1610); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1599); + setState(1607); match(CASE); - setState(1600); + setState(1608); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1601); + setState(1609); match(DEFAULT); } break; @@ -10682,12 +10741,12 @@ public T accept(ParseTreeVisitor visitor) { public final TypeListContext typeList() throws RecognitionException { TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 286, RULE_typeList); + enterRule(_localctx, 288, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1606); + setState(1614); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10696,6 +10755,7 @@ public final TypeListContext typeList() throws RecognitionException { case MSET: case DICT: case OPT: + case GPOINTER: case DOM: case ADT: case PRED: @@ -10710,28 +10770,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1604); + setState(1612); type_(); } break; case NIL_LIT: { - setState(1605); + setState(1613); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1615); + setState(1623); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1608); + setState(1616); match(COMMA); - setState(1611); + setState(1619); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10740,6 +10800,7 @@ public final TypeListContext typeList() throws RecognitionException { case MSET: case DICT: case OPT: + case GPOINTER: case DOM: case ADT: case PRED: @@ -10754,13 +10815,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1609); + setState(1617); type_(); } break; case NIL_LIT: { - setState(1610); + setState(1618); match(NIL_LIT); } break; @@ -10769,7 +10830,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1617); + setState(1625); _errHandler.sync(this); _la = _input.LA(1); } @@ -10810,30 +10871,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_selectStmt); + enterRule(_localctx, 290, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1618); + setState(1626); match(SELECT); - setState(1619); + setState(1627); match(L_CURLY); - setState(1623); + setState(1631); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1620); + setState(1628); commClause(); } } - setState(1625); + setState(1633); _errHandler.sync(this); _la = _input.LA(1); } - setState(1626); + setState(1634); match(R_CURLY); } } @@ -10870,20 +10931,20 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 290, RULE_commClause); + enterRule(_localctx, 292, RULE_commClause); try { enterOuterAlt(_localctx, 1); { - setState(1628); + setState(1636); commCase(); - setState(1629); + setState(1637); match(COLON); - setState(1631); + setState(1639); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: { - setState(1630); + setState(1638); statementList(); } break; @@ -10924,28 +10985,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 292, RULE_commCase); + enterRule(_localctx, 294, RULE_commCase); try { - setState(1639); + setState(1647); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1633); + setState(1641); match(CASE); - setState(1636); + setState(1644); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { case 1: { - setState(1634); + setState(1642); sendStmt(); } break; case 2: { - setState(1635); + setState(1643); recvStmt(); } break; @@ -10955,7 +11016,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1638); + setState(1646); match(DEFAULT); } break; @@ -11001,31 +11062,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 294, RULE_recvStmt); + enterRule(_localctx, 296, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1647); + setState(1655); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: { - setState(1641); + setState(1649); expressionList(); - setState(1642); + setState(1650); match(ASSIGN); } break; case 2: { - setState(1644); + setState(1652); identifierList(); - setState(1645); + setState(1653); match(DECLARE_ASSIGN); } break; } - setState(1649); + setState(1657); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -11068,24 +11129,24 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 296, RULE_forStmt); + enterRule(_localctx, 298, RULE_forStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1651); - match(FOR); setState(1659); + match(FOR); + setState(1667); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: { - setState(1653); + setState(1661); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1652); + setState(1660); expression(0); } } @@ -11094,18 +11155,18 @@ public final ForStmtContext forStmt() throws RecognitionException { break; case 2: { - setState(1655); + setState(1663); forClause(); } break; case 3: { - setState(1657); + setState(1665); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1656); + setState(1664); rangeClause(); } } @@ -11113,7 +11174,7 @@ public final ForStmtContext forStmt() throws RecognitionException { } break; } - setState(1661); + setState(1669); block(); } } @@ -11160,41 +11221,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 298, RULE_forClause); + enterRule(_localctx, 300, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1664); + setState(1672); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { case 1: { - setState(1663); + setState(1671); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1666); + setState(1674); eos(); - setState(1668); + setState(1676); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,165,_ctx) ) { case 1: { - setState(1667); + setState(1675); expression(0); } break; } - setState(1670); + setState(1678); eos(); - setState(1672); + setState(1680); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1671); + setState(1679); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -11231,13 +11292,13 @@ public T accept(ParseTreeVisitor visitor) { public final GoStmtContext goStmt() throws RecognitionException { GoStmtContext _localctx = new GoStmtContext(_ctx, getState()); - enterRule(_localctx, 300, RULE_goStmt); + enterRule(_localctx, 302, RULE_goStmt); try { enterOuterAlt(_localctx, 1); { - setState(1674); + setState(1682); match(GO); - setState(1675); + setState(1683); expression(0); } } @@ -11271,22 +11332,22 @@ public T accept(ParseTreeVisitor visitor) { public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); - enterRule(_localctx, 302, RULE_typeName); + enterRule(_localctx, 304, RULE_typeName); try { - setState(1679); + setState(1687); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1677); + setState(1685); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1678); + setState(1686); match(IDENTIFIER); } break; @@ -11326,17 +11387,17 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayTypeContext arrayType() throws RecognitionException { ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 304, RULE_arrayType); + enterRule(_localctx, 306, RULE_arrayType); try { enterOuterAlt(_localctx, 1); { - setState(1681); + setState(1689); match(L_BRACKET); - setState(1682); + setState(1690); arrayLength(); - setState(1683); + setState(1691); match(R_BRACKET); - setState(1684); + setState(1692); elementType(); } } @@ -11369,11 +11430,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayLengthContext arrayLength() throws RecognitionException { ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_arrayLength); + enterRule(_localctx, 308, RULE_arrayLength); try { enterOuterAlt(_localctx, 1); { - setState(1686); + setState(1694); expression(0); } } @@ -11406,11 +11467,11 @@ public T accept(ParseTreeVisitor visitor) { public final ElementTypeContext elementType() throws RecognitionException { ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_elementType); + enterRule(_localctx, 310, RULE_elementType); try { enterOuterAlt(_localctx, 1); { - setState(1688); + setState(1696); type_(); } } @@ -11444,13 +11505,13 @@ public T accept(ParseTreeVisitor visitor) { public final PointerTypeContext pointerType() throws RecognitionException { PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_pointerType); + enterRule(_localctx, 312, RULE_pointerType); try { enterOuterAlt(_localctx, 1); { - setState(1690); + setState(1698); match(STAR); - setState(1691); + setState(1699); type_(); } } @@ -11485,15 +11546,15 @@ public T accept(ParseTreeVisitor visitor) { public final SliceTypeContext sliceType() throws RecognitionException { SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_sliceType); + enterRule(_localctx, 314, RULE_sliceType); try { enterOuterAlt(_localctx, 1); { - setState(1693); + setState(1701); match(L_BRACKET); - setState(1694); + setState(1702); match(R_BRACKET); - setState(1695); + setState(1703); elementType(); } } @@ -11532,19 +11593,19 @@ public T accept(ParseTreeVisitor visitor) { public final MapTypeContext mapType() throws RecognitionException { MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_mapType); + enterRule(_localctx, 316, RULE_mapType); try { enterOuterAlt(_localctx, 1); { - setState(1697); + setState(1705); match(MAP); - setState(1698); + setState(1706); match(L_BRACKET); - setState(1699); + setState(1707); type_(); - setState(1700); + setState(1708); match(R_BRACKET); - setState(1701); + setState(1709); elementType(); } } @@ -11579,37 +11640,37 @@ public T accept(ParseTreeVisitor visitor) { public final ChannelTypeContext channelType() throws RecognitionException { ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_channelType); + enterRule(_localctx, 318, RULE_channelType); try { enterOuterAlt(_localctx, 1); { - setState(1708); + setState(1716); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { case 1: { - setState(1703); + setState(1711); match(CHAN); } break; case 2: { - setState(1704); + setState(1712); match(CHAN); - setState(1705); + setState(1713); match(RECEIVE); } break; case 3: { - setState(1706); + setState(1714); match(RECEIVE); - setState(1707); + setState(1715); match(CHAN); } break; } - setState(1710); + setState(1718); elementType(); } } @@ -11643,13 +11704,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTypeContext functionType() throws RecognitionException { FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_functionType); + enterRule(_localctx, 320, RULE_functionType); try { enterOuterAlt(_localctx, 1); { - setState(1712); + setState(1720); match(FUNC); - setState(1713); + setState(1721); signature(); } } @@ -11685,24 +11746,24 @@ public T accept(ParseTreeVisitor visitor) { public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_signature); + enterRule(_localctx, 322, RULE_signature); try { - setState(1719); + setState(1727); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1715); + setState(1723); parameters(); - setState(1716); + setState(1724); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1718); + setState(1726); parameters(); } break; @@ -11740,22 +11801,22 @@ public T accept(ParseTreeVisitor visitor) { public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_result); + enterRule(_localctx, 324, RULE_result); try { - setState(1723); + setState(1731); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1721); + setState(1729); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1722); + setState(1730); type_(); } break; @@ -11799,45 +11860,45 @@ public T accept(ParseTreeVisitor visitor) { public final ParametersContext parameters() throws RecognitionException { ParametersContext _localctx = new ParametersContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_parameters); + enterRule(_localctx, 326, RULE_parameters); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1725); + setState(1733); match(L_PAREN); - setState(1737); + setState(1745); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441152431101575619L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & 1441152431101575619L) != 0)) { { - setState(1726); + setState(1734); parameterDecl(); - setState(1731); + setState(1739); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,171,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1727); + setState(1735); match(COMMA); - setState(1728); + setState(1736); parameterDecl(); } } } - setState(1733); + setState(1741); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,171,_ctx); } - setState(1735); + setState(1743); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1734); + setState(1742); match(COMMA); } } @@ -11845,7 +11906,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1739); + setState(1747); match(R_PAREN); } } @@ -11884,28 +11945,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConversionContext conversion() throws RecognitionException { ConversionContext _localctx = new ConversionContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_conversion); + enterRule(_localctx, 328, RULE_conversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1741); + setState(1749); nonNamedType(); - setState(1742); + setState(1750); match(L_PAREN); - setState(1743); + setState(1751); expression(0); - setState(1745); + setState(1753); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1744); + setState(1752); match(COMMA); } } - setState(1747); + setState(1755); match(R_PAREN); } } @@ -11943,9 +12004,9 @@ public T accept(ParseTreeVisitor visitor) { public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_nonNamedType); + enterRule(_localctx, 330, RULE_nonNamedType); try { - setState(1754); + setState(1762); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -11959,18 +12020,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1749); + setState(1757); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1750); + setState(1758); match(L_PAREN); - setState(1751); + setState(1759); nonNamedType(); - setState(1752); + setState(1760); match(R_PAREN); } break; @@ -12015,33 +12076,33 @@ public T accept(ParseTreeVisitor visitor) { public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_operand); + enterRule(_localctx, 332, RULE_operand); try { - setState(1762); + setState(1770); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1756); + setState(1764); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1757); + setState(1765); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1758); + setState(1766); match(L_PAREN); - setState(1759); + setState(1767); expression(0); - setState(1760); + setState(1768); match(R_PAREN); } break; @@ -12082,9 +12143,9 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_literal); + enterRule(_localctx, 334, RULE_literal); try { - setState(1767); + setState(1775); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12101,7 +12162,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1764); + setState(1772); basicLit(); } break; @@ -12111,6 +12172,7 @@ public final LiteralContext literal() throws RecognitionException { case MSET: case DICT: case OPT: + case GPOINTER: case DOM: case ADT: case MAP: @@ -12119,7 +12181,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1765); + setState(1773); compositeLit(); } break; @@ -12133,7 +12195,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1766); + setState(1774); functionLit(); } break; @@ -12173,14 +12235,14 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerContext integer() throws RecognitionException { IntegerContext _localctx = new IntegerContext(_ctx, getState()); - enterRule(_localctx, 334, RULE_integer); + enterRule(_localctx, 336, RULE_integer); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1769); + setState(1777); _la = _input.LA(1); - if ( !(((((_la - 140)) & ~0x3f) == 0 && ((1L << (_la - 140)) & 111L) != 0)) ) { + if ( !(((((_la - 141)) & ~0x3f) == 0 && ((1L << (_la - 141)) & 111L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -12217,11 +12279,11 @@ public T accept(ParseTreeVisitor visitor) { public final OperandNameContext operandName() throws RecognitionException { OperandNameContext _localctx = new OperandNameContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_operandName); + enterRule(_localctx, 338, RULE_operandName); try { enterOuterAlt(_localctx, 1); { - setState(1771); + setState(1779); match(IDENTIFIER); } } @@ -12256,15 +12318,15 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedIdentContext qualifiedIdent() throws RecognitionException { QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState()); - enterRule(_localctx, 338, RULE_qualifiedIdent); + enterRule(_localctx, 340, RULE_qualifiedIdent); try { enterOuterAlt(_localctx, 1); { - setState(1773); + setState(1781); match(IDENTIFIER); - setState(1774); + setState(1782); match(DOT); - setState(1775); + setState(1783); match(IDENTIFIER); } } @@ -12300,13 +12362,13 @@ public T accept(ParseTreeVisitor visitor) { public final CompositeLitContext compositeLit() throws RecognitionException { CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_compositeLit); + enterRule(_localctx, 342, RULE_compositeLit); try { enterOuterAlt(_localctx, 1); { - setState(1777); + setState(1785); literalType(); - setState(1778); + setState(1786); literalValue(); } } @@ -12342,26 +12404,26 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralValueContext literalValue() throws RecognitionException { LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_literalValue); + enterRule(_localctx, 344, RULE_literalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1780); + setState(1788); match(L_CURLY); - setState(1785); + setState(1793); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 11960417569799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 11960417569799L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1781); + setState(1789); elementList(); - setState(1783); + setState(1791); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1782); + setState(1790); match(COMMA); } } @@ -12369,7 +12431,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1787); + setState(1795); match(R_CURLY); } } @@ -12409,28 +12471,28 @@ public T accept(ParseTreeVisitor visitor) { public final ElementListContext elementList() throws RecognitionException { ElementListContext _localctx = new ElementListContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_elementList); + enterRule(_localctx, 346, RULE_elementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1789); + setState(1797); keyedElement(); - setState(1794); + setState(1802); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,180,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1790); + setState(1798); match(COMMA); - setState(1791); + setState(1799); keyedElement(); } } } - setState(1796); + setState(1804); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,180,_ctx); } @@ -12469,23 +12531,23 @@ public T accept(ParseTreeVisitor visitor) { public final KeyedElementContext keyedElement() throws RecognitionException { KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_keyedElement); + enterRule(_localctx, 348, RULE_keyedElement); try { enterOuterAlt(_localctx, 1); { - setState(1800); + setState(1808); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,181,_ctx) ) { case 1: { - setState(1797); + setState(1805); key(); - setState(1798); + setState(1806); match(COLON); } break; } - setState(1802); + setState(1810); element(); } } @@ -12521,9 +12583,9 @@ public T accept(ParseTreeVisitor visitor) { public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_key); + enterRule(_localctx, 350, RULE_key); try { - setState(1806); + setState(1814); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12547,6 +12609,7 @@ public final KeyContext key() throws RecognitionException { case MSET: case DICT: case OPT: + case GPOINTER: case LEN: case NEW: case MAKE: @@ -12593,14 +12656,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1804); + setState(1812); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1805); + setState(1813); literalValue(); } break; @@ -12640,9 +12703,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 350, RULE_element); + enterRule(_localctx, 352, RULE_element); try { - setState(1810); + setState(1818); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12666,6 +12729,7 @@ public final ElementContext element() throws RecognitionException { case MSET: case DICT: case OPT: + case GPOINTER: case LEN: case NEW: case MAKE: @@ -12712,14 +12776,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1808); + setState(1816); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1809); + setState(1817); literalValue(); } break; @@ -12768,32 +12832,32 @@ public T accept(ParseTreeVisitor visitor) { public final StructTypeContext structType() throws RecognitionException { StructTypeContext _localctx = new StructTypeContext(_ctx, getState()); - enterRule(_localctx, 352, RULE_structType); + enterRule(_localctx, 354, RULE_structType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1812); + setState(1820); match(STRUCT); - setState(1813); + setState(1821); match(L_CURLY); - setState(1819); + setState(1827); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1814); + setState(1822); fieldDecl(); - setState(1815); + setState(1823); eos(); } } - setState(1821); + setState(1829); _errHandler.sync(this); _la = _input.LA(1); } - setState(1822); + setState(1830); match(R_CURLY); } } @@ -12836,34 +12900,34 @@ public T accept(ParseTreeVisitor visitor) { public final FieldDeclContext fieldDecl() throws RecognitionException { FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); - enterRule(_localctx, 354, RULE_fieldDecl); + enterRule(_localctx, 356, RULE_fieldDecl); try { enterOuterAlt(_localctx, 1); { - setState(1828); + setState(1836); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) { case 1: { - setState(1824); + setState(1832); identifierList(); - setState(1825); + setState(1833); type_(); } break; case 2: { - setState(1827); + setState(1835); embeddedField(); } break; } - setState(1831); + setState(1839); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { case 1: { - setState(1830); + setState(1838); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -12898,12 +12962,12 @@ public T accept(ParseTreeVisitor visitor) { public final String_Context string_() throws RecognitionException { String_Context _localctx = new String_Context(_ctx, getState()); - enterRule(_localctx, 356, RULE_string_); + enterRule(_localctx, 358, RULE_string_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1833); + setState(1841); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -12945,22 +13009,22 @@ public T accept(ParseTreeVisitor visitor) { public final EmbeddedFieldContext embeddedField() throws RecognitionException { EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState()); - enterRule(_localctx, 358, RULE_embeddedField); + enterRule(_localctx, 360, RULE_embeddedField); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1836); + setState(1844); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1835); + setState(1843); match(STAR); } } - setState(1838); + setState(1846); typeName(); } } @@ -12995,15 +13059,15 @@ public T accept(ParseTreeVisitor visitor) { public final IndexContext index() throws RecognitionException { IndexContext _localctx = new IndexContext(_ctx, getState()); - enterRule(_localctx, 360, RULE_index); + enterRule(_localctx, 362, RULE_index); try { enterOuterAlt(_localctx, 1); { - setState(1840); + setState(1848); match(L_BRACKET); - setState(1841); + setState(1849); expression(0); - setState(1842); + setState(1850); match(R_BRACKET); } } @@ -13039,17 +13103,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeAssertionContext typeAssertion() throws RecognitionException { TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState()); - enterRule(_localctx, 362, RULE_typeAssertion); + enterRule(_localctx, 364, RULE_typeAssertion); try { enterOuterAlt(_localctx, 1); { - setState(1844); + setState(1852); match(DOT); - setState(1845); + setState(1853); match(L_PAREN); - setState(1846); + setState(1854); type_(); - setState(1847); + setState(1855); match(R_PAREN); } } @@ -13092,39 +13156,39 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentsContext arguments() throws RecognitionException { ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 364, RULE_arguments); + enterRule(_localctx, 366, RULE_arguments); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1849); + setState(1857); match(L_PAREN); - setState(1864); + setState(1872); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 9761394314247L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1856); + setState(1864); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,189,_ctx) ) { case 1: { - setState(1850); + setState(1858); expressionList(); } break; case 2: { - setState(1851); + setState(1859); nonNamedType(); - setState(1854); + setState(1862); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,188,_ctx) ) { case 1: { - setState(1852); + setState(1860); match(COMMA); - setState(1853); + setState(1861); expressionList(); } break; @@ -13132,22 +13196,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1859); + setState(1867); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1858); + setState(1866); match(ELLIPSIS); } } - setState(1862); + setState(1870); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1861); + setState(1869); match(COMMA); } } @@ -13155,7 +13219,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1866); + setState(1874); match(R_PAREN); } } @@ -13190,15 +13254,15 @@ public T accept(ParseTreeVisitor visitor) { public final MethodExprContext methodExpr() throws RecognitionException { MethodExprContext _localctx = new MethodExprContext(_ctx, getState()); - enterRule(_localctx, 366, RULE_methodExpr); + enterRule(_localctx, 368, RULE_methodExpr); try { enterOuterAlt(_localctx, 1); { - setState(1868); + setState(1876); nonNamedType(); - setState(1869); + setState(1877); match(DOT); - setState(1870); + setState(1878); match(IDENTIFIER); } } @@ -13231,11 +13295,11 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverTypeContext receiverType() throws RecognitionException { ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState()); - enterRule(_localctx, 368, RULE_receiverType); + enterRule(_localctx, 370, RULE_receiverType); try { enterOuterAlt(_localctx, 1); { - setState(1872); + setState(1880); type_(); } } @@ -13268,36 +13332,36 @@ public T accept(ParseTreeVisitor visitor) { public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); - enterRule(_localctx, 370, RULE_eos); + enterRule(_localctx, 372, RULE_eos); try { - setState(1878); + setState(1886); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,193,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1874); + setState(1882); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1875); + setState(1883); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1876); + setState(1884); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1877); + setState(1885); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; @@ -13316,13 +13380,13 @@ public final EosContext eos() throws RecognitionException { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 83: + case 84: return expression_sempred((ExpressionContext)_localctx, predIndex); - case 91: + case 92: return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex); - case 121: + case 122: return statementList_sempred((StatementListContext)_localctx, predIndex); - case 185: + case 186: return eos_sempred((EosContext)_localctx, predIndex); } return true; @@ -13389,7 +13453,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a2\u0759\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a3\u0761\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -13438,198 +13502,199 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u00b0\u0002\u00b1\u0007\u00b1\u0002\u00b2\u0007\u00b2\u0002\u00b3\u0007"+ "\u00b3\u0002\u00b4\u0007\u00b4\u0002\u00b5\u0007\u00b5\u0002\u00b6\u0007"+ "\u00b6\u0002\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8\u0002\u00b9\u0007"+ - "\u00b9\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0005\u0003\u0181\b\u0003\n\u0003\f\u0003\u0184\t\u0003\u0001\u0004"+ - "\u0001\u0004\u0003\u0004\u0188\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0005\u0005\u018d\b\u0005\n\u0005\f\u0005\u0190\t\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u0197\b\u0005\n"+ - "\u0005\f\u0005\u019a\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ - "\u0005\u019f\b\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u01a3\b\u0005"+ - "\n\u0005\f\u0005\u01a6\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0005\u0006\u01ad\b\u0006\n\u0006\f\u0006\u01b0\t\u0006"+ - "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006"+ - "\u01b7\b\u0006\n\u0006\f\u0006\u01ba\t\u0006\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01c5\b"+ - "\t\n\t\f\t\u01c8\t\t\u0001\t\u0003\t\u01cb\b\t\u0001\t\u0001\t\u0001\n"+ - "\u0001\n\u0001\n\u0005\n\u01d2\b\n\n\n\f\n\u01d5\t\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0005\n\u01de\b\n\n\n\f\n\u01e1\t\n"+ - "\u0001\n\u0003\n\u01e4\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0003\u000b\u01ea\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0003\f\u01f3\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u01fd\b\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u00b9\u0002\u00ba\u0007\u00ba\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u0183\b\u0003\n\u0003\f\u0003"+ + "\u0186\t\u0003\u0001\u0004\u0001\u0004\u0003\u0004\u018a\b\u0004\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u018f\b\u0005\n\u0005\f\u0005"+ + "\u0192\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0005\u0005\u0199\b\u0005\n\u0005\f\u0005\u019c\t\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0003\u0005\u01a1\b\u0005\u0001\u0005\u0001\u0005\u0005"+ + "\u0005\u01a5\b\u0005\n\u0005\f\u0005\u01a8\t\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u01af\b\u0006\n\u0006"+ + "\f\u0006\u01b2\t\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0005\u0006\u01b9\b\u0006\n\u0006\f\u0006\u01bc\t\u0006\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t"+ + "\u0001\t\u0005\t\u01c7\b\t\n\t\f\t\u01ca\t\t\u0001\t\u0003\t\u01cd\b\t"+ + "\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0005\n\u01d4\b\n\n\n\f\n\u01d7"+ + "\t\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0005\n\u01e0"+ + "\b\n\n\n\f\n\u01e3\t\n\u0001\n\u0003\n\u01e6\b\n\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0003\u000b\u01ec\b\u000b\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0003\f\u01f5\b\f\u0001\r\u0001\r\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0003"+ + "\u000f\u01ff\b\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+ "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u020e\b\u0010\u0001\u0011\u0001"+ - "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0005\u0013\u021a\b\u0013\n\u0013\f\u0013"+ - "\u021d\t\u0013\u0001\u0013\u0003\u0013\u0220\b\u0013\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0005\u0014\u0225\b\u0014\n\u0014\f\u0014\u0228\t\u0014"+ - "\u0001\u0014\u0001\u0014\u0001\u0015\u0005\u0015\u022d\b\u0015\n\u0015"+ - "\f\u0015\u0230\t\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0005\u0016\u0236\b\u0016\n\u0016\f\u0016\u0239\t\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u0258\b\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0003"+ - "\u001d\u0260\b\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ - "!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\""+ - "\u0003\"\u0278\b\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#"+ - "\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0005$\u0289"+ - "\b$\n$\f$\u028c\t$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001&\u0001"+ - "&\u0001&\u0001&\u0005&\u0298\b&\n&\f&\u029b\t&\u0001&\u0001&\u0001\'\u0001"+ - "\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0003(\u02a7\b(\u0001)"+ - "\u0001)\u0001)\u0001)\u0001)\u0005)\u02ae\b)\n)\f)\u02b1\t)\u0001)\u0001"+ - ")\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0003"+ - "*\u02be\b*\u0001+\u0001+\u0001+\u0001+\u0001+\u0005+\u02c5\b+\n+\f+\u02c8"+ - "\t+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0005,\u02d1\b,\n"+ - ",\f,\u02d4\t,\u0001,\u0001,\u0001-\u0003-\u02d9\b-\u0001-\u0001-\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u02ed\b/\u00010\u00010\u0001"+ - "0\u00010\u00010\u00010\u00010\u00030\u02f6\b0\u00010\u00050\u02f9\b0\n"+ - "0\f0\u02fc\t0\u00010\u00010\u00030\u0300\b0\u00011\u00011\u00011\u0001"+ - "1\u00011\u00011\u00011\u00011\u00031\u030a\b1\u00012\u00032\u030d\b2\u0001"+ - "2\u00012\u00032\u0311\b2\u00013\u00013\u00033\u0315\b3\u00014\u00014\u0001"+ - "4\u00014\u00054\u031b\b4\n4\f4\u031e\t4\u00014\u00014\u00015\u00015\u0001"+ - "5\u00035\u0325\b5\u00016\u00016\u00016\u00036\u032a\b6\u00017\u00017\u0001"+ - "7\u00017\u00017\u00017\u00037\u0332\b7\u00037\u0334\b7\u00017\u00017\u0001"+ - "7\u00037\u0339\b7\u00018\u00018\u00018\u00058\u033e\b8\n8\f8\u0341\t8"+ - "\u00019\u00019\u00019\u00019\u00019\u00039\u0348\b9\u00019\u00039\u034b"+ - "\b9\u00019\u00019\u0001:\u0001:\u0003:\u0351\b:\u0001:\u0001:\u0001:\u0003"+ - ":\u0356\b:\u0003:\u0358\b:\u0001:\u0003:\u035b\b:\u0001;\u0001;\u0001"+ - ";\u0005;\u0360\b;\n;\f;\u0363\t;\u0001<\u0001<\u0003<\u0367\b<\u0001<"+ - "\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001"+ - ">\u0001>\u0001>\u0001>\u0001>\u0005>\u0378\b>\n>\f>\u037b\t>\u0001>\u0001"+ - ">\u0001>\u0005>\u0380\b>\n>\f>\u0383\t>\u0001>\u0003>\u0386\b>\u0001?"+ - "\u0003?\u0389\b?\u0001?\u0001?\u0001?\u0001?\u0003?\u038f\b?\u0001@\u0001"+ - "@\u0003@\u0393\b@\u0001@\u0003@\u0396\b@\u0001@\u0001@\u0001@\u0001A\u0001"+ - "A\u0001A\u0001A\u0001A\u0003A\u03a0\bA\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0003B\u03a7\bB\u0001C\u0001C\u0001C\u0001C\u0001C\u0003C\u03ae\bC\u0001"+ - "C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0003"+ - "E\u03ba\bE\u0001F\u0001F\u0001F\u0001F\u0003F\u03c0\bF\u0001G\u0001G\u0001"+ - "G\u0001G\u0001G\u0003G\u03c7\bG\u0001H\u0001H\u0001H\u0003H\u03cc\bH\u0001"+ - "I\u0001I\u0001I\u0001I\u0003I\u03d2\bI\u0001J\u0001J\u0001J\u0001J\u0001"+ - "J\u0001K\u0001K\u0001K\u0001K\u0001K\u0003K\u03de\bK\u0001L\u0001L\u0001"+ - "L\u0001L\u0003L\u03e4\bL\u0001L\u0001L\u0003L\u03e8\bL\u0001M\u0001M\u0001"+ - "M\u0001M\u0001N\u0001N\u0003N\u03f0\bN\u0001N\u0001N\u0003N\u03f4\bN\u0001"+ - "N\u0001N\u0001O\u0001O\u0003O\u03fa\bO\u0001P\u0003P\u03fd\bP\u0001P\u0001"+ - "P\u0001Q\u0001Q\u0003Q\u0403\bQ\u0001Q\u0001Q\u0001R\u0003R\u0408\bR\u0001"+ - "R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0003S\u0421\bS\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0005S\u0444\bS\nS"+ - "\fS\u0447\tS\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u0210"+ + "\b\u0010\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0005\u0013\u021c"+ + "\b\u0013\n\u0013\f\u0013\u021f\t\u0013\u0001\u0013\u0003\u0013\u0222\b"+ + "\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014\u0227\b\u0014\n"+ + "\u0014\f\u0014\u022a\t\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0005"+ + "\u0015\u022f\b\u0015\n\u0015\f\u0015\u0232\t\u0015\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0005\u0016\u0238\b\u0016\n\u0016\f\u0016\u023b"+ + "\t\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0003"+ + "\u001c\u025a\b\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001d\u0001\u001d\u0003\u001d\u0262\b\u001d\u0001\u001e\u0001\u001e\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001"+ + " \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0003\"\u027a\b\"\u0001\"\u0001\"\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+ + "$\u0005$\u028b\b$\n$\f$\u028e\t$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001"+ + "%\u0001&\u0001&\u0001&\u0001&\u0005&\u029a\b&\n&\f&\u029d\t&\u0001&\u0001"+ + "&\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0003"+ + "(\u02aa\b(\u0001)\u0001)\u0001)\u0001)\u0001)\u0005)\u02b1\b)\n)\f)\u02b4"+ + "\t)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0003*\u02c1\b*\u0001+\u0001+\u0001+\u0001+\u0001+\u0005+\u02c8"+ + "\b+\n+\f+\u02cb\t+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0005"+ + ",\u02d4\b,\n,\f,\u02d7\t,\u0001,\u0001,\u0001-\u0003-\u02dc\b-\u0001-"+ + "\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ + "0\u00010\u00010\u00030\u02f5\b0\u00011\u00011\u00011\u00011\u00011\u0001"+ + "1\u00011\u00031\u02fe\b1\u00011\u00051\u0301\b1\n1\f1\u0304\t1\u00011"+ + "\u00011\u00031\u0308\b1\u00012\u00012\u00012\u00012\u00012\u00012\u0001"+ + "2\u00012\u00032\u0312\b2\u00013\u00033\u0315\b3\u00013\u00013\u00033\u0319"+ + "\b3\u00014\u00014\u00034\u031d\b4\u00015\u00015\u00015\u00015\u00055\u0323"+ + "\b5\n5\f5\u0326\t5\u00015\u00015\u00016\u00016\u00016\u00036\u032d\b6"+ + "\u00017\u00017\u00017\u00037\u0332\b7\u00018\u00018\u00018\u00018\u0001"+ + "8\u00018\u00038\u033a\b8\u00038\u033c\b8\u00018\u00018\u00018\u00038\u0341"+ + "\b8\u00019\u00019\u00019\u00059\u0346\b9\n9\f9\u0349\t9\u0001:\u0001:"+ + "\u0001:\u0001:\u0001:\u0003:\u0350\b:\u0001:\u0003:\u0353\b:\u0001:\u0001"+ + ":\u0001;\u0001;\u0003;\u0359\b;\u0001;\u0001;\u0001;\u0003;\u035e\b;\u0003"+ + ";\u0360\b;\u0001;\u0003;\u0363\b;\u0001<\u0001<\u0001<\u0005<\u0368\b"+ + "<\n<\f<\u036b\t<\u0001=\u0001=\u0003=\u036f\b=\u0001=\u0001=\u0001>\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0005?\u0380\b?\n?\f?\u0383\t?\u0001?\u0001?\u0001?\u0005?\u0388"+ + "\b?\n?\f?\u038b\t?\u0001?\u0003?\u038e\b?\u0001@\u0003@\u0391\b@\u0001"+ + "@\u0001@\u0001@\u0001@\u0003@\u0397\b@\u0001A\u0001A\u0003A\u039b\bA\u0001"+ + "A\u0003A\u039e\bA\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0003B\u03a8\bB\u0001C\u0001C\u0001C\u0001C\u0001C\u0003C\u03af\bC\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0003D\u03b6\bD\u0001D\u0001D\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0003F\u03c2\bF\u0001G\u0001"+ + "G\u0001G\u0001G\u0003G\u03c8\bG\u0001H\u0001H\u0001H\u0001H\u0001H\u0003"+ + "H\u03cf\bH\u0001I\u0001I\u0001I\u0003I\u03d4\bI\u0001J\u0001J\u0001J\u0001"+ + "J\u0003J\u03da\bJ\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0003L\u03e6\bL\u0001M\u0001M\u0001M\u0001M\u0003M\u03ec"+ + "\bM\u0001M\u0001M\u0003M\u03f0\bM\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ + "O\u0003O\u03f8\bO\u0001O\u0001O\u0003O\u03fc\bO\u0001O\u0001O\u0001P\u0001"+ + "P\u0003P\u0402\bP\u0001Q\u0003Q\u0405\bQ\u0001Q\u0001Q\u0001R\u0001R\u0003"+ + "R\u040b\bR\u0001R\u0001R\u0001S\u0003S\u0410\bS\u0001S\u0001S\u0001T\u0001"+ + "T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ + "T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0003"+ + "T\u0429\bT\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ + "T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ "T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ - "T\u0001T\u0003T\u045d\bT\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0003"+ - "V\u0465\bV\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0005X\u046e"+ - "\bX\nX\fX\u0471\tX\u0001X\u0001X\u0001X\u0001X\u0003X\u0477\bX\u0001Y"+ - "\u0001Y\u0001Y\u0001Y\u0001Y\u0003Y\u047e\bY\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003Z\u0488\bZ\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0003[\u049a\b[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001[\u0005[\u04b0\b[\n[\f[\u04b3\t[\u0001\\\u0001"+ - "\\\u0001\\\u0001]\u0001]\u0003]\u04ba\b]\u0001]\u0001]\u0003]\u04be\b"+ - "]\u0001^\u0001^\u0003^\u04c2\b^\u0001^\u0003^\u04c5\b^\u0001^\u0001^\u0001"+ - "_\u0001_\u0001_\u0001_\u0001_\u0003_\u04ce\b_\u0001_\u0001_\u0005_\u04d2"+ - "\b_\n_\f_\u04d5\t_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001a\u0003"+ - "a\u04de\ba\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0003a\u04e6\ba\u0001"+ - "a\u0001a\u0001a\u0001a\u0003a\u04ec\ba\u0001b\u0001b\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0003b\u04f5\bb\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ - "c\u0001c\u0001c\u0001c\u0003c\u0500\bc\u0001d\u0001d\u0001d\u0001e\u0001"+ - "e\u0001e\u0001e\u0005e\u0509\be\ne\fe\u050c\te\u0001e\u0003e\u050f\be"+ - "\u0003e\u0511\be\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001f\u0001"+ - "f\u0001f\u0003f\u051c\bf\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001"+ - "h\u0003h\u0525\bh\u0001h\u0001h\u0003h\u0529\bh\u0001h\u0003h\u052c\b"+ - "h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u0533\bh\u0001h\u0001h\u0001"+ - "i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001l\u0003l\u053e\bl\u0001l\u0001"+ - "l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0003m\u0548\bm\u0001m\u0001"+ - "m\u0001m\u0001m\u0003m\u054e\bm\u0003m\u0550\bm\u0001n\u0001n\u0001n\u0001"+ - "o\u0001o\u0001p\u0001p\u0001p\u0003p\u055a\bp\u0001q\u0001q\u0001q\u0001"+ - "q\u0001q\u0001q\u0005q\u0562\bq\nq\fq\u0565\tq\u0001q\u0003q\u0568\bq"+ - "\u0001r\u0001r\u0003r\u056c\br\u0001r\u0001r\u0003r\u0570\br\u0001s\u0001"+ - "s\u0001s\u0005s\u0575\bs\ns\fs\u0578\ts\u0001t\u0001t\u0001t\u0005t\u057d"+ - "\bt\nt\ft\u0580\tt\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0005u\u0588"+ - "\bu\nu\fu\u058b\tu\u0001u\u0003u\u058e\bu\u0001v\u0001v\u0003v\u0592\b"+ - "v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0005w\u059c"+ - "\bw\nw\fw\u059f\tw\u0001w\u0003w\u05a2\bw\u0001x\u0001x\u0003x\u05a6\b"+ - "x\u0001x\u0001x\u0001y\u0003y\u05ab\by\u0001y\u0003y\u05ae\by\u0001y\u0003"+ - "y\u05b1\by\u0001y\u0001y\u0001y\u0004y\u05b6\by\u000by\fy\u05b7\u0001"+ - "z\u0001z\u0001z\u0001z\u0001z\u0003z\u05bf\bz\u0001{\u0001{\u0001|\u0001"+ - "|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001"+ - "\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0003\u0080\u05d3"+ - "\b\u0080\u0001\u0081\u0001\u0081\u0003\u0081\u05d7\b\u0081\u0001\u0082"+ - "\u0001\u0082\u0003\u0082\u05db\b\u0082\u0001\u0083\u0001\u0083\u0003\u0083"+ - "\u05df\b\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085"+ - "\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086"+ - "\u0001\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u05ef\b\u0086\u0001\u0086"+ - "\u0001\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u05f5\b\u0086\u0003\u0086"+ - "\u05f7\b\u0086\u0001\u0087\u0001\u0087\u0003\u0087\u05fb\b\u0087\u0001"+ - "\u0088\u0001\u0088\u0003\u0088\u05ff\b\u0088\u0001\u0088\u0003\u0088\u0602"+ - "\b\u0088\u0001\u0088\u0001\u0088\u0003\u0088\u0606\b\u0088\u0003\u0088"+ - "\u0608\b\u0088\u0001\u0088\u0001\u0088\u0005\u0088\u060c\b\u0088\n\u0088"+ - "\f\u0088\u060f\t\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089"+ - "\u0001\u0089\u0003\u0089\u0616\b\u0089\u0001\u008a\u0001\u008a\u0001\u008a"+ - "\u0003\u008a\u061b\b\u008a\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b"+ - "\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0003\u008b"+ - "\u0626\b\u008b\u0001\u008b\u0001\u008b\u0005\u008b\u062a\b\u008b\n\u008b"+ - "\f\u008b\u062d\t\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c"+ - "\u0003\u008c\u0633\b\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c"+ - "\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0003\u008d"+ - "\u063e\b\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u0643\b"+ - "\u008e\u0001\u008f\u0001\u008f\u0003\u008f\u0647\b\u008f\u0001\u008f\u0001"+ - "\u008f\u0001\u008f\u0003\u008f\u064c\b\u008f\u0005\u008f\u064e\b\u008f"+ - "\n\u008f\f\u008f\u0651\t\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0005"+ - "\u0090\u0656\b\u0090\n\u0090\f\u0090\u0659\t\u0090\u0001\u0090\u0001\u0090"+ - "\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u0660\b\u0091\u0001\u0092"+ - "\u0001\u0092\u0001\u0092\u0003\u0092\u0665\b\u0092\u0001\u0092\u0003\u0092"+ - "\u0668\b\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093"+ - "\u0001\u0093\u0003\u0093\u0670\b\u0093\u0001\u0093\u0001\u0093\u0001\u0094"+ - "\u0001\u0094\u0003\u0094\u0676\b\u0094\u0001\u0094\u0001\u0094\u0003\u0094"+ - "\u067a\b\u0094\u0003\u0094\u067c\b\u0094\u0001\u0094\u0001\u0094\u0001"+ - "\u0095\u0003\u0095\u0681\b\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u0685"+ - "\b\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u0689\b\u0095\u0001\u0096"+ - "\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0003\u0097\u0690\b\u0097"+ - "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099"+ - "\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b"+ - "\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d"+ - "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e"+ - "\u0001\u009e\u0001\u009e\u0001\u009e\u0003\u009e\u06ad\b\u009e\u0001\u009e"+ - "\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0"+ - "\u0001\u00a0\u0001\u00a0\u0003\u00a0\u06b8\b\u00a0\u0001\u00a1\u0001\u00a1"+ - "\u0003\u00a1\u06bc\b\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2"+ - "\u0005\u00a2\u06c2\b\u00a2\n\u00a2\f\u00a2\u06c5\t\u00a2\u0001\u00a2\u0003"+ - "\u00a2\u06c8\b\u00a2\u0003\u00a2\u06ca\b\u00a2\u0001\u00a2\u0001\u00a2"+ - "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0003\u00a3\u06d2\b\u00a3"+ - "\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4"+ - "\u0001\u00a4\u0003\u00a4\u06db\b\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ - "\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06e3\b\u00a5\u0001\u00a6"+ - "\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06e8\b\u00a6\u0001\u00a7\u0001\u00a7"+ - "\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9"+ - "\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ - "\u0003\u00ab\u06f8\b\u00ab\u0003\u00ab\u06fa\b\u00ab\u0001\u00ab\u0001"+ - "\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0005\u00ac\u0701\b\u00ac\n"+ - "\u00ac\f\u00ac\u0704\t\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003"+ - "\u00ad\u0709\b\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0003"+ - "\u00ae\u070f\b\u00ae\u0001\u00af\u0001\u00af\u0003\u00af\u0713\b\u00af"+ - "\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0005\u00b0"+ - "\u071a\b\u00b0\n\u00b0\f\u00b0\u071d\t\u00b0\u0001\u00b0\u0001\u00b0\u0001"+ - "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0003\u00b1\u0725\b\u00b1\u0001"+ - "\u00b1\u0003\u00b1\u0728\b\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0003"+ - "\u00b3\u072d\b\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ - "\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001"+ - "\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0003"+ - "\u00b6\u073f\b\u00b6\u0003\u00b6\u0741\b\u00b6\u0001\u00b6\u0003\u00b6"+ - "\u0744\b\u00b6\u0001\u00b6\u0003\u00b6\u0747\b\u00b6\u0003\u00b6\u0749"+ - "\b\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001"+ - "\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001"+ - "\u00b9\u0003\u00b9\u0757\b\u00b9\u0001\u00b9\u0001\u02fa\u0002\u00a6\u00b6"+ - "\u00ba\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ + "T\u0001T\u0001T\u0001T\u0001T\u0005T\u044c\bT\nT\fT\u044f\tT\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0003U\u0465"+ + "\bU\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0003W\u046d\bW\u0001X\u0001"+ + "X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0005Y\u0476\bY\nY\fY\u0479\tY\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0003Y\u047f\bY\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0003Z\u0486\bZ\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ + "[\u0003[\u0490\b[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0003\\\u04a2\b\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0005\\\u04b8\b\\\n\\\f\\\u04bb\t\\"+ + "\u0001]\u0001]\u0001]\u0001^\u0001^\u0003^\u04c2\b^\u0001^\u0001^\u0003"+ + "^\u04c6\b^\u0001_\u0001_\u0003_\u04ca\b_\u0001_\u0003_\u04cd\b_\u0001"+ + "_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0003`\u04d6\b`\u0001`\u0001"+ + "`\u0005`\u04da\b`\n`\f`\u04dd\t`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001"+ + "a\u0001b\u0003b\u04e6\bb\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003"+ + "b\u04ee\bb\u0001b\u0001b\u0001b\u0001b\u0003b\u04f4\bb\u0001c\u0001c\u0001"+ + "c\u0001c\u0001c\u0001c\u0001c\u0003c\u04fd\bc\u0001d\u0001d\u0001d\u0001"+ + "d\u0001d\u0001d\u0001d\u0001d\u0001d\u0003d\u0508\bd\u0001e\u0001e\u0001"+ + "e\u0001f\u0001f\u0001f\u0001f\u0005f\u0511\bf\nf\ff\u0514\tf\u0001f\u0003"+ + "f\u0517\bf\u0003f\u0519\bf\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001"+ + "g\u0001g\u0001g\u0003g\u0524\bg\u0001h\u0001h\u0001h\u0001h\u0001h\u0001"+ + "i\u0001i\u0003i\u052d\bi\u0001i\u0001i\u0003i\u0531\bi\u0001i\u0003i\u0534"+ + "\bi\u0001i\u0001i\u0001i\u0001i\u0001i\u0003i\u053b\bi\u0001i\u0001i\u0001"+ + "j\u0001j\u0001k\u0001k\u0001l\u0001l\u0001m\u0003m\u0546\bm\u0001m\u0001"+ + "m\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0003n\u0550\bn\u0001n\u0001"+ + "n\u0001n\u0001n\u0003n\u0556\bn\u0003n\u0558\bn\u0001o\u0001o\u0001o\u0001"+ + "p\u0001p\u0001q\u0001q\u0001q\u0003q\u0562\bq\u0001r\u0001r\u0001r\u0001"+ + "r\u0001r\u0001r\u0005r\u056a\br\nr\fr\u056d\tr\u0001r\u0003r\u0570\br"+ + "\u0001s\u0001s\u0003s\u0574\bs\u0001s\u0001s\u0003s\u0578\bs\u0001t\u0001"+ + "t\u0001t\u0005t\u057d\bt\nt\ft\u0580\tt\u0001u\u0001u\u0001u\u0005u\u0585"+ + "\bu\nu\fu\u0588\tu\u0001v\u0001v\u0001v\u0001v\u0001v\u0001v\u0005v\u0590"+ + "\bv\nv\fv\u0593\tv\u0001v\u0003v\u0596\bv\u0001w\u0001w\u0003w\u059a\b"+ + "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0005x\u05a4"+ + "\bx\nx\fx\u05a7\tx\u0001x\u0003x\u05aa\bx\u0001y\u0001y\u0003y\u05ae\b"+ + "y\u0001y\u0001y\u0001z\u0003z\u05b3\bz\u0001z\u0003z\u05b6\bz\u0001z\u0003"+ + "z\u05b9\bz\u0001z\u0001z\u0001z\u0004z\u05be\bz\u000bz\fz\u05bf\u0001"+ + "{\u0001{\u0001{\u0001{\u0001{\u0003{\u05c7\b{\u0001|\u0001|\u0001}\u0001"+ + "}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f"+ + "\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0081"+ + "\u0003\u0081\u05db\b\u0081\u0001\u0082\u0001\u0082\u0003\u0082\u05df\b"+ + "\u0082\u0001\u0083\u0001\u0083\u0003\u0083\u05e3\b\u0083\u0001\u0084\u0001"+ + "\u0084\u0003\u0084\u05e7\b\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ + "\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001"+ + "\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0003\u0087\u05f7"+ + "\b\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0003\u0087\u05fd"+ + "\b\u0087\u0003\u0087\u05ff\b\u0087\u0001\u0088\u0001\u0088\u0003\u0088"+ + "\u0603\b\u0088\u0001\u0089\u0001\u0089\u0003\u0089\u0607\b\u0089\u0001"+ + "\u0089\u0003\u0089\u060a\b\u0089\u0001\u0089\u0001\u0089\u0003\u0089\u060e"+ + "\b\u0089\u0003\u0089\u0610\b\u0089\u0001\u0089\u0001\u0089\u0005\u0089"+ + "\u0614\b\u0089\n\u0089\f\u0089\u0617\t\u0089\u0001\u0089\u0001\u0089\u0001"+ + "\u008a\u0001\u008a\u0001\u008a\u0003\u008a\u061e\b\u008a\u0001\u008b\u0001"+ + "\u008b\u0001\u008b\u0003\u008b\u0623\b\u008b\u0001\u008c\u0001\u008c\u0001"+ + "\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001"+ + "\u008c\u0003\u008c\u062e\b\u008c\u0001\u008c\u0001\u008c\u0005\u008c\u0632"+ + "\b\u008c\n\u008c\f\u008c\u0635\t\u008c\u0001\u008c\u0001\u008c\u0001\u008d"+ + "\u0001\u008d\u0003\u008d\u063b\b\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ + "\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e"+ + "\u0003\u008e\u0646\b\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0003\u008f"+ + "\u064b\b\u008f\u0001\u0090\u0001\u0090\u0003\u0090\u064f\b\u0090\u0001"+ + "\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u0654\b\u0090\u0005\u0090\u0656"+ + "\b\u0090\n\u0090\f\u0090\u0659\t\u0090\u0001\u0091\u0001\u0091\u0001\u0091"+ + "\u0005\u0091\u065e\b\u0091\n\u0091\f\u0091\u0661\t\u0091\u0001\u0091\u0001"+ + "\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u0668\b\u0092\u0001"+ + "\u0093\u0001\u0093\u0001\u0093\u0003\u0093\u066d\b\u0093\u0001\u0093\u0003"+ + "\u0093\u0670\b\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001"+ + "\u0094\u0001\u0094\u0003\u0094\u0678\b\u0094\u0001\u0094\u0001\u0094\u0001"+ + "\u0095\u0001\u0095\u0003\u0095\u067e\b\u0095\u0001\u0095\u0001\u0095\u0003"+ + "\u0095\u0682\b\u0095\u0003\u0095\u0684\b\u0095\u0001\u0095\u0001\u0095"+ + "\u0001\u0096\u0003\u0096\u0689\b\u0096\u0001\u0096\u0001\u0096\u0003\u0096"+ + "\u068d\b\u0096\u0001\u0096\u0001\u0096\u0003\u0096\u0691\b\u0096\u0001"+ + "\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0003\u0098\u0698"+ + "\b\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ + "\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001"+ + "\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001"+ + "\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001"+ + "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0003\u009f\u06b5\b\u009f\u0001"+ + "\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001"+ + "\u00a1\u0001\u00a1\u0001\u00a1\u0003\u00a1\u06c0\b\u00a1\u0001\u00a2\u0001"+ + "\u00a2\u0003\u00a2\u06c4\b\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ + "\u00a3\u0005\u00a3\u06ca\b\u00a3\n\u00a3\f\u00a3\u06cd\t\u00a3\u0001\u00a3"+ + "\u0003\u00a3\u06d0\b\u00a3\u0003\u00a3\u06d2\b\u00a3\u0001\u00a3\u0001"+ + "\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0003\u00a4\u06da"+ + "\b\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001"+ + "\u00a5\u0001\u00a5\u0003\u00a5\u06e3\b\u00a5\u0001\u00a6\u0001\u00a6\u0001"+ + "\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06eb\b\u00a6\u0001"+ + "\u00a7\u0001\u00a7\u0001\u00a7\u0003\u00a7\u06f0\b\u00a7\u0001\u00a8\u0001"+ + "\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001"+ + "\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001"+ + "\u00ac\u0003\u00ac\u0700\b\u00ac\u0003\u00ac\u0702\b\u00ac\u0001\u00ac"+ + "\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0005\u00ad\u0709\b\u00ad"+ + "\n\u00ad\f\u00ad\u070c\t\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0003"+ + "\u00ae\u0711\b\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0003"+ + "\u00af\u0717\b\u00af\u0001\u00b0\u0001\u00b0\u0003\u00b0\u071b\b\u00b0"+ + "\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0005\u00b1"+ + "\u0722\b\u00b1\n\u00b1\f\u00b1\u0725\t\u00b1\u0001\u00b1\u0001\u00b1\u0001"+ + "\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0003\u00b2\u072d\b\u00b2\u0001"+ + "\u00b2\u0003\u00b2\u0730\b\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0003"+ + "\u00b4\u0735\b\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001"+ + "\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001"+ + "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0003"+ + "\u00b7\u0747\b\u00b7\u0003\u00b7\u0749\b\u00b7\u0001\u00b7\u0003\u00b7"+ + "\u074c\b\u00b7\u0001\u00b7\u0003\u00b7\u074f\b\u00b7\u0003\u00b7\u0751"+ + "\b\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001"+ + "\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001"+ + "\u00ba\u0003\u00ba\u075f\b\u00ba\u0001\u00ba\u0001\u0302\u0002\u00a8\u00b8"+ + "\u00bb\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+ "\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0"+ @@ -13641,963 +13706,967 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140"+ "\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158"+ "\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170"+ - "\u0172\u0000\u0013\u0002\u0000ggrr\u0001\u0000\u0017\u0018\u0001\u0000"+ - "\u0005\b\u0001\u0000AB\u0001\u0000(*\u0002\u0000(*,,\u0001\u0000\u0085"+ - "\u008b\u0001\u0000\u0014\u0015\u0002\u0000\u0080\u0084\u0089\u008a\u0004"+ - "\u0000##ss\u007f\u007f\u0086\u0088\u0001\u0000\u001f!\u0001\u0000\u001c"+ - "\u001e\u0002\u0000HIy~\u0004\u0000--0033__\u0002\u0000\u007f\u0084\u0086"+ - "\u008a\u0001\u0000st\u0002\u0000pp\u00a1\u00a1\u0002\u0000\u008c\u008f"+ - "\u0091\u0092\u0001\u0000\u0098\u0099\u07c4\u0000\u0174\u0001\u0000\u0000"+ - "\u0000\u0002\u0177\u0001\u0000\u0000\u0000\u0004\u017a\u0001\u0000\u0000"+ - "\u0000\u0006\u017d\u0001\u0000\u0000\u0000\b\u0185\u0001\u0000\u0000\u0000"+ - "\n\u018e\u0001\u0000\u0000\u0000\f\u01ae\u0001\u0000\u0000\u0000\u000e"+ - "\u01bb\u0001\u0000\u0000\u0000\u0010\u01be\u0001\u0000\u0000\u0000\u0012"+ - "\u01c6\u0001\u0000\u0000\u0000\u0014\u01d3\u0001\u0000\u0000\u0000\u0016"+ - "\u01e9\u0001\u0000\u0000\u0000\u0018\u01f2\u0001\u0000\u0000\u0000\u001a"+ - "\u01f4\u0001\u0000\u0000\u0000\u001c\u01f6\u0001\u0000\u0000\u0000\u001e"+ - "\u01f9\u0001\u0000\u0000\u0000 \u020d\u0001\u0000\u0000\u0000\"\u020f"+ - "\u0001\u0000\u0000\u0000$\u0211\u0001\u0000\u0000\u0000&\u0216\u0001\u0000"+ - "\u0000\u0000(\u0221\u0001\u0000\u0000\u0000*\u022e\u0001\u0000\u0000\u0000"+ - ",\u0231\u0001\u0000\u0000\u0000.\u023c\u0001\u0000\u0000\u00000\u023e"+ - "\u0001\u0000\u0000\u00002\u0243\u0001\u0000\u0000\u00004\u0248\u0001\u0000"+ - "\u0000\u00006\u024d\u0001\u0000\u0000\u00008\u0252\u0001\u0000\u0000\u0000"+ - ":\u025f\u0001\u0000\u0000\u0000<\u0261\u0001\u0000\u0000\u0000>\u0263"+ - "\u0001\u0000\u0000\u0000@\u0268\u0001\u0000\u0000\u0000B\u026d\u0001\u0000"+ - "\u0000\u0000D\u0272\u0001\u0000\u0000\u0000F\u027b\u0001\u0000\u0000\u0000"+ - "H\u0282\u0001\u0000\u0000\u0000J\u028f\u0001\u0000\u0000\u0000L\u0293"+ - "\u0001\u0000\u0000\u0000N\u029e\u0001\u0000\u0000\u0000P\u02a6\u0001\u0000"+ - "\u0000\u0000R\u02a8\u0001\u0000\u0000\u0000T\u02bd\u0001\u0000\u0000\u0000"+ - "V\u02bf\u0001\u0000\u0000\u0000X\u02cb\u0001\u0000\u0000\u0000Z\u02d8"+ - "\u0001\u0000\u0000\u0000\\\u02dc\u0001\u0000\u0000\u0000^\u02ec\u0001"+ - "\u0000\u0000\u0000`\u02fa\u0001\u0000\u0000\u0000b\u0309\u0001\u0000\u0000"+ - "\u0000d\u030c\u0001\u0000\u0000\u0000f\u0314\u0001\u0000\u0000\u0000h"+ - "\u0316\u0001\u0000\u0000\u0000j\u0321\u0001\u0000\u0000\u0000l\u0329\u0001"+ - "\u0000\u0000\u0000n\u0338\u0001\u0000\u0000\u0000p\u033a\u0001\u0000\u0000"+ - "\u0000r\u0342\u0001\u0000\u0000\u0000t\u0350\u0001\u0000\u0000\u0000v"+ - "\u035c\u0001\u0000\u0000\u0000x\u0366\u0001\u0000\u0000\u0000z\u036a\u0001"+ - "\u0000\u0000\u0000|\u0370\u0001\u0000\u0000\u0000~\u0388\u0001\u0000\u0000"+ - "\u0000\u0080\u0390\u0001\u0000\u0000\u0000\u0082\u039f\u0001\u0000\u0000"+ - "\u0000\u0084\u03a1\u0001\u0000\u0000\u0000\u0086\u03a8\u0001\u0000\u0000"+ - "\u0000\u0088\u03b1\u0001\u0000\u0000\u0000\u008a\u03b6\u0001\u0000\u0000"+ - "\u0000\u008c\u03bb\u0001\u0000\u0000\u0000\u008e\u03c1\u0001\u0000\u0000"+ - "\u0000\u0090\u03c8\u0001\u0000\u0000\u0000\u0092\u03cd\u0001\u0000\u0000"+ - "\u0000\u0094\u03d3\u0001\u0000\u0000\u0000\u0096\u03d8\u0001\u0000\u0000"+ - "\u0000\u0098\u03df\u0001\u0000\u0000\u0000\u009a\u03e9\u0001\u0000\u0000"+ - "\u0000\u009c\u03ed\u0001\u0000\u0000\u0000\u009e\u03f9\u0001\u0000\u0000"+ - "\u0000\u00a0\u03fc\u0001\u0000\u0000\u0000\u00a2\u0400\u0001\u0000\u0000"+ - "\u0000\u00a4\u0407\u0001\u0000\u0000\u0000\u00a6\u0420\u0001\u0000\u0000"+ - "\u0000\u00a8\u045c\u0001\u0000\u0000\u0000\u00aa\u045e\u0001\u0000\u0000"+ - "\u0000\u00ac\u0461\u0001\u0000\u0000\u0000\u00ae\u0466\u0001\u0000\u0000"+ - "\u0000\u00b0\u046f\u0001\u0000\u0000\u0000\u00b2\u047d\u0001\u0000\u0000"+ - "\u0000\u00b4\u0487\u0001\u0000\u0000\u0000\u00b6\u0499\u0001\u0000\u0000"+ - "\u0000\u00b8\u04b4\u0001\u0000\u0000\u0000\u00ba\u04b7\u0001\u0000\u0000"+ - "\u0000\u00bc\u04bf\u0001\u0000\u0000\u0000\u00be\u04c8\u0001\u0000\u0000"+ - "\u0000\u00c0\u04d8\u0001\u0000\u0000\u0000\u00c2\u04eb\u0001\u0000\u0000"+ - "\u0000\u00c4\u04f4\u0001\u0000\u0000\u0000\u00c6\u04ff\u0001\u0000\u0000"+ - "\u0000\u00c8\u0501\u0001\u0000\u0000\u0000\u00ca\u0504\u0001\u0000\u0000"+ - "\u0000\u00cc\u051b\u0001\u0000\u0000\u0000\u00ce\u051d\u0001\u0000\u0000"+ - "\u0000\u00d0\u0522\u0001\u0000\u0000\u0000\u00d2\u0536\u0001\u0000\u0000"+ - "\u0000\u00d4\u0538\u0001\u0000\u0000\u0000\u00d6\u053a\u0001\u0000\u0000"+ - "\u0000\u00d8\u053d\u0001\u0000\u0000\u0000\u00da\u0547\u0001\u0000\u0000"+ - "\u0000\u00dc\u0551\u0001\u0000\u0000\u0000\u00de\u0554\u0001\u0000\u0000"+ - "\u0000\u00e0\u0559\u0001\u0000\u0000\u0000\u00e2\u055b\u0001\u0000\u0000"+ - "\u0000\u00e4\u0569\u0001\u0000\u0000\u0000\u00e6\u0571\u0001\u0000\u0000"+ - "\u0000\u00e8\u0579\u0001\u0000\u0000\u0000\u00ea\u0581\u0001\u0000\u0000"+ - "\u0000\u00ec\u058f\u0001\u0000\u0000\u0000\u00ee\u0595\u0001\u0000\u0000"+ - "\u0000\u00f0\u05a3\u0001\u0000\u0000\u0000\u00f2\u05b5\u0001\u0000\u0000"+ - "\u0000\u00f4\u05be\u0001\u0000\u0000\u0000\u00f6\u05c0\u0001\u0000\u0000"+ - "\u0000\u00f8\u05c2\u0001\u0000\u0000\u0000\u00fa\u05c6\u0001\u0000\u0000"+ - "\u0000\u00fc\u05c9\u0001\u0000\u0000\u0000\u00fe\u05cd\u0001\u0000\u0000"+ - "\u0000\u0100\u05cf\u0001\u0000\u0000\u0000\u0102\u05d4\u0001\u0000\u0000"+ - "\u0000\u0104\u05d8\u0001\u0000\u0000\u0000\u0106\u05dc\u0001\u0000\u0000"+ - "\u0000\u0108\u05e0\u0001\u0000\u0000\u0000\u010a\u05e3\u0001\u0000\u0000"+ - "\u0000\u010c\u05e5\u0001\u0000\u0000\u0000\u010e\u05fa\u0001\u0000\u0000"+ - "\u0000\u0110\u05fc\u0001\u0000\u0000\u0000\u0112\u0612\u0001\u0000\u0000"+ - "\u0000\u0114\u061a\u0001\u0000\u0000\u0000\u0116\u061c\u0001\u0000\u0000"+ - "\u0000\u0118\u0632\u0001\u0000\u0000\u0000\u011a\u063a\u0001\u0000\u0000"+ - "\u0000\u011c\u0642\u0001\u0000\u0000\u0000\u011e\u0646\u0001\u0000\u0000"+ - "\u0000\u0120\u0652\u0001\u0000\u0000\u0000\u0122\u065c\u0001\u0000\u0000"+ - "\u0000\u0124\u0667\u0001\u0000\u0000\u0000\u0126\u066f\u0001\u0000\u0000"+ - "\u0000\u0128\u0673\u0001\u0000\u0000\u0000\u012a\u0680\u0001\u0000\u0000"+ - "\u0000\u012c\u068a\u0001\u0000\u0000\u0000\u012e\u068f\u0001\u0000\u0000"+ - "\u0000\u0130\u0691\u0001\u0000\u0000\u0000\u0132\u0696\u0001\u0000\u0000"+ - "\u0000\u0134\u0698\u0001\u0000\u0000\u0000\u0136\u069a\u0001\u0000\u0000"+ - "\u0000\u0138\u069d\u0001\u0000\u0000\u0000\u013a\u06a1\u0001\u0000\u0000"+ - "\u0000\u013c\u06ac\u0001\u0000\u0000\u0000\u013e\u06b0\u0001\u0000\u0000"+ - "\u0000\u0140\u06b7\u0001\u0000\u0000\u0000\u0142\u06bb\u0001\u0000\u0000"+ - "\u0000\u0144\u06bd\u0001\u0000\u0000\u0000\u0146\u06cd\u0001\u0000\u0000"+ - "\u0000\u0148\u06da\u0001\u0000\u0000\u0000\u014a\u06e2\u0001\u0000\u0000"+ - "\u0000\u014c\u06e7\u0001\u0000\u0000\u0000\u014e\u06e9\u0001\u0000\u0000"+ - "\u0000\u0150\u06eb\u0001\u0000\u0000\u0000\u0152\u06ed\u0001\u0000\u0000"+ - "\u0000\u0154\u06f1\u0001\u0000\u0000\u0000\u0156\u06f4\u0001\u0000\u0000"+ - "\u0000\u0158\u06fd\u0001\u0000\u0000\u0000\u015a\u0708\u0001\u0000\u0000"+ - "\u0000\u015c\u070e\u0001\u0000\u0000\u0000\u015e\u0712\u0001\u0000\u0000"+ - "\u0000\u0160\u0714\u0001\u0000\u0000\u0000\u0162\u0724\u0001\u0000\u0000"+ - "\u0000\u0164\u0729\u0001\u0000\u0000\u0000\u0166\u072c\u0001\u0000\u0000"+ - "\u0000\u0168\u0730\u0001\u0000\u0000\u0000\u016a\u0734\u0001\u0000\u0000"+ - "\u0000\u016c\u0739\u0001\u0000\u0000\u0000\u016e\u074c\u0001\u0000\u0000"+ - "\u0000\u0170\u0750\u0001\u0000\u0000\u0000\u0172\u0756\u0001\u0000\u0000"+ - "\u0000\u0174\u0175\u0003\u00a6S\u0000\u0175\u0176\u0005\u0000\u0000\u0001"+ - "\u0176\u0001\u0001\u0000\u0000\u0000\u0177\u0178\u0003\u00a8T\u0000\u0178"+ - "\u0179\u0005\u0000\u0000\u0001\u0179\u0003\u0001\u0000\u0000\u0000\u017a"+ - "\u017b\u0003\u00c4b\u0000\u017b\u017c\u0005\u0000\u0000\u0001\u017c\u0005"+ - "\u0001\u0000\u0000\u0000\u017d\u0182\u0003\b\u0004\u0000\u017e\u017f\u0005"+ - "o\u0000\u0000\u017f\u0181\u0003\b\u0004\u0000\u0180\u017e\u0001\u0000"+ - "\u0000\u0000\u0181\u0184\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000"+ - "\u0000\u0000\u0182\u0183\u0001\u0000\u0000\u0000\u0183\u0007\u0001\u0000"+ - "\u0000\u0000\u0184\u0182\u0001\u0000\u0000\u0000\u0185\u0187\u0005g\u0000"+ - "\u0000\u0186\u0188\u0005<\u0000\u0000\u0187\u0186\u0001\u0000\u0000\u0000"+ - "\u0187\u0188\u0001\u0000\u0000\u0000\u0188\t\u0001\u0000\u0000\u0000\u0189"+ - "\u018a\u0003\u000e\u0007\u0000\u018a\u018b\u0003\u0172\u00b9\u0000\u018b"+ - "\u018d\u0001\u0000\u0000\u0000\u018c\u0189\u0001\u0000\u0000\u0000\u018d"+ - "\u0190\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e"+ - "\u018f\u0001\u0000\u0000\u0000\u018f\u0191\u0001\u0000\u0000\u0000\u0190"+ - "\u018e\u0001\u0000\u0000\u0000\u0191\u0192\u0003\u00dcn\u0000\u0192\u0198"+ - "\u0003\u0172\u00b9\u0000\u0193\u0194\u0003\u0014\n\u0000\u0194\u0195\u0003"+ - "\u0172\u00b9\u0000\u0195\u0197\u0001\u0000\u0000\u0000\u0196\u0193\u0001"+ - "\u0000\u0000\u0000\u0197\u019a\u0001\u0000\u0000\u0000\u0198\u0196\u0001"+ - "\u0000\u0000\u0000\u0198\u0199\u0001\u0000\u0000\u0000\u0199\u01a4\u0001"+ - "\u0000\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000\u019b\u019f\u0003"+ - "\u008aE\u0000\u019c\u019f\u0003\u00e0p\u0000\u019d\u019f\u0003\u0016\u000b"+ - "\u0000\u019e\u019b\u0001\u0000\u0000\u0000\u019e\u019c\u0001\u0000\u0000"+ - "\u0000\u019e\u019d\u0001\u0000\u0000\u0000\u019f\u01a0\u0001\u0000\u0000"+ - "\u0000\u01a0\u01a1\u0003\u0172\u00b9\u0000\u01a1\u01a3\u0001\u0000\u0000"+ - "\u0000\u01a2\u019e\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001\u0000\u0000"+ - "\u0000\u01a4\u01a2\u0001\u0000\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000"+ - "\u0000\u01a5\u01a7\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000"+ - "\u0000\u01a7\u01a8\u0005\u0000\u0000\u0001\u01a8\u000b\u0001\u0000\u0000"+ - "\u0000\u01a9\u01aa\u0003\u000e\u0007\u0000\u01aa\u01ab\u0003\u0172\u00b9"+ - "\u0000\u01ab\u01ad\u0001\u0000\u0000\u0000\u01ac\u01a9\u0001\u0000\u0000"+ - "\u0000\u01ad\u01b0\u0001\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000"+ - "\u0000\u01ae\u01af\u0001\u0000\u0000\u0000\u01af\u01b1\u0001\u0000\u0000"+ - "\u0000\u01b0\u01ae\u0001\u0000\u0000\u0000\u01b1\u01b2\u0003\u00dcn\u0000"+ - "\u01b2\u01b8\u0003\u0172\u00b9\u0000\u01b3\u01b4\u0003\u0014\n\u0000\u01b4"+ - "\u01b5\u0003\u0172\u00b9\u0000\u01b5\u01b7\u0001\u0000\u0000\u0000\u01b6"+ - "\u01b3\u0001\u0000\u0000\u0000\u01b7\u01ba\u0001\u0000\u0000\u0000\u01b8"+ - "\u01b6\u0001\u0000\u0000\u0000\u01b8\u01b9\u0001\u0000\u0000\u0000\u01b9"+ - "\r\u0001\u0000\u0000\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01bb\u01bc"+ - "\u0005E\u0000\u0000\u01bc\u01bd\u0003\u00a6S\u0000\u01bd\u000f\u0001\u0000"+ - "\u0000\u0000\u01be\u01bf\u0005F\u0000\u0000\u01bf\u01c0\u0003\u00a6S\u0000"+ - "\u01c0\u0011\u0001\u0000\u0000\u0000\u01c1\u01c2\u0003\u0010\b\u0000\u01c2"+ - "\u01c3\u0003\u0172\u00b9\u0000\u01c3\u01c5\u0001\u0000\u0000\u0000\u01c4"+ - "\u01c1\u0001\u0000\u0000\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6"+ - "\u01c4\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7"+ - "\u01ca\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9"+ - "\u01cb\u0007\u0000\u0000\u0000\u01ca\u01c9\u0001\u0000\u0000\u0000\u01ca"+ - "\u01cb\u0001\u0000\u0000\u0000\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc"+ - "\u01cd\u0003\u00deo\u0000\u01cd\u0013\u0001\u0000\u0000\u0000\u01ce\u01cf"+ - "\u0003\u0010\b\u0000\u01cf\u01d0\u0003\u0172\u00b9\u0000\u01d0\u01d2\u0001"+ - "\u0000\u0000\u0000\u01d1\u01ce\u0001\u0000\u0000\u0000\u01d2\u01d5\u0001"+ - "\u0000\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001"+ - "\u0000\u0000\u0000\u01d4\u01e3\u0001\u0000\u0000\u0000\u01d5\u01d3\u0001"+ - "\u0000\u0000\u0000\u01d6\u01d7\u0005c\u0000\u0000\u01d7\u01e4\u0003\u0012"+ - "\t\u0000\u01d8\u01d9\u0005c\u0000\u0000\u01d9\u01df\u0005h\u0000\u0000"+ - "\u01da\u01db\u0003\u0012\t\u0000\u01db\u01dc\u0003\u0172\u00b9\u0000\u01dc"+ - "\u01de\u0001\u0000\u0000\u0000\u01dd\u01da\u0001\u0000\u0000\u0000\u01de"+ - "\u01e1\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df"+ - "\u01e0\u0001\u0000\u0000\u0000\u01e0\u01e2\u0001\u0000\u0000\u0000\u01e1"+ - "\u01df\u0001\u0000\u0000\u0000\u01e2\u01e4\u0005i\u0000\u0000\u01e3\u01d6"+ - "\u0001\u0000\u0000\u0000\u01e3\u01d8\u0001\u0000\u0000\u0000\u01e4\u0015"+ - "\u0001\u0000\u0000\u0000\u01e5\u01ea\u0003|>\u0000\u01e6\u01ea\u0003\u0092"+ - "I\u0000\u01e7\u01ea\u0003\u0096K\u0000\u01e8\u01ea\u0003\u0090H\u0000"+ - "\u01e9\u01e5\u0001\u0000\u0000\u0000\u01e9\u01e6\u0001\u0000\u0000\u0000"+ - "\u01e9\u01e7\u0001\u0000\u0000\u0000\u01e9\u01e8\u0001\u0000\u0000\u0000"+ - "\u01ea\u0017\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005\u001b\u0000\u0000"+ - "\u01ec\u01f3\u0003\u00a8T\u0000\u01ed\u01ee\u0007\u0001\u0000\u0000\u01ee"+ - "\u01f3\u0003.\u0017\u0000\u01ef\u01f0\u0007\u0002\u0000\u0000\u01f0\u01f3"+ - "\u0003\u00a6S\u0000\u01f1\u01f3\u0003h4\u0000\u01f2\u01eb\u0001\u0000"+ - "\u0000\u0000\u01f2\u01ed\u0001\u0000\u0000\u0000\u01f2\u01ef\u0001\u0000"+ - "\u0000\u0000\u01f2\u01f1\u0001\u0000\u0000\u0000\u01f3\u0019\u0001\u0000"+ - "\u0000\u0000\u01f4\u01f5\u0003\u001c\u000e\u0000\u01f5\u001b\u0001\u0000"+ - "\u0000\u0000\u01f6\u01f7\u0003`0\u0000\u01f7\u01f8\u0003\u001e\u000f\u0000"+ - "\u01f8\u001d\u0001\u0000\u0000\u0000\u01f9\u01fa\u0005D\u0000\u0000\u01fa"+ - "\u01fc\u0005h\u0000\u0000\u01fb\u01fd\u0003\u00f2y\u0000\u01fc\u01fb\u0001"+ - "\u0000\u0000\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd\u01fe\u0001"+ - "\u0000\u0000\u0000\u01fe\u01ff\u0005i\u0000\u0000\u01ff\u001f\u0001\u0000"+ - "\u0000\u0000\u0200\u020e\u0003F#\u0000\u0201\u020e\u0003D\"\u0000\u0202"+ - "\u020e\u0003B!\u0000\u0203\u020e\u0003$\u0012\u0000\u0204\u020e\u0003"+ - "@ \u0000\u0205\u020e\u00038\u001c\u0000\u0206\u020e\u0003>\u001f\u0000"+ - "\u0207\u020e\u00036\u001b\u0000\u0208\u020e\u00032\u0019\u0000\u0209\u020e"+ - "\u00030\u0018\u0000\u020a\u020e\u00034\u001a\u0000\u020b\u020e\u0003\""+ - "\u0011\u0000\u020c\u020e\u0003H$\u0000\u020d\u0200\u0001\u0000\u0000\u0000"+ - "\u020d\u0201\u0001\u0000\u0000\u0000\u020d\u0202\u0001\u0000\u0000\u0000"+ - "\u020d\u0203\u0001\u0000\u0000\u0000\u020d\u0204\u0001\u0000\u0000\u0000"+ - "\u020d\u0205\u0001\u0000\u0000\u0000\u020d\u0206\u0001\u0000\u0000\u0000"+ - "\u020d\u0207\u0001\u0000\u0000\u0000\u020d\u0208\u0001\u0000\u0000\u0000"+ - "\u020d\u0209\u0001\u0000\u0000\u0000\u020d\u020a\u0001\u0000\u0000\u0000"+ - "\u020d\u020b\u0001\u0000\u0000\u0000\u020d\u020c\u0001\u0000\u0000\u0000"+ - "\u020e!\u0001\u0000\u0000\u0000\u020f\u0210\u0007\u0003\u0000\u0000\u0210"+ - "#\u0001\u0000\u0000\u0000\u0211\u0212\u0005`\u0000\u0000\u0212\u0213\u0005"+ - "l\u0000\u0000\u0213\u0214\u0003\u00c4b\u0000\u0214\u0215\u0005m\u0000"+ - "\u0000\u0215%\u0001\u0000\u0000\u0000\u0216\u021b\u0003(\u0014\u0000\u0217"+ - "\u0218\u0005o\u0000\u0000\u0218\u021a\u0003(\u0014\u0000\u0219\u0217\u0001"+ - "\u0000\u0000\u0000\u021a\u021d\u0001\u0000\u0000\u0000\u021b\u0219\u0001"+ - "\u0000\u0000\u0000\u021b\u021c\u0001\u0000\u0000\u0000\u021c\u021f\u0001"+ - "\u0000\u0000\u0000\u021d\u021b\u0001\u0000\u0000\u0000\u021e\u0220\u0005"+ - "o\u0000\u0000\u021f\u021e\u0001\u0000\u0000\u0000\u021f\u0220\u0001\u0000"+ - "\u0000\u0000\u0220\'\u0001\u0000\u0000\u0000\u0221\u0226\u0005g\u0000"+ - "\u0000\u0222\u0223\u0005o\u0000\u0000\u0223\u0225\u0005g\u0000\u0000\u0224"+ - "\u0222\u0001\u0000\u0000\u0000\u0225\u0228\u0001\u0000\u0000\u0000\u0226"+ - "\u0224\u0001\u0000\u0000\u0000\u0226\u0227\u0001\u0000\u0000\u0000\u0227"+ - "\u0229\u0001\u0000\u0000\u0000\u0228\u0226\u0001\u0000\u0000\u0000\u0229"+ - "\u022a\u0003\u0134\u009a\u0000\u022a)\u0001\u0000\u0000\u0000\u022b\u022d"+ - "\u0003,\u0016\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d\u0230\u0001"+ - "\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e\u022f\u0001"+ - "\u0000\u0000\u0000\u022f+\u0001\u0000\u0000\u0000\u0230\u022e\u0001\u0000"+ - "\u0000\u0000\u0231\u0232\u0005j\u0000\u0000\u0232\u0237\u0003\u00a6S\u0000"+ - "\u0233\u0234\u0005o\u0000\u0000\u0234\u0236\u0003\u00a6S\u0000\u0235\u0233"+ - "\u0001\u0000\u0000\u0000\u0236\u0239\u0001\u0000\u0000\u0000\u0237\u0235"+ - "\u0001\u0000\u0000\u0000\u0237\u0238\u0001\u0000\u0000\u0000\u0238\u023a"+ - "\u0001\u0000\u0000\u0000\u0239\u0237\u0001\u0000\u0000\u0000\u023a\u023b"+ - "\u0005k\u0000\u0000\u023b-\u0001\u0000\u0000\u0000\u023c\u023d\u0003\u00b6"+ - "[\u0000\u023d/\u0001\u0000\u0000\u0000\u023e\u023f\u00051\u0000\u0000"+ - "\u023f\u0240\u0005h\u0000\u0000\u0240\u0241\u0003\u00a6S\u0000\u0241\u0242"+ - "\u0005i\u0000\u0000\u02421\u0001\u0000\u0000\u0000\u0243\u0244\u00057"+ - "\u0000\u0000\u0244\u0245\u0005l\u0000\u0000\u0245\u0246\u0003\u00c4b\u0000"+ - "\u0246\u0247\u0005m\u0000\u0000\u02473\u0001\u0000\u0000\u0000\u0248\u0249"+ - "\u00052\u0000\u0000\u0249\u024a\u0005h\u0000\u0000\u024a\u024b\u0003\u00a6"+ - "S\u0000\u024b\u024c\u0005i\u0000\u0000\u024c5\u0001\u0000\u0000\u0000"+ - "\u024d\u024e\u0007\u0004\u0000\u0000\u024e\u024f\u0005h\u0000\u0000\u024f"+ - "\u0250\u0003\u00a6S\u0000\u0250\u0251\u0005i\u0000\u0000\u02517\u0001"+ - "\u0000\u0000\u0000\u0252\u0257\u0005\u0011\u0000\u0000\u0253\u0254\u0005"+ - "l\u0000\u0000\u0254\u0255\u0003:\u001d\u0000\u0255\u0256\u0005m\u0000"+ - "\u0000\u0256\u0258\u0001\u0000\u0000\u0000\u0257\u0253\u0001\u0000\u0000"+ - "\u0000\u0257\u0258\u0001\u0000\u0000\u0000\u0258\u0259\u0001\u0000\u0000"+ - "\u0000\u0259\u025a\u0005h\u0000\u0000\u025a\u025b\u0003\u00a6S\u0000\u025b"+ - "\u025c\u0005i\u0000\u0000\u025c9\u0001\u0000\u0000\u0000\u025d\u0260\u0003"+ - "<\u001e\u0000\u025e\u0260\u0005\u0013\u0000\u0000\u025f\u025d\u0001\u0000"+ - "\u0000\u0000\u025f\u025e\u0001\u0000\u0000\u0000\u0260;\u0001\u0000\u0000"+ - "\u0000\u0261\u0262\u0005g\u0000\u0000\u0262=\u0001\u0000\u0000\u0000\u0263"+ - "\u0264\u0005\u0012\u0000\u0000\u0264\u0265\u0005h\u0000\u0000\u0265\u0266"+ - "\u0003\u00a6S\u0000\u0266\u0267\u0005i\u0000\u0000\u0267?\u0001\u0000"+ - "\u0000\u0000\u0268\u0269\u0005:\u0000\u0000\u0269\u026a\u0005h\u0000\u0000"+ - "\u026a\u026b\u0003\u00a6S\u0000\u026b\u026c\u0005i\u0000\u0000\u026cA"+ - "\u0001\u0000\u0000\u0000\u026d\u026e\u00059\u0000\u0000\u026e\u026f\u0005"+ - "h\u0000\u0000\u026f\u0270\u0003\u00a6S\u0000\u0270\u0271\u0005i\u0000"+ - "\u0000\u0271C\u0001\u0000\u0000\u0000\u0272\u0273\u0005\u0016\u0000\u0000"+ - "\u0273\u0274\u0005h\u0000\u0000\u0274\u0277\u0003\u00a6S\u0000\u0275\u0276"+ - "\u0005o\u0000\u0000\u0276\u0278\u0003\u00a6S\u0000\u0277\u0275\u0001\u0000"+ - "\u0000\u0000\u0277\u0278\u0001\u0000\u0000\u0000\u0278\u0279\u0001\u0000"+ - "\u0000\u0000\u0279\u027a\u0005i\u0000\u0000\u027aE\u0001\u0000\u0000\u0000"+ - "\u027b\u027c\u0007\u0004\u0000\u0000\u027c\u027d\u0005l\u0000\u0000\u027d"+ - "\u027e\u0003\u00a6S\u0000\u027e\u027f\u0005=\u0000\u0000\u027f\u0280\u0003"+ - "\u00a6S\u0000\u0280\u0281\u0005m\u0000\u0000\u0281G\u0001\u0000\u0000"+ - "\u0000\u0282\u0283\u00056\u0000\u0000\u0283\u0284\u0003\u00a6S\u0000\u0284"+ - "\u028a\u0005j\u0000\u0000\u0285\u0286\u0003J%\u0000\u0286\u0287\u0003"+ - "\u0172\u00b9\u0000\u0287\u0289\u0001\u0000\u0000\u0000\u0288\u0285\u0001"+ - "\u0000\u0000\u0000\u0289\u028c\u0001\u0000\u0000\u0000\u028a\u0288\u0001"+ - "\u0000\u0000\u0000\u028a\u028b\u0001\u0000\u0000\u0000\u028b\u028d\u0001"+ - "\u0000\u0000\u0000\u028c\u028a\u0001\u0000\u0000\u0000\u028d\u028e\u0005"+ - "k\u0000\u0000\u028eI\u0001\u0000\u0000\u0000\u028f\u0290\u0003l6\u0000"+ - "\u0290\u0291\u0005q\u0000\u0000\u0291\u0292\u0003\u00a6S\u0000\u0292K"+ - "\u0001\u0000\u0000\u0000\u0293\u0294\u0005l\u0000\u0000\u0294\u0299\u0003"+ - "N\'\u0000\u0295\u0296\u0005o\u0000\u0000\u0296\u0298\u0003N\'\u0000\u0297"+ - "\u0295\u0001\u0000\u0000\u0000\u0298\u029b\u0001\u0000\u0000\u0000\u0299"+ - "\u0297\u0001\u0000\u0000\u0000\u0299\u029a\u0001\u0000\u0000\u0000\u029a"+ - "\u029c\u0001\u0000\u0000\u0000\u029b\u0299\u0001\u0000\u0000\u0000\u029c"+ - "\u029d\u0005m\u0000\u0000\u029dM\u0001\u0000\u0000\u0000\u029e\u029f\u0003"+ - "\u00a6S\u0000\u029f\u02a0\u0005n\u0000\u0000\u02a0\u02a1\u0003\u00a6S"+ - "\u0000\u02a1O\u0001\u0000\u0000\u0000\u02a2\u02a7\u0003^/\u0000\u02a3"+ - "\u02a7\u0003\\.\u0000\u02a4\u02a7\u0003R)\u0000\u02a5\u02a7\u0003V+\u0000"+ - "\u02a6\u02a2\u0001\u0000\u0000\u0000\u02a6\u02a3\u0001\u0000\u0000\u0000"+ - "\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6\u02a5\u0001\u0000\u0000\u0000"+ - "\u02a7Q\u0001\u0000\u0000\u0000\u02a8\u02a9\u00053\u0000\u0000\u02a9\u02af"+ - "\u0005j\u0000\u0000\u02aa\u02ab\u0003T*\u0000\u02ab\u02ac\u0003\u0172"+ - "\u00b9\u0000\u02ac\u02ae\u0001\u0000\u0000\u0000\u02ad\u02aa\u0001\u0000"+ - "\u0000\u0000\u02ae\u02b1\u0001\u0000\u0000\u0000\u02af\u02ad\u0001\u0000"+ - "\u0000\u0000\u02af\u02b0\u0001\u0000\u0000\u0000\u02b0\u02b2\u0001\u0000"+ - "\u0000\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2\u02b3\u0005k\u0000"+ - "\u0000\u02b3S\u0001\u0000\u0000\u0000\u02b4\u02b5\u0005O\u0000\u0000\u02b5"+ - "\u02b6\u0005g\u0000\u0000\u02b6\u02be\u0003\u0140\u00a0\u0000\u02b7\u02b8"+ - "\u00054\u0000\u0000\u02b8\u02b9\u0005j\u0000\u0000\u02b9\u02ba\u0003\u00a6"+ - "S\u0000\u02ba\u02bb\u0003\u0172\u00b9\u0000\u02bb\u02bc\u0005k\u0000\u0000"+ - "\u02bc\u02be\u0001\u0000\u0000\u0000\u02bd\u02b4\u0001\u0000\u0000\u0000"+ - "\u02bd\u02b7\u0001\u0000\u0000\u0000\u02beU\u0001\u0000\u0000\u0000\u02bf"+ - "\u02c0\u00055\u0000\u0000\u02c0\u02c6\u0005j\u0000\u0000\u02c1\u02c2\u0003"+ - "X,\u0000\u02c2\u02c3\u0003\u0172\u00b9\u0000\u02c3\u02c5\u0001\u0000\u0000"+ - "\u0000\u02c4\u02c1\u0001\u0000\u0000\u0000\u02c5\u02c8\u0001\u0000\u0000"+ - "\u0000\u02c6\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000"+ - "\u0000\u02c7\u02c9\u0001\u0000\u0000\u0000\u02c8\u02c6\u0001\u0000\u0000"+ - "\u0000\u02c9\u02ca\u0005k\u0000\u0000\u02caW\u0001\u0000\u0000\u0000\u02cb"+ - "\u02cc\u0005g\u0000\u0000\u02cc\u02d2\u0005j\u0000\u0000\u02cd\u02ce\u0003"+ - "Z-\u0000\u02ce\u02cf\u0003\u0172\u00b9\u0000\u02cf\u02d1\u0001\u0000\u0000"+ - "\u0000\u02d0\u02cd\u0001\u0000\u0000\u0000\u02d1\u02d4\u0001\u0000\u0000"+ - "\u0000\u02d2\u02d0\u0001\u0000\u0000\u0000\u02d2\u02d3\u0001\u0000\u0000"+ - "\u0000\u02d3\u02d5\u0001\u0000\u0000\u0000\u02d4\u02d2\u0001\u0000\u0000"+ - "\u0000\u02d5\u02d6\u0005k\u0000\u0000\u02d6Y\u0001\u0000\u0000\u0000\u02d7"+ - "\u02d9\u0003\u00e6s\u0000\u02d8\u02d7\u0001\u0000\u0000\u0000\u02d8\u02d9"+ - "\u0001\u0000\u0000\u0000\u02d9\u02da\u0001\u0000\u0000\u0000\u02da\u02db"+ - "\u0003\u00c4b\u0000\u02db[\u0001\u0000\u0000\u0000\u02dc\u02dd\u0005\u001b"+ - "\u0000\u0000\u02dd\u02de\u0005l\u0000\u0000\u02de\u02df\u0005m\u0000\u0000"+ - "\u02df\u02e0\u0003\u0134\u009a\u0000\u02e0]\u0001\u0000\u0000\u0000\u02e1"+ - "\u02e2\u0007\u0005\u0000\u0000\u02e2\u02e3\u0005l\u0000\u0000\u02e3\u02e4"+ - "\u0003\u00c4b\u0000\u02e4\u02e5\u0005m\u0000\u0000\u02e5\u02ed\u0001\u0000"+ - "\u0000\u0000\u02e6\u02e7\u0005+\u0000\u0000\u02e7\u02e8\u0005l\u0000\u0000"+ - "\u02e8\u02e9\u0003\u00c4b\u0000\u02e9\u02ea\u0005m\u0000\u0000\u02ea\u02eb"+ - "\u0003\u00c4b\u0000\u02eb\u02ed\u0001\u0000\u0000\u0000\u02ec\u02e1\u0001"+ - "\u0000\u0000\u0000\u02ec\u02e6\u0001\u0000\u0000\u0000\u02ed_\u0001\u0000"+ - "\u0000\u0000\u02ee\u02f6\u0003b1\u0000\u02ef\u02f0\u0005K\u0000\u0000"+ - "\u02f0\u02f6\u00060\uffff\uffff\u0000\u02f1\u02f2\u0005\u000e\u0000\u0000"+ - "\u02f2\u02f6\u00060\uffff\uffff\u0000\u02f3\u02f4\u0005C\u0000\u0000\u02f4"+ - "\u02f6\u00060\uffff\uffff\u0000\u02f5\u02ee\u0001\u0000\u0000\u0000\u02f5"+ - "\u02ef\u0001\u0000\u0000\u0000\u02f5\u02f1\u0001\u0000\u0000\u0000\u02f5"+ - "\u02f3\u0001\u0000\u0000\u0000\u02f6\u02f7\u0001\u0000\u0000\u0000\u02f7"+ - "\u02f9\u0003\u0172\u00b9\u0000\u02f8\u02f5\u0001\u0000\u0000\u0000\u02f9"+ - "\u02fc\u0001\u0000\u0000\u0000\u02fa\u02fb\u0001\u0000\u0000\u0000\u02fa"+ - "\u02f8\u0001\u0000\u0000\u0000\u02fb\u02ff\u0001\u0000\u0000\u0000\u02fc"+ - "\u02fa\u0001\u0000\u0000\u0000\u02fd\u02fe\u0005\u000e\u0000\u0000\u02fe"+ - "\u0300\u00060\uffff\uffff\u0000\u02ff\u02fd\u0001\u0000\u0000\u0000\u02ff"+ - "\u0300\u0001\u0000\u0000\u0000\u0300a\u0001\u0000\u0000\u0000\u0301\u0302"+ - "\u0005\t\u0000\u0000\u0302\u030a\u0003f3\u0000\u0303\u0304\u0005\n\u0000"+ - "\u0000\u0304\u030a\u0003f3\u0000\u0305\u0306\u0005\u000b\u0000\u0000\u0306"+ - "\u030a\u0003f3\u0000\u0307\u0308\u0005\r\u0000\u0000\u0308\u030a\u0003"+ - "d2\u0000\u0309\u0301\u0001\u0000\u0000\u0000\u0309\u0303\u0001\u0000\u0000"+ - "\u0000\u0309\u0305\u0001\u0000\u0000\u0000\u0309\u0307\u0001\u0000\u0000"+ - "\u0000\u030ac\u0001\u0000\u0000\u0000\u030b\u030d\u0003\u00e8t\u0000\u030c"+ - "\u030b\u0001\u0000\u0000\u0000\u030c\u030d\u0001\u0000\u0000\u0000\u030d"+ - "\u0310\u0001\u0000\u0000\u0000\u030e\u030f\u0005^\u0000\u0000\u030f\u0311"+ - "\u0003\u00a6S\u0000\u0310\u030e\u0001\u0000\u0000\u0000\u0310\u0311\u0001"+ - "\u0000\u0000\u0000\u0311e\u0001\u0000\u0000\u0000\u0312\u0315\u0001\u0000"+ - "\u0000\u0000\u0313\u0315\u0003\u00a6S\u0000\u0314\u0312\u0001\u0000\u0000"+ - "\u0000\u0314\u0313\u0001\u0000\u0000\u0000\u0315g\u0001\u0000\u0000\u0000"+ - "\u0316\u0317\u00056\u0000\u0000\u0317\u0318\u0003\u00a6S\u0000\u0318\u031c"+ - "\u0005j\u0000\u0000\u0319\u031b\u0003j5\u0000\u031a\u0319\u0001\u0000"+ - "\u0000\u0000\u031b\u031e\u0001\u0000\u0000\u0000\u031c\u031a\u0001\u0000"+ - "\u0000\u0000\u031c\u031d\u0001\u0000\u0000\u0000\u031d\u031f\u0001\u0000"+ - "\u0000\u0000\u031e\u031c\u0001\u0000\u0000\u0000\u031f\u0320\u0005k\u0000"+ - "\u0000\u0320i\u0001\u0000\u0000\u0000\u0321\u0322\u0003l6\u0000\u0322"+ - "\u0324\u0005q\u0000\u0000\u0323\u0325\u0003\u00f2y\u0000\u0324\u0323\u0001"+ - "\u0000\u0000\u0000\u0324\u0325\u0001\u0000\u0000\u0000\u0325k\u0001\u0000"+ - "\u0000\u0000\u0326\u0327\u0005R\u0000\u0000\u0327\u032a\u0003n7\u0000"+ - "\u0328\u032a\u0005N\u0000\u0000\u0329\u0326\u0001\u0000\u0000\u0000\u0329"+ - "\u0328\u0001\u0000\u0000\u0000\u032am\u0001\u0000\u0000\u0000\u032b\u032c"+ - "\u0005%\u0000\u0000\u032c\u0339\u0005g\u0000\u0000\u032d\u032e\u0003\u00cc"+ - "f\u0000\u032e\u0333\u0005j\u0000\u0000\u032f\u0331\u0003p8\u0000\u0330"+ - "\u0332\u0005o\u0000\u0000\u0331\u0330\u0001\u0000\u0000\u0000\u0331\u0332"+ - "\u0001\u0000\u0000\u0000\u0332\u0334\u0001\u0000\u0000\u0000\u0333\u032f"+ - "\u0001\u0000\u0000\u0000\u0333\u0334\u0001\u0000\u0000\u0000\u0334\u0335"+ - "\u0001\u0000\u0000\u0000\u0335\u0336\u0005k\u0000\u0000\u0336\u0339\u0001"+ - "\u0000\u0000\u0000\u0337\u0339\u0003\u00a6S\u0000\u0338\u032b\u0001\u0000"+ - "\u0000\u0000\u0338\u032d\u0001\u0000\u0000\u0000\u0338\u0337\u0001\u0000"+ - "\u0000\u0000\u0339o\u0001\u0000\u0000\u0000\u033a\u033f\u0003n7\u0000"+ - "\u033b\u033c\u0005o\u0000\u0000\u033c\u033e\u0003n7\u0000\u033d\u033b"+ - "\u0001\u0000\u0000\u0000\u033e\u0341\u0001\u0000\u0000\u0000\u033f\u033d"+ - "\u0001\u0000\u0000\u0000\u033f\u0340\u0001\u0000\u0000\u0000\u0340q\u0001"+ - "\u0000\u0000\u0000\u0341\u033f\u0001\u0000\u0000\u0000\u0342\u0347\u0005"+ - "j\u0000\u0000\u0343\u0344\u0005;\u0000\u0000\u0344\u0345\u0003\u00e6s"+ - "\u0000\u0345\u0346\u0003\u0172\u00b9\u0000\u0346\u0348\u0001\u0000\u0000"+ - "\u0000\u0347\u0343\u0001\u0000\u0000\u0000\u0347\u0348\u0001\u0000\u0000"+ - "\u0000\u0348\u034a\u0001\u0000\u0000\u0000\u0349\u034b\u0003\u00f2y\u0000"+ - "\u034a\u0349\u0001\u0000\u0000\u0000\u034a\u034b\u0001\u0000\u0000\u0000"+ - "\u034b\u034c\u0001\u0000\u0000\u0000\u034c\u034d\u0005k\u0000\u0000\u034d"+ - "s\u0001\u0000\u0000\u0000\u034e\u0351\u0003\u0152\u00a9\u0000\u034f\u0351"+ - "\u0005g\u0000\u0000\u0350\u034e\u0001\u0000\u0000\u0000\u0350\u034f\u0001"+ - "\u0000\u0000\u0000\u0351\u035a\u0001\u0000\u0000\u0000\u0352\u0357\u0005"+ - "j\u0000\u0000\u0353\u0355\u0003v;\u0000\u0354\u0356\u0005o\u0000\u0000"+ - "\u0355\u0354\u0001\u0000\u0000\u0000\u0355\u0356\u0001\u0000\u0000\u0000"+ - "\u0356\u0358\u0001\u0000\u0000\u0000\u0357\u0353\u0001\u0000\u0000\u0000"+ - "\u0357\u0358\u0001\u0000\u0000\u0000\u0358\u0359\u0001\u0000\u0000\u0000"+ - "\u0359\u035b\u0005k\u0000\u0000\u035a\u0352\u0001\u0000\u0000\u0000\u035a"+ - "\u035b\u0001\u0000\u0000\u0000\u035bu\u0001\u0000\u0000\u0000\u035c\u0361"+ - "\u0003x<\u0000\u035d\u035e\u0005o\u0000\u0000\u035e\u0360\u0003x<\u0000"+ - "\u035f\u035d\u0001\u0000\u0000\u0000\u0360\u0363\u0001\u0000\u0000\u0000"+ - "\u0361\u035f\u0001\u0000\u0000\u0000\u0361\u0362\u0001\u0000\u0000\u0000"+ - "\u0362w\u0001\u0000\u0000\u0000\u0363\u0361\u0001\u0000\u0000\u0000\u0364"+ - "\u0365\u0005g\u0000\u0000\u0365\u0367\u0005q\u0000\u0000\u0366\u0364\u0001"+ - "\u0000\u0000\u0000\u0366\u0367\u0001\u0000\u0000\u0000\u0367\u0368\u0001"+ - "\u0000\u0000\u0000\u0368\u0369\u0003\u00a6S\u0000\u0369y\u0001\u0000\u0000"+ - "\u0000\u036a\u036b\u0005G\u0000\u0000\u036b\u036c\u0003\u00a6S\u0000\u036c"+ - "\u036d\u0005\u000f\u0000\u0000\u036d\u036e\u0003t:\u0000\u036e\u036f\u0003"+ - "\u00f0x\u0000\u036f{\u0001\u0000\u0000\u0000\u0370\u0371\u0003\u00c4b"+ - "\u0000\u0371\u0372\u0005\u000f\u0000\u0000\u0372\u0385\u0003\u00c4b\u0000"+ - "\u0373\u0379\u0005j\u0000\u0000\u0374\u0375\u0003\u0084B\u0000\u0375\u0376"+ - "\u0003\u0172\u00b9\u0000\u0376\u0378\u0001\u0000\u0000\u0000\u0377\u0374"+ - "\u0001\u0000\u0000\u0000\u0378\u037b\u0001\u0000\u0000\u0000\u0379\u0377"+ - "\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000\u037a\u0381"+ - "\u0001\u0000\u0000\u0000\u037b\u0379\u0001\u0000\u0000\u0000\u037c\u037d"+ - "\u0003~?\u0000\u037d\u037e\u0003\u0172\u00b9\u0000\u037e\u0380\u0001\u0000"+ - "\u0000\u0000\u037f\u037c\u0001\u0000\u0000\u0000\u0380\u0383\u0001\u0000"+ - "\u0000\u0000\u0381\u037f\u0001\u0000\u0000\u0000\u0381\u0382\u0001\u0000"+ - "\u0000\u0000\u0382\u0384\u0001\u0000\u0000\u0000\u0383\u0381\u0001\u0000"+ - "\u0000\u0000\u0384\u0386\u0005k\u0000\u0000\u0385\u0373\u0001\u0000\u0000"+ - "\u0000\u0385\u0386\u0001\u0000\u0000\u0000\u0386}\u0001\u0000\u0000\u0000"+ - "\u0387\u0389\u0005\u000e\u0000\u0000\u0388\u0387\u0001\u0000\u0000\u0000"+ - "\u0388\u0389\u0001\u0000\u0000\u0000\u0389\u038a\u0001\u0000\u0000\u0000"+ - "\u038a\u038b\u0003\u0080@\u0000\u038b\u038c\u0005g\u0000\u0000\u038c\u038e"+ - "\u0003\u0140\u00a0\u0000\u038d\u038f\u0003\u00f0x\u0000\u038e\u038d\u0001"+ - "\u0000\u0000\u0000\u038e\u038f\u0001\u0000\u0000\u0000\u038f\u007f\u0001"+ - "\u0000\u0000\u0000\u0390\u0392\u0005h\u0000\u0000\u0391\u0393\u0005g\u0000"+ - "\u0000\u0392\u0391\u0001\u0000\u0000\u0000\u0392\u0393\u0001\u0000\u0000"+ - "\u0000\u0393\u0395\u0001\u0000\u0000\u0000\u0394\u0396\u0005\u0089\u0000"+ - "\u0000\u0395\u0394\u0001\u0000\u0000\u0000\u0395\u0396\u0001\u0000\u0000"+ - "\u0000\u0396\u0397\u0001\u0000\u0000\u0000\u0397\u0398\u0003\u012e\u0097"+ - "\u0000\u0398\u0399\u0005i\u0000\u0000\u0399\u0081\u0001\u0000\u0000\u0000"+ - "\u039a\u03a0\u0003\u00b6[\u0000\u039b\u039c\u0003\u00c4b\u0000\u039c\u039d"+ - "\u0005r\u0000\u0000\u039d\u039e\u0005g\u0000\u0000\u039e\u03a0\u0001\u0000"+ - "\u0000\u0000\u039f\u039a\u0001\u0000\u0000\u0000\u039f\u039b\u0001\u0000"+ - "\u0000\u0000\u03a0\u0083\u0001\u0000\u0000\u0000\u03a1\u03a2\u00058\u0000"+ - "\u0000\u03a2\u03a3\u0005g\u0000\u0000\u03a3\u03a6\u0005u\u0000\u0000\u03a4"+ - "\u03a7\u0003\u0082A\u0000\u03a5\u03a7\u0003\u0150\u00a8\u0000\u03a6\u03a4"+ - "\u0001\u0000\u0000\u0000\u03a6\u03a5\u0001\u0000\u0000\u0000\u03a7\u0085"+ - "\u0001\u0000\u0000\u0000\u03a8\u03a9\u0005/\u0000\u0000\u03a9\u03aa\u0005"+ - "h\u0000\u0000\u03aa\u03ad\u0003\u00c4b\u0000\u03ab\u03ac\u0005o\u0000"+ - "\u0000\u03ac\u03ae\u0003\u00e8t\u0000\u03ad\u03ab\u0001\u0000\u0000\u0000"+ - "\u03ad\u03ae\u0001\u0000\u0000\u0000\u03ae\u03af\u0001\u0000\u0000\u0000"+ - "\u03af\u03b0\u0005i\u0000\u0000\u03b0\u0087\u0001\u0000\u0000\u0000\u03b1"+ - "\u03b2\u0005.\u0000\u0000\u03b2\u03b3\u0005h\u0000\u0000\u03b3\u03b4\u0003"+ - "\u00c4b\u0000\u03b4\u03b5\u0005i\u0000\u0000\u03b5\u0089\u0001\u0000\u0000"+ - "\u0000\u03b6\u03b9\u0003`0\u0000\u03b7\u03ba\u0003\u008cF\u0000\u03b8"+ - "\u03ba\u0003\u008eG\u0000\u03b9\u03b7\u0001\u0000\u0000\u0000\u03b9\u03b8"+ - "\u0001\u0000\u0000\u0000\u03ba\u008b\u0001\u0000\u0000\u0000\u03bb\u03bc"+ - "\u0005O\u0000\u0000\u03bc\u03bd\u0005g\u0000\u0000\u03bd\u03bf\u0003\u0140"+ - "\u00a0\u0000\u03be\u03c0\u0003r9\u0000\u03bf\u03be\u0001\u0000\u0000\u0000"+ - "\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0\u008d\u0001\u0000\u0000\u0000"+ - "\u03c1\u03c2\u0005O\u0000\u0000\u03c2\u03c3\u0003\u009cN\u0000\u03c3\u03c4"+ - "\u0005g\u0000\u0000\u03c4\u03c6\u0003\u0140\u00a0\u0000\u03c5\u03c7\u0003"+ - "r9\u0000\u03c6\u03c5\u0001\u0000\u0000\u0000\u03c6\u03c7\u0001\u0000\u0000"+ - "\u0000\u03c7\u008f\u0001\u0000\u0000\u0000\u03c8\u03cb\u0005\u001b\u0000"+ - "\u0000\u03c9\u03cc\u0003\u008aE\u0000\u03ca\u03cc\u0003\u00e0p\u0000\u03cb"+ - "\u03c9\u0001\u0000\u0000\u0000\u03cb\u03ca\u0001\u0000\u0000\u0000\u03cc"+ - "\u0091\u0001\u0000\u0000\u0000\u03cd\u03ce\u00058\u0000\u0000\u03ce\u03cf"+ - "\u0005g\u0000\u0000\u03cf\u03d1\u0003\u0144\u00a2\u0000\u03d0\u03d2\u0003"+ - "\u0094J\u0000\u03d1\u03d0\u0001\u0000\u0000\u0000\u03d1\u03d2\u0001\u0000"+ - "\u0000\u0000\u03d2\u0093\u0001\u0000\u0000\u0000\u03d3\u03d4\u0005j\u0000"+ - "\u0000\u03d4\u03d5\u0003\u00a6S\u0000\u03d5\u03d6\u0003\u0172\u00b9\u0000"+ - "\u03d6\u03d7\u0005k\u0000\u0000\u03d7\u0095\u0001\u0000\u0000\u0000\u03d8"+ - "\u03d9\u00058\u0000\u0000\u03d9\u03da\u0003\u009cN\u0000\u03da\u03db\u0005"+ - "g\u0000\u0000\u03db\u03dd\u0003\u0144\u00a2\u0000\u03dc\u03de\u0003\u0094"+ - "J\u0000\u03dd\u03dc\u0001\u0000\u0000\u0000\u03dd\u03de\u0001\u0000\u0000"+ - "\u0000\u03de\u0097\u0001\u0000\u0000\u0000\u03df\u03e7\u0003\u0006\u0003"+ - "\u0000\u03e0\u03e3\u0003\u00c4b\u0000\u03e1\u03e2\u0005n\u0000\u0000\u03e2"+ - "\u03e4\u0003\u00e8t\u0000\u03e3\u03e1\u0001\u0000\u0000\u0000\u03e3\u03e4"+ - "\u0001\u0000\u0000\u0000\u03e4\u03e8\u0001\u0000\u0000\u0000\u03e5\u03e6"+ - "\u0005n\u0000\u0000\u03e6\u03e8\u0003\u00e8t\u0000\u03e7\u03e0\u0001\u0000"+ - "\u0000\u0000\u03e7\u03e5\u0001\u0000\u0000\u0000\u03e8\u0099\u0001\u0000"+ - "\u0000\u0000\u03e9\u03ea\u0003\u0006\u0003\u0000\u03ea\u03eb\u0005u\u0000"+ - "\u0000\u03eb\u03ec\u0003\u00e8t\u0000\u03ec\u009b\u0001\u0000\u0000\u0000"+ - "\u03ed\u03ef\u0005h\u0000\u0000\u03ee\u03f0\u0003\b\u0004\u0000\u03ef"+ - "\u03ee\u0001\u0000\u0000\u0000\u03ef\u03f0\u0001\u0000\u0000\u0000\u03f0"+ - "\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f3\u0003\u00c4b\u0000\u03f2\u03f4"+ - "\u0005o\u0000\u0000\u03f3\u03f2\u0001\u0000\u0000\u0000\u03f3\u03f4\u0001"+ - "\u0000\u0000\u0000\u03f4\u03f5\u0001\u0000\u0000\u0000\u03f5\u03f6\u0005"+ - "i\u0000\u0000\u03f6\u009d\u0001\u0000\u0000\u0000\u03f7\u03fa\u0003\u00a0"+ - "P\u0000\u03f8\u03fa\u0003\u00a2Q\u0000\u03f9\u03f7\u0001\u0000\u0000\u0000"+ - "\u03f9\u03f8\u0001\u0000\u0000\u0000\u03fa\u009f\u0001\u0000\u0000\u0000"+ - "\u03fb\u03fd\u0003\u00e6s\u0000\u03fc\u03fb\u0001\u0000\u0000\u0000\u03fc"+ - "\u03fd\u0001\u0000\u0000\u0000\u03fd\u03fe\u0001\u0000\u0000\u0000\u03fe"+ - "\u03ff\u0003\u00a4R\u0000\u03ff\u00a1\u0001\u0000\u0000\u0000\u0400\u0402"+ - "\u0005\u001b\u0000\u0000\u0401\u0403\u0003\u00e6s\u0000\u0402\u0401\u0001"+ - "\u0000\u0000\u0000\u0402\u0403\u0001\u0000\u0000\u0000\u0403\u0404\u0001"+ - "\u0000\u0000\u0000\u0404\u0405\u0003\u00a4R\u0000\u0405\u00a3\u0001\u0000"+ - "\u0000\u0000\u0406\u0408\u0005v\u0000\u0000\u0407\u0406\u0001\u0000\u0000"+ - "\u0000\u0407\u0408\u0001\u0000\u0000\u0000\u0408\u0409\u0001\u0000\u0000"+ - "\u0000\u0409\u040a\u0003\u00c4b\u0000\u040a\u00a5\u0001\u0000\u0000\u0000"+ - "\u040b\u040c\u0006S\uffff\uffff\u0000\u040c\u040d\u0007\u0006\u0000\u0000"+ - "\u040d\u0421\u0003\u00a6S\u000f\u040e\u0421\u0003\u00b6[\u0000\u040f\u0410"+ - "\u0005\u0019\u0000\u0000\u0410\u0411\u0003.\u0017\u0000\u0411\u0412\u0005"+ - "\u001c\u0000\u0000\u0412\u0413\u0003\u00a6S\u0003\u0413\u0421\u0001\u0000"+ - "\u0000\u0000\u0414\u0415\u0005\u001a\u0000\u0000\u0415\u0416\u0003\u009a"+ - "M\u0000\u0416\u0417\u0005\u001c\u0000\u0000\u0417\u0418\u0003\u00a6S\u0002"+ - "\u0418\u0421\u0001\u0000\u0000\u0000\u0419\u041a\u0007\u0007\u0000\u0000"+ - "\u041a\u041b\u0003&\u0013\u0000\u041b\u041c\u0005q\u0000\u0000\u041c\u041d"+ - "\u0005q\u0000\u0000\u041d\u041e\u0003*\u0015\u0000\u041e\u041f\u0003\u00a6"+ - "S\u0001\u041f\u0421\u0001\u0000\u0000\u0000\u0420\u040b\u0001\u0000\u0000"+ - "\u0000\u0420\u040e\u0001\u0000\u0000\u0000\u0420\u040f\u0001\u0000\u0000"+ - "\u0000\u0420\u0414\u0001\u0000\u0000\u0000\u0420\u0419\u0001\u0000\u0000"+ - "\u0000\u0421\u0445\u0001\u0000\u0000\u0000\u0422\u0423\n\r\u0000\u0000"+ - "\u0423\u0424\u0007\b\u0000\u0000\u0424\u0444\u0003\u00a6S\u000e\u0425"+ - "\u0426\n\f\u0000\u0000\u0426\u0427\u0007\t\u0000\u0000\u0427\u0444\u0003"+ - "\u00a6S\r\u0428\u0429\n\u000b\u0000\u0000\u0429\u042a\u0007\n\u0000\u0000"+ - "\u042a\u0444\u0003\u00a6S\f\u042b\u042c\n\n\u0000\u0000\u042c\u042d\u0007"+ - "\u000b\u0000\u0000\u042d\u0444\u0003\u00a6S\u000b\u042e\u042f\n\t\u0000"+ - "\u0000\u042f\u0430\u0007\f\u0000\u0000\u0430\u0444\u0003\u00a6S\n\u0431"+ - "\u0432\n\u0007\u0000\u0000\u0432\u0433\u0005x\u0000\u0000\u0433\u0444"+ - "\u0003\u00a6S\b\u0434\u0435\n\u0006\u0000\u0000\u0435\u0436\u0005w\u0000"+ - "\u0000\u0436\u0444\u0003\u00a6S\u0007\u0437\u0438\n\u0005\u0000\u0000"+ - "\u0438\u0439\u0005\"\u0000\u0000\u0439\u0444\u0003\u00a6S\u0005\u043a"+ - "\u043b\n\u0004\u0000\u0000\u043b\u043c\u0005%\u0000\u0000\u043c\u043d"+ - "\u0003\u00a6S\u0000\u043d\u043e\u0005q\u0000\u0000\u043e\u043f\u0003\u00a6"+ - "S\u0004\u043f\u0444\u0001\u0000\u0000\u0000\u0440\u0441\n\b\u0000\u0000"+ - "\u0441\u0442\u0005\u000f\u0000\u0000\u0442\u0444\u0003t:\u0000\u0443\u0422"+ - "\u0001\u0000\u0000\u0000\u0443\u0425\u0001\u0000\u0000\u0000\u0443\u0428"+ - "\u0001\u0000\u0000\u0000\u0443\u042b\u0001\u0000\u0000\u0000\u0443\u042e"+ - "\u0001\u0000\u0000\u0000\u0443\u0431\u0001\u0000\u0000\u0000\u0443\u0434"+ - "\u0001\u0000\u0000\u0000\u0443\u0437\u0001\u0000\u0000\u0000\u0443\u043a"+ - "\u0001\u0000\u0000\u0000\u0443\u0440\u0001\u0000\u0000\u0000\u0444\u0447"+ - "\u0001\u0000\u0000\u0000\u0445\u0443\u0001\u0000\u0000\u0000\u0445\u0446"+ - "\u0001\u0000\u0000\u0000\u0446\u00a7\u0001\u0000\u0000\u0000\u0447\u0445"+ - "\u0001\u0000\u0000\u0000\u0448\u045d\u0003\u0018\f\u0000\u0449\u045d\u0003"+ - "\u001a\r\u0000\u044a\u045d\u0003\u00acV\u0000\u044b\u045d\u0003\u00aa"+ - "U\u0000\u044c\u045d\u0003\u00e0p\u0000\u044d\u045d\u0003\u0100\u0080\u0000"+ - "\u044e\u045d\u0003\u00f4z\u0000\u044f\u045d\u0003\u012c\u0096\u0000\u0450"+ - "\u045d\u0003\u0102\u0081\u0000\u0451\u045d\u0003\u0104\u0082\u0000\u0452"+ - "\u045d\u0003\u0106\u0083\u0000\u0453\u045d\u0003\u0108\u0084\u0000\u0454"+ - "\u045d\u0003\u010a\u0085\u0000\u0455\u045d\u0003\u00f0x\u0000\u0456\u045d"+ - "\u0003\u010c\u0086\u0000\u0457\u045d\u0003\u010e\u0087\u0000\u0458\u045d"+ - "\u0003\u0120\u0090\u0000\u0459\u045d\u0003\u00aeW\u0000\u045a\u045d\u0003"+ - "\u00b2Y\u0000\u045b\u045d\u0003z=\u0000\u045c\u0448\u0001\u0000\u0000"+ - "\u0000\u045c\u0449\u0001\u0000\u0000\u0000\u045c\u044a\u0001\u0000\u0000"+ - "\u0000\u045c\u044b\u0001\u0000\u0000\u0000\u045c\u044c\u0001\u0000\u0000"+ - "\u0000\u045c\u044d\u0001\u0000\u0000\u0000\u045c\u044e\u0001\u0000\u0000"+ - "\u0000\u045c\u044f\u0001\u0000\u0000\u0000\u045c\u0450\u0001\u0000\u0000"+ - "\u0000\u045c\u0451\u0001\u0000\u0000\u0000\u045c\u0452\u0001\u0000\u0000"+ - "\u0000\u045c\u0453\u0001\u0000\u0000\u0000\u045c\u0454\u0001\u0000\u0000"+ - "\u0000\u045c\u0455\u0001\u0000\u0000\u0000\u045c\u0456\u0001\u0000\u0000"+ - "\u0000\u045c\u0457\u0001\u0000\u0000\u0000\u045c\u0458\u0001\u0000\u0000"+ - "\u0000\u045c\u0459\u0001\u0000\u0000\u0000\u045c\u045a\u0001\u0000\u0000"+ - "\u0000\u045c\u045b\u0001\u0000\u0000\u0000\u045d\u00a9\u0001\u0000\u0000"+ - "\u0000\u045e\u045f\u0005$\u0000\u0000\u045f\u0460\u0003\u00a6S\u0000\u0460"+ - "\u00ab\u0001\u0000\u0000\u0000\u0461\u0462\u0005Z\u0000\u0000\u0462\u0464"+ - "\u0003\u00a6S\u0000\u0463\u0465\u0003\u00f0x\u0000\u0464\u0463\u0001\u0000"+ - "\u0000\u0000\u0464\u0465\u0001\u0000\u0000\u0000\u0465\u00ad\u0001\u0000"+ - "\u0000\u0000\u0466\u0467\u0003\u00b0X\u0000\u0467\u0468\u0003\u0128\u0094"+ - "\u0000\u0468\u00af\u0001\u0000\u0000\u0000\u0469\u046a\u0005\f\u0000\u0000"+ - "\u046a\u046b\u0003\u00a6S\u0000\u046b\u046c\u0003\u0172\u00b9\u0000\u046c"+ - "\u046e\u0001\u0000\u0000\u0000\u046d\u0469\u0001\u0000\u0000\u0000\u046e"+ - "\u0471\u0001\u0000\u0000\u0000\u046f\u046d\u0001\u0000\u0000\u0000\u046f"+ - "\u0470\u0001\u0000\u0000\u0000\u0470\u0476\u0001\u0000\u0000\u0000\u0471"+ - "\u046f\u0001\u0000\u0000\u0000\u0472\u0473\u0005\r\u0000\u0000\u0473\u0474"+ - "\u0003d2\u0000\u0474\u0475\u0003\u0172\u00b9\u0000\u0475\u0477\u0001\u0000"+ - "\u0000\u0000\u0476\u0472\u0001\u0000\u0000\u0000\u0476\u0477\u0001\u0000"+ - "\u0000\u0000\u0477\u00b1\u0001\u0000\u0000\u0000\u0478\u0479\u0005S\u0000"+ - "\u0000\u0479\u047e\u0003\u00a6S\u0000\u047a\u047b\u0005S\u0000\u0000\u047b"+ - "\u047c\u0007\u0001\u0000\u0000\u047c\u047e\u0003.\u0017\u0000\u047d\u0478"+ - "\u0001\u0000\u0000\u0000\u047d\u047a\u0001\u0000\u0000\u0000\u047e\u00b3"+ - "\u0001\u0000\u0000\u0000\u047f\u0488\u0005\u0003\u0000\u0000\u0480\u0488"+ - "\u0005\u0004\u0000\u0000\u0481\u0488\u0005f\u0000\u0000\u0482\u0488\u0003"+ - "\u014e\u00a7\u0000\u0483\u0488\u0003\u0164\u00b2\u0000\u0484\u0488\u0005"+ - "\u0001\u0000\u0000\u0485\u0488\u0005\u0091\u0000\u0000\u0486\u0488\u0005"+ - "\u0092\u0000\u0000\u0487\u047f\u0001\u0000\u0000\u0000\u0487\u0480\u0001"+ - "\u0000\u0000\u0000\u0487\u0481\u0001\u0000\u0000\u0000\u0487\u0482\u0001"+ - "\u0000\u0000\u0000\u0487\u0483\u0001\u0000\u0000\u0000\u0487\u0484\u0001"+ - "\u0000\u0000\u0000\u0487\u0485\u0001\u0000\u0000\u0000\u0487\u0486\u0001"+ - "\u0000\u0000\u0000\u0488\u00b5\u0001\u0000\u0000\u0000\u0489\u048a\u0006"+ - "[\uffff\uffff\u0000\u048a\u049a\u0003\u014a\u00a5\u0000\u048b\u049a\u0003"+ - "\u0146\u00a3\u0000\u048c\u049a\u0003\u016e\u00b7\u0000\u048d\u049a\u0003"+ - " \u0010\u0000\u048e\u049a\u0003\u0088D\u0000\u048f\u049a\u0003\u0086C"+ - "\u0000\u0490\u0491\u0005L\u0000\u0000\u0491\u0492\u0003\u00b6[\u0000\u0492"+ - "\u0493\u0003\u016c\u00b6\u0000\u0493\u049a\u0001\u0000\u0000\u0000\u0494"+ - "\u0495\u0007\r\u0000\u0000\u0495\u0496\u0005h\u0000\u0000\u0496\u0497"+ - "\u0003\u00a6S\u0000\u0497\u0498\u0005i\u0000\u0000\u0498\u049a\u0001\u0000"+ - "\u0000\u0000\u0499\u0489\u0001\u0000\u0000\u0000\u0499\u048b\u0001\u0000"+ - "\u0000\u0000\u0499\u048c\u0001\u0000\u0000\u0000\u0499\u048d\u0001\u0000"+ - "\u0000\u0000\u0499\u048e\u0001\u0000\u0000\u0000\u0499\u048f\u0001\u0000"+ - "\u0000\u0000\u0499\u0490\u0001\u0000\u0000\u0000\u0499\u0494\u0001\u0000"+ - "\u0000\u0000\u049a\u04b1\u0001\u0000\u0000\u0000\u049b\u049c\n\n\u0000"+ - "\u0000\u049c\u049d\u0005r\u0000\u0000\u049d\u04b0\u0005g\u0000\u0000\u049e"+ - "\u049f\n\t\u0000\u0000\u049f\u04b0\u0003\u0168\u00b4\u0000\u04a0\u04a1"+ - "\n\b\u0000\u0000\u04a1\u04b0\u0003\u00d0h\u0000\u04a2\u04a3\n\u0007\u0000"+ - "\u0000\u04a3\u04b0\u0003L&\u0000\u04a4\u04a5\n\u0006\u0000\u0000\u04a5"+ - "\u04b0\u0003\u016a\u00b5\u0000\u04a6\u04a7\n\u0005\u0000\u0000\u04a7\u04b0"+ - "\u0003\u016c\u00b6\u0000\u04a8\u04a9\n\u0003\u0000\u0000\u04a9\u04aa\u0003"+ - "\u016c\u00b6\u0000\u04aa\u04ab\u0005\u0010\u0000\u0000\u04ab\u04ac\u0003"+ - "t:\u0000\u04ac\u04b0\u0001\u0000\u0000\u0000\u04ad\u04ae\n\u0002\u0000"+ - "\u0000\u04ae\u04b0\u0003\u00bc^\u0000\u04af\u049b\u0001\u0000\u0000\u0000"+ - "\u04af\u049e\u0001\u0000\u0000\u0000\u04af\u04a0\u0001\u0000\u0000\u0000"+ - "\u04af\u04a2\u0001\u0000\u0000\u0000\u04af\u04a4\u0001\u0000\u0000\u0000"+ - "\u04af\u04a6\u0001\u0000\u0000\u0000\u04af\u04a8\u0001\u0000\u0000\u0000"+ - "\u04af\u04ad\u0001\u0000\u0000\u0000\u04b0\u04b3\u0001\u0000\u0000\u0000"+ - "\u04b1\u04af\u0001\u0000\u0000\u0000\u04b1\u04b2\u0001\u0000\u0000\u0000"+ - "\u04b2\u00b7\u0001\u0000\u0000\u0000\u04b3\u04b1\u0001\u0000\u0000\u0000"+ - "\u04b4\u04b5\u0003`0\u0000\u04b5\u04b6\u0003\u00ba]\u0000\u04b6\u00b9"+ - "\u0001\u0000\u0000\u0000\u04b7\u04b9\u0005O\u0000\u0000\u04b8\u04ba\u0005"+ - "g\u0000\u0000\u04b9\u04b8\u0001\u0000\u0000\u0000\u04b9\u04ba\u0001\u0000"+ - "\u0000\u0000\u04ba\u04bb\u0001\u0000\u0000\u0000\u04bb\u04bd\u0003\u0140"+ - "\u00a0\u0000\u04bc\u04be\u0003r9\u0000\u04bd\u04bc\u0001\u0000\u0000\u0000"+ - "\u04bd\u04be\u0001\u0000\u0000\u0000\u04be\u00bb\u0001\u0000\u0000\u0000"+ - "\u04bf\u04c1\u0005&\u0000\u0000\u04c0\u04c2\u0003\u00e8t\u0000\u04c1\u04c0"+ - "\u0001\u0000\u0000\u0000\u04c1\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c4"+ - "\u0001\u0000\u0000\u0000\u04c3\u04c5\u0005o\u0000\u0000\u04c4\u04c3\u0001"+ - "\u0000\u0000\u0000\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c6\u0001"+ - "\u0000\u0000\u0000\u04c6\u04c7\u0005\'\u0000\u0000\u04c7\u00bd\u0001\u0000"+ - "\u0000\u0000\u04c8\u04c9\u0005P\u0000\u0000\u04c9\u04d3\u0005j\u0000\u0000"+ - "\u04ca\u04ce\u0003\u00c2a\u0000\u04cb\u04ce\u0003\u012e\u0097\u0000\u04cc"+ - "\u04ce\u0003\u00c0`\u0000\u04cd\u04ca\u0001\u0000\u0000\u0000\u04cd\u04cb"+ - "\u0001\u0000\u0000\u0000\u04cd\u04cc\u0001\u0000\u0000\u0000\u04ce\u04cf"+ - "\u0001\u0000\u0000\u0000\u04cf\u04d0\u0003\u0172\u00b9\u0000\u04d0\u04d2"+ - "\u0001\u0000\u0000\u0000\u04d1\u04cd\u0001\u0000\u0000\u0000\u04d2\u04d5"+ - "\u0001\u0000\u0000\u0000\u04d3\u04d1\u0001\u0000\u0000\u0000\u04d3\u04d4"+ - "\u0001\u0000\u0000\u0000\u04d4\u04d6\u0001\u0000\u0000\u0000\u04d5\u04d3"+ - "\u0001\u0000\u0000\u0000\u04d6\u04d7\u0005k\u0000\u0000\u04d7\u00bf\u0001"+ - "\u0000\u0000\u0000\u04d8\u04d9\u00058\u0000\u0000\u04d9\u04da\u0005g\u0000"+ - "\u0000\u04da\u04db\u0003\u0144\u00a2\u0000\u04db\u00c1\u0001\u0000\u0000"+ - "\u0000\u04dc\u04de\u0005\u001b\u0000\u0000\u04dd\u04dc\u0001\u0000\u0000"+ - "\u0000\u04dd\u04de\u0001\u0000\u0000\u0000\u04de\u04df\u0001\u0000\u0000"+ - "\u0000\u04df\u04e0\u0003`0\u0000\u04e0\u04e1\u0005g\u0000\u0000\u04e1"+ - "\u04e2\u0003\u0144\u00a2\u0000\u04e2\u04e3\u0003\u0142\u00a1\u0000\u04e3"+ - "\u04ec\u0001\u0000\u0000\u0000\u04e4\u04e6\u0005\u001b\u0000\u0000\u04e5"+ - "\u04e4\u0001\u0000\u0000\u0000\u04e5\u04e6\u0001\u0000\u0000\u0000\u04e6"+ - "\u04e7\u0001\u0000\u0000\u0000\u04e7\u04e8\u0003`0\u0000\u04e8\u04e9\u0005"+ - "g\u0000\u0000\u04e9\u04ea\u0003\u0144\u00a2\u0000\u04ea\u04ec\u0001\u0000"+ - "\u0000\u0000\u04eb\u04dd\u0001\u0000\u0000\u0000\u04eb\u04e5\u0001\u0000"+ - "\u0000\u0000\u04ec\u00c3\u0001\u0000\u0000\u0000\u04ed\u04f5\u0003\u012e"+ - "\u0097\u0000\u04ee\u04f5\u0003\u00c6c\u0000\u04ef\u04f5\u0003P(\u0000"+ - "\u04f0\u04f1\u0005h\u0000\u0000\u04f1\u04f2\u0003\u00c4b\u0000\u04f2\u04f3"+ - "\u0005i\u0000\u0000\u04f3\u04f5\u0001\u0000\u0000\u0000\u04f4\u04ed\u0001"+ - "\u0000\u0000\u0000\u04f4\u04ee\u0001\u0000\u0000\u0000\u04f4\u04ef\u0001"+ - "\u0000\u0000\u0000\u04f4\u04f0\u0001\u0000\u0000\u0000\u04f5\u00c5\u0001"+ - "\u0000\u0000\u0000\u04f6\u0500\u0003\u0130\u0098\u0000\u04f7\u0500\u0003"+ - "\u0160\u00b0\u0000\u04f8\u0500\u0003\u0136\u009b\u0000\u04f9\u0500\u0003"+ - "\u013e\u009f\u0000\u04fa\u0500\u0003\u00be_\u0000\u04fb\u0500\u0003\u0138"+ - "\u009c\u0000\u04fc\u0500\u0003\u013a\u009d\u0000\u04fd\u0500\u0003\u013c"+ - "\u009e\u0000\u04fe\u0500\u0003\u00c8d\u0000\u04ff\u04f6\u0001\u0000\u0000"+ - "\u0000\u04ff\u04f7\u0001\u0000\u0000\u0000\u04ff\u04f8\u0001\u0000\u0000"+ - "\u0000\u04ff\u04f9\u0001\u0000\u0000\u0000\u04ff\u04fa\u0001\u0000\u0000"+ - "\u0000\u04ff\u04fb\u0001\u0000\u0000\u0000\u04ff\u04fc\u0001\u0000\u0000"+ - "\u0000\u04ff\u04fd\u0001\u0000\u0000\u0000\u04ff\u04fe\u0001\u0000\u0000"+ - "\u0000\u0500\u00c7\u0001\u0000\u0000\u0000\u0501\u0502\u00058\u0000\u0000"+ - "\u0502\u0503\u0003\u00cae\u0000\u0503\u00c9\u0001\u0000\u0000\u0000\u0504"+ - "\u0510\u0005h\u0000\u0000\u0505\u050a\u0003\u00c4b\u0000\u0506\u0507\u0005"+ - "o\u0000\u0000\u0507\u0509\u0003\u00c4b\u0000\u0508\u0506\u0001\u0000\u0000"+ - "\u0000\u0509\u050c\u0001\u0000\u0000\u0000\u050a\u0508\u0001\u0000\u0000"+ - "\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050e\u0001\u0000\u0000"+ - "\u0000\u050c\u050a\u0001\u0000\u0000\u0000\u050d\u050f\u0005o\u0000\u0000"+ - "\u050e\u050d\u0001\u0000\u0000\u0000\u050e\u050f\u0001\u0000\u0000\u0000"+ - "\u050f\u0511\u0001\u0000\u0000\u0000\u0510\u0505\u0001\u0000\u0000\u0000"+ - "\u0510\u0511\u0001\u0000\u0000\u0000\u0511\u0512\u0001\u0000\u0000\u0000"+ - "\u0512\u0513\u0005i\u0000\u0000\u0513\u00cb\u0001\u0000\u0000\u0000\u0514"+ - "\u051c\u0003\u0160\u00b0\u0000\u0515\u051c\u0003\u0130\u0098\u0000\u0516"+ - "\u051c\u0003\u00ceg\u0000\u0517\u051c\u0003\u0138\u009c\u0000\u0518\u051c"+ - "\u0003\u013a\u009d\u0000\u0519\u051c\u0003P(\u0000\u051a\u051c\u0003\u012e"+ - "\u0097\u0000\u051b\u0514\u0001\u0000\u0000\u0000\u051b\u0515\u0001\u0000"+ - "\u0000\u0000\u051b\u0516\u0001\u0000\u0000\u0000\u051b\u0517\u0001\u0000"+ - "\u0000\u0000\u051b\u0518\u0001\u0000\u0000\u0000\u051b\u0519\u0001\u0000"+ - "\u0000\u0000\u051b\u051a\u0001\u0000\u0000\u0000\u051c\u00cd\u0001\u0000"+ - "\u0000\u0000\u051d\u051e\u0005l\u0000\u0000\u051e\u051f\u0005v\u0000\u0000"+ - "\u051f\u0520\u0005m\u0000\u0000\u0520\u0521\u0003\u0134\u009a\u0000\u0521"+ - "\u00cf\u0001\u0000\u0000\u0000\u0522\u0532\u0005l\u0000\u0000\u0523\u0525"+ - "\u0003\u00d2i\u0000\u0524\u0523\u0001\u0000\u0000\u0000\u0524\u0525\u0001"+ - "\u0000\u0000\u0000\u0525\u0526\u0001\u0000\u0000\u0000\u0526\u0528\u0005"+ - "q\u0000\u0000\u0527\u0529\u0003\u00d4j\u0000\u0528\u0527\u0001\u0000\u0000"+ - "\u0000\u0528\u0529\u0001\u0000\u0000\u0000\u0529\u0533\u0001\u0000\u0000"+ - "\u0000\u052a\u052c\u0003\u00d2i\u0000\u052b\u052a\u0001\u0000\u0000\u0000"+ - "\u052b\u052c\u0001\u0000\u0000\u0000\u052c\u052d\u0001\u0000\u0000\u0000"+ - "\u052d\u052e\u0005q\u0000\u0000\u052e\u052f\u0003\u00d4j\u0000\u052f\u0530"+ - "\u0005q\u0000\u0000\u0530\u0531\u0003\u00d6k\u0000\u0531\u0533\u0001\u0000"+ - "\u0000\u0000\u0532\u0524\u0001\u0000\u0000\u0000\u0532\u052b\u0001\u0000"+ - "\u0000\u0000\u0533\u0534\u0001\u0000\u0000\u0000\u0534\u0535\u0005m\u0000"+ - "\u0000\u0535\u00d1\u0001\u0000\u0000\u0000\u0536\u0537\u0003\u00a6S\u0000"+ - "\u0537\u00d3\u0001\u0000\u0000\u0000\u0538\u0539\u0003\u00a6S\u0000\u0539"+ - "\u00d5\u0001\u0000\u0000\u0000\u053a\u053b\u0003\u00a6S\u0000\u053b\u00d7"+ - "\u0001\u0000\u0000\u0000\u053c\u053e\u0007\u000e\u0000\u0000\u053d\u053c"+ - "\u0001\u0000\u0000\u0000\u053d\u053e\u0001\u0000\u0000\u0000\u053e\u053f"+ - "\u0001\u0000\u0000\u0000\u053f\u0540\u0005n\u0000\u0000\u0540\u00d9\u0001"+ - "\u0000\u0000\u0000\u0541\u0542\u0003\u00e8t\u0000\u0542\u0543\u0005n\u0000"+ - "\u0000\u0543\u0548\u0001\u0000\u0000\u0000\u0544\u0545\u0003\u0006\u0003"+ - "\u0000\u0545\u0546\u0005u\u0000\u0000\u0546\u0548\u0001\u0000\u0000\u0000"+ - "\u0547\u0541\u0001\u0000\u0000\u0000\u0547\u0544\u0001\u0000\u0000\u0000"+ - "\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u0549\u0001\u0000\u0000\u0000"+ - "\u0549\u054a\u0005_\u0000\u0000\u054a\u054f\u0003\u00a6S\u0000\u054b\u054d"+ - "\u0005J\u0000\u0000\u054c\u054e\u0005g\u0000\u0000\u054d\u054c\u0001\u0000"+ - "\u0000\u0000\u054d\u054e\u0001\u0000\u0000\u0000\u054e\u0550\u0001\u0000"+ - "\u0000\u0000\u054f\u054b\u0001\u0000\u0000\u0000\u054f\u0550\u0001\u0000"+ - "\u0000\u0000\u0550\u00db\u0001\u0000\u0000\u0000\u0551\u0552\u0005Z\u0000"+ - "\u0000\u0552\u0553\u0005g\u0000\u0000\u0553\u00dd\u0001\u0000\u0000\u0000"+ - "\u0554\u0555\u0003\u0164\u00b2\u0000\u0555\u00df\u0001\u0000\u0000\u0000"+ - "\u0556\u055a\u0003\u00e2q\u0000\u0557\u055a\u0003\u00eau\u0000\u0558\u055a"+ - "\u0003\u00eew\u0000\u0559\u0556\u0001\u0000\u0000\u0000\u0559\u0557\u0001"+ - "\u0000\u0000\u0000\u0559\u0558\u0001\u0000\u0000\u0000\u055a\u00e1\u0001"+ - "\u0000\u0000\u0000\u055b\u0567\u0005\\\u0000\u0000\u055c\u0568\u0003\u00e4"+ - "r\u0000\u055d\u0563\u0005h\u0000\u0000\u055e\u055f\u0003\u00e4r\u0000"+ - "\u055f\u0560\u0003\u0172\u00b9\u0000\u0560\u0562\u0001\u0000\u0000\u0000"+ - "\u0561\u055e\u0001\u0000\u0000\u0000\u0562\u0565\u0001\u0000\u0000\u0000"+ - "\u0563\u0561\u0001\u0000\u0000\u0000\u0563\u0564\u0001\u0000\u0000\u0000"+ - "\u0564\u0566\u0001\u0000\u0000\u0000\u0565\u0563\u0001\u0000\u0000\u0000"+ - "\u0566\u0568\u0005i\u0000\u0000\u0567\u055c\u0001\u0000\u0000\u0000\u0567"+ - "\u055d\u0001\u0000\u0000\u0000\u0568\u00e3\u0001\u0000\u0000\u0000\u0569"+ - "\u056f\u0003\u00e6s\u0000\u056a\u056c\u0003\u00c4b\u0000\u056b\u056a\u0001"+ - "\u0000\u0000\u0000\u056b\u056c\u0001\u0000\u0000\u0000\u056c\u056d\u0001"+ - "\u0000\u0000\u0000\u056d\u056e\u0005n\u0000\u0000\u056e\u0570\u0003\u00e8"+ - "t\u0000\u056f\u056b\u0001\u0000\u0000\u0000\u056f\u0570\u0001\u0000\u0000"+ - "\u0000\u0570\u00e5\u0001\u0000\u0000\u0000\u0571\u0576\u0005g\u0000\u0000"+ - "\u0572\u0573\u0005o\u0000\u0000\u0573\u0575\u0005g\u0000\u0000\u0574\u0572"+ - "\u0001\u0000\u0000\u0000\u0575\u0578\u0001\u0000\u0000\u0000\u0576\u0574"+ - "\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000\u0000\u0577\u00e7"+ - "\u0001\u0000\u0000\u0000\u0578\u0576\u0001\u0000\u0000\u0000\u0579\u057e"+ - "\u0003\u00a6S\u0000\u057a\u057b\u0005o\u0000\u0000\u057b\u057d\u0003\u00a6"+ - "S\u0000\u057c\u057a\u0001\u0000\u0000\u0000\u057d\u0580\u0001\u0000\u0000"+ - "\u0000\u057e\u057c\u0001\u0000\u0000\u0000\u057e\u057f\u0001\u0000\u0000"+ - "\u0000\u057f\u00e9\u0001\u0000\u0000\u0000\u0580\u057e\u0001\u0000\u0000"+ - "\u0000\u0581\u058d\u0005`\u0000\u0000\u0582\u058e\u0003\u00ecv\u0000\u0583"+ - "\u0589\u0005h\u0000\u0000\u0584\u0585\u0003\u00ecv\u0000\u0585\u0586\u0003"+ - "\u0172\u00b9\u0000\u0586\u0588\u0001\u0000\u0000\u0000\u0587\u0584\u0001"+ - "\u0000\u0000\u0000\u0588\u058b\u0001\u0000\u0000\u0000\u0589\u0587\u0001"+ - "\u0000\u0000\u0000\u0589\u058a\u0001\u0000\u0000\u0000\u058a\u058c\u0001"+ - "\u0000\u0000\u0000\u058b\u0589\u0001\u0000\u0000\u0000\u058c\u058e\u0005"+ - "i\u0000\u0000\u058d\u0582\u0001\u0000\u0000\u0000\u058d\u0583\u0001\u0000"+ - "\u0000\u0000\u058e\u00eb\u0001\u0000\u0000\u0000\u058f\u0591\u0005g\u0000"+ - "\u0000\u0590\u0592\u0005n\u0000\u0000\u0591\u0590\u0001\u0000\u0000\u0000"+ - "\u0591\u0592\u0001\u0000\u0000\u0000\u0592\u0593\u0001\u0000\u0000\u0000"+ - "\u0593\u0594\u0003\u00c4b\u0000\u0594\u00ed\u0001\u0000\u0000\u0000\u0595"+ - "\u05a1\u0005e\u0000\u0000\u0596\u05a2\u0003\u0098L\u0000\u0597\u059d\u0005"+ - "h\u0000\u0000\u0598\u0599\u0003\u0098L\u0000\u0599\u059a\u0003\u0172\u00b9"+ - "\u0000\u059a\u059c\u0001\u0000\u0000\u0000\u059b\u0598\u0001\u0000\u0000"+ - "\u0000\u059c\u059f\u0001\u0000\u0000\u0000\u059d\u059b\u0001\u0000\u0000"+ - "\u0000\u059d\u059e\u0001\u0000\u0000\u0000\u059e\u05a0\u0001\u0000\u0000"+ - "\u0000\u059f\u059d\u0001\u0000\u0000\u0000\u05a0\u05a2\u0005i\u0000\u0000"+ - "\u05a1\u0596\u0001\u0000\u0000\u0000\u05a1\u0597\u0001\u0000\u0000\u0000"+ - "\u05a2\u00ef\u0001\u0000\u0000\u0000\u05a3\u05a5\u0005j\u0000\u0000\u05a4"+ - "\u05a6\u0003\u00f2y\u0000\u05a5\u05a4\u0001\u0000\u0000\u0000\u05a5\u05a6"+ - "\u0001\u0000\u0000\u0000\u05a6\u05a7\u0001\u0000\u0000\u0000\u05a7\u05a8"+ - "\u0005k\u0000\u0000\u05a8\u00f1\u0001\u0000\u0000\u0000\u05a9\u05ab\u0005"+ - "p\u0000\u0000\u05aa\u05a9\u0001\u0000\u0000\u0000\u05aa\u05ab\u0001\u0000"+ - "\u0000\u0000\u05ab\u05b1\u0001\u0000\u0000\u0000\u05ac\u05ae\u0005\u00a1"+ - "\u0000\u0000\u05ad\u05ac\u0001\u0000\u0000\u0000\u05ad\u05ae\u0001\u0000"+ - "\u0000\u0000\u05ae\u05b1\u0001\u0000\u0000\u0000\u05af\u05b1\u0004y\u0012"+ - "\u0000\u05b0\u05aa\u0001\u0000\u0000\u0000\u05b0\u05ad\u0001\u0000\u0000"+ - "\u0000\u05b0\u05af\u0001\u0000\u0000\u0000\u05b1\u05b2\u0001\u0000\u0000"+ - "\u0000\u05b2\u05b3\u0003\u00a8T\u0000\u05b3\u05b4\u0003\u0172\u00b9\u0000"+ - "\u05b4\u05b6\u0001\u0000\u0000\u0000\u05b5\u05b0\u0001\u0000\u0000\u0000"+ - "\u05b6\u05b7\u0001\u0000\u0000\u0000\u05b7\u05b5\u0001\u0000\u0000\u0000"+ - "\u05b7\u05b8\u0001\u0000\u0000\u0000\u05b8\u00f3\u0001\u0000\u0000\u0000"+ - "\u05b9\u05bf\u0003\u00f8|\u0000\u05ba\u05bf\u0003\u00fa}\u0000\u05bb\u05bf"+ - "\u0003\u00fc~\u0000\u05bc\u05bf\u0003\u00f6{\u0000\u05bd\u05bf\u0003\u009a"+ - "M\u0000\u05be\u05b9\u0001\u0000\u0000\u0000\u05be\u05ba\u0001\u0000\u0000"+ - "\u0000\u05be\u05bb\u0001\u0000\u0000\u0000\u05be\u05bc\u0001\u0000\u0000"+ - "\u0000\u05be\u05bd\u0001\u0000\u0000\u0000\u05bf\u00f5\u0001\u0000\u0000"+ - "\u0000\u05c0\u05c1\u0003\u00a6S\u0000\u05c1\u00f7\u0001\u0000\u0000\u0000"+ - "\u05c2\u05c3\u0003\u00a6S\u0000\u05c3\u05c4\u0005\u008b\u0000\u0000\u05c4"+ - "\u05c5\u0003\u00a6S\u0000\u05c5\u00f9\u0001\u0000\u0000\u0000\u05c6\u05c7"+ - "\u0003\u00a6S\u0000\u05c7\u05c8\u0007\u000f\u0000\u0000\u05c8\u00fb\u0001"+ - "\u0000\u0000\u0000\u05c9\u05ca\u0003\u00e8t\u0000\u05ca\u05cb\u0003\u00d8"+ - "l\u0000\u05cb\u05cc\u0003\u00e8t\u0000\u05cc\u00fd\u0001\u0000\u0000\u0000"+ - "\u05cd\u05ce\u0007\u0010\u0000\u0000\u05ce\u00ff\u0001\u0000\u0000\u0000"+ - "\u05cf\u05d0\u0005g\u0000\u0000\u05d0\u05d2\u0005q\u0000\u0000\u05d1\u05d3"+ - "\u0003\u00a8T\u0000\u05d2\u05d1\u0001\u0000\u0000\u0000\u05d2\u05d3\u0001"+ - "\u0000\u0000\u0000\u05d3\u0101\u0001\u0000\u0000\u0000\u05d4\u05d6\u0005"+ - "d\u0000\u0000\u05d5\u05d7\u0003\u00e8t\u0000\u05d6\u05d5\u0001\u0000\u0000"+ - "\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000\u05d7\u0103\u0001\u0000\u0000"+ - "\u0000\u05d8\u05da\u0005M\u0000\u0000\u05d9\u05db\u0005g\u0000\u0000\u05da"+ - "\u05d9\u0001\u0000\u0000\u0000\u05da\u05db\u0001\u0000\u0000\u0000\u05db"+ - "\u0105\u0001\u0000\u0000\u0000\u05dc\u05de\u0005a\u0000\u0000\u05dd\u05df"+ - "\u0005g\u0000\u0000\u05de\u05dd\u0001\u0000\u0000\u0000\u05de\u05df\u0001"+ - "\u0000\u0000\u0000\u05df\u0107\u0001\u0000\u0000\u0000\u05e0\u05e1\u0005"+ - "Y\u0000\u0000\u05e1\u05e2\u0005g\u0000\u0000\u05e2\u0109\u0001\u0000\u0000"+ - "\u0000\u05e3\u05e4\u0005]\u0000\u0000\u05e4\u010b\u0001\u0000\u0000\u0000"+ - "\u05e5\u05ee\u0005^\u0000\u0000\u05e6\u05ef\u0003\u00a6S\u0000\u05e7\u05e8"+ - "\u0003\u0172\u00b9\u0000\u05e8\u05e9\u0003\u00a6S\u0000\u05e9\u05ef\u0001"+ - "\u0000\u0000\u0000\u05ea\u05eb\u0003\u00f4z\u0000\u05eb\u05ec\u0003\u0172"+ - "\u00b9\u0000\u05ec\u05ed\u0003\u00a6S\u0000\u05ed\u05ef\u0001\u0000\u0000"+ - "\u0000\u05ee\u05e6\u0001\u0000\u0000\u0000\u05ee\u05e7\u0001\u0000\u0000"+ - "\u0000\u05ee\u05ea\u0001\u0000\u0000\u0000\u05ef\u05f0\u0001\u0000\u0000"+ - "\u0000\u05f0\u05f6\u0003\u00f0x\u0000\u05f1\u05f4\u0005X\u0000\u0000\u05f2"+ - "\u05f5\u0003\u010c\u0086\u0000\u05f3\u05f5\u0003\u00f0x\u0000\u05f4\u05f2"+ - "\u0001\u0000\u0000\u0000\u05f4\u05f3\u0001\u0000\u0000\u0000\u05f5\u05f7"+ - "\u0001\u0000\u0000\u0000\u05f6\u05f1\u0001\u0000\u0000\u0000\u05f6\u05f7"+ - "\u0001\u0000\u0000\u0000\u05f7\u010d\u0001\u0000\u0000\u0000\u05f8\u05fb"+ - "\u0003\u0110\u0088\u0000\u05f9\u05fb\u0003\u0116\u008b\u0000\u05fa\u05f8"+ - "\u0001\u0000\u0000\u0000\u05fa\u05f9\u0001\u0000\u0000\u0000\u05fb\u010f"+ - "\u0001\u0000\u0000\u0000\u05fc\u0607\u0005[\u0000\u0000\u05fd\u05ff\u0003"+ - "\u00a6S\u0000\u05fe\u05fd\u0001\u0000\u0000\u0000\u05fe\u05ff\u0001\u0000"+ - "\u0000\u0000\u05ff\u0608\u0001\u0000\u0000\u0000\u0600\u0602\u0003\u00f4"+ - "z\u0000\u0601\u0600\u0001\u0000\u0000\u0000\u0601\u0602\u0001\u0000\u0000"+ - "\u0000\u0602\u0603\u0001\u0000\u0000\u0000\u0603\u0605\u0003\u0172\u00b9"+ - "\u0000\u0604\u0606\u0003\u00a6S\u0000\u0605\u0604\u0001\u0000\u0000\u0000"+ - "\u0605\u0606\u0001\u0000\u0000\u0000\u0606\u0608\u0001\u0000\u0000\u0000"+ - "\u0607\u05fe\u0001\u0000\u0000\u0000\u0607\u0601\u0001\u0000\u0000\u0000"+ - "\u0608\u0609\u0001\u0000\u0000\u0000\u0609\u060d\u0005j\u0000\u0000\u060a"+ - "\u060c\u0003\u0112\u0089\u0000\u060b\u060a\u0001\u0000\u0000\u0000\u060c"+ - "\u060f\u0001\u0000\u0000\u0000\u060d\u060b\u0001\u0000\u0000\u0000\u060d"+ - "\u060e\u0001\u0000\u0000\u0000\u060e\u0610\u0001\u0000\u0000\u0000\u060f"+ - "\u060d\u0001\u0000\u0000\u0000\u0610\u0611\u0005k\u0000\u0000\u0611\u0111"+ - "\u0001\u0000\u0000\u0000\u0612\u0613\u0003\u0114\u008a\u0000\u0613\u0615"+ - "\u0005q\u0000\u0000\u0614\u0616\u0003\u00f2y\u0000\u0615\u0614\u0001\u0000"+ - "\u0000\u0000\u0615\u0616\u0001\u0000\u0000\u0000\u0616\u0113\u0001\u0000"+ - "\u0000\u0000\u0617\u0618\u0005R\u0000\u0000\u0618\u061b\u0003\u00e8t\u0000"+ - "\u0619\u061b\u0005N\u0000\u0000\u061a\u0617\u0001\u0000\u0000\u0000\u061a"+ - "\u0619\u0001\u0000\u0000\u0000\u061b\u0115\u0001\u0000\u0000\u0000\u061c"+ - "\u0625\u0005[\u0000\u0000\u061d\u0626\u0003\u0118\u008c\u0000\u061e\u061f"+ - "\u0003\u0172\u00b9\u0000\u061f\u0620\u0003\u0118\u008c\u0000\u0620\u0626"+ - "\u0001\u0000\u0000\u0000\u0621\u0622\u0003\u00f4z\u0000\u0622\u0623\u0003"+ - "\u0172\u00b9\u0000\u0623\u0624\u0003\u0118\u008c\u0000\u0624\u0626\u0001"+ - "\u0000\u0000\u0000\u0625\u061d\u0001\u0000\u0000\u0000\u0625\u061e\u0001"+ - "\u0000\u0000\u0000\u0625\u0621\u0001\u0000\u0000\u0000\u0626\u0627\u0001"+ - "\u0000\u0000\u0000\u0627\u062b\u0005j\u0000\u0000\u0628\u062a\u0003\u011a"+ - "\u008d\u0000\u0629\u0628\u0001\u0000\u0000\u0000\u062a\u062d\u0001\u0000"+ - "\u0000\u0000\u062b\u0629\u0001\u0000\u0000\u0000\u062b\u062c\u0001\u0000"+ - "\u0000\u0000\u062c\u062e\u0001\u0000\u0000\u0000\u062d\u062b\u0001\u0000"+ - "\u0000\u0000\u062e\u062f\u0005k\u0000\u0000\u062f\u0117\u0001\u0000\u0000"+ - "\u0000\u0630\u0631\u0005g\u0000\u0000\u0631\u0633\u0005u\u0000\u0000\u0632"+ - "\u0630\u0001\u0000\u0000\u0000\u0632\u0633\u0001\u0000\u0000\u0000\u0633"+ - "\u0634\u0001\u0000\u0000\u0000\u0634\u0635\u0003\u00b6[\u0000\u0635\u0636"+ - "\u0005r\u0000\u0000\u0636\u0637\u0005h\u0000\u0000\u0637\u0638\u0005`"+ - "\u0000\u0000\u0638\u0639\u0005i\u0000\u0000\u0639\u0119\u0001\u0000\u0000"+ - "\u0000\u063a\u063b\u0003\u011c\u008e\u0000\u063b\u063d\u0005q\u0000\u0000"+ - "\u063c\u063e\u0003\u00f2y\u0000\u063d\u063c\u0001\u0000\u0000\u0000\u063d"+ - "\u063e\u0001\u0000\u0000\u0000\u063e\u011b\u0001\u0000\u0000\u0000\u063f"+ - "\u0640\u0005R\u0000\u0000\u0640\u0643\u0003\u011e\u008f\u0000\u0641\u0643"+ - "\u0005N\u0000\u0000\u0642\u063f\u0001\u0000\u0000\u0000\u0642\u0641\u0001"+ - "\u0000\u0000\u0000\u0643\u011d\u0001\u0000\u0000\u0000\u0644\u0647\u0003"+ - "\u00c4b\u0000\u0645\u0647\u0005f\u0000\u0000\u0646\u0644\u0001\u0000\u0000"+ - "\u0000\u0646\u0645\u0001\u0000\u0000\u0000\u0647\u064f\u0001\u0000\u0000"+ - "\u0000\u0648\u064b\u0005o\u0000\u0000\u0649\u064c\u0003\u00c4b\u0000\u064a"+ - "\u064c\u0005f\u0000\u0000\u064b\u0649\u0001\u0000\u0000\u0000\u064b\u064a"+ - "\u0001\u0000\u0000\u0000\u064c\u064e\u0001\u0000\u0000\u0000\u064d\u0648"+ - "\u0001\u0000\u0000\u0000\u064e\u0651\u0001\u0000\u0000\u0000\u064f\u064d"+ - "\u0001\u0000\u0000\u0000\u064f\u0650\u0001\u0000\u0000\u0000\u0650\u011f"+ - "\u0001\u0000\u0000\u0000\u0651\u064f\u0001\u0000\u0000\u0000\u0652\u0653"+ - "\u0005Q\u0000\u0000\u0653\u0657\u0005j\u0000\u0000\u0654\u0656\u0003\u0122"+ - "\u0091\u0000\u0655\u0654\u0001\u0000\u0000\u0000\u0656\u0659\u0001\u0000"+ - "\u0000\u0000\u0657\u0655\u0001\u0000\u0000\u0000\u0657\u0658\u0001\u0000"+ - "\u0000\u0000\u0658\u065a\u0001\u0000\u0000\u0000\u0659\u0657\u0001\u0000"+ - "\u0000\u0000\u065a\u065b\u0005k\u0000\u0000\u065b\u0121\u0001\u0000\u0000"+ - "\u0000\u065c\u065d\u0003\u0124\u0092\u0000\u065d\u065f\u0005q\u0000\u0000"+ - "\u065e\u0660\u0003\u00f2y\u0000\u065f\u065e\u0001\u0000\u0000\u0000\u065f"+ - "\u0660\u0001\u0000\u0000\u0000\u0660\u0123\u0001\u0000\u0000\u0000\u0661"+ - "\u0664\u0005R\u0000\u0000\u0662\u0665\u0003\u00f8|\u0000\u0663\u0665\u0003"+ - "\u0126\u0093\u0000\u0664\u0662\u0001\u0000\u0000\u0000\u0664\u0663\u0001"+ - "\u0000\u0000\u0000\u0665\u0668\u0001\u0000\u0000\u0000\u0666\u0668\u0005"+ - "N\u0000\u0000\u0667\u0661\u0001\u0000\u0000\u0000\u0667\u0666\u0001\u0000"+ - "\u0000\u0000\u0668\u0125\u0001\u0000\u0000\u0000\u0669\u066a\u0003\u00e8"+ - "t\u0000\u066a\u066b\u0005n\u0000\u0000\u066b\u0670\u0001\u0000\u0000\u0000"+ - "\u066c\u066d\u0003\u00e6s\u0000\u066d\u066e\u0005u\u0000\u0000\u066e\u0670"+ - "\u0001\u0000\u0000\u0000\u066f\u0669\u0001\u0000\u0000\u0000\u066f\u066c"+ - "\u0001\u0000\u0000\u0000\u066f\u0670\u0001\u0000\u0000\u0000\u0670\u0671"+ - "\u0001\u0000\u0000\u0000\u0671\u0672\u0003\u00a6S\u0000\u0672\u0127\u0001"+ - "\u0000\u0000\u0000\u0673\u067b\u0005b\u0000\u0000\u0674\u0676\u0003\u00a6"+ - "S\u0000\u0675\u0674\u0001\u0000\u0000\u0000\u0675\u0676\u0001\u0000\u0000"+ - "\u0000\u0676\u067c\u0001\u0000\u0000\u0000\u0677\u067c\u0003\u012a\u0095"+ - "\u0000\u0678\u067a\u0003\u00dam\u0000\u0679\u0678\u0001\u0000\u0000\u0000"+ - "\u0679\u067a\u0001\u0000\u0000\u0000\u067a\u067c\u0001\u0000\u0000\u0000"+ - "\u067b\u0675\u0001\u0000\u0000\u0000\u067b\u0677\u0001\u0000\u0000\u0000"+ - "\u067b\u0679\u0001\u0000\u0000\u0000\u067c\u067d\u0001\u0000\u0000\u0000"+ - "\u067d\u067e\u0003\u00f0x\u0000\u067e\u0129\u0001\u0000\u0000\u0000\u067f"+ - "\u0681\u0003\u00f4z\u0000\u0680\u067f\u0001\u0000\u0000\u0000\u0680\u0681"+ - "\u0001\u0000\u0000\u0000\u0681\u0682\u0001\u0000\u0000\u0000\u0682\u0684"+ - "\u0003\u0172\u00b9\u0000\u0683\u0685\u0003\u00a6S\u0000\u0684\u0683\u0001"+ - "\u0000\u0000\u0000\u0684\u0685\u0001\u0000\u0000\u0000\u0685\u0686\u0001"+ - "\u0000\u0000\u0000\u0686\u0688\u0003\u0172\u00b9\u0000\u0687\u0689\u0003"+ - "\u00f4z\u0000\u0688\u0687\u0001\u0000\u0000\u0000\u0688\u0689\u0001\u0000"+ - "\u0000\u0000\u0689\u012b\u0001\u0000\u0000\u0000\u068a\u068b\u0005T\u0000"+ - "\u0000\u068b\u068c\u0003\u00a6S\u0000\u068c\u012d\u0001\u0000\u0000\u0000"+ - "\u068d\u0690\u0003\u0152\u00a9\u0000\u068e\u0690\u0005g\u0000\u0000\u068f"+ - "\u068d\u0001\u0000\u0000\u0000\u068f\u068e\u0001\u0000\u0000\u0000\u0690"+ - "\u012f\u0001\u0000\u0000\u0000\u0691\u0692\u0005l\u0000\u0000\u0692\u0693"+ - "\u0003\u0132\u0099\u0000\u0693\u0694\u0005m\u0000\u0000\u0694\u0695\u0003"+ - "\u0134\u009a\u0000\u0695\u0131\u0001\u0000\u0000\u0000\u0696\u0697\u0003"+ - "\u00a6S\u0000\u0697\u0133\u0001\u0000\u0000\u0000\u0698\u0699\u0003\u00c4"+ - "b\u0000\u0699\u0135\u0001\u0000\u0000\u0000\u069a\u069b\u0005\u0089\u0000"+ - "\u0000\u069b\u069c\u0003\u00c4b\u0000\u069c\u0137\u0001\u0000\u0000\u0000"+ - "\u069d\u069e\u0005l\u0000\u0000\u069e\u069f\u0005m\u0000\u0000\u069f\u06a0"+ - "\u0003\u0134\u009a\u0000\u06a0\u0139\u0001\u0000\u0000\u0000\u06a1\u06a2"+ - "\u0005U\u0000\u0000\u06a2\u06a3\u0005l\u0000\u0000\u06a3\u06a4\u0003\u00c4"+ - "b\u0000\u06a4\u06a5\u0005m\u0000\u0000\u06a5\u06a6\u0003\u0134\u009a\u0000"+ - "\u06a6\u013b\u0001\u0000\u0000\u0000\u06a7\u06ad\u0005W\u0000\u0000\u06a8"+ - "\u06a9\u0005W\u0000\u0000\u06a9\u06ad\u0005\u008b\u0000\u0000\u06aa\u06ab"+ - "\u0005\u008b\u0000\u0000\u06ab\u06ad\u0005W\u0000\u0000\u06ac\u06a7\u0001"+ - "\u0000\u0000\u0000\u06ac\u06a8\u0001\u0000\u0000\u0000\u06ac\u06aa\u0001"+ - "\u0000\u0000\u0000\u06ad\u06ae\u0001\u0000\u0000\u0000\u06ae\u06af\u0003"+ - "\u0134\u009a\u0000\u06af\u013d\u0001\u0000\u0000\u0000\u06b0\u06b1\u0005"+ - "O\u0000\u0000\u06b1\u06b2\u0003\u0140\u00a0\u0000\u06b2\u013f\u0001\u0000"+ - "\u0000\u0000\u06b3\u06b4\u0003\u0144\u00a2\u0000\u06b4\u06b5\u0003\u0142"+ - "\u00a1\u0000\u06b5\u06b8\u0001\u0000\u0000\u0000\u06b6\u06b8\u0003\u0144"+ - "\u00a2\u0000\u06b7\u06b3\u0001\u0000\u0000\u0000\u06b7\u06b6\u0001\u0000"+ - "\u0000\u0000\u06b8\u0141\u0001\u0000\u0000\u0000\u06b9\u06bc\u0003\u0144"+ - "\u00a2\u0000\u06ba\u06bc\u0003\u00c4b\u0000\u06bb\u06b9\u0001\u0000\u0000"+ - "\u0000\u06bb\u06ba\u0001\u0000\u0000\u0000\u06bc\u0143\u0001\u0000\u0000"+ - "\u0000\u06bd\u06c9\u0005h\u0000\u0000\u06be\u06c3\u0003\u009eO\u0000\u06bf"+ - "\u06c0\u0005o\u0000\u0000\u06c0\u06c2\u0003\u009eO\u0000\u06c1\u06bf\u0001"+ - "\u0000\u0000\u0000\u06c2\u06c5\u0001\u0000\u0000\u0000\u06c3\u06c1\u0001"+ - "\u0000\u0000\u0000\u06c3\u06c4\u0001\u0000\u0000\u0000\u06c4\u06c7\u0001"+ - "\u0000\u0000\u0000\u06c5\u06c3\u0001\u0000\u0000\u0000\u06c6\u06c8\u0005"+ - "o\u0000\u0000\u06c7\u06c6\u0001\u0000\u0000\u0000\u06c7\u06c8\u0001\u0000"+ - "\u0000\u0000\u06c8\u06ca\u0001\u0000\u0000\u0000\u06c9\u06be\u0001\u0000"+ - "\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000"+ - "\u0000\u0000\u06cb\u06cc\u0005i\u0000\u0000\u06cc\u0145\u0001\u0000\u0000"+ - "\u0000\u06cd\u06ce\u0003\u0148\u00a4\u0000\u06ce\u06cf\u0005h\u0000\u0000"+ - "\u06cf\u06d1\u0003\u00a6S\u0000\u06d0\u06d2\u0005o\u0000\u0000\u06d1\u06d0"+ - "\u0001\u0000\u0000\u0000\u06d1\u06d2\u0001\u0000\u0000\u0000\u06d2\u06d3"+ - "\u0001\u0000\u0000\u0000\u06d3\u06d4\u0005i\u0000\u0000\u06d4\u0147\u0001"+ - "\u0000\u0000\u0000\u06d5\u06db\u0003\u00c6c\u0000\u06d6\u06d7\u0005h\u0000"+ - "\u0000\u06d7\u06d8\u0003\u0148\u00a4\u0000\u06d8\u06d9\u0005i\u0000\u0000"+ - "\u06d9\u06db\u0001\u0000\u0000\u0000\u06da\u06d5\u0001\u0000\u0000\u0000"+ - "\u06da\u06d6\u0001\u0000\u0000\u0000\u06db\u0149\u0001\u0000\u0000\u0000"+ - "\u06dc\u06e3\u0003\u014c\u00a6\u0000\u06dd\u06e3\u0003\u0150\u00a8\u0000"+ - "\u06de\u06df\u0005h\u0000\u0000\u06df\u06e0\u0003\u00a6S\u0000\u06e0\u06e1"+ - "\u0005i\u0000\u0000\u06e1\u06e3\u0001\u0000\u0000\u0000\u06e2\u06dc\u0001"+ - "\u0000\u0000\u0000\u06e2\u06dd\u0001\u0000\u0000\u0000\u06e2\u06de\u0001"+ - "\u0000\u0000\u0000\u06e3\u014b\u0001\u0000\u0000\u0000\u06e4\u06e8\u0003"+ - "\u00b4Z\u0000\u06e5\u06e8\u0003\u0154\u00aa\u0000\u06e6\u06e8\u0003\u00b8"+ - "\\\u0000\u06e7\u06e4\u0001\u0000\u0000\u0000\u06e7\u06e5\u0001\u0000\u0000"+ - "\u0000\u06e7\u06e6\u0001\u0000\u0000\u0000\u06e8\u014d\u0001\u0000\u0000"+ - "\u0000\u06e9\u06ea\u0007\u0011\u0000\u0000\u06ea\u014f\u0001\u0000\u0000"+ - "\u0000\u06eb\u06ec\u0005g\u0000\u0000\u06ec\u0151\u0001\u0000\u0000\u0000"+ - "\u06ed\u06ee\u0005g\u0000\u0000\u06ee\u06ef\u0005r\u0000\u0000\u06ef\u06f0"+ - "\u0005g\u0000\u0000\u06f0\u0153\u0001\u0000\u0000\u0000\u06f1\u06f2\u0003"+ - "\u00ccf\u0000\u06f2\u06f3\u0003\u0156\u00ab\u0000\u06f3\u0155\u0001\u0000"+ - "\u0000\u0000\u06f4\u06f9\u0005j\u0000\u0000\u06f5\u06f7\u0003\u0158\u00ac"+ - "\u0000\u06f6\u06f8\u0005o\u0000\u0000\u06f7\u06f6\u0001\u0000\u0000\u0000"+ - "\u06f7\u06f8\u0001\u0000\u0000\u0000\u06f8\u06fa\u0001\u0000\u0000\u0000"+ - "\u06f9\u06f5\u0001\u0000\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000"+ - "\u06fa\u06fb\u0001\u0000\u0000\u0000\u06fb\u06fc\u0005k\u0000\u0000\u06fc"+ - "\u0157\u0001\u0000\u0000\u0000\u06fd\u0702\u0003\u015a\u00ad\u0000\u06fe"+ - "\u06ff\u0005o\u0000\u0000\u06ff\u0701\u0003\u015a\u00ad\u0000\u0700\u06fe"+ - "\u0001\u0000\u0000\u0000\u0701\u0704\u0001\u0000\u0000\u0000\u0702\u0700"+ - "\u0001\u0000\u0000\u0000\u0702\u0703\u0001\u0000\u0000\u0000\u0703\u0159"+ - "\u0001\u0000\u0000\u0000\u0704\u0702\u0001\u0000\u0000\u0000\u0705\u0706"+ - "\u0003\u015c\u00ae\u0000\u0706\u0707\u0005q\u0000\u0000\u0707\u0709\u0001"+ - "\u0000\u0000\u0000\u0708\u0705\u0001\u0000\u0000\u0000\u0708\u0709\u0001"+ - "\u0000\u0000\u0000\u0709\u070a\u0001\u0000\u0000\u0000\u070a\u070b\u0003"+ - "\u015e\u00af\u0000\u070b\u015b\u0001\u0000\u0000\u0000\u070c\u070f\u0003"+ - "\u00a6S\u0000\u070d\u070f\u0003\u0156\u00ab\u0000\u070e\u070c\u0001\u0000"+ - "\u0000\u0000\u070e\u070d\u0001\u0000\u0000\u0000\u070f\u015d\u0001\u0000"+ - "\u0000\u0000\u0710\u0713\u0003\u00a6S\u0000\u0711\u0713\u0003\u0156\u00ab"+ - "\u0000\u0712\u0710\u0001\u0000\u0000\u0000\u0712\u0711\u0001\u0000\u0000"+ - "\u0000\u0713\u015f\u0001\u0000\u0000\u0000\u0714\u0715\u0005V\u0000\u0000"+ - "\u0715\u071b\u0005j\u0000\u0000\u0716\u0717\u0003\u0162\u00b1\u0000\u0717"+ - "\u0718\u0003\u0172\u00b9\u0000\u0718\u071a\u0001\u0000\u0000\u0000\u0719"+ - "\u0716\u0001\u0000\u0000\u0000\u071a\u071d\u0001\u0000\u0000\u0000\u071b"+ - "\u0719\u0001\u0000\u0000\u0000\u071b\u071c\u0001\u0000\u0000\u0000\u071c"+ - "\u071e\u0001\u0000\u0000\u0000\u071d\u071b\u0001\u0000\u0000\u0000\u071e"+ - "\u071f\u0005k\u0000\u0000\u071f\u0161\u0001\u0000\u0000\u0000\u0720\u0721"+ - "\u0003\u00e6s\u0000\u0721\u0722\u0003\u00c4b\u0000\u0722\u0725\u0001\u0000"+ - "\u0000\u0000\u0723\u0725\u0003\u0166\u00b3\u0000\u0724\u0720\u0001\u0000"+ - "\u0000\u0000\u0724\u0723\u0001\u0000\u0000\u0000\u0725\u0727\u0001\u0000"+ - "\u0000\u0000\u0726\u0728\u0003\u0164\u00b2\u0000\u0727\u0726\u0001\u0000"+ - "\u0000\u0000\u0727\u0728\u0001\u0000\u0000\u0000\u0728\u0163\u0001\u0000"+ - "\u0000\u0000\u0729\u072a\u0007\u0012\u0000\u0000\u072a\u0165\u0001\u0000"+ - "\u0000\u0000\u072b\u072d\u0005\u0089\u0000\u0000\u072c\u072b\u0001\u0000"+ - "\u0000\u0000\u072c\u072d\u0001\u0000\u0000\u0000\u072d\u072e\u0001\u0000"+ - "\u0000\u0000\u072e\u072f\u0003\u012e\u0097\u0000\u072f\u0167\u0001\u0000"+ - "\u0000\u0000\u0730\u0731\u0005l\u0000\u0000\u0731\u0732\u0003\u00a6S\u0000"+ - "\u0732\u0733\u0005m\u0000\u0000\u0733\u0169\u0001\u0000\u0000\u0000\u0734"+ - "\u0735\u0005r\u0000\u0000\u0735\u0736\u0005h\u0000\u0000\u0736\u0737\u0003"+ - "\u00c4b\u0000\u0737\u0738\u0005i\u0000\u0000\u0738\u016b\u0001\u0000\u0000"+ - "\u0000\u0739\u0748\u0005h\u0000\u0000\u073a\u0741\u0003\u00e8t\u0000\u073b"+ - "\u073e\u0003\u0148\u00a4\u0000\u073c\u073d\u0005o\u0000\u0000\u073d\u073f"+ - "\u0003\u00e8t\u0000\u073e\u073c\u0001\u0000\u0000\u0000\u073e\u073f\u0001"+ - "\u0000\u0000\u0000\u073f\u0741\u0001\u0000\u0000\u0000\u0740\u073a\u0001"+ - "\u0000\u0000\u0000\u0740\u073b\u0001\u0000\u0000\u0000\u0741\u0743\u0001"+ - "\u0000\u0000\u0000\u0742\u0744\u0005v\u0000\u0000\u0743\u0742\u0001\u0000"+ - "\u0000\u0000\u0743\u0744\u0001\u0000\u0000\u0000\u0744\u0746\u0001\u0000"+ - "\u0000\u0000\u0745\u0747\u0005o\u0000\u0000\u0746\u0745\u0001\u0000\u0000"+ - "\u0000\u0746\u0747\u0001\u0000\u0000\u0000\u0747\u0749\u0001\u0000\u0000"+ - "\u0000\u0748\u0740\u0001\u0000\u0000\u0000\u0748\u0749\u0001\u0000\u0000"+ - "\u0000\u0749\u074a\u0001\u0000\u0000\u0000\u074a\u074b\u0005i\u0000\u0000"+ - "\u074b\u016d\u0001\u0000\u0000\u0000\u074c\u074d\u0003\u0148\u00a4\u0000"+ - "\u074d\u074e\u0005r\u0000\u0000\u074e\u074f\u0005g\u0000\u0000\u074f\u016f"+ - "\u0001\u0000\u0000\u0000\u0750\u0751\u0003\u00c4b\u0000\u0751\u0171\u0001"+ - "\u0000\u0000\u0000\u0752\u0757\u0005p\u0000\u0000\u0753\u0757\u0005\u0000"+ - "\u0000\u0001\u0754\u0757\u0005\u00a1\u0000\u0000\u0755\u0757\u0004\u00b9"+ - "\u0013\u0000\u0756\u0752\u0001\u0000\u0000\u0000\u0756\u0753\u0001\u0000"+ - "\u0000\u0000\u0756\u0754\u0001\u0000\u0000\u0000\u0756\u0755\u0001\u0000"+ - "\u0000\u0000\u0757\u0173\u0001\u0000\u0000\u0000\u00c2\u0182\u0187\u018e"+ - "\u0198\u019e\u01a4\u01ae\u01b8\u01c6\u01ca\u01d3\u01df\u01e3\u01e9\u01f2"+ - "\u01fc\u020d\u021b\u021f\u0226\u022e\u0237\u0257\u025f\u0277\u028a\u0299"+ - "\u02a6\u02af\u02bd\u02c6\u02d2\u02d8\u02ec\u02f5\u02fa\u02ff\u0309\u030c"+ - "\u0310\u0314\u031c\u0324\u0329\u0331\u0333\u0338\u033f\u0347\u034a\u0350"+ - "\u0355\u0357\u035a\u0361\u0366\u0379\u0381\u0385\u0388\u038e\u0392\u0395"+ - "\u039f\u03a6\u03ad\u03b9\u03bf\u03c6\u03cb\u03d1\u03dd\u03e3\u03e7\u03ef"+ - "\u03f3\u03f9\u03fc\u0402\u0407\u0420\u0443\u0445\u045c\u0464\u046f\u0476"+ - "\u047d\u0487\u0499\u04af\u04b1\u04b9\u04bd\u04c1\u04c4\u04cd\u04d3\u04dd"+ - "\u04e5\u04eb\u04f4\u04ff\u050a\u050e\u0510\u051b\u0524\u0528\u052b\u0532"+ - "\u053d\u0547\u054d\u054f\u0559\u0563\u0567\u056b\u056f\u0576\u057e\u0589"+ - "\u058d\u0591\u059d\u05a1\u05a5\u05aa\u05ad\u05b0\u05b7\u05be\u05d2\u05d6"+ - "\u05da\u05de\u05ee\u05f4\u05f6\u05fa\u05fe\u0601\u0605\u0607\u060d\u0615"+ - "\u061a\u0625\u062b\u0632\u063d\u0642\u0646\u064b\u064f\u0657\u065f\u0664"+ - "\u0667\u066f\u0675\u0679\u067b\u0680\u0684\u0688\u068f\u06ac\u06b7\u06bb"+ - "\u06c3\u06c7\u06c9\u06d1\u06da\u06e2\u06e7\u06f7\u06f9\u0702\u0708\u070e"+ - "\u0712\u071b\u0724\u0727\u072c\u073e\u0740\u0743\u0746\u0748\u0756"; + "\u0172\u0174\u0000\u0013\u0002\u0000hhss\u0001\u0000\u0017\u0018\u0001"+ + "\u0000\u0005\b\u0001\u0000BC\u0001\u0000(*\u0002\u0000(*,,\u0001\u0000"+ + "\u0086\u008c\u0001\u0000\u0014\u0015\u0002\u0000\u0081\u0085\u008a\u008b"+ + "\u0004\u0000##tt\u0080\u0080\u0087\u0089\u0001\u0000\u001f!\u0001\u0000"+ + "\u001c\u001e\u0002\u0000IJz\u007f\u0004\u0000..1144``\u0002\u0000\u0080"+ + "\u0085\u0087\u008b\u0001\u0000tu\u0002\u0000qq\u00a2\u00a2\u0002\u0000"+ + "\u008d\u0090\u0092\u0093\u0001\u0000\u0099\u009a\u07cc\u0000\u0176\u0001"+ + "\u0000\u0000\u0000\u0002\u0179\u0001\u0000\u0000\u0000\u0004\u017c\u0001"+ + "\u0000\u0000\u0000\u0006\u017f\u0001\u0000\u0000\u0000\b\u0187\u0001\u0000"+ + "\u0000\u0000\n\u0190\u0001\u0000\u0000\u0000\f\u01b0\u0001\u0000\u0000"+ + "\u0000\u000e\u01bd\u0001\u0000\u0000\u0000\u0010\u01c0\u0001\u0000\u0000"+ + "\u0000\u0012\u01c8\u0001\u0000\u0000\u0000\u0014\u01d5\u0001\u0000\u0000"+ + "\u0000\u0016\u01eb\u0001\u0000\u0000\u0000\u0018\u01f4\u0001\u0000\u0000"+ + "\u0000\u001a\u01f6\u0001\u0000\u0000\u0000\u001c\u01f8\u0001\u0000\u0000"+ + "\u0000\u001e\u01fb\u0001\u0000\u0000\u0000 \u020f\u0001\u0000\u0000\u0000"+ + "\"\u0211\u0001\u0000\u0000\u0000$\u0213\u0001\u0000\u0000\u0000&\u0218"+ + "\u0001\u0000\u0000\u0000(\u0223\u0001\u0000\u0000\u0000*\u0230\u0001\u0000"+ + "\u0000\u0000,\u0233\u0001\u0000\u0000\u0000.\u023e\u0001\u0000\u0000\u0000"+ + "0\u0240\u0001\u0000\u0000\u00002\u0245\u0001\u0000\u0000\u00004\u024a"+ + "\u0001\u0000\u0000\u00006\u024f\u0001\u0000\u0000\u00008\u0254\u0001\u0000"+ + "\u0000\u0000:\u0261\u0001\u0000\u0000\u0000<\u0263\u0001\u0000\u0000\u0000"+ + ">\u0265\u0001\u0000\u0000\u0000@\u026a\u0001\u0000\u0000\u0000B\u026f"+ + "\u0001\u0000\u0000\u0000D\u0274\u0001\u0000\u0000\u0000F\u027d\u0001\u0000"+ + "\u0000\u0000H\u0284\u0001\u0000\u0000\u0000J\u0291\u0001\u0000\u0000\u0000"+ + "L\u0295\u0001\u0000\u0000\u0000N\u02a0\u0001\u0000\u0000\u0000P\u02a9"+ + "\u0001\u0000\u0000\u0000R\u02ab\u0001\u0000\u0000\u0000T\u02c0\u0001\u0000"+ + "\u0000\u0000V\u02c2\u0001\u0000\u0000\u0000X\u02ce\u0001\u0000\u0000\u0000"+ + "Z\u02db\u0001\u0000\u0000\u0000\\\u02df\u0001\u0000\u0000\u0000^\u02e4"+ + "\u0001\u0000\u0000\u0000`\u02f4\u0001\u0000\u0000\u0000b\u0302\u0001\u0000"+ + "\u0000\u0000d\u0311\u0001\u0000\u0000\u0000f\u0314\u0001\u0000\u0000\u0000"+ + "h\u031c\u0001\u0000\u0000\u0000j\u031e\u0001\u0000\u0000\u0000l\u0329"+ + "\u0001\u0000\u0000\u0000n\u0331\u0001\u0000\u0000\u0000p\u0340\u0001\u0000"+ + "\u0000\u0000r\u0342\u0001\u0000\u0000\u0000t\u034a\u0001\u0000\u0000\u0000"+ + "v\u0358\u0001\u0000\u0000\u0000x\u0364\u0001\u0000\u0000\u0000z\u036e"+ + "\u0001\u0000\u0000\u0000|\u0372\u0001\u0000\u0000\u0000~\u0378\u0001\u0000"+ + "\u0000\u0000\u0080\u0390\u0001\u0000\u0000\u0000\u0082\u0398\u0001\u0000"+ + "\u0000\u0000\u0084\u03a7\u0001\u0000\u0000\u0000\u0086\u03a9\u0001\u0000"+ + "\u0000\u0000\u0088\u03b0\u0001\u0000\u0000\u0000\u008a\u03b9\u0001\u0000"+ + "\u0000\u0000\u008c\u03be\u0001\u0000\u0000\u0000\u008e\u03c3\u0001\u0000"+ + "\u0000\u0000\u0090\u03c9\u0001\u0000\u0000\u0000\u0092\u03d0\u0001\u0000"+ + "\u0000\u0000\u0094\u03d5\u0001\u0000\u0000\u0000\u0096\u03db\u0001\u0000"+ + "\u0000\u0000\u0098\u03e0\u0001\u0000\u0000\u0000\u009a\u03e7\u0001\u0000"+ + "\u0000\u0000\u009c\u03f1\u0001\u0000\u0000\u0000\u009e\u03f5\u0001\u0000"+ + "\u0000\u0000\u00a0\u0401\u0001\u0000\u0000\u0000\u00a2\u0404\u0001\u0000"+ + "\u0000\u0000\u00a4\u0408\u0001\u0000\u0000\u0000\u00a6\u040f\u0001\u0000"+ + "\u0000\u0000\u00a8\u0428\u0001\u0000\u0000\u0000\u00aa\u0464\u0001\u0000"+ + "\u0000\u0000\u00ac\u0466\u0001\u0000\u0000\u0000\u00ae\u0469\u0001\u0000"+ + "\u0000\u0000\u00b0\u046e\u0001\u0000\u0000\u0000\u00b2\u0477\u0001\u0000"+ + "\u0000\u0000\u00b4\u0485\u0001\u0000\u0000\u0000\u00b6\u048f\u0001\u0000"+ + "\u0000\u0000\u00b8\u04a1\u0001\u0000\u0000\u0000\u00ba\u04bc\u0001\u0000"+ + "\u0000\u0000\u00bc\u04bf\u0001\u0000\u0000\u0000\u00be\u04c7\u0001\u0000"+ + "\u0000\u0000\u00c0\u04d0\u0001\u0000\u0000\u0000\u00c2\u04e0\u0001\u0000"+ + "\u0000\u0000\u00c4\u04f3\u0001\u0000\u0000\u0000\u00c6\u04fc\u0001\u0000"+ + "\u0000\u0000\u00c8\u0507\u0001\u0000\u0000\u0000\u00ca\u0509\u0001\u0000"+ + "\u0000\u0000\u00cc\u050c\u0001\u0000\u0000\u0000\u00ce\u0523\u0001\u0000"+ + "\u0000\u0000\u00d0\u0525\u0001\u0000\u0000\u0000\u00d2\u052a\u0001\u0000"+ + "\u0000\u0000\u00d4\u053e\u0001\u0000\u0000\u0000\u00d6\u0540\u0001\u0000"+ + "\u0000\u0000\u00d8\u0542\u0001\u0000\u0000\u0000\u00da\u0545\u0001\u0000"+ + "\u0000\u0000\u00dc\u054f\u0001\u0000\u0000\u0000\u00de\u0559\u0001\u0000"+ + "\u0000\u0000\u00e0\u055c\u0001\u0000\u0000\u0000\u00e2\u0561\u0001\u0000"+ + "\u0000\u0000\u00e4\u0563\u0001\u0000\u0000\u0000\u00e6\u0571\u0001\u0000"+ + "\u0000\u0000\u00e8\u0579\u0001\u0000\u0000\u0000\u00ea\u0581\u0001\u0000"+ + "\u0000\u0000\u00ec\u0589\u0001\u0000\u0000\u0000\u00ee\u0597\u0001\u0000"+ + "\u0000\u0000\u00f0\u059d\u0001\u0000\u0000\u0000\u00f2\u05ab\u0001\u0000"+ + "\u0000\u0000\u00f4\u05bd\u0001\u0000\u0000\u0000\u00f6\u05c6\u0001\u0000"+ + "\u0000\u0000\u00f8\u05c8\u0001\u0000\u0000\u0000\u00fa\u05ca\u0001\u0000"+ + "\u0000\u0000\u00fc\u05ce\u0001\u0000\u0000\u0000\u00fe\u05d1\u0001\u0000"+ + "\u0000\u0000\u0100\u05d5\u0001\u0000\u0000\u0000\u0102\u05d7\u0001\u0000"+ + "\u0000\u0000\u0104\u05dc\u0001\u0000\u0000\u0000\u0106\u05e0\u0001\u0000"+ + "\u0000\u0000\u0108\u05e4\u0001\u0000\u0000\u0000\u010a\u05e8\u0001\u0000"+ + "\u0000\u0000\u010c\u05eb\u0001\u0000\u0000\u0000\u010e\u05ed\u0001\u0000"+ + "\u0000\u0000\u0110\u0602\u0001\u0000\u0000\u0000\u0112\u0604\u0001\u0000"+ + "\u0000\u0000\u0114\u061a\u0001\u0000\u0000\u0000\u0116\u0622\u0001\u0000"+ + "\u0000\u0000\u0118\u0624\u0001\u0000\u0000\u0000\u011a\u063a\u0001\u0000"+ + "\u0000\u0000\u011c\u0642\u0001\u0000\u0000\u0000\u011e\u064a\u0001\u0000"+ + "\u0000\u0000\u0120\u064e\u0001\u0000\u0000\u0000\u0122\u065a\u0001\u0000"+ + "\u0000\u0000\u0124\u0664\u0001\u0000\u0000\u0000\u0126\u066f\u0001\u0000"+ + "\u0000\u0000\u0128\u0677\u0001\u0000\u0000\u0000\u012a\u067b\u0001\u0000"+ + "\u0000\u0000\u012c\u0688\u0001\u0000\u0000\u0000\u012e\u0692\u0001\u0000"+ + "\u0000\u0000\u0130\u0697\u0001\u0000\u0000\u0000\u0132\u0699\u0001\u0000"+ + "\u0000\u0000\u0134\u069e\u0001\u0000\u0000\u0000\u0136\u06a0\u0001\u0000"+ + "\u0000\u0000\u0138\u06a2\u0001\u0000\u0000\u0000\u013a\u06a5\u0001\u0000"+ + "\u0000\u0000\u013c\u06a9\u0001\u0000\u0000\u0000\u013e\u06b4\u0001\u0000"+ + "\u0000\u0000\u0140\u06b8\u0001\u0000\u0000\u0000\u0142\u06bf\u0001\u0000"+ + "\u0000\u0000\u0144\u06c3\u0001\u0000\u0000\u0000\u0146\u06c5\u0001\u0000"+ + "\u0000\u0000\u0148\u06d5\u0001\u0000\u0000\u0000\u014a\u06e2\u0001\u0000"+ + "\u0000\u0000\u014c\u06ea\u0001\u0000\u0000\u0000\u014e\u06ef\u0001\u0000"+ + "\u0000\u0000\u0150\u06f1\u0001\u0000\u0000\u0000\u0152\u06f3\u0001\u0000"+ + "\u0000\u0000\u0154\u06f5\u0001\u0000\u0000\u0000\u0156\u06f9\u0001\u0000"+ + "\u0000\u0000\u0158\u06fc\u0001\u0000\u0000\u0000\u015a\u0705\u0001\u0000"+ + "\u0000\u0000\u015c\u0710\u0001\u0000\u0000\u0000\u015e\u0716\u0001\u0000"+ + "\u0000\u0000\u0160\u071a\u0001\u0000\u0000\u0000\u0162\u071c\u0001\u0000"+ + "\u0000\u0000\u0164\u072c\u0001\u0000\u0000\u0000\u0166\u0731\u0001\u0000"+ + "\u0000\u0000\u0168\u0734\u0001\u0000\u0000\u0000\u016a\u0738\u0001\u0000"+ + "\u0000\u0000\u016c\u073c\u0001\u0000\u0000\u0000\u016e\u0741\u0001\u0000"+ + "\u0000\u0000\u0170\u0754\u0001\u0000\u0000\u0000\u0172\u0758\u0001\u0000"+ + "\u0000\u0000\u0174\u075e\u0001\u0000\u0000\u0000\u0176\u0177\u0003\u00a8"+ + "T\u0000\u0177\u0178\u0005\u0000\u0000\u0001\u0178\u0001\u0001\u0000\u0000"+ + "\u0000\u0179\u017a\u0003\u00aaU\u0000\u017a\u017b\u0005\u0000\u0000\u0001"+ + "\u017b\u0003\u0001\u0000\u0000\u0000\u017c\u017d\u0003\u00c6c\u0000\u017d"+ + "\u017e\u0005\u0000\u0000\u0001\u017e\u0005\u0001\u0000\u0000\u0000\u017f"+ + "\u0184\u0003\b\u0004\u0000\u0180\u0181\u0005p\u0000\u0000\u0181\u0183"+ + "\u0003\b\u0004\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0183\u0186\u0001"+ + "\u0000\u0000\u0000\u0184\u0182\u0001\u0000\u0000\u0000\u0184\u0185\u0001"+ + "\u0000\u0000\u0000\u0185\u0007\u0001\u0000\u0000\u0000\u0186\u0184\u0001"+ + "\u0000\u0000\u0000\u0187\u0189\u0005h\u0000\u0000\u0188\u018a\u0005=\u0000"+ + "\u0000\u0189\u0188\u0001\u0000\u0000\u0000\u0189\u018a\u0001\u0000\u0000"+ + "\u0000\u018a\t\u0001\u0000\u0000\u0000\u018b\u018c\u0003\u000e\u0007\u0000"+ + "\u018c\u018d\u0003\u0174\u00ba\u0000\u018d\u018f\u0001\u0000\u0000\u0000"+ + "\u018e\u018b\u0001\u0000\u0000\u0000\u018f\u0192\u0001\u0000\u0000\u0000"+ + "\u0190\u018e\u0001\u0000\u0000\u0000\u0190\u0191\u0001\u0000\u0000\u0000"+ + "\u0191\u0193\u0001\u0000\u0000\u0000\u0192\u0190\u0001\u0000\u0000\u0000"+ + "\u0193\u0194\u0003\u00deo\u0000\u0194\u019a\u0003\u0174\u00ba\u0000\u0195"+ + "\u0196\u0003\u0014\n\u0000\u0196\u0197\u0003\u0174\u00ba\u0000\u0197\u0199"+ + "\u0001\u0000\u0000\u0000\u0198\u0195\u0001\u0000\u0000\u0000\u0199\u019c"+ + "\u0001\u0000\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000\u019a\u019b"+ + "\u0001\u0000\u0000\u0000\u019b\u01a6\u0001\u0000\u0000\u0000\u019c\u019a"+ + "\u0001\u0000\u0000\u0000\u019d\u01a1\u0003\u008cF\u0000\u019e\u01a1\u0003"+ + "\u00e2q\u0000\u019f\u01a1\u0003\u0016\u000b\u0000\u01a0\u019d\u0001\u0000"+ + "\u0000\u0000\u01a0\u019e\u0001\u0000\u0000\u0000\u01a0\u019f\u0001\u0000"+ + "\u0000\u0000\u01a1\u01a2\u0001\u0000\u0000\u0000\u01a2\u01a3\u0003\u0174"+ + "\u00ba\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4\u01a0\u0001\u0000"+ + "\u0000\u0000\u01a5\u01a8\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000"+ + "\u0000\u0000\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a7\u01a9\u0001\u0000"+ + "\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005\u0000"+ + "\u0000\u0001\u01aa\u000b\u0001\u0000\u0000\u0000\u01ab\u01ac\u0003\u000e"+ + "\u0007\u0000\u01ac\u01ad\u0003\u0174\u00ba\u0000\u01ad\u01af\u0001\u0000"+ + "\u0000\u0000\u01ae\u01ab\u0001\u0000\u0000\u0000\u01af\u01b2\u0001\u0000"+ + "\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000\u0000\u01b0\u01b1\u0001\u0000"+ + "\u0000\u0000\u01b1\u01b3\u0001\u0000\u0000\u0000\u01b2\u01b0\u0001\u0000"+ + "\u0000\u0000\u01b3\u01b4\u0003\u00deo\u0000\u01b4\u01ba\u0003\u0174\u00ba"+ + "\u0000\u01b5\u01b6\u0003\u0014\n\u0000\u01b6\u01b7\u0003\u0174\u00ba\u0000"+ + "\u01b7\u01b9\u0001\u0000\u0000\u0000\u01b8\u01b5\u0001\u0000\u0000\u0000"+ + "\u01b9\u01bc\u0001\u0000\u0000\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000"+ + "\u01ba\u01bb\u0001\u0000\u0000\u0000\u01bb\r\u0001\u0000\u0000\u0000\u01bc"+ + "\u01ba\u0001\u0000\u0000\u0000\u01bd\u01be\u0005F\u0000\u0000\u01be\u01bf"+ + "\u0003\u00a8T\u0000\u01bf\u000f\u0001\u0000\u0000\u0000\u01c0\u01c1\u0005"+ + "G\u0000\u0000\u01c1\u01c2\u0003\u00a8T\u0000\u01c2\u0011\u0001\u0000\u0000"+ + "\u0000\u01c3\u01c4\u0003\u0010\b\u0000\u01c4\u01c5\u0003\u0174\u00ba\u0000"+ + "\u01c5\u01c7\u0001\u0000\u0000\u0000\u01c6\u01c3\u0001\u0000\u0000\u0000"+ + "\u01c7\u01ca\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000"+ + "\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9\u01cc\u0001\u0000\u0000\u0000"+ + "\u01ca\u01c8\u0001\u0000\u0000\u0000\u01cb\u01cd\u0007\u0000\u0000\u0000"+ + "\u01cc\u01cb\u0001\u0000\u0000\u0000\u01cc\u01cd\u0001\u0000\u0000\u0000"+ + "\u01cd\u01ce\u0001\u0000\u0000\u0000\u01ce\u01cf\u0003\u00e0p\u0000\u01cf"+ + "\u0013\u0001\u0000\u0000\u0000\u01d0\u01d1\u0003\u0010\b\u0000\u01d1\u01d2"+ + "\u0003\u0174\u00ba\u0000\u01d2\u01d4\u0001\u0000\u0000\u0000\u01d3\u01d0"+ + "\u0001\u0000\u0000\u0000\u01d4\u01d7\u0001\u0000\u0000\u0000\u01d5\u01d3"+ + "\u0001\u0000\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01e5"+ + "\u0001\u0000\u0000\u0000\u01d7\u01d5\u0001\u0000\u0000\u0000\u01d8\u01d9"+ + "\u0005d\u0000\u0000\u01d9\u01e6\u0003\u0012\t\u0000\u01da\u01db\u0005"+ + "d\u0000\u0000\u01db\u01e1\u0005i\u0000\u0000\u01dc\u01dd\u0003\u0012\t"+ + "\u0000\u01dd\u01de\u0003\u0174\u00ba\u0000\u01de\u01e0\u0001\u0000\u0000"+ + "\u0000\u01df\u01dc\u0001\u0000\u0000\u0000\u01e0\u01e3\u0001\u0000\u0000"+ + "\u0000\u01e1\u01df\u0001\u0000\u0000\u0000\u01e1\u01e2\u0001\u0000\u0000"+ + "\u0000\u01e2\u01e4\u0001\u0000\u0000\u0000\u01e3\u01e1\u0001\u0000\u0000"+ + "\u0000\u01e4\u01e6\u0005j\u0000\u0000\u01e5\u01d8\u0001\u0000\u0000\u0000"+ + "\u01e5\u01da\u0001\u0000\u0000\u0000\u01e6\u0015\u0001\u0000\u0000\u0000"+ + "\u01e7\u01ec\u0003~?\u0000\u01e8\u01ec\u0003\u0094J\u0000\u01e9\u01ec"+ + "\u0003\u0098L\u0000\u01ea\u01ec\u0003\u0092I\u0000\u01eb\u01e7\u0001\u0000"+ + "\u0000\u0000\u01eb\u01e8\u0001\u0000\u0000\u0000\u01eb\u01e9\u0001\u0000"+ + "\u0000\u0000\u01eb\u01ea\u0001\u0000\u0000\u0000\u01ec\u0017\u0001\u0000"+ + "\u0000\u0000\u01ed\u01ee\u0005\u001b\u0000\u0000\u01ee\u01f5\u0003\u00aa"+ + "U\u0000\u01ef\u01f0\u0007\u0001\u0000\u0000\u01f0\u01f5\u0003.\u0017\u0000"+ + "\u01f1\u01f2\u0007\u0002\u0000\u0000\u01f2\u01f5\u0003\u00a8T\u0000\u01f3"+ + "\u01f5\u0003j5\u0000\u01f4\u01ed\u0001\u0000\u0000\u0000\u01f4\u01ef\u0001"+ + "\u0000\u0000\u0000\u01f4\u01f1\u0001\u0000\u0000\u0000\u01f4\u01f3\u0001"+ + "\u0000\u0000\u0000\u01f5\u0019\u0001\u0000\u0000\u0000\u01f6\u01f7\u0003"+ + "\u001c\u000e\u0000\u01f7\u001b\u0001\u0000\u0000\u0000\u01f8\u01f9\u0003"+ + "b1\u0000\u01f9\u01fa\u0003\u001e\u000f\u0000\u01fa\u001d\u0001\u0000\u0000"+ + "\u0000\u01fb\u01fc\u0005E\u0000\u0000\u01fc\u01fe\u0005i\u0000\u0000\u01fd"+ + "\u01ff\u0003\u00f4z\u0000\u01fe\u01fd\u0001\u0000\u0000\u0000\u01fe\u01ff"+ + "\u0001\u0000\u0000\u0000\u01ff\u0200\u0001\u0000\u0000\u0000\u0200\u0201"+ + "\u0005j\u0000\u0000\u0201\u001f\u0001\u0000\u0000\u0000\u0202\u0210\u0003"+ + "F#\u0000\u0203\u0210\u0003D\"\u0000\u0204\u0210\u0003B!\u0000\u0205\u0210"+ + "\u0003$\u0012\u0000\u0206\u0210\u0003@ \u0000\u0207\u0210\u00038\u001c"+ + "\u0000\u0208\u0210\u0003>\u001f\u0000\u0209\u0210\u00036\u001b\u0000\u020a"+ + "\u0210\u00032\u0019\u0000\u020b\u0210\u00030\u0018\u0000\u020c\u0210\u0003"+ + "4\u001a\u0000\u020d\u0210\u0003\"\u0011\u0000\u020e\u0210\u0003H$\u0000"+ + "\u020f\u0202\u0001\u0000\u0000\u0000\u020f\u0203\u0001\u0000\u0000\u0000"+ + "\u020f\u0204\u0001\u0000\u0000\u0000\u020f\u0205\u0001\u0000\u0000\u0000"+ + "\u020f\u0206\u0001\u0000\u0000\u0000\u020f\u0207\u0001\u0000\u0000\u0000"+ + "\u020f\u0208\u0001\u0000\u0000\u0000\u020f\u0209\u0001\u0000\u0000\u0000"+ + "\u020f\u020a\u0001\u0000\u0000\u0000\u020f\u020b\u0001\u0000\u0000\u0000"+ + "\u020f\u020c\u0001\u0000\u0000\u0000\u020f\u020d\u0001\u0000\u0000\u0000"+ + "\u020f\u020e\u0001\u0000\u0000\u0000\u0210!\u0001\u0000\u0000\u0000\u0211"+ + "\u0212\u0007\u0003\u0000\u0000\u0212#\u0001\u0000\u0000\u0000\u0213\u0214"+ + "\u0005a\u0000\u0000\u0214\u0215\u0005m\u0000\u0000\u0215\u0216\u0003\u00c6"+ + "c\u0000\u0216\u0217\u0005n\u0000\u0000\u0217%\u0001\u0000\u0000\u0000"+ + "\u0218\u021d\u0003(\u0014\u0000\u0219\u021a\u0005p\u0000\u0000\u021a\u021c"+ + "\u0003(\u0014\u0000\u021b\u0219\u0001\u0000\u0000\u0000\u021c\u021f\u0001"+ + "\u0000\u0000\u0000\u021d\u021b\u0001\u0000\u0000\u0000\u021d\u021e\u0001"+ + "\u0000\u0000\u0000\u021e\u0221\u0001\u0000\u0000\u0000\u021f\u021d\u0001"+ + "\u0000\u0000\u0000\u0220\u0222\u0005p\u0000\u0000\u0221\u0220\u0001\u0000"+ + "\u0000\u0000\u0221\u0222\u0001\u0000\u0000\u0000\u0222\'\u0001\u0000\u0000"+ + "\u0000\u0223\u0228\u0005h\u0000\u0000\u0224\u0225\u0005p\u0000\u0000\u0225"+ + "\u0227\u0005h\u0000\u0000\u0226\u0224\u0001\u0000\u0000\u0000\u0227\u022a"+ + "\u0001\u0000\u0000\u0000\u0228\u0226\u0001\u0000\u0000\u0000\u0228\u0229"+ + "\u0001\u0000\u0000\u0000\u0229\u022b\u0001\u0000\u0000\u0000\u022a\u0228"+ + "\u0001\u0000\u0000\u0000\u022b\u022c\u0003\u0136\u009b\u0000\u022c)\u0001"+ + "\u0000\u0000\u0000\u022d\u022f\u0003,\u0016\u0000\u022e\u022d\u0001\u0000"+ + "\u0000\u0000\u022f\u0232\u0001\u0000\u0000\u0000\u0230\u022e\u0001\u0000"+ + "\u0000\u0000\u0230\u0231\u0001\u0000\u0000\u0000\u0231+\u0001\u0000\u0000"+ + "\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0233\u0234\u0005k\u0000\u0000"+ + "\u0234\u0239\u0003\u00a8T\u0000\u0235\u0236\u0005p\u0000\u0000\u0236\u0238"+ + "\u0003\u00a8T\u0000\u0237\u0235\u0001\u0000\u0000\u0000\u0238\u023b\u0001"+ + "\u0000\u0000\u0000\u0239\u0237\u0001\u0000\u0000\u0000\u0239\u023a\u0001"+ + "\u0000\u0000\u0000\u023a\u023c\u0001\u0000\u0000\u0000\u023b\u0239\u0001"+ + "\u0000\u0000\u0000\u023c\u023d\u0005l\u0000\u0000\u023d-\u0001\u0000\u0000"+ + "\u0000\u023e\u023f\u0003\u00b8\\\u0000\u023f/\u0001\u0000\u0000\u0000"+ + "\u0240\u0241\u00052\u0000\u0000\u0241\u0242\u0005i\u0000\u0000\u0242\u0243"+ + "\u0003\u00a8T\u0000\u0243\u0244\u0005j\u0000\u0000\u02441\u0001\u0000"+ + "\u0000\u0000\u0245\u0246\u00058\u0000\u0000\u0246\u0247\u0005m\u0000\u0000"+ + "\u0247\u0248\u0003\u00c6c\u0000\u0248\u0249\u0005n\u0000\u0000\u02493"+ + "\u0001\u0000\u0000\u0000\u024a\u024b\u00053\u0000\u0000\u024b\u024c\u0005"+ + "i\u0000\u0000\u024c\u024d\u0003\u00a8T\u0000\u024d\u024e\u0005j\u0000"+ + "\u0000\u024e5\u0001\u0000\u0000\u0000\u024f\u0250\u0007\u0004\u0000\u0000"+ + "\u0250\u0251\u0005i\u0000\u0000\u0251\u0252\u0003\u00a8T\u0000\u0252\u0253"+ + "\u0005j\u0000\u0000\u02537\u0001\u0000\u0000\u0000\u0254\u0259\u0005\u0011"+ + "\u0000\u0000\u0255\u0256\u0005m\u0000\u0000\u0256\u0257\u0003:\u001d\u0000"+ + "\u0257\u0258\u0005n\u0000\u0000\u0258\u025a\u0001\u0000\u0000\u0000\u0259"+ + "\u0255\u0001\u0000\u0000\u0000\u0259\u025a\u0001\u0000\u0000\u0000\u025a"+ + "\u025b\u0001\u0000\u0000\u0000\u025b\u025c\u0005i\u0000\u0000\u025c\u025d"+ + "\u0003\u00a8T\u0000\u025d\u025e\u0005j\u0000\u0000\u025e9\u0001\u0000"+ + "\u0000\u0000\u025f\u0262\u0003<\u001e\u0000\u0260\u0262\u0005\u0013\u0000"+ + "\u0000\u0261\u025f\u0001\u0000\u0000\u0000\u0261\u0260\u0001\u0000\u0000"+ + "\u0000\u0262;\u0001\u0000\u0000\u0000\u0263\u0264\u0005h\u0000\u0000\u0264"+ + "=\u0001\u0000\u0000\u0000\u0265\u0266\u0005\u0012\u0000\u0000\u0266\u0267"+ + "\u0005i\u0000\u0000\u0267\u0268\u0003\u00a8T\u0000\u0268\u0269\u0005j"+ + "\u0000\u0000\u0269?\u0001\u0000\u0000\u0000\u026a\u026b\u0005;\u0000\u0000"+ + "\u026b\u026c\u0005i\u0000\u0000\u026c\u026d\u0003\u00a8T\u0000\u026d\u026e"+ + "\u0005j\u0000\u0000\u026eA\u0001\u0000\u0000\u0000\u026f\u0270\u0005:"+ + "\u0000\u0000\u0270\u0271\u0005i\u0000\u0000\u0271\u0272\u0003\u00a8T\u0000"+ + "\u0272\u0273\u0005j\u0000\u0000\u0273C\u0001\u0000\u0000\u0000\u0274\u0275"+ + "\u0005\u0016\u0000\u0000\u0275\u0276\u0005i\u0000\u0000\u0276\u0279\u0003"+ + "\u00a8T\u0000\u0277\u0278\u0005p\u0000\u0000\u0278\u027a\u0003\u00a8T"+ + "\u0000\u0279\u0277\u0001\u0000\u0000\u0000\u0279\u027a\u0001\u0000\u0000"+ + "\u0000\u027a\u027b\u0001\u0000\u0000\u0000\u027b\u027c\u0005j\u0000\u0000"+ + "\u027cE\u0001\u0000\u0000\u0000\u027d\u027e\u0007\u0004\u0000\u0000\u027e"+ + "\u027f\u0005m\u0000\u0000\u027f\u0280\u0003\u00a8T\u0000\u0280\u0281\u0005"+ + ">\u0000\u0000\u0281\u0282\u0003\u00a8T\u0000\u0282\u0283\u0005n\u0000"+ + "\u0000\u0283G\u0001\u0000\u0000\u0000\u0284\u0285\u00057\u0000\u0000\u0285"+ + "\u0286\u0003\u00a8T\u0000\u0286\u028c\u0005k\u0000\u0000\u0287\u0288\u0003"+ + "J%\u0000\u0288\u0289\u0003\u0174\u00ba\u0000\u0289\u028b\u0001\u0000\u0000"+ + "\u0000\u028a\u0287\u0001\u0000\u0000\u0000\u028b\u028e\u0001\u0000\u0000"+ + "\u0000\u028c\u028a\u0001\u0000\u0000\u0000\u028c\u028d\u0001\u0000\u0000"+ + "\u0000\u028d\u028f\u0001\u0000\u0000\u0000\u028e\u028c\u0001\u0000\u0000"+ + "\u0000\u028f\u0290\u0005l\u0000\u0000\u0290I\u0001\u0000\u0000\u0000\u0291"+ + "\u0292\u0003n7\u0000\u0292\u0293\u0005r\u0000\u0000\u0293\u0294\u0003"+ + "\u00a8T\u0000\u0294K\u0001\u0000\u0000\u0000\u0295\u0296\u0005m\u0000"+ + "\u0000\u0296\u029b\u0003N\'\u0000\u0297\u0298\u0005p\u0000\u0000\u0298"+ + "\u029a\u0003N\'\u0000\u0299\u0297\u0001\u0000\u0000\u0000\u029a\u029d"+ + "\u0001\u0000\u0000\u0000\u029b\u0299\u0001\u0000\u0000\u0000\u029b\u029c"+ + "\u0001\u0000\u0000\u0000\u029c\u029e\u0001\u0000\u0000\u0000\u029d\u029b"+ + "\u0001\u0000\u0000\u0000\u029e\u029f\u0005n\u0000\u0000\u029fM\u0001\u0000"+ + "\u0000\u0000\u02a0\u02a1\u0003\u00a8T\u0000\u02a1\u02a2\u0005o\u0000\u0000"+ + "\u02a2\u02a3\u0003\u00a8T\u0000\u02a3O\u0001\u0000\u0000\u0000\u02a4\u02aa"+ + "\u0003`0\u0000\u02a5\u02aa\u0003\\.\u0000\u02a6\u02aa\u0003^/\u0000\u02a7"+ + "\u02aa\u0003R)\u0000\u02a8\u02aa\u0003V+\u0000\u02a9\u02a4\u0001\u0000"+ + "\u0000\u0000\u02a9\u02a5\u0001\u0000\u0000\u0000\u02a9\u02a6\u0001\u0000"+ + "\u0000\u0000\u02a9\u02a7\u0001\u0000\u0000\u0000\u02a9\u02a8\u0001\u0000"+ + "\u0000\u0000\u02aaQ\u0001\u0000\u0000\u0000\u02ab\u02ac\u00054\u0000\u0000"+ + "\u02ac\u02b2\u0005k\u0000\u0000\u02ad\u02ae\u0003T*\u0000\u02ae\u02af"+ + "\u0003\u0174\u00ba\u0000\u02af\u02b1\u0001\u0000\u0000\u0000\u02b0\u02ad"+ + "\u0001\u0000\u0000\u0000\u02b1\u02b4\u0001\u0000\u0000\u0000\u02b2\u02b0"+ + "\u0001\u0000\u0000\u0000\u02b2\u02b3\u0001\u0000\u0000\u0000\u02b3\u02b5"+ + "\u0001\u0000\u0000\u0000\u02b4\u02b2\u0001\u0000\u0000\u0000\u02b5\u02b6"+ + "\u0005l\u0000\u0000\u02b6S\u0001\u0000\u0000\u0000\u02b7\u02b8\u0005P"+ + "\u0000\u0000\u02b8\u02b9\u0005h\u0000\u0000\u02b9\u02c1\u0003\u0142\u00a1"+ + "\u0000\u02ba\u02bb\u00055\u0000\u0000\u02bb\u02bc\u0005k\u0000\u0000\u02bc"+ + "\u02bd\u0003\u00a8T\u0000\u02bd\u02be\u0003\u0174\u00ba\u0000\u02be\u02bf"+ + "\u0005l\u0000\u0000\u02bf\u02c1\u0001\u0000\u0000\u0000\u02c0\u02b7\u0001"+ + "\u0000\u0000\u0000\u02c0\u02ba\u0001\u0000\u0000\u0000\u02c1U\u0001\u0000"+ + "\u0000\u0000\u02c2\u02c3\u00056\u0000\u0000\u02c3\u02c9\u0005k\u0000\u0000"+ + "\u02c4\u02c5\u0003X,\u0000\u02c5\u02c6\u0003\u0174\u00ba\u0000\u02c6\u02c8"+ + "\u0001\u0000\u0000\u0000\u02c7\u02c4\u0001\u0000\u0000\u0000\u02c8\u02cb"+ + "\u0001\u0000\u0000\u0000\u02c9\u02c7\u0001\u0000\u0000\u0000\u02c9\u02ca"+ + "\u0001\u0000\u0000\u0000\u02ca\u02cc\u0001\u0000\u0000\u0000\u02cb\u02c9"+ + "\u0001\u0000\u0000\u0000\u02cc\u02cd\u0005l\u0000\u0000\u02cdW\u0001\u0000"+ + "\u0000\u0000\u02ce\u02cf\u0005h\u0000\u0000\u02cf\u02d5\u0005k\u0000\u0000"+ + "\u02d0\u02d1\u0003Z-\u0000\u02d1\u02d2\u0003\u0174\u00ba\u0000\u02d2\u02d4"+ + "\u0001\u0000\u0000\u0000\u02d3\u02d0\u0001\u0000\u0000\u0000\u02d4\u02d7"+ + "\u0001\u0000\u0000\u0000\u02d5\u02d3\u0001\u0000\u0000\u0000\u02d5\u02d6"+ + "\u0001\u0000\u0000\u0000\u02d6\u02d8\u0001\u0000\u0000\u0000\u02d7\u02d5"+ + "\u0001\u0000\u0000\u0000\u02d8\u02d9\u0005l\u0000\u0000\u02d9Y\u0001\u0000"+ + "\u0000\u0000\u02da\u02dc\u0003\u00e8t\u0000\u02db\u02da\u0001\u0000\u0000"+ + "\u0000\u02db\u02dc\u0001\u0000\u0000\u0000\u02dc\u02dd\u0001\u0000\u0000"+ + "\u0000\u02dd\u02de\u0003\u00c6c\u0000\u02de[\u0001\u0000\u0000\u0000\u02df"+ + "\u02e0\u0005\u001b\u0000\u0000\u02e0\u02e1\u0005m\u0000\u0000\u02e1\u02e2"+ + "\u0005n\u0000\u0000\u02e2\u02e3\u0003\u0136\u009b\u0000\u02e3]\u0001\u0000"+ + "\u0000\u0000\u02e4\u02e5\u0005-\u0000\u0000\u02e5\u02e6\u0005m\u0000\u0000"+ + "\u02e6\u02e7\u0003\u0136\u009b\u0000\u02e7\u02e8\u0005n\u0000\u0000\u02e8"+ + "_\u0001\u0000\u0000\u0000\u02e9\u02ea\u0007\u0005\u0000\u0000\u02ea\u02eb"+ + "\u0005m\u0000\u0000\u02eb\u02ec\u0003\u00c6c\u0000\u02ec\u02ed\u0005n"+ + "\u0000\u0000\u02ed\u02f5\u0001\u0000\u0000\u0000\u02ee\u02ef\u0005+\u0000"+ + "\u0000\u02ef\u02f0\u0005m\u0000\u0000\u02f0\u02f1\u0003\u00c6c\u0000\u02f1"+ + "\u02f2\u0005n\u0000\u0000\u02f2\u02f3\u0003\u00c6c\u0000\u02f3\u02f5\u0001"+ + "\u0000\u0000\u0000\u02f4\u02e9\u0001\u0000\u0000\u0000\u02f4\u02ee\u0001"+ + "\u0000\u0000\u0000\u02f5a\u0001\u0000\u0000\u0000\u02f6\u02fe\u0003d2"+ + "\u0000\u02f7\u02f8\u0005L\u0000\u0000\u02f8\u02fe\u00061\uffff\uffff\u0000"+ + "\u02f9\u02fa\u0005\u000e\u0000\u0000\u02fa\u02fe\u00061\uffff\uffff\u0000"+ + "\u02fb\u02fc\u0005D\u0000\u0000\u02fc\u02fe\u00061\uffff\uffff\u0000\u02fd"+ + "\u02f6\u0001\u0000\u0000\u0000\u02fd\u02f7\u0001\u0000\u0000\u0000\u02fd"+ + "\u02f9\u0001\u0000\u0000\u0000\u02fd\u02fb\u0001\u0000\u0000\u0000\u02fe"+ + "\u02ff\u0001\u0000\u0000\u0000\u02ff\u0301\u0003\u0174\u00ba\u0000\u0300"+ + "\u02fd\u0001\u0000\u0000\u0000\u0301\u0304\u0001\u0000\u0000\u0000\u0302"+ + "\u0303\u0001\u0000\u0000\u0000\u0302\u0300\u0001\u0000\u0000\u0000\u0303"+ + "\u0307\u0001\u0000\u0000\u0000\u0304\u0302\u0001\u0000\u0000\u0000\u0305"+ + "\u0306\u0005\u000e\u0000\u0000\u0306\u0308\u00061\uffff\uffff\u0000\u0307"+ + "\u0305\u0001\u0000\u0000\u0000\u0307\u0308\u0001\u0000\u0000\u0000\u0308"+ + "c\u0001\u0000\u0000\u0000\u0309\u030a\u0005\t\u0000\u0000\u030a\u0312"+ + "\u0003h4\u0000\u030b\u030c\u0005\n\u0000\u0000\u030c\u0312\u0003h4\u0000"+ + "\u030d\u030e\u0005\u000b\u0000\u0000\u030e\u0312\u0003h4\u0000\u030f\u0310"+ + "\u0005\r\u0000\u0000\u0310\u0312\u0003f3\u0000\u0311\u0309\u0001\u0000"+ + "\u0000\u0000\u0311\u030b\u0001\u0000\u0000\u0000\u0311\u030d\u0001\u0000"+ + "\u0000\u0000\u0311\u030f\u0001\u0000\u0000\u0000\u0312e\u0001\u0000\u0000"+ + "\u0000\u0313\u0315\u0003\u00eau\u0000\u0314\u0313\u0001\u0000\u0000\u0000"+ + "\u0314\u0315\u0001\u0000\u0000\u0000\u0315\u0318\u0001\u0000\u0000\u0000"+ + "\u0316\u0317\u0005_\u0000\u0000\u0317\u0319\u0003\u00a8T\u0000\u0318\u0316"+ + "\u0001\u0000\u0000\u0000\u0318\u0319\u0001\u0000\u0000\u0000\u0319g\u0001"+ + "\u0000\u0000\u0000\u031a\u031d\u0001\u0000\u0000\u0000\u031b\u031d\u0003"+ + "\u00a8T\u0000\u031c\u031a\u0001\u0000\u0000\u0000\u031c\u031b\u0001\u0000"+ + "\u0000\u0000\u031di\u0001\u0000\u0000\u0000\u031e\u031f\u00057\u0000\u0000"+ + "\u031f\u0320\u0003\u00a8T\u0000\u0320\u0324\u0005k\u0000\u0000\u0321\u0323"+ + "\u0003l6\u0000\u0322\u0321\u0001\u0000\u0000\u0000\u0323\u0326\u0001\u0000"+ + "\u0000\u0000\u0324\u0322\u0001\u0000\u0000\u0000\u0324\u0325\u0001\u0000"+ + "\u0000\u0000\u0325\u0327\u0001\u0000\u0000\u0000\u0326\u0324\u0001\u0000"+ + "\u0000\u0000\u0327\u0328\u0005l\u0000\u0000\u0328k\u0001\u0000\u0000\u0000"+ + "\u0329\u032a\u0003n7\u0000\u032a\u032c\u0005r\u0000\u0000\u032b\u032d"+ + "\u0003\u00f4z\u0000\u032c\u032b\u0001\u0000\u0000\u0000\u032c\u032d\u0001"+ + "\u0000\u0000\u0000\u032dm\u0001\u0000\u0000\u0000\u032e\u032f\u0005S\u0000"+ + "\u0000\u032f\u0332\u0003p8\u0000\u0330\u0332\u0005O\u0000\u0000\u0331"+ + "\u032e\u0001\u0000\u0000\u0000\u0331\u0330\u0001\u0000\u0000\u0000\u0332"+ + "o\u0001\u0000\u0000\u0000\u0333\u0334\u0005%\u0000\u0000\u0334\u0341\u0005"+ + "h\u0000\u0000\u0335\u0336\u0003\u00ceg\u0000\u0336\u033b\u0005k\u0000"+ + "\u0000\u0337\u0339\u0003r9\u0000\u0338\u033a\u0005p\u0000\u0000\u0339"+ + "\u0338\u0001\u0000\u0000\u0000\u0339\u033a\u0001\u0000\u0000\u0000\u033a"+ + "\u033c\u0001\u0000\u0000\u0000\u033b\u0337\u0001\u0000\u0000\u0000\u033b"+ + "\u033c\u0001\u0000\u0000\u0000\u033c\u033d\u0001\u0000\u0000\u0000\u033d"+ + "\u033e\u0005l\u0000\u0000\u033e\u0341\u0001\u0000\u0000\u0000\u033f\u0341"+ + "\u0003\u00a8T\u0000\u0340\u0333\u0001\u0000\u0000\u0000\u0340\u0335\u0001"+ + "\u0000\u0000\u0000\u0340\u033f\u0001\u0000\u0000\u0000\u0341q\u0001\u0000"+ + "\u0000\u0000\u0342\u0347\u0003p8\u0000\u0343\u0344\u0005p\u0000\u0000"+ + "\u0344\u0346\u0003p8\u0000\u0345\u0343\u0001\u0000\u0000\u0000\u0346\u0349"+ + "\u0001\u0000\u0000\u0000\u0347\u0345\u0001\u0000\u0000\u0000\u0347\u0348"+ + "\u0001\u0000\u0000\u0000\u0348s\u0001\u0000\u0000\u0000\u0349\u0347\u0001"+ + "\u0000\u0000\u0000\u034a\u034f\u0005k\u0000\u0000\u034b\u034c\u0005<\u0000"+ + "\u0000\u034c\u034d\u0003\u00e8t\u0000\u034d\u034e\u0003\u0174\u00ba\u0000"+ + "\u034e\u0350\u0001\u0000\u0000\u0000\u034f\u034b\u0001\u0000\u0000\u0000"+ + "\u034f\u0350\u0001\u0000\u0000\u0000\u0350\u0352\u0001\u0000\u0000\u0000"+ + "\u0351\u0353\u0003\u00f4z\u0000\u0352\u0351\u0001\u0000\u0000\u0000\u0352"+ + "\u0353\u0001\u0000\u0000\u0000\u0353\u0354\u0001\u0000\u0000\u0000\u0354"+ + "\u0355\u0005l\u0000\u0000\u0355u\u0001\u0000\u0000\u0000\u0356\u0359\u0003"+ + "\u0154\u00aa\u0000\u0357\u0359\u0005h\u0000\u0000\u0358\u0356\u0001\u0000"+ + "\u0000\u0000\u0358\u0357\u0001\u0000\u0000\u0000\u0359\u0362\u0001\u0000"+ + "\u0000\u0000\u035a\u035f\u0005k\u0000\u0000\u035b\u035d\u0003x<\u0000"+ + "\u035c\u035e\u0005p\u0000\u0000\u035d\u035c\u0001\u0000\u0000\u0000\u035d"+ + "\u035e\u0001\u0000\u0000\u0000\u035e\u0360\u0001\u0000\u0000\u0000\u035f"+ + "\u035b\u0001\u0000\u0000\u0000\u035f\u0360\u0001\u0000\u0000\u0000\u0360"+ + "\u0361\u0001\u0000\u0000\u0000\u0361\u0363\u0005l\u0000\u0000\u0362\u035a"+ + "\u0001\u0000\u0000\u0000\u0362\u0363\u0001\u0000\u0000\u0000\u0363w\u0001"+ + "\u0000\u0000\u0000\u0364\u0369\u0003z=\u0000\u0365\u0366\u0005p\u0000"+ + "\u0000\u0366\u0368\u0003z=\u0000\u0367\u0365\u0001\u0000\u0000\u0000\u0368"+ + "\u036b\u0001\u0000\u0000\u0000\u0369\u0367\u0001\u0000\u0000\u0000\u0369"+ + "\u036a\u0001\u0000\u0000\u0000\u036ay\u0001\u0000\u0000\u0000\u036b\u0369"+ + "\u0001\u0000\u0000\u0000\u036c\u036d\u0005h\u0000\u0000\u036d\u036f\u0005"+ + "r\u0000\u0000\u036e\u036c\u0001\u0000\u0000\u0000\u036e\u036f\u0001\u0000"+ + "\u0000\u0000\u036f\u0370\u0001\u0000\u0000\u0000\u0370\u0371\u0003\u00a8"+ + "T\u0000\u0371{\u0001\u0000\u0000\u0000\u0372\u0373\u0005H\u0000\u0000"+ + "\u0373\u0374\u0003\u00a8T\u0000\u0374\u0375\u0005\u000f\u0000\u0000\u0375"+ + "\u0376\u0003v;\u0000\u0376\u0377\u0003\u00f2y\u0000\u0377}\u0001\u0000"+ + "\u0000\u0000\u0378\u0379\u0003\u00c6c\u0000\u0379\u037a\u0005\u000f\u0000"+ + "\u0000\u037a\u038d\u0003\u00c6c\u0000\u037b\u0381\u0005k\u0000\u0000\u037c"+ + "\u037d\u0003\u0086C\u0000\u037d\u037e\u0003\u0174\u00ba\u0000\u037e\u0380"+ + "\u0001\u0000\u0000\u0000\u037f\u037c\u0001\u0000\u0000\u0000\u0380\u0383"+ + "\u0001\u0000\u0000\u0000\u0381\u037f\u0001\u0000\u0000\u0000\u0381\u0382"+ + "\u0001\u0000\u0000\u0000\u0382\u0389\u0001\u0000\u0000\u0000\u0383\u0381"+ + "\u0001\u0000\u0000\u0000\u0384\u0385\u0003\u0080@\u0000\u0385\u0386\u0003"+ + "\u0174\u00ba\u0000\u0386\u0388\u0001\u0000\u0000\u0000\u0387\u0384\u0001"+ + "\u0000\u0000\u0000\u0388\u038b\u0001\u0000\u0000\u0000\u0389\u0387\u0001"+ + "\u0000\u0000\u0000\u0389\u038a\u0001\u0000\u0000\u0000\u038a\u038c\u0001"+ + "\u0000\u0000\u0000\u038b\u0389\u0001\u0000\u0000\u0000\u038c\u038e\u0005"+ + "l\u0000\u0000\u038d\u037b\u0001\u0000\u0000\u0000\u038d\u038e\u0001\u0000"+ + "\u0000\u0000\u038e\u007f\u0001\u0000\u0000\u0000\u038f\u0391\u0005\u000e"+ + "\u0000\u0000\u0390\u038f\u0001\u0000\u0000\u0000\u0390\u0391\u0001\u0000"+ + "\u0000\u0000\u0391\u0392\u0001\u0000\u0000\u0000\u0392\u0393\u0003\u0082"+ + "A\u0000\u0393\u0394\u0005h\u0000\u0000\u0394\u0396\u0003\u0142\u00a1\u0000"+ + "\u0395\u0397\u0003\u00f2y\u0000\u0396\u0395\u0001\u0000\u0000\u0000\u0396"+ + "\u0397\u0001\u0000\u0000\u0000\u0397\u0081\u0001\u0000\u0000\u0000\u0398"+ + "\u039a\u0005i\u0000\u0000\u0399\u039b\u0005h\u0000\u0000\u039a\u0399\u0001"+ + "\u0000\u0000\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u039d\u0001"+ + "\u0000\u0000\u0000\u039c\u039e\u0005\u008a\u0000\u0000\u039d\u039c\u0001"+ + "\u0000\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u039f\u0001"+ + "\u0000\u0000\u0000\u039f\u03a0\u0003\u0130\u0098\u0000\u03a0\u03a1\u0005"+ + "j\u0000\u0000\u03a1\u0083\u0001\u0000\u0000\u0000\u03a2\u03a8\u0003\u00b8"+ + "\\\u0000\u03a3\u03a4\u0003\u00c6c\u0000\u03a4\u03a5\u0005s\u0000\u0000"+ + "\u03a5\u03a6\u0005h\u0000\u0000\u03a6\u03a8\u0001\u0000\u0000\u0000\u03a7"+ + "\u03a2\u0001\u0000\u0000\u0000\u03a7\u03a3\u0001\u0000\u0000\u0000\u03a8"+ + "\u0085\u0001\u0000\u0000\u0000\u03a9\u03aa\u00059\u0000\u0000\u03aa\u03ab"+ + "\u0005h\u0000\u0000\u03ab\u03ae\u0005v\u0000\u0000\u03ac\u03af\u0003\u0084"+ + "B\u0000\u03ad\u03af\u0003\u0152\u00a9\u0000\u03ae\u03ac\u0001\u0000\u0000"+ + "\u0000\u03ae\u03ad\u0001\u0000\u0000\u0000\u03af\u0087\u0001\u0000\u0000"+ + "\u0000\u03b0\u03b1\u00050\u0000\u0000\u03b1\u03b2\u0005i\u0000\u0000\u03b2"+ + "\u03b5\u0003\u00c6c\u0000\u03b3\u03b4\u0005p\u0000\u0000\u03b4\u03b6\u0003"+ + "\u00eau\u0000\u03b5\u03b3\u0001\u0000\u0000\u0000\u03b5\u03b6\u0001\u0000"+ + "\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u03b8\u0005j\u0000"+ + "\u0000\u03b8\u0089\u0001\u0000\u0000\u0000\u03b9\u03ba\u0005/\u0000\u0000"+ + "\u03ba\u03bb\u0005i\u0000\u0000\u03bb\u03bc\u0003\u00c6c\u0000\u03bc\u03bd"+ + "\u0005j\u0000\u0000\u03bd\u008b\u0001\u0000\u0000\u0000\u03be\u03c1\u0003"+ + "b1\u0000\u03bf\u03c2\u0003\u008eG\u0000\u03c0\u03c2\u0003\u0090H\u0000"+ + "\u03c1\u03bf\u0001\u0000\u0000\u0000\u03c1\u03c0\u0001\u0000\u0000\u0000"+ + "\u03c2\u008d\u0001\u0000\u0000\u0000\u03c3\u03c4\u0005P\u0000\u0000\u03c4"+ + "\u03c5\u0005h\u0000\u0000\u03c5\u03c7\u0003\u0142\u00a1\u0000\u03c6\u03c8"+ + "\u0003t:\u0000\u03c7\u03c6\u0001\u0000\u0000\u0000\u03c7\u03c8\u0001\u0000"+ + "\u0000\u0000\u03c8\u008f\u0001\u0000\u0000\u0000\u03c9\u03ca\u0005P\u0000"+ + "\u0000\u03ca\u03cb\u0003\u009eO\u0000\u03cb\u03cc\u0005h\u0000\u0000\u03cc"+ + "\u03ce\u0003\u0142\u00a1\u0000\u03cd\u03cf\u0003t:\u0000\u03ce\u03cd\u0001"+ + "\u0000\u0000\u0000\u03ce\u03cf\u0001\u0000\u0000\u0000\u03cf\u0091\u0001"+ + "\u0000\u0000\u0000\u03d0\u03d3\u0005\u001b\u0000\u0000\u03d1\u03d4\u0003"+ + "\u008cF\u0000\u03d2\u03d4\u0003\u00e2q\u0000\u03d3\u03d1\u0001\u0000\u0000"+ + "\u0000\u03d3\u03d2\u0001\u0000\u0000\u0000\u03d4\u0093\u0001\u0000\u0000"+ + "\u0000\u03d5\u03d6\u00059\u0000\u0000\u03d6\u03d7\u0005h\u0000\u0000\u03d7"+ + "\u03d9\u0003\u0146\u00a3\u0000\u03d8\u03da\u0003\u0096K\u0000\u03d9\u03d8"+ + "\u0001\u0000\u0000\u0000\u03d9\u03da\u0001\u0000\u0000\u0000\u03da\u0095"+ + "\u0001\u0000\u0000\u0000\u03db\u03dc\u0005k\u0000\u0000\u03dc\u03dd\u0003"+ + "\u00a8T\u0000\u03dd\u03de\u0003\u0174\u00ba\u0000\u03de\u03df\u0005l\u0000"+ + "\u0000\u03df\u0097\u0001\u0000\u0000\u0000\u03e0\u03e1\u00059\u0000\u0000"+ + "\u03e1\u03e2\u0003\u009eO\u0000\u03e2\u03e3\u0005h\u0000\u0000\u03e3\u03e5"+ + "\u0003\u0146\u00a3\u0000\u03e4\u03e6\u0003\u0096K\u0000\u03e5\u03e4\u0001"+ + "\u0000\u0000\u0000\u03e5\u03e6\u0001\u0000\u0000\u0000\u03e6\u0099\u0001"+ + "\u0000\u0000\u0000\u03e7\u03ef\u0003\u0006\u0003\u0000\u03e8\u03eb\u0003"+ + "\u00c6c\u0000\u03e9\u03ea\u0005o\u0000\u0000\u03ea\u03ec\u0003\u00eau"+ + "\u0000\u03eb\u03e9\u0001\u0000\u0000\u0000\u03eb\u03ec\u0001\u0000\u0000"+ + "\u0000\u03ec\u03f0\u0001\u0000\u0000\u0000\u03ed\u03ee\u0005o\u0000\u0000"+ + "\u03ee\u03f0\u0003\u00eau\u0000\u03ef\u03e8\u0001\u0000\u0000\u0000\u03ef"+ + "\u03ed\u0001\u0000\u0000\u0000\u03f0\u009b\u0001\u0000\u0000\u0000\u03f1"+ + "\u03f2\u0003\u0006\u0003\u0000\u03f2\u03f3\u0005v\u0000\u0000\u03f3\u03f4"+ + "\u0003\u00eau\u0000\u03f4\u009d\u0001\u0000\u0000\u0000\u03f5\u03f7\u0005"+ + "i\u0000\u0000\u03f6\u03f8\u0003\b\u0004\u0000\u03f7\u03f6\u0001\u0000"+ + "\u0000\u0000\u03f7\u03f8\u0001\u0000\u0000\u0000\u03f8\u03f9\u0001\u0000"+ + "\u0000\u0000\u03f9\u03fb\u0003\u00c6c\u0000\u03fa\u03fc\u0005p\u0000\u0000"+ + "\u03fb\u03fa\u0001\u0000\u0000\u0000\u03fb\u03fc\u0001\u0000\u0000\u0000"+ + "\u03fc\u03fd\u0001\u0000\u0000\u0000\u03fd\u03fe\u0005j\u0000\u0000\u03fe"+ + "\u009f\u0001\u0000\u0000\u0000\u03ff\u0402\u0003\u00a2Q\u0000\u0400\u0402"+ + "\u0003\u00a4R\u0000\u0401\u03ff\u0001\u0000\u0000\u0000\u0401\u0400\u0001"+ + "\u0000\u0000\u0000\u0402\u00a1\u0001\u0000\u0000\u0000\u0403\u0405\u0003"+ + "\u00e8t\u0000\u0404\u0403\u0001\u0000\u0000\u0000\u0404\u0405\u0001\u0000"+ + "\u0000\u0000\u0405\u0406\u0001\u0000\u0000\u0000\u0406\u0407\u0003\u00a6"+ + "S\u0000\u0407\u00a3\u0001\u0000\u0000\u0000\u0408\u040a\u0005\u001b\u0000"+ + "\u0000\u0409\u040b\u0003\u00e8t\u0000\u040a\u0409\u0001\u0000\u0000\u0000"+ + "\u040a\u040b\u0001\u0000\u0000\u0000\u040b\u040c\u0001\u0000\u0000\u0000"+ + "\u040c\u040d\u0003\u00a6S\u0000\u040d\u00a5\u0001\u0000\u0000\u0000\u040e"+ + "\u0410\u0005w\u0000\u0000\u040f\u040e\u0001\u0000\u0000\u0000\u040f\u0410"+ + "\u0001\u0000\u0000\u0000\u0410\u0411\u0001\u0000\u0000\u0000\u0411\u0412"+ + "\u0003\u00c6c\u0000\u0412\u00a7\u0001\u0000\u0000\u0000\u0413\u0414\u0006"+ + "T\uffff\uffff\u0000\u0414\u0415\u0007\u0006\u0000\u0000\u0415\u0429\u0003"+ + "\u00a8T\u000f\u0416\u0429\u0003\u00b8\\\u0000\u0417\u0418\u0005\u0019"+ + "\u0000\u0000\u0418\u0419\u0003.\u0017\u0000\u0419\u041a\u0005\u001c\u0000"+ + "\u0000\u041a\u041b\u0003\u00a8T\u0003\u041b\u0429\u0001\u0000\u0000\u0000"+ + "\u041c\u041d\u0005\u001a\u0000\u0000\u041d\u041e\u0003\u009cN\u0000\u041e"+ + "\u041f\u0005\u001c\u0000\u0000\u041f\u0420\u0003\u00a8T\u0002\u0420\u0429"+ + "\u0001\u0000\u0000\u0000\u0421\u0422\u0007\u0007\u0000\u0000\u0422\u0423"+ + "\u0003&\u0013\u0000\u0423\u0424\u0005r\u0000\u0000\u0424\u0425\u0005r"+ + "\u0000\u0000\u0425\u0426\u0003*\u0015\u0000\u0426\u0427\u0003\u00a8T\u0001"+ + "\u0427\u0429\u0001\u0000\u0000\u0000\u0428\u0413\u0001\u0000\u0000\u0000"+ + "\u0428\u0416\u0001\u0000\u0000\u0000\u0428\u0417\u0001\u0000\u0000\u0000"+ + "\u0428\u041c\u0001\u0000\u0000\u0000\u0428\u0421\u0001\u0000\u0000\u0000"+ + "\u0429\u044d\u0001\u0000\u0000\u0000\u042a\u042b\n\r\u0000\u0000\u042b"+ + "\u042c\u0007\b\u0000\u0000\u042c\u044c\u0003\u00a8T\u000e\u042d\u042e"+ + "\n\f\u0000\u0000\u042e\u042f\u0007\t\u0000\u0000\u042f\u044c\u0003\u00a8"+ + "T\r\u0430\u0431\n\u000b\u0000\u0000\u0431\u0432\u0007\n\u0000\u0000\u0432"+ + "\u044c\u0003\u00a8T\f\u0433\u0434\n\n\u0000\u0000\u0434\u0435\u0007\u000b"+ + "\u0000\u0000\u0435\u044c\u0003\u00a8T\u000b\u0436\u0437\n\t\u0000\u0000"+ + "\u0437\u0438\u0007\f\u0000\u0000\u0438\u044c\u0003\u00a8T\n\u0439\u043a"+ + "\n\u0007\u0000\u0000\u043a\u043b\u0005y\u0000\u0000\u043b\u044c\u0003"+ + "\u00a8T\b\u043c\u043d\n\u0006\u0000\u0000\u043d\u043e\u0005x\u0000\u0000"+ + "\u043e\u044c\u0003\u00a8T\u0007\u043f\u0440\n\u0005\u0000\u0000\u0440"+ + "\u0441\u0005\"\u0000\u0000\u0441\u044c\u0003\u00a8T\u0005\u0442\u0443"+ + "\n\u0004\u0000\u0000\u0443\u0444\u0005%\u0000\u0000\u0444\u0445\u0003"+ + "\u00a8T\u0000\u0445\u0446\u0005r\u0000\u0000\u0446\u0447\u0003\u00a8T"+ + "\u0004\u0447\u044c\u0001\u0000\u0000\u0000\u0448\u0449\n\b\u0000\u0000"+ + "\u0449\u044a\u0005\u000f\u0000\u0000\u044a\u044c\u0003v;\u0000\u044b\u042a"+ + "\u0001\u0000\u0000\u0000\u044b\u042d\u0001\u0000\u0000\u0000\u044b\u0430"+ + "\u0001\u0000\u0000\u0000\u044b\u0433\u0001\u0000\u0000\u0000\u044b\u0436"+ + "\u0001\u0000\u0000\u0000\u044b\u0439\u0001\u0000\u0000\u0000\u044b\u043c"+ + "\u0001\u0000\u0000\u0000\u044b\u043f\u0001\u0000\u0000\u0000\u044b\u0442"+ + "\u0001\u0000\u0000\u0000\u044b\u0448\u0001\u0000\u0000\u0000\u044c\u044f"+ + "\u0001\u0000\u0000\u0000\u044d\u044b\u0001\u0000\u0000\u0000\u044d\u044e"+ + "\u0001\u0000\u0000\u0000\u044e\u00a9\u0001\u0000\u0000\u0000\u044f\u044d"+ + "\u0001\u0000\u0000\u0000\u0450\u0465\u0003\u0018\f\u0000\u0451\u0465\u0003"+ + "\u001a\r\u0000\u0452\u0465\u0003\u00aeW\u0000\u0453\u0465\u0003\u00ac"+ + "V\u0000\u0454\u0465\u0003\u00e2q\u0000\u0455\u0465\u0003\u0102\u0081\u0000"+ + "\u0456\u0465\u0003\u00f6{\u0000\u0457\u0465\u0003\u012e\u0097\u0000\u0458"+ + "\u0465\u0003\u0104\u0082\u0000\u0459\u0465\u0003\u0106\u0083\u0000\u045a"+ + "\u0465\u0003\u0108\u0084\u0000\u045b\u0465\u0003\u010a\u0085\u0000\u045c"+ + "\u0465\u0003\u010c\u0086\u0000\u045d\u0465\u0003\u00f2y\u0000\u045e\u0465"+ + "\u0003\u010e\u0087\u0000\u045f\u0465\u0003\u0110\u0088\u0000\u0460\u0465"+ + "\u0003\u0122\u0091\u0000\u0461\u0465\u0003\u00b0X\u0000\u0462\u0465\u0003"+ + "\u00b4Z\u0000\u0463\u0465\u0003|>\u0000\u0464\u0450\u0001\u0000\u0000"+ + "\u0000\u0464\u0451\u0001\u0000\u0000\u0000\u0464\u0452\u0001\u0000\u0000"+ + "\u0000\u0464\u0453\u0001\u0000\u0000\u0000\u0464\u0454\u0001\u0000\u0000"+ + "\u0000\u0464\u0455\u0001\u0000\u0000\u0000\u0464\u0456\u0001\u0000\u0000"+ + "\u0000\u0464\u0457\u0001\u0000\u0000\u0000\u0464\u0458\u0001\u0000\u0000"+ + "\u0000\u0464\u0459\u0001\u0000\u0000\u0000\u0464\u045a\u0001\u0000\u0000"+ + "\u0000\u0464\u045b\u0001\u0000\u0000\u0000\u0464\u045c\u0001\u0000\u0000"+ + "\u0000\u0464\u045d\u0001\u0000\u0000\u0000\u0464\u045e\u0001\u0000\u0000"+ + "\u0000\u0464\u045f\u0001\u0000\u0000\u0000\u0464\u0460\u0001\u0000\u0000"+ + "\u0000\u0464\u0461\u0001\u0000\u0000\u0000\u0464\u0462\u0001\u0000\u0000"+ + "\u0000\u0464\u0463\u0001\u0000\u0000\u0000\u0465\u00ab\u0001\u0000\u0000"+ + "\u0000\u0466\u0467\u0005$\u0000\u0000\u0467\u0468\u0003\u00a8T\u0000\u0468"+ + "\u00ad\u0001\u0000\u0000\u0000\u0469\u046a\u0005[\u0000\u0000\u046a\u046c"+ + "\u0003\u00a8T\u0000\u046b\u046d\u0003\u00f2y\u0000\u046c\u046b\u0001\u0000"+ + "\u0000\u0000\u046c\u046d\u0001\u0000\u0000\u0000\u046d\u00af\u0001\u0000"+ + "\u0000\u0000\u046e\u046f\u0003\u00b2Y\u0000\u046f\u0470\u0003\u012a\u0095"+ + "\u0000\u0470\u00b1\u0001\u0000\u0000\u0000\u0471\u0472\u0005\f\u0000\u0000"+ + "\u0472\u0473\u0003\u00a8T\u0000\u0473\u0474\u0003\u0174\u00ba\u0000\u0474"+ + "\u0476\u0001\u0000\u0000\u0000\u0475\u0471\u0001\u0000\u0000\u0000\u0476"+ + "\u0479\u0001\u0000\u0000\u0000\u0477\u0475\u0001\u0000\u0000\u0000\u0477"+ + "\u0478\u0001\u0000\u0000\u0000\u0478\u047e\u0001\u0000\u0000\u0000\u0479"+ + "\u0477\u0001\u0000\u0000\u0000\u047a\u047b\u0005\r\u0000\u0000\u047b\u047c"+ + "\u0003f3\u0000\u047c\u047d\u0003\u0174\u00ba\u0000\u047d\u047f\u0001\u0000"+ + "\u0000\u0000\u047e\u047a\u0001\u0000\u0000\u0000\u047e\u047f\u0001\u0000"+ + "\u0000\u0000\u047f\u00b3\u0001\u0000\u0000\u0000\u0480\u0481\u0005T\u0000"+ + "\u0000\u0481\u0486\u0003\u00a8T\u0000\u0482\u0483\u0005T\u0000\u0000\u0483"+ + "\u0484\u0007\u0001\u0000\u0000\u0484\u0486\u0003.\u0017\u0000\u0485\u0480"+ + "\u0001\u0000\u0000\u0000\u0485\u0482\u0001\u0000\u0000\u0000\u0486\u00b5"+ + "\u0001\u0000\u0000\u0000\u0487\u0490\u0005\u0003\u0000\u0000\u0488\u0490"+ + "\u0005\u0004\u0000\u0000\u0489\u0490\u0005g\u0000\u0000\u048a\u0490\u0003"+ + "\u0150\u00a8\u0000\u048b\u0490\u0003\u0166\u00b3\u0000\u048c\u0490\u0005"+ + "\u0001\u0000\u0000\u048d\u0490\u0005\u0092\u0000\u0000\u048e\u0490\u0005"+ + "\u0093\u0000\u0000\u048f\u0487\u0001\u0000\u0000\u0000\u048f\u0488\u0001"+ + "\u0000\u0000\u0000\u048f\u0489\u0001\u0000\u0000\u0000\u048f\u048a\u0001"+ + "\u0000\u0000\u0000\u048f\u048b\u0001\u0000\u0000\u0000\u048f\u048c\u0001"+ + "\u0000\u0000\u0000\u048f\u048d\u0001\u0000\u0000\u0000\u048f\u048e\u0001"+ + "\u0000\u0000\u0000\u0490\u00b7\u0001\u0000\u0000\u0000\u0491\u0492\u0006"+ + "\\\uffff\uffff\u0000\u0492\u04a2\u0003\u014c\u00a6\u0000\u0493\u04a2\u0003"+ + "\u0148\u00a4\u0000\u0494\u04a2\u0003\u0170\u00b8\u0000\u0495\u04a2\u0003"+ + " \u0010\u0000\u0496\u04a2\u0003\u008aE\u0000\u0497\u04a2\u0003\u0088D"+ + "\u0000\u0498\u0499\u0005M\u0000\u0000\u0499\u049a\u0003\u00b8\\\u0000"+ + "\u049a\u049b\u0003\u016e\u00b7\u0000\u049b\u04a2\u0001\u0000\u0000\u0000"+ + "\u049c\u049d\u0007\r\u0000\u0000\u049d\u049e\u0005i\u0000\u0000\u049e"+ + "\u049f\u0003\u00a8T\u0000\u049f\u04a0\u0005j\u0000\u0000\u04a0\u04a2\u0001"+ + "\u0000\u0000\u0000\u04a1\u0491\u0001\u0000\u0000\u0000\u04a1\u0493\u0001"+ + "\u0000\u0000\u0000\u04a1\u0494\u0001\u0000\u0000\u0000\u04a1\u0495\u0001"+ + "\u0000\u0000\u0000\u04a1\u0496\u0001\u0000\u0000\u0000\u04a1\u0497\u0001"+ + "\u0000\u0000\u0000\u04a1\u0498\u0001\u0000\u0000\u0000\u04a1\u049c\u0001"+ + "\u0000\u0000\u0000\u04a2\u04b9\u0001\u0000\u0000\u0000\u04a3\u04a4\n\n"+ + "\u0000\u0000\u04a4\u04a5\u0005s\u0000\u0000\u04a5\u04b8\u0005h\u0000\u0000"+ + "\u04a6\u04a7\n\t\u0000\u0000\u04a7\u04b8\u0003\u016a\u00b5\u0000\u04a8"+ + "\u04a9\n\b\u0000\u0000\u04a9\u04b8\u0003\u00d2i\u0000\u04aa\u04ab\n\u0007"+ + "\u0000\u0000\u04ab\u04b8\u0003L&\u0000\u04ac\u04ad\n\u0006\u0000\u0000"+ + "\u04ad\u04b8\u0003\u016c\u00b6\u0000\u04ae\u04af\n\u0005\u0000\u0000\u04af"+ + "\u04b8\u0003\u016e\u00b7\u0000\u04b0\u04b1\n\u0003\u0000\u0000\u04b1\u04b2"+ + "\u0003\u016e\u00b7\u0000\u04b2\u04b3\u0005\u0010\u0000\u0000\u04b3\u04b4"+ + "\u0003v;\u0000\u04b4\u04b8\u0001\u0000\u0000\u0000\u04b5\u04b6\n\u0002"+ + "\u0000\u0000\u04b6\u04b8\u0003\u00be_\u0000\u04b7\u04a3\u0001\u0000\u0000"+ + "\u0000\u04b7\u04a6\u0001\u0000\u0000\u0000\u04b7\u04a8\u0001\u0000\u0000"+ + "\u0000\u04b7\u04aa\u0001\u0000\u0000\u0000\u04b7\u04ac\u0001\u0000\u0000"+ + "\u0000\u04b7\u04ae\u0001\u0000\u0000\u0000\u04b7\u04b0\u0001\u0000\u0000"+ + "\u0000\u04b7\u04b5\u0001\u0000\u0000\u0000\u04b8\u04bb\u0001\u0000\u0000"+ + "\u0000\u04b9\u04b7\u0001\u0000\u0000\u0000\u04b9\u04ba\u0001\u0000\u0000"+ + "\u0000\u04ba\u00b9\u0001\u0000\u0000\u0000\u04bb\u04b9\u0001\u0000\u0000"+ + "\u0000\u04bc\u04bd\u0003b1\u0000\u04bd\u04be\u0003\u00bc^\u0000\u04be"+ + "\u00bb\u0001\u0000\u0000\u0000\u04bf\u04c1\u0005P\u0000\u0000\u04c0\u04c2"+ + "\u0005h\u0000\u0000\u04c1\u04c0\u0001\u0000\u0000\u0000\u04c1\u04c2\u0001"+ + "\u0000\u0000\u0000\u04c2\u04c3\u0001\u0000\u0000\u0000\u04c3\u04c5\u0003"+ + "\u0142\u00a1\u0000\u04c4\u04c6\u0003t:\u0000\u04c5\u04c4\u0001\u0000\u0000"+ + "\u0000\u04c5\u04c6\u0001\u0000\u0000\u0000\u04c6\u00bd\u0001\u0000\u0000"+ + "\u0000\u04c7\u04c9\u0005&\u0000\u0000\u04c8\u04ca\u0003\u00eau\u0000\u04c9"+ + "\u04c8\u0001\u0000\u0000\u0000\u04c9\u04ca\u0001\u0000\u0000\u0000\u04ca"+ + "\u04cc\u0001\u0000\u0000\u0000\u04cb\u04cd\u0005p\u0000\u0000\u04cc\u04cb"+ + "\u0001\u0000\u0000\u0000\u04cc\u04cd\u0001\u0000\u0000\u0000\u04cd\u04ce"+ + "\u0001\u0000\u0000\u0000\u04ce\u04cf\u0005\'\u0000\u0000\u04cf\u00bf\u0001"+ + "\u0000\u0000\u0000\u04d0\u04d1\u0005Q\u0000\u0000\u04d1\u04db\u0005k\u0000"+ + "\u0000\u04d2\u04d6\u0003\u00c4b\u0000\u04d3\u04d6\u0003\u0130\u0098\u0000"+ + "\u04d4\u04d6\u0003\u00c2a\u0000\u04d5\u04d2\u0001\u0000\u0000\u0000\u04d5"+ + "\u04d3\u0001\u0000\u0000\u0000\u04d5\u04d4\u0001\u0000\u0000\u0000\u04d6"+ + "\u04d7\u0001\u0000\u0000\u0000\u04d7\u04d8\u0003\u0174\u00ba\u0000\u04d8"+ + "\u04da\u0001\u0000\u0000\u0000\u04d9\u04d5\u0001\u0000\u0000\u0000\u04da"+ + "\u04dd\u0001\u0000\u0000\u0000\u04db\u04d9\u0001\u0000\u0000\u0000\u04db"+ + "\u04dc\u0001\u0000\u0000\u0000\u04dc\u04de\u0001\u0000\u0000\u0000\u04dd"+ + "\u04db\u0001\u0000\u0000\u0000\u04de\u04df\u0005l\u0000\u0000\u04df\u00c1"+ + "\u0001\u0000\u0000\u0000\u04e0\u04e1\u00059\u0000\u0000\u04e1\u04e2\u0005"+ + "h\u0000\u0000\u04e2\u04e3\u0003\u0146\u00a3\u0000\u04e3\u00c3\u0001\u0000"+ + "\u0000\u0000\u04e4\u04e6\u0005\u001b\u0000\u0000\u04e5\u04e4\u0001\u0000"+ + "\u0000\u0000\u04e5\u04e6\u0001\u0000\u0000\u0000\u04e6\u04e7\u0001\u0000"+ + "\u0000\u0000\u04e7\u04e8\u0003b1\u0000\u04e8\u04e9\u0005h\u0000\u0000"+ + "\u04e9\u04ea\u0003\u0146\u00a3\u0000\u04ea\u04eb\u0003\u0144\u00a2\u0000"+ + "\u04eb\u04f4\u0001\u0000\u0000\u0000\u04ec\u04ee\u0005\u001b\u0000\u0000"+ + "\u04ed\u04ec\u0001\u0000\u0000\u0000\u04ed\u04ee\u0001\u0000\u0000\u0000"+ + "\u04ee\u04ef\u0001\u0000\u0000\u0000\u04ef\u04f0\u0003b1\u0000\u04f0\u04f1"+ + "\u0005h\u0000\u0000\u04f1\u04f2\u0003\u0146\u00a3\u0000\u04f2\u04f4\u0001"+ + "\u0000\u0000\u0000\u04f3\u04e5\u0001\u0000\u0000\u0000\u04f3\u04ed\u0001"+ + "\u0000\u0000\u0000\u04f4\u00c5\u0001\u0000\u0000\u0000\u04f5\u04fd\u0003"+ + "\u0130\u0098\u0000\u04f6\u04fd\u0003\u00c8d\u0000\u04f7\u04fd\u0003P("+ + "\u0000\u04f8\u04f9\u0005i\u0000\u0000\u04f9\u04fa\u0003\u00c6c\u0000\u04fa"+ + "\u04fb\u0005j\u0000\u0000\u04fb\u04fd\u0001\u0000\u0000\u0000\u04fc\u04f5"+ + "\u0001\u0000\u0000\u0000\u04fc\u04f6\u0001\u0000\u0000\u0000\u04fc\u04f7"+ + "\u0001\u0000\u0000\u0000\u04fc\u04f8\u0001\u0000\u0000\u0000\u04fd\u00c7"+ + "\u0001\u0000\u0000\u0000\u04fe\u0508\u0003\u0132\u0099\u0000\u04ff\u0508"+ + "\u0003\u0162\u00b1\u0000\u0500\u0508\u0003\u0138\u009c\u0000\u0501\u0508"+ + "\u0003\u0140\u00a0\u0000\u0502\u0508\u0003\u00c0`\u0000\u0503\u0508\u0003"+ + "\u013a\u009d\u0000\u0504\u0508\u0003\u013c\u009e\u0000\u0505\u0508\u0003"+ + "\u013e\u009f\u0000\u0506\u0508\u0003\u00cae\u0000\u0507\u04fe\u0001\u0000"+ + "\u0000\u0000\u0507\u04ff\u0001\u0000\u0000\u0000\u0507\u0500\u0001\u0000"+ + "\u0000\u0000\u0507\u0501\u0001\u0000\u0000\u0000\u0507\u0502\u0001\u0000"+ + "\u0000\u0000\u0507\u0503\u0001\u0000\u0000\u0000\u0507\u0504\u0001\u0000"+ + "\u0000\u0000\u0507\u0505\u0001\u0000\u0000\u0000\u0507\u0506\u0001\u0000"+ + "\u0000\u0000\u0508\u00c9\u0001\u0000\u0000\u0000\u0509\u050a\u00059\u0000"+ + "\u0000\u050a\u050b\u0003\u00ccf\u0000\u050b\u00cb\u0001\u0000\u0000\u0000"+ + "\u050c\u0518\u0005i\u0000\u0000\u050d\u0512\u0003\u00c6c\u0000\u050e\u050f"+ + "\u0005p\u0000\u0000\u050f\u0511\u0003\u00c6c\u0000\u0510\u050e\u0001\u0000"+ + "\u0000\u0000\u0511\u0514\u0001\u0000\u0000\u0000\u0512\u0510\u0001\u0000"+ + "\u0000\u0000\u0512\u0513\u0001\u0000\u0000\u0000\u0513\u0516\u0001\u0000"+ + "\u0000\u0000\u0514\u0512\u0001\u0000\u0000\u0000\u0515\u0517\u0005p\u0000"+ + "\u0000\u0516\u0515\u0001\u0000\u0000\u0000\u0516\u0517\u0001\u0000\u0000"+ + "\u0000\u0517\u0519\u0001\u0000\u0000\u0000\u0518\u050d\u0001\u0000\u0000"+ + "\u0000\u0518\u0519\u0001\u0000\u0000\u0000\u0519\u051a\u0001\u0000\u0000"+ + "\u0000\u051a\u051b\u0005j\u0000\u0000\u051b\u00cd\u0001\u0000\u0000\u0000"+ + "\u051c\u0524\u0003\u0162\u00b1\u0000\u051d\u0524\u0003\u0132\u0099\u0000"+ + "\u051e\u0524\u0003\u00d0h\u0000\u051f\u0524\u0003\u013a\u009d\u0000\u0520"+ + "\u0524\u0003\u013c\u009e\u0000\u0521\u0524\u0003P(\u0000\u0522\u0524\u0003"+ + "\u0130\u0098\u0000\u0523\u051c\u0001\u0000\u0000\u0000\u0523\u051d\u0001"+ + "\u0000\u0000\u0000\u0523\u051e\u0001\u0000\u0000\u0000\u0523\u051f\u0001"+ + "\u0000\u0000\u0000\u0523\u0520\u0001\u0000\u0000\u0000\u0523\u0521\u0001"+ + "\u0000\u0000\u0000\u0523\u0522\u0001\u0000\u0000\u0000\u0524\u00cf\u0001"+ + "\u0000\u0000\u0000\u0525\u0526\u0005m\u0000\u0000\u0526\u0527\u0005w\u0000"+ + "\u0000\u0527\u0528\u0005n\u0000\u0000\u0528\u0529\u0003\u0136\u009b\u0000"+ + "\u0529\u00d1\u0001\u0000\u0000\u0000\u052a\u053a\u0005m\u0000\u0000\u052b"+ + "\u052d\u0003\u00d4j\u0000\u052c\u052b\u0001\u0000\u0000\u0000\u052c\u052d"+ + "\u0001\u0000\u0000\u0000\u052d\u052e\u0001\u0000\u0000\u0000\u052e\u0530"+ + "\u0005r\u0000\u0000\u052f\u0531\u0003\u00d6k\u0000\u0530\u052f\u0001\u0000"+ + "\u0000\u0000\u0530\u0531\u0001\u0000\u0000\u0000\u0531\u053b\u0001\u0000"+ + "\u0000\u0000\u0532\u0534\u0003\u00d4j\u0000\u0533\u0532\u0001\u0000\u0000"+ + "\u0000\u0533\u0534\u0001\u0000\u0000\u0000\u0534\u0535\u0001\u0000\u0000"+ + "\u0000\u0535\u0536\u0005r\u0000\u0000\u0536\u0537\u0003\u00d6k\u0000\u0537"+ + "\u0538\u0005r\u0000\u0000\u0538\u0539\u0003\u00d8l\u0000\u0539\u053b\u0001"+ + "\u0000\u0000\u0000\u053a\u052c\u0001\u0000\u0000\u0000\u053a\u0533\u0001"+ + "\u0000\u0000\u0000\u053b\u053c\u0001\u0000\u0000\u0000\u053c\u053d\u0005"+ + "n\u0000\u0000\u053d\u00d3\u0001\u0000\u0000\u0000\u053e\u053f\u0003\u00a8"+ + "T\u0000\u053f\u00d5\u0001\u0000\u0000\u0000\u0540\u0541\u0003\u00a8T\u0000"+ + "\u0541\u00d7\u0001\u0000\u0000\u0000\u0542\u0543\u0003\u00a8T\u0000\u0543"+ + "\u00d9\u0001\u0000\u0000\u0000\u0544\u0546\u0007\u000e\u0000\u0000\u0545"+ + "\u0544\u0001\u0000\u0000\u0000\u0545\u0546\u0001\u0000\u0000\u0000\u0546"+ + "\u0547\u0001\u0000\u0000\u0000\u0547\u0548\u0005o\u0000\u0000\u0548\u00db"+ + "\u0001\u0000\u0000\u0000\u0549\u054a\u0003\u00eau\u0000\u054a\u054b\u0005"+ + "o\u0000\u0000\u054b\u0550\u0001\u0000\u0000\u0000\u054c\u054d\u0003\u0006"+ + "\u0003\u0000\u054d\u054e\u0005v\u0000\u0000\u054e\u0550\u0001\u0000\u0000"+ + "\u0000\u054f\u0549\u0001\u0000\u0000\u0000\u054f\u054c\u0001\u0000\u0000"+ + "\u0000\u054f\u0550\u0001\u0000\u0000\u0000\u0550\u0551\u0001\u0000\u0000"+ + "\u0000\u0551\u0552\u0005`\u0000\u0000\u0552\u0557\u0003\u00a8T\u0000\u0553"+ + "\u0555\u0005K\u0000\u0000\u0554\u0556\u0005h\u0000\u0000\u0555\u0554\u0001"+ + "\u0000\u0000\u0000\u0555\u0556\u0001\u0000\u0000\u0000\u0556\u0558\u0001"+ + "\u0000\u0000\u0000\u0557\u0553\u0001\u0000\u0000\u0000\u0557\u0558\u0001"+ + "\u0000\u0000\u0000\u0558\u00dd\u0001\u0000\u0000\u0000\u0559\u055a\u0005"+ + "[\u0000\u0000\u055a\u055b\u0005h\u0000\u0000\u055b\u00df\u0001\u0000\u0000"+ + "\u0000\u055c\u055d\u0003\u0166\u00b3\u0000\u055d\u00e1\u0001\u0000\u0000"+ + "\u0000\u055e\u0562\u0003\u00e4r\u0000\u055f\u0562\u0003\u00ecv\u0000\u0560"+ + "\u0562\u0003\u00f0x\u0000\u0561\u055e\u0001\u0000\u0000\u0000\u0561\u055f"+ + "\u0001\u0000\u0000\u0000\u0561\u0560\u0001\u0000\u0000\u0000\u0562\u00e3"+ + "\u0001\u0000\u0000\u0000\u0563\u056f\u0005]\u0000\u0000\u0564\u0570\u0003"+ + "\u00e6s\u0000\u0565\u056b\u0005i\u0000\u0000\u0566\u0567\u0003\u00e6s"+ + "\u0000\u0567\u0568\u0003\u0174\u00ba\u0000\u0568\u056a\u0001\u0000\u0000"+ + "\u0000\u0569\u0566\u0001\u0000\u0000\u0000\u056a\u056d\u0001\u0000\u0000"+ + "\u0000\u056b\u0569\u0001\u0000\u0000\u0000\u056b\u056c\u0001\u0000\u0000"+ + "\u0000\u056c\u056e\u0001\u0000\u0000\u0000\u056d\u056b\u0001\u0000\u0000"+ + "\u0000\u056e\u0570\u0005j\u0000\u0000\u056f\u0564\u0001\u0000\u0000\u0000"+ + "\u056f\u0565\u0001\u0000\u0000\u0000\u0570\u00e5\u0001\u0000\u0000\u0000"+ + "\u0571\u0577\u0003\u00e8t\u0000\u0572\u0574\u0003\u00c6c\u0000\u0573\u0572"+ + "\u0001\u0000\u0000\u0000\u0573\u0574\u0001\u0000\u0000\u0000\u0574\u0575"+ + "\u0001\u0000\u0000\u0000\u0575\u0576\u0005o\u0000\u0000\u0576\u0578\u0003"+ + "\u00eau\u0000\u0577\u0573\u0001\u0000\u0000\u0000\u0577\u0578\u0001\u0000"+ + "\u0000\u0000\u0578\u00e7\u0001\u0000\u0000\u0000\u0579\u057e\u0005h\u0000"+ + "\u0000\u057a\u057b\u0005p\u0000\u0000\u057b\u057d\u0005h\u0000\u0000\u057c"+ + "\u057a\u0001\u0000\u0000\u0000\u057d\u0580\u0001\u0000\u0000\u0000\u057e"+ + "\u057c\u0001\u0000\u0000\u0000\u057e\u057f\u0001\u0000\u0000\u0000\u057f"+ + "\u00e9\u0001\u0000\u0000\u0000\u0580\u057e\u0001\u0000\u0000\u0000\u0581"+ + "\u0586\u0003\u00a8T\u0000\u0582\u0583\u0005p\u0000\u0000\u0583\u0585\u0003"+ + "\u00a8T\u0000\u0584\u0582\u0001\u0000\u0000\u0000\u0585\u0588\u0001\u0000"+ + "\u0000\u0000\u0586\u0584\u0001\u0000\u0000\u0000\u0586\u0587\u0001\u0000"+ + "\u0000\u0000\u0587\u00eb\u0001\u0000\u0000\u0000\u0588\u0586\u0001\u0000"+ + "\u0000\u0000\u0589\u0595\u0005a\u0000\u0000\u058a\u0596\u0003\u00eew\u0000"+ + "\u058b\u0591\u0005i\u0000\u0000\u058c\u058d\u0003\u00eew\u0000\u058d\u058e"+ + "\u0003\u0174\u00ba\u0000\u058e\u0590\u0001\u0000\u0000\u0000\u058f\u058c"+ + "\u0001\u0000\u0000\u0000\u0590\u0593\u0001\u0000\u0000\u0000\u0591\u058f"+ + "\u0001\u0000\u0000\u0000\u0591\u0592\u0001\u0000\u0000\u0000\u0592\u0594"+ + "\u0001\u0000\u0000\u0000\u0593\u0591\u0001\u0000\u0000\u0000\u0594\u0596"+ + "\u0005j\u0000\u0000\u0595\u058a\u0001\u0000\u0000\u0000\u0595\u058b\u0001"+ + "\u0000\u0000\u0000\u0596\u00ed\u0001\u0000\u0000\u0000\u0597\u0599\u0005"+ + "h\u0000\u0000\u0598\u059a\u0005o\u0000\u0000\u0599\u0598\u0001\u0000\u0000"+ + "\u0000\u0599\u059a\u0001\u0000\u0000\u0000\u059a\u059b\u0001\u0000\u0000"+ + "\u0000\u059b\u059c\u0003\u00c6c\u0000\u059c\u00ef\u0001\u0000\u0000\u0000"+ + "\u059d\u05a9\u0005f\u0000\u0000\u059e\u05aa\u0003\u009aM\u0000\u059f\u05a5"+ + "\u0005i\u0000\u0000\u05a0\u05a1\u0003\u009aM\u0000\u05a1\u05a2\u0003\u0174"+ + "\u00ba\u0000\u05a2\u05a4\u0001\u0000\u0000\u0000\u05a3\u05a0\u0001\u0000"+ + "\u0000\u0000\u05a4\u05a7\u0001\u0000\u0000\u0000\u05a5\u05a3\u0001\u0000"+ + "\u0000\u0000\u05a5\u05a6\u0001\u0000\u0000\u0000\u05a6\u05a8\u0001\u0000"+ + "\u0000\u0000\u05a7\u05a5\u0001\u0000\u0000\u0000\u05a8\u05aa\u0005j\u0000"+ + "\u0000\u05a9\u059e\u0001\u0000\u0000\u0000\u05a9\u059f\u0001\u0000\u0000"+ + "\u0000\u05aa\u00f1\u0001\u0000\u0000\u0000\u05ab\u05ad\u0005k\u0000\u0000"+ + "\u05ac\u05ae\u0003\u00f4z\u0000\u05ad\u05ac\u0001\u0000\u0000\u0000\u05ad"+ + "\u05ae\u0001\u0000\u0000\u0000\u05ae\u05af\u0001\u0000\u0000\u0000\u05af"+ + "\u05b0\u0005l\u0000\u0000\u05b0\u00f3\u0001\u0000\u0000\u0000\u05b1\u05b3"+ + "\u0005q\u0000\u0000\u05b2\u05b1\u0001\u0000\u0000\u0000\u05b2\u05b3\u0001"+ + "\u0000\u0000\u0000\u05b3\u05b9\u0001\u0000\u0000\u0000\u05b4\u05b6\u0005"+ + "\u00a2\u0000\u0000\u05b5\u05b4\u0001\u0000\u0000\u0000\u05b5\u05b6\u0001"+ + "\u0000\u0000\u0000\u05b6\u05b9\u0001\u0000\u0000\u0000\u05b7\u05b9\u0004"+ + "z\u0012\u0000\u05b8\u05b2\u0001\u0000\u0000\u0000\u05b8\u05b5\u0001\u0000"+ + "\u0000\u0000\u05b8\u05b7\u0001\u0000\u0000\u0000\u05b9\u05ba\u0001\u0000"+ + "\u0000\u0000\u05ba\u05bb\u0003\u00aaU\u0000\u05bb\u05bc\u0003\u0174\u00ba"+ + "\u0000\u05bc\u05be\u0001\u0000\u0000\u0000\u05bd\u05b8\u0001\u0000\u0000"+ + "\u0000\u05be\u05bf\u0001\u0000\u0000\u0000\u05bf\u05bd\u0001\u0000\u0000"+ + "\u0000\u05bf\u05c0\u0001\u0000\u0000\u0000\u05c0\u00f5\u0001\u0000\u0000"+ + "\u0000\u05c1\u05c7\u0003\u00fa}\u0000\u05c2\u05c7\u0003\u00fc~\u0000\u05c3"+ + "\u05c7\u0003\u00fe\u007f\u0000\u05c4\u05c7\u0003\u00f8|\u0000\u05c5\u05c7"+ + "\u0003\u009cN\u0000\u05c6\u05c1\u0001\u0000\u0000\u0000\u05c6\u05c2\u0001"+ + "\u0000\u0000\u0000\u05c6\u05c3\u0001\u0000\u0000\u0000\u05c6\u05c4\u0001"+ + "\u0000\u0000\u0000\u05c6\u05c5\u0001\u0000\u0000\u0000\u05c7\u00f7\u0001"+ + "\u0000\u0000\u0000\u05c8\u05c9\u0003\u00a8T\u0000\u05c9\u00f9\u0001\u0000"+ + "\u0000\u0000\u05ca\u05cb\u0003\u00a8T\u0000\u05cb\u05cc\u0005\u008c\u0000"+ + "\u0000\u05cc\u05cd\u0003\u00a8T\u0000\u05cd\u00fb\u0001\u0000\u0000\u0000"+ + "\u05ce\u05cf\u0003\u00a8T\u0000\u05cf\u05d0\u0007\u000f\u0000\u0000\u05d0"+ + "\u00fd\u0001\u0000\u0000\u0000\u05d1\u05d2\u0003\u00eau\u0000\u05d2\u05d3"+ + "\u0003\u00dam\u0000\u05d3\u05d4\u0003\u00eau\u0000\u05d4\u00ff\u0001\u0000"+ + "\u0000\u0000\u05d5\u05d6\u0007\u0010\u0000\u0000\u05d6\u0101\u0001\u0000"+ + "\u0000\u0000\u05d7\u05d8\u0005h\u0000\u0000\u05d8\u05da\u0005r\u0000\u0000"+ + "\u05d9\u05db\u0003\u00aaU\u0000\u05da\u05d9\u0001\u0000\u0000\u0000\u05da"+ + "\u05db\u0001\u0000\u0000\u0000\u05db\u0103\u0001\u0000\u0000\u0000\u05dc"+ + "\u05de\u0005e\u0000\u0000\u05dd\u05df\u0003\u00eau\u0000\u05de\u05dd\u0001"+ + "\u0000\u0000\u0000\u05de\u05df\u0001\u0000\u0000\u0000\u05df\u0105\u0001"+ + "\u0000\u0000\u0000\u05e0\u05e2\u0005N\u0000\u0000\u05e1\u05e3\u0005h\u0000"+ + "\u0000\u05e2\u05e1\u0001\u0000\u0000\u0000\u05e2\u05e3\u0001\u0000\u0000"+ + "\u0000\u05e3\u0107\u0001\u0000\u0000\u0000\u05e4\u05e6\u0005b\u0000\u0000"+ + "\u05e5\u05e7\u0005h\u0000\u0000\u05e6\u05e5\u0001\u0000\u0000\u0000\u05e6"+ + "\u05e7\u0001\u0000\u0000\u0000\u05e7\u0109\u0001\u0000\u0000\u0000\u05e8"+ + "\u05e9\u0005Z\u0000\u0000\u05e9\u05ea\u0005h\u0000\u0000\u05ea\u010b\u0001"+ + "\u0000\u0000\u0000\u05eb\u05ec\u0005^\u0000\u0000\u05ec\u010d\u0001\u0000"+ + "\u0000\u0000\u05ed\u05f6\u0005_\u0000\u0000\u05ee\u05f7\u0003\u00a8T\u0000"+ + "\u05ef\u05f0\u0003\u0174\u00ba\u0000\u05f0\u05f1\u0003\u00a8T\u0000\u05f1"+ + "\u05f7\u0001\u0000\u0000\u0000\u05f2\u05f3\u0003\u00f6{\u0000\u05f3\u05f4"+ + "\u0003\u0174\u00ba\u0000\u05f4\u05f5\u0003\u00a8T\u0000\u05f5\u05f7\u0001"+ + "\u0000\u0000\u0000\u05f6\u05ee\u0001\u0000\u0000\u0000\u05f6\u05ef\u0001"+ + "\u0000\u0000\u0000\u05f6\u05f2\u0001\u0000\u0000\u0000\u05f7\u05f8\u0001"+ + "\u0000\u0000\u0000\u05f8\u05fe\u0003\u00f2y\u0000\u05f9\u05fc\u0005Y\u0000"+ + "\u0000\u05fa\u05fd\u0003\u010e\u0087\u0000\u05fb\u05fd\u0003\u00f2y\u0000"+ + "\u05fc\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fb\u0001\u0000\u0000\u0000"+ + "\u05fd\u05ff\u0001\u0000\u0000\u0000\u05fe\u05f9\u0001\u0000\u0000\u0000"+ + "\u05fe\u05ff\u0001\u0000\u0000\u0000\u05ff\u010f\u0001\u0000\u0000\u0000"+ + "\u0600\u0603\u0003\u0112\u0089\u0000\u0601\u0603\u0003\u0118\u008c\u0000"+ + "\u0602\u0600\u0001\u0000\u0000\u0000\u0602\u0601\u0001\u0000\u0000\u0000"+ + "\u0603\u0111\u0001\u0000\u0000\u0000\u0604\u060f\u0005\\\u0000\u0000\u0605"+ + "\u0607\u0003\u00a8T\u0000\u0606\u0605\u0001\u0000\u0000\u0000\u0606\u0607"+ + "\u0001\u0000\u0000\u0000\u0607\u0610\u0001\u0000\u0000\u0000\u0608\u060a"+ + "\u0003\u00f6{\u0000\u0609\u0608\u0001\u0000\u0000\u0000\u0609\u060a\u0001"+ + "\u0000\u0000\u0000\u060a\u060b\u0001\u0000\u0000\u0000\u060b\u060d\u0003"+ + "\u0174\u00ba\u0000\u060c\u060e\u0003\u00a8T\u0000\u060d\u060c\u0001\u0000"+ + "\u0000\u0000\u060d\u060e\u0001\u0000\u0000\u0000\u060e\u0610\u0001\u0000"+ + "\u0000\u0000\u060f\u0606\u0001\u0000\u0000\u0000\u060f\u0609\u0001\u0000"+ + "\u0000\u0000\u0610\u0611\u0001\u0000\u0000\u0000\u0611\u0615\u0005k\u0000"+ + "\u0000\u0612\u0614\u0003\u0114\u008a\u0000\u0613\u0612\u0001\u0000\u0000"+ + "\u0000\u0614\u0617\u0001\u0000\u0000\u0000\u0615\u0613\u0001\u0000\u0000"+ + "\u0000\u0615\u0616\u0001\u0000\u0000\u0000\u0616\u0618\u0001\u0000\u0000"+ + "\u0000\u0617\u0615\u0001\u0000\u0000\u0000\u0618\u0619\u0005l\u0000\u0000"+ + "\u0619\u0113\u0001\u0000\u0000\u0000\u061a\u061b\u0003\u0116\u008b\u0000"+ + "\u061b\u061d\u0005r\u0000\u0000\u061c\u061e\u0003\u00f4z\u0000\u061d\u061c"+ + "\u0001\u0000\u0000\u0000\u061d\u061e\u0001\u0000\u0000\u0000\u061e\u0115"+ + "\u0001\u0000\u0000\u0000\u061f\u0620\u0005S\u0000\u0000\u0620\u0623\u0003"+ + "\u00eau\u0000\u0621\u0623\u0005O\u0000\u0000\u0622\u061f\u0001\u0000\u0000"+ + "\u0000\u0622\u0621\u0001\u0000\u0000\u0000\u0623\u0117\u0001\u0000\u0000"+ + "\u0000\u0624\u062d\u0005\\\u0000\u0000\u0625\u062e\u0003\u011a\u008d\u0000"+ + "\u0626\u0627\u0003\u0174\u00ba\u0000\u0627\u0628\u0003\u011a\u008d\u0000"+ + "\u0628\u062e\u0001\u0000\u0000\u0000\u0629\u062a\u0003\u00f6{\u0000\u062a"+ + "\u062b\u0003\u0174\u00ba\u0000\u062b\u062c\u0003\u011a\u008d\u0000\u062c"+ + "\u062e\u0001\u0000\u0000\u0000\u062d\u0625\u0001\u0000\u0000\u0000\u062d"+ + "\u0626\u0001\u0000\u0000\u0000\u062d\u0629\u0001\u0000\u0000\u0000\u062e"+ + "\u062f\u0001\u0000\u0000\u0000\u062f\u0633\u0005k\u0000\u0000\u0630\u0632"+ + "\u0003\u011c\u008e\u0000\u0631\u0630\u0001\u0000\u0000\u0000\u0632\u0635"+ + "\u0001\u0000\u0000\u0000\u0633\u0631\u0001\u0000\u0000\u0000\u0633\u0634"+ + "\u0001\u0000\u0000\u0000\u0634\u0636\u0001\u0000\u0000\u0000\u0635\u0633"+ + "\u0001\u0000\u0000\u0000\u0636\u0637\u0005l\u0000\u0000\u0637\u0119\u0001"+ + "\u0000\u0000\u0000\u0638\u0639\u0005h\u0000\u0000\u0639\u063b\u0005v\u0000"+ + "\u0000\u063a\u0638\u0001\u0000\u0000\u0000\u063a\u063b\u0001\u0000\u0000"+ + "\u0000\u063b\u063c\u0001\u0000\u0000\u0000\u063c\u063d\u0003\u00b8\\\u0000"+ + "\u063d\u063e\u0005s\u0000\u0000\u063e\u063f\u0005i\u0000\u0000\u063f\u0640"+ + "\u0005a\u0000\u0000\u0640\u0641\u0005j\u0000\u0000\u0641\u011b\u0001\u0000"+ + "\u0000\u0000\u0642\u0643\u0003\u011e\u008f\u0000\u0643\u0645\u0005r\u0000"+ + "\u0000\u0644\u0646\u0003\u00f4z\u0000\u0645\u0644\u0001\u0000\u0000\u0000"+ + "\u0645\u0646\u0001\u0000\u0000\u0000\u0646\u011d\u0001\u0000\u0000\u0000"+ + "\u0647\u0648\u0005S\u0000\u0000\u0648\u064b\u0003\u0120\u0090\u0000\u0649"+ + "\u064b\u0005O\u0000\u0000\u064a\u0647\u0001\u0000\u0000\u0000\u064a\u0649"+ + "\u0001\u0000\u0000\u0000\u064b\u011f\u0001\u0000\u0000\u0000\u064c\u064f"+ + "\u0003\u00c6c\u0000\u064d\u064f\u0005g\u0000\u0000\u064e\u064c\u0001\u0000"+ + "\u0000\u0000\u064e\u064d\u0001\u0000\u0000\u0000\u064f\u0657\u0001\u0000"+ + "\u0000\u0000\u0650\u0653\u0005p\u0000\u0000\u0651\u0654\u0003\u00c6c\u0000"+ + "\u0652\u0654\u0005g\u0000\u0000\u0653\u0651\u0001\u0000\u0000\u0000\u0653"+ + "\u0652\u0001\u0000\u0000\u0000\u0654\u0656\u0001\u0000\u0000\u0000\u0655"+ + "\u0650\u0001\u0000\u0000\u0000\u0656\u0659\u0001\u0000\u0000\u0000\u0657"+ + "\u0655\u0001\u0000\u0000\u0000\u0657\u0658\u0001\u0000\u0000\u0000\u0658"+ + "\u0121\u0001\u0000\u0000\u0000\u0659\u0657\u0001\u0000\u0000\u0000\u065a"+ + "\u065b\u0005R\u0000\u0000\u065b\u065f\u0005k\u0000\u0000\u065c\u065e\u0003"+ + "\u0124\u0092\u0000\u065d\u065c\u0001\u0000\u0000\u0000\u065e\u0661\u0001"+ + "\u0000\u0000\u0000\u065f\u065d\u0001\u0000\u0000\u0000\u065f\u0660\u0001"+ + "\u0000\u0000\u0000\u0660\u0662\u0001\u0000\u0000\u0000\u0661\u065f\u0001"+ + "\u0000\u0000\u0000\u0662\u0663\u0005l\u0000\u0000\u0663\u0123\u0001\u0000"+ + "\u0000\u0000\u0664\u0665\u0003\u0126\u0093\u0000\u0665\u0667\u0005r\u0000"+ + "\u0000\u0666\u0668\u0003\u00f4z\u0000\u0667\u0666\u0001\u0000\u0000\u0000"+ + "\u0667\u0668\u0001\u0000\u0000\u0000\u0668\u0125\u0001\u0000\u0000\u0000"+ + "\u0669\u066c\u0005S\u0000\u0000\u066a\u066d\u0003\u00fa}\u0000\u066b\u066d"+ + "\u0003\u0128\u0094\u0000\u066c\u066a\u0001\u0000\u0000\u0000\u066c\u066b"+ + "\u0001\u0000\u0000\u0000\u066d\u0670\u0001\u0000\u0000\u0000\u066e\u0670"+ + "\u0005O\u0000\u0000\u066f\u0669\u0001\u0000\u0000\u0000\u066f\u066e\u0001"+ + "\u0000\u0000\u0000\u0670\u0127\u0001\u0000\u0000\u0000\u0671\u0672\u0003"+ + "\u00eau\u0000\u0672\u0673\u0005o\u0000\u0000\u0673\u0678\u0001\u0000\u0000"+ + "\u0000\u0674\u0675\u0003\u00e8t\u0000\u0675\u0676\u0005v\u0000\u0000\u0676"+ + "\u0678\u0001\u0000\u0000\u0000\u0677\u0671\u0001\u0000\u0000\u0000\u0677"+ + "\u0674\u0001\u0000\u0000\u0000\u0677\u0678\u0001\u0000\u0000\u0000\u0678"+ + "\u0679\u0001\u0000\u0000\u0000\u0679\u067a\u0003\u00a8T\u0000\u067a\u0129"+ + "\u0001\u0000\u0000\u0000\u067b\u0683\u0005c\u0000\u0000\u067c\u067e\u0003"+ + "\u00a8T\u0000\u067d\u067c\u0001\u0000\u0000\u0000\u067d\u067e\u0001\u0000"+ + "\u0000\u0000\u067e\u0684\u0001\u0000\u0000\u0000\u067f\u0684\u0003\u012c"+ + "\u0096\u0000\u0680\u0682\u0003\u00dcn\u0000\u0681\u0680\u0001\u0000\u0000"+ + "\u0000\u0681\u0682\u0001\u0000\u0000\u0000\u0682\u0684\u0001\u0000\u0000"+ + "\u0000\u0683\u067d\u0001\u0000\u0000\u0000\u0683\u067f\u0001\u0000\u0000"+ + "\u0000\u0683\u0681\u0001\u0000\u0000\u0000\u0684\u0685\u0001\u0000\u0000"+ + "\u0000\u0685\u0686\u0003\u00f2y\u0000\u0686\u012b\u0001\u0000\u0000\u0000"+ + "\u0687\u0689\u0003\u00f6{\u0000\u0688\u0687\u0001\u0000\u0000\u0000\u0688"+ + "\u0689\u0001\u0000\u0000\u0000\u0689\u068a\u0001\u0000\u0000\u0000\u068a"+ + "\u068c\u0003\u0174\u00ba\u0000\u068b\u068d\u0003\u00a8T\u0000\u068c\u068b"+ + "\u0001\u0000\u0000\u0000\u068c\u068d\u0001\u0000\u0000\u0000\u068d\u068e"+ + "\u0001\u0000\u0000\u0000\u068e\u0690\u0003\u0174\u00ba\u0000\u068f\u0691"+ + "\u0003\u00f6{\u0000\u0690\u068f\u0001\u0000\u0000\u0000\u0690\u0691\u0001"+ + "\u0000\u0000\u0000\u0691\u012d\u0001\u0000\u0000\u0000\u0692\u0693\u0005"+ + "U\u0000\u0000\u0693\u0694\u0003\u00a8T\u0000\u0694\u012f\u0001\u0000\u0000"+ + "\u0000\u0695\u0698\u0003\u0154\u00aa\u0000\u0696\u0698\u0005h\u0000\u0000"+ + "\u0697\u0695\u0001\u0000\u0000\u0000\u0697\u0696\u0001\u0000\u0000\u0000"+ + "\u0698\u0131\u0001\u0000\u0000\u0000\u0699\u069a\u0005m\u0000\u0000\u069a"+ + "\u069b\u0003\u0134\u009a\u0000\u069b\u069c\u0005n\u0000\u0000\u069c\u069d"+ + "\u0003\u0136\u009b\u0000\u069d\u0133\u0001\u0000\u0000\u0000\u069e\u069f"+ + "\u0003\u00a8T\u0000\u069f\u0135\u0001\u0000\u0000\u0000\u06a0\u06a1\u0003"+ + "\u00c6c\u0000\u06a1\u0137\u0001\u0000\u0000\u0000\u06a2\u06a3\u0005\u008a"+ + "\u0000\u0000\u06a3\u06a4\u0003\u00c6c\u0000\u06a4\u0139\u0001\u0000\u0000"+ + "\u0000\u06a5\u06a6\u0005m\u0000\u0000\u06a6\u06a7\u0005n\u0000\u0000\u06a7"+ + "\u06a8\u0003\u0136\u009b\u0000\u06a8\u013b\u0001\u0000\u0000\u0000\u06a9"+ + "\u06aa\u0005V\u0000\u0000\u06aa\u06ab\u0005m\u0000\u0000\u06ab\u06ac\u0003"+ + "\u00c6c\u0000\u06ac\u06ad\u0005n\u0000\u0000\u06ad\u06ae\u0003\u0136\u009b"+ + "\u0000\u06ae\u013d\u0001\u0000\u0000\u0000\u06af\u06b5\u0005X\u0000\u0000"+ + "\u06b0\u06b1\u0005X\u0000\u0000\u06b1\u06b5\u0005\u008c\u0000\u0000\u06b2"+ + "\u06b3\u0005\u008c\u0000\u0000\u06b3\u06b5\u0005X\u0000\u0000\u06b4\u06af"+ + "\u0001\u0000\u0000\u0000\u06b4\u06b0\u0001\u0000\u0000\u0000\u06b4\u06b2"+ + "\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001\u0000\u0000\u0000\u06b6\u06b7"+ + "\u0003\u0136\u009b\u0000\u06b7\u013f\u0001\u0000\u0000\u0000\u06b8\u06b9"+ + "\u0005P\u0000\u0000\u06b9\u06ba\u0003\u0142\u00a1\u0000\u06ba\u0141\u0001"+ + "\u0000\u0000\u0000\u06bb\u06bc\u0003\u0146\u00a3\u0000\u06bc\u06bd\u0003"+ + "\u0144\u00a2\u0000\u06bd\u06c0\u0001\u0000\u0000\u0000\u06be\u06c0\u0003"+ + "\u0146\u00a3\u0000\u06bf\u06bb\u0001\u0000\u0000\u0000\u06bf\u06be\u0001"+ + "\u0000\u0000\u0000\u06c0\u0143\u0001\u0000\u0000\u0000\u06c1\u06c4\u0003"+ + "\u0146\u00a3\u0000\u06c2\u06c4\u0003\u00c6c\u0000\u06c3\u06c1\u0001\u0000"+ + "\u0000\u0000\u06c3\u06c2\u0001\u0000\u0000\u0000\u06c4\u0145\u0001\u0000"+ + "\u0000\u0000\u06c5\u06d1\u0005i\u0000\u0000\u06c6\u06cb\u0003\u00a0P\u0000"+ + "\u06c7\u06c8\u0005p\u0000\u0000\u06c8\u06ca\u0003\u00a0P\u0000\u06c9\u06c7"+ + "\u0001\u0000\u0000\u0000\u06ca\u06cd\u0001\u0000\u0000\u0000\u06cb\u06c9"+ + "\u0001\u0000\u0000\u0000\u06cb\u06cc\u0001\u0000\u0000\u0000\u06cc\u06cf"+ + "\u0001\u0000\u0000\u0000\u06cd\u06cb\u0001\u0000\u0000\u0000\u06ce\u06d0"+ + "\u0005p\u0000\u0000\u06cf\u06ce\u0001\u0000\u0000\u0000\u06cf\u06d0\u0001"+ + "\u0000\u0000\u0000\u06d0\u06d2\u0001\u0000\u0000\u0000\u06d1\u06c6\u0001"+ + "\u0000\u0000\u0000\u06d1\u06d2\u0001\u0000\u0000\u0000\u06d2\u06d3\u0001"+ + "\u0000\u0000\u0000\u06d3\u06d4\u0005j\u0000\u0000\u06d4\u0147\u0001\u0000"+ + "\u0000\u0000\u06d5\u06d6\u0003\u014a\u00a5\u0000\u06d6\u06d7\u0005i\u0000"+ + "\u0000\u06d7\u06d9\u0003\u00a8T\u0000\u06d8\u06da\u0005p\u0000\u0000\u06d9"+ + "\u06d8\u0001\u0000\u0000\u0000\u06d9\u06da\u0001\u0000\u0000\u0000\u06da"+ + "\u06db\u0001\u0000\u0000\u0000\u06db\u06dc\u0005j\u0000\u0000\u06dc\u0149"+ + "\u0001\u0000\u0000\u0000\u06dd\u06e3\u0003\u00c8d\u0000\u06de\u06df\u0005"+ + "i\u0000\u0000\u06df\u06e0\u0003\u014a\u00a5\u0000\u06e0\u06e1\u0005j\u0000"+ + "\u0000\u06e1\u06e3\u0001\u0000\u0000\u0000\u06e2\u06dd\u0001\u0000\u0000"+ + "\u0000\u06e2\u06de\u0001\u0000\u0000\u0000\u06e3\u014b\u0001\u0000\u0000"+ + "\u0000\u06e4\u06eb\u0003\u014e\u00a7\u0000\u06e5\u06eb\u0003\u0152\u00a9"+ + "\u0000\u06e6\u06e7\u0005i\u0000\u0000\u06e7\u06e8\u0003\u00a8T\u0000\u06e8"+ + "\u06e9\u0005j\u0000\u0000\u06e9\u06eb\u0001\u0000\u0000\u0000\u06ea\u06e4"+ + "\u0001\u0000\u0000\u0000\u06ea\u06e5\u0001\u0000\u0000\u0000\u06ea\u06e6"+ + "\u0001\u0000\u0000\u0000\u06eb\u014d\u0001\u0000\u0000\u0000\u06ec\u06f0"+ + "\u0003\u00b6[\u0000\u06ed\u06f0\u0003\u0156\u00ab\u0000\u06ee\u06f0\u0003"+ + "\u00ba]\u0000\u06ef\u06ec\u0001\u0000\u0000\u0000\u06ef\u06ed\u0001\u0000"+ + "\u0000\u0000\u06ef\u06ee\u0001\u0000\u0000\u0000\u06f0\u014f\u0001\u0000"+ + "\u0000\u0000\u06f1\u06f2\u0007\u0011\u0000\u0000\u06f2\u0151\u0001\u0000"+ + "\u0000\u0000\u06f3\u06f4\u0005h\u0000\u0000\u06f4\u0153\u0001\u0000\u0000"+ + "\u0000\u06f5\u06f6\u0005h\u0000\u0000\u06f6\u06f7\u0005s\u0000\u0000\u06f7"+ + "\u06f8\u0005h\u0000\u0000\u06f8\u0155\u0001\u0000\u0000\u0000\u06f9\u06fa"+ + "\u0003\u00ceg\u0000\u06fa\u06fb\u0003\u0158\u00ac\u0000\u06fb\u0157\u0001"+ + "\u0000\u0000\u0000\u06fc\u0701\u0005k\u0000\u0000\u06fd\u06ff\u0003\u015a"+ + "\u00ad\u0000\u06fe\u0700\u0005p\u0000\u0000\u06ff\u06fe\u0001\u0000\u0000"+ + "\u0000\u06ff\u0700\u0001\u0000\u0000\u0000\u0700\u0702\u0001\u0000\u0000"+ + "\u0000\u0701\u06fd\u0001\u0000\u0000\u0000\u0701\u0702\u0001\u0000\u0000"+ + "\u0000\u0702\u0703\u0001\u0000\u0000\u0000\u0703\u0704\u0005l\u0000\u0000"+ + "\u0704\u0159\u0001\u0000\u0000\u0000\u0705\u070a\u0003\u015c\u00ae\u0000"+ + "\u0706\u0707\u0005p\u0000\u0000\u0707\u0709\u0003\u015c\u00ae\u0000\u0708"+ + "\u0706\u0001\u0000\u0000\u0000\u0709\u070c\u0001\u0000\u0000\u0000\u070a"+ + "\u0708\u0001\u0000\u0000\u0000\u070a\u070b\u0001\u0000\u0000\u0000\u070b"+ + "\u015b\u0001\u0000\u0000\u0000\u070c\u070a\u0001\u0000\u0000\u0000\u070d"+ + "\u070e\u0003\u015e\u00af\u0000\u070e\u070f\u0005r\u0000\u0000\u070f\u0711"+ + "\u0001\u0000\u0000\u0000\u0710\u070d\u0001\u0000\u0000\u0000\u0710\u0711"+ + "\u0001\u0000\u0000\u0000\u0711\u0712\u0001\u0000\u0000\u0000\u0712\u0713"+ + "\u0003\u0160\u00b0\u0000\u0713\u015d\u0001\u0000\u0000\u0000\u0714\u0717"+ + "\u0003\u00a8T\u0000\u0715\u0717\u0003\u0158\u00ac\u0000\u0716\u0714\u0001"+ + "\u0000\u0000\u0000\u0716\u0715\u0001\u0000\u0000\u0000\u0717\u015f\u0001"+ + "\u0000\u0000\u0000\u0718\u071b\u0003\u00a8T\u0000\u0719\u071b\u0003\u0158"+ + "\u00ac\u0000\u071a\u0718\u0001\u0000\u0000\u0000\u071a\u0719\u0001\u0000"+ + "\u0000\u0000\u071b\u0161\u0001\u0000\u0000\u0000\u071c\u071d\u0005W\u0000"+ + "\u0000\u071d\u0723\u0005k\u0000\u0000\u071e\u071f\u0003\u0164\u00b2\u0000"+ + "\u071f\u0720\u0003\u0174\u00ba\u0000\u0720\u0722\u0001\u0000\u0000\u0000"+ + "\u0721\u071e\u0001\u0000\u0000\u0000\u0722\u0725\u0001\u0000\u0000\u0000"+ + "\u0723\u0721\u0001\u0000\u0000\u0000\u0723\u0724\u0001\u0000\u0000\u0000"+ + "\u0724\u0726\u0001\u0000\u0000\u0000\u0725\u0723\u0001\u0000\u0000\u0000"+ + "\u0726\u0727\u0005l\u0000\u0000\u0727\u0163\u0001\u0000\u0000\u0000\u0728"+ + "\u0729\u0003\u00e8t\u0000\u0729\u072a\u0003\u00c6c\u0000\u072a\u072d\u0001"+ + "\u0000\u0000\u0000\u072b\u072d\u0003\u0168\u00b4\u0000\u072c\u0728\u0001"+ + "\u0000\u0000\u0000\u072c\u072b\u0001\u0000\u0000\u0000\u072d\u072f\u0001"+ + "\u0000\u0000\u0000\u072e\u0730\u0003\u0166\u00b3\u0000\u072f\u072e\u0001"+ + "\u0000\u0000\u0000\u072f\u0730\u0001\u0000\u0000\u0000\u0730\u0165\u0001"+ + "\u0000\u0000\u0000\u0731\u0732\u0007\u0012\u0000\u0000\u0732\u0167\u0001"+ + "\u0000\u0000\u0000\u0733\u0735\u0005\u008a\u0000\u0000\u0734\u0733\u0001"+ + "\u0000\u0000\u0000\u0734\u0735\u0001\u0000\u0000\u0000\u0735\u0736\u0001"+ + "\u0000\u0000\u0000\u0736\u0737\u0003\u0130\u0098\u0000\u0737\u0169\u0001"+ + "\u0000\u0000\u0000\u0738\u0739\u0005m\u0000\u0000\u0739\u073a\u0003\u00a8"+ + "T\u0000\u073a\u073b\u0005n\u0000\u0000\u073b\u016b\u0001\u0000\u0000\u0000"+ + "\u073c\u073d\u0005s\u0000\u0000\u073d\u073e\u0005i\u0000\u0000\u073e\u073f"+ + "\u0003\u00c6c\u0000\u073f\u0740\u0005j\u0000\u0000\u0740\u016d\u0001\u0000"+ + "\u0000\u0000\u0741\u0750\u0005i\u0000\u0000\u0742\u0749\u0003\u00eau\u0000"+ + "\u0743\u0746\u0003\u014a\u00a5\u0000\u0744\u0745\u0005p\u0000\u0000\u0745"+ + "\u0747\u0003\u00eau\u0000\u0746\u0744\u0001\u0000\u0000\u0000\u0746\u0747"+ + "\u0001\u0000\u0000\u0000\u0747\u0749\u0001\u0000\u0000\u0000\u0748\u0742"+ + "\u0001\u0000\u0000\u0000\u0748\u0743\u0001\u0000\u0000\u0000\u0749\u074b"+ + "\u0001\u0000\u0000\u0000\u074a\u074c\u0005w\u0000\u0000\u074b\u074a\u0001"+ + "\u0000\u0000\u0000\u074b\u074c\u0001\u0000\u0000\u0000\u074c\u074e\u0001"+ + "\u0000\u0000\u0000\u074d\u074f\u0005p\u0000\u0000\u074e\u074d\u0001\u0000"+ + "\u0000\u0000\u074e\u074f\u0001\u0000\u0000\u0000\u074f\u0751\u0001\u0000"+ + "\u0000\u0000\u0750\u0748\u0001\u0000\u0000\u0000\u0750\u0751\u0001\u0000"+ + "\u0000\u0000\u0751\u0752\u0001\u0000\u0000\u0000\u0752\u0753\u0005j\u0000"+ + "\u0000\u0753\u016f\u0001\u0000\u0000\u0000\u0754\u0755\u0003\u014a\u00a5"+ + "\u0000\u0755\u0756\u0005s\u0000\u0000\u0756\u0757\u0005h\u0000\u0000\u0757"+ + "\u0171\u0001\u0000\u0000\u0000\u0758\u0759\u0003\u00c6c\u0000\u0759\u0173"+ + "\u0001\u0000\u0000\u0000\u075a\u075f\u0005q\u0000\u0000\u075b\u075f\u0005"+ + "\u0000\u0000\u0001\u075c\u075f\u0005\u00a2\u0000\u0000\u075d\u075f\u0004"+ + "\u00ba\u0013\u0000\u075e\u075a\u0001\u0000\u0000\u0000\u075e\u075b\u0001"+ + "\u0000\u0000\u0000\u075e\u075c\u0001\u0000\u0000\u0000\u075e\u075d\u0001"+ + "\u0000\u0000\u0000\u075f\u0175\u0001\u0000\u0000\u0000\u00c2\u0184\u0189"+ + "\u0190\u019a\u01a0\u01a6\u01b0\u01ba\u01c8\u01cc\u01d5\u01e1\u01e5\u01eb"+ + "\u01f4\u01fe\u020f\u021d\u0221\u0228\u0230\u0239\u0259\u0261\u0279\u028c"+ + "\u029b\u02a9\u02b2\u02c0\u02c9\u02d5\u02db\u02f4\u02fd\u0302\u0307\u0311"+ + "\u0314\u0318\u031c\u0324\u032c\u0331\u0339\u033b\u0340\u0347\u034f\u0352"+ + "\u0358\u035d\u035f\u0362\u0369\u036e\u0381\u0389\u038d\u0390\u0396\u039a"+ + "\u039d\u03a7\u03ae\u03b5\u03c1\u03c7\u03ce\u03d3\u03d9\u03e5\u03eb\u03ef"+ + "\u03f7\u03fb\u0401\u0404\u040a\u040f\u0428\u044b\u044d\u0464\u046c\u0477"+ + "\u047e\u0485\u048f\u04a1\u04b7\u04b9\u04c1\u04c5\u04c9\u04cc\u04d5\u04db"+ + "\u04e5\u04ed\u04f3\u04fc\u0507\u0512\u0516\u0518\u0523\u052c\u0530\u0533"+ + "\u053a\u0545\u054f\u0555\u0557\u0561\u056b\u056f\u0573\u0577\u057e\u0586"+ + "\u0591\u0595\u0599\u05a5\u05a9\u05ad\u05b2\u05b5\u05b8\u05bf\u05c6\u05da"+ + "\u05de\u05e2\u05e6\u05f6\u05fc\u05fe\u0602\u0606\u0609\u060d\u060f\u0615"+ + "\u061d\u0622\u062d\u0633\u063a\u0645\u064a\u064e\u0653\u0657\u065f\u0667"+ + "\u066c\u066f\u0677\u067d\u0681\u0683\u0688\u068c\u0690\u0697\u06b4\u06bf"+ + "\u06c3\u06cb\u06cf\u06d1\u06d9\u06e2\u06ea\u06ef\u06ff\u0701\u070a\u0710"+ + "\u0716\u071a\u0723\u072c\u072f\u0734\u0746\u0748\u074b\u074e\u0750\u075e"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index 3705ddec4..a4f451acb 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -362,6 +362,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitGhostSliceType(GobraParser.GhostSliceTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitGhostPointerType(GobraParser.GhostPointerTypeContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 5fa3adab8..fa3cc4ecb 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -314,6 +314,12 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitGhostSliceType(GobraParser.GhostSliceTypeContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#ghostPointerType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGhostPointerType(GobraParser.GhostPointerTypeContext ctx); /** * Visit a parse tree produced by {@link GobraParser#sqType}. * @param ctx the parse tree diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index 3e40ac9ed..61ad66a89 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -1247,6 +1247,9 @@ case class PMathematicalMapType(keys: PType, values: PType) extends PGhostLitera /** The type of option types. */ case class POptionType(elem : PType) extends PGhostLiteralType +/** The type of ghost pointers */ +case class PGhostPointerType(elem: PType) extends PGhostLiteralType + /** The type of ADT types */ case class PAdtType(clauses: Vector[PAdtClause]) extends PGhostLiteralType with PUnorderedScope diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index 62cd318fe..fee1642f6 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -650,6 +650,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PMultisetType(elem) => "mset" <> brackets(showType(elem)) case PMathematicalMapType(keys, values) => "dict" <> brackets(showType(keys)) <> showType(values) case POptionType(elem) => "option" <> brackets(showType(elem)) + case PGhostPointerType(elem) => "gpointer" <> brackets(showType(elem)) case PGhostSliceType(elem) => "ghost" <+> brackets(emptyDoc) <> showType(elem) case PDomainType(funcs, axioms) => "domain" <+> block( diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 2dafaa58e..121590a86 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -2979,7 +2979,7 @@ object Desugar extends LazyLogging { case PIntLit(v, base) => single(in.IntLit(v, base = base)) case PBoolLit(b) => single(in.BoolLit(b)) case PStringLit(s) => single(in.StringLit(s)) - case nil: PNilLit => single(in.NilLit(typeD(info.nilType(nil).getOrElse(Type.PointerT(Type.BooleanT)), Addressability.literal)(src))) // if no type is found, then use *bool + case nil: PNilLit => single(in.NilLit(typeD(info.nilType(nil).getOrElse(Type.ActualPointerT(Type.BooleanT)), Addressability.literal)(src))) // if no type is found, then use *bool case f: PFunctionLit => registerFunctionLit(ctx, info)(f) case c: PCompositeLit => compositeLitD(ctx, info)(c) case _ => ??? @@ -3004,7 +3004,7 @@ object Desugar extends LazyLogging { // Both will have type Pointer(typeOf(v)) val src: Meta = meta(v, info) val refAlias = nm.refAlias(idName(v, info), info.scope(v), info) - val param = in.Parameter.In(refAlias, typeD(PointerT(info.typ(v)), Addressability.inParameter)(src))(src) + val param = in.Parameter.In(refAlias, typeD(ActualPointerT(info.typ(v)), Addressability.inParameter)(src))(src) val localVar = in.LocalVar(nm.alias(refAlias, info.scope(v), info), param.typ)(src) (param, localVar) } @@ -3750,7 +3750,7 @@ object Desugar extends LazyLogging { in.MapT(keysD, valuesD, addrMod) case Type.GhostSliceT(elem) => in.SliceT(typeD(elem, Addressability.sliceElement)(src), addrMod) case Type.OptionT(elem) => in.OptionT(typeD(elem, Addressability.mathDataStructureElement)(src), addrMod) - case PointerT(elem) => registerType(in.PointerT(typeD(elem, Addressability.pointerBase)(src), addrMod)) + case p: Type.PointerT => registerType(in.PointerT(typeD(p.elem, Addressability.pointerBase)(src), addrMod)) case Type.ChannelT(elem, _) => in.ChannelT(typeD(elem, Addressability.channelElement)(src), addrMod) case Type.SequenceT(elem) => in.SequenceT(typeD(elem, Addressability.mathDataStructureElement)(src), addrMod) case Type.SetT(elem) => in.SetT(typeD(elem, Addressability.mathDataStructureElement)(src), addrMod) diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index ff64e3de1..9ec87c744 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -500,6 +500,17 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole PGhostSliceType(typ).at(ctx) } + /** + * {@inheritDoc } + * + *

The default implementation returns the result of calling + * {@link # visitChildren} on {@code ctx}.

+ */ + override def visitGhostPointerType(ctx: GhostPointerTypeContext): PGhostPointerType = { + val typ = visitNode[PType](ctx.elementType().type_()) + PGhostPointerType(typ).at(ctx) + } + /** * {@inheritDoc } * diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala index 66cb0fa49..59d2b7465 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -74,7 +74,13 @@ object Type { case class MapT(key: Type, elem: Type) extends PrettyType(s"map[$key]$elem") - case class PointerT(elem: Type) extends PrettyType(s"*$elem") + trait PointerT { + val elem: Type + } + + case class ActualPointerT(elem: Type) extends PrettyType(s"*$elem") with PointerT + + case class GhostPointerT(elem: Type) extends PrettyType(s"gpointer[$elem]") with PointerT case class ChannelT(elem: Type, mod: ChannelModus) extends PrettyType(s"$mod $elem") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index f414d92fe..1b9611b36 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala @@ -110,7 +110,14 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => case e => s"got $e that is not assignable" } { case e if !isMutable(e) => false - case e: PDeref if isEnclosingGhost(e) => false // TODO allow derefs of ghost pointers + case e: PDeref if isEnclosingGhost(e) => + resolve(e) match { + case Some(ap.Deref(base)) => exprType(base) match { + case _: GhostPointerT => true // we dereference a ghost pointer in ghost code + case _ => false + } + case _ => false + } case PIndexedExp(b, _) => underlyingType(exprType(b)) match { case _: ArrayT => assignable(b) case _: SliceT | _: GhostSliceT => assignable(b) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Convertibility.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Convertibility.scala index 6352cbd6b..4d2704ca9 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Convertibility.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Convertibility.scala @@ -6,7 +6,7 @@ package viper.gobra.frontend.info.implementation.property -import viper.gobra.frontend.info.base.Type.{DeclaredT, Float32T, Float64T, IntT, PermissionT, PointerT, Single, SliceT, StringT, Type} +import viper.gobra.frontend.info.base.Type.{ActualPointerT, DeclaredT, Float32T, Float64T, GhostPointerT, IntT, PermissionT, Single, SliceT, StringT, Type} import viper.gobra.frontend.info.implementation.TypeInfoImpl trait Convertibility extends BaseProperty { this: TypeInfoImpl => @@ -29,7 +29,9 @@ trait Convertibility extends BaseProperty { this: TypeInfoImpl => case (left, right) => (underlyingType(left), underlyingType(right)) match { case (l, r) if identicalTypes(l, r) => true case (IntT(_), IntT(_)) => true - case (PointerT(l), PointerT(r)) if identicalTypes(underlyingType(l), underlyingType(r)) && + case (ActualPointerT(l), ActualPointerT(r)) if identicalTypes(underlyingType(l), underlyingType(r)) && + !(left.isInstanceOf[DeclaredT] && right.isInstanceOf[DeclaredT]) => true + case (GhostPointerT(l), GhostPointerT(r)) if identicalTypes(underlyingType(l), underlyingType(r)) && !(left.isInstanceOf[DeclaredT] && right.isInstanceOf[DeclaredT]) => true case _ => false } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala index e8a3c564a..4a01fe2b1 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala @@ -51,7 +51,8 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl => lm.keySet.forall(k => rm.get(k).exists(m => identicalTypes(memberType(m), memberType(lm(k))))) && rm.keySet.forall(k => lm.get(k).exists(m => identicalTypes(memberType(m), memberType(rm(k))))) - case (PointerT(l), PointerT(r)) => identicalTypes(l, r) + case (ActualPointerT(l), ActualPointerT(r)) => identicalTypes(l, r) + case (GhostPointerT(l), GhostPointerT(r)) => identicalTypes(l, r) case (SortT, SortT) => true diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala index b78a0ecda..5edaae0ec 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala @@ -7,7 +7,7 @@ package viper.gobra.frontend.info.implementation.property import viper.gobra.ast.internal.{Float32T, Float64T} -import viper.gobra.frontend.info.base.Type.{ArrayT, AssertionT, BooleanT, ChannelT, GhostSliceT, IntT, InternalTupleT, MapT, MultisetT, PermissionT, PointerT, SequenceT, SetT, Single, SliceT, Type} +import viper.gobra.frontend.info.base.Type.{ActualPointerT, ArrayT, AssertionT, BooleanT, ChannelT, GhostPointerT, GhostSliceT, IntT, InternalTupleT, MapT, MultisetT, PermissionT, SequenceT, SetT, Single, SliceT, Type} import viper.gobra.frontend.info.implementation.TypeInfoImpl trait TypeMerging extends BaseProperty { this: TypeInfoImpl => @@ -45,7 +45,8 @@ trait TypeMerging extends BaseProperty { this: TypeInfoImpl => k <- typeMerge(k1, k2) v <- typeMerge(v1, v2) } yield MapT(k, v) - case (PointerT(l), PointerT(r)) => typeMerge(l, r) map PointerT + case (ActualPointerT(l), ActualPointerT(r)) => typeMerge(l, r) map ActualPointerT + case (GhostPointerT(l), GhostPointerT(r)) => typeMerge(l, r) map GhostPointerT case (ChannelT(l, mod1), ChannelT(r, mod2)) if mod1 == mod2 => typeMerge(l, r) map (ChannelT(_, mod1)) case _ => None } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala index d9c47981b..6131c6548 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala @@ -9,7 +9,7 @@ package viper.gobra.frontend.info.implementation.property import viper.gobra.ast.frontend.{PDeref, PDot, PEmbeddedName, PEmbeddedPointer, PEmbeddedType, PInterfaceType, PNamedOperand, PStructType, PType, PTypeDecl} import viper.gobra.frontend.info.ExternalTypeInfo import viper.gobra.frontend.info.base.BuiltInMemberTag.BuiltInTypeTag -import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelT, DeclaredT, FunctionT, GhostSliceT, IntT, InterfaceT, MapT, NilType, PointerT, Single, SliceT, StringT, StructT, Type} +import viper.gobra.frontend.info.base.Type.{ActualPointerT, BooleanT, ChannelT, DeclaredT, FunctionT, GhostSliceT, IntT, InterfaceT, MapT, NilType, PointerT, Single, SliceT, StringT, StructT, Type} import viper.gobra.frontend.info.base.{SymbolTable => st} import viper.gobra.frontend.info.implementation.TypeInfoImpl @@ -65,7 +65,7 @@ trait UnderlyingType { this: TypeInfoImpl => lazy val derefType: Type => Option[Type] = attr[Type, Option[Type]] { case Single(DeclaredT(t: PTypeDecl, context: ExternalTypeInfo)) => derefType(context.symbType(t.right)) - case Single(PointerT(elem)) => Some(elem) + case Single(p: PointerT) => Some(p.elem) case _ => None } @@ -200,7 +200,7 @@ trait UnderlyingType { this: TypeInfoImpl => lazy val isReceiverType: Property[Type] = createBinaryProperty("not a receiver type") { case _: DeclaredT => true - case PointerT(t) => t.isInstanceOf[DeclaredT] + case ActualPointerT(t) => t.isInstanceOf[DeclaredT] case _ => false } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index 238158abf..c2544cd28 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -50,7 +50,7 @@ trait MemberResolution { this: TypeInfoImpl => def go(pastDeref: Boolean): Type => AdvancedMemberSet[StructMember] = attr[Type, AdvancedMemberSet[StructMember]] { case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface - case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref + case ActualPointerT(t) if !pastDeref => go(pastDeref = true)(t).ref case s: StructT => val (es, fs) = (s.decl.embedded, s.decl.fields) @@ -86,7 +86,7 @@ trait MemberResolution { this: TypeInfoImpl => def go(pastDeref: Boolean): Type => AdvancedMemberSet[AdtMember] = attr[Type, AdvancedMemberSet[AdtMember]] { case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface - case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref + case ActualPointerT(t) if !pastDeref => go(pastDeref = true)(t).ref case t: AdtT => val clauseMemberSets = t.adtDecl.clauses.map(adtClauseMemberSet(_, t.decl, t.adtDecl, t.context)) @@ -225,7 +225,7 @@ trait MemberResolution { this: TypeInfoImpl => def go(pastDeref: Boolean): Type => AdvancedMemberSet[M] = attr[Type, AdvancedMemberSet[M]] { case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface - case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref + case ActualPointerT(t) if !pastDeref => go(pastDeref = true)(t).ref case s: StructT => AdvancedMemberSet.union(s.decl.embedded map { e => @@ -246,15 +246,15 @@ trait MemberResolution { this: TypeInfoImpl => private val pastPromotionsMethodSuffix: Type => AdvancedMemberSet[TypeMember] = attr[Type, AdvancedMemberSet[TypeMember]] { case t: InterfaceT => interfaceMethodSet(t) - case pt@PointerT(t) => receiverSet(pt) union receiverSet(t).ref - case t => receiverSet(t) union receiverSet(PointerT(t)).deref + case pt@ActualPointerT(t) => receiverSet(pt) union receiverSet(t).ref + case t => receiverSet(t) union receiverSet(ActualPointerT(t)).deref } val nonAddressableMethodSet: Type => AdvancedMemberSet[TypeMember] = attr[Type, AdvancedMemberSet[TypeMember]] { case Single(t) => pastPromotions(pastPromotionsMethodSuffix)(t) union (t match { - case pt@ PointerT(st) => receiverSet(pt) union receiverSet(st).ref + case pt@ ActualPointerT(st) => receiverSet(pt) union receiverSet(st).ref case _ => receiverSet(t) }) case _ => AdvancedMemberSet.empty @@ -264,8 +264,8 @@ trait MemberResolution { this: TypeInfoImpl => attr[Type, AdvancedMemberSet[TypeMember]] { case Single(t) => pastPromotions(pastPromotionsMethodSuffix)(t) union (t match { - case pt@ PointerT(st) => receiverSet(pt) union receiverSet(st).ref - case _ => receiverSet(t) union receiverSet(PointerT(t)).deref + case pt@ ActualPointerT(st) => receiverSet(pt) union receiverSet(st).ref + case _ => receiverSet(t) union receiverSet(ActualPointerT(t)).deref }) case _ => AdvancedMemberSet.empty } @@ -317,7 +317,7 @@ trait MemberResolution { this: TypeInfoImpl => private def getMethodReceiverContext(t: Type): ExternalTypeInfo = { Single.unapply(t) match { case Some(ct: ContextualType) => ct.context - case Some(p: PointerT) => getMethodReceiverContext(p.elem) + case Some(p: ActualPointerT) => getMethodReceiverContext(p.elem) case _ => this } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 0bf0223f1..ac155d5e7 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -43,7 +43,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => resolve(n) match { case Some(p: ap.Deref) => exprType(p.base) match { - case Single(PointerT(_)) => noMessages + case Single(_: PointerT) => noMessages case t => error(n, s"expected pointer type but got $t") } @@ -101,7 +101,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => resolve(n) match { case Some(p: ap.Deref) => exprType(p.base) match { - case Single(PointerT(t)) => t + case Single(p: PointerT) => p.elem case t => violation(s"expected pointer but got $t") } case Some(_: ap.PointerType) => SortT @@ -324,7 +324,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val idxOpt = intConstantEval(index) error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) - case (PointerT(ArrayT(l, _)), IntT(_)) => + case (ActualPointerT(ArrayT(l, _)), IntT(_)) => val idxOpt = intConstantEval(index) error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) @@ -390,7 +390,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => error(cap, "sequence slice expressions do not allow specifying a capacity", capT.isDefined) } - case (PointerT(ArrayT(l, _)), None | Some(IntT(_)), None | Some(IntT(_)), None | Some(IntT(_))) => + case (ActualPointerT(ArrayT(l, _)), None | Some(IntT(_)), None | Some(IntT(_)), None | Some(IntT(_))) => val (lowOpt, highOpt, capOpt) = (low map intConstantEval, high map intConstantEval, cap map intConstantEval) error(n, s"index $low is out of bounds", !lowOpt.forall(_.forall(i => i >= 0 && i < l))) ++ error(n, s"index $high is out of bounds", !highOpt.forall(_.forall(i => i >= 0 && i < l))) ++ @@ -689,7 +689,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => (underlyingType(baseType), underlyingType(idxType)) match { case (Single(base), Single(idx)) => (base, idx) match { case (ArrayT(_, elem), IntT(_)) => elem - case (PointerT(ArrayT(_, elem)), IntT(_)) => elem + case (ActualPointerT(ArrayT(_, elem)), IntT(_)) => elem case (SequenceT(elem), IntT(_)) => elem case (SliceT(elem), IntT(_)) => elem case (GhostSliceT(elem), IntT(_)) => elem @@ -707,7 +707,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val baseType = exprType(base) (underlyingType(baseType), low map exprType, high map exprType, cap map exprType) match { case (ArrayT(_, elem), None | Some(IntT(_)), None | Some(IntT(_)), None | Some(IntT(_))) if addressable(base) => SliceT(elem) - case (PointerT(ArrayT(_, elem)), None | Some(IntT(_)), None | Some(IntT(_)), None | Some(IntT(_))) => SliceT(elem) + case (ActualPointerT(ArrayT(_, elem)), None | Some(IntT(_)), None | Some(IntT(_)), None | Some(IntT(_))) => SliceT(elem) case (SequenceT(_), None | Some(IntT(_)), None | Some(IntT(_)), None) => baseType case (SliceT(_), None | Some(IntT(_)), None | Some(IntT(_)), None | Some(IntT(_))) => baseType case (GhostSliceT(_), None | Some(IntT(_)), None | Some(IntT(_)), None | Some(IntT(_))) => baseType @@ -725,7 +725,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"expected receive-permitting channel but got $t") } - case PReference(exp) if effAddressable(exp) => PointerT(exprType(exp)) + case r@ PReference(exp) if effAddressable(exp) => if (isEnclosingGhost(r)) GhostPointerT(exprType(exp)) else ActualPointerT(exprType(exp)) case n: PAnd => // is boolean if left and right argument are boolean, otherwise is an assertion val lt = exprType(n.left) @@ -750,7 +750,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case b: PBlankIdentifier => getBlankIdType(b) - case PNew(typ) => PointerT(typeSymbType(typ)) + case n: PNew => if (isEnclosingGhost(n)) GhostPointerT(typeSymbType(n.typ)) else ActualPointerT(typeSymbType(n.typ)) case PMake(typ, _) => typeSymbType(typ) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala index 059966248..9056bd3ba 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala @@ -25,8 +25,8 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def wellDefActualMisc(misc: PActualMisc): Messages = misc match { case n@PRange(exp, _) => isExpr(exp).out ++ (underlyingType(exprType(exp)) match { - case _: ArrayT | PointerT(_: ArrayT) | _: SliceT | _: GhostSliceT | _: MapT | - ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages + case _: ArrayT | ActualPointerT(_: ArrayT) | _: SliceT | _: GhostSliceT | _: MapT | + ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages case t => message(n, s"type error: got $t but expected rangeable type") }) @@ -52,7 +52,7 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => case PRange(exp, _) => underlyingType(exprType(exp)) match { case ArrayT(_, elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) - case PointerT(ArrayT(_, elem)) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) + case ActualPointerT(ArrayT(_, elem)) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) case SliceT(elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) case GhostSliceT(elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) case MapT(key, elem) => InternalSingleMulti(key, InternalTupleT(Vector(key, elem))) @@ -68,7 +68,7 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => case PClosureDecl(args, res, _, _) => FunctionT(args.map(typ), miscType(res)) case PEmbeddedName(t) => typeSymbType(t) - case PEmbeddedPointer(t) => PointerT(typeSymbType(t)) + case PEmbeddedPointer(t) => ActualPointerT(typeSymbType(t)) case l: PLiteralValue => expectedMiscType(l) case l: PKeyedElement => miscType(l.exp) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index 993be91a3..a583e23af 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -130,7 +130,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case PMethodReceiveName(t) => typeSymbType(t) - case PMethodReceivePointer(t) => PointerT(typeSymbType(t)) + case PMethodReceivePointer(t) => ActualPointerT(typeSymbType(t)) case PFunctionType(args, r) => FunctionT(args map miscType, miscType(r)) @@ -145,7 +145,8 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case n: PDeref => resolve(n) match { - case Some(p: ap.PointerType) => PointerT(typeSymbType(p.base)) + // since we have special syntax for ghost pointer types, `*T` always resolves to an actual pointer type + case Some(p: ap.PointerType) => ActualPointerT(typeSymbType(p.base)) case _ => violation(s"expected type, but got $n") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala index fca06a828..3ef5392cc 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala @@ -21,6 +21,7 @@ trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl => case PMultisetType(elem) => isType(elem).out case PMathematicalMapType(key, value) => isType(key).out ++ isType(value).out case POptionType(elem) => isType(elem).out + case PGhostPointerType(elem) => isType(elem).out case n: PGhostSliceType => isType(n.elem).out case _: PDomainType => noMessages @@ -39,6 +40,7 @@ trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl => case PMultisetType(elem) => MultisetT(typeSymbType(elem)) case PMathematicalMapType(keys, values) => MathMapT(typeSymbType(keys), typeSymbType(values)) case POptionType(elem) => OptionT(typeSymbType(elem)) + case PGhostPointerType(elem) => GhostPointerT(typeSymbType(elem)) case PGhostSliceType(elem) => GhostSliceT(typeSymbType(elem)) case t: PDomainType => DomainT(t, this) case a: PAdtType => adtSymbType(a) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala index c6db45808..9ccf6492b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala @@ -11,6 +11,8 @@ import viper.gobra.ast.frontend._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.ast.frontend.{AstPattern => ap} import viper.gobra.frontend.info.base.SymbolTable.{Closure, Function, Regular, SingleLocalVariable} +import viper.gobra.frontend.info.base.Type.GhostPointerT +import viper.gobra.util.Violation import viper.gobra.util.Violation.violation trait GhostWellDef { this: TypeInfoImpl => @@ -100,7 +102,10 @@ trait GhostWellDef { this: TypeInfoImpl => case e if enclosingGhostContext(e) => e match { case PMake(_: PGhostSliceType, _) => noMessages - case _: PMake | _: PNew | PReference(_: PCompositeLit) => error(e, "Allocating memory within ghost code is forbidden") + case _: PMake => error(e, "Allocating memory within ghost code is forbidden") + case _: PNew | PReference(_: PCompositeLit) => + Violation.violation(exprType(e).isInstanceOf[GhostPointerT], s"All memory allocated within ghost code must be located on the ghost heap") + noMessages case _ => noMessages } diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-fields-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-fields-fail01.gobra new file mode 100644 index 000000000..d982e742e --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-fields-fail01.gobra @@ -0,0 +1,9 @@ +package GhostFieldsFail01 + +type Test struct { + IntField int + PIntField *int + // since gpointer is a ghost type, it can only be used as a type for a ghost instead of actual struct field + //:: ExpectedOutput(type_error) + GPIntField gpointer[int] +} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra new file mode 100644 index 000000000..c397266b6 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra @@ -0,0 +1,12 @@ +package GhostReadFail01 + +// x is a pointer to a location on the ghost heap +// thus, reading it results in a ghost value, which +// cannot be assigned to an actual program variable. + +decreases +requires acc(x) +func actualReadFunc(ghost x gpointer[int]) int { + //:: ExpectedOutput(type_error) + return *x +} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra new file mode 100644 index 000000000..09b6d32e1 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra @@ -0,0 +1,22 @@ +package GhostReferenceSimple01 + +type Test struct { + field int +} + +ghost +decreases +ensures acc(x) +func GhostFunc() (x gpointer[Test]) { + x = &Test{ 42 } + //:: ExpectedOutput(assert.failed:assertion.false) + assert false +} + +decreases +ensures acc(x) +func ActualFunc() (x *Test) { + x = &Test{ 42 } + //:: ExpectedOutput(assert.failed:assertion.false) + assert false +} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra new file mode 100644 index 000000000..45e4089c0 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra @@ -0,0 +1,33 @@ +package GhostWriteSimple01 + +// x is a pointer to a location on the ghost heap +// thus, writing in ghost code is forbidden as effects +// are observable (via aliasing). + +ghost +decreases +requires acc(x) +func ghostWriteFunc(x gpointer[int]) { + *x = 42 + //:: ExpectedOutput(assert.failed:assertion.false) + assert false +} + +decreases +requires acc(x) +func actualWriteFunc(ghost x gpointer[int]) { + *x = 42 +} + +ghost +decreases +requires acc(x) +func ghostReadFunc(x gpointer[int]) int { + return *x +} + +decreases +requires acc(x) +func actualReadFunc(ghost x gpointer[int]) (ghost res int) { + return *x +} diff --git a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra new file mode 100644 index 000000000..51ba55a00 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra @@ -0,0 +1,30 @@ +package PointerCreationFail01 + +// Pointers created in actual code are pointers to locations on the actual heap. +// Pointers created in ghost code are pointers to locations on the ghost heap. + +ghost +decreases +func GhostFunc() (x *int) { + // ghost pointer is not assignable to an actual pointer + //:: ExpectedOutput(type_error) + x = new(int) +} + +decreases +func ActualFunc() { + var x *int + + // gpointer is a ghost type which cannot be used for actual variables: + //:: ExpectedOutput(type_error) + var y gpointer[int] + + ghost var z gpointer[int] + + // ghost pointer is not assignable to an actual pointer + //:: ExpectedOutput(type_error) + ghost x = new(int) + + // actual pointer is not assignable to a ghost pointer: + z = new(int) +} diff --git a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra new file mode 100644 index 000000000..591809176 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra @@ -0,0 +1,21 @@ +package PointerCreationSimple01 + +// Pointers created in actual code are pointers to locations on the actual heap. +// Pointers created in ghost code are pointers to locations on the ghost heap. + +ghost +decreases +ensures acc(x) +func GhostFunc() (x gpointer[int]) { + x = new(int) + //:: ExpectedOutput(assert.failed:assertion.false) + assert false +} + +decreases +ensures acc(x) +func ActualFunc() (x *int) { + x = new(int) + //:: ExpectedOutput(assert.failed:assertion.false) + assert false +} From 174f9557f72552a6f7360476107a6dc271310729 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 20 Mar 2024 18:24:41 +0100 Subject: [PATCH 245/296] adds license headers --- .../features/ghost_pointer/ghost-fields-fail01.gobra | 3 +++ .../regressions/features/ghost_pointer/ghost-read-fail01.gobra | 3 +++ .../features/ghost_pointer/ghost-reference-simple01.gobra | 3 +++ .../features/ghost_pointer/ghost-write-fail01.gobra | 3 +++ .../features/ghost_pointer/ghost-write-simple01.gobra | 3 +++ .../features/ghost_pointer/pointer-creation-fail01.gobra | 3 +++ .../features/ghost_pointer/pointer-creation-simple01.gobra | 3 +++ 7 files changed, 21 insertions(+) diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-fields-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-fields-fail01.gobra index d982e742e..b9337cf79 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-fields-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-fields-fail01.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package GhostFieldsFail01 type Test struct { diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra index c397266b6..ab6797201 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package GhostReadFail01 // x is a pointer to a location on the ghost heap diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra index 09b6d32e1..93b168671 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package GhostReferenceSimple01 type Test struct { diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-write-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-write-fail01.gobra index 590dd9623..6c810b49b 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-write-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-write-fail01.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package GhostWriteFail01 // x is a pointer to a location on the actual heap diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra index 45e4089c0..e198bd904 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package GhostWriteSimple01 // x is a pointer to a location on the ghost heap diff --git a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra index 51ba55a00..d7a4f41e7 100644 --- a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package PointerCreationFail01 // Pointers created in actual code are pointers to locations on the actual heap. diff --git a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra index 591809176..ac04b6030 100644 --- a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package PointerCreationSimple01 // Pointers created in actual code are pointers to locations on the actual heap. From a2afc5b148cc195428411dce335e15516d5151d1 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 21 Mar 2024 12:28:27 +0100 Subject: [PATCH 246/296] Updates submodules (#748) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index cadcb1c5a..b70fa9522 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit cadcb1c5aa887ace1d4b0afb6586afdeca6c0da1 +Subproject commit b70fa95224a7f5ae3e3de8579e28d685eaf93f6e From a0c65dffa98b2166c4f3a1ed8e23bcdfb8eb82c4 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 22 Mar 2024 09:20:06 +0100 Subject: [PATCH 247/296] fixes references to consider the ghostness of the memory instead of ghostness of the program location and adapts test cases --- .../scala/viper/gobra/ast/frontend/Ast.scala | 8 +++- .../gobra/ast/frontend/PrettyPrinter.scala | 5 ++- .../scala/viper/gobra/frontend/Desugar.scala | 2 +- .../gobra/frontend/ParseTreeTranslator.scala | 3 +- .../viper/gobra/frontend/info/base/Type.scala | 2 +- .../property/Assignability.scala | 8 ---- .../resolution/MemberResolution.scala | 2 +- .../resolution/NameResolution.scala | 2 +- .../implementation/typing/ExprTyping.scala | 4 +- .../implementation/typing/TypeTyping.scala | 5 ++- .../ghost/separation/GhostAssignability.scala | 19 +++++--- .../ghost/separation/GhostClassifier.scala | 2 + .../typing/ghost/separation/GhostTyping.scala | 45 ++++++++++++++++--- .../ghost/separation/GhostWellDef.scala | 20 ++++----- .../evaluation/impl_errors/parallel_sum.gobra | 2 +- .../examples/evaluation/parallel_sum.gobra | 2 +- .../evaluation/spec_errors/parallel_sum.gobra | 2 +- .../regressions/examples/tour/Test4.gobra | 1 + .../ghost_pointer/ghost-read-fail01.gobra | 5 ++- .../ghost-reference-fail01.gobra | 10 +++++ .../ghost-reference-fail02.gobra | 27 +++++++++++ .../ghost-reference-simple01.gobra | 10 ++++- .../ghost_pointer/ghost-write-simple01.gobra | 2 +- .../pointer-creation-fail01.gobra | 1 + .../pointer-creation-simple01.gobra | 4 +- .../features/labels/ghost-label.gobra | 29 ++++++++++++ .../regressions/features/wands/list.gobra | 3 +- .../resources/regressions/issues/000039.gobra | 3 +- 28 files changed, 176 insertions(+), 52 deletions(-) create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail02.gobra create mode 100644 src/test/resources/regressions/features/labels/ghost-label.gobra diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index 61ad66a89..bf8fa8038 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -737,7 +737,13 @@ sealed trait PMethodRecvType extends PActualType { // TODO: will have to be remo case class PMethodReceiveName(typ: PNamedOperand) extends PMethodRecvType -case class PMethodReceivePointer(typ: PNamedOperand) extends PMethodRecvType +trait PMethodReceivePointer extends PMethodRecvType { + def typ: PNamedOperand +} + +case class PMethodReceiveActualPointer(typ: PNamedOperand) extends PMethodReceivePointer + +case class PMethodReceiveGhostPointer(typ: PNamedOperand) extends PMethodReceivePointer with PGhostNode // TODO: Named type is not allowed to be an interface diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index fee1642f6..aeb2ef4ab 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -641,7 +641,10 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter ssep(pspec map showInterfaceClause, line) ) case PMethodReceiveName(t) => showType(t) - case PMethodReceivePointer(t) => "*" <> showType(t) + case r: PMethodReceivePointer => r match { + case PMethodReceiveActualPointer(t) => "*" <> showType(t) + case PMethodReceiveGhostPointer(t) => "gpointer" <> brackets(showType(t)) + } } def showGhostType(typ : PGhostType) : Doc = typ match { diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 121590a86..49d8927b7 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -4914,7 +4914,7 @@ object Desugar extends LazyLogging { topLevelName(s"$METHODSPEC_PREFIX${interface(t)}")(n, context) def method (n: String, t: PMethodRecvType, context: ExternalTypeInfo): String = t match { case PMethodReceiveName(typ) => topLevelName(s"$METHOD_PREFIX${typ.name}")(n, context) - case PMethodReceivePointer(typ) => topLevelName(s"P$METHOD_PREFIX${typ.name}")(n, context) + case r: PMethodReceivePointer => topLevelName(s"P$METHOD_PREFIX${r.typ.name}")(n, context) } private def stringifyType(typ: in.Type): String = Names.serializeType(typ) def builtInMember(tag: BuiltInMemberTag, dependantTypes: Vector[in.Type]): String = { diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 9ec87c744..b65e7ddc5 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -900,7 +900,8 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole override def visitReceiver(ctx: ReceiverContext): PReceiver = { val recvType = visitNode[PType](ctx.type_()) match { case t : PNamedOperand => PMethodReceiveName(t).at(t) - case PDeref(t : PNamedOperand) => PMethodReceivePointer(t).at(t) + case PDeref(t: PNamedOperand) => PMethodReceiveActualPointer(t).at(t) + case PGhostPointerType(t: PNamedOperand) => PMethodReceiveGhostPointer(t).at(t) case f => fail(ctx.type_(), s"Expected declared type or pointer to declared type but got: $f.") } diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala index 59d2b7465..22312e160 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -80,7 +80,7 @@ object Type { case class ActualPointerT(elem: Type) extends PrettyType(s"*$elem") with PointerT - case class GhostPointerT(elem: Type) extends PrettyType(s"gpointer[$elem]") with PointerT + case class GhostPointerT(elem: Type) extends PrettyType(s"gpointer[$elem]") with PointerT with GhostType case class ChannelT(elem: Type, mod: ChannelModus) extends PrettyType(s"$mod $elem") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index 1b9611b36..df5ec576f 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala @@ -110,14 +110,6 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => case e => s"got $e that is not assignable" } { case e if !isMutable(e) => false - case e: PDeref if isEnclosingGhost(e) => - resolve(e) match { - case Some(ap.Deref(base)) => exprType(base) match { - case _: GhostPointerT => true // we dereference a ghost pointer in ghost code - case _ => false - } - case _ => false - } case PIndexedExp(b, _) => underlyingType(exprType(b)) match { case _: ArrayT => assignable(b) case _: SliceT | _: GhostSliceT => assignable(b) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index c2544cd28..e2a61394c 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -50,7 +50,7 @@ trait MemberResolution { this: TypeInfoImpl => def go(pastDeref: Boolean): Type => AdvancedMemberSet[StructMember] = attr[Type, AdvancedMemberSet[StructMember]] { case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface - case ActualPointerT(t) if !pastDeref => go(pastDeref = true)(t).ref + case p: PointerT if !pastDeref => go(pastDeref = true)(p.elem).ref case s: StructT => val (es, fs) = (s.decl.embedded, s.decl.fields) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index ee076f137..43d2a52a7 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -144,7 +144,7 @@ trait NameResolution { case _ => violation("PIdnUnk always has a parent") } - private[resolution] lazy val isGhostDef: PNode => Boolean = isEnclosingExplicitGhost + private[resolution] lazy val isGhostDef: PNode => Boolean = isEnclosingGhost private[resolution] def serialize(id: PIdnNode): String = id.name diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index ac155d5e7..ad571b198 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -725,7 +725,9 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"expected receive-permitting channel but got $t") } - case r@ PReference(exp) if effAddressable(exp) => if (isEnclosingGhost(r)) GhostPointerT(exprType(exp)) else ActualPointerT(exprType(exp)) + case PReference(exp) if effAddressable(exp) => + // we do not care whether the reference itself is in a ghost context or not but whether `exp` is ghost + if (isGhostLocation(exp)) GhostPointerT(exprType(exp)) else ActualPointerT(exprType(exp)) case n: PAnd => // is boolean if left and right argument are boolean, otherwise is an assertion val lt = exprType(n.left) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index a583e23af..bf085e8fc 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -130,7 +130,10 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case PMethodReceiveName(t) => typeSymbType(t) - case PMethodReceivePointer(t) => ActualPointerT(typeSymbType(t)) + case r: PMethodReceivePointer => r match { + case PMethodReceiveActualPointer(t) => ActualPointerT(typeSymbType(t)) + case PMethodReceiveGhostPointer(t) => GhostPointerT(typeSymbType(t)) + } case PFunctionType(args, r) => FunctionT(args map miscType, miscType(r)) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala index 80deb079e..e1b28aea5 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala @@ -11,6 +11,7 @@ import viper.gobra.ast.frontend._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.ast.frontend.{AstPattern => ap} import viper.gobra.frontend.info.ExternalTypeInfo +import viper.gobra.frontend.info.base.Type import viper.gobra.frontend.info.implementation.property.{AssignMode, NonStrictAssignMode} import viper.gobra.frontend.info.implementation.typing.ghost.separation.GhostType.ghost import viper.gobra.util.Violation @@ -85,12 +86,15 @@ trait GhostAssignability { (argTyping, resTyping) } - /** conservative ghost separation assignment check */ + /** conservative ghost separation assignment check for assignment in actual and ghost code */ private[separation] def ghostAssignableToAssignee(exprs: PExpression*)(lefts: PAssignee*): Messages = generalGhostAssignableTo(ghostExprResultTyping)(ghostAssigneeAssignmentMsg)(exprs: _*)(lefts: _*) + private def ghostAssigneeAssignmentMsg(isRightGhost: Boolean, left: PAssignee): Messages = + if (isEnclosingGhost(left)) ghostAssigneeAssignmentMsgInGhostCode(left) else ghostAssigneeAssignmentMsgInActualCode(isRightGhost, left) - private def ghostAssigneeAssignmentMsg(isRightGhost: Boolean, left: PAssignee): Messages = left match { + // handles the case of assignments in actual code + private def ghostAssigneeAssignmentMsgInActualCode(isRightGhost: Boolean, left: PAssignee): Messages = left match { case _: PDeref => // *x := e ~ !ghost(e) error(left, "ghost error: ghost cannot be assigned to pointer", isRightGhost) @@ -103,17 +107,20 @@ trait GhostAssignability { error(left, "ghost error: ghost cannot be assigned to non-ghost", isRightGhost && !ghostIdClassification(id)) case n: PDot => exprOrType(n.base) match { - case Left(base) => // x.f := e ~ (ghost(x) || ghost(e)) ==> ghost(f) - error(left, "ghost error: ghost cannot be assigned to non-ghost field", isRightGhost && !ghostIdClassification(n.id)) ++ - error(left, "ghost error: cannot assign to non-ghost field of ghost reference", ghostExprResultClassification(base) && !ghostIdClassification(n.id)) + case Left(base) => // x.f := e ~ ghost(e) ==> ghostassignee(x.f) + error(left, "ghost error: ghost cannot be assigned to non-ghost location", isRightGhost && !ghostLocationClassification(left)) case _ if resolve(n).exists(_.isInstanceOf[ap.GlobalVariable]) => error(left, "ghost error: ghost cannot be assigned to a global variable", isRightGhost) case _ => error(left, "ghost error: selections on types are not assignable") - } + } case PBlankIdentifier() => noMessages } + // handles the case of assignments in ghost code + private def ghostAssigneeAssignmentMsgInGhostCode(left: PAssignee): Messages = + error(left, s"ghost error: only ghost locations can be assigned to in ghost code: ${exprType(left)}", !ghostLocationClassification(left)) + /** conservative ghost separation assignment check */ private[separation] def ghostAssignableToId(exprs: PExpression*)(lefts: PIdnNode*): Messages = generalGhostAssignableTo(ghostExprResultTyping)(dfltGhostAssignableMsg(ghostIdClassification))(exprs: _*)(lefts: _*) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostClassifier.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostClassifier.scala index 40afb6364..66c0e9b97 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostClassifier.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostClassifier.scala @@ -24,6 +24,8 @@ trait GhostClassifier { def isParamGhost(param: PParameter): Boolean + def isGhostLocation(expr: PExpression): Boolean + def isStructClauseGhost(clause: PStructClause): Boolean def isInterfaceClauseGhost(clause: PInterfaceClause): Boolean diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala index 690d90fa0..cae808e2c 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala @@ -20,7 +20,7 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => private[separation] lazy val ghostMemberClassification: PMember => Boolean = attr[PMember, Boolean] { case _: PGhostMember => true - case m if enclosingGhostContext(m) => true + case m if isEnclosingGhost(m) => true case _ => false } @@ -45,7 +45,7 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => attr[PStatement, Boolean] { case _: PGhostStatement => true - case s if enclosingGhostContext(s) => true + case s if isEnclosingGhost(s) => true case PAssignment(_, left) => left.forall(ghostExprClassification) case PAssignmentWithOp(_, _, left) => ghostExprClassification(left) case PShortVarDecl(right, left, _) => varDeclClassification(left, right) @@ -80,6 +80,7 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => case PNamedOperand(id) => ghost(ghostIdClassification(id)) case _: PFunctionLit => notGhost + case e: PCompositeLit if isEnclosingGhost(e) => isGhost // struct literals occurring in ghost code are treated as ghost no matter whether the type is ghost or not case n: PInvoke => (exprOrType(n.base), resolve(n)) match { case (Right(_), Some(_: ap.Conversion)) => notGhost // conversions cannot be ghost (for now) @@ -119,6 +120,39 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => } } + /** returns true iff expression refers to a ghost location (ghost heap or local ghost variable) */ + private[separation] lazy val ghostLocationClassification: PExpression => Boolean = + createGhostClassification[PExpression](e => ghostLocationTyping(e).isGhost) + + /** returns ghost typing of the location that expression represents */ + private[separation] lazy val ghostLocationTyping: PExpression => GhostType = { + import GhostType._ + + createGhostTyping[PExpression] { + case PNamedOperand(id) => ghost(ghostIdClassification(id)) + case e: PDeref => resolve(e) match { + case Some(ap.Deref(base)) => exprType(base) match { + case _: Type.GhostPointerT => isGhost + case _ => notGhost + } + case _ => Violation.violation(s"type-checker should only permit PDeref assignees that have the Deref pattern") + } + case e: PDot => resolve(e) match { + case Some(s: ap.FieldSelection) => + val isGhostField = ghostIdClassification(s.id) + (typ(s.base), isGhostField) match { + case (_, true) => isGhost // ghost fields are always ghost memory + case (tb: Type.PointerT, _) => ghost(tb.isInstanceOf[Type.GhostPointerT]) // assignee is on the ghost heap + case _ => ghostLocationTyping(s.base) // assignee is on the stack, recurse to find out if it's a ghost or actual variable + } + case Some(g: ap.GlobalVariable) => ghost(g.symb.ghost) + case _ => Violation.violation(s"type-checker should only permit PDot assignees that are either field or global variable accesses") + } + + case e => ghostExprTyping(e) + } + } + /** returns true iff type is classified as ghost */ private[separation] lazy val ghostTypeClassification: PType => Boolean = createGhostClassification[PType]{ case _: PGhostType => true // TODO: This check seems insufficient to me in the long run. What if a type definition is ghost? @@ -147,10 +181,6 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => case _: PExplicitGhostParameter => true } - /** returns true iff node is contained in ghost code */ - private[separation] def enclosingGhostContext(n: PNode): Boolean = - isEnclosingExplicitGhost(n) || isEnclosingDomain(n) - /** returns true iff node does not contain ghost expression or id that is not contained in another statement */ private[separation] lazy val noGhostPropagationFromChildren: PNode => Boolean = attr[PNode, Boolean] { node => @@ -202,6 +232,9 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => override def isParamGhost(param: PParameter): Boolean = ghostParameterClassification(param) + override def isGhostLocation(expr: PExpression): Boolean = + ghostLocationClassification(expr) + override def isStructClauseGhost(clause: PStructClause): Boolean = clause match { case _: PActualStructClause => false case _: PExplicitGhostStructClause => true diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala index 9ccf6492b..0bb8afe39 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala @@ -40,11 +40,11 @@ trait GhostWellDef { this: TypeInfoImpl => case n : PVarDecl => n.typ match { case Some(typ) => error(n, s"ghost error: expected an actual type but found $typ", - isTypeGhost(typ) && !enclosingGhostContext(n)) + isTypeGhost(typ) && !isEnclosingGhost(n)) case None => noMessages } - case m if enclosingGhostContext(m) => noMessages + case m if isEnclosingGhost(m) => noMessages case _ => noMessages } @@ -52,8 +52,11 @@ trait GhostWellDef { this: TypeInfoImpl => private def stmtGhostSeparation(stmt: PStatement): Messages = stmt match { case p: PClosureImplProof => provenSpecMatchesInGhostnessWithCall(p) + case PAssignment(right, left) => ghostAssignableToAssignee(right: _*)(left: _*) + case PAssignmentWithOp(right, _, left) => ghostAssignableToAssignee(right)(left) + case _: PGhostStatement => noMessages - case s if enclosingGhostContext(s) => noMessages + case s if isEnclosingGhost(s) => noMessages case stmt @ PForStmt(pre, cond, post, _, body) => { // NOTE the loop specification *is* allowed to contain ghost constructs; the rest isn't @@ -86,9 +89,6 @@ trait GhostWellDef { this: TypeInfoImpl => | _: PDeferStmt ) => error(n, "ghost error: Found ghost child expression but expected none", !noGhostPropagationFromChildren(n)) - case PAssignment(right, left) => ghostAssignableToAssignee(right: _*)(left: _*) - case PAssignmentWithOp(right, _, left) => ghostAssignableToAssignee(right)(left) - case PShortVarDecl(right, left, _) => ghostAssignableToId(right: _*)(left: _*) case n@ PReturn(right) => @@ -99,11 +99,11 @@ trait GhostWellDef { this: TypeInfoImpl => private def exprGhostSeparation(expr: PExpression): Messages = expr match { case _: PGhostExpression => noMessages - case e if enclosingGhostContext(e) => + case e if isEnclosingGhost(e) => e match { case PMake(_: PGhostSliceType, _) => noMessages case _: PMake => error(e, "Allocating memory within ghost code is forbidden") - case _: PNew | PReference(_: PCompositeLit) => + case _: PNew => Violation.violation(exprType(e).isInstanceOf[GhostPointerT], s"All memory allocated within ghost code must be located on the ghost heap") noMessages case _ => noMessages @@ -155,7 +155,7 @@ trait GhostWellDef { this: TypeInfoImpl => case _: PGhostType => noMessages case n: PStructType => n.fields.flatMap(f => { error(f, s"ghost error: expected an actual type but found ${f.typ}", - isTypeGhost(f.typ) && !enclosingGhostContext(f)) + isTypeGhost(f.typ) && !isEnclosingGhost(f)) }) case _: PInterfaceType => noMessages case n: PType => error(n, "ghost error: Found ghost child expression, but expected none", !noGhostPropagationFromChildren(n)) @@ -186,7 +186,7 @@ trait GhostWellDef { this: TypeInfoImpl => private def miscGhostSeparation(misc : PMisc) : Messages = misc match { case _: PGhostMisc => noMessages case p: PActualParameter => error(p, s"ghost error: expected an actual type but found ${p.typ}", - isTypeGhost(p.typ) && !enclosingGhostContext(p)) + isTypeGhost(p.typ) && !isEnclosingGhost(p)) case _ => noMessages } } diff --git a/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_sum.gobra b/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_sum.gobra index 865e43e62..4e5cd982c 100644 --- a/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_sum.gobra +++ b/src/test/resources/regressions/examples/evaluation/impl_errors/parallel_sum.gobra @@ -105,7 +105,7 @@ func sumExtensional(ghost a []int, ghost b ghost []int) { } } -pred locHasVal(loc *int, val int) { +pred locHasVal(loc gpointer[int], val int) { acc(loc, 1/2) && *loc == val } diff --git a/src/test/resources/regressions/examples/evaluation/parallel_sum.gobra b/src/test/resources/regressions/examples/evaluation/parallel_sum.gobra index 590ed2c41..90357b532 100644 --- a/src/test/resources/regressions/examples/evaluation/parallel_sum.gobra +++ b/src/test/resources/regressions/examples/evaluation/parallel_sum.gobra @@ -106,7 +106,7 @@ func sumExtensional(ghost a []int, ghost b ghost []int) { } } -pred locHasVal(loc *int, val int) { +pred locHasVal(loc gpointer[int], val int) { acc(loc, 1/2) && *loc == val } diff --git a/src/test/resources/regressions/examples/evaluation/spec_errors/parallel_sum.gobra b/src/test/resources/regressions/examples/evaluation/spec_errors/parallel_sum.gobra index 4792922e7..8faf2c427 100644 --- a/src/test/resources/regressions/examples/evaluation/spec_errors/parallel_sum.gobra +++ b/src/test/resources/regressions/examples/evaluation/spec_errors/parallel_sum.gobra @@ -105,7 +105,7 @@ func sumExtensional(ghost a []int, ghost b ghost []int) { } } -pred locHasVal(loc *int, val int) { +pred locHasVal(loc gpointer[int], val int) { acc(loc, 1/2) && *loc == val } diff --git a/src/test/resources/regressions/examples/tour/Test4.gobra b/src/test/resources/regressions/examples/tour/Test4.gobra index b7b273767..39fe50f5e 100644 --- a/src/test/resources/regressions/examples/tour/Test4.gobra +++ b/src/test/resources/regressions/examples/tour/Test4.gobra @@ -8,6 +8,7 @@ type Point struct { y int; }; +decreases requires acc(&p.x); pure func (p *Point) getX1() int { return p.x; diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra index ab6797201..ad6b5fdd3 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-read-fail01.gobra @@ -9,7 +9,8 @@ package GhostReadFail01 decreases requires acc(x) -func actualReadFunc(ghost x gpointer[int]) int { +func actualReadFunc(ghost x gpointer[int]) (res int) { //:: ExpectedOutput(type_error) - return *x + res = *x + return } diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail01.gobra new file mode 100644 index 000000000..33bed7fdf --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail01.gobra @@ -0,0 +1,10 @@ +package GhostReferenceFail01 + +func ActualFunc() { + x@ := 42 + ghost p := &x + + // the following write fails as it's ghost code but assigning to an actual heap location: + //:: ExpectedOutput(type_error) + ghost *p = 42 +} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail02.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail02.gobra new file mode 100644 index 000000000..638421ca9 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail02.gobra @@ -0,0 +1,27 @@ +package GhostReferenceFail02 + +type S struct { + field int +} + +func ActualFunc() { + x@ := S{ 42 } + ghost var p *S = &x + + // the following writes fail as it's ghost code but assigning to an actual heap location: + //:: ExpectedOutput(type_error) + ghost (*p).field = 42 + //:: ExpectedOutput(type_error) + ghost p.field = 42 +} + +ghost +decreases +requires acc(p) +func GhostFunc(p *S) { + // the following writes fail as it's ghost code but assigning to an actual heap location: + //:: ExpectedOutput(type_error) + (*p).field = 42 + //:: ExpectedOutput(type_error) + p.field = 42 +} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra index 93b168671..bb2e4a34e 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-simple01.gobra @@ -12,7 +12,7 @@ decreases ensures acc(x) func GhostFunc() (x gpointer[Test]) { x = &Test{ 42 } - //:: ExpectedOutput(assert.failed:assertion.false) + //:: ExpectedOutput(assert_error:assertion_error) assert false } @@ -20,6 +20,12 @@ decreases ensures acc(x) func ActualFunc() (x *Test) { x = &Test{ 42 } - //:: ExpectedOutput(assert.failed:assertion.false) + ghost p1 := &Test{ 0 } + p1.field = 42 + (*p1).field = 42 + ghost t2@ := Test{ 0 } + t2.field = 42 + (*(&t2)).field = 42 + //:: ExpectedOutput(assert_error:assertion_error) assert false } diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra index e198bd904..dd68fbf5e 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-write-simple01.gobra @@ -12,7 +12,7 @@ decreases requires acc(x) func ghostWriteFunc(x gpointer[int]) { *x = 42 - //:: ExpectedOutput(assert.failed:assertion.false) + //:: ExpectedOutput(assert_error:assertion_error) assert false } diff --git a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra index d7a4f41e7..890f57a5c 100644 --- a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra @@ -29,5 +29,6 @@ func ActualFunc() { ghost x = new(int) // actual pointer is not assignable to a ghost pointer: + //:: ExpectedOutput(type_error) z = new(int) } diff --git a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra index ac04b6030..33b24eb83 100644 --- a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-simple01.gobra @@ -11,7 +11,7 @@ decreases ensures acc(x) func GhostFunc() (x gpointer[int]) { x = new(int) - //:: ExpectedOutput(assert.failed:assertion.false) + //:: ExpectedOutput(assert_error:assertion_error) assert false } @@ -19,6 +19,6 @@ decreases ensures acc(x) func ActualFunc() (x *int) { x = new(int) - //:: ExpectedOutput(assert.failed:assertion.false) + //:: ExpectedOutput(assert_error:assertion_error) assert false } diff --git a/src/test/resources/regressions/features/labels/ghost-label.gobra b/src/test/resources/regressions/features/labels/ghost-label.gobra new file mode 100644 index 000000000..ef8c8c14e --- /dev/null +++ b/src/test/resources/regressions/features/labels/ghost-label.gobra @@ -0,0 +1,29 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +func test() { + + x1 := 5 + x2@ := 5 + + // despite the line breaks, `x1 = 8` is treated as a labeled statement that is marked ghost. Thus, the assignment violates ghost separation + ghost L: + //:: ExpectedOutput(type_error) + x1 = 8 + x2 = 8 +} + +func test2() { + + x1 := 5 + x2@ := 5 + + // the issue above can be fixed by inserting an empty statement / block such that the assignments are not treated + // as being part of the labeled statement. + ghost L: {} + + x1 = 8 + x2 = 8 +} diff --git a/src/test/resources/regressions/features/wands/list.gobra b/src/test/resources/regressions/features/wands/list.gobra index cd3d27fdd..fbf2bc880 100644 --- a/src/test/resources/regressions/features/wands/list.gobra +++ b/src/test/resources/regressions/features/wands/list.gobra @@ -18,7 +18,6 @@ pure func elems(start *List) (res seq[int]) { return unfolding start.Mem() in (start.next == nil? seq[int]{start.val} : (seq[int]{start.val} ++ elems(start.next))) } -ghost requires l1.Mem() && l2.Mem() && l2 != nil ensures l1.Mem() && elems(l1) == old(elems(l1) ++ elems(l2)) func (l1 *List) Append(l2 *List) { @@ -53,4 +52,4 @@ func (l1 *List) Append(l2 *List) { fold tmp.Mem() apply tmp.Mem() --* (l1.Mem() && elems(l1) == old((elems(l1))[:index] ++ old[#lhs](elems(tmp)))) } -} \ No newline at end of file +} diff --git a/src/test/resources/regressions/issues/000039.gobra b/src/test/resources/regressions/issues/000039.gobra index f257f3378..6ebcb8a6b 100644 --- a/src/test/resources/regressions/issues/000039.gobra +++ b/src/test/resources/regressions/issues/000039.gobra @@ -8,7 +8,8 @@ func test() { x1 := 5 x2@ := 5 - ghost L: + // an empty block is inserted such that the assignments are not treated being part of the ghost labeled statement + ghost L: {} x1 = 8 x2 = 8 From 8265457f2065ac59d7f8402d1547c182fb0738a3 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 22 Mar 2024 09:21:08 +0100 Subject: [PATCH 248/296] Update src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala CR suggestion by Felix Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> --- .../gobra/frontend/info/implementation/typing/ExprTyping.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index ad571b198..ae58bc0c6 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -390,7 +390,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => error(cap, "sequence slice expressions do not allow specifying a capacity", capT.isDefined) } - case (ActualPointerT(ArrayT(l, _)), None | Some(IntT(_)), None | Some(IntT(_)), None | Some(IntT(_))) => + case (ActualPointerT(ArrayT(l, _)), None | Some(IntT(_)), None | Some(IntT(_)), None | Some(IntT(_))) => // without ghost slices, slicing a ghost pointer is not allowed. val (lowOpt, highOpt, capOpt) = (low map intConstantEval, high map intConstantEval, cap map intConstantEval) error(n, s"index $low is out of bounds", !lowOpt.forall(_.forall(i => i >= 0 && i < l))) ++ error(n, s"index $high is out of bounds", !highOpt.forall(_.forall(i => i >= 0 && i < l))) ++ From d5e0258d4577e81f2f677e95d0c571e9276b10da Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 22 Mar 2024 09:26:00 +0100 Subject: [PATCH 249/296] applies CR suggestion by Felix Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> --- .../features/ghost_pointer/pointer-creation-fail01.gobra | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra index 890f57a5c..d929c1d65 100644 --- a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra @@ -27,6 +27,9 @@ func ActualFunc() { // ghost pointer is not assignable to an actual pointer //:: ExpectedOutput(type_error) ghost x = new(int) + + // ghost pointer is assignable: + ghost z = new(int) // actual pointer is not assignable to a ghost pointer: //:: ExpectedOutput(type_error) From c761f27dc28616a128be39c8f7eaa075193a876a Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 22 Mar 2024 11:01:55 +0100 Subject: [PATCH 250/296] adds support for index expression to ghost memory and implements CR suggestions by Felix --- .../viper/gobra/frontend/info/base/Type.scala | 6 +- .../property/Assignability.scala | 5 +- .../implementation/typing/ExprTyping.scala | 6 +- .../implementation/typing/MiscTyping.scala | 2 +- .../ghost/separation/GhostAssignability.scala | 2 +- .../typing/ghost/separation/GhostTyping.scala | 10 +++- .../ghost_pointer/ghost-array-fail01.gobra | 37 ++++++++++++ .../ghost-array-range-fail01.gobra | 41 ++++++++++++++ .../ghost-array-range-simple01.gobra | 52 +++++++++++++++++ .../ghost_pointer/ghost-array-simple01.gobra | 56 +++++++++++++++++++ .../pointer-creation-fail01.gobra | 2 +- 11 files changed, 207 insertions(+), 12 deletions(-) create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-array-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-array-range-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-array-range-simple01.gobra create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-array-simple01.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala index 22312e160..df867da6b 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -74,10 +74,14 @@ object Type { case class MapT(key: Type, elem: Type) extends PrettyType(s"map[$key]$elem") - trait PointerT { + sealed trait PointerT { val elem: Type } + object PointerT { + def unapply(arg: PointerT): Option[Type] = Some(arg.elem) + } + case class ActualPointerT(elem: Type) extends PrettyType(s"*$elem") with PointerT case class GhostPointerT(elem: Type) extends PrettyType(s"gpointer[$elem]") with PointerT with GhostType diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index df5ec576f..1175fe801 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala @@ -105,10 +105,7 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => case _ => errorProp() } - lazy val assignable: Property[PExpression] = createFlatProperty[PExpression]{ - case e if isEnclosingGhost(e) => s"got $e that is not assignable in ghost code" - case e => s"got $e that is not assignable" - } { + lazy val assignable: Property[PExpression] = createBinaryProperty("assignable") { case e if !isMutable(e) => false case PIndexedExp(b, _) => underlyingType(exprType(b)) match { case _: ArrayT => assignable(b) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index ae58bc0c6..f00b7b685 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -10,7 +10,7 @@ import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, check, error, noM import viper.gobra.ast.frontend.{AstPattern => ap, _} import viper.gobra.frontend.info.base.{SymbolTable => st} import viper.gobra.frontend.info.base.SymbolTable.{AdtDestructor, AdtDiscriminator, GlobalVariable, SingleConstant} -import viper.gobra.frontend.info.base.Type._ +import viper.gobra.frontend.info.base.Type.{PointerT, _} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.TypeBounds.{BoundedIntegerKind, UnboundedInteger} import viper.gobra.util.{Constants, TypeBounds, Violation} @@ -324,7 +324,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val idxOpt = intConstantEval(index) error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) - case (ActualPointerT(ArrayT(l, _)), IntT(_)) => + case (PointerT(ArrayT(l, _)), IntT(_)) => val idxOpt = intConstantEval(index) error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) @@ -689,7 +689,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => (underlyingType(baseType), underlyingType(idxType)) match { case (Single(base), Single(idx)) => (base, idx) match { case (ArrayT(_, elem), IntT(_)) => elem - case (ActualPointerT(ArrayT(_, elem)), IntT(_)) => elem + case (PointerT(ArrayT(_, elem)), IntT(_)) => elem case (SequenceT(elem), IntT(_)) => elem case (SliceT(elem), IntT(_)) => elem case (GhostSliceT(elem), IntT(_)) => elem diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala index 9056bd3ba..523d34ee8 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala @@ -25,7 +25,7 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def wellDefActualMisc(misc: PActualMisc): Messages = misc match { case n@PRange(exp, _) => isExpr(exp).out ++ (underlyingType(exprType(exp)) match { - case _: ArrayT | ActualPointerT(_: ArrayT) | _: SliceT | _: GhostSliceT | _: MapT | + case _: ArrayT | PointerT(_: ArrayT) | _: SliceT | _: GhostSliceT | _: MapT | ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages case t => message(n, s"type error: got $t but expected rangeable type") }) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala index e1b28aea5..1debc4c96 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala @@ -119,7 +119,7 @@ trait GhostAssignability { // handles the case of assignments in ghost code private def ghostAssigneeAssignmentMsgInGhostCode(left: PAssignee): Messages = - error(left, s"ghost error: only ghost locations can be assigned to in ghost code: ${exprType(left)}", !ghostLocationClassification(left)) + error(left, s"ghost error: only ghost locations can be assigned to in ghost code}", !ghostLocationClassification(left)) /** conservative ghost separation assignment check */ private[separation] def ghostAssignableToId(exprs: PExpression*)(lefts: PIdnNode*): Messages = diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala index cae808e2c..d5cf0b5fc 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala @@ -142,12 +142,20 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => val isGhostField = ghostIdClassification(s.id) (typ(s.base), isGhostField) match { case (_, true) => isGhost // ghost fields are always ghost memory - case (tb: Type.PointerT, _) => ghost(tb.isInstanceOf[Type.GhostPointerT]) // assignee is on the ghost heap + case (tb: Type.PointerT, _) => ghost(tb.isInstanceOf[Type.GhostPointerT]) // (implicitly) dereferencing a ghost pointer denotes a ghost heap location case _ => ghostLocationTyping(s.base) // assignee is on the stack, recurse to find out if it's a ghost or actual variable } case Some(g: ap.GlobalVariable) => ghost(g.symb.ghost) case _ => Violation.violation(s"type-checker should only permit PDot assignees that are either field or global variable accesses") } + case PIndexedExp(base, _) => + println(s"looking at $base") + typ(base) match { + case tb: Type.PointerT => + println(s"$base is of pointer type") + ghost(tb.isInstanceOf[Type.GhostPointerT]) // (implicitly) dereferencing a ghost pointer denotes a ghost heap location + case _ => ghostLocationTyping(base) // assignee is on the stack, recurse to find out if it's a ghost or actual variable + } case e => ghostExprTyping(e) } diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-array-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-array-fail01.gobra new file mode 100644 index 000000000..83273e943 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-array-fail01.gobra @@ -0,0 +1,37 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostArrayFail01 + +ghost +decreases +ensures acc(x) +func GhostFunc() (x gpointer[[5]int]) { + arr@ := [5]int{ 0, 1, 2, 3, 4 } + return &arr +} + +ghost +decreases +requires acc(p) +func GhostArrayAssign(p *[5]int) { + x := GhostFunc() + // assigning to a pointer to an array is neither possible in ghost nor actual code: + //:: ExpectedOutput(type_error) + x[3] = 42 + + // not okay: + //:: ExpectedOutput(type_error) + p[0] = 42 + //:: ExpectedOutput(type_error) + (*p)[0] = 42 +} + +decreases +requires acc(p) +func ActualArrayAssign(p *[5]int) { + // assigning to a pointer to an array is neither possible in ghost nor actual code: + //:: ExpectedOutput(type_error) + p[3] = 42 + (*p)[4] = 42 +} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-array-range-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-array-range-fail01.gobra new file mode 100644 index 000000000..fd55339f6 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-array-range-fail01.gobra @@ -0,0 +1,41 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostArrayRangeFail01 + +ghost +decreases +requires acc(p[0]) && acc(p[1]) +func GhostArrayRange(p [2]*int) { + invariant acc(p[0]) + invariant acc(p[1]) + invariant 0 <= i && i <= len(p) + decreases len(p) - i0 + for i, j := range p with i0 { + assert j != nil + v := *j + v = *p[i] + // assignment is not possible + //:: ExpectedOutput(type_error) + *j = 42 + } +} + +// ranging over a pointer or ghost pointer to an array is not yet supported: +ghost +func GhostPtrArrayRange() { + arr@ := [2]int{ 0, 1 } + p := &arr + var elem int + //:: ExpectedOutput(type_error) + for elem = range(p) with i0 {} +} + +ghost +func ActualPtrArrayRange() { + arr@ := [2]int{ 0, 1 } + p := &arr + var elem int + //:: ExpectedOutput(type_error) + for elem = range(p) with i0 {} +} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-array-range-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-array-range-simple01.gobra new file mode 100644 index 000000000..959fc5984 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-array-range-simple01.gobra @@ -0,0 +1,52 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostArrayRangeSimple01 + +ghost +decreases +ensures acc(x[0]) && acc(x[1]) +func GhostFunc() (x [2]gpointer[int]) { + arr@ := [2]gpointer[int]{ new(int), new(int) } + return arr +} + +ghost +decreases +requires acc(p[0]) && acc(p[1]) +func GhostArrayRange(p [2]*int) { + invariant acc(p[0]) + invariant acc(p[1]) + invariant 0 <= i && i <= len(p) + decreases len(p) - i0 + for i, j := range p with i0 { + assert j != nil + v := *j + v = *p[i] + // assignment is not possible + // *j = 42 + } + + x := GhostFunc() + invariant acc(x[0]) + invariant acc(x[1]) + invariant 0 <= i && i <= len(x) + decreases len(x) - i0 + for i, j := range x with i0 { + assert j != nil + v := *j + v = *p[i] + // assigning should be possible: + *j = 42 + } +} + +ghost +func ActualPtrArrayRange() { + arr@ := [2]int{ 0, 1 } + p := &arr + var elem int + for elem = range(p) with i0 { + + } +} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-array-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-array-simple01.gobra new file mode 100644 index 000000000..4ae9e3a3c --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-array-simple01.gobra @@ -0,0 +1,56 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostArraySimple01 + +ghost +decreases +func GhostFunc() (x [5]int) { + x = [5]int{ 0, 1, 2, 3, 4 } + //:: ExpectedOutput(assert_error:assertion_error) + assert false + return +} + +ghost +decreases +ensures acc(x) && acc(y) +func GhostFunc2() (x gpointer[[5]int], y gpointer[[5]int]) { + arr@ := [5]int{ 0, 1, 2, 3, 4 } + x = &arr + y = &[5]int{ 0, 1, 2, 3, 4 } + //:: ExpectedOutput(assert_error:assertion_error) + assert false + return +} + +ghost +decreases +requires acc(p) +func GhostArrayAssign(p *[5]int) { + x := GhostFunc() + y, z := GhostFunc2() + x[2] = 42 + // y[3] = 42 + (*z)[4] = 42 +} + + +decreases +ensures acc(x) && acc(y) +func ActualFunc2() (x *[5]int, y *[5]int) { + arr@ := [5]int{ 0, 1, 2, 3, 4 } + x = &arr + y = &[5]int{ 0, 1, 2, 3, 4 } + //:: ExpectedOutput(assert_error:assertion_error) + assert false + return +} + +decreases +requires acc(p) +func ActualArrayAssign(p *[5]int) { + y, z := ActualFunc2() + // y[3] = 42 + (*z)[4] = 42 +} diff --git a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra index d929c1d65..a428dda2f 100644 --- a/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/pointer-creation-fail01.gobra @@ -28,7 +28,7 @@ func ActualFunc() { //:: ExpectedOutput(type_error) ghost x = new(int) - // ghost pointer is assignable: + // ghost pointer is assignable to a ghost pointer: ghost z = new(int) // actual pointer is not assignable to a ghost pointer: From cd840b0a8112da630ef68de88c42c02e8ee20c22 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Fri, 22 Mar 2024 18:31:53 +0100 Subject: [PATCH 251/296] adapts or fixes some unit tests, fixes ghost memory analysis to correctly consider indexed expressions --- .../typing/ghost/separation/GhostTyping.scala | 13 ++--- .../regressions/features/adts/simple1.gobra | 4 +- .../closures/closures-fail5-proofs.gobra | 3 +- .../ghost-array-range-simple01.gobra | 25 ++++++++-- .../ghost_pointer/ghost-location-fail01.gobra | 50 +++++++++++++++++++ .../ghost-reference-fail01.gobra | 3 ++ .../ghost-reference-fail02.gobra | 3 ++ 7 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-location-fail01.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala index d5cf0b5fc..a5da2ccc0 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala @@ -142,19 +142,16 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => val isGhostField = ghostIdClassification(s.id) (typ(s.base), isGhostField) match { case (_, true) => isGhost // ghost fields are always ghost memory - case (tb: Type.PointerT, _) => ghost(tb.isInstanceOf[Type.GhostPointerT]) // (implicitly) dereferencing a ghost pointer denotes a ghost heap location + case (tb: Type.PointerT, _) => ghost(tb.isInstanceOf[Type.GhostPointerT]) // (implicitly) dereferencing a ghost pointer leads to a ghost heap location case _ => ghostLocationTyping(s.base) // assignee is on the stack, recurse to find out if it's a ghost or actual variable } case Some(g: ap.GlobalVariable) => ghost(g.symb.ghost) case _ => Violation.violation(s"type-checker should only permit PDot assignees that are either field or global variable accesses") } - case PIndexedExp(base, _) => - println(s"looking at $base") - typ(base) match { - case tb: Type.PointerT => - println(s"$base is of pointer type") - ghost(tb.isInstanceOf[Type.GhostPointerT]) // (implicitly) dereferencing a ghost pointer denotes a ghost heap location - case _ => ghostLocationTyping(base) // assignee is on the stack, recurse to find out if it's a ghost or actual variable + case PIndexedExp(base, _) => underlyingType(typ(base)) match { + case t if !isPointerType(t) => ghostLocationTyping(base) // assignee is on the stack, recurse to find out if it's a ghost or actual variable + case _: Type.GhostPointerT | _: Type.GhostSliceT => isGhost // (implicitly) dereferencing a ghost pointer leads to a ghost heap location + case _ => notGhost } case e => ghostExprTyping(e) diff --git a/src/test/resources/regressions/features/adts/simple1.gobra b/src/test/resources/regressions/features/adts/simple1.gobra index 369acfd97..9ba5f50d0 100644 --- a/src/test/resources/regressions/features/adts/simple1.gobra +++ b/src/test/resources/regressions/features/adts/simple1.gobra @@ -1,7 +1,7 @@ // Any copyright is dedicated to the Public Domain. // http://creativecommons.org/publicdomain/zero/1.0/ -package pkg; +package pkg type tree adt{ leaf{ value int } @@ -17,7 +17,7 @@ func test1() { } func test2(x tree) { - var y int + ghost var y int match x { case node{leaf{5}, _}: y = 4 case _: y = 3 diff --git a/src/test/resources/regressions/features/closures/closures-fail5-proofs.gobra b/src/test/resources/regressions/features/closures/closures-fail5-proofs.gobra index 0472c288d..e7329075c 100644 --- a/src/test/resources/regressions/features/closures/closures-fail5-proofs.gobra +++ b/src/test/resources/regressions/features/closures/closures-fail5-proofs.gobra @@ -66,7 +66,8 @@ func test4() { //:: ExpectedOutput(type_error) proof cl implements pspec { - x = 2 + //:: ExpectedOutput(type_error) + x = 2 // assignment in ghost code to a non-ghost variable y = cl1(x) as id1 } } diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-array-range-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-array-range-simple01.gobra index 959fc5984..1bd1f5b47 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-array-range-simple01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-array-range-simple01.gobra @@ -14,7 +14,7 @@ func GhostFunc() (x [2]gpointer[int]) { ghost decreases requires acc(p[0]) && acc(p[1]) -func GhostArrayRange(p [2]*int) { +func GhostRangeOverActualPts(p [2]*int) { invariant acc(p[0]) invariant acc(p[1]) invariant 0 <= i && i <= len(p) @@ -26,7 +26,11 @@ func GhostArrayRange(p [2]*int) { // assignment is not possible // *j = 42 } +} +ghost +decreases +func GhostRangeOverGhostPts() { x := GhostFunc() invariant acc(x[0]) invariant acc(x[1]) @@ -35,18 +39,31 @@ func GhostArrayRange(p [2]*int) { for i, j := range x with i0 { assert j != nil v := *j - v = *p[i] + v = *x[i] // assigning should be possible: *j = 42 } } ghost -func ActualPtrArrayRange() { +decreases +func GhostRangeOverGhostPtrToInts() { + arr@ := [2]int{ 0, 1 } + p := &arr + var elem int + decreases len(*p) - i0 + for elem = range(*p) with i0 { + + } +} + +decreases +func ActualRangeOverPtrToInts() { arr@ := [2]int{ 0, 1 } p := &arr var elem int - for elem = range(p) with i0 { + decreases len(*p) - i0 + for elem = range(*p) with i0 { } } diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-location-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-location-fail01.gobra new file mode 100644 index 000000000..e5d887177 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-location-fail01.gobra @@ -0,0 +1,50 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostLocationFail01 + +ghost +decreases +requires 1 <= len(p) +requires forall i int :: 0 <= i && i < len(p) ==> acc(&p[i]) +func SliceInGhostCode(p []int) { + gp := p + + // both `p` and `gp` are slices that are located in actual memory + //:: ExpectedOutput(type_error) + p[0] = 42 + //:: ExpectedOutput(type_error) + gp[0] = 42 +} + +ghost +decreases +requires 1 <= len(p) +requires forall i int :: 0 <= i && i < len(p) ==> acc(&p[i]) +func GhostSliceInGhostCode(p ghost []int) { + gp := p + p[0] = 42 + gp[0] = 42 +} + +decreases +requires 1 <= len(p) +requires forall i int :: 0 <= i && i < len(p) ==> acc(&p[i]) +func SliceInActualCode(p []int) { + gp := p + + // both `p` and `gp` are slices that are located in actual memory + //:: ExpectedOutput(type_error) + p[0] = 42 + //:: ExpectedOutput(type_error) + gp[0] = 42 +} + +decreases +requires 1 <= len(p) +requires forall i int :: 0 <= i && i < len(p) ==> acc(&p[i]) +func GhostSliceInActualCode(ghost p ghost []int) { + gp := p + p[0] = 42 + gp[0] = 42 +} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail01.gobra index 33bed7fdf..f8a8e2583 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail01.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package GhostReferenceFail01 func ActualFunc() { diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail02.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail02.gobra index 638421ca9..b7c116970 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail02.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-reference-fail02.gobra @@ -1,3 +1,6 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + package GhostReferenceFail02 type S struct { From dfa1233d300fc89b4cc38a3bb29c27c3aeea93b1 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Sun, 24 Mar 2024 17:09:08 +0100 Subject: [PATCH 252/296] fixes a unit test --- .../features/ghost_pointer/ghost-location-fail01.gobra | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-location-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-location-fail01.gobra index e5d887177..7ba0f03a8 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-location-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-location-fail01.gobra @@ -10,7 +10,7 @@ requires forall i int :: 0 <= i && i < len(p) ==> acc(&p[i]) func SliceInGhostCode(p []int) { gp := p - // both `p` and `gp` are slices that are located in actual memory + // both `p` and `gp` are slices that are located in actual memory, thus writing in ghost code is forbidden //:: ExpectedOutput(type_error) p[0] = 42 //:: ExpectedOutput(type_error) @@ -33,10 +33,8 @@ requires forall i int :: 0 <= i && i < len(p) ==> acc(&p[i]) func SliceInActualCode(p []int) { gp := p - // both `p` and `gp` are slices that are located in actual memory - //:: ExpectedOutput(type_error) + // both `p` and `gp` are slices that are located in actual memory, thus writing in actual code is permitted p[0] = 42 - //:: ExpectedOutput(type_error) gp[0] = 42 } From 37e5a892d58b4dcc26df6497b6573754cd663e57 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Sun, 24 Mar 2024 19:35:09 +0100 Subject: [PATCH 253/296] adds support for method receivers of ghost pointer type, minimizes diff --- .../scala/viper/gobra/ast/frontend/Ast.scala | 8 ++-- .../gobra/ast/frontend/PrettyPrinter.scala | 6 +-- .../scala/viper/gobra/frontend/Desugar.scala | 2 +- .../property/UnderlyingType.scala | 6 +-- .../implementation/typing/TypeTyping.scala | 5 +- .../typing/ghost/GhostTypeTyping.scala | 2 + .../ghost/separation/GhostAssignability.scala | 3 +- .../ghost/separation/GhostWellDef.scala | 3 ++ .../ghost-pointer-receiver-fail01.gobra | 32 +++++++++++++ .../ghost-pointer-receiver-simple01.gobra | 47 +++++++++++++++++++ 10 files changed, 96 insertions(+), 18 deletions(-) create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-simple01.gobra diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index bf8fa8038..cfbdd921f 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -731,19 +731,19 @@ case class PEmbeddedDecl(typ: PEmbeddedType, id: PIdnDef) extends PActualStructC require(id.name == typ.name) } -sealed trait PMethodRecvType extends PActualType { // TODO: will have to be removed for packages +sealed trait PMethodRecvType extends PType { // TODO: will have to be removed for packages def typ: PNamedOperand } -case class PMethodReceiveName(typ: PNamedOperand) extends PMethodRecvType +case class PMethodReceiveName(typ: PNamedOperand) extends PMethodRecvType with PActualType trait PMethodReceivePointer extends PMethodRecvType { def typ: PNamedOperand } -case class PMethodReceiveActualPointer(typ: PNamedOperand) extends PMethodReceivePointer +case class PMethodReceiveActualPointer(typ: PNamedOperand) extends PMethodReceivePointer with PActualType -case class PMethodReceiveGhostPointer(typ: PNamedOperand) extends PMethodReceivePointer with PGhostNode +case class PMethodReceiveGhostPointer(typ: PNamedOperand) extends PMethodReceivePointer with PGhostType // TODO: Named type is not allowed to be an interface diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index aeb2ef4ab..f5c7a94a3 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -641,10 +641,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter ssep(pspec map showInterfaceClause, line) ) case PMethodReceiveName(t) => showType(t) - case r: PMethodReceivePointer => r match { - case PMethodReceiveActualPointer(t) => "*" <> showType(t) - case PMethodReceiveGhostPointer(t) => "gpointer" <> brackets(showType(t)) - } + case PMethodReceiveActualPointer(t) => "*" <> showType(t) } def showGhostType(typ : PGhostType) : Doc = typ match { @@ -660,6 +657,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter ssep((funcs ++ axioms) map showMisc, line) ) case PAdtType(clauses) => "adt" <> block(ssep(clauses map showMisc, line)) + case PMethodReceiveGhostPointer(t) => "gpointer" <> brackets(showType(t)) } def showStructClause(c: PStructClause): Doc = c match { diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 49d8927b7..b236f7317 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -3750,7 +3750,7 @@ object Desugar extends LazyLogging { in.MapT(keysD, valuesD, addrMod) case Type.GhostSliceT(elem) => in.SliceT(typeD(elem, Addressability.sliceElement)(src), addrMod) case Type.OptionT(elem) => in.OptionT(typeD(elem, Addressability.mathDataStructureElement)(src), addrMod) - case p: Type.PointerT => registerType(in.PointerT(typeD(p.elem, Addressability.pointerBase)(src), addrMod)) + case Type.PointerT(elem) => registerType(in.PointerT(typeD(elem, Addressability.pointerBase)(src), addrMod)) case Type.ChannelT(elem, _) => in.ChannelT(typeD(elem, Addressability.channelElement)(src), addrMod) case Type.SequenceT(elem) => in.SequenceT(typeD(elem, Addressability.mathDataStructureElement)(src), addrMod) case Type.SetT(elem) => in.SetT(typeD(elem, Addressability.mathDataStructureElement)(src), addrMod) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala index 6131c6548..d9c47981b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala @@ -9,7 +9,7 @@ package viper.gobra.frontend.info.implementation.property import viper.gobra.ast.frontend.{PDeref, PDot, PEmbeddedName, PEmbeddedPointer, PEmbeddedType, PInterfaceType, PNamedOperand, PStructType, PType, PTypeDecl} import viper.gobra.frontend.info.ExternalTypeInfo import viper.gobra.frontend.info.base.BuiltInMemberTag.BuiltInTypeTag -import viper.gobra.frontend.info.base.Type.{ActualPointerT, BooleanT, ChannelT, DeclaredT, FunctionT, GhostSliceT, IntT, InterfaceT, MapT, NilType, PointerT, Single, SliceT, StringT, StructT, Type} +import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelT, DeclaredT, FunctionT, GhostSliceT, IntT, InterfaceT, MapT, NilType, PointerT, Single, SliceT, StringT, StructT, Type} import viper.gobra.frontend.info.base.{SymbolTable => st} import viper.gobra.frontend.info.implementation.TypeInfoImpl @@ -65,7 +65,7 @@ trait UnderlyingType { this: TypeInfoImpl => lazy val derefType: Type => Option[Type] = attr[Type, Option[Type]] { case Single(DeclaredT(t: PTypeDecl, context: ExternalTypeInfo)) => derefType(context.symbType(t.right)) - case Single(p: PointerT) => Some(p.elem) + case Single(PointerT(elem)) => Some(elem) case _ => None } @@ -200,7 +200,7 @@ trait UnderlyingType { this: TypeInfoImpl => lazy val isReceiverType: Property[Type] = createBinaryProperty("not a receiver type") { case _: DeclaredT => true - case ActualPointerT(t) => t.isInstanceOf[DeclaredT] + case PointerT(t) => t.isInstanceOf[DeclaredT] case _ => false } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index bf085e8fc..f28bc6505 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -130,10 +130,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case PMethodReceiveName(t) => typeSymbType(t) - case r: PMethodReceivePointer => r match { - case PMethodReceiveActualPointer(t) => ActualPointerT(typeSymbType(t)) - case PMethodReceiveGhostPointer(t) => GhostPointerT(typeSymbType(t)) - } + case PMethodReceiveActualPointer(t) => ActualPointerT(typeSymbType(t)) case PFunctionType(args, r) => FunctionT(args map miscType, miscType(r)) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala index 3ef5392cc..390aa2b54 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala @@ -23,6 +23,7 @@ trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl => case POptionType(elem) => isType(elem).out case PGhostPointerType(elem) => isType(elem).out case n: PGhostSliceType => isType(n.elem).out + case n: PMethodReceivePointer => isType(n.typ).out case _: PDomainType => noMessages case n: PAdtType => n match { @@ -42,6 +43,7 @@ trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl => case POptionType(elem) => OptionT(typeSymbType(elem)) case PGhostPointerType(elem) => GhostPointerT(typeSymbType(elem)) case PGhostSliceType(elem) => GhostSliceT(typeSymbType(elem)) + case PMethodReceiveGhostPointer(t) => GhostPointerT(typeSymbType(t)) case t: PDomainType => DomainT(t, this) case a: PAdtType => adtSymbType(a) } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala index 1debc4c96..f0792f8e1 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala @@ -11,7 +11,6 @@ import viper.gobra.ast.frontend._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.ast.frontend.{AstPattern => ap} import viper.gobra.frontend.info.ExternalTypeInfo -import viper.gobra.frontend.info.base.Type import viper.gobra.frontend.info.implementation.property.{AssignMode, NonStrictAssignMode} import viper.gobra.frontend.info.implementation.typing.ghost.separation.GhostType.ghost import viper.gobra.util.Violation @@ -107,7 +106,7 @@ trait GhostAssignability { error(left, "ghost error: ghost cannot be assigned to non-ghost", isRightGhost && !ghostIdClassification(id)) case n: PDot => exprOrType(n.base) match { - case Left(base) => // x.f := e ~ ghost(e) ==> ghostassignee(x.f) + case Left(_) => // x.f := e ~ ghost(e) ==> ghostassignee(x.f) error(left, "ghost error: ghost cannot be assigned to non-ghost location", isRightGhost && !ghostLocationClassification(left)) case _ if resolve(n).exists(_.isInstanceOf[ap.GlobalVariable]) => error(left, "ghost error: ghost cannot be assigned to a global variable", isRightGhost) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala index 0bb8afe39..7c9f161d1 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala @@ -46,6 +46,9 @@ trait GhostWellDef { this: TypeInfoImpl => case m if isEnclosingGhost(m) => noMessages + case m: PMethodDecl => error(m, "ghost error: expected an actual receiver type", + isTypeGhost(m.receiver.typ) && !isEnclosingGhost(m)) + case _ => noMessages } diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra new file mode 100644 index 000000000..412e66ed4 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra @@ -0,0 +1,32 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostPointerReceiverFail01 + +type Foo struct { + field int +} + +ghost +decreases +func GhostFunc() { + p := &Foo{ 42 } + p.bar1() + //:: ExpectedOutput(type_error) + p.bar2() // bar2 is not defined on a ghost pointer +} + +decreases +//:: ExpectedOutput(type_error) +func (r gpointer[Foo]) bar1() int { // ghostpointer is only allowed for ghost methods + r.field = 0 + return 42 +} + +ghost +decreases +func (r *Foo) bar2() int { + //:: ExpectedOutput(type_error) + r.field = 0 // fails since we're trying to modify actual memory + return r.field +} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-simple01.gobra new file mode 100644 index 000000000..c21f3a77a --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-simple01.gobra @@ -0,0 +1,47 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostPointerReceiverSimple01 + +type Foo struct { + field int +} + +ghost +decreases +preserves acc(p) +func GhostFunc(p *Foo) { + gp := &Foo{ 42 } + gp.bar1() + + p.bar2() + (*p).bar3() + (*gp).bar3() +} + +ghost +decreases +preserves acc(r) +func (r gpointer[Foo]) bar1() int { + r.field = 0 + return r.field +} + +decreases +preserves acc(r) +func (r *Foo) bar2() int { + r.field = 0 + return r.field +} + +ghost +decreases +func (r Foo) bar3() int { + r.field = 42 + return r.field +} + +func (r Foo) bar4() int { + r.field = 42 + return r.field +} From c7ae8bb261201fc555eda57fac603ce2338b08af Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Sun, 24 Mar 2024 19:45:48 +0100 Subject: [PATCH 254/296] simplifies diff further --- .../info/implementation/resolution/MemberResolution.scala | 2 +- .../frontend/info/implementation/typing/ExprTyping.scala | 4 ++-- .../frontend/info/implementation/typing/MiscTyping.scala | 4 ++-- .../info/implementation/typing/ghost/GhostTypeTyping.scala | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index e2a61394c..ff21f6c06 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -50,7 +50,7 @@ trait MemberResolution { this: TypeInfoImpl => def go(pastDeref: Boolean): Type => AdvancedMemberSet[StructMember] = attr[Type, AdvancedMemberSet[StructMember]] { case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface - case p: PointerT if !pastDeref => go(pastDeref = true)(p.elem).ref + case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref case s: StructT => val (es, fs) = (s.decl.embedded, s.decl.fields) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index f00b7b685..8d5826598 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -43,7 +43,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => resolve(n) match { case Some(p: ap.Deref) => exprType(p.base) match { - case Single(_: PointerT) => noMessages + case Single(PointerT(_)) => noMessages case t => error(n, s"expected pointer type but got $t") } @@ -101,7 +101,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => resolve(n) match { case Some(p: ap.Deref) => exprType(p.base) match { - case Single(p: PointerT) => p.elem + case Single(PointerT(t)) => t case t => violation(s"expected pointer but got $t") } case Some(_: ap.PointerType) => SortT diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala index 523d34ee8..c27b99fb9 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala @@ -26,7 +26,7 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => case n@PRange(exp, _) => isExpr(exp).out ++ (underlyingType(exprType(exp)) match { case _: ArrayT | PointerT(_: ArrayT) | _: SliceT | _: GhostSliceT | _: MapT | - ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages + ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages case t => message(n, s"type error: got $t but expected rangeable type") }) @@ -52,7 +52,7 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => case PRange(exp, _) => underlyingType(exprType(exp)) match { case ArrayT(_, elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) - case ActualPointerT(ArrayT(_, elem)) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) + case PointerT(ArrayT(_, elem)) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) case SliceT(elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) case GhostSliceT(elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) case MapT(key, elem) => InternalSingleMulti(key, InternalTupleT(Vector(key, elem))) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala index 390aa2b54..ac2c76e9c 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostTypeTyping.scala @@ -23,7 +23,7 @@ trait GhostTypeTyping extends BaseTyping { this : TypeInfoImpl => case POptionType(elem) => isType(elem).out case PGhostPointerType(elem) => isType(elem).out case n: PGhostSliceType => isType(n.elem).out - case n: PMethodReceivePointer => isType(n.typ).out + case PMethodReceiveGhostPointer(t) => isType(t).out case _: PDomainType => noMessages case n: PAdtType => n match { From 461517a9a8f74245367185b7126dfcfe59cf2198 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Sun, 24 Mar 2024 22:31:34 +0100 Subject: [PATCH 255/296] fixes a unit test --- .../features/ghost_pointer/ghost-pointer-receiver-fail01.gobra | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra index 412e66ed4..d8c9e4d32 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra @@ -16,8 +16,9 @@ func GhostFunc() { p.bar2() // bar2 is not defined on a ghost pointer } -decreases +// note that the type error refers to the receiver but is (for technical reasons) located at the beginning of the function declaration //:: ExpectedOutput(type_error) +decreases func (r gpointer[Foo]) bar1() int { // ghostpointer is only allowed for ghost methods r.field = 0 return 42 From 09b191b17d3bf5875fd7f0c5162e3d7661db7cf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 25 Mar 2024 11:26:46 +0100 Subject: [PATCH 256/296] Add support for backend annotations on functions and methods (#749) * extend the syntax of Gobra * goifying printer * bureaucracy * Add encoding and tests * fix test * add an extra annotation * Fix unit tests * fix tests * implement feedback from Felix * improve a few things here and there --- src/main/antlr4/GobraLexer.g4 | 3 +- src/main/antlr4/GobraParser.g4 | 10 +- .../java/viper/gobra/frontend/GobraLexer.java | 2235 +++---- .../viper/gobra/frontend/GobraParser.java | 5550 +++++++++-------- .../frontend/GobraParserBaseVisitor.java | 37 +- .../gobra/frontend/GobraParserVisitor.java | 32 +- .../scala/viper/gobra/ast/frontend/Ast.scala | 17 +- .../gobra/ast/frontend/PrettyPrinter.scala | 16 +- .../gobra/ast/internal/PrettyPrinter.scala | 67 +- .../viper/gobra/ast/internal/Program.scala | 11 +- .../CGEdgesTerminationTransform.scala | 2 +- .../transform/OverflowChecksTransform.scala | 16 +- .../scala/viper/gobra/frontend/Desugar.scala | 43 +- .../gobra/frontend/ParseTreeTranslator.scala | 44 +- .../scala/viper/gobra/frontend/Parser.scala | 2 +- .../typing/ghost/GhostMiscTyping.scala | 4 +- .../ghost/separation/GhostLessPrinter.scala | 6 +- .../ghost/separation/GoifyingPrinter.scala | 9 +- .../translator/encodings/StringEncoding.scala | 1 + .../closures/ClosureSpecsEncoder.scala | 11 +- .../defaults/DefaultMethodEncoding.scala | 10 +- .../defaults/DefaultPureMethodEncoding.scala | 8 +- .../interfaces/InterfaceEncoding.scala | 2 + .../encodings/typeless/BuiltInEncoding.scala | 16 +- .../encodings/typeless/OutlineEncoding.scala | 3 +- .../library/outlines/Outlines.scala | 3 + .../library/outlines/OutlinesImpl.scala | 13 +- .../viper/gobra/translator/util/VprInfo.scala | 22 +- .../viper/gobra/util/BackendAnnotation.scala | 9 + .../backendAnnotations/mce-success1.gobra | 68 + .../gobra/erasing/GhostErasureUnitTests.scala | 2 +- .../viper/gobra/parsing/ParserUnitTests.scala | 12 +- .../gobra/typing/ExprTypingUnitTests.scala | 2 +- .../gobra/typing/StmtTypingUnitTests.scala | 2 +- .../gobra/typing/TypeTypingUnitTests.scala | 2 +- 35 files changed, 4470 insertions(+), 3820 deletions(-) create mode 100644 src/main/scala/viper/gobra/util/BackendAnnotation.scala create mode 100644 src/test/resources/regressions/features/backendAnnotations/mce-success1.gobra diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4 index 88e2f54db..38cbed761 100644 --- a/src/main/antlr4/GobraLexer.g4 +++ b/src/main/antlr4/GobraLexer.g4 @@ -90,4 +90,5 @@ GHOST_EQUALS : '==='; GHOST_NOT_EQUALS : '!=='; WITH : 'with'; OPAQUE : 'opaque' -> mode(NLSEMI); -REVEAL : 'reveal'; \ No newline at end of file +REVEAL : 'reveal'; +BACKEND : '#backend'; \ No newline at end of file diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 24254bd9e..dd9cd0613 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -25,7 +25,6 @@ stmtOnly: statement EOF; typeOnly: type_ EOF; - // Identifier lists with added addressability modifiers maybeAddressableIdentifierList: maybeAddressableIdentifier (COMMA maybeAddressableIdentifier)*; @@ -162,9 +161,16 @@ sqType: (kind=(SEQ | SET | MSET | OPT) L_BRACKET type_ R_BRACKET) // Specifications specification returns[boolean trusted = false, boolean pure = false, boolean opaque = false;]: - ((specStatement | OPAQUE {$opaque = true;} | PURE {$pure = true;} | TRUSTED {$trusted = true;}) eos)*? (PURE {$pure = true;})? // Non-greedily match PURE to avoid missing eos errors. + // Non-greedily match PURE to avoid missing eos errors. + ((specStatement | OPAQUE {$opaque = true;} | PURE {$pure = true;} | TRUSTED {$trusted = true;}) eos)*? (PURE {$pure = true;})? backendAnnotation? ; +backendAnnotationEntry: ~('('|')'|',')+; +listOfValues: backendAnnotationEntry (COMMA backendAnnotationEntry)*; +singleBackendAnnotation: backendAnnotationEntry L_PAREN listOfValues? R_PAREN; +backendAnnotationList: singleBackendAnnotation (COMMA singleBackendAnnotation)*; +backendAnnotation: BACKEND L_BRACKET backendAnnotationList? R_BRACKET eos; + specStatement : kind=PRE assertion | kind=PRESERVES assertion diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 66fcb0e3d..52bb62bd6 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.13.1 +// Generated from /Users/joao/code/gobra/src/main/antlr4/GobraLexer.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -27,22 +27,22 @@ public class GobraLexer extends Lexer { MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, SHARE=59, ADDR_MOD=60, DOT_DOT=61, SHARED=62, EXCLUSIVE=63, PREDICATE=64, WRITEPERM=65, NOPERM=66, TRUSTED=67, OUTLINE=68, INIT_POST=69, IMPORT_PRE=70, PROOF=71, GHOST_EQUALS=72, - GHOST_NOT_EQUALS=73, WITH=74, OPAQUE=75, REVEAL=76, BREAK=77, DEFAULT=78, - FUNC=79, INTERFACE=80, SELECT=81, CASE=82, DEFER=83, GO=84, MAP=85, STRUCT=86, - CHAN=87, ELSE=88, GOTO=89, PACKAGE=90, SWITCH=91, CONST=92, FALLTHROUGH=93, - IF=94, RANGE=95, TYPE=96, CONTINUE=97, FOR=98, IMPORT=99, RETURN=100, - VAR=101, NIL_LIT=102, IDENTIFIER=103, L_PAREN=104, R_PAREN=105, L_CURLY=106, - R_CURLY=107, L_BRACKET=108, R_BRACKET=109, ASSIGN=110, COMMA=111, SEMI=112, - COLON=113, DOT=114, PLUS_PLUS=115, MINUS_MINUS=116, DECLARE_ASSIGN=117, - ELLIPSIS=118, LOGICAL_OR=119, LOGICAL_AND=120, EQUALS=121, NOT_EQUALS=122, - LESS=123, LESS_OR_EQUALS=124, GREATER=125, GREATER_OR_EQUALS=126, OR=127, - DIV=128, MOD=129, LSHIFT=130, RSHIFT=131, BIT_CLEAR=132, EXCLAMATION=133, - PLUS=134, MINUS=135, CARET=136, STAR=137, AMPERSAND=138, RECEIVE=139, - DECIMAL_LIT=140, BINARY_LIT=141, OCTAL_LIT=142, HEX_LIT=143, HEX_FLOAT_LIT=144, - IMAGINARY_LIT=145, RUNE_LIT=146, BYTE_VALUE=147, OCTAL_BYTE_VALUE=148, - HEX_BYTE_VALUE=149, LITTLE_U_VALUE=150, BIG_U_VALUE=151, RAW_STRING_LIT=152, - INTERPRETED_STRING_LIT=153, WS=154, COMMENT=155, TERMINATOR=156, LINE_COMMENT=157, - WS_NLSEMI=158, COMMENT_NLSEMI=159, LINE_COMMENT_NLSEMI=160, EOS=161, OTHER=162; + GHOST_NOT_EQUALS=73, WITH=74, OPAQUE=75, REVEAL=76, BACKEND=77, BREAK=78, + DEFAULT=79, FUNC=80, INTERFACE=81, SELECT=82, CASE=83, DEFER=84, GO=85, + MAP=86, STRUCT=87, CHAN=88, ELSE=89, GOTO=90, PACKAGE=91, SWITCH=92, CONST=93, + FALLTHROUGH=94, IF=95, RANGE=96, TYPE=97, CONTINUE=98, FOR=99, IMPORT=100, + RETURN=101, VAR=102, NIL_LIT=103, IDENTIFIER=104, L_PAREN=105, R_PAREN=106, + L_CURLY=107, R_CURLY=108, L_BRACKET=109, R_BRACKET=110, ASSIGN=111, COMMA=112, + SEMI=113, COLON=114, DOT=115, PLUS_PLUS=116, MINUS_MINUS=117, DECLARE_ASSIGN=118, + ELLIPSIS=119, LOGICAL_OR=120, LOGICAL_AND=121, EQUALS=122, NOT_EQUALS=123, + LESS=124, LESS_OR_EQUALS=125, GREATER=126, GREATER_OR_EQUALS=127, OR=128, + DIV=129, MOD=130, LSHIFT=131, RSHIFT=132, BIT_CLEAR=133, EXCLAMATION=134, + PLUS=135, MINUS=136, CARET=137, STAR=138, AMPERSAND=139, RECEIVE=140, + DECIMAL_LIT=141, BINARY_LIT=142, OCTAL_LIT=143, HEX_LIT=144, HEX_FLOAT_LIT=145, + IMAGINARY_LIT=146, RUNE_LIT=147, BYTE_VALUE=148, OCTAL_BYTE_VALUE=149, + HEX_BYTE_VALUE=150, LITTLE_U_VALUE=151, BIG_U_VALUE=152, RAW_STRING_LIT=153, + INTERPRETED_STRING_LIT=154, WS=155, COMMENT=156, TERMINATOR=157, LINE_COMMENT=158, + WS_NLSEMI=159, COMMENT_NLSEMI=160, LINE_COMMENT_NLSEMI=161, EOS=162, OTHER=163; public static final int NLSEMI=1; public static String[] channelNames = { @@ -65,7 +65,7 @@ private static String[] makeRuleNames() { "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", - "WITH", "OPAQUE", "REVEAL", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "WITH", "OPAQUE", "REVEAL", "BACKEND", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", @@ -99,15 +99,15 @@ private static String[] makeLiteralNames() { "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", - "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'break'", "'default'", - "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", - "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", - "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", - "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", - "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", - "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", - "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", - "'^'", "'*'", "'&'", "'<-'" + "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'#backend'", "'break'", + "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", + "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'", + "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", + "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, + "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", + "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", + "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", + "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -123,7 +123,7 @@ private static String[] makeSymbolicNames() { "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", - "WITH", "OPAQUE", "REVEAL", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "WITH", "OPAQUE", "REVEAL", "BACKEND", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", @@ -217,7 +217,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\u0004\u0000\u00a2\u05ef\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ + "\u0004\u0000\u00a3\u05fa\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ @@ -262,1095 +262,1102 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+ "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+ "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+ - "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0001"+ - "\u0000\u0001\u0000\u0003\u0000\u0163\b\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u016b\b\u0001\u0001"+ - "\u0001\u0003\u0001\u016e\b\u0001\u0001\u0001\u0003\u0001\u0171\b\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u0177\b\u0001"+ - "\u0003\u0001\u0179\b\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ - "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001"+ - "\u001b\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001"+ - "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001"+ - "!\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001$\u0001$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001"+ - "&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001"+ - "(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ - ")\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001"+ - "+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00011\u0001"+ - "1\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u0001"+ - "2\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ - "3\u00013\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u0001"+ - "5\u00015\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u0001"+ - "6\u00016\u00016\u00017\u00017\u00017\u00017\u00017\u00018\u00018\u0001"+ - "8\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ - "9\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001"+ - "9\u00019\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001"+ - ";\u0001;\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ - "=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ - ">\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ - "?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ - "A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ - "D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ - "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001"+ - "F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001"+ - "H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001"+ - "J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001"+ - "K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001"+ - "N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+ - "O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+ - "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001R\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ - "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ - "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001"+ - "]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001"+ - "_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ - "`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ - "c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001"+ - "e\u0001e\u0001e\u0001f\u0001f\u0001f\u0005f\u0438\bf\nf\ff\u043b\tf\u0001"+ - "f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001"+ - "j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001"+ + "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002"+ + "\u00af\u0007\u00af\u0001\u0000\u0001\u0000\u0003\u0000\u0165\b\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003"+ + "\u0001\u016d\b\u0001\u0001\u0001\u0003\u0001\u0170\b\u0001\u0001\u0001"+ + "\u0003\u0001\u0173\b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0003\u0001\u0179\b\u0001\u0003\u0001\u017b\b\u0001\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001%\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'"+ + "\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + "+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u0001"+ + "0\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00011\u00012\u0001"+ + "2\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00013\u00013\u0001"+ + "3\u00013\u00013\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u0001"+ + "4\u00014\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u0001"+ + "6\u00016\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ + "7\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ + "8\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001"+ + "9\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001"+ + ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001=\u0001"+ + "=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001"+ + "G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001"+ + "I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ + "K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001"+ + "M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001"+ + "N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001"+ + "P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001U\u0001U\u0001"+ + "U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]"+ + "\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+ + "^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001"+ + "`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ + "a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001c\u0001"+ + "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001"+ + "d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001f\u0001"+ + "f\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0005g\u0443\bg\ng"+ + "\fg\u0446\tg\u0001g\u0001g\u0001h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001"+ + "j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001m\u0001m\u0001"+ "m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001p\u0001p\u0001q\u0001q\u0001"+ - "r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001"+ - "t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001"+ - "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001z\u0001"+ - "z\u0001{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001}\u0001}\u0001~\u0001"+ + "r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001"+ + "t\u0001t\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001w\u0001"+ + "w\u0001w\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001z\u0001z\u0001"+ + "z\u0001{\u0001{\u0001|\u0001|\u0001|\u0001}\u0001}\u0001~\u0001~\u0001"+ "~\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081"+ - "\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083"+ - "\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0086"+ + "\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083"+ + "\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0086"+ "\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0089"+ - "\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b"+ - "\u0001\u008b\u0003\u008b\u04a3\b\u008b\u0001\u008b\u0005\u008b\u04a6\b"+ - "\u008b\n\u008b\f\u008b\u04a9\t\u008b\u0003\u008b\u04ab\b\u008b\u0001\u008b"+ - "\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u04b2\b\u008c"+ - "\u0001\u008c\u0004\u008c\u04b5\b\u008c\u000b\u008c\f\u008c\u04b6\u0001"+ - "\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0003\u008d\u04bd\b\u008d\u0001"+ - "\u008d\u0003\u008d\u04c0\b\u008d\u0001\u008d\u0004\u008d\u04c3\b\u008d"+ - "\u000b\u008d\f\u008d\u04c4\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e"+ - "\u0001\u008e\u0003\u008e\u04cc\b\u008e\u0001\u008e\u0004\u008e\u04cf\b"+ - "\u008e\u000b\u008e\f\u008e\u04d0\u0001\u008e\u0001\u008e\u0001\u008f\u0001"+ - "\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0003\u0090\u04db"+ - "\b\u0090\u0001\u0090\u0004\u0090\u04de\b\u0090\u000b\u0090\f\u0090\u04df"+ - "\u0001\u0090\u0001\u0090\u0003\u0090\u04e4\b\u0090\u0001\u0090\u0005\u0090"+ - "\u04e7\b\u0090\n\u0090\f\u0090\u04ea\t\u0090\u0003\u0090\u04ec\b\u0090"+ - "\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u04f1\b\u0090\u0001\u0090"+ - "\u0005\u0090\u04f4\b\u0090\n\u0090\f\u0090\u04f7\t\u0090\u0003\u0090\u04f9"+ - "\b\u0090\u0001\u0091\u0001\u0091\u0003\u0091\u04fd\b\u0091\u0001\u0091"+ - "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0003\u0092\u0506\b\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0093\u0001\u0093\u0001\u0093\u0003\u0093\u050f\b\u0093\u0001\u0093"+ - "\u0001\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095"+ - "\u0001\u0095\u0003\u0095\u0519\b\u0095\u0001\u0096\u0001\u0096\u0001\u0096"+ - "\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097"+ - "\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098"+ - "\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ - "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ - "\u0001\u0099\u0001\u009a\u0001\u009a\u0005\u009a\u0539\b\u009a\n\u009a"+ - "\f\u009a\u053c\t\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a"+ - "\u0001\u009b\u0001\u009b\u0001\u009b\u0005\u009b\u0545\b\u009b\n\u009b"+ - "\f\u009b\u0548\t\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b"+ - "\u0001\u009c\u0004\u009c\u054f\b\u009c\u000b\u009c\f\u009c\u0550\u0001"+ - "\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0005"+ - "\u009d\u0559\b\u009d\n\u009d\f\u009d\u055c\t\u009d\u0001\u009d\u0001\u009d"+ - "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0004\u009e\u0564\b\u009e"+ - "\u000b\u009e\f\u009e\u0565\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f"+ - "\u0001\u009f\u0001\u009f\u0005\u009f\u056e\b\u009f\n\u009f\f\u009f\u0571"+ - "\t\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001"+ - "\u00a0\u0003\u00a0\u0579\b\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0003\u00a1\u0595"+ - "\b\u00a1\u0001\u00a2\u0001\u00a2\u0003\u00a2\u0599\b\u00a2\u0001\u00a2"+ - "\u0005\u00a2\u059c\b\u00a2\n\u00a2\f\u00a2\u059f\t\u00a2\u0001\u00a3\u0001"+ + "\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b"+ + "\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u04ae\b\u008c\u0001\u008c"+ + "\u0005\u008c\u04b1\b\u008c\n\u008c\f\u008c\u04b4\t\u008c\u0003\u008c\u04b6"+ + "\b\u008c\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0003"+ + "\u008d\u04bd\b\u008d\u0001\u008d\u0004\u008d\u04c0\b\u008d\u000b\u008d"+ + "\f\u008d\u04c1\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0003\u008e"+ + "\u04c8\b\u008e\u0001\u008e\u0003\u008e\u04cb\b\u008e\u0001\u008e\u0004"+ + "\u008e\u04ce\b\u008e\u000b\u008e\f\u008e\u04cf\u0001\u008e\u0001\u008e"+ + "\u0001\u008f\u0001\u008f\u0001\u008f\u0003\u008f\u04d7\b\u008f\u0001\u008f"+ + "\u0004\u008f\u04da\b\u008f\u000b\u008f\f\u008f\u04db\u0001\u008f\u0001"+ + "\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001"+ + "\u0091\u0003\u0091\u04e6\b\u0091\u0001\u0091\u0004\u0091\u04e9\b\u0091"+ + "\u000b\u0091\f\u0091\u04ea\u0001\u0091\u0001\u0091\u0003\u0091\u04ef\b"+ + "\u0091\u0001\u0091\u0005\u0091\u04f2\b\u0091\n\u0091\f\u0091\u04f5\t\u0091"+ + "\u0003\u0091\u04f7\b\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091"+ + "\u04fc\b\u0091\u0001\u0091\u0005\u0091\u04ff\b\u0091\n\u0091\f\u0091\u0502"+ + "\t\u0091\u0003\u0091\u0504\b\u0091\u0001\u0092\u0001\u0092\u0003\u0092"+ + "\u0508\b\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093"+ + "\u0001\u0093\u0001\u0093\u0003\u0093\u0511\b\u0093\u0001\u0093\u0001\u0093"+ + "\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0003\u0094"+ + "\u051a\b\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095"+ + "\u0001\u0095\u0001\u0096\u0001\u0096\u0003\u0096\u0524\b\u0096\u0001\u0097"+ + "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098"+ + "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099"+ + "\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a"+ + "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a"+ + "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0005\u009b"+ + "\u0544\b\u009b\n\u009b\f\u009b\u0547\t\u009b\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0005\u009c\u0550"+ + "\b\u009c\n\u009c\f\u009c\u0553\t\u009c\u0001\u009c\u0001\u009c\u0001\u009c"+ + "\u0001\u009c\u0001\u009d\u0004\u009d\u055a\b\u009d\u000b\u009d\f\u009d"+ + "\u055b\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ + "\u009e\u0005\u009e\u0564\b\u009e\n\u009e\f\u009e\u0567\t\u009e\u0001\u009e"+ + "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0004\u009f"+ + "\u056f\b\u009f\u000b\u009f\f\u009f\u0570\u0001\u009f\u0001\u009f\u0001"+ + "\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0005\u00a0\u0579\b\u00a0\n"+ + "\u00a0\f\u00a0\u057c\t\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001"+ + "\u00a1\u0001\u00a1\u0001\u00a1\u0003\u00a1\u0584\b\u00a1\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0003\u00a2\u05a0\b\u00a2\u0001\u00a3\u0001\u00a3\u0003\u00a3\u05a4"+ + "\b\u00a3\u0001\u00a3\u0005\u00a3\u05a7\b\u00a3\n\u00a3\f\u00a3\u05aa\t"+ "\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001"+ - "\u00a6\u0003\u00a6\u05a9\b\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001"+ - "\u00a7\u0003\u00a7\u05af\b\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001"+ - "\u00a9\u0001\u00aa\u0004\u00aa\u05b6\b\u00aa\u000b\u00aa\f\u00aa\u05b7"+ - "\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ - "\u0005\u00ab\u05c0\b\u00ab\n\u00ab\f\u00ab\u05c3\t\u00ab\u0001\u00ab\u0001"+ - "\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001"+ - "\u00ac\u0001\u00ac\u0005\u00ac\u05ce\b\u00ac\n\u00ac\f\u00ac\u05d1\t\u00ac"+ - "\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0004\u00ad\u05d6\b\u00ad\u000b\u00ad"+ - "\f\u00ad\u05d7\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ - "\u0005\u00ad\u05df\b\u00ad\n\u00ad\f\u00ad\u05e2\t\u00ad\u0001\u00ad\u0001"+ - "\u00ad\u0001\u00ad\u0003\u00ad\u05e7\b\u00ad\u0001\u00ad\u0001\u00ad\u0001"+ - "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0003\u055a\u05c1"+ - "\u05e0\u0000\u00af\u0002\u0001\u0004\u0002\u0006\u0003\b\u0004\n\u0005"+ - "\f\u0006\u000e\u0007\u0010\b\u0012\t\u0014\n\u0016\u000b\u0018\f\u001a"+ - "\r\u001c\u000e\u001e\u000f \u0010\"\u0011$\u0012&\u0013(\u0014*\u0015"+ - ",\u0016.\u00170\u00182\u00194\u001a6\u001b8\u001c:\u001d<\u001e>\u001f"+ - "@ B!D\"F#H$J%L&N\'P(R)T*V+X,Z-\\.^/`0b1d2f3h4j5l6n7p8r9t:v;x~?\u0080"+ - "@\u0082A\u0084B\u0086C\u0088D\u008aE\u008cF\u008eG\u0090H\u0092I\u0094"+ - "J\u0096K\u0098L\u009aM\u009cN\u009eO\u00a0P\u00a2Q\u00a4R\u00a6S\u00a8"+ - "T\u00aaU\u00acV\u00aeW\u00b0X\u00b2Y\u00b4Z\u00b6[\u00b8\\\u00ba]\u00bc"+ - "^\u00be_\u00c0`\u00c2a\u00c4b\u00c6c\u00c8d\u00cae\u00ccf\u00ceg\u00d0"+ - "h\u00d2i\u00d4j\u00d6k\u00d8l\u00dam\u00dcn\u00deo\u00e0p\u00e2q\u00e4"+ - "r\u00e6s\u00e8t\u00eau\u00ecv\u00eew\u00f0x\u00f2y\u00f4z\u00f6{\u00f8"+ - "|\u00fa}\u00fc~\u00fe\u007f\u0100\u0080\u0102\u0081\u0104\u0082\u0106"+ - "\u0083\u0108\u0084\u010a\u0085\u010c\u0086\u010e\u0087\u0110\u0088\u0112"+ - "\u0089\u0114\u008a\u0116\u008b\u0118\u008c\u011a\u008d\u011c\u008e\u011e"+ - "\u008f\u0120\u0090\u0122\u0000\u0124\u0000\u0126\u0091\u0128\u0000\u012a"+ - "\u0092\u012c\u0093\u012e\u0094\u0130\u0095\u0132\u0096\u0134\u0097\u0136"+ - "\u0098\u0138\u0099\u013a\u009a\u013c\u009b\u013e\u009c\u0140\u009d\u0142"+ - "\u0000\u0144\u0000\u0146\u0000\u0148\u0000\u014a\u0000\u014c\u0000\u014e"+ - "\u0000\u0150\u0000\u0152\u0000\u0154\u0000\u0156\u009e\u0158\u009f\u015a"+ - "\u00a0\u015c\u00a1\u015e\u00a2\u0002\u0000\u0001\u0013\u0001\u000019\u0001"+ - "\u000009\u0002\u0000BBbb\u0002\u0000OOoo\u0002\u0000XXxx\u0002\u0000P"+ - "Ppp\u0002\u0000++--\u0001\u0000``\u0002\u0000\"\"\\\\\u0002\u0000\t\t"+ - " \u0002\u0000\n\n\r\r\u0003\u0000\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\abf"+ - "fnnrrttvv\u0001\u000007\u0003\u000009AFaf\u0001\u000001\u0002\u0000EE"+ - "ee@\u000009\u0660\u0669\u06f0\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef"+ - "\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef"+ - "\u0d66\u0d6f\u0de6\u0def\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049"+ - "\u1090\u1099\u17e0\u17e9\u1810\u1819\u1946\u194f\u19d0\u19d9\u1a80\u1a89"+ - "\u1a90\u1a99\u1b50\u1b59\u1bb0\u1bb9\u1c40\u1c49\u1c50\u1c59\u8000\ua620"+ - "\u8000\ua629\u8000\ua8d0\u8000\ua8d9\u8000\ua900\u8000\ua909\u8000\ua9d0"+ - "\u8000\ua9d9\u8000\ua9f0\u8000\ua9f9\u8000\uaa50\u8000\uaa59\u8000\uabf0"+ - "\u8000\uabf9\u8000\uff10\u8000\uff19\u8001\u04a0\u8001\u04a9\u8001\u0d30"+ - "\u8001\u0d39\u8001\u1066\u8001\u106f\u8001\u10f0\u8001\u10f9\u8001\u1136"+ - "\u8001\u113f\u8001\u11d0\u8001\u11d9\u8001\u12f0\u8001\u12f9\u8001\u1450"+ - "\u8001\u1459\u8001\u14d0\u8001\u14d9\u8001\u1650\u8001\u1659\u8001\u16c0"+ - "\u8001\u16c9\u8001\u1730\u8001\u1739\u8001\u18e0\u8001\u18e9\u8001\u1950"+ - "\u8001\u1959\u8001\u1c50\u8001\u1c59\u8001\u1d50\u8001\u1d59\u8001\u1da0"+ - "\u8001\u1da9\u8001\u1f50\u8001\u1f59\u8001\u6a60\u8001\u6a69\u8001\u6ac0"+ - "\u8001\u6ac9\u8001\u6b50\u8001\u6b59\u8001\ud7ce\u8001\ud7ff\u8001\ue140"+ - "\u8001\ue149\u8001\ue2f0\u8001\ue2f9\u8001\ue4f0\u8001\ue4f9\u8001\ue950"+ - "\u8001\ue959\u8001\ufbf0\u8001\ufbf9\u0293\u0000AZaz\u00aa\u00aa\u00b5"+ - "\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0"+ - "\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376\u0377\u037a\u037d\u037f"+ - "\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03f5\u03f7"+ - "\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560\u0588\u05d0\u05ea\u05ef"+ - "\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee"+ - "\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1"+ - "\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800\u0815\u081a\u081a\u0824"+ - "\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870\u0887\u0889\u088e\u08a0"+ - "\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958\u0961\u0971\u0980\u0985"+ - "\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd"+ - "\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05"+ - "\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38"+ - "\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93"+ - "\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0"+ - "\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32"+ - "\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83"+ - "\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e"+ - "\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e"+ - "\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60"+ - "\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5"+ - "\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e"+ - "\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a"+ - "\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01"+ - "\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c"+ - "\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6"+ - "\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000"+ - "\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061\u1061\u1065\u1066\u106e"+ - "\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0"+ - "\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258\u1258\u125a\u125d\u1260"+ - "\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2"+ - "\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318\u135a\u1380\u138f\u13a0"+ - "\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681\u169a\u16a0\u16ea\u16f1"+ - "\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760\u176c\u176e\u1770\u1780"+ - "\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880\u1884\u1887\u18a8\u18aa"+ - "\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0"+ - "\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83"+ - "\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80"+ - "\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa"+ - "\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50"+ - "\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6"+ - "\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0"+ - "\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f\u207f\u2090\u209c\u2102"+ - "\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119\u211d\u2124\u2124\u2126"+ - "\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c\u213f\u2145\u2149\u214e"+ - "\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27"+ - "\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8"+ - "\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8"+ - "\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b\u303c\u3041\u3096\u309d"+ - "\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131\u318e\u31a0\u31bf\u31f0"+ - "\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0\u8000\ua4fd\u8000\ua500"+ - "\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a\u8000\ua62b\u8000\ua640"+ - "\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0\u8000\ua6e5\u8000\ua717"+ - "\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b\u8000\ua7ca\u8000\ua7d0"+ - "\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2"+ - "\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c"+ - "\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882\u8000\ua8b3\u8000\ua8f2"+ - "\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000\ua90a"+ - "\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960\u8000\ua97c\u8000\ua984"+ - "\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6"+ - "\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40"+ - "\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60\u8000\uaa76\u8000\uaa7a"+ - "\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1\u8000\uaab1\u8000\uaab5"+ - "\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0\u8000\uaac0\u8000\uaac2"+ - "\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0\u8000\uaaea\u8000\uaaf2"+ - "\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09\u8000\uab0e\u8000\uab11"+ - "\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28\u8000\uab2e\u8000\uab30"+ - "\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70\u8000\uabe2\u8000\uac00"+ - "\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000\uf900"+ - "\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00\u8000\ufb06\u8000\ufb13"+ - "\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f\u8000\ufb28\u8000\ufb2a"+ - "\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000\ufb40"+ - "\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46\u8000\ufbb1\u8000\ufbd3"+ - "\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92\u8000\ufdc7\u8000\ufdf0"+ - "\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76\u8000\ufefc\u8000\uff21"+ - "\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66\u8000\uffbe\u8000\uffc2"+ - "\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2\u8000\uffd7\u8000\uffda"+ - "\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001&\u8001(\u8001:\u8001"+ - "<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080\u8001\u00fa\u8001\u0280"+ - "\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300\u8001\u031f\u8001\u032d"+ - "\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350\u8001\u0375\u8001\u0380"+ - "\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8\u8001\u03cf\u8001\u0400"+ - "\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8\u8001\u04fb\u8001\u0500"+ - "\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570\u8001\u057a\u8001\u057c"+ - "\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594\u8001\u0595\u8001\u0597"+ - "\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3\u8001\u05b9\u8001\u05bb"+ - "\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740\u8001\u0755\u8001\u0760"+ - "\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787\u8001\u07b0\u8001\u07b2"+ - "\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808\u8001\u0808\u8001\u080a"+ - "\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c\u8001\u083c\u8001\u083f"+ - "\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880\u8001\u089e\u8001\u08e0"+ - "\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900\u8001\u0915\u8001\u0920"+ - "\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be\u8001\u09bf\u8001\u0a00"+ - "\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15\u8001\u0a17\u8001\u0a19"+ - "\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80\u8001\u0a9c\u8001\u0ac0"+ - "\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00\u8001\u0b35\u8001\u0b40"+ - "\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80\u8001\u0b91\u8001\u0c00"+ - "\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0\u8001\u0cf2\u8001\u0d00"+ - "\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0\u8001\u0eb1\u8001\u0f00"+ - "\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30\u8001\u0f45\u8001\u0f70"+ - "\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0\u8001\u0ff6\u8001\u1003"+ - "\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075\u8001\u1075\u8001\u1083"+ - "\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103\u8001\u1126\u8001\u1144"+ - "\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150\u8001\u1172\u8001\u1176"+ - "\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1\u8001\u11c4\u8001\u11da"+ - "\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200\u8001\u1211\u8001\u1213"+ - "\u8001\u122b\u8001\u123f\u8001\u1240\u8001\u1280\u8001\u1286\u8001\u1288"+ - "\u8001\u1288\u8001\u128a\u8001\u128d\u8001\u128f\u8001\u129d\u8001\u129f"+ - "\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001\u1305\u8001\u130c\u8001\u130f"+ - "\u8001\u1310\u8001\u1313\u8001\u1328\u8001\u132a\u8001\u1330\u8001\u1332"+ - "\u8001\u1333\u8001\u1335\u8001\u1339\u8001\u133d\u8001\u133d\u8001\u1350"+ - "\u8001\u1350\u8001\u135d\u8001\u1361\u8001\u1400\u8001\u1434\u8001\u1447"+ - "\u8001\u144a\u8001\u145f\u8001\u1461\u8001\u1480\u8001\u14af\u8001\u14c4"+ - "\u8001\u14c5\u8001\u14c7\u8001\u14c7\u8001\u1580\u8001\u15ae\u8001\u15d8"+ - "\u8001\u15db\u8001\u1600\u8001\u162f\u8001\u1644\u8001\u1644\u8001\u1680"+ - "\u8001\u16aa\u8001\u16b8\u8001\u16b8\u8001\u1700\u8001\u171a\u8001\u1740"+ - "\u8001\u1746\u8001\u1800\u8001\u182b\u8001\u18a0\u8001\u18df\u8001\u18ff"+ - "\u8001\u1906\u8001\u1909\u8001\u1909\u8001\u190c\u8001\u1913\u8001\u1915"+ - "\u8001\u1916\u8001\u1918\u8001\u192f\u8001\u193f\u8001\u193f\u8001\u1941"+ - "\u8001\u1941\u8001\u19a0\u8001\u19a7\u8001\u19aa\u8001\u19d0\u8001\u19e1"+ - "\u8001\u19e1\u8001\u19e3\u8001\u19e3\u8001\u1a00\u8001\u1a00\u8001\u1a0b"+ - "\u8001\u1a32\u8001\u1a3a\u8001\u1a3a\u8001\u1a50\u8001\u1a50\u8001\u1a5c"+ - "\u8001\u1a89\u8001\u1a9d\u8001\u1a9d\u8001\u1ab0\u8001\u1af8\u8001\u1c00"+ - "\u8001\u1c08\u8001\u1c0a\u8001\u1c2e\u8001\u1c40\u8001\u1c40\u8001\u1c72"+ - "\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001\u1d08\u8001\u1d09\u8001\u1d0b"+ - "\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001\u1d60\u8001\u1d65\u8001\u1d67"+ - "\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001\u1d98\u8001\u1d98\u8001\u1ee0"+ - "\u8001\u1ef2\u8001\u1f02\u8001\u1f02\u8001\u1f04\u8001\u1f10\u8001\u1f12"+ - "\u8001\u1f33\u8001\u1fb0\u8001\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480"+ - "\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342f\u8001\u3441"+ - "\u8001\u3446\u8001\u4400\u8001\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40"+ - "\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00"+ - "\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d"+ - "\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50"+ - "\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3"+ - "\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00"+ - "\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd"+ - "\u8001\uaffe\u8001\ub000\u8001\ub122\u8001\ub132\u8001\ub132\u8001\ub150"+ - "\u8001\ub152\u8001\ub155\u8001\ub155\u8001\ub164\u8001\ub167\u8001\ub170"+ - "\u8001\ub2fb\u8001\ubc00\u8001\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80"+ - "\u8001\ubc88\u8001\ubc90\u8001\ubc99\u8001\ud400\u8001\ud454\u8001\ud456"+ - "\u8001\ud49c\u8001\ud49e\u8001\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5"+ - "\u8001\ud4a6\u8001\ud4a9\u8001\ud4ac\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb"+ - "\u8001\ud4bb\u8001\ud4bd\u8001\ud4c3\u8001\ud4c5\u8001\ud505\u8001\ud507"+ - "\u8001\ud50a\u8001\ud50d\u8001\ud514\u8001\ud516\u8001\ud51c\u8001\ud51e"+ - "\u8001\ud539\u8001\ud53b\u8001\ud53e\u8001\ud540\u8001\ud544\u8001\ud546"+ - "\u8001\ud546\u8001\ud54a\u8001\ud550\u8001\ud552\u8001\ud6a5\u8001\ud6a8"+ - "\u8001\ud6c0\u8001\ud6c2\u8001\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc"+ - "\u8001\ud714\u8001\ud716\u8001\ud734\u8001\ud736\u8001\ud74e\u8001\ud750"+ - "\u8001\ud76e\u8001\ud770\u8001\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa"+ - "\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\udf25"+ - "\u8001\udf2a\u8001\ue030\u8001\ue06d\u8001\ue100\u8001\ue12c\u8001\ue137"+ - "\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290\u8001\ue2ad\u8001\ue2c0"+ - "\u8001\ue2eb\u8001\ue4d0\u8001\ue4eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8"+ - "\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001\ue7f0\u8001\ue7fe\u8001\ue800"+ - "\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001\ue94b\u8001\ue94b\u8001\uee00"+ - "\u8001\uee03\u8001\uee05\u8001\uee1f\u8001\uee21\u8001\uee22\u8001\uee24"+ - "\u8001\uee24\u8001\uee27\u8001\uee27\u8001\uee29\u8001\uee32\u8001\uee34"+ - "\u8001\uee37\u8001\uee39\u8001\uee39\u8001\uee3b\u8001\uee3b\u8001\uee42"+ - "\u8001\uee42\u8001\uee47\u8001\uee47\u8001\uee49\u8001\uee49\u8001\uee4b"+ - "\u8001\uee4b\u8001\uee4d\u8001\uee4f\u8001\uee51\u8001\uee52\u8001\uee54"+ - "\u8001\uee54\u8001\uee57\u8001\uee57\u8001\uee59\u8001\uee59\u8001\uee5b"+ - "\u8001\uee5b\u8001\uee5d\u8001\uee5d\u8001\uee5f\u8001\uee5f\u8001\uee61"+ - "\u8001\uee62\u8001\uee64\u8001\uee64\u8001\uee67\u8001\uee6a\u8001\uee6c"+ - "\u8001\uee72\u8001\uee74\u8001\uee77\u8001\uee79\u8001\uee7c\u8001\uee7e"+ - "\u8001\uee7e\u8001\uee80\u8001\uee89\u8001\uee8b\u8001\uee9b\u8001\ueea1"+ - "\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000"+ - "\u8002\ua6df\u8002\ua700\u8002\ub739\u8002\ub740\u8002\ub81d\u8002\ub820"+ - "\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000"+ - "\u8003\u134a\u8003\u1350\u8003\u23af\u061b\u0000\u0002\u0001\u0000\u0000"+ - "\u0000\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000"+ - "\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000"+ - "\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000"+ - "\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000"+ - "\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000"+ - "\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000"+ - "\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000"+ - " \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001"+ - "\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000"+ - "\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000"+ - ".\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001"+ - "\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000"+ - "\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000"+ - "<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001"+ - "\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000"+ - "\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000"+ - "J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001"+ - "\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000"+ - "\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000"+ - "X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001"+ - "\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000"+ - "\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000"+ - "f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000j\u0001"+ - "\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001\u0000\u0000"+ - "\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000"+ - "t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001"+ - "\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000"+ - "\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000\u0000\u0000"+ - "\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000\u0000\u0000"+ - "\u0000\u0086\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000\u0000\u0000"+ - "\u0000\u008a\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000\u0000\u0000"+ - "\u0000\u008e\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000\u0000\u0000"+ - "\u0000\u0092\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000\u0000\u0000"+ - "\u0000\u0096\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000\u0000\u0000"+ - "\u0000\u009a\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000\u0000\u0000"+ - "\u0000\u009e\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000\u0000\u0000"+ - "\u0000\u00a2\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000\u0000\u0000"+ - "\u0000\u00a6\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000\u0000\u0000"+ - "\u0000\u00aa\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000\u0000\u0000"+ - "\u0000\u00ae\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000\u0000\u0000"+ - "\u0000\u00b2\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000\u0000\u0000"+ - "\u0000\u00b6\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000\u0000\u0000"+ - "\u0000\u00ba\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000\u0000\u0000"+ - "\u0000\u00be\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000\u0000\u0000"+ - "\u0000\u00c2\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000\u0000\u0000"+ - "\u0000\u00c6\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000\u0000\u0000"+ - "\u0000\u00ca\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000\u0000\u0000"+ - "\u0000\u00ce\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000\u0000\u0000"+ - "\u0000\u00d2\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000\u0000\u0000"+ - "\u0000\u00d6\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000\u0000\u0000"+ - "\u0000\u00da\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000\u0000\u0000"+ - "\u0000\u00de\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000\u0000\u0000"+ - "\u0000\u00e2\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000\u0000\u0000"+ - "\u0000\u00e6\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000\u0000\u0000"+ - "\u0000\u00ea\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000\u0000\u0000"+ - "\u0000\u00ee\u0001\u0000\u0000\u0000\u0000\u00f0\u0001\u0000\u0000\u0000"+ - "\u0000\u00f2\u0001\u0000\u0000\u0000\u0000\u00f4\u0001\u0000\u0000\u0000"+ - "\u0000\u00f6\u0001\u0000\u0000\u0000\u0000\u00f8\u0001\u0000\u0000\u0000"+ - "\u0000\u00fa\u0001\u0000\u0000\u0000\u0000\u00fc\u0001\u0000\u0000\u0000"+ - "\u0000\u00fe\u0001\u0000\u0000\u0000\u0000\u0100\u0001\u0000\u0000\u0000"+ - "\u0000\u0102\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000\u0000\u0000"+ - "\u0000\u0106\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000\u0000\u0000"+ - "\u0000\u010a\u0001\u0000\u0000\u0000\u0000\u010c\u0001\u0000\u0000\u0000"+ - "\u0000\u010e\u0001\u0000\u0000\u0000\u0000\u0110\u0001\u0000\u0000\u0000"+ - "\u0000\u0112\u0001\u0000\u0000\u0000\u0000\u0114\u0001\u0000\u0000\u0000"+ - "\u0000\u0116\u0001\u0000\u0000\u0000\u0000\u0118\u0001\u0000\u0000\u0000"+ - "\u0000\u011a\u0001\u0000\u0000\u0000\u0000\u011c\u0001\u0000\u0000\u0000"+ - "\u0000\u011e\u0001\u0000\u0000\u0000\u0000\u0120\u0001\u0000\u0000\u0000"+ - "\u0000\u0126\u0001\u0000\u0000\u0000\u0000\u012a\u0001\u0000\u0000\u0000"+ - "\u0000\u012c\u0001\u0000\u0000\u0000\u0000\u012e\u0001\u0000\u0000\u0000"+ - "\u0000\u0130\u0001\u0000\u0000\u0000\u0000\u0132\u0001\u0000\u0000\u0000"+ - "\u0000\u0134\u0001\u0000\u0000\u0000\u0000\u0136\u0001\u0000\u0000\u0000"+ - "\u0000\u0138\u0001\u0000\u0000\u0000\u0000\u013a\u0001\u0000\u0000\u0000"+ - "\u0000\u013c\u0001\u0000\u0000\u0000\u0000\u013e\u0001\u0000\u0000\u0000"+ - "\u0000\u0140\u0001\u0000\u0000\u0000\u0001\u0156\u0001\u0000\u0000\u0000"+ - "\u0001\u0158\u0001\u0000\u0000\u0000\u0001\u015a\u0001\u0000\u0000\u0000"+ - "\u0001\u015c\u0001\u0000\u0000\u0000\u0001\u015e\u0001\u0000\u0000\u0000"+ - "\u0002\u0162\u0001\u0000\u0000\u0000\u0004\u0178\u0001\u0000\u0000\u0000"+ - "\u0006\u017a\u0001\u0000\u0000\u0000\b\u0181\u0001\u0000\u0000\u0000\n"+ - "\u0189\u0001\u0000\u0000\u0000\f\u0190\u0001\u0000\u0000\u0000\u000e\u0197"+ - "\u0001\u0000\u0000\u0000\u0010\u019e\u0001\u0000\u0000\u0000\u0012\u01a5"+ - "\u0001\u0000\u0000\u0000\u0014\u01ae\u0001\u0000\u0000\u0000\u0016\u01b8"+ - "\u0001\u0000\u0000\u0000\u0018\u01c0\u0001\u0000\u0000\u0000\u001a\u01ca"+ - "\u0001\u0000\u0000\u0000\u001c\u01d6\u0001\u0000\u0000\u0000\u001e\u01dd"+ - "\u0001\u0000\u0000\u0000 \u01e8\u0001\u0000\u0000\u0000\"\u01eb\u0001"+ - "\u0000\u0000\u0000$\u01f1\u0001\u0000\u0000\u0000&\u01fa\u0001\u0000\u0000"+ - "\u0000(\u01ff\u0001\u0000\u0000\u0000*\u0206\u0001\u0000\u0000\u0000,"+ - "\u020d\u0001\u0000\u0000\u0000.\u0213\u0001\u0000\u0000\u00000\u0218\u0001"+ - "\u0000\u0000\u00002\u021f\u0001\u0000\u0000\u00004\u0229\u0001\u0000\u0000"+ - "\u00006\u022d\u0001\u0000\u0000\u00008\u0233\u0001\u0000\u0000\u0000:"+ - "\u0236\u0001\u0000\u0000\u0000<\u0238\u0001\u0000\u0000\u0000>\u023f\u0001"+ - "\u0000\u0000\u0000@\u0245\u0001\u0000\u0000\u0000B\u0252\u0001\u0000\u0000"+ - "\u0000D\u025b\u0001\u0000\u0000\u0000F\u025f\u0001\u0000\u0000\u0000H"+ - "\u0263\u0001\u0000\u0000\u0000J\u0269\u0001\u0000\u0000\u0000L\u026b\u0001"+ - "\u0000\u0000\u0000N\u026e\u0001\u0000\u0000\u0000P\u0273\u0001\u0000\u0000"+ - "\u0000R\u0279\u0001\u0000\u0000\u0000T\u027f\u0001\u0000\u0000\u0000V"+ - "\u0286\u0001\u0000\u0000\u0000X\u028d\u0001\u0000\u0000\u0000Z\u0296\u0001"+ - "\u0000\u0000\u0000\\\u029c\u0001\u0000\u0000\u0000^\u02a2\u0001\u0000"+ - "\u0000\u0000`\u02a9\u0001\u0000\u0000\u0000b\u02af\u0001\u0000\u0000\u0000"+ - "d\u02b6\u0001\u0000\u0000\u0000f\u02bc\u0001\u0000\u0000\u0000h\u02c5"+ - "\u0001\u0000\u0000\u0000j\u02cd\u0001\u0000\u0000\u0000l\u02d3\u0001\u0000"+ - "\u0000\u0000n\u02db\u0001\u0000\u0000\u0000p\u02e2\u0001\u0000\u0000\u0000"+ - "r\u02e7\u0001\u0000\u0000\u0000t\u02f0\u0001\u0000\u0000\u0000v\u02ff"+ - "\u0001\u0000\u0000\u0000x\u0305\u0001\u0000\u0000\u0000z\u0309\u0001\u0000"+ - "\u0000\u0000|\u030c\u0001\u0000\u0000\u0000~\u0313\u0001\u0000\u0000\u0000"+ - "\u0080\u031d\u0001\u0000\u0000\u0000\u0082\u0327\u0001\u0000\u0000\u0000"+ - "\u0084\u0333\u0001\u0000\u0000\u0000\u0086\u033c\u0001\u0000\u0000\u0000"+ - "\u0088\u0346\u0001\u0000\u0000\u0000\u008a\u034e\u0001\u0000\u0000\u0000"+ - "\u008c\u035a\u0001\u0000\u0000\u0000\u008e\u0369\u0001\u0000\u0000\u0000"+ - "\u0090\u036f\u0001\u0000\u0000\u0000\u0092\u0373\u0001\u0000\u0000\u0000"+ - "\u0094\u0377\u0001\u0000\u0000\u0000\u0096\u037c\u0001\u0000\u0000\u0000"+ - "\u0098\u0385\u0001\u0000\u0000\u0000\u009a\u038c\u0001\u0000\u0000\u0000"+ - "\u009c\u0394\u0001\u0000\u0000\u0000\u009e\u039c\u0001\u0000\u0000\u0000"+ - "\u00a0\u03a1\u0001\u0000\u0000\u0000\u00a2\u03ab\u0001\u0000\u0000\u0000"+ - "\u00a4\u03b2\u0001\u0000\u0000\u0000\u00a6\u03b7\u0001\u0000\u0000\u0000"+ - "\u00a8\u03bd\u0001\u0000\u0000\u0000\u00aa\u03c0\u0001\u0000\u0000\u0000"+ - "\u00ac\u03c4\u0001\u0000\u0000\u0000\u00ae\u03cb\u0001\u0000\u0000\u0000"+ - "\u00b0\u03d0\u0001\u0000\u0000\u0000\u00b2\u03d5\u0001\u0000\u0000\u0000"+ - "\u00b4\u03da\u0001\u0000\u0000\u0000\u00b6\u03e2\u0001\u0000\u0000\u0000"+ - "\u00b8\u03e9\u0001\u0000\u0000\u0000\u00ba\u03ef\u0001\u0000\u0000\u0000"+ - "\u00bc\u03fd\u0001\u0000\u0000\u0000\u00be\u0400\u0001\u0000\u0000\u0000"+ - "\u00c0\u0406\u0001\u0000\u0000\u0000\u00c2\u040b\u0001\u0000\u0000\u0000"+ - "\u00c4\u0416\u0001\u0000\u0000\u0000\u00c6\u041a\u0001\u0000\u0000\u0000"+ - "\u00c8\u0421\u0001\u0000\u0000\u0000\u00ca\u042a\u0001\u0000\u0000\u0000"+ - "\u00cc\u042e\u0001\u0000\u0000\u0000\u00ce\u0434\u0001\u0000\u0000\u0000"+ - "\u00d0\u043e\u0001\u0000\u0000\u0000\u00d2\u0440\u0001\u0000\u0000\u0000"+ - "\u00d4\u0444\u0001\u0000\u0000\u0000\u00d6\u0446\u0001\u0000\u0000\u0000"+ - "\u00d8\u044a\u0001\u0000\u0000\u0000\u00da\u044c\u0001\u0000\u0000\u0000"+ - "\u00dc\u0450\u0001\u0000\u0000\u0000\u00de\u0452\u0001\u0000\u0000\u0000"+ - "\u00e0\u0454\u0001\u0000\u0000\u0000\u00e2\u0456\u0001\u0000\u0000\u0000"+ - "\u00e4\u0458\u0001\u0000\u0000\u0000\u00e6\u045a\u0001\u0000\u0000\u0000"+ - "\u00e8\u045f\u0001\u0000\u0000\u0000\u00ea\u0464\u0001\u0000\u0000\u0000"+ - "\u00ec\u0467\u0001\u0000\u0000\u0000\u00ee\u046b\u0001\u0000\u0000\u0000"+ - "\u00f0\u046e\u0001\u0000\u0000\u0000\u00f2\u0471\u0001\u0000\u0000\u0000"+ - "\u00f4\u0474\u0001\u0000\u0000\u0000\u00f6\u0477\u0001\u0000\u0000\u0000"+ - "\u00f8\u0479\u0001\u0000\u0000\u0000\u00fa\u047c\u0001\u0000\u0000\u0000"+ - "\u00fc\u047e\u0001\u0000\u0000\u0000\u00fe\u0481\u0001\u0000\u0000\u0000"+ - "\u0100\u0483\u0001\u0000\u0000\u0000\u0102\u0485\u0001\u0000\u0000\u0000"+ - "\u0104\u0487\u0001\u0000\u0000\u0000\u0106\u048a\u0001\u0000\u0000\u0000"+ - "\u0108\u048d\u0001\u0000\u0000\u0000\u010a\u0490\u0001\u0000\u0000\u0000"+ - "\u010c\u0492\u0001\u0000\u0000\u0000\u010e\u0494\u0001\u0000\u0000\u0000"+ - "\u0110\u0496\u0001\u0000\u0000\u0000\u0112\u0498\u0001\u0000\u0000\u0000"+ - "\u0114\u049a\u0001\u0000\u0000\u0000\u0116\u049c\u0001\u0000\u0000\u0000"+ - "\u0118\u04aa\u0001\u0000\u0000\u0000\u011a\u04ae\u0001\u0000\u0000\u0000"+ - "\u011c\u04ba\u0001\u0000\u0000\u0000\u011e\u04c8\u0001\u0000\u0000\u0000"+ - "\u0120\u04d4\u0001\u0000\u0000\u0000\u0122\u04f8\u0001\u0000\u0000\u0000"+ - "\u0124\u04fa\u0001\u0000\u0000\u0000\u0126\u0505\u0001\u0000\u0000\u0000"+ - "\u0128\u050b\u0001\u0000\u0000\u0000\u012a\u0512\u0001\u0000\u0000\u0000"+ - "\u012c\u0518\u0001\u0000\u0000\u0000\u012e\u051a\u0001\u0000\u0000\u0000"+ - "\u0130\u051f\u0001\u0000\u0000\u0000\u0132\u0524\u0001\u0000\u0000\u0000"+ - "\u0134\u052b\u0001\u0000\u0000\u0000\u0136\u0536\u0001\u0000\u0000\u0000"+ - "\u0138\u0541\u0001\u0000\u0000\u0000\u013a\u054e\u0001\u0000\u0000\u0000"+ - "\u013c\u0554\u0001\u0000\u0000\u0000\u013e\u0563\u0001\u0000\u0000\u0000"+ - "\u0140\u0569\u0001\u0000\u0000\u0000\u0142\u0578\u0001\u0000\u0000\u0000"+ - "\u0144\u057a\u0001\u0000\u0000\u0000\u0146\u0596\u0001\u0000\u0000\u0000"+ - "\u0148\u05a0\u0001\u0000\u0000\u0000\u014a\u05a2\u0001\u0000\u0000\u0000"+ - "\u014c\u05a4\u0001\u0000\u0000\u0000\u014e\u05a6\u0001\u0000\u0000\u0000"+ - "\u0150\u05ae\u0001\u0000\u0000\u0000\u0152\u05b0\u0001\u0000\u0000\u0000"+ - "\u0154\u05b2\u0001\u0000\u0000\u0000\u0156\u05b5\u0001\u0000\u0000\u0000"+ - "\u0158\u05bb\u0001\u0000\u0000\u0000\u015a\u05c9\u0001\u0000\u0000\u0000"+ - "\u015c\u05e6\u0001\u0000\u0000\u0000\u015e\u05ea\u0001\u0000\u0000\u0000"+ - "\u0160\u0163\u0003\u0004\u0001\u0000\u0161\u0163\u0003\u0120\u008f\u0000"+ - "\u0162\u0160\u0001\u0000\u0000\u0000\u0162\u0161\u0001\u0000\u0000\u0000"+ - "\u0163\u0164\u0001\u0000\u0000\u0000\u0164\u0165\u0006\u0000\u0000\u0000"+ - "\u0165\u0003\u0001\u0000\u0000\u0000\u0166\u0170\u0003\u0146\u00a2\u0000"+ - "\u0167\u0168\u0005.\u0000\u0000\u0168\u016a\u0004\u0001\u0000\u0000\u0169"+ - "\u016b\u0003\u0146\u00a2\u0000\u016a\u0169\u0001\u0000\u0000\u0000\u016a"+ - "\u016b\u0001\u0000\u0000\u0000\u016b\u016d\u0001\u0000\u0000\u0000\u016c"+ - "\u016e\u0003\u014e\u00a6\u0000\u016d\u016c\u0001\u0000\u0000\u0000\u016d"+ - "\u016e\u0001\u0000\u0000\u0000\u016e\u0171\u0001\u0000\u0000\u0000\u016f"+ - "\u0171\u0003\u014e\u00a6\u0000\u0170\u0167\u0001\u0000\u0000\u0000\u0170"+ - "\u016f\u0001\u0000\u0000\u0000\u0171\u0179\u0001\u0000\u0000\u0000\u0172"+ - "\u0173\u0005.\u0000\u0000\u0173\u0174\u0004\u0001\u0001\u0000\u0174\u0176"+ - "\u0003\u0146\u00a2\u0000\u0175\u0177\u0003\u014e\u00a6\u0000\u0176\u0175"+ - "\u0001\u0000\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000\u0177\u0179"+ - "\u0001\u0000\u0000\u0000\u0178\u0166\u0001\u0000\u0000\u0000\u0178\u0172"+ - "\u0001\u0000\u0000\u0000\u0179\u0005\u0001\u0000\u0000\u0000\u017a\u017b"+ - "\u0005t\u0000\u0000\u017b\u017c\u0005r\u0000\u0000\u017c\u017d\u0005u"+ - "\u0000\u0000\u017d\u017e\u0005e\u0000\u0000\u017e\u017f\u0001\u0000\u0000"+ - "\u0000\u017f\u0180\u0006\u0002\u0000\u0000\u0180\u0007\u0001\u0000\u0000"+ - "\u0000\u0181\u0182\u0005f\u0000\u0000\u0182\u0183\u0005a\u0000\u0000\u0183"+ - "\u0184\u0005l\u0000\u0000\u0184\u0185\u0005s\u0000\u0000\u0185\u0186\u0005"+ - "e\u0000\u0000\u0186\u0187\u0001\u0000\u0000\u0000\u0187\u0188\u0006\u0003"+ - "\u0000\u0000\u0188\t\u0001\u0000\u0000\u0000\u0189\u018a\u0005a\u0000"+ - "\u0000\u018a\u018b\u0005s\u0000\u0000\u018b\u018c\u0005s\u0000\u0000\u018c"+ - "\u018d\u0005e\u0000\u0000\u018d\u018e\u0005r\u0000\u0000\u018e\u018f\u0005"+ - "t\u0000\u0000\u018f\u000b\u0001\u0000\u0000\u0000\u0190\u0191\u0005a\u0000"+ - "\u0000\u0191\u0192\u0005s\u0000\u0000\u0192\u0193\u0005s\u0000\u0000\u0193"+ - "\u0194\u0005u\u0000\u0000\u0194\u0195\u0005m\u0000\u0000\u0195\u0196\u0005"+ - "e\u0000\u0000\u0196\r\u0001\u0000\u0000\u0000\u0197\u0198\u0005i\u0000"+ - "\u0000\u0198\u0199\u0005n\u0000\u0000\u0199\u019a\u0005h\u0000\u0000\u019a"+ - "\u019b\u0005a\u0000\u0000\u019b\u019c\u0005l\u0000\u0000\u019c\u019d\u0005"+ - "e\u0000\u0000\u019d\u000f\u0001\u0000\u0000\u0000\u019e\u019f\u0005e\u0000"+ - "\u0000\u019f\u01a0\u0005x\u0000\u0000\u01a0\u01a1\u0005h\u0000\u0000\u01a1"+ - "\u01a2\u0005a\u0000\u0000\u01a2\u01a3\u0005l\u0000\u0000\u01a3\u01a4\u0005"+ - "e\u0000\u0000\u01a4\u0011\u0001\u0000\u0000\u0000\u01a5\u01a6\u0005r\u0000"+ - "\u0000\u01a6\u01a7\u0005e\u0000\u0000\u01a7\u01a8\u0005q\u0000\u0000\u01a8"+ - "\u01a9\u0005u\u0000\u0000\u01a9\u01aa\u0005i\u0000\u0000\u01aa\u01ab\u0005"+ - "r\u0000\u0000\u01ab\u01ac\u0005e\u0000\u0000\u01ac\u01ad\u0005s\u0000"+ - "\u0000\u01ad\u0013\u0001\u0000\u0000\u0000\u01ae\u01af\u0005p\u0000\u0000"+ - "\u01af\u01b0\u0005r\u0000\u0000\u01b0\u01b1\u0005e\u0000\u0000\u01b1\u01b2"+ - "\u0005s\u0000\u0000\u01b2\u01b3\u0005e\u0000\u0000\u01b3\u01b4\u0005r"+ - "\u0000\u0000\u01b4\u01b5\u0005v\u0000\u0000\u01b5\u01b6\u0005e\u0000\u0000"+ - "\u01b6\u01b7\u0005s\u0000\u0000\u01b7\u0015\u0001\u0000\u0000\u0000\u01b8"+ - "\u01b9\u0005e\u0000\u0000\u01b9\u01ba\u0005n\u0000\u0000\u01ba\u01bb\u0005"+ - "s\u0000\u0000\u01bb\u01bc\u0005u\u0000\u0000\u01bc\u01bd\u0005r\u0000"+ - "\u0000\u01bd\u01be\u0005e\u0000\u0000\u01be\u01bf\u0005s\u0000\u0000\u01bf"+ - "\u0017\u0001\u0000\u0000\u0000\u01c0\u01c1\u0005i\u0000\u0000\u01c1\u01c2"+ - "\u0005n\u0000\u0000\u01c2\u01c3\u0005v\u0000\u0000\u01c3\u01c4\u0005a"+ - "\u0000\u0000\u01c4\u01c5\u0005r\u0000\u0000\u01c5\u01c6\u0005i\u0000\u0000"+ - "\u01c6\u01c7\u0005a\u0000\u0000\u01c7\u01c8\u0005n\u0000\u0000\u01c8\u01c9"+ - "\u0005t\u0000\u0000\u01c9\u0019\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005"+ - "d\u0000\u0000\u01cb\u01cc\u0005e\u0000\u0000\u01cc\u01cd\u0005c\u0000"+ - "\u0000\u01cd\u01ce\u0005r\u0000\u0000\u01ce\u01cf\u0005e\u0000\u0000\u01cf"+ - "\u01d0\u0005a\u0000\u0000\u01d0\u01d1\u0005s\u0000\u0000\u01d1\u01d2\u0005"+ - "e\u0000\u0000\u01d2\u01d3\u0005s\u0000\u0000\u01d3\u01d4\u0001\u0000\u0000"+ - "\u0000\u01d4\u01d5\u0006\f\u0000\u0000\u01d5\u001b\u0001\u0000\u0000\u0000"+ - "\u01d6\u01d7\u0005p\u0000\u0000\u01d7\u01d8\u0005u\u0000\u0000\u01d8\u01d9"+ - "\u0005r\u0000\u0000\u01d9\u01da\u0005e\u0000\u0000\u01da\u01db\u0001\u0000"+ - "\u0000\u0000\u01db\u01dc\u0006\r\u0000\u0000\u01dc\u001d\u0001\u0000\u0000"+ - "\u0000\u01dd\u01de\u0005i\u0000\u0000\u01de\u01df\u0005m\u0000\u0000\u01df"+ - "\u01e0\u0005p\u0000\u0000\u01e0\u01e1\u0005l\u0000\u0000\u01e1\u01e2\u0005"+ - "e\u0000\u0000\u01e2\u01e3\u0005m\u0000\u0000\u01e3\u01e4\u0005e\u0000"+ - "\u0000\u01e4\u01e5\u0005n\u0000\u0000\u01e5\u01e6\u0005t\u0000\u0000\u01e6"+ - "\u01e7\u0005s\u0000\u0000\u01e7\u001f\u0001\u0000\u0000\u0000\u01e8\u01e9"+ - "\u0005a\u0000\u0000\u01e9\u01ea\u0005s\u0000\u0000\u01ea!\u0001\u0000"+ - "\u0000\u0000\u01eb\u01ec\u0005o\u0000\u0000\u01ec\u01ed\u0005l\u0000\u0000"+ - "\u01ed\u01ee\u0005d\u0000\u0000\u01ee\u01ef\u0001\u0000\u0000\u0000\u01ef"+ - "\u01f0\u0006\u0010\u0000\u0000\u01f0#\u0001\u0000\u0000\u0000\u01f1\u01f2"+ - "\u0005b\u0000\u0000\u01f2\u01f3\u0005e\u0000\u0000\u01f3\u01f4\u0005f"+ - "\u0000\u0000\u01f4\u01f5\u0005o\u0000\u0000\u01f5\u01f6\u0005r\u0000\u0000"+ - "\u01f6\u01f7\u0005e\u0000\u0000\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f8"+ - "\u01f9\u0006\u0011\u0000\u0000\u01f9%\u0001\u0000\u0000\u0000\u01fa\u01fb"+ - "\u0005#\u0000\u0000\u01fb\u01fc\u0005l\u0000\u0000\u01fc\u01fd\u0005h"+ - "\u0000\u0000\u01fd\u01fe\u0005s\u0000\u0000\u01fe\'\u0001\u0000\u0000"+ - "\u0000\u01ff\u0200\u0005f\u0000\u0000\u0200\u0201\u0005o\u0000\u0000\u0201"+ - "\u0202\u0005r\u0000\u0000\u0202\u0203\u0005a\u0000\u0000\u0203\u0204\u0005"+ - "l\u0000\u0000\u0204\u0205\u0005l\u0000\u0000\u0205)\u0001\u0000\u0000"+ - "\u0000\u0206\u0207\u0005e\u0000\u0000\u0207\u0208\u0005x\u0000\u0000\u0208"+ - "\u0209\u0005i\u0000\u0000\u0209\u020a\u0005s\u0000\u0000\u020a\u020b\u0005"+ - "t\u0000\u0000\u020b\u020c\u0005s\u0000\u0000\u020c+\u0001\u0000\u0000"+ - "\u0000\u020d\u020e\u0005a\u0000\u0000\u020e\u020f\u0005c\u0000\u0000\u020f"+ - "\u0210\u0005c\u0000\u0000\u0210\u0211\u0001\u0000\u0000\u0000\u0211\u0212"+ - "\u0006\u0015\u0000\u0000\u0212-\u0001\u0000\u0000\u0000\u0213\u0214\u0005"+ - "f\u0000\u0000\u0214\u0215\u0005o\u0000\u0000\u0215\u0216\u0005l\u0000"+ - "\u0000\u0216\u0217\u0005d\u0000\u0000\u0217/\u0001\u0000\u0000\u0000\u0218"+ - "\u0219\u0005u\u0000\u0000\u0219\u021a\u0005n\u0000\u0000\u021a\u021b\u0005"+ - "f\u0000\u0000\u021b\u021c\u0005o\u0000\u0000\u021c\u021d\u0005l\u0000"+ - "\u0000\u021d\u021e\u0005d\u0000\u0000\u021e1\u0001\u0000\u0000\u0000\u021f"+ - "\u0220\u0005u\u0000\u0000\u0220\u0221\u0005n\u0000\u0000\u0221\u0222\u0005"+ - "f\u0000\u0000\u0222\u0223\u0005o\u0000\u0000\u0223\u0224\u0005l\u0000"+ - "\u0000\u0224\u0225\u0005d\u0000\u0000\u0225\u0226\u0005i\u0000\u0000\u0226"+ - "\u0227\u0005n\u0000\u0000\u0227\u0228\u0005g\u0000\u0000\u02283\u0001"+ - "\u0000\u0000\u0000\u0229\u022a\u0005l\u0000\u0000\u022a\u022b\u0005e\u0000"+ - "\u0000\u022b\u022c\u0005t\u0000\u0000\u022c5\u0001\u0000\u0000\u0000\u022d"+ - "\u022e\u0005g\u0000\u0000\u022e\u022f\u0005h\u0000\u0000\u022f\u0230\u0005"+ - "o\u0000\u0000\u0230\u0231\u0005s\u0000\u0000\u0231\u0232\u0005t\u0000"+ - "\u0000\u02327\u0001\u0000\u0000\u0000\u0233\u0234\u0005i\u0000\u0000\u0234"+ - "\u0235\u0005n\u0000\u0000\u02359\u0001\u0000\u0000\u0000\u0236\u0237\u0005"+ - "#\u0000\u0000\u0237;\u0001\u0000\u0000\u0000\u0238\u0239\u0005s\u0000"+ - "\u0000\u0239\u023a\u0005u\u0000\u0000\u023a\u023b\u0005b\u0000\u0000\u023b"+ - "\u023c\u0005s\u0000\u0000\u023c\u023d\u0005e\u0000\u0000\u023d\u023e\u0005"+ - "t\u0000\u0000\u023e=\u0001\u0000\u0000\u0000\u023f\u0240\u0005u\u0000"+ - "\u0000\u0240\u0241\u0005n\u0000\u0000\u0241\u0242\u0005i\u0000\u0000\u0242"+ - "\u0243\u0005o\u0000\u0000\u0243\u0244\u0005n\u0000\u0000\u0244?\u0001"+ - "\u0000\u0000\u0000\u0245\u0246\u0005i\u0000\u0000\u0246\u0247\u0005n\u0000"+ - "\u0000\u0247\u0248\u0005t\u0000\u0000\u0248\u0249\u0005e\u0000\u0000\u0249"+ - "\u024a\u0005r\u0000\u0000\u024a\u024b\u0005s\u0000\u0000\u024b\u024c\u0005"+ - "e\u0000\u0000\u024c\u024d\u0005c\u0000\u0000\u024d\u024e\u0005t\u0000"+ - "\u0000\u024e\u024f\u0005i\u0000\u0000\u024f\u0250\u0005o\u0000\u0000\u0250"+ - "\u0251\u0005n\u0000\u0000\u0251A\u0001\u0000\u0000\u0000\u0252\u0253\u0005"+ - "s\u0000\u0000\u0253\u0254\u0005e\u0000\u0000\u0254\u0255\u0005t\u0000"+ - "\u0000\u0255\u0256\u0005m\u0000\u0000\u0256\u0257\u0005i\u0000\u0000\u0257"+ - "\u0258\u0005n\u0000\u0000\u0258\u0259\u0005u\u0000\u0000\u0259\u025a\u0005"+ - "s\u0000\u0000\u025aC\u0001\u0000\u0000\u0000\u025b\u025c\u0005=\u0000"+ - "\u0000\u025c\u025d\u0005=\u0000\u0000\u025d\u025e\u0005>\u0000\u0000\u025e"+ - "E\u0001\u0000\u0000\u0000\u025f\u0260\u0005-\u0000\u0000\u0260\u0261\u0005"+ - "-\u0000\u0000\u0261\u0262\u0005*\u0000\u0000\u0262G\u0001\u0000\u0000"+ - "\u0000\u0263\u0264\u0005a\u0000\u0000\u0264\u0265\u0005p\u0000\u0000\u0265"+ - "\u0266\u0005p\u0000\u0000\u0266\u0267\u0005l\u0000\u0000\u0267\u0268\u0005"+ - "y\u0000\u0000\u0268I\u0001\u0000\u0000\u0000\u0269\u026a\u0005?\u0000"+ - "\u0000\u026aK\u0001\u0000\u0000\u0000\u026b\u026c\u0005!\u0000\u0000\u026c"+ - "\u026d\u0005<\u0000\u0000\u026dM\u0001\u0000\u0000\u0000\u026e\u026f\u0005"+ - "!\u0000\u0000\u026f\u0270\u0005>\u0000\u0000\u0270\u0271\u0001\u0000\u0000"+ - "\u0000\u0271\u0272\u0006&\u0000\u0000\u0272O\u0001\u0000\u0000\u0000\u0273"+ - "\u0274\u0005s\u0000\u0000\u0274\u0275\u0005e\u0000\u0000\u0275\u0276\u0005"+ - "q\u0000\u0000\u0276\u0277\u0001\u0000\u0000\u0000\u0277\u0278\u0006\'"+ - "\u0000\u0000\u0278Q\u0001\u0000\u0000\u0000\u0279\u027a\u0005s\u0000\u0000"+ - "\u027a\u027b\u0005e\u0000\u0000\u027b\u027c\u0005t\u0000\u0000\u027c\u027d"+ - "\u0001\u0000\u0000\u0000\u027d\u027e\u0006(\u0000\u0000\u027eS\u0001\u0000"+ - "\u0000\u0000\u027f\u0280\u0005m\u0000\u0000\u0280\u0281\u0005s\u0000\u0000"+ - "\u0281\u0282\u0005e\u0000\u0000\u0282\u0283\u0005t\u0000\u0000\u0283\u0284"+ - "\u0001\u0000\u0000\u0000\u0284\u0285\u0006)\u0000\u0000\u0285U\u0001\u0000"+ - "\u0000\u0000\u0286\u0287\u0005d\u0000\u0000\u0287\u0288\u0005i\u0000\u0000"+ - "\u0288\u0289\u0005c\u0000\u0000\u0289\u028a\u0005t\u0000\u0000\u028a\u028b"+ - "\u0001\u0000\u0000\u0000\u028b\u028c\u0006*\u0000\u0000\u028cW\u0001\u0000"+ - "\u0000\u0000\u028d\u028e\u0005o\u0000\u0000\u028e\u028f\u0005p\u0000\u0000"+ - "\u028f\u0290\u0005t\u0000\u0000\u0290\u0291\u0005i\u0000\u0000\u0291\u0292"+ - "\u0005o\u0000\u0000\u0292\u0293\u0005n\u0000\u0000\u0293\u0294\u0001\u0000"+ - "\u0000\u0000\u0294\u0295\u0006+\u0000\u0000\u0295Y\u0001\u0000\u0000\u0000"+ - "\u0296\u0297\u0005l\u0000\u0000\u0297\u0298\u0005e\u0000\u0000\u0298\u0299"+ - "\u0005n\u0000\u0000\u0299\u029a\u0001\u0000\u0000\u0000\u029a\u029b\u0006"+ - ",\u0000\u0000\u029b[\u0001\u0000\u0000\u0000\u029c\u029d\u0005n\u0000"+ - "\u0000\u029d\u029e\u0005e\u0000\u0000\u029e\u029f\u0005w\u0000\u0000\u029f"+ - "\u02a0\u0001\u0000\u0000\u0000\u02a0\u02a1\u0006-\u0000\u0000\u02a1]\u0001"+ - "\u0000\u0000\u0000\u02a2\u02a3\u0005m\u0000\u0000\u02a3\u02a4\u0005a\u0000"+ - "\u0000\u02a4\u02a5\u0005k\u0000\u0000\u02a5\u02a6\u0005e\u0000\u0000\u02a6"+ - "\u02a7\u0001\u0000\u0000\u0000\u02a7\u02a8\u0006.\u0000\u0000\u02a8_\u0001"+ - "\u0000\u0000\u0000\u02a9\u02aa\u0005c\u0000\u0000\u02aa\u02ab\u0005a\u0000"+ - "\u0000\u02ab\u02ac\u0005p\u0000\u0000\u02ac\u02ad\u0001\u0000\u0000\u0000"+ - "\u02ad\u02ae\u0006/\u0000\u0000\u02aea\u0001\u0000\u0000\u0000\u02af\u02b0"+ - "\u0005s\u0000\u0000\u02b0\u02b1\u0005o\u0000\u0000\u02b1\u02b2\u0005m"+ - "\u0000\u0000\u02b2\u02b3\u0005e\u0000\u0000\u02b3\u02b4\u0001\u0000\u0000"+ - "\u0000\u02b4\u02b5\u00060\u0000\u0000\u02b5c\u0001\u0000\u0000\u0000\u02b6"+ - "\u02b7\u0005g\u0000\u0000\u02b7\u02b8\u0005e\u0000\u0000\u02b8\u02b9\u0005"+ - "t\u0000\u0000\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bb\u00061\u0000"+ - "\u0000\u02bbe\u0001\u0000\u0000\u0000\u02bc\u02bd\u0005d\u0000\u0000\u02bd"+ - "\u02be\u0005o\u0000\u0000\u02be\u02bf\u0005m\u0000\u0000\u02bf\u02c0\u0005"+ - "a\u0000\u0000\u02c0\u02c1\u0005i\u0000\u0000\u02c1\u02c2\u0005n\u0000"+ - "\u0000\u02c2\u02c3\u0001\u0000\u0000\u0000\u02c3\u02c4\u00062\u0000\u0000"+ - "\u02c4g\u0001\u0000\u0000\u0000\u02c5\u02c6\u0005a\u0000\u0000\u02c6\u02c7"+ - "\u0005x\u0000\u0000\u02c7\u02c8\u0005i\u0000\u0000\u02c8\u02c9\u0005o"+ - "\u0000\u0000\u02c9\u02ca\u0005m\u0000\u0000\u02ca\u02cb\u0001\u0000\u0000"+ - "\u0000\u02cb\u02cc\u00063\u0000\u0000\u02cci\u0001\u0000\u0000\u0000\u02cd"+ - "\u02ce\u0005a\u0000\u0000\u02ce\u02cf\u0005d\u0000\u0000\u02cf\u02d0\u0005"+ - "t\u0000\u0000\u02d0\u02d1\u0001\u0000\u0000\u0000\u02d1\u02d2\u00064\u0000"+ - "\u0000\u02d2k\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005m\u0000\u0000\u02d4"+ - "\u02d5\u0005a\u0000\u0000\u02d5\u02d6\u0005t\u0000\u0000\u02d6\u02d7\u0005"+ - "c\u0000\u0000\u02d7\u02d8\u0005h\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000"+ - "\u0000\u02d9\u02da\u00065\u0000\u0000\u02dam\u0001\u0000\u0000\u0000\u02db"+ - "\u02dc\u0005n\u0000\u0000\u02dc\u02dd\u0005o\u0000\u0000\u02dd\u02de\u0005"+ - "n\u0000\u0000\u02de\u02df\u0005e\u0000\u0000\u02df\u02e0\u0001\u0000\u0000"+ - "\u0000\u02e0\u02e1\u00066\u0000\u0000\u02e1o\u0001\u0000\u0000\u0000\u02e2"+ - "\u02e3\u0005p\u0000\u0000\u02e3\u02e4\u0005r\u0000\u0000\u02e4\u02e5\u0005"+ - "e\u0000\u0000\u02e5\u02e6\u0005d\u0000\u0000\u02e6q\u0001\u0000\u0000"+ - "\u0000\u02e7\u02e8\u0005t\u0000\u0000\u02e8\u02e9\u0005y\u0000\u0000\u02e9"+ - "\u02ea\u0005p\u0000\u0000\u02ea\u02eb\u0005e\u0000\u0000\u02eb\u02ec\u0005"+ - "O\u0000\u0000\u02ec\u02ed\u0005f\u0000\u0000\u02ed\u02ee\u0001\u0000\u0000"+ - "\u0000\u02ee\u02ef\u00068\u0000\u0000\u02efs\u0001\u0000\u0000\u0000\u02f0"+ - "\u02f1\u0005i\u0000\u0000\u02f1\u02f2\u0005s\u0000\u0000\u02f2\u02f3\u0005"+ - "C\u0000\u0000\u02f3\u02f4\u0005o\u0000\u0000\u02f4\u02f5\u0005m\u0000"+ - "\u0000\u02f5\u02f6\u0005p\u0000\u0000\u02f6\u02f7\u0005a\u0000\u0000\u02f7"+ - "\u02f8\u0005r\u0000\u0000\u02f8\u02f9\u0005a\u0000\u0000\u02f9\u02fa\u0005"+ - "b\u0000\u0000\u02fa\u02fb\u0005l\u0000\u0000\u02fb\u02fc\u0005e\u0000"+ - "\u0000\u02fc\u02fd\u0001\u0000\u0000\u0000\u02fd\u02fe\u00069\u0000\u0000"+ - "\u02feu\u0001\u0000\u0000\u0000\u02ff\u0300\u0005s\u0000\u0000\u0300\u0301"+ - "\u0005h\u0000\u0000\u0301\u0302\u0005a\u0000\u0000\u0302\u0303\u0005r"+ - "\u0000\u0000\u0303\u0304\u0005e\u0000\u0000\u0304w\u0001\u0000\u0000\u0000"+ - "\u0305\u0306\u0005@\u0000\u0000\u0306\u0307\u0001\u0000\u0000\u0000\u0307"+ - "\u0308\u0006;\u0000\u0000\u0308y\u0001\u0000\u0000\u0000\u0309\u030a\u0005"+ - ".\u0000\u0000\u030a\u030b\u0005.\u0000\u0000\u030b{\u0001\u0000\u0000"+ - "\u0000\u030c\u030d\u0005s\u0000\u0000\u030d\u030e\u0005h\u0000\u0000\u030e"+ - "\u030f\u0005a\u0000\u0000\u030f\u0310\u0005r\u0000\u0000\u0310\u0311\u0005"+ - "e\u0000\u0000\u0311\u0312\u0005d\u0000\u0000\u0312}\u0001\u0000\u0000"+ - "\u0000\u0313\u0314\u0005e\u0000\u0000\u0314\u0315\u0005x\u0000\u0000\u0315"+ - "\u0316\u0005c\u0000\u0000\u0316\u0317\u0005l\u0000\u0000\u0317\u0318\u0005"+ - "u\u0000\u0000\u0318\u0319\u0005s\u0000\u0000\u0319\u031a\u0005i\u0000"+ - "\u0000\u031a\u031b\u0005v\u0000\u0000\u031b\u031c\u0005e\u0000\u0000\u031c"+ - "\u007f\u0001\u0000\u0000\u0000\u031d\u031e\u0005p\u0000\u0000\u031e\u031f"+ - "\u0005r\u0000\u0000\u031f\u0320\u0005e\u0000\u0000\u0320\u0321\u0005d"+ - "\u0000\u0000\u0321\u0322\u0005i\u0000\u0000\u0322\u0323\u0005c\u0000\u0000"+ - "\u0323\u0324\u0005a\u0000\u0000\u0324\u0325\u0005t\u0000\u0000\u0325\u0326"+ - "\u0005e\u0000\u0000\u0326\u0081\u0001\u0000\u0000\u0000\u0327\u0328\u0005"+ - "w\u0000\u0000\u0328\u0329\u0005r\u0000\u0000\u0329\u032a\u0005i\u0000"+ - "\u0000\u032a\u032b\u0005t\u0000\u0000\u032b\u032c\u0005e\u0000\u0000\u032c"+ - "\u032d\u0005P\u0000\u0000\u032d\u032e\u0005e\u0000\u0000\u032e\u032f\u0005"+ - "r\u0000\u0000\u032f\u0330\u0005m\u0000\u0000\u0330\u0331\u0001\u0000\u0000"+ - "\u0000\u0331\u0332\u0006@\u0000\u0000\u0332\u0083\u0001\u0000\u0000\u0000"+ - "\u0333\u0334\u0005n\u0000\u0000\u0334\u0335\u0005o\u0000\u0000\u0335\u0336"+ - "\u0005P\u0000\u0000\u0336\u0337\u0005e\u0000\u0000\u0337\u0338\u0005r"+ - "\u0000\u0000\u0338\u0339\u0005m\u0000\u0000\u0339\u033a\u0001\u0000\u0000"+ - "\u0000\u033a\u033b\u0006A\u0000\u0000\u033b\u0085\u0001\u0000\u0000\u0000"+ - "\u033c\u033d\u0005t\u0000\u0000\u033d\u033e\u0005r\u0000\u0000\u033e\u033f"+ - "\u0005u\u0000\u0000\u033f\u0340\u0005s\u0000\u0000\u0340\u0341\u0005t"+ - "\u0000\u0000\u0341\u0342\u0005e\u0000\u0000\u0342\u0343\u0005d\u0000\u0000"+ - "\u0343\u0344\u0001\u0000\u0000\u0000\u0344\u0345\u0006B\u0000\u0000\u0345"+ - "\u0087\u0001\u0000\u0000\u0000\u0346\u0347\u0005o\u0000\u0000\u0347\u0348"+ - "\u0005u\u0000\u0000\u0348\u0349\u0005t\u0000\u0000\u0349\u034a\u0005l"+ - "\u0000\u0000\u034a\u034b\u0005i\u0000\u0000\u034b\u034c\u0005n\u0000\u0000"+ - "\u034c\u034d\u0005e\u0000\u0000\u034d\u0089\u0001\u0000\u0000\u0000\u034e"+ - "\u034f\u0005i\u0000\u0000\u034f\u0350\u0005n\u0000\u0000\u0350\u0351\u0005"+ - "i\u0000\u0000\u0351\u0352\u0005t\u0000\u0000\u0352\u0353\u0005E\u0000"+ - "\u0000\u0353\u0354\u0005n\u0000\u0000\u0354\u0355\u0005s\u0000\u0000\u0355"+ - "\u0356\u0005u\u0000\u0000\u0356\u0357\u0005r\u0000\u0000\u0357\u0358\u0005"+ - "e\u0000\u0000\u0358\u0359\u0005s\u0000\u0000\u0359\u008b\u0001\u0000\u0000"+ - "\u0000\u035a\u035b\u0005i\u0000\u0000\u035b\u035c\u0005m\u0000\u0000\u035c"+ - "\u035d\u0005p\u0000\u0000\u035d\u035e\u0005o\u0000\u0000\u035e\u035f\u0005"+ - "r\u0000\u0000\u035f\u0360\u0005t\u0000\u0000\u0360\u0361\u0005R\u0000"+ - "\u0000\u0361\u0362\u0005e\u0000\u0000\u0362\u0363\u0005q\u0000\u0000\u0363"+ - "\u0364\u0005u\u0000\u0000\u0364\u0365\u0005i\u0000\u0000\u0365\u0366\u0005"+ - "r\u0000\u0000\u0366\u0367\u0005e\u0000\u0000\u0367\u0368\u0005s\u0000"+ - "\u0000\u0368\u008d\u0001\u0000\u0000\u0000\u0369\u036a\u0005p\u0000\u0000"+ - "\u036a\u036b\u0005r\u0000\u0000\u036b\u036c\u0005o\u0000\u0000\u036c\u036d"+ - "\u0005o\u0000\u0000\u036d\u036e\u0005f\u0000\u0000\u036e\u008f\u0001\u0000"+ - "\u0000\u0000\u036f\u0370\u0005=\u0000\u0000\u0370\u0371\u0005=\u0000\u0000"+ - "\u0371\u0372\u0005=\u0000\u0000\u0372\u0091\u0001\u0000\u0000\u0000\u0373"+ - "\u0374\u0005!\u0000\u0000\u0374\u0375\u0005=\u0000\u0000\u0375\u0376\u0005"+ - "=\u0000\u0000\u0376\u0093\u0001\u0000\u0000\u0000\u0377\u0378\u0005w\u0000"+ - "\u0000\u0378\u0379\u0005i\u0000\u0000\u0379\u037a\u0005t\u0000\u0000\u037a"+ - "\u037b\u0005h\u0000\u0000\u037b\u0095\u0001\u0000\u0000\u0000\u037c\u037d"+ - "\u0005o\u0000\u0000\u037d\u037e\u0005p\u0000\u0000\u037e\u037f\u0005a"+ - "\u0000\u0000\u037f\u0380\u0005q\u0000\u0000\u0380\u0381\u0005u\u0000\u0000"+ - "\u0381\u0382\u0005e\u0000\u0000\u0382\u0383\u0001\u0000\u0000\u0000\u0383"+ - "\u0384\u0006J\u0000\u0000\u0384\u0097\u0001\u0000\u0000\u0000\u0385\u0386"+ - "\u0005r\u0000\u0000\u0386\u0387\u0005e\u0000\u0000\u0387\u0388\u0005v"+ - "\u0000\u0000\u0388\u0389\u0005e\u0000\u0000\u0389\u038a\u0005a\u0000\u0000"+ - "\u038a\u038b\u0005l\u0000\u0000\u038b\u0099\u0001\u0000\u0000\u0000\u038c"+ - "\u038d\u0005b\u0000\u0000\u038d\u038e\u0005r\u0000\u0000\u038e\u038f\u0005"+ - "e\u0000\u0000\u038f\u0390\u0005a\u0000\u0000\u0390\u0391\u0005k\u0000"+ - "\u0000\u0391\u0392\u0001\u0000\u0000\u0000\u0392\u0393\u0006L\u0000\u0000"+ - "\u0393\u009b\u0001\u0000\u0000\u0000\u0394\u0395\u0005d\u0000\u0000\u0395"+ - "\u0396\u0005e\u0000\u0000\u0396\u0397\u0005f\u0000\u0000\u0397\u0398\u0005"+ - "a\u0000\u0000\u0398\u0399\u0005u\u0000\u0000\u0399\u039a\u0005l\u0000"+ - "\u0000\u039a\u039b\u0005t\u0000\u0000\u039b\u009d\u0001\u0000\u0000\u0000"+ - "\u039c\u039d\u0005f\u0000\u0000\u039d\u039e\u0005u\u0000\u0000\u039e\u039f"+ - "\u0005n\u0000\u0000\u039f\u03a0\u0005c\u0000\u0000\u03a0\u009f\u0001\u0000"+ - "\u0000\u0000\u03a1\u03a2\u0005i\u0000\u0000\u03a2\u03a3\u0005n\u0000\u0000"+ - "\u03a3\u03a4\u0005t\u0000\u0000\u03a4\u03a5\u0005e\u0000\u0000\u03a5\u03a6"+ - "\u0005r\u0000\u0000\u03a6\u03a7\u0005f\u0000\u0000\u03a7\u03a8\u0005a"+ - "\u0000\u0000\u03a8\u03a9\u0005c\u0000\u0000\u03a9\u03aa\u0005e\u0000\u0000"+ - "\u03aa\u00a1\u0001\u0000\u0000\u0000\u03ab\u03ac\u0005s\u0000\u0000\u03ac"+ - "\u03ad\u0005e\u0000\u0000\u03ad\u03ae\u0005l\u0000\u0000\u03ae\u03af\u0005"+ - "e\u0000\u0000\u03af\u03b0\u0005c\u0000\u0000\u03b0\u03b1\u0005t\u0000"+ - "\u0000\u03b1\u00a3\u0001\u0000\u0000\u0000\u03b2\u03b3\u0005c\u0000\u0000"+ - "\u03b3\u03b4\u0005a\u0000\u0000\u03b4\u03b5\u0005s\u0000\u0000\u03b5\u03b6"+ - "\u0005e\u0000\u0000\u03b6\u00a5\u0001\u0000\u0000\u0000\u03b7\u03b8\u0005"+ - "d\u0000\u0000\u03b8\u03b9\u0005e\u0000\u0000\u03b9\u03ba\u0005f\u0000"+ - "\u0000\u03ba\u03bb\u0005e\u0000\u0000\u03bb\u03bc\u0005r\u0000\u0000\u03bc"+ - "\u00a7\u0001\u0000\u0000\u0000\u03bd\u03be\u0005g\u0000\u0000\u03be\u03bf"+ - "\u0005o\u0000\u0000\u03bf\u00a9\u0001\u0000\u0000\u0000\u03c0\u03c1\u0005"+ - "m\u0000\u0000\u03c1\u03c2\u0005a\u0000\u0000\u03c2\u03c3\u0005p\u0000"+ - "\u0000\u03c3\u00ab\u0001\u0000\u0000\u0000\u03c4\u03c5\u0005s\u0000\u0000"+ - "\u03c5\u03c6\u0005t\u0000\u0000\u03c6\u03c7\u0005r\u0000\u0000\u03c7\u03c8"+ - "\u0005u\u0000\u0000\u03c8\u03c9\u0005c\u0000\u0000\u03c9\u03ca\u0005t"+ - "\u0000\u0000\u03ca\u00ad\u0001\u0000\u0000\u0000\u03cb\u03cc\u0005c\u0000"+ - "\u0000\u03cc\u03cd\u0005h\u0000\u0000\u03cd\u03ce\u0005a\u0000\u0000\u03ce"+ - "\u03cf\u0005n\u0000\u0000\u03cf\u00af\u0001\u0000\u0000\u0000\u03d0\u03d1"+ - "\u0005e\u0000\u0000\u03d1\u03d2\u0005l\u0000\u0000\u03d2\u03d3\u0005s"+ - "\u0000\u0000\u03d3\u03d4\u0005e\u0000\u0000\u03d4\u00b1\u0001\u0000\u0000"+ - "\u0000\u03d5\u03d6\u0005g\u0000\u0000\u03d6\u03d7\u0005o\u0000\u0000\u03d7"+ - "\u03d8\u0005t\u0000\u0000\u03d8\u03d9\u0005o\u0000\u0000\u03d9\u00b3\u0001"+ - "\u0000\u0000\u0000\u03da\u03db\u0005p\u0000\u0000\u03db\u03dc\u0005a\u0000"+ - "\u0000\u03dc\u03dd\u0005c\u0000\u0000\u03dd\u03de\u0005k\u0000\u0000\u03de"+ - "\u03df\u0005a\u0000\u0000\u03df\u03e0\u0005g\u0000\u0000\u03e0\u03e1\u0005"+ - "e\u0000\u0000\u03e1\u00b5\u0001\u0000\u0000\u0000\u03e2\u03e3\u0005s\u0000"+ - "\u0000\u03e3\u03e4\u0005w\u0000\u0000\u03e4\u03e5\u0005i\u0000\u0000\u03e5"+ - "\u03e6\u0005t\u0000\u0000\u03e6\u03e7\u0005c\u0000\u0000\u03e7\u03e8\u0005"+ - "h\u0000\u0000\u03e8\u00b7\u0001\u0000\u0000\u0000\u03e9\u03ea\u0005c\u0000"+ - "\u0000\u03ea\u03eb\u0005o\u0000\u0000\u03eb\u03ec\u0005n\u0000\u0000\u03ec"+ - "\u03ed\u0005s\u0000\u0000\u03ed\u03ee\u0005t\u0000\u0000\u03ee\u00b9\u0001"+ - "\u0000\u0000\u0000\u03ef\u03f0\u0005f\u0000\u0000\u03f0\u03f1\u0005a\u0000"+ - "\u0000\u03f1\u03f2\u0005l\u0000\u0000\u03f2\u03f3\u0005l\u0000\u0000\u03f3"+ - "\u03f4\u0005t\u0000\u0000\u03f4\u03f5\u0005h\u0000\u0000\u03f5\u03f6\u0005"+ - "r\u0000\u0000\u03f6\u03f7\u0005o\u0000\u0000\u03f7\u03f8\u0005u\u0000"+ - "\u0000\u03f8\u03f9\u0005g\u0000\u0000\u03f9\u03fa\u0005h\u0000\u0000\u03fa"+ - "\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0006\\\u0000\u0000\u03fc\u00bb"+ - "\u0001\u0000\u0000\u0000\u03fd\u03fe\u0005i\u0000\u0000\u03fe\u03ff\u0005"+ - "f\u0000\u0000\u03ff\u00bd\u0001\u0000\u0000\u0000\u0400\u0401\u0005r\u0000"+ - "\u0000\u0401\u0402\u0005a\u0000\u0000\u0402\u0403\u0005n\u0000\u0000\u0403"+ - "\u0404\u0005g\u0000\u0000\u0404\u0405\u0005e\u0000\u0000\u0405\u00bf\u0001"+ - "\u0000\u0000\u0000\u0406\u0407\u0005t\u0000\u0000\u0407\u0408\u0005y\u0000"+ - "\u0000\u0408\u0409\u0005p\u0000\u0000\u0409\u040a\u0005e\u0000\u0000\u040a"+ - "\u00c1\u0001\u0000\u0000\u0000\u040b\u040c\u0005c\u0000\u0000\u040c\u040d"+ - "\u0005o\u0000\u0000\u040d\u040e\u0005n\u0000\u0000\u040e\u040f\u0005t"+ - "\u0000\u0000\u040f\u0410\u0005i\u0000\u0000\u0410\u0411\u0005n\u0000\u0000"+ - "\u0411\u0412\u0005u\u0000\u0000\u0412\u0413\u0005e\u0000\u0000\u0413\u0414"+ - "\u0001\u0000\u0000\u0000\u0414\u0415\u0006`\u0000\u0000\u0415\u00c3\u0001"+ - "\u0000\u0000\u0000\u0416\u0417\u0005f\u0000\u0000\u0417\u0418\u0005o\u0000"+ - "\u0000\u0418\u0419\u0005r\u0000\u0000\u0419\u00c5\u0001\u0000\u0000\u0000"+ - "\u041a\u041b\u0005i\u0000\u0000\u041b\u041c\u0005m\u0000\u0000\u041c\u041d"+ - "\u0005p\u0000\u0000\u041d\u041e\u0005o\u0000\u0000\u041e\u041f\u0005r"+ - "\u0000\u0000\u041f\u0420\u0005t\u0000\u0000\u0420\u00c7\u0001\u0000\u0000"+ - "\u0000\u0421\u0422\u0005r\u0000\u0000\u0422\u0423\u0005e\u0000\u0000\u0423"+ - "\u0424\u0005t\u0000\u0000\u0424\u0425\u0005u\u0000\u0000\u0425\u0426\u0005"+ - "r\u0000\u0000\u0426\u0427\u0005n\u0000\u0000\u0427\u0428\u0001\u0000\u0000"+ - "\u0000\u0428\u0429\u0006c\u0000\u0000\u0429\u00c9\u0001\u0000\u0000\u0000"+ - "\u042a\u042b\u0005v\u0000\u0000\u042b\u042c\u0005a\u0000\u0000\u042c\u042d"+ - "\u0005r\u0000\u0000\u042d\u00cb\u0001\u0000\u0000\u0000\u042e\u042f\u0005"+ - "n\u0000\u0000\u042f\u0430\u0005i\u0000\u0000\u0430\u0431\u0005l\u0000"+ - "\u0000\u0431\u0432\u0001\u0000\u0000\u0000\u0432\u0433\u0006e\u0000\u0000"+ - "\u0433\u00cd\u0001\u0000\u0000\u0000\u0434\u0439\u0003\u0150\u00a7\u0000"+ - "\u0435\u0438\u0003\u0150\u00a7\u0000\u0436\u0438\u0003\u0152\u00a8\u0000"+ - "\u0437\u0435\u0001\u0000\u0000\u0000\u0437\u0436\u0001\u0000\u0000\u0000"+ - "\u0438\u043b\u0001\u0000\u0000\u0000\u0439\u0437\u0001\u0000\u0000\u0000"+ - "\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043c\u0001\u0000\u0000\u0000"+ - "\u043b\u0439\u0001\u0000\u0000\u0000\u043c\u043d\u0006f\u0000\u0000\u043d"+ - "\u00cf\u0001\u0000\u0000\u0000\u043e\u043f\u0005(\u0000\u0000\u043f\u00d1"+ - "\u0001\u0000\u0000\u0000\u0440\u0441\u0005)\u0000\u0000\u0441\u0442\u0001"+ - "\u0000\u0000\u0000\u0442\u0443\u0006h\u0000\u0000\u0443\u00d3\u0001\u0000"+ - "\u0000\u0000\u0444\u0445\u0005{\u0000\u0000\u0445\u00d5\u0001\u0000\u0000"+ - "\u0000\u0446\u0447\u0005}\u0000\u0000\u0447\u0448\u0001\u0000\u0000\u0000"+ - "\u0448\u0449\u0006j\u0000\u0000\u0449\u00d7\u0001\u0000\u0000\u0000\u044a"+ - "\u044b\u0005[\u0000\u0000\u044b\u00d9\u0001\u0000\u0000\u0000\u044c\u044d"+ - "\u0005]\u0000\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f\u0006"+ - "l\u0000\u0000\u044f\u00db\u0001\u0000\u0000\u0000\u0450\u0451\u0005=\u0000"+ - "\u0000\u0451\u00dd\u0001\u0000\u0000\u0000\u0452\u0453\u0005,\u0000\u0000"+ - "\u0453\u00df\u0001\u0000\u0000\u0000\u0454\u0455\u0005;\u0000\u0000\u0455"+ - "\u00e1\u0001\u0000\u0000\u0000\u0456\u0457\u0005:\u0000\u0000\u0457\u00e3"+ - "\u0001\u0000\u0000\u0000\u0458\u0459\u0005.\u0000\u0000\u0459\u00e5\u0001"+ - "\u0000\u0000\u0000\u045a\u045b\u0005+\u0000\u0000\u045b\u045c\u0005+\u0000"+ - "\u0000\u045c\u045d\u0001\u0000\u0000\u0000\u045d\u045e\u0006r\u0000\u0000"+ - "\u045e\u00e7\u0001\u0000\u0000\u0000\u045f\u0460\u0005-\u0000\u0000\u0460"+ - "\u0461\u0005-\u0000\u0000\u0461\u0462\u0001\u0000\u0000\u0000\u0462\u0463"+ - "\u0006s\u0000\u0000\u0463\u00e9\u0001\u0000\u0000\u0000\u0464\u0465\u0005"+ - ":\u0000\u0000\u0465\u0466\u0005=\u0000\u0000\u0466\u00eb\u0001\u0000\u0000"+ - "\u0000\u0467\u0468\u0005.\u0000\u0000\u0468\u0469\u0005.\u0000\u0000\u0469"+ - "\u046a\u0005.\u0000\u0000\u046a\u00ed\u0001\u0000\u0000\u0000\u046b\u046c"+ - "\u0005|\u0000\u0000\u046c\u046d\u0005|\u0000\u0000\u046d\u00ef\u0001\u0000"+ - "\u0000\u0000\u046e\u046f\u0005&\u0000\u0000\u046f\u0470\u0005&\u0000\u0000"+ - "\u0470\u00f1\u0001\u0000\u0000\u0000\u0471\u0472\u0005=\u0000\u0000\u0472"+ - "\u0473\u0005=\u0000\u0000\u0473\u00f3\u0001\u0000\u0000\u0000\u0474\u0475"+ - "\u0005!\u0000\u0000\u0475\u0476\u0005=\u0000\u0000\u0476\u00f5\u0001\u0000"+ - "\u0000\u0000\u0477\u0478\u0005<\u0000\u0000\u0478\u00f7\u0001\u0000\u0000"+ - "\u0000\u0479\u047a\u0005<\u0000\u0000\u047a\u047b\u0005=\u0000\u0000\u047b"+ - "\u00f9\u0001\u0000\u0000\u0000\u047c\u047d\u0005>\u0000\u0000\u047d\u00fb"+ - "\u0001\u0000\u0000\u0000\u047e\u047f\u0005>\u0000\u0000\u047f\u0480\u0005"+ - "=\u0000\u0000\u0480\u00fd\u0001\u0000\u0000\u0000\u0481\u0482\u0005|\u0000"+ - "\u0000\u0482\u00ff\u0001\u0000\u0000\u0000\u0483\u0484\u0005/\u0000\u0000"+ - "\u0484\u0101\u0001\u0000\u0000\u0000\u0485\u0486\u0005%\u0000\u0000\u0486"+ - "\u0103\u0001\u0000\u0000\u0000\u0487\u0488\u0005<\u0000\u0000\u0488\u0489"+ - "\u0005<\u0000\u0000\u0489\u0105\u0001\u0000\u0000\u0000\u048a\u048b\u0005"+ - ">\u0000\u0000\u048b\u048c\u0005>\u0000\u0000\u048c\u0107\u0001\u0000\u0000"+ - "\u0000\u048d\u048e\u0005&\u0000\u0000\u048e\u048f\u0005^\u0000\u0000\u048f"+ - "\u0109\u0001\u0000\u0000\u0000\u0490\u0491\u0005!\u0000\u0000\u0491\u010b"+ - "\u0001\u0000\u0000\u0000\u0492\u0493\u0005+\u0000\u0000\u0493\u010d\u0001"+ - "\u0000\u0000\u0000\u0494\u0495\u0005-\u0000\u0000\u0495\u010f\u0001\u0000"+ - "\u0000\u0000\u0496\u0497\u0005^\u0000\u0000\u0497\u0111\u0001\u0000\u0000"+ - "\u0000\u0498\u0499\u0005*\u0000\u0000\u0499\u0113\u0001\u0000\u0000\u0000"+ - "\u049a\u049b\u0005&\u0000\u0000\u049b\u0115\u0001\u0000\u0000\u0000\u049c"+ - "\u049d\u0005<\u0000\u0000\u049d\u049e\u0005-\u0000\u0000\u049e\u0117\u0001"+ - "\u0000\u0000\u0000\u049f\u04ab\u00050\u0000\u0000\u04a0\u04a7\u0007\u0000"+ - "\u0000\u0000\u04a1\u04a3\u0005_\u0000\u0000\u04a2\u04a1\u0001\u0000\u0000"+ - "\u0000\u04a2\u04a3\u0001\u0000\u0000\u0000\u04a3\u04a4\u0001\u0000\u0000"+ - "\u0000\u04a4\u04a6\u0007\u0001\u0000\u0000\u04a5\u04a2\u0001\u0000\u0000"+ - "\u0000\u04a6\u04a9\u0001\u0000\u0000\u0000\u04a7\u04a5\u0001\u0000\u0000"+ - "\u0000\u04a7\u04a8\u0001\u0000\u0000\u0000\u04a8\u04ab\u0001\u0000\u0000"+ - "\u0000\u04a9\u04a7\u0001\u0000\u0000\u0000\u04aa\u049f\u0001\u0000\u0000"+ - "\u0000\u04aa\u04a0\u0001\u0000\u0000\u0000\u04ab\u04ac\u0001\u0000\u0000"+ - "\u0000\u04ac\u04ad\u0006\u008b\u0000\u0000\u04ad\u0119\u0001\u0000\u0000"+ - "\u0000\u04ae\u04af\u00050\u0000\u0000\u04af\u04b4\u0007\u0002\u0000\u0000"+ - "\u04b0\u04b2\u0005_\u0000\u0000\u04b1\u04b0\u0001\u0000\u0000\u0000\u04b1"+ - "\u04b2\u0001\u0000\u0000\u0000\u04b2\u04b3\u0001\u0000\u0000\u0000\u04b3"+ - "\u04b5\u0003\u014c\u00a5\u0000\u04b4\u04b1\u0001\u0000\u0000\u0000\u04b5"+ - "\u04b6\u0001\u0000\u0000\u0000\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b6"+ - "\u04b7\u0001\u0000\u0000\u0000\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8"+ - "\u04b9\u0006\u008c\u0000\u0000\u04b9\u011b\u0001\u0000\u0000\u0000\u04ba"+ - "\u04bc\u00050\u0000\u0000\u04bb\u04bd\u0007\u0003\u0000\u0000\u04bc\u04bb"+ - "\u0001\u0000\u0000\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04c2"+ - "\u0001\u0000\u0000\u0000\u04be\u04c0\u0005_\u0000\u0000\u04bf\u04be\u0001"+ - "\u0000\u0000\u0000\u04bf\u04c0\u0001\u0000\u0000\u0000\u04c0\u04c1\u0001"+ - "\u0000\u0000\u0000\u04c1\u04c3\u0003\u0148\u00a3\u0000\u04c2\u04bf\u0001"+ - "\u0000\u0000\u0000\u04c3\u04c4\u0001\u0000\u0000\u0000\u04c4\u04c2\u0001"+ - "\u0000\u0000\u0000\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c6\u0001"+ - "\u0000\u0000\u0000\u04c6\u04c7\u0006\u008d\u0000\u0000\u04c7\u011d\u0001"+ - "\u0000\u0000\u0000\u04c8\u04c9\u00050\u0000\u0000\u04c9\u04ce\u0007\u0004"+ - "\u0000\u0000\u04ca\u04cc\u0005_\u0000\u0000\u04cb\u04ca\u0001\u0000\u0000"+ - "\u0000\u04cb\u04cc\u0001\u0000\u0000\u0000\u04cc\u04cd\u0001\u0000\u0000"+ - "\u0000\u04cd\u04cf\u0003\u014a\u00a4\u0000\u04ce\u04cb\u0001\u0000\u0000"+ - "\u0000\u04cf\u04d0\u0001\u0000\u0000\u0000\u04d0\u04ce\u0001\u0000\u0000"+ - "\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d2\u0001\u0000\u0000"+ - "\u0000\u04d2\u04d3\u0006\u008e\u0000\u0000\u04d3\u011f\u0001\u0000\u0000"+ - "\u0000\u04d4\u04d5\u00050\u0000\u0000\u04d5\u04d6\u0007\u0004\u0000\u0000"+ - "\u04d6\u04d7\u0003\u0122\u0090\u0000\u04d7\u04d8\u0003\u0124\u0091\u0000"+ - "\u04d8\u0121\u0001\u0000\u0000\u0000\u04d9\u04db\u0005_\u0000\u0000\u04da"+ - "\u04d9\u0001\u0000\u0000\u0000\u04da\u04db\u0001\u0000\u0000\u0000\u04db"+ - "\u04dc\u0001\u0000\u0000\u0000\u04dc\u04de\u0003\u014a\u00a4\u0000\u04dd"+ - "\u04da\u0001\u0000\u0000\u0000\u04de\u04df\u0001\u0000\u0000\u0000\u04df"+ - "\u04dd\u0001\u0000\u0000\u0000\u04df\u04e0\u0001\u0000\u0000\u0000\u04e0"+ - "\u04eb\u0001\u0000\u0000\u0000\u04e1\u04e8\u0005.\u0000\u0000\u04e2\u04e4"+ - "\u0005_\u0000\u0000\u04e3\u04e2\u0001\u0000\u0000\u0000\u04e3\u04e4\u0001"+ - "\u0000\u0000\u0000\u04e4\u04e5\u0001\u0000\u0000\u0000\u04e5\u04e7\u0003"+ - "\u014a\u00a4\u0000\u04e6\u04e3\u0001\u0000\u0000\u0000\u04e7\u04ea\u0001"+ - "\u0000\u0000\u0000\u04e8\u04e6\u0001\u0000\u0000\u0000\u04e8\u04e9\u0001"+ - "\u0000\u0000\u0000\u04e9\u04ec\u0001\u0000\u0000\u0000\u04ea\u04e8\u0001"+ - "\u0000\u0000\u0000\u04eb\u04e1\u0001\u0000\u0000\u0000\u04eb\u04ec\u0001"+ - "\u0000\u0000\u0000\u04ec\u04f9\u0001\u0000\u0000\u0000\u04ed\u04ee\u0005"+ - ".\u0000\u0000\u04ee\u04f5\u0003\u014a\u00a4\u0000\u04ef\u04f1\u0005_\u0000"+ - "\u0000\u04f0\u04ef\u0001\u0000\u0000\u0000\u04f0\u04f1\u0001\u0000\u0000"+ - "\u0000\u04f1\u04f2\u0001\u0000\u0000\u0000\u04f2\u04f4\u0003\u014a\u00a4"+ - "\u0000\u04f3\u04f0\u0001\u0000\u0000\u0000\u04f4\u04f7\u0001\u0000\u0000"+ - "\u0000\u04f5\u04f3\u0001\u0000\u0000\u0000\u04f5\u04f6\u0001\u0000\u0000"+ - "\u0000\u04f6\u04f9\u0001\u0000\u0000\u0000\u04f7\u04f5\u0001\u0000\u0000"+ - "\u0000\u04f8\u04dd\u0001\u0000\u0000\u0000\u04f8\u04ed\u0001\u0000\u0000"+ - "\u0000\u04f9\u0123\u0001\u0000\u0000\u0000\u04fa\u04fc\u0007\u0005\u0000"+ - "\u0000\u04fb\u04fd\u0007\u0006\u0000\u0000\u04fc\u04fb\u0001\u0000\u0000"+ - "\u0000\u04fc\u04fd\u0001\u0000\u0000\u0000\u04fd\u04fe\u0001\u0000\u0000"+ - "\u0000\u04fe\u04ff\u0003\u0146\u00a2\u0000\u04ff\u0125\u0001\u0000\u0000"+ - "\u0000\u0500\u0506\u0003\u0118\u008b\u0000\u0501\u0506\u0003\u011a\u008c"+ - "\u0000\u0502\u0506\u0003\u011c\u008d\u0000\u0503\u0506\u0003\u011e\u008e"+ - "\u0000\u0504\u0506\u0003\u0002\u0000\u0000\u0505\u0500\u0001\u0000\u0000"+ - "\u0000\u0505\u0501\u0001\u0000\u0000\u0000\u0505\u0502\u0001\u0000\u0000"+ - "\u0000\u0505\u0503\u0001\u0000\u0000\u0000\u0505\u0504\u0001\u0000\u0000"+ - "\u0000\u0506\u0507\u0001\u0000\u0000\u0000\u0507\u0508\u0005i\u0000\u0000"+ - "\u0508\u0509\u0001\u0000\u0000\u0000\u0509\u050a\u0006\u0092\u0000\u0000"+ - "\u050a\u0127\u0001\u0000\u0000\u0000\u050b\u050e\u0005\'\u0000\u0000\u050c"+ - "\u050f\u0003\u0142\u00a0\u0000\u050d\u050f\u0003\u012c\u0095\u0000\u050e"+ - "\u050c\u0001\u0000\u0000\u0000\u050e\u050d\u0001\u0000\u0000\u0000\u050f"+ - "\u0510\u0001\u0000\u0000\u0000\u0510\u0511\u0005\'\u0000\u0000\u0511\u0129"+ - "\u0001\u0000\u0000\u0000\u0512\u0513\u0003\u0128\u0093\u0000\u0513\u0514"+ - "\u0001\u0000\u0000\u0000\u0514\u0515\u0006\u0094\u0000\u0000\u0515\u012b"+ - "\u0001\u0000\u0000\u0000\u0516\u0519\u0003\u012e\u0096\u0000\u0517\u0519"+ - "\u0003\u0130\u0097\u0000\u0518\u0516\u0001\u0000\u0000\u0000\u0518\u0517"+ - "\u0001\u0000\u0000\u0000\u0519\u012d\u0001\u0000\u0000\u0000\u051a\u051b"+ - "\u0005\\\u0000\u0000\u051b\u051c\u0003\u0148\u00a3\u0000\u051c\u051d\u0003"+ - "\u0148\u00a3\u0000\u051d\u051e\u0003\u0148\u00a3\u0000\u051e\u012f\u0001"+ - "\u0000\u0000\u0000\u051f\u0520\u0005\\\u0000\u0000\u0520\u0521\u0005x"+ - "\u0000\u0000\u0521\u0522\u0003\u014a\u00a4\u0000\u0522\u0523\u0003\u014a"+ - "\u00a4\u0000\u0523\u0131\u0001\u0000\u0000\u0000\u0524\u0525\u0005\\\u0000"+ - "\u0000\u0525\u0526\u0005u\u0000\u0000\u0526\u0527\u0003\u014a\u00a4\u0000"+ - "\u0527\u0528\u0003\u014a\u00a4\u0000\u0528\u0529\u0003\u014a\u00a4\u0000"+ - "\u0529\u052a\u0003\u014a\u00a4\u0000\u052a\u0133\u0001\u0000\u0000\u0000"+ - "\u052b\u052c\u0005\\\u0000\u0000\u052c\u052d\u0005U\u0000\u0000\u052d"+ - "\u052e\u0003\u014a\u00a4\u0000\u052e\u052f\u0003\u014a\u00a4\u0000\u052f"+ - "\u0530\u0003\u014a\u00a4\u0000\u0530\u0531\u0003\u014a\u00a4\u0000\u0531"+ - "\u0532\u0003\u014a\u00a4\u0000\u0532\u0533\u0003\u014a\u00a4\u0000\u0533"+ - "\u0534\u0003\u014a\u00a4\u0000\u0534\u0535\u0003\u014a\u00a4\u0000\u0535"+ - "\u0135\u0001\u0000\u0000\u0000\u0536\u053a\u0005`\u0000\u0000\u0537\u0539"+ - "\b\u0007\u0000\u0000\u0538\u0537\u0001\u0000\u0000\u0000\u0539\u053c\u0001"+ - "\u0000\u0000\u0000\u053a\u0538\u0001\u0000\u0000\u0000\u053a\u053b\u0001"+ - "\u0000\u0000\u0000\u053b\u053d\u0001\u0000\u0000\u0000\u053c\u053a\u0001"+ - "\u0000\u0000\u0000\u053d\u053e\u0005`\u0000\u0000\u053e\u053f\u0001\u0000"+ - "\u0000\u0000\u053f\u0540\u0006\u009a\u0000\u0000\u0540\u0137\u0001\u0000"+ - "\u0000\u0000\u0541\u0546\u0005\"\u0000\u0000\u0542\u0545\b\b\u0000\u0000"+ - "\u0543\u0545\u0003\u0144\u00a1\u0000\u0544\u0542\u0001\u0000\u0000\u0000"+ - "\u0544\u0543\u0001\u0000\u0000\u0000\u0545\u0548\u0001\u0000\u0000\u0000"+ - "\u0546\u0544\u0001\u0000\u0000\u0000\u0546\u0547\u0001\u0000\u0000\u0000"+ - "\u0547\u0549\u0001\u0000\u0000\u0000\u0548\u0546\u0001\u0000\u0000\u0000"+ - "\u0549\u054a\u0005\"\u0000\u0000\u054a\u054b\u0001\u0000\u0000\u0000\u054b"+ - "\u054c\u0006\u009b\u0000\u0000\u054c\u0139\u0001\u0000\u0000\u0000\u054d"+ - "\u054f\u0007\t\u0000\u0000\u054e\u054d\u0001\u0000\u0000\u0000\u054f\u0550"+ - "\u0001\u0000\u0000\u0000\u0550\u054e\u0001\u0000\u0000\u0000\u0550\u0551"+ - "\u0001\u0000\u0000\u0000\u0551\u0552\u0001\u0000\u0000\u0000\u0552\u0553"+ - "\u0006\u009c\u0001\u0000\u0553\u013b\u0001\u0000\u0000\u0000\u0554\u0555"+ - "\u0005/\u0000\u0000\u0555\u0556\u0005*\u0000\u0000\u0556\u055a\u0001\u0000"+ - "\u0000\u0000\u0557\u0559\t\u0000\u0000\u0000\u0558\u0557\u0001\u0000\u0000"+ - "\u0000\u0559\u055c\u0001\u0000\u0000\u0000\u055a\u055b\u0001\u0000\u0000"+ - "\u0000\u055a\u0558\u0001\u0000\u0000\u0000\u055b\u055d\u0001\u0000\u0000"+ - "\u0000\u055c\u055a\u0001\u0000\u0000\u0000\u055d\u055e\u0005*\u0000\u0000"+ - "\u055e\u055f\u0005/\u0000\u0000\u055f\u0560\u0001\u0000\u0000\u0000\u0560"+ - "\u0561\u0006\u009d\u0001\u0000\u0561\u013d\u0001\u0000\u0000\u0000\u0562"+ - "\u0564\u0007\n\u0000\u0000\u0563\u0562\u0001\u0000\u0000\u0000\u0564\u0565"+ - "\u0001\u0000\u0000\u0000\u0565\u0563\u0001\u0000\u0000\u0000\u0565\u0566"+ - "\u0001\u0000\u0000\u0000\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u0568"+ - "\u0006\u009e\u0001\u0000\u0568\u013f\u0001\u0000\u0000\u0000\u0569\u056a"+ - "\u0005/\u0000\u0000\u056a\u056b\u0005/\u0000\u0000\u056b\u056f\u0001\u0000"+ - "\u0000\u0000\u056c\u056e\b\n\u0000\u0000\u056d\u056c\u0001\u0000\u0000"+ - "\u0000\u056e\u0571\u0001\u0000\u0000\u0000\u056f\u056d\u0001\u0000\u0000"+ - "\u0000\u056f\u0570\u0001\u0000\u0000\u0000\u0570\u0572\u0001\u0000\u0000"+ - "\u0000\u0571\u056f\u0001\u0000\u0000\u0000\u0572\u0573\u0006\u009f\u0001"+ - "\u0000\u0573\u0141\u0001\u0000\u0000\u0000\u0574\u0579\b\u000b\u0000\u0000"+ - "\u0575\u0579\u0003\u0132\u0098\u0000\u0576\u0579\u0003\u0134\u0099\u0000"+ - "\u0577\u0579\u0003\u0144\u00a1\u0000\u0578\u0574\u0001\u0000\u0000\u0000"+ - "\u0578\u0575\u0001\u0000\u0000\u0000\u0578\u0576\u0001\u0000\u0000\u0000"+ - "\u0578\u0577\u0001\u0000\u0000\u0000\u0579\u0143\u0001\u0000\u0000\u0000"+ - "\u057a\u0594\u0005\\\u0000\u0000\u057b\u057c\u0005u\u0000\u0000\u057c"+ - "\u057d\u0003\u014a\u00a4\u0000\u057d\u057e\u0003\u014a\u00a4\u0000\u057e"+ - "\u057f\u0003\u014a\u00a4\u0000\u057f\u0580\u0003\u014a\u00a4\u0000\u0580"+ - "\u0595\u0001\u0000\u0000\u0000\u0581\u0582\u0005U\u0000\u0000\u0582\u0583"+ - "\u0003\u014a\u00a4\u0000\u0583\u0584\u0003\u014a\u00a4\u0000\u0584\u0585"+ - "\u0003\u014a\u00a4\u0000\u0585\u0586\u0003\u014a\u00a4\u0000\u0586\u0587"+ - "\u0003\u014a\u00a4\u0000\u0587\u0588\u0003\u014a\u00a4\u0000\u0588\u0589"+ - "\u0003\u014a\u00a4\u0000\u0589\u058a\u0003\u014a\u00a4\u0000\u058a\u0595"+ - "\u0001\u0000\u0000\u0000\u058b\u0595\u0007\f\u0000\u0000\u058c\u058d\u0003"+ - "\u0148\u00a3\u0000\u058d\u058e\u0003\u0148\u00a3\u0000\u058e\u058f\u0003"+ - "\u0148\u00a3\u0000\u058f\u0595\u0001\u0000\u0000\u0000\u0590\u0591\u0005"+ - "x\u0000\u0000\u0591\u0592\u0003\u014a\u00a4\u0000\u0592\u0593\u0003\u014a"+ - "\u00a4\u0000\u0593\u0595\u0001\u0000\u0000\u0000\u0594\u057b\u0001\u0000"+ - "\u0000\u0000\u0594\u0581\u0001\u0000\u0000\u0000\u0594\u058b\u0001\u0000"+ - "\u0000\u0000\u0594\u058c\u0001\u0000\u0000\u0000\u0594\u0590\u0001\u0000"+ - "\u0000\u0000\u0595\u0145\u0001\u0000\u0000\u0000\u0596\u059d\u0007\u0001"+ - "\u0000\u0000\u0597\u0599\u0005_\u0000\u0000\u0598\u0597\u0001\u0000\u0000"+ - "\u0000\u0598\u0599\u0001\u0000\u0000\u0000\u0599\u059a\u0001\u0000\u0000"+ - "\u0000\u059a\u059c\u0007\u0001\u0000\u0000\u059b\u0598\u0001\u0000\u0000"+ - "\u0000\u059c\u059f\u0001\u0000\u0000\u0000\u059d\u059b\u0001\u0000\u0000"+ - "\u0000\u059d\u059e\u0001\u0000\u0000\u0000\u059e\u0147\u0001\u0000\u0000"+ - "\u0000\u059f\u059d\u0001\u0000\u0000\u0000\u05a0\u05a1\u0007\r\u0000\u0000"+ - "\u05a1\u0149\u0001\u0000\u0000\u0000\u05a2\u05a3\u0007\u000e\u0000\u0000"+ - "\u05a3\u014b\u0001\u0000\u0000\u0000\u05a4\u05a5\u0007\u000f\u0000\u0000"+ - "\u05a5\u014d\u0001\u0000\u0000\u0000\u05a6\u05a8\u0007\u0010\u0000\u0000"+ - "\u05a7\u05a9\u0007\u0006\u0000\u0000\u05a8\u05a7\u0001\u0000\u0000\u0000"+ - "\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000"+ - "\u05aa\u05ab\u0003\u0146\u00a2\u0000\u05ab\u014f\u0001\u0000\u0000\u0000"+ - "\u05ac\u05af\u0003\u0154\u00a9\u0000\u05ad\u05af\u0005_\u0000\u0000\u05ae"+ - "\u05ac\u0001\u0000\u0000\u0000\u05ae\u05ad\u0001\u0000\u0000\u0000\u05af"+ - "\u0151\u0001\u0000\u0000\u0000\u05b0\u05b1\u0007\u0011\u0000\u0000\u05b1"+ - "\u0153\u0001\u0000\u0000\u0000\u05b2\u05b3\u0007\u0012\u0000\u0000\u05b3"+ - "\u0155\u0001\u0000\u0000\u0000\u05b4\u05b6\u0007\t\u0000\u0000\u05b5\u05b4"+ - "\u0001\u0000\u0000\u0000\u05b6\u05b7\u0001\u0000\u0000\u0000\u05b7\u05b5"+ - "\u0001\u0000\u0000\u0000\u05b7\u05b8\u0001\u0000\u0000\u0000\u05b8\u05b9"+ - "\u0001\u0000\u0000\u0000\u05b9\u05ba\u0006\u00aa\u0001\u0000\u05ba\u0157"+ - "\u0001\u0000\u0000\u0000\u05bb\u05bc\u0005/\u0000\u0000\u05bc\u05bd\u0005"+ - "*\u0000\u0000\u05bd\u05c1\u0001\u0000\u0000\u0000\u05be\u05c0\b\n\u0000"+ - "\u0000\u05bf\u05be\u0001\u0000\u0000\u0000\u05c0\u05c3\u0001\u0000\u0000"+ - "\u0000\u05c1\u05c2\u0001\u0000\u0000\u0000\u05c1\u05bf\u0001\u0000\u0000"+ - "\u0000\u05c2\u05c4\u0001\u0000\u0000\u0000\u05c3\u05c1\u0001\u0000\u0000"+ - "\u0000\u05c4\u05c5\u0005*\u0000\u0000\u05c5\u05c6\u0005/\u0000\u0000\u05c6"+ - "\u05c7\u0001\u0000\u0000\u0000\u05c7\u05c8\u0006\u00ab\u0001\u0000\u05c8"+ - "\u0159\u0001\u0000\u0000\u0000\u05c9\u05ca\u0005/\u0000\u0000\u05ca\u05cb"+ - "\u0005/\u0000\u0000\u05cb\u05cf\u0001\u0000\u0000\u0000\u05cc\u05ce\b"+ - "\n\u0000\u0000\u05cd\u05cc\u0001\u0000\u0000\u0000\u05ce\u05d1\u0001\u0000"+ - "\u0000\u0000\u05cf\u05cd\u0001\u0000\u0000\u0000\u05cf\u05d0\u0001\u0000"+ - "\u0000\u0000\u05d0\u05d2\u0001\u0000\u0000\u0000\u05d1\u05cf\u0001\u0000"+ - "\u0000\u0000\u05d2\u05d3\u0006\u00ac\u0001\u0000\u05d3\u015b\u0001\u0000"+ - "\u0000\u0000\u05d4\u05d6\u0007\n\u0000\u0000\u05d5\u05d4\u0001\u0000\u0000"+ - "\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000\u05d7\u05d5\u0001\u0000\u0000"+ - "\u0000\u05d7\u05d8\u0001\u0000\u0000\u0000\u05d8\u05e7\u0001\u0000\u0000"+ - "\u0000\u05d9\u05e7\u0005;\u0000\u0000\u05da\u05db\u0005/\u0000\u0000\u05db"+ - "\u05dc\u0005*\u0000\u0000\u05dc\u05e0\u0001\u0000\u0000\u0000\u05dd\u05df"+ - "\t\u0000\u0000\u0000\u05de\u05dd\u0001\u0000\u0000\u0000\u05df\u05e2\u0001"+ - "\u0000\u0000\u0000\u05e0\u05e1\u0001\u0000\u0000\u0000\u05e0\u05de\u0001"+ - "\u0000\u0000\u0000\u05e1\u05e3\u0001\u0000\u0000\u0000\u05e2\u05e0\u0001"+ - "\u0000\u0000\u0000\u05e3\u05e4\u0005*\u0000\u0000\u05e4\u05e7\u0005/\u0000"+ - "\u0000\u05e5\u05e7\u0005\u0000\u0000\u0001\u05e6\u05d5\u0001\u0000\u0000"+ - "\u0000\u05e6\u05d9\u0001\u0000\u0000\u0000\u05e6\u05da\u0001\u0000\u0000"+ - "\u0000\u05e6\u05e5\u0001\u0000\u0000\u0000\u05e7\u05e8\u0001\u0000\u0000"+ - "\u0000\u05e8\u05e9\u0006\u00ad\u0002\u0000\u05e9\u015d\u0001\u0000\u0000"+ - "\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb\u05ec\u0001\u0000\u0000"+ - "\u0000\u05ec\u05ed\u0006\u00ae\u0002\u0000\u05ed\u05ee\u0006\u00ae\u0001"+ - "\u0000\u05ee\u015f\u0001\u0000\u0000\u00003\u0000\u0001\u0162\u016a\u016d"+ - "\u0170\u0176\u0178\u0437\u0439\u04a2\u04a7\u04aa\u04b1\u04b6\u04bc\u04bf"+ - "\u04c4\u04cb\u04d0\u04da\u04df\u04e3\u04e8\u04eb\u04f0\u04f5\u04f8\u04fc"+ - "\u0505\u050e\u0518\u053a\u0544\u0546\u0550\u055a\u0565\u056f\u0578\u0594"+ - "\u0598\u059d\u05a8\u05ae\u05b7\u05c1\u05cf\u05d7\u05e0\u05e6\u0003\u0002"+ + "\u00a6\u0001\u00a7\u0001\u00a7\u0003\u00a7\u05b4\b\u00a7\u0001\u00a7\u0001"+ + "\u00a7\u0001\u00a8\u0001\u00a8\u0003\u00a8\u05ba\b\u00a8\u0001\u00a9\u0001"+ + "\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0004\u00ab\u05c1\b\u00ab\u000b"+ + "\u00ab\f\u00ab\u05c2\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001"+ + "\u00ac\u0001\u00ac\u0005\u00ac\u05cb\b\u00ac\n\u00ac\f\u00ac\u05ce\t\u00ac"+ + "\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad"+ + "\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0005\u00ad\u05d9\b\u00ad\n\u00ad"+ + "\f\u00ad\u05dc\t\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0004\u00ae"+ + "\u05e1\b\u00ae\u000b\u00ae\f\u00ae\u05e2\u0001\u00ae\u0001\u00ae\u0001"+ + "\u00ae\u0001\u00ae\u0001\u00ae\u0005\u00ae\u05ea\b\u00ae\n\u00ae\f\u00ae"+ + "\u05ed\t\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0003\u00ae\u05f2\b"+ + "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001"+ + "\u00af\u0001\u00af\u0003\u0565\u05cc\u05eb\u0000\u00b0\u0002\u0001\u0004"+ + "\u0002\u0006\u0003\b\u0004\n\u0005\f\u0006\u000e\u0007\u0010\b\u0012\t"+ + "\u0014\n\u0016\u000b\u0018\f\u001a\r\u001c\u000e\u001e\u000f \u0010\""+ + "\u0011$\u0012&\u0013(\u0014*\u0015,\u0016.\u00170\u00182\u00194\u001a"+ + "6\u001b8\u001c:\u001d<\u001e>\u001f@ B!D\"F#H$J%L&N\'P(R)T*V+X,Z-\\.^"+ + "/`0b1d2f3h4j5l6n7p8r9t:v;x~?\u0080@\u0082A\u0084B\u0086C\u0088D\u008a"+ + "E\u008cF\u008eG\u0090H\u0092I\u0094J\u0096K\u0098L\u009aM\u009cN\u009e"+ + "O\u00a0P\u00a2Q\u00a4R\u00a6S\u00a8T\u00aaU\u00acV\u00aeW\u00b0X\u00b2"+ + "Y\u00b4Z\u00b6[\u00b8\\\u00ba]\u00bc^\u00be_\u00c0`\u00c2a\u00c4b\u00c6"+ + "c\u00c8d\u00cae\u00ccf\u00ceg\u00d0h\u00d2i\u00d4j\u00d6k\u00d8l\u00da"+ + "m\u00dcn\u00deo\u00e0p\u00e2q\u00e4r\u00e6s\u00e8t\u00eau\u00ecv\u00ee"+ + "w\u00f0x\u00f2y\u00f4z\u00f6{\u00f8|\u00fa}\u00fc~\u00fe\u007f\u0100\u0080"+ + "\u0102\u0081\u0104\u0082\u0106\u0083\u0108\u0084\u010a\u0085\u010c\u0086"+ + "\u010e\u0087\u0110\u0088\u0112\u0089\u0114\u008a\u0116\u008b\u0118\u008c"+ + "\u011a\u008d\u011c\u008e\u011e\u008f\u0120\u0090\u0122\u0091\u0124\u0000"+ + "\u0126\u0000\u0128\u0092\u012a\u0000\u012c\u0093\u012e\u0094\u0130\u0095"+ + "\u0132\u0096\u0134\u0097\u0136\u0098\u0138\u0099\u013a\u009a\u013c\u009b"+ + "\u013e\u009c\u0140\u009d\u0142\u009e\u0144\u0000\u0146\u0000\u0148\u0000"+ + "\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0000\u0152\u0000\u0154\u0000"+ + "\u0156\u0000\u0158\u009f\u015a\u00a0\u015c\u00a1\u015e\u00a2\u0160\u00a3"+ + "\u0002\u0000\u0001\u0013\u0001\u000019\u0001\u000009\u0002\u0000BBbb\u0002"+ + "\u0000OOoo\u0002\u0000XXxx\u0002\u0000PPpp\u0002\u0000++--\u0001\u0000"+ + "``\u0002\u0000\"\"\\\\\u0002\u0000\t\t \u0002\u0000\n\n\r\r\u0003\u0000"+ + "\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\abffnnrrttvv\u0001\u000007\u0003\u0000"+ + "09AFaf\u0001\u000001\u0002\u0000EEee@\u000009\u0660\u0669\u06f0\u06f9"+ + "\u07c0\u07c9\u0966\u096f\u09e6\u09ef\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f"+ + "\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef\u0d66\u0d6f\u0de6\u0def\u0e50\u0e59"+ + "\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049\u1090\u1099\u17e0\u17e9\u1810\u1819"+ + "\u1946\u194f\u19d0\u19d9\u1a80\u1a89\u1a90\u1a99\u1b50\u1b59\u1bb0\u1bb9"+ + "\u1c40\u1c49\u1c50\u1c59\u8000\ua620\u8000\ua629\u8000\ua8d0\u8000\ua8d9"+ + "\u8000\ua900\u8000\ua909\u8000\ua9d0\u8000\ua9d9\u8000\ua9f0\u8000\ua9f9"+ + "\u8000\uaa50\u8000\uaa59\u8000\uabf0\u8000\uabf9\u8000\uff10\u8000\uff19"+ + "\u8001\u04a0\u8001\u04a9\u8001\u0d30\u8001\u0d39\u8001\u1066\u8001\u106f"+ + "\u8001\u10f0\u8001\u10f9\u8001\u1136\u8001\u113f\u8001\u11d0\u8001\u11d9"+ + "\u8001\u12f0\u8001\u12f9\u8001\u1450\u8001\u1459\u8001\u14d0\u8001\u14d9"+ + "\u8001\u1650\u8001\u1659\u8001\u16c0\u8001\u16c9\u8001\u1730\u8001\u1739"+ + "\u8001\u18e0\u8001\u18e9\u8001\u1950\u8001\u1959\u8001\u1c50\u8001\u1c59"+ + "\u8001\u1d50\u8001\u1d59\u8001\u1da0\u8001\u1da9\u8001\u1f50\u8001\u1f59"+ + "\u8001\u6a60\u8001\u6a69\u8001\u6ac0\u8001\u6ac9\u8001\u6b50\u8001\u6b59"+ + "\u8001\ud7ce\u8001\ud7ff\u8001\ue140\u8001\ue149\u8001\ue2f0\u8001\ue2f9"+ + "\u8001\ue4f0\u8001\ue4f9\u8001\ue950\u8001\ue959\u8001\ufbf0\u8001\ufbf9"+ + "\u0293\u0000AZaz\u00aa\u00aa\u00b5\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8"+ + "\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0\u02e4\u02ec\u02ec\u02ee\u02ee\u0370"+ + "\u0374\u0376\u0377\u037a\u037d\u037f\u037f\u0386\u0386\u0388\u038a\u038c"+ + "\u038c\u038e\u03a1\u03a3\u03f5\u03f7\u0481\u048a\u052f\u0531\u0556\u0559"+ + "\u0559\u0560\u0588\u05d0\u05ea\u05ef\u05f2\u0620\u064a\u066e\u066f\u0671"+ + "\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa\u06fc\u06ff\u06ff\u0710"+ + "\u0710\u0712\u072f\u074d\u07a5\u07b1\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa"+ + "\u07fa\u0800\u0815\u081a\u081a\u0824\u0824\u0828\u0828\u0840\u0858\u0860"+ + "\u086a\u0870\u0887\u0889\u088e\u08a0\u08c9\u0904\u0939\u093d\u093d\u0950"+ + "\u0950\u0958\u0961\u0971\u0980\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa"+ + "\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd\u09bd\u09ce\u09ce\u09dc\u09dd\u09df"+ + "\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a"+ + "\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72"+ + "\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5"+ + "\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f"+ + "\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c"+ + "\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92"+ + "\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae"+ + "\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d"+ + "\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e"+ + "\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0"+ + "\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e"+ + "\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3"+ + "\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81"+ + "\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2"+ + "\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40"+ + "\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000\u102a\u103f\u103f\u1050\u1055\u105a"+ + "\u105d\u1061\u1061\u1065\u1066\u106e\u1070\u1075\u1081\u108e\u108e\u10a0"+ + "\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0\u10fa\u10fc\u1248\u124a\u124d\u1250"+ + "\u1256\u1258\u1258\u125a\u125d\u1260\u1288\u128a\u128d\u1290\u12b0\u12b2"+ + "\u12b5\u12b8\u12be\u12c0\u12c0\u12c2\u12c5\u12c8\u12d6\u12d8\u1310\u1312"+ + "\u1315\u1318\u135a\u1380\u138f\u13a0\u13f5\u13f8\u13fd\u1401\u166c\u166f"+ + "\u167f\u1681\u169a\u16a0\u16ea\u16f1\u16f8\u1700\u1711\u171f\u1731\u1740"+ + "\u1751\u1760\u176c\u176e\u1770\u1780\u17b3\u17d7\u17d7\u17dc\u17dc\u1820"+ + "\u1878\u1880\u1884\u1887\u18a8\u18aa\u18aa\u18b0\u18f5\u1900\u191e\u1950"+ + "\u196d\u1970\u1974\u1980\u19ab\u19b0\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7"+ + "\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00"+ + "\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9"+ + "\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18"+ + "\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d"+ + "\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6"+ + "\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071"+ + "\u2071\u207f\u207f\u2090\u209c\u2102\u2102\u2107\u2107\u210a\u2113\u2115"+ + "\u2115\u2119\u211d\u2124\u2124\u2126\u2126\u2128\u2128\u212a\u212d\u212f"+ + "\u2139\u213c\u213f\u2145\u2149\u214e\u214e\u2183\u2184\u2c00\u2ce4\u2ceb"+ + "\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f"+ + "\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0"+ + "\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8\u2dde\u2e2f\u2e2f\u3005\u3006\u3031"+ + "\u3035\u303b\u303c\u3041\u3096\u309d\u309f\u30a1\u30fa\u30fc\u30ff\u3105"+ + "\u312f\u3131\u318e\u31a0\u31bf\u31f0\u31ff\u3400\u4dbf\u4e00\u8000\ua48c"+ + "\u8000\ua4d0\u8000\ua4fd\u8000\ua500\u8000\ua60c\u8000\ua610\u8000\ua61f"+ + "\u8000\ua62a\u8000\ua62b\u8000\ua640\u8000\ua66e\u8000\ua67f\u8000\ua69d"+ + "\u8000\ua6a0\u8000\ua6e5\u8000\ua717\u8000\ua71f\u8000\ua722\u8000\ua788"+ + "\u8000\ua78b\u8000\ua7ca\u8000\ua7d0\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3"+ + "\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2\u8000\ua801\u8000\ua803\u8000\ua805"+ + "\u8000\ua807\u8000\ua80a\u8000\ua80c\u8000\ua822\u8000\ua840\u8000\ua873"+ + "\u8000\ua882\u8000\ua8b3\u8000\ua8f2\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb"+ + "\u8000\ua8fd\u8000\ua8fe\u8000\ua90a\u8000\ua925\u8000\ua930\u8000\ua946"+ + "\u8000\ua960\u8000\ua97c\u8000\ua984\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf"+ + "\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe"+ + "\u8000\uaa00\u8000\uaa28\u8000\uaa40\u8000\uaa42\u8000\uaa44\u8000\uaa4b"+ + "\u8000\uaa60\u8000\uaa76\u8000\uaa7a\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf"+ + "\u8000\uaab1\u8000\uaab1\u8000\uaab5\u8000\uaab6\u8000\uaab9\u8000\uaabd"+ + "\u8000\uaac0\u8000\uaac0\u8000\uaac2\u8000\uaac2\u8000\uaadb\u8000\uaadd"+ + "\u8000\uaae0\u8000\uaaea\u8000\uaaf2\u8000\uaaf4\u8000\uab01\u8000\uab06"+ + "\u8000\uab09\u8000\uab0e\u8000\uab11\u8000\uab16\u8000\uab20\u8000\uab26"+ + "\u8000\uab28\u8000\uab2e\u8000\uab30\u8000\uab5a\u8000\uab5c\u8000\uab69"+ + "\u8000\uab70\u8000\uabe2\u8000\uac00\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6"+ + "\u8000\ud7cb\u8000\ud7fb\u8000\uf900\u8000\ufa6d\u8000\ufa70\u8000\ufad9"+ + "\u8000\ufb00\u8000\ufb06\u8000\ufb13\u8000\ufb17\u8000\ufb1d\u8000\ufb1d"+ + "\u8000\ufb1f\u8000\ufb28\u8000\ufb2a\u8000\ufb36\u8000\ufb38\u8000\ufb3c"+ + "\u8000\ufb3e\u8000\ufb3e\u8000\ufb40\u8000\ufb41\u8000\ufb43\u8000\ufb44"+ + "\u8000\ufb46\u8000\ufbb1\u8000\ufbd3\u8000\ufd3d\u8000\ufd50\u8000\ufd8f"+ + "\u8000\ufd92\u8000\ufdc7\u8000\ufdf0\u8000\ufdfb\u8000\ufe70\u8000\ufe74"+ + "\u8000\ufe76\u8000\ufefc\u8000\uff21\u8000\uff3a\u8000\uff41\u8000\uff5a"+ + "\u8000\uff66\u8000\uffbe\u8000\uffc2\u8000\uffc7\u8000\uffca\u8000\uffcf"+ + "\u8000\uffd2\u8000\uffd7\u8000\uffda\u8000\uffdc\u8001\u0000\u8001\u000b"+ + "\u8001\r\u8001&\u8001(\u8001:\u8001<\u8001=\u8001?\u8001M\u8001P\u8001"+ + "]\u8001\u0080\u8001\u00fa\u8001\u0280\u8001\u029c\u8001\u02a0\u8001\u02d0"+ + "\u8001\u0300\u8001\u031f\u8001\u032d\u8001\u0340\u8001\u0342\u8001\u0349"+ + "\u8001\u0350\u8001\u0375\u8001\u0380\u8001\u039d\u8001\u03a0\u8001\u03c3"+ + "\u8001\u03c8\u8001\u03cf\u8001\u0400\u8001\u049d\u8001\u04b0\u8001\u04d3"+ + "\u8001\u04d8\u8001\u04fb\u8001\u0500\u8001\u0527\u8001\u0530\u8001\u0563"+ + "\u8001\u0570\u8001\u057a\u8001\u057c\u8001\u058a\u8001\u058c\u8001\u0592"+ + "\u8001\u0594\u8001\u0595\u8001\u0597\u8001\u05a1\u8001\u05a3\u8001\u05b1"+ + "\u8001\u05b3\u8001\u05b9\u8001\u05bb\u8001\u05bc\u8001\u0600\u8001\u0736"+ + "\u8001\u0740\u8001\u0755\u8001\u0760\u8001\u0767\u8001\u0780\u8001\u0785"+ + "\u8001\u0787\u8001\u07b0\u8001\u07b2\u8001\u07ba\u8001\u0800\u8001\u0805"+ + "\u8001\u0808\u8001\u0808\u8001\u080a\u8001\u0835\u8001\u0837\u8001\u0838"+ + "\u8001\u083c\u8001\u083c\u8001\u083f\u8001\u0855\u8001\u0860\u8001\u0876"+ + "\u8001\u0880\u8001\u089e\u8001\u08e0\u8001\u08f2\u8001\u08f4\u8001\u08f5"+ + "\u8001\u0900\u8001\u0915\u8001\u0920\u8001\u0939\u8001\u0980\u8001\u09b7"+ + "\u8001\u09be\u8001\u09bf\u8001\u0a00\u8001\u0a00\u8001\u0a10\u8001\u0a13"+ + "\u8001\u0a15\u8001\u0a17\u8001\u0a19\u8001\u0a35\u8001\u0a60\u8001\u0a7c"+ + "\u8001\u0a80\u8001\u0a9c\u8001\u0ac0\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4"+ + "\u8001\u0b00\u8001\u0b35\u8001\u0b40\u8001\u0b55\u8001\u0b60\u8001\u0b72"+ + "\u8001\u0b80\u8001\u0b91\u8001\u0c00\u8001\u0c48\u8001\u0c80\u8001\u0cb2"+ + "\u8001\u0cc0\u8001\u0cf2\u8001\u0d00\u8001\u0d23\u8001\u0e80\u8001\u0ea9"+ + "\u8001\u0eb0\u8001\u0eb1\u8001\u0f00\u8001\u0f1c\u8001\u0f27\u8001\u0f27"+ + "\u8001\u0f30\u8001\u0f45\u8001\u0f70\u8001\u0f81\u8001\u0fb0\u8001\u0fc4"+ + "\u8001\u0fe0\u8001\u0ff6\u8001\u1003\u8001\u1037\u8001\u1071\u8001\u1072"+ + "\u8001\u1075\u8001\u1075\u8001\u1083\u8001\u10af\u8001\u10d0\u8001\u10e8"+ + "\u8001\u1103\u8001\u1126\u8001\u1144\u8001\u1144\u8001\u1147\u8001\u1147"+ + "\u8001\u1150\u8001\u1172\u8001\u1176\u8001\u1176\u8001\u1183\u8001\u11b2"+ + "\u8001\u11c1\u8001\u11c4\u8001\u11da\u8001\u11da\u8001\u11dc\u8001\u11dc"+ + "\u8001\u1200\u8001\u1211\u8001\u1213\u8001\u122b\u8001\u123f\u8001\u1240"+ + "\u8001\u1280\u8001\u1286\u8001\u1288\u8001\u1288\u8001\u128a\u8001\u128d"+ + "\u8001\u128f\u8001\u129d\u8001\u129f\u8001\u12a8\u8001\u12b0\u8001\u12de"+ + "\u8001\u1305\u8001\u130c\u8001\u130f\u8001\u1310\u8001\u1313\u8001\u1328"+ + "\u8001\u132a\u8001\u1330\u8001\u1332\u8001\u1333\u8001\u1335\u8001\u1339"+ + "\u8001\u133d\u8001\u133d\u8001\u1350\u8001\u1350\u8001\u135d\u8001\u1361"+ + "\u8001\u1400\u8001\u1434\u8001\u1447\u8001\u144a\u8001\u145f\u8001\u1461"+ + "\u8001\u1480\u8001\u14af\u8001\u14c4\u8001\u14c5\u8001\u14c7\u8001\u14c7"+ + "\u8001\u1580\u8001\u15ae\u8001\u15d8\u8001\u15db\u8001\u1600\u8001\u162f"+ + "\u8001\u1644\u8001\u1644\u8001\u1680\u8001\u16aa\u8001\u16b8\u8001\u16b8"+ + "\u8001\u1700\u8001\u171a\u8001\u1740\u8001\u1746\u8001\u1800\u8001\u182b"+ + "\u8001\u18a0\u8001\u18df\u8001\u18ff\u8001\u1906\u8001\u1909\u8001\u1909"+ + "\u8001\u190c\u8001\u1913\u8001\u1915\u8001\u1916\u8001\u1918\u8001\u192f"+ + "\u8001\u193f\u8001\u193f\u8001\u1941\u8001\u1941\u8001\u19a0\u8001\u19a7"+ + "\u8001\u19aa\u8001\u19d0\u8001\u19e1\u8001\u19e1\u8001\u19e3\u8001\u19e3"+ + "\u8001\u1a00\u8001\u1a00\u8001\u1a0b\u8001\u1a32\u8001\u1a3a\u8001\u1a3a"+ + "\u8001\u1a50\u8001\u1a50\u8001\u1a5c\u8001\u1a89\u8001\u1a9d\u8001\u1a9d"+ + "\u8001\u1ab0\u8001\u1af8\u8001\u1c00\u8001\u1c08\u8001\u1c0a\u8001\u1c2e"+ + "\u8001\u1c40\u8001\u1c40\u8001\u1c72\u8001\u1c8f\u8001\u1d00\u8001\u1d06"+ + "\u8001\u1d08\u8001\u1d09\u8001\u1d0b\u8001\u1d30\u8001\u1d46\u8001\u1d46"+ + "\u8001\u1d60\u8001\u1d65\u8001\u1d67\u8001\u1d68\u8001\u1d6a\u8001\u1d89"+ + "\u8001\u1d98\u8001\u1d98\u8001\u1ee0\u8001\u1ef2\u8001\u1f02\u8001\u1f02"+ + "\u8001\u1f04\u8001\u1f10\u8001\u1f12\u8001\u1f33\u8001\u1fb0\u8001\u1fb0"+ + "\u8001\u2000\u8001\u2399\u8001\u2480\u8001\u2543\u8001\u2f90\u8001\u2ff0"+ + "\u8001\u3000\u8001\u342f\u8001\u3441\u8001\u3446\u8001\u4400\u8001\u4646"+ + "\u8001\u6800\u8001\u6a38\u8001\u6a40\u8001\u6a5e\u8001\u6a70\u8001\u6abe"+ + "\u8001\u6ad0\u8001\u6aed\u8001\u6b00\u8001\u6b2f\u8001\u6b40\u8001\u6b43"+ + "\u8001\u6b63\u8001\u6b77\u8001\u6b7d\u8001\u6b8f\u8001\u6e40\u8001\u6e7f"+ + "\u8001\u6f00\u8001\u6f4a\u8001\u6f50\u8001\u6f50\u8001\u6f93\u8001\u6f9f"+ + "\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3\u8001\u6fe3\u8001\u7000\u8001\u87f7"+ + "\u8001\u8800\u8001\u8cd5\u8001\u8d00\u8001\u8d08\u8001\uaff0\u8001\uaff3"+ + "\u8001\uaff5\u8001\uaffb\u8001\uaffd\u8001\uaffe\u8001\ub000\u8001\ub122"+ + "\u8001\ub132\u8001\ub132\u8001\ub150\u8001\ub152\u8001\ub155\u8001\ub155"+ + "\u8001\ub164\u8001\ub167\u8001\ub170\u8001\ub2fb\u8001\ubc00\u8001\ubc6a"+ + "\u8001\ubc70\u8001\ubc7c\u8001\ubc80\u8001\ubc88\u8001\ubc90\u8001\ubc99"+ + "\u8001\ud400\u8001\ud454\u8001\ud456\u8001\ud49c\u8001\ud49e\u8001\ud49f"+ + "\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5\u8001\ud4a6\u8001\ud4a9\u8001\ud4ac"+ + "\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb\u8001\ud4bb\u8001\ud4bd\u8001\ud4c3"+ + "\u8001\ud4c5\u8001\ud505\u8001\ud507\u8001\ud50a\u8001\ud50d\u8001\ud514"+ + "\u8001\ud516\u8001\ud51c\u8001\ud51e\u8001\ud539\u8001\ud53b\u8001\ud53e"+ + "\u8001\ud540\u8001\ud544\u8001\ud546\u8001\ud546\u8001\ud54a\u8001\ud550"+ + "\u8001\ud552\u8001\ud6a5\u8001\ud6a8\u8001\ud6c0\u8001\ud6c2\u8001\ud6da"+ + "\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc\u8001\ud714\u8001\ud716\u8001\ud734"+ + "\u8001\ud736\u8001\ud74e\u8001\ud750\u8001\ud76e\u8001\ud770\u8001\ud788"+ + "\u8001\ud78a\u8001\ud7a8\u8001\ud7aa\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb"+ + "\u8001\udf00\u8001\udf1e\u8001\udf25\u8001\udf2a\u8001\ue030\u8001\ue06d"+ + "\u8001\ue100\u8001\ue12c\u8001\ue137\u8001\ue13d\u8001\ue14e\u8001\ue14e"+ + "\u8001\ue290\u8001\ue2ad\u8001\ue2c0\u8001\ue2eb\u8001\ue4d0\u8001\ue4eb"+ + "\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee"+ + "\u8001\ue7f0\u8001\ue7fe\u8001\ue800\u8001\ue8c4\u8001\ue900\u8001\ue943"+ + "\u8001\ue94b\u8001\ue94b\u8001\uee00\u8001\uee03\u8001\uee05\u8001\uee1f"+ + "\u8001\uee21\u8001\uee22\u8001\uee24\u8001\uee24\u8001\uee27\u8001\uee27"+ + "\u8001\uee29\u8001\uee32\u8001\uee34\u8001\uee37\u8001\uee39\u8001\uee39"+ + "\u8001\uee3b\u8001\uee3b\u8001\uee42\u8001\uee42\u8001\uee47\u8001\uee47"+ + "\u8001\uee49\u8001\uee49\u8001\uee4b\u8001\uee4b\u8001\uee4d\u8001\uee4f"+ + "\u8001\uee51\u8001\uee52\u8001\uee54\u8001\uee54\u8001\uee57\u8001\uee57"+ + "\u8001\uee59\u8001\uee59\u8001\uee5b\u8001\uee5b\u8001\uee5d\u8001\uee5d"+ + "\u8001\uee5f\u8001\uee5f\u8001\uee61\u8001\uee62\u8001\uee64\u8001\uee64"+ + "\u8001\uee67\u8001\uee6a\u8001\uee6c\u8001\uee72\u8001\uee74\u8001\uee77"+ + "\u8001\uee79\u8001\uee7c\u8001\uee7e\u8001\uee7e\u8001\uee80\u8001\uee89"+ + "\u8001\uee8b\u8001\uee9b\u8001\ueea1\u8001\ueea3\u8001\ueea5\u8001\ueea9"+ + "\u8001\ueeab\u8001\ueebb\u8002\u0000\u8002\ua6df\u8002\ua700\u8002\ub739"+ + "\u8002\ub740\u8002\ub81d\u8002\ub820\u8002\ucea1\u8002\uceb0\u8002\uebe0"+ + "\u8002\uf800\u8002\ufa1d\u8003\u0000\u8003\u134a\u8003\u1350\u8003\u23af"+ + "\u0626\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004\u0001\u0000\u0000"+ + "\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001\u0000\u0000\u0000"+ + "\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000\u0000\u0000\u0000"+ + "\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000\u0000\u0000\u0000"+ + "\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000\u0000\u0000"+ + "\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000"+ + "\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000"+ + "\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\""+ + "\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000"+ + "\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000"+ + "\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000"+ + "\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000"+ + "\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000"+ + "\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>"+ + "\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000"+ + "\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000"+ + "\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L"+ + "\u0001\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000"+ + "\u0000\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000"+ + "\u0000V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z"+ + "\u0001\u0000\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001"+ + "\u0000\u0000\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000"+ + "\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000"+ + "h\u0001\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001"+ + "\u0000\u0000\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000"+ + "\u0000\u0000r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000"+ + "v\u0001\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001"+ + "\u0000\u0000\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000"+ + "\u0000\u0000\u0080\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000"+ + "\u0000\u0000\u0084\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000"+ + "\u0000\u0000\u0088\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000"+ + "\u0000\u0000\u008c\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000"+ + "\u0000\u0000\u0090\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000"+ + "\u0000\u0000\u0094\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000"+ + "\u0000\u0000\u0098\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000"+ + "\u0000\u0000\u009c\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000"+ + "\u0000\u0000\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000"+ + "\u0000\u0000\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000"+ + "\u0000\u0000\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000"+ + "\u0000\u0000\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000"+ + "\u0000\u0000\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000"+ + "\u0000\u0000\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000"+ + "\u0000\u0000\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000"+ + "\u0000\u0000\u00bc\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000"+ + "\u0000\u0000\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000"+ + "\u0000\u0000\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000"+ + "\u0000\u0000\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000"+ + "\u0000\u0000\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000"+ + "\u0000\u0000\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000"+ + "\u0000\u0000\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000"+ + "\u0000\u0000\u00d8\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000"+ + "\u0000\u0000\u00dc\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000"+ + "\u0000\u0000\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000"+ + "\u0000\u0000\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000"+ + "\u0000\u0000\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000"+ + "\u0000\u0000\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000"+ + "\u0000\u0000\u00f0\u0001\u0000\u0000\u0000\u0000\u00f2\u0001\u0000\u0000"+ + "\u0000\u0000\u00f4\u0001\u0000\u0000\u0000\u0000\u00f6\u0001\u0000\u0000"+ + "\u0000\u0000\u00f8\u0001\u0000\u0000\u0000\u0000\u00fa\u0001\u0000\u0000"+ + "\u0000\u0000\u00fc\u0001\u0000\u0000\u0000\u0000\u00fe\u0001\u0000\u0000"+ + "\u0000\u0000\u0100\u0001\u0000\u0000\u0000\u0000\u0102\u0001\u0000\u0000"+ + "\u0000\u0000\u0104\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000"+ + "\u0000\u0000\u0108\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000"+ + "\u0000\u0000\u010c\u0001\u0000\u0000\u0000\u0000\u010e\u0001\u0000\u0000"+ + "\u0000\u0000\u0110\u0001\u0000\u0000\u0000\u0000\u0112\u0001\u0000\u0000"+ + "\u0000\u0000\u0114\u0001\u0000\u0000\u0000\u0000\u0116\u0001\u0000\u0000"+ + "\u0000\u0000\u0118\u0001\u0000\u0000\u0000\u0000\u011a\u0001\u0000\u0000"+ + "\u0000\u0000\u011c\u0001\u0000\u0000\u0000\u0000\u011e\u0001\u0000\u0000"+ + "\u0000\u0000\u0120\u0001\u0000\u0000\u0000\u0000\u0122\u0001\u0000\u0000"+ + "\u0000\u0000\u0128\u0001\u0000\u0000\u0000\u0000\u012c\u0001\u0000\u0000"+ + "\u0000\u0000\u012e\u0001\u0000\u0000\u0000\u0000\u0130\u0001\u0000\u0000"+ + "\u0000\u0000\u0132\u0001\u0000\u0000\u0000\u0000\u0134\u0001\u0000\u0000"+ + "\u0000\u0000\u0136\u0001\u0000\u0000\u0000\u0000\u0138\u0001\u0000\u0000"+ + "\u0000\u0000\u013a\u0001\u0000\u0000\u0000\u0000\u013c\u0001\u0000\u0000"+ + "\u0000\u0000\u013e\u0001\u0000\u0000\u0000\u0000\u0140\u0001\u0000\u0000"+ + "\u0000\u0000\u0142\u0001\u0000\u0000\u0000\u0001\u0158\u0001\u0000\u0000"+ + "\u0000\u0001\u015a\u0001\u0000\u0000\u0000\u0001\u015c\u0001\u0000\u0000"+ + "\u0000\u0001\u015e\u0001\u0000\u0000\u0000\u0001\u0160\u0001\u0000\u0000"+ + "\u0000\u0002\u0164\u0001\u0000\u0000\u0000\u0004\u017a\u0001\u0000\u0000"+ + "\u0000\u0006\u017c\u0001\u0000\u0000\u0000\b\u0183\u0001\u0000\u0000\u0000"+ + "\n\u018b\u0001\u0000\u0000\u0000\f\u0192\u0001\u0000\u0000\u0000\u000e"+ + "\u0199\u0001\u0000\u0000\u0000\u0010\u01a0\u0001\u0000\u0000\u0000\u0012"+ + "\u01a7\u0001\u0000\u0000\u0000\u0014\u01b0\u0001\u0000\u0000\u0000\u0016"+ + "\u01ba\u0001\u0000\u0000\u0000\u0018\u01c2\u0001\u0000\u0000\u0000\u001a"+ + "\u01cc\u0001\u0000\u0000\u0000\u001c\u01d8\u0001\u0000\u0000\u0000\u001e"+ + "\u01df\u0001\u0000\u0000\u0000 \u01ea\u0001\u0000\u0000\u0000\"\u01ed"+ + "\u0001\u0000\u0000\u0000$\u01f3\u0001\u0000\u0000\u0000&\u01fc\u0001\u0000"+ + "\u0000\u0000(\u0201\u0001\u0000\u0000\u0000*\u0208\u0001\u0000\u0000\u0000"+ + ",\u020f\u0001\u0000\u0000\u0000.\u0215\u0001\u0000\u0000\u00000\u021a"+ + "\u0001\u0000\u0000\u00002\u0221\u0001\u0000\u0000\u00004\u022b\u0001\u0000"+ + "\u0000\u00006\u022f\u0001\u0000\u0000\u00008\u0235\u0001\u0000\u0000\u0000"+ + ":\u0238\u0001\u0000\u0000\u0000<\u023a\u0001\u0000\u0000\u0000>\u0241"+ + "\u0001\u0000\u0000\u0000@\u0247\u0001\u0000\u0000\u0000B\u0254\u0001\u0000"+ + "\u0000\u0000D\u025d\u0001\u0000\u0000\u0000F\u0261\u0001\u0000\u0000\u0000"+ + "H\u0265\u0001\u0000\u0000\u0000J\u026b\u0001\u0000\u0000\u0000L\u026d"+ + "\u0001\u0000\u0000\u0000N\u0270\u0001\u0000\u0000\u0000P\u0275\u0001\u0000"+ + "\u0000\u0000R\u027b\u0001\u0000\u0000\u0000T\u0281\u0001\u0000\u0000\u0000"+ + "V\u0288\u0001\u0000\u0000\u0000X\u028f\u0001\u0000\u0000\u0000Z\u0298"+ + "\u0001\u0000\u0000\u0000\\\u029e\u0001\u0000\u0000\u0000^\u02a4\u0001"+ + "\u0000\u0000\u0000`\u02ab\u0001\u0000\u0000\u0000b\u02b1\u0001\u0000\u0000"+ + "\u0000d\u02b8\u0001\u0000\u0000\u0000f\u02be\u0001\u0000\u0000\u0000h"+ + "\u02c7\u0001\u0000\u0000\u0000j\u02cf\u0001\u0000\u0000\u0000l\u02d5\u0001"+ + "\u0000\u0000\u0000n\u02dd\u0001\u0000\u0000\u0000p\u02e4\u0001\u0000\u0000"+ + "\u0000r\u02e9\u0001\u0000\u0000\u0000t\u02f2\u0001\u0000\u0000\u0000v"+ + "\u0301\u0001\u0000\u0000\u0000x\u0307\u0001\u0000\u0000\u0000z\u030b\u0001"+ + "\u0000\u0000\u0000|\u030e\u0001\u0000\u0000\u0000~\u0315\u0001\u0000\u0000"+ + "\u0000\u0080\u031f\u0001\u0000\u0000\u0000\u0082\u0329\u0001\u0000\u0000"+ + "\u0000\u0084\u0335\u0001\u0000\u0000\u0000\u0086\u033e\u0001\u0000\u0000"+ + "\u0000\u0088\u0348\u0001\u0000\u0000\u0000\u008a\u0350\u0001\u0000\u0000"+ + "\u0000\u008c\u035c\u0001\u0000\u0000\u0000\u008e\u036b\u0001\u0000\u0000"+ + "\u0000\u0090\u0371\u0001\u0000\u0000\u0000\u0092\u0375\u0001\u0000\u0000"+ + "\u0000\u0094\u0379\u0001\u0000\u0000\u0000\u0096\u037e\u0001\u0000\u0000"+ + "\u0000\u0098\u0387\u0001\u0000\u0000\u0000\u009a\u038e\u0001\u0000\u0000"+ + "\u0000\u009c\u0397\u0001\u0000\u0000\u0000\u009e\u039f\u0001\u0000\u0000"+ + "\u0000\u00a0\u03a7\u0001\u0000\u0000\u0000\u00a2\u03ac\u0001\u0000\u0000"+ + "\u0000\u00a4\u03b6\u0001\u0000\u0000\u0000\u00a6\u03bd\u0001\u0000\u0000"+ + "\u0000\u00a8\u03c2\u0001\u0000\u0000\u0000\u00aa\u03c8\u0001\u0000\u0000"+ + "\u0000\u00ac\u03cb\u0001\u0000\u0000\u0000\u00ae\u03cf\u0001\u0000\u0000"+ + "\u0000\u00b0\u03d6\u0001\u0000\u0000\u0000\u00b2\u03db\u0001\u0000\u0000"+ + "\u0000\u00b4\u03e0\u0001\u0000\u0000\u0000\u00b6\u03e5\u0001\u0000\u0000"+ + "\u0000\u00b8\u03ed\u0001\u0000\u0000\u0000\u00ba\u03f4\u0001\u0000\u0000"+ + "\u0000\u00bc\u03fa\u0001\u0000\u0000\u0000\u00be\u0408\u0001\u0000\u0000"+ + "\u0000\u00c0\u040b\u0001\u0000\u0000\u0000\u00c2\u0411\u0001\u0000\u0000"+ + "\u0000\u00c4\u0416\u0001\u0000\u0000\u0000\u00c6\u0421\u0001\u0000\u0000"+ + "\u0000\u00c8\u0425\u0001\u0000\u0000\u0000\u00ca\u042c\u0001\u0000\u0000"+ + "\u0000\u00cc\u0435\u0001\u0000\u0000\u0000\u00ce\u0439\u0001\u0000\u0000"+ + "\u0000\u00d0\u043f\u0001\u0000\u0000\u0000\u00d2\u0449\u0001\u0000\u0000"+ + "\u0000\u00d4\u044b\u0001\u0000\u0000\u0000\u00d6\u044f\u0001\u0000\u0000"+ + "\u0000\u00d8\u0451\u0001\u0000\u0000\u0000\u00da\u0455\u0001\u0000\u0000"+ + "\u0000\u00dc\u0457\u0001\u0000\u0000\u0000\u00de\u045b\u0001\u0000\u0000"+ + "\u0000\u00e0\u045d\u0001\u0000\u0000\u0000\u00e2\u045f\u0001\u0000\u0000"+ + "\u0000\u00e4\u0461\u0001\u0000\u0000\u0000\u00e6\u0463\u0001\u0000\u0000"+ + "\u0000\u00e8\u0465\u0001\u0000\u0000\u0000\u00ea\u046a\u0001\u0000\u0000"+ + "\u0000\u00ec\u046f\u0001\u0000\u0000\u0000\u00ee\u0472\u0001\u0000\u0000"+ + "\u0000\u00f0\u0476\u0001\u0000\u0000\u0000\u00f2\u0479\u0001\u0000\u0000"+ + "\u0000\u00f4\u047c\u0001\u0000\u0000\u0000\u00f6\u047f\u0001\u0000\u0000"+ + "\u0000\u00f8\u0482\u0001\u0000\u0000\u0000\u00fa\u0484\u0001\u0000\u0000"+ + "\u0000\u00fc\u0487\u0001\u0000\u0000\u0000\u00fe\u0489\u0001\u0000\u0000"+ + "\u0000\u0100\u048c\u0001\u0000\u0000\u0000\u0102\u048e\u0001\u0000\u0000"+ + "\u0000\u0104\u0490\u0001\u0000\u0000\u0000\u0106\u0492\u0001\u0000\u0000"+ + "\u0000\u0108\u0495\u0001\u0000\u0000\u0000\u010a\u0498\u0001\u0000\u0000"+ + "\u0000\u010c\u049b\u0001\u0000\u0000\u0000\u010e\u049d\u0001\u0000\u0000"+ + "\u0000\u0110\u049f\u0001\u0000\u0000\u0000\u0112\u04a1\u0001\u0000\u0000"+ + "\u0000\u0114\u04a3\u0001\u0000\u0000\u0000\u0116\u04a5\u0001\u0000\u0000"+ + "\u0000\u0118\u04a7\u0001\u0000\u0000\u0000\u011a\u04b5\u0001\u0000\u0000"+ + "\u0000\u011c\u04b9\u0001\u0000\u0000\u0000\u011e\u04c5\u0001\u0000\u0000"+ + "\u0000\u0120\u04d3\u0001\u0000\u0000\u0000\u0122\u04df\u0001\u0000\u0000"+ + "\u0000\u0124\u0503\u0001\u0000\u0000\u0000\u0126\u0505\u0001\u0000\u0000"+ + "\u0000\u0128\u0510\u0001\u0000\u0000\u0000\u012a\u0516\u0001\u0000\u0000"+ + "\u0000\u012c\u051d\u0001\u0000\u0000\u0000\u012e\u0523\u0001\u0000\u0000"+ + "\u0000\u0130\u0525\u0001\u0000\u0000\u0000\u0132\u052a\u0001\u0000\u0000"+ + "\u0000\u0134\u052f\u0001\u0000\u0000\u0000\u0136\u0536\u0001\u0000\u0000"+ + "\u0000\u0138\u0541\u0001\u0000\u0000\u0000\u013a\u054c\u0001\u0000\u0000"+ + "\u0000\u013c\u0559\u0001\u0000\u0000\u0000\u013e\u055f\u0001\u0000\u0000"+ + "\u0000\u0140\u056e\u0001\u0000\u0000\u0000\u0142\u0574\u0001\u0000\u0000"+ + "\u0000\u0144\u0583\u0001\u0000\u0000\u0000\u0146\u0585\u0001\u0000\u0000"+ + "\u0000\u0148\u05a1\u0001\u0000\u0000\u0000\u014a\u05ab\u0001\u0000\u0000"+ + "\u0000\u014c\u05ad\u0001\u0000\u0000\u0000\u014e\u05af\u0001\u0000\u0000"+ + "\u0000\u0150\u05b1\u0001\u0000\u0000\u0000\u0152\u05b9\u0001\u0000\u0000"+ + "\u0000\u0154\u05bb\u0001\u0000\u0000\u0000\u0156\u05bd\u0001\u0000\u0000"+ + "\u0000\u0158\u05c0\u0001\u0000\u0000\u0000\u015a\u05c6\u0001\u0000\u0000"+ + "\u0000\u015c\u05d4\u0001\u0000\u0000\u0000\u015e\u05f1\u0001\u0000\u0000"+ + "\u0000\u0160\u05f5\u0001\u0000\u0000\u0000\u0162\u0165\u0003\u0004\u0001"+ + "\u0000\u0163\u0165\u0003\u0122\u0090\u0000\u0164\u0162\u0001\u0000\u0000"+ + "\u0000\u0164\u0163\u0001\u0000\u0000\u0000\u0165\u0166\u0001\u0000\u0000"+ + "\u0000\u0166\u0167\u0006\u0000\u0000\u0000\u0167\u0003\u0001\u0000\u0000"+ + "\u0000\u0168\u0172\u0003\u0148\u00a3\u0000\u0169\u016a\u0005.\u0000\u0000"+ + "\u016a\u016c\u0004\u0001\u0000\u0000\u016b\u016d\u0003\u0148\u00a3\u0000"+ + "\u016c\u016b\u0001\u0000\u0000\u0000\u016c\u016d\u0001\u0000\u0000\u0000"+ + "\u016d\u016f\u0001\u0000\u0000\u0000\u016e\u0170\u0003\u0150\u00a7\u0000"+ + "\u016f\u016e\u0001\u0000\u0000\u0000\u016f\u0170\u0001\u0000\u0000\u0000"+ + "\u0170\u0173\u0001\u0000\u0000\u0000\u0171\u0173\u0003\u0150\u00a7\u0000"+ + "\u0172\u0169\u0001\u0000\u0000\u0000\u0172\u0171\u0001\u0000\u0000\u0000"+ + "\u0173\u017b\u0001\u0000\u0000\u0000\u0174\u0175\u0005.\u0000\u0000\u0175"+ + "\u0176\u0004\u0001\u0001\u0000\u0176\u0178\u0003\u0148\u00a3\u0000\u0177"+ + "\u0179\u0003\u0150\u00a7\u0000\u0178\u0177\u0001\u0000\u0000\u0000\u0178"+ + "\u0179\u0001\u0000\u0000\u0000\u0179\u017b\u0001\u0000\u0000\u0000\u017a"+ + "\u0168\u0001\u0000\u0000\u0000\u017a\u0174\u0001\u0000\u0000\u0000\u017b"+ + "\u0005\u0001\u0000\u0000\u0000\u017c\u017d\u0005t\u0000\u0000\u017d\u017e"+ + "\u0005r\u0000\u0000\u017e\u017f\u0005u\u0000\u0000\u017f\u0180\u0005e"+ + "\u0000\u0000\u0180\u0181\u0001\u0000\u0000\u0000\u0181\u0182\u0006\u0002"+ + "\u0000\u0000\u0182\u0007\u0001\u0000\u0000\u0000\u0183\u0184\u0005f\u0000"+ + "\u0000\u0184\u0185\u0005a\u0000\u0000\u0185\u0186\u0005l\u0000\u0000\u0186"+ + "\u0187\u0005s\u0000\u0000\u0187\u0188\u0005e\u0000\u0000\u0188\u0189\u0001"+ + "\u0000\u0000\u0000\u0189\u018a\u0006\u0003\u0000\u0000\u018a\t\u0001\u0000"+ + "\u0000\u0000\u018b\u018c\u0005a\u0000\u0000\u018c\u018d\u0005s\u0000\u0000"+ + "\u018d\u018e\u0005s\u0000\u0000\u018e\u018f\u0005e\u0000\u0000\u018f\u0190"+ + "\u0005r\u0000\u0000\u0190\u0191\u0005t\u0000\u0000\u0191\u000b\u0001\u0000"+ + "\u0000\u0000\u0192\u0193\u0005a\u0000\u0000\u0193\u0194\u0005s\u0000\u0000"+ + "\u0194\u0195\u0005s\u0000\u0000\u0195\u0196\u0005u\u0000\u0000\u0196\u0197"+ + "\u0005m\u0000\u0000\u0197\u0198\u0005e\u0000\u0000\u0198\r\u0001\u0000"+ + "\u0000\u0000\u0199\u019a\u0005i\u0000\u0000\u019a\u019b\u0005n\u0000\u0000"+ + "\u019b\u019c\u0005h\u0000\u0000\u019c\u019d\u0005a\u0000\u0000\u019d\u019e"+ + "\u0005l\u0000\u0000\u019e\u019f\u0005e\u0000\u0000\u019f\u000f\u0001\u0000"+ + "\u0000\u0000\u01a0\u01a1\u0005e\u0000\u0000\u01a1\u01a2\u0005x\u0000\u0000"+ + "\u01a2\u01a3\u0005h\u0000\u0000\u01a3\u01a4\u0005a\u0000\u0000\u01a4\u01a5"+ + "\u0005l\u0000\u0000\u01a5\u01a6\u0005e\u0000\u0000\u01a6\u0011\u0001\u0000"+ + "\u0000\u0000\u01a7\u01a8\u0005r\u0000\u0000\u01a8\u01a9\u0005e\u0000\u0000"+ + "\u01a9\u01aa\u0005q\u0000\u0000\u01aa\u01ab\u0005u\u0000\u0000\u01ab\u01ac"+ + "\u0005i\u0000\u0000\u01ac\u01ad\u0005r\u0000\u0000\u01ad\u01ae\u0005e"+ + "\u0000\u0000\u01ae\u01af\u0005s\u0000\u0000\u01af\u0013\u0001\u0000\u0000"+ + "\u0000\u01b0\u01b1\u0005p\u0000\u0000\u01b1\u01b2\u0005r\u0000\u0000\u01b2"+ + "\u01b3\u0005e\u0000\u0000\u01b3\u01b4\u0005s\u0000\u0000\u01b4\u01b5\u0005"+ + "e\u0000\u0000\u01b5\u01b6\u0005r\u0000\u0000\u01b6\u01b7\u0005v\u0000"+ + "\u0000\u01b7\u01b8\u0005e\u0000\u0000\u01b8\u01b9\u0005s\u0000\u0000\u01b9"+ + "\u0015\u0001\u0000\u0000\u0000\u01ba\u01bb\u0005e\u0000\u0000\u01bb\u01bc"+ + "\u0005n\u0000\u0000\u01bc\u01bd\u0005s\u0000\u0000\u01bd\u01be\u0005u"+ + "\u0000\u0000\u01be\u01bf\u0005r\u0000\u0000\u01bf\u01c0\u0005e\u0000\u0000"+ + "\u01c0\u01c1\u0005s\u0000\u0000\u01c1\u0017\u0001\u0000\u0000\u0000\u01c2"+ + "\u01c3\u0005i\u0000\u0000\u01c3\u01c4\u0005n\u0000\u0000\u01c4\u01c5\u0005"+ + "v\u0000\u0000\u01c5\u01c6\u0005a\u0000\u0000\u01c6\u01c7\u0005r\u0000"+ + "\u0000\u01c7\u01c8\u0005i\u0000\u0000\u01c8\u01c9\u0005a\u0000\u0000\u01c9"+ + "\u01ca\u0005n\u0000\u0000\u01ca\u01cb\u0005t\u0000\u0000\u01cb\u0019\u0001"+ + "\u0000\u0000\u0000\u01cc\u01cd\u0005d\u0000\u0000\u01cd\u01ce\u0005e\u0000"+ + "\u0000\u01ce\u01cf\u0005c\u0000\u0000\u01cf\u01d0\u0005r\u0000\u0000\u01d0"+ + "\u01d1\u0005e\u0000\u0000\u01d1\u01d2\u0005a\u0000\u0000\u01d2\u01d3\u0005"+ + "s\u0000\u0000\u01d3\u01d4\u0005e\u0000\u0000\u01d4\u01d5\u0005s\u0000"+ + "\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0006\f\u0000\u0000"+ + "\u01d7\u001b\u0001\u0000\u0000\u0000\u01d8\u01d9\u0005p\u0000\u0000\u01d9"+ + "\u01da\u0005u\u0000\u0000\u01da\u01db\u0005r\u0000\u0000\u01db\u01dc\u0005"+ + "e\u0000\u0000\u01dc\u01dd\u0001\u0000\u0000\u0000\u01dd\u01de\u0006\r"+ + "\u0000\u0000\u01de\u001d\u0001\u0000\u0000\u0000\u01df\u01e0\u0005i\u0000"+ + "\u0000\u01e0\u01e1\u0005m\u0000\u0000\u01e1\u01e2\u0005p\u0000\u0000\u01e2"+ + "\u01e3\u0005l\u0000\u0000\u01e3\u01e4\u0005e\u0000\u0000\u01e4\u01e5\u0005"+ + "m\u0000\u0000\u01e5\u01e6\u0005e\u0000\u0000\u01e6\u01e7\u0005n\u0000"+ + "\u0000\u01e7\u01e8\u0005t\u0000\u0000\u01e8\u01e9\u0005s\u0000\u0000\u01e9"+ + "\u001f\u0001\u0000\u0000\u0000\u01ea\u01eb\u0005a\u0000\u0000\u01eb\u01ec"+ + "\u0005s\u0000\u0000\u01ec!\u0001\u0000\u0000\u0000\u01ed\u01ee\u0005o"+ + "\u0000\u0000\u01ee\u01ef\u0005l\u0000\u0000\u01ef\u01f0\u0005d\u0000\u0000"+ + "\u01f0\u01f1\u0001\u0000\u0000\u0000\u01f1\u01f2\u0006\u0010\u0000\u0000"+ + "\u01f2#\u0001\u0000\u0000\u0000\u01f3\u01f4\u0005b\u0000\u0000\u01f4\u01f5"+ + "\u0005e\u0000\u0000\u01f5\u01f6\u0005f\u0000\u0000\u01f6\u01f7\u0005o"+ + "\u0000\u0000\u01f7\u01f8\u0005r\u0000\u0000\u01f8\u01f9\u0005e\u0000\u0000"+ + "\u01f9\u01fa\u0001\u0000\u0000\u0000\u01fa\u01fb\u0006\u0011\u0000\u0000"+ + "\u01fb%\u0001\u0000\u0000\u0000\u01fc\u01fd\u0005#\u0000\u0000\u01fd\u01fe"+ + "\u0005l\u0000\u0000\u01fe\u01ff\u0005h\u0000\u0000\u01ff\u0200\u0005s"+ + "\u0000\u0000\u0200\'\u0001\u0000\u0000\u0000\u0201\u0202\u0005f\u0000"+ + "\u0000\u0202\u0203\u0005o\u0000\u0000\u0203\u0204\u0005r\u0000\u0000\u0204"+ + "\u0205\u0005a\u0000\u0000\u0205\u0206\u0005l\u0000\u0000\u0206\u0207\u0005"+ + "l\u0000\u0000\u0207)\u0001\u0000\u0000\u0000\u0208\u0209\u0005e\u0000"+ + "\u0000\u0209\u020a\u0005x\u0000\u0000\u020a\u020b\u0005i\u0000\u0000\u020b"+ + "\u020c\u0005s\u0000\u0000\u020c\u020d\u0005t\u0000\u0000\u020d\u020e\u0005"+ + "s\u0000\u0000\u020e+\u0001\u0000\u0000\u0000\u020f\u0210\u0005a\u0000"+ + "\u0000\u0210\u0211\u0005c\u0000\u0000\u0211\u0212\u0005c\u0000\u0000\u0212"+ + "\u0213\u0001\u0000\u0000\u0000\u0213\u0214\u0006\u0015\u0000\u0000\u0214"+ + "-\u0001\u0000\u0000\u0000\u0215\u0216\u0005f\u0000\u0000\u0216\u0217\u0005"+ + "o\u0000\u0000\u0217\u0218\u0005l\u0000\u0000\u0218\u0219\u0005d\u0000"+ + "\u0000\u0219/\u0001\u0000\u0000\u0000\u021a\u021b\u0005u\u0000\u0000\u021b"+ + "\u021c\u0005n\u0000\u0000\u021c\u021d\u0005f\u0000\u0000\u021d\u021e\u0005"+ + "o\u0000\u0000\u021e\u021f\u0005l\u0000\u0000\u021f\u0220\u0005d\u0000"+ + "\u0000\u02201\u0001\u0000\u0000\u0000\u0221\u0222\u0005u\u0000\u0000\u0222"+ + "\u0223\u0005n\u0000\u0000\u0223\u0224\u0005f\u0000\u0000\u0224\u0225\u0005"+ + "o\u0000\u0000\u0225\u0226\u0005l\u0000\u0000\u0226\u0227\u0005d\u0000"+ + "\u0000\u0227\u0228\u0005i\u0000\u0000\u0228\u0229\u0005n\u0000\u0000\u0229"+ + "\u022a\u0005g\u0000\u0000\u022a3\u0001\u0000\u0000\u0000\u022b\u022c\u0005"+ + "l\u0000\u0000\u022c\u022d\u0005e\u0000\u0000\u022d\u022e\u0005t\u0000"+ + "\u0000\u022e5\u0001\u0000\u0000\u0000\u022f\u0230\u0005g\u0000\u0000\u0230"+ + "\u0231\u0005h\u0000\u0000\u0231\u0232\u0005o\u0000\u0000\u0232\u0233\u0005"+ + "s\u0000\u0000\u0233\u0234\u0005t\u0000\u0000\u02347\u0001\u0000\u0000"+ + "\u0000\u0235\u0236\u0005i\u0000\u0000\u0236\u0237\u0005n\u0000\u0000\u0237"+ + "9\u0001\u0000\u0000\u0000\u0238\u0239\u0005#\u0000\u0000\u0239;\u0001"+ + "\u0000\u0000\u0000\u023a\u023b\u0005s\u0000\u0000\u023b\u023c\u0005u\u0000"+ + "\u0000\u023c\u023d\u0005b\u0000\u0000\u023d\u023e\u0005s\u0000\u0000\u023e"+ + "\u023f\u0005e\u0000\u0000\u023f\u0240\u0005t\u0000\u0000\u0240=\u0001"+ + "\u0000\u0000\u0000\u0241\u0242\u0005u\u0000\u0000\u0242\u0243\u0005n\u0000"+ + "\u0000\u0243\u0244\u0005i\u0000\u0000\u0244\u0245\u0005o\u0000\u0000\u0245"+ + "\u0246\u0005n\u0000\u0000\u0246?\u0001\u0000\u0000\u0000\u0247\u0248\u0005"+ + "i\u0000\u0000\u0248\u0249\u0005n\u0000\u0000\u0249\u024a\u0005t\u0000"+ + "\u0000\u024a\u024b\u0005e\u0000\u0000\u024b\u024c\u0005r\u0000\u0000\u024c"+ + "\u024d\u0005s\u0000\u0000\u024d\u024e\u0005e\u0000\u0000\u024e\u024f\u0005"+ + "c\u0000\u0000\u024f\u0250\u0005t\u0000\u0000\u0250\u0251\u0005i\u0000"+ + "\u0000\u0251\u0252\u0005o\u0000\u0000\u0252\u0253\u0005n\u0000\u0000\u0253"+ + "A\u0001\u0000\u0000\u0000\u0254\u0255\u0005s\u0000\u0000\u0255\u0256\u0005"+ + "e\u0000\u0000\u0256\u0257\u0005t\u0000\u0000\u0257\u0258\u0005m\u0000"+ + "\u0000\u0258\u0259\u0005i\u0000\u0000\u0259\u025a\u0005n\u0000\u0000\u025a"+ + "\u025b\u0005u\u0000\u0000\u025b\u025c\u0005s\u0000\u0000\u025cC\u0001"+ + "\u0000\u0000\u0000\u025d\u025e\u0005=\u0000\u0000\u025e\u025f\u0005=\u0000"+ + "\u0000\u025f\u0260\u0005>\u0000\u0000\u0260E\u0001\u0000\u0000\u0000\u0261"+ + "\u0262\u0005-\u0000\u0000\u0262\u0263\u0005-\u0000\u0000\u0263\u0264\u0005"+ + "*\u0000\u0000\u0264G\u0001\u0000\u0000\u0000\u0265\u0266\u0005a\u0000"+ + "\u0000\u0266\u0267\u0005p\u0000\u0000\u0267\u0268\u0005p\u0000\u0000\u0268"+ + "\u0269\u0005l\u0000\u0000\u0269\u026a\u0005y\u0000\u0000\u026aI\u0001"+ + "\u0000\u0000\u0000\u026b\u026c\u0005?\u0000\u0000\u026cK\u0001\u0000\u0000"+ + "\u0000\u026d\u026e\u0005!\u0000\u0000\u026e\u026f\u0005<\u0000\u0000\u026f"+ + "M\u0001\u0000\u0000\u0000\u0270\u0271\u0005!\u0000\u0000\u0271\u0272\u0005"+ + ">\u0000\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0274\u0006&\u0000"+ + "\u0000\u0274O\u0001\u0000\u0000\u0000\u0275\u0276\u0005s\u0000\u0000\u0276"+ + "\u0277\u0005e\u0000\u0000\u0277\u0278\u0005q\u0000\u0000\u0278\u0279\u0001"+ + "\u0000\u0000\u0000\u0279\u027a\u0006\'\u0000\u0000\u027aQ\u0001\u0000"+ + "\u0000\u0000\u027b\u027c\u0005s\u0000\u0000\u027c\u027d\u0005e\u0000\u0000"+ + "\u027d\u027e\u0005t\u0000\u0000\u027e\u027f\u0001\u0000\u0000\u0000\u027f"+ + "\u0280\u0006(\u0000\u0000\u0280S\u0001\u0000\u0000\u0000\u0281\u0282\u0005"+ + "m\u0000\u0000\u0282\u0283\u0005s\u0000\u0000\u0283\u0284\u0005e\u0000"+ + "\u0000\u0284\u0285\u0005t\u0000\u0000\u0285\u0286\u0001\u0000\u0000\u0000"+ + "\u0286\u0287\u0006)\u0000\u0000\u0287U\u0001\u0000\u0000\u0000\u0288\u0289"+ + "\u0005d\u0000\u0000\u0289\u028a\u0005i\u0000\u0000\u028a\u028b\u0005c"+ + "\u0000\u0000\u028b\u028c\u0005t\u0000\u0000\u028c\u028d\u0001\u0000\u0000"+ + "\u0000\u028d\u028e\u0006*\u0000\u0000\u028eW\u0001\u0000\u0000\u0000\u028f"+ + "\u0290\u0005o\u0000\u0000\u0290\u0291\u0005p\u0000\u0000\u0291\u0292\u0005"+ + "t\u0000\u0000\u0292\u0293\u0005i\u0000\u0000\u0293\u0294\u0005o\u0000"+ + "\u0000\u0294\u0295\u0005n\u0000\u0000\u0295\u0296\u0001\u0000\u0000\u0000"+ + "\u0296\u0297\u0006+\u0000\u0000\u0297Y\u0001\u0000\u0000\u0000\u0298\u0299"+ + "\u0005l\u0000\u0000\u0299\u029a\u0005e\u0000\u0000\u029a\u029b\u0005n"+ + "\u0000\u0000\u029b\u029c\u0001\u0000\u0000\u0000\u029c\u029d\u0006,\u0000"+ + "\u0000\u029d[\u0001\u0000\u0000\u0000\u029e\u029f\u0005n\u0000\u0000\u029f"+ + "\u02a0\u0005e\u0000\u0000\u02a0\u02a1\u0005w\u0000\u0000\u02a1\u02a2\u0001"+ + "\u0000\u0000\u0000\u02a2\u02a3\u0006-\u0000\u0000\u02a3]\u0001\u0000\u0000"+ + "\u0000\u02a4\u02a5\u0005m\u0000\u0000\u02a5\u02a6\u0005a\u0000\u0000\u02a6"+ + "\u02a7\u0005k\u0000\u0000\u02a7\u02a8\u0005e\u0000\u0000\u02a8\u02a9\u0001"+ + "\u0000\u0000\u0000\u02a9\u02aa\u0006.\u0000\u0000\u02aa_\u0001\u0000\u0000"+ + "\u0000\u02ab\u02ac\u0005c\u0000\u0000\u02ac\u02ad\u0005a\u0000\u0000\u02ad"+ + "\u02ae\u0005p\u0000\u0000\u02ae\u02af\u0001\u0000\u0000\u0000\u02af\u02b0"+ + "\u0006/\u0000\u0000\u02b0a\u0001\u0000\u0000\u0000\u02b1\u02b2\u0005s"+ + "\u0000\u0000\u02b2\u02b3\u0005o\u0000\u0000\u02b3\u02b4\u0005m\u0000\u0000"+ + "\u02b4\u02b5\u0005e\u0000\u0000\u02b5\u02b6\u0001\u0000\u0000\u0000\u02b6"+ + "\u02b7\u00060\u0000\u0000\u02b7c\u0001\u0000\u0000\u0000\u02b8\u02b9\u0005"+ + "g\u0000\u0000\u02b9\u02ba\u0005e\u0000\u0000\u02ba\u02bb\u0005t\u0000"+ + "\u0000\u02bb\u02bc\u0001\u0000\u0000\u0000\u02bc\u02bd\u00061\u0000\u0000"+ + "\u02bde\u0001\u0000\u0000\u0000\u02be\u02bf\u0005d\u0000\u0000\u02bf\u02c0"+ + "\u0005o\u0000\u0000\u02c0\u02c1\u0005m\u0000\u0000\u02c1\u02c2\u0005a"+ + "\u0000\u0000\u02c2\u02c3\u0005i\u0000\u0000\u02c3\u02c4\u0005n\u0000\u0000"+ + "\u02c4\u02c5\u0001\u0000\u0000\u0000\u02c5\u02c6\u00062\u0000\u0000\u02c6"+ + "g\u0001\u0000\u0000\u0000\u02c7\u02c8\u0005a\u0000\u0000\u02c8\u02c9\u0005"+ + "x\u0000\u0000\u02c9\u02ca\u0005i\u0000\u0000\u02ca\u02cb\u0005o\u0000"+ + "\u0000\u02cb\u02cc\u0005m\u0000\u0000\u02cc\u02cd\u0001\u0000\u0000\u0000"+ + "\u02cd\u02ce\u00063\u0000\u0000\u02cei\u0001\u0000\u0000\u0000\u02cf\u02d0"+ + "\u0005a\u0000\u0000\u02d0\u02d1\u0005d\u0000\u0000\u02d1\u02d2\u0005t"+ + "\u0000\u0000\u02d2\u02d3\u0001\u0000\u0000\u0000\u02d3\u02d4\u00064\u0000"+ + "\u0000\u02d4k\u0001\u0000\u0000\u0000\u02d5\u02d6\u0005m\u0000\u0000\u02d6"+ + "\u02d7\u0005a\u0000\u0000\u02d7\u02d8\u0005t\u0000\u0000\u02d8\u02d9\u0005"+ + "c\u0000\u0000\u02d9\u02da\u0005h\u0000\u0000\u02da\u02db\u0001\u0000\u0000"+ + "\u0000\u02db\u02dc\u00065\u0000\u0000\u02dcm\u0001\u0000\u0000\u0000\u02dd"+ + "\u02de\u0005n\u0000\u0000\u02de\u02df\u0005o\u0000\u0000\u02df\u02e0\u0005"+ + "n\u0000\u0000\u02e0\u02e1\u0005e\u0000\u0000\u02e1\u02e2\u0001\u0000\u0000"+ + "\u0000\u02e2\u02e3\u00066\u0000\u0000\u02e3o\u0001\u0000\u0000\u0000\u02e4"+ + "\u02e5\u0005p\u0000\u0000\u02e5\u02e6\u0005r\u0000\u0000\u02e6\u02e7\u0005"+ + "e\u0000\u0000\u02e7\u02e8\u0005d\u0000\u0000\u02e8q\u0001\u0000\u0000"+ + "\u0000\u02e9\u02ea\u0005t\u0000\u0000\u02ea\u02eb\u0005y\u0000\u0000\u02eb"+ + "\u02ec\u0005p\u0000\u0000\u02ec\u02ed\u0005e\u0000\u0000\u02ed\u02ee\u0005"+ + "O\u0000\u0000\u02ee\u02ef\u0005f\u0000\u0000\u02ef\u02f0\u0001\u0000\u0000"+ + "\u0000\u02f0\u02f1\u00068\u0000\u0000\u02f1s\u0001\u0000\u0000\u0000\u02f2"+ + "\u02f3\u0005i\u0000\u0000\u02f3\u02f4\u0005s\u0000\u0000\u02f4\u02f5\u0005"+ + "C\u0000\u0000\u02f5\u02f6\u0005o\u0000\u0000\u02f6\u02f7\u0005m\u0000"+ + "\u0000\u02f7\u02f8\u0005p\u0000\u0000\u02f8\u02f9\u0005a\u0000\u0000\u02f9"+ + "\u02fa\u0005r\u0000\u0000\u02fa\u02fb\u0005a\u0000\u0000\u02fb\u02fc\u0005"+ + "b\u0000\u0000\u02fc\u02fd\u0005l\u0000\u0000\u02fd\u02fe\u0005e\u0000"+ + "\u0000\u02fe\u02ff\u0001\u0000\u0000\u0000\u02ff\u0300\u00069\u0000\u0000"+ + "\u0300u\u0001\u0000\u0000\u0000\u0301\u0302\u0005s\u0000\u0000\u0302\u0303"+ + "\u0005h\u0000\u0000\u0303\u0304\u0005a\u0000\u0000\u0304\u0305\u0005r"+ + "\u0000\u0000\u0305\u0306\u0005e\u0000\u0000\u0306w\u0001\u0000\u0000\u0000"+ + "\u0307\u0308\u0005@\u0000\u0000\u0308\u0309\u0001\u0000\u0000\u0000\u0309"+ + "\u030a\u0006;\u0000\u0000\u030ay\u0001\u0000\u0000\u0000\u030b\u030c\u0005"+ + ".\u0000\u0000\u030c\u030d\u0005.\u0000\u0000\u030d{\u0001\u0000\u0000"+ + "\u0000\u030e\u030f\u0005s\u0000\u0000\u030f\u0310\u0005h\u0000\u0000\u0310"+ + "\u0311\u0005a\u0000\u0000\u0311\u0312\u0005r\u0000\u0000\u0312\u0313\u0005"+ + "e\u0000\u0000\u0313\u0314\u0005d\u0000\u0000\u0314}\u0001\u0000\u0000"+ + "\u0000\u0315\u0316\u0005e\u0000\u0000\u0316\u0317\u0005x\u0000\u0000\u0317"+ + "\u0318\u0005c\u0000\u0000\u0318\u0319\u0005l\u0000\u0000\u0319\u031a\u0005"+ + "u\u0000\u0000\u031a\u031b\u0005s\u0000\u0000\u031b\u031c\u0005i\u0000"+ + "\u0000\u031c\u031d\u0005v\u0000\u0000\u031d\u031e\u0005e\u0000\u0000\u031e"+ + "\u007f\u0001\u0000\u0000\u0000\u031f\u0320\u0005p\u0000\u0000\u0320\u0321"+ + "\u0005r\u0000\u0000\u0321\u0322\u0005e\u0000\u0000\u0322\u0323\u0005d"+ + "\u0000\u0000\u0323\u0324\u0005i\u0000\u0000\u0324\u0325\u0005c\u0000\u0000"+ + "\u0325\u0326\u0005a\u0000\u0000\u0326\u0327\u0005t\u0000\u0000\u0327\u0328"+ + "\u0005e\u0000\u0000\u0328\u0081\u0001\u0000\u0000\u0000\u0329\u032a\u0005"+ + "w\u0000\u0000\u032a\u032b\u0005r\u0000\u0000\u032b\u032c\u0005i\u0000"+ + "\u0000\u032c\u032d\u0005t\u0000\u0000\u032d\u032e\u0005e\u0000\u0000\u032e"+ + "\u032f\u0005P\u0000\u0000\u032f\u0330\u0005e\u0000\u0000\u0330\u0331\u0005"+ + "r\u0000\u0000\u0331\u0332\u0005m\u0000\u0000\u0332\u0333\u0001\u0000\u0000"+ + "\u0000\u0333\u0334\u0006@\u0000\u0000\u0334\u0083\u0001\u0000\u0000\u0000"+ + "\u0335\u0336\u0005n\u0000\u0000\u0336\u0337\u0005o\u0000\u0000\u0337\u0338"+ + "\u0005P\u0000\u0000\u0338\u0339\u0005e\u0000\u0000\u0339\u033a\u0005r"+ + "\u0000\u0000\u033a\u033b\u0005m\u0000\u0000\u033b\u033c\u0001\u0000\u0000"+ + "\u0000\u033c\u033d\u0006A\u0000\u0000\u033d\u0085\u0001\u0000\u0000\u0000"+ + "\u033e\u033f\u0005t\u0000\u0000\u033f\u0340\u0005r\u0000\u0000\u0340\u0341"+ + "\u0005u\u0000\u0000\u0341\u0342\u0005s\u0000\u0000\u0342\u0343\u0005t"+ + "\u0000\u0000\u0343\u0344\u0005e\u0000\u0000\u0344\u0345\u0005d\u0000\u0000"+ + "\u0345\u0346\u0001\u0000\u0000\u0000\u0346\u0347\u0006B\u0000\u0000\u0347"+ + "\u0087\u0001\u0000\u0000\u0000\u0348\u0349\u0005o\u0000\u0000\u0349\u034a"+ + "\u0005u\u0000\u0000\u034a\u034b\u0005t\u0000\u0000\u034b\u034c\u0005l"+ + "\u0000\u0000\u034c\u034d\u0005i\u0000\u0000\u034d\u034e\u0005n\u0000\u0000"+ + "\u034e\u034f\u0005e\u0000\u0000\u034f\u0089\u0001\u0000\u0000\u0000\u0350"+ + "\u0351\u0005i\u0000\u0000\u0351\u0352\u0005n\u0000\u0000\u0352\u0353\u0005"+ + "i\u0000\u0000\u0353\u0354\u0005t\u0000\u0000\u0354\u0355\u0005E\u0000"+ + "\u0000\u0355\u0356\u0005n\u0000\u0000\u0356\u0357\u0005s\u0000\u0000\u0357"+ + "\u0358\u0005u\u0000\u0000\u0358\u0359\u0005r\u0000\u0000\u0359\u035a\u0005"+ + "e\u0000\u0000\u035a\u035b\u0005s\u0000\u0000\u035b\u008b\u0001\u0000\u0000"+ + "\u0000\u035c\u035d\u0005i\u0000\u0000\u035d\u035e\u0005m\u0000\u0000\u035e"+ + "\u035f\u0005p\u0000\u0000\u035f\u0360\u0005o\u0000\u0000\u0360\u0361\u0005"+ + "r\u0000\u0000\u0361\u0362\u0005t\u0000\u0000\u0362\u0363\u0005R\u0000"+ + "\u0000\u0363\u0364\u0005e\u0000\u0000\u0364\u0365\u0005q\u0000\u0000\u0365"+ + "\u0366\u0005u\u0000\u0000\u0366\u0367\u0005i\u0000\u0000\u0367\u0368\u0005"+ + "r\u0000\u0000\u0368\u0369\u0005e\u0000\u0000\u0369\u036a\u0005s\u0000"+ + "\u0000\u036a\u008d\u0001\u0000\u0000\u0000\u036b\u036c\u0005p\u0000\u0000"+ + "\u036c\u036d\u0005r\u0000\u0000\u036d\u036e\u0005o\u0000\u0000\u036e\u036f"+ + "\u0005o\u0000\u0000\u036f\u0370\u0005f\u0000\u0000\u0370\u008f\u0001\u0000"+ + "\u0000\u0000\u0371\u0372\u0005=\u0000\u0000\u0372\u0373\u0005=\u0000\u0000"+ + "\u0373\u0374\u0005=\u0000\u0000\u0374\u0091\u0001\u0000\u0000\u0000\u0375"+ + "\u0376\u0005!\u0000\u0000\u0376\u0377\u0005=\u0000\u0000\u0377\u0378\u0005"+ + "=\u0000\u0000\u0378\u0093\u0001\u0000\u0000\u0000\u0379\u037a\u0005w\u0000"+ + "\u0000\u037a\u037b\u0005i\u0000\u0000\u037b\u037c\u0005t\u0000\u0000\u037c"+ + "\u037d\u0005h\u0000\u0000\u037d\u0095\u0001\u0000\u0000\u0000\u037e\u037f"+ + "\u0005o\u0000\u0000\u037f\u0380\u0005p\u0000\u0000\u0380\u0381\u0005a"+ + "\u0000\u0000\u0381\u0382\u0005q\u0000\u0000\u0382\u0383\u0005u\u0000\u0000"+ + "\u0383\u0384\u0005e\u0000\u0000\u0384\u0385\u0001\u0000\u0000\u0000\u0385"+ + "\u0386\u0006J\u0000\u0000\u0386\u0097\u0001\u0000\u0000\u0000\u0387\u0388"+ + "\u0005r\u0000\u0000\u0388\u0389\u0005e\u0000\u0000\u0389\u038a\u0005v"+ + "\u0000\u0000\u038a\u038b\u0005e\u0000\u0000\u038b\u038c\u0005a\u0000\u0000"+ + "\u038c\u038d\u0005l\u0000\u0000\u038d\u0099\u0001\u0000\u0000\u0000\u038e"+ + "\u038f\u0005#\u0000\u0000\u038f\u0390\u0005b\u0000\u0000\u0390\u0391\u0005"+ + "a\u0000\u0000\u0391\u0392\u0005c\u0000\u0000\u0392\u0393\u0005k\u0000"+ + "\u0000\u0393\u0394\u0005e\u0000\u0000\u0394\u0395\u0005n\u0000\u0000\u0395"+ + "\u0396\u0005d\u0000\u0000\u0396\u009b\u0001\u0000\u0000\u0000\u0397\u0398"+ + "\u0005b\u0000\u0000\u0398\u0399\u0005r\u0000\u0000\u0399\u039a\u0005e"+ + "\u0000\u0000\u039a\u039b\u0005a\u0000\u0000\u039b\u039c\u0005k\u0000\u0000"+ + "\u039c\u039d\u0001\u0000\u0000\u0000\u039d\u039e\u0006M\u0000\u0000\u039e"+ + "\u009d\u0001\u0000\u0000\u0000\u039f\u03a0\u0005d\u0000\u0000\u03a0\u03a1"+ + "\u0005e\u0000\u0000\u03a1\u03a2\u0005f\u0000\u0000\u03a2\u03a3\u0005a"+ + "\u0000\u0000\u03a3\u03a4\u0005u\u0000\u0000\u03a4\u03a5\u0005l\u0000\u0000"+ + "\u03a5\u03a6\u0005t\u0000\u0000\u03a6\u009f\u0001\u0000\u0000\u0000\u03a7"+ + "\u03a8\u0005f\u0000\u0000\u03a8\u03a9\u0005u\u0000\u0000\u03a9\u03aa\u0005"+ + "n\u0000\u0000\u03aa\u03ab\u0005c\u0000\u0000\u03ab\u00a1\u0001\u0000\u0000"+ + "\u0000\u03ac\u03ad\u0005i\u0000\u0000\u03ad\u03ae\u0005n\u0000\u0000\u03ae"+ + "\u03af\u0005t\u0000\u0000\u03af\u03b0\u0005e\u0000\u0000\u03b0\u03b1\u0005"+ + "r\u0000\u0000\u03b1\u03b2\u0005f\u0000\u0000\u03b2\u03b3\u0005a\u0000"+ + "\u0000\u03b3\u03b4\u0005c\u0000\u0000\u03b4\u03b5\u0005e\u0000\u0000\u03b5"+ + "\u00a3\u0001\u0000\u0000\u0000\u03b6\u03b7\u0005s\u0000\u0000\u03b7\u03b8"+ + "\u0005e\u0000\u0000\u03b8\u03b9\u0005l\u0000\u0000\u03b9\u03ba\u0005e"+ + "\u0000\u0000\u03ba\u03bb\u0005c\u0000\u0000\u03bb\u03bc\u0005t\u0000\u0000"+ + "\u03bc\u00a5\u0001\u0000\u0000\u0000\u03bd\u03be\u0005c\u0000\u0000\u03be"+ + "\u03bf\u0005a\u0000\u0000\u03bf\u03c0\u0005s\u0000\u0000\u03c0\u03c1\u0005"+ + "e\u0000\u0000\u03c1\u00a7\u0001\u0000\u0000\u0000\u03c2\u03c3\u0005d\u0000"+ + "\u0000\u03c3\u03c4\u0005e\u0000\u0000\u03c4\u03c5\u0005f\u0000\u0000\u03c5"+ + "\u03c6\u0005e\u0000\u0000\u03c6\u03c7\u0005r\u0000\u0000\u03c7\u00a9\u0001"+ + "\u0000\u0000\u0000\u03c8\u03c9\u0005g\u0000\u0000\u03c9\u03ca\u0005o\u0000"+ + "\u0000\u03ca\u00ab\u0001\u0000\u0000\u0000\u03cb\u03cc\u0005m\u0000\u0000"+ + "\u03cc\u03cd\u0005a\u0000\u0000\u03cd\u03ce\u0005p\u0000\u0000\u03ce\u00ad"+ + "\u0001\u0000\u0000\u0000\u03cf\u03d0\u0005s\u0000\u0000\u03d0\u03d1\u0005"+ + "t\u0000\u0000\u03d1\u03d2\u0005r\u0000\u0000\u03d2\u03d3\u0005u\u0000"+ + "\u0000\u03d3\u03d4\u0005c\u0000\u0000\u03d4\u03d5\u0005t\u0000\u0000\u03d5"+ + "\u00af\u0001\u0000\u0000\u0000\u03d6\u03d7\u0005c\u0000\u0000\u03d7\u03d8"+ + "\u0005h\u0000\u0000\u03d8\u03d9\u0005a\u0000\u0000\u03d9\u03da\u0005n"+ + "\u0000\u0000\u03da\u00b1\u0001\u0000\u0000\u0000\u03db\u03dc\u0005e\u0000"+ + "\u0000\u03dc\u03dd\u0005l\u0000\u0000\u03dd\u03de\u0005s\u0000\u0000\u03de"+ + "\u03df\u0005e\u0000\u0000\u03df\u00b3\u0001\u0000\u0000\u0000\u03e0\u03e1"+ + "\u0005g\u0000\u0000\u03e1\u03e2\u0005o\u0000\u0000\u03e2\u03e3\u0005t"+ + "\u0000\u0000\u03e3\u03e4\u0005o\u0000\u0000\u03e4\u00b5\u0001\u0000\u0000"+ + "\u0000\u03e5\u03e6\u0005p\u0000\u0000\u03e6\u03e7\u0005a\u0000\u0000\u03e7"+ + "\u03e8\u0005c\u0000\u0000\u03e8\u03e9\u0005k\u0000\u0000\u03e9\u03ea\u0005"+ + "a\u0000\u0000\u03ea\u03eb\u0005g\u0000\u0000\u03eb\u03ec\u0005e\u0000"+ + "\u0000\u03ec\u00b7\u0001\u0000\u0000\u0000\u03ed\u03ee\u0005s\u0000\u0000"+ + "\u03ee\u03ef\u0005w\u0000\u0000\u03ef\u03f0\u0005i\u0000\u0000\u03f0\u03f1"+ + "\u0005t\u0000\u0000\u03f1\u03f2\u0005c\u0000\u0000\u03f2\u03f3\u0005h"+ + "\u0000\u0000\u03f3\u00b9\u0001\u0000\u0000\u0000\u03f4\u03f5\u0005c\u0000"+ + "\u0000\u03f5\u03f6\u0005o\u0000\u0000\u03f6\u03f7\u0005n\u0000\u0000\u03f7"+ + "\u03f8\u0005s\u0000\u0000\u03f8\u03f9\u0005t\u0000\u0000\u03f9\u00bb\u0001"+ + "\u0000\u0000\u0000\u03fa\u03fb\u0005f\u0000\u0000\u03fb\u03fc\u0005a\u0000"+ + "\u0000\u03fc\u03fd\u0005l\u0000\u0000\u03fd\u03fe\u0005l\u0000\u0000\u03fe"+ + "\u03ff\u0005t\u0000\u0000\u03ff\u0400\u0005h\u0000\u0000\u0400\u0401\u0005"+ + "r\u0000\u0000\u0401\u0402\u0005o\u0000\u0000\u0402\u0403\u0005u\u0000"+ + "\u0000\u0403\u0404\u0005g\u0000\u0000\u0404\u0405\u0005h\u0000\u0000\u0405"+ + "\u0406\u0001\u0000\u0000\u0000\u0406\u0407\u0006]\u0000\u0000\u0407\u00bd"+ + "\u0001\u0000\u0000\u0000\u0408\u0409\u0005i\u0000\u0000\u0409\u040a\u0005"+ + "f\u0000\u0000\u040a\u00bf\u0001\u0000\u0000\u0000\u040b\u040c\u0005r\u0000"+ + "\u0000\u040c\u040d\u0005a\u0000\u0000\u040d\u040e\u0005n\u0000\u0000\u040e"+ + "\u040f\u0005g\u0000\u0000\u040f\u0410\u0005e\u0000\u0000\u0410\u00c1\u0001"+ + "\u0000\u0000\u0000\u0411\u0412\u0005t\u0000\u0000\u0412\u0413\u0005y\u0000"+ + "\u0000\u0413\u0414\u0005p\u0000\u0000\u0414\u0415\u0005e\u0000\u0000\u0415"+ + "\u00c3\u0001\u0000\u0000\u0000\u0416\u0417\u0005c\u0000\u0000\u0417\u0418"+ + "\u0005o\u0000\u0000\u0418\u0419\u0005n\u0000\u0000\u0419\u041a\u0005t"+ + "\u0000\u0000\u041a\u041b\u0005i\u0000\u0000\u041b\u041c\u0005n\u0000\u0000"+ + "\u041c\u041d\u0005u\u0000\u0000\u041d\u041e\u0005e\u0000\u0000\u041e\u041f"+ + "\u0001\u0000\u0000\u0000\u041f\u0420\u0006a\u0000\u0000\u0420\u00c5\u0001"+ + "\u0000\u0000\u0000\u0421\u0422\u0005f\u0000\u0000\u0422\u0423\u0005o\u0000"+ + "\u0000\u0423\u0424\u0005r\u0000\u0000\u0424\u00c7\u0001\u0000\u0000\u0000"+ + "\u0425\u0426\u0005i\u0000\u0000\u0426\u0427\u0005m\u0000\u0000\u0427\u0428"+ + "\u0005p\u0000\u0000\u0428\u0429\u0005o\u0000\u0000\u0429\u042a\u0005r"+ + "\u0000\u0000\u042a\u042b\u0005t\u0000\u0000\u042b\u00c9\u0001\u0000\u0000"+ + "\u0000\u042c\u042d\u0005r\u0000\u0000\u042d\u042e\u0005e\u0000\u0000\u042e"+ + "\u042f\u0005t\u0000\u0000\u042f\u0430\u0005u\u0000\u0000\u0430\u0431\u0005"+ + "r\u0000\u0000\u0431\u0432\u0005n\u0000\u0000\u0432\u0433\u0001\u0000\u0000"+ + "\u0000\u0433\u0434\u0006d\u0000\u0000\u0434\u00cb\u0001\u0000\u0000\u0000"+ + "\u0435\u0436\u0005v\u0000\u0000\u0436\u0437\u0005a\u0000\u0000\u0437\u0438"+ + "\u0005r\u0000\u0000\u0438\u00cd\u0001\u0000\u0000\u0000\u0439\u043a\u0005"+ + "n\u0000\u0000\u043a\u043b\u0005i\u0000\u0000\u043b\u043c\u0005l\u0000"+ + "\u0000\u043c\u043d\u0001\u0000\u0000\u0000\u043d\u043e\u0006f\u0000\u0000"+ + "\u043e\u00cf\u0001\u0000\u0000\u0000\u043f\u0444\u0003\u0152\u00a8\u0000"+ + "\u0440\u0443\u0003\u0152\u00a8\u0000\u0441\u0443\u0003\u0154\u00a9\u0000"+ + "\u0442\u0440\u0001\u0000\u0000\u0000\u0442\u0441\u0001\u0000\u0000\u0000"+ + "\u0443\u0446\u0001\u0000\u0000\u0000\u0444\u0442\u0001\u0000\u0000\u0000"+ + "\u0444\u0445\u0001\u0000\u0000\u0000\u0445\u0447\u0001\u0000\u0000\u0000"+ + "\u0446\u0444\u0001\u0000\u0000\u0000\u0447\u0448\u0006g\u0000\u0000\u0448"+ + "\u00d1\u0001\u0000\u0000\u0000\u0449\u044a\u0005(\u0000\u0000\u044a\u00d3"+ + "\u0001\u0000\u0000\u0000\u044b\u044c\u0005)\u0000\u0000\u044c\u044d\u0001"+ + "\u0000\u0000\u0000\u044d\u044e\u0006i\u0000\u0000\u044e\u00d5\u0001\u0000"+ + "\u0000\u0000\u044f\u0450\u0005{\u0000\u0000\u0450\u00d7\u0001\u0000\u0000"+ + "\u0000\u0451\u0452\u0005}\u0000\u0000\u0452\u0453\u0001\u0000\u0000\u0000"+ + "\u0453\u0454\u0006k\u0000\u0000\u0454\u00d9\u0001\u0000\u0000\u0000\u0455"+ + "\u0456\u0005[\u0000\u0000\u0456\u00db\u0001\u0000\u0000\u0000\u0457\u0458"+ + "\u0005]\u0000\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u045a\u0006"+ + "m\u0000\u0000\u045a\u00dd\u0001\u0000\u0000\u0000\u045b\u045c\u0005=\u0000"+ + "\u0000\u045c\u00df\u0001\u0000\u0000\u0000\u045d\u045e\u0005,\u0000\u0000"+ + "\u045e\u00e1\u0001\u0000\u0000\u0000\u045f\u0460\u0005;\u0000\u0000\u0460"+ + "\u00e3\u0001\u0000\u0000\u0000\u0461\u0462\u0005:\u0000\u0000\u0462\u00e5"+ + "\u0001\u0000\u0000\u0000\u0463\u0464\u0005.\u0000\u0000\u0464\u00e7\u0001"+ + "\u0000\u0000\u0000\u0465\u0466\u0005+\u0000\u0000\u0466\u0467\u0005+\u0000"+ + "\u0000\u0467\u0468\u0001\u0000\u0000\u0000\u0468\u0469\u0006s\u0000\u0000"+ + "\u0469\u00e9\u0001\u0000\u0000\u0000\u046a\u046b\u0005-\u0000\u0000\u046b"+ + "\u046c\u0005-\u0000\u0000\u046c\u046d\u0001\u0000\u0000\u0000\u046d\u046e"+ + "\u0006t\u0000\u0000\u046e\u00eb\u0001\u0000\u0000\u0000\u046f\u0470\u0005"+ + ":\u0000\u0000\u0470\u0471\u0005=\u0000\u0000\u0471\u00ed\u0001\u0000\u0000"+ + "\u0000\u0472\u0473\u0005.\u0000\u0000\u0473\u0474\u0005.\u0000\u0000\u0474"+ + "\u0475\u0005.\u0000\u0000\u0475\u00ef\u0001\u0000\u0000\u0000\u0476\u0477"+ + "\u0005|\u0000\u0000\u0477\u0478\u0005|\u0000\u0000\u0478\u00f1\u0001\u0000"+ + "\u0000\u0000\u0479\u047a\u0005&\u0000\u0000\u047a\u047b\u0005&\u0000\u0000"+ + "\u047b\u00f3\u0001\u0000\u0000\u0000\u047c\u047d\u0005=\u0000\u0000\u047d"+ + "\u047e\u0005=\u0000\u0000\u047e\u00f5\u0001\u0000\u0000\u0000\u047f\u0480"+ + "\u0005!\u0000\u0000\u0480\u0481\u0005=\u0000\u0000\u0481\u00f7\u0001\u0000"+ + "\u0000\u0000\u0482\u0483\u0005<\u0000\u0000\u0483\u00f9\u0001\u0000\u0000"+ + "\u0000\u0484\u0485\u0005<\u0000\u0000\u0485\u0486\u0005=\u0000\u0000\u0486"+ + "\u00fb\u0001\u0000\u0000\u0000\u0487\u0488\u0005>\u0000\u0000\u0488\u00fd"+ + "\u0001\u0000\u0000\u0000\u0489\u048a\u0005>\u0000\u0000\u048a\u048b\u0005"+ + "=\u0000\u0000\u048b\u00ff\u0001\u0000\u0000\u0000\u048c\u048d\u0005|\u0000"+ + "\u0000\u048d\u0101\u0001\u0000\u0000\u0000\u048e\u048f\u0005/\u0000\u0000"+ + "\u048f\u0103\u0001\u0000\u0000\u0000\u0490\u0491\u0005%\u0000\u0000\u0491"+ + "\u0105\u0001\u0000\u0000\u0000\u0492\u0493\u0005<\u0000\u0000\u0493\u0494"+ + "\u0005<\u0000\u0000\u0494\u0107\u0001\u0000\u0000\u0000\u0495\u0496\u0005"+ + ">\u0000\u0000\u0496\u0497\u0005>\u0000\u0000\u0497\u0109\u0001\u0000\u0000"+ + "\u0000\u0498\u0499\u0005&\u0000\u0000\u0499\u049a\u0005^\u0000\u0000\u049a"+ + "\u010b\u0001\u0000\u0000\u0000\u049b\u049c\u0005!\u0000\u0000\u049c\u010d"+ + "\u0001\u0000\u0000\u0000\u049d\u049e\u0005+\u0000\u0000\u049e\u010f\u0001"+ + "\u0000\u0000\u0000\u049f\u04a0\u0005-\u0000\u0000\u04a0\u0111\u0001\u0000"+ + "\u0000\u0000\u04a1\u04a2\u0005^\u0000\u0000\u04a2\u0113\u0001\u0000\u0000"+ + "\u0000\u04a3\u04a4\u0005*\u0000\u0000\u04a4\u0115\u0001\u0000\u0000\u0000"+ + "\u04a5\u04a6\u0005&\u0000\u0000\u04a6\u0117\u0001\u0000\u0000\u0000\u04a7"+ + "\u04a8\u0005<\u0000\u0000\u04a8\u04a9\u0005-\u0000\u0000\u04a9\u0119\u0001"+ + "\u0000\u0000\u0000\u04aa\u04b6\u00050\u0000\u0000\u04ab\u04b2\u0007\u0000"+ + "\u0000\u0000\u04ac\u04ae\u0005_\u0000\u0000\u04ad\u04ac\u0001\u0000\u0000"+ + "\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000\u04ae\u04af\u0001\u0000\u0000"+ + "\u0000\u04af\u04b1\u0007\u0001\u0000\u0000\u04b0\u04ad\u0001\u0000\u0000"+ + "\u0000\u04b1\u04b4\u0001\u0000\u0000\u0000\u04b2\u04b0\u0001\u0000\u0000"+ + "\u0000\u04b2\u04b3\u0001\u0000\u0000\u0000\u04b3\u04b6\u0001\u0000\u0000"+ + "\u0000\u04b4\u04b2\u0001\u0000\u0000\u0000\u04b5\u04aa\u0001\u0000\u0000"+ + "\u0000\u04b5\u04ab\u0001\u0000\u0000\u0000\u04b6\u04b7\u0001\u0000\u0000"+ + "\u0000\u04b7\u04b8\u0006\u008c\u0000\u0000\u04b8\u011b\u0001\u0000\u0000"+ + "\u0000\u04b9\u04ba\u00050\u0000\u0000\u04ba\u04bf\u0007\u0002\u0000\u0000"+ + "\u04bb\u04bd\u0005_\u0000\u0000\u04bc\u04bb\u0001\u0000\u0000\u0000\u04bc"+ + "\u04bd\u0001\u0000\u0000\u0000\u04bd\u04be\u0001\u0000\u0000\u0000\u04be"+ + "\u04c0\u0003\u014e\u00a6\u0000\u04bf\u04bc\u0001\u0000\u0000\u0000\u04c0"+ + "\u04c1\u0001\u0000\u0000\u0000\u04c1\u04bf\u0001\u0000\u0000\u0000\u04c1"+ + "\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c3\u0001\u0000\u0000\u0000\u04c3"+ + "\u04c4\u0006\u008d\u0000\u0000\u04c4\u011d\u0001\u0000\u0000\u0000\u04c5"+ + "\u04c7\u00050\u0000\u0000\u04c6\u04c8\u0007\u0003\u0000\u0000\u04c7\u04c6"+ + "\u0001\u0000\u0000\u0000\u04c7\u04c8\u0001\u0000\u0000\u0000\u04c8\u04cd"+ + "\u0001\u0000\u0000\u0000\u04c9\u04cb\u0005_\u0000\u0000\u04ca\u04c9\u0001"+ + "\u0000\u0000\u0000\u04ca\u04cb\u0001\u0000\u0000\u0000\u04cb\u04cc\u0001"+ + "\u0000\u0000\u0000\u04cc\u04ce\u0003\u014a\u00a4\u0000\u04cd\u04ca\u0001"+ + "\u0000\u0000\u0000\u04ce\u04cf\u0001\u0000\u0000\u0000\u04cf\u04cd\u0001"+ + "\u0000\u0000\u0000\u04cf\u04d0\u0001\u0000\u0000\u0000\u04d0\u04d1\u0001"+ + "\u0000\u0000\u0000\u04d1\u04d2\u0006\u008e\u0000\u0000\u04d2\u011f\u0001"+ + "\u0000\u0000\u0000\u04d3\u04d4\u00050\u0000\u0000\u04d4\u04d9\u0007\u0004"+ + "\u0000\u0000\u04d5\u04d7\u0005_\u0000\u0000\u04d6\u04d5\u0001\u0000\u0000"+ + "\u0000\u04d6\u04d7\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001\u0000\u0000"+ + "\u0000\u04d8\u04da\u0003\u014c\u00a5\u0000\u04d9\u04d6\u0001\u0000\u0000"+ + "\u0000\u04da\u04db\u0001\u0000\u0000\u0000\u04db\u04d9\u0001\u0000\u0000"+ + "\u0000\u04db\u04dc\u0001\u0000\u0000\u0000\u04dc\u04dd\u0001\u0000\u0000"+ + "\u0000\u04dd\u04de\u0006\u008f\u0000\u0000\u04de\u0121\u0001\u0000\u0000"+ + "\u0000\u04df\u04e0\u00050\u0000\u0000\u04e0\u04e1\u0007\u0004\u0000\u0000"+ + "\u04e1\u04e2\u0003\u0124\u0091\u0000\u04e2\u04e3\u0003\u0126\u0092\u0000"+ + "\u04e3\u0123\u0001\u0000\u0000\u0000\u04e4\u04e6\u0005_\u0000\u0000\u04e5"+ + "\u04e4\u0001\u0000\u0000\u0000\u04e5\u04e6\u0001\u0000\u0000\u0000\u04e6"+ + "\u04e7\u0001\u0000\u0000\u0000\u04e7\u04e9\u0003\u014c\u00a5\u0000\u04e8"+ + "\u04e5\u0001\u0000\u0000\u0000\u04e9\u04ea\u0001\u0000\u0000\u0000\u04ea"+ + "\u04e8\u0001\u0000\u0000\u0000\u04ea\u04eb\u0001\u0000\u0000\u0000\u04eb"+ + "\u04f6\u0001\u0000\u0000\u0000\u04ec\u04f3\u0005.\u0000\u0000\u04ed\u04ef"+ + "\u0005_\u0000\u0000\u04ee\u04ed\u0001\u0000\u0000\u0000\u04ee\u04ef\u0001"+ + "\u0000\u0000\u0000\u04ef\u04f0\u0001\u0000\u0000\u0000\u04f0\u04f2\u0003"+ + "\u014c\u00a5\u0000\u04f1\u04ee\u0001\u0000\u0000\u0000\u04f2\u04f5\u0001"+ + "\u0000\u0000\u0000\u04f3\u04f1\u0001\u0000\u0000\u0000\u04f3\u04f4\u0001"+ + "\u0000\u0000\u0000\u04f4\u04f7\u0001\u0000\u0000\u0000\u04f5\u04f3\u0001"+ + "\u0000\u0000\u0000\u04f6\u04ec\u0001\u0000\u0000\u0000\u04f6\u04f7\u0001"+ + "\u0000\u0000\u0000\u04f7\u0504\u0001\u0000\u0000\u0000\u04f8\u04f9\u0005"+ + ".\u0000\u0000\u04f9\u0500\u0003\u014c\u00a5\u0000\u04fa\u04fc\u0005_\u0000"+ + "\u0000\u04fb\u04fa\u0001\u0000\u0000\u0000\u04fb\u04fc\u0001\u0000\u0000"+ + "\u0000\u04fc\u04fd\u0001\u0000\u0000\u0000\u04fd\u04ff\u0003\u014c\u00a5"+ + "\u0000\u04fe\u04fb\u0001\u0000\u0000\u0000\u04ff\u0502\u0001\u0000\u0000"+ + "\u0000\u0500\u04fe\u0001\u0000\u0000\u0000\u0500\u0501\u0001\u0000\u0000"+ + "\u0000\u0501\u0504\u0001\u0000\u0000\u0000\u0502\u0500\u0001\u0000\u0000"+ + "\u0000\u0503\u04e8\u0001\u0000\u0000\u0000\u0503\u04f8\u0001\u0000\u0000"+ + "\u0000\u0504\u0125\u0001\u0000\u0000\u0000\u0505\u0507\u0007\u0005\u0000"+ + "\u0000\u0506\u0508\u0007\u0006\u0000\u0000\u0507\u0506\u0001\u0000\u0000"+ + "\u0000\u0507\u0508\u0001\u0000\u0000\u0000\u0508\u0509\u0001\u0000\u0000"+ + "\u0000\u0509\u050a\u0003\u0148\u00a3\u0000\u050a\u0127\u0001\u0000\u0000"+ + "\u0000\u050b\u0511\u0003\u011a\u008c\u0000\u050c\u0511\u0003\u011c\u008d"+ + "\u0000\u050d\u0511\u0003\u011e\u008e\u0000\u050e\u0511\u0003\u0120\u008f"+ + "\u0000\u050f\u0511\u0003\u0002\u0000\u0000\u0510\u050b\u0001\u0000\u0000"+ + "\u0000\u0510\u050c\u0001\u0000\u0000\u0000\u0510\u050d\u0001\u0000\u0000"+ + "\u0000\u0510\u050e\u0001\u0000\u0000\u0000\u0510\u050f\u0001\u0000\u0000"+ + "\u0000\u0511\u0512\u0001\u0000\u0000\u0000\u0512\u0513\u0005i\u0000\u0000"+ + "\u0513\u0514\u0001\u0000\u0000\u0000\u0514\u0515\u0006\u0093\u0000\u0000"+ + "\u0515\u0129\u0001\u0000\u0000\u0000\u0516\u0519\u0005\'\u0000\u0000\u0517"+ + "\u051a\u0003\u0144\u00a1\u0000\u0518\u051a\u0003\u012e\u0096\u0000\u0519"+ + "\u0517\u0001\u0000\u0000\u0000\u0519\u0518\u0001\u0000\u0000\u0000\u051a"+ + "\u051b\u0001\u0000\u0000\u0000\u051b\u051c\u0005\'\u0000\u0000\u051c\u012b"+ + "\u0001\u0000\u0000\u0000\u051d\u051e\u0003\u012a\u0094\u0000\u051e\u051f"+ + "\u0001\u0000\u0000\u0000\u051f\u0520\u0006\u0095\u0000\u0000\u0520\u012d"+ + "\u0001\u0000\u0000\u0000\u0521\u0524\u0003\u0130\u0097\u0000\u0522\u0524"+ + "\u0003\u0132\u0098\u0000\u0523\u0521\u0001\u0000\u0000\u0000\u0523\u0522"+ + "\u0001\u0000\u0000\u0000\u0524\u012f\u0001\u0000\u0000\u0000\u0525\u0526"+ + "\u0005\\\u0000\u0000\u0526\u0527\u0003\u014a\u00a4\u0000\u0527\u0528\u0003"+ + "\u014a\u00a4\u0000\u0528\u0529\u0003\u014a\u00a4\u0000\u0529\u0131\u0001"+ + "\u0000\u0000\u0000\u052a\u052b\u0005\\\u0000\u0000\u052b\u052c\u0005x"+ + "\u0000\u0000\u052c\u052d\u0003\u014c\u00a5\u0000\u052d\u052e\u0003\u014c"+ + "\u00a5\u0000\u052e\u0133\u0001\u0000\u0000\u0000\u052f\u0530\u0005\\\u0000"+ + "\u0000\u0530\u0531\u0005u\u0000\u0000\u0531\u0532\u0003\u014c\u00a5\u0000"+ + "\u0532\u0533\u0003\u014c\u00a5\u0000\u0533\u0534\u0003\u014c\u00a5\u0000"+ + "\u0534\u0535\u0003\u014c\u00a5\u0000\u0535\u0135\u0001\u0000\u0000\u0000"+ + "\u0536\u0537\u0005\\\u0000\u0000\u0537\u0538\u0005U\u0000\u0000\u0538"+ + "\u0539\u0003\u014c\u00a5\u0000\u0539\u053a\u0003\u014c\u00a5\u0000\u053a"+ + "\u053b\u0003\u014c\u00a5\u0000\u053b\u053c\u0003\u014c\u00a5\u0000\u053c"+ + "\u053d\u0003\u014c\u00a5\u0000\u053d\u053e\u0003\u014c\u00a5\u0000\u053e"+ + "\u053f\u0003\u014c\u00a5\u0000\u053f\u0540\u0003\u014c\u00a5\u0000\u0540"+ + "\u0137\u0001\u0000\u0000\u0000\u0541\u0545\u0005`\u0000\u0000\u0542\u0544"+ + "\b\u0007\u0000\u0000\u0543\u0542\u0001\u0000\u0000\u0000\u0544\u0547\u0001"+ + "\u0000\u0000\u0000\u0545\u0543\u0001\u0000\u0000\u0000\u0545\u0546\u0001"+ + "\u0000\u0000\u0000\u0546\u0548\u0001\u0000\u0000\u0000\u0547\u0545\u0001"+ + "\u0000\u0000\u0000\u0548\u0549\u0005`\u0000\u0000\u0549\u054a\u0001\u0000"+ + "\u0000\u0000\u054a\u054b\u0006\u009b\u0000\u0000\u054b\u0139\u0001\u0000"+ + "\u0000\u0000\u054c\u0551\u0005\"\u0000\u0000\u054d\u0550\b\b\u0000\u0000"+ + "\u054e\u0550\u0003\u0146\u00a2\u0000\u054f\u054d\u0001\u0000\u0000\u0000"+ + "\u054f\u054e\u0001\u0000\u0000\u0000\u0550\u0553\u0001\u0000\u0000\u0000"+ + "\u0551\u054f\u0001\u0000\u0000\u0000\u0551\u0552\u0001\u0000\u0000\u0000"+ + "\u0552\u0554\u0001\u0000\u0000\u0000\u0553\u0551\u0001\u0000\u0000\u0000"+ + "\u0554\u0555\u0005\"\u0000\u0000\u0555\u0556\u0001\u0000\u0000\u0000\u0556"+ + "\u0557\u0006\u009c\u0000\u0000\u0557\u013b\u0001\u0000\u0000\u0000\u0558"+ + "\u055a\u0007\t\u0000\u0000\u0559\u0558\u0001\u0000\u0000\u0000\u055a\u055b"+ + "\u0001\u0000\u0000\u0000\u055b\u0559\u0001\u0000\u0000\u0000\u055b\u055c"+ + "\u0001\u0000\u0000\u0000\u055c\u055d\u0001\u0000\u0000\u0000\u055d\u055e"+ + "\u0006\u009d\u0001\u0000\u055e\u013d\u0001\u0000\u0000\u0000\u055f\u0560"+ + "\u0005/\u0000\u0000\u0560\u0561\u0005*\u0000\u0000\u0561\u0565\u0001\u0000"+ + "\u0000\u0000\u0562\u0564\t\u0000\u0000\u0000\u0563\u0562\u0001\u0000\u0000"+ + "\u0000\u0564\u0567\u0001\u0000\u0000\u0000\u0565\u0566\u0001\u0000\u0000"+ + "\u0000\u0565\u0563\u0001\u0000\u0000\u0000\u0566\u0568\u0001\u0000\u0000"+ + "\u0000\u0567\u0565\u0001\u0000\u0000\u0000\u0568\u0569\u0005*\u0000\u0000"+ + "\u0569\u056a\u0005/\u0000\u0000\u056a\u056b\u0001\u0000\u0000\u0000\u056b"+ + "\u056c\u0006\u009e\u0001\u0000\u056c\u013f\u0001\u0000\u0000\u0000\u056d"+ + "\u056f\u0007\n\u0000\u0000\u056e\u056d\u0001\u0000\u0000\u0000\u056f\u0570"+ + "\u0001\u0000\u0000\u0000\u0570\u056e\u0001\u0000\u0000\u0000\u0570\u0571"+ + "\u0001\u0000\u0000\u0000\u0571\u0572\u0001\u0000\u0000\u0000\u0572\u0573"+ + "\u0006\u009f\u0001\u0000\u0573\u0141\u0001\u0000\u0000\u0000\u0574\u0575"+ + "\u0005/\u0000\u0000\u0575\u0576\u0005/\u0000\u0000\u0576\u057a\u0001\u0000"+ + "\u0000\u0000\u0577\u0579\b\n\u0000\u0000\u0578\u0577\u0001\u0000\u0000"+ + "\u0000\u0579\u057c\u0001\u0000\u0000\u0000\u057a\u0578\u0001\u0000\u0000"+ + "\u0000\u057a\u057b\u0001\u0000\u0000\u0000\u057b\u057d\u0001\u0000\u0000"+ + "\u0000\u057c\u057a\u0001\u0000\u0000\u0000\u057d\u057e\u0006\u00a0\u0001"+ + "\u0000\u057e\u0143\u0001\u0000\u0000\u0000\u057f\u0584\b\u000b\u0000\u0000"+ + "\u0580\u0584\u0003\u0134\u0099\u0000\u0581\u0584\u0003\u0136\u009a\u0000"+ + "\u0582\u0584\u0003\u0146\u00a2\u0000\u0583\u057f\u0001\u0000\u0000\u0000"+ + "\u0583\u0580\u0001\u0000\u0000\u0000\u0583\u0581\u0001\u0000\u0000\u0000"+ + "\u0583\u0582\u0001\u0000\u0000\u0000\u0584\u0145\u0001\u0000\u0000\u0000"+ + "\u0585\u059f\u0005\\\u0000\u0000\u0586\u0587\u0005u\u0000\u0000\u0587"+ + "\u0588\u0003\u014c\u00a5\u0000\u0588\u0589\u0003\u014c\u00a5\u0000\u0589"+ + "\u058a\u0003\u014c\u00a5\u0000\u058a\u058b\u0003\u014c\u00a5\u0000\u058b"+ + "\u05a0\u0001\u0000\u0000\u0000\u058c\u058d\u0005U\u0000\u0000\u058d\u058e"+ + "\u0003\u014c\u00a5\u0000\u058e\u058f\u0003\u014c\u00a5\u0000\u058f\u0590"+ + "\u0003\u014c\u00a5\u0000\u0590\u0591\u0003\u014c\u00a5\u0000\u0591\u0592"+ + "\u0003\u014c\u00a5\u0000\u0592\u0593\u0003\u014c\u00a5\u0000\u0593\u0594"+ + "\u0003\u014c\u00a5\u0000\u0594\u0595\u0003\u014c\u00a5\u0000\u0595\u05a0"+ + "\u0001\u0000\u0000\u0000\u0596\u05a0\u0007\f\u0000\u0000\u0597\u0598\u0003"+ + "\u014a\u00a4\u0000\u0598\u0599\u0003\u014a\u00a4\u0000\u0599\u059a\u0003"+ + "\u014a\u00a4\u0000\u059a\u05a0\u0001\u0000\u0000\u0000\u059b\u059c\u0005"+ + "x\u0000\u0000\u059c\u059d\u0003\u014c\u00a5\u0000\u059d\u059e\u0003\u014c"+ + "\u00a5\u0000\u059e\u05a0\u0001\u0000\u0000\u0000\u059f\u0586\u0001\u0000"+ + "\u0000\u0000\u059f\u058c\u0001\u0000\u0000\u0000\u059f\u0596\u0001\u0000"+ + "\u0000\u0000\u059f\u0597\u0001\u0000\u0000\u0000\u059f\u059b\u0001\u0000"+ + "\u0000\u0000\u05a0\u0147\u0001\u0000\u0000\u0000\u05a1\u05a8\u0007\u0001"+ + "\u0000\u0000\u05a2\u05a4\u0005_\u0000\u0000\u05a3\u05a2\u0001\u0000\u0000"+ + "\u0000\u05a3\u05a4\u0001\u0000\u0000\u0000\u05a4\u05a5\u0001\u0000\u0000"+ + "\u0000\u05a5\u05a7\u0007\u0001\u0000\u0000\u05a6\u05a3\u0001\u0000\u0000"+ + "\u0000\u05a7\u05aa\u0001\u0000\u0000\u0000\u05a8\u05a6\u0001\u0000\u0000"+ + "\u0000\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u0149\u0001\u0000\u0000"+ + "\u0000\u05aa\u05a8\u0001\u0000\u0000\u0000\u05ab\u05ac\u0007\r\u0000\u0000"+ + "\u05ac\u014b\u0001\u0000\u0000\u0000\u05ad\u05ae\u0007\u000e\u0000\u0000"+ + "\u05ae\u014d\u0001\u0000\u0000\u0000\u05af\u05b0\u0007\u000f\u0000\u0000"+ + "\u05b0\u014f\u0001\u0000\u0000\u0000\u05b1\u05b3\u0007\u0010\u0000\u0000"+ + "\u05b2\u05b4\u0007\u0006\u0000\u0000\u05b3\u05b2\u0001\u0000\u0000\u0000"+ + "\u05b3\u05b4\u0001\u0000\u0000\u0000\u05b4\u05b5\u0001\u0000\u0000\u0000"+ + "\u05b5\u05b6\u0003\u0148\u00a3\u0000\u05b6\u0151\u0001\u0000\u0000\u0000"+ + "\u05b7\u05ba\u0003\u0156\u00aa\u0000\u05b8\u05ba\u0005_\u0000\u0000\u05b9"+ + "\u05b7\u0001\u0000\u0000\u0000\u05b9\u05b8\u0001\u0000\u0000\u0000\u05ba"+ + "\u0153\u0001\u0000\u0000\u0000\u05bb\u05bc\u0007\u0011\u0000\u0000\u05bc"+ + "\u0155\u0001\u0000\u0000\u0000\u05bd\u05be\u0007\u0012\u0000\u0000\u05be"+ + "\u0157\u0001\u0000\u0000\u0000\u05bf\u05c1\u0007\t\u0000\u0000\u05c0\u05bf"+ + "\u0001\u0000\u0000\u0000\u05c1\u05c2\u0001\u0000\u0000\u0000\u05c2\u05c0"+ + "\u0001\u0000\u0000\u0000\u05c2\u05c3\u0001\u0000\u0000\u0000\u05c3\u05c4"+ + "\u0001\u0000\u0000\u0000\u05c4\u05c5\u0006\u00ab\u0001\u0000\u05c5\u0159"+ + "\u0001\u0000\u0000\u0000\u05c6\u05c7\u0005/\u0000\u0000\u05c7\u05c8\u0005"+ + "*\u0000\u0000\u05c8\u05cc\u0001\u0000\u0000\u0000\u05c9\u05cb\b\n\u0000"+ + "\u0000\u05ca\u05c9\u0001\u0000\u0000\u0000\u05cb\u05ce\u0001\u0000\u0000"+ + "\u0000\u05cc\u05cd\u0001\u0000\u0000\u0000\u05cc\u05ca\u0001\u0000\u0000"+ + "\u0000\u05cd\u05cf\u0001\u0000\u0000\u0000\u05ce\u05cc\u0001\u0000\u0000"+ + "\u0000\u05cf\u05d0\u0005*\u0000\u0000\u05d0\u05d1\u0005/\u0000\u0000\u05d1"+ + "\u05d2\u0001\u0000\u0000\u0000\u05d2\u05d3\u0006\u00ac\u0001\u0000\u05d3"+ + "\u015b\u0001\u0000\u0000\u0000\u05d4\u05d5\u0005/\u0000\u0000\u05d5\u05d6"+ + "\u0005/\u0000\u0000\u05d6\u05da\u0001\u0000\u0000\u0000\u05d7\u05d9\b"+ + "\n\u0000\u0000\u05d8\u05d7\u0001\u0000\u0000\u0000\u05d9\u05dc\u0001\u0000"+ + "\u0000\u0000\u05da\u05d8\u0001\u0000\u0000\u0000\u05da\u05db\u0001\u0000"+ + "\u0000\u0000\u05db\u05dd\u0001\u0000\u0000\u0000\u05dc\u05da\u0001\u0000"+ + "\u0000\u0000\u05dd\u05de\u0006\u00ad\u0001\u0000\u05de\u015d\u0001\u0000"+ + "\u0000\u0000\u05df\u05e1\u0007\n\u0000\u0000\u05e0\u05df\u0001\u0000\u0000"+ + "\u0000\u05e1\u05e2\u0001\u0000\u0000\u0000\u05e2\u05e0\u0001\u0000\u0000"+ + "\u0000\u05e2\u05e3\u0001\u0000\u0000\u0000\u05e3\u05f2\u0001\u0000\u0000"+ + "\u0000\u05e4\u05f2\u0005;\u0000\u0000\u05e5\u05e6\u0005/\u0000\u0000\u05e6"+ + "\u05e7\u0005*\u0000\u0000\u05e7\u05eb\u0001\u0000\u0000\u0000\u05e8\u05ea"+ + "\t\u0000\u0000\u0000\u05e9\u05e8\u0001\u0000\u0000\u0000\u05ea\u05ed\u0001"+ + "\u0000\u0000\u0000\u05eb\u05ec\u0001\u0000\u0000\u0000\u05eb\u05e9\u0001"+ + "\u0000\u0000\u0000\u05ec\u05ee\u0001\u0000\u0000\u0000\u05ed\u05eb\u0001"+ + "\u0000\u0000\u0000\u05ee\u05ef\u0005*\u0000\u0000\u05ef\u05f2\u0005/\u0000"+ + "\u0000\u05f0\u05f2\u0005\u0000\u0000\u0001\u05f1\u05e0\u0001\u0000\u0000"+ + "\u0000\u05f1\u05e4\u0001\u0000\u0000\u0000\u05f1\u05e5\u0001\u0000\u0000"+ + "\u0000\u05f1\u05f0\u0001\u0000\u0000\u0000\u05f2\u05f3\u0001\u0000\u0000"+ + "\u0000\u05f3\u05f4\u0006\u00ae\u0002\u0000\u05f4\u015f\u0001\u0000\u0000"+ + "\u0000\u05f5\u05f6\u0001\u0000\u0000\u0000\u05f6\u05f7\u0001\u0000\u0000"+ + "\u0000\u05f7\u05f8\u0006\u00af\u0002\u0000\u05f8\u05f9\u0006\u00af\u0001"+ + "\u0000\u05f9\u0161\u0001\u0000\u0000\u00003\u0000\u0001\u0164\u016c\u016f"+ + "\u0172\u0178\u017a\u0442\u0444\u04ad\u04b2\u04b5\u04bc\u04c1\u04c7\u04ca"+ + "\u04cf\u04d6\u04db\u04e5\u04ea\u04ee\u04f3\u04f6\u04fb\u0500\u0503\u0507"+ + "\u0510\u0519\u0523\u0545\u054f\u0551\u055b\u0565\u0570\u057a\u0583\u059f"+ + "\u05a3\u05a8\u05b3\u05b9\u05c2\u05cc\u05da\u05e2\u05eb\u05f1\u0003\u0002"+ "\u0001\u0000\u0000\u0001\u0000\u0002\u0000\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index eee260acd..359707d2a 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 +// Generated from /Users/joao/code/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -27,22 +27,22 @@ public class GobraParser extends GobraParserBase { MATCH=54, NONE=55, PRED=56, TYPE_OF=57, IS_COMPARABLE=58, SHARE=59, ADDR_MOD=60, DOT_DOT=61, SHARED=62, EXCLUSIVE=63, PREDICATE=64, WRITEPERM=65, NOPERM=66, TRUSTED=67, OUTLINE=68, INIT_POST=69, IMPORT_PRE=70, PROOF=71, GHOST_EQUALS=72, - GHOST_NOT_EQUALS=73, WITH=74, OPAQUE=75, REVEAL=76, BREAK=77, DEFAULT=78, - FUNC=79, INTERFACE=80, SELECT=81, CASE=82, DEFER=83, GO=84, MAP=85, STRUCT=86, - CHAN=87, ELSE=88, GOTO=89, PACKAGE=90, SWITCH=91, CONST=92, FALLTHROUGH=93, - IF=94, RANGE=95, TYPE=96, CONTINUE=97, FOR=98, IMPORT=99, RETURN=100, - VAR=101, NIL_LIT=102, IDENTIFIER=103, L_PAREN=104, R_PAREN=105, L_CURLY=106, - R_CURLY=107, L_BRACKET=108, R_BRACKET=109, ASSIGN=110, COMMA=111, SEMI=112, - COLON=113, DOT=114, PLUS_PLUS=115, MINUS_MINUS=116, DECLARE_ASSIGN=117, - ELLIPSIS=118, LOGICAL_OR=119, LOGICAL_AND=120, EQUALS=121, NOT_EQUALS=122, - LESS=123, LESS_OR_EQUALS=124, GREATER=125, GREATER_OR_EQUALS=126, OR=127, - DIV=128, MOD=129, LSHIFT=130, RSHIFT=131, BIT_CLEAR=132, EXCLAMATION=133, - PLUS=134, MINUS=135, CARET=136, STAR=137, AMPERSAND=138, RECEIVE=139, - DECIMAL_LIT=140, BINARY_LIT=141, OCTAL_LIT=142, HEX_LIT=143, HEX_FLOAT_LIT=144, - IMAGINARY_LIT=145, RUNE_LIT=146, BYTE_VALUE=147, OCTAL_BYTE_VALUE=148, - HEX_BYTE_VALUE=149, LITTLE_U_VALUE=150, BIG_U_VALUE=151, RAW_STRING_LIT=152, - INTERPRETED_STRING_LIT=153, WS=154, COMMENT=155, TERMINATOR=156, LINE_COMMENT=157, - WS_NLSEMI=158, COMMENT_NLSEMI=159, LINE_COMMENT_NLSEMI=160, EOS=161, OTHER=162; + GHOST_NOT_EQUALS=73, WITH=74, OPAQUE=75, REVEAL=76, BACKEND=77, BREAK=78, + DEFAULT=79, FUNC=80, INTERFACE=81, SELECT=82, CASE=83, DEFER=84, GO=85, + MAP=86, STRUCT=87, CHAN=88, ELSE=89, GOTO=90, PACKAGE=91, SWITCH=92, CONST=93, + FALLTHROUGH=94, IF=95, RANGE=96, TYPE=97, CONTINUE=98, FOR=99, IMPORT=100, + RETURN=101, VAR=102, NIL_LIT=103, IDENTIFIER=104, L_PAREN=105, R_PAREN=106, + L_CURLY=107, R_CURLY=108, L_BRACKET=109, R_BRACKET=110, ASSIGN=111, COMMA=112, + SEMI=113, COLON=114, DOT=115, PLUS_PLUS=116, MINUS_MINUS=117, DECLARE_ASSIGN=118, + ELLIPSIS=119, LOGICAL_OR=120, LOGICAL_AND=121, EQUALS=122, NOT_EQUALS=123, + LESS=124, LESS_OR_EQUALS=125, GREATER=126, GREATER_OR_EQUALS=127, OR=128, + DIV=129, MOD=130, LSHIFT=131, RSHIFT=132, BIT_CLEAR=133, EXCLAMATION=134, + PLUS=135, MINUS=136, CARET=137, STAR=138, AMPERSAND=139, RECEIVE=140, + DECIMAL_LIT=141, BINARY_LIT=142, OCTAL_LIT=143, HEX_LIT=144, HEX_FLOAT_LIT=145, + IMAGINARY_LIT=146, RUNE_LIT=147, BYTE_VALUE=148, OCTAL_BYTE_VALUE=149, + HEX_BYTE_VALUE=150, LITTLE_U_VALUE=151, BIG_U_VALUE=152, RAW_STRING_LIT=153, + INTERPRETED_STRING_LIT=154, WS=155, COMMENT=156, TERMINATOR=157, LINE_COMMENT=158, + WS_NLSEMI=159, COMMENT_NLSEMI=160, LINE_COMMENT_NLSEMI=161, EOS=162, OTHER=163; public static final int RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3, RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_preamble = 6, @@ -57,46 +57,48 @@ public class GobraParser extends GobraParserBase { RULE_matchExprClause = 37, RULE_seqUpdExp = 38, RULE_seqUpdClause = 39, RULE_ghostTypeLit = 40, RULE_domainType = 41, RULE_domainClause = 42, RULE_adtType = 43, RULE_adtClause = 44, RULE_adtFieldDecl = 45, RULE_ghostSliceType = 46, - RULE_sqType = 47, RULE_specification = 48, RULE_specStatement = 49, RULE_terminationMeasure = 50, - RULE_assertion = 51, RULE_matchStmt = 52, RULE_matchStmtClause = 53, RULE_matchCase = 54, - RULE_matchPattern = 55, RULE_matchPatternList = 56, RULE_blockWithBodyParameterInfo = 57, - RULE_closureSpecInstance = 58, RULE_closureSpecParams = 59, RULE_closureSpecParam = 60, - RULE_closureImplProofStmt = 61, RULE_implementationProof = 62, RULE_methodImplementationProof = 63, - RULE_nonLocalReceiver = 64, RULE_selection = 65, RULE_implementationProofPredicateAlias = 66, - RULE_make = 67, RULE_new_ = 68, RULE_specMember = 69, RULE_functionDecl = 70, - RULE_methodDecl = 71, RULE_explicitGhostMember = 72, RULE_fpredicateDecl = 73, - RULE_predicateBody = 74, RULE_mpredicateDecl = 75, RULE_varSpec = 76, - RULE_shortVarDecl = 77, RULE_receiver = 78, RULE_parameterDecl = 79, RULE_actualParameterDecl = 80, - RULE_ghostParameterDecl = 81, RULE_parameterType = 82, RULE_expression = 83, - RULE_statement = 84, RULE_applyStmt = 85, RULE_packageStmt = 86, RULE_specForStmt = 87, - RULE_loopSpec = 88, RULE_deferStmt = 89, RULE_basicLit = 90, RULE_primaryExpr = 91, - RULE_functionLit = 92, RULE_closureDecl = 93, RULE_predConstructArgs = 94, - RULE_interfaceType = 95, RULE_predicateSpec = 96, RULE_methodSpec = 97, - RULE_type_ = 98, RULE_typeLit = 99, RULE_predType = 100, RULE_predTypeParams = 101, - RULE_literalType = 102, RULE_implicitArray = 103, RULE_slice_ = 104, RULE_low = 105, - RULE_high = 106, RULE_cap = 107, RULE_assign_op = 108, RULE_rangeClause = 109, - RULE_packageClause = 110, RULE_importPath = 111, RULE_declaration = 112, - RULE_constDecl = 113, RULE_constSpec = 114, RULE_identifierList = 115, - RULE_expressionList = 116, RULE_typeDecl = 117, RULE_typeSpec = 118, RULE_varDecl = 119, - RULE_block = 120, RULE_statementList = 121, RULE_simpleStmt = 122, RULE_expressionStmt = 123, - RULE_sendStmt = 124, RULE_incDecStmt = 125, RULE_assignment = 126, RULE_emptyStmt = 127, - RULE_labeledStmt = 128, RULE_returnStmt = 129, RULE_breakStmt = 130, RULE_continueStmt = 131, - RULE_gotoStmt = 132, RULE_fallthroughStmt = 133, RULE_ifStmt = 134, RULE_switchStmt = 135, - RULE_exprSwitchStmt = 136, RULE_exprCaseClause = 137, RULE_exprSwitchCase = 138, - RULE_typeSwitchStmt = 139, RULE_typeSwitchGuard = 140, RULE_typeCaseClause = 141, - RULE_typeSwitchCase = 142, RULE_typeList = 143, RULE_selectStmt = 144, - RULE_commClause = 145, RULE_commCase = 146, RULE_recvStmt = 147, RULE_forStmt = 148, - RULE_forClause = 149, RULE_goStmt = 150, RULE_typeName = 151, RULE_arrayType = 152, - RULE_arrayLength = 153, RULE_elementType = 154, RULE_pointerType = 155, - RULE_sliceType = 156, RULE_mapType = 157, RULE_channelType = 158, RULE_functionType = 159, - RULE_signature = 160, RULE_result = 161, RULE_parameters = 162, RULE_conversion = 163, - RULE_nonNamedType = 164, RULE_operand = 165, RULE_literal = 166, RULE_integer = 167, - RULE_operandName = 168, RULE_qualifiedIdent = 169, RULE_compositeLit = 170, - RULE_literalValue = 171, RULE_elementList = 172, RULE_keyedElement = 173, - RULE_key = 174, RULE_element = 175, RULE_structType = 176, RULE_fieldDecl = 177, - RULE_string_ = 178, RULE_embeddedField = 179, RULE_index = 180, RULE_typeAssertion = 181, - RULE_arguments = 182, RULE_methodExpr = 183, RULE_receiverType = 184, - RULE_eos = 185; + RULE_sqType = 47, RULE_specification = 48, RULE_backendAnnotationEntry = 49, + RULE_listOfValues = 50, RULE_singleBackendAnnotation = 51, RULE_backendAnnotationList = 52, + RULE_backendAnnotation = 53, RULE_specStatement = 54, RULE_terminationMeasure = 55, + RULE_assertion = 56, RULE_matchStmt = 57, RULE_matchStmtClause = 58, RULE_matchCase = 59, + RULE_matchPattern = 60, RULE_matchPatternList = 61, RULE_blockWithBodyParameterInfo = 62, + RULE_closureSpecInstance = 63, RULE_closureSpecParams = 64, RULE_closureSpecParam = 65, + RULE_closureImplProofStmt = 66, RULE_implementationProof = 67, RULE_methodImplementationProof = 68, + RULE_nonLocalReceiver = 69, RULE_selection = 70, RULE_implementationProofPredicateAlias = 71, + RULE_make = 72, RULE_new_ = 73, RULE_specMember = 74, RULE_functionDecl = 75, + RULE_methodDecl = 76, RULE_explicitGhostMember = 77, RULE_fpredicateDecl = 78, + RULE_predicateBody = 79, RULE_mpredicateDecl = 80, RULE_varSpec = 81, + RULE_shortVarDecl = 82, RULE_receiver = 83, RULE_parameterDecl = 84, RULE_actualParameterDecl = 85, + RULE_ghostParameterDecl = 86, RULE_parameterType = 87, RULE_expression = 88, + RULE_statement = 89, RULE_applyStmt = 90, RULE_packageStmt = 91, RULE_specForStmt = 92, + RULE_loopSpec = 93, RULE_deferStmt = 94, RULE_basicLit = 95, RULE_primaryExpr = 96, + RULE_functionLit = 97, RULE_closureDecl = 98, RULE_predConstructArgs = 99, + RULE_interfaceType = 100, RULE_predicateSpec = 101, RULE_methodSpec = 102, + RULE_type_ = 103, RULE_typeLit = 104, RULE_predType = 105, RULE_predTypeParams = 106, + RULE_literalType = 107, RULE_implicitArray = 108, RULE_slice_ = 109, RULE_low = 110, + RULE_high = 111, RULE_cap = 112, RULE_assign_op = 113, RULE_rangeClause = 114, + RULE_packageClause = 115, RULE_importPath = 116, RULE_declaration = 117, + RULE_constDecl = 118, RULE_constSpec = 119, RULE_identifierList = 120, + RULE_expressionList = 121, RULE_typeDecl = 122, RULE_typeSpec = 123, RULE_varDecl = 124, + RULE_block = 125, RULE_statementList = 126, RULE_simpleStmt = 127, RULE_expressionStmt = 128, + RULE_sendStmt = 129, RULE_incDecStmt = 130, RULE_assignment = 131, RULE_emptyStmt = 132, + RULE_labeledStmt = 133, RULE_returnStmt = 134, RULE_breakStmt = 135, RULE_continueStmt = 136, + RULE_gotoStmt = 137, RULE_fallthroughStmt = 138, RULE_ifStmt = 139, RULE_switchStmt = 140, + RULE_exprSwitchStmt = 141, RULE_exprCaseClause = 142, RULE_exprSwitchCase = 143, + RULE_typeSwitchStmt = 144, RULE_typeSwitchGuard = 145, RULE_typeCaseClause = 146, + RULE_typeSwitchCase = 147, RULE_typeList = 148, RULE_selectStmt = 149, + RULE_commClause = 150, RULE_commCase = 151, RULE_recvStmt = 152, RULE_forStmt = 153, + RULE_forClause = 154, RULE_goStmt = 155, RULE_typeName = 156, RULE_arrayType = 157, + RULE_arrayLength = 158, RULE_elementType = 159, RULE_pointerType = 160, + RULE_sliceType = 161, RULE_mapType = 162, RULE_channelType = 163, RULE_functionType = 164, + RULE_signature = 165, RULE_result = 166, RULE_parameters = 167, RULE_conversion = 168, + RULE_nonNamedType = 169, RULE_operand = 170, RULE_literal = 171, RULE_integer = 172, + RULE_operandName = 173, RULE_qualifiedIdent = 174, RULE_compositeLit = 175, + RULE_literalValue = 176, RULE_elementList = 177, RULE_keyedElement = 178, + RULE_key = 179, RULE_element = 180, RULE_structType = 181, RULE_fieldDecl = 182, + RULE_string_ = 183, RULE_embeddedField = 184, RULE_index = 185, RULE_typeAssertion = 186, + RULE_arguments = 187, RULE_methodExpr = 188, RULE_receiverType = 189, + RULE_eos = 190; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", @@ -108,34 +110,36 @@ private static String[] makeRuleNames() { "old", "oldLabelUse", "labelUse", "before", "isComparable", "typeOf", "access", "range", "matchExpr", "matchExprClause", "seqUpdExp", "seqUpdClause", "ghostTypeLit", "domainType", "domainClause", "adtType", "adtClause", - "adtFieldDecl", "ghostSliceType", "sqType", "specification", "specStatement", - "terminationMeasure", "assertion", "matchStmt", "matchStmtClause", "matchCase", - "matchPattern", "matchPatternList", "blockWithBodyParameterInfo", "closureSpecInstance", - "closureSpecParams", "closureSpecParam", "closureImplProofStmt", "implementationProof", - "methodImplementationProof", "nonLocalReceiver", "selection", "implementationProofPredicateAlias", - "make", "new_", "specMember", "functionDecl", "methodDecl", "explicitGhostMember", - "fpredicateDecl", "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl", - "receiver", "parameterDecl", "actualParameterDecl", "ghostParameterDecl", - "parameterType", "expression", "statement", "applyStmt", "packageStmt", - "specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", - "closureDecl", "predConstructArgs", "interfaceType", "predicateSpec", - "methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType", - "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause", - "packageClause", "importPath", "declaration", "constDecl", "constSpec", - "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl", - "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt", - "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt", - "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt", - "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", - "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", - "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt", - "typeName", "arrayType", "arrayLength", "elementType", "pointerType", - "sliceType", "mapType", "channelType", "functionType", "signature", "result", - "parameters", "conversion", "nonNamedType", "operand", "literal", "integer", - "operandName", "qualifiedIdent", "compositeLit", "literalValue", "elementList", - "keyedElement", "key", "element", "structType", "fieldDecl", "string_", - "embeddedField", "index", "typeAssertion", "arguments", "methodExpr", - "receiverType", "eos" + "adtFieldDecl", "ghostSliceType", "sqType", "specification", "backendAnnotationEntry", + "listOfValues", "singleBackendAnnotation", "backendAnnotationList", "backendAnnotation", + "specStatement", "terminationMeasure", "assertion", "matchStmt", "matchStmtClause", + "matchCase", "matchPattern", "matchPatternList", "blockWithBodyParameterInfo", + "closureSpecInstance", "closureSpecParams", "closureSpecParam", "closureImplProofStmt", + "implementationProof", "methodImplementationProof", "nonLocalReceiver", + "selection", "implementationProofPredicateAlias", "make", "new_", "specMember", + "functionDecl", "methodDecl", "explicitGhostMember", "fpredicateDecl", + "predicateBody", "mpredicateDecl", "varSpec", "shortVarDecl", "receiver", + "parameterDecl", "actualParameterDecl", "ghostParameterDecl", "parameterType", + "expression", "statement", "applyStmt", "packageStmt", "specForStmt", + "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", "closureDecl", + "predConstructArgs", "interfaceType", "predicateSpec", "methodSpec", + "type_", "typeLit", "predType", "predTypeParams", "literalType", "implicitArray", + "slice_", "low", "high", "cap", "assign_op", "rangeClause", "packageClause", + "importPath", "declaration", "constDecl", "constSpec", "identifierList", + "expressionList", "typeDecl", "typeSpec", "varDecl", "block", "statementList", + "simpleStmt", "expressionStmt", "sendStmt", "incDecStmt", "assignment", + "emptyStmt", "labeledStmt", "returnStmt", "breakStmt", "continueStmt", + "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt", + "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard", + "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", "commClause", + "commCase", "recvStmt", "forStmt", "forClause", "goStmt", "typeName", + "arrayType", "arrayLength", "elementType", "pointerType", "sliceType", + "mapType", "channelType", "functionType", "signature", "result", "parameters", + "conversion", "nonNamedType", "operand", "literal", "integer", "operandName", + "qualifiedIdent", "compositeLit", "literalValue", "elementList", "keyedElement", + "key", "element", "structType", "fieldDecl", "string_", "embeddedField", + "index", "typeAssertion", "arguments", "methodExpr", "receiverType", + "eos" }; } public static final String[] ruleNames = makeRuleNames(); @@ -153,15 +157,15 @@ private static String[] makeLiteralNames() { "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", "'importRequires'", "'proof'", - "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'break'", "'default'", - "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", - "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", - "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", - "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", - "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", - "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", - "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", - "'^'", "'*'", "'&'", "'<-'" + "'==='", "'!=='", "'with'", "'opaque'", "'reveal'", "'#backend'", "'break'", + "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", + "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'", + "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", + "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, + "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", + "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", + "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", + "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -177,7 +181,7 @@ private static String[] makeSymbolicNames() { "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", - "WITH", "OPAQUE", "REVEAL", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "WITH", "OPAQUE", "REVEAL", "BACKEND", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", @@ -269,9 +273,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(372); + setState(382); expression(0); - setState(373); + setState(383); match(EOF); } } @@ -309,9 +313,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(375); + setState(385); statement(); - setState(376); + setState(386); match(EOF); } } @@ -349,9 +353,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(378); + setState(388); type_(); - setState(379); + setState(389); match(EOF); } } @@ -396,21 +400,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis try { enterOuterAlt(_localctx, 1); { - setState(381); + setState(391); maybeAddressableIdentifier(); - setState(386); + setState(396); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(382); + setState(392); match(COMMA); - setState(383); + setState(393); maybeAddressableIdentifier(); } } - setState(388); + setState(398); _errHandler.sync(this); _la = _input.LA(1); } @@ -449,14 +453,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro try { enterOuterAlt(_localctx, 1); { - setState(389); + setState(399); match(IDENTIFIER); - setState(391); + setState(401); _errHandler.sync(this); _la = _input.LA(1); if (_la==ADDR_MOD) { { - setState(390); + setState(400); match(ADDR_MOD); } } @@ -534,79 +538,79 @@ public final SourceFileContext sourceFile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(398); + setState(408); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(393); + setState(403); initPost(); - setState(394); + setState(404); eos(); } } - setState(400); + setState(410); _errHandler.sync(this); _la = _input.LA(1); } - setState(401); + setState(411); packageClause(); - setState(402); + setState(412); eos(); - setState(408); + setState(418); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(403); + setState(413); importDecl(); - setState(404); + setState(414); eos(); } } - setState(410); + setState(420); _errHandler.sync(this); _la = _input.LA(1); } - setState(420); + setState(430); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101061120L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 2422933827841L) != 0) || _la==STAR || _la==RECEIVE) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101061120L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 4845867656449L) != 0) || _la==STAR || _la==RECEIVE) { { { - setState(414); + setState(424); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: { - setState(411); + setState(421); specMember(); } break; case 2: { - setState(412); + setState(422); declaration(); } break; case 3: { - setState(413); + setState(423); ghostMember(); } break; } - setState(416); + setState(426); eos(); } } - setState(422); + setState(432); _errHandler.sync(this); _la = _input.LA(1); } - setState(423); + setState(433); match(EOF); } } @@ -662,39 +666,39 @@ public final PreambleContext preamble() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(430); + setState(440); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(425); + setState(435); initPost(); - setState(426); + setState(436); eos(); } } - setState(432); + setState(442); _errHandler.sync(this); _la = _input.LA(1); } - setState(433); + setState(443); packageClause(); - setState(434); + setState(444); eos(); - setState(440); + setState(450); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(435); + setState(445); importDecl(); - setState(436); + setState(446); eos(); } } - setState(442); + setState(452); _errHandler.sync(this); _la = _input.LA(1); } @@ -734,9 +738,9 @@ public final InitPostContext initPost() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(443); + setState(453); match(INIT_POST); - setState(444); + setState(454); expression(0); } } @@ -774,9 +778,9 @@ public final ImportPreContext importPre() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(446); + setState(456); match(IMPORT_PRE); - setState(447); + setState(457); expression(0); } } @@ -829,28 +833,28 @@ public final ImportSpecContext importSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(454); + setState(464); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(449); + setState(459); importPre(); - setState(450); + setState(460); eos(); } } - setState(456); + setState(466); _errHandler.sync(this); _la = _input.LA(1); } - setState(458); + setState(468); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER || _la==DOT) { { - setState(457); + setState(467); ((ImportSpecContext)_localctx).alias = _input.LT(1); _la = _input.LA(1); if ( !(_la==IDENTIFIER || _la==DOT) ) { @@ -864,7 +868,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { } } - setState(460); + setState(470); importPath(); } } @@ -920,56 +924,56 @@ public final ImportDeclContext importDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(467); + setState(477); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(462); + setState(472); importPre(); - setState(463); + setState(473); eos(); } } - setState(469); + setState(479); _errHandler.sync(this); _la = _input.LA(1); } - setState(483); + setState(493); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { case 1: { - setState(470); + setState(480); match(IMPORT); - setState(471); + setState(481); importSpec(); } break; case 2: { - setState(472); + setState(482); match(IMPORT); - setState(473); + setState(483); match(L_PAREN); - setState(479); + setState(489); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & 17600775979009L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { + while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & 35201551958017L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { - setState(474); + setState(484); importSpec(); - setState(475); + setState(485); eos(); } } - setState(481); + setState(491); _errHandler.sync(this); _la = _input.LA(1); } - setState(482); + setState(492); match(R_PAREN); } break; @@ -1016,34 +1020,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException { GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState()); enterRule(_localctx, 22, RULE_ghostMember); try { - setState(489); + setState(499); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(485); + setState(495); implementationProof(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(486); + setState(496); fpredicateDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(487); + setState(497); mpredicateDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(488); + setState(498); explicitGhostMember(); } break; @@ -1135,16 +1139,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException enterRule(_localctx, 24, RULE_ghostStatement); int _la; try { - setState(498); + setState(508); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: _localctx = new ExplicitGhostStatementContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(491); + setState(501); match(GHOST); - setState(492); + setState(502); statement(); } break; @@ -1153,7 +1157,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new FoldStatementContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(493); + setState(503); ((FoldStatementContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -1164,7 +1168,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(494); + setState(504); predicateAccess(); } break; @@ -1175,7 +1179,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new ProofStatementContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(495); + setState(505); ((ProofStatementContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 480L) != 0)) ) { @@ -1186,7 +1190,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(496); + setState(506); expression(0); } break; @@ -1194,7 +1198,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new MatchStmt_Context(_localctx); enterOuterAlt(_localctx, 4); { - setState(497); + setState(507); matchStmt(); } break; @@ -1235,7 +1239,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(500); + setState(510); statementWithSpec(); } } @@ -1276,10 +1280,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(502); + setState(512); ((StatementWithSpecContext)_localctx).specification = specification(); { - setState(503); + setState(513); outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure); } } @@ -1325,21 +1329,21 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu try { enterOuterAlt(_localctx, 1); { - setState(505); + setState(515); match(OUTLINE); - setState(506); + setState(516); match(L_PAREN); - setState(508); + setState(518); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(507); + setState(517); statementList(); } break; } - setState(510); + setState(520); match(R_PAREN); } } @@ -1410,97 +1414,97 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState()); enterRule(_localctx, 32, RULE_ghostPrimaryExpr); try { - setState(525); + setState(535); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(512); + setState(522); range(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(513); + setState(523); access(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(514); + setState(524); typeOf(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(515); + setState(525); typeExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(516); + setState(526); isComparable(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(517); + setState(527); old(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(518); + setState(528); before(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(519); + setState(529); sConversion(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(520); + setState(530); optionNone(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(521); + setState(531); optionSome(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(522); + setState(532); optionGet(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(523); + setState(533); permission(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(524); + setState(534); matchExpr(); } break; @@ -1539,7 +1543,7 @@ public final PermissionContext permission() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(527); + setState(537); _la = _input.LA(1); if ( !(_la==WRITEPERM || _la==NOPERM) ) { _errHandler.recoverInline(this); @@ -1587,13 +1591,13 @@ public final TypeExprContext typeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(529); + setState(539); match(TYPE); - setState(530); + setState(540); match(L_BRACKET); - setState(531); + setState(541); type_(); - setState(532); + setState(542); match(R_BRACKET); } } @@ -1639,32 +1643,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(534); + setState(544); boundVariableDecl(); - setState(539); + setState(549); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(535); + setState(545); match(COMMA); - setState(536); + setState(546); boundVariableDecl(); } } } - setState(541); + setState(551); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } - setState(543); + setState(553); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(542); + setState(552); match(COMMA); } } @@ -1713,25 +1717,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(545); + setState(555); match(IDENTIFIER); - setState(550); + setState(560); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(546); + setState(556); match(COMMA); - setState(547); + setState(557); match(IDENTIFIER); } } - setState(552); + setState(562); _errHandler.sync(this); _la = _input.LA(1); } - setState(553); + setState(563); elementType(); } } @@ -1772,17 +1776,17 @@ public final TriggersContext triggers() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(558); + setState(568); _errHandler.sync(this); _la = _input.LA(1); while (_la==L_CURLY) { { { - setState(555); + setState(565); trigger(); } } - setState(560); + setState(570); _errHandler.sync(this); _la = _input.LA(1); } @@ -1831,27 +1835,27 @@ public final TriggerContext trigger() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(561); + setState(571); match(L_CURLY); - setState(562); + setState(572); expression(0); - setState(567); + setState(577); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(563); + setState(573); match(COMMA); - setState(564); + setState(574); expression(0); } } - setState(569); + setState(579); _errHandler.sync(this); _la = _input.LA(1); } - setState(570); + setState(580); match(R_CURLY); } } @@ -1888,7 +1892,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(572); + setState(582); primaryExpr(0); } } @@ -1928,13 +1932,13 @@ public final OptionSomeContext optionSome() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(574); + setState(584); match(SOME); - setState(575); + setState(585); match(L_PAREN); - setState(576); + setState(586); expression(0); - setState(577); + setState(587); match(R_PAREN); } } @@ -1974,13 +1978,13 @@ public final OptionNoneContext optionNone() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(579); + setState(589); match(NONE); - setState(580); + setState(590); match(L_BRACKET); - setState(581); + setState(591); type_(); - setState(582); + setState(592); match(R_BRACKET); } } @@ -2020,13 +2024,13 @@ public final OptionGetContext optionGet() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(584); + setState(594); match(GET); - setState(585); + setState(595); match(L_PAREN); - setState(586); + setState(596); expression(0); - setState(587); + setState(597); match(R_PAREN); } } @@ -2070,7 +2074,7 @@ public final SConversionContext sConversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(589); + setState(599); ((SConversionContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { @@ -2081,11 +2085,11 @@ public final SConversionContext sConversion() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(590); + setState(600); match(L_PAREN); - setState(591); + setState(601); expression(0); - setState(592); + setState(602); match(R_PAREN); } } @@ -2131,27 +2135,27 @@ public final OldContext old() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(594); + setState(604); match(OLD); - setState(599); + setState(609); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(595); + setState(605); match(L_BRACKET); - setState(596); + setState(606); oldLabelUse(); - setState(597); + setState(607); match(R_BRACKET); } } - setState(601); + setState(611); match(L_PAREN); - setState(602); + setState(612); expression(0); - setState(603); + setState(613); match(R_PAREN); } } @@ -2187,20 +2191,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException { OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState()); enterRule(_localctx, 58, RULE_oldLabelUse); try { - setState(607); + setState(617); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(605); + setState(615); labelUse(); } break; case LHS: enterOuterAlt(_localctx, 2); { - setState(606); + setState(616); match(LHS); } break; @@ -2239,7 +2243,7 @@ public final LabelUseContext labelUse() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(609); + setState(619); match(IDENTIFIER); } } @@ -2279,13 +2283,13 @@ public final BeforeContext before() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(611); + setState(621); match(BEFORE); - setState(612); + setState(622); match(L_PAREN); - setState(613); + setState(623); expression(0); - setState(614); + setState(624); match(R_PAREN); } } @@ -2325,13 +2329,13 @@ public final IsComparableContext isComparable() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(616); + setState(626); match(IS_COMPARABLE); - setState(617); + setState(627); match(L_PAREN); - setState(618); + setState(628); expression(0); - setState(619); + setState(629); match(R_PAREN); } } @@ -2371,13 +2375,13 @@ public final TypeOfContext typeOf() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(621); + setState(631); match(TYPE_OF); - setState(622); + setState(632); match(L_PAREN); - setState(623); + setState(633); expression(0); - setState(624); + setState(634); match(R_PAREN); } } @@ -2422,25 +2426,25 @@ public final AccessContext access() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(626); + setState(636); match(ACCESS); - setState(627); + setState(637); match(L_PAREN); - setState(628); + setState(638); expression(0); - setState(631); + setState(641); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(629); + setState(639); match(COMMA); - setState(630); + setState(640); expression(0); } } - setState(633); + setState(643); match(R_PAREN); } } @@ -2488,7 +2492,7 @@ public final RangeContext range() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(635); + setState(645); ((RangeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { @@ -2499,15 +2503,15 @@ public final RangeContext range() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(636); + setState(646); match(L_BRACKET); - setState(637); + setState(647); expression(0); - setState(638); + setState(648); match(DOT_DOT); - setState(639); + setState(649); expression(0); - setState(640); + setState(650); match(R_BRACKET); } } @@ -2560,29 +2564,29 @@ public final MatchExprContext matchExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(642); + setState(652); match(MATCH); - setState(643); + setState(653); expression(0); - setState(644); + setState(654); match(L_CURLY); - setState(650); + setState(660); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(645); + setState(655); matchExprClause(); - setState(646); + setState(656); eos(); } } - setState(652); + setState(662); _errHandler.sync(this); _la = _input.LA(1); } - setState(653); + setState(663); match(R_CURLY); } } @@ -2623,11 +2627,11 @@ public final MatchExprClauseContext matchExprClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(655); + setState(665); matchCase(); - setState(656); + setState(666); match(COLON); - setState(657); + setState(667); expression(0); } } @@ -2674,29 +2678,29 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(659); + setState(669); match(L_BRACKET); { - setState(660); + setState(670); seqUpdClause(); - setState(665); + setState(675); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(661); + setState(671); match(COMMA); - setState(662); + setState(672); seqUpdClause(); } } - setState(667); + setState(677); _errHandler.sync(this); _la = _input.LA(1); } } - setState(668); + setState(678); match(R_BRACKET); } } @@ -2737,11 +2741,11 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(670); + setState(680); expression(0); - setState(671); + setState(681); match(ASSIGN); - setState(672); + setState(682); expression(0); } } @@ -2785,7 +2789,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState()); enterRule(_localctx, 80, RULE_ghostTypeLit); try { - setState(678); + setState(688); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2795,28 +2799,28 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { case OPT: enterOuterAlt(_localctx, 1); { - setState(674); + setState(684); sqType(); } break; case GHOST: enterOuterAlt(_localctx, 2); { - setState(675); + setState(685); ghostSliceType(); } break; case DOM: enterOuterAlt(_localctx, 3); { - setState(676); + setState(686); domainType(); } break; case ADT: enterOuterAlt(_localctx, 4); { - setState(677); + setState(687); adtType(); } break; @@ -2870,27 +2874,27 @@ public final DomainTypeContext domainType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(680); + setState(690); match(DOM); - setState(681); + setState(691); match(L_CURLY); - setState(687); + setState(697); _errHandler.sync(this); _la = _input.LA(1); while (_la==AXIOM || _la==FUNC) { { { - setState(682); + setState(692); domainClause(); - setState(683); + setState(693); eos(); } } - setState(689); + setState(699); _errHandler.sync(this); _la = _input.LA(1); } - setState(690); + setState(700); match(R_CURLY); } } @@ -2936,32 +2940,32 @@ public final DomainClauseContext domainClause() throws RecognitionException { DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState()); enterRule(_localctx, 84, RULE_domainClause); try { - setState(701); + setState(711); _errHandler.sync(this); switch (_input.LA(1)) { case FUNC: enterOuterAlt(_localctx, 1); { - setState(692); + setState(702); match(FUNC); - setState(693); + setState(703); match(IDENTIFIER); - setState(694); + setState(704); signature(); } break; case AXIOM: enterOuterAlt(_localctx, 2); { - setState(695); + setState(705); match(AXIOM); - setState(696); + setState(706); match(L_CURLY); - setState(697); + setState(707); expression(0); - setState(698); + setState(708); eos(); - setState(699); + setState(709); match(R_CURLY); } break; @@ -3015,27 +3019,27 @@ public final AdtTypeContext adtType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(703); + setState(713); match(ADT); - setState(704); + setState(714); match(L_CURLY); - setState(710); + setState(720); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(705); + setState(715); adtClause(); - setState(706); + setState(716); eos(); } } - setState(712); + setState(722); _errHandler.sync(this); _la = _input.LA(1); } - setState(713); + setState(723); match(R_CURLY); } } @@ -3085,27 +3089,27 @@ public final AdtClauseContext adtClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(715); + setState(725); match(IDENTIFIER); - setState(716); + setState(726); match(L_CURLY); - setState(722); + setState(732); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & 1441151881345761731L) != 0)) { { { - setState(717); + setState(727); adtFieldDecl(); - setState(718); + setState(728); eos(); } } - setState(724); + setState(734); _errHandler.sync(this); _la = _input.LA(1); } - setState(725); + setState(735); match(R_CURLY); } } @@ -3145,17 +3149,17 @@ public final AdtFieldDeclContext adtFieldDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(728); + setState(738); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { - setState(727); + setState(737); identifierList(); } break; } - setState(730); + setState(740); type_(); } } @@ -3195,13 +3199,13 @@ public final GhostSliceTypeContext ghostSliceType() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(732); + setState(742); match(GHOST); - setState(733); + setState(743); match(L_BRACKET); - setState(734); + setState(744); match(R_BRACKET); - setState(735); + setState(745); elementType(); } } @@ -3248,7 +3252,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterRule(_localctx, 94, RULE_sqType); int _la; try { - setState(748); + setState(758); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3258,7 +3262,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(737); + setState(747); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) { @@ -3269,11 +3273,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(738); + setState(748); match(L_BRACKET); - setState(739); + setState(749); type_(); - setState(740); + setState(750); match(R_BRACKET); } } @@ -3281,15 +3285,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(742); + setState(752); ((SqTypeContext)_localctx).kind = match(DICT); - setState(743); + setState(753); match(L_BRACKET); - setState(744); + setState(754); type_(); - setState(745); + setState(755); match(R_BRACKET); - setState(746); + setState(756); type_(); } break; @@ -3323,6 +3327,9 @@ public EosContext eos(int i) { public TerminalNode PURE(int i) { return getToken(GobraParser.PURE, i); } + public BackendAnnotationContext backendAnnotation() { + return getRuleContext(BackendAnnotationContext.class,0); + } public List specStatement() { return getRuleContexts(SpecStatementContext.class); } @@ -3356,14 +3363,14 @@ public final SpecificationContext specification() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(762); + setState(772); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(757); + setState(767); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3371,27 +3378,27 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(750); + setState(760); specStatement(); } break; case OPAQUE: { - setState(751); + setState(761); match(OPAQUE); ((SpecificationContext)_localctx).opaque = true; } break; case PURE: { - setState(753); + setState(763); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(755); + setState(765); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3399,26 +3406,341 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(759); + setState(769); eos(); } } } - setState(764); + setState(774); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } - setState(767); + setState(777); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PURE) { + { + setState(775); + match(PURE); + ((SpecificationContext)_localctx).pure = true; + } + } + + setState(780); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==BACKEND) { + { + setState(779); + backendAnnotation(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BackendAnnotationEntryContext extends ParserRuleContext { + public List L_PAREN() { return getTokens(GobraParser.L_PAREN); } + public TerminalNode L_PAREN(int i) { + return getToken(GobraParser.L_PAREN, i); + } + public List R_PAREN() { return getTokens(GobraParser.R_PAREN); } + public TerminalNode R_PAREN(int i) { + return getToken(GobraParser.R_PAREN, i); + } + public List COMMA() { return getTokens(GobraParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(GobraParser.COMMA, i); + } + public BackendAnnotationEntryContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_backendAnnotationEntry; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitBackendAnnotationEntry(this); + else return visitor.visitChildren(this); + } + } + + public final BackendAnnotationEntryContext backendAnnotationEntry() throws RecognitionException { + BackendAnnotationEntryContext _localctx = new BackendAnnotationEntryContext(_ctx, getState()); + enterRule(_localctx, 98, RULE_backendAnnotationEntry); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(783); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(782); + _la = _input.LA(1); + if ( _la <= 0 || (((((_la - 105)) & ~0x3f) == 0 && ((1L << (_la - 105)) & 131L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + setState(785); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -288072046477313L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 68719476735L) != 0) ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ListOfValuesContext extends ParserRuleContext { + public List backendAnnotationEntry() { + return getRuleContexts(BackendAnnotationEntryContext.class); + } + public BackendAnnotationEntryContext backendAnnotationEntry(int i) { + return getRuleContext(BackendAnnotationEntryContext.class,i); + } + public List COMMA() { return getTokens(GobraParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(GobraParser.COMMA, i); + } + public ListOfValuesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_listOfValues; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitListOfValues(this); + else return visitor.visitChildren(this); + } + } + + public final ListOfValuesContext listOfValues() throws RecognitionException { + ListOfValuesContext _localctx = new ListOfValuesContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_listOfValues); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(787); + backendAnnotationEntry(); + setState(792); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(788); + match(COMMA); + setState(789); + backendAnnotationEntry(); + } + } + setState(794); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SingleBackendAnnotationContext extends ParserRuleContext { + public BackendAnnotationEntryContext backendAnnotationEntry() { + return getRuleContext(BackendAnnotationEntryContext.class,0); + } + public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } + public TerminalNode R_PAREN() { return getToken(GobraParser.R_PAREN, 0); } + public ListOfValuesContext listOfValues() { + return getRuleContext(ListOfValuesContext.class,0); + } + public SingleBackendAnnotationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_singleBackendAnnotation; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitSingleBackendAnnotation(this); + else return visitor.visitChildren(this); + } + } + + public final SingleBackendAnnotationContext singleBackendAnnotation() throws RecognitionException { + SingleBackendAnnotationContext _localctx = new SingleBackendAnnotationContext(_ctx, getState()); + enterRule(_localctx, 102, RULE_singleBackendAnnotation); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(795); + backendAnnotationEntry(); + setState(796); + match(L_PAREN); + setState(798); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -288072046477313L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 68719476735L) != 0)) { + { + setState(797); + listOfValues(); + } + } + + setState(800); + match(R_PAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BackendAnnotationListContext extends ParserRuleContext { + public List singleBackendAnnotation() { + return getRuleContexts(SingleBackendAnnotationContext.class); + } + public SingleBackendAnnotationContext singleBackendAnnotation(int i) { + return getRuleContext(SingleBackendAnnotationContext.class,i); + } + public List COMMA() { return getTokens(GobraParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(GobraParser.COMMA, i); + } + public BackendAnnotationListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_backendAnnotationList; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitBackendAnnotationList(this); + else return visitor.visitChildren(this); + } + } + + public final BackendAnnotationListContext backendAnnotationList() throws RecognitionException { + BackendAnnotationListContext _localctx = new BackendAnnotationListContext(_ctx, getState()); + enterRule(_localctx, 104, RULE_backendAnnotationList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(802); + singleBackendAnnotation(); + setState(807); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(803); + match(COMMA); + setState(804); + singleBackendAnnotation(); + } + } + setState(809); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BackendAnnotationContext extends ParserRuleContext { + public TerminalNode BACKEND() { return getToken(GobraParser.BACKEND, 0); } + public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } + public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } + public EosContext eos() { + return getRuleContext(EosContext.class,0); + } + public BackendAnnotationListContext backendAnnotationList() { + return getRuleContext(BackendAnnotationListContext.class,0); + } + public BackendAnnotationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_backendAnnotation; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitBackendAnnotation(this); + else return visitor.visitChildren(this); + } + } + + public final BackendAnnotationContext backendAnnotation() throws RecognitionException { + BackendAnnotationContext _localctx = new BackendAnnotationContext(_ctx, getState()); + enterRule(_localctx, 106, RULE_backendAnnotation); + try { + enterOuterAlt(_localctx, 1); + { + setState(810); + match(BACKEND); + setState(811); + match(L_BRACKET); + setState(813); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==PURE) { + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + case 1: { - setState(765); - match(PURE); - ((SpecificationContext)_localctx).pure = true; + setState(812); + backendAnnotationList(); } + break; } - + setState(815); + match(R_BRACKET); + setState(816); + eos(); } } catch (RecognitionException re) { @@ -3458,44 +3780,44 @@ public T accept(ParseTreeVisitor visitor) { public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_specStatement); + enterRule(_localctx, 108, RULE_specStatement); try { - setState(777); + setState(826); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(769); + setState(818); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(770); + setState(819); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(771); + setState(820); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(772); + setState(821); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(773); + setState(822); ((SpecStatementContext)_localctx).kind = match(POST); - setState(774); + setState(823); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(775); + setState(824); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(776); + setState(825); terminationMeasure(); } break; @@ -3536,28 +3858,28 @@ public T accept(ParseTreeVisitor visitor) { public final TerminationMeasureContext terminationMeasure() throws RecognitionException { TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_terminationMeasure); + enterRule(_localctx, 110, RULE_terminationMeasure); try { enterOuterAlt(_localctx, 1); { - setState(780); + setState(829); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { case 1: { - setState(779); + setState(828); expressionList(); } break; } - setState(784); + setState(833); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(782); + setState(831); match(IF); - setState(783); + setState(832); expression(0); } break; @@ -3593,11 +3915,11 @@ public T accept(ParseTreeVisitor visitor) { public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_assertion); + enterRule(_localctx, 112, RULE_assertion); try { - setState(788); + setState(837); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { @@ -3606,7 +3928,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(787); + setState(836); expression(0); } break; @@ -3650,32 +3972,32 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtContext matchStmt() throws RecognitionException { MatchStmtContext _localctx = new MatchStmtContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_matchStmt); + enterRule(_localctx, 114, RULE_matchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(790); + setState(839); match(MATCH); - setState(791); + setState(840); expression(0); - setState(792); + setState(841); match(L_CURLY); - setState(796); + setState(845); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(793); + setState(842); matchStmtClause(); } } - setState(798); + setState(847); _errHandler.sync(this); _la = _input.LA(1); } - setState(799); + setState(848); match(R_CURLY); } } @@ -3712,20 +4034,20 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtClauseContext matchStmtClause() throws RecognitionException { MatchStmtClauseContext _localctx = new MatchStmtClauseContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_matchStmtClause); + enterRule(_localctx, 116, RULE_matchStmtClause); try { enterOuterAlt(_localctx, 1); { - setState(801); + setState(850); matchCase(); - setState(802); + setState(851); match(COLON); - setState(804); + setState(853); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(803); + setState(852); statementList(); } break; @@ -3763,24 +4085,24 @@ public T accept(ParseTreeVisitor visitor) { public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_matchCase); + enterRule(_localctx, 118, RULE_matchCase); try { - setState(809); + setState(858); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(806); + setState(855); match(CASE); - setState(807); + setState(856); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(808); + setState(857); match(DEFAULT); } break; @@ -3855,19 +4177,19 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternContext matchPattern() throws RecognitionException { MatchPatternContext _localctx = new MatchPatternContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_matchPattern); + enterRule(_localctx, 120, RULE_matchPattern); int _la; try { - setState(824); + setState(873); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(811); + setState(860); match(QMARK); - setState(812); + setState(861); match(IDENTIFIER); } break; @@ -3875,23 +4197,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(813); + setState(862); literalType(); - setState(814); + setState(863); match(L_CURLY); - setState(819); + setState(868); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956190846021146L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956190846021146L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(815); + setState(864); matchPatternList(); - setState(817); + setState(866); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(816); + setState(865); match(COMMA); } } @@ -3899,7 +4221,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(821); + setState(870); match(R_CURLY); } break; @@ -3907,7 +4229,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(823); + setState(872); expression(0); } break; @@ -3949,30 +4271,30 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternListContext matchPatternList() throws RecognitionException { MatchPatternListContext _localctx = new MatchPatternListContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_matchPatternList); + enterRule(_localctx, 122, RULE_matchPatternList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(826); + setState(875); matchPattern(); - setState(831); + setState(880); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,47,_ctx); + _alt = getInterpreter().adaptivePredict(_input,53,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(827); + setState(876); match(COMMA); - setState(828); + setState(877); matchPattern(); } } } - setState(833); + setState(882); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,47,_ctx); + _alt = getInterpreter().adaptivePredict(_input,53,_ctx); } } } @@ -4014,37 +4336,37 @@ public T accept(ParseTreeVisitor visitor) { public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException { BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_blockWithBodyParameterInfo); + enterRule(_localctx, 124, RULE_blockWithBodyParameterInfo); try { enterOuterAlt(_localctx, 1); { - setState(834); + setState(883); match(L_CURLY); - setState(839); + setState(888); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { - setState(835); + setState(884); match(SHARE); - setState(836); + setState(885); identifierList(); - setState(837); + setState(886); eos(); } break; } - setState(842); + setState(891); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(841); + setState(890); statementList(); } break; } - setState(844); + setState(893); match(R_CURLY); } } @@ -4084,47 +4406,47 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecInstanceContext closureSpecInstance() throws RecognitionException { ClosureSpecInstanceContext _localctx = new ClosureSpecInstanceContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_closureSpecInstance); + enterRule(_localctx, 126, RULE_closureSpecInstance); int _la; try { enterOuterAlt(_localctx, 1); { - setState(848); + setState(897); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { case 1: { - setState(846); + setState(895); qualifiedIdent(); } break; case 2: { - setState(847); + setState(896); match(IDENTIFIER); } break; } - setState(858); + setState(907); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { case 1: { - setState(850); + setState(899); match(L_CURLY); - setState(855); + setState(904); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(851); + setState(900); closureSpecParams(); - setState(853); + setState(902); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(852); + setState(901); match(COMMA); } } @@ -4132,7 +4454,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(857); + setState(906); match(R_CURLY); } break; @@ -4175,30 +4497,30 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamsContext closureSpecParams() throws RecognitionException { ClosureSpecParamsContext _localctx = new ClosureSpecParamsContext(_ctx, getState()); - enterRule(_localctx, 118, RULE_closureSpecParams); + enterRule(_localctx, 128, RULE_closureSpecParams); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(860); + setState(909); closureSpecParam(); - setState(865); + setState(914); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,54,_ctx); + _alt = getInterpreter().adaptivePredict(_input,60,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(861); + setState(910); match(COMMA); - setState(862); + setState(911); closureSpecParam(); } } } - setState(867); + setState(916); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,54,_ctx); + _alt = getInterpreter().adaptivePredict(_input,60,_ctx); } } } @@ -4233,23 +4555,23 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamContext closureSpecParam() throws RecognitionException { ClosureSpecParamContext _localctx = new ClosureSpecParamContext(_ctx, getState()); - enterRule(_localctx, 120, RULE_closureSpecParam); + enterRule(_localctx, 130, RULE_closureSpecParam); try { enterOuterAlt(_localctx, 1); { - setState(870); + setState(919); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(868); + setState(917); match(IDENTIFIER); - setState(869); + setState(918); match(COLON); } break; } - setState(872); + setState(921); expression(0); } } @@ -4290,19 +4612,19 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureImplProofStmtContext closureImplProofStmt() throws RecognitionException { ClosureImplProofStmtContext _localctx = new ClosureImplProofStmtContext(_ctx, getState()); - enterRule(_localctx, 122, RULE_closureImplProofStmt); + enterRule(_localctx, 132, RULE_closureImplProofStmt); try { enterOuterAlt(_localctx, 1); { - setState(874); + setState(923); match(PROOF); - setState(875); + setState(924); expression(0); - setState(876); + setState(925); match(IMPL); - setState(877); + setState(926); closureSpecInstance(); - setState(878); + setState(927); block(); } } @@ -4359,57 +4681,57 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofContext implementationProof() throws RecognitionException { ImplementationProofContext _localctx = new ImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 124, RULE_implementationProof); + enterRule(_localctx, 134, RULE_implementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(880); + setState(929); type_(); - setState(881); + setState(930); match(IMPL); - setState(882); + setState(931); type_(); - setState(901); + setState(950); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { case 1: { - setState(883); + setState(932); match(L_CURLY); - setState(889); + setState(938); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(884); + setState(933); implementationProofPredicateAlias(); - setState(885); + setState(934); eos(); } } - setState(891); + setState(940); _errHandler.sync(this); _la = _input.LA(1); } - setState(897); + setState(946); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(892); + setState(941); methodImplementationProof(); - setState(893); + setState(942); eos(); } } - setState(899); + setState(948); _errHandler.sync(this); _la = _input.LA(1); } - setState(900); + setState(949); match(R_CURLY); } break; @@ -4453,33 +4775,33 @@ public T accept(ParseTreeVisitor visitor) { public final MethodImplementationProofContext methodImplementationProof() throws RecognitionException { MethodImplementationProofContext _localctx = new MethodImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 126, RULE_methodImplementationProof); + enterRule(_localctx, 136, RULE_methodImplementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(904); + setState(953); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(903); + setState(952); match(PURE); } } - setState(906); + setState(955); nonLocalReceiver(); - setState(907); + setState(956); match(IDENTIFIER); - setState(908); + setState(957); signature(); - setState(910); + setState(959); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { case 1: { - setState(909); + setState(958); block(); } break; @@ -4519,36 +4841,36 @@ public T accept(ParseTreeVisitor visitor) { public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionException { NonLocalReceiverContext _localctx = new NonLocalReceiverContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_nonLocalReceiver); + enterRule(_localctx, 138, RULE_nonLocalReceiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(912); + setState(961); match(L_PAREN); - setState(914); + setState(963); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(913); + setState(962); match(IDENTIFIER); } break; } - setState(917); + setState(966); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(916); + setState(965); match(STAR); } } - setState(919); + setState(968); typeName(); - setState(920); + setState(969); match(R_PAREN); } } @@ -4586,26 +4908,26 @@ public T accept(ParseTreeVisitor visitor) { public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); - enterRule(_localctx, 130, RULE_selection); + enterRule(_localctx, 140, RULE_selection); try { - setState(927); + setState(976); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(922); + setState(971); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(923); + setState(972); type_(); - setState(924); + setState(973); match(DOT); - setState(925); + setState(974); match(IDENTIFIER); } break; @@ -4646,28 +4968,28 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofPredicateAliasContext implementationProofPredicateAlias() throws RecognitionException { ImplementationProofPredicateAliasContext _localctx = new ImplementationProofPredicateAliasContext(_ctx, getState()); - enterRule(_localctx, 132, RULE_implementationProofPredicateAlias); + enterRule(_localctx, 142, RULE_implementationProofPredicateAlias); try { enterOuterAlt(_localctx, 1); { - setState(929); + setState(978); match(PRED); - setState(930); + setState(979); match(IDENTIFIER); - setState(931); + setState(980); match(DECLARE_ASSIGN); - setState(934); + setState(983); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(932); + setState(981); selection(); } break; case 2: { - setState(933); + setState(982); operandName(); } break; @@ -4710,30 +5032,30 @@ public T accept(ParseTreeVisitor visitor) { public final MakeContext make() throws RecognitionException { MakeContext _localctx = new MakeContext(_ctx, getState()); - enterRule(_localctx, 134, RULE_make); + enterRule(_localctx, 144, RULE_make); int _la; try { enterOuterAlt(_localctx, 1); { - setState(936); + setState(985); match(MAKE); - setState(937); + setState(986); match(L_PAREN); - setState(938); + setState(987); type_(); - setState(941); + setState(990); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(939); + setState(988); match(COMMA); - setState(940); + setState(989); expressionList(); } } - setState(943); + setState(992); match(R_PAREN); } } @@ -4769,17 +5091,17 @@ public T accept(ParseTreeVisitor visitor) { public final New_Context new_() throws RecognitionException { New_Context _localctx = new New_Context(_ctx, getState()); - enterRule(_localctx, 136, RULE_new_); + enterRule(_localctx, 146, RULE_new_); try { enterOuterAlt(_localctx, 1); { - setState(945); + setState(994); match(NEW); - setState(946); + setState(995); match(L_PAREN); - setState(947); + setState(996); type_(); - setState(948); + setState(997); match(R_PAREN); } } @@ -4819,24 +5141,24 @@ public T accept(ParseTreeVisitor visitor) { public final SpecMemberContext specMember() throws RecognitionException { SpecMemberContext _localctx = new SpecMemberContext(_ctx, getState()); - enterRule(_localctx, 138, RULE_specMember); + enterRule(_localctx, 148, RULE_specMember); try { enterOuterAlt(_localctx, 1); { - setState(950); + setState(999); ((SpecMemberContext)_localctx).specification = specification(); - setState(953); + setState(1002); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: { - setState(951); + setState(1000); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; case 2: { - setState(952); + setState(1001); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; @@ -4884,23 +5206,23 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionDeclContext functionDecl(boolean trusted,boolean pure,boolean opaque) throws RecognitionException { FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure, opaque); - enterRule(_localctx, 140, RULE_functionDecl); + enterRule(_localctx, 150, RULE_functionDecl); try { enterOuterAlt(_localctx, 1); { - setState(955); + setState(1004); match(FUNC); - setState(956); + setState(1005); match(IDENTIFIER); { - setState(957); + setState(1006); signature(); - setState(959); + setState(1008); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: { - setState(958); + setState(1007); blockWithBodyParameterInfo(); } break; @@ -4952,25 +5274,25 @@ public T accept(ParseTreeVisitor visitor) { public final MethodDeclContext methodDecl(boolean trusted,boolean pure,boolean opaque) throws RecognitionException { MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure, opaque); - enterRule(_localctx, 142, RULE_methodDecl); + enterRule(_localctx, 152, RULE_methodDecl); try { enterOuterAlt(_localctx, 1); { - setState(961); + setState(1010); match(FUNC); - setState(962); + setState(1011); receiver(); - setState(963); + setState(1012); match(IDENTIFIER); { - setState(964); + setState(1013); signature(); - setState(966); + setState(1015); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: { - setState(965); + setState(1014); blockWithBodyParameterInfo(); } break; @@ -5011,13 +5333,13 @@ public T accept(ParseTreeVisitor visitor) { public final ExplicitGhostMemberContext explicitGhostMember() throws RecognitionException { ExplicitGhostMemberContext _localctx = new ExplicitGhostMemberContext(_ctx, getState()); - enterRule(_localctx, 144, RULE_explicitGhostMember); + enterRule(_localctx, 154, RULE_explicitGhostMember); try { enterOuterAlt(_localctx, 1); { - setState(968); + setState(1017); match(GHOST); - setState(971); + setState(1020); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -5027,9 +5349,10 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case PURE: case TRUSTED: case OPAQUE: + case BACKEND: case FUNC: { - setState(969); + setState(1018); specMember(); } break; @@ -5037,7 +5360,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(970); + setState(1019); declaration(); } break; @@ -5080,22 +5403,22 @@ public T accept(ParseTreeVisitor visitor) { public final FpredicateDeclContext fpredicateDecl() throws RecognitionException { FpredicateDeclContext _localctx = new FpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 146, RULE_fpredicateDecl); + enterRule(_localctx, 156, RULE_fpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(973); + setState(1022); match(PRED); - setState(974); + setState(1023); match(IDENTIFIER); - setState(975); + setState(1024); parameters(); - setState(977); + setState(1026); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: { - setState(976); + setState(1025); predicateBody(); } break; @@ -5136,17 +5459,17 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateBodyContext predicateBody() throws RecognitionException { PredicateBodyContext _localctx = new PredicateBodyContext(_ctx, getState()); - enterRule(_localctx, 148, RULE_predicateBody); + enterRule(_localctx, 158, RULE_predicateBody); try { enterOuterAlt(_localctx, 1); { - setState(979); + setState(1028); match(L_CURLY); - setState(980); + setState(1029); expression(0); - setState(981); + setState(1030); eos(); - setState(982); + setState(1031); match(R_CURLY); } } @@ -5187,24 +5510,24 @@ public T accept(ParseTreeVisitor visitor) { public final MpredicateDeclContext mpredicateDecl() throws RecognitionException { MpredicateDeclContext _localctx = new MpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 150, RULE_mpredicateDecl); + enterRule(_localctx, 160, RULE_mpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(984); + setState(1033); match(PRED); - setState(985); + setState(1034); receiver(); - setState(986); + setState(1035); match(IDENTIFIER); - setState(987); + setState(1036); parameters(); - setState(989); + setState(1038); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: { - setState(988); + setState(1037); predicateBody(); } break; @@ -5247,13 +5570,13 @@ public T accept(ParseTreeVisitor visitor) { public final VarSpecContext varSpec() throws RecognitionException { VarSpecContext _localctx = new VarSpecContext(_ctx, getState()); - enterRule(_localctx, 152, RULE_varSpec); + enterRule(_localctx, 162, RULE_varSpec); try { enterOuterAlt(_localctx, 1); { - setState(991); + setState(1040); maybeAddressableIdentifierList(); - setState(999); + setState(1048); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5276,16 +5599,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(992); + setState(1041); type_(); - setState(995); + setState(1044); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { - setState(993); + setState(1042); match(ASSIGN); - setState(994); + setState(1043); expressionList(); } break; @@ -5294,9 +5617,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(997); + setState(1046); match(ASSIGN); - setState(998); + setState(1047); expressionList(); } break; @@ -5338,15 +5661,15 @@ public T accept(ParseTreeVisitor visitor) { public final ShortVarDeclContext shortVarDecl() throws RecognitionException { ShortVarDeclContext _localctx = new ShortVarDeclContext(_ctx, getState()); - enterRule(_localctx, 154, RULE_shortVarDecl); + enterRule(_localctx, 164, RULE_shortVarDecl); try { enterOuterAlt(_localctx, 1); { - setState(1001); + setState(1050); maybeAddressableIdentifierList(); - setState(1002); + setState(1051); match(DECLARE_ASSIGN); - setState(1003); + setState(1052); expressionList(); } } @@ -5385,36 +5708,36 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverContext receiver() throws RecognitionException { ReceiverContext _localctx = new ReceiverContext(_ctx, getState()); - enterRule(_localctx, 156, RULE_receiver); + enterRule(_localctx, 166, RULE_receiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1005); + setState(1054); match(L_PAREN); - setState(1007); + setState(1056); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: { - setState(1006); + setState(1055); maybeAddressableIdentifier(); } break; } - setState(1009); + setState(1058); type_(); - setState(1011); + setState(1060); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1010); + setState(1059); match(COMMA); } } - setState(1013); + setState(1062); match(R_PAREN); } } @@ -5450,22 +5773,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 158, RULE_parameterDecl); + enterRule(_localctx, 168, RULE_parameterDecl); try { - setState(1017); + setState(1066); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1015); + setState(1064); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1016); + setState(1065); ghostParameterDecl(); } break; @@ -5503,21 +5826,21 @@ public T accept(ParseTreeVisitor visitor) { public final ActualParameterDeclContext actualParameterDecl() throws RecognitionException { ActualParameterDeclContext _localctx = new ActualParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 160, RULE_actualParameterDecl); + enterRule(_localctx, 170, RULE_actualParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(1020); + setState(1069); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { case 1: { - setState(1019); + setState(1068); identifierList(); } break; } - setState(1022); + setState(1071); parameterType(); } } @@ -5554,23 +5877,23 @@ public T accept(ParseTreeVisitor visitor) { public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionException { GhostParameterDeclContext _localctx = new GhostParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 162, RULE_ghostParameterDecl); + enterRule(_localctx, 172, RULE_ghostParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(1024); + setState(1073); match(GHOST); - setState(1026); + setState(1075); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: { - setState(1025); + setState(1074); identifierList(); } break; } - setState(1028); + setState(1077); parameterType(); } } @@ -5604,22 +5927,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterTypeContext parameterType() throws RecognitionException { ParameterTypeContext _localctx = new ParameterTypeContext(_ctx, getState()); - enterRule(_localctx, 164, RULE_parameterType); + enterRule(_localctx, 174, RULE_parameterType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1031); + setState(1080); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1030); + setState(1079); match(ELLIPSIS); } } - setState(1033); + setState(1082); type_(); } } @@ -5934,26 +6257,26 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _parentState = getState(); ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); ExpressionContext _prevctx = _localctx; - int _startState = 166; - enterRecursionRule(_localctx, 166, RULE_expression, _p); + int _startState = 176; + enterRecursionRule(_localctx, 176, RULE_expression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1056); + setState(1105); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { case 1: { _localctx = new UnaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1036); + setState(1085); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 127L) != 0)) ) { + if ( !(((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 127L) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -5961,7 +6284,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1037); + setState(1086); expression(15); } break; @@ -5970,7 +6293,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1038); + setState(1087); primaryExpr(0); } break; @@ -5979,13 +6302,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1039); + setState(1088); match(UNFOLDING); - setState(1040); + setState(1089); predicateAccess(); - setState(1041); + setState(1090); match(IN); - setState(1042); + setState(1091); expression(3); } break; @@ -5994,13 +6317,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1044); + setState(1093); match(LET); - setState(1045); + setState(1094); shortVarDecl(); - setState(1046); + setState(1095); match(IN); - setState(1047); + setState(1096); expression(2); } break; @@ -6009,7 +6332,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1049); + setState(1098); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -6019,41 +6342,41 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1050); + setState(1099); boundVariables(); - setState(1051); + setState(1100); match(COLON); - setState(1052); + setState(1101); match(COLON); - setState(1053); + setState(1102); triggers(); - setState(1054); + setState(1103); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1093); + setState(1142); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,82,_ctx); + _alt = getInterpreter().adaptivePredict(_input,88,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1091); + setState(1140); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1058); + setState(1107); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1059); + setState(1108); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 1567L) != 0)) ) { + if ( !(((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & 1567L) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -6061,7 +6384,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1060); + setState(1109); expression(14); } break; @@ -6069,12 +6392,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1061); + setState(1110); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1062); + setState(1111); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 115)) & ~0x3f) == 0 && ((1L << (_la - 115)) & 3674113L) != 0)) ) { + if ( !(_la==WAND || ((((_la - 116)) & ~0x3f) == 0 && ((1L << (_la - 116)) & 3674113L) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -6082,7 +6405,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1063); + setState(1112); expression(13); } break; @@ -6090,9 +6413,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1064); + setState(1113); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1065); + setState(1114); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { @@ -6103,7 +6426,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1066); + setState(1115); expression(12); } break; @@ -6111,9 +6434,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1067); + setState(1116); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1068); + setState(1117); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { @@ -6124,7 +6447,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1069); + setState(1118); expression(11); } break; @@ -6132,12 +6455,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1070); + setState(1119); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1071); + setState(1120); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 35465847065542659L) != 0)) ) { + if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 70931694131085315L) != 0)) ) { ((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this); } else { @@ -6145,7 +6468,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1072); + setState(1121); expression(10); } break; @@ -6153,11 +6476,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1073); + setState(1122); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1074); + setState(1123); match(LOGICAL_AND); - setState(1075); + setState(1124); expression(8); } break; @@ -6165,11 +6488,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1076); + setState(1125); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1077); + setState(1126); match(LOGICAL_OR); - setState(1078); + setState(1127); expression(7); } break; @@ -6177,11 +6500,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1079); + setState(1128); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1080); + setState(1129); match(IMPLIES); - setState(1081); + setState(1130); expression(5); } break; @@ -6189,15 +6512,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1082); + setState(1131); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1083); + setState(1132); match(QMARK); - setState(1084); + setState(1133); expression(0); - setState(1085); + setState(1134); match(COLON); - setState(1086); + setState(1135); expression(4); } break; @@ -6205,20 +6528,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1088); + setState(1137); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1089); + setState(1138); match(IMPL); - setState(1090); + setState(1139); closureSpecInstance(); } break; } } } - setState(1095); + setState(1144); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,82,_ctx); + _alt = getInterpreter().adaptivePredict(_input,88,_ctx); } } } @@ -6308,148 +6631,148 @@ public T accept(ParseTreeVisitor visitor) { public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); - enterRule(_localctx, 168, RULE_statement); + enterRule(_localctx, 178, RULE_statement); try { - setState(1116); + setState(1165); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1096); + setState(1145); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1097); + setState(1146); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1098); + setState(1147); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1099); + setState(1148); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1100); + setState(1149); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1101); + setState(1150); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1102); + setState(1151); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1103); + setState(1152); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1104); + setState(1153); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1105); + setState(1154); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1106); + setState(1155); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1107); + setState(1156); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1108); + setState(1157); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1109); + setState(1158); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1110); + setState(1159); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1111); + setState(1160); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1112); + setState(1161); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1113); + setState(1162); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1114); + setState(1163); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1115); + setState(1164); closureImplProofStmt(); } break; @@ -6485,13 +6808,13 @@ public T accept(ParseTreeVisitor visitor) { public final ApplyStmtContext applyStmt() throws RecognitionException { ApplyStmtContext _localctx = new ApplyStmtContext(_ctx, getState()); - enterRule(_localctx, 170, RULE_applyStmt); + enterRule(_localctx, 180, RULE_applyStmt); try { enterOuterAlt(_localctx, 1); { - setState(1118); + setState(1167); match(APPLY); - setState(1119); + setState(1168); expression(0); } } @@ -6528,20 +6851,20 @@ public T accept(ParseTreeVisitor visitor) { public final PackageStmtContext packageStmt() throws RecognitionException { PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState()); - enterRule(_localctx, 172, RULE_packageStmt); + enterRule(_localctx, 182, RULE_packageStmt); try { enterOuterAlt(_localctx, 1); { - setState(1121); + setState(1170); match(PACKAGE); - setState(1122); + setState(1171); expression(0); - setState(1124); + setState(1173); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { - setState(1123); + setState(1172); block(); } break; @@ -6580,13 +6903,13 @@ public T accept(ParseTreeVisitor visitor) { public final SpecForStmtContext specForStmt() throws RecognitionException { SpecForStmtContext _localctx = new SpecForStmtContext(_ctx, getState()); - enterRule(_localctx, 174, RULE_specForStmt); + enterRule(_localctx, 184, RULE_specForStmt); try { enterOuterAlt(_localctx, 1); { - setState(1126); + setState(1175); loopSpec(); - setState(1127); + setState(1176); forStmt(); } } @@ -6636,39 +6959,39 @@ public T accept(ParseTreeVisitor visitor) { public final LoopSpecContext loopSpec() throws RecognitionException { LoopSpecContext _localctx = new LoopSpecContext(_ctx, getState()); - enterRule(_localctx, 176, RULE_loopSpec); + enterRule(_localctx, 186, RULE_loopSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1135); + setState(1184); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1129); + setState(1178); match(INV); - setState(1130); + setState(1179); expression(0); - setState(1131); + setState(1180); eos(); } } - setState(1137); + setState(1186); _errHandler.sync(this); _la = _input.LA(1); } - setState(1142); + setState(1191); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1138); + setState(1187); match(DEC); - setState(1139); + setState(1188); terminationMeasure(); - setState(1140); + setState(1189); eos(); } } @@ -6711,27 +7034,27 @@ public T accept(ParseTreeVisitor visitor) { public final DeferStmtContext deferStmt() throws RecognitionException { DeferStmtContext _localctx = new DeferStmtContext(_ctx, getState()); - enterRule(_localctx, 178, RULE_deferStmt); + enterRule(_localctx, 188, RULE_deferStmt); int _la; try { - setState(1149); + setState(1198); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1144); + setState(1193); match(DEFER); - setState(1145); + setState(1194); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1146); + setState(1195); match(DEFER); - setState(1147); + setState(1196); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -6742,7 +7065,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1148); + setState(1197); predicateAccess(); } break; @@ -6786,64 +7109,64 @@ public T accept(ParseTreeVisitor visitor) { public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); - enterRule(_localctx, 180, RULE_basicLit); + enterRule(_localctx, 190, RULE_basicLit); try { - setState(1159); + setState(1208); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1151); + setState(1200); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1152); + setState(1201); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1153); + setState(1202); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1154); + setState(1203); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1155); + setState(1204); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1156); + setState(1205); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1157); + setState(1206); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1158); + setState(1207); match(RUNE_LIT); } break; @@ -7112,23 +7435,23 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _parentState = getState(); PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, _parentState); PrimaryExprContext _prevctx = _localctx; - int _startState = 182; - enterRecursionRule(_localctx, 182, RULE_primaryExpr, _p); + int _startState = 192; + enterRecursionRule(_localctx, 192, RULE_primaryExpr, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1177); + setState(1226); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { case 1: { _localctx = new OperandPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1162); + setState(1211); operand(); } break; @@ -7137,7 +7460,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1163); + setState(1212); conversion(); } break; @@ -7146,7 +7469,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1164); + setState(1213); methodExpr(); } break; @@ -7155,7 +7478,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1165); + setState(1214); ghostPrimaryExpr(); } break; @@ -7164,7 +7487,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1166); + setState(1215); new_(); } break; @@ -7173,7 +7496,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1167); + setState(1216); make(); } break; @@ -7182,11 +7505,11 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new RevealInvokePrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1168); + setState(1217); match(REVEAL); - setState(1169); + setState(1218); primaryExpr(0); - setState(1170); + setState(1219); arguments(); } break; @@ -7195,10 +7518,10 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1172); + setState(1221); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 1125899906842697L) != 0)) ) { + if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 2251799813685321L) != 0)) ) { ((BuiltInCallExprContext)_localctx).call_op = (Token)_errHandler.recoverInline(this); } else { @@ -7206,36 +7529,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1173); + setState(1222); match(L_PAREN); - setState(1174); + setState(1223); expression(0); - setState(1175); + setState(1224); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1201); + setState(1250); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,91,_ctx); + _alt = getInterpreter().adaptivePredict(_input,97,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1199); + setState(1248); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1179); + setState(1228); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1180); + setState(1229); match(DOT); - setState(1181); + setState(1230); match(IDENTIFIER); } break; @@ -7243,9 +7566,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1182); + setState(1231); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1183); + setState(1232); index(); } break; @@ -7253,9 +7576,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1184); + setState(1233); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1185); + setState(1234); slice_(); } break; @@ -7263,9 +7586,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1186); + setState(1235); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1187); + setState(1236); seqUpdExp(); } break; @@ -7273,9 +7596,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1188); + setState(1237); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1189); + setState(1238); typeAssertion(); } break; @@ -7283,9 +7606,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1190); + setState(1239); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1191); + setState(1240); arguments(); } break; @@ -7293,13 +7616,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1192); + setState(1241); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1193); + setState(1242); arguments(); - setState(1194); + setState(1243); match(AS); - setState(1195); + setState(1244); closureSpecInstance(); } break; @@ -7307,18 +7630,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1197); + setState(1246); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1198); + setState(1247); predConstructArgs(); } break; } } } - setState(1203); + setState(1252); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,91,_ctx); + _alt = getInterpreter().adaptivePredict(_input,97,_ctx); } } } @@ -7355,13 +7678,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionLitContext functionLit() throws RecognitionException { FunctionLitContext _localctx = new FunctionLitContext(_ctx, getState()); - enterRule(_localctx, 184, RULE_functionLit); + enterRule(_localctx, 194, RULE_functionLit); try { enterOuterAlt(_localctx, 1); { - setState(1204); + setState(1253); ((FunctionLitContext)_localctx).specification = specification(); - setState(1205); + setState(1254); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7404,32 +7727,32 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws RecognitionException { ClosureDeclContext _localctx = new ClosureDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 186, RULE_closureDecl); + enterRule(_localctx, 196, RULE_closureDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1207); + setState(1256); match(FUNC); - setState(1209); + setState(1258); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1208); + setState(1257); match(IDENTIFIER); } } { - setState(1211); + setState(1260); signature(); - setState(1213); + setState(1262); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: { - setState(1212); + setState(1261); blockWithBodyParameterInfo(); } break; @@ -7469,34 +7792,34 @@ public T accept(ParseTreeVisitor visitor) { public final PredConstructArgsContext predConstructArgs() throws RecognitionException { PredConstructArgsContext _localctx = new PredConstructArgsContext(_ctx, getState()); - enterRule(_localctx, 188, RULE_predConstructArgs); + enterRule(_localctx, 198, RULE_predConstructArgs); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1215); + setState(1264); match(L_PRED); - setState(1217); + setState(1266); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1216); + setState(1265); expressionList(); } } - setState(1220); + setState(1269); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1219); + setState(1268); match(COMMA); } } - setState(1222); + setState(1271); match(R_PRED); } } @@ -7553,52 +7876,52 @@ public T accept(ParseTreeVisitor visitor) { public final InterfaceTypeContext interfaceType() throws RecognitionException { InterfaceTypeContext _localctx = new InterfaceTypeContext(_ctx, getState()); - enterRule(_localctx, 190, RULE_interfaceType); + enterRule(_localctx, 200, RULE_interfaceType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1224); + setState(1273); match(INTERFACE); - setState(1225); + setState(1274); match(L_CURLY); - setState(1235); + setState(1284); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 72057594172173824L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 68719476993L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 72057594172173824L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 137438954753L) != 0)) { { { - setState(1229); + setState(1278); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { case 1: { - setState(1226); + setState(1275); methodSpec(); } break; case 2: { - setState(1227); + setState(1276); typeName(); } break; case 3: { - setState(1228); + setState(1277); predicateSpec(); } break; } - setState(1231); + setState(1280); eos(); } } - setState(1237); + setState(1286); _errHandler.sync(this); _la = _input.LA(1); } - setState(1238); + setState(1287); match(R_CURLY); } } @@ -7633,15 +7956,15 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateSpecContext predicateSpec() throws RecognitionException { PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState()); - enterRule(_localctx, 192, RULE_predicateSpec); + enterRule(_localctx, 202, RULE_predicateSpec); try { enterOuterAlt(_localctx, 1); { - setState(1240); + setState(1289); match(PRED); - setState(1241); + setState(1290); match(IDENTIFIER); - setState(1242); + setState(1291); parameters(); } } @@ -7682,53 +8005,53 @@ public T accept(ParseTreeVisitor visitor) { public final MethodSpecContext methodSpec() throws RecognitionException { MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState()); - enterRule(_localctx, 194, RULE_methodSpec); + enterRule(_localctx, 204, RULE_methodSpec); int _la; try { - setState(1259); + setState(1308); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,100,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1245); + setState(1294); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1244); + setState(1293); match(GHOST); } } - setState(1247); + setState(1296); specification(); - setState(1248); + setState(1297); match(IDENTIFIER); - setState(1249); + setState(1298); parameters(); - setState(1250); + setState(1299); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1253); + setState(1302); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1252); + setState(1301); match(GHOST); } } - setState(1255); + setState(1304); specification(); - setState(1256); + setState(1305); match(IDENTIFIER); - setState(1257); + setState(1306); parameters(); } break; @@ -7774,15 +8097,15 @@ public T accept(ParseTreeVisitor visitor) { public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); - enterRule(_localctx, 196, RULE_type_); + enterRule(_localctx, 206, RULE_type_); try { - setState(1268); + setState(1317); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1261); + setState(1310); typeName(); } break; @@ -7797,7 +8120,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1262); + setState(1311); typeLit(); } break; @@ -7811,18 +8134,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1263); + setState(1312); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1264); + setState(1313); match(L_PAREN); - setState(1265); + setState(1314); type_(); - setState(1266); + setState(1315); match(R_PAREN); } break; @@ -7883,71 +8206,71 @@ public T accept(ParseTreeVisitor visitor) { public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_typeLit); + enterRule(_localctx, 208, RULE_typeLit); try { - setState(1279); + setState(1328); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1270); + setState(1319); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1271); + setState(1320); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1272); + setState(1321); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1273); + setState(1322); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1274); + setState(1323); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1275); + setState(1324); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1276); + setState(1325); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1277); + setState(1326); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1278); + setState(1327); predType(); } break; @@ -7983,13 +8306,13 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeContext predType() throws RecognitionException { PredTypeContext _localctx = new PredTypeContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_predType); + enterRule(_localctx, 210, RULE_predType); try { enterOuterAlt(_localctx, 1); { - setState(1281); + setState(1330); match(PRED); - setState(1282); + setState(1331); predTypeParams(); } } @@ -8031,45 +8354,45 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeParamsContext predTypeParams() throws RecognitionException { PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_predTypeParams); + enterRule(_localctx, 212, RULE_predTypeParams); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1284); + setState(1333); match(L_PAREN); - setState(1296); + setState(1345); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & 1441151881345761731L) != 0)) { { - setState(1285); + setState(1334); type_(); - setState(1290); + setState(1339); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,103,_ctx); + _alt = getInterpreter().adaptivePredict(_input,109,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1286); + setState(1335); match(COMMA); - setState(1287); + setState(1336); type_(); } } } - setState(1292); + setState(1341); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,103,_ctx); + _alt = getInterpreter().adaptivePredict(_input,109,_ctx); } - setState(1294); + setState(1343); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1293); + setState(1342); match(COMMA); } } @@ -8077,7 +8400,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1298); + setState(1347); match(R_PAREN); } } @@ -8128,57 +8451,57 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); - enterRule(_localctx, 204, RULE_literalType); + enterRule(_localctx, 214, RULE_literalType); try { - setState(1307); + setState(1356); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1300); + setState(1349); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1301); + setState(1350); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1302); + setState(1351); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1303); + setState(1352); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1304); + setState(1353); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1305); + setState(1354); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1306); + setState(1355); typeName(); } break; @@ -8216,17 +8539,17 @@ public T accept(ParseTreeVisitor visitor) { public final ImplicitArrayContext implicitArray() throws RecognitionException { ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_implicitArray); + enterRule(_localctx, 216, RULE_implicitArray); try { enterOuterAlt(_localctx, 1); { - setState(1309); + setState(1358); match(L_BRACKET); - setState(1310); + setState(1359); match(ELLIPSIS); - setState(1311); + setState(1360); match(R_BRACKET); - setState(1312); + setState(1361); elementType(); } } @@ -8271,36 +8594,36 @@ public T accept(ParseTreeVisitor visitor) { public final Slice_Context slice_() throws RecognitionException { Slice_Context _localctx = new Slice_Context(_ctx, getState()); - enterRule(_localctx, 208, RULE_slice_); + enterRule(_localctx, 218, RULE_slice_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1314); + setState(1363); match(L_BRACKET); - setState(1330); + setState(1379); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,110,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { case 1: { - setState(1316); + setState(1365); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1315); + setState(1364); low(); } } - setState(1318); + setState(1367); match(COLON); - setState(1320); + setState(1369); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1319); + setState(1368); high(); } } @@ -8309,28 +8632,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1323); + setState(1372); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1322); + setState(1371); low(); } } - setState(1325); + setState(1374); match(COLON); - setState(1326); + setState(1375); high(); - setState(1327); + setState(1376); match(COLON); - setState(1328); + setState(1377); cap(); } break; } - setState(1332); + setState(1381); match(R_BRACKET); } } @@ -8363,11 +8686,11 @@ public T accept(ParseTreeVisitor visitor) { public final LowContext low() throws RecognitionException { LowContext _localctx = new LowContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_low); + enterRule(_localctx, 220, RULE_low); try { enterOuterAlt(_localctx, 1); { - setState(1334); + setState(1383); expression(0); } } @@ -8400,11 +8723,11 @@ public T accept(ParseTreeVisitor visitor) { public final HighContext high() throws RecognitionException { HighContext _localctx = new HighContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_high); + enterRule(_localctx, 222, RULE_high); try { enterOuterAlt(_localctx, 1); { - setState(1336); + setState(1385); expression(0); } } @@ -8437,11 +8760,11 @@ public T accept(ParseTreeVisitor visitor) { public final CapContext cap() throws RecognitionException { CapContext _localctx = new CapContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_cap); + enterRule(_localctx, 224, RULE_cap); try { enterOuterAlt(_localctx, 1); { - setState(1338); + setState(1387); expression(0); } } @@ -8484,20 +8807,20 @@ public T accept(ParseTreeVisitor visitor) { public final Assign_opContext assign_op() throws RecognitionException { Assign_opContext _localctx = new Assign_opContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_assign_op); + enterRule(_localctx, 226, RULE_assign_op); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1341); + setState(1390); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & 4031L) != 0)) { + if (((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 4031L) != 0)) { { - setState(1340); + setState(1389); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & 4031L) != 0)) ) { + if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 4031L) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -8508,7 +8831,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1343); + setState(1392); match(ASSIGN); } } @@ -8552,48 +8875,48 @@ public T accept(ParseTreeVisitor visitor) { public final RangeClauseContext rangeClause() throws RecognitionException { RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_rangeClause); + enterRule(_localctx, 228, RULE_rangeClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1351); + setState(1400); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) { case 1: { - setState(1345); + setState(1394); expressionList(); - setState(1346); + setState(1395); match(ASSIGN); } break; case 2: { - setState(1348); + setState(1397); maybeAddressableIdentifierList(); - setState(1349); + setState(1398); match(DECLARE_ASSIGN); } break; } - setState(1353); + setState(1402); match(RANGE); - setState(1354); + setState(1403); expression(0); - setState(1359); + setState(1408); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1355); + setState(1404); match(WITH); - setState(1357); + setState(1406); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1356); + setState(1405); match(IDENTIFIER); } } @@ -8632,13 +8955,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_packageClause); + enterRule(_localctx, 230, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1361); + setState(1410); match(PACKAGE); - setState(1362); + setState(1411); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -8671,11 +8994,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_importPath); + enterRule(_localctx, 232, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1364); + setState(1413); string_(); } } @@ -8714,29 +9037,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_declaration); + enterRule(_localctx, 234, RULE_declaration); try { - setState(1369); + setState(1418); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1366); + setState(1415); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1367); + setState(1416); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1368); + setState(1417); varDecl(); } break; @@ -8785,43 +9108,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_constDecl); + enterRule(_localctx, 236, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1371); + setState(1420); match(CONST); - setState(1383); + setState(1432); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1372); + setState(1421); constSpec(); } break; case L_PAREN: { - setState(1373); + setState(1422); match(L_PAREN); - setState(1379); + setState(1428); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1374); + setState(1423); constSpec(); - setState(1375); + setState(1424); eos(); } } - setState(1381); + setState(1430); _errHandler.sync(this); _la = _input.LA(1); } - setState(1382); + setState(1431); match(R_PAREN); } break; @@ -8866,31 +9189,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_constSpec); + enterRule(_localctx, 238, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1385); + setState(1434); identifierList(); - setState(1391); + setState(1440); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { case 1: { - setState(1387); + setState(1436); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441151881345761731L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & 1441151881345761731L) != 0)) { { - setState(1386); + setState(1435); type_(); } } - setState(1389); + setState(1438); match(ASSIGN); - setState(1390); + setState(1439); expressionList(); } break; @@ -8931,30 +9254,30 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_identifierList); + enterRule(_localctx, 240, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1393); + setState(1442); match(IDENTIFIER); - setState(1398); + setState(1447); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,120,_ctx); + _alt = getInterpreter().adaptivePredict(_input,126,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1394); + setState(1443); match(COMMA); - setState(1395); + setState(1444); match(IDENTIFIER); } } } - setState(1400); + setState(1449); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,120,_ctx); + _alt = getInterpreter().adaptivePredict(_input,126,_ctx); } } } @@ -8994,30 +9317,30 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_expressionList); + enterRule(_localctx, 242, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1401); + setState(1450); expression(0); - setState(1406); + setState(1455); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,121,_ctx); + _alt = getInterpreter().adaptivePredict(_input,127,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1402); + setState(1451); match(COMMA); - setState(1403); + setState(1452); expression(0); } } } - setState(1408); + setState(1457); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,121,_ctx); + _alt = getInterpreter().adaptivePredict(_input,127,_ctx); } } } @@ -9062,43 +9385,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_typeDecl); + enterRule(_localctx, 244, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1409); + setState(1458); match(TYPE); - setState(1421); + setState(1470); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1410); + setState(1459); typeSpec(); } break; case L_PAREN: { - setState(1411); + setState(1460); match(L_PAREN); - setState(1417); + setState(1466); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1412); + setState(1461); typeSpec(); - setState(1413); + setState(1462); eos(); } } - setState(1419); + setState(1468); _errHandler.sync(this); _la = _input.LA(1); } - setState(1420); + setState(1469); match(R_PAREN); } break; @@ -9138,24 +9461,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_typeSpec); + enterRule(_localctx, 246, RULE_typeSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1423); + setState(1472); match(IDENTIFIER); - setState(1425); + setState(1474); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1424); + setState(1473); match(ASSIGN); } } - setState(1427); + setState(1476); type_(); } } @@ -9200,43 +9523,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_varDecl); + enterRule(_localctx, 248, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1429); + setState(1478); match(VAR); - setState(1441); + setState(1490); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1430); + setState(1479); varSpec(); } break; case L_PAREN: { - setState(1431); + setState(1480); match(L_PAREN); - setState(1437); + setState(1486); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1432); + setState(1481); varSpec(); - setState(1433); + setState(1482); eos(); } } - setState(1439); + setState(1488); _errHandler.sync(this); _la = _input.LA(1); } - setState(1440); + setState(1489); match(R_PAREN); } break; @@ -9276,23 +9599,23 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_block); + enterRule(_localctx, 250, RULE_block); try { enterOuterAlt(_localctx, 1); { - setState(1443); + setState(1492); match(L_CURLY); - setState(1445); + setState(1494); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { case 1: { - setState(1444); + setState(1493); statementList(); } break; } - setState(1447); + setState(1496); match(R_CURLY); } } @@ -9342,13 +9665,13 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_statementList); + enterRule(_localctx, 252, RULE_statementList); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1461); + setState(1510); _errHandler.sync(this); _alt = 1; do { @@ -9356,17 +9679,17 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1456); + setState(1505); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { case 1: { - setState(1450); + setState(1499); _errHandler.sync(this); _la = _input.LA(1); if (_la==SEMI) { { - setState(1449); + setState(1498); match(SEMI); } } @@ -9375,12 +9698,12 @@ public final StatementListContext statementList() throws RecognitionException { break; case 2: { - setState(1453); + setState(1502); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOS) { { - setState(1452); + setState(1501); match(EOS); } } @@ -9389,14 +9712,14 @@ public final StatementListContext statementList() throws RecognitionException { break; case 3: { - setState(1455); + setState(1504); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; } - setState(1458); + setState(1507); statement(); - setState(1459); + setState(1508); eos(); } } @@ -9404,9 +9727,9 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1463); + setState(1512); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,131,_ctx); + _alt = getInterpreter().adaptivePredict(_input,137,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -9451,43 +9774,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_simpleStmt); + enterRule(_localctx, 254, RULE_simpleStmt); try { - setState(1470); + setState(1519); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1465); + setState(1514); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1466); + setState(1515); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1467); + setState(1516); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1468); + setState(1517); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1469); + setState(1518); shortVarDecl(); } break; @@ -9522,11 +9845,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_expressionStmt); + enterRule(_localctx, 256, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1472); + setState(1521); expression(0); } } @@ -9564,15 +9887,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_sendStmt); + enterRule(_localctx, 258, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1474); + setState(1523); ((SendStmtContext)_localctx).channel = expression(0); - setState(1475); + setState(1524); match(RECEIVE); - setState(1476); + setState(1525); expression(0); } } @@ -9607,14 +9930,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_incDecStmt); + enterRule(_localctx, 260, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1478); + setState(1527); expression(0); - setState(1479); + setState(1528); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -9661,15 +9984,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_assignment); + enterRule(_localctx, 262, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1481); + setState(1530); expressionList(); - setState(1482); + setState(1531); assign_op(); - setState(1483); + setState(1532); expressionList(); } } @@ -9701,12 +10024,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_emptyStmt); + enterRule(_localctx, 264, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1485); + setState(1534); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -9749,20 +10072,20 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_labeledStmt); + enterRule(_localctx, 266, RULE_labeledStmt); try { enterOuterAlt(_localctx, 1); { - setState(1487); + setState(1536); match(IDENTIFIER); - setState(1488); + setState(1537); match(COLON); - setState(1490); + setState(1539); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: { - setState(1489); + setState(1538); statement(); } break; @@ -9799,18 +10122,18 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_returnStmt); + enterRule(_localctx, 268, RULE_returnStmt); try { enterOuterAlt(_localctx, 1); { - setState(1492); + setState(1541); match(RETURN); - setState(1494); + setState(1543); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { case 1: { - setState(1493); + setState(1542); expressionList(); } break; @@ -9845,18 +10168,18 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_breakStmt); + enterRule(_localctx, 270, RULE_breakStmt); try { enterOuterAlt(_localctx, 1); { - setState(1496); + setState(1545); match(BREAK); - setState(1498); + setState(1547); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { case 1: { - setState(1497); + setState(1546); match(IDENTIFIER); } break; @@ -9891,18 +10214,18 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_continueStmt); + enterRule(_localctx, 272, RULE_continueStmt); try { enterOuterAlt(_localctx, 1); { - setState(1500); + setState(1549); match(CONTINUE); - setState(1502); + setState(1551); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1501); + setState(1550); match(IDENTIFIER); } break; @@ -9937,13 +10260,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_gotoStmt); + enterRule(_localctx, 274, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1504); + setState(1553); match(GOTO); - setState(1505); + setState(1554); match(IDENTIFIER); } } @@ -9974,11 +10297,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_fallthroughStmt); + enterRule(_localctx, 276, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1507); + setState(1556); match(FALLTHROUGH); } } @@ -10028,61 +10351,61 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_ifStmt); + enterRule(_localctx, 278, RULE_ifStmt); try { enterOuterAlt(_localctx, 1); { - setState(1509); + setState(1558); match(IF); - setState(1518); + setState(1567); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: { - setState(1510); + setState(1559); expression(0); } break; case 2: { - setState(1511); + setState(1560); eos(); - setState(1512); + setState(1561); expression(0); } break; case 3: { - setState(1514); + setState(1563); simpleStmt(); - setState(1515); + setState(1564); eos(); - setState(1516); + setState(1565); expression(0); } break; } - setState(1520); + setState(1569); block(); - setState(1526); + setState(1575); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1521); + setState(1570); match(ELSE); - setState(1524); + setState(1573); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1522); + setState(1571); ifStmt(); } break; case L_CURLY: { - setState(1523); + setState(1572); block(); } break; @@ -10126,22 +10449,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_switchStmt); + enterRule(_localctx, 280, RULE_switchStmt); try { - setState(1530); + setState(1579); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1528); + setState(1577); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1529); + setState(1578); typeSwitchStmt(); } break; @@ -10191,24 +10514,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_exprSwitchStmt); + enterRule(_localctx, 282, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1532); + setState(1581); match(SWITCH); - setState(1543); + setState(1592); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { case 1: { - setState(1534); + setState(1583); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1533); + setState(1582); expression(0); } } @@ -10217,24 +10540,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1537); + setState(1586); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1536); + setState(1585); simpleStmt(); } break; } - setState(1539); + setState(1588); eos(); - setState(1541); + setState(1590); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1540); + setState(1589); expression(0); } } @@ -10242,23 +10565,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1545); + setState(1594); match(L_CURLY); - setState(1549); + setState(1598); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1546); + setState(1595); exprCaseClause(); } } - setState(1551); + setState(1600); _errHandler.sync(this); _la = _input.LA(1); } - setState(1552); + setState(1601); match(R_CURLY); } } @@ -10295,20 +10618,20 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_exprCaseClause); + enterRule(_localctx, 284, RULE_exprCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1554); + setState(1603); exprSwitchCase(); - setState(1555); + setState(1604); match(COLON); - setState(1557); + setState(1606); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { case 1: { - setState(1556); + setState(1605); statementList(); } break; @@ -10346,24 +10669,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_exprSwitchCase); + enterRule(_localctx, 286, RULE_exprSwitchCase); try { - setState(1562); + setState(1611); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1559); + setState(1608); match(CASE); - setState(1560); + setState(1609); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1561); + setState(1610); match(DEFAULT); } break; @@ -10415,58 +10738,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 278, RULE_typeSwitchStmt); + enterRule(_localctx, 288, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1564); + setState(1613); match(SWITCH); - setState(1573); + setState(1622); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,154,_ctx) ) { case 1: { - setState(1565); + setState(1614); typeSwitchGuard(); } break; case 2: { - setState(1566); + setState(1615); eos(); - setState(1567); + setState(1616); typeSwitchGuard(); } break; case 3: { - setState(1569); + setState(1618); simpleStmt(); - setState(1570); + setState(1619); eos(); - setState(1571); + setState(1620); typeSwitchGuard(); } break; } - setState(1575); + setState(1624); match(L_CURLY); - setState(1579); + setState(1628); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1576); + setState(1625); typeCaseClause(); } } - setState(1581); + setState(1630); _errHandler.sync(this); _la = _input.LA(1); } - setState(1582); + setState(1631); match(R_CURLY); } } @@ -10505,31 +10828,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 280, RULE_typeSwitchGuard); + enterRule(_localctx, 290, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1586); + setState(1635); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { case 1: { - setState(1584); + setState(1633); match(IDENTIFIER); - setState(1585); + setState(1634); match(DECLARE_ASSIGN); } break; } - setState(1588); + setState(1637); primaryExpr(0); - setState(1589); + setState(1638); match(DOT); - setState(1590); + setState(1639); match(L_PAREN); - setState(1591); + setState(1640); match(TYPE); - setState(1592); + setState(1641); match(R_PAREN); } } @@ -10566,20 +10889,20 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 282, RULE_typeCaseClause); + enterRule(_localctx, 292, RULE_typeCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1594); + setState(1643); typeSwitchCase(); - setState(1595); + setState(1644); match(COLON); - setState(1597); + setState(1646); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: { - setState(1596); + setState(1645); statementList(); } break; @@ -10617,24 +10940,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 284, RULE_typeSwitchCase); + enterRule(_localctx, 294, RULE_typeSwitchCase); try { - setState(1602); + setState(1651); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1599); + setState(1648); match(CASE); - setState(1600); + setState(1649); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1601); + setState(1650); match(DEFAULT); } break; @@ -10682,12 +11005,12 @@ public T accept(ParseTreeVisitor visitor) { public final TypeListContext typeList() throws RecognitionException { TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 286, RULE_typeList); + enterRule(_localctx, 296, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1606); + setState(1655); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10710,28 +11033,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1604); + setState(1653); type_(); } break; case NIL_LIT: { - setState(1605); + setState(1654); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1615); + setState(1664); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1608); + setState(1657); match(COMMA); - setState(1611); + setState(1660); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10754,13 +11077,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1609); + setState(1658); type_(); } break; case NIL_LIT: { - setState(1610); + setState(1659); match(NIL_LIT); } break; @@ -10769,7 +11092,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1617); + setState(1666); _errHandler.sync(this); _la = _input.LA(1); } @@ -10810,30 +11133,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_selectStmt); + enterRule(_localctx, 298, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1618); + setState(1667); match(SELECT); - setState(1619); + setState(1668); match(L_CURLY); - setState(1623); + setState(1672); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1620); + setState(1669); commClause(); } } - setState(1625); + setState(1674); _errHandler.sync(this); _la = _input.LA(1); } - setState(1626); + setState(1675); match(R_CURLY); } } @@ -10870,20 +11193,20 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 290, RULE_commClause); + enterRule(_localctx, 300, RULE_commClause); try { enterOuterAlt(_localctx, 1); { - setState(1628); + setState(1677); commCase(); - setState(1629); + setState(1678); match(COLON); - setState(1631); + setState(1680); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: { - setState(1630); + setState(1679); statementList(); } break; @@ -10924,28 +11247,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 292, RULE_commCase); + enterRule(_localctx, 302, RULE_commCase); try { - setState(1639); + setState(1688); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1633); + setState(1682); match(CASE); - setState(1636); + setState(1685); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { case 1: { - setState(1634); + setState(1683); sendStmt(); } break; case 2: { - setState(1635); + setState(1684); recvStmt(); } break; @@ -10955,7 +11278,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1638); + setState(1687); match(DEFAULT); } break; @@ -11001,31 +11324,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 294, RULE_recvStmt); + enterRule(_localctx, 304, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1647); + setState(1696); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { case 1: { - setState(1641); + setState(1690); expressionList(); - setState(1642); + setState(1691); match(ASSIGN); } break; case 2: { - setState(1644); + setState(1693); identifierList(); - setState(1645); + setState(1694); match(DECLARE_ASSIGN); } break; } - setState(1649); + setState(1698); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -11068,24 +11391,24 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 296, RULE_forStmt); + enterRule(_localctx, 306, RULE_forStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1651); + setState(1700); match(FOR); - setState(1659); + setState(1708); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: { - setState(1653); + setState(1702); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1652); + setState(1701); expression(0); } } @@ -11094,18 +11417,18 @@ public final ForStmtContext forStmt() throws RecognitionException { break; case 2: { - setState(1655); + setState(1704); forClause(); } break; case 3: { - setState(1657); + setState(1706); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1656); + setState(1705); rangeClause(); } } @@ -11113,7 +11436,7 @@ public final ForStmtContext forStmt() throws RecognitionException { } break; } - setState(1661); + setState(1710); block(); } } @@ -11160,41 +11483,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 298, RULE_forClause); + enterRule(_localctx, 308, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1664); + setState(1713); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { case 1: { - setState(1663); + setState(1712); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1666); + setState(1715); eos(); - setState(1668); + setState(1717); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,165,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) { case 1: { - setState(1667); + setState(1716); expression(0); } break; } - setState(1670); + setState(1719); eos(); - setState(1672); + setState(1721); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1671); + setState(1720); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -11231,13 +11554,13 @@ public T accept(ParseTreeVisitor visitor) { public final GoStmtContext goStmt() throws RecognitionException { GoStmtContext _localctx = new GoStmtContext(_ctx, getState()); - enterRule(_localctx, 300, RULE_goStmt); + enterRule(_localctx, 310, RULE_goStmt); try { enterOuterAlt(_localctx, 1); { - setState(1674); + setState(1723); match(GO); - setState(1675); + setState(1724); expression(0); } } @@ -11271,22 +11594,22 @@ public T accept(ParseTreeVisitor visitor) { public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); - enterRule(_localctx, 302, RULE_typeName); + enterRule(_localctx, 312, RULE_typeName); try { - setState(1679); + setState(1728); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1677); + setState(1726); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1678); + setState(1727); match(IDENTIFIER); } break; @@ -11326,17 +11649,17 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayTypeContext arrayType() throws RecognitionException { ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 304, RULE_arrayType); + enterRule(_localctx, 314, RULE_arrayType); try { enterOuterAlt(_localctx, 1); { - setState(1681); + setState(1730); match(L_BRACKET); - setState(1682); + setState(1731); arrayLength(); - setState(1683); + setState(1732); match(R_BRACKET); - setState(1684); + setState(1733); elementType(); } } @@ -11369,11 +11692,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayLengthContext arrayLength() throws RecognitionException { ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_arrayLength); + enterRule(_localctx, 316, RULE_arrayLength); try { enterOuterAlt(_localctx, 1); { - setState(1686); + setState(1735); expression(0); } } @@ -11406,11 +11729,11 @@ public T accept(ParseTreeVisitor visitor) { public final ElementTypeContext elementType() throws RecognitionException { ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_elementType); + enterRule(_localctx, 318, RULE_elementType); try { enterOuterAlt(_localctx, 1); { - setState(1688); + setState(1737); type_(); } } @@ -11444,13 +11767,13 @@ public T accept(ParseTreeVisitor visitor) { public final PointerTypeContext pointerType() throws RecognitionException { PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_pointerType); + enterRule(_localctx, 320, RULE_pointerType); try { enterOuterAlt(_localctx, 1); { - setState(1690); + setState(1739); match(STAR); - setState(1691); + setState(1740); type_(); } } @@ -11485,15 +11808,15 @@ public T accept(ParseTreeVisitor visitor) { public final SliceTypeContext sliceType() throws RecognitionException { SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_sliceType); + enterRule(_localctx, 322, RULE_sliceType); try { enterOuterAlt(_localctx, 1); { - setState(1693); + setState(1742); match(L_BRACKET); - setState(1694); + setState(1743); match(R_BRACKET); - setState(1695); + setState(1744); elementType(); } } @@ -11532,19 +11855,19 @@ public T accept(ParseTreeVisitor visitor) { public final MapTypeContext mapType() throws RecognitionException { MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_mapType); + enterRule(_localctx, 324, RULE_mapType); try { enterOuterAlt(_localctx, 1); { - setState(1697); + setState(1746); match(MAP); - setState(1698); + setState(1747); match(L_BRACKET); - setState(1699); + setState(1748); type_(); - setState(1700); + setState(1749); match(R_BRACKET); - setState(1701); + setState(1750); elementType(); } } @@ -11579,37 +11902,37 @@ public T accept(ParseTreeVisitor visitor) { public final ChannelTypeContext channelType() throws RecognitionException { ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_channelType); + enterRule(_localctx, 326, RULE_channelType); try { enterOuterAlt(_localctx, 1); { - setState(1708); + setState(1757); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { case 1: { - setState(1703); + setState(1752); match(CHAN); } break; case 2: { - setState(1704); + setState(1753); match(CHAN); - setState(1705); + setState(1754); match(RECEIVE); } break; case 3: { - setState(1706); + setState(1755); match(RECEIVE); - setState(1707); + setState(1756); match(CHAN); } break; } - setState(1710); + setState(1759); elementType(); } } @@ -11643,13 +11966,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTypeContext functionType() throws RecognitionException { FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_functionType); + enterRule(_localctx, 328, RULE_functionType); try { enterOuterAlt(_localctx, 1); { - setState(1712); + setState(1761); match(FUNC); - setState(1713); + setState(1762); signature(); } } @@ -11685,24 +12008,24 @@ public T accept(ParseTreeVisitor visitor) { public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_signature); + enterRule(_localctx, 330, RULE_signature); try { - setState(1719); + setState(1768); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,175,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1715); + setState(1764); parameters(); - setState(1716); + setState(1765); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1718); + setState(1767); parameters(); } break; @@ -11740,22 +12063,22 @@ public T accept(ParseTreeVisitor visitor) { public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_result); + enterRule(_localctx, 332, RULE_result); try { - setState(1723); + setState(1772); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1721); + setState(1770); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1722); + setState(1771); type_(); } break; @@ -11799,45 +12122,45 @@ public T accept(ParseTreeVisitor visitor) { public final ParametersContext parameters() throws RecognitionException { ParametersContext _localctx = new ParametersContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_parameters); + enterRule(_localctx, 334, RULE_parameters); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1725); + setState(1774); match(L_PAREN); - setState(1737); + setState(1786); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & 1441152431101575619L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & 1441152431101575619L) != 0)) { { - setState(1726); + setState(1775); parameterDecl(); - setState(1731); + setState(1780); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,171,_ctx); + _alt = getInterpreter().adaptivePredict(_input,177,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1727); + setState(1776); match(COMMA); - setState(1728); + setState(1777); parameterDecl(); } } } - setState(1733); + setState(1782); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,171,_ctx); + _alt = getInterpreter().adaptivePredict(_input,177,_ctx); } - setState(1735); + setState(1784); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1734); + setState(1783); match(COMMA); } } @@ -11845,7 +12168,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1739); + setState(1788); match(R_PAREN); } } @@ -11884,28 +12207,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConversionContext conversion() throws RecognitionException { ConversionContext _localctx = new ConversionContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_conversion); + enterRule(_localctx, 336, RULE_conversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1741); + setState(1790); nonNamedType(); - setState(1742); + setState(1791); match(L_PAREN); - setState(1743); + setState(1792); expression(0); - setState(1745); + setState(1794); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1744); + setState(1793); match(COMMA); } } - setState(1747); + setState(1796); match(R_PAREN); } } @@ -11943,9 +12266,9 @@ public T accept(ParseTreeVisitor visitor) { public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_nonNamedType); + enterRule(_localctx, 338, RULE_nonNamedType); try { - setState(1754); + setState(1803); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -11959,18 +12282,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1749); + setState(1798); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1750); + setState(1799); match(L_PAREN); - setState(1751); + setState(1800); nonNamedType(); - setState(1752); + setState(1801); match(R_PAREN); } break; @@ -12015,33 +12338,33 @@ public T accept(ParseTreeVisitor visitor) { public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_operand); + enterRule(_localctx, 340, RULE_operand); try { - setState(1762); + setState(1811); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,182,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1756); + setState(1805); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1757); + setState(1806); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1758); + setState(1807); match(L_PAREN); - setState(1759); + setState(1808); expression(0); - setState(1760); + setState(1809); match(R_PAREN); } break; @@ -12082,9 +12405,9 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_literal); + enterRule(_localctx, 342, RULE_literal); try { - setState(1767); + setState(1816); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12101,7 +12424,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1764); + setState(1813); basicLit(); } break; @@ -12119,7 +12442,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1765); + setState(1814); compositeLit(); } break; @@ -12130,10 +12453,11 @@ public final LiteralContext literal() throws RecognitionException { case PURE: case TRUSTED: case OPAQUE: + case BACKEND: case FUNC: enterOuterAlt(_localctx, 3); { - setState(1766); + setState(1815); functionLit(); } break; @@ -12173,14 +12497,14 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerContext integer() throws RecognitionException { IntegerContext _localctx = new IntegerContext(_ctx, getState()); - enterRule(_localctx, 334, RULE_integer); + enterRule(_localctx, 344, RULE_integer); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1769); + setState(1818); _la = _input.LA(1); - if ( !(((((_la - 140)) & ~0x3f) == 0 && ((1L << (_la - 140)) & 111L) != 0)) ) { + if ( !(((((_la - 141)) & ~0x3f) == 0 && ((1L << (_la - 141)) & 111L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -12217,11 +12541,11 @@ public T accept(ParseTreeVisitor visitor) { public final OperandNameContext operandName() throws RecognitionException { OperandNameContext _localctx = new OperandNameContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_operandName); + enterRule(_localctx, 346, RULE_operandName); try { enterOuterAlt(_localctx, 1); { - setState(1771); + setState(1820); match(IDENTIFIER); } } @@ -12256,15 +12580,15 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedIdentContext qualifiedIdent() throws RecognitionException { QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState()); - enterRule(_localctx, 338, RULE_qualifiedIdent); + enterRule(_localctx, 348, RULE_qualifiedIdent); try { enterOuterAlt(_localctx, 1); { - setState(1773); + setState(1822); match(IDENTIFIER); - setState(1774); + setState(1823); match(DOT); - setState(1775); + setState(1824); match(IDENTIFIER); } } @@ -12300,13 +12624,13 @@ public T accept(ParseTreeVisitor visitor) { public final CompositeLitContext compositeLit() throws RecognitionException { CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_compositeLit); + enterRule(_localctx, 350, RULE_compositeLit); try { enterOuterAlt(_localctx, 1); { - setState(1777); + setState(1826); literalType(); - setState(1778); + setState(1827); literalValue(); } } @@ -12342,26 +12666,26 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralValueContext literalValue() throws RecognitionException { LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_literalValue); + enterRule(_localctx, 352, RULE_literalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1780); + setState(1829); match(L_CURLY); - setState(1785); + setState(1834); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 11960417569799L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 23920835140615L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1781); + setState(1830); elementList(); - setState(1783); + setState(1832); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1782); + setState(1831); match(COMMA); } } @@ -12369,7 +12693,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1787); + setState(1836); match(R_CURLY); } } @@ -12409,30 +12733,30 @@ public T accept(ParseTreeVisitor visitor) { public final ElementListContext elementList() throws RecognitionException { ElementListContext _localctx = new ElementListContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_elementList); + enterRule(_localctx, 354, RULE_elementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1789); + setState(1838); keyedElement(); - setState(1794); + setState(1843); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,180,_ctx); + _alt = getInterpreter().adaptivePredict(_input,186,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1790); + setState(1839); match(COMMA); - setState(1791); + setState(1840); keyedElement(); } } } - setState(1796); + setState(1845); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,180,_ctx); + _alt = getInterpreter().adaptivePredict(_input,186,_ctx); } } } @@ -12469,23 +12793,23 @@ public T accept(ParseTreeVisitor visitor) { public final KeyedElementContext keyedElement() throws RecognitionException { KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_keyedElement); + enterRule(_localctx, 356, RULE_keyedElement); try { enterOuterAlt(_localctx, 1); { - setState(1800); + setState(1849); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,181,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,187,_ctx) ) { case 1: { - setState(1797); + setState(1846); key(); - setState(1798); + setState(1847); match(COLON); } break; } - setState(1802); + setState(1851); element(); } } @@ -12521,9 +12845,9 @@ public T accept(ParseTreeVisitor visitor) { public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_key); + enterRule(_localctx, 358, RULE_key); try { - setState(1806); + setState(1855); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12565,6 +12889,7 @@ public final KeyContext key() throws RecognitionException { case TRUSTED: case OPAQUE: case REVEAL: + case BACKEND: case FUNC: case INTERFACE: case MAP: @@ -12593,14 +12918,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1804); + setState(1853); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1805); + setState(1854); literalValue(); } break; @@ -12640,9 +12965,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 350, RULE_element); + enterRule(_localctx, 360, RULE_element); try { - setState(1810); + setState(1859); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12684,6 +13009,7 @@ public final ElementContext element() throws RecognitionException { case TRUSTED: case OPAQUE: case REVEAL: + case BACKEND: case FUNC: case INTERFACE: case MAP: @@ -12712,14 +13038,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1808); + setState(1857); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1809); + setState(1858); literalValue(); } break; @@ -12768,32 +13094,32 @@ public T accept(ParseTreeVisitor visitor) { public final StructTypeContext structType() throws RecognitionException { StructTypeContext _localctx = new StructTypeContext(_ctx, getState()); - enterRule(_localctx, 352, RULE_structType); + enterRule(_localctx, 362, RULE_structType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1812); + setState(1861); match(STRUCT); - setState(1813); + setState(1862); match(L_CURLY); - setState(1819); + setState(1868); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1814); + setState(1863); fieldDecl(); - setState(1815); + setState(1864); eos(); } } - setState(1821); + setState(1870); _errHandler.sync(this); _la = _input.LA(1); } - setState(1822); + setState(1871); match(R_CURLY); } } @@ -12836,34 +13162,34 @@ public T accept(ParseTreeVisitor visitor) { public final FieldDeclContext fieldDecl() throws RecognitionException { FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); - enterRule(_localctx, 354, RULE_fieldDecl); + enterRule(_localctx, 364, RULE_fieldDecl); try { enterOuterAlt(_localctx, 1); { - setState(1828); + setState(1877); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,191,_ctx) ) { case 1: { - setState(1824); + setState(1873); identifierList(); - setState(1825); + setState(1874); type_(); } break; case 2: { - setState(1827); + setState(1876); embeddedField(); } break; } - setState(1831); + setState(1880); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,192,_ctx) ) { case 1: { - setState(1830); + setState(1879); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -12898,12 +13224,12 @@ public T accept(ParseTreeVisitor visitor) { public final String_Context string_() throws RecognitionException { String_Context _localctx = new String_Context(_ctx, getState()); - enterRule(_localctx, 356, RULE_string_); + enterRule(_localctx, 366, RULE_string_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1833); + setState(1882); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -12945,22 +13271,22 @@ public T accept(ParseTreeVisitor visitor) { public final EmbeddedFieldContext embeddedField() throws RecognitionException { EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState()); - enterRule(_localctx, 358, RULE_embeddedField); + enterRule(_localctx, 368, RULE_embeddedField); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1836); + setState(1885); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1835); + setState(1884); match(STAR); } } - setState(1838); + setState(1887); typeName(); } } @@ -12995,15 +13321,15 @@ public T accept(ParseTreeVisitor visitor) { public final IndexContext index() throws RecognitionException { IndexContext _localctx = new IndexContext(_ctx, getState()); - enterRule(_localctx, 360, RULE_index); + enterRule(_localctx, 370, RULE_index); try { enterOuterAlt(_localctx, 1); { - setState(1840); + setState(1889); match(L_BRACKET); - setState(1841); + setState(1890); expression(0); - setState(1842); + setState(1891); match(R_BRACKET); } } @@ -13039,17 +13365,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeAssertionContext typeAssertion() throws RecognitionException { TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState()); - enterRule(_localctx, 362, RULE_typeAssertion); + enterRule(_localctx, 372, RULE_typeAssertion); try { enterOuterAlt(_localctx, 1); { - setState(1844); + setState(1893); match(DOT); - setState(1845); + setState(1894); match(L_PAREN); - setState(1846); + setState(1895); type_(); - setState(1847); + setState(1896); match(R_PAREN); } } @@ -13092,39 +13418,39 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentsContext arguments() throws RecognitionException { ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 364, RULE_arguments); + enterRule(_localctx, 374, RULE_arguments); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1849); + setState(1898); match(L_PAREN); - setState(1864); + setState(1913); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 9761394314247L) != 0) || ((((_la - 133)) & ~0x3f) == 0 && ((1L << (_la - 133)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 19522788629511L) != 0) || ((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & 1587199L) != 0)) { { - setState(1856); + setState(1905); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,189,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,195,_ctx) ) { case 1: { - setState(1850); + setState(1899); expressionList(); } break; case 2: { - setState(1851); + setState(1900); nonNamedType(); - setState(1854); + setState(1903); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,188,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,194,_ctx) ) { case 1: { - setState(1852); + setState(1901); match(COMMA); - setState(1853); + setState(1902); expressionList(); } break; @@ -13132,22 +13458,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1859); + setState(1908); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1858); + setState(1907); match(ELLIPSIS); } } - setState(1862); + setState(1911); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1861); + setState(1910); match(COMMA); } } @@ -13155,7 +13481,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1866); + setState(1915); match(R_PAREN); } } @@ -13190,15 +13516,15 @@ public T accept(ParseTreeVisitor visitor) { public final MethodExprContext methodExpr() throws RecognitionException { MethodExprContext _localctx = new MethodExprContext(_ctx, getState()); - enterRule(_localctx, 366, RULE_methodExpr); + enterRule(_localctx, 376, RULE_methodExpr); try { enterOuterAlt(_localctx, 1); { - setState(1868); + setState(1917); nonNamedType(); - setState(1869); + setState(1918); match(DOT); - setState(1870); + setState(1919); match(IDENTIFIER); } } @@ -13231,11 +13557,11 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverTypeContext receiverType() throws RecognitionException { ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState()); - enterRule(_localctx, 368, RULE_receiverType); + enterRule(_localctx, 378, RULE_receiverType); try { enterOuterAlt(_localctx, 1); { - setState(1872); + setState(1921); type_(); } } @@ -13268,36 +13594,36 @@ public T accept(ParseTreeVisitor visitor) { public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); - enterRule(_localctx, 370, RULE_eos); + enterRule(_localctx, 380, RULE_eos); try { - setState(1878); + setState(1927); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,193,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,199,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1874); + setState(1923); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1875); + setState(1924); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1876); + setState(1925); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1877); + setState(1926); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; @@ -13316,13 +13642,13 @@ public final EosContext eos() throws RecognitionException { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 83: + case 88: return expression_sempred((ExpressionContext)_localctx, predIndex); - case 91: + case 96: return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex); - case 121: + case 126: return statementList_sempred((StatementListContext)_localctx, predIndex); - case 185: + case 190: return eos_sempred((EosContext)_localctx, predIndex); } return true; @@ -13389,7 +13715,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a2\u0759\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a3\u078a\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -13438,1166 +13764,1200 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u00b0\u0002\u00b1\u0007\u00b1\u0002\u00b2\u0007\u00b2\u0002\u00b3\u0007"+ "\u00b3\u0002\u00b4\u0007\u00b4\u0002\u00b5\u0007\u00b5\u0002\u00b6\u0007"+ "\u00b6\u0002\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8\u0002\u00b9\u0007"+ - "\u00b9\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0005\u0003\u0181\b\u0003\n\u0003\f\u0003\u0184\t\u0003\u0001\u0004"+ - "\u0001\u0004\u0003\u0004\u0188\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0005\u0005\u018d\b\u0005\n\u0005\f\u0005\u0190\t\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u0197\b\u0005\n"+ - "\u0005\f\u0005\u019a\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ - "\u0005\u019f\b\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u01a3\b\u0005"+ - "\n\u0005\f\u0005\u01a6\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0005\u0006\u01ad\b\u0006\n\u0006\f\u0006\u01b0\t\u0006"+ - "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006"+ - "\u01b7\b\u0006\n\u0006\f\u0006\u01ba\t\u0006\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01c5\b"+ - "\t\n\t\f\t\u01c8\t\t\u0001\t\u0003\t\u01cb\b\t\u0001\t\u0001\t\u0001\n"+ - "\u0001\n\u0001\n\u0005\n\u01d2\b\n\n\n\f\n\u01d5\t\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0005\n\u01de\b\n\n\n\f\n\u01e1\t\n"+ - "\u0001\n\u0003\n\u01e4\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0003\u000b\u01ea\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0003\f\u01f3\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u01fd\b\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u00b9\u0002\u00ba\u0007\u00ba\u0002\u00bb\u0007\u00bb\u0002\u00bc\u0007"+ + "\u00bc\u0002\u00bd\u0007\u00bd\u0002\u00be\u0007\u00be\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u018b"+ + "\b\u0003\n\u0003\f\u0003\u018e\t\u0003\u0001\u0004\u0001\u0004\u0003\u0004"+ + "\u0192\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u0197\b"+ + "\u0005\n\u0005\f\u0005\u019a\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0005\u0005\u01a1\b\u0005\n\u0005\f\u0005\u01a4"+ + "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u01a9\b\u0005"+ + "\u0001\u0005\u0001\u0005\u0005\u0005\u01ad\b\u0005\n\u0005\f\u0005\u01b0"+ + "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0005"+ + "\u0006\u01b7\b\u0006\n\u0006\f\u0006\u01ba\t\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u01c1\b\u0006\n\u0006"+ + "\f\u0006\u01c4\t\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+ + "\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01cf\b\t\n\t\f\t\u01d2\t\t"+ + "\u0001\t\u0003\t\u01d5\b\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0005"+ + "\n\u01dc\b\n\n\n\f\n\u01df\t\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n"+ + "\u0001\n\u0001\n\u0005\n\u01e8\b\n\n\n\f\n\u01eb\t\n\u0001\n\u0003\n\u01ee"+ + "\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u01f4"+ + "\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0003"+ + "\f\u01fd\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u0207\b\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u020e\b\u0010\u0001\u0011\u0001"+ - "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0005\u0013\u021a\b\u0013\n\u0013\f\u0013"+ - "\u021d\t\u0013\u0001\u0013\u0003\u0013\u0220\b\u0013\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0005\u0014\u0225\b\u0014\n\u0014\f\u0014\u0228\t\u0014"+ - "\u0001\u0014\u0001\u0014\u0001\u0015\u0005\u0015\u022d\b\u0015\n\u0015"+ - "\f\u0015\u0230\t\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0005\u0016\u0236\b\u0016\n\u0016\f\u0016\u0239\t\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u0258\b\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0003"+ - "\u001d\u0260\b\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ - "!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\""+ - "\u0003\"\u0278\b\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#"+ - "\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0005$\u0289"+ - "\b$\n$\f$\u028c\t$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001&\u0001"+ - "&\u0001&\u0001&\u0005&\u0298\b&\n&\f&\u029b\t&\u0001&\u0001&\u0001\'\u0001"+ - "\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0003(\u02a7\b(\u0001)"+ - "\u0001)\u0001)\u0001)\u0001)\u0005)\u02ae\b)\n)\f)\u02b1\t)\u0001)\u0001"+ - ")\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0003"+ - "*\u02be\b*\u0001+\u0001+\u0001+\u0001+\u0001+\u0005+\u02c5\b+\n+\f+\u02c8"+ - "\t+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0005,\u02d1\b,\n"+ - ",\f,\u02d4\t,\u0001,\u0001,\u0001-\u0003-\u02d9\b-\u0001-\u0001-\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0003/\u02ed\b/\u00010\u00010\u0001"+ - "0\u00010\u00010\u00010\u00010\u00030\u02f6\b0\u00010\u00050\u02f9\b0\n"+ - "0\f0\u02fc\t0\u00010\u00010\u00030\u0300\b0\u00011\u00011\u00011\u0001"+ - "1\u00011\u00011\u00011\u00011\u00031\u030a\b1\u00012\u00032\u030d\b2\u0001"+ - "2\u00012\u00032\u0311\b2\u00013\u00013\u00033\u0315\b3\u00014\u00014\u0001"+ - "4\u00014\u00054\u031b\b4\n4\f4\u031e\t4\u00014\u00014\u00015\u00015\u0001"+ - "5\u00035\u0325\b5\u00016\u00016\u00016\u00036\u032a\b6\u00017\u00017\u0001"+ - "7\u00017\u00017\u00017\u00037\u0332\b7\u00037\u0334\b7\u00017\u00017\u0001"+ - "7\u00037\u0339\b7\u00018\u00018\u00018\u00058\u033e\b8\n8\f8\u0341\t8"+ - "\u00019\u00019\u00019\u00019\u00019\u00039\u0348\b9\u00019\u00039\u034b"+ - "\b9\u00019\u00019\u0001:\u0001:\u0003:\u0351\b:\u0001:\u0001:\u0001:\u0003"+ - ":\u0356\b:\u0003:\u0358\b:\u0001:\u0003:\u035b\b:\u0001;\u0001;\u0001"+ - ";\u0005;\u0360\b;\n;\f;\u0363\t;\u0001<\u0001<\u0003<\u0367\b<\u0001<"+ - "\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001"+ - ">\u0001>\u0001>\u0001>\u0001>\u0005>\u0378\b>\n>\f>\u037b\t>\u0001>\u0001"+ - ">\u0001>\u0005>\u0380\b>\n>\f>\u0383\t>\u0001>\u0003>\u0386\b>\u0001?"+ - "\u0003?\u0389\b?\u0001?\u0001?\u0001?\u0001?\u0003?\u038f\b?\u0001@\u0001"+ - "@\u0003@\u0393\b@\u0001@\u0003@\u0396\b@\u0001@\u0001@\u0001@\u0001A\u0001"+ - "A\u0001A\u0001A\u0001A\u0003A\u03a0\bA\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0003B\u03a7\bB\u0001C\u0001C\u0001C\u0001C\u0001C\u0003C\u03ae\bC\u0001"+ - "C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0003"+ - "E\u03ba\bE\u0001F\u0001F\u0001F\u0001F\u0003F\u03c0\bF\u0001G\u0001G\u0001"+ - "G\u0001G\u0001G\u0003G\u03c7\bG\u0001H\u0001H\u0001H\u0003H\u03cc\bH\u0001"+ - "I\u0001I\u0001I\u0001I\u0003I\u03d2\bI\u0001J\u0001J\u0001J\u0001J\u0001"+ - "J\u0001K\u0001K\u0001K\u0001K\u0001K\u0003K\u03de\bK\u0001L\u0001L\u0001"+ - "L\u0001L\u0003L\u03e4\bL\u0001L\u0001L\u0003L\u03e8\bL\u0001M\u0001M\u0001"+ - "M\u0001M\u0001N\u0001N\u0003N\u03f0\bN\u0001N\u0001N\u0003N\u03f4\bN\u0001"+ - "N\u0001N\u0001O\u0001O\u0003O\u03fa\bO\u0001P\u0003P\u03fd\bP\u0001P\u0001"+ - "P\u0001Q\u0001Q\u0003Q\u0403\bQ\u0001Q\u0001Q\u0001R\u0003R\u0408\bR\u0001"+ - "R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0003S\u0421\bS\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0005S\u0444\bS\nS"+ - "\fS\u0447\tS\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ - "T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ - "T\u0001T\u0003T\u045d\bT\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0003"+ - "V\u0465\bV\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0005X\u046e"+ - "\bX\nX\fX\u0471\tX\u0001X\u0001X\u0001X\u0001X\u0003X\u0477\bX\u0001Y"+ - "\u0001Y\u0001Y\u0001Y\u0001Y\u0003Y\u047e\bY\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003Z\u0488\bZ\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0003[\u049a\b[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001[\u0005[\u04b0\b[\n[\f[\u04b3\t[\u0001\\\u0001"+ - "\\\u0001\\\u0001]\u0001]\u0003]\u04ba\b]\u0001]\u0001]\u0003]\u04be\b"+ - "]\u0001^\u0001^\u0003^\u04c2\b^\u0001^\u0003^\u04c5\b^\u0001^\u0001^\u0001"+ - "_\u0001_\u0001_\u0001_\u0001_\u0003_\u04ce\b_\u0001_\u0001_\u0005_\u04d2"+ - "\b_\n_\f_\u04d5\t_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001a\u0003"+ - "a\u04de\ba\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0003a\u04e6\ba\u0001"+ - "a\u0001a\u0001a\u0001a\u0003a\u04ec\ba\u0001b\u0001b\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0003b\u04f5\bb\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ - "c\u0001c\u0001c\u0001c\u0003c\u0500\bc\u0001d\u0001d\u0001d\u0001e\u0001"+ - "e\u0001e\u0001e\u0005e\u0509\be\ne\fe\u050c\te\u0001e\u0003e\u050f\be"+ - "\u0003e\u0511\be\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001f\u0001"+ - "f\u0001f\u0003f\u051c\bf\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001"+ - "h\u0003h\u0525\bh\u0001h\u0001h\u0003h\u0529\bh\u0001h\u0003h\u052c\b"+ - "h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u0533\bh\u0001h\u0001h\u0001"+ - "i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001l\u0003l\u053e\bl\u0001l\u0001"+ - "l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0003m\u0548\bm\u0001m\u0001"+ - "m\u0001m\u0001m\u0003m\u054e\bm\u0003m\u0550\bm\u0001n\u0001n\u0001n\u0001"+ - "o\u0001o\u0001p\u0001p\u0001p\u0003p\u055a\bp\u0001q\u0001q\u0001q\u0001"+ - "q\u0001q\u0001q\u0005q\u0562\bq\nq\fq\u0565\tq\u0001q\u0003q\u0568\bq"+ - "\u0001r\u0001r\u0003r\u056c\br\u0001r\u0001r\u0003r\u0570\br\u0001s\u0001"+ - "s\u0001s\u0005s\u0575\bs\ns\fs\u0578\ts\u0001t\u0001t\u0001t\u0005t\u057d"+ - "\bt\nt\ft\u0580\tt\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0005u\u0588"+ - "\bu\nu\fu\u058b\tu\u0001u\u0003u\u058e\bu\u0001v\u0001v\u0003v\u0592\b"+ - "v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0005w\u059c"+ - "\bw\nw\fw\u059f\tw\u0001w\u0003w\u05a2\bw\u0001x\u0001x\u0003x\u05a6\b"+ - "x\u0001x\u0001x\u0001y\u0003y\u05ab\by\u0001y\u0003y\u05ae\by\u0001y\u0003"+ - "y\u05b1\by\u0001y\u0001y\u0001y\u0004y\u05b6\by\u000by\fy\u05b7\u0001"+ - "z\u0001z\u0001z\u0001z\u0001z\u0003z\u05bf\bz\u0001{\u0001{\u0001|\u0001"+ - "|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001"+ - "\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0003\u0080\u05d3"+ - "\b\u0080\u0001\u0081\u0001\u0081\u0003\u0081\u05d7\b\u0081\u0001\u0082"+ - "\u0001\u0082\u0003\u0082\u05db\b\u0082\u0001\u0083\u0001\u0083\u0003\u0083"+ - "\u05df\b\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085"+ - "\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086"+ - "\u0001\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u05ef\b\u0086\u0001\u0086"+ - "\u0001\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u05f5\b\u0086\u0003\u0086"+ - "\u05f7\b\u0086\u0001\u0087\u0001\u0087\u0003\u0087\u05fb\b\u0087\u0001"+ - "\u0088\u0001\u0088\u0003\u0088\u05ff\b\u0088\u0001\u0088\u0003\u0088\u0602"+ - "\b\u0088\u0001\u0088\u0001\u0088\u0003\u0088\u0606\b\u0088\u0003\u0088"+ - "\u0608\b\u0088\u0001\u0088\u0001\u0088\u0005\u0088\u060c\b\u0088\n\u0088"+ - "\f\u0088\u060f\t\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089"+ - "\u0001\u0089\u0003\u0089\u0616\b\u0089\u0001\u008a\u0001\u008a\u0001\u008a"+ - "\u0003\u008a\u061b\b\u008a\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b"+ - "\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0003\u008b"+ - "\u0626\b\u008b\u0001\u008b\u0001\u008b\u0005\u008b\u062a\b\u008b\n\u008b"+ - "\f\u008b\u062d\t\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c"+ - "\u0003\u008c\u0633\b\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c"+ - "\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0003\u008d"+ - "\u063e\b\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u0643\b"+ - "\u008e\u0001\u008f\u0001\u008f\u0003\u008f\u0647\b\u008f\u0001\u008f\u0001"+ - "\u008f\u0001\u008f\u0003\u008f\u064c\b\u008f\u0005\u008f\u064e\b\u008f"+ - "\n\u008f\f\u008f\u0651\t\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0005"+ - "\u0090\u0656\b\u0090\n\u0090\f\u0090\u0659\t\u0090\u0001\u0090\u0001\u0090"+ - "\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u0660\b\u0091\u0001\u0092"+ - "\u0001\u0092\u0001\u0092\u0003\u0092\u0665\b\u0092\u0001\u0092\u0003\u0092"+ - "\u0668\b\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093"+ - "\u0001\u0093\u0003\u0093\u0670\b\u0093\u0001\u0093\u0001\u0093\u0001\u0094"+ - "\u0001\u0094\u0003\u0094\u0676\b\u0094\u0001\u0094\u0001\u0094\u0003\u0094"+ - "\u067a\b\u0094\u0003\u0094\u067c\b\u0094\u0001\u0094\u0001\u0094\u0001"+ - "\u0095\u0003\u0095\u0681\b\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u0685"+ - "\b\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u0689\b\u0095\u0001\u0096"+ - "\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0003\u0097\u0690\b\u0097"+ - "\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099"+ - "\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b"+ - "\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d"+ - "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e"+ - "\u0001\u009e\u0001\u009e\u0001\u009e\u0003\u009e\u06ad\b\u009e\u0001\u009e"+ - "\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0"+ - "\u0001\u00a0\u0001\u00a0\u0003\u00a0\u06b8\b\u00a0\u0001\u00a1\u0001\u00a1"+ - "\u0003\u00a1\u06bc\b\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2"+ - "\u0005\u00a2\u06c2\b\u00a2\n\u00a2\f\u00a2\u06c5\t\u00a2\u0001\u00a2\u0003"+ - "\u00a2\u06c8\b\u00a2\u0003\u00a2\u06ca\b\u00a2\u0001\u00a2\u0001\u00a2"+ - "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0003\u00a3\u06d2\b\u00a3"+ - "\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4"+ - "\u0001\u00a4\u0003\u00a4\u06db\b\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ - "\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06e3\b\u00a5\u0001\u00a6"+ - "\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06e8\b\u00a6\u0001\u00a7\u0001\u00a7"+ - "\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9"+ - "\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ - "\u0003\u00ab\u06f8\b\u00ab\u0003\u00ab\u06fa\b\u00ab\u0001\u00ab\u0001"+ - "\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0005\u00ac\u0701\b\u00ac\n"+ - "\u00ac\f\u00ac\u0704\t\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003"+ - "\u00ad\u0709\b\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0003"+ - "\u00ae\u070f\b\u00ae\u0001\u00af\u0001\u00af\u0003\u00af\u0713\b\u00af"+ - "\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0005\u00b0"+ - "\u071a\b\u00b0\n\u00b0\f\u00b0\u071d\t\u00b0\u0001\u00b0\u0001\u00b0\u0001"+ - "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0003\u00b1\u0725\b\u00b1\u0001"+ - "\u00b1\u0003\u00b1\u0728\b\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0003"+ - "\u00b3\u072d\b\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ - "\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001"+ - "\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0003"+ - "\u00b6\u073f\b\u00b6\u0003\u00b6\u0741\b\u00b6\u0001\u00b6\u0003\u00b6"+ - "\u0744\b\u00b6\u0001\u00b6\u0003\u00b6\u0747\b\u00b6\u0003\u00b6\u0749"+ - "\b\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001"+ - "\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001"+ - "\u00b9\u0003\u00b9\u0757\b\u00b9\u0001\u00b9\u0001\u02fa\u0002\u00a6\u00b6"+ - "\u00ba\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ - "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ - "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+ - "\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0"+ - "\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8"+ - "\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0"+ - "\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8"+ - "\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110"+ - "\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128"+ - "\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140"+ - "\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158"+ - "\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170"+ - "\u0172\u0000\u0013\u0002\u0000ggrr\u0001\u0000\u0017\u0018\u0001\u0000"+ - "\u0005\b\u0001\u0000AB\u0001\u0000(*\u0002\u0000(*,,\u0001\u0000\u0085"+ - "\u008b\u0001\u0000\u0014\u0015\u0002\u0000\u0080\u0084\u0089\u008a\u0004"+ - "\u0000##ss\u007f\u007f\u0086\u0088\u0001\u0000\u001f!\u0001\u0000\u001c"+ - "\u001e\u0002\u0000HIy~\u0004\u0000--0033__\u0002\u0000\u007f\u0084\u0086"+ - "\u008a\u0001\u0000st\u0002\u0000pp\u00a1\u00a1\u0002\u0000\u008c\u008f"+ - "\u0091\u0092\u0001\u0000\u0098\u0099\u07c4\u0000\u0174\u0001\u0000\u0000"+ - "\u0000\u0002\u0177\u0001\u0000\u0000\u0000\u0004\u017a\u0001\u0000\u0000"+ - "\u0000\u0006\u017d\u0001\u0000\u0000\u0000\b\u0185\u0001\u0000\u0000\u0000"+ - "\n\u018e\u0001\u0000\u0000\u0000\f\u01ae\u0001\u0000\u0000\u0000\u000e"+ - "\u01bb\u0001\u0000\u0000\u0000\u0010\u01be\u0001\u0000\u0000\u0000\u0012"+ - "\u01c6\u0001\u0000\u0000\u0000\u0014\u01d3\u0001\u0000\u0000\u0000\u0016"+ - "\u01e9\u0001\u0000\u0000\u0000\u0018\u01f2\u0001\u0000\u0000\u0000\u001a"+ - "\u01f4\u0001\u0000\u0000\u0000\u001c\u01f6\u0001\u0000\u0000\u0000\u001e"+ - "\u01f9\u0001\u0000\u0000\u0000 \u020d\u0001\u0000\u0000\u0000\"\u020f"+ - "\u0001\u0000\u0000\u0000$\u0211\u0001\u0000\u0000\u0000&\u0216\u0001\u0000"+ - "\u0000\u0000(\u0221\u0001\u0000\u0000\u0000*\u022e\u0001\u0000\u0000\u0000"+ - ",\u0231\u0001\u0000\u0000\u0000.\u023c\u0001\u0000\u0000\u00000\u023e"+ - "\u0001\u0000\u0000\u00002\u0243\u0001\u0000\u0000\u00004\u0248\u0001\u0000"+ - "\u0000\u00006\u024d\u0001\u0000\u0000\u00008\u0252\u0001\u0000\u0000\u0000"+ - ":\u025f\u0001\u0000\u0000\u0000<\u0261\u0001\u0000\u0000\u0000>\u0263"+ - "\u0001\u0000\u0000\u0000@\u0268\u0001\u0000\u0000\u0000B\u026d\u0001\u0000"+ - "\u0000\u0000D\u0272\u0001\u0000\u0000\u0000F\u027b\u0001\u0000\u0000\u0000"+ - "H\u0282\u0001\u0000\u0000\u0000J\u028f\u0001\u0000\u0000\u0000L\u0293"+ - "\u0001\u0000\u0000\u0000N\u029e\u0001\u0000\u0000\u0000P\u02a6\u0001\u0000"+ - "\u0000\u0000R\u02a8\u0001\u0000\u0000\u0000T\u02bd\u0001\u0000\u0000\u0000"+ - "V\u02bf\u0001\u0000\u0000\u0000X\u02cb\u0001\u0000\u0000\u0000Z\u02d8"+ - "\u0001\u0000\u0000\u0000\\\u02dc\u0001\u0000\u0000\u0000^\u02ec\u0001"+ - "\u0000\u0000\u0000`\u02fa\u0001\u0000\u0000\u0000b\u0309\u0001\u0000\u0000"+ - "\u0000d\u030c\u0001\u0000\u0000\u0000f\u0314\u0001\u0000\u0000\u0000h"+ - "\u0316\u0001\u0000\u0000\u0000j\u0321\u0001\u0000\u0000\u0000l\u0329\u0001"+ - "\u0000\u0000\u0000n\u0338\u0001\u0000\u0000\u0000p\u033a\u0001\u0000\u0000"+ - "\u0000r\u0342\u0001\u0000\u0000\u0000t\u0350\u0001\u0000\u0000\u0000v"+ - "\u035c\u0001\u0000\u0000\u0000x\u0366\u0001\u0000\u0000\u0000z\u036a\u0001"+ - "\u0000\u0000\u0000|\u0370\u0001\u0000\u0000\u0000~\u0388\u0001\u0000\u0000"+ - "\u0000\u0080\u0390\u0001\u0000\u0000\u0000\u0082\u039f\u0001\u0000\u0000"+ - "\u0000\u0084\u03a1\u0001\u0000\u0000\u0000\u0086\u03a8\u0001\u0000\u0000"+ - "\u0000\u0088\u03b1\u0001\u0000\u0000\u0000\u008a\u03b6\u0001\u0000\u0000"+ - "\u0000\u008c\u03bb\u0001\u0000\u0000\u0000\u008e\u03c1\u0001\u0000\u0000"+ - "\u0000\u0090\u03c8\u0001\u0000\u0000\u0000\u0092\u03cd\u0001\u0000\u0000"+ - "\u0000\u0094\u03d3\u0001\u0000\u0000\u0000\u0096\u03d8\u0001\u0000\u0000"+ - "\u0000\u0098\u03df\u0001\u0000\u0000\u0000\u009a\u03e9\u0001\u0000\u0000"+ - "\u0000\u009c\u03ed\u0001\u0000\u0000\u0000\u009e\u03f9\u0001\u0000\u0000"+ - "\u0000\u00a0\u03fc\u0001\u0000\u0000\u0000\u00a2\u0400\u0001\u0000\u0000"+ - "\u0000\u00a4\u0407\u0001\u0000\u0000\u0000\u00a6\u0420\u0001\u0000\u0000"+ - "\u0000\u00a8\u045c\u0001\u0000\u0000\u0000\u00aa\u045e\u0001\u0000\u0000"+ - "\u0000\u00ac\u0461\u0001\u0000\u0000\u0000\u00ae\u0466\u0001\u0000\u0000"+ - "\u0000\u00b0\u046f\u0001\u0000\u0000\u0000\u00b2\u047d\u0001\u0000\u0000"+ - "\u0000\u00b4\u0487\u0001\u0000\u0000\u0000\u00b6\u0499\u0001\u0000\u0000"+ - "\u0000\u00b8\u04b4\u0001\u0000\u0000\u0000\u00ba\u04b7\u0001\u0000\u0000"+ - "\u0000\u00bc\u04bf\u0001\u0000\u0000\u0000\u00be\u04c8\u0001\u0000\u0000"+ - "\u0000\u00c0\u04d8\u0001\u0000\u0000\u0000\u00c2\u04eb\u0001\u0000\u0000"+ - "\u0000\u00c4\u04f4\u0001\u0000\u0000\u0000\u00c6\u04ff\u0001\u0000\u0000"+ - "\u0000\u00c8\u0501\u0001\u0000\u0000\u0000\u00ca\u0504\u0001\u0000\u0000"+ - "\u0000\u00cc\u051b\u0001\u0000\u0000\u0000\u00ce\u051d\u0001\u0000\u0000"+ - "\u0000\u00d0\u0522\u0001\u0000\u0000\u0000\u00d2\u0536\u0001\u0000\u0000"+ - "\u0000\u00d4\u0538\u0001\u0000\u0000\u0000\u00d6\u053a\u0001\u0000\u0000"+ - "\u0000\u00d8\u053d\u0001\u0000\u0000\u0000\u00da\u0547\u0001\u0000\u0000"+ - "\u0000\u00dc\u0551\u0001\u0000\u0000\u0000\u00de\u0554\u0001\u0000\u0000"+ - "\u0000\u00e0\u0559\u0001\u0000\u0000\u0000\u00e2\u055b\u0001\u0000\u0000"+ - "\u0000\u00e4\u0569\u0001\u0000\u0000\u0000\u00e6\u0571\u0001\u0000\u0000"+ - "\u0000\u00e8\u0579\u0001\u0000\u0000\u0000\u00ea\u0581\u0001\u0000\u0000"+ - "\u0000\u00ec\u058f\u0001\u0000\u0000\u0000\u00ee\u0595\u0001\u0000\u0000"+ - "\u0000\u00f0\u05a3\u0001\u0000\u0000\u0000\u00f2\u05b5\u0001\u0000\u0000"+ - "\u0000\u00f4\u05be\u0001\u0000\u0000\u0000\u00f6\u05c0\u0001\u0000\u0000"+ - "\u0000\u00f8\u05c2\u0001\u0000\u0000\u0000\u00fa\u05c6\u0001\u0000\u0000"+ - "\u0000\u00fc\u05c9\u0001\u0000\u0000\u0000\u00fe\u05cd\u0001\u0000\u0000"+ - "\u0000\u0100\u05cf\u0001\u0000\u0000\u0000\u0102\u05d4\u0001\u0000\u0000"+ - "\u0000\u0104\u05d8\u0001\u0000\u0000\u0000\u0106\u05dc\u0001\u0000\u0000"+ - "\u0000\u0108\u05e0\u0001\u0000\u0000\u0000\u010a\u05e3\u0001\u0000\u0000"+ - "\u0000\u010c\u05e5\u0001\u0000\u0000\u0000\u010e\u05fa\u0001\u0000\u0000"+ - "\u0000\u0110\u05fc\u0001\u0000\u0000\u0000\u0112\u0612\u0001\u0000\u0000"+ - "\u0000\u0114\u061a\u0001\u0000\u0000\u0000\u0116\u061c\u0001\u0000\u0000"+ - "\u0000\u0118\u0632\u0001\u0000\u0000\u0000\u011a\u063a\u0001\u0000\u0000"+ - "\u0000\u011c\u0642\u0001\u0000\u0000\u0000\u011e\u0646\u0001\u0000\u0000"+ - "\u0000\u0120\u0652\u0001\u0000\u0000\u0000\u0122\u065c\u0001\u0000\u0000"+ - "\u0000\u0124\u0667\u0001\u0000\u0000\u0000\u0126\u066f\u0001\u0000\u0000"+ - "\u0000\u0128\u0673\u0001\u0000\u0000\u0000\u012a\u0680\u0001\u0000\u0000"+ - "\u0000\u012c\u068a\u0001\u0000\u0000\u0000\u012e\u068f\u0001\u0000\u0000"+ - "\u0000\u0130\u0691\u0001\u0000\u0000\u0000\u0132\u0696\u0001\u0000\u0000"+ - "\u0000\u0134\u0698\u0001\u0000\u0000\u0000\u0136\u069a\u0001\u0000\u0000"+ - "\u0000\u0138\u069d\u0001\u0000\u0000\u0000\u013a\u06a1\u0001\u0000\u0000"+ - "\u0000\u013c\u06ac\u0001\u0000\u0000\u0000\u013e\u06b0\u0001\u0000\u0000"+ - "\u0000\u0140\u06b7\u0001\u0000\u0000\u0000\u0142\u06bb\u0001\u0000\u0000"+ - "\u0000\u0144\u06bd\u0001\u0000\u0000\u0000\u0146\u06cd\u0001\u0000\u0000"+ - "\u0000\u0148\u06da\u0001\u0000\u0000\u0000\u014a\u06e2\u0001\u0000\u0000"+ - "\u0000\u014c\u06e7\u0001\u0000\u0000\u0000\u014e\u06e9\u0001\u0000\u0000"+ - "\u0000\u0150\u06eb\u0001\u0000\u0000\u0000\u0152\u06ed\u0001\u0000\u0000"+ - "\u0000\u0154\u06f1\u0001\u0000\u0000\u0000\u0156\u06f4\u0001\u0000\u0000"+ - "\u0000\u0158\u06fd\u0001\u0000\u0000\u0000\u015a\u0708\u0001\u0000\u0000"+ - "\u0000\u015c\u070e\u0001\u0000\u0000\u0000\u015e\u0712\u0001\u0000\u0000"+ - "\u0000\u0160\u0714\u0001\u0000\u0000\u0000\u0162\u0724\u0001\u0000\u0000"+ - "\u0000\u0164\u0729\u0001\u0000\u0000\u0000\u0166\u072c\u0001\u0000\u0000"+ - "\u0000\u0168\u0730\u0001\u0000\u0000\u0000\u016a\u0734\u0001\u0000\u0000"+ - "\u0000\u016c\u0739\u0001\u0000\u0000\u0000\u016e\u074c\u0001\u0000\u0000"+ - "\u0000\u0170\u0750\u0001\u0000\u0000\u0000\u0172\u0756\u0001\u0000\u0000"+ - "\u0000\u0174\u0175\u0003\u00a6S\u0000\u0175\u0176\u0005\u0000\u0000\u0001"+ - "\u0176\u0001\u0001\u0000\u0000\u0000\u0177\u0178\u0003\u00a8T\u0000\u0178"+ - "\u0179\u0005\u0000\u0000\u0001\u0179\u0003\u0001\u0000\u0000\u0000\u017a"+ - "\u017b\u0003\u00c4b\u0000\u017b\u017c\u0005\u0000\u0000\u0001\u017c\u0005"+ - "\u0001\u0000\u0000\u0000\u017d\u0182\u0003\b\u0004\u0000\u017e\u017f\u0005"+ - "o\u0000\u0000\u017f\u0181\u0003\b\u0004\u0000\u0180\u017e\u0001\u0000"+ - "\u0000\u0000\u0181\u0184\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000"+ - "\u0000\u0000\u0182\u0183\u0001\u0000\u0000\u0000\u0183\u0007\u0001\u0000"+ - "\u0000\u0000\u0184\u0182\u0001\u0000\u0000\u0000\u0185\u0187\u0005g\u0000"+ - "\u0000\u0186\u0188\u0005<\u0000\u0000\u0187\u0186\u0001\u0000\u0000\u0000"+ - "\u0187\u0188\u0001\u0000\u0000\u0000\u0188\t\u0001\u0000\u0000\u0000\u0189"+ - "\u018a\u0003\u000e\u0007\u0000\u018a\u018b\u0003\u0172\u00b9\u0000\u018b"+ - "\u018d\u0001\u0000\u0000\u0000\u018c\u0189\u0001\u0000\u0000\u0000\u018d"+ - "\u0190\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e"+ - "\u018f\u0001\u0000\u0000\u0000\u018f\u0191\u0001\u0000\u0000\u0000\u0190"+ - "\u018e\u0001\u0000\u0000\u0000\u0191\u0192\u0003\u00dcn\u0000\u0192\u0198"+ - "\u0003\u0172\u00b9\u0000\u0193\u0194\u0003\u0014\n\u0000\u0194\u0195\u0003"+ - "\u0172\u00b9\u0000\u0195\u0197\u0001\u0000\u0000\u0000\u0196\u0193\u0001"+ - "\u0000\u0000\u0000\u0197\u019a\u0001\u0000\u0000\u0000\u0198\u0196\u0001"+ - "\u0000\u0000\u0000\u0198\u0199\u0001\u0000\u0000\u0000\u0199\u01a4\u0001"+ - "\u0000\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000\u019b\u019f\u0003"+ - "\u008aE\u0000\u019c\u019f\u0003\u00e0p\u0000\u019d\u019f\u0003\u0016\u000b"+ - "\u0000\u019e\u019b\u0001\u0000\u0000\u0000\u019e\u019c\u0001\u0000\u0000"+ - "\u0000\u019e\u019d\u0001\u0000\u0000\u0000\u019f\u01a0\u0001\u0000\u0000"+ - "\u0000\u01a0\u01a1\u0003\u0172\u00b9\u0000\u01a1\u01a3\u0001\u0000\u0000"+ - "\u0000\u01a2\u019e\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001\u0000\u0000"+ - "\u0000\u01a4\u01a2\u0001\u0000\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000"+ - "\u0000\u01a5\u01a7\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000"+ - "\u0000\u01a7\u01a8\u0005\u0000\u0000\u0001\u01a8\u000b\u0001\u0000\u0000"+ - "\u0000\u01a9\u01aa\u0003\u000e\u0007\u0000\u01aa\u01ab\u0003\u0172\u00b9"+ - "\u0000\u01ab\u01ad\u0001\u0000\u0000\u0000\u01ac\u01a9\u0001\u0000\u0000"+ - "\u0000\u01ad\u01b0\u0001\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000"+ - "\u0000\u01ae\u01af\u0001\u0000\u0000\u0000\u01af\u01b1\u0001\u0000\u0000"+ - "\u0000\u01b0\u01ae\u0001\u0000\u0000\u0000\u01b1\u01b2\u0003\u00dcn\u0000"+ - "\u01b2\u01b8\u0003\u0172\u00b9\u0000\u01b3\u01b4\u0003\u0014\n\u0000\u01b4"+ - "\u01b5\u0003\u0172\u00b9\u0000\u01b5\u01b7\u0001\u0000\u0000\u0000\u01b6"+ - "\u01b3\u0001\u0000\u0000\u0000\u01b7\u01ba\u0001\u0000\u0000\u0000\u01b8"+ - "\u01b6\u0001\u0000\u0000\u0000\u01b8\u01b9\u0001\u0000\u0000\u0000\u01b9"+ - "\r\u0001\u0000\u0000\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01bb\u01bc"+ - "\u0005E\u0000\u0000\u01bc\u01bd\u0003\u00a6S\u0000\u01bd\u000f\u0001\u0000"+ - "\u0000\u0000\u01be\u01bf\u0005F\u0000\u0000\u01bf\u01c0\u0003\u00a6S\u0000"+ - "\u01c0\u0011\u0001\u0000\u0000\u0000\u01c1\u01c2\u0003\u0010\b\u0000\u01c2"+ - "\u01c3\u0003\u0172\u00b9\u0000\u01c3\u01c5\u0001\u0000\u0000\u0000\u01c4"+ - "\u01c1\u0001\u0000\u0000\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6"+ - "\u01c4\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7"+ - "\u01ca\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9"+ - "\u01cb\u0007\u0000\u0000\u0000\u01ca\u01c9\u0001\u0000\u0000\u0000\u01ca"+ - "\u01cb\u0001\u0000\u0000\u0000\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc"+ - "\u01cd\u0003\u00deo\u0000\u01cd\u0013\u0001\u0000\u0000\u0000\u01ce\u01cf"+ - "\u0003\u0010\b\u0000\u01cf\u01d0\u0003\u0172\u00b9\u0000\u01d0\u01d2\u0001"+ - "\u0000\u0000\u0000\u01d1\u01ce\u0001\u0000\u0000\u0000\u01d2\u01d5\u0001"+ - "\u0000\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001"+ - "\u0000\u0000\u0000\u01d4\u01e3\u0001\u0000\u0000\u0000\u01d5\u01d3\u0001"+ - "\u0000\u0000\u0000\u01d6\u01d7\u0005c\u0000\u0000\u01d7\u01e4\u0003\u0012"+ - "\t\u0000\u01d8\u01d9\u0005c\u0000\u0000\u01d9\u01df\u0005h\u0000\u0000"+ - "\u01da\u01db\u0003\u0012\t\u0000\u01db\u01dc\u0003\u0172\u00b9\u0000\u01dc"+ - "\u01de\u0001\u0000\u0000\u0000\u01dd\u01da\u0001\u0000\u0000\u0000\u01de"+ - "\u01e1\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df"+ - "\u01e0\u0001\u0000\u0000\u0000\u01e0\u01e2\u0001\u0000\u0000\u0000\u01e1"+ - "\u01df\u0001\u0000\u0000\u0000\u01e2\u01e4\u0005i\u0000\u0000\u01e3\u01d6"+ - "\u0001\u0000\u0000\u0000\u01e3\u01d8\u0001\u0000\u0000\u0000\u01e4\u0015"+ - "\u0001\u0000\u0000\u0000\u01e5\u01ea\u0003|>\u0000\u01e6\u01ea\u0003\u0092"+ - "I\u0000\u01e7\u01ea\u0003\u0096K\u0000\u01e8\u01ea\u0003\u0090H\u0000"+ - "\u01e9\u01e5\u0001\u0000\u0000\u0000\u01e9\u01e6\u0001\u0000\u0000\u0000"+ - "\u01e9\u01e7\u0001\u0000\u0000\u0000\u01e9\u01e8\u0001\u0000\u0000\u0000"+ - "\u01ea\u0017\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005\u001b\u0000\u0000"+ - "\u01ec\u01f3\u0003\u00a8T\u0000\u01ed\u01ee\u0007\u0001\u0000\u0000\u01ee"+ - "\u01f3\u0003.\u0017\u0000\u01ef\u01f0\u0007\u0002\u0000\u0000\u01f0\u01f3"+ - "\u0003\u00a6S\u0000\u01f1\u01f3\u0003h4\u0000\u01f2\u01eb\u0001\u0000"+ - "\u0000\u0000\u01f2\u01ed\u0001\u0000\u0000\u0000\u01f2\u01ef\u0001\u0000"+ - "\u0000\u0000\u01f2\u01f1\u0001\u0000\u0000\u0000\u01f3\u0019\u0001\u0000"+ - "\u0000\u0000\u01f4\u01f5\u0003\u001c\u000e\u0000\u01f5\u001b\u0001\u0000"+ - "\u0000\u0000\u01f6\u01f7\u0003`0\u0000\u01f7\u01f8\u0003\u001e\u000f\u0000"+ - "\u01f8\u001d\u0001\u0000\u0000\u0000\u01f9\u01fa\u0005D\u0000\u0000\u01fa"+ - "\u01fc\u0005h\u0000\u0000\u01fb\u01fd\u0003\u00f2y\u0000\u01fc\u01fb\u0001"+ - "\u0000\u0000\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd\u01fe\u0001"+ - "\u0000\u0000\u0000\u01fe\u01ff\u0005i\u0000\u0000\u01ff\u001f\u0001\u0000"+ - "\u0000\u0000\u0200\u020e\u0003F#\u0000\u0201\u020e\u0003D\"\u0000\u0202"+ - "\u020e\u0003B!\u0000\u0203\u020e\u0003$\u0012\u0000\u0204\u020e\u0003"+ - "@ \u0000\u0205\u020e\u00038\u001c\u0000\u0206\u020e\u0003>\u001f\u0000"+ - "\u0207\u020e\u00036\u001b\u0000\u0208\u020e\u00032\u0019\u0000\u0209\u020e"+ - "\u00030\u0018\u0000\u020a\u020e\u00034\u001a\u0000\u020b\u020e\u0003\""+ - "\u0011\u0000\u020c\u020e\u0003H$\u0000\u020d\u0200\u0001\u0000\u0000\u0000"+ - "\u020d\u0201\u0001\u0000\u0000\u0000\u020d\u0202\u0001\u0000\u0000\u0000"+ - "\u020d\u0203\u0001\u0000\u0000\u0000\u020d\u0204\u0001\u0000\u0000\u0000"+ - "\u020d\u0205\u0001\u0000\u0000\u0000\u020d\u0206\u0001\u0000\u0000\u0000"+ - "\u020d\u0207\u0001\u0000\u0000\u0000\u020d\u0208\u0001\u0000\u0000\u0000"+ - "\u020d\u0209\u0001\u0000\u0000\u0000\u020d\u020a\u0001\u0000\u0000\u0000"+ - "\u020d\u020b\u0001\u0000\u0000\u0000\u020d\u020c\u0001\u0000\u0000\u0000"+ - "\u020e!\u0001\u0000\u0000\u0000\u020f\u0210\u0007\u0003\u0000\u0000\u0210"+ - "#\u0001\u0000\u0000\u0000\u0211\u0212\u0005`\u0000\u0000\u0212\u0213\u0005"+ - "l\u0000\u0000\u0213\u0214\u0003\u00c4b\u0000\u0214\u0215\u0005m\u0000"+ - "\u0000\u0215%\u0001\u0000\u0000\u0000\u0216\u021b\u0003(\u0014\u0000\u0217"+ - "\u0218\u0005o\u0000\u0000\u0218\u021a\u0003(\u0014\u0000\u0219\u0217\u0001"+ - "\u0000\u0000\u0000\u021a\u021d\u0001\u0000\u0000\u0000\u021b\u0219\u0001"+ - "\u0000\u0000\u0000\u021b\u021c\u0001\u0000\u0000\u0000\u021c\u021f\u0001"+ - "\u0000\u0000\u0000\u021d\u021b\u0001\u0000\u0000\u0000\u021e\u0220\u0005"+ - "o\u0000\u0000\u021f\u021e\u0001\u0000\u0000\u0000\u021f\u0220\u0001\u0000"+ - "\u0000\u0000\u0220\'\u0001\u0000\u0000\u0000\u0221\u0226\u0005g\u0000"+ - "\u0000\u0222\u0223\u0005o\u0000\u0000\u0223\u0225\u0005g\u0000\u0000\u0224"+ - "\u0222\u0001\u0000\u0000\u0000\u0225\u0228\u0001\u0000\u0000\u0000\u0226"+ - "\u0224\u0001\u0000\u0000\u0000\u0226\u0227\u0001\u0000\u0000\u0000\u0227"+ - "\u0229\u0001\u0000\u0000\u0000\u0228\u0226\u0001\u0000\u0000\u0000\u0229"+ - "\u022a\u0003\u0134\u009a\u0000\u022a)\u0001\u0000\u0000\u0000\u022b\u022d"+ - "\u0003,\u0016\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d\u0230\u0001"+ - "\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e\u022f\u0001"+ - "\u0000\u0000\u0000\u022f+\u0001\u0000\u0000\u0000\u0230\u022e\u0001\u0000"+ - "\u0000\u0000\u0231\u0232\u0005j\u0000\u0000\u0232\u0237\u0003\u00a6S\u0000"+ - "\u0233\u0234\u0005o\u0000\u0000\u0234\u0236\u0003\u00a6S\u0000\u0235\u0233"+ - "\u0001\u0000\u0000\u0000\u0236\u0239\u0001\u0000\u0000\u0000\u0237\u0235"+ - "\u0001\u0000\u0000\u0000\u0237\u0238\u0001\u0000\u0000\u0000\u0238\u023a"+ - "\u0001\u0000\u0000\u0000\u0239\u0237\u0001\u0000\u0000\u0000\u023a\u023b"+ - "\u0005k\u0000\u0000\u023b-\u0001\u0000\u0000\u0000\u023c\u023d\u0003\u00b6"+ - "[\u0000\u023d/\u0001\u0000\u0000\u0000\u023e\u023f\u00051\u0000\u0000"+ - "\u023f\u0240\u0005h\u0000\u0000\u0240\u0241\u0003\u00a6S\u0000\u0241\u0242"+ - "\u0005i\u0000\u0000\u02421\u0001\u0000\u0000\u0000\u0243\u0244\u00057"+ - "\u0000\u0000\u0244\u0245\u0005l\u0000\u0000\u0245\u0246\u0003\u00c4b\u0000"+ - "\u0246\u0247\u0005m\u0000\u0000\u02473\u0001\u0000\u0000\u0000\u0248\u0249"+ - "\u00052\u0000\u0000\u0249\u024a\u0005h\u0000\u0000\u024a\u024b\u0003\u00a6"+ - "S\u0000\u024b\u024c\u0005i\u0000\u0000\u024c5\u0001\u0000\u0000\u0000"+ - "\u024d\u024e\u0007\u0004\u0000\u0000\u024e\u024f\u0005h\u0000\u0000\u024f"+ - "\u0250\u0003\u00a6S\u0000\u0250\u0251\u0005i\u0000\u0000\u02517\u0001"+ - "\u0000\u0000\u0000\u0252\u0257\u0005\u0011\u0000\u0000\u0253\u0254\u0005"+ - "l\u0000\u0000\u0254\u0255\u0003:\u001d\u0000\u0255\u0256\u0005m\u0000"+ - "\u0000\u0256\u0258\u0001\u0000\u0000\u0000\u0257\u0253\u0001\u0000\u0000"+ - "\u0000\u0257\u0258\u0001\u0000\u0000\u0000\u0258\u0259\u0001\u0000\u0000"+ - "\u0000\u0259\u025a\u0005h\u0000\u0000\u025a\u025b\u0003\u00a6S\u0000\u025b"+ - "\u025c\u0005i\u0000\u0000\u025c9\u0001\u0000\u0000\u0000\u025d\u0260\u0003"+ - "<\u001e\u0000\u025e\u0260\u0005\u0013\u0000\u0000\u025f\u025d\u0001\u0000"+ - "\u0000\u0000\u025f\u025e\u0001\u0000\u0000\u0000\u0260;\u0001\u0000\u0000"+ - "\u0000\u0261\u0262\u0005g\u0000\u0000\u0262=\u0001\u0000\u0000\u0000\u0263"+ - "\u0264\u0005\u0012\u0000\u0000\u0264\u0265\u0005h\u0000\u0000\u0265\u0266"+ - "\u0003\u00a6S\u0000\u0266\u0267\u0005i\u0000\u0000\u0267?\u0001\u0000"+ - "\u0000\u0000\u0268\u0269\u0005:\u0000\u0000\u0269\u026a\u0005h\u0000\u0000"+ - "\u026a\u026b\u0003\u00a6S\u0000\u026b\u026c\u0005i\u0000\u0000\u026cA"+ - "\u0001\u0000\u0000\u0000\u026d\u026e\u00059\u0000\u0000\u026e\u026f\u0005"+ - "h\u0000\u0000\u026f\u0270\u0003\u00a6S\u0000\u0270\u0271\u0005i\u0000"+ - "\u0000\u0271C\u0001\u0000\u0000\u0000\u0272\u0273\u0005\u0016\u0000\u0000"+ - "\u0273\u0274\u0005h\u0000\u0000\u0274\u0277\u0003\u00a6S\u0000\u0275\u0276"+ - "\u0005o\u0000\u0000\u0276\u0278\u0003\u00a6S\u0000\u0277\u0275\u0001\u0000"+ - "\u0000\u0000\u0277\u0278\u0001\u0000\u0000\u0000\u0278\u0279\u0001\u0000"+ - "\u0000\u0000\u0279\u027a\u0005i\u0000\u0000\u027aE\u0001\u0000\u0000\u0000"+ - "\u027b\u027c\u0007\u0004\u0000\u0000\u027c\u027d\u0005l\u0000\u0000\u027d"+ - "\u027e\u0003\u00a6S\u0000\u027e\u027f\u0005=\u0000\u0000\u027f\u0280\u0003"+ - "\u00a6S\u0000\u0280\u0281\u0005m\u0000\u0000\u0281G\u0001\u0000\u0000"+ - "\u0000\u0282\u0283\u00056\u0000\u0000\u0283\u0284\u0003\u00a6S\u0000\u0284"+ - "\u028a\u0005j\u0000\u0000\u0285\u0286\u0003J%\u0000\u0286\u0287\u0003"+ - "\u0172\u00b9\u0000\u0287\u0289\u0001\u0000\u0000\u0000\u0288\u0285\u0001"+ - "\u0000\u0000\u0000\u0289\u028c\u0001\u0000\u0000\u0000\u028a\u0288\u0001"+ - "\u0000\u0000\u0000\u028a\u028b\u0001\u0000\u0000\u0000\u028b\u028d\u0001"+ - "\u0000\u0000\u0000\u028c\u028a\u0001\u0000\u0000\u0000\u028d\u028e\u0005"+ - "k\u0000\u0000\u028eI\u0001\u0000\u0000\u0000\u028f\u0290\u0003l6\u0000"+ - "\u0290\u0291\u0005q\u0000\u0000\u0291\u0292\u0003\u00a6S\u0000\u0292K"+ - "\u0001\u0000\u0000\u0000\u0293\u0294\u0005l\u0000\u0000\u0294\u0299\u0003"+ - "N\'\u0000\u0295\u0296\u0005o\u0000\u0000\u0296\u0298\u0003N\'\u0000\u0297"+ - "\u0295\u0001\u0000\u0000\u0000\u0298\u029b\u0001\u0000\u0000\u0000\u0299"+ - "\u0297\u0001\u0000\u0000\u0000\u0299\u029a\u0001\u0000\u0000\u0000\u029a"+ - "\u029c\u0001\u0000\u0000\u0000\u029b\u0299\u0001\u0000\u0000\u0000\u029c"+ - "\u029d\u0005m\u0000\u0000\u029dM\u0001\u0000\u0000\u0000\u029e\u029f\u0003"+ - "\u00a6S\u0000\u029f\u02a0\u0005n\u0000\u0000\u02a0\u02a1\u0003\u00a6S"+ - "\u0000\u02a1O\u0001\u0000\u0000\u0000\u02a2\u02a7\u0003^/\u0000\u02a3"+ - "\u02a7\u0003\\.\u0000\u02a4\u02a7\u0003R)\u0000\u02a5\u02a7\u0003V+\u0000"+ - "\u02a6\u02a2\u0001\u0000\u0000\u0000\u02a6\u02a3\u0001\u0000\u0000\u0000"+ - "\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6\u02a5\u0001\u0000\u0000\u0000"+ - "\u02a7Q\u0001\u0000\u0000\u0000\u02a8\u02a9\u00053\u0000\u0000\u02a9\u02af"+ - "\u0005j\u0000\u0000\u02aa\u02ab\u0003T*\u0000\u02ab\u02ac\u0003\u0172"+ - "\u00b9\u0000\u02ac\u02ae\u0001\u0000\u0000\u0000\u02ad\u02aa\u0001\u0000"+ - "\u0000\u0000\u02ae\u02b1\u0001\u0000\u0000\u0000\u02af\u02ad\u0001\u0000"+ - "\u0000\u0000\u02af\u02b0\u0001\u0000\u0000\u0000\u02b0\u02b2\u0001\u0000"+ - "\u0000\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2\u02b3\u0005k\u0000"+ - "\u0000\u02b3S\u0001\u0000\u0000\u0000\u02b4\u02b5\u0005O\u0000\u0000\u02b5"+ - "\u02b6\u0005g\u0000\u0000\u02b6\u02be\u0003\u0140\u00a0\u0000\u02b7\u02b8"+ - "\u00054\u0000\u0000\u02b8\u02b9\u0005j\u0000\u0000\u02b9\u02ba\u0003\u00a6"+ - "S\u0000\u02ba\u02bb\u0003\u0172\u00b9\u0000\u02bb\u02bc\u0005k\u0000\u0000"+ - "\u02bc\u02be\u0001\u0000\u0000\u0000\u02bd\u02b4\u0001\u0000\u0000\u0000"+ - "\u02bd\u02b7\u0001\u0000\u0000\u0000\u02beU\u0001\u0000\u0000\u0000\u02bf"+ - "\u02c0\u00055\u0000\u0000\u02c0\u02c6\u0005j\u0000\u0000\u02c1\u02c2\u0003"+ - "X,\u0000\u02c2\u02c3\u0003\u0172\u00b9\u0000\u02c3\u02c5\u0001\u0000\u0000"+ - "\u0000\u02c4\u02c1\u0001\u0000\u0000\u0000\u02c5\u02c8\u0001\u0000\u0000"+ - "\u0000\u02c6\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000"+ - "\u0000\u02c7\u02c9\u0001\u0000\u0000\u0000\u02c8\u02c6\u0001\u0000\u0000"+ - "\u0000\u02c9\u02ca\u0005k\u0000\u0000\u02caW\u0001\u0000\u0000\u0000\u02cb"+ - "\u02cc\u0005g\u0000\u0000\u02cc\u02d2\u0005j\u0000\u0000\u02cd\u02ce\u0003"+ - "Z-\u0000\u02ce\u02cf\u0003\u0172\u00b9\u0000\u02cf\u02d1\u0001\u0000\u0000"+ - "\u0000\u02d0\u02cd\u0001\u0000\u0000\u0000\u02d1\u02d4\u0001\u0000\u0000"+ - "\u0000\u02d2\u02d0\u0001\u0000\u0000\u0000\u02d2\u02d3\u0001\u0000\u0000"+ - "\u0000\u02d3\u02d5\u0001\u0000\u0000\u0000\u02d4\u02d2\u0001\u0000\u0000"+ - "\u0000\u02d5\u02d6\u0005k\u0000\u0000\u02d6Y\u0001\u0000\u0000\u0000\u02d7"+ - "\u02d9\u0003\u00e6s\u0000\u02d8\u02d7\u0001\u0000\u0000\u0000\u02d8\u02d9"+ - "\u0001\u0000\u0000\u0000\u02d9\u02da\u0001\u0000\u0000\u0000\u02da\u02db"+ - "\u0003\u00c4b\u0000\u02db[\u0001\u0000\u0000\u0000\u02dc\u02dd\u0005\u001b"+ - "\u0000\u0000\u02dd\u02de\u0005l\u0000\u0000\u02de\u02df\u0005m\u0000\u0000"+ - "\u02df\u02e0\u0003\u0134\u009a\u0000\u02e0]\u0001\u0000\u0000\u0000\u02e1"+ - "\u02e2\u0007\u0005\u0000\u0000\u02e2\u02e3\u0005l\u0000\u0000\u02e3\u02e4"+ - "\u0003\u00c4b\u0000\u02e4\u02e5\u0005m\u0000\u0000\u02e5\u02ed\u0001\u0000"+ - "\u0000\u0000\u02e6\u02e7\u0005+\u0000\u0000\u02e7\u02e8\u0005l\u0000\u0000"+ - "\u02e8\u02e9\u0003\u00c4b\u0000\u02e9\u02ea\u0005m\u0000\u0000\u02ea\u02eb"+ - "\u0003\u00c4b\u0000\u02eb\u02ed\u0001\u0000\u0000\u0000\u02ec\u02e1\u0001"+ - "\u0000\u0000\u0000\u02ec\u02e6\u0001\u0000\u0000\u0000\u02ed_\u0001\u0000"+ - "\u0000\u0000\u02ee\u02f6\u0003b1\u0000\u02ef\u02f0\u0005K\u0000\u0000"+ - "\u02f0\u02f6\u00060\uffff\uffff\u0000\u02f1\u02f2\u0005\u000e\u0000\u0000"+ - "\u02f2\u02f6\u00060\uffff\uffff\u0000\u02f3\u02f4\u0005C\u0000\u0000\u02f4"+ - "\u02f6\u00060\uffff\uffff\u0000\u02f5\u02ee\u0001\u0000\u0000\u0000\u02f5"+ - "\u02ef\u0001\u0000\u0000\u0000\u02f5\u02f1\u0001\u0000\u0000\u0000\u02f5"+ - "\u02f3\u0001\u0000\u0000\u0000\u02f6\u02f7\u0001\u0000\u0000\u0000\u02f7"+ - "\u02f9\u0003\u0172\u00b9\u0000\u02f8\u02f5\u0001\u0000\u0000\u0000\u02f9"+ - "\u02fc\u0001\u0000\u0000\u0000\u02fa\u02fb\u0001\u0000\u0000\u0000\u02fa"+ - "\u02f8\u0001\u0000\u0000\u0000\u02fb\u02ff\u0001\u0000\u0000\u0000\u02fc"+ - "\u02fa\u0001\u0000\u0000\u0000\u02fd\u02fe\u0005\u000e\u0000\u0000\u02fe"+ - "\u0300\u00060\uffff\uffff\u0000\u02ff\u02fd\u0001\u0000\u0000\u0000\u02ff"+ - "\u0300\u0001\u0000\u0000\u0000\u0300a\u0001\u0000\u0000\u0000\u0301\u0302"+ - "\u0005\t\u0000\u0000\u0302\u030a\u0003f3\u0000\u0303\u0304\u0005\n\u0000"+ - "\u0000\u0304\u030a\u0003f3\u0000\u0305\u0306\u0005\u000b\u0000\u0000\u0306"+ - "\u030a\u0003f3\u0000\u0307\u0308\u0005\r\u0000\u0000\u0308\u030a\u0003"+ - "d2\u0000\u0309\u0301\u0001\u0000\u0000\u0000\u0309\u0303\u0001\u0000\u0000"+ - "\u0000\u0309\u0305\u0001\u0000\u0000\u0000\u0309\u0307\u0001\u0000\u0000"+ - "\u0000\u030ac\u0001\u0000\u0000\u0000\u030b\u030d\u0003\u00e8t\u0000\u030c"+ - "\u030b\u0001\u0000\u0000\u0000\u030c\u030d\u0001\u0000\u0000\u0000\u030d"+ - "\u0310\u0001\u0000\u0000\u0000\u030e\u030f\u0005^\u0000\u0000\u030f\u0311"+ - "\u0003\u00a6S\u0000\u0310\u030e\u0001\u0000\u0000\u0000\u0310\u0311\u0001"+ - "\u0000\u0000\u0000\u0311e\u0001\u0000\u0000\u0000\u0312\u0315\u0001\u0000"+ - "\u0000\u0000\u0313\u0315\u0003\u00a6S\u0000\u0314\u0312\u0001\u0000\u0000"+ - "\u0000\u0314\u0313\u0001\u0000\u0000\u0000\u0315g\u0001\u0000\u0000\u0000"+ - "\u0316\u0317\u00056\u0000\u0000\u0317\u0318\u0003\u00a6S\u0000\u0318\u031c"+ - "\u0005j\u0000\u0000\u0319\u031b\u0003j5\u0000\u031a\u0319\u0001\u0000"+ - "\u0000\u0000\u031b\u031e\u0001\u0000\u0000\u0000\u031c\u031a\u0001\u0000"+ - "\u0000\u0000\u031c\u031d\u0001\u0000\u0000\u0000\u031d\u031f\u0001\u0000"+ - "\u0000\u0000\u031e\u031c\u0001\u0000\u0000\u0000\u031f\u0320\u0005k\u0000"+ - "\u0000\u0320i\u0001\u0000\u0000\u0000\u0321\u0322\u0003l6\u0000\u0322"+ - "\u0324\u0005q\u0000\u0000\u0323\u0325\u0003\u00f2y\u0000\u0324\u0323\u0001"+ - "\u0000\u0000\u0000\u0324\u0325\u0001\u0000\u0000\u0000\u0325k\u0001\u0000"+ - "\u0000\u0000\u0326\u0327\u0005R\u0000\u0000\u0327\u032a\u0003n7\u0000"+ - "\u0328\u032a\u0005N\u0000\u0000\u0329\u0326\u0001\u0000\u0000\u0000\u0329"+ - "\u0328\u0001\u0000\u0000\u0000\u032am\u0001\u0000\u0000\u0000\u032b\u032c"+ - "\u0005%\u0000\u0000\u032c\u0339\u0005g\u0000\u0000\u032d\u032e\u0003\u00cc"+ - "f\u0000\u032e\u0333\u0005j\u0000\u0000\u032f\u0331\u0003p8\u0000\u0330"+ - "\u0332\u0005o\u0000\u0000\u0331\u0330\u0001\u0000\u0000\u0000\u0331\u0332"+ - "\u0001\u0000\u0000\u0000\u0332\u0334\u0001\u0000\u0000\u0000\u0333\u032f"+ - "\u0001\u0000\u0000\u0000\u0333\u0334\u0001\u0000\u0000\u0000\u0334\u0335"+ - "\u0001\u0000\u0000\u0000\u0335\u0336\u0005k\u0000\u0000\u0336\u0339\u0001"+ - "\u0000\u0000\u0000\u0337\u0339\u0003\u00a6S\u0000\u0338\u032b\u0001\u0000"+ - "\u0000\u0000\u0338\u032d\u0001\u0000\u0000\u0000\u0338\u0337\u0001\u0000"+ - "\u0000\u0000\u0339o\u0001\u0000\u0000\u0000\u033a\u033f\u0003n7\u0000"+ - "\u033b\u033c\u0005o\u0000\u0000\u033c\u033e\u0003n7\u0000\u033d\u033b"+ - "\u0001\u0000\u0000\u0000\u033e\u0341\u0001\u0000\u0000\u0000\u033f\u033d"+ - "\u0001\u0000\u0000\u0000\u033f\u0340\u0001\u0000\u0000\u0000\u0340q\u0001"+ - "\u0000\u0000\u0000\u0341\u033f\u0001\u0000\u0000\u0000\u0342\u0347\u0005"+ - "j\u0000\u0000\u0343\u0344\u0005;\u0000\u0000\u0344\u0345\u0003\u00e6s"+ - "\u0000\u0345\u0346\u0003\u0172\u00b9\u0000\u0346\u0348\u0001\u0000\u0000"+ - "\u0000\u0347\u0343\u0001\u0000\u0000\u0000\u0347\u0348\u0001\u0000\u0000"+ - "\u0000\u0348\u034a\u0001\u0000\u0000\u0000\u0349\u034b\u0003\u00f2y\u0000"+ - "\u034a\u0349\u0001\u0000\u0000\u0000\u034a\u034b\u0001\u0000\u0000\u0000"+ - "\u034b\u034c\u0001\u0000\u0000\u0000\u034c\u034d\u0005k\u0000\u0000\u034d"+ - "s\u0001\u0000\u0000\u0000\u034e\u0351\u0003\u0152\u00a9\u0000\u034f\u0351"+ - "\u0005g\u0000\u0000\u0350\u034e\u0001\u0000\u0000\u0000\u0350\u034f\u0001"+ - "\u0000\u0000\u0000\u0351\u035a\u0001\u0000\u0000\u0000\u0352\u0357\u0005"+ - "j\u0000\u0000\u0353\u0355\u0003v;\u0000\u0354\u0356\u0005o\u0000\u0000"+ - "\u0355\u0354\u0001\u0000\u0000\u0000\u0355\u0356\u0001\u0000\u0000\u0000"+ - "\u0356\u0358\u0001\u0000\u0000\u0000\u0357\u0353\u0001\u0000\u0000\u0000"+ - "\u0357\u0358\u0001\u0000\u0000\u0000\u0358\u0359\u0001\u0000\u0000\u0000"+ - "\u0359\u035b\u0005k\u0000\u0000\u035a\u0352\u0001\u0000\u0000\u0000\u035a"+ - "\u035b\u0001\u0000\u0000\u0000\u035bu\u0001\u0000\u0000\u0000\u035c\u0361"+ - "\u0003x<\u0000\u035d\u035e\u0005o\u0000\u0000\u035e\u0360\u0003x<\u0000"+ - "\u035f\u035d\u0001\u0000\u0000\u0000\u0360\u0363\u0001\u0000\u0000\u0000"+ - "\u0361\u035f\u0001\u0000\u0000\u0000\u0361\u0362\u0001\u0000\u0000\u0000"+ - "\u0362w\u0001\u0000\u0000\u0000\u0363\u0361\u0001\u0000\u0000\u0000\u0364"+ - "\u0365\u0005g\u0000\u0000\u0365\u0367\u0005q\u0000\u0000\u0366\u0364\u0001"+ - "\u0000\u0000\u0000\u0366\u0367\u0001\u0000\u0000\u0000\u0367\u0368\u0001"+ - "\u0000\u0000\u0000\u0368\u0369\u0003\u00a6S\u0000\u0369y\u0001\u0000\u0000"+ - "\u0000\u036a\u036b\u0005G\u0000\u0000\u036b\u036c\u0003\u00a6S\u0000\u036c"+ - "\u036d\u0005\u000f\u0000\u0000\u036d\u036e\u0003t:\u0000\u036e\u036f\u0003"+ - "\u00f0x\u0000\u036f{\u0001\u0000\u0000\u0000\u0370\u0371\u0003\u00c4b"+ - "\u0000\u0371\u0372\u0005\u000f\u0000\u0000\u0372\u0385\u0003\u00c4b\u0000"+ - "\u0373\u0379\u0005j\u0000\u0000\u0374\u0375\u0003\u0084B\u0000\u0375\u0376"+ - "\u0003\u0172\u00b9\u0000\u0376\u0378\u0001\u0000\u0000\u0000\u0377\u0374"+ - "\u0001\u0000\u0000\u0000\u0378\u037b\u0001\u0000\u0000\u0000\u0379\u0377"+ - "\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000\u037a\u0381"+ - "\u0001\u0000\u0000\u0000\u037b\u0379\u0001\u0000\u0000\u0000\u037c\u037d"+ - "\u0003~?\u0000\u037d\u037e\u0003\u0172\u00b9\u0000\u037e\u0380\u0001\u0000"+ - "\u0000\u0000\u037f\u037c\u0001\u0000\u0000\u0000\u0380\u0383\u0001\u0000"+ - "\u0000\u0000\u0381\u037f\u0001\u0000\u0000\u0000\u0381\u0382\u0001\u0000"+ - "\u0000\u0000\u0382\u0384\u0001\u0000\u0000\u0000\u0383\u0381\u0001\u0000"+ - "\u0000\u0000\u0384\u0386\u0005k\u0000\u0000\u0385\u0373\u0001\u0000\u0000"+ - "\u0000\u0385\u0386\u0001\u0000\u0000\u0000\u0386}\u0001\u0000\u0000\u0000"+ - "\u0387\u0389\u0005\u000e\u0000\u0000\u0388\u0387\u0001\u0000\u0000\u0000"+ - "\u0388\u0389\u0001\u0000\u0000\u0000\u0389\u038a\u0001\u0000\u0000\u0000"+ - "\u038a\u038b\u0003\u0080@\u0000\u038b\u038c\u0005g\u0000\u0000\u038c\u038e"+ - "\u0003\u0140\u00a0\u0000\u038d\u038f\u0003\u00f0x\u0000\u038e\u038d\u0001"+ - "\u0000\u0000\u0000\u038e\u038f\u0001\u0000\u0000\u0000\u038f\u007f\u0001"+ - "\u0000\u0000\u0000\u0390\u0392\u0005h\u0000\u0000\u0391\u0393\u0005g\u0000"+ - "\u0000\u0392\u0391\u0001\u0000\u0000\u0000\u0392\u0393\u0001\u0000\u0000"+ - "\u0000\u0393\u0395\u0001\u0000\u0000\u0000\u0394\u0396\u0005\u0089\u0000"+ - "\u0000\u0395\u0394\u0001\u0000\u0000\u0000\u0395\u0396\u0001\u0000\u0000"+ - "\u0000\u0396\u0397\u0001\u0000\u0000\u0000\u0397\u0398\u0003\u012e\u0097"+ - "\u0000\u0398\u0399\u0005i\u0000\u0000\u0399\u0081\u0001\u0000\u0000\u0000"+ - "\u039a\u03a0\u0003\u00b6[\u0000\u039b\u039c\u0003\u00c4b\u0000\u039c\u039d"+ - "\u0005r\u0000\u0000\u039d\u039e\u0005g\u0000\u0000\u039e\u03a0\u0001\u0000"+ - "\u0000\u0000\u039f\u039a\u0001\u0000\u0000\u0000\u039f\u039b\u0001\u0000"+ - "\u0000\u0000\u03a0\u0083\u0001\u0000\u0000\u0000\u03a1\u03a2\u00058\u0000"+ - "\u0000\u03a2\u03a3\u0005g\u0000\u0000\u03a3\u03a6\u0005u\u0000\u0000\u03a4"+ - "\u03a7\u0003\u0082A\u0000\u03a5\u03a7\u0003\u0150\u00a8\u0000\u03a6\u03a4"+ - "\u0001\u0000\u0000\u0000\u03a6\u03a5\u0001\u0000\u0000\u0000\u03a7\u0085"+ - "\u0001\u0000\u0000\u0000\u03a8\u03a9\u0005/\u0000\u0000\u03a9\u03aa\u0005"+ - "h\u0000\u0000\u03aa\u03ad\u0003\u00c4b\u0000\u03ab\u03ac\u0005o\u0000"+ - "\u0000\u03ac\u03ae\u0003\u00e8t\u0000\u03ad\u03ab\u0001\u0000\u0000\u0000"+ - "\u03ad\u03ae\u0001\u0000\u0000\u0000\u03ae\u03af\u0001\u0000\u0000\u0000"+ - "\u03af\u03b0\u0005i\u0000\u0000\u03b0\u0087\u0001\u0000\u0000\u0000\u03b1"+ - "\u03b2\u0005.\u0000\u0000\u03b2\u03b3\u0005h\u0000\u0000\u03b3\u03b4\u0003"+ - "\u00c4b\u0000\u03b4\u03b5\u0005i\u0000\u0000\u03b5\u0089\u0001\u0000\u0000"+ - "\u0000\u03b6\u03b9\u0003`0\u0000\u03b7\u03ba\u0003\u008cF\u0000\u03b8"+ - "\u03ba\u0003\u008eG\u0000\u03b9\u03b7\u0001\u0000\u0000\u0000\u03b9\u03b8"+ - "\u0001\u0000\u0000\u0000\u03ba\u008b\u0001\u0000\u0000\u0000\u03bb\u03bc"+ - "\u0005O\u0000\u0000\u03bc\u03bd\u0005g\u0000\u0000\u03bd\u03bf\u0003\u0140"+ - "\u00a0\u0000\u03be\u03c0\u0003r9\u0000\u03bf\u03be\u0001\u0000\u0000\u0000"+ - "\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0\u008d\u0001\u0000\u0000\u0000"+ - "\u03c1\u03c2\u0005O\u0000\u0000\u03c2\u03c3\u0003\u009cN\u0000\u03c3\u03c4"+ - "\u0005g\u0000\u0000\u03c4\u03c6\u0003\u0140\u00a0\u0000\u03c5\u03c7\u0003"+ - "r9\u0000\u03c6\u03c5\u0001\u0000\u0000\u0000\u03c6\u03c7\u0001\u0000\u0000"+ - "\u0000\u03c7\u008f\u0001\u0000\u0000\u0000\u03c8\u03cb\u0005\u001b\u0000"+ - "\u0000\u03c9\u03cc\u0003\u008aE\u0000\u03ca\u03cc\u0003\u00e0p\u0000\u03cb"+ - "\u03c9\u0001\u0000\u0000\u0000\u03cb\u03ca\u0001\u0000\u0000\u0000\u03cc"+ - "\u0091\u0001\u0000\u0000\u0000\u03cd\u03ce\u00058\u0000\u0000\u03ce\u03cf"+ - "\u0005g\u0000\u0000\u03cf\u03d1\u0003\u0144\u00a2\u0000\u03d0\u03d2\u0003"+ - "\u0094J\u0000\u03d1\u03d0\u0001\u0000\u0000\u0000\u03d1\u03d2\u0001\u0000"+ - "\u0000\u0000\u03d2\u0093\u0001\u0000\u0000\u0000\u03d3\u03d4\u0005j\u0000"+ - "\u0000\u03d4\u03d5\u0003\u00a6S\u0000\u03d5\u03d6\u0003\u0172\u00b9\u0000"+ - "\u03d6\u03d7\u0005k\u0000\u0000\u03d7\u0095\u0001\u0000\u0000\u0000\u03d8"+ - "\u03d9\u00058\u0000\u0000\u03d9\u03da\u0003\u009cN\u0000\u03da\u03db\u0005"+ - "g\u0000\u0000\u03db\u03dd\u0003\u0144\u00a2\u0000\u03dc\u03de\u0003\u0094"+ - "J\u0000\u03dd\u03dc\u0001\u0000\u0000\u0000\u03dd\u03de\u0001\u0000\u0000"+ - "\u0000\u03de\u0097\u0001\u0000\u0000\u0000\u03df\u03e7\u0003\u0006\u0003"+ - "\u0000\u03e0\u03e3\u0003\u00c4b\u0000\u03e1\u03e2\u0005n\u0000\u0000\u03e2"+ - "\u03e4\u0003\u00e8t\u0000\u03e3\u03e1\u0001\u0000\u0000\u0000\u03e3\u03e4"+ - "\u0001\u0000\u0000\u0000\u03e4\u03e8\u0001\u0000\u0000\u0000\u03e5\u03e6"+ - "\u0005n\u0000\u0000\u03e6\u03e8\u0003\u00e8t\u0000\u03e7\u03e0\u0001\u0000"+ - "\u0000\u0000\u03e7\u03e5\u0001\u0000\u0000\u0000\u03e8\u0099\u0001\u0000"+ - "\u0000\u0000\u03e9\u03ea\u0003\u0006\u0003\u0000\u03ea\u03eb\u0005u\u0000"+ - "\u0000\u03eb\u03ec\u0003\u00e8t\u0000\u03ec\u009b\u0001\u0000\u0000\u0000"+ - "\u03ed\u03ef\u0005h\u0000\u0000\u03ee\u03f0\u0003\b\u0004\u0000\u03ef"+ - "\u03ee\u0001\u0000\u0000\u0000\u03ef\u03f0\u0001\u0000\u0000\u0000\u03f0"+ - "\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f3\u0003\u00c4b\u0000\u03f2\u03f4"+ - "\u0005o\u0000\u0000\u03f3\u03f2\u0001\u0000\u0000\u0000\u03f3\u03f4\u0001"+ - "\u0000\u0000\u0000\u03f4\u03f5\u0001\u0000\u0000\u0000\u03f5\u03f6\u0005"+ - "i\u0000\u0000\u03f6\u009d\u0001\u0000\u0000\u0000\u03f7\u03fa\u0003\u00a0"+ - "P\u0000\u03f8\u03fa\u0003\u00a2Q\u0000\u03f9\u03f7\u0001\u0000\u0000\u0000"+ - "\u03f9\u03f8\u0001\u0000\u0000\u0000\u03fa\u009f\u0001\u0000\u0000\u0000"+ - "\u03fb\u03fd\u0003\u00e6s\u0000\u03fc\u03fb\u0001\u0000\u0000\u0000\u03fc"+ - "\u03fd\u0001\u0000\u0000\u0000\u03fd\u03fe\u0001\u0000\u0000\u0000\u03fe"+ - "\u03ff\u0003\u00a4R\u0000\u03ff\u00a1\u0001\u0000\u0000\u0000\u0400\u0402"+ - "\u0005\u001b\u0000\u0000\u0401\u0403\u0003\u00e6s\u0000\u0402\u0401\u0001"+ - "\u0000\u0000\u0000\u0402\u0403\u0001\u0000\u0000\u0000\u0403\u0404\u0001"+ - "\u0000\u0000\u0000\u0404\u0405\u0003\u00a4R\u0000\u0405\u00a3\u0001\u0000"+ - "\u0000\u0000\u0406\u0408\u0005v\u0000\u0000\u0407\u0406\u0001\u0000\u0000"+ - "\u0000\u0407\u0408\u0001\u0000\u0000\u0000\u0408\u0409\u0001\u0000\u0000"+ - "\u0000\u0409\u040a\u0003\u00c4b\u0000\u040a\u00a5\u0001\u0000\u0000\u0000"+ - "\u040b\u040c\u0006S\uffff\uffff\u0000\u040c\u040d\u0007\u0006\u0000\u0000"+ - "\u040d\u0421\u0003\u00a6S\u000f\u040e\u0421\u0003\u00b6[\u0000\u040f\u0410"+ - "\u0005\u0019\u0000\u0000\u0410\u0411\u0003.\u0017\u0000\u0411\u0412\u0005"+ - "\u001c\u0000\u0000\u0412\u0413\u0003\u00a6S\u0003\u0413\u0421\u0001\u0000"+ - "\u0000\u0000\u0414\u0415\u0005\u001a\u0000\u0000\u0415\u0416\u0003\u009a"+ - "M\u0000\u0416\u0417\u0005\u001c\u0000\u0000\u0417\u0418\u0003\u00a6S\u0002"+ - "\u0418\u0421\u0001\u0000\u0000\u0000\u0419\u041a\u0007\u0007\u0000\u0000"+ - "\u041a\u041b\u0003&\u0013\u0000\u041b\u041c\u0005q\u0000\u0000\u041c\u041d"+ - "\u0005q\u0000\u0000\u041d\u041e\u0003*\u0015\u0000\u041e\u041f\u0003\u00a6"+ - "S\u0001\u041f\u0421\u0001\u0000\u0000\u0000\u0420\u040b\u0001\u0000\u0000"+ - "\u0000\u0420\u040e\u0001\u0000\u0000\u0000\u0420\u040f\u0001\u0000\u0000"+ - "\u0000\u0420\u0414\u0001\u0000\u0000\u0000\u0420\u0419\u0001\u0000\u0000"+ - "\u0000\u0421\u0445\u0001\u0000\u0000\u0000\u0422\u0423\n\r\u0000\u0000"+ - "\u0423\u0424\u0007\b\u0000\u0000\u0424\u0444\u0003\u00a6S\u000e\u0425"+ - "\u0426\n\f\u0000\u0000\u0426\u0427\u0007\t\u0000\u0000\u0427\u0444\u0003"+ - "\u00a6S\r\u0428\u0429\n\u000b\u0000\u0000\u0429\u042a\u0007\n\u0000\u0000"+ - "\u042a\u0444\u0003\u00a6S\f\u042b\u042c\n\n\u0000\u0000\u042c\u042d\u0007"+ - "\u000b\u0000\u0000\u042d\u0444\u0003\u00a6S\u000b\u042e\u042f\n\t\u0000"+ - "\u0000\u042f\u0430\u0007\f\u0000\u0000\u0430\u0444\u0003\u00a6S\n\u0431"+ - "\u0432\n\u0007\u0000\u0000\u0432\u0433\u0005x\u0000\u0000\u0433\u0444"+ - "\u0003\u00a6S\b\u0434\u0435\n\u0006\u0000\u0000\u0435\u0436\u0005w\u0000"+ - "\u0000\u0436\u0444\u0003\u00a6S\u0007\u0437\u0438\n\u0005\u0000\u0000"+ - "\u0438\u0439\u0005\"\u0000\u0000\u0439\u0444\u0003\u00a6S\u0005\u043a"+ - "\u043b\n\u0004\u0000\u0000\u043b\u043c\u0005%\u0000\u0000\u043c\u043d"+ - "\u0003\u00a6S\u0000\u043d\u043e\u0005q\u0000\u0000\u043e\u043f\u0003\u00a6"+ - "S\u0004\u043f\u0444\u0001\u0000\u0000\u0000\u0440\u0441\n\b\u0000\u0000"+ - "\u0441\u0442\u0005\u000f\u0000\u0000\u0442\u0444\u0003t:\u0000\u0443\u0422"+ - "\u0001\u0000\u0000\u0000\u0443\u0425\u0001\u0000\u0000\u0000\u0443\u0428"+ - "\u0001\u0000\u0000\u0000\u0443\u042b\u0001\u0000\u0000\u0000\u0443\u042e"+ - "\u0001\u0000\u0000\u0000\u0443\u0431\u0001\u0000\u0000\u0000\u0443\u0434"+ - "\u0001\u0000\u0000\u0000\u0443\u0437\u0001\u0000\u0000\u0000\u0443\u043a"+ - "\u0001\u0000\u0000\u0000\u0443\u0440\u0001\u0000\u0000\u0000\u0444\u0447"+ - "\u0001\u0000\u0000\u0000\u0445\u0443\u0001\u0000\u0000\u0000\u0445\u0446"+ - "\u0001\u0000\u0000\u0000\u0446\u00a7\u0001\u0000\u0000\u0000\u0447\u0445"+ - "\u0001\u0000\u0000\u0000\u0448\u045d\u0003\u0018\f\u0000\u0449\u045d\u0003"+ - "\u001a\r\u0000\u044a\u045d\u0003\u00acV\u0000\u044b\u045d\u0003\u00aa"+ - "U\u0000\u044c\u045d\u0003\u00e0p\u0000\u044d\u045d\u0003\u0100\u0080\u0000"+ - "\u044e\u045d\u0003\u00f4z\u0000\u044f\u045d\u0003\u012c\u0096\u0000\u0450"+ - "\u045d\u0003\u0102\u0081\u0000\u0451\u045d\u0003\u0104\u0082\u0000\u0452"+ - "\u045d\u0003\u0106\u0083\u0000\u0453\u045d\u0003\u0108\u0084\u0000\u0454"+ - "\u045d\u0003\u010a\u0085\u0000\u0455\u045d\u0003\u00f0x\u0000\u0456\u045d"+ - "\u0003\u010c\u0086\u0000\u0457\u045d\u0003\u010e\u0087\u0000\u0458\u045d"+ - "\u0003\u0120\u0090\u0000\u0459\u045d\u0003\u00aeW\u0000\u045a\u045d\u0003"+ - "\u00b2Y\u0000\u045b\u045d\u0003z=\u0000\u045c\u0448\u0001\u0000\u0000"+ - "\u0000\u045c\u0449\u0001\u0000\u0000\u0000\u045c\u044a\u0001\u0000\u0000"+ - "\u0000\u045c\u044b\u0001\u0000\u0000\u0000\u045c\u044c\u0001\u0000\u0000"+ - "\u0000\u045c\u044d\u0001\u0000\u0000\u0000\u045c\u044e\u0001\u0000\u0000"+ - "\u0000\u045c\u044f\u0001\u0000\u0000\u0000\u045c\u0450\u0001\u0000\u0000"+ - "\u0000\u045c\u0451\u0001\u0000\u0000\u0000\u045c\u0452\u0001\u0000\u0000"+ - "\u0000\u045c\u0453\u0001\u0000\u0000\u0000\u045c\u0454\u0001\u0000\u0000"+ - "\u0000\u045c\u0455\u0001\u0000\u0000\u0000\u045c\u0456\u0001\u0000\u0000"+ - "\u0000\u045c\u0457\u0001\u0000\u0000\u0000\u045c\u0458\u0001\u0000\u0000"+ - "\u0000\u045c\u0459\u0001\u0000\u0000\u0000\u045c\u045a\u0001\u0000\u0000"+ - "\u0000\u045c\u045b\u0001\u0000\u0000\u0000\u045d\u00a9\u0001\u0000\u0000"+ - "\u0000\u045e\u045f\u0005$\u0000\u0000\u045f\u0460\u0003\u00a6S\u0000\u0460"+ - "\u00ab\u0001\u0000\u0000\u0000\u0461\u0462\u0005Z\u0000\u0000\u0462\u0464"+ - "\u0003\u00a6S\u0000\u0463\u0465\u0003\u00f0x\u0000\u0464\u0463\u0001\u0000"+ - "\u0000\u0000\u0464\u0465\u0001\u0000\u0000\u0000\u0465\u00ad\u0001\u0000"+ - "\u0000\u0000\u0466\u0467\u0003\u00b0X\u0000\u0467\u0468\u0003\u0128\u0094"+ - "\u0000\u0468\u00af\u0001\u0000\u0000\u0000\u0469\u046a\u0005\f\u0000\u0000"+ - "\u046a\u046b\u0003\u00a6S\u0000\u046b\u046c\u0003\u0172\u00b9\u0000\u046c"+ - "\u046e\u0001\u0000\u0000\u0000\u046d\u0469\u0001\u0000\u0000\u0000\u046e"+ - "\u0471\u0001\u0000\u0000\u0000\u046f\u046d\u0001\u0000\u0000\u0000\u046f"+ - "\u0470\u0001\u0000\u0000\u0000\u0470\u0476\u0001\u0000\u0000\u0000\u0471"+ - "\u046f\u0001\u0000\u0000\u0000\u0472\u0473\u0005\r\u0000\u0000\u0473\u0474"+ - "\u0003d2\u0000\u0474\u0475\u0003\u0172\u00b9\u0000\u0475\u0477\u0001\u0000"+ - "\u0000\u0000\u0476\u0472\u0001\u0000\u0000\u0000\u0476\u0477\u0001\u0000"+ - "\u0000\u0000\u0477\u00b1\u0001\u0000\u0000\u0000\u0478\u0479\u0005S\u0000"+ - "\u0000\u0479\u047e\u0003\u00a6S\u0000\u047a\u047b\u0005S\u0000\u0000\u047b"+ - "\u047c\u0007\u0001\u0000\u0000\u047c\u047e\u0003.\u0017\u0000\u047d\u0478"+ - "\u0001\u0000\u0000\u0000\u047d\u047a\u0001\u0000\u0000\u0000\u047e\u00b3"+ - "\u0001\u0000\u0000\u0000\u047f\u0488\u0005\u0003\u0000\u0000\u0480\u0488"+ - "\u0005\u0004\u0000\u0000\u0481\u0488\u0005f\u0000\u0000\u0482\u0488\u0003"+ - "\u014e\u00a7\u0000\u0483\u0488\u0003\u0164\u00b2\u0000\u0484\u0488\u0005"+ - "\u0001\u0000\u0000\u0485\u0488\u0005\u0091\u0000\u0000\u0486\u0488\u0005"+ - "\u0092\u0000\u0000\u0487\u047f\u0001\u0000\u0000\u0000\u0487\u0480\u0001"+ - "\u0000\u0000\u0000\u0487\u0481\u0001\u0000\u0000\u0000\u0487\u0482\u0001"+ - "\u0000\u0000\u0000\u0487\u0483\u0001\u0000\u0000\u0000\u0487\u0484\u0001"+ - "\u0000\u0000\u0000\u0487\u0485\u0001\u0000\u0000\u0000\u0487\u0486\u0001"+ - "\u0000\u0000\u0000\u0488\u00b5\u0001\u0000\u0000\u0000\u0489\u048a\u0006"+ - "[\uffff\uffff\u0000\u048a\u049a\u0003\u014a\u00a5\u0000\u048b\u049a\u0003"+ - "\u0146\u00a3\u0000\u048c\u049a\u0003\u016e\u00b7\u0000\u048d\u049a\u0003"+ - " \u0010\u0000\u048e\u049a\u0003\u0088D\u0000\u048f\u049a\u0003\u0086C"+ - "\u0000\u0490\u0491\u0005L\u0000\u0000\u0491\u0492\u0003\u00b6[\u0000\u0492"+ - "\u0493\u0003\u016c\u00b6\u0000\u0493\u049a\u0001\u0000\u0000\u0000\u0494"+ - "\u0495\u0007\r\u0000\u0000\u0495\u0496\u0005h\u0000\u0000\u0496\u0497"+ - "\u0003\u00a6S\u0000\u0497\u0498\u0005i\u0000\u0000\u0498\u049a\u0001\u0000"+ - "\u0000\u0000\u0499\u0489\u0001\u0000\u0000\u0000\u0499\u048b\u0001\u0000"+ - "\u0000\u0000\u0499\u048c\u0001\u0000\u0000\u0000\u0499\u048d\u0001\u0000"+ - "\u0000\u0000\u0499\u048e\u0001\u0000\u0000\u0000\u0499\u048f\u0001\u0000"+ - "\u0000\u0000\u0499\u0490\u0001\u0000\u0000\u0000\u0499\u0494\u0001\u0000"+ - "\u0000\u0000\u049a\u04b1\u0001\u0000\u0000\u0000\u049b\u049c\n\n\u0000"+ - "\u0000\u049c\u049d\u0005r\u0000\u0000\u049d\u04b0\u0005g\u0000\u0000\u049e"+ - "\u049f\n\t\u0000\u0000\u049f\u04b0\u0003\u0168\u00b4\u0000\u04a0\u04a1"+ - "\n\b\u0000\u0000\u04a1\u04b0\u0003\u00d0h\u0000\u04a2\u04a3\n\u0007\u0000"+ - "\u0000\u04a3\u04b0\u0003L&\u0000\u04a4\u04a5\n\u0006\u0000\u0000\u04a5"+ - "\u04b0\u0003\u016a\u00b5\u0000\u04a6\u04a7\n\u0005\u0000\u0000\u04a7\u04b0"+ - "\u0003\u016c\u00b6\u0000\u04a8\u04a9\n\u0003\u0000\u0000\u04a9\u04aa\u0003"+ - "\u016c\u00b6\u0000\u04aa\u04ab\u0005\u0010\u0000\u0000\u04ab\u04ac\u0003"+ - "t:\u0000\u04ac\u04b0\u0001\u0000\u0000\u0000\u04ad\u04ae\n\u0002\u0000"+ - "\u0000\u04ae\u04b0\u0003\u00bc^\u0000\u04af\u049b\u0001\u0000\u0000\u0000"+ - "\u04af\u049e\u0001\u0000\u0000\u0000\u04af\u04a0\u0001\u0000\u0000\u0000"+ - "\u04af\u04a2\u0001\u0000\u0000\u0000\u04af\u04a4\u0001\u0000\u0000\u0000"+ - "\u04af\u04a6\u0001\u0000\u0000\u0000\u04af\u04a8\u0001\u0000\u0000\u0000"+ - "\u04af\u04ad\u0001\u0000\u0000\u0000\u04b0\u04b3\u0001\u0000\u0000\u0000"+ - "\u04b1\u04af\u0001\u0000\u0000\u0000\u04b1\u04b2\u0001\u0000\u0000\u0000"+ - "\u04b2\u00b7\u0001\u0000\u0000\u0000\u04b3\u04b1\u0001\u0000\u0000\u0000"+ - "\u04b4\u04b5\u0003`0\u0000\u04b5\u04b6\u0003\u00ba]\u0000\u04b6\u00b9"+ - "\u0001\u0000\u0000\u0000\u04b7\u04b9\u0005O\u0000\u0000\u04b8\u04ba\u0005"+ - "g\u0000\u0000\u04b9\u04b8\u0001\u0000\u0000\u0000\u04b9\u04ba\u0001\u0000"+ - "\u0000\u0000\u04ba\u04bb\u0001\u0000\u0000\u0000\u04bb\u04bd\u0003\u0140"+ - "\u00a0\u0000\u04bc\u04be\u0003r9\u0000\u04bd\u04bc\u0001\u0000\u0000\u0000"+ - "\u04bd\u04be\u0001\u0000\u0000\u0000\u04be\u00bb\u0001\u0000\u0000\u0000"+ - "\u04bf\u04c1\u0005&\u0000\u0000\u04c0\u04c2\u0003\u00e8t\u0000\u04c1\u04c0"+ - "\u0001\u0000\u0000\u0000\u04c1\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c4"+ - "\u0001\u0000\u0000\u0000\u04c3\u04c5\u0005o\u0000\u0000\u04c4\u04c3\u0001"+ - "\u0000\u0000\u0000\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c6\u0001"+ - "\u0000\u0000\u0000\u04c6\u04c7\u0005\'\u0000\u0000\u04c7\u00bd\u0001\u0000"+ - "\u0000\u0000\u04c8\u04c9\u0005P\u0000\u0000\u04c9\u04d3\u0005j\u0000\u0000"+ - "\u04ca\u04ce\u0003\u00c2a\u0000\u04cb\u04ce\u0003\u012e\u0097\u0000\u04cc"+ - "\u04ce\u0003\u00c0`\u0000\u04cd\u04ca\u0001\u0000\u0000\u0000\u04cd\u04cb"+ - "\u0001\u0000\u0000\u0000\u04cd\u04cc\u0001\u0000\u0000\u0000\u04ce\u04cf"+ - "\u0001\u0000\u0000\u0000\u04cf\u04d0\u0003\u0172\u00b9\u0000\u04d0\u04d2"+ - "\u0001\u0000\u0000\u0000\u04d1\u04cd\u0001\u0000\u0000\u0000\u04d2\u04d5"+ - "\u0001\u0000\u0000\u0000\u04d3\u04d1\u0001\u0000\u0000\u0000\u04d3\u04d4"+ - "\u0001\u0000\u0000\u0000\u04d4\u04d6\u0001\u0000\u0000\u0000\u04d5\u04d3"+ - "\u0001\u0000\u0000\u0000\u04d6\u04d7\u0005k\u0000\u0000\u04d7\u00bf\u0001"+ - "\u0000\u0000\u0000\u04d8\u04d9\u00058\u0000\u0000\u04d9\u04da\u0005g\u0000"+ - "\u0000\u04da\u04db\u0003\u0144\u00a2\u0000\u04db\u00c1\u0001\u0000\u0000"+ - "\u0000\u04dc\u04de\u0005\u001b\u0000\u0000\u04dd\u04dc\u0001\u0000\u0000"+ - "\u0000\u04dd\u04de\u0001\u0000\u0000\u0000\u04de\u04df\u0001\u0000\u0000"+ - "\u0000\u04df\u04e0\u0003`0\u0000\u04e0\u04e1\u0005g\u0000\u0000\u04e1"+ - "\u04e2\u0003\u0144\u00a2\u0000\u04e2\u04e3\u0003\u0142\u00a1\u0000\u04e3"+ - "\u04ec\u0001\u0000\u0000\u0000\u04e4\u04e6\u0005\u001b\u0000\u0000\u04e5"+ - "\u04e4\u0001\u0000\u0000\u0000\u04e5\u04e6\u0001\u0000\u0000\u0000\u04e6"+ - "\u04e7\u0001\u0000\u0000\u0000\u04e7\u04e8\u0003`0\u0000\u04e8\u04e9\u0005"+ - "g\u0000\u0000\u04e9\u04ea\u0003\u0144\u00a2\u0000\u04ea\u04ec\u0001\u0000"+ - "\u0000\u0000\u04eb\u04dd\u0001\u0000\u0000\u0000\u04eb\u04e5\u0001\u0000"+ - "\u0000\u0000\u04ec\u00c3\u0001\u0000\u0000\u0000\u04ed\u04f5\u0003\u012e"+ - "\u0097\u0000\u04ee\u04f5\u0003\u00c6c\u0000\u04ef\u04f5\u0003P(\u0000"+ - "\u04f0\u04f1\u0005h\u0000\u0000\u04f1\u04f2\u0003\u00c4b\u0000\u04f2\u04f3"+ - "\u0005i\u0000\u0000\u04f3\u04f5\u0001\u0000\u0000\u0000\u04f4\u04ed\u0001"+ - "\u0000\u0000\u0000\u04f4\u04ee\u0001\u0000\u0000\u0000\u04f4\u04ef\u0001"+ - "\u0000\u0000\u0000\u04f4\u04f0\u0001\u0000\u0000\u0000\u04f5\u00c5\u0001"+ - "\u0000\u0000\u0000\u04f6\u0500\u0003\u0130\u0098\u0000\u04f7\u0500\u0003"+ - "\u0160\u00b0\u0000\u04f8\u0500\u0003\u0136\u009b\u0000\u04f9\u0500\u0003"+ - "\u013e\u009f\u0000\u04fa\u0500\u0003\u00be_\u0000\u04fb\u0500\u0003\u0138"+ - "\u009c\u0000\u04fc\u0500\u0003\u013a\u009d\u0000\u04fd\u0500\u0003\u013c"+ - "\u009e\u0000\u04fe\u0500\u0003\u00c8d\u0000\u04ff\u04f6\u0001\u0000\u0000"+ - "\u0000\u04ff\u04f7\u0001\u0000\u0000\u0000\u04ff\u04f8\u0001\u0000\u0000"+ - "\u0000\u04ff\u04f9\u0001\u0000\u0000\u0000\u04ff\u04fa\u0001\u0000\u0000"+ - "\u0000\u04ff\u04fb\u0001\u0000\u0000\u0000\u04ff\u04fc\u0001\u0000\u0000"+ - "\u0000\u04ff\u04fd\u0001\u0000\u0000\u0000\u04ff\u04fe\u0001\u0000\u0000"+ - "\u0000\u0500\u00c7\u0001\u0000\u0000\u0000\u0501\u0502\u00058\u0000\u0000"+ - "\u0502\u0503\u0003\u00cae\u0000\u0503\u00c9\u0001\u0000\u0000\u0000\u0504"+ - "\u0510\u0005h\u0000\u0000\u0505\u050a\u0003\u00c4b\u0000\u0506\u0507\u0005"+ - "o\u0000\u0000\u0507\u0509\u0003\u00c4b\u0000\u0508\u0506\u0001\u0000\u0000"+ - "\u0000\u0509\u050c\u0001\u0000\u0000\u0000\u050a\u0508\u0001\u0000\u0000"+ - "\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050e\u0001\u0000\u0000"+ - "\u0000\u050c\u050a\u0001\u0000\u0000\u0000\u050d\u050f\u0005o\u0000\u0000"+ - "\u050e\u050d\u0001\u0000\u0000\u0000\u050e\u050f\u0001\u0000\u0000\u0000"+ - "\u050f\u0511\u0001\u0000\u0000\u0000\u0510\u0505\u0001\u0000\u0000\u0000"+ - "\u0510\u0511\u0001\u0000\u0000\u0000\u0511\u0512\u0001\u0000\u0000\u0000"+ - "\u0512\u0513\u0005i\u0000\u0000\u0513\u00cb\u0001\u0000\u0000\u0000\u0514"+ - "\u051c\u0003\u0160\u00b0\u0000\u0515\u051c\u0003\u0130\u0098\u0000\u0516"+ - "\u051c\u0003\u00ceg\u0000\u0517\u051c\u0003\u0138\u009c\u0000\u0518\u051c"+ - "\u0003\u013a\u009d\u0000\u0519\u051c\u0003P(\u0000\u051a\u051c\u0003\u012e"+ - "\u0097\u0000\u051b\u0514\u0001\u0000\u0000\u0000\u051b\u0515\u0001\u0000"+ - "\u0000\u0000\u051b\u0516\u0001\u0000\u0000\u0000\u051b\u0517\u0001\u0000"+ - "\u0000\u0000\u051b\u0518\u0001\u0000\u0000\u0000\u051b\u0519\u0001\u0000"+ - "\u0000\u0000\u051b\u051a\u0001\u0000\u0000\u0000\u051c\u00cd\u0001\u0000"+ - "\u0000\u0000\u051d\u051e\u0005l\u0000\u0000\u051e\u051f\u0005v\u0000\u0000"+ - "\u051f\u0520\u0005m\u0000\u0000\u0520\u0521\u0003\u0134\u009a\u0000\u0521"+ - "\u00cf\u0001\u0000\u0000\u0000\u0522\u0532\u0005l\u0000\u0000\u0523\u0525"+ - "\u0003\u00d2i\u0000\u0524\u0523\u0001\u0000\u0000\u0000\u0524\u0525\u0001"+ - "\u0000\u0000\u0000\u0525\u0526\u0001\u0000\u0000\u0000\u0526\u0528\u0005"+ - "q\u0000\u0000\u0527\u0529\u0003\u00d4j\u0000\u0528\u0527\u0001\u0000\u0000"+ - "\u0000\u0528\u0529\u0001\u0000\u0000\u0000\u0529\u0533\u0001\u0000\u0000"+ - "\u0000\u052a\u052c\u0003\u00d2i\u0000\u052b\u052a\u0001\u0000\u0000\u0000"+ - "\u052b\u052c\u0001\u0000\u0000\u0000\u052c\u052d\u0001\u0000\u0000\u0000"+ - "\u052d\u052e\u0005q\u0000\u0000\u052e\u052f\u0003\u00d4j\u0000\u052f\u0530"+ - "\u0005q\u0000\u0000\u0530\u0531\u0003\u00d6k\u0000\u0531\u0533\u0001\u0000"+ - "\u0000\u0000\u0532\u0524\u0001\u0000\u0000\u0000\u0532\u052b\u0001\u0000"+ - "\u0000\u0000\u0533\u0534\u0001\u0000\u0000\u0000\u0534\u0535\u0005m\u0000"+ - "\u0000\u0535\u00d1\u0001\u0000\u0000\u0000\u0536\u0537\u0003\u00a6S\u0000"+ - "\u0537\u00d3\u0001\u0000\u0000\u0000\u0538\u0539\u0003\u00a6S\u0000\u0539"+ - "\u00d5\u0001\u0000\u0000\u0000\u053a\u053b\u0003\u00a6S\u0000\u053b\u00d7"+ - "\u0001\u0000\u0000\u0000\u053c\u053e\u0007\u000e\u0000\u0000\u053d\u053c"+ - "\u0001\u0000\u0000\u0000\u053d\u053e\u0001\u0000\u0000\u0000\u053e\u053f"+ - "\u0001\u0000\u0000\u0000\u053f\u0540\u0005n\u0000\u0000\u0540\u00d9\u0001"+ - "\u0000\u0000\u0000\u0541\u0542\u0003\u00e8t\u0000\u0542\u0543\u0005n\u0000"+ - "\u0000\u0543\u0548\u0001\u0000\u0000\u0000\u0544\u0545\u0003\u0006\u0003"+ - "\u0000\u0545\u0546\u0005u\u0000\u0000\u0546\u0548\u0001\u0000\u0000\u0000"+ - "\u0547\u0541\u0001\u0000\u0000\u0000\u0547\u0544\u0001\u0000\u0000\u0000"+ - "\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u0549\u0001\u0000\u0000\u0000"+ - "\u0549\u054a\u0005_\u0000\u0000\u054a\u054f\u0003\u00a6S\u0000\u054b\u054d"+ - "\u0005J\u0000\u0000\u054c\u054e\u0005g\u0000\u0000\u054d\u054c\u0001\u0000"+ - "\u0000\u0000\u054d\u054e\u0001\u0000\u0000\u0000\u054e\u0550\u0001\u0000"+ - "\u0000\u0000\u054f\u054b\u0001\u0000\u0000\u0000\u054f\u0550\u0001\u0000"+ - "\u0000\u0000\u0550\u00db\u0001\u0000\u0000\u0000\u0551\u0552\u0005Z\u0000"+ - "\u0000\u0552\u0553\u0005g\u0000\u0000\u0553\u00dd\u0001\u0000\u0000\u0000"+ - "\u0554\u0555\u0003\u0164\u00b2\u0000\u0555\u00df\u0001\u0000\u0000\u0000"+ - "\u0556\u055a\u0003\u00e2q\u0000\u0557\u055a\u0003\u00eau\u0000\u0558\u055a"+ - "\u0003\u00eew\u0000\u0559\u0556\u0001\u0000\u0000\u0000\u0559\u0557\u0001"+ - "\u0000\u0000\u0000\u0559\u0558\u0001\u0000\u0000\u0000\u055a\u00e1\u0001"+ - "\u0000\u0000\u0000\u055b\u0567\u0005\\\u0000\u0000\u055c\u0568\u0003\u00e4"+ - "r\u0000\u055d\u0563\u0005h\u0000\u0000\u055e\u055f\u0003\u00e4r\u0000"+ - "\u055f\u0560\u0003\u0172\u00b9\u0000\u0560\u0562\u0001\u0000\u0000\u0000"+ - "\u0561\u055e\u0001\u0000\u0000\u0000\u0562\u0565\u0001\u0000\u0000\u0000"+ - "\u0563\u0561\u0001\u0000\u0000\u0000\u0563\u0564\u0001\u0000\u0000\u0000"+ - "\u0564\u0566\u0001\u0000\u0000\u0000\u0565\u0563\u0001\u0000\u0000\u0000"+ - "\u0566\u0568\u0005i\u0000\u0000\u0567\u055c\u0001\u0000\u0000\u0000\u0567"+ - "\u055d\u0001\u0000\u0000\u0000\u0568\u00e3\u0001\u0000\u0000\u0000\u0569"+ - "\u056f\u0003\u00e6s\u0000\u056a\u056c\u0003\u00c4b\u0000\u056b\u056a\u0001"+ - "\u0000\u0000\u0000\u056b\u056c\u0001\u0000\u0000\u0000\u056c\u056d\u0001"+ - "\u0000\u0000\u0000\u056d\u056e\u0005n\u0000\u0000\u056e\u0570\u0003\u00e8"+ - "t\u0000\u056f\u056b\u0001\u0000\u0000\u0000\u056f\u0570\u0001\u0000\u0000"+ - "\u0000\u0570\u00e5\u0001\u0000\u0000\u0000\u0571\u0576\u0005g\u0000\u0000"+ - "\u0572\u0573\u0005o\u0000\u0000\u0573\u0575\u0005g\u0000\u0000\u0574\u0572"+ - "\u0001\u0000\u0000\u0000\u0575\u0578\u0001\u0000\u0000\u0000\u0576\u0574"+ - "\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000\u0000\u0577\u00e7"+ - "\u0001\u0000\u0000\u0000\u0578\u0576\u0001\u0000\u0000\u0000\u0579\u057e"+ - "\u0003\u00a6S\u0000\u057a\u057b\u0005o\u0000\u0000\u057b\u057d\u0003\u00a6"+ - "S\u0000\u057c\u057a\u0001\u0000\u0000\u0000\u057d\u0580\u0001\u0000\u0000"+ - "\u0000\u057e\u057c\u0001\u0000\u0000\u0000\u057e\u057f\u0001\u0000\u0000"+ - "\u0000\u057f\u00e9\u0001\u0000\u0000\u0000\u0580\u057e\u0001\u0000\u0000"+ - "\u0000\u0581\u058d\u0005`\u0000\u0000\u0582\u058e\u0003\u00ecv\u0000\u0583"+ - "\u0589\u0005h\u0000\u0000\u0584\u0585\u0003\u00ecv\u0000\u0585\u0586\u0003"+ - "\u0172\u00b9\u0000\u0586\u0588\u0001\u0000\u0000\u0000\u0587\u0584\u0001"+ - "\u0000\u0000\u0000\u0588\u058b\u0001\u0000\u0000\u0000\u0589\u0587\u0001"+ - "\u0000\u0000\u0000\u0589\u058a\u0001\u0000\u0000\u0000\u058a\u058c\u0001"+ - "\u0000\u0000\u0000\u058b\u0589\u0001\u0000\u0000\u0000\u058c\u058e\u0005"+ - "i\u0000\u0000\u058d\u0582\u0001\u0000\u0000\u0000\u058d\u0583\u0001\u0000"+ - "\u0000\u0000\u058e\u00eb\u0001\u0000\u0000\u0000\u058f\u0591\u0005g\u0000"+ - "\u0000\u0590\u0592\u0005n\u0000\u0000\u0591\u0590\u0001\u0000\u0000\u0000"+ - "\u0591\u0592\u0001\u0000\u0000\u0000\u0592\u0593\u0001\u0000\u0000\u0000"+ - "\u0593\u0594\u0003\u00c4b\u0000\u0594\u00ed\u0001\u0000\u0000\u0000\u0595"+ - "\u05a1\u0005e\u0000\u0000\u0596\u05a2\u0003\u0098L\u0000\u0597\u059d\u0005"+ - "h\u0000\u0000\u0598\u0599\u0003\u0098L\u0000\u0599\u059a\u0003\u0172\u00b9"+ - "\u0000\u059a\u059c\u0001\u0000\u0000\u0000\u059b\u0598\u0001\u0000\u0000"+ - "\u0000\u059c\u059f\u0001\u0000\u0000\u0000\u059d\u059b\u0001\u0000\u0000"+ - "\u0000\u059d\u059e\u0001\u0000\u0000\u0000\u059e\u05a0\u0001\u0000\u0000"+ - "\u0000\u059f\u059d\u0001\u0000\u0000\u0000\u05a0\u05a2\u0005i\u0000\u0000"+ - "\u05a1\u0596\u0001\u0000\u0000\u0000\u05a1\u0597\u0001\u0000\u0000\u0000"+ - "\u05a2\u00ef\u0001\u0000\u0000\u0000\u05a3\u05a5\u0005j\u0000\u0000\u05a4"+ - "\u05a6\u0003\u00f2y\u0000\u05a5\u05a4\u0001\u0000\u0000\u0000\u05a5\u05a6"+ - "\u0001\u0000\u0000\u0000\u05a6\u05a7\u0001\u0000\u0000\u0000\u05a7\u05a8"+ - "\u0005k\u0000\u0000\u05a8\u00f1\u0001\u0000\u0000\u0000\u05a9\u05ab\u0005"+ - "p\u0000\u0000\u05aa\u05a9\u0001\u0000\u0000\u0000\u05aa\u05ab\u0001\u0000"+ - "\u0000\u0000\u05ab\u05b1\u0001\u0000\u0000\u0000\u05ac\u05ae\u0005\u00a1"+ - "\u0000\u0000\u05ad\u05ac\u0001\u0000\u0000\u0000\u05ad\u05ae\u0001\u0000"+ - "\u0000\u0000\u05ae\u05b1\u0001\u0000\u0000\u0000\u05af\u05b1\u0004y\u0012"+ - "\u0000\u05b0\u05aa\u0001\u0000\u0000\u0000\u05b0\u05ad\u0001\u0000\u0000"+ - "\u0000\u05b0\u05af\u0001\u0000\u0000\u0000\u05b1\u05b2\u0001\u0000\u0000"+ - "\u0000\u05b2\u05b3\u0003\u00a8T\u0000\u05b3\u05b4\u0003\u0172\u00b9\u0000"+ - "\u05b4\u05b6\u0001\u0000\u0000\u0000\u05b5\u05b0\u0001\u0000\u0000\u0000"+ - "\u05b6\u05b7\u0001\u0000\u0000\u0000\u05b7\u05b5\u0001\u0000\u0000\u0000"+ - "\u05b7\u05b8\u0001\u0000\u0000\u0000\u05b8\u00f3\u0001\u0000\u0000\u0000"+ - "\u05b9\u05bf\u0003\u00f8|\u0000\u05ba\u05bf\u0003\u00fa}\u0000\u05bb\u05bf"+ - "\u0003\u00fc~\u0000\u05bc\u05bf\u0003\u00f6{\u0000\u05bd\u05bf\u0003\u009a"+ - "M\u0000\u05be\u05b9\u0001\u0000\u0000\u0000\u05be\u05ba\u0001\u0000\u0000"+ - "\u0000\u05be\u05bb\u0001\u0000\u0000\u0000\u05be\u05bc\u0001\u0000\u0000"+ - "\u0000\u05be\u05bd\u0001\u0000\u0000\u0000\u05bf\u00f5\u0001\u0000\u0000"+ - "\u0000\u05c0\u05c1\u0003\u00a6S\u0000\u05c1\u00f7\u0001\u0000\u0000\u0000"+ - "\u05c2\u05c3\u0003\u00a6S\u0000\u05c3\u05c4\u0005\u008b\u0000\u0000\u05c4"+ - "\u05c5\u0003\u00a6S\u0000\u05c5\u00f9\u0001\u0000\u0000\u0000\u05c6\u05c7"+ - "\u0003\u00a6S\u0000\u05c7\u05c8\u0007\u000f\u0000\u0000\u05c8\u00fb\u0001"+ - "\u0000\u0000\u0000\u05c9\u05ca\u0003\u00e8t\u0000\u05ca\u05cb\u0003\u00d8"+ - "l\u0000\u05cb\u05cc\u0003\u00e8t\u0000\u05cc\u00fd\u0001\u0000\u0000\u0000"+ - "\u05cd\u05ce\u0007\u0010\u0000\u0000\u05ce\u00ff\u0001\u0000\u0000\u0000"+ - "\u05cf\u05d0\u0005g\u0000\u0000\u05d0\u05d2\u0005q\u0000\u0000\u05d1\u05d3"+ - "\u0003\u00a8T\u0000\u05d2\u05d1\u0001\u0000\u0000\u0000\u05d2\u05d3\u0001"+ - "\u0000\u0000\u0000\u05d3\u0101\u0001\u0000\u0000\u0000\u05d4\u05d6\u0005"+ - "d\u0000\u0000\u05d5\u05d7\u0003\u00e8t\u0000\u05d6\u05d5\u0001\u0000\u0000"+ - "\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000\u05d7\u0103\u0001\u0000\u0000"+ - "\u0000\u05d8\u05da\u0005M\u0000\u0000\u05d9\u05db\u0005g\u0000\u0000\u05da"+ - "\u05d9\u0001\u0000\u0000\u0000\u05da\u05db\u0001\u0000\u0000\u0000\u05db"+ - "\u0105\u0001\u0000\u0000\u0000\u05dc\u05de\u0005a\u0000\u0000\u05dd\u05df"+ - "\u0005g\u0000\u0000\u05de\u05dd\u0001\u0000\u0000\u0000\u05de\u05df\u0001"+ - "\u0000\u0000\u0000\u05df\u0107\u0001\u0000\u0000\u0000\u05e0\u05e1\u0005"+ - "Y\u0000\u0000\u05e1\u05e2\u0005g\u0000\u0000\u05e2\u0109\u0001\u0000\u0000"+ - "\u0000\u05e3\u05e4\u0005]\u0000\u0000\u05e4\u010b\u0001\u0000\u0000\u0000"+ - "\u05e5\u05ee\u0005^\u0000\u0000\u05e6\u05ef\u0003\u00a6S\u0000\u05e7\u05e8"+ - "\u0003\u0172\u00b9\u0000\u05e8\u05e9\u0003\u00a6S\u0000\u05e9\u05ef\u0001"+ - "\u0000\u0000\u0000\u05ea\u05eb\u0003\u00f4z\u0000\u05eb\u05ec\u0003\u0172"+ - "\u00b9\u0000\u05ec\u05ed\u0003\u00a6S\u0000\u05ed\u05ef\u0001\u0000\u0000"+ - "\u0000\u05ee\u05e6\u0001\u0000\u0000\u0000\u05ee\u05e7\u0001\u0000\u0000"+ - "\u0000\u05ee\u05ea\u0001\u0000\u0000\u0000\u05ef\u05f0\u0001\u0000\u0000"+ - "\u0000\u05f0\u05f6\u0003\u00f0x\u0000\u05f1\u05f4\u0005X\u0000\u0000\u05f2"+ - "\u05f5\u0003\u010c\u0086\u0000\u05f3\u05f5\u0003\u00f0x\u0000\u05f4\u05f2"+ - "\u0001\u0000\u0000\u0000\u05f4\u05f3\u0001\u0000\u0000\u0000\u05f5\u05f7"+ - "\u0001\u0000\u0000\u0000\u05f6\u05f1\u0001\u0000\u0000\u0000\u05f6\u05f7"+ - "\u0001\u0000\u0000\u0000\u05f7\u010d\u0001\u0000\u0000\u0000\u05f8\u05fb"+ - "\u0003\u0110\u0088\u0000\u05f9\u05fb\u0003\u0116\u008b\u0000\u05fa\u05f8"+ - "\u0001\u0000\u0000\u0000\u05fa\u05f9\u0001\u0000\u0000\u0000\u05fb\u010f"+ - "\u0001\u0000\u0000\u0000\u05fc\u0607\u0005[\u0000\u0000\u05fd\u05ff\u0003"+ - "\u00a6S\u0000\u05fe\u05fd\u0001\u0000\u0000\u0000\u05fe\u05ff\u0001\u0000"+ - "\u0000\u0000\u05ff\u0608\u0001\u0000\u0000\u0000\u0600\u0602\u0003\u00f4"+ - "z\u0000\u0601\u0600\u0001\u0000\u0000\u0000\u0601\u0602\u0001\u0000\u0000"+ - "\u0000\u0602\u0603\u0001\u0000\u0000\u0000\u0603\u0605\u0003\u0172\u00b9"+ - "\u0000\u0604\u0606\u0003\u00a6S\u0000\u0605\u0604\u0001\u0000\u0000\u0000"+ - "\u0605\u0606\u0001\u0000\u0000\u0000\u0606\u0608\u0001\u0000\u0000\u0000"+ - "\u0607\u05fe\u0001\u0000\u0000\u0000\u0607\u0601\u0001\u0000\u0000\u0000"+ - "\u0608\u0609\u0001\u0000\u0000\u0000\u0609\u060d\u0005j\u0000\u0000\u060a"+ - "\u060c\u0003\u0112\u0089\u0000\u060b\u060a\u0001\u0000\u0000\u0000\u060c"+ - "\u060f\u0001\u0000\u0000\u0000\u060d\u060b\u0001\u0000\u0000\u0000\u060d"+ - "\u060e\u0001\u0000\u0000\u0000\u060e\u0610\u0001\u0000\u0000\u0000\u060f"+ - "\u060d\u0001\u0000\u0000\u0000\u0610\u0611\u0005k\u0000\u0000\u0611\u0111"+ - "\u0001\u0000\u0000\u0000\u0612\u0613\u0003\u0114\u008a\u0000\u0613\u0615"+ - "\u0005q\u0000\u0000\u0614\u0616\u0003\u00f2y\u0000\u0615\u0614\u0001\u0000"+ - "\u0000\u0000\u0615\u0616\u0001\u0000\u0000\u0000\u0616\u0113\u0001\u0000"+ - "\u0000\u0000\u0617\u0618\u0005R\u0000\u0000\u0618\u061b\u0003\u00e8t\u0000"+ - "\u0619\u061b\u0005N\u0000\u0000\u061a\u0617\u0001\u0000\u0000\u0000\u061a"+ - "\u0619\u0001\u0000\u0000\u0000\u061b\u0115\u0001\u0000\u0000\u0000\u061c"+ - "\u0625\u0005[\u0000\u0000\u061d\u0626\u0003\u0118\u008c\u0000\u061e\u061f"+ - "\u0003\u0172\u00b9\u0000\u061f\u0620\u0003\u0118\u008c\u0000\u0620\u0626"+ - "\u0001\u0000\u0000\u0000\u0621\u0622\u0003\u00f4z\u0000\u0622\u0623\u0003"+ - "\u0172\u00b9\u0000\u0623\u0624\u0003\u0118\u008c\u0000\u0624\u0626\u0001"+ - "\u0000\u0000\u0000\u0625\u061d\u0001\u0000\u0000\u0000\u0625\u061e\u0001"+ - "\u0000\u0000\u0000\u0625\u0621\u0001\u0000\u0000\u0000\u0626\u0627\u0001"+ - "\u0000\u0000\u0000\u0627\u062b\u0005j\u0000\u0000\u0628\u062a\u0003\u011a"+ - "\u008d\u0000\u0629\u0628\u0001\u0000\u0000\u0000\u062a\u062d\u0001\u0000"+ - "\u0000\u0000\u062b\u0629\u0001\u0000\u0000\u0000\u062b\u062c\u0001\u0000"+ - "\u0000\u0000\u062c\u062e\u0001\u0000\u0000\u0000\u062d\u062b\u0001\u0000"+ - "\u0000\u0000\u062e\u062f\u0005k\u0000\u0000\u062f\u0117\u0001\u0000\u0000"+ - "\u0000\u0630\u0631\u0005g\u0000\u0000\u0631\u0633\u0005u\u0000\u0000\u0632"+ - "\u0630\u0001\u0000\u0000\u0000\u0632\u0633\u0001\u0000\u0000\u0000\u0633"+ - "\u0634\u0001\u0000\u0000\u0000\u0634\u0635\u0003\u00b6[\u0000\u0635\u0636"+ - "\u0005r\u0000\u0000\u0636\u0637\u0005h\u0000\u0000\u0637\u0638\u0005`"+ - "\u0000\u0000\u0638\u0639\u0005i\u0000\u0000\u0639\u0119\u0001\u0000\u0000"+ - "\u0000\u063a\u063b\u0003\u011c\u008e\u0000\u063b\u063d\u0005q\u0000\u0000"+ - "\u063c\u063e\u0003\u00f2y\u0000\u063d\u063c\u0001\u0000\u0000\u0000\u063d"+ - "\u063e\u0001\u0000\u0000\u0000\u063e\u011b\u0001\u0000\u0000\u0000\u063f"+ - "\u0640\u0005R\u0000\u0000\u0640\u0643\u0003\u011e\u008f\u0000\u0641\u0643"+ - "\u0005N\u0000\u0000\u0642\u063f\u0001\u0000\u0000\u0000\u0642\u0641\u0001"+ - "\u0000\u0000\u0000\u0643\u011d\u0001\u0000\u0000\u0000\u0644\u0647\u0003"+ - "\u00c4b\u0000\u0645\u0647\u0005f\u0000\u0000\u0646\u0644\u0001\u0000\u0000"+ - "\u0000\u0646\u0645\u0001\u0000\u0000\u0000\u0647\u064f\u0001\u0000\u0000"+ - "\u0000\u0648\u064b\u0005o\u0000\u0000\u0649\u064c\u0003\u00c4b\u0000\u064a"+ - "\u064c\u0005f\u0000\u0000\u064b\u0649\u0001\u0000\u0000\u0000\u064b\u064a"+ - "\u0001\u0000\u0000\u0000\u064c\u064e\u0001\u0000\u0000\u0000\u064d\u0648"+ - "\u0001\u0000\u0000\u0000\u064e\u0651\u0001\u0000\u0000\u0000\u064f\u064d"+ - "\u0001\u0000\u0000\u0000\u064f\u0650\u0001\u0000\u0000\u0000\u0650\u011f"+ - "\u0001\u0000\u0000\u0000\u0651\u064f\u0001\u0000\u0000\u0000\u0652\u0653"+ - "\u0005Q\u0000\u0000\u0653\u0657\u0005j\u0000\u0000\u0654\u0656\u0003\u0122"+ - "\u0091\u0000\u0655\u0654\u0001\u0000\u0000\u0000\u0656\u0659\u0001\u0000"+ - "\u0000\u0000\u0657\u0655\u0001\u0000\u0000\u0000\u0657\u0658\u0001\u0000"+ - "\u0000\u0000\u0658\u065a\u0001\u0000\u0000\u0000\u0659\u0657\u0001\u0000"+ - "\u0000\u0000\u065a\u065b\u0005k\u0000\u0000\u065b\u0121\u0001\u0000\u0000"+ - "\u0000\u065c\u065d\u0003\u0124\u0092\u0000\u065d\u065f\u0005q\u0000\u0000"+ - "\u065e\u0660\u0003\u00f2y\u0000\u065f\u065e\u0001\u0000\u0000\u0000\u065f"+ - "\u0660\u0001\u0000\u0000\u0000\u0660\u0123\u0001\u0000\u0000\u0000\u0661"+ - "\u0664\u0005R\u0000\u0000\u0662\u0665\u0003\u00f8|\u0000\u0663\u0665\u0003"+ - "\u0126\u0093\u0000\u0664\u0662\u0001\u0000\u0000\u0000\u0664\u0663\u0001"+ - "\u0000\u0000\u0000\u0665\u0668\u0001\u0000\u0000\u0000\u0666\u0668\u0005"+ - "N\u0000\u0000\u0667\u0661\u0001\u0000\u0000\u0000\u0667\u0666\u0001\u0000"+ - "\u0000\u0000\u0668\u0125\u0001\u0000\u0000\u0000\u0669\u066a\u0003\u00e8"+ - "t\u0000\u066a\u066b\u0005n\u0000\u0000\u066b\u0670\u0001\u0000\u0000\u0000"+ - "\u066c\u066d\u0003\u00e6s\u0000\u066d\u066e\u0005u\u0000\u0000\u066e\u0670"+ - "\u0001\u0000\u0000\u0000\u066f\u0669\u0001\u0000\u0000\u0000\u066f\u066c"+ - "\u0001\u0000\u0000\u0000\u066f\u0670\u0001\u0000\u0000\u0000\u0670\u0671"+ - "\u0001\u0000\u0000\u0000\u0671\u0672\u0003\u00a6S\u0000\u0672\u0127\u0001"+ - "\u0000\u0000\u0000\u0673\u067b\u0005b\u0000\u0000\u0674\u0676\u0003\u00a6"+ - "S\u0000\u0675\u0674\u0001\u0000\u0000\u0000\u0675\u0676\u0001\u0000\u0000"+ - "\u0000\u0676\u067c\u0001\u0000\u0000\u0000\u0677\u067c\u0003\u012a\u0095"+ - "\u0000\u0678\u067a\u0003\u00dam\u0000\u0679\u0678\u0001\u0000\u0000\u0000"+ - "\u0679\u067a\u0001\u0000\u0000\u0000\u067a\u067c\u0001\u0000\u0000\u0000"+ - "\u067b\u0675\u0001\u0000\u0000\u0000\u067b\u0677\u0001\u0000\u0000\u0000"+ - "\u067b\u0679\u0001\u0000\u0000\u0000\u067c\u067d\u0001\u0000\u0000\u0000"+ - "\u067d\u067e\u0003\u00f0x\u0000\u067e\u0129\u0001\u0000\u0000\u0000\u067f"+ - "\u0681\u0003\u00f4z\u0000\u0680\u067f\u0001\u0000\u0000\u0000\u0680\u0681"+ - "\u0001\u0000\u0000\u0000\u0681\u0682\u0001\u0000\u0000\u0000\u0682\u0684"+ - "\u0003\u0172\u00b9\u0000\u0683\u0685\u0003\u00a6S\u0000\u0684\u0683\u0001"+ - "\u0000\u0000\u0000\u0684\u0685\u0001\u0000\u0000\u0000\u0685\u0686\u0001"+ - "\u0000\u0000\u0000\u0686\u0688\u0003\u0172\u00b9\u0000\u0687\u0689\u0003"+ - "\u00f4z\u0000\u0688\u0687\u0001\u0000\u0000\u0000\u0688\u0689\u0001\u0000"+ - "\u0000\u0000\u0689\u012b\u0001\u0000\u0000\u0000\u068a\u068b\u0005T\u0000"+ - "\u0000\u068b\u068c\u0003\u00a6S\u0000\u068c\u012d\u0001\u0000\u0000\u0000"+ - "\u068d\u0690\u0003\u0152\u00a9\u0000\u068e\u0690\u0005g\u0000\u0000\u068f"+ - "\u068d\u0001\u0000\u0000\u0000\u068f\u068e\u0001\u0000\u0000\u0000\u0690"+ - "\u012f\u0001\u0000\u0000\u0000\u0691\u0692\u0005l\u0000\u0000\u0692\u0693"+ - "\u0003\u0132\u0099\u0000\u0693\u0694\u0005m\u0000\u0000\u0694\u0695\u0003"+ - "\u0134\u009a\u0000\u0695\u0131\u0001\u0000\u0000\u0000\u0696\u0697\u0003"+ - "\u00a6S\u0000\u0697\u0133\u0001\u0000\u0000\u0000\u0698\u0699\u0003\u00c4"+ - "b\u0000\u0699\u0135\u0001\u0000\u0000\u0000\u069a\u069b\u0005\u0089\u0000"+ - "\u0000\u069b\u069c\u0003\u00c4b\u0000\u069c\u0137\u0001\u0000\u0000\u0000"+ - "\u069d\u069e\u0005l\u0000\u0000\u069e\u069f\u0005m\u0000\u0000\u069f\u06a0"+ - "\u0003\u0134\u009a\u0000\u06a0\u0139\u0001\u0000\u0000\u0000\u06a1\u06a2"+ - "\u0005U\u0000\u0000\u06a2\u06a3\u0005l\u0000\u0000\u06a3\u06a4\u0003\u00c4"+ - "b\u0000\u06a4\u06a5\u0005m\u0000\u0000\u06a5\u06a6\u0003\u0134\u009a\u0000"+ - "\u06a6\u013b\u0001\u0000\u0000\u0000\u06a7\u06ad\u0005W\u0000\u0000\u06a8"+ - "\u06a9\u0005W\u0000\u0000\u06a9\u06ad\u0005\u008b\u0000\u0000\u06aa\u06ab"+ - "\u0005\u008b\u0000\u0000\u06ab\u06ad\u0005W\u0000\u0000\u06ac\u06a7\u0001"+ - "\u0000\u0000\u0000\u06ac\u06a8\u0001\u0000\u0000\u0000\u06ac\u06aa\u0001"+ - "\u0000\u0000\u0000\u06ad\u06ae\u0001\u0000\u0000\u0000\u06ae\u06af\u0003"+ - "\u0134\u009a\u0000\u06af\u013d\u0001\u0000\u0000\u0000\u06b0\u06b1\u0005"+ - "O\u0000\u0000\u06b1\u06b2\u0003\u0140\u00a0\u0000\u06b2\u013f\u0001\u0000"+ - "\u0000\u0000\u06b3\u06b4\u0003\u0144\u00a2\u0000\u06b4\u06b5\u0003\u0142"+ - "\u00a1\u0000\u06b5\u06b8\u0001\u0000\u0000\u0000\u06b6\u06b8\u0003\u0144"+ - "\u00a2\u0000\u06b7\u06b3\u0001\u0000\u0000\u0000\u06b7\u06b6\u0001\u0000"+ - "\u0000\u0000\u06b8\u0141\u0001\u0000\u0000\u0000\u06b9\u06bc\u0003\u0144"+ - "\u00a2\u0000\u06ba\u06bc\u0003\u00c4b\u0000\u06bb\u06b9\u0001\u0000\u0000"+ - "\u0000\u06bb\u06ba\u0001\u0000\u0000\u0000\u06bc\u0143\u0001\u0000\u0000"+ - "\u0000\u06bd\u06c9\u0005h\u0000\u0000\u06be\u06c3\u0003\u009eO\u0000\u06bf"+ - "\u06c0\u0005o\u0000\u0000\u06c0\u06c2\u0003\u009eO\u0000\u06c1\u06bf\u0001"+ - "\u0000\u0000\u0000\u06c2\u06c5\u0001\u0000\u0000\u0000\u06c3\u06c1\u0001"+ - "\u0000\u0000\u0000\u06c3\u06c4\u0001\u0000\u0000\u0000\u06c4\u06c7\u0001"+ - "\u0000\u0000\u0000\u06c5\u06c3\u0001\u0000\u0000\u0000\u06c6\u06c8\u0005"+ - "o\u0000\u0000\u06c7\u06c6\u0001\u0000\u0000\u0000\u06c7\u06c8\u0001\u0000"+ - "\u0000\u0000\u06c8\u06ca\u0001\u0000\u0000\u0000\u06c9\u06be\u0001\u0000"+ - "\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000"+ - "\u0000\u0000\u06cb\u06cc\u0005i\u0000\u0000\u06cc\u0145\u0001\u0000\u0000"+ - "\u0000\u06cd\u06ce\u0003\u0148\u00a4\u0000\u06ce\u06cf\u0005h\u0000\u0000"+ - "\u06cf\u06d1\u0003\u00a6S\u0000\u06d0\u06d2\u0005o\u0000\u0000\u06d1\u06d0"+ - "\u0001\u0000\u0000\u0000\u06d1\u06d2\u0001\u0000\u0000\u0000\u06d2\u06d3"+ - "\u0001\u0000\u0000\u0000\u06d3\u06d4\u0005i\u0000\u0000\u06d4\u0147\u0001"+ - "\u0000\u0000\u0000\u06d5\u06db\u0003\u00c6c\u0000\u06d6\u06d7\u0005h\u0000"+ - "\u0000\u06d7\u06d8\u0003\u0148\u00a4\u0000\u06d8\u06d9\u0005i\u0000\u0000"+ - "\u06d9\u06db\u0001\u0000\u0000\u0000\u06da\u06d5\u0001\u0000\u0000\u0000"+ - "\u06da\u06d6\u0001\u0000\u0000\u0000\u06db\u0149\u0001\u0000\u0000\u0000"+ - "\u06dc\u06e3\u0003\u014c\u00a6\u0000\u06dd\u06e3\u0003\u0150\u00a8\u0000"+ - "\u06de\u06df\u0005h\u0000\u0000\u06df\u06e0\u0003\u00a6S\u0000\u06e0\u06e1"+ - "\u0005i\u0000\u0000\u06e1\u06e3\u0001\u0000\u0000\u0000\u06e2\u06dc\u0001"+ - "\u0000\u0000\u0000\u06e2\u06dd\u0001\u0000\u0000\u0000\u06e2\u06de\u0001"+ - "\u0000\u0000\u0000\u06e3\u014b\u0001\u0000\u0000\u0000\u06e4\u06e8\u0003"+ - "\u00b4Z\u0000\u06e5\u06e8\u0003\u0154\u00aa\u0000\u06e6\u06e8\u0003\u00b8"+ - "\\\u0000\u06e7\u06e4\u0001\u0000\u0000\u0000\u06e7\u06e5\u0001\u0000\u0000"+ - "\u0000\u06e7\u06e6\u0001\u0000\u0000\u0000\u06e8\u014d\u0001\u0000\u0000"+ - "\u0000\u06e9\u06ea\u0007\u0011\u0000\u0000\u06ea\u014f\u0001\u0000\u0000"+ - "\u0000\u06eb\u06ec\u0005g\u0000\u0000\u06ec\u0151\u0001\u0000\u0000\u0000"+ - "\u06ed\u06ee\u0005g\u0000\u0000\u06ee\u06ef\u0005r\u0000\u0000\u06ef\u06f0"+ - "\u0005g\u0000\u0000\u06f0\u0153\u0001\u0000\u0000\u0000\u06f1\u06f2\u0003"+ - "\u00ccf\u0000\u06f2\u06f3\u0003\u0156\u00ab\u0000\u06f3\u0155\u0001\u0000"+ - "\u0000\u0000\u06f4\u06f9\u0005j\u0000\u0000\u06f5\u06f7\u0003\u0158\u00ac"+ - "\u0000\u06f6\u06f8\u0005o\u0000\u0000\u06f7\u06f6\u0001\u0000\u0000\u0000"+ - "\u06f7\u06f8\u0001\u0000\u0000\u0000\u06f8\u06fa\u0001\u0000\u0000\u0000"+ - "\u06f9\u06f5\u0001\u0000\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000"+ - "\u06fa\u06fb\u0001\u0000\u0000\u0000\u06fb\u06fc\u0005k\u0000\u0000\u06fc"+ - "\u0157\u0001\u0000\u0000\u0000\u06fd\u0702\u0003\u015a\u00ad\u0000\u06fe"+ - "\u06ff\u0005o\u0000\u0000\u06ff\u0701\u0003\u015a\u00ad\u0000\u0700\u06fe"+ - "\u0001\u0000\u0000\u0000\u0701\u0704\u0001\u0000\u0000\u0000\u0702\u0700"+ - "\u0001\u0000\u0000\u0000\u0702\u0703\u0001\u0000\u0000\u0000\u0703\u0159"+ - "\u0001\u0000\u0000\u0000\u0704\u0702\u0001\u0000\u0000\u0000\u0705\u0706"+ - "\u0003\u015c\u00ae\u0000\u0706\u0707\u0005q\u0000\u0000\u0707\u0709\u0001"+ - "\u0000\u0000\u0000\u0708\u0705\u0001\u0000\u0000\u0000\u0708\u0709\u0001"+ - "\u0000\u0000\u0000\u0709\u070a\u0001\u0000\u0000\u0000\u070a\u070b\u0003"+ - "\u015e\u00af\u0000\u070b\u015b\u0001\u0000\u0000\u0000\u070c\u070f\u0003"+ - "\u00a6S\u0000\u070d\u070f\u0003\u0156\u00ab\u0000\u070e\u070c\u0001\u0000"+ - "\u0000\u0000\u070e\u070d\u0001\u0000\u0000\u0000\u070f\u015d\u0001\u0000"+ - "\u0000\u0000\u0710\u0713\u0003\u00a6S\u0000\u0711\u0713\u0003\u0156\u00ab"+ - "\u0000\u0712\u0710\u0001\u0000\u0000\u0000\u0712\u0711\u0001\u0000\u0000"+ - "\u0000\u0713\u015f\u0001\u0000\u0000\u0000\u0714\u0715\u0005V\u0000\u0000"+ - "\u0715\u071b\u0005j\u0000\u0000\u0716\u0717\u0003\u0162\u00b1\u0000\u0717"+ - "\u0718\u0003\u0172\u00b9\u0000\u0718\u071a\u0001\u0000\u0000\u0000\u0719"+ - "\u0716\u0001\u0000\u0000\u0000\u071a\u071d\u0001\u0000\u0000\u0000\u071b"+ - "\u0719\u0001\u0000\u0000\u0000\u071b\u071c\u0001\u0000\u0000\u0000\u071c"+ - "\u071e\u0001\u0000\u0000\u0000\u071d\u071b\u0001\u0000\u0000\u0000\u071e"+ - "\u071f\u0005k\u0000\u0000\u071f\u0161\u0001\u0000\u0000\u0000\u0720\u0721"+ - "\u0003\u00e6s\u0000\u0721\u0722\u0003\u00c4b\u0000\u0722\u0725\u0001\u0000"+ - "\u0000\u0000\u0723\u0725\u0003\u0166\u00b3\u0000\u0724\u0720\u0001\u0000"+ - "\u0000\u0000\u0724\u0723\u0001\u0000\u0000\u0000\u0725\u0727\u0001\u0000"+ - "\u0000\u0000\u0726\u0728\u0003\u0164\u00b2\u0000\u0727\u0726\u0001\u0000"+ - "\u0000\u0000\u0727\u0728\u0001\u0000\u0000\u0000\u0728\u0163\u0001\u0000"+ - "\u0000\u0000\u0729\u072a\u0007\u0012\u0000\u0000\u072a\u0165\u0001\u0000"+ - "\u0000\u0000\u072b\u072d\u0005\u0089\u0000\u0000\u072c\u072b\u0001\u0000"+ - "\u0000\u0000\u072c\u072d\u0001\u0000\u0000\u0000\u072d\u072e\u0001\u0000"+ - "\u0000\u0000\u072e\u072f\u0003\u012e\u0097\u0000\u072f\u0167\u0001\u0000"+ - "\u0000\u0000\u0730\u0731\u0005l\u0000\u0000\u0731\u0732\u0003\u00a6S\u0000"+ - "\u0732\u0733\u0005m\u0000\u0000\u0733\u0169\u0001\u0000\u0000\u0000\u0734"+ - "\u0735\u0005r\u0000\u0000\u0735\u0736\u0005h\u0000\u0000\u0736\u0737\u0003"+ - "\u00c4b\u0000\u0737\u0738\u0005i\u0000\u0000\u0738\u016b\u0001\u0000\u0000"+ - "\u0000\u0739\u0748\u0005h\u0000\u0000\u073a\u0741\u0003\u00e8t\u0000\u073b"+ - "\u073e\u0003\u0148\u00a4\u0000\u073c\u073d\u0005o\u0000\u0000\u073d\u073f"+ - "\u0003\u00e8t\u0000\u073e\u073c\u0001\u0000\u0000\u0000\u073e\u073f\u0001"+ - "\u0000\u0000\u0000\u073f\u0741\u0001\u0000\u0000\u0000\u0740\u073a\u0001"+ - "\u0000\u0000\u0000\u0740\u073b\u0001\u0000\u0000\u0000\u0741\u0743\u0001"+ - "\u0000\u0000\u0000\u0742\u0744\u0005v\u0000\u0000\u0743\u0742\u0001\u0000"+ - "\u0000\u0000\u0743\u0744\u0001\u0000\u0000\u0000\u0744\u0746\u0001\u0000"+ - "\u0000\u0000\u0745\u0747\u0005o\u0000\u0000\u0746\u0745\u0001\u0000\u0000"+ - "\u0000\u0746\u0747\u0001\u0000\u0000\u0000\u0747\u0749\u0001\u0000\u0000"+ - "\u0000\u0748\u0740\u0001\u0000\u0000\u0000\u0748\u0749\u0001\u0000\u0000"+ - "\u0000\u0749\u074a\u0001\u0000\u0000\u0000\u074a\u074b\u0005i\u0000\u0000"+ - "\u074b\u016d\u0001\u0000\u0000\u0000\u074c\u074d\u0003\u0148\u00a4\u0000"+ - "\u074d\u074e\u0005r\u0000\u0000\u074e\u074f\u0005g\u0000\u0000\u074f\u016f"+ - "\u0001\u0000\u0000\u0000\u0750\u0751\u0003\u00c4b\u0000\u0751\u0171\u0001"+ - "\u0000\u0000\u0000\u0752\u0757\u0005p\u0000\u0000\u0753\u0757\u0005\u0000"+ - "\u0000\u0001\u0754\u0757\u0005\u00a1\u0000\u0000\u0755\u0757\u0004\u00b9"+ - "\u0013\u0000\u0756\u0752\u0001\u0000\u0000\u0000\u0756\u0753\u0001\u0000"+ - "\u0000\u0000\u0756\u0754\u0001\u0000\u0000\u0000\u0756\u0755\u0001\u0000"+ - "\u0000\u0000\u0757\u0173\u0001\u0000\u0000\u0000\u00c2\u0182\u0187\u018e"+ - "\u0198\u019e\u01a4\u01ae\u01b8\u01c6\u01ca\u01d3\u01df\u01e3\u01e9\u01f2"+ - "\u01fc\u020d\u021b\u021f\u0226\u022e\u0237\u0257\u025f\u0277\u028a\u0299"+ - "\u02a6\u02af\u02bd\u02c6\u02d2\u02d8\u02ec\u02f5\u02fa\u02ff\u0309\u030c"+ - "\u0310\u0314\u031c\u0324\u0329\u0331\u0333\u0338\u033f\u0347\u034a\u0350"+ - "\u0355\u0357\u035a\u0361\u0366\u0379\u0381\u0385\u0388\u038e\u0392\u0395"+ - "\u039f\u03a6\u03ad\u03b9\u03bf\u03c6\u03cb\u03d1\u03dd\u03e3\u03e7\u03ef"+ - "\u03f3\u03f9\u03fc\u0402\u0407\u0420\u0443\u0445\u045c\u0464\u046f\u0476"+ - "\u047d\u0487\u0499\u04af\u04b1\u04b9\u04bd\u04c1\u04c4\u04cd\u04d3\u04dd"+ - "\u04e5\u04eb\u04f4\u04ff\u050a\u050e\u0510\u051b\u0524\u0528\u052b\u0532"+ - "\u053d\u0547\u054d\u054f\u0559\u0563\u0567\u056b\u056f\u0576\u057e\u0589"+ - "\u058d\u0591\u059d\u05a1\u05a5\u05aa\u05ad\u05b0\u05b7\u05be\u05d2\u05d6"+ - "\u05da\u05de\u05ee\u05f4\u05f6\u05fa\u05fe\u0601\u0605\u0607\u060d\u0615"+ - "\u061a\u0625\u062b\u0632\u063d\u0642\u0646\u064b\u064f\u0657\u065f\u0664"+ - "\u0667\u066f\u0675\u0679\u067b\u0680\u0684\u0688\u068f\u06ac\u06b7\u06bb"+ - "\u06c3\u06c7\u06c9\u06d1\u06da\u06e2\u06e7\u06f7\u06f9\u0702\u0708\u070e"+ - "\u0712\u071b\u0724\u0727\u072c\u073e\u0740\u0743\u0746\u0748\u0756"; + "\u0010\u0001\u0010\u0003\u0010\u0218\b\u0010\u0001\u0011\u0001\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0005\u0013\u0224\b\u0013\n\u0013\f\u0013\u0227\t\u0013"+ + "\u0001\u0013\u0003\u0013\u022a\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0005\u0014\u022f\b\u0014\n\u0014\f\u0014\u0232\t\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0015\u0005\u0015\u0237\b\u0015\n\u0015\f\u0015\u023a\t\u0015"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0240\b\u0016"+ + "\n\u0016\f\u0016\u0243\t\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ + "\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0003\u001c\u0262\b\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0003\u001d\u026a\b\u001d\u0001"+ + "\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!"+ + "\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0003\"\u0282\b\"\u0001"+ + "\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001"+ + "$\u0001$\u0001$\u0001$\u0001$\u0005$\u0293\b$\n$\f$\u0296\t$\u0001$\u0001"+ + "$\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0005&\u02a2"+ + "\b&\n&\f&\u02a5\t&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "(\u0001(\u0001(\u0001(\u0003(\u02b1\b(\u0001)\u0001)\u0001)\u0001)\u0001"+ + ")\u0005)\u02b8\b)\n)\f)\u02bb\t)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0003*\u02c8\b*\u0001+\u0001+\u0001"+ + "+\u0001+\u0001+\u0005+\u02cf\b+\n+\f+\u02d2\t+\u0001+\u0001+\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0005,\u02db\b,\n,\f,\u02de\t,\u0001,\u0001,\u0001"+ + "-\u0003-\u02e3\b-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0003/\u02f7\b/\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u0003"+ + "0\u0300\b0\u00010\u00050\u0303\b0\n0\f0\u0306\t0\u00010\u00010\u00030"+ + "\u030a\b0\u00010\u00030\u030d\b0\u00011\u00041\u0310\b1\u000b1\f1\u0311"+ + "\u00012\u00012\u00012\u00052\u0317\b2\n2\f2\u031a\t2\u00013\u00013\u0001"+ + "3\u00033\u031f\b3\u00013\u00013\u00014\u00014\u00014\u00054\u0326\b4\n"+ + "4\f4\u0329\t4\u00015\u00015\u00015\u00035\u032e\b5\u00015\u00015\u0001"+ + "5\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00036\u033b"+ + "\b6\u00017\u00037\u033e\b7\u00017\u00017\u00037\u0342\b7\u00018\u0001"+ + "8\u00038\u0346\b8\u00019\u00019\u00019\u00019\u00059\u034c\b9\n9\f9\u034f"+ + "\t9\u00019\u00019\u0001:\u0001:\u0001:\u0003:\u0356\b:\u0001;\u0001;\u0001"+ + ";\u0003;\u035b\b;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001<\u0003<\u0363"+ + "\b<\u0003<\u0365\b<\u0001<\u0001<\u0001<\u0003<\u036a\b<\u0001=\u0001"+ + "=\u0001=\u0005=\u036f\b=\n=\f=\u0372\t=\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0003>\u0379\b>\u0001>\u0003>\u037c\b>\u0001>\u0001>\u0001?\u0001?\u0003"+ + "?\u0382\b?\u0001?\u0001?\u0001?\u0003?\u0387\b?\u0003?\u0389\b?\u0001"+ + "?\u0003?\u038c\b?\u0001@\u0001@\u0001@\u0005@\u0391\b@\n@\f@\u0394\t@"+ + "\u0001A\u0001A\u0003A\u0398\bA\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0005"+ + "C\u03a9\bC\nC\fC\u03ac\tC\u0001C\u0001C\u0001C\u0005C\u03b1\bC\nC\fC\u03b4"+ + "\tC\u0001C\u0003C\u03b7\bC\u0001D\u0003D\u03ba\bD\u0001D\u0001D\u0001"+ + "D\u0001D\u0003D\u03c0\bD\u0001E\u0001E\u0003E\u03c4\bE\u0001E\u0003E\u03c7"+ + "\bE\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0003F\u03d1"+ + "\bF\u0001G\u0001G\u0001G\u0001G\u0001G\u0003G\u03d8\bG\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0003H\u03df\bH\u0001H\u0001H\u0001I\u0001I\u0001I\u0001"+ + "I\u0001I\u0001J\u0001J\u0001J\u0003J\u03eb\bJ\u0001K\u0001K\u0001K\u0001"+ + "K\u0003K\u03f1\bK\u0001L\u0001L\u0001L\u0001L\u0001L\u0003L\u03f8\bL\u0001"+ + "M\u0001M\u0001M\u0003M\u03fd\bM\u0001N\u0001N\u0001N\u0001N\u0003N\u0403"+ + "\bN\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001"+ + "P\u0003P\u040f\bP\u0001Q\u0001Q\u0001Q\u0001Q\u0003Q\u0415\bQ\u0001Q\u0001"+ + "Q\u0003Q\u0419\bQ\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0003S\u0421"+ + "\bS\u0001S\u0001S\u0003S\u0425\bS\u0001S\u0001S\u0001T\u0001T\u0003T\u042b"+ + "\bT\u0001U\u0003U\u042e\bU\u0001U\u0001U\u0001V\u0001V\u0003V\u0434\b"+ + "V\u0001V\u0001V\u0001W\u0003W\u0439\bW\u0001W\u0001W\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0003X\u0452"+ + "\bX\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0005X\u0475\bX\nX\fX\u0478\tX\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0003Y\u048e\bY\u0001"+ + "Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0003[\u0496\b[\u0001\\\u0001\\\u0001"+ + "\\\u0001]\u0001]\u0001]\u0001]\u0005]\u049f\b]\n]\f]\u04a2\t]\u0001]\u0001"+ + "]\u0001]\u0001]\u0003]\u04a8\b]\u0001^\u0001^\u0001^\u0001^\u0001^\u0003"+ + "^\u04af\b^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0003"+ + "_\u04b9\b_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ + "`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0003`\u04cb\b`\u0001"+ + "`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ + "`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0005"+ + "`\u04e1\b`\n`\f`\u04e4\t`\u0001a\u0001a\u0001a\u0001b\u0001b\u0003b\u04eb"+ + "\bb\u0001b\u0001b\u0003b\u04ef\bb\u0001c\u0001c\u0003c\u04f3\bc\u0001"+ + "c\u0003c\u04f6\bc\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001d\u0003"+ + "d\u04ff\bd\u0001d\u0001d\u0005d\u0503\bd\nd\fd\u0506\td\u0001d\u0001d"+ + "\u0001e\u0001e\u0001e\u0001e\u0001f\u0003f\u050f\bf\u0001f\u0001f\u0001"+ + "f\u0001f\u0001f\u0001f\u0003f\u0517\bf\u0001f\u0001f\u0001f\u0001f\u0003"+ + "f\u051d\bf\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0003g\u0526"+ + "\bg\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003"+ + "h\u0531\bh\u0001i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0005j\u053a"+ + "\bj\nj\fj\u053d\tj\u0001j\u0003j\u0540\bj\u0003j\u0542\bj\u0001j\u0001"+ + "j\u0001k\u0001k\u0001k\u0001k\u0001k\u0001k\u0001k\u0003k\u054d\bk\u0001"+ + "l\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0003m\u0556\bm\u0001m\u0001"+ + "m\u0003m\u055a\bm\u0001m\u0003m\u055d\bm\u0001m\u0001m\u0001m\u0001m\u0001"+ + "m\u0003m\u0564\bm\u0001m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001p\u0001"+ + "p\u0001q\u0003q\u056f\bq\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001"+ + "r\u0001r\u0003r\u0579\br\u0001r\u0001r\u0001r\u0001r\u0003r\u057f\br\u0003"+ + "r\u0581\br\u0001s\u0001s\u0001s\u0001t\u0001t\u0001u\u0001u\u0001u\u0003"+ + "u\u058b\bu\u0001v\u0001v\u0001v\u0001v\u0001v\u0001v\u0005v\u0593\bv\n"+ + "v\fv\u0596\tv\u0001v\u0003v\u0599\bv\u0001w\u0001w\u0003w\u059d\bw\u0001"+ + "w\u0001w\u0003w\u05a1\bw\u0001x\u0001x\u0001x\u0005x\u05a6\bx\nx\fx\u05a9"+ + "\tx\u0001y\u0001y\u0001y\u0005y\u05ae\by\ny\fy\u05b1\ty\u0001z\u0001z"+ + "\u0001z\u0001z\u0001z\u0001z\u0005z\u05b9\bz\nz\fz\u05bc\tz\u0001z\u0003"+ + "z\u05bf\bz\u0001{\u0001{\u0003{\u05c3\b{\u0001{\u0001{\u0001|\u0001|\u0001"+ + "|\u0001|\u0001|\u0001|\u0005|\u05cd\b|\n|\f|\u05d0\t|\u0001|\u0003|\u05d3"+ + "\b|\u0001}\u0001}\u0003}\u05d7\b}\u0001}\u0001}\u0001~\u0003~\u05dc\b"+ + "~\u0001~\u0003~\u05df\b~\u0001~\u0003~\u05e2\b~\u0001~\u0001~\u0001~\u0004"+ + "~\u05e7\b~\u000b~\f~\u05e8\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f"+ + "\u0001\u007f\u0003\u007f\u05f0\b\u007f\u0001\u0080\u0001\u0080\u0001\u0081"+ + "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082"+ + "\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084"+ + "\u0001\u0085\u0001\u0085\u0001\u0085\u0003\u0085\u0604\b\u0085\u0001\u0086"+ + "\u0001\u0086\u0003\u0086\u0608\b\u0086\u0001\u0087\u0001\u0087\u0003\u0087"+ + "\u060c\b\u0087\u0001\u0088\u0001\u0088\u0003\u0088\u0610\b\u0088\u0001"+ + "\u0089\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008b\u0001"+ + "\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001"+ + "\u008b\u0001\u008b\u0003\u008b\u0620\b\u008b\u0001\u008b\u0001\u008b\u0001"+ + "\u008b\u0001\u008b\u0003\u008b\u0626\b\u008b\u0003\u008b\u0628\b\u008b"+ + "\u0001\u008c\u0001\u008c\u0003\u008c\u062c\b\u008c\u0001\u008d\u0001\u008d"+ + "\u0003\u008d\u0630\b\u008d\u0001\u008d\u0003\u008d\u0633\b\u008d\u0001"+ + "\u008d\u0001\u008d\u0003\u008d\u0637\b\u008d\u0003\u008d\u0639\b\u008d"+ + "\u0001\u008d\u0001\u008d\u0005\u008d\u063d\b\u008d\n\u008d\f\u008d\u0640"+ + "\t\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0003"+ + "\u008e\u0647\b\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0003\u008f\u064c"+ + "\b\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001"+ + "\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u0657\b\u0090\u0001"+ + "\u0090\u0001\u0090\u0005\u0090\u065b\b\u0090\n\u0090\f\u0090\u065e\t\u0090"+ + "\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0003\u0091\u0664\b\u0091"+ + "\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091"+ + "\u0001\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u066f\b\u0092\u0001\u0093"+ + "\u0001\u0093\u0001\u0093\u0003\u0093\u0674\b\u0093\u0001\u0094\u0001\u0094"+ + "\u0003\u0094\u0678\b\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0003\u0094"+ + "\u067d\b\u0094\u0005\u0094\u067f\b\u0094\n\u0094\f\u0094\u0682\t\u0094"+ + "\u0001\u0095\u0001\u0095\u0001\u0095\u0005\u0095\u0687\b\u0095\n\u0095"+ + "\f\u0095\u068a\t\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096"+ + "\u0001\u0096\u0003\u0096\u0691\b\u0096\u0001\u0097\u0001\u0097\u0001\u0097"+ + "\u0003\u0097\u0696\b\u0097\u0001\u0097\u0003\u0097\u0699\b\u0097\u0001"+ + "\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0003"+ + "\u0098\u06a1\b\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0003"+ + "\u0099\u06a7\b\u0099\u0001\u0099\u0001\u0099\u0003\u0099\u06ab\b\u0099"+ + "\u0003\u0099\u06ad\b\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0003\u009a"+ + "\u06b2\b\u009a\u0001\u009a\u0001\u009a\u0003\u009a\u06b6\b\u009a\u0001"+ + "\u009a\u0001\u009a\u0003\u009a\u06ba\b\u009a\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0001\u009c\u0001\u009c\u0003\u009c\u06c1\b\u009c\u0001\u009d\u0001"+ + "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001"+ + "\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001"+ + "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ + "\u00a3\u0001\u00a3\u0003\u00a3\u06de\b\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ + "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001"+ + "\u00a5\u0003\u00a5\u06e9\b\u00a5\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06ed"+ + "\b\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0005\u00a7\u06f3"+ + "\b\u00a7\n\u00a7\f\u00a7\u06f6\t\u00a7\u0001\u00a7\u0003\u00a7\u06f9\b"+ + "\u00a7\u0003\u00a7\u06fb\b\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001"+ + "\u00a8\u0001\u00a8\u0001\u00a8\u0003\u00a8\u0703\b\u00a8\u0001\u00a8\u0001"+ + "\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0003"+ + "\u00a9\u070c\b\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001"+ + "\u00aa\u0001\u00aa\u0003\u00aa\u0714\b\u00aa\u0001\u00ab\u0001\u00ab\u0001"+ + "\u00ab\u0003\u00ab\u0719\b\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001"+ + "\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001"+ + "\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0003\u00b0\u0729"+ + "\b\u00b0\u0003\u00b0\u072b\b\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1"+ + "\u0001\u00b1\u0001\u00b1\u0005\u00b1\u0732\b\u00b1\n\u00b1\f\u00b1\u0735"+ + "\t\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0003\u00b2\u073a\b\u00b2"+ + "\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0003\u00b3\u0740\b\u00b3"+ + "\u0001\u00b4\u0001\u00b4\u0003\u00b4\u0744\b\u00b4\u0001\u00b5\u0001\u00b5"+ + "\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0005\u00b5\u074b\b\u00b5\n\u00b5"+ + "\f\u00b5\u074e\t\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6"+ + "\u0001\u00b6\u0001\u00b6\u0003\u00b6\u0756\b\u00b6\u0001\u00b6\u0003\u00b6"+ + "\u0759\b\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0003\u00b8\u075e\b"+ + "\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001"+ + "\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001"+ + "\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0003\u00bb\u0770"+ + "\b\u00bb\u0003\u00bb\u0772\b\u00bb\u0001\u00bb\u0003\u00bb\u0775\b\u00bb"+ + "\u0001\u00bb\u0003\u00bb\u0778\b\u00bb\u0003\u00bb\u077a\b\u00bb\u0001"+ + "\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001"+ + "\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0003"+ + "\u00be\u0788\b\u00be\u0001\u00be\u0001\u0304\u0002\u00b0\u00c0\u00bf\u0000"+ + "\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c"+ + "\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084"+ + "\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c"+ + "\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4"+ + "\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc"+ + "\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4"+ + "\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc"+ + "\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114"+ + "\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c"+ + "\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144"+ + "\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c"+ + "\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174"+ + "\u0176\u0178\u017a\u017c\u0000\u0014\u0002\u0000hhss\u0001\u0000\u0017"+ + "\u0018\u0001\u0000\u0005\b\u0001\u0000AB\u0001\u0000(*\u0002\u0000(*,"+ + ",\u0002\u0000ijpp\u0001\u0000\u0086\u008c\u0001\u0000\u0014\u0015\u0002"+ + "\u0000\u0081\u0085\u008a\u008b\u0004\u0000##tt\u0080\u0080\u0087\u0089"+ + "\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000HIz\u007f\u0004"+ + "\u0000--0033``\u0002\u0000\u0080\u0085\u0087\u008b\u0001\u0000tu\u0002"+ + "\u0000qq\u00a2\u00a2\u0002\u0000\u008d\u0090\u0092\u0093\u0001\u0000\u0099"+ + "\u009a\u07f6\u0000\u017e\u0001\u0000\u0000\u0000\u0002\u0181\u0001\u0000"+ + "\u0000\u0000\u0004\u0184\u0001\u0000\u0000\u0000\u0006\u0187\u0001\u0000"+ + "\u0000\u0000\b\u018f\u0001\u0000\u0000\u0000\n\u0198\u0001\u0000\u0000"+ + "\u0000\f\u01b8\u0001\u0000\u0000\u0000\u000e\u01c5\u0001\u0000\u0000\u0000"+ + "\u0010\u01c8\u0001\u0000\u0000\u0000\u0012\u01d0\u0001\u0000\u0000\u0000"+ + "\u0014\u01dd\u0001\u0000\u0000\u0000\u0016\u01f3\u0001\u0000\u0000\u0000"+ + "\u0018\u01fc\u0001\u0000\u0000\u0000\u001a\u01fe\u0001\u0000\u0000\u0000"+ + "\u001c\u0200\u0001\u0000\u0000\u0000\u001e\u0203\u0001\u0000\u0000\u0000"+ + " \u0217\u0001\u0000\u0000\u0000\"\u0219\u0001\u0000\u0000\u0000$\u021b"+ + "\u0001\u0000\u0000\u0000&\u0220\u0001\u0000\u0000\u0000(\u022b\u0001\u0000"+ + "\u0000\u0000*\u0238\u0001\u0000\u0000\u0000,\u023b\u0001\u0000\u0000\u0000"+ + ".\u0246\u0001\u0000\u0000\u00000\u0248\u0001\u0000\u0000\u00002\u024d"+ + "\u0001\u0000\u0000\u00004\u0252\u0001\u0000\u0000\u00006\u0257\u0001\u0000"+ + "\u0000\u00008\u025c\u0001\u0000\u0000\u0000:\u0269\u0001\u0000\u0000\u0000"+ + "<\u026b\u0001\u0000\u0000\u0000>\u026d\u0001\u0000\u0000\u0000@\u0272"+ + "\u0001\u0000\u0000\u0000B\u0277\u0001\u0000\u0000\u0000D\u027c\u0001\u0000"+ + "\u0000\u0000F\u0285\u0001\u0000\u0000\u0000H\u028c\u0001\u0000\u0000\u0000"+ + "J\u0299\u0001\u0000\u0000\u0000L\u029d\u0001\u0000\u0000\u0000N\u02a8"+ + "\u0001\u0000\u0000\u0000P\u02b0\u0001\u0000\u0000\u0000R\u02b2\u0001\u0000"+ + "\u0000\u0000T\u02c7\u0001\u0000\u0000\u0000V\u02c9\u0001\u0000\u0000\u0000"+ + "X\u02d5\u0001\u0000\u0000\u0000Z\u02e2\u0001\u0000\u0000\u0000\\\u02e6"+ + "\u0001\u0000\u0000\u0000^\u02f6\u0001\u0000\u0000\u0000`\u0304\u0001\u0000"+ + "\u0000\u0000b\u030f\u0001\u0000\u0000\u0000d\u0313\u0001\u0000\u0000\u0000"+ + "f\u031b\u0001\u0000\u0000\u0000h\u0322\u0001\u0000\u0000\u0000j\u032a"+ + "\u0001\u0000\u0000\u0000l\u033a\u0001\u0000\u0000\u0000n\u033d\u0001\u0000"+ + "\u0000\u0000p\u0345\u0001\u0000\u0000\u0000r\u0347\u0001\u0000\u0000\u0000"+ + "t\u0352\u0001\u0000\u0000\u0000v\u035a\u0001\u0000\u0000\u0000x\u0369"+ + "\u0001\u0000\u0000\u0000z\u036b\u0001\u0000\u0000\u0000|\u0373\u0001\u0000"+ + "\u0000\u0000~\u0381\u0001\u0000\u0000\u0000\u0080\u038d\u0001\u0000\u0000"+ + "\u0000\u0082\u0397\u0001\u0000\u0000\u0000\u0084\u039b\u0001\u0000\u0000"+ + "\u0000\u0086\u03a1\u0001\u0000\u0000\u0000\u0088\u03b9\u0001\u0000\u0000"+ + "\u0000\u008a\u03c1\u0001\u0000\u0000\u0000\u008c\u03d0\u0001\u0000\u0000"+ + "\u0000\u008e\u03d2\u0001\u0000\u0000\u0000\u0090\u03d9\u0001\u0000\u0000"+ + "\u0000\u0092\u03e2\u0001\u0000\u0000\u0000\u0094\u03e7\u0001\u0000\u0000"+ + "\u0000\u0096\u03ec\u0001\u0000\u0000\u0000\u0098\u03f2\u0001\u0000\u0000"+ + "\u0000\u009a\u03f9\u0001\u0000\u0000\u0000\u009c\u03fe\u0001\u0000\u0000"+ + "\u0000\u009e\u0404\u0001\u0000\u0000\u0000\u00a0\u0409\u0001\u0000\u0000"+ + "\u0000\u00a2\u0410\u0001\u0000\u0000\u0000\u00a4\u041a\u0001\u0000\u0000"+ + "\u0000\u00a6\u041e\u0001\u0000\u0000\u0000\u00a8\u042a\u0001\u0000\u0000"+ + "\u0000\u00aa\u042d\u0001\u0000\u0000\u0000\u00ac\u0431\u0001\u0000\u0000"+ + "\u0000\u00ae\u0438\u0001\u0000\u0000\u0000\u00b0\u0451\u0001\u0000\u0000"+ + "\u0000\u00b2\u048d\u0001\u0000\u0000\u0000\u00b4\u048f\u0001\u0000\u0000"+ + "\u0000\u00b6\u0492\u0001\u0000\u0000\u0000\u00b8\u0497\u0001\u0000\u0000"+ + "\u0000\u00ba\u04a0\u0001\u0000\u0000\u0000\u00bc\u04ae\u0001\u0000\u0000"+ + "\u0000\u00be\u04b8\u0001\u0000\u0000\u0000\u00c0\u04ca\u0001\u0000\u0000"+ + "\u0000\u00c2\u04e5\u0001\u0000\u0000\u0000\u00c4\u04e8\u0001\u0000\u0000"+ + "\u0000\u00c6\u04f0\u0001\u0000\u0000\u0000\u00c8\u04f9\u0001\u0000\u0000"+ + "\u0000\u00ca\u0509\u0001\u0000\u0000\u0000\u00cc\u051c\u0001\u0000\u0000"+ + "\u0000\u00ce\u0525\u0001\u0000\u0000\u0000\u00d0\u0530\u0001\u0000\u0000"+ + "\u0000\u00d2\u0532\u0001\u0000\u0000\u0000\u00d4\u0535\u0001\u0000\u0000"+ + "\u0000\u00d6\u054c\u0001\u0000\u0000\u0000\u00d8\u054e\u0001\u0000\u0000"+ + "\u0000\u00da\u0553\u0001\u0000\u0000\u0000\u00dc\u0567\u0001\u0000\u0000"+ + "\u0000\u00de\u0569\u0001\u0000\u0000\u0000\u00e0\u056b\u0001\u0000\u0000"+ + "\u0000\u00e2\u056e\u0001\u0000\u0000\u0000\u00e4\u0578\u0001\u0000\u0000"+ + "\u0000\u00e6\u0582\u0001\u0000\u0000\u0000\u00e8\u0585\u0001\u0000\u0000"+ + "\u0000\u00ea\u058a\u0001\u0000\u0000\u0000\u00ec\u058c\u0001\u0000\u0000"+ + "\u0000\u00ee\u059a\u0001\u0000\u0000\u0000\u00f0\u05a2\u0001\u0000\u0000"+ + "\u0000\u00f2\u05aa\u0001\u0000\u0000\u0000\u00f4\u05b2\u0001\u0000\u0000"+ + "\u0000\u00f6\u05c0\u0001\u0000\u0000\u0000\u00f8\u05c6\u0001\u0000\u0000"+ + "\u0000\u00fa\u05d4\u0001\u0000\u0000\u0000\u00fc\u05e6\u0001\u0000\u0000"+ + "\u0000\u00fe\u05ef\u0001\u0000\u0000\u0000\u0100\u05f1\u0001\u0000\u0000"+ + "\u0000\u0102\u05f3\u0001\u0000\u0000\u0000\u0104\u05f7\u0001\u0000\u0000"+ + "\u0000\u0106\u05fa\u0001\u0000\u0000\u0000\u0108\u05fe\u0001\u0000\u0000"+ + "\u0000\u010a\u0600\u0001\u0000\u0000\u0000\u010c\u0605\u0001\u0000\u0000"+ + "\u0000\u010e\u0609\u0001\u0000\u0000\u0000\u0110\u060d\u0001\u0000\u0000"+ + "\u0000\u0112\u0611\u0001\u0000\u0000\u0000\u0114\u0614\u0001\u0000\u0000"+ + "\u0000\u0116\u0616\u0001\u0000\u0000\u0000\u0118\u062b\u0001\u0000\u0000"+ + "\u0000\u011a\u062d\u0001\u0000\u0000\u0000\u011c\u0643\u0001\u0000\u0000"+ + "\u0000\u011e\u064b\u0001\u0000\u0000\u0000\u0120\u064d\u0001\u0000\u0000"+ + "\u0000\u0122\u0663\u0001\u0000\u0000\u0000\u0124\u066b\u0001\u0000\u0000"+ + "\u0000\u0126\u0673\u0001\u0000\u0000\u0000\u0128\u0677\u0001\u0000\u0000"+ + "\u0000\u012a\u0683\u0001\u0000\u0000\u0000\u012c\u068d\u0001\u0000\u0000"+ + "\u0000\u012e\u0698\u0001\u0000\u0000\u0000\u0130\u06a0\u0001\u0000\u0000"+ + "\u0000\u0132\u06a4\u0001\u0000\u0000\u0000\u0134\u06b1\u0001\u0000\u0000"+ + "\u0000\u0136\u06bb\u0001\u0000\u0000\u0000\u0138\u06c0\u0001\u0000\u0000"+ + "\u0000\u013a\u06c2\u0001\u0000\u0000\u0000\u013c\u06c7\u0001\u0000\u0000"+ + "\u0000\u013e\u06c9\u0001\u0000\u0000\u0000\u0140\u06cb\u0001\u0000\u0000"+ + "\u0000\u0142\u06ce\u0001\u0000\u0000\u0000\u0144\u06d2\u0001\u0000\u0000"+ + "\u0000\u0146\u06dd\u0001\u0000\u0000\u0000\u0148\u06e1\u0001\u0000\u0000"+ + "\u0000\u014a\u06e8\u0001\u0000\u0000\u0000\u014c\u06ec\u0001\u0000\u0000"+ + "\u0000\u014e\u06ee\u0001\u0000\u0000\u0000\u0150\u06fe\u0001\u0000\u0000"+ + "\u0000\u0152\u070b\u0001\u0000\u0000\u0000\u0154\u0713\u0001\u0000\u0000"+ + "\u0000\u0156\u0718\u0001\u0000\u0000\u0000\u0158\u071a\u0001\u0000\u0000"+ + "\u0000\u015a\u071c\u0001\u0000\u0000\u0000\u015c\u071e\u0001\u0000\u0000"+ + "\u0000\u015e\u0722\u0001\u0000\u0000\u0000\u0160\u0725\u0001\u0000\u0000"+ + "\u0000\u0162\u072e\u0001\u0000\u0000\u0000\u0164\u0739\u0001\u0000\u0000"+ + "\u0000\u0166\u073f\u0001\u0000\u0000\u0000\u0168\u0743\u0001\u0000\u0000"+ + "\u0000\u016a\u0745\u0001\u0000\u0000\u0000\u016c\u0755\u0001\u0000\u0000"+ + "\u0000\u016e\u075a\u0001\u0000\u0000\u0000\u0170\u075d\u0001\u0000\u0000"+ + "\u0000\u0172\u0761\u0001\u0000\u0000\u0000\u0174\u0765\u0001\u0000\u0000"+ + "\u0000\u0176\u076a\u0001\u0000\u0000\u0000\u0178\u077d\u0001\u0000\u0000"+ + "\u0000\u017a\u0781\u0001\u0000\u0000\u0000\u017c\u0787\u0001\u0000\u0000"+ + "\u0000\u017e\u017f\u0003\u00b0X\u0000\u017f\u0180\u0005\u0000\u0000\u0001"+ + "\u0180\u0001\u0001\u0000\u0000\u0000\u0181\u0182\u0003\u00b2Y\u0000\u0182"+ + "\u0183\u0005\u0000\u0000\u0001\u0183\u0003\u0001\u0000\u0000\u0000\u0184"+ + "\u0185\u0003\u00ceg\u0000\u0185\u0186\u0005\u0000\u0000\u0001\u0186\u0005"+ + "\u0001\u0000\u0000\u0000\u0187\u018c\u0003\b\u0004\u0000\u0188\u0189\u0005"+ + "p\u0000\u0000\u0189\u018b\u0003\b\u0004\u0000\u018a\u0188\u0001\u0000"+ + "\u0000\u0000\u018b\u018e\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000"+ + "\u0000\u0000\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u0007\u0001\u0000"+ + "\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018f\u0191\u0005h\u0000"+ + "\u0000\u0190\u0192\u0005<\u0000\u0000\u0191\u0190\u0001\u0000\u0000\u0000"+ + "\u0191\u0192\u0001\u0000\u0000\u0000\u0192\t\u0001\u0000\u0000\u0000\u0193"+ + "\u0194\u0003\u000e\u0007\u0000\u0194\u0195\u0003\u017c\u00be\u0000\u0195"+ + "\u0197\u0001\u0000\u0000\u0000\u0196\u0193\u0001\u0000\u0000\u0000\u0197"+ + "\u019a\u0001\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0198"+ + "\u0199\u0001\u0000\u0000\u0000\u0199\u019b\u0001\u0000\u0000\u0000\u019a"+ + "\u0198\u0001\u0000\u0000\u0000\u019b\u019c\u0003\u00e6s\u0000\u019c\u01a2"+ + "\u0003\u017c\u00be\u0000\u019d\u019e\u0003\u0014\n\u0000\u019e\u019f\u0003"+ + "\u017c\u00be\u0000\u019f\u01a1\u0001\u0000\u0000\u0000\u01a0\u019d\u0001"+ + "\u0000\u0000\u0000\u01a1\u01a4\u0001\u0000\u0000\u0000\u01a2\u01a0\u0001"+ + "\u0000\u0000\u0000\u01a2\u01a3\u0001\u0000\u0000\u0000\u01a3\u01ae\u0001"+ + "\u0000\u0000\u0000\u01a4\u01a2\u0001\u0000\u0000\u0000\u01a5\u01a9\u0003"+ + "\u0094J\u0000\u01a6\u01a9\u0003\u00eau\u0000\u01a7\u01a9\u0003\u0016\u000b"+ + "\u0000\u01a8\u01a5\u0001\u0000\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000"+ + "\u0000\u01a8\u01a7\u0001\u0000\u0000\u0000\u01a9\u01aa\u0001\u0000\u0000"+ + "\u0000\u01aa\u01ab\u0003\u017c\u00be\u0000\u01ab\u01ad\u0001\u0000\u0000"+ + "\u0000\u01ac\u01a8\u0001\u0000\u0000\u0000\u01ad\u01b0\u0001\u0000\u0000"+ + "\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01ae\u01af\u0001\u0000\u0000"+ + "\u0000\u01af\u01b1\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000"+ + "\u0000\u01b1\u01b2\u0005\u0000\u0000\u0001\u01b2\u000b\u0001\u0000\u0000"+ + "\u0000\u01b3\u01b4\u0003\u000e\u0007\u0000\u01b4\u01b5\u0003\u017c\u00be"+ + "\u0000\u01b5\u01b7\u0001\u0000\u0000\u0000\u01b6\u01b3\u0001\u0000\u0000"+ + "\u0000\u01b7\u01ba\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000"+ + "\u0000\u01b8\u01b9\u0001\u0000\u0000\u0000\u01b9\u01bb\u0001\u0000\u0000"+ + "\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01bb\u01bc\u0003\u00e6s\u0000"+ + "\u01bc\u01c2\u0003\u017c\u00be\u0000\u01bd\u01be\u0003\u0014\n\u0000\u01be"+ + "\u01bf\u0003\u017c\u00be\u0000\u01bf\u01c1\u0001\u0000\u0000\u0000\u01c0"+ + "\u01bd\u0001\u0000\u0000\u0000\u01c1\u01c4\u0001\u0000\u0000\u0000\u01c2"+ + "\u01c0\u0001\u0000\u0000\u0000\u01c2\u01c3\u0001\u0000\u0000\u0000\u01c3"+ + "\r\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c5\u01c6"+ + "\u0005E\u0000\u0000\u01c6\u01c7\u0003\u00b0X\u0000\u01c7\u000f\u0001\u0000"+ + "\u0000\u0000\u01c8\u01c9\u0005F\u0000\u0000\u01c9\u01ca\u0003\u00b0X\u0000"+ + "\u01ca\u0011\u0001\u0000\u0000\u0000\u01cb\u01cc\u0003\u0010\b\u0000\u01cc"+ + "\u01cd\u0003\u017c\u00be\u0000\u01cd\u01cf\u0001\u0000\u0000\u0000\u01ce"+ + "\u01cb\u0001\u0000\u0000\u0000\u01cf\u01d2\u0001\u0000\u0000\u0000\u01d0"+ + "\u01ce\u0001\u0000\u0000\u0000\u01d0\u01d1\u0001\u0000\u0000\u0000\u01d1"+ + "\u01d4\u0001\u0000\u0000\u0000\u01d2\u01d0\u0001\u0000\u0000\u0000\u01d3"+ + "\u01d5\u0007\u0000\u0000\u0000\u01d4\u01d3\u0001\u0000\u0000\u0000\u01d4"+ + "\u01d5\u0001\u0000\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6"+ + "\u01d7\u0003\u00e8t\u0000\u01d7\u0013\u0001\u0000\u0000\u0000\u01d8\u01d9"+ + "\u0003\u0010\b\u0000\u01d9\u01da\u0003\u017c\u00be\u0000\u01da\u01dc\u0001"+ + "\u0000\u0000\u0000\u01db\u01d8\u0001\u0000\u0000\u0000\u01dc\u01df\u0001"+ + "\u0000\u0000\u0000\u01dd\u01db\u0001\u0000\u0000\u0000\u01dd\u01de\u0001"+ + "\u0000\u0000\u0000\u01de\u01ed\u0001\u0000\u0000\u0000\u01df\u01dd\u0001"+ + "\u0000\u0000\u0000\u01e0\u01e1\u0005d\u0000\u0000\u01e1\u01ee\u0003\u0012"+ + "\t\u0000\u01e2\u01e3\u0005d\u0000\u0000\u01e3\u01e9\u0005i\u0000\u0000"+ + "\u01e4\u01e5\u0003\u0012\t\u0000\u01e5\u01e6\u0003\u017c\u00be\u0000\u01e6"+ + "\u01e8\u0001\u0000\u0000\u0000\u01e7\u01e4\u0001\u0000\u0000\u0000\u01e8"+ + "\u01eb\u0001\u0000\u0000\u0000\u01e9\u01e7\u0001\u0000\u0000\u0000\u01e9"+ + "\u01ea\u0001\u0000\u0000\u0000\u01ea\u01ec\u0001\u0000\u0000\u0000\u01eb"+ + "\u01e9\u0001\u0000\u0000\u0000\u01ec\u01ee\u0005j\u0000\u0000\u01ed\u01e0"+ + "\u0001\u0000\u0000\u0000\u01ed\u01e2\u0001\u0000\u0000\u0000\u01ee\u0015"+ + "\u0001\u0000\u0000\u0000\u01ef\u01f4\u0003\u0086C\u0000\u01f0\u01f4\u0003"+ + "\u009cN\u0000\u01f1\u01f4\u0003\u00a0P\u0000\u01f2\u01f4\u0003\u009aM"+ + "\u0000\u01f3\u01ef\u0001\u0000\u0000\u0000\u01f3\u01f0\u0001\u0000\u0000"+ + "\u0000\u01f3\u01f1\u0001\u0000\u0000\u0000\u01f3\u01f2\u0001\u0000\u0000"+ + "\u0000\u01f4\u0017\u0001\u0000\u0000\u0000\u01f5\u01f6\u0005\u001b\u0000"+ + "\u0000\u01f6\u01fd\u0003\u00b2Y\u0000\u01f7\u01f8\u0007\u0001\u0000\u0000"+ + "\u01f8\u01fd\u0003.\u0017\u0000\u01f9\u01fa\u0007\u0002\u0000\u0000\u01fa"+ + "\u01fd\u0003\u00b0X\u0000\u01fb\u01fd\u0003r9\u0000\u01fc\u01f5\u0001"+ + "\u0000\u0000\u0000\u01fc\u01f7\u0001\u0000\u0000\u0000\u01fc\u01f9\u0001"+ + "\u0000\u0000\u0000\u01fc\u01fb\u0001\u0000\u0000\u0000\u01fd\u0019\u0001"+ + "\u0000\u0000\u0000\u01fe\u01ff\u0003\u001c\u000e\u0000\u01ff\u001b\u0001"+ + "\u0000\u0000\u0000\u0200\u0201\u0003`0\u0000\u0201\u0202\u0003\u001e\u000f"+ + "\u0000\u0202\u001d\u0001\u0000\u0000\u0000\u0203\u0204\u0005D\u0000\u0000"+ + "\u0204\u0206\u0005i\u0000\u0000\u0205\u0207\u0003\u00fc~\u0000\u0206\u0205"+ + "\u0001\u0000\u0000\u0000\u0206\u0207\u0001\u0000\u0000\u0000\u0207\u0208"+ + "\u0001\u0000\u0000\u0000\u0208\u0209\u0005j\u0000\u0000\u0209\u001f\u0001"+ + "\u0000\u0000\u0000\u020a\u0218\u0003F#\u0000\u020b\u0218\u0003D\"\u0000"+ + "\u020c\u0218\u0003B!\u0000\u020d\u0218\u0003$\u0012\u0000\u020e\u0218"+ + "\u0003@ \u0000\u020f\u0218\u00038\u001c\u0000\u0210\u0218\u0003>\u001f"+ + "\u0000\u0211\u0218\u00036\u001b\u0000\u0212\u0218\u00032\u0019\u0000\u0213"+ + "\u0218\u00030\u0018\u0000\u0214\u0218\u00034\u001a\u0000\u0215\u0218\u0003"+ + "\"\u0011\u0000\u0216\u0218\u0003H$\u0000\u0217\u020a\u0001\u0000\u0000"+ + "\u0000\u0217\u020b\u0001\u0000\u0000\u0000\u0217\u020c\u0001\u0000\u0000"+ + "\u0000\u0217\u020d\u0001\u0000\u0000\u0000\u0217\u020e\u0001\u0000\u0000"+ + "\u0000\u0217\u020f\u0001\u0000\u0000\u0000\u0217\u0210\u0001\u0000\u0000"+ + "\u0000\u0217\u0211\u0001\u0000\u0000\u0000\u0217\u0212\u0001\u0000\u0000"+ + "\u0000\u0217\u0213\u0001\u0000\u0000\u0000\u0217\u0214\u0001\u0000\u0000"+ + "\u0000\u0217\u0215\u0001\u0000\u0000\u0000\u0217\u0216\u0001\u0000\u0000"+ + "\u0000\u0218!\u0001\u0000\u0000\u0000\u0219\u021a\u0007\u0003\u0000\u0000"+ + "\u021a#\u0001\u0000\u0000\u0000\u021b\u021c\u0005a\u0000\u0000\u021c\u021d"+ + "\u0005m\u0000\u0000\u021d\u021e\u0003\u00ceg\u0000\u021e\u021f\u0005n"+ + "\u0000\u0000\u021f%\u0001\u0000\u0000\u0000\u0220\u0225\u0003(\u0014\u0000"+ + "\u0221\u0222\u0005p\u0000\u0000\u0222\u0224\u0003(\u0014\u0000\u0223\u0221"+ + "\u0001\u0000\u0000\u0000\u0224\u0227\u0001\u0000\u0000\u0000\u0225\u0223"+ + "\u0001\u0000\u0000\u0000\u0225\u0226\u0001\u0000\u0000\u0000\u0226\u0229"+ + "\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0228\u022a"+ + "\u0005p\u0000\u0000\u0229\u0228\u0001\u0000\u0000\u0000\u0229\u022a\u0001"+ + "\u0000\u0000\u0000\u022a\'\u0001\u0000\u0000\u0000\u022b\u0230\u0005h"+ + "\u0000\u0000\u022c\u022d\u0005p\u0000\u0000\u022d\u022f\u0005h\u0000\u0000"+ + "\u022e\u022c\u0001\u0000\u0000\u0000\u022f\u0232\u0001\u0000\u0000\u0000"+ + "\u0230\u022e\u0001\u0000\u0000\u0000\u0230\u0231\u0001\u0000\u0000\u0000"+ + "\u0231\u0233\u0001\u0000\u0000\u0000\u0232\u0230\u0001\u0000\u0000\u0000"+ + "\u0233\u0234\u0003\u013e\u009f\u0000\u0234)\u0001\u0000\u0000\u0000\u0235"+ + "\u0237\u0003,\u0016\u0000\u0236\u0235\u0001\u0000\u0000\u0000\u0237\u023a"+ + "\u0001\u0000\u0000\u0000\u0238\u0236\u0001\u0000\u0000\u0000\u0238\u0239"+ + "\u0001\u0000\u0000\u0000\u0239+\u0001\u0000\u0000\u0000\u023a\u0238\u0001"+ + "\u0000\u0000\u0000\u023b\u023c\u0005k\u0000\u0000\u023c\u0241\u0003\u00b0"+ + "X\u0000\u023d\u023e\u0005p\u0000\u0000\u023e\u0240\u0003\u00b0X\u0000"+ + "\u023f\u023d\u0001\u0000\u0000\u0000\u0240\u0243\u0001\u0000\u0000\u0000"+ + "\u0241\u023f\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000\u0000"+ + "\u0242\u0244\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000"+ + "\u0244\u0245\u0005l\u0000\u0000\u0245-\u0001\u0000\u0000\u0000\u0246\u0247"+ + "\u0003\u00c0`\u0000\u0247/\u0001\u0000\u0000\u0000\u0248\u0249\u00051"+ + "\u0000\u0000\u0249\u024a\u0005i\u0000\u0000\u024a\u024b\u0003\u00b0X\u0000"+ + "\u024b\u024c\u0005j\u0000\u0000\u024c1\u0001\u0000\u0000\u0000\u024d\u024e"+ + "\u00057\u0000\u0000\u024e\u024f\u0005m\u0000\u0000\u024f\u0250\u0003\u00ce"+ + "g\u0000\u0250\u0251\u0005n\u0000\u0000\u02513\u0001\u0000\u0000\u0000"+ + "\u0252\u0253\u00052\u0000\u0000\u0253\u0254\u0005i\u0000\u0000\u0254\u0255"+ + "\u0003\u00b0X\u0000\u0255\u0256\u0005j\u0000\u0000\u02565\u0001\u0000"+ + "\u0000\u0000\u0257\u0258\u0007\u0004\u0000\u0000\u0258\u0259\u0005i\u0000"+ + "\u0000\u0259\u025a\u0003\u00b0X\u0000\u025a\u025b\u0005j\u0000\u0000\u025b"+ + "7\u0001\u0000\u0000\u0000\u025c\u0261\u0005\u0011\u0000\u0000\u025d\u025e"+ + "\u0005m\u0000\u0000\u025e\u025f\u0003:\u001d\u0000\u025f\u0260\u0005n"+ + "\u0000\u0000\u0260\u0262\u0001\u0000\u0000\u0000\u0261\u025d\u0001\u0000"+ + "\u0000\u0000\u0261\u0262\u0001\u0000\u0000\u0000\u0262\u0263\u0001\u0000"+ + "\u0000\u0000\u0263\u0264\u0005i\u0000\u0000\u0264\u0265\u0003\u00b0X\u0000"+ + "\u0265\u0266\u0005j\u0000\u0000\u02669\u0001\u0000\u0000\u0000\u0267\u026a"+ + "\u0003<\u001e\u0000\u0268\u026a\u0005\u0013\u0000\u0000\u0269\u0267\u0001"+ + "\u0000\u0000\u0000\u0269\u0268\u0001\u0000\u0000\u0000\u026a;\u0001\u0000"+ + "\u0000\u0000\u026b\u026c\u0005h\u0000\u0000\u026c=\u0001\u0000\u0000\u0000"+ + "\u026d\u026e\u0005\u0012\u0000\u0000\u026e\u026f\u0005i\u0000\u0000\u026f"+ + "\u0270\u0003\u00b0X\u0000\u0270\u0271\u0005j\u0000\u0000\u0271?\u0001"+ + "\u0000\u0000\u0000\u0272\u0273\u0005:\u0000\u0000\u0273\u0274\u0005i\u0000"+ + "\u0000\u0274\u0275\u0003\u00b0X\u0000\u0275\u0276\u0005j\u0000\u0000\u0276"+ + "A\u0001\u0000\u0000\u0000\u0277\u0278\u00059\u0000\u0000\u0278\u0279\u0005"+ + "i\u0000\u0000\u0279\u027a\u0003\u00b0X\u0000\u027a\u027b\u0005j\u0000"+ + "\u0000\u027bC\u0001\u0000\u0000\u0000\u027c\u027d\u0005\u0016\u0000\u0000"+ + "\u027d\u027e\u0005i\u0000\u0000\u027e\u0281\u0003\u00b0X\u0000\u027f\u0280"+ + "\u0005p\u0000\u0000\u0280\u0282\u0003\u00b0X\u0000\u0281\u027f\u0001\u0000"+ + "\u0000\u0000\u0281\u0282\u0001\u0000\u0000\u0000\u0282\u0283\u0001\u0000"+ + "\u0000\u0000\u0283\u0284\u0005j\u0000\u0000\u0284E\u0001\u0000\u0000\u0000"+ + "\u0285\u0286\u0007\u0004\u0000\u0000\u0286\u0287\u0005m\u0000\u0000\u0287"+ + "\u0288\u0003\u00b0X\u0000\u0288\u0289\u0005=\u0000\u0000\u0289\u028a\u0003"+ + "\u00b0X\u0000\u028a\u028b\u0005n\u0000\u0000\u028bG\u0001\u0000\u0000"+ + "\u0000\u028c\u028d\u00056\u0000\u0000\u028d\u028e\u0003\u00b0X\u0000\u028e"+ + "\u0294\u0005k\u0000\u0000\u028f\u0290\u0003J%\u0000\u0290\u0291\u0003"+ + "\u017c\u00be\u0000\u0291\u0293\u0001\u0000\u0000\u0000\u0292\u028f\u0001"+ + "\u0000\u0000\u0000\u0293\u0296\u0001\u0000\u0000\u0000\u0294\u0292\u0001"+ + "\u0000\u0000\u0000\u0294\u0295\u0001\u0000\u0000\u0000\u0295\u0297\u0001"+ + "\u0000\u0000\u0000\u0296\u0294\u0001\u0000\u0000\u0000\u0297\u0298\u0005"+ + "l\u0000\u0000\u0298I\u0001\u0000\u0000\u0000\u0299\u029a\u0003v;\u0000"+ + "\u029a\u029b\u0005r\u0000\u0000\u029b\u029c\u0003\u00b0X\u0000\u029cK"+ + "\u0001\u0000\u0000\u0000\u029d\u029e\u0005m\u0000\u0000\u029e\u02a3\u0003"+ + "N\'\u0000\u029f\u02a0\u0005p\u0000\u0000\u02a0\u02a2\u0003N\'\u0000\u02a1"+ + "\u029f\u0001\u0000\u0000\u0000\u02a2\u02a5\u0001\u0000\u0000\u0000\u02a3"+ + "\u02a1\u0001\u0000\u0000\u0000\u02a3\u02a4\u0001\u0000\u0000\u0000\u02a4"+ + "\u02a6\u0001\u0000\u0000\u0000\u02a5\u02a3\u0001\u0000\u0000\u0000\u02a6"+ + "\u02a7\u0005n\u0000\u0000\u02a7M\u0001\u0000\u0000\u0000\u02a8\u02a9\u0003"+ + "\u00b0X\u0000\u02a9\u02aa\u0005o\u0000\u0000\u02aa\u02ab\u0003\u00b0X"+ + "\u0000\u02abO\u0001\u0000\u0000\u0000\u02ac\u02b1\u0003^/\u0000\u02ad"+ + "\u02b1\u0003\\.\u0000\u02ae\u02b1\u0003R)\u0000\u02af\u02b1\u0003V+\u0000"+ + "\u02b0\u02ac\u0001\u0000\u0000\u0000\u02b0\u02ad\u0001\u0000\u0000\u0000"+ + "\u02b0\u02ae\u0001\u0000\u0000\u0000\u02b0\u02af\u0001\u0000\u0000\u0000"+ + "\u02b1Q\u0001\u0000\u0000\u0000\u02b2\u02b3\u00053\u0000\u0000\u02b3\u02b9"+ + "\u0005k\u0000\u0000\u02b4\u02b5\u0003T*\u0000\u02b5\u02b6\u0003\u017c"+ + "\u00be\u0000\u02b6\u02b8\u0001\u0000\u0000\u0000\u02b7\u02b4\u0001\u0000"+ + "\u0000\u0000\u02b8\u02bb\u0001\u0000\u0000\u0000\u02b9\u02b7\u0001\u0000"+ + "\u0000\u0000\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bc\u0001\u0000"+ + "\u0000\u0000\u02bb\u02b9\u0001\u0000\u0000\u0000\u02bc\u02bd\u0005l\u0000"+ + "\u0000\u02bdS\u0001\u0000\u0000\u0000\u02be\u02bf\u0005P\u0000\u0000\u02bf"+ + "\u02c0\u0005h\u0000\u0000\u02c0\u02c8\u0003\u014a\u00a5\u0000\u02c1\u02c2"+ + "\u00054\u0000\u0000\u02c2\u02c3\u0005k\u0000\u0000\u02c3\u02c4\u0003\u00b0"+ + "X\u0000\u02c4\u02c5\u0003\u017c\u00be\u0000\u02c5\u02c6\u0005l\u0000\u0000"+ + "\u02c6\u02c8\u0001\u0000\u0000\u0000\u02c7\u02be\u0001\u0000\u0000\u0000"+ + "\u02c7\u02c1\u0001\u0000\u0000\u0000\u02c8U\u0001\u0000\u0000\u0000\u02c9"+ + "\u02ca\u00055\u0000\u0000\u02ca\u02d0\u0005k\u0000\u0000\u02cb\u02cc\u0003"+ + "X,\u0000\u02cc\u02cd\u0003\u017c\u00be\u0000\u02cd\u02cf\u0001\u0000\u0000"+ + "\u0000\u02ce\u02cb\u0001\u0000\u0000\u0000\u02cf\u02d2\u0001\u0000\u0000"+ + "\u0000\u02d0\u02ce\u0001\u0000\u0000\u0000\u02d0\u02d1\u0001\u0000\u0000"+ + "\u0000\u02d1\u02d3\u0001\u0000\u0000\u0000\u02d2\u02d0\u0001\u0000\u0000"+ + "\u0000\u02d3\u02d4\u0005l\u0000\u0000\u02d4W\u0001\u0000\u0000\u0000\u02d5"+ + "\u02d6\u0005h\u0000\u0000\u02d6\u02dc\u0005k\u0000\u0000\u02d7\u02d8\u0003"+ + "Z-\u0000\u02d8\u02d9\u0003\u017c\u00be\u0000\u02d9\u02db\u0001\u0000\u0000"+ + "\u0000\u02da\u02d7\u0001\u0000\u0000\u0000\u02db\u02de\u0001\u0000\u0000"+ + "\u0000\u02dc\u02da\u0001\u0000\u0000\u0000\u02dc\u02dd\u0001\u0000\u0000"+ + "\u0000\u02dd\u02df\u0001\u0000\u0000\u0000\u02de\u02dc\u0001\u0000\u0000"+ + "\u0000\u02df\u02e0\u0005l\u0000\u0000\u02e0Y\u0001\u0000\u0000\u0000\u02e1"+ + "\u02e3\u0003\u00f0x\u0000\u02e2\u02e1\u0001\u0000\u0000\u0000\u02e2\u02e3"+ + "\u0001\u0000\u0000\u0000\u02e3\u02e4\u0001\u0000\u0000\u0000\u02e4\u02e5"+ + "\u0003\u00ceg\u0000\u02e5[\u0001\u0000\u0000\u0000\u02e6\u02e7\u0005\u001b"+ + "\u0000\u0000\u02e7\u02e8\u0005m\u0000\u0000\u02e8\u02e9\u0005n\u0000\u0000"+ + "\u02e9\u02ea\u0003\u013e\u009f\u0000\u02ea]\u0001\u0000\u0000\u0000\u02eb"+ + "\u02ec\u0007\u0005\u0000\u0000\u02ec\u02ed\u0005m\u0000\u0000\u02ed\u02ee"+ + "\u0003\u00ceg\u0000\u02ee\u02ef\u0005n\u0000\u0000\u02ef\u02f7\u0001\u0000"+ + "\u0000\u0000\u02f0\u02f1\u0005+\u0000\u0000\u02f1\u02f2\u0005m\u0000\u0000"+ + "\u02f2\u02f3\u0003\u00ceg\u0000\u02f3\u02f4\u0005n\u0000\u0000\u02f4\u02f5"+ + "\u0003\u00ceg\u0000\u02f5\u02f7\u0001\u0000\u0000\u0000\u02f6\u02eb\u0001"+ + "\u0000\u0000\u0000\u02f6\u02f0\u0001\u0000\u0000\u0000\u02f7_\u0001\u0000"+ + "\u0000\u0000\u02f8\u0300\u0003l6\u0000\u02f9\u02fa\u0005K\u0000\u0000"+ + "\u02fa\u0300\u00060\uffff\uffff\u0000\u02fb\u02fc\u0005\u000e\u0000\u0000"+ + "\u02fc\u0300\u00060\uffff\uffff\u0000\u02fd\u02fe\u0005C\u0000\u0000\u02fe"+ + "\u0300\u00060\uffff\uffff\u0000\u02ff\u02f8\u0001\u0000\u0000\u0000\u02ff"+ + "\u02f9\u0001\u0000\u0000\u0000\u02ff\u02fb\u0001\u0000\u0000\u0000\u02ff"+ + "\u02fd\u0001\u0000\u0000\u0000\u0300\u0301\u0001\u0000\u0000\u0000\u0301"+ + "\u0303\u0003\u017c\u00be\u0000\u0302\u02ff\u0001\u0000\u0000\u0000\u0303"+ + "\u0306\u0001\u0000\u0000\u0000\u0304\u0305\u0001\u0000\u0000\u0000\u0304"+ + "\u0302\u0001\u0000\u0000\u0000\u0305\u0309\u0001\u0000\u0000\u0000\u0306"+ + "\u0304\u0001\u0000\u0000\u0000\u0307\u0308\u0005\u000e\u0000\u0000\u0308"+ + "\u030a\u00060\uffff\uffff\u0000\u0309\u0307\u0001\u0000\u0000\u0000\u0309"+ + "\u030a\u0001\u0000\u0000\u0000\u030a\u030c\u0001\u0000\u0000\u0000\u030b"+ + "\u030d\u0003j5\u0000\u030c\u030b\u0001\u0000\u0000\u0000\u030c\u030d\u0001"+ + "\u0000\u0000\u0000\u030da\u0001\u0000\u0000\u0000\u030e\u0310\b\u0006"+ + "\u0000\u0000\u030f\u030e\u0001\u0000\u0000\u0000\u0310\u0311\u0001\u0000"+ + "\u0000\u0000\u0311\u030f\u0001\u0000\u0000\u0000\u0311\u0312\u0001\u0000"+ + "\u0000\u0000\u0312c\u0001\u0000\u0000\u0000\u0313\u0318\u0003b1\u0000"+ + "\u0314\u0315\u0005p\u0000\u0000\u0315\u0317\u0003b1\u0000\u0316\u0314"+ + "\u0001\u0000\u0000\u0000\u0317\u031a\u0001\u0000\u0000\u0000\u0318\u0316"+ + "\u0001\u0000\u0000\u0000\u0318\u0319\u0001\u0000\u0000\u0000\u0319e\u0001"+ + "\u0000\u0000\u0000\u031a\u0318\u0001\u0000\u0000\u0000\u031b\u031c\u0003"+ + "b1\u0000\u031c\u031e\u0005i\u0000\u0000\u031d\u031f\u0003d2\u0000\u031e"+ + "\u031d\u0001\u0000\u0000\u0000\u031e\u031f\u0001\u0000\u0000\u0000\u031f"+ + "\u0320\u0001\u0000\u0000\u0000\u0320\u0321\u0005j\u0000\u0000\u0321g\u0001"+ + "\u0000\u0000\u0000\u0322\u0327\u0003f3\u0000\u0323\u0324\u0005p\u0000"+ + "\u0000\u0324\u0326\u0003f3\u0000\u0325\u0323\u0001\u0000\u0000\u0000\u0326"+ + "\u0329\u0001\u0000\u0000\u0000\u0327\u0325\u0001\u0000\u0000\u0000\u0327"+ + "\u0328\u0001\u0000\u0000\u0000\u0328i\u0001\u0000\u0000\u0000\u0329\u0327"+ + "\u0001\u0000\u0000\u0000\u032a\u032b\u0005M\u0000\u0000\u032b\u032d\u0005"+ + "m\u0000\u0000\u032c\u032e\u0003h4\u0000\u032d\u032c\u0001\u0000\u0000"+ + "\u0000\u032d\u032e\u0001\u0000\u0000\u0000\u032e\u032f\u0001\u0000\u0000"+ + "\u0000\u032f\u0330\u0005n\u0000\u0000\u0330\u0331\u0003\u017c\u00be\u0000"+ + "\u0331k\u0001\u0000\u0000\u0000\u0332\u0333\u0005\t\u0000\u0000\u0333"+ + "\u033b\u0003p8\u0000\u0334\u0335\u0005\n\u0000\u0000\u0335\u033b\u0003"+ + "p8\u0000\u0336\u0337\u0005\u000b\u0000\u0000\u0337\u033b\u0003p8\u0000"+ + "\u0338\u0339\u0005\r\u0000\u0000\u0339\u033b\u0003n7\u0000\u033a\u0332"+ + "\u0001\u0000\u0000\u0000\u033a\u0334\u0001\u0000\u0000\u0000\u033a\u0336"+ + "\u0001\u0000\u0000\u0000\u033a\u0338\u0001\u0000\u0000\u0000\u033bm\u0001"+ + "\u0000\u0000\u0000\u033c\u033e\u0003\u00f2y\u0000\u033d\u033c\u0001\u0000"+ + "\u0000\u0000\u033d\u033e\u0001\u0000\u0000\u0000\u033e\u0341\u0001\u0000"+ + "\u0000\u0000\u033f\u0340\u0005_\u0000\u0000\u0340\u0342\u0003\u00b0X\u0000"+ + "\u0341\u033f\u0001\u0000\u0000\u0000\u0341\u0342\u0001\u0000\u0000\u0000"+ + "\u0342o\u0001\u0000\u0000\u0000\u0343\u0346\u0001\u0000\u0000\u0000\u0344"+ + "\u0346\u0003\u00b0X\u0000\u0345\u0343\u0001\u0000\u0000\u0000\u0345\u0344"+ + "\u0001\u0000\u0000\u0000\u0346q\u0001\u0000\u0000\u0000\u0347\u0348\u0005"+ + "6\u0000\u0000\u0348\u0349\u0003\u00b0X\u0000\u0349\u034d\u0005k\u0000"+ + "\u0000\u034a\u034c\u0003t:\u0000\u034b\u034a\u0001\u0000\u0000\u0000\u034c"+ + "\u034f\u0001\u0000\u0000\u0000\u034d\u034b\u0001\u0000\u0000\u0000\u034d"+ + "\u034e\u0001\u0000\u0000\u0000\u034e\u0350\u0001\u0000\u0000\u0000\u034f"+ + "\u034d\u0001\u0000\u0000\u0000\u0350\u0351\u0005l\u0000\u0000\u0351s\u0001"+ + "\u0000\u0000\u0000\u0352\u0353\u0003v;\u0000\u0353\u0355\u0005r\u0000"+ + "\u0000\u0354\u0356\u0003\u00fc~\u0000\u0355\u0354\u0001\u0000\u0000\u0000"+ + "\u0355\u0356\u0001\u0000\u0000\u0000\u0356u\u0001\u0000\u0000\u0000\u0357"+ + "\u0358\u0005S\u0000\u0000\u0358\u035b\u0003x<\u0000\u0359\u035b\u0005"+ + "O\u0000\u0000\u035a\u0357\u0001\u0000\u0000\u0000\u035a\u0359\u0001\u0000"+ + "\u0000\u0000\u035bw\u0001\u0000\u0000\u0000\u035c\u035d\u0005%\u0000\u0000"+ + "\u035d\u036a\u0005h\u0000\u0000\u035e\u035f\u0003\u00d6k\u0000\u035f\u0364"+ + "\u0005k\u0000\u0000\u0360\u0362\u0003z=\u0000\u0361\u0363\u0005p\u0000"+ + "\u0000\u0362\u0361\u0001\u0000\u0000\u0000\u0362\u0363\u0001\u0000\u0000"+ + "\u0000\u0363\u0365\u0001\u0000\u0000\u0000\u0364\u0360\u0001\u0000\u0000"+ + "\u0000\u0364\u0365\u0001\u0000\u0000\u0000\u0365\u0366\u0001\u0000\u0000"+ + "\u0000\u0366\u0367\u0005l\u0000\u0000\u0367\u036a\u0001\u0000\u0000\u0000"+ + "\u0368\u036a\u0003\u00b0X\u0000\u0369\u035c\u0001\u0000\u0000\u0000\u0369"+ + "\u035e\u0001\u0000\u0000\u0000\u0369\u0368\u0001\u0000\u0000\u0000\u036a"+ + "y\u0001\u0000\u0000\u0000\u036b\u0370\u0003x<\u0000\u036c\u036d\u0005"+ + "p\u0000\u0000\u036d\u036f\u0003x<\u0000\u036e\u036c\u0001\u0000\u0000"+ + "\u0000\u036f\u0372\u0001\u0000\u0000\u0000\u0370\u036e\u0001\u0000\u0000"+ + "\u0000\u0370\u0371\u0001\u0000\u0000\u0000\u0371{\u0001\u0000\u0000\u0000"+ + "\u0372\u0370\u0001\u0000\u0000\u0000\u0373\u0378\u0005k\u0000\u0000\u0374"+ + "\u0375\u0005;\u0000\u0000\u0375\u0376\u0003\u00f0x\u0000\u0376\u0377\u0003"+ + "\u017c\u00be\u0000\u0377\u0379\u0001\u0000\u0000\u0000\u0378\u0374\u0001"+ + "\u0000\u0000\u0000\u0378\u0379\u0001\u0000\u0000\u0000\u0379\u037b\u0001"+ + "\u0000\u0000\u0000\u037a\u037c\u0003\u00fc~\u0000\u037b\u037a\u0001\u0000"+ + "\u0000\u0000\u037b\u037c\u0001\u0000\u0000\u0000\u037c\u037d\u0001\u0000"+ + "\u0000\u0000\u037d\u037e\u0005l\u0000\u0000\u037e}\u0001\u0000\u0000\u0000"+ + "\u037f\u0382\u0003\u015c\u00ae\u0000\u0380\u0382\u0005h\u0000\u0000\u0381"+ + "\u037f\u0001\u0000\u0000\u0000\u0381\u0380\u0001\u0000\u0000\u0000\u0382"+ + "\u038b\u0001\u0000\u0000\u0000\u0383\u0388\u0005k\u0000\u0000\u0384\u0386"+ + "\u0003\u0080@\u0000\u0385\u0387\u0005p\u0000\u0000\u0386\u0385\u0001\u0000"+ + "\u0000\u0000\u0386\u0387\u0001\u0000\u0000\u0000\u0387\u0389\u0001\u0000"+ + "\u0000\u0000\u0388\u0384\u0001\u0000\u0000\u0000\u0388\u0389\u0001\u0000"+ + "\u0000\u0000\u0389\u038a\u0001\u0000\u0000\u0000\u038a\u038c\u0005l\u0000"+ + "\u0000\u038b\u0383\u0001\u0000\u0000\u0000\u038b\u038c\u0001\u0000\u0000"+ + "\u0000\u038c\u007f\u0001\u0000\u0000\u0000\u038d\u0392\u0003\u0082A\u0000"+ + "\u038e\u038f\u0005p\u0000\u0000\u038f\u0391\u0003\u0082A\u0000\u0390\u038e"+ + "\u0001\u0000\u0000\u0000\u0391\u0394\u0001\u0000\u0000\u0000\u0392\u0390"+ + "\u0001\u0000\u0000\u0000\u0392\u0393\u0001\u0000\u0000\u0000\u0393\u0081"+ + "\u0001\u0000\u0000\u0000\u0394\u0392\u0001\u0000\u0000\u0000\u0395\u0396"+ + "\u0005h\u0000\u0000\u0396\u0398\u0005r\u0000\u0000\u0397\u0395\u0001\u0000"+ + "\u0000\u0000\u0397\u0398\u0001\u0000\u0000\u0000\u0398\u0399\u0001\u0000"+ + "\u0000\u0000\u0399\u039a\u0003\u00b0X\u0000\u039a\u0083\u0001\u0000\u0000"+ + "\u0000\u039b\u039c\u0005G\u0000\u0000\u039c\u039d\u0003\u00b0X\u0000\u039d"+ + "\u039e\u0005\u000f\u0000\u0000\u039e\u039f\u0003~?\u0000\u039f\u03a0\u0003"+ + "\u00fa}\u0000\u03a0\u0085\u0001\u0000\u0000\u0000\u03a1\u03a2\u0003\u00ce"+ + "g\u0000\u03a2\u03a3\u0005\u000f\u0000\u0000\u03a3\u03b6\u0003\u00ceg\u0000"+ + "\u03a4\u03aa\u0005k\u0000\u0000\u03a5\u03a6\u0003\u008eG\u0000\u03a6\u03a7"+ + "\u0003\u017c\u00be\u0000\u03a7\u03a9\u0001\u0000\u0000\u0000\u03a8\u03a5"+ + "\u0001\u0000\u0000\u0000\u03a9\u03ac\u0001\u0000\u0000\u0000\u03aa\u03a8"+ + "\u0001\u0000\u0000\u0000\u03aa\u03ab\u0001\u0000\u0000\u0000\u03ab\u03b2"+ + "\u0001\u0000\u0000\u0000\u03ac\u03aa\u0001\u0000\u0000\u0000\u03ad\u03ae"+ + "\u0003\u0088D\u0000\u03ae\u03af\u0003\u017c\u00be\u0000\u03af\u03b1\u0001"+ + "\u0000\u0000\u0000\u03b0\u03ad\u0001\u0000\u0000\u0000\u03b1\u03b4\u0001"+ + "\u0000\u0000\u0000\u03b2\u03b0\u0001\u0000\u0000\u0000\u03b2\u03b3\u0001"+ + "\u0000\u0000\u0000\u03b3\u03b5\u0001\u0000\u0000\u0000\u03b4\u03b2\u0001"+ + "\u0000\u0000\u0000\u03b5\u03b7\u0005l\u0000\u0000\u03b6\u03a4\u0001\u0000"+ + "\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u0087\u0001\u0000"+ + "\u0000\u0000\u03b8\u03ba\u0005\u000e\u0000\u0000\u03b9\u03b8\u0001\u0000"+ + "\u0000\u0000\u03b9\u03ba\u0001\u0000\u0000\u0000\u03ba\u03bb\u0001\u0000"+ + "\u0000\u0000\u03bb\u03bc\u0003\u008aE\u0000\u03bc\u03bd\u0005h\u0000\u0000"+ + "\u03bd\u03bf\u0003\u014a\u00a5\u0000\u03be\u03c0\u0003\u00fa}\u0000\u03bf"+ + "\u03be\u0001\u0000\u0000\u0000\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0"+ + "\u0089\u0001\u0000\u0000\u0000\u03c1\u03c3\u0005i\u0000\u0000\u03c2\u03c4"+ + "\u0005h\u0000\u0000\u03c3\u03c2\u0001\u0000\u0000\u0000\u03c3\u03c4\u0001"+ + "\u0000\u0000\u0000\u03c4\u03c6\u0001\u0000\u0000\u0000\u03c5\u03c7\u0005"+ + "\u008a\u0000\u0000\u03c6\u03c5\u0001\u0000\u0000\u0000\u03c6\u03c7\u0001"+ + "\u0000\u0000\u0000\u03c7\u03c8\u0001\u0000\u0000\u0000\u03c8\u03c9\u0003"+ + "\u0138\u009c\u0000\u03c9\u03ca\u0005j\u0000\u0000\u03ca\u008b\u0001\u0000"+ + "\u0000\u0000\u03cb\u03d1\u0003\u00c0`\u0000\u03cc\u03cd\u0003\u00ceg\u0000"+ + "\u03cd\u03ce\u0005s\u0000\u0000\u03ce\u03cf\u0005h\u0000\u0000\u03cf\u03d1"+ + "\u0001\u0000\u0000\u0000\u03d0\u03cb\u0001\u0000\u0000\u0000\u03d0\u03cc"+ + "\u0001\u0000\u0000\u0000\u03d1\u008d\u0001\u0000\u0000\u0000\u03d2\u03d3"+ + "\u00058\u0000\u0000\u03d3\u03d4\u0005h\u0000\u0000\u03d4\u03d7\u0005v"+ + "\u0000\u0000\u03d5\u03d8\u0003\u008cF\u0000\u03d6\u03d8\u0003\u015a\u00ad"+ + "\u0000\u03d7\u03d5\u0001\u0000\u0000\u0000\u03d7\u03d6\u0001\u0000\u0000"+ + "\u0000\u03d8\u008f\u0001\u0000\u0000\u0000\u03d9\u03da\u0005/\u0000\u0000"+ + "\u03da\u03db\u0005i\u0000\u0000\u03db\u03de\u0003\u00ceg\u0000\u03dc\u03dd"+ + "\u0005p\u0000\u0000\u03dd\u03df\u0003\u00f2y\u0000\u03de\u03dc\u0001\u0000"+ + "\u0000\u0000\u03de\u03df\u0001\u0000\u0000\u0000\u03df\u03e0\u0001\u0000"+ + "\u0000\u0000\u03e0\u03e1\u0005j\u0000\u0000\u03e1\u0091\u0001\u0000\u0000"+ + "\u0000\u03e2\u03e3\u0005.\u0000\u0000\u03e3\u03e4\u0005i\u0000\u0000\u03e4"+ + "\u03e5\u0003\u00ceg\u0000\u03e5\u03e6\u0005j\u0000\u0000\u03e6\u0093\u0001"+ + "\u0000\u0000\u0000\u03e7\u03ea\u0003`0\u0000\u03e8\u03eb\u0003\u0096K"+ + "\u0000\u03e9\u03eb\u0003\u0098L\u0000\u03ea\u03e8\u0001\u0000\u0000\u0000"+ + "\u03ea\u03e9\u0001\u0000\u0000\u0000\u03eb\u0095\u0001\u0000\u0000\u0000"+ + "\u03ec\u03ed\u0005P\u0000\u0000\u03ed\u03ee\u0005h\u0000\u0000\u03ee\u03f0"+ + "\u0003\u014a\u00a5\u0000\u03ef\u03f1\u0003|>\u0000\u03f0\u03ef\u0001\u0000"+ + "\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1\u0097\u0001\u0000"+ + "\u0000\u0000\u03f2\u03f3\u0005P\u0000\u0000\u03f3\u03f4\u0003\u00a6S\u0000"+ + "\u03f4\u03f5\u0005h\u0000\u0000\u03f5\u03f7\u0003\u014a\u00a5\u0000\u03f6"+ + "\u03f8\u0003|>\u0000\u03f7\u03f6\u0001\u0000\u0000\u0000\u03f7\u03f8\u0001"+ + "\u0000\u0000\u0000\u03f8\u0099\u0001\u0000\u0000\u0000\u03f9\u03fc\u0005"+ + "\u001b\u0000\u0000\u03fa\u03fd\u0003\u0094J\u0000\u03fb\u03fd\u0003\u00ea"+ + "u\u0000\u03fc\u03fa\u0001\u0000\u0000\u0000\u03fc\u03fb\u0001\u0000\u0000"+ + "\u0000\u03fd\u009b\u0001\u0000\u0000\u0000\u03fe\u03ff\u00058\u0000\u0000"+ + "\u03ff\u0400\u0005h\u0000\u0000\u0400\u0402\u0003\u014e\u00a7\u0000\u0401"+ + "\u0403\u0003\u009eO\u0000\u0402\u0401\u0001\u0000\u0000\u0000\u0402\u0403"+ + "\u0001\u0000\u0000\u0000\u0403\u009d\u0001\u0000\u0000\u0000\u0404\u0405"+ + "\u0005k\u0000\u0000\u0405\u0406\u0003\u00b0X\u0000\u0406\u0407\u0003\u017c"+ + "\u00be\u0000\u0407\u0408\u0005l\u0000\u0000\u0408\u009f\u0001\u0000\u0000"+ + "\u0000\u0409\u040a\u00058\u0000\u0000\u040a\u040b\u0003\u00a6S\u0000\u040b"+ + "\u040c\u0005h\u0000\u0000\u040c\u040e\u0003\u014e\u00a7\u0000\u040d\u040f"+ + "\u0003\u009eO\u0000\u040e\u040d\u0001\u0000\u0000\u0000\u040e\u040f\u0001"+ + "\u0000\u0000\u0000\u040f\u00a1\u0001\u0000\u0000\u0000\u0410\u0418\u0003"+ + "\u0006\u0003\u0000\u0411\u0414\u0003\u00ceg\u0000\u0412\u0413\u0005o\u0000"+ + "\u0000\u0413\u0415\u0003\u00f2y\u0000\u0414\u0412\u0001\u0000\u0000\u0000"+ + "\u0414\u0415\u0001\u0000\u0000\u0000\u0415\u0419\u0001\u0000\u0000\u0000"+ + "\u0416\u0417\u0005o\u0000\u0000\u0417\u0419\u0003\u00f2y\u0000\u0418\u0411"+ + "\u0001\u0000\u0000\u0000\u0418\u0416\u0001\u0000\u0000\u0000\u0419\u00a3"+ + "\u0001\u0000\u0000\u0000\u041a\u041b\u0003\u0006\u0003\u0000\u041b\u041c"+ + "\u0005v\u0000\u0000\u041c\u041d\u0003\u00f2y\u0000\u041d\u00a5\u0001\u0000"+ + "\u0000\u0000\u041e\u0420\u0005i\u0000\u0000\u041f\u0421\u0003\b\u0004"+ + "\u0000\u0420\u041f\u0001\u0000\u0000\u0000\u0420\u0421\u0001\u0000\u0000"+ + "\u0000\u0421\u0422\u0001\u0000\u0000\u0000\u0422\u0424\u0003\u00ceg\u0000"+ + "\u0423\u0425\u0005p\u0000\u0000\u0424\u0423\u0001\u0000\u0000\u0000\u0424"+ + "\u0425\u0001\u0000\u0000\u0000\u0425\u0426\u0001\u0000\u0000\u0000\u0426"+ + "\u0427\u0005j\u0000\u0000\u0427\u00a7\u0001\u0000\u0000\u0000\u0428\u042b"+ + "\u0003\u00aaU\u0000\u0429\u042b\u0003\u00acV\u0000\u042a\u0428\u0001\u0000"+ + "\u0000\u0000\u042a\u0429\u0001\u0000\u0000\u0000\u042b\u00a9\u0001\u0000"+ + "\u0000\u0000\u042c\u042e\u0003\u00f0x\u0000\u042d\u042c\u0001\u0000\u0000"+ + "\u0000\u042d\u042e\u0001\u0000\u0000\u0000\u042e\u042f\u0001\u0000\u0000"+ + "\u0000\u042f\u0430\u0003\u00aeW\u0000\u0430\u00ab\u0001\u0000\u0000\u0000"+ + "\u0431\u0433\u0005\u001b\u0000\u0000\u0432\u0434\u0003\u00f0x\u0000\u0433"+ + "\u0432\u0001\u0000\u0000\u0000\u0433\u0434\u0001\u0000\u0000\u0000\u0434"+ + "\u0435\u0001\u0000\u0000\u0000\u0435\u0436\u0003\u00aeW\u0000\u0436\u00ad"+ + "\u0001\u0000\u0000\u0000\u0437\u0439\u0005w\u0000\u0000\u0438\u0437\u0001"+ + "\u0000\u0000\u0000\u0438\u0439\u0001\u0000\u0000\u0000\u0439\u043a\u0001"+ + "\u0000\u0000\u0000\u043a\u043b\u0003\u00ceg\u0000\u043b\u00af\u0001\u0000"+ + "\u0000\u0000\u043c\u043d\u0006X\uffff\uffff\u0000\u043d\u043e\u0007\u0007"+ + "\u0000\u0000\u043e\u0452\u0003\u00b0X\u000f\u043f\u0452\u0003\u00c0`\u0000"+ + "\u0440\u0441\u0005\u0019\u0000\u0000\u0441\u0442\u0003.\u0017\u0000\u0442"+ + "\u0443\u0005\u001c\u0000\u0000\u0443\u0444\u0003\u00b0X\u0003\u0444\u0452"+ + "\u0001\u0000\u0000\u0000\u0445\u0446\u0005\u001a\u0000\u0000\u0446\u0447"+ + "\u0003\u00a4R\u0000\u0447\u0448\u0005\u001c\u0000\u0000\u0448\u0449\u0003"+ + "\u00b0X\u0002\u0449\u0452\u0001\u0000\u0000\u0000\u044a\u044b\u0007\b"+ + "\u0000\u0000\u044b\u044c\u0003&\u0013\u0000\u044c\u044d\u0005r\u0000\u0000"+ + "\u044d\u044e\u0005r\u0000\u0000\u044e\u044f\u0003*\u0015\u0000\u044f\u0450"+ + "\u0003\u00b0X\u0001\u0450\u0452\u0001\u0000\u0000\u0000\u0451\u043c\u0001"+ + "\u0000\u0000\u0000\u0451\u043f\u0001\u0000\u0000\u0000\u0451\u0440\u0001"+ + "\u0000\u0000\u0000\u0451\u0445\u0001\u0000\u0000\u0000\u0451\u044a\u0001"+ + "\u0000\u0000\u0000\u0452\u0476\u0001\u0000\u0000\u0000\u0453\u0454\n\r"+ + "\u0000\u0000\u0454\u0455\u0007\t\u0000\u0000\u0455\u0475\u0003\u00b0X"+ + "\u000e\u0456\u0457\n\f\u0000\u0000\u0457\u0458\u0007\n\u0000\u0000\u0458"+ + "\u0475\u0003\u00b0X\r\u0459\u045a\n\u000b\u0000\u0000\u045a\u045b\u0007"+ + "\u000b\u0000\u0000\u045b\u0475\u0003\u00b0X\f\u045c\u045d\n\n\u0000\u0000"+ + "\u045d\u045e\u0007\f\u0000\u0000\u045e\u0475\u0003\u00b0X\u000b\u045f"+ + "\u0460\n\t\u0000\u0000\u0460\u0461\u0007\r\u0000\u0000\u0461\u0475\u0003"+ + "\u00b0X\n\u0462\u0463\n\u0007\u0000\u0000\u0463\u0464\u0005y\u0000\u0000"+ + "\u0464\u0475\u0003\u00b0X\b\u0465\u0466\n\u0006\u0000\u0000\u0466\u0467"+ + "\u0005x\u0000\u0000\u0467\u0475\u0003\u00b0X\u0007\u0468\u0469\n\u0005"+ + "\u0000\u0000\u0469\u046a\u0005\"\u0000\u0000\u046a\u0475\u0003\u00b0X"+ + "\u0005\u046b\u046c\n\u0004\u0000\u0000\u046c\u046d\u0005%\u0000\u0000"+ + "\u046d\u046e\u0003\u00b0X\u0000\u046e\u046f\u0005r\u0000\u0000\u046f\u0470"+ + "\u0003\u00b0X\u0004\u0470\u0475\u0001\u0000\u0000\u0000\u0471\u0472\n"+ + "\b\u0000\u0000\u0472\u0473\u0005\u000f\u0000\u0000\u0473\u0475\u0003~"+ + "?\u0000\u0474\u0453\u0001\u0000\u0000\u0000\u0474\u0456\u0001\u0000\u0000"+ + "\u0000\u0474\u0459\u0001\u0000\u0000\u0000\u0474\u045c\u0001\u0000\u0000"+ + "\u0000\u0474\u045f\u0001\u0000\u0000\u0000\u0474\u0462\u0001\u0000\u0000"+ + "\u0000\u0474\u0465\u0001\u0000\u0000\u0000\u0474\u0468\u0001\u0000\u0000"+ + "\u0000\u0474\u046b\u0001\u0000\u0000\u0000\u0474\u0471\u0001\u0000\u0000"+ + "\u0000\u0475\u0478\u0001\u0000\u0000\u0000\u0476\u0474\u0001\u0000\u0000"+ + "\u0000\u0476\u0477\u0001\u0000\u0000\u0000\u0477\u00b1\u0001\u0000\u0000"+ + "\u0000\u0478\u0476\u0001\u0000\u0000\u0000\u0479\u048e\u0003\u0018\f\u0000"+ + "\u047a\u048e\u0003\u001a\r\u0000\u047b\u048e\u0003\u00b6[\u0000\u047c"+ + "\u048e\u0003\u00b4Z\u0000\u047d\u048e\u0003\u00eau\u0000\u047e\u048e\u0003"+ + "\u010a\u0085\u0000\u047f\u048e\u0003\u00fe\u007f\u0000\u0480\u048e\u0003"+ + "\u0136\u009b\u0000\u0481\u048e\u0003\u010c\u0086\u0000\u0482\u048e\u0003"+ + "\u010e\u0087\u0000\u0483\u048e\u0003\u0110\u0088\u0000\u0484\u048e\u0003"+ + "\u0112\u0089\u0000\u0485\u048e\u0003\u0114\u008a\u0000\u0486\u048e\u0003"+ + "\u00fa}\u0000\u0487\u048e\u0003\u0116\u008b\u0000\u0488\u048e\u0003\u0118"+ + "\u008c\u0000\u0489\u048e\u0003\u012a\u0095\u0000\u048a\u048e\u0003\u00b8"+ + "\\\u0000\u048b\u048e\u0003\u00bc^\u0000\u048c\u048e\u0003\u0084B\u0000"+ + "\u048d\u0479\u0001\u0000\u0000\u0000\u048d\u047a\u0001\u0000\u0000\u0000"+ + "\u048d\u047b\u0001\u0000\u0000\u0000\u048d\u047c\u0001\u0000\u0000\u0000"+ + "\u048d\u047d\u0001\u0000\u0000\u0000\u048d\u047e\u0001\u0000\u0000\u0000"+ + "\u048d\u047f\u0001\u0000\u0000\u0000\u048d\u0480\u0001\u0000\u0000\u0000"+ + "\u048d\u0481\u0001\u0000\u0000\u0000\u048d\u0482\u0001\u0000\u0000\u0000"+ + "\u048d\u0483\u0001\u0000\u0000\u0000\u048d\u0484\u0001\u0000\u0000\u0000"+ + "\u048d\u0485\u0001\u0000\u0000\u0000\u048d\u0486\u0001\u0000\u0000\u0000"+ + "\u048d\u0487\u0001\u0000\u0000\u0000\u048d\u0488\u0001\u0000\u0000\u0000"+ + "\u048d\u0489\u0001\u0000\u0000\u0000\u048d\u048a\u0001\u0000\u0000\u0000"+ + "\u048d\u048b\u0001\u0000\u0000\u0000\u048d\u048c\u0001\u0000\u0000\u0000"+ + "\u048e\u00b3\u0001\u0000\u0000\u0000\u048f\u0490\u0005$\u0000\u0000\u0490"+ + "\u0491\u0003\u00b0X\u0000\u0491\u00b5\u0001\u0000\u0000\u0000\u0492\u0493"+ + "\u0005[\u0000\u0000\u0493\u0495\u0003\u00b0X\u0000\u0494\u0496\u0003\u00fa"+ + "}\u0000\u0495\u0494\u0001\u0000\u0000\u0000\u0495\u0496\u0001\u0000\u0000"+ + "\u0000\u0496\u00b7\u0001\u0000\u0000\u0000\u0497\u0498\u0003\u00ba]\u0000"+ + "\u0498\u0499\u0003\u0132\u0099\u0000\u0499\u00b9\u0001\u0000\u0000\u0000"+ + "\u049a\u049b\u0005\f\u0000\u0000\u049b\u049c\u0003\u00b0X\u0000\u049c"+ + "\u049d\u0003\u017c\u00be\u0000\u049d\u049f\u0001\u0000\u0000\u0000\u049e"+ + "\u049a\u0001\u0000\u0000\u0000\u049f\u04a2\u0001\u0000\u0000\u0000\u04a0"+ + "\u049e\u0001\u0000\u0000\u0000\u04a0\u04a1\u0001\u0000\u0000\u0000\u04a1"+ + "\u04a7\u0001\u0000\u0000\u0000\u04a2\u04a0\u0001\u0000\u0000\u0000\u04a3"+ + "\u04a4\u0005\r\u0000\u0000\u04a4\u04a5\u0003n7\u0000\u04a5\u04a6\u0003"+ + "\u017c\u00be\u0000\u04a6\u04a8\u0001\u0000\u0000\u0000\u04a7\u04a3\u0001"+ + "\u0000\u0000\u0000\u04a7\u04a8\u0001\u0000\u0000\u0000\u04a8\u00bb\u0001"+ + "\u0000\u0000\u0000\u04a9\u04aa\u0005T\u0000\u0000\u04aa\u04af\u0003\u00b0"+ + "X\u0000\u04ab\u04ac\u0005T\u0000\u0000\u04ac\u04ad\u0007\u0001\u0000\u0000"+ + "\u04ad\u04af\u0003.\u0017\u0000\u04ae\u04a9\u0001\u0000\u0000\u0000\u04ae"+ + "\u04ab\u0001\u0000\u0000\u0000\u04af\u00bd\u0001\u0000\u0000\u0000\u04b0"+ + "\u04b9\u0005\u0003\u0000\u0000\u04b1\u04b9\u0005\u0004\u0000\u0000\u04b2"+ + "\u04b9\u0005g\u0000\u0000\u04b3\u04b9\u0003\u0158\u00ac\u0000\u04b4\u04b9"+ + "\u0003\u016e\u00b7\u0000\u04b5\u04b9\u0005\u0001\u0000\u0000\u04b6\u04b9"+ + "\u0005\u0092\u0000\u0000\u04b7\u04b9\u0005\u0093\u0000\u0000\u04b8\u04b0"+ + "\u0001\u0000\u0000\u0000\u04b8\u04b1\u0001\u0000\u0000\u0000\u04b8\u04b2"+ + "\u0001\u0000\u0000\u0000\u04b8\u04b3\u0001\u0000\u0000\u0000\u04b8\u04b4"+ + "\u0001\u0000\u0000\u0000\u04b8\u04b5\u0001\u0000\u0000\u0000\u04b8\u04b6"+ + "\u0001\u0000\u0000\u0000\u04b8\u04b7\u0001\u0000\u0000\u0000\u04b9\u00bf"+ + "\u0001\u0000\u0000\u0000\u04ba\u04bb\u0006`\uffff\uffff\u0000\u04bb\u04cb"+ + "\u0003\u0154\u00aa\u0000\u04bc\u04cb\u0003\u0150\u00a8\u0000\u04bd\u04cb"+ + "\u0003\u0178\u00bc\u0000\u04be\u04cb\u0003 \u0010\u0000\u04bf\u04cb\u0003"+ + "\u0092I\u0000\u04c0\u04cb\u0003\u0090H\u0000\u04c1\u04c2\u0005L\u0000"+ + "\u0000\u04c2\u04c3\u0003\u00c0`\u0000\u04c3\u04c4\u0003\u0176\u00bb\u0000"+ + "\u04c4\u04cb\u0001\u0000\u0000\u0000\u04c5\u04c6\u0007\u000e\u0000\u0000"+ + "\u04c6\u04c7\u0005i\u0000\u0000\u04c7\u04c8\u0003\u00b0X\u0000\u04c8\u04c9"+ + "\u0005j\u0000\u0000\u04c9\u04cb\u0001\u0000\u0000\u0000\u04ca\u04ba\u0001"+ + "\u0000\u0000\u0000\u04ca\u04bc\u0001\u0000\u0000\u0000\u04ca\u04bd\u0001"+ + "\u0000\u0000\u0000\u04ca\u04be\u0001\u0000\u0000\u0000\u04ca\u04bf\u0001"+ + "\u0000\u0000\u0000\u04ca\u04c0\u0001\u0000\u0000\u0000\u04ca\u04c1\u0001"+ + "\u0000\u0000\u0000\u04ca\u04c5\u0001\u0000\u0000\u0000\u04cb\u04e2\u0001"+ + "\u0000\u0000\u0000\u04cc\u04cd\n\n\u0000\u0000\u04cd\u04ce\u0005s\u0000"+ + "\u0000\u04ce\u04e1\u0005h\u0000\u0000\u04cf\u04d0\n\t\u0000\u0000\u04d0"+ + "\u04e1\u0003\u0172\u00b9\u0000\u04d1\u04d2\n\b\u0000\u0000\u04d2\u04e1"+ + "\u0003\u00dam\u0000\u04d3\u04d4\n\u0007\u0000\u0000\u04d4\u04e1\u0003"+ + "L&\u0000\u04d5\u04d6\n\u0006\u0000\u0000\u04d6\u04e1\u0003\u0174\u00ba"+ + "\u0000\u04d7\u04d8\n\u0005\u0000\u0000\u04d8\u04e1\u0003\u0176\u00bb\u0000"+ + "\u04d9\u04da\n\u0003\u0000\u0000\u04da\u04db\u0003\u0176\u00bb\u0000\u04db"+ + "\u04dc\u0005\u0010\u0000\u0000\u04dc\u04dd\u0003~?\u0000\u04dd\u04e1\u0001"+ + "\u0000\u0000\u0000\u04de\u04df\n\u0002\u0000\u0000\u04df\u04e1\u0003\u00c6"+ + "c\u0000\u04e0\u04cc\u0001\u0000\u0000\u0000\u04e0\u04cf\u0001\u0000\u0000"+ + "\u0000\u04e0\u04d1\u0001\u0000\u0000\u0000\u04e0\u04d3\u0001\u0000\u0000"+ + "\u0000\u04e0\u04d5\u0001\u0000\u0000\u0000\u04e0\u04d7\u0001\u0000\u0000"+ + "\u0000\u04e0\u04d9\u0001\u0000\u0000\u0000\u04e0\u04de\u0001\u0000\u0000"+ + "\u0000\u04e1\u04e4\u0001\u0000\u0000\u0000\u04e2\u04e0\u0001\u0000\u0000"+ + "\u0000\u04e2\u04e3\u0001\u0000\u0000\u0000\u04e3\u00c1\u0001\u0000\u0000"+ + "\u0000\u04e4\u04e2\u0001\u0000\u0000\u0000\u04e5\u04e6\u0003`0\u0000\u04e6"+ + "\u04e7\u0003\u00c4b\u0000\u04e7\u00c3\u0001\u0000\u0000\u0000\u04e8\u04ea"+ + "\u0005P\u0000\u0000\u04e9\u04eb\u0005h\u0000\u0000\u04ea\u04e9\u0001\u0000"+ + "\u0000\u0000\u04ea\u04eb\u0001\u0000\u0000\u0000\u04eb\u04ec\u0001\u0000"+ + "\u0000\u0000\u04ec\u04ee\u0003\u014a\u00a5\u0000\u04ed\u04ef\u0003|>\u0000"+ + "\u04ee\u04ed\u0001\u0000\u0000\u0000\u04ee\u04ef\u0001\u0000\u0000\u0000"+ + "\u04ef\u00c5\u0001\u0000\u0000\u0000\u04f0\u04f2\u0005&\u0000\u0000\u04f1"+ + "\u04f3\u0003\u00f2y\u0000\u04f2\u04f1\u0001\u0000\u0000\u0000\u04f2\u04f3"+ + "\u0001\u0000\u0000\u0000\u04f3\u04f5\u0001\u0000\u0000\u0000\u04f4\u04f6"+ + "\u0005p\u0000\u0000\u04f5\u04f4\u0001\u0000\u0000\u0000\u04f5\u04f6\u0001"+ + "\u0000\u0000\u0000\u04f6\u04f7\u0001\u0000\u0000\u0000\u04f7\u04f8\u0005"+ + "\'\u0000\u0000\u04f8\u00c7\u0001\u0000\u0000\u0000\u04f9\u04fa\u0005Q"+ + "\u0000\u0000\u04fa\u0504\u0005k\u0000\u0000\u04fb\u04ff\u0003\u00ccf\u0000"+ + "\u04fc\u04ff\u0003\u0138\u009c\u0000\u04fd\u04ff\u0003\u00cae\u0000\u04fe"+ + "\u04fb\u0001\u0000\u0000\u0000\u04fe\u04fc\u0001\u0000\u0000\u0000\u04fe"+ + "\u04fd\u0001\u0000\u0000\u0000\u04ff\u0500\u0001\u0000\u0000\u0000\u0500"+ + "\u0501\u0003\u017c\u00be\u0000\u0501\u0503\u0001\u0000\u0000\u0000\u0502"+ + "\u04fe\u0001\u0000\u0000\u0000\u0503\u0506\u0001\u0000\u0000\u0000\u0504"+ + "\u0502\u0001\u0000\u0000\u0000\u0504\u0505\u0001\u0000\u0000\u0000\u0505"+ + "\u0507\u0001\u0000\u0000\u0000\u0506\u0504\u0001\u0000\u0000\u0000\u0507"+ + "\u0508\u0005l\u0000\u0000\u0508\u00c9\u0001\u0000\u0000\u0000\u0509\u050a"+ + "\u00058\u0000\u0000\u050a\u050b\u0005h\u0000\u0000\u050b\u050c\u0003\u014e"+ + "\u00a7\u0000\u050c\u00cb\u0001\u0000\u0000\u0000\u050d\u050f\u0005\u001b"+ + "\u0000\u0000\u050e\u050d\u0001\u0000\u0000\u0000\u050e\u050f\u0001\u0000"+ + "\u0000\u0000\u050f\u0510\u0001\u0000\u0000\u0000\u0510\u0511\u0003`0\u0000"+ + "\u0511\u0512\u0005h\u0000\u0000\u0512\u0513\u0003\u014e\u00a7\u0000\u0513"+ + "\u0514\u0003\u014c\u00a6\u0000\u0514\u051d\u0001\u0000\u0000\u0000\u0515"+ + "\u0517\u0005\u001b\u0000\u0000\u0516\u0515\u0001\u0000\u0000\u0000\u0516"+ + "\u0517\u0001\u0000\u0000\u0000\u0517\u0518\u0001\u0000\u0000\u0000\u0518"+ + "\u0519\u0003`0\u0000\u0519\u051a\u0005h\u0000\u0000\u051a\u051b\u0003"+ + "\u014e\u00a7\u0000\u051b\u051d\u0001\u0000\u0000\u0000\u051c\u050e\u0001"+ + "\u0000\u0000\u0000\u051c\u0516\u0001\u0000\u0000\u0000\u051d\u00cd\u0001"+ + "\u0000\u0000\u0000\u051e\u0526\u0003\u0138\u009c\u0000\u051f\u0526\u0003"+ + "\u00d0h\u0000\u0520\u0526\u0003P(\u0000\u0521\u0522\u0005i\u0000\u0000"+ + "\u0522\u0523\u0003\u00ceg\u0000\u0523\u0524\u0005j\u0000\u0000\u0524\u0526"+ + "\u0001\u0000\u0000\u0000\u0525\u051e\u0001\u0000\u0000\u0000\u0525\u051f"+ + "\u0001\u0000\u0000\u0000\u0525\u0520\u0001\u0000\u0000\u0000\u0525\u0521"+ + "\u0001\u0000\u0000\u0000\u0526\u00cf\u0001\u0000\u0000\u0000\u0527\u0531"+ + "\u0003\u013a\u009d\u0000\u0528\u0531\u0003\u016a\u00b5\u0000\u0529\u0531"+ + "\u0003\u0140\u00a0\u0000\u052a\u0531\u0003\u0148\u00a4\u0000\u052b\u0531"+ + "\u0003\u00c8d\u0000\u052c\u0531\u0003\u0142\u00a1\u0000\u052d\u0531\u0003"+ + "\u0144\u00a2\u0000\u052e\u0531\u0003\u0146\u00a3\u0000\u052f\u0531\u0003"+ + "\u00d2i\u0000\u0530\u0527\u0001\u0000\u0000\u0000\u0530\u0528\u0001\u0000"+ + "\u0000\u0000\u0530\u0529\u0001\u0000\u0000\u0000\u0530\u052a\u0001\u0000"+ + "\u0000\u0000\u0530\u052b\u0001\u0000\u0000\u0000\u0530\u052c\u0001\u0000"+ + "\u0000\u0000\u0530\u052d\u0001\u0000\u0000\u0000\u0530\u052e\u0001\u0000"+ + "\u0000\u0000\u0530\u052f\u0001\u0000\u0000\u0000\u0531\u00d1\u0001\u0000"+ + "\u0000\u0000\u0532\u0533\u00058\u0000\u0000\u0533\u0534\u0003\u00d4j\u0000"+ + "\u0534\u00d3\u0001\u0000\u0000\u0000\u0535\u0541\u0005i\u0000\u0000\u0536"+ + "\u053b\u0003\u00ceg\u0000\u0537\u0538\u0005p\u0000\u0000\u0538\u053a\u0003"+ + "\u00ceg\u0000\u0539\u0537\u0001\u0000\u0000\u0000\u053a\u053d\u0001\u0000"+ + "\u0000\u0000\u053b\u0539\u0001\u0000\u0000\u0000\u053b\u053c\u0001\u0000"+ + "\u0000\u0000\u053c\u053f\u0001\u0000\u0000\u0000\u053d\u053b\u0001\u0000"+ + "\u0000\u0000\u053e\u0540\u0005p\u0000\u0000\u053f\u053e\u0001\u0000\u0000"+ + "\u0000\u053f\u0540\u0001\u0000\u0000\u0000\u0540\u0542\u0001\u0000\u0000"+ + "\u0000\u0541\u0536\u0001\u0000\u0000\u0000\u0541\u0542\u0001\u0000\u0000"+ + "\u0000\u0542\u0543\u0001\u0000\u0000\u0000\u0543\u0544\u0005j\u0000\u0000"+ + "\u0544\u00d5\u0001\u0000\u0000\u0000\u0545\u054d\u0003\u016a\u00b5\u0000"+ + "\u0546\u054d\u0003\u013a\u009d\u0000\u0547\u054d\u0003\u00d8l\u0000\u0548"+ + "\u054d\u0003\u0142\u00a1\u0000\u0549\u054d\u0003\u0144\u00a2\u0000\u054a"+ + "\u054d\u0003P(\u0000\u054b\u054d\u0003\u0138\u009c\u0000\u054c\u0545\u0001"+ + "\u0000\u0000\u0000\u054c\u0546\u0001\u0000\u0000\u0000\u054c\u0547\u0001"+ + "\u0000\u0000\u0000\u054c\u0548\u0001\u0000\u0000\u0000\u054c\u0549\u0001"+ + "\u0000\u0000\u0000\u054c\u054a\u0001\u0000\u0000\u0000\u054c\u054b\u0001"+ + "\u0000\u0000\u0000\u054d\u00d7\u0001\u0000\u0000\u0000\u054e\u054f\u0005"+ + "m\u0000\u0000\u054f\u0550\u0005w\u0000\u0000\u0550\u0551\u0005n\u0000"+ + "\u0000\u0551\u0552\u0003\u013e\u009f\u0000\u0552\u00d9\u0001\u0000\u0000"+ + "\u0000\u0553\u0563\u0005m\u0000\u0000\u0554\u0556\u0003\u00dcn\u0000\u0555"+ + "\u0554\u0001\u0000\u0000\u0000\u0555\u0556\u0001\u0000\u0000\u0000\u0556"+ + "\u0557\u0001\u0000\u0000\u0000\u0557\u0559\u0005r\u0000\u0000\u0558\u055a"+ + "\u0003\u00deo\u0000\u0559\u0558\u0001\u0000\u0000\u0000\u0559\u055a\u0001"+ + "\u0000\u0000\u0000\u055a\u0564\u0001\u0000\u0000\u0000\u055b\u055d\u0003"+ + "\u00dcn\u0000\u055c\u055b\u0001\u0000\u0000\u0000\u055c\u055d\u0001\u0000"+ + "\u0000\u0000\u055d\u055e\u0001\u0000\u0000\u0000\u055e\u055f\u0005r\u0000"+ + "\u0000\u055f\u0560\u0003\u00deo\u0000\u0560\u0561\u0005r\u0000\u0000\u0561"+ + "\u0562\u0003\u00e0p\u0000\u0562\u0564\u0001\u0000\u0000\u0000\u0563\u0555"+ + "\u0001\u0000\u0000\u0000\u0563\u055c\u0001\u0000\u0000\u0000\u0564\u0565"+ + "\u0001\u0000\u0000\u0000\u0565\u0566\u0005n\u0000\u0000\u0566\u00db\u0001"+ + "\u0000\u0000\u0000\u0567\u0568\u0003\u00b0X\u0000\u0568\u00dd\u0001\u0000"+ + "\u0000\u0000\u0569\u056a\u0003\u00b0X\u0000\u056a\u00df\u0001\u0000\u0000"+ + "\u0000\u056b\u056c\u0003\u00b0X\u0000\u056c\u00e1\u0001\u0000\u0000\u0000"+ + "\u056d\u056f\u0007\u000f\u0000\u0000\u056e\u056d\u0001\u0000\u0000\u0000"+ + "\u056e\u056f\u0001\u0000\u0000\u0000\u056f\u0570\u0001\u0000\u0000\u0000"+ + "\u0570\u0571\u0005o\u0000\u0000\u0571\u00e3\u0001\u0000\u0000\u0000\u0572"+ + "\u0573\u0003\u00f2y\u0000\u0573\u0574\u0005o\u0000\u0000\u0574\u0579\u0001"+ + "\u0000\u0000\u0000\u0575\u0576\u0003\u0006\u0003\u0000\u0576\u0577\u0005"+ + "v\u0000\u0000\u0577\u0579\u0001\u0000\u0000\u0000\u0578\u0572\u0001\u0000"+ + "\u0000\u0000\u0578\u0575\u0001\u0000\u0000\u0000\u0578\u0579\u0001\u0000"+ + "\u0000\u0000\u0579\u057a\u0001\u0000\u0000\u0000\u057a\u057b\u0005`\u0000"+ + "\u0000\u057b\u0580\u0003\u00b0X\u0000\u057c\u057e\u0005J\u0000\u0000\u057d"+ + "\u057f\u0005h\u0000\u0000\u057e\u057d\u0001\u0000\u0000\u0000\u057e\u057f"+ + "\u0001\u0000\u0000\u0000\u057f\u0581\u0001\u0000\u0000\u0000\u0580\u057c"+ + "\u0001\u0000\u0000\u0000\u0580\u0581\u0001\u0000\u0000\u0000\u0581\u00e5"+ + "\u0001\u0000\u0000\u0000\u0582\u0583\u0005[\u0000\u0000\u0583\u0584\u0005"+ + "h\u0000\u0000\u0584\u00e7\u0001\u0000\u0000\u0000\u0585\u0586\u0003\u016e"+ + "\u00b7\u0000\u0586\u00e9\u0001\u0000\u0000\u0000\u0587\u058b\u0003\u00ec"+ + "v\u0000\u0588\u058b\u0003\u00f4z\u0000\u0589\u058b\u0003\u00f8|\u0000"+ + "\u058a\u0587\u0001\u0000\u0000\u0000\u058a\u0588\u0001\u0000\u0000\u0000"+ + "\u058a\u0589\u0001\u0000\u0000\u0000\u058b\u00eb\u0001\u0000\u0000\u0000"+ + "\u058c\u0598\u0005]\u0000\u0000\u058d\u0599\u0003\u00eew\u0000\u058e\u0594"+ + "\u0005i\u0000\u0000\u058f\u0590\u0003\u00eew\u0000\u0590\u0591\u0003\u017c"+ + "\u00be\u0000\u0591\u0593\u0001\u0000\u0000\u0000\u0592\u058f\u0001\u0000"+ + "\u0000\u0000\u0593\u0596\u0001\u0000\u0000\u0000\u0594\u0592\u0001\u0000"+ + "\u0000\u0000\u0594\u0595\u0001\u0000\u0000\u0000\u0595\u0597\u0001\u0000"+ + "\u0000\u0000\u0596\u0594\u0001\u0000\u0000\u0000\u0597\u0599\u0005j\u0000"+ + "\u0000\u0598\u058d\u0001\u0000\u0000\u0000\u0598\u058e\u0001\u0000\u0000"+ + "\u0000\u0599\u00ed\u0001\u0000\u0000\u0000\u059a\u05a0\u0003\u00f0x\u0000"+ + "\u059b\u059d\u0003\u00ceg\u0000\u059c\u059b\u0001\u0000\u0000\u0000\u059c"+ + "\u059d\u0001\u0000\u0000\u0000\u059d\u059e\u0001\u0000\u0000\u0000\u059e"+ + "\u059f\u0005o\u0000\u0000\u059f\u05a1\u0003\u00f2y\u0000\u05a0\u059c\u0001"+ + "\u0000\u0000\u0000\u05a0\u05a1\u0001\u0000\u0000\u0000\u05a1\u00ef\u0001"+ + "\u0000\u0000\u0000\u05a2\u05a7\u0005h\u0000\u0000\u05a3\u05a4\u0005p\u0000"+ + "\u0000\u05a4\u05a6\u0005h\u0000\u0000\u05a5\u05a3\u0001\u0000\u0000\u0000"+ + "\u05a6\u05a9\u0001\u0000\u0000\u0000\u05a7\u05a5\u0001\u0000\u0000\u0000"+ + "\u05a7\u05a8\u0001\u0000\u0000\u0000\u05a8\u00f1\u0001\u0000\u0000\u0000"+ + "\u05a9\u05a7\u0001\u0000\u0000\u0000\u05aa\u05af\u0003\u00b0X\u0000\u05ab"+ + "\u05ac\u0005p\u0000\u0000\u05ac\u05ae\u0003\u00b0X\u0000\u05ad\u05ab\u0001"+ + "\u0000\u0000\u0000\u05ae\u05b1\u0001\u0000\u0000\u0000\u05af\u05ad\u0001"+ + "\u0000\u0000\u0000\u05af\u05b0\u0001\u0000\u0000\u0000\u05b0\u00f3\u0001"+ + "\u0000\u0000\u0000\u05b1\u05af\u0001\u0000\u0000\u0000\u05b2\u05be\u0005"+ + "a\u0000\u0000\u05b3\u05bf\u0003\u00f6{\u0000\u05b4\u05ba\u0005i\u0000"+ + "\u0000\u05b5\u05b6\u0003\u00f6{\u0000\u05b6\u05b7\u0003\u017c\u00be\u0000"+ + "\u05b7\u05b9\u0001\u0000\u0000\u0000\u05b8\u05b5\u0001\u0000\u0000\u0000"+ + "\u05b9\u05bc\u0001\u0000\u0000\u0000\u05ba\u05b8\u0001\u0000\u0000\u0000"+ + "\u05ba\u05bb\u0001\u0000\u0000\u0000\u05bb\u05bd\u0001\u0000\u0000\u0000"+ + "\u05bc\u05ba\u0001\u0000\u0000\u0000\u05bd\u05bf\u0005j\u0000\u0000\u05be"+ + "\u05b3\u0001\u0000\u0000\u0000\u05be\u05b4\u0001\u0000\u0000\u0000\u05bf"+ + "\u00f5\u0001\u0000\u0000\u0000\u05c0\u05c2\u0005h\u0000\u0000\u05c1\u05c3"+ + "\u0005o\u0000\u0000\u05c2\u05c1\u0001\u0000\u0000\u0000\u05c2\u05c3\u0001"+ + "\u0000\u0000\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000\u05c4\u05c5\u0003"+ + "\u00ceg\u0000\u05c5\u00f7\u0001\u0000\u0000\u0000\u05c6\u05d2\u0005f\u0000"+ + "\u0000\u05c7\u05d3\u0003\u00a2Q\u0000\u05c8\u05ce\u0005i\u0000\u0000\u05c9"+ + "\u05ca\u0003\u00a2Q\u0000\u05ca\u05cb\u0003\u017c\u00be\u0000\u05cb\u05cd"+ + "\u0001\u0000\u0000\u0000\u05cc\u05c9\u0001\u0000\u0000\u0000\u05cd\u05d0"+ + "\u0001\u0000\u0000\u0000\u05ce\u05cc\u0001\u0000\u0000\u0000\u05ce\u05cf"+ + "\u0001\u0000\u0000\u0000\u05cf\u05d1\u0001\u0000\u0000\u0000\u05d0\u05ce"+ + "\u0001\u0000\u0000\u0000\u05d1\u05d3\u0005j\u0000\u0000\u05d2\u05c7\u0001"+ + "\u0000\u0000\u0000\u05d2\u05c8\u0001\u0000\u0000\u0000\u05d3\u00f9\u0001"+ + "\u0000\u0000\u0000\u05d4\u05d6\u0005k\u0000\u0000\u05d5\u05d7\u0003\u00fc"+ + "~\u0000\u05d6\u05d5\u0001\u0000\u0000\u0000\u05d6\u05d7\u0001\u0000\u0000"+ + "\u0000\u05d7\u05d8\u0001\u0000\u0000\u0000\u05d8\u05d9\u0005l\u0000\u0000"+ + "\u05d9\u00fb\u0001\u0000\u0000\u0000\u05da\u05dc\u0005q\u0000\u0000\u05db"+ + "\u05da\u0001\u0000\u0000\u0000\u05db\u05dc\u0001\u0000\u0000\u0000\u05dc"+ + "\u05e2\u0001\u0000\u0000\u0000\u05dd\u05df\u0005\u00a2\u0000\u0000\u05de"+ + "\u05dd\u0001\u0000\u0000\u0000\u05de\u05df\u0001\u0000\u0000\u0000\u05df"+ + "\u05e2\u0001\u0000\u0000\u0000\u05e0\u05e2\u0004~\u0012\u0000\u05e1\u05db"+ + "\u0001\u0000\u0000\u0000\u05e1\u05de\u0001\u0000\u0000\u0000\u05e1\u05e0"+ + "\u0001\u0000\u0000\u0000\u05e2\u05e3\u0001\u0000\u0000\u0000\u05e3\u05e4"+ + "\u0003\u00b2Y\u0000\u05e4\u05e5\u0003\u017c\u00be\u0000\u05e5\u05e7\u0001"+ + "\u0000\u0000\u0000\u05e6\u05e1\u0001\u0000\u0000\u0000\u05e7\u05e8\u0001"+ + "\u0000\u0000\u0000\u05e8\u05e6\u0001\u0000\u0000\u0000\u05e8\u05e9\u0001"+ + "\u0000\u0000\u0000\u05e9\u00fd\u0001\u0000\u0000\u0000\u05ea\u05f0\u0003"+ + "\u0102\u0081\u0000\u05eb\u05f0\u0003\u0104\u0082\u0000\u05ec\u05f0\u0003"+ + "\u0106\u0083\u0000\u05ed\u05f0\u0003\u0100\u0080\u0000\u05ee\u05f0\u0003"+ + "\u00a4R\u0000\u05ef\u05ea\u0001\u0000\u0000\u0000\u05ef\u05eb\u0001\u0000"+ + "\u0000\u0000\u05ef\u05ec\u0001\u0000\u0000\u0000\u05ef\u05ed\u0001\u0000"+ + "\u0000\u0000\u05ef\u05ee\u0001\u0000\u0000\u0000\u05f0\u00ff\u0001\u0000"+ + "\u0000\u0000\u05f1\u05f2\u0003\u00b0X\u0000\u05f2\u0101\u0001\u0000\u0000"+ + "\u0000\u05f3\u05f4\u0003\u00b0X\u0000\u05f4\u05f5\u0005\u008c\u0000\u0000"+ + "\u05f5\u05f6\u0003\u00b0X\u0000\u05f6\u0103\u0001\u0000\u0000\u0000\u05f7"+ + "\u05f8\u0003\u00b0X\u0000\u05f8\u05f9\u0007\u0010\u0000\u0000\u05f9\u0105"+ + "\u0001\u0000\u0000\u0000\u05fa\u05fb\u0003\u00f2y\u0000\u05fb\u05fc\u0003"+ + "\u00e2q\u0000\u05fc\u05fd\u0003\u00f2y\u0000\u05fd\u0107\u0001\u0000\u0000"+ + "\u0000\u05fe\u05ff\u0007\u0011\u0000\u0000\u05ff\u0109\u0001\u0000\u0000"+ + "\u0000\u0600\u0601\u0005h\u0000\u0000\u0601\u0603\u0005r\u0000\u0000\u0602"+ + "\u0604\u0003\u00b2Y\u0000\u0603\u0602\u0001\u0000\u0000\u0000\u0603\u0604"+ + "\u0001\u0000\u0000\u0000\u0604\u010b\u0001\u0000\u0000\u0000\u0605\u0607"+ + "\u0005e\u0000\u0000\u0606\u0608\u0003\u00f2y\u0000\u0607\u0606\u0001\u0000"+ + "\u0000\u0000\u0607\u0608\u0001\u0000\u0000\u0000\u0608\u010d\u0001\u0000"+ + "\u0000\u0000\u0609\u060b\u0005N\u0000\u0000\u060a\u060c\u0005h\u0000\u0000"+ + "\u060b\u060a\u0001\u0000\u0000\u0000\u060b\u060c\u0001\u0000\u0000\u0000"+ + "\u060c\u010f\u0001\u0000\u0000\u0000\u060d\u060f\u0005b\u0000\u0000\u060e"+ + "\u0610\u0005h\u0000\u0000\u060f\u060e\u0001\u0000\u0000\u0000\u060f\u0610"+ + "\u0001\u0000\u0000\u0000\u0610\u0111\u0001\u0000\u0000\u0000\u0611\u0612"+ + "\u0005Z\u0000\u0000\u0612\u0613\u0005h\u0000\u0000\u0613\u0113\u0001\u0000"+ + "\u0000\u0000\u0614\u0615\u0005^\u0000\u0000\u0615\u0115\u0001\u0000\u0000"+ + "\u0000\u0616\u061f\u0005_\u0000\u0000\u0617\u0620\u0003\u00b0X\u0000\u0618"+ + "\u0619\u0003\u017c\u00be\u0000\u0619\u061a\u0003\u00b0X\u0000\u061a\u0620"+ + "\u0001\u0000\u0000\u0000\u061b\u061c\u0003\u00fe\u007f\u0000\u061c\u061d"+ + "\u0003\u017c\u00be\u0000\u061d\u061e\u0003\u00b0X\u0000\u061e\u0620\u0001"+ + "\u0000\u0000\u0000\u061f\u0617\u0001\u0000\u0000\u0000\u061f\u0618\u0001"+ + "\u0000\u0000\u0000\u061f\u061b\u0001\u0000\u0000\u0000\u0620\u0621\u0001"+ + "\u0000\u0000\u0000\u0621\u0627\u0003\u00fa}\u0000\u0622\u0625\u0005Y\u0000"+ + "\u0000\u0623\u0626\u0003\u0116\u008b\u0000\u0624\u0626\u0003\u00fa}\u0000"+ + "\u0625\u0623\u0001\u0000\u0000\u0000\u0625\u0624\u0001\u0000\u0000\u0000"+ + "\u0626\u0628\u0001\u0000\u0000\u0000\u0627\u0622\u0001\u0000\u0000\u0000"+ + "\u0627\u0628\u0001\u0000\u0000\u0000\u0628\u0117\u0001\u0000\u0000\u0000"+ + "\u0629\u062c\u0003\u011a\u008d\u0000\u062a\u062c\u0003\u0120\u0090\u0000"+ + "\u062b\u0629\u0001\u0000\u0000\u0000\u062b\u062a\u0001\u0000\u0000\u0000"+ + "\u062c\u0119\u0001\u0000\u0000\u0000\u062d\u0638\u0005\\\u0000\u0000\u062e"+ + "\u0630\u0003\u00b0X\u0000\u062f\u062e\u0001\u0000\u0000\u0000\u062f\u0630"+ + "\u0001\u0000\u0000\u0000\u0630\u0639\u0001\u0000\u0000\u0000\u0631\u0633"+ + "\u0003\u00fe\u007f\u0000\u0632\u0631\u0001\u0000\u0000\u0000\u0632\u0633"+ + "\u0001\u0000\u0000\u0000\u0633\u0634\u0001\u0000\u0000\u0000\u0634\u0636"+ + "\u0003\u017c\u00be\u0000\u0635\u0637\u0003\u00b0X\u0000\u0636\u0635\u0001"+ + "\u0000\u0000\u0000\u0636\u0637\u0001\u0000\u0000\u0000\u0637\u0639\u0001"+ + "\u0000\u0000\u0000\u0638\u062f\u0001\u0000\u0000\u0000\u0638\u0632\u0001"+ + "\u0000\u0000\u0000\u0639\u063a\u0001\u0000\u0000\u0000\u063a\u063e\u0005"+ + "k\u0000\u0000\u063b\u063d\u0003\u011c\u008e\u0000\u063c\u063b\u0001\u0000"+ + "\u0000\u0000\u063d\u0640\u0001\u0000\u0000\u0000\u063e\u063c\u0001\u0000"+ + "\u0000\u0000\u063e\u063f\u0001\u0000\u0000\u0000\u063f\u0641\u0001\u0000"+ + "\u0000\u0000\u0640\u063e\u0001\u0000\u0000\u0000\u0641\u0642\u0005l\u0000"+ + "\u0000\u0642\u011b\u0001\u0000\u0000\u0000\u0643\u0644\u0003\u011e\u008f"+ + "\u0000\u0644\u0646\u0005r\u0000\u0000\u0645\u0647\u0003\u00fc~\u0000\u0646"+ + "\u0645\u0001\u0000\u0000\u0000\u0646\u0647\u0001\u0000\u0000\u0000\u0647"+ + "\u011d\u0001\u0000\u0000\u0000\u0648\u0649\u0005S\u0000\u0000\u0649\u064c"+ + "\u0003\u00f2y\u0000\u064a\u064c\u0005O\u0000\u0000\u064b\u0648\u0001\u0000"+ + "\u0000\u0000\u064b\u064a\u0001\u0000\u0000\u0000\u064c\u011f\u0001\u0000"+ + "\u0000\u0000\u064d\u0656\u0005\\\u0000\u0000\u064e\u0657\u0003\u0122\u0091"+ + "\u0000\u064f\u0650\u0003\u017c\u00be\u0000\u0650\u0651\u0003\u0122\u0091"+ + "\u0000\u0651\u0657\u0001\u0000\u0000\u0000\u0652\u0653\u0003\u00fe\u007f"+ + "\u0000\u0653\u0654\u0003\u017c\u00be\u0000\u0654\u0655\u0003\u0122\u0091"+ + "\u0000\u0655\u0657\u0001\u0000\u0000\u0000\u0656\u064e\u0001\u0000\u0000"+ + "\u0000\u0656\u064f\u0001\u0000\u0000\u0000\u0656\u0652\u0001\u0000\u0000"+ + "\u0000\u0657\u0658\u0001\u0000\u0000\u0000\u0658\u065c\u0005k\u0000\u0000"+ + "\u0659\u065b\u0003\u0124\u0092\u0000\u065a\u0659\u0001\u0000\u0000\u0000"+ + "\u065b\u065e\u0001\u0000\u0000\u0000\u065c\u065a\u0001\u0000\u0000\u0000"+ + "\u065c\u065d\u0001\u0000\u0000\u0000\u065d\u065f\u0001\u0000\u0000\u0000"+ + "\u065e\u065c\u0001\u0000\u0000\u0000\u065f\u0660\u0005l\u0000\u0000\u0660"+ + "\u0121\u0001\u0000\u0000\u0000\u0661\u0662\u0005h\u0000\u0000\u0662\u0664"+ + "\u0005v\u0000\u0000\u0663\u0661\u0001\u0000\u0000\u0000\u0663\u0664\u0001"+ + "\u0000\u0000\u0000\u0664\u0665\u0001\u0000\u0000\u0000\u0665\u0666\u0003"+ + "\u00c0`\u0000\u0666\u0667\u0005s\u0000\u0000\u0667\u0668\u0005i\u0000"+ + "\u0000\u0668\u0669\u0005a\u0000\u0000\u0669\u066a\u0005j\u0000\u0000\u066a"+ + "\u0123\u0001\u0000\u0000\u0000\u066b\u066c\u0003\u0126\u0093\u0000\u066c"+ + "\u066e\u0005r\u0000\u0000\u066d\u066f\u0003\u00fc~\u0000\u066e\u066d\u0001"+ + "\u0000\u0000\u0000\u066e\u066f\u0001\u0000\u0000\u0000\u066f\u0125\u0001"+ + "\u0000\u0000\u0000\u0670\u0671\u0005S\u0000\u0000\u0671\u0674\u0003\u0128"+ + "\u0094\u0000\u0672\u0674\u0005O\u0000\u0000\u0673\u0670\u0001\u0000\u0000"+ + "\u0000\u0673\u0672\u0001\u0000\u0000\u0000\u0674\u0127\u0001\u0000\u0000"+ + "\u0000\u0675\u0678\u0003\u00ceg\u0000\u0676\u0678\u0005g\u0000\u0000\u0677"+ + "\u0675\u0001\u0000\u0000\u0000\u0677\u0676\u0001\u0000\u0000\u0000\u0678"+ + "\u0680\u0001\u0000\u0000\u0000\u0679\u067c\u0005p\u0000\u0000\u067a\u067d"+ + "\u0003\u00ceg\u0000\u067b\u067d\u0005g\u0000\u0000\u067c\u067a\u0001\u0000"+ + "\u0000\u0000\u067c\u067b\u0001\u0000\u0000\u0000\u067d\u067f\u0001\u0000"+ + "\u0000\u0000\u067e\u0679\u0001\u0000\u0000\u0000\u067f\u0682\u0001\u0000"+ + "\u0000\u0000\u0680\u067e\u0001\u0000\u0000\u0000\u0680\u0681\u0001\u0000"+ + "\u0000\u0000\u0681\u0129\u0001\u0000\u0000\u0000\u0682\u0680\u0001\u0000"+ + "\u0000\u0000\u0683\u0684\u0005R\u0000\u0000\u0684\u0688\u0005k\u0000\u0000"+ + "\u0685\u0687\u0003\u012c\u0096\u0000\u0686\u0685\u0001\u0000\u0000\u0000"+ + "\u0687\u068a\u0001\u0000\u0000\u0000\u0688\u0686\u0001\u0000\u0000\u0000"+ + "\u0688\u0689\u0001\u0000\u0000\u0000\u0689\u068b\u0001\u0000\u0000\u0000"+ + "\u068a\u0688\u0001\u0000\u0000\u0000\u068b\u068c\u0005l\u0000\u0000\u068c"+ + "\u012b\u0001\u0000\u0000\u0000\u068d\u068e\u0003\u012e\u0097\u0000\u068e"+ + "\u0690\u0005r\u0000\u0000\u068f\u0691\u0003\u00fc~\u0000\u0690\u068f\u0001"+ + "\u0000\u0000\u0000\u0690\u0691\u0001\u0000\u0000\u0000\u0691\u012d\u0001"+ + "\u0000\u0000\u0000\u0692\u0695\u0005S\u0000\u0000\u0693\u0696\u0003\u0102"+ + "\u0081\u0000\u0694\u0696\u0003\u0130\u0098\u0000\u0695\u0693\u0001\u0000"+ + "\u0000\u0000\u0695\u0694\u0001\u0000\u0000\u0000\u0696\u0699\u0001\u0000"+ + "\u0000\u0000\u0697\u0699\u0005O\u0000\u0000\u0698\u0692\u0001\u0000\u0000"+ + "\u0000\u0698\u0697\u0001\u0000\u0000\u0000\u0699\u012f\u0001\u0000\u0000"+ + "\u0000\u069a\u069b\u0003\u00f2y\u0000\u069b\u069c\u0005o\u0000\u0000\u069c"+ + "\u06a1\u0001\u0000\u0000\u0000\u069d\u069e\u0003\u00f0x\u0000\u069e\u069f"+ + "\u0005v\u0000\u0000\u069f\u06a1\u0001\u0000\u0000\u0000\u06a0\u069a\u0001"+ + "\u0000\u0000\u0000\u06a0\u069d\u0001\u0000\u0000\u0000\u06a0\u06a1\u0001"+ + "\u0000\u0000\u0000\u06a1\u06a2\u0001\u0000\u0000\u0000\u06a2\u06a3\u0003"+ + "\u00b0X\u0000\u06a3\u0131\u0001\u0000\u0000\u0000\u06a4\u06ac\u0005c\u0000"+ + "\u0000\u06a5\u06a7\u0003\u00b0X\u0000\u06a6\u06a5\u0001\u0000\u0000\u0000"+ + "\u06a6\u06a7\u0001\u0000\u0000\u0000\u06a7\u06ad\u0001\u0000\u0000\u0000"+ + "\u06a8\u06ad\u0003\u0134\u009a\u0000\u06a9\u06ab\u0003\u00e4r\u0000\u06aa"+ + "\u06a9\u0001\u0000\u0000\u0000\u06aa\u06ab\u0001\u0000\u0000\u0000\u06ab"+ + "\u06ad\u0001\u0000\u0000\u0000\u06ac\u06a6\u0001\u0000\u0000\u0000\u06ac"+ + "\u06a8\u0001\u0000\u0000\u0000\u06ac\u06aa\u0001\u0000\u0000\u0000\u06ad"+ + "\u06ae\u0001\u0000\u0000\u0000\u06ae\u06af\u0003\u00fa}\u0000\u06af\u0133"+ + "\u0001\u0000\u0000\u0000\u06b0\u06b2\u0003\u00fe\u007f\u0000\u06b1\u06b0"+ + "\u0001\u0000\u0000\u0000\u06b1\u06b2\u0001\u0000\u0000\u0000\u06b2\u06b3"+ + "\u0001\u0000\u0000\u0000\u06b3\u06b5\u0003\u017c\u00be\u0000\u06b4\u06b6"+ + "\u0003\u00b0X\u0000\u06b5\u06b4\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001"+ + "\u0000\u0000\u0000\u06b6\u06b7\u0001\u0000\u0000\u0000\u06b7\u06b9\u0003"+ + "\u017c\u00be\u0000\u06b8\u06ba\u0003\u00fe\u007f\u0000\u06b9\u06b8\u0001"+ + "\u0000\u0000\u0000\u06b9\u06ba\u0001\u0000\u0000\u0000\u06ba\u0135\u0001"+ + "\u0000\u0000\u0000\u06bb\u06bc\u0005U\u0000\u0000\u06bc\u06bd\u0003\u00b0"+ + "X\u0000\u06bd\u0137\u0001\u0000\u0000\u0000\u06be\u06c1\u0003\u015c\u00ae"+ + "\u0000\u06bf\u06c1\u0005h\u0000\u0000\u06c0\u06be\u0001\u0000\u0000\u0000"+ + "\u06c0\u06bf\u0001\u0000\u0000\u0000\u06c1\u0139\u0001\u0000\u0000\u0000"+ + "\u06c2\u06c3\u0005m\u0000\u0000\u06c3\u06c4\u0003\u013c\u009e\u0000\u06c4"+ + "\u06c5\u0005n\u0000\u0000\u06c5\u06c6\u0003\u013e\u009f\u0000\u06c6\u013b"+ + "\u0001\u0000\u0000\u0000\u06c7\u06c8\u0003\u00b0X\u0000\u06c8\u013d\u0001"+ + "\u0000\u0000\u0000\u06c9\u06ca\u0003\u00ceg\u0000\u06ca\u013f\u0001\u0000"+ + "\u0000\u0000\u06cb\u06cc\u0005\u008a\u0000\u0000\u06cc\u06cd\u0003\u00ce"+ + "g\u0000\u06cd\u0141\u0001\u0000\u0000\u0000\u06ce\u06cf\u0005m\u0000\u0000"+ + "\u06cf\u06d0\u0005n\u0000\u0000\u06d0\u06d1\u0003\u013e\u009f\u0000\u06d1"+ + "\u0143\u0001\u0000\u0000\u0000\u06d2\u06d3\u0005V\u0000\u0000\u06d3\u06d4"+ + "\u0005m\u0000\u0000\u06d4\u06d5\u0003\u00ceg\u0000\u06d5\u06d6\u0005n"+ + "\u0000\u0000\u06d6\u06d7\u0003\u013e\u009f\u0000\u06d7\u0145\u0001\u0000"+ + "\u0000\u0000\u06d8\u06de\u0005X\u0000\u0000\u06d9\u06da\u0005X\u0000\u0000"+ + "\u06da\u06de\u0005\u008c\u0000\u0000\u06db\u06dc\u0005\u008c\u0000\u0000"+ + "\u06dc\u06de\u0005X\u0000\u0000\u06dd\u06d8\u0001\u0000\u0000\u0000\u06dd"+ + "\u06d9\u0001\u0000\u0000\u0000\u06dd\u06db\u0001\u0000\u0000\u0000\u06de"+ + "\u06df\u0001\u0000\u0000\u0000\u06df\u06e0\u0003\u013e\u009f\u0000\u06e0"+ + "\u0147\u0001\u0000\u0000\u0000\u06e1\u06e2\u0005P\u0000\u0000\u06e2\u06e3"+ + "\u0003\u014a\u00a5\u0000\u06e3\u0149\u0001\u0000\u0000\u0000\u06e4\u06e5"+ + "\u0003\u014e\u00a7\u0000\u06e5\u06e6\u0003\u014c\u00a6\u0000\u06e6\u06e9"+ + "\u0001\u0000\u0000\u0000\u06e7\u06e9\u0003\u014e\u00a7\u0000\u06e8\u06e4"+ + "\u0001\u0000\u0000\u0000\u06e8\u06e7\u0001\u0000\u0000\u0000\u06e9\u014b"+ + "\u0001\u0000\u0000\u0000\u06ea\u06ed\u0003\u014e\u00a7\u0000\u06eb\u06ed"+ + "\u0003\u00ceg\u0000\u06ec\u06ea\u0001\u0000\u0000\u0000\u06ec\u06eb\u0001"+ + "\u0000\u0000\u0000\u06ed\u014d\u0001\u0000\u0000\u0000\u06ee\u06fa\u0005"+ + "i\u0000\u0000\u06ef\u06f4\u0003\u00a8T\u0000\u06f0\u06f1\u0005p\u0000"+ + "\u0000\u06f1\u06f3\u0003\u00a8T\u0000\u06f2\u06f0\u0001\u0000\u0000\u0000"+ + "\u06f3\u06f6\u0001\u0000\u0000\u0000\u06f4\u06f2\u0001\u0000\u0000\u0000"+ + "\u06f4\u06f5\u0001\u0000\u0000\u0000\u06f5\u06f8\u0001\u0000\u0000\u0000"+ + "\u06f6\u06f4\u0001\u0000\u0000\u0000\u06f7\u06f9\u0005p\u0000\u0000\u06f8"+ + "\u06f7\u0001\u0000\u0000\u0000\u06f8\u06f9\u0001\u0000\u0000\u0000\u06f9"+ + "\u06fb\u0001\u0000\u0000\u0000\u06fa\u06ef\u0001\u0000\u0000\u0000\u06fa"+ + "\u06fb\u0001\u0000\u0000\u0000\u06fb\u06fc\u0001\u0000\u0000\u0000\u06fc"+ + "\u06fd\u0005j\u0000\u0000\u06fd\u014f\u0001\u0000\u0000\u0000\u06fe\u06ff"+ + "\u0003\u0152\u00a9\u0000\u06ff\u0700\u0005i\u0000\u0000\u0700\u0702\u0003"+ + "\u00b0X\u0000\u0701\u0703\u0005p\u0000\u0000\u0702\u0701\u0001\u0000\u0000"+ + "\u0000\u0702\u0703\u0001\u0000\u0000\u0000\u0703\u0704\u0001\u0000\u0000"+ + "\u0000\u0704\u0705\u0005j\u0000\u0000\u0705\u0151\u0001\u0000\u0000\u0000"+ + "\u0706\u070c\u0003\u00d0h\u0000\u0707\u0708\u0005i\u0000\u0000\u0708\u0709"+ + "\u0003\u0152\u00a9\u0000\u0709\u070a\u0005j\u0000\u0000\u070a\u070c\u0001"+ + "\u0000\u0000\u0000\u070b\u0706\u0001\u0000\u0000\u0000\u070b\u0707\u0001"+ + "\u0000\u0000\u0000\u070c\u0153\u0001\u0000\u0000\u0000\u070d\u0714\u0003"+ + "\u0156\u00ab\u0000\u070e\u0714\u0003\u015a\u00ad\u0000\u070f\u0710\u0005"+ + "i\u0000\u0000\u0710\u0711\u0003\u00b0X\u0000\u0711\u0712\u0005j\u0000"+ + "\u0000\u0712\u0714\u0001\u0000\u0000\u0000\u0713\u070d\u0001\u0000\u0000"+ + "\u0000\u0713\u070e\u0001\u0000\u0000\u0000\u0713\u070f\u0001\u0000\u0000"+ + "\u0000\u0714\u0155\u0001\u0000\u0000\u0000\u0715\u0719\u0003\u00be_\u0000"+ + "\u0716\u0719\u0003\u015e\u00af\u0000\u0717\u0719\u0003\u00c2a\u0000\u0718"+ + "\u0715\u0001\u0000\u0000\u0000\u0718\u0716\u0001\u0000\u0000\u0000\u0718"+ + "\u0717\u0001\u0000\u0000\u0000\u0719\u0157\u0001\u0000\u0000\u0000\u071a"+ + "\u071b\u0007\u0012\u0000\u0000\u071b\u0159\u0001\u0000\u0000\u0000\u071c"+ + "\u071d\u0005h\u0000\u0000\u071d\u015b\u0001\u0000\u0000\u0000\u071e\u071f"+ + "\u0005h\u0000\u0000\u071f\u0720\u0005s\u0000\u0000\u0720\u0721\u0005h"+ + "\u0000\u0000\u0721\u015d\u0001\u0000\u0000\u0000\u0722\u0723\u0003\u00d6"+ + "k\u0000\u0723\u0724\u0003\u0160\u00b0\u0000\u0724\u015f\u0001\u0000\u0000"+ + "\u0000\u0725\u072a\u0005k\u0000\u0000\u0726\u0728\u0003\u0162\u00b1\u0000"+ + "\u0727\u0729\u0005p\u0000\u0000\u0728\u0727\u0001\u0000\u0000\u0000\u0728"+ + "\u0729\u0001\u0000\u0000\u0000\u0729\u072b\u0001\u0000\u0000\u0000\u072a"+ + "\u0726\u0001\u0000\u0000\u0000\u072a\u072b\u0001\u0000\u0000\u0000\u072b"+ + "\u072c\u0001\u0000\u0000\u0000\u072c\u072d\u0005l\u0000\u0000\u072d\u0161"+ + "\u0001\u0000\u0000\u0000\u072e\u0733\u0003\u0164\u00b2\u0000\u072f\u0730"+ + "\u0005p\u0000\u0000\u0730\u0732\u0003\u0164\u00b2\u0000\u0731\u072f\u0001"+ + "\u0000\u0000\u0000\u0732\u0735\u0001\u0000\u0000\u0000\u0733\u0731\u0001"+ + "\u0000\u0000\u0000\u0733\u0734\u0001\u0000\u0000\u0000\u0734\u0163\u0001"+ + "\u0000\u0000\u0000\u0735\u0733\u0001\u0000\u0000\u0000\u0736\u0737\u0003"+ + "\u0166\u00b3\u0000\u0737\u0738\u0005r\u0000\u0000\u0738\u073a\u0001\u0000"+ + "\u0000\u0000\u0739\u0736\u0001\u0000\u0000\u0000\u0739\u073a\u0001\u0000"+ + "\u0000\u0000\u073a\u073b\u0001\u0000\u0000\u0000\u073b\u073c\u0003\u0168"+ + "\u00b4\u0000\u073c\u0165\u0001\u0000\u0000\u0000\u073d\u0740\u0003\u00b0"+ + "X\u0000\u073e\u0740\u0003\u0160\u00b0\u0000\u073f\u073d\u0001\u0000\u0000"+ + "\u0000\u073f\u073e\u0001\u0000\u0000\u0000\u0740\u0167\u0001\u0000\u0000"+ + "\u0000\u0741\u0744\u0003\u00b0X\u0000\u0742\u0744\u0003\u0160\u00b0\u0000"+ + "\u0743\u0741\u0001\u0000\u0000\u0000\u0743\u0742\u0001\u0000\u0000\u0000"+ + "\u0744\u0169\u0001\u0000\u0000\u0000\u0745\u0746\u0005W\u0000\u0000\u0746"+ + "\u074c\u0005k\u0000\u0000\u0747\u0748\u0003\u016c\u00b6\u0000\u0748\u0749"+ + "\u0003\u017c\u00be\u0000\u0749\u074b\u0001\u0000\u0000\u0000\u074a\u0747"+ + "\u0001\u0000\u0000\u0000\u074b\u074e\u0001\u0000\u0000\u0000\u074c\u074a"+ + "\u0001\u0000\u0000\u0000\u074c\u074d\u0001\u0000\u0000\u0000\u074d\u074f"+ + "\u0001\u0000\u0000\u0000\u074e\u074c\u0001\u0000\u0000\u0000\u074f\u0750"+ + "\u0005l\u0000\u0000\u0750\u016b\u0001\u0000\u0000\u0000\u0751\u0752\u0003"+ + "\u00f0x\u0000\u0752\u0753\u0003\u00ceg\u0000\u0753\u0756\u0001\u0000\u0000"+ + "\u0000\u0754\u0756\u0003\u0170\u00b8\u0000\u0755\u0751\u0001\u0000\u0000"+ + "\u0000\u0755\u0754\u0001\u0000\u0000\u0000\u0756\u0758\u0001\u0000\u0000"+ + "\u0000\u0757\u0759\u0003\u016e\u00b7\u0000\u0758\u0757\u0001\u0000\u0000"+ + "\u0000\u0758\u0759\u0001\u0000\u0000\u0000\u0759\u016d\u0001\u0000\u0000"+ + "\u0000\u075a\u075b\u0007\u0013\u0000\u0000\u075b\u016f\u0001\u0000\u0000"+ + "\u0000\u075c\u075e\u0005\u008a\u0000\u0000\u075d\u075c\u0001\u0000\u0000"+ + "\u0000\u075d\u075e\u0001\u0000\u0000\u0000\u075e\u075f\u0001\u0000\u0000"+ + "\u0000\u075f\u0760\u0003\u0138\u009c\u0000\u0760\u0171\u0001\u0000\u0000"+ + "\u0000\u0761\u0762\u0005m\u0000\u0000\u0762\u0763\u0003\u00b0X\u0000\u0763"+ + "\u0764\u0005n\u0000\u0000\u0764\u0173\u0001\u0000\u0000\u0000\u0765\u0766"+ + "\u0005s\u0000\u0000\u0766\u0767\u0005i\u0000\u0000\u0767\u0768\u0003\u00ce"+ + "g\u0000\u0768\u0769\u0005j\u0000\u0000\u0769\u0175\u0001\u0000\u0000\u0000"+ + "\u076a\u0779\u0005i\u0000\u0000\u076b\u0772\u0003\u00f2y\u0000\u076c\u076f"+ + "\u0003\u0152\u00a9\u0000\u076d\u076e\u0005p\u0000\u0000\u076e\u0770\u0003"+ + "\u00f2y\u0000\u076f\u076d\u0001\u0000\u0000\u0000\u076f\u0770\u0001\u0000"+ + "\u0000\u0000\u0770\u0772\u0001\u0000\u0000\u0000\u0771\u076b\u0001\u0000"+ + "\u0000\u0000\u0771\u076c\u0001\u0000\u0000\u0000\u0772\u0774\u0001\u0000"+ + "\u0000\u0000\u0773\u0775\u0005w\u0000\u0000\u0774\u0773\u0001\u0000\u0000"+ + "\u0000\u0774\u0775\u0001\u0000\u0000\u0000\u0775\u0777\u0001\u0000\u0000"+ + "\u0000\u0776\u0778\u0005p\u0000\u0000\u0777\u0776\u0001\u0000\u0000\u0000"+ + "\u0777\u0778\u0001\u0000\u0000\u0000\u0778\u077a\u0001\u0000\u0000\u0000"+ + "\u0779\u0771\u0001\u0000\u0000\u0000\u0779\u077a\u0001\u0000\u0000\u0000"+ + "\u077a\u077b\u0001\u0000\u0000\u0000\u077b\u077c\u0005j\u0000\u0000\u077c"+ + "\u0177\u0001\u0000\u0000\u0000\u077d\u077e\u0003\u0152\u00a9\u0000\u077e"+ + "\u077f\u0005s\u0000\u0000\u077f\u0780\u0005h\u0000\u0000\u0780\u0179\u0001"+ + "\u0000\u0000\u0000\u0781\u0782\u0003\u00ceg\u0000\u0782\u017b\u0001\u0000"+ + "\u0000\u0000\u0783\u0788\u0005q\u0000\u0000\u0784\u0788\u0005\u0000\u0000"+ + "\u0001\u0785\u0788\u0005\u00a2\u0000\u0000\u0786\u0788\u0004\u00be\u0013"+ + "\u0000\u0787\u0783\u0001\u0000\u0000\u0000\u0787\u0784\u0001\u0000\u0000"+ + "\u0000\u0787\u0785\u0001\u0000\u0000\u0000\u0787\u0786\u0001\u0000\u0000"+ + "\u0000\u0788\u017d\u0001\u0000\u0000\u0000\u00c8\u018c\u0191\u0198\u01a2"+ + "\u01a8\u01ae\u01b8\u01c2\u01d0\u01d4\u01dd\u01e9\u01ed\u01f3\u01fc\u0206"+ + "\u0217\u0225\u0229\u0230\u0238\u0241\u0261\u0269\u0281\u0294\u02a3\u02b0"+ + "\u02b9\u02c7\u02d0\u02dc\u02e2\u02f6\u02ff\u0304\u0309\u030c\u0311\u0318"+ + "\u031e\u0327\u032d\u033a\u033d\u0341\u0345\u034d\u0355\u035a\u0362\u0364"+ + "\u0369\u0370\u0378\u037b\u0381\u0386\u0388\u038b\u0392\u0397\u03aa\u03b2"+ + "\u03b6\u03b9\u03bf\u03c3\u03c6\u03d0\u03d7\u03de\u03ea\u03f0\u03f7\u03fc"+ + "\u0402\u040e\u0414\u0418\u0420\u0424\u042a\u042d\u0433\u0438\u0451\u0474"+ + "\u0476\u048d\u0495\u04a0\u04a7\u04ae\u04b8\u04ca\u04e0\u04e2\u04ea\u04ee"+ + "\u04f2\u04f5\u04fe\u0504\u050e\u0516\u051c\u0525\u0530\u053b\u053f\u0541"+ + "\u054c\u0555\u0559\u055c\u0563\u056e\u0578\u057e\u0580\u058a\u0594\u0598"+ + "\u059c\u05a0\u05a7\u05af\u05ba\u05be\u05c2\u05ce\u05d2\u05d6\u05db\u05de"+ + "\u05e1\u05e8\u05ef\u0603\u0607\u060b\u060f\u061f\u0625\u0627\u062b\u062f"+ + "\u0632\u0636\u0638\u063e\u0646\u064b\u0656\u065c\u0663\u066e\u0673\u0677"+ + "\u067c\u0680\u0688\u0690\u0695\u0698\u06a0\u06a6\u06aa\u06ac\u06b1\u06b5"+ + "\u06b9\u06c0\u06dd\u06e8\u06ec\u06f4\u06f8\u06fa\u0702\u070b\u0713\u0718"+ + "\u0728\u072a\u0733\u0739\u073f\u0743\u074c\u0755\u0758\u075d\u076f\u0771"+ + "\u0774\u0777\u0779\u0787"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index 3705ddec4..7208a2cb7 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 +// Generated from /Users/joao/code/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -376,6 +376,41 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitSpecification(GobraParser.SpecificationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBackendAnnotationEntry(GobraParser.BackendAnnotationEntryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitListOfValues(GobraParser.ListOfValuesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSingleBackendAnnotation(GobraParser.SingleBackendAnnotationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBackendAnnotationList(GobraParser.BackendAnnotationListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBackendAnnotation(GobraParser.BackendAnnotationContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 5fa3adab8..d6b2cf9c2 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 +// Generated from /Users/joao/code/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -326,6 +326,36 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitSpecification(GobraParser.SpecificationContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#backendAnnotationEntry}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBackendAnnotationEntry(GobraParser.BackendAnnotationEntryContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#listOfValues}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitListOfValues(GobraParser.ListOfValuesContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#singleBackendAnnotation}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSingleBackendAnnotation(GobraParser.SingleBackendAnnotationContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#backendAnnotationList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBackendAnnotationList(GobraParser.BackendAnnotationListContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#backendAnnotation}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBackendAnnotation(GobraParser.BackendAnnotationContext ctx); /** * Visit a parse tree produced by {@link GobraParser#specStatement}. * @param ctx the parse tree diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index 3e40ac9ed..d2066094e 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -877,15 +877,18 @@ case class PTupleTerminationMeasure(tuple: Vector[PExpression], cond: Option[PEx sealed trait PSpecification extends PGhostNode case class PFunctionSpec( - pres: Vector[PExpression], - preserves: Vector[PExpression], - posts: Vector[PExpression], - terminationMeasures: Vector[PTerminationMeasure], - isPure: Boolean = false, - isTrusted: Boolean = false, - isOpaque: Boolean = false, + pres: Vector[PExpression], + preserves: Vector[PExpression], + posts: Vector[PExpression], + terminationMeasures: Vector[PTerminationMeasure], + backendAnnotations: Vector[PBackendAnnotation], + isPure: Boolean = false, + isTrusted: Boolean = false, + isOpaque: Boolean = false, ) extends PSpecification +case class PBackendAnnotation(key: String, values: Vector[String]) extends PGhostMisc + case class PBodyParameterInfo( /** * Stores parameters that have been declared as shared in the body of a function or method. diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index 62cd318fe..e52e4bb5a 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -144,14 +144,15 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter } def showSpec(spec: PSpecification): Doc = spec match { - case PFunctionSpec(pres, preserves, posts, measures, isPure, isTrusted, isOpaque) => + case PFunctionSpec(pres, preserves, posts, measures, backendAnnotations, isPure, isTrusted, isOpaque) => (if (isPure) showPure else emptyDoc) <> (if (isOpaque) showOpaque else emptyDoc) <> (if (isTrusted) showTrusted else emptyDoc) <> hcat(pres map (showPre(_) <> line)) <> - hcat(preserves map (showPreserves(_) <> line)) <> - hcat(posts map (showPost(_) <> line)) <> - hcat(measures map (showTerminationMeasure(_) <> line)) + hcat(preserves map (showPreserves(_) <> line)) <> + hcat(posts map (showPost(_) <> line)) <> + hcat(measures map (showTerminationMeasure(_) <> line)) <> + showBackendAnnotations(backendAnnotations) <> line case PLoopSpec(inv, measure) => hcat(inv map (showInv(_) <> line)) <> opt(measure)(showTerminationMeasure) <> line @@ -691,6 +692,12 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter def showLabel(id: PLabelNode): Doc = id.name + def showBackendAnnotation(annotation: PBackendAnnotation): Doc = + annotation.key <> parens(showList(annotation.values)(d => d)) + + def showBackendAnnotations(annotations: Vector[PBackendAnnotation]): Doc = + "#backend" <> brackets(showList(annotations)(showBackendAnnotation)) + // misc def showMisc(id: PMisc): Doc = id match { @@ -729,6 +736,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case expr: PMatchPattern => showMatchPattern(expr) case c: PMatchExpDefault => showMatchExpClause(c) case c: PMatchExpCase => showMatchExpClause(c) + case a: PBackendAnnotation => showBackendAnnotation(a) } } diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index 9d9721c35..6404e0453 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -10,7 +10,7 @@ import org.bitbucket.inkytonik.kiama import org.bitbucket.inkytonik.kiama.util.Trampolines.Done import viper.gobra.ast.printing.PrettyPrinterCombinators import viper.gobra.theory.Addressability -import viper.gobra.util.{Binary, Decimal, Hexadecimal, Octal} +import viper.gobra.util.{BackendAnnotation, Binary, Decimal, Hexadecimal, Octal} import viper.silver.ast.{Position => GobraPosition} import scala.collection.mutable @@ -144,29 +144,29 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter } def showFunction(f: Function): Doc = f match { - case Function(name, args, results, pres, posts, measures, body) => + case Function(name, args, results, pres, posts, measures, backendAnnotations, body) => "func" <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block(showStmt(b))) + spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <> opt(body)(b => block(showStmt(b))) } def showPureFunction(f: PureFunction): Doc = f match { - case PureFunction(name, args, results, pres, posts, measures, body, isOpaque) => + case PureFunction(name, args, results, pres, posts, measures, backendAnnotations, body, isOpaque) => val funcPrefix = (if (isOpaque) text("opaque ") else emptyDoc) <> "pure func" funcPrefix <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block("return" <+> showExpr(b))) + spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <> opt(body)(b => block("return" <+> showExpr(b))) } def showMethod(m: Method): Doc = m match { - case Method(receiver, name, args, results, pres, posts, measures, body) => + case Method(receiver, name, args, results, pres, posts, measures, backendAnnotations, body) => "func" <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block(showStmt(b))) + spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <> opt(body)(b => block(showStmt(b))) } def showPureMethod(m: PureMethod): Doc = m match { - case PureMethod(receiver, name, args, results, pres, posts, measures, body, isOpaque) => + case PureMethod(receiver, name, args, results, pres, posts, measures, backendAnnotations, body, isOpaque) => val funcPrefix = (if (isOpaque) text("opaque ") else emptyDoc) <> "pure func" funcPrefix <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block("return" <+> showExpr(b))) + spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <> opt(body)(b => block("return" <+> showExpr(b))) } def showMethodSubtypeProof(m: MethodSubtypeProof): Doc = m match { @@ -221,6 +221,12 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case Field(name, typ, _) => "field" <> name <> ":" <+> showType(typ) }) + def showBackendAnnotations(annotations: Vector[BackendAnnotation]): Doc = + "#backend" <> brackets(showList(annotations)(showBackendAnnotation)) <> line + + def showBackendAnnotation(annotation: BackendAnnotation): Doc = + annotation.key <> parens(showList(annotation.values)(d => d)) + def showClosureSpec(spec: ClosureSpec): Doc = showProxy(spec.func) <> braces(ssep(spec.params.map(p => p._1.toString <> colon <> showExpr(p._2)).toSeq, comma <> space)) @@ -351,9 +357,10 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter showVar(resTarget) <> "," <+> showVar(successTarget) <+> "=" <+> showExpr(mapLookup) case PredExprFold(base, args, p) => "fold" <+> "acc" <> parens(showExpr(base) <> parens(showExprList(args)) <> "," <+> showExpr(p)) case PredExprUnfold(base, args, p) => "unfold" <+> "acc" <> parens(showExpr(base) <> parens(showExprList(args)) <> "," <+> showExpr(p)) - case Outline(_, pres, posts, measures, body, trusted) => - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> - "outline" <> (if (trusted) emptyDoc else parens(nest(line <> showStmt(body)) <> line)) + case Outline(_, pres, posts, measures, backendAnnotations, body, trusted) => + spec(showPreconditions(pres) <> + showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <> + "outline" <> (if (trusted) emptyDoc else parens(nest(line <> showStmt(body)) <> line)) case Continue(l, _) => "continue" <+> opt(l)(text) case Break(l, _) => "break" <+> opt(l)(text) }) @@ -607,14 +614,16 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case BoolLit(b) => if (b) "true" else "false" case NilLit(t) => parens("nil" <> ":" <> showType(t)) - case FunctionLit(name, args, captured, results, pres, posts, measures, body) => + case FunctionLit(name, args, captured, results, pres, posts, measures, backendAnnotations, body) => "func" <+> showProxy(name) <> showCaptured(captured) <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> + spec(showPreconditions(pres) <> showPostconditions(posts) <> + showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <> opt(body)(b => block(showStmt(b))) - case PureFunctionLit(name, args, captured, results, pres, posts, measures, body) => + case PureFunctionLit(name, args, captured, results, pres, posts, measures, backendAnnotations, body) => "pure func" <+> showProxy(name) <> showCaptured(captured) <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> opt(body)(b => block("return" <+> showExpr(b))) + spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) <> + opt(body)(b => block("return" <+> showExpr(b))) case ArrayLit(len, typ, elems) => { val lenP = brackets(len.toString) @@ -680,29 +689,33 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter { override def showFunction(f: Function): Doc = f match { - case Function(name, args, results, pres, posts, measures, _) => + case Function(name, args, results, pres, posts, measures, backendAnnotations, _) => "func" <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) + spec(showPreconditions(pres) <> + showPostconditions(posts) <> showTerminationMeasures(measures) <> showBackendAnnotations(backendAnnotations)) } override def showPureFunction(f: PureFunction): Doc = f match { - case PureFunction(name, args, results, pres, posts, measures, _, isOpaque) => + case PureFunction(name, args, results, pres, posts, measures, backendAnnotations, _, isOpaque) => val funcPrefix = if (isOpaque) "pure opaque func" else "pure func" funcPrefix <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) + spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> + showBackendAnnotations(backendAnnotations)) } override def showMethod(m: Method): Doc = m match { - case Method(receiver, name, args, results, pres, posts, measures, _) => + case Method(receiver, name, args, results, pres, posts, measures, backendAnnotations, _) => "func" <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) + spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> + showBackendAnnotations(backendAnnotations)) } override def showPureMethod(m: PureMethod): Doc = m match { - case PureMethod(receiver, name, args, results, pres, posts, measures, _, isOpaque) => + case PureMethod(receiver, name, args, results, pres, posts, measures, backendAnnotations, _, isOpaque) => val funcPrefix = if (isOpaque) "pure opaque func" else "pure func" funcPrefix <+> parens(showVarDecl(receiver)) <+> name.name <> parens(showFormalArgList(args)) <+> parens(showVarDeclList(results)) <> - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) + spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures) <> + showBackendAnnotations(backendAnnotations)) } override def showFPredicate(predicate: FPredicate): Doc = predicate match { @@ -794,8 +807,10 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter { case PredExprUnfold(base, args, p) => "unfold" <+> "acc" <> parens(showExpr(base) <> parens(showExprList(args)) <> "," <+> showExpr(p)) case Continue(l, _) => "continue" <+> opt(l)(text) case Break(l, _) => "break" <+> opt(l)(text) - case Outline(_, pres, posts, measures, _, _) => - spec(showPreconditions(pres) <> showPostconditions(posts) <> showTerminationMeasures(measures)) <> + case Outline(_, pres, posts, measures, backendAnnotations, _, _) => + spec(showPreconditions(pres) <> + showPostconditions(posts) <> showTerminationMeasures(measures)) <> + showBackendAnnotations(backendAnnotations) <> "outline" } } diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index 0bda28b5a..88e5caaa4 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -18,7 +18,7 @@ import viper.gobra.reporting.Source import viper.gobra.reporting.Source.Parser import viper.gobra.theory.Addressability import viper.gobra.translator.Names -import viper.gobra.util.{Decimal, NumBase, TypeBounds, Violation} +import viper.gobra.util.{BackendAnnotation, Decimal, NumBase, TypeBounds, Violation} import viper.gobra.util.TypeBounds.{IntegerKind, UnboundedInteger} import viper.gobra.util.Violation.violation @@ -147,6 +147,7 @@ sealed trait MethodMember extends MethodLikeMember { def pres: Vector[Assertion] def posts: Vector[Assertion] def terminationMeasures: Vector[TerminationMeasure] + def backendAnnotations: Vector[BackendAnnotation] } sealed trait FunctionLikeMember extends Member { @@ -159,6 +160,7 @@ sealed trait FunctionLikeMemberOrLit extends Node { def pres: Vector[Assertion] def posts: Vector[Assertion] def terminationMeasures: Vector[TerminationMeasure] + def backendAnnotations: Vector[BackendAnnotation] } sealed trait FunctionMember extends FunctionLikeMember with FunctionLikeMemberOrLit @@ -185,6 +187,7 @@ case class Method( override val pres: Vector[Assertion], override val posts: Vector[Assertion], override val terminationMeasures: Vector[TerminationMeasure], + override val backendAnnotations: Vector[BackendAnnotation], body: Option[MethodBody] )(val info: Source.Parser.Info) extends Member with MethodMember @@ -196,6 +199,7 @@ case class PureMethod( override val pres: Vector[Assertion], override val posts: Vector[Assertion], override val terminationMeasures: Vector[TerminationMeasure], + override val backendAnnotations: Vector[BackendAnnotation], body: Option[Expr], isOpaque: Boolean )(val info: Source.Parser.Info) extends Member with MethodMember { @@ -242,6 +246,7 @@ case class Function( override val pres: Vector[Assertion], override val posts: Vector[Assertion], override val terminationMeasures: Vector[TerminationMeasure], + override val backendAnnotations: Vector[BackendAnnotation], body: Option[MethodBody] )(val info: Source.Parser.Info) extends Member with FunctionMember @@ -252,6 +257,7 @@ case class PureFunction( override val pres: Vector[Assertion], override val posts: Vector[Assertion], override val terminationMeasures: Vector[TerminationMeasure], + override val backendAnnotations: Vector[BackendAnnotation], body: Option[Expr], isOpaque: Boolean )(val info: Source.Parser.Info) extends Member with FunctionMember { @@ -451,6 +457,7 @@ case class Outline( pres: Vector[Assertion], posts: Vector[Assertion], terminationMeasures: Vector[TerminationMeasure], + val backendAnnotations: Vector[BackendAnnotation], body: Stmt, trusted: Boolean, )(val info: Source.Parser.Info) extends Stmt @@ -1114,6 +1121,7 @@ case class FunctionLit( override val pres: Vector[Assertion], override val posts: Vector[Assertion], override val terminationMeasures: Vector[TerminationMeasure], + override val backendAnnotations: Vector[BackendAnnotation], body: Option[MethodBody] )(val info: Source.Parser.Info) extends FunctionLitLike { override def typ: Type = FunctionT(args.map(_.typ), results.map(_.typ), Addressability.literal) @@ -1127,6 +1135,7 @@ case class PureFunctionLit( override val pres: Vector[Assertion], override val posts: Vector[Assertion], override val terminationMeasures: Vector[TerminationMeasure], + override val backendAnnotations: Vector[BackendAnnotation], body: Option[Expr] )(val info: Source.Parser.Info) extends FunctionLitLike { override def typ: Type = FunctionT(args.map(_.typ), results.map(_.typ), Addressability.literal) diff --git a/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala b/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala index 1fa123add..af4eb1036 100644 --- a/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala +++ b/src/main/scala/viper/gobra/ast/internal/transform/CGEdgesTerminationTransform.scala @@ -102,7 +102,7 @@ object CGEdgesTerminationTransform extends InternalTransform { stmts = assumeFalse +: optCallsToImpls )(src) } - val newMember = in.Method(m.receiver, m.name, m.args, m.results, m.pres, m.posts, m.terminationMeasures, Some(newBody.toMethodBody))(src) + val newMember = in.Method(m.receiver, m.name, m.args, m.results, m.pres, m.posts, m.terminationMeasures, Vector.empty, Some(newBody.toMethodBody))(src) methodsToRemove += m methodsToAdd += newMember definedMethodsDelta += proxy -> newMember diff --git a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala index 96cd1051d..d5d97d8c6 100644 --- a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala +++ b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala @@ -25,27 +25,27 @@ object OverflowChecksTransform extends InternalTransform { // adds overflow checks per statement that contains subexpressions of bounded integer type and adds assume /// statements at the beginning of a function or method body assuming that the value of an argument (of // bounded integer type) respects the bounds. - case f@Function(name, args, results, pres, posts, terminationMeasure, body) => - Function(name, args, results, pres, posts, terminationMeasure, body map computeNewBody)(f.info) + case f@Function(name, args, results, pres, posts, terminationMeasure, annotations, body) => + Function(name, args, results, pres, posts, terminationMeasure, annotations, body map computeNewBody)(f.info) // same as functions - case m@Method(receiver, name, args, results, pres, posts, terminationMeasure,body) => - Method(receiver, name, args, results, pres, posts, terminationMeasure, body map computeNewBody)(m.info) + case m@Method(receiver, name, args, results, pres, posts, terminationMeasure, annotations, body) => + Method(receiver, name, args, results, pres, posts, terminationMeasure, annotations, body map computeNewBody)(m.info) // Adds pre-conditions stating the bounds of each argument and a post-condition to check if the body expression // overflows - case f@PureFunction(name, args, results, pres, posts, terminationMeasure, body, isOpaque) => body match { + case f@PureFunction(name, args, results, pres, posts, terminationMeasure, annotations, body, isOpaque) => body match { case Some(expr) => val newPost = posts ++ getPureBlockPosts(expr, results) - PureFunction(name, args, results, pres, newPost, terminationMeasure, body, isOpaque)(f.info) + PureFunction(name, args, results, pres, newPost, terminationMeasure, annotations, body, isOpaque)(f.info) case None => f } // Same as pure functions - case m@PureMethod(receiver, name, args, results, pres, posts, terminationMeasure, body, isOpaque) => body match { + case m@PureMethod(receiver, name, args, results, pres, posts, terminationMeasure, annotations, body, isOpaque) => body match { case Some(expr) => val newPost = posts ++ getPureBlockPosts(expr, results) - PureMethod(receiver, name, args, results, pres, newPost, terminationMeasure, body, isOpaque)(m.info) + PureMethod(receiver, name, args, results, pres, newPost, terminationMeasure, annotations, body, isOpaque)(m.info) case None => m } diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 2dafaa58e..98f5ffd1b 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -21,7 +21,7 @@ import viper.gobra.reporting.{DesugaredMessage, Source} import viper.gobra.theory.Addressability import viper.gobra.translator.Names import viper.gobra.util.Violation.violation -import viper.gobra.util.{Constants, DesugarWriter, GobraExecutionContext, Violation} +import viper.gobra.util.{BackendAnnotation, Constants, DesugarWriter, GobraExecutionContext, Violation} import java.util.concurrent.atomic.AtomicLong import scala.annotation.{tailrec, unused} @@ -564,6 +564,10 @@ object Desugar extends LazyLogging { typeD(DeclaredT(decl, info), Addressability.Exclusive)(meta(decl, info)) } + def desugarBackendAnnotations(annotations: Vector[PBackendAnnotation]): Vector[BackendAnnotation] = { + annotations map { case PBackendAnnotation(key, value) => BackendAnnotation(key, value) } + } + def functionD(decl: PFunctionDecl): in.FunctionMember = if (decl.spec.isPure) pureFunctionD(decl) else { @@ -572,7 +576,7 @@ object Desugar extends LazyLogging { val functionInfo = functionMemberOrLitD(decl, fsrc, new FunctionContext(_ => _ => in.Seqn(Vector.empty)(fsrc))) in.Function(name, functionInfo.args, functionInfo.results, functionInfo.pres, functionInfo.posts, - functionInfo.terminationMeasures, functionInfo.body)(fsrc) + functionInfo.terminationMeasures, functionInfo.backendAnnotations, functionInfo.body)(fsrc) } private case class FunctionInfo(args: Vector[in.Parameter.In], @@ -581,6 +585,7 @@ object Desugar extends LazyLogging { pres: Vector[in.Assertion], posts: Vector[in.Assertion], terminationMeasures: Vector[in.TerminationMeasure], + backendAnnotations: Vector[BackendAnnotation], body: Option[in.MethodBody]) private def functionMemberOrLitD(decl: PFunctionOrClosureDecl, fsrc: Meta, outerCtx: FunctionContext): FunctionInfo = { @@ -693,7 +698,8 @@ object Desugar extends LazyLogging { in.MethodBody(vars, in.MethodBodySeqn(body)(fsrc), resultAssignments)(fsrc) } - FunctionInfo(args, capturedWithAliases, returns, pres, posts, terminationMeasures, bodyOpt) + val annotations = desugarBackendAnnotations(decl.spec.backendAnnotations) + FunctionInfo(args, capturedWithAliases, returns, pres, posts, terminationMeasures, annotations, bodyOpt) } def pureFunctionD(decl: PFunctionDecl): in.PureFunction = { @@ -701,7 +707,8 @@ object Desugar extends LazyLogging { val fsrc = meta(decl, info) val funcInfo = pureFunctionMemberOrLitD(decl, fsrc, new FunctionContext(_ => _ => in.Seqn(Vector.empty)(fsrc)), info) - in.PureFunction(name, funcInfo.args, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.body, funcInfo.isOpaque)(fsrc) + in.PureFunction(name, funcInfo.args, funcInfo.results, funcInfo.pres, + funcInfo.posts, funcInfo.terminationMeasures, funcInfo.backendAnnotations, funcInfo.body, funcInfo.isOpaque)(fsrc) } private case class PureFunctionInfo(args: Vector[in.Parameter.In], @@ -710,6 +717,7 @@ object Desugar extends LazyLogging { pres: Vector[in.Assertion], posts: Vector[in.Assertion], terminationMeasures: Vector[in.TerminationMeasure], + backendAnnotations: Vector[BackendAnnotation], body: Option[in.Expr], isOpaque: Boolean) @@ -769,8 +777,9 @@ object Desugar extends LazyLogging { } implicitConversion(res.typ, returns.head.typ, res) } + val annotations = desugarBackendAnnotations(decl.spec.backendAnnotations) - PureFunctionInfo(args, capturedWithAliases, returns, pres, posts, terminationMeasure, bodyOpt, isOpaque) + PureFunctionInfo(args, capturedWithAliases, returns, pres, posts, terminationMeasure, annotations, bodyOpt, isOpaque) } @@ -883,7 +892,9 @@ object Desugar extends LazyLogging { in.MethodBody(vars, in.MethodBodySeqn(body)(fsrc), resultAssignments)(fsrc) } - in.Method(recv, name, args, returns, pres, posts, terminationMeasure, bodyOpt)(fsrc) + val annotations = desugarBackendAnnotations(decl.spec.backendAnnotations) + + in.Method(recv, name, args, returns, pres, posts, terminationMeasure, annotations, bodyOpt)(fsrc) } def pureMethodD(decl: PMethodDecl): in.PureMethod = { @@ -937,7 +948,8 @@ object Desugar extends LazyLogging { } implicitConversion(res.typ, returns.head.typ, res) } - in.PureMethod(recv, name, args, returns, pres, posts, terminationMeasure, bodyOpt, isOpaque)(fsrc) + val annotations = desugarBackendAnnotations(decl.spec.backendAnnotations) + in.PureMethod(recv, name, args, returns, pres, posts, terminationMeasure, annotations, bodyOpt, isOpaque)(fsrc) } def fpredicateD(decl: PFPredicateDecl): in.FPredicate = { @@ -1850,11 +1862,12 @@ object Desugar extends LazyLogging { val pres = (n.spec.pres ++ n.spec.preserves) map preconditionD(ctx, info) val posts = (n.spec.preserves ++ n.spec.posts) map postconditionD(ctx, info) val terminationMeasures = sequence(n.spec.terminationMeasures map terminationMeasureD(ctx, info)).res + val annotations = desugarBackendAnnotations(n.spec.backendAnnotations) if (!n.spec.isTrusted) { for { body <- seqn(stmtD(ctx, info)(n.body)) - } yield in.Outline(name, pres, posts, terminationMeasures, body, trusted = false)(src) + } yield in.Outline(name, pres, posts, terminationMeasures, annotations, body, trusted = false)(src) } else { val declared = info.freeDeclared(n).map(localVarContextFreeD(_, info)) // The dummy body preserves the reads and writes of the real body that target free variables. @@ -1879,7 +1892,7 @@ object Desugar extends LazyLogging { for { // since the body of an outline is not a separate scope, we have to preserve variable declarations. _ <- declare(declared:_*) - } yield in.Outline(name, pres, posts, terminationMeasures, dummyBody, trusted = true)(src) + } yield in.Outline(name, pres, posts, terminationMeasures, annotations, dummyBody, trusted = true)(src) } @@ -2990,13 +3003,13 @@ object Desugar extends LazyLogging { val funcInfo = functionMemberOrLitD(lit.decl, meta(lit, info), ctx) val src = meta(lit, info) val name = functionLitProxyD(lit, info) - in.FunctionLit(name, funcInfo.args, funcInfo.captured, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.body)(src) + in.FunctionLit(name, funcInfo.args, funcInfo.captured, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.backendAnnotations, funcInfo.body)(src) } def pureFunctionLitD(ctx: FunctionContext, info: TypeInfo)(lit: PFunctionLit): in.PureFunctionLit = { val funcInfo = pureFunctionMemberOrLitD(lit.decl, meta(lit, info), ctx, info) val name = functionLitProxyD(lit, info) - in.PureFunctionLit(name, funcInfo.args, funcInfo.captured, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.body)(meta(lit, info)) + in.PureFunctionLit(name, funcInfo.args, funcInfo.captured, funcInfo.results, funcInfo.pres, funcInfo.posts, funcInfo.terminationMeasures, funcInfo.backendAnnotations, funcInfo.body)(meta(lit, info)) } def capturedVarD(v: PIdnNode): (in.Parameter.In, in.LocalVar) = { @@ -3281,12 +3294,13 @@ object Desugar extends LazyLogging { val pres = (m.spec.pres ++ m.spec.preserves) map preconditionD(specCtx, info) val posts = (m.spec.preserves ++ m.spec.posts) map postconditionD(specCtx, info) val terminationMeasures = sequence(m.spec.terminationMeasures map terminationMeasureD(specCtx, info)).res + val annotations = desugarBackendAnnotations(m.spec.backendAnnotations) val isOpaque = m.spec.isOpaque val mem = if (m.spec.isPure) { - in.PureMethod(recv, proxy, args, returns, pres, posts, terminationMeasures, None, isOpaque)(src) + in.PureMethod(recv, proxy, args, returns, pres, posts, terminationMeasures, annotations, None, isOpaque)(src) } else { - in.Method(recv, proxy, args, returns, pres, posts, terminationMeasures, None)(src) + in.Method(recv, proxy, args, returns, pres, posts, terminationMeasures, annotations, None)(src) } definedMethods += (proxy -> mem) AdditionalMembers.addMember(mem) @@ -3536,6 +3550,7 @@ object Desugar extends LazyLogging { a.withInfo(a.info.asInstanceOf[Source.Parser.Single].createAnnotatedInfo(ImportPreNotEstablished)) }, terminationMeasures = Vector.empty, + backendAnnotations = Vector.empty, body = Some(in.MethodBody(Vector.empty, in.MethodBodySeqn(Vector.empty)(src), Vector.empty)(src)), )(src) } @@ -3570,6 +3585,7 @@ object Desugar extends LazyLogging { pres = mainPkgPosts, posts = mainFuncPreD, terminationMeasures = Vector.empty, + backendAnnotations = Vector.empty, body = Some(in.MethodBody(Vector.empty, in.MethodBodySeqn(Vector.empty)(src), Vector.empty)(src)), )(src) } @@ -3607,6 +3623,7 @@ object Desugar extends LazyLogging { posts = progPosts, // in our verification approach, the initialization code must be proven to terminate terminationMeasures = Vector(in.TupleTerminationMeasure(Vector(), None)(src)), + backendAnnotations = Vector.empty, body = Some( in.MethodBody( decls = Vector(), diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index ff64e3de1..cb03887e4 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -425,7 +425,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole */ override def visitMethodSpec(ctx: GobraParser.MethodSpecContext): PMethodSig = { val ghost = has(ctx.GHOST()) - val spec = if (ctx.specification() != null) visitSpecification(ctx.specification()) else PFunctionSpec(Vector.empty,Vector.empty,Vector.empty, Vector.empty).at(ctx) + val spec = if (ctx.specification() != null) + visitSpecification(ctx.specification()) + else + PFunctionSpec(Vector.empty,Vector.empty,Vector.empty, Vector.empty, Vector.empty).at(ctx) // The name of each explicitly specified method must be unique and not blank. val id = idnDef.get(ctx.IDENTIFIER()) val args = visitNode[Vector[Vector[PParameter]]](ctx.parameters()) @@ -869,6 +872,19 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * * */ override def visitSpecification(ctx: GobraParser.SpecificationContext): PFunctionSpec = { + // Get the backend options if available + val annotations = { + if (has(ctx.backendAnnotation()) && has(ctx.backendAnnotation().backendAnnotationList())) + ctx + .backendAnnotation() + .backendAnnotationList() + .singleBackendAnnotation() + .asScala + .map(visitSingleBackendAnnotation) + .toVector + else + Vector.empty + } // Group the specifications by keyword val groups = ctx.specStatement().asScala.view.groupBy(_.kind.getType) // Get the respective groups @@ -877,7 +893,16 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole val posts = groups.getOrElse(GobraParser.POST, Vector.empty).toVector.map(s => visitNode[PExpression](s.assertion().expression())) val terms = groups.getOrElse(GobraParser.DEC, Vector.empty).toVector.map(s => visitTerminationMeasure(s.terminationMeasure())) - PFunctionSpec(pres, preserves, posts, terms, isPure = ctx.pure, isTrusted = ctx.trusted, isOpaque = ctx.opaque) + PFunctionSpec( + pres, + preserves, + posts, + terms, + annotations, + isPure = ctx.pure, + isTrusted = ctx.trusted, + isOpaque = ctx.opaque + ) } /** @@ -909,6 +934,21 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole case Vector("ghost", decl : Vector[PGhostifiableMember] @unchecked) => decl.map(PExplicitGhostMember(_).at(ctx)) } + override def visitSingleBackendAnnotation(ctx: SingleBackendAnnotationContext): PBackendAnnotation = { + val key = visit(ctx.backendAnnotationEntry).toString + val values = + if (has(ctx.listOfValues())) { + ctx + .listOfValues() + .backendAnnotationEntry() + .asScala + .view.map(ctx => visit(ctx).toString) + .toVector + } else { + Vector.empty + } + PBackendAnnotation(key, values).at(ctx) + } //region Implementation proofs /** diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 5900fa9e6..300a3000f 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -493,7 +493,7 @@ object Parser extends LazyLogging { case n@PTupleTerminationMeasure(_, cond) => PWildcardMeasure(cond).at(n) case t => t } - PFunctionSpec(spec.pres, spec.preserves, spec.posts, replacedMeasures, spec.isPure, spec.isTrusted) + PFunctionSpec(spec.pres, spec.preserves, spec.posts, replacedMeasures, spec.backendAnnotations, spec.isPure, spec.isTrusted) } val replaceTerminationMeasuresForFunctionsAndMethods: Strategy = diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala index 528e45d63..d2569a98c 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala @@ -160,6 +160,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case e => Violation.violation(s"expected a method signature of an interface, but got $e") } } + case _: PBackendAnnotation => noMessages } private[typing] def ghostMiscType(misc: PGhostMisc): Type = misc match { @@ -205,6 +206,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case _: PMethodImplementationProof => UnknownType case _: PImplementationProofPredicateAlias => UnknownType + case _: PBackendAnnotation => UnknownType } private[typing] def ghostMemberType(typeMember: GhostTypeMember): Type = typeMember match { @@ -219,7 +221,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => } implicit lazy val wellDefSpec: WellDefinedness[PSpecification] = createWellDef { - case n@ PFunctionSpec(pres, preserves, posts, terminationMeasures, isPure, _, isOpaque) => + case n@ PFunctionSpec(pres, preserves, posts, terminationMeasures, _, isPure, _, isOpaque) => pres.flatMap(assignableToSpec) ++ preserves.flatMap(assignableToSpec) ++ posts.flatMap(assignableToSpec) ++ preserves.flatMap(e => allChildren(e).flatMap(illegalPreconditionNode)) ++ pres.flatMap(e => allChildren(e).flatMap(illegalPreconditionNode)) ++ diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala index 1cf3b63b1..039e9ea39 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala @@ -21,7 +21,7 @@ class GhostLessPrinter(classifier: GhostClassifier) extends DefaultPrettyPrinter rec, filterParamList(args), filterResult(res), - PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty), + PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty), body.map( b => (PBodyParameterInfo(Vector.empty), b._2) ) ) ) @@ -32,7 +32,7 @@ class GhostLessPrinter(classifier: GhostClassifier) extends DefaultPrettyPrinter id, filterParamList(args), filterResult(res), - PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty), + PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty), body.map( b => (PBodyParameterInfo(Vector.empty), b._2) ) ) ) @@ -170,7 +170,7 @@ class GhostLessPrinter(classifier: GhostClassifier) extends DefaultPrettyPrinter case PFunctionLit(_, PClosureDecl(args, result, _, body)) => super.showMisc(PClosureDecl( filterParamList(args), filterResult(result), - PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty), + PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty), body.map( b => (PBodyParameterInfo(Vector.empty), b._2) ) )) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala index c28e33755..a6606258a 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala @@ -77,14 +77,15 @@ class GoifyingPrinter(info: TypeInfoImpl) extends DefaultPrettyPrinter { * Shows the Goified version of the function / method specification */ override def showSpec(spec: PSpecification): Doc = spec match { - case PFunctionSpec(pres, preserves, posts, measures, isPure, isTrusted, isOpaque) => + case PFunctionSpec(pres, preserves, posts, measures, backendAnnotations, isPure, isTrusted, isOpaque) => (if (isPure) specComment <+> showPure else emptyDoc) <> (if (isOpaque) specComment <+> showOpaque else emptyDoc) <> (if (isTrusted) specComment <+> showTrusted else emptyDoc) <> hcat(pres map (p => specComment <+> showPre(p) <> line)) <> hcat(preserves map (p => specComment <+> showPreserves(p) <> line)) <> hcat(posts map (p => specComment <+> showPost(p) <> line)) <> - hcat(measures map (p => specComment <+> showTerminationMeasure(p) <> line)) + hcat(measures map (p => specComment <+> showTerminationMeasure(p) <> line)) <> + specComment <+> showBackendAnnotations(backendAnnotations) <> line case PLoopSpec(inv, measure) => hcat(inv map (p => specComment <+> showInv(p) <> line)) <> @@ -125,7 +126,7 @@ class GoifyingPrinter(info: TypeInfoImpl) extends DefaultPrettyPrinter { rec, getActualParams(args), getActualResult(res), - PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty), + PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty), body ) ) @@ -137,7 +138,7 @@ class GoifyingPrinter(info: TypeInfoImpl) extends DefaultPrettyPrinter { id, getActualParams(args), getActualResult(res), - PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty), + PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty, Vector.empty), body ) ) diff --git a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala index 56049875b..44835e447 100644 --- a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala @@ -302,6 +302,7 @@ class StringEncoding extends LeafTypeEncoding { pres = Vector(pre), posts = Vector(), terminationMeasures = Vector(in.WildcardMeasure(None)(info)), + backendAnnotations = Vector.empty, body = None, isOpaque = false )(info) diff --git a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala index 1719ca9c2..611748049 100644 --- a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala +++ b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala @@ -209,7 +209,7 @@ protected class ClosureSpecsEncoder { val satisfiesSpec = in.ExprAssertion(in.ClosureImplements(result, in.ClosureSpec(func, Map.empty)(info))(info))(info) val (args, captAssertions) = capturedArgsAndAssertions(ctx)(result, captured(ctx)(func), info) val notNil = in.ExprAssertion(in.UneqCmp(result, in.NilLit(genericFuncType)(info))(info))(info) - val getter = in.PureFunction(proxy, args, Vector(result), Vector.empty, Vector(satisfiesSpec) ++ captAssertions :+ notNil, Vector.empty, None, false)(memberOrLit(ctx)(func).info) + val getter = in.PureFunction(proxy, args, Vector(result), Vector.empty, Vector(satisfiesSpec) ++ captAssertions :+ notNil, Vector.empty, Vector.empty, None, false)(memberOrLit(ctx)(func).info) ctx.defaultEncoding.pureFunction(getter)(ctx) } @@ -287,26 +287,27 @@ protected class ClosureSpecsEncoder { )(spec.info)) else None val args = Vector(closurePar) ++ captArgs ++ func.args val pres = implementsAssertion.toVector ++ fromClosureGetter ++ func.pres + val annotations = func.backendAnnotations // Store the origin of the spec; if the first precondition fails, we use this to recognise and transform the error message implementAssertionSpecOriginToStr += spec.info.origin.get -> spec.info.tag func match { case _: in.Function => - val m = in.Function(proxy, args, func.results, pres, func.posts, func.terminationMeasures, None)(spec.info) + val m = in.Function(proxy, args, func.results, pres, func.posts, func.terminationMeasures, annotations, None)(spec.info) ctx.defaultEncoding.function(m)(ctx) case lit: in.FunctionLit => val body = if (spec.params.isEmpty) lit.body else None - val func = in.Function(proxy, args, lit.results, pres, lit.posts, lit.terminationMeasures, body)(lit.info) + val func = in.Function(proxy, args, lit.results, pres, lit.posts, lit.terminationMeasures, annotations, body)(lit.info) ctx.defaultEncoding.function(func)(ctx) case f: in.PureFunction => val posts = func.posts ++ assertionFromPureFunctionBody(f.body, f.results.head) - val m = in.PureFunction(proxy, args, f.results, pres, posts, f.terminationMeasures, None, f.isOpaque)(spec.info) + val m = in.PureFunction(proxy, args, f.results, pres, posts, f.terminationMeasures, annotations, None, f.isOpaque)(spec.info) ctx.defaultEncoding.pureFunction(m)(ctx) case lit: in.PureFunctionLit => val body = if (spec.params.isEmpty) lit.body else None val posts = lit.posts ++ (if (spec.params.isEmpty) Vector.empty else assertionFromPureFunctionBody(lit.body, lit.results.head).toVector) - val func = in.PureFunction(proxy, args, lit.results, pres, posts, lit.terminationMeasures, body, false)(lit.info) + val func = in.PureFunction(proxy, args, lit.results, pres, posts, lit.terminationMeasures, annotations, body, false)(lit.info) ctx.defaultEncoding.pureFunction(func)(ctx) } } diff --git a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultMethodEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultMethodEncoding.scala index ce944bb7c..ea60fd8c0 100644 --- a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultMethodEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultMethodEncoding.scala @@ -10,7 +10,7 @@ import org.bitbucket.inkytonik.kiama.==> import viper.gobra.ast.{internal => in} import viper.gobra.translator.encodings.combinators.Encoding import viper.gobra.translator.context.Context -import viper.gobra.translator.util.{ViperUtil => vu} +import viper.gobra.translator.util.{VprInfo, ViperUtil => vu} import viper.silver.ast.Method import viper.silver.{ast => vpr} @@ -49,6 +49,8 @@ class DefaultMethodEncoding extends Encoding { } yield vu.seqn(Vector(init, core))(pos, info, errT) }}) + annotatedInfo = VprInfo.attachAnnotations(x.backendAnnotations, info) + method = vpr.Method( name = x.name.uniqueName, formalArgs = vRecv +: vArgs, @@ -56,7 +58,7 @@ class DefaultMethodEncoding extends Encoding { pres = pres ++ measures, posts = posts, body = body - )(pos, info, errT) + )(pos, annotatedInfo, errT) } yield method } @@ -86,6 +88,8 @@ class DefaultMethodEncoding extends Encoding { } yield vu.seqn(Vector(init, core))(pos, info, errT) }}) + annotatedInfo = VprInfo.attachAnnotations(x.backendAnnotations, info) + method = vpr.Method( name = x.name.name, formalArgs = vArgs, @@ -93,7 +97,7 @@ class DefaultMethodEncoding extends Encoding { pres = pres ++ measures, posts = posts, body = body - )(pos, info, errT) + )(pos, annotatedInfo, errT) } yield method } diff --git a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala index 518a9f446..55352d75c 100644 --- a/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/defaults/DefaultPureMethodEncoding.scala @@ -27,7 +27,7 @@ class DefaultPureMethodEncoding extends Encoding { require(meth.results.size == 1) val (pos, info, errT) = meth.vprMeta - val annotatedInfo = VprInfo.maybeAttachOpaque(info, meth.isOpaque) + val infoWithOpaque = VprInfo.maybeAttachOpaque(info, meth.isOpaque) val vRecv = ctx.variable(meth.receiver) val vRecvPres = ctx.varPrecondition(meth.receiver).toVector @@ -57,6 +57,8 @@ class DefaultPureMethodEncoding extends Encoding { )(ctx) }) + annotatedInfo = VprInfo.attachAnnotations(meth.backendAnnotations, infoWithOpaque) + function = vpr.Function( name = meth.name.uniqueName, formalArgs = vRecv +: vArgs, @@ -73,7 +75,7 @@ class DefaultPureMethodEncoding extends Encoding { require(func.results.size == 1) val (pos, info, errT) = func.vprMeta - val annotatedInfo = VprInfo.maybeAttachOpaque(info, func.isOpaque) + val infoWithOpaque = VprInfo.maybeAttachOpaque(info, func.isOpaque) val vArgs = func.args.map(ctx.variable) val vArgPres = func.args.flatMap(ctx.varPrecondition) @@ -100,6 +102,8 @@ class DefaultPureMethodEncoding extends Encoding { )(ctx) }) + annotatedInfo = VprInfo.attachAnnotations(func.backendAnnotations, infoWithOpaque) + function = vpr.Function( name = func.name.name, formalArgs = vArgs, diff --git a/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala index 03828766f..03d74b055 100644 --- a/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/interfaces/InterfaceEncoding.scala @@ -752,6 +752,7 @@ class InterfaceEncoding extends LeafTypeEncoding { pres = Vector.empty, posts = Vector.empty, terminationMeasures = Vector.empty, + backendAnnotations = Vector.empty, body = Some(body), isOpaque = false )(p.info))(ctx) @@ -797,6 +798,7 @@ class InterfaceEncoding extends LeafTypeEncoding { pres = Vector.empty, posts = Vector.empty, terminationMeasures = Vector.empty, + backendAnnotations = Vector.empty, body = Some(body) )(p.info))(ctx) diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala index 0299e76cc..71aab6317 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/BuiltInEncoding.scala @@ -216,7 +216,7 @@ class BuiltInEncoding extends Encoding { val pres: Vector[in.Assertion] = Vector( in.Access(isChannelInst, in.WildcardPerm(src))(src), ) - in.PureMethod(recvParam, x.name, Vector(), Vector(kParam), pres, Vector(), Vector(), None, false)(src) + in.PureMethod(recvParam, x.name, Vector.empty, Vector(kParam), pres, Vector.empty, Vector.empty, Vector.empty, None, false)(src) case (tag: ChannelInvariantMethodTag, recv: in.ChannelT) => /** @@ -242,7 +242,7 @@ class BuiltInEncoding extends Encoding { val pres: Vector[in.Assertion] = Vector( in.Access(chanPredicate, in.WildcardPerm(src))(src) ) - in.PureMethod(recvParam, x.name, Vector(), Vector(resParam), pres, Vector(), Vector(), None, false)(src) + in.PureMethod(recvParam, x.name, Vector.empty, Vector(resParam), pres, Vector.empty, Vector.empty, Vector.empty, None, false)(src) case (InitChannelMethodTag, recv: in.ChannelT) => /** @@ -297,7 +297,7 @@ class BuiltInEncoding extends Encoding { in.ExprAssertion(sendChannelInvEq)(src), in.ExprAssertion(recvChannelInvEq)(src), ) - in.Method(recvParam, x.name, Vector(aParam, bParam), Vector(), pres, posts, Vector(in.WildcardMeasure(None)(src)), None)(src) + in.Method(recvParam, x.name, Vector(aParam, bParam), Vector.empty, pres, posts, Vector(in.WildcardMeasure(None)(src)), Vector.empty, None)(src) case (CreateDebtChannelMethodTag, recv: in.ChannelT) => /** @@ -327,7 +327,7 @@ class BuiltInEncoding extends Encoding { in.Access(closureDebtInst, in.FullPerm(src))(src), in.Access(tokenInst, in.FullPerm(src))(src), ) - in.Method(recvParam, x.name, Vector(dividendParam, divisorParam /* permissionAmountParam */, predicateParam), Vector(), pres, posts, Vector(), None)(src) + in.Method(recvParam, x.name, Vector(dividendParam, divisorParam /* permissionAmountParam */, predicateParam), Vector.empty, pres, posts, Vector.empty, Vector.empty, None)(src) case (RedeemChannelMethodTag, recv: in.ChannelT) => /** @@ -350,7 +350,7 @@ class BuiltInEncoding extends Encoding { in.Access(closedInst, in.FullPerm(src))(src), in.Access(in.Accessible.PredExpr(in.PredExprInstance(predicateParam, Vector())(src)), in.FullPerm(src))(src) ) - in.Method(recvParam, x.name, Vector(predicateParam), Vector(), pres, posts, Vector(), None)(src) + in.Method(recvParam, x.name, Vector(predicateParam), Vector.empty, pres, posts, Vector.empty, Vector.empty, None)(src) case (tag, recv) => violation(s"no method generation defined for tag $tag and receiver $recv") } @@ -424,7 +424,7 @@ class BuiltInEncoding extends Encoding { in.Access(closedInst, in.FullPerm(src))(src) ) - in.Function(x.name, args, Vector(), pres, posts, Vector(), None)(src) + in.Function(x.name, args, Vector.empty, pres, posts, Vector.empty, Vector.empty, None)(src) /* JoĂ£o, 18/08/2021: * The spec for `append` currently does not allow the first and second non-ghost arguments to be the same. The go @@ -502,7 +502,7 @@ class BuiltInEncoding extends Encoding { ) val posts: Vector[in.Assertion] = Vector(postLen, postRes, postVariadic, postCmpSlice, postCmpVariadic) - in.Function(x.name, args, results, pres, posts, Vector(in.WildcardMeasure(None)(src)), None)(src) + in.Function(x.name, args, results, pres, posts, Vector(in.WildcardMeasure(None)(src)), Vector.empty, None)(src) case (CopyFunctionTag, Vector(t1, t2, _)) => /** @@ -606,7 +606,7 @@ class BuiltInEncoding extends Encoding { val posts = Vector(postRes1, postRes2, postDst, postSrc, postUpdate, postSame) - in.Function(x.name, args, results, pres, posts, Vector(in.WildcardMeasure(None)(src)), None)(src) + in.Function(x.name, args, results, pres, posts, Vector(in.WildcardMeasure(None)(src)), Vector.empty, None)(src) case (tag, args) => violation(s"no function generation defined for tag $tag and arguments $args") } diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/OutlineEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/OutlineEncoding.scala index 296a426b3..fcef140fb 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/OutlineEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/OutlineEncoding.scala @@ -33,8 +33,9 @@ class OutlineEncoding extends Encoding { pres <- ml.sequence(n.pres map (p => ctx.precondition(p))) posts <- ml.sequence(n.posts map (p => ctx.postcondition(p))) measures <- ml.sequence(n.terminationMeasures map (m => ml.pure(ctx.assertion(m))(ctx))) + annotations = n.backendAnnotations body <- ml.block(ctx.statement(n.body)) - } yield outlines.outline(n.name, pres ++ measures, posts, body, n.trusted)(pos, info, errT) + } yield outlines.outline(n.name, pres ++ measures, posts, annotations, body, n.trusted)(pos, info, errT) ) } } diff --git a/src/main/scala/viper/gobra/translator/library/outlines/Outlines.scala b/src/main/scala/viper/gobra/translator/library/outlines/Outlines.scala index 9eafe6a15..74d9597e8 100644 --- a/src/main/scala/viper/gobra/translator/library/outlines/Outlines.scala +++ b/src/main/scala/viper/gobra/translator/library/outlines/Outlines.scala @@ -7,6 +7,7 @@ package viper.gobra.translator.library.outlines import viper.gobra.translator.library.Generator +import viper.gobra.util.BackendAnnotation import viper.silver.{ast => vpr} trait Outlines extends Generator { @@ -19,6 +20,7 @@ trait Outlines extends Generator { name: String, pres: Vector[vpr.Exp], posts: Vector[vpr.Exp], + annotations: Vector[BackendAnnotation], body: vpr.Stmt, trusted: Boolean, )(pos : vpr.Position = vpr.NoPosition, info : vpr.Info = vpr.NoInfo, errT : vpr.ErrorTrafo = vpr.NoTrafos) : vpr.Stmt @@ -32,6 +34,7 @@ trait Outlines extends Generator { name: String, pres: Vector[vpr.Exp], posts: Vector[vpr.Exp], + annotations: Vector[BackendAnnotation], arguments: Vector[vpr.LocalVar], modifies: Vector[vpr.LocalVar], )(pos : vpr.Position = vpr.NoPosition, info : vpr.Info = vpr.NoInfo, errT : vpr.ErrorTrafo = vpr.NoTrafos) : vpr.Stmt diff --git a/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala b/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala index d19f1117a..2357f6966 100644 --- a/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala +++ b/src/main/scala/viper/gobra/translator/library/outlines/OutlinesImpl.scala @@ -6,7 +6,8 @@ package viper.gobra.translator.library.outlines -import viper.gobra.translator.util.ViperUtil +import viper.gobra.translator.util.{ViperUtil, VprInfo} +import viper.gobra.util.BackendAnnotation import viper.silver.{ast => vpr} class OutlinesImpl extends Outlines { @@ -56,6 +57,7 @@ class OutlinesImpl extends Outlines { name: String, pres: Vector[vpr.Exp], posts: Vector[vpr.Exp], + annotations: Vector[BackendAnnotation], body: vpr.Stmt, trusted: Boolean, )(pos : vpr.Position, info : vpr.Info, errT : vpr.ErrorTrafo) : vpr.Stmt = { @@ -94,6 +96,8 @@ class OutlinesImpl extends Outlines { replacedArguments } + val annotatedInfo = VprInfo.attachAnnotations(annotations, info) + vpr.Method( name = name, formalArgs = formals map ViperUtil.toVarDecl, @@ -101,7 +105,7 @@ class OutlinesImpl extends Outlines { pres = actualPres, posts = actualPosts, body = actualBody, - )(pos, info, errT) + )(pos, annotatedInfo, errT) } vpr.MethodCall(methodName = name, args = arguments, targets = results)(pos, info, errT) @@ -116,6 +120,7 @@ class OutlinesImpl extends Outlines { name: String, pres: Vector[vpr.Exp], posts: Vector[vpr.Exp], + annotations: Vector[BackendAnnotation], arguments: Vector[vpr.LocalVar], modifies: Vector[vpr.LocalVar], )(pos : vpr.Position, info : vpr.Info, errT : vpr.ErrorTrafo) : vpr.Stmt = { @@ -128,6 +133,8 @@ class OutlinesImpl extends Outlines { case lold: vpr.LabelledOld => vpr.Old(lold.exp)(lold.pos, lold.info, lold.errT) }) + val annotatedInfo = VprInfo.attachAnnotations(annotations, info) + vpr.Method( name = name, formalArgs = arguments map ViperUtil.toVarDecl, @@ -135,7 +142,7 @@ class OutlinesImpl extends Outlines { pres = pres, posts = actualPosts, body = None, - )(pos, info, errT) + )(pos, annotatedInfo, errT) } vpr.MethodCall(methodName = name, args = arguments, targets = results)(pos, info, errT) diff --git a/src/main/scala/viper/gobra/translator/util/VprInfo.scala b/src/main/scala/viper/gobra/translator/util/VprInfo.scala index 58956d0fe..ab39b2594 100644 --- a/src/main/scala/viper/gobra/translator/util/VprInfo.scala +++ b/src/main/scala/viper/gobra/translator/util/VprInfo.scala @@ -5,12 +5,13 @@ // Copyright (c) 2011-2023 ETH Zurich. package viper.gobra.translator.util +import viper.gobra.util.BackendAnnotation import viper.silver.{ast => vpr} object VprInfo { def maybeAttachOpaque(info: vpr.Info, isOpaque: Boolean): vpr.Info = { if (isOpaque) { - attachAnnotation(info, "opaque") + attachBackendAnnotation(info, "opaque") } else { info } @@ -18,14 +19,29 @@ object VprInfo { def maybeAttachReveal(info: vpr.Info, reveal: Boolean): vpr.Info = { if (reveal) { - attachAnnotation(info, "reveal") + attachBackendAnnotation(info, "reveal") } else { info } } - private def attachAnnotation(info: vpr.Info, key: String, values: String*) : vpr.Info = { + private def attachBackendAnnotation(info: vpr.Info, key: String, values: String*) : vpr.Info = { val annotation = vpr.AnnotationInfo(Map(key -> values)) vpr.ConsInfo(annotation, info) } + + private def backendAnnotationToInfo(a: BackendAnnotation): vpr.AnnotationInfo = { + vpr.AnnotationInfo(Map(a.key -> a.values)) + } + + private def attachBackendAnnotation(a: BackendAnnotation, info: vpr.Info): vpr.Info = { + val modeAnnotation = backendAnnotationToInfo(a) + vpr.ConsInfo(modeAnnotation, info) + } + + def attachAnnotations(as: Vector[BackendAnnotation], info: vpr.Info): vpr.Info = + as match { + case Vector() => info + case _ => attachAnnotations(as.tail, attachBackendAnnotation(as.head, info)) + } } diff --git a/src/main/scala/viper/gobra/util/BackendAnnotation.scala b/src/main/scala/viper/gobra/util/BackendAnnotation.scala new file mode 100644 index 000000000..8e82348b0 --- /dev/null +++ b/src/main/scala/viper/gobra/util/BackendAnnotation.scala @@ -0,0 +1,9 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2020 ETH Zurich. + +package viper.gobra.util + +case class BackendAnnotation(key: String, values: Vector[String]) diff --git a/src/test/resources/regressions/features/backendAnnotations/mce-success1.gobra b/src/test/resources/regressions/features/backendAnnotations/mce-success1.gobra new file mode 100644 index 000000000..ac254da1a --- /dev/null +++ b/src/test/resources/regressions/features/backendAnnotations/mce-success1.gobra @@ -0,0 +1,68 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +// Example in functions with disjunctive aliasing +requires acc(x) && acc(y) +requires x == z || y == z +//:: ExpectedOutput(postcondition_error:permission_error) +ensures acc(z) +#backend[exhaleMode(0)] +func f_greedy(x, y, z *int) { } + +requires acc(x) && acc(y) +requires x == z || y == z +ensures acc(z) +#backend[exhaleMode(1)] +func f_mce(x, y, z *int) { } + +// Example in outline blocks +requires acc(x) && acc(y) +requires x == z || y == z +ensures acc(z) +#backend[exhaleMode(0)] +func g1(x, y, z *int) { + requires acc(x) && acc(y) + requires x == z || y == z + ensures acc(z) + #backend[exhaleMode(1)] + outline( + assert true + ) +} + +requires acc(x) && acc(y) +requires x == z || y == z +ensures acc(z) +#backend[exhaleMode(1), moreJoins()] +func g2(x, y, z *int) { + requires acc(x) && acc(y) + requires x == z || y == z + //:: ExpectedOutput(postcondition_error:permission_error) + ensures acc(z) + #backend[exhaleMode(0)] + outline( + assert true + ) +} + +// closures +func m1(x, y, z *int) { + foo := + requires acc(x) && acc(y) + requires x == z || y == z + //:: ExpectedOutput(postcondition_error:permission_error) + ensures acc(z) + #backend[exhaleMode(0)] + func bar(x, y, z *int) { } +} + +func m2(x, y, z *int) { + foo := + requires acc(x) && acc(y) + requires x == z || y == z + ensures acc(z) + #backend[exhaleMode(1), bogusAnnotation(1, 2, 3, 4)] + func bar(x, y, z *int) { } +} \ No newline at end of file diff --git a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala index d71f9f84a..bd39c248d 100644 --- a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala +++ b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala @@ -327,7 +327,7 @@ class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside { PIdnDef("foo"), inArgs.map(_._1), PResult(Vector()), - PFunctionSpec(Vector(), Vector(), Vector(), Vector.empty), + PFunctionSpec(Vector(), Vector(), Vector(), Vector.empty, Vector.empty), Some(PBodyParameterInfo(inArgs.collect{ case (n: PNamedParameter, true) => PIdnUse(n.id.name) }), PBlock(Vector(body))) )) ) diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index c704199b8..bd9fd62c7 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -120,13 +120,13 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: spec only function") { frontend.parseFunctionDecl("func foo() { b.bar() }", specOnly = true) should matchPattern { - case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false, false), None) => + case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), false, false, false), None) => } } test("Parser: spec only function with nested blocks") { frontend.parseFunctionDecl("func foo() { if(true) { b.bar() } else { foo() } }", specOnly = true) should matchPattern { - case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false, false), None) => + case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), false, false, false), None) => } } @@ -159,7 +159,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { val modes: Set[Boolean] = Set(false, true) modes.foreach(specOnly => { frontend.parseFunctionDecl("func bar()", specOnly) should matchPattern { - case PFunctionDecl(PIdnDef("bar"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false, false), None) => + case PFunctionDecl(PIdnDef("bar"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), false, false, false), None) => } }) } @@ -2643,19 +2643,19 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should be able to parse normal termination measure") { frontend.parseFunctionDecl("decreases n; func factorial (n int) int") should matchPattern { - case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), None)), false, false, false), None) => + case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), None)), Vector(), false, false, false), None) => } } test("Parser: should be able to parse underscore termination measure") { frontend.parseFunctionDecl("decreases _; func factorial (n int) int") should matchPattern { - case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PWildcardMeasure(None)), false, false, false), None) => + case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PWildcardMeasure(None)), Vector(), false, false, false), None) => } } test("Parser: should be able to parse conditional termination measure" ) { frontend.parseFunctionDecl("decreases n if n>1; decreases _ if n<2; func factorial (n int) int") should matchPattern { - case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), Some(PGreater(PNamedOperand(PIdnUse("n")), PIntLit(one, Decimal)))), PWildcardMeasure(Some(PLess(PNamedOperand(PIdnUse("n")), PIntLit(two, Decimal))))), false, false, false), None) if one == 1 && two == 2 => + case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), Some(PGreater(PNamedOperand(PIdnUse("n")), PIntLit(one, Decimal)))), PWildcardMeasure(Some(PLess(PNamedOperand(PIdnUse("n")), PIntLit(two, Decimal))))), Vector(), false, false, false), None) if one == 1 && two == 2 => } } diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index ed9020f20..7583beb60 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -3371,7 +3371,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { PUnnamedReceiver(PMethodReceiveName(PNamedOperand(PIdnUse("self")))), inArgs.map(_._1), PResult(Vector()), - PFunctionSpec(Vector(), Vector(), Vector(), Vector(), isPure = true), + PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), isPure = true), Some(PBodyParameterInfo(inArgs.collect{ case (n: PNamedParameter, true) => PIdnUse(n.id.name) }), PBlock(Vector(body))) )) ) diff --git a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala index dc3a3fbc7..34e51a27d 100644 --- a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala @@ -66,7 +66,7 @@ class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside { PIdnDef("foo"), inArgs.map(_._1), PResult(Vector()), - PFunctionSpec(Vector(), Vector(), Vector(), Vector(), isPure = false), + PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), isPure = false), Some(PBodyParameterInfo(inArgs.collect{ case (n: PNamedParameter, true) => PIdnUse(n.id.name) }), PBlock(Vector(body))) )) ) diff --git a/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala index a248c2a15..383924a5a 100644 --- a/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/TypeTypingUnitTests.scala @@ -363,7 +363,7 @@ class TypeTypingUnitTests extends AnyFunSuite with Matchers with Inside { PUnnamedReceiver(PMethodReceiveName(PNamedOperand(PIdnUse("self")))), stubParams(ts), PResult(Vector()), - PFunctionSpec(Vector(), Vector(), Vector(), Vector(), isPure = true), + PFunctionSpec(Vector(), Vector(), Vector(), Vector(), Vector(), isPure = true), None )) ) From 011b922bdf6281b1157bfd7e6c65219d49387616 Mon Sep 17 00:00:00 2001 From: Felix Wolf <60103963+Felalolf@users.noreply.github.com> Date: Mon, 25 Mar 2024 17:04:00 +0100 Subject: [PATCH 257/296] Update to new chopper version (#744) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * changes to fit with new version of chopper * Updates submodules --------- Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> Co-authored-by: JoĂ£o Pereira --- src/main/scala/viper/gobra/util/ChopperUtil.scala | 1 + viperserver | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/util/ChopperUtil.scala b/src/main/scala/viper/gobra/util/ChopperUtil.scala index d69291bf9..0a76b24eb 100644 --- a/src/main/scala/viper/gobra/util/ChopperUtil.scala +++ b/src/main/scala/viper/gobra/util/ChopperUtil.scala @@ -91,6 +91,7 @@ object ChopperUtil { method = get("method_body", dfltConf.method), methodSpec = get("method_spec", dfltConf.methodSpec), function = get("function_body", dfltConf.function), + functionSig = get("function_spec", dfltConf.function), predicate = get("predicate_body", dfltConf.predicate), predicateSig = get("predicate_spec", dfltConf.predicateSig), field = get("field", dfltConf.field), diff --git a/viperserver b/viperserver index b70fa9522..9ba8d2b0f 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit b70fa95224a7f5ae3e3de8579e28d685eaf93f6e +Subproject commit 9ba8d2b0fe1f466f9ab301e2fb87d80b205a69df From 0422fca1ca29b6aae2c0efacc06aa6166473e19e Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Tue, 26 Mar 2024 17:06:15 +0100 Subject: [PATCH 258/296] Updates submodules (#753) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 9ba8d2b0f..15e19d245 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 9ba8d2b0fe1f466f9ab301e2fb87d80b205a69df +Subproject commit 15e19d245d423769505cd647ffd1eafa3e875569 From 9ff5a0680a5bb49140305c20207a4cd82ac86660 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 27 Mar 2024 09:32:44 +0100 Subject: [PATCH 259/296] applies CR suggestions by Felix Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> --- src/main/scala/viper/gobra/frontend/Desugar.scala | 2 ++ .../typing/ghost/separation/GhostAssignability.scala | 2 +- .../implementation/typing/ghost/separation/GhostTyping.scala | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 5b305392c..d044058a1 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -3017,6 +3017,8 @@ object Desugar extends LazyLogging { // Both will have type Pointer(typeOf(v)) val src: Meta = meta(v, info) val refAlias = nm.refAlias(idName(v, info), info.scope(v), info) + // If `v` is a ghost variable, we consider `param` a ghost pointer. + // However, we can use ActualPointer here since there is a single internal pointer type only. val param = in.Parameter.In(refAlias, typeD(ActualPointerT(info.typ(v)), Addressability.inParameter)(src))(src) val localVar = in.LocalVar(nm.alias(refAlias, info.scope(v), info), param.typ)(src) (param, localVar) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala index f0792f8e1..d3d946e86 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala @@ -118,7 +118,7 @@ trait GhostAssignability { // handles the case of assignments in ghost code private def ghostAssigneeAssignmentMsgInGhostCode(left: PAssignee): Messages = - error(left, s"ghost error: only ghost locations can be assigned to in ghost code}", !ghostLocationClassification(left)) + error(left, s"ghost error: only ghost locations can be assigned to in ghost code", !ghostLocationClassification(left)) /** conservative ghost separation assignment check */ private[separation] def ghostAssignableToId(exprs: PExpression*)(lefts: PIdnNode*): Messages = diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala index a5da2ccc0..aeb011743 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala @@ -142,7 +142,7 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => val isGhostField = ghostIdClassification(s.id) (typ(s.base), isGhostField) match { case (_, true) => isGhost // ghost fields are always ghost memory - case (tb: Type.PointerT, _) => ghost(tb.isInstanceOf[Type.GhostPointerT]) // (implicitly) dereferencing a ghost pointer leads to a ghost heap location + case (tb: Type.PointerT, _) => ghost(tb.isInstanceOf[Type.GhostPointerT]) // (implicitly) dereferencing a field of a ghost pointer leads to a ghost heap location case _ => ghostLocationTyping(s.base) // assignee is on the stack, recurse to find out if it's a ghost or actual variable } case Some(g: ap.GlobalVariable) => ghost(g.symb.ghost) From fd98dccb0ed8a1cb31f05ae788f9d42771bbaa76 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 28 Mar 2024 08:48:58 +0100 Subject: [PATCH 260/296] regenerates parser --- .../java/viper/gobra/frontend/GobraLexer.java | 644 +++++++++--------- .../viper/gobra/frontend/GobraParser.java | 4 +- .../frontend/GobraParserBaseVisitor.java | 2 +- .../gobra/frontend/GobraParserVisitor.java | 2 +- 4 files changed, 328 insertions(+), 324 deletions(-) diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index a0fbbaaf0..96641cdc3 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.12.0 +// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -9,9 +9,9 @@ import org.antlr.v4.runtime.dfa.DFA; import org.antlr.v4.runtime.misc.*; -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) public class GobraLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.12.0", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -445,7 +445,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u0000PPpp\u0002\u0000++--\u0001\u0000``\u0002\u0000\"\"\\\\\u0002\u0000"+ "\t\t \u0002\u0000\n\n\r\r\u0003\u0000\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\"+ "abffnnrrttvv\u0001\u000007\u0003\u000009AFaf\u0001\u000001\u0002\u0000"+ - "EEee>\u000009\u0660\u0669\u06f0\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef"+ + "EEee@\u000009\u0660\u0669\u06f0\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef"+ "\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef"+ "\u0d66\u0d6f\u0de6\u0def\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049"+ "\u1090\u1099\u17e0\u17e9\u1810\u1819\u1946\u194f\u19d0\u19d9\u1a80\u1a89"+ @@ -458,115 +458,116 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u8001\u1459\u8001\u14d0\u8001\u14d9\u8001\u1650\u8001\u1659\u8001\u16c0"+ "\u8001\u16c9\u8001\u1730\u8001\u1739\u8001\u18e0\u8001\u18e9\u8001\u1950"+ "\u8001\u1959\u8001\u1c50\u8001\u1c59\u8001\u1d50\u8001\u1d59\u8001\u1da0"+ - "\u8001\u1da9\u8001\u6a60\u8001\u6a69\u8001\u6ac0\u8001\u6ac9\u8001\u6b50"+ - "\u8001\u6b59\u8001\ud7ce\u8001\ud7ff\u8001\ue140\u8001\ue149\u8001\ue2f0"+ - "\u8001\ue2f9\u8001\ue950\u8001\ue959\u8001\ufbf0\u8001\ufbf9\u0288\u0000"+ - "AZaz\u00aa\u00aa\u00b5\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8"+ - "\u02c1\u02c6\u02d1\u02e0\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376"+ - "\u0377\u037a\u037d\u037f\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e"+ - "\u03a1\u03a3\u03f5\u03f7\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560"+ - "\u0588\u05d0\u05ea\u05ef\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5"+ - "\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712"+ - "\u072f\u074d\u07a5\u07b1\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800"+ - "\u0815\u081a\u081a\u0824\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870"+ - "\u0887\u0889\u088e\u08a0\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958"+ - "\u0961\u0971\u0980\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2"+ - "\u09b2\u09b6\u09b9\u09bd\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0"+ - "\u09f1\u09fc\u09fc\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32"+ - "\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85"+ - "\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd"+ - "\u0abd\u0ad0\u0ad0\u0ae0\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13"+ - "\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f"+ - "\u0b61\u0b71\u0b71\u0b83\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99"+ - "\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0"+ - "\u0bd0\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58"+ - "\u0c5a\u0c5d\u0c5d\u0c60\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92"+ - "\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1"+ - "\u0cf2\u0d04\u0d0c\u0d0e\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54"+ - "\u0d56\u0d5f\u0d61\u0d7a\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd"+ - "\u0dbd\u0dc0\u0dc6\u0e01\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84"+ - "\u0e84\u0e86\u0e8a\u0e8c\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd"+ - "\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49"+ - "\u0f6c\u0f88\u0f8c\u1000\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061"+ - "\u1061\u1065\u1066\u106e\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7"+ - "\u10c7\u10cd\u10cd\u10d0\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258"+ - "\u1258\u125a\u125d\u1260\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8"+ - "\u12be\u12c0\u12c0\u12c2\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318"+ - "\u135a\u1380\u138f\u13a0\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681"+ - "\u169a\u16a0\u16ea\u16f1\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760"+ - "\u176c\u176e\u1770\u1780\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880"+ - "\u1884\u1887\u18a8\u18aa\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970"+ - "\u1974\u1980\u19ab\u19b0\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05"+ - "\u1b33\u1b45\u1b4c\u1b83\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d"+ - "\u1c4f\u1c5a\u1c7d\u1c80\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee"+ - "\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20"+ - "\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f"+ - "\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0"+ - "\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f"+ - "\u207f\u2090\u209c\u2102\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119"+ - "\u211d\u2124\u2124\u2126\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c"+ - "\u213f\u2145\u2149\u214e\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2"+ - "\u2cf3\u2d00\u2d25\u2d27\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80"+ - "\u2d96\u2da0\u2da6\u2da8\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8"+ - "\u2dce\u2dd0\u2dd6\u2dd8\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b"+ - "\u303c\u3041\u3096\u309d\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131"+ - "\u318e\u31a0\u31bf\u31f0\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0"+ - "\u8000\ua4fd\u8000\ua500\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a"+ - "\u8000\ua62b\u8000\ua640\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0"+ - "\u8000\ua6e5\u8000\ua717\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b"+ - "\u8000\ua7ca\u8000\ua7d0\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5"+ - "\u8000\ua7d9\u8000\ua7f2\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807"+ - "\u8000\ua80a\u8000\ua80c\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882"+ - "\u8000\ua8b3\u8000\ua8f2\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd"+ - "\u8000\ua8fe\u8000\ua90a\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960"+ - "\u8000\ua97c\u8000\ua984\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0"+ - "\u8000\ua9e4\u8000\ua9e6\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00"+ - "\u8000\uaa28\u8000\uaa40\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60"+ - "\u8000\uaa76\u8000\uaa7a\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1"+ - "\u8000\uaab1\u8000\uaab5\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0"+ - "\u8000\uaac0\u8000\uaac2\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0"+ - "\u8000\uaaea\u8000\uaaf2\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09"+ - "\u8000\uab0e\u8000\uab11\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28"+ - "\u8000\uab2e\u8000\uab30\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70"+ - "\u8000\uabe2\u8000\uac00\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb"+ - "\u8000\ud7fb\u8000\uf900\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00"+ - "\u8000\ufb06\u8000\ufb13\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f"+ - "\u8000\ufb28\u8000\ufb2a\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e"+ - "\u8000\ufb3e\u8000\ufb40\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46"+ - "\u8000\ufbb1\u8000\ufbd3\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92"+ - "\u8000\ufdc7\u8000\ufdf0\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76"+ - "\u8000\ufefc\u8000\uff21\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66"+ - "\u8000\uffbe\u8000\uffc2\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2"+ - "\u8000\uffd7\u8000\uffda\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001"+ - "&\u8001(\u8001:\u8001<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080"+ - "\u8001\u00fa\u8001\u0280\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300"+ - "\u8001\u031f\u8001\u032d\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350"+ - "\u8001\u0375\u8001\u0380\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8"+ - "\u8001\u03cf\u8001\u0400\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8"+ - "\u8001\u04fb\u8001\u0500\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570"+ - "\u8001\u057a\u8001\u057c\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594"+ - "\u8001\u0595\u8001\u0597\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3"+ - "\u8001\u05b9\u8001\u05bb\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740"+ - "\u8001\u0755\u8001\u0760\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787"+ - "\u8001\u07b0\u8001\u07b2\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808"+ - "\u8001\u0808\u8001\u080a\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c"+ - "\u8001\u083c\u8001\u083f\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880"+ - "\u8001\u089e\u8001\u08e0\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900"+ - "\u8001\u0915\u8001\u0920\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be"+ - "\u8001\u09bf\u8001\u0a00\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15"+ - "\u8001\u0a17\u8001\u0a19\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80"+ - "\u8001\u0a9c\u8001\u0ac0\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00"+ - "\u8001\u0b35\u8001\u0b40\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80"+ - "\u8001\u0b91\u8001\u0c00\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0"+ - "\u8001\u0cf2\u8001\u0d00\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0"+ - "\u8001\u0eb1\u8001\u0f00\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30"+ - "\u8001\u0f45\u8001\u0f70\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0"+ - "\u8001\u0ff6\u8001\u1003\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075"+ - "\u8001\u1075\u8001\u1083\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103"+ - "\u8001\u1126\u8001\u1144\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150"+ - "\u8001\u1172\u8001\u1176\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1"+ - "\u8001\u11c4\u8001\u11da\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200"+ - "\u8001\u1211\u8001\u1213\u8001\u122b\u8001\u1280\u8001\u1286\u8001\u1288"+ + "\u8001\u1da9\u8001\u1f50\u8001\u1f59\u8001\u6a60\u8001\u6a69\u8001\u6ac0"+ + "\u8001\u6ac9\u8001\u6b50\u8001\u6b59\u8001\ud7ce\u8001\ud7ff\u8001\ue140"+ + "\u8001\ue149\u8001\ue2f0\u8001\ue2f9\u8001\ue4f0\u8001\ue4f9\u8001\ue950"+ + "\u8001\ue959\u8001\ufbf0\u8001\ufbf9\u0293\u0000AZaz\u00aa\u00aa\u00b5"+ + "\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0"+ + "\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376\u0377\u037a\u037d\u037f"+ + "\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03f5\u03f7"+ + "\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560\u0588\u05d0\u05ea\u05ef"+ + "\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee"+ + "\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1"+ + "\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800\u0815\u081a\u081a\u0824"+ + "\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870\u0887\u0889\u088e\u08a0"+ + "\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958\u0961\u0971\u0980\u0985"+ + "\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd"+ + "\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05"+ + "\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38"+ + "\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93"+ + "\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0"+ + "\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32"+ + "\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83"+ + "\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e"+ + "\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e"+ + "\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60"+ + "\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5"+ + "\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e"+ + "\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a"+ + "\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01"+ + "\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c"+ + "\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6"+ + "\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000"+ + "\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061\u1061\u1065\u1066\u106e"+ + "\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0"+ + "\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258\u1258\u125a\u125d\u1260"+ + "\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2"+ + "\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318\u135a\u1380\u138f\u13a0"+ + "\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681\u169a\u16a0\u16ea\u16f1"+ + "\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760\u176c\u176e\u1770\u1780"+ + "\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880\u1884\u1887\u18a8\u18aa"+ + "\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0"+ + "\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83"+ + "\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80"+ + "\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa"+ + "\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50"+ + "\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6"+ + "\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0"+ + "\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f\u207f\u2090\u209c\u2102"+ + "\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119\u211d\u2124\u2124\u2126"+ + "\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c\u213f\u2145\u2149\u214e"+ + "\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27"+ + "\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8"+ + "\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8"+ + "\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b\u303c\u3041\u3096\u309d"+ + "\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131\u318e\u31a0\u31bf\u31f0"+ + "\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0\u8000\ua4fd\u8000\ua500"+ + "\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a\u8000\ua62b\u8000\ua640"+ + "\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0\u8000\ua6e5\u8000\ua717"+ + "\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b\u8000\ua7ca\u8000\ua7d0"+ + "\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2"+ + "\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c"+ + "\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882\u8000\ua8b3\u8000\ua8f2"+ + "\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000\ua90a"+ + "\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960\u8000\ua97c\u8000\ua984"+ + "\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6"+ + "\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40"+ + "\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60\u8000\uaa76\u8000\uaa7a"+ + "\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1\u8000\uaab1\u8000\uaab5"+ + "\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0\u8000\uaac0\u8000\uaac2"+ + "\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0\u8000\uaaea\u8000\uaaf2"+ + "\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09\u8000\uab0e\u8000\uab11"+ + "\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28\u8000\uab2e\u8000\uab30"+ + "\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70\u8000\uabe2\u8000\uac00"+ + "\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000\uf900"+ + "\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00\u8000\ufb06\u8000\ufb13"+ + "\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f\u8000\ufb28\u8000\ufb2a"+ + "\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000\ufb40"+ + "\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46\u8000\ufbb1\u8000\ufbd3"+ + "\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92\u8000\ufdc7\u8000\ufdf0"+ + "\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76\u8000\ufefc\u8000\uff21"+ + "\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66\u8000\uffbe\u8000\uffc2"+ + "\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2\u8000\uffd7\u8000\uffda"+ + "\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001&\u8001(\u8001:\u8001"+ + "<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080\u8001\u00fa\u8001\u0280"+ + "\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300\u8001\u031f\u8001\u032d"+ + "\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350\u8001\u0375\u8001\u0380"+ + "\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8\u8001\u03cf\u8001\u0400"+ + "\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8\u8001\u04fb\u8001\u0500"+ + "\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570\u8001\u057a\u8001\u057c"+ + "\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594\u8001\u0595\u8001\u0597"+ + "\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3\u8001\u05b9\u8001\u05bb"+ + "\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740\u8001\u0755\u8001\u0760"+ + "\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787\u8001\u07b0\u8001\u07b2"+ + "\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808\u8001\u0808\u8001\u080a"+ + "\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c\u8001\u083c\u8001\u083f"+ + "\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880\u8001\u089e\u8001\u08e0"+ + "\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900\u8001\u0915\u8001\u0920"+ + "\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be\u8001\u09bf\u8001\u0a00"+ + "\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15\u8001\u0a17\u8001\u0a19"+ + "\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80\u8001\u0a9c\u8001\u0ac0"+ + "\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00\u8001\u0b35\u8001\u0b40"+ + "\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80\u8001\u0b91\u8001\u0c00"+ + "\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0\u8001\u0cf2\u8001\u0d00"+ + "\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0\u8001\u0eb1\u8001\u0f00"+ + "\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30\u8001\u0f45\u8001\u0f70"+ + "\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0\u8001\u0ff6\u8001\u1003"+ + "\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075\u8001\u1075\u8001\u1083"+ + "\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103\u8001\u1126\u8001\u1144"+ + "\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150\u8001\u1172\u8001\u1176"+ + "\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1\u8001\u11c4\u8001\u11da"+ + "\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200\u8001\u1211\u8001\u1213"+ + "\u8001\u122b\u8001\u123f\u8001\u1240\u8001\u1280\u8001\u1286\u8001\u1288"+ "\u8001\u1288\u8001\u128a\u8001\u128d\u8001\u128f\u8001\u129d\u8001\u129f"+ "\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001\u1305\u8001\u130c\u8001\u130f"+ "\u8001\u1310\u8001\u1313\u8001\u1328\u8001\u132a\u8001\u1330\u8001\u1332"+ @@ -587,16 +588,18 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001\u1d08\u8001\u1d09\u8001\u1d0b"+ "\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001\u1d60\u8001\u1d65\u8001\u1d67"+ "\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001\u1d98\u8001\u1d98\u8001\u1ee0"+ - "\u8001\u1ef2\u8001\u1fb0\u8001\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480"+ - "\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342e\u8001\u4400"+ - "\u8001\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40\u8001\u6a5e\u8001\u6a70"+ - "\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00\u8001\u6b2f\u8001\u6b40"+ - "\u8001\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d\u8001\u6b8f\u8001\u6e40"+ - "\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50\u8001\u6f50\u8001\u6f93"+ - "\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3\u8001\u6fe3\u8001\u7000"+ - "\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00\u8001\u8d08\u8001\uaff0"+ - "\u8001\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd\u8001\uaffe\u8001\ub000"+ - "\u8001\ub122\u8001\ub150\u8001\ub152\u8001\ub164\u8001\ub167\u8001\ub170"+ + "\u8001\u1ef2\u8001\u1f02\u8001\u1f02\u8001\u1f04\u8001\u1f10\u8001\u1f12"+ + "\u8001\u1f33\u8001\u1fb0\u8001\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480"+ + "\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342f\u8001\u3441"+ + "\u8001\u3446\u8001\u4400\u8001\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40"+ + "\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00"+ + "\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d"+ + "\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50"+ + "\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3"+ + "\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00"+ + "\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd"+ + "\u8001\uaffe\u8001\ub000\u8001\ub122\u8001\ub132\u8001\ub132\u8001\ub150"+ + "\u8001\ub152\u8001\ub155\u8001\ub155\u8001\ub164\u8001\ub167\u8001\ub170"+ "\u8001\ub2fb\u8001\ubc00\u8001\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80"+ "\u8001\ubc88\u8001\ubc90\u8001\ubc99\u8001\ud400\u8001\ud454\u8001\ud456"+ "\u8001\ud49c\u8001\ud49e\u8001\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5"+ @@ -608,9 +611,10 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u8001\ud6c0\u8001\ud6c2\u8001\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc"+ "\u8001\ud714\u8001\ud716\u8001\ud734\u8001\ud736\u8001\ud74e\u8001\ud750"+ "\u8001\ud76e\u8001\ud770\u8001\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa"+ - "\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\ue100"+ - "\u8001\ue12c\u8001\ue137\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290"+ - "\u8001\ue2ad\u8001\ue2c0\u8001\ue2eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8"+ + "\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\udf25"+ + "\u8001\udf2a\u8001\ue030\u8001\ue06d\u8001\ue100\u8001\ue12c\u8001\ue137"+ + "\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290\u8001\ue2ad\u8001\ue2c0"+ + "\u8001\ue2eb\u8001\ue4d0\u8001\ue4eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8"+ "\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001\ue7f0\u8001\ue7fe\u8001\ue800"+ "\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001\ue94b\u8001\ue94b\u8001\uee00"+ "\u8001\uee03\u8001\uee05\u8001\uee1f\u8001\uee21\u8001\uee22\u8001\uee24"+ @@ -624,201 +628,201 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u8001\uee72\u8001\uee74\u8001\uee77\u8001\uee79\u8001\uee7c\u8001\uee7e"+ "\u8001\uee7e\u8001\uee80\u8001\uee89\u8001\uee8b\u8001\uee9b\u8001\ueea1"+ "\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000"+ - "\u8002\ua6df\u8002\ua700\u8002\ub738\u8002\ub740\u8002\ub81d\u8002\ub820"+ + "\u8002\ua6df\u8002\ua700\u8002\ub739\u8002\ub740\u8002\ub81d\u8002\ub820"+ "\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000"+ - "\u8003\u134a\u0633\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004\u0001"+ - "\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001\u0000"+ - "\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000\u0000"+ - "\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000\u0000"+ - "\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000"+ - "\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000"+ - "\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000"+ - "\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000"+ - "\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000"+ - "&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001"+ - "\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000"+ - "\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u0000"+ - "4\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001"+ - "\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000"+ - "\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000"+ - "B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001"+ - "\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000"+ - "\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000"+ - "P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001"+ - "\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000"+ - "\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000"+ - "\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b"+ - "\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000"+ - "\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000"+ - "\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p"+ - "\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000"+ - "\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000"+ - "\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~"+ - "\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000\u0000\u0000\u0000\u0082"+ - "\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000\u0000\u0000\u0000\u0086"+ - "\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000\u0000\u0000\u0000\u008a"+ - "\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000\u0000\u0000\u0000\u008e"+ - "\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000\u0000\u0000\u0000\u0092"+ - "\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000\u0000\u0000\u0000\u0096"+ - "\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000\u0000\u0000\u0000\u009a"+ - "\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000\u0000\u0000\u0000\u009e"+ - "\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2"+ - "\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6"+ - "\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa"+ - "\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae"+ - "\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2"+ - "\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6"+ - "\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba"+ - "\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000\u0000\u0000\u0000\u00be"+ - "\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2"+ - "\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6"+ - "\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca"+ - "\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce"+ - "\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2"+ - "\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6"+ - "\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000\u0000\u0000\u0000\u00da"+ - "\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000\u0000\u0000\u0000\u00de"+ - "\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2"+ - "\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6"+ - "\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea"+ - "\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee"+ - "\u0001\u0000\u0000\u0000\u0000\u00f0\u0001\u0000\u0000\u0000\u0000\u00f2"+ - "\u0001\u0000\u0000\u0000\u0000\u00f4\u0001\u0000\u0000\u0000\u0000\u00f6"+ - "\u0001\u0000\u0000\u0000\u0000\u00f8\u0001\u0000\u0000\u0000\u0000\u00fa"+ - "\u0001\u0000\u0000\u0000\u0000\u00fc\u0001\u0000\u0000\u0000\u0000\u00fe"+ - "\u0001\u0000\u0000\u0000\u0000\u0100\u0001\u0000\u0000\u0000\u0000\u0102"+ - "\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000\u0000\u0000\u0000\u0106"+ - "\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000\u0000\u0000\u0000\u010a"+ - "\u0001\u0000\u0000\u0000\u0000\u010c\u0001\u0000\u0000\u0000\u0000\u010e"+ - "\u0001\u0000\u0000\u0000\u0000\u0110\u0001\u0000\u0000\u0000\u0000\u0112"+ - "\u0001\u0000\u0000\u0000\u0000\u0114\u0001\u0000\u0000\u0000\u0000\u0116"+ - "\u0001\u0000\u0000\u0000\u0000\u0118\u0001\u0000\u0000\u0000\u0000\u011a"+ - "\u0001\u0000\u0000\u0000\u0000\u011c\u0001\u0000\u0000\u0000\u0000\u011e"+ - "\u0001\u0000\u0000\u0000\u0000\u0120\u0001\u0000\u0000\u0000\u0000\u0122"+ - "\u0001\u0000\u0000\u0000\u0000\u0124\u0001\u0000\u0000\u0000\u0000\u012a"+ - "\u0001\u0000\u0000\u0000\u0000\u012e\u0001\u0000\u0000\u0000\u0000\u0130"+ - "\u0001\u0000\u0000\u0000\u0000\u0132\u0001\u0000\u0000\u0000\u0000\u0134"+ - "\u0001\u0000\u0000\u0000\u0000\u0136\u0001\u0000\u0000\u0000\u0000\u0138"+ - "\u0001\u0000\u0000\u0000\u0000\u013a\u0001\u0000\u0000\u0000\u0000\u013c"+ - "\u0001\u0000\u0000\u0000\u0000\u013e\u0001\u0000\u0000\u0000\u0000\u0140"+ - "\u0001\u0000\u0000\u0000\u0000\u0142\u0001\u0000\u0000\u0000\u0000\u0144"+ - "\u0001\u0000\u0000\u0000\u0001\u015a\u0001\u0000\u0000\u0000\u0001\u015c"+ - "\u0001\u0000\u0000\u0000\u0001\u015e\u0001\u0000\u0000\u0000\u0001\u0160"+ - "\u0001\u0000\u0000\u0000\u0001\u0162\u0001\u0000\u0000\u0000\u0002\u0166"+ - "\u0001\u0000\u0000\u0000\u0004\u017c\u0001\u0000\u0000\u0000\u0006\u017e"+ - "\u0001\u0000\u0000\u0000\b\u0185\u0001\u0000\u0000\u0000\n\u018d\u0001"+ - "\u0000\u0000\u0000\f\u0194\u0001\u0000\u0000\u0000\u000e\u019b\u0001\u0000"+ - "\u0000\u0000\u0010\u01a2\u0001\u0000\u0000\u0000\u0012\u01a9\u0001\u0000"+ - "\u0000\u0000\u0014\u01b2\u0001\u0000\u0000\u0000\u0016\u01bc\u0001\u0000"+ - "\u0000\u0000\u0018\u01c4\u0001\u0000\u0000\u0000\u001a\u01ce\u0001\u0000"+ - "\u0000\u0000\u001c\u01da\u0001\u0000\u0000\u0000\u001e\u01e1\u0001\u0000"+ - "\u0000\u0000 \u01ec\u0001\u0000\u0000\u0000\"\u01ef\u0001\u0000\u0000"+ - "\u0000$\u01f5\u0001\u0000\u0000\u0000&\u01fe\u0001\u0000\u0000\u0000("+ - "\u0203\u0001\u0000\u0000\u0000*\u020a\u0001\u0000\u0000\u0000,\u0211\u0001"+ - "\u0000\u0000\u0000.\u0217\u0001\u0000\u0000\u00000\u021c\u0001\u0000\u0000"+ - "\u00002\u0223\u0001\u0000\u0000\u00004\u022d\u0001\u0000\u0000\u00006"+ - "\u0231\u0001\u0000\u0000\u00008\u0237\u0001\u0000\u0000\u0000:\u023a\u0001"+ - "\u0000\u0000\u0000<\u023c\u0001\u0000\u0000\u0000>\u0243\u0001\u0000\u0000"+ - "\u0000@\u0249\u0001\u0000\u0000\u0000B\u0256\u0001\u0000\u0000\u0000D"+ - "\u025f\u0001\u0000\u0000\u0000F\u0263\u0001\u0000\u0000\u0000H\u0267\u0001"+ - "\u0000\u0000\u0000J\u026d\u0001\u0000\u0000\u0000L\u026f\u0001\u0000\u0000"+ - "\u0000N\u0272\u0001\u0000\u0000\u0000P\u0277\u0001\u0000\u0000\u0000R"+ - "\u027d\u0001\u0000\u0000\u0000T\u0283\u0001\u0000\u0000\u0000V\u028a\u0001"+ - "\u0000\u0000\u0000X\u0291\u0001\u0000\u0000\u0000Z\u029a\u0001\u0000\u0000"+ - "\u0000\\\u02a5\u0001\u0000\u0000\u0000^\u02ab\u0001\u0000\u0000\u0000"+ - "`\u02b1\u0001\u0000\u0000\u0000b\u02b8\u0001\u0000\u0000\u0000d\u02be"+ - "\u0001\u0000\u0000\u0000f\u02c5\u0001\u0000\u0000\u0000h\u02cb\u0001\u0000"+ - "\u0000\u0000j\u02d4\u0001\u0000\u0000\u0000l\u02dc\u0001\u0000\u0000\u0000"+ - "n\u02e2\u0001\u0000\u0000\u0000p\u02ea\u0001\u0000\u0000\u0000r\u02f1"+ - "\u0001\u0000\u0000\u0000t\u02f6\u0001\u0000\u0000\u0000v\u02ff\u0001\u0000"+ - "\u0000\u0000x\u030e\u0001\u0000\u0000\u0000z\u0314\u0001\u0000\u0000\u0000"+ - "|\u0318\u0001\u0000\u0000\u0000~\u031b\u0001\u0000\u0000\u0000\u0080\u0322"+ - "\u0001\u0000\u0000\u0000\u0082\u032c\u0001\u0000\u0000\u0000\u0084\u0336"+ - "\u0001\u0000\u0000\u0000\u0086\u0342\u0001\u0000\u0000\u0000\u0088\u034b"+ - "\u0001\u0000\u0000\u0000\u008a\u0355\u0001\u0000\u0000\u0000\u008c\u035d"+ - "\u0001\u0000\u0000\u0000\u008e\u0369\u0001\u0000\u0000\u0000\u0090\u0378"+ - "\u0001\u0000\u0000\u0000\u0092\u037e\u0001\u0000\u0000\u0000\u0094\u0382"+ - "\u0001\u0000\u0000\u0000\u0096\u0386\u0001\u0000\u0000\u0000\u0098\u038b"+ - "\u0001\u0000\u0000\u0000\u009a\u0394\u0001\u0000\u0000\u0000\u009c\u039b"+ - "\u0001\u0000\u0000\u0000\u009e\u03a4\u0001\u0000\u0000\u0000\u00a0\u03ac"+ - "\u0001\u0000\u0000\u0000\u00a2\u03b4\u0001\u0000\u0000\u0000\u00a4\u03b9"+ - "\u0001\u0000\u0000\u0000\u00a6\u03c3\u0001\u0000\u0000\u0000\u00a8\u03ca"+ - "\u0001\u0000\u0000\u0000\u00aa\u03cf\u0001\u0000\u0000\u0000\u00ac\u03d5"+ - "\u0001\u0000\u0000\u0000\u00ae\u03d8\u0001\u0000\u0000\u0000\u00b0\u03dc"+ - "\u0001\u0000\u0000\u0000\u00b2\u03e3\u0001\u0000\u0000\u0000\u00b4\u03e8"+ - "\u0001\u0000\u0000\u0000\u00b6\u03ed\u0001\u0000\u0000\u0000\u00b8\u03f2"+ - "\u0001\u0000\u0000\u0000\u00ba\u03fa\u0001\u0000\u0000\u0000\u00bc\u0401"+ - "\u0001\u0000\u0000\u0000\u00be\u0407\u0001\u0000\u0000\u0000\u00c0\u0415"+ - "\u0001\u0000\u0000\u0000\u00c2\u0418\u0001\u0000\u0000\u0000\u00c4\u041e"+ - "\u0001\u0000\u0000\u0000\u00c6\u0423\u0001\u0000\u0000\u0000\u00c8\u042e"+ - "\u0001\u0000\u0000\u0000\u00ca\u0432\u0001\u0000\u0000\u0000\u00cc\u0439"+ - "\u0001\u0000\u0000\u0000\u00ce\u0442\u0001\u0000\u0000\u0000\u00d0\u0446"+ - "\u0001\u0000\u0000\u0000\u00d2\u044c\u0001\u0000\u0000\u0000\u00d4\u0456"+ - "\u0001\u0000\u0000\u0000\u00d6\u0458\u0001\u0000\u0000\u0000\u00d8\u045c"+ - "\u0001\u0000\u0000\u0000\u00da\u045e\u0001\u0000\u0000\u0000\u00dc\u0462"+ - "\u0001\u0000\u0000\u0000\u00de\u0464\u0001\u0000\u0000\u0000\u00e0\u0468"+ - "\u0001\u0000\u0000\u0000\u00e2\u046a\u0001\u0000\u0000\u0000\u00e4\u046c"+ - "\u0001\u0000\u0000\u0000\u00e6\u046e\u0001\u0000\u0000\u0000\u00e8\u0470"+ - "\u0001\u0000\u0000\u0000\u00ea\u0472\u0001\u0000\u0000\u0000\u00ec\u0477"+ - "\u0001\u0000\u0000\u0000\u00ee\u047c\u0001\u0000\u0000\u0000\u00f0\u047f"+ - "\u0001\u0000\u0000\u0000\u00f2\u0483\u0001\u0000\u0000\u0000\u00f4\u0486"+ - "\u0001\u0000\u0000\u0000\u00f6\u0489\u0001\u0000\u0000\u0000\u00f8\u048c"+ - "\u0001\u0000\u0000\u0000\u00fa\u048f\u0001\u0000\u0000\u0000\u00fc\u0491"+ - "\u0001\u0000\u0000\u0000\u00fe\u0494\u0001\u0000\u0000\u0000\u0100\u0496"+ - "\u0001\u0000\u0000\u0000\u0102\u0499\u0001\u0000\u0000\u0000\u0104\u049b"+ - "\u0001\u0000\u0000\u0000\u0106\u049d\u0001\u0000\u0000\u0000\u0108\u049f"+ - "\u0001\u0000\u0000\u0000\u010a\u04a2\u0001\u0000\u0000\u0000\u010c\u04a5"+ - "\u0001\u0000\u0000\u0000\u010e\u04a8\u0001\u0000\u0000\u0000\u0110\u04aa"+ - "\u0001\u0000\u0000\u0000\u0112\u04ac\u0001\u0000\u0000\u0000\u0114\u04ae"+ - "\u0001\u0000\u0000\u0000\u0116\u04b0\u0001\u0000\u0000\u0000\u0118\u04b2"+ - "\u0001\u0000\u0000\u0000\u011a\u04b4\u0001\u0000\u0000\u0000\u011c\u04c2"+ - "\u0001\u0000\u0000\u0000\u011e\u04c6\u0001\u0000\u0000\u0000\u0120\u04d2"+ - "\u0001\u0000\u0000\u0000\u0122\u04e0\u0001\u0000\u0000\u0000\u0124\u04ec"+ - "\u0001\u0000\u0000\u0000\u0126\u0510\u0001\u0000\u0000\u0000\u0128\u0512"+ - "\u0001\u0000\u0000\u0000\u012a\u051d\u0001\u0000\u0000\u0000\u012c\u0523"+ - "\u0001\u0000\u0000\u0000\u012e\u052a\u0001\u0000\u0000\u0000\u0130\u0530"+ - "\u0001\u0000\u0000\u0000\u0132\u0532\u0001\u0000\u0000\u0000\u0134\u0537"+ - "\u0001\u0000\u0000\u0000\u0136\u053c\u0001\u0000\u0000\u0000\u0138\u0543"+ - "\u0001\u0000\u0000\u0000\u013a\u054e\u0001\u0000\u0000\u0000\u013c\u0559"+ - "\u0001\u0000\u0000\u0000\u013e\u0566\u0001\u0000\u0000\u0000\u0140\u056c"+ - "\u0001\u0000\u0000\u0000\u0142\u057b\u0001\u0000\u0000\u0000\u0144\u0581"+ - "\u0001\u0000\u0000\u0000\u0146\u0590\u0001\u0000\u0000\u0000\u0148\u0592"+ - "\u0001\u0000\u0000\u0000\u014a\u05ae\u0001\u0000\u0000\u0000\u014c\u05b8"+ - "\u0001\u0000\u0000\u0000\u014e\u05ba\u0001\u0000\u0000\u0000\u0150\u05bc"+ - "\u0001\u0000\u0000\u0000\u0152\u05be\u0001\u0000\u0000\u0000\u0154\u05c6"+ - "\u0001\u0000\u0000\u0000\u0156\u05c8\u0001\u0000\u0000\u0000\u0158\u05ca"+ - "\u0001\u0000\u0000\u0000\u015a\u05cd\u0001\u0000\u0000\u0000\u015c\u05d3"+ - "\u0001\u0000\u0000\u0000\u015e\u05e1\u0001\u0000\u0000\u0000\u0160\u05fe"+ - "\u0001\u0000\u0000\u0000\u0162\u0602\u0001\u0000\u0000\u0000\u0164\u0167"+ - "\u0003\u0004\u0001\u0000\u0165\u0167\u0003\u0124\u0091\u0000\u0166\u0164"+ - "\u0001\u0000\u0000\u0000\u0166\u0165\u0001\u0000\u0000\u0000\u0167\u0168"+ - "\u0001\u0000\u0000\u0000\u0168\u0169\u0006\u0000\u0000\u0000\u0169\u0003"+ - "\u0001\u0000\u0000\u0000\u016a\u0174\u0003\u014a\u00a4\u0000\u016b\u016c"+ - "\u0005.\u0000\u0000\u016c\u016e\u0004\u0001\u0000\u0000\u016d\u016f\u0003"+ - "\u014a\u00a4\u0000\u016e\u016d\u0001\u0000\u0000\u0000\u016e\u016f\u0001"+ - "\u0000\u0000\u0000\u016f\u0171\u0001\u0000\u0000\u0000\u0170\u0172\u0003"+ - "\u0152\u00a8\u0000\u0171\u0170\u0001\u0000\u0000\u0000\u0171\u0172\u0001"+ - "\u0000\u0000\u0000\u0172\u0175\u0001\u0000\u0000\u0000\u0173\u0175\u0003"+ - "\u0152\u00a8\u0000\u0174\u016b\u0001\u0000\u0000\u0000\u0174\u0173\u0001"+ - "\u0000\u0000\u0000\u0175\u017d\u0001\u0000\u0000\u0000\u0176\u0177\u0005"+ - ".\u0000\u0000\u0177\u0178\u0004\u0001\u0001\u0000\u0178\u017a\u0003\u014a"+ - "\u00a4\u0000\u0179\u017b\u0003\u0152\u00a8\u0000\u017a\u0179\u0001\u0000"+ - "\u0000\u0000\u017a\u017b\u0001\u0000\u0000\u0000\u017b\u017d\u0001\u0000"+ - "\u0000\u0000\u017c\u016a\u0001\u0000\u0000\u0000\u017c\u0176\u0001\u0000"+ - "\u0000\u0000\u017d\u0005\u0001\u0000\u0000\u0000\u017e\u017f\u0005t\u0000"+ - "\u0000\u017f\u0180\u0005r\u0000\u0000\u0180\u0181\u0005u\u0000\u0000\u0181"+ - "\u0182\u0005e\u0000\u0000\u0182\u0183\u0001\u0000\u0000\u0000\u0183\u0184"+ - "\u0006\u0002\u0000\u0000\u0184\u0007\u0001\u0000\u0000\u0000\u0185\u0186"+ - "\u0005f\u0000\u0000\u0186\u0187\u0005a\u0000\u0000\u0187\u0188\u0005l"+ - "\u0000\u0000\u0188\u0189\u0005s\u0000\u0000\u0189\u018a\u0005e\u0000\u0000"+ - "\u018a\u018b\u0001\u0000\u0000\u0000\u018b\u018c\u0006\u0003\u0000\u0000"+ - "\u018c\t\u0001\u0000\u0000\u0000\u018d\u018e\u0005a\u0000\u0000\u018e"+ - "\u018f\u0005s\u0000\u0000\u018f\u0190\u0005s\u0000\u0000\u0190\u0191\u0005"+ - "e\u0000\u0000\u0191\u0192\u0005r\u0000\u0000\u0192\u0193\u0005t\u0000"+ - "\u0000\u0193\u000b\u0001\u0000\u0000\u0000\u0194\u0195\u0005a\u0000\u0000"+ - "\u0195\u0196\u0005s\u0000\u0000\u0196\u0197\u0005s\u0000\u0000\u0197\u0198"+ - "\u0005u\u0000\u0000\u0198\u0199\u0005m\u0000\u0000\u0199\u019a\u0005e"+ - "\u0000\u0000\u019a\r\u0001\u0000\u0000\u0000\u019b\u019c\u0005i\u0000"+ + "\u8003\u134a\u8003\u1350\u8003\u23af\u0633\u0000\u0002\u0001\u0000\u0000"+ + "\u0000\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000"+ + "\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000"+ + "\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000"+ + "\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000"+ + "\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000"+ + "\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000"+ + "\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000"+ + " \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001"+ + "\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000"+ + "\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000"+ + ".\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001"+ + "\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000"+ + "\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000"+ + "<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001"+ + "\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000"+ + "\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000"+ + "J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001"+ + "\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000"+ + "\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000"+ + "X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001"+ + "\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000"+ + "\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000"+ + "f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000j\u0001"+ + "\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001\u0000\u0000"+ + "\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000"+ + "t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001"+ + "\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000"+ + "\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000\u0000\u0000"+ + "\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000\u0000\u0000"+ + "\u0000\u0086\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000\u0000\u0000"+ + "\u0000\u008a\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000\u0000\u0000"+ + "\u0000\u008e\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000\u0000\u0000"+ + "\u0000\u0092\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000\u0000\u0000"+ + "\u0000\u0096\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000\u0000\u0000"+ + "\u0000\u009a\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000\u0000\u0000"+ + "\u0000\u009e\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000\u0000\u0000"+ + "\u0000\u00a2\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000\u0000\u0000"+ + "\u0000\u00a6\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000\u0000\u0000"+ + "\u0000\u00aa\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000\u0000\u0000"+ + "\u0000\u00ae\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000\u0000\u0000"+ + "\u0000\u00b2\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000\u0000\u0000"+ + "\u0000\u00b6\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000\u0000\u0000"+ + "\u0000\u00ba\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000\u0000\u0000"+ + "\u0000\u00be\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000\u0000\u0000"+ + "\u0000\u00c2\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000\u0000\u0000"+ + "\u0000\u00c6\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000\u0000\u0000"+ + "\u0000\u00ca\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000\u0000\u0000"+ + "\u0000\u00ce\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000\u0000\u0000"+ + "\u0000\u00d2\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000\u0000\u0000"+ + "\u0000\u00d6\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000\u0000\u0000"+ + "\u0000\u00da\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000\u0000\u0000"+ + "\u0000\u00de\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000\u0000\u0000"+ + "\u0000\u00e2\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000\u0000\u0000"+ + "\u0000\u00e6\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000\u0000\u0000"+ + "\u0000\u00ea\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000\u0000\u0000"+ + "\u0000\u00ee\u0001\u0000\u0000\u0000\u0000\u00f0\u0001\u0000\u0000\u0000"+ + "\u0000\u00f2\u0001\u0000\u0000\u0000\u0000\u00f4\u0001\u0000\u0000\u0000"+ + "\u0000\u00f6\u0001\u0000\u0000\u0000\u0000\u00f8\u0001\u0000\u0000\u0000"+ + "\u0000\u00fa\u0001\u0000\u0000\u0000\u0000\u00fc\u0001\u0000\u0000\u0000"+ + "\u0000\u00fe\u0001\u0000\u0000\u0000\u0000\u0100\u0001\u0000\u0000\u0000"+ + "\u0000\u0102\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000\u0000\u0000"+ + "\u0000\u0106\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000\u0000\u0000"+ + "\u0000\u010a\u0001\u0000\u0000\u0000\u0000\u010c\u0001\u0000\u0000\u0000"+ + "\u0000\u010e\u0001\u0000\u0000\u0000\u0000\u0110\u0001\u0000\u0000\u0000"+ + "\u0000\u0112\u0001\u0000\u0000\u0000\u0000\u0114\u0001\u0000\u0000\u0000"+ + "\u0000\u0116\u0001\u0000\u0000\u0000\u0000\u0118\u0001\u0000\u0000\u0000"+ + "\u0000\u011a\u0001\u0000\u0000\u0000\u0000\u011c\u0001\u0000\u0000\u0000"+ + "\u0000\u011e\u0001\u0000\u0000\u0000\u0000\u0120\u0001\u0000\u0000\u0000"+ + "\u0000\u0122\u0001\u0000\u0000\u0000\u0000\u0124\u0001\u0000\u0000\u0000"+ + "\u0000\u012a\u0001\u0000\u0000\u0000\u0000\u012e\u0001\u0000\u0000\u0000"+ + "\u0000\u0130\u0001\u0000\u0000\u0000\u0000\u0132\u0001\u0000\u0000\u0000"+ + "\u0000\u0134\u0001\u0000\u0000\u0000\u0000\u0136\u0001\u0000\u0000\u0000"+ + "\u0000\u0138\u0001\u0000\u0000\u0000\u0000\u013a\u0001\u0000\u0000\u0000"+ + "\u0000\u013c\u0001\u0000\u0000\u0000\u0000\u013e\u0001\u0000\u0000\u0000"+ + "\u0000\u0140\u0001\u0000\u0000\u0000\u0000\u0142\u0001\u0000\u0000\u0000"+ + "\u0000\u0144\u0001\u0000\u0000\u0000\u0001\u015a\u0001\u0000\u0000\u0000"+ + "\u0001\u015c\u0001\u0000\u0000\u0000\u0001\u015e\u0001\u0000\u0000\u0000"+ + "\u0001\u0160\u0001\u0000\u0000\u0000\u0001\u0162\u0001\u0000\u0000\u0000"+ + "\u0002\u0166\u0001\u0000\u0000\u0000\u0004\u017c\u0001\u0000\u0000\u0000"+ + "\u0006\u017e\u0001\u0000\u0000\u0000\b\u0185\u0001\u0000\u0000\u0000\n"+ + "\u018d\u0001\u0000\u0000\u0000\f\u0194\u0001\u0000\u0000\u0000\u000e\u019b"+ + "\u0001\u0000\u0000\u0000\u0010\u01a2\u0001\u0000\u0000\u0000\u0012\u01a9"+ + "\u0001\u0000\u0000\u0000\u0014\u01b2\u0001\u0000\u0000\u0000\u0016\u01bc"+ + "\u0001\u0000\u0000\u0000\u0018\u01c4\u0001\u0000\u0000\u0000\u001a\u01ce"+ + "\u0001\u0000\u0000\u0000\u001c\u01da\u0001\u0000\u0000\u0000\u001e\u01e1"+ + "\u0001\u0000\u0000\u0000 \u01ec\u0001\u0000\u0000\u0000\"\u01ef\u0001"+ + "\u0000\u0000\u0000$\u01f5\u0001\u0000\u0000\u0000&\u01fe\u0001\u0000\u0000"+ + "\u0000(\u0203\u0001\u0000\u0000\u0000*\u020a\u0001\u0000\u0000\u0000,"+ + "\u0211\u0001\u0000\u0000\u0000.\u0217\u0001\u0000\u0000\u00000\u021c\u0001"+ + "\u0000\u0000\u00002\u0223\u0001\u0000\u0000\u00004\u022d\u0001\u0000\u0000"+ + "\u00006\u0231\u0001\u0000\u0000\u00008\u0237\u0001\u0000\u0000\u0000:"+ + "\u023a\u0001\u0000\u0000\u0000<\u023c\u0001\u0000\u0000\u0000>\u0243\u0001"+ + "\u0000\u0000\u0000@\u0249\u0001\u0000\u0000\u0000B\u0256\u0001\u0000\u0000"+ + "\u0000D\u025f\u0001\u0000\u0000\u0000F\u0263\u0001\u0000\u0000\u0000H"+ + "\u0267\u0001\u0000\u0000\u0000J\u026d\u0001\u0000\u0000\u0000L\u026f\u0001"+ + "\u0000\u0000\u0000N\u0272\u0001\u0000\u0000\u0000P\u0277\u0001\u0000\u0000"+ + "\u0000R\u027d\u0001\u0000\u0000\u0000T\u0283\u0001\u0000\u0000\u0000V"+ + "\u028a\u0001\u0000\u0000\u0000X\u0291\u0001\u0000\u0000\u0000Z\u029a\u0001"+ + "\u0000\u0000\u0000\\\u02a5\u0001\u0000\u0000\u0000^\u02ab\u0001\u0000"+ + "\u0000\u0000`\u02b1\u0001\u0000\u0000\u0000b\u02b8\u0001\u0000\u0000\u0000"+ + "d\u02be\u0001\u0000\u0000\u0000f\u02c5\u0001\u0000\u0000\u0000h\u02cb"+ + "\u0001\u0000\u0000\u0000j\u02d4\u0001\u0000\u0000\u0000l\u02dc\u0001\u0000"+ + "\u0000\u0000n\u02e2\u0001\u0000\u0000\u0000p\u02ea\u0001\u0000\u0000\u0000"+ + "r\u02f1\u0001\u0000\u0000\u0000t\u02f6\u0001\u0000\u0000\u0000v\u02ff"+ + "\u0001\u0000\u0000\u0000x\u030e\u0001\u0000\u0000\u0000z\u0314\u0001\u0000"+ + "\u0000\u0000|\u0318\u0001\u0000\u0000\u0000~\u031b\u0001\u0000\u0000\u0000"+ + "\u0080\u0322\u0001\u0000\u0000\u0000\u0082\u032c\u0001\u0000\u0000\u0000"+ + "\u0084\u0336\u0001\u0000\u0000\u0000\u0086\u0342\u0001\u0000\u0000\u0000"+ + "\u0088\u034b\u0001\u0000\u0000\u0000\u008a\u0355\u0001\u0000\u0000\u0000"+ + "\u008c\u035d\u0001\u0000\u0000\u0000\u008e\u0369\u0001\u0000\u0000\u0000"+ + "\u0090\u0378\u0001\u0000\u0000\u0000\u0092\u037e\u0001\u0000\u0000\u0000"+ + "\u0094\u0382\u0001\u0000\u0000\u0000\u0096\u0386\u0001\u0000\u0000\u0000"+ + "\u0098\u038b\u0001\u0000\u0000\u0000\u009a\u0394\u0001\u0000\u0000\u0000"+ + "\u009c\u039b\u0001\u0000\u0000\u0000\u009e\u03a4\u0001\u0000\u0000\u0000"+ + "\u00a0\u03ac\u0001\u0000\u0000\u0000\u00a2\u03b4\u0001\u0000\u0000\u0000"+ + "\u00a4\u03b9\u0001\u0000\u0000\u0000\u00a6\u03c3\u0001\u0000\u0000\u0000"+ + "\u00a8\u03ca\u0001\u0000\u0000\u0000\u00aa\u03cf\u0001\u0000\u0000\u0000"+ + "\u00ac\u03d5\u0001\u0000\u0000\u0000\u00ae\u03d8\u0001\u0000\u0000\u0000"+ + "\u00b0\u03dc\u0001\u0000\u0000\u0000\u00b2\u03e3\u0001\u0000\u0000\u0000"+ + "\u00b4\u03e8\u0001\u0000\u0000\u0000\u00b6\u03ed\u0001\u0000\u0000\u0000"+ + "\u00b8\u03f2\u0001\u0000\u0000\u0000\u00ba\u03fa\u0001\u0000\u0000\u0000"+ + "\u00bc\u0401\u0001\u0000\u0000\u0000\u00be\u0407\u0001\u0000\u0000\u0000"+ + "\u00c0\u0415\u0001\u0000\u0000\u0000\u00c2\u0418\u0001\u0000\u0000\u0000"+ + "\u00c4\u041e\u0001\u0000\u0000\u0000\u00c6\u0423\u0001\u0000\u0000\u0000"+ + "\u00c8\u042e\u0001\u0000\u0000\u0000\u00ca\u0432\u0001\u0000\u0000\u0000"+ + "\u00cc\u0439\u0001\u0000\u0000\u0000\u00ce\u0442\u0001\u0000\u0000\u0000"+ + "\u00d0\u0446\u0001\u0000\u0000\u0000\u00d2\u044c\u0001\u0000\u0000\u0000"+ + "\u00d4\u0456\u0001\u0000\u0000\u0000\u00d6\u0458\u0001\u0000\u0000\u0000"+ + "\u00d8\u045c\u0001\u0000\u0000\u0000\u00da\u045e\u0001\u0000\u0000\u0000"+ + "\u00dc\u0462\u0001\u0000\u0000\u0000\u00de\u0464\u0001\u0000\u0000\u0000"+ + "\u00e0\u0468\u0001\u0000\u0000\u0000\u00e2\u046a\u0001\u0000\u0000\u0000"+ + "\u00e4\u046c\u0001\u0000\u0000\u0000\u00e6\u046e\u0001\u0000\u0000\u0000"+ + "\u00e8\u0470\u0001\u0000\u0000\u0000\u00ea\u0472\u0001\u0000\u0000\u0000"+ + "\u00ec\u0477\u0001\u0000\u0000\u0000\u00ee\u047c\u0001\u0000\u0000\u0000"+ + "\u00f0\u047f\u0001\u0000\u0000\u0000\u00f2\u0483\u0001\u0000\u0000\u0000"+ + "\u00f4\u0486\u0001\u0000\u0000\u0000\u00f6\u0489\u0001\u0000\u0000\u0000"+ + "\u00f8\u048c\u0001\u0000\u0000\u0000\u00fa\u048f\u0001\u0000\u0000\u0000"+ + "\u00fc\u0491\u0001\u0000\u0000\u0000\u00fe\u0494\u0001\u0000\u0000\u0000"+ + "\u0100\u0496\u0001\u0000\u0000\u0000\u0102\u0499\u0001\u0000\u0000\u0000"+ + "\u0104\u049b\u0001\u0000\u0000\u0000\u0106\u049d\u0001\u0000\u0000\u0000"+ + "\u0108\u049f\u0001\u0000\u0000\u0000\u010a\u04a2\u0001\u0000\u0000\u0000"+ + "\u010c\u04a5\u0001\u0000\u0000\u0000\u010e\u04a8\u0001\u0000\u0000\u0000"+ + "\u0110\u04aa\u0001\u0000\u0000\u0000\u0112\u04ac\u0001\u0000\u0000\u0000"+ + "\u0114\u04ae\u0001\u0000\u0000\u0000\u0116\u04b0\u0001\u0000\u0000\u0000"+ + "\u0118\u04b2\u0001\u0000\u0000\u0000\u011a\u04b4\u0001\u0000\u0000\u0000"+ + "\u011c\u04c2\u0001\u0000\u0000\u0000\u011e\u04c6\u0001\u0000\u0000\u0000"+ + "\u0120\u04d2\u0001\u0000\u0000\u0000\u0122\u04e0\u0001\u0000\u0000\u0000"+ + "\u0124\u04ec\u0001\u0000\u0000\u0000\u0126\u0510\u0001\u0000\u0000\u0000"+ + "\u0128\u0512\u0001\u0000\u0000\u0000\u012a\u051d\u0001\u0000\u0000\u0000"+ + "\u012c\u0523\u0001\u0000\u0000\u0000\u012e\u052a\u0001\u0000\u0000\u0000"+ + "\u0130\u0530\u0001\u0000\u0000\u0000\u0132\u0532\u0001\u0000\u0000\u0000"+ + "\u0134\u0537\u0001\u0000\u0000\u0000\u0136\u053c\u0001\u0000\u0000\u0000"+ + "\u0138\u0543\u0001\u0000\u0000\u0000\u013a\u054e\u0001\u0000\u0000\u0000"+ + "\u013c\u0559\u0001\u0000\u0000\u0000\u013e\u0566\u0001\u0000\u0000\u0000"+ + "\u0140\u056c\u0001\u0000\u0000\u0000\u0142\u057b\u0001\u0000\u0000\u0000"+ + "\u0144\u0581\u0001\u0000\u0000\u0000\u0146\u0590\u0001\u0000\u0000\u0000"+ + "\u0148\u0592\u0001\u0000\u0000\u0000\u014a\u05ae\u0001\u0000\u0000\u0000"+ + "\u014c\u05b8\u0001\u0000\u0000\u0000\u014e\u05ba\u0001\u0000\u0000\u0000"+ + "\u0150\u05bc\u0001\u0000\u0000\u0000\u0152\u05be\u0001\u0000\u0000\u0000"+ + "\u0154\u05c6\u0001\u0000\u0000\u0000\u0156\u05c8\u0001\u0000\u0000\u0000"+ + "\u0158\u05ca\u0001\u0000\u0000\u0000\u015a\u05cd\u0001\u0000\u0000\u0000"+ + "\u015c\u05d3\u0001\u0000\u0000\u0000\u015e\u05e1\u0001\u0000\u0000\u0000"+ + "\u0160\u05fe\u0001\u0000\u0000\u0000\u0162\u0602\u0001\u0000\u0000\u0000"+ + "\u0164\u0167\u0003\u0004\u0001\u0000\u0165\u0167\u0003\u0124\u0091\u0000"+ + "\u0166\u0164\u0001\u0000\u0000\u0000\u0166\u0165\u0001\u0000\u0000\u0000"+ + "\u0167\u0168\u0001\u0000\u0000\u0000\u0168\u0169\u0006\u0000\u0000\u0000"+ + "\u0169\u0003\u0001\u0000\u0000\u0000\u016a\u0174\u0003\u014a\u00a4\u0000"+ + "\u016b\u016c\u0005.\u0000\u0000\u016c\u016e\u0004\u0001\u0000\u0000\u016d"+ + "\u016f\u0003\u014a\u00a4\u0000\u016e\u016d\u0001\u0000\u0000\u0000\u016e"+ + "\u016f\u0001\u0000\u0000\u0000\u016f\u0171\u0001\u0000\u0000\u0000\u0170"+ + "\u0172\u0003\u0152\u00a8\u0000\u0171\u0170\u0001\u0000\u0000\u0000\u0171"+ + "\u0172\u0001\u0000\u0000\u0000\u0172\u0175\u0001\u0000\u0000\u0000\u0173"+ + "\u0175\u0003\u0152\u00a8\u0000\u0174\u016b\u0001\u0000\u0000\u0000\u0174"+ + "\u0173\u0001\u0000\u0000\u0000\u0175\u017d\u0001\u0000\u0000\u0000\u0176"+ + "\u0177\u0005.\u0000\u0000\u0177\u0178\u0004\u0001\u0001\u0000\u0178\u017a"+ + "\u0003\u014a\u00a4\u0000\u0179\u017b\u0003\u0152\u00a8\u0000\u017a\u0179"+ + "\u0001\u0000\u0000\u0000\u017a\u017b\u0001\u0000\u0000\u0000\u017b\u017d"+ + "\u0001\u0000\u0000\u0000\u017c\u016a\u0001\u0000\u0000\u0000\u017c\u0176"+ + "\u0001\u0000\u0000\u0000\u017d\u0005\u0001\u0000\u0000\u0000\u017e\u017f"+ + "\u0005t\u0000\u0000\u017f\u0180\u0005r\u0000\u0000\u0180\u0181\u0005u"+ + "\u0000\u0000\u0181\u0182\u0005e\u0000\u0000\u0182\u0183\u0001\u0000\u0000"+ + "\u0000\u0183\u0184\u0006\u0002\u0000\u0000\u0184\u0007\u0001\u0000\u0000"+ + "\u0000\u0185\u0186\u0005f\u0000\u0000\u0186\u0187\u0005a\u0000\u0000\u0187"+ + "\u0188\u0005l\u0000\u0000\u0188\u0189\u0005s\u0000\u0000\u0189\u018a\u0005"+ + "e\u0000\u0000\u018a\u018b\u0001\u0000\u0000\u0000\u018b\u018c\u0006\u0003"+ + "\u0000\u0000\u018c\t\u0001\u0000\u0000\u0000\u018d\u018e\u0005a\u0000"+ + "\u0000\u018e\u018f\u0005s\u0000\u0000\u018f\u0190\u0005s\u0000\u0000\u0190"+ + "\u0191\u0005e\u0000\u0000\u0191\u0192\u0005r\u0000\u0000\u0192\u0193\u0005"+ + "t\u0000\u0000\u0193\u000b\u0001\u0000\u0000\u0000\u0194\u0195\u0005a\u0000"+ + "\u0000\u0195\u0196\u0005s\u0000\u0000\u0196\u0197\u0005s\u0000\u0000\u0197"+ + "\u0198\u0005u\u0000\u0000\u0198\u0199\u0005m\u0000\u0000\u0199\u019a\u0005"+ + "e\u0000\u0000\u019a\r\u0001\u0000\u0000\u0000\u019b\u019c\u0005i\u0000"+ "\u0000\u019c\u019d\u0005n\u0000\u0000\u019d\u019e\u0005h\u0000\u0000\u019e"+ "\u019f\u0005a\u0000\u0000\u019f\u01a0\u0005l\u0000\u0000\u01a0\u01a1\u0005"+ "e\u0000\u0000\u01a1\u000f\u0001\u0000\u0000\u0000\u01a2\u01a3\u0005e\u0000"+ diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 827cbe936..39199c952 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -11,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class GobraParser extends GobraParserBase { - static { RuntimeMetaData.checkVersion("4.12.0", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index cc609ad80..ea41681a0 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 9b23c3195..37344b222 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 +// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.13.1 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; From 9834dedaadf059f40f9a5afa56505b2763304826 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 28 Mar 2024 08:52:34 +0100 Subject: [PATCH 261/296] implements CR suggestions by Felix --- .../resolution/MemberResolution.scala | 14 ++++---- .../typing/ghost/separation/GhostTyping.scala | 4 +-- .../ghost_pointer/ghost-nil-simple01.gobra | 25 +++++++++++++ .../ghost-pointer-receiver-fail01.gobra | 33 ----------------- .../ghost-pointer-receiver-simple01.gobra | 35 ++++++++++++++----- 5 files changed, 62 insertions(+), 49 deletions(-) create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-nil-simple01.gobra delete mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index ff21f6c06..0aa807928 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -86,7 +86,7 @@ trait MemberResolution { this: TypeInfoImpl => def go(pastDeref: Boolean): Type => AdvancedMemberSet[AdtMember] = attr[Type, AdvancedMemberSet[AdtMember]] { case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface - case ActualPointerT(t) if !pastDeref => go(pastDeref = true)(t).ref + case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref case t: AdtT => val clauseMemberSets = t.adtDecl.clauses.map(adtClauseMemberSet(_, t.decl, t.adtDecl, t.context)) @@ -225,7 +225,7 @@ trait MemberResolution { this: TypeInfoImpl => def go(pastDeref: Boolean): Type => AdvancedMemberSet[M] = attr[Type, AdvancedMemberSet[M]] { case DeclaredT(decl, context) => go(pastDeref)(context.symbType(decl.right)).surface - case ActualPointerT(t) if !pastDeref => go(pastDeref = true)(t).ref + case PointerT(t) if !pastDeref => go(pastDeref = true)(t).ref case s: StructT => AdvancedMemberSet.union(s.decl.embedded map { e => @@ -246,7 +246,8 @@ trait MemberResolution { this: TypeInfoImpl => private val pastPromotionsMethodSuffix: Type => AdvancedMemberSet[TypeMember] = attr[Type, AdvancedMemberSet[TypeMember]] { case t: InterfaceT => interfaceMethodSet(t) - case pt@ActualPointerT(t) => receiverSet(pt) union receiverSet(t).ref + case pt@PointerT(t) => receiverSet(pt) union receiverSet(t).ref + // we do not add `receiverSet(GhostPointerT(t)).deref` since this would result in implicitly assuming that the receiver points to the ghost heap, which is not guaranteed: case t => receiverSet(t) union receiverSet(ActualPointerT(t)).deref } @@ -254,7 +255,7 @@ trait MemberResolution { this: TypeInfoImpl => attr[Type, AdvancedMemberSet[TypeMember]] { case Single(t) => pastPromotions(pastPromotionsMethodSuffix)(t) union (t match { - case pt@ ActualPointerT(st) => receiverSet(pt) union receiverSet(st).ref + case pt@ PointerT(st) => receiverSet(pt) union receiverSet(st).ref case _ => receiverSet(t) }) case _ => AdvancedMemberSet.empty @@ -264,7 +265,8 @@ trait MemberResolution { this: TypeInfoImpl => attr[Type, AdvancedMemberSet[TypeMember]] { case Single(t) => pastPromotions(pastPromotionsMethodSuffix)(t) union (t match { - case pt@ ActualPointerT(st) => receiverSet(pt) union receiverSet(st).ref + case pt@ PointerT(st) => receiverSet(pt) union receiverSet(st).ref + // we do not add `receiverSet(GhostPointerT(t)).deref` since this would result in implicitly assuming that the receiver points to the ghost heap, which is not guaranteed: case _ => receiverSet(t) union receiverSet(ActualPointerT(t)).deref }) case _ => AdvancedMemberSet.empty @@ -317,7 +319,7 @@ trait MemberResolution { this: TypeInfoImpl => private def getMethodReceiverContext(t: Type): ExternalTypeInfo = { Single.unapply(t) match { case Some(ct: ContextualType) => ct.context - case Some(p: ActualPointerT) => getMethodReceiverContext(p.elem) + case Some(p: PointerT) => getMethodReceiverContext(p.elem) case _ => this } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala index aeb011743..308d66ff6 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala @@ -131,7 +131,7 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => createGhostTyping[PExpression] { case PNamedOperand(id) => ghost(ghostIdClassification(id)) case e: PDeref => resolve(e) match { - case Some(ap.Deref(base)) => exprType(base) match { + case Some(ap.Deref(base)) => underlyingType(exprType(base)) match { case _: Type.GhostPointerT => isGhost case _ => notGhost } @@ -140,7 +140,7 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => case e: PDot => resolve(e) match { case Some(s: ap.FieldSelection) => val isGhostField = ghostIdClassification(s.id) - (typ(s.base), isGhostField) match { + (underlyingType(typ(s.base)), isGhostField) match { case (_, true) => isGhost // ghost fields are always ghost memory case (tb: Type.PointerT, _) => ghost(tb.isInstanceOf[Type.GhostPointerT]) // (implicitly) dereferencing a field of a ghost pointer leads to a ghost heap location case _ => ghostLocationTyping(s.base) // assignee is on the stack, recurse to find out if it's a ghost or actual variable diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-nil-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-nil-simple01.gobra new file mode 100644 index 000000000..e551bdd90 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-nil-simple01.gobra @@ -0,0 +1,25 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostNilSimple01 + +ghost +decreases +func GhostFunc(a *int) { + a = nil + var b gpointer[int] + b = nil + b = new(int) + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} + +decreases +func ActualFunc(ghost b gpointer[int]) { + var a *int = nil + a = new(int) + b = nil + ghost b = new(int) + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra deleted file mode 100644 index d8c9e4d32..000000000 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra +++ /dev/null @@ -1,33 +0,0 @@ -// Any copyright is dedicated to the Public Domain. -// http://creativecommons.org/publicdomain/zero/1.0/ - -package GhostPointerReceiverFail01 - -type Foo struct { - field int -} - -ghost -decreases -func GhostFunc() { - p := &Foo{ 42 } - p.bar1() - //:: ExpectedOutput(type_error) - p.bar2() // bar2 is not defined on a ghost pointer -} - -// note that the type error refers to the receiver but is (for technical reasons) located at the beginning of the function declaration -//:: ExpectedOutput(type_error) -decreases -func (r gpointer[Foo]) bar1() int { // ghostpointer is only allowed for ghost methods - r.field = 0 - return 42 -} - -ghost -decreases -func (r *Foo) bar2() int { - //:: ExpectedOutput(type_error) - r.field = 0 // fails since we're trying to modify actual memory - return r.field -} diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-simple01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-simple01.gobra index c21f3a77a..5cec3fc20 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-simple01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-simple01.gobra @@ -12,36 +12,55 @@ decreases preserves acc(p) func GhostFunc(p *Foo) { gp := &Foo{ 42 } - gp.bar1() + gp.GhostPointerReceiver() - p.bar2() - (*p).bar3() - (*gp).bar3() + (*p).GhostNonPointerReceiver() + // p is implicitly dereferenced: + p.GhostNonPointerReceiver() + (*gp).GhostNonPointerReceiver() + // gp is implicitly dereferenced: + x := gp.GhostNonPointerReceiver() +} + +decreases +preserves acc(p) +func ActualFunc(p *Foo) { + p.ActualPointerReceiver() + (*p).GhostNonPointerReceiver() + // *p is implicitly referenced: + (*p).ActualPointerReceiver() + // p is implicitly dereferenced: + p.ActualNonPointerReceiver() + //:: ExpectedOutput(assert_error:assertion_error) + assert false } ghost decreases preserves acc(r) -func (r gpointer[Foo]) bar1() int { +func (r gpointer[Foo]) GhostPointerReceiver() int { r.field = 0 return r.field } decreases preserves acc(r) -func (r *Foo) bar2() int { +func (r *Foo) ActualPointerReceiver() int { r.field = 0 return r.field } ghost decreases -func (r Foo) bar3() int { +func (r Foo) GhostNonPointerReceiver() int { r.field = 42 return r.field } -func (r Foo) bar4() int { +decreases +//:: ExpectedOutput(postcondition_error:assertion_error) +ensures r.field == 42 +func (r Foo) ActualNonPointerReceiver() int { r.field = 42 return r.field } From c9ed150a0b2172649b31501237ad80a8b8c2ac21 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 28 Mar 2024 08:53:27 +0100 Subject: [PATCH 262/296] treats the receiver of a method expression as a ghost parameter --- .../typing/ghost/separation/GhostAssignability.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala index d3d946e86..6a0650f38 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala @@ -167,12 +167,14 @@ trait GhostAssignability { case p: ap.Function => argTyping(p.symb.args, p.symb.ghost, p.symb.context) case p: ap.Closure => argTyping(p.symb.args, p.symb.ghost, p.symb.context) case p: ap.ReceivedMethod => argTyping(p.symb.args, p.symb.ghost, p.symb.context) - case p: ap.MethodExpr => GhostType.ghostTuple(false +: argTyping(p.symb.args, p.symb.ghost, p.symb.context).toTuple) + // first argument is the receiver which inherits its ghostness from the method's ghostness + case p: ap.MethodExpr => GhostType.ghostTuple(p.symb.ghost +: argTyping(p.symb.args, p.symb.ghost, p.symb.context).toTuple) case _: ap.PredicateKind => GhostType.isGhost case _: ap.DomainFunction => GhostType.isGhost case ap.BuiltInFunction(_, symb) => argGhostTyping(symb.tag, call.args.map(typ)) case ap.BuiltInReceivedMethod(recv, _, _, symb) => argGhostTyping(symb.tag, Vector(typ(recv))) - case ap.BuiltInMethodExpr(typ, _, _, symb) => GhostType.ghostTuple(false +: argGhostTyping(symb.tag, Vector(typeSymbType(typ))).toTuple) + // first argument is the receiver which inherits its ghostness from the method's ghostness + case ap.BuiltInMethodExpr(typ, _, _, symb) => GhostType.ghostTuple(symb.ghost +: argGhostTyping(symb.tag, Vector(typeSymbType(typ))).toTuple) case p: ap.ImplicitlyReceivedInterfaceMethod => argTyping(p.symb.args, p.symb.ghost, p.symb.context) case _ => GhostType.notGhost // conservative choice } From 28004e06fc267c1a4b994fe8ab474c1ea45e5fc2 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 28 Mar 2024 13:54:47 +0100 Subject: [PATCH 263/296] Updates submodules (#754) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 15e19d245..a339b94c3 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 15e19d245d423769505cd647ffd1eafa3e875569 +Subproject commit a339b94c3680fc0588528bfda04598c8826a701b From c448f51a6804d5ad56ae5fae4c231c455a94252c Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 28 Mar 2024 08:53:50 +0100 Subject: [PATCH 264/296] disallows actual method calls in ghost code --- .../scala/viper/gobra/ast/frontend/Ast.scala | 12 +- .../gobra/ast/frontend/PrettyPrinter.scala | 44 ++-- .../scala/viper/gobra/frontend/Desugar.scala | 3 +- .../resolution/NameResolution.scala | 15 +- .../implementation/typing/MemberTyping.scala | 32 +++ .../implementation/typing/MiscTyping.scala | 73 ++++++ .../implementation/typing/StmtTyping.scala | 243 +++++++++++++++++- .../typing/ghost/GhostMemberTyping.scala | 33 +-- .../typing/ghost/GhostMiscTyping.scala | 73 +----- .../typing/ghost/GhostStmtTyping.scala | 238 +---------------- .../ghost/separation/GhostLessPrinter.scala | 1 + .../ghost/separation/GhostWellDef.scala | 43 ++-- .../ghost/separation/GoifyingPrinter.scala | 1 + .../closures/closures-fail5-proofs.gobra | 3 +- .../ghost-pointer-receiver-fail01.gobra | 149 +++++++++++ .../features/options/options-simple3.gobra | 6 +- 16 files changed, 575 insertions(+), 394 deletions(-) create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index c5f396129..8122d9d50 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -465,7 +465,9 @@ case class PClosureSpecInstance(func: PNameOrDot, params: Vector[PKeyedElement]) case class PClosureImplements(closure: PExpression, spec: PClosureSpecInstance) extends PGhostExpression -case class PClosureImplProof(impl: PClosureImplements, block: PBlock) extends PGhostStatement with PScope +case class PClosureImplProof(impl: PClosureImplements, block: PBlock) extends PActualStatement with PScope with PProofAnnotation { + override def nonGhostChildren: Vector[PBlock] = Vector(block) +} case class PInvoke(base: PExpressionOrType, args: Vector[PExpression], spec: Option[PClosureSpecInstance], reveal: Boolean = false) extends PActualExpression { require(base.isInstanceOf[PExpression] || spec.isEmpty) // `base` is a type for conversions only, for which `spec` is empty @@ -938,7 +940,9 @@ case class PImplementationProof( subT: PType, superT: PType, alias: Vector[PImplementationProofPredicateAlias], memberProofs: Vector[PMethodImplementationProof] - ) extends PGhostMember + ) extends PActualMember with PProofAnnotation { + override def nonGhostChildren: Vector[PNode] = memberProofs +} case class PMethodImplementationProof( id: PIdnUse, // references the method definition of the super type @@ -947,7 +951,9 @@ case class PMethodImplementationProof( result: PResult, isPure: Boolean, body: Option[(PBodyParameterInfo, PBlock)] - ) extends PGhostMisc with PScope with PCodeRootWithResult with PWithBody + ) extends PActualMisc with PScope with PCodeRootWithResult with PWithBody with PProofAnnotation { + override def nonGhostChildren: Vector[PNode] = Vector(receiver, result) ++ args ++ body.map(_._2).toVector +} case class PImplementationProofPredicateAlias(left: PIdnUse, right: PNameOrDot) extends PGhostMisc diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index 579b736ba..74f2dd9bb 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -112,6 +112,11 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PMethodDecl(id, rec, args, res, spec, body) => showSpec(spec) <> "func" <+> showReceiver(rec) <+> showId(id) <> parens(showParameterList(args)) <> showResult(res) <> opt(body)(b => space <> showBodyParameterInfoWithBlock(b._1, b._2)) + case ip: PImplementationProof => + showType(ip.subT) <+> "implements" <+> showType(ip.superT) <> ( + if (ip.alias.isEmpty && ip.memberProofs.isEmpty) emptyDoc + else block(ssep(ip.alias map showMisc, line) <> line <> ssep(ip.memberProofs map showMisc, line)) + ) } case member: PGhostMember => member match { case PExplicitGhostMember(m) => "ghost" <+> showMember(m) @@ -119,11 +124,6 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter "pred" <+> showId(id) <> parens(showParameterList(args)) <> opt(body)(b => space <> block(showExpr(b))) case PMPredicateDecl(id, recv, args, body) => "pred" <+> showReceiver(recv) <+> showId(id) <> parens(showParameterList(args)) <> opt(body)(b => space <> block(showExpr(b))) - case ip: PImplementationProof => - showType(ip.subT) <+> "implements" <+> showType(ip.superT) <> ( - if (ip.alias.isEmpty && ip.memberProofs.isEmpty) emptyDoc - else block(ssep(ip.alias map showMisc, line) <> line <> ssep(ip.memberProofs map showMisc, line)) - ) } } @@ -279,6 +279,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PBlock(stmts) => block(showStmtList(stmts)) case PSeq(stmts) => showStmtList(stmts) case POutline(body, spec) => showSpec(spec) <> "outline" <> parens(nest(line <> showStmt(body)) <> line) + case PClosureImplProof(impl, PBlock(stmts)) => "proof" <+> showExpr(impl) <> block(showStmtList(stmts)) } case statement: PGhostStatement => statement match { case PExplicitGhostStatement(actual) => "ghost" <+> showStmt(actual) @@ -292,7 +293,6 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PApplyWand(wand) => "apply" <+> showExpr(wand) case PMatchStatement(exp, clauses, _) => "match" <+> showExpr(exp) <+> block(ssep(clauses map showMatchClauseStatement, line)) - case PClosureImplProof(impl, PBlock(stmts)) => "proof" <+> showExpr(impl) <> block(showStmtList(stmts)) } } @@ -703,15 +703,21 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter // misc def showMisc(id: PMisc): Doc = id match { - case n: PRange => showRange(n) - case receiver: PReceiver => showReceiver(receiver) - case result: PResult => showResult(result) - case embeddedType: PEmbeddedType => showEmbeddedType(embeddedType) - case parameter: PParameter => showParameter(parameter) - case literalValue: PLiteralValue => showLiteralValue(literalValue) - case keyedElement: PKeyedElement => showKeyedElement(keyedElement) - case compositeVal: PCompositeVal => showCompositeVal(compositeVal) - case closureDecl: PClosureDecl => showFunctionLit(PFunctionLit(None, closureDecl)) + case misc: PActualMisc => misc match { + case n: PRange => showRange(n) + case receiver: PReceiver => showReceiver(receiver) + case result: PResult => showResult(result) + case embeddedType: PEmbeddedType => showEmbeddedType(embeddedType) + case parameter: PParameter => showParameter(parameter) + case literalValue: PLiteralValue => showLiteralValue(literalValue) + case keyedElement: PKeyedElement => showKeyedElement(keyedElement) + case compositeVal: PCompositeVal => showCompositeVal(compositeVal) + case closureDecl: PClosureDecl => showFunctionLit(PFunctionLit(None, closureDecl)) + case mip: PMethodImplementationProof => + (if (mip.isPure) "pure ": Doc else emptyDoc) <> + parens(showParameter(mip.receiver)) <+> showId(mip.id) <> parens(showParameterList(mip.args)) <> showResult(mip.result) <> + opt(mip.body)(b => space <> showBodyParameterInfoWithBlock(b._1, b._2)) + } case misc: PGhostMisc => misc match { case s: PClosureSpecInstance => showExprOrType(s.func) <> braces(ssep(s.params map showMisc, comma <> space)) case PFPredBase(id) => showId(id) @@ -722,10 +728,6 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PDomainFunction(id, args, res) => "func" <+> showId(id) <> parens(showParameterList(args)) <> showResult(res) case PDomainAxiom(exp) => "axiom" <+> block(showExpr(exp)) - case mip: PMethodImplementationProof => - (if (mip.isPure) "pure ": Doc else emptyDoc) <> - parens(showParameter(mip.receiver)) <+> showId(mip.id) <> parens(showParameterList(mip.args)) <> showResult(mip.result) <> - opt(mip.body)(b => space <> showBodyParameterInfoWithBlock(b._1, b._2)) case ipa: PImplementationProofPredicateAlias => "pred" <+> showId(ipa.left) <+> ":=" <+> showExprOrType(ipa.right) case PAdtClause(id, args) => @@ -759,6 +761,8 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter { showSpec(spec) <> "func" <+> showId(id) <> parens(showParameterList(args)) <> showResult(res) case PMethodDecl(id, rec, args, res, spec, _) => showSpec(spec) <> "func" <+> showReceiver(rec) <+> showId(id) <> parens(showParameterList(args)) <> showResult(res) + case ip: PImplementationProof => + showType(ip.subT) <+> "implements" <+> showType(ip.superT) } case member: PGhostMember => member match { case PExplicitGhostMember(m) => "ghost" <+> showMember(m) @@ -766,8 +770,6 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter { "pred" <+> showId(id) <> parens(showParameterList(args)) case PMPredicateDecl(id, recv, args, _) => "pred" <+> showReceiver(recv) <+> showId(id) <> parens(showParameterList(args)) - case ip: PImplementationProof => - showType(ip.subT) <+> "implements" <+> showType(ip.superT) } } diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index d044058a1..493d67587 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -1914,6 +1914,8 @@ object Desugar extends LazyLogging { case t => violation(s"Type $t not supported as a range expression") } + case p: PClosureImplProof => closureImplProofD(ctx)(p) + case _ => ??? } } @@ -4108,7 +4110,6 @@ object Desugar extends LazyLogging { case w: in.MagicWand => in.ApplyWand(w)(src) case e => Violation.violation(s"Expected a magic wand, but got $e") } - case p: PClosureImplProof => closureImplProofD(ctx)(p) case PExplicitGhostStatement(actual) => stmtD(ctx, info)(actual) case PMatchStatement(exp, clauses, strict) => diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index 43d2a52a7..8135f35bf 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -144,7 +144,10 @@ trait NameResolution { case _ => violation("PIdnUnk always has a parent") } - private[resolution] lazy val isGhostDef: PNode => Boolean = isEnclosingGhost + // technically, `isGhostDef` should consider for implementation proofs whether the method getting implemented is ghost + // however, since implementation proofs are syntactically restricted, we assume for now that definitions in all + // implementation proofs are non-ghost. + private[resolution] lazy val isGhostDef: PNode => Boolean = n => isEnclosingGhost(n) private[resolution] def serialize(id: PIdnNode): String = id.name @@ -260,11 +263,13 @@ trait NameResolution { case d: PFunctionDecl => Vector(d.id) case d: PTypeDecl => Vector(d.left) ++ leakingIdentifier(d.right) case d: PMethodDecl => Vector(d.id) + case _: PImplementationProof => Vector.empty + } + case g: PGhostMember => g match { + case PExplicitGhostMember(a) => packageLevelDefinitions(a) + case p: PMPredicateDecl => Vector(p.id) + case p: PFPredicateDecl => Vector(p.id) } - case PExplicitGhostMember(a) => packageLevelDefinitions(a) - case p: PMPredicateDecl => Vector(p.id) - case p: PFPredicateDecl => Vector(p.id) - case _: PImplementationProof => Vector.empty } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala index a8fd70d43..d7c03e0f6 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MemberTyping.scala @@ -10,6 +10,7 @@ import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages import viper.gobra.GoVerifier import viper.gobra.ast.frontend._ import viper.gobra.frontend.Config +import viper.gobra.frontend.info.base.SymbolTable.MPredicateSpec import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.Constants @@ -55,6 +56,37 @@ trait MemberTyping extends BaseTyping { this: TypeInfoImpl => } case s: PActualStatement => wellDefStmt(s).out + + case ip: PImplementationProof => + val subType = symbType(ip.subT) + val superType = symbType(ip.superT) + + val syntaxImplementsMsgs = syntaxImplements(subType, superType).asReason(ip, s"${ip.subT} does not implement the interface ${ip.superT}") + if (syntaxImplementsMsgs.nonEmpty) syntaxImplementsMsgs + else { + addDemandedImplements(subType, superType) + + { + val badReceiverTypes = ip.memberProofs.map(m => miscType(m.receiver)) + .filter(t => !identicalTypes(t, subType)) + error(ip, s"The receiver of all methods included in the implementation proof must be $subType, " + + s"but encountered: ${badReceiverTypes.distinct.mkString(", ")}", cond = badReceiverTypes.nonEmpty) + } ++ { + val superPredNames = memberSet(superType).collect { case (n, m: MPredicateSpec) => (n, m) } + val allPredicatesDefined = PropertyResult.bigAnd(superPredNames.map { case (name, symb) => + val valid = tryMethodLikeLookup(subType, PIdnUse(name)).isDefined || + ip.alias.exists(al => al.left.name == name) + failedProp({ + val argTypes = symb.args map symb.context.typ + + s"predicate $name is not defined for type $subType. " + + s"Either declare a predicate 'pred ($subType) $name(${argTypes.mkString(", ")})' " + + s"or declare a predicate 'pred p($subType${if (argTypes.isEmpty) "" else ", "}${argTypes.mkString(", ")})' with some name p and add 'pred $name := p' to the implementation proof." + }, !valid) + }) + allPredicatesDefined.asReason(ip, "Some predicate definitions are missing") + } + } } private def wellDefConstSpec(spec: PConstSpec): Messages = { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala index c27b99fb9..b15f7b132 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala @@ -41,6 +41,77 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => case _: PLiteralValue | _: PKeyedElement | _: PCompositeVal => noMessages // these are checked at the level of the composite literal case _: PClosureDecl => noMessages // checks are done at the PFunctionLit level + + case n: PMethodImplementationProof => + val validPureCheck = wellDefIfPureMethodImplementationProof(n) + if (validPureCheck.nonEmpty) validPureCheck + else { + entity(n.id) match { + case spec: MethodSpec => + // check that the signatures match + val matchingSignature = { + val implSig = FunctionT(n.args map miscType, miscType(n.result)) + val specSig = memberType(spec) + failedProp( + s"implementation proof and interface member have a different signature (should be '$specSig', but is $implSig nad ${implSig == specSig})", + cond = !identicalTypes(implSig, specSig) + ) + } + // check that pure annotations match + val matchingPure = failedProp( + s"The pure annotation does not match with the pure annotation of the interface member", + cond = n.isPure != spec.isPure + ) + // check that the receiver has the method + val receiverHasMethod = failedProp( + s"The type ${n.receiver.typ} does not have member ${n.id}", + cond = tryMethodLikeLookup(miscType(n.receiver), n.id).isEmpty + ) + // check that the body has the right shape + val rightShape = { + n.body match { + case None => failedProp("A method in an implementation proof must not be abstract") + case Some((_, block)) => + + val expectedReceiverOpt = n.receiver match { + case _: PUnnamedParameter => None + case p: PNamedParameter => Some(PNamedOperand(PIdnUse(p.id.name))) + case PExplicitGhostParameter(_: PUnnamedParameter) => None + case PExplicitGhostParameter(p: PNamedParameter) => Some(PNamedOperand(PIdnUse(p.id.name))) + } + + val expectedArgs = n.args.flatMap { + case p: PNamedParameter => Some(PNamedOperand(PIdnUse(p.id.name))) + case PExplicitGhostParameter(p: PNamedParameter) => Some(PNamedOperand(PIdnUse(p.id.name))) + case _ => None + } + + if (expectedReceiverOpt.isEmpty || expectedArgs.size != n.args.size) { + failedProp("Receiver and arguments must be named so that they can be used in a call") + } else { + val expectedReceiver = expectedReceiverOpt.getOrElse(violation("")) + val expectedInvoke = PInvoke(PDot(expectedReceiver, n.id), expectedArgs, None) + + if (n.isPure) { + block.nonEmptyStmts match { + case Vector(PReturn(Vector(ret))) => + pureImplementationProofHasRightShape(ret, _ == expectedInvoke, expectedInvoke.toString) + + case _ => successProp // already checked before + } + } else { + implementationProofBodyHasRightShape(block, _ == expectedInvoke, expectedInvoke.toString, n.result) + } + } + } + } + + (matchingSignature and matchingPure and receiverHasMethod and rightShape) + .asReason(n, "invalid method of an implementation proof") + + case e => Violation.violation(s"expected a method signature of an interface, but got $e") + } + } } lazy val miscType: Typing[PMisc] = createTyping { @@ -74,6 +145,8 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => case l: PKeyedElement => miscType(l.exp) case l: PExpCompositeVal => exprType(l.exp) case l: PLitCompositeVal => expectedMiscType(l) + + case _: PMethodImplementationProof => UnknownType } lazy val expectedMiscType: PShortCircuitMisc => Type = diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala index 5330c4cb4..554a223b9 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala @@ -8,8 +8,13 @@ package viper.gobra.frontend.info.implementation.typing import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages} import viper.gobra.ast.frontend._ -import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelModus, ChannelT, FunctionT, InterfaceT, InternalTupleT, Type, ArrayT, SliceT, MapT, SetT} +import viper.gobra.ast.frontend.{AstPattern => ap, _} +import viper.gobra.frontend.info.base.{SymbolTable => st} +import viper.gobra.frontend.info.base.Type.{ArrayT, BooleanT, ChannelModus, ChannelT, FunctionT, InterfaceT, InternalTupleT, MapT, SetT, SliceT, Type} import viper.gobra.frontend.info.implementation.TypeInfoImpl +import viper.gobra.util.Violation + +import scala.annotation.tailrec trait StmtTyping extends BaseTyping { this: TypeInfoImpl => @@ -198,6 +203,8 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl => } } + case p: PClosureImplProof => wellDefClosureImplProof(p) + case s => violation(s"$s was not handled") } @@ -217,4 +224,238 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl => res.get.result.outs map miscType zip res.get.result.outs } } + + private def nameFromParam(p: PParameter): Option[String] = p match { + case PNamedParameter(id, _) => Some(id.name) + case PExplicitGhostParameter(PNamedParameter(id, _)) => Some(id.name) + case _ => None + } + + private def wellDefClosureImplProof(p: PClosureImplProof): Messages = { + val PClosureImplProof(impl@PClosureImplements(closure, spec), b: PBlock) = p + + val func = resolve(spec.func) match { + case Some(ap.Function(_, f)) => f + case Some(ap.Closure(_, c)) => c + case _ => Violation.violation(s"expected a function or closure, but got ${spec.func}") + } + + val specArgs = if (spec.params.forall(_.key.isEmpty)) func.args.drop(spec.params.size) + else { + val paramSet = spec.paramKeys.toSet + func.args.filter(nameFromParam(_).fold(true)(!paramSet.contains(_))) + } + + val isPure = func match { + case f: st.Function => f.isPure + case c: st.Closure => c.isPure + } + + lazy val expectedCallArgs = specArgs.flatMap(nameFromParam).map(a => PNamedOperand(PIdnUse(a))) + + def isExpectedCall(i: PInvoke): Boolean = i.base == closure && i.args == expectedCallArgs + + lazy val expectedCallString: String = resolve(closure) match { + case Some(_: ap.LocalVariable) => s"$closure(${specArgs.flatMap(nameFromParam).mkString(",")}) as _" + case _ => s"$closure(${specArgs.flatMap(nameFromParam).mkString(",")}) [as _]" + } + + def wellDefIfNecessaryArgsNamed: Messages = error(spec, + s"cannot find a name for all arguments or results required by $spec", + cond = !specArgs.forall { + case _: PUnnamedParameter | PExplicitGhostParameter(_: PUnnamedParameter) => false + case _ => true + } + ) + + def wellDefIfArgNamesDoNotShadowClosure: Messages = { + val names = (func.args ++ func.result.outs).map(nameFromParam).filter(_.nonEmpty).map(_.get) + + def isShadowed(id: PIdnNode): Boolean = id match { + case _: PIdnUse | _: PIdnUnk => + val entityOutside = tryLookupAt(id, impl) + entityOutside.nonEmpty && tryLookupAt(id, id).fold(false)(_ eq entityOutside.get) && names.contains(id.name) + case _ => false + } + + def shadowedInside(n: PNode): Option[PIdnNode] = n match { + case id: PIdnNode => Some(id).filter(isShadowed) + case _ => tree.child(n).iterator.map(shadowedInside).find(_.nonEmpty).flatten + } + + val shadowed = shadowedInside(closure) + error(impl, + s"identifier ${shadowed.getOrElse("")} in $closure is shadowed by an argument or result with the same name in ${spec.func}", + shadowed.nonEmpty) + } + + def pureWellDefIfIsSinglePureReturnExpr: Messages = if (isPure) isPureBlock(b) else noMessages + + def pureWellDefIfRightShape: Messages = if (!isPure) { + noMessages + } else b.nonEmptyStmts match { + case Vector(PReturn(Vector(retExpr))) => + pureImplementationProofHasRightShape(retExpr, isExpectedCall, expectedCallString) + .asReason(retExpr, "invalid return expression of an implementation proof") + case _ => error(b, "invalid body of a pure implementation proof: expected a single return") + } + + def wellDefIfRightShape: Messages = + if (isPure) noMessages + else implementationProofBodyHasRightShape(b, isExpectedCall, expectedCallString, func.result) + .asReason(b, "invalid body of an implementation proof") + + def wellDefIfTerminationMeasuresConsistent: Messages = { + val specMeasures = func match { + case st.Function(decl, _, _) => decl.spec.terminationMeasures + case st.Closure(lit, _, _) => lit.spec.terminationMeasures + } + + lazy val callMeasures = terminationMeasuresForProofCall(p) + + // If the spec has termination measures, then the call inside the proof + // must be done with a spec that also has termination measures + if (specMeasures.isEmpty) noMessages + else error(p, s"spec ${p.impl.spec} has termination measures, so also ${closureImplProofCallAttr(p).base}" + + s"(used inside the proof) must", callMeasures.isEmpty) + } + + Seq(wellDefIfNecessaryArgsNamed, wellDefIfArgNamesDoNotShadowClosure, pureWellDefIfIsSinglePureReturnExpr, + pureWellDefIfRightShape, wellDefIfRightShape, wellDefIfTerminationMeasuresConsistent) + .iterator.find(_.nonEmpty).getOrElse(noMessages) + } + + private[typing] def pureImplementationProofHasRightShape(retExpr: PExpression, + isExpectedCall: PInvoke => Boolean, + expectedCall: String): PropertyResult = { + @tailrec + def validExpression(expr: PExpression): PropertyResult = expr match { + case invoke: PInvoke => failedProp(s"The call must be $expectedCall", !isExpectedCall(invoke)) + case f: PUnfolding => validExpression(f.op) + case _ => failedProp(s"only unfolding expressions and the call $expectedCall is allowed") + } + + validExpression(retExpr) + } + + // the body can only contain fold, unfold, and the call + private[typing] def implementationProofBodyHasRightShape(body: PBlock, + isExpectedCall: PInvoke => Boolean, + expectedCall: String, + result: PResult): PropertyResult = { + val expectedResults = result.outs.flatMap(nameFromParam).map(t => PNamedOperand(PIdnUse(t))) + + def isExpectedAssignment(ass: PAssignment): Boolean = ass match { + case PAssignment(Vector(i: PInvoke), left) if isExpectedCall(i) && expectedResults == left => true + case _ => false + } + + def isExpectedReturn(ret: PReturn): Boolean = ret match { + case PReturn(exps) => + if (result.outs.isEmpty) exps == Vector.empty + else if (result.outs.size != expectedResults.size) + exps == Vector.empty || (exps.size == 1 && exps.head.isInstanceOf[PInvoke] && isExpectedCall(exps.head.asInstanceOf[PInvoke])) + else exps == Vector.empty || exps == expectedResults || (exps.size == 1 && exps.head.isInstanceOf[PInvoke] && isExpectedCall(exps.head.asInstanceOf[PInvoke])) + } + + lazy val expectedReturns: Seq[String] = + if (result.outs.isEmpty) Seq("return") + else if (result.outs.size != expectedResults.size) Seq("return", s"return $expectedCall") + else Seq("return", PReturn(expectedResults).toString, s"return $expectedCall") + + lazy val expectedCallStatement = if (result.outs.isEmpty) expectedCall + else if (expectedResults.size != result.outs.size) s"return $expectedCall" + else s"${expectedResults.mkString(",")} = $expectedCall" + + lazy val lastStatement: PStatement = { + @tailrec + def aux(stmt: PStatement): PStatement = stmt match { + case seq: PSeq => aux(seq.nonEmptyStmts.last) + case block: PBlock => aux(block.nonEmptyStmts.last) + case s => s + } + + aux(body) + } + + var numOfImplemetationCalls = 0 + + def validStatements(stmts: Vector[PStatement]): PropertyResult = + PropertyResult.bigAnd(stmts.map { + case _: PUnfold | _: PFold | _: PAssert | _: PEmptyStmt => successProp + case _: PAssume | _: PInhale | _: PExhale => failedProp("Assume, inhale, and exhale are forbidden in implementation proofs") + + case b: PBlock => validStatements(b.nonEmptyStmts) + case seq: PSeq => validStatements(seq.nonEmptyStmts) + + case ass: PAssignment => + // Right now, we only allow assignments that are used for the one call + if (isExpectedAssignment(ass)) { + numOfImplemetationCalls += 1 + successProp + } else if (result.outs.isEmpty || expectedResults.size != result.outs.size) { + val reason = + if (result.outs.isEmpty) "Here, there are no out-parameters." + else "Here, not all out-parameters have a name, so they cannot be assigned to." + failedProp("An assignment must assign to all out-parameters. " + reason) + } else { + failedProp(s"The only allowed assignment is $expectedCallStatement") + } + + // A call alone can only occur if there are no result parameters + case PExpressionStmt(call: PInvoke) => + if (result.outs.nonEmpty) failedProp(s"The call '$call' is missing the out-parameters") + else if (!isExpectedCall(call)) failedProp(s"The only allowed call is $expectedCall") + else { + numOfImplemetationCalls += 1 + successProp + } + + case ret@PReturn(exps) => + // there has to be at most one return at the end of the block + if (lastStatement != ret) { + failedProp("A return must be the last statement") + } else if (isExpectedReturn(ret)) { + if (exps.size == 1 && exps.head.isInstanceOf[PInvoke] && isExpectedCall(exps.head.asInstanceOf[PInvoke])) numOfImplemetationCalls += 1 + successProp + } else failedProp(s"A return must be one of ${expectedReturns.mkString(", ")}") + + case _ => failedProp("Only fold, unfold, assert, and one call to the implementation are allowed") + }) + + val bodyHasRightShape = validStatements(body.nonEmptyStmts) + val notTooManyCalls = { + if (numOfImplemetationCalls != 1) { + failedProp(s"There must be exactly one call to the implementation " + + s"(with results and arguments in the right order '$expectedCallStatement')") + } else successProp + } + + bodyHasRightShape and notTooManyCalls + } + + /** Returns the termination measures of the spec used in the call within the body of the implementation proof */ + private def terminationMeasuresForProofCall(p: PClosureImplProof): Vector[PTerminationMeasure] = { + def measuresFromMethod(m: st.Method): Vector[PTerminationMeasure] = m match { + case st.MethodSpec(spec, _, _, _) => spec.spec.terminationMeasures + case st.MethodImpl(decl, _, _) => decl.spec.terminationMeasures + } + + resolve(closureImplProofCallAttr(p)) match { + case Some(ap.FunctionCall(callee, _)) => callee match { + case ap.Function(_, symb) => symb.decl.spec.terminationMeasures + case ap.Closure(_, symb) => symb.lit.spec.terminationMeasures + case ap.ReceivedMethod(_, _, _, symb) => measuresFromMethod(symb) + case ap.ImplicitlyReceivedInterfaceMethod(_, symb) => symb.spec.spec.terminationMeasures + case ap.MethodExpr(_, _, _, symb) => measuresFromMethod(symb) + case _ => Violation.violation("this case should be unreachable") + } + case Some(ap.ClosureCall(_, _, spec)) => resolve(spec.func) match { + case Some(ap.Function(_, f)) => f.decl.spec.terminationMeasures + case Some(ap.Closure(_, c)) => c.lit.spec.terminationMeasures + case _ => Violation.violation("this case should be unreachable") + } + case _ => Violation.violation("this case should be unreachable") + } + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala index 6fefc23d1..d25b98706 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala @@ -26,37 +26,6 @@ trait GhostMemberTyping extends BaseTyping { this: TypeInfoImpl => body.fold(noMessages)(assignableToSpec) ++ isReceiverType.errors(miscType(receiver))(member) ++ nonVariadicArguments(args) - - case ip: PImplementationProof => - val subType = symbType(ip.subT) - val superType = symbType(ip.superT) - - val syntaxImplementsMsgs = syntaxImplements(subType, superType).asReason(ip, s"${ip.subT} does not implement the interface ${ip.superT}") - if (syntaxImplementsMsgs.nonEmpty) syntaxImplementsMsgs - else { - addDemandedImplements(subType, superType) - - { - val badReceiverTypes = ip.memberProofs.map(m => miscType(m.receiver)) - .filter(t => !identicalTypes(t, subType)) - error(ip, s"The receiver of all methods included in the implementation proof must be $subType, " + - s"but encountered: ${badReceiverTypes.distinct.mkString(", ")}", cond = badReceiverTypes.nonEmpty) - } ++ { - val superPredNames = memberSet(superType).collect{ case (n, m: MPredicateSpec) => (n, m) } - val allPredicatesDefined = PropertyResult.bigAnd(superPredNames.map{ case (name, symb) => - val valid = tryMethodLikeLookup(subType, PIdnUse(name)).isDefined || - ip.alias.exists(al => al.left.name == name) - failedProp({ - val argTypes = symb.args map symb.context.typ - - s"predicate $name is not defined for type $subType. " + - s"Either declare a predicate 'pred ($subType) $name(${argTypes.mkString(", ")})' " + - s"or declare a predicate 'pred p($subType${if (argTypes.isEmpty) "" else ", "}${argTypes.mkString(", ")})' with some name p and add 'pred $name := p' to the implementation proof." - }, !valid) - }) - allPredicatesDefined.asReason(ip, "Some predicate definitions are missing") - } - } } private[typing] def wellFoundedIfNeeded(member: PMember): Messages = { @@ -111,7 +80,7 @@ trait GhostMemberTyping extends BaseTyping { this: TypeInfoImpl => } } - private[ghost] def isPureBlock(block: PBlock): Messages = { + private[typing] def isPureBlock(block: PBlock): Messages = { block.nonEmptyStmts match { case Vector(PReturn(Vector(ret))) => isPureExpr(ret) case b => error(block, s"For now, the body of a pure block is expected to be a single return with a pure expression, got $b instead") diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala index d2569a98c..198ce6433 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala @@ -9,7 +9,7 @@ package viper.gobra.frontend.info.implementation.typing.ghost import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, message, noMessages} import viper.gobra.ast.frontend._ import viper.gobra.frontend.info.base.SymbolTable -import viper.gobra.frontend.info.base.SymbolTable.{BuiltInMPredicate, GhostTypeMember, MPredicateImpl, MPredicateSpec, MethodSpec} +import viper.gobra.frontend.info.base.SymbolTable.{BuiltInMPredicate, GhostTypeMember, MPredicateImpl, MPredicateSpec} import viper.gobra.frontend.info.base.Type.{AdtClauseT, AssertionT, BooleanT, DeclaredT, FunctionT, PredT, Type, UnknownType} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.BaseTyping @@ -90,76 +90,6 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case _ => violation("Encountered ill-formed program AST") } - case n: PMethodImplementationProof => - val validPureCheck = wellDefIfPureMethodImplementationProof(n) - if (validPureCheck.nonEmpty) validPureCheck - else { - entity(n.id) match { - case spec: MethodSpec => - // check that the signatures match - val matchingSignature = { - val implSig = FunctionT(n.args map miscType, miscType(n.result)) - val specSig = memberType(spec) - failedProp( - s"implementation proof and interface member have a different signature (should be '$specSig', but is $implSig nad ${implSig == specSig})", - cond = !identicalTypes(implSig, specSig) - ) - } - // check that pure annotations match - val matchingPure = failedProp( - s"The pure annotation does not match with the pure annotation of the interface member", - cond = n.isPure != spec.isPure - ) - // check that the receiver has the method - val receiverHasMethod = failedProp( - s"The type ${n.receiver.typ} does not have member ${n.id}", - cond = tryMethodLikeLookup(miscType(n.receiver), n.id).isEmpty - ) - // check that the body has the right shape - val rightShape = { - n.body match { - case None => failedProp("A method in an implementation proof must not be abstract") - case Some((_, block)) => - - val expectedReceiverOpt = n.receiver match { - case _: PUnnamedParameter => None - case p: PNamedParameter => Some(PNamedOperand(PIdnUse(p.id.name))) - case PExplicitGhostParameter(_: PUnnamedParameter) => None - case PExplicitGhostParameter(p: PNamedParameter) => Some(PNamedOperand(PIdnUse(p.id.name))) - } - - val expectedArgs = n.args.flatMap { - case p: PNamedParameter => Some(PNamedOperand(PIdnUse(p.id.name))) - case PExplicitGhostParameter(p: PNamedParameter) => Some(PNamedOperand(PIdnUse(p.id.name))) - case _ => None - } - - if (expectedReceiverOpt.isEmpty || expectedArgs.size != n.args.size) { - failedProp("Receiver and arguments must be named so that they can be used in a call") - } else { - val expectedReceiver = expectedReceiverOpt.getOrElse(violation("")) - val expectedInvoke = PInvoke(PDot(expectedReceiver, n.id), expectedArgs, None) - - if (n.isPure) { - block.nonEmptyStmts match { - case Vector(PReturn(Vector(ret))) => - pureImplementationProofHasRightShape(ret, _ == expectedInvoke, expectedInvoke.toString) - - case _ => successProp // already checked before - } - } else { - implementationProofBodyHasRightShape(block, _ == expectedInvoke, expectedInvoke.toString, n.result) - } - } - } - } - - (matchingSignature and matchingPure and receiverHasMethod and rightShape) - .asReason(n, "invalid method of an implementation proof") - - case e => Violation.violation(s"expected a method signature of an interface, but got $e") - } - } case _: PBackendAnnotation => noMessages } @@ -204,7 +134,6 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => case _: PMatchExpCase => UnknownType case _: PMatchExpDefault => UnknownType - case _: PMethodImplementationProof => UnknownType case _: PImplementationProofPredicateAlias => UnknownType case _: PBackendAnnotation => UnknownType } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala index 702adfbdf..995936ef6 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala @@ -6,14 +6,11 @@ package viper.gobra.frontend.info.implementation.typing.ghost -import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages} +import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error} import viper.gobra.ast.frontend.{PClosureImplProof, AstPattern => ap, _} import viper.gobra.frontend.info.base.{SymbolTable => st} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.typing.BaseTyping -import viper.gobra.util.Violation - -import scala.annotation.tailrec trait GhostStmtTyping extends BaseTyping { this: TypeInfoImpl => @@ -32,7 +29,6 @@ trait GhostStmtTyping extends BaseTyping { this: TypeInfoImpl => case p: PMatchAdt => assignableTo.errors(miscType(p), exprType(exp))(c) case _ => comparableTypes.errors((miscType(c.pattern), exprType(exp)))(c) }) ++ isPureExpr(exp) - case p: PClosureImplProof => wellDefClosureImplProof(p) } private[typing] def wellDefFoldable(acc: PPredicateAccess): Messages = { @@ -73,237 +69,5 @@ trait GhostStmtTyping extends BaseTyping { this: TypeInfoImpl => findCallDescendent(proof).get } - - private def wellDefClosureImplProof(p: PClosureImplProof): Messages = { - val PClosureImplProof(impl@PClosureImplements(closure, spec), b: PBlock) = p - - val func = resolve(spec.func) match { - case Some(ap.Function(_, f)) => f - case Some(ap.Closure(_, c)) => c - case _ => Violation.violation(s"expected a function or closure, but got ${spec.func}") - } - - val specArgs = if (spec.params.forall(_.key.isEmpty)) func.args.drop(spec.params.size) - else { - val paramSet = spec.paramKeys.toSet - func.args.filter(nameFromParam(_).fold(true)(!paramSet.contains(_))) - } - - val isPure = func match { - case f: st.Function => f.isPure - case c: st.Closure => c.isPure - } - - lazy val expectedCallArgs = specArgs.flatMap(nameFromParam).map(a => PNamedOperand(PIdnUse(a))) - - def isExpectedCall(i: PInvoke): Boolean = i.base == closure && i.args == expectedCallArgs - - lazy val expectedCallString: String = resolve(closure) match { - case Some(_: ap.LocalVariable) => s"$closure(${specArgs.flatMap(nameFromParam).mkString(",")}) as _" - case _ => s"$closure(${specArgs.flatMap(nameFromParam).mkString(",")}) [as _]" - } - - def wellDefIfNecessaryArgsNamed: Messages = error(spec, - s"cannot find a name for all arguments or results required by $spec", - cond = !specArgs.forall { - case _: PUnnamedParameter | PExplicitGhostParameter(_: PUnnamedParameter) => false - case _ => true - } - ) - - def wellDefIfArgNamesDoNotShadowClosure: Messages = { - val names = (func.args ++ func.result.outs).map(nameFromParam).filter(_.nonEmpty).map(_.get) - - def isShadowed(id: PIdnNode): Boolean = id match { - case _: PIdnUse | _: PIdnUnk => - val entityOutside = tryLookupAt(id, impl) - entityOutside.nonEmpty && tryLookupAt(id, id).fold(false)(_ eq entityOutside.get) && names.contains(id.name) - case _ => false - } - - def shadowedInside(n: PNode): Option[PIdnNode] = n match { - case id: PIdnNode => Some(id).filter(isShadowed) - case _ => tree.child(n).iterator.map(shadowedInside).find(_.nonEmpty).flatten - } - val shadowed = shadowedInside(closure) - error(impl, - s"identifier ${shadowed.getOrElse("")} in $closure is shadowed by an argument or result with the same name in ${spec.func}", - shadowed.nonEmpty) - } - - def pureWellDefIfIsSinglePureReturnExpr: Messages = if (isPure) isPureBlock(b) else noMessages - - def pureWellDefIfRightShape: Messages = if (!isPure) { - noMessages - } else b.nonEmptyStmts match { - case Vector(PReturn(Vector(retExpr))) => - pureImplementationProofHasRightShape(retExpr, isExpectedCall, expectedCallString) - .asReason(retExpr, "invalid return expression of an implementation proof") - case _ => error(b, "invalid body of a pure implementation proof: expected a single return") - } - - def wellDefIfRightShape: Messages = - if (isPure) noMessages - else implementationProofBodyHasRightShape(b, isExpectedCall, expectedCallString, func.result) - .asReason(b, "invalid body of an implementation proof") - - def wellDefIfTerminationMeasuresConsistent: Messages = { - val specMeasures = func match { - case st.Function(decl, _, _) => decl.spec.terminationMeasures - case st.Closure(lit, _, _) => lit.spec.terminationMeasures - } - - lazy val callMeasures = terminationMeasuresForProofCall(p) - - // If the spec has termination measures, then the call inside the proof - // must be done with a spec that also has termination measures - if (specMeasures.isEmpty) noMessages - else error(p, s"spec ${p.impl.spec} has termination measures, so also ${closureImplProofCallAttr(p).base}" + - s"(used inside the proof) must", callMeasures.isEmpty) - } - - Seq(wellDefIfNecessaryArgsNamed, wellDefIfArgNamesDoNotShadowClosure, pureWellDefIfIsSinglePureReturnExpr, - pureWellDefIfRightShape, wellDefIfRightShape, wellDefIfTerminationMeasuresConsistent) - .iterator.find(_.nonEmpty).getOrElse(noMessages) - } - - private def nameFromParam(p: PParameter): Option[String] = p match { - case PNamedParameter(id, _) => Some(id.name) - case PExplicitGhostParameter(PNamedParameter(id, _)) => Some(id.name) - case _ => None - } - - private [ghost] def pureImplementationProofHasRightShape(retExpr: PExpression, - isExpectedCall: PInvoke => Boolean, - expectedCall: String): PropertyResult = { - @tailrec - def validExpression(expr: PExpression): PropertyResult = expr match { - case invoke: PInvoke => failedProp(s"The call must be $expectedCall", !isExpectedCall(invoke)) - case f: PUnfolding => validExpression(f.op) - case _ => failedProp(s"only unfolding expressions and the call $expectedCall is allowed") - } - - validExpression(retExpr) - } - - // the body can only contain fold, unfold, and the call - private [ghost] def implementationProofBodyHasRightShape(body: PBlock, - isExpectedCall: PInvoke => Boolean, - expectedCall: String, - result: PResult): PropertyResult = { - val expectedResults = result.outs.flatMap(nameFromParam).map(t => PNamedOperand(PIdnUse(t))) - - def isExpectedAssignment(ass: PAssignment): Boolean = ass match{ - case PAssignment(Vector(i: PInvoke), left) if isExpectedCall(i) && expectedResults == left => true - case _ => false - } - - def isExpectedReturn(ret: PReturn): Boolean = ret match { - case PReturn(exps) => - if (result.outs.isEmpty) exps == Vector.empty - else if (result.outs.size != expectedResults.size) - exps == Vector.empty || (exps.size == 1 && exps.head.isInstanceOf[PInvoke] && isExpectedCall(exps.head.asInstanceOf[PInvoke])) - else exps == Vector.empty || exps == expectedResults || (exps.size == 1 && exps.head.isInstanceOf[PInvoke] && isExpectedCall(exps.head.asInstanceOf[PInvoke])) - } - - lazy val expectedReturns: Seq[String] = - if (result.outs.isEmpty) Seq("return") - else if (result.outs.size != expectedResults.size) Seq("return", s"return $expectedCall") - else Seq("return", PReturn(expectedResults).toString, s"return $expectedCall") - - lazy val expectedCallStatement = if (result.outs.isEmpty) expectedCall - else if (expectedResults.size != result.outs.size) s"return $expectedCall" - else s"${expectedResults.mkString(",")} = $expectedCall" - - lazy val lastStatement: PStatement = { - @tailrec - def aux(stmt: PStatement): PStatement = stmt match { - case seq: PSeq => aux(seq.nonEmptyStmts.last) - case block: PBlock => aux(block.nonEmptyStmts.last) - case s => s - } - aux(body) - } - - var numOfImplemetationCalls = 0 - - def validStatements(stmts: Vector[PStatement]): PropertyResult = - PropertyResult.bigAnd(stmts.map { - case _: PUnfold | _: PFold | _: PAssert | _: PEmptyStmt => successProp - case _: PAssume | _: PInhale | _: PExhale => failedProp("Assume, inhale, and exhale are forbidden in implementation proofs") - - case b: PBlock => validStatements(b.nonEmptyStmts) - case seq: PSeq => validStatements(seq.nonEmptyStmts) - - case ass: PAssignment => - // Right now, we only allow assignments that are used for the one call - if (isExpectedAssignment(ass)) { - numOfImplemetationCalls += 1 - successProp - } else if (result.outs.isEmpty || expectedResults.size != result.outs.size) { - val reason = - if (result.outs.isEmpty) "Here, there are no out-parameters." - else "Here, not all out-parameters have a name, so they cannot be assigned to." - failedProp("An assignment must assign to all out-parameters. " + reason) - } else { - failedProp(s"The only allowed assignment is $expectedCallStatement") - } - - // A call alone can only occur if there are no result parameters - case PExpressionStmt(call: PInvoke) => - if (result.outs.nonEmpty) failedProp(s"The call '$call' is missing the out-parameters") - else if (!isExpectedCall(call)) failedProp(s"The only allowed call is $expectedCall") - else { - numOfImplemetationCalls += 1 - successProp - } - - case ret@PReturn(exps) => - // there has to be at most one return at the end of the block - if (lastStatement != ret) { - failedProp("A return must be the last statement") - } else if (isExpectedReturn(ret)) { - if (exps.size == 1 && exps.head.isInstanceOf[PInvoke] && isExpectedCall(exps.head.asInstanceOf[PInvoke])) numOfImplemetationCalls += 1 - successProp - } else failedProp(s"A return must be one of ${expectedReturns.mkString(", ")}") - - case _ => failedProp("Only fold, unfold, assert, and one call to the implementation are allowed") - }) - - val bodyHasRightShape = validStatements(body.nonEmptyStmts) - val notTooManyCalls = { - if (numOfImplemetationCalls != 1) { - failedProp(s"There must be exactly one call to the implementation " + - s"(with results and arguments in the right order '$expectedCallStatement')") - } else successProp - } - - bodyHasRightShape and notTooManyCalls - } - - /** Returns the termination measures of the spec used in the call within the body of the implementation proof */ - private def terminationMeasuresForProofCall(p: PClosureImplProof): Vector[PTerminationMeasure] = { - def measuresFromMethod(m: st.Method): Vector[PTerminationMeasure] = m match { - case st.MethodSpec(spec, _, _, _) => spec.spec.terminationMeasures - case st.MethodImpl(decl, _, _) => decl.spec.terminationMeasures - } - resolve(closureImplProofCallAttr(p)) match { - case Some(ap.FunctionCall(callee, _)) => callee match { - case ap.Function(_, symb) => symb.decl.spec.terminationMeasures - case ap.Closure(_, symb) => symb.lit.spec.terminationMeasures - case ap.ReceivedMethod(_, _, _, symb) => measuresFromMethod(symb) - case ap.ImplicitlyReceivedInterfaceMethod(_, symb) => symb.spec.spec.terminationMeasures - case ap.MethodExpr(_, _, _, symb) => measuresFromMethod(symb) - case _ => Violation.violation("this case should be unreachable") - } - case Some(ap.ClosureCall(_, _, spec)) => resolve(spec.func) match { - case Some(ap.Function(_, f)) => f.decl.spec.terminationMeasures - case Some(ap.Closure(_, c)) => c.lit.spec.terminationMeasures - case _ => Violation.violation("this case should be unreachable") - } - case _ => Violation.violation("this case should be unreachable") - } - } - } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala index 039e9ea39..8670e27d9 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala @@ -70,6 +70,7 @@ class GhostLessPrinter(classifier: GhostClassifier) extends DefaultPrettyPrinter case n: PProofAnnotation => n match { case n: POutline => showStmt(n.body) + case _: PClosureImplProof => ghostToken } case s if classifier.isStmtGhost(s) => ghostToken diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala index 7c9f161d1..fb6db771f 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala @@ -11,7 +11,7 @@ import viper.gobra.ast.frontend._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.ast.frontend.{AstPattern => ap} import viper.gobra.frontend.info.base.SymbolTable.{Closure, Function, Regular, SingleLocalVariable} -import viper.gobra.frontend.info.base.Type.GhostPointerT +import viper.gobra.frontend.info.base.Type.{ActualPointerT, GhostPointerT} import viper.gobra.util.Violation import viper.gobra.util.Violation.violation @@ -102,15 +102,6 @@ trait GhostWellDef { this: TypeInfoImpl => private def exprGhostSeparation(expr: PExpression): Messages = expr match { case _: PGhostExpression => noMessages - case e if isEnclosingGhost(e) => - e match { - case PMake(_: PGhostSliceType, _) => noMessages - case _: PMake => error(e, "Allocating memory within ghost code is forbidden") - case _: PNew => - Violation.violation(exprType(e).isInstanceOf[GhostPointerT], s"All memory allocated within ghost code must be located on the ghost heap") - noMessages - case _ => noMessages - } case _: PDot | _: PDeref @@ -134,24 +125,38 @@ trait GhostWellDef { this: TypeInfoImpl => case n@ ( // these are just suggestions for now. We will have to adapt then, when we decide on proper ghost separation rules. _: PReceive - ) => error(n, "ghost error: Found ghost child expression, but expected none", !noGhostPropagationFromChildren(n)) + ) => error(n, "ghost error: Found ghost child expression, but expected none", !isEnclosingGhost(n) && !noGhostPropagationFromChildren(n)) case n: PInvoke => (exprOrType(n.base), resolve(n)) match { case (Right(_), Some(_: ap.Conversion)) => noMessages - case (Left(_), Some(call: ap.FunctionCall)) => ghostAssignableToCallExpr(call) + case (Left(_), Some(call: ap.FunctionCall)) => + error(n, "ghost error: Found call to non-ghost impure function in ghost code", + // call must be in a ghost context and callee must be actual and impure + isEnclosingGhost(n) && !calleeGhostTyping(call).isGhost && isPureExpr(n).nonEmpty) ++ + ghostAssignableToCallExpr(call) case (Left(_), Some(call: ap.ClosureCall)) => ghostAssignableToClosureCall(call) case (Left(_), Some(_: ap.PredicateCall)) => noMessages case (Left(_), Some(_: ap.PredExprInstance)) => noMessages case _ => violation("expected conversion, function call, or predicate call") } - case _: PNew => noMessages - - case n@PMake(_, args) => error( - n, - "ghost error: make expressions may not contain ghost expressions", - args exists (x => !noGhostPropagationFromChildren(x)) - ) + case e: PNew => + if (isEnclosingGhost(e)) { + Violation.violation(exprType(e).isInstanceOf[GhostPointerT], s"All memory allocated within ghost code must be located on the ghost heap") + } else { + Violation.violation(exprType(e).isInstanceOf[ActualPointerT], s"All memory allocated within actual code must be located on the actual heap") + } + noMessages + + case e: PMake => (e, isEnclosingGhost(e)) match { + case (PMake(_: PGhostSliceType, _), true) => noMessages + case (_, true) => error(e, "Allocating memory within ghost code is forbidden") + case (PMake(_, args), false) => error( + e, + "ghost error: make expressions may not contain ghost expressions", + args exists (x => !noGhostPropagationFromChildren(x)) + ) + } } private def typeGhostSeparation(typ: PType): Messages = typ match { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala index a6606258a..8ec804f85 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala @@ -233,6 +233,7 @@ class GoifyingPrinter(info: TypeInfoImpl) extends DefaultPrettyPrinter { case n: PProofAnnotation => n match { case n: POutline => showSpec(n.spec) <> specComment <> "outline (" <> line <> showStmt(n.body) <> line <> specComment <> ")" <> line + case PClosureImplProof(impl, PBlock(stmts)) => blockSpecComment("proof" <+> showExpr(impl) <> block(showStmtList(stmts))) } case _ => super.showStmt(stmt) diff --git a/src/test/resources/regressions/features/closures/closures-fail5-proofs.gobra b/src/test/resources/regressions/features/closures/closures-fail5-proofs.gobra index e7329075c..0472c288d 100644 --- a/src/test/resources/regressions/features/closures/closures-fail5-proofs.gobra +++ b/src/test/resources/regressions/features/closures/closures-fail5-proofs.gobra @@ -66,8 +66,7 @@ func test4() { //:: ExpectedOutput(type_error) proof cl implements pspec { - //:: ExpectedOutput(type_error) - x = 2 // assignment in ghost code to a non-ghost variable + x = 2 y = cl1(x) as id1 } } diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra new file mode 100644 index 000000000..c30c623c8 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra @@ -0,0 +1,149 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostPointerReceiverFail01 + +type Foo struct { + field int +} + +decreases +func ActualFunc() { + p := &Foo{ 42 } + + p.ActualPointerReceiver() + (*p).ActualPointerReceiver() + (*Foo).ActualPointerReceiver(p) + //:: ExpectedOutput(type_error) + (Foo).ActualPointerReceiver(p) + + //:: ExpectedOutput(type_error) + p.GhostPointerReceiver() // fails because method expects a ghost pointer receiver + //:: ExpectedOutput(type_error) + (*p).GhostPointerReceiver() // fails because method expects a ghost pointer receiver + //:: ExpectedOutput(type_error) + (*Foo).GhostPointerReceiver(p) // fails because method expects a ghost pointer receiver + //:: ExpectedOutput(type_error) + (Foo).GhostPointerReceiver(p) // fails because method expects a ghost pointer receiver + // since `gpointer[Foo]` is a ghost type literal instead of a type literal, we currently do not support parsing the following line: + // (gpointer[Foo]).GhostPointerReceiver(p) + + p.ActualNonPointerReceiver() + (*p).ActualNonPointerReceiver() + (*Foo).ActualNonPointerReceiver(p) + //:: ExpectedOutput(type_error) + (Foo).ActualNonPointerReceiver(p) + (Foo).ActualNonPointerReceiver(*p) + + p.GhostNonPointerReceiver() // p is implicitly dereferenced + (*p).GhostNonPointerReceiver() + (*Foo).GhostNonPointerReceiver(p) + //:: ExpectedOutput(type_error) + (Foo).GhostNonPointerReceiver(p) + (Foo).GhostNonPointerReceiver(*p) +} + +ghost +decreases +requires acc(p) +func GhostFunc(p *Foo) { + gp := &Foo{ 42 } + + //:: ExpectedOutput(type_error) + p.ActualPointerReceiver() // actual calls not permitted in ghost code + //:: ExpectedOutput(type_error) + (*p).ActualPointerReceiver() // actual calls not permitted in ghost code + //:: ExpectedOutput(type_error) + (*Foo).ActualPointerReceiver(p) // actual calls not permitted in ghost code & p being ghost is not assignable to a non-ghost receiver + //:: ExpectedOutput(type_error) + (Foo).ActualPointerReceiver(p) // actual calls not permitted in ghost code + + //:: ExpectedOutput(type_error) + p.GhostPointerReceiver() // fails because method expects a ghost pointer receiver + gp.GhostPointerReceiver() + //:: ExpectedOutput(type_error) + (*p).GhostPointerReceiver() // fails because method expects a ghost pointer receiver + //:: ExpectedOutput(type_error) + (*gp).GhostPointerReceiver() // fails because we do not add `gpointer[T]` receivers to method set of T + //:: ExpectedOutput(type_error) + (*Foo).GhostPointerReceiver(p) // fails because method expects a ghost pointer receiver + //:: ExpectedOutput(type_error) + (*Foo).GhostPointerReceiver(gp) // fails because `gpointer[T]` receivers are not part of the method set of *T + //:: ExpectedOutput(type_error) + (Foo).GhostPointerReceiver(p) // fails because method expects a ghost pointer receiver + //:: ExpectedOutput(type_error) + (Foo).GhostPointerReceiver(gp) // fails because we do not add `gpointer[T]` receivers to method set of T + // since `gpointer[Foo]` is a ghost type literal instead of a type literal, we currently do not support parsing the following line: + // (gpointer[Foo]).GhostPointerReceiver(p) + + //:: ExpectedOutput(type_error) + p.ActualNonPointerReceiver() // actual calls not permitted in ghost code + //:: ExpectedOutput(type_error) + (*p).ActualNonPointerReceiver() // actual calls not permitted in ghost code + //:: ExpectedOutput(type_error) + (*Foo).ActualNonPointerReceiver(p) // actual calls not permitted in ghost code + //:: ExpectedOutput(type_error) + (Foo).ActualNonPointerReceiver(p) // actual calls not permitted in ghost code + //:: ExpectedOutput(type_error) + (Foo).ActualNonPointerReceiver(*p) // actual calls not permitted in ghost code + + p.GhostNonPointerReceiver() // p is implicitly dereferenced + gp.GhostNonPointerReceiver() // gp is implicitly dereferenced + (*p).GhostNonPointerReceiver() + (*gp).GhostNonPointerReceiver() + (*Foo).GhostNonPointerReceiver(p) + //:: ExpectedOutput(type_error) + (*Foo).GhostNonPointerReceiver(gp) // gp is not of type *Foo + //:: ExpectedOutput(type_error) + (*Foo).GhostNonPointerReceiver(*gp) // ghost Foo is not assignable to *Foo + //:: ExpectedOutput(type_error) + (Foo).GhostNonPointerReceiver(p) // *Foo is not assignable to Foo + //:: ExpectedOutput(type_error) + (Foo).GhostNonPointerReceiver(gp) // gpointer[Foo] is not assignable to Foo + (Foo).GhostNonPointerReceiver(*p) + (Foo).GhostNonPointerReceiver(*gp) +} + +ghost +decreases +preserves acc(r) +func (r gpointer[Foo]) GhostPointerReceiver() int { + r.field = 0 + return r.field +} + +decreases +preserves acc(r) +func (r *Foo) ActualPointerReceiver() int { + r.field = 0 + return r.field +} + +ghost +decreases +func (r Foo) GhostNonPointerReceiver() int { + r.field = 42 + return r.field +} + +decreases +func (r Foo) ActualNonPointerReceiver() int { + r.field = 42 + return r.field +} + +decreases +preserves acc(r) +//:: ExpectedOutput(type_error) +func (r gpointer[Foo]) ActualGhostPointerReceiver() int { // ghostpointer is only allowed for ghost methods + r.field = 0 + return r.field +} + +ghost +decreases +func (r *Foo) GhostActualPointerReceiver() int { + //:: ExpectedOutput(type_error) + r.field = 0 // fails since we're trying to modify actual memory + return r.field +} diff --git a/src/test/resources/regressions/features/options/options-simple3.gobra b/src/test/resources/regressions/features/options/options-simple3.gobra index 10336b9e3..ced533d84 100644 --- a/src/test/resources/regressions/features/options/options-simple3.gobra +++ b/src/test/resources/regressions/features/options/options-simple3.gobra @@ -13,15 +13,19 @@ func test2(b bool) { assert mset(some(b)) == mset[bool] { b } } +ghost +decreases requires opt != none[int] ensures set(opt) == set[int] { get(opt) } func lemma_set_some(ghost opt option[int]) { } +ghost +decreases requires set(opt) == set[int] { } ensures opt == none[int] func lemma_set_empty(ghost opt option[int]) { - ghost if (opt != none[int]) { + if (opt != none[int]) { lemma_set_some(opt) } } From cb97e6ccd40acb65558860a50df7b2ac302ee3ff Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 28 Mar 2024 15:57:30 +0100 Subject: [PATCH 265/296] adds a testcase for issue #420 --- .../resources/regressions/issues/000420.gobra | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/resources/regressions/issues/000420.gobra diff --git a/src/test/resources/regressions/issues/000420.gobra b/src/test/resources/regressions/issues/000420.gobra new file mode 100644 index 000000000..9310fc262 --- /dev/null +++ b/src/test/resources/regressions/issues/000420.gobra @@ -0,0 +1,17 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package issue420 + +func foo() int { + ghost bar := true + var baz int + ghost if bar { + //:: ExpectedOutput(type_error) + baz = 1 + } else { + //:: ExpectedOutput(type_error) + baz = 0 + } + return baz +} From 8b94eb2535810cb49f427bdc18423b7163051003 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:38:10 +0100 Subject: [PATCH 266/296] Updates submodules (#756) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index a339b94c3..d47423476 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit a339b94c3680fc0588528bfda04598c8826a701b +Subproject commit d474234763ea607219e0a339dbf494517af6b9e6 From 37e386f4702ee220083689aa5c9593b451861d50 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Sat, 30 Mar 2024 15:15:49 +0100 Subject: [PATCH 267/296] Updates submodules (#757) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index d47423476..5a3871bd0 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit d474234763ea607219e0a339dbf494517af6b9e6 +Subproject commit 5a3871bd0879d225ad6e026a65b58a3abae01e3a From b1bf9994a0158d999a0af2f9c4cb056b0b48ccde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Tue, 2 Apr 2024 14:54:39 +0200 Subject: [PATCH 268/296] Add missing termination measures in the sequence and array encodings (#758) * add missing termination measures * address feedback from pr --- .../gobra/translator/encodings/arrays/ArrayEncoding.scala | 5 ++++- .../translator/encodings/sequences/SequenceEncoding.scala | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala index 551450ec2..5eb0a288e 100644 --- a/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/arrays/ArrayEncoding.scala @@ -340,6 +340,7 @@ class ArrayEncoding extends TypeEncoding with SharedArrayEmbedding { * function arrayDefault(): ([n]T)° * ensures len(result) == n * ensures Forall idx :: {result[idx]} 0 <= idx < n ==> [result[idx] == dflt(T)] + * decreases _ * */ private val exDfltFunc: FunctionGenerator[ComponentParameter] = new FunctionGenerator[ComponentParameter]{ def genFunction(t: ComponentParameter)(ctx: Context): vpr.Function = { @@ -362,12 +363,14 @@ class ArrayEncoding extends TypeEncoding with SharedArrayEmbedding { Seq(vpr.Trigger(Seq(trigger))()), vpr.Implies(boundaryCondition(vIdx.localVar, t.len)(src), idxEq)() )() + val terminationMeasure = + synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate") vpr.Function( name = s"${Names.arrayDefaultFunc}_${t.serialize}", formalArgs = Seq.empty, typ = vResType, - pres = Seq.empty, + pres = Seq(terminationMeasure), posts = Vector(lenEq, arrayEq), body = None )() diff --git a/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala index cba1ace53..cd81a08c0 100644 --- a/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/sequences/SequenceEncoding.scala @@ -17,6 +17,7 @@ import viper.gobra.translator.util.FunctionGenerator import viper.gobra.translator.util.ViperUtil.synthesized import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.util.Violation +import viper.silver.plugin.standard.termination import viper.silver.{ast => vpr} class SequenceEncoding extends LeafTypeEncoding { @@ -225,6 +226,7 @@ class SequenceEncoding extends LeafTypeEncoding { * requires 0 <= n * ensures |result| == n * ensures forall i : Int :: { result[i] } 0 <= i < n ==> result[i] == dfltVal(`T`) + * decreases _ * }}} */ private val emptySeqFunc: FunctionGenerator[in.Type] = new FunctionGenerator[in.Type] { @@ -245,6 +247,7 @@ class SequenceEncoding extends LeafTypeEncoding { // preconditions val pre1 = synthesized(vpr.LeCmp(vpr.IntLit(0)(), nDecl.localVar))("Sequence length might be negative") + val pre2 = synthesized(termination.DecreasesWildcard(None))("This function is assumed to terminate") // postconditions val post1 = vpr.EqCmp(vResultLength, nDecl.localVar)() @@ -262,7 +265,7 @@ class SequenceEncoding extends LeafTypeEncoding { name = s"${Names.emptySequenceFunc}_${Names.serializeType(t)}", formalArgs = Vector(nDecl), typ = vResultType, - pres = Vector(pre1), + pres = Vector(pre1, pre2), posts = Vector(post1, post2), body = None )() From 74d12a3f46512b67e15e5a4d42800af804824d6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 17 Apr 2024 22:23:31 +0200 Subject: [PATCH 269/296] more flexible joins from silicon (#761) * more flexible joins from silicon * fix errors --- .../viper/gobra/backend/ViperBackends.scala | 8 +-- .../scala/viper/gobra/frontend/Config.scala | 64 +++++++++++++++---- 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/src/main/scala/viper/gobra/backend/ViperBackends.scala b/src/main/scala/viper/gobra/backend/ViperBackends.scala index 7d457ec9b..0a3510e2b 100644 --- a/src/main/scala/viper/gobra/backend/ViperBackends.scala +++ b/src/main/scala/viper/gobra/backend/ViperBackends.scala @@ -41,9 +41,7 @@ object ViperBackends { if (config.unsafeWildcardOptimization) { options ++= Vector(s"--unsafeWildcardOptimization") } - if (config.enableMoreJoins) { - options ++= Vector(s"--moreJoins") - } + options ++= Vector(s"--moreJoins=${config.moreJoins.viperValue}") val mceSiliconOpt = config.mceMode match { case MCE.Disabled => "0" case MCE.Enabled => "1" @@ -149,9 +147,7 @@ object ViperBackends { if (config.unsafeWildcardOptimization) { options ++= Vector(s"--unsafeWildcardOptimization") } - if (config.enableMoreJoins) { - options ++= Vector(s"--moreJoins") - } + options ++= Vector(s"--moreJoins=${config.moreJoins.viperValue}") val mceSiliconOpt = config.mceMode match { case MCE.Disabled => "0" case MCE.Enabled => "1" diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 95d12bdc2..684f7ec75 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -76,7 +76,7 @@ object ConfigDefaults { val DefaultDisableSetAxiomatization: Boolean = false val DefaultDisableCheckTerminationPureFns: Boolean = false val DefaultUnsafeWildcardOptimization: Boolean = false - val DefaultEnableMoreJoins: Boolean = false + val DefaultMoreJoins: MoreJoins.Mode = MoreJoins.Disabled } // More-complete exhale modes @@ -89,6 +89,31 @@ object MCE { object Enabled extends Mode } +object MoreJoins { + sealed trait Mode { + // Option number used by Viper, as described in + // https://github.com/viperproject/silicon/pull/823 + def viperValue: Int + } + object Disabled extends Mode { + override val viperValue = 0 + } + object Impure extends Mode { + override val viperValue = 1 + } + object All extends Mode { + override val viperValue = 2 + } + + def merge(m1: Mode, m2: Mode): Mode = { + (m1, m2) match { + case (All, _) | (_, All) => All + case (Impure, _) | (_, Impure) => Impure + case _ => Disabled + } + } +} + case class Config( gobraDirectory: Path = ConfigDefaults.DefaultGobraDirectory, // Used as an identifier of a verification task, ideally it shouldn't change between verifications @@ -146,7 +171,7 @@ case class Config( disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization, disableCheckTerminationPureFns: Boolean = ConfigDefaults.DefaultDisableCheckTerminationPureFns, unsafeWildcardOptimization: Boolean = ConfigDefaults.DefaultUnsafeWildcardOptimization, - enableMoreJoins: Boolean = ConfigDefaults.DefaultEnableMoreJoins, + moreJoins: MoreJoins.Mode = ConfigDefaults.DefaultMoreJoins, ) { @@ -201,7 +226,7 @@ case class Config( disableSetAxiomatization = disableSetAxiomatization || other.disableSetAxiomatization, disableCheckTerminationPureFns = disableCheckTerminationPureFns || other.disableCheckTerminationPureFns, unsafeWildcardOptimization = unsafeWildcardOptimization && other.unsafeWildcardOptimization, - enableMoreJoins = enableMoreJoins || other.enableMoreJoins, + moreJoins = MoreJoins.merge(moreJoins, other.moreJoins), ) } @@ -259,7 +284,7 @@ case class BaseConfig(gobraDirectory: Path = ConfigDefaults.DefaultGobraDirector disableSetAxiomatization: Boolean = ConfigDefaults.DefaultDisableSetAxiomatization, disableCheckTerminationPureFns: Boolean = ConfigDefaults.DefaultDisableCheckTerminationPureFns, unsafeWildcardOptimization: Boolean = ConfigDefaults.DefaultUnsafeWildcardOptimization, - enableMoreJoins: Boolean = ConfigDefaults.DefaultEnableMoreJoins, + moreJoins: MoreJoins.Mode = ConfigDefaults.DefaultMoreJoins, ) { def shouldParse: Boolean = true def shouldTypeCheck: Boolean = !shouldParseOnly @@ -321,7 +346,7 @@ trait RawConfig { disableSetAxiomatization = baseConfig.disableSetAxiomatization, disableCheckTerminationPureFns = baseConfig.disableCheckTerminationPureFns, unsafeWildcardOptimization = baseConfig.unsafeWildcardOptimization, - enableMoreJoins = baseConfig.enableMoreJoins, + moreJoins = baseConfig.moreJoins, ) } @@ -686,12 +711,23 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals noshort = true ) - val enableMoreJoins: ScallopOption[Boolean] = opt[Boolean]( - name = "moreJoins", - descr = "Enable more joins using a more complete implementation of state merging.", - default = Some(false), - noshort = true - ) + val moreJoins: ScallopOption[MoreJoins.Mode] = { + val all = "all" + val impure = "impure" + val off = "off" + choice( + choices = Seq("all", "impure", "off"), + name = "moreJoins", + descr = s"Specifies if silicon should be run with more joins completely enabled ($all), disabled ($off), or only for impure conditionals ($impure).", + default = Some(off), + noshort = true + ).map { + case `all` => MoreJoins.All + case `off` => MoreJoins.Disabled + case `impure` => MoreJoins.Impure + case s => Violation.violation(s"Unexpected mode for moreJoins: $s") + } + } val mceMode: ScallopOption[MCE.Mode] = { val on = "on" @@ -840,8 +876,8 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals } addValidation { - val enableMoreJoinsOptSupplied = enableMoreJoins.isSupplied - if (enableMoreJoinsOptSupplied && !isSiliconBasedBackend) { + val moreJoinsOptSupplied = moreJoins.isSupplied + if (moreJoinsOptSupplied && !isSiliconBasedBackend) { Left("The flag --moreJoins can only be used with Silicon or ViperServer with Silicon") } else { Right(()) @@ -965,6 +1001,6 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals disableSetAxiomatization = disableSetAxiomatization(), disableCheckTerminationPureFns = disableCheckTerminationPureFns(), unsafeWildcardOptimization = unsafeWildcardOptimization(), - enableMoreJoins = enableMoreJoins(), + moreJoins = moreJoins(), ) } From 07a1cc0a538482d2d7f2aa4525d3bc1bb975098c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Mon, 22 Apr 2024 18:18:19 +0200 Subject: [PATCH 270/296] Fix incompletness with conversions to and from strings (#763) * fix incompletness with string conversion * improve posts --- .../translator/encodings/StringEncoding.scala | 32 +++++++++++++++---- .../conversion/conversion-simple01.gobra | 12 +++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala index 44835e447..868824c79 100644 --- a/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/StringEncoding.scala @@ -86,20 +86,22 @@ class StringEncoding extends LeafTypeEncoding { /** - * Encodes the (effectul) conversion from a string to a []byte + * Encodes the (effectful) conversion from a string to a []byte * [ target = []byte(str) ] -> * [ * var s []byte * inhale forall i Int :: { &s[i] } 0 <= i && i < len(s) ==> acc(&s[i]) + * inhale len(s) == len(str) // (*) * target = s * ] + * Note that (*) is correct because the len() function returns the number of bytes in a string. */ override def statement(ctx: Context): in.Stmt ==> CodeWriter[vpr.Stmt] = { def goA(x: in.Assertion): CodeWriter[vpr.Exp] = ctx.assertion(x) default(super.statement(ctx)) { - case conv@in.EffectfulConversion(target, in.SliceT(in.IntT(_, TypeBounds.Byte), _), _) => + case conv@in.EffectfulConversion(target, in.SliceT(in.IntT(_, TypeBounds.Byte), _), e) => // the argument of type string is not used in the viper encoding. May change in the future to be able to prove more // interesting properties val (pos, info, errT) = conv.vprMeta @@ -108,7 +110,7 @@ class StringEncoding extends LeafTypeEncoding { val slice = in.LocalVar(ctx.freshNames.next(), sliceT)(conv.info) val vprSlice = ctx.variable(slice) val qtfVar = in.BoundVar("i", in.IntT(Addressability.boundVariable))(conv.info) - val post = in.SepForall( + val post1 = in.SepForall( vars = Vector(qtfVar), triggers = Vector(in.Trigger(Vector(in.Ref(in.IndexedExp(slice, qtfVar, sliceT)(conv.info))(conv.info)))(conv.info)), body = in.Implication( @@ -116,12 +118,20 @@ class StringEncoding extends LeafTypeEncoding { in.Access(in.Accessible.Address(in.IndexedExp(slice, qtfVar, sliceT)(conv.info)), in.FullPerm(conv.info))(conv.info) )(conv.info) )(conv.info) + val post2 = in.ExprAssertion( + in.EqCmp( + in.Length(slice)(conv.info), + in.Length(e)(conv.info), + )(conv.info) + )(conv.info) seqn( for { _ <- local(vprSlice) - vprPost <- goA(post) - _ <- write(vpr.Inhale(vprPost)(pos, info, errT)) + vprPost1 <- goA(post1) + _ <- write(vpr.Inhale(vprPost1)(pos, info, errT)) + vprPost2 <- goA(post2) + _ <- write(vpr.Inhale(vprPost2)(pos, info, errT)) ass <- ctx.assignment(in.Assignee.Var(target), slice)(conv) } yield ass ) @@ -274,8 +284,10 @@ class StringEncoding extends LeafTypeEncoding { /** Generates the function * requires forall i int :: { &s[i] } 0 <= i && i < len(s) ==> acc(&s[i], _) + * ensures len(s) == len(res) // (*) * decreases _ - * pure func byteSliceToStrFunc(s []byte) string + * pure func byteSliceToStrFunc(s []byte) (res string) + * Note that (*) is correct because the function len() returns the number of bytes in a string. */ private val byteSliceToStrFuncName: String = "byteSliceToStrFunc" private val byteSliceToStrFuncGenerator: FunctionGenerator[Unit] = new FunctionGenerator[Unit] { @@ -294,13 +306,19 @@ class StringEncoding extends LeafTypeEncoding { in.Access(in.Accessible.Address(in.IndexedExp(param, qtfVar, paramT)(info)), in.WildcardPerm(info))(info) )(info) )(info) + val post = in.ExprAssertion( + in.EqCmp( + in.Length(param)(info), + in.Length(res)(info), + )(info) + )(info) val func: in.PureFunction = in.PureFunction( name = in.FunctionProxy(byteSliceToStrFuncName)(info), args = Vector(param), results = Vector(res), pres = Vector(pre), - posts = Vector(), + posts = Vector(post), terminationMeasures = Vector(in.WildcardMeasure(None)(info)), backendAnnotations = Vector.empty, body = None, diff --git a/src/test/resources/regressions/features/conversion/conversion-simple01.gobra b/src/test/resources/regressions/features/conversion/conversion-simple01.gobra index 832c14c42..e040f5591 100644 --- a/src/test/resources/regressions/features/conversion/conversion-simple01.gobra +++ b/src/test/resources/regressions/features/conversion/conversion-simple01.gobra @@ -5,3 +5,15 @@ package main ensures res == int64(i) func to64(i int8) (res int64) + +func stringToByteSlConversion() { + key := []byte("dummy key xxxxxx") + assert acc(&key[0]) + assert len(key) > 0 +} + +func byteSlToStringConversion() { + keyBytes := []byte{'a', 'b', 'c'} + key := string(keyBytes) + assert 0 < len(key) +} \ No newline at end of file From 38b35ff84328591f442d55467211d755a5bb81c4 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Wed, 1 May 2024 11:29:30 +0200 Subject: [PATCH 271/296] Updates submodules (#764) Co-authored-by: ArquintL <3762537+ArquintL@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 5a3871bd0..c45bfd4c7 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 5a3871bd0879d225ad6e026a65b58a3abae01e3a +Subproject commit c45bfd4c7ce75e7321249461ade16c0d0355b64d From 2591008ab7c09581d262f528fa7d5746fae1906c Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 6 May 2024 11:40:34 +0200 Subject: [PATCH 272/296] extens parser by ghost fields --- src/main/antlr4/GobraParser.g4 | 6 + .../viper/gobra/frontend/GobraParser.java | 4705 +++++++++-------- .../frontend/GobraParserBaseVisitor.java | 14 +- .../gobra/frontend/GobraParserVisitor.java | 12 +- 4 files changed, 2379 insertions(+), 2358 deletions(-) diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 124228f21..92c990ec4 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -157,6 +157,12 @@ ghostSliceType: GHOST L_BRACKET R_BRACKET elementType; ghostPointerType: GPOINTER L_BRACKET elementType R_BRACKET; +// copy of `fieldDecl` from GoParser.g4 extended with an optional `GHOST` modifier for fields: +fieldDecl: ( + GHOST? identifierList type_ + | embeddedField + ) tag = string_?; + sqType: (kind=(SEQ | SET | MSET | OPT) L_BRACKET type_ R_BRACKET) | kind=DICT L_BRACKET type_ R_BRACKET type_; diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 39199c952..c6e617a80 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -57,46 +57,46 @@ public class GobraParser extends GobraParserBase { RULE_matchExprClause = 37, RULE_seqUpdExp = 38, RULE_seqUpdClause = 39, RULE_ghostTypeLit = 40, RULE_domainType = 41, RULE_domainClause = 42, RULE_adtType = 43, RULE_adtClause = 44, RULE_adtFieldDecl = 45, RULE_ghostSliceType = 46, - RULE_ghostPointerType = 47, RULE_sqType = 48, RULE_specification = 49, - RULE_backendAnnotationEntry = 50, RULE_listOfValues = 51, RULE_singleBackendAnnotation = 52, - RULE_backendAnnotationList = 53, RULE_backendAnnotation = 54, RULE_specStatement = 55, - RULE_terminationMeasure = 56, RULE_assertion = 57, RULE_matchStmt = 58, - RULE_matchStmtClause = 59, RULE_matchCase = 60, RULE_matchPattern = 61, - RULE_matchPatternList = 62, RULE_blockWithBodyParameterInfo = 63, RULE_closureSpecInstance = 64, - RULE_closureSpecParams = 65, RULE_closureSpecParam = 66, RULE_closureImplProofStmt = 67, - RULE_implementationProof = 68, RULE_methodImplementationProof = 69, RULE_nonLocalReceiver = 70, - RULE_selection = 71, RULE_implementationProofPredicateAlias = 72, RULE_make = 73, - RULE_new_ = 74, RULE_specMember = 75, RULE_functionDecl = 76, RULE_methodDecl = 77, - RULE_explicitGhostMember = 78, RULE_fpredicateDecl = 79, RULE_predicateBody = 80, - RULE_mpredicateDecl = 81, RULE_varSpec = 82, RULE_shortVarDecl = 83, RULE_receiver = 84, - RULE_parameterDecl = 85, RULE_actualParameterDecl = 86, RULE_ghostParameterDecl = 87, - RULE_parameterType = 88, RULE_expression = 89, RULE_statement = 90, RULE_applyStmt = 91, - RULE_packageStmt = 92, RULE_specForStmt = 93, RULE_loopSpec = 94, RULE_deferStmt = 95, - RULE_basicLit = 96, RULE_primaryExpr = 97, RULE_functionLit = 98, RULE_closureDecl = 99, - RULE_predConstructArgs = 100, RULE_interfaceType = 101, RULE_predicateSpec = 102, - RULE_methodSpec = 103, RULE_type_ = 104, RULE_typeLit = 105, RULE_predType = 106, - RULE_predTypeParams = 107, RULE_literalType = 108, RULE_implicitArray = 109, - RULE_slice_ = 110, RULE_low = 111, RULE_high = 112, RULE_cap = 113, RULE_assign_op = 114, - RULE_rangeClause = 115, RULE_packageClause = 116, RULE_importPath = 117, - RULE_declaration = 118, RULE_constDecl = 119, RULE_constSpec = 120, RULE_identifierList = 121, - RULE_expressionList = 122, RULE_typeDecl = 123, RULE_typeSpec = 124, RULE_varDecl = 125, - RULE_block = 126, RULE_statementList = 127, RULE_simpleStmt = 128, RULE_expressionStmt = 129, - RULE_sendStmt = 130, RULE_incDecStmt = 131, RULE_assignment = 132, RULE_emptyStmt = 133, - RULE_labeledStmt = 134, RULE_returnStmt = 135, RULE_breakStmt = 136, RULE_continueStmt = 137, - RULE_gotoStmt = 138, RULE_fallthroughStmt = 139, RULE_ifStmt = 140, RULE_switchStmt = 141, - RULE_exprSwitchStmt = 142, RULE_exprCaseClause = 143, RULE_exprSwitchCase = 144, - RULE_typeSwitchStmt = 145, RULE_typeSwitchGuard = 146, RULE_typeCaseClause = 147, - RULE_typeSwitchCase = 148, RULE_typeList = 149, RULE_selectStmt = 150, - RULE_commClause = 151, RULE_commCase = 152, RULE_recvStmt = 153, RULE_forStmt = 154, - RULE_forClause = 155, RULE_goStmt = 156, RULE_typeName = 157, RULE_arrayType = 158, - RULE_arrayLength = 159, RULE_elementType = 160, RULE_pointerType = 161, - RULE_sliceType = 162, RULE_mapType = 163, RULE_channelType = 164, RULE_functionType = 165, - RULE_signature = 166, RULE_result = 167, RULE_parameters = 168, RULE_conversion = 169, - RULE_nonNamedType = 170, RULE_operand = 171, RULE_literal = 172, RULE_integer = 173, - RULE_operandName = 174, RULE_qualifiedIdent = 175, RULE_compositeLit = 176, - RULE_literalValue = 177, RULE_elementList = 178, RULE_keyedElement = 179, - RULE_key = 180, RULE_element = 181, RULE_structType = 182, RULE_fieldDecl = 183, - RULE_string_ = 184, RULE_embeddedField = 185, RULE_index = 186, RULE_typeAssertion = 187, + RULE_ghostPointerType = 47, RULE_fieldDecl = 48, RULE_sqType = 49, RULE_specification = 50, + RULE_backendAnnotationEntry = 51, RULE_listOfValues = 52, RULE_singleBackendAnnotation = 53, + RULE_backendAnnotationList = 54, RULE_backendAnnotation = 55, RULE_specStatement = 56, + RULE_terminationMeasure = 57, RULE_assertion = 58, RULE_matchStmt = 59, + RULE_matchStmtClause = 60, RULE_matchCase = 61, RULE_matchPattern = 62, + RULE_matchPatternList = 63, RULE_blockWithBodyParameterInfo = 64, RULE_closureSpecInstance = 65, + RULE_closureSpecParams = 66, RULE_closureSpecParam = 67, RULE_closureImplProofStmt = 68, + RULE_implementationProof = 69, RULE_methodImplementationProof = 70, RULE_nonLocalReceiver = 71, + RULE_selection = 72, RULE_implementationProofPredicateAlias = 73, RULE_make = 74, + RULE_new_ = 75, RULE_specMember = 76, RULE_functionDecl = 77, RULE_methodDecl = 78, + RULE_explicitGhostMember = 79, RULE_fpredicateDecl = 80, RULE_predicateBody = 81, + RULE_mpredicateDecl = 82, RULE_varSpec = 83, RULE_shortVarDecl = 84, RULE_receiver = 85, + RULE_parameterDecl = 86, RULE_actualParameterDecl = 87, RULE_ghostParameterDecl = 88, + RULE_parameterType = 89, RULE_expression = 90, RULE_statement = 91, RULE_applyStmt = 92, + RULE_packageStmt = 93, RULE_specForStmt = 94, RULE_loopSpec = 95, RULE_deferStmt = 96, + RULE_basicLit = 97, RULE_primaryExpr = 98, RULE_functionLit = 99, RULE_closureDecl = 100, + RULE_predConstructArgs = 101, RULE_interfaceType = 102, RULE_predicateSpec = 103, + RULE_methodSpec = 104, RULE_type_ = 105, RULE_typeLit = 106, RULE_predType = 107, + RULE_predTypeParams = 108, RULE_literalType = 109, RULE_implicitArray = 110, + RULE_slice_ = 111, RULE_low = 112, RULE_high = 113, RULE_cap = 114, RULE_assign_op = 115, + RULE_rangeClause = 116, RULE_packageClause = 117, RULE_importPath = 118, + RULE_declaration = 119, RULE_constDecl = 120, RULE_constSpec = 121, RULE_identifierList = 122, + RULE_expressionList = 123, RULE_typeDecl = 124, RULE_typeSpec = 125, RULE_varDecl = 126, + RULE_block = 127, RULE_statementList = 128, RULE_simpleStmt = 129, RULE_expressionStmt = 130, + RULE_sendStmt = 131, RULE_incDecStmt = 132, RULE_assignment = 133, RULE_emptyStmt = 134, + RULE_labeledStmt = 135, RULE_returnStmt = 136, RULE_breakStmt = 137, RULE_continueStmt = 138, + RULE_gotoStmt = 139, RULE_fallthroughStmt = 140, RULE_ifStmt = 141, RULE_switchStmt = 142, + RULE_exprSwitchStmt = 143, RULE_exprCaseClause = 144, RULE_exprSwitchCase = 145, + RULE_typeSwitchStmt = 146, RULE_typeSwitchGuard = 147, RULE_typeCaseClause = 148, + RULE_typeSwitchCase = 149, RULE_typeList = 150, RULE_selectStmt = 151, + RULE_commClause = 152, RULE_commCase = 153, RULE_recvStmt = 154, RULE_forStmt = 155, + RULE_forClause = 156, RULE_goStmt = 157, RULE_typeName = 158, RULE_arrayType = 159, + RULE_arrayLength = 160, RULE_elementType = 161, RULE_pointerType = 162, + RULE_sliceType = 163, RULE_mapType = 164, RULE_channelType = 165, RULE_functionType = 166, + RULE_signature = 167, RULE_result = 168, RULE_parameters = 169, RULE_conversion = 170, + RULE_nonNamedType = 171, RULE_operand = 172, RULE_literal = 173, RULE_integer = 174, + RULE_operandName = 175, RULE_qualifiedIdent = 176, RULE_compositeLit = 177, + RULE_literalValue = 178, RULE_elementList = 179, RULE_keyedElement = 180, + RULE_key = 181, RULE_element = 182, RULE_structType = 183, RULE_string_ = 184, + RULE_embeddedField = 185, RULE_index = 186, RULE_typeAssertion = 187, RULE_arguments = 188, RULE_methodExpr = 189, RULE_receiverType = 190, RULE_eos = 191; private static String[] makeRuleNames() { @@ -110,8 +110,8 @@ private static String[] makeRuleNames() { "old", "oldLabelUse", "labelUse", "before", "isComparable", "typeOf", "access", "range", "matchExpr", "matchExprClause", "seqUpdExp", "seqUpdClause", "ghostTypeLit", "domainType", "domainClause", "adtType", "adtClause", - "adtFieldDecl", "ghostSliceType", "ghostPointerType", "sqType", "specification", - "backendAnnotationEntry", "listOfValues", "singleBackendAnnotation", + "adtFieldDecl", "ghostSliceType", "ghostPointerType", "fieldDecl", "sqType", + "specification", "backendAnnotationEntry", "listOfValues", "singleBackendAnnotation", "backendAnnotationList", "backendAnnotation", "specStatement", "terminationMeasure", "assertion", "matchStmt", "matchStmtClause", "matchCase", "matchPattern", "matchPatternList", "blockWithBodyParameterInfo", "closureSpecInstance", @@ -137,9 +137,9 @@ private static String[] makeRuleNames() { "sliceType", "mapType", "channelType", "functionType", "signature", "result", "parameters", "conversion", "nonNamedType", "operand", "literal", "integer", "operandName", "qualifiedIdent", "compositeLit", "literalValue", "elementList", - "keyedElement", "key", "element", "structType", "fieldDecl", "string_", - "embeddedField", "index", "typeAssertion", "arguments", "methodExpr", - "receiverType", "eos" + "keyedElement", "key", "element", "structType", "string_", "embeddedField", + "index", "typeAssertion", "arguments", "methodExpr", "receiverType", + "eos" }; } public static final String[] ruleNames = makeRuleNames(); @@ -3276,6 +3276,91 @@ public final GhostPointerTypeContext ghostPointerType() throws RecognitionExcept return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class FieldDeclContext extends ParserRuleContext { + public String_Context tag; + public IdentifierListContext identifierList() { + return getRuleContext(IdentifierListContext.class,0); + } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public EmbeddedFieldContext embeddedField() { + return getRuleContext(EmbeddedFieldContext.class,0); + } + public String_Context string_() { + return getRuleContext(String_Context.class,0); + } + public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } + public FieldDeclContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fieldDecl; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitFieldDecl(this); + else return visitor.visitChildren(this); + } + } + + public final FieldDeclContext fieldDecl() throws RecognitionException { + FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); + enterRule(_localctx, 96, RULE_fieldDecl); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(762); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) { + case 1: + { + setState(756); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==GHOST) { + { + setState(755); + match(GHOST); + } + } + + setState(758); + identifierList(); + setState(759); + type_(); + } + break; + case 2: + { + setState(761); + embeddedField(); + } + break; + } + setState(765); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { + case 1: + { + setState(764); + ((FieldDeclContext)_localctx).tag = string_(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") public static class SqTypeContext extends ParserRuleContext { public Token kind; @@ -3305,10 +3390,10 @@ public T accept(ParseTreeVisitor visitor) { public final SqTypeContext sqType() throws RecognitionException { SqTypeContext _localctx = new SqTypeContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_sqType); + enterRule(_localctx, 98, RULE_sqType); int _la; try { - setState(766); + setState(778); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3318,7 +3403,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(755); + setState(767); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) { @@ -3329,11 +3414,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(756); + setState(768); match(L_BRACKET); - setState(757); + setState(769); type_(); - setState(758); + setState(770); match(R_BRACKET); } } @@ -3341,15 +3426,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(760); + setState(772); ((SqTypeContext)_localctx).kind = match(DICT); - setState(761); + setState(773); match(L_BRACKET); - setState(762); + setState(774); type_(); - setState(763); + setState(775); match(R_BRACKET); - setState(764); + setState(776); type_(); } break; @@ -3413,20 +3498,20 @@ public T accept(ParseTreeVisitor visitor) { public final SpecificationContext specification() throws RecognitionException { SpecificationContext _localctx = new SpecificationContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_specification); + enterRule(_localctx, 100, RULE_specification); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(780); + setState(792); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,35,_ctx); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(775); + setState(787); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3434,27 +3519,27 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(768); + setState(780); specStatement(); } break; case OPAQUE: { - setState(769); + setState(781); match(OPAQUE); ((SpecificationContext)_localctx).opaque = true; } break; case PURE: { - setState(771); + setState(783); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(773); + setState(785); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3462,32 +3547,32 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(777); + setState(789); eos(); } } } - setState(782); + setState(794); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,35,_ctx); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); } - setState(785); + setState(797); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(783); + setState(795); match(PURE); ((SpecificationContext)_localctx).pure = true; } } - setState(788); + setState(800); _errHandler.sync(this); _la = _input.LA(1); if (_la==BACKEND) { { - setState(787); + setState(799); backendAnnotation(); } } @@ -3532,18 +3617,18 @@ public T accept(ParseTreeVisitor visitor) { public final BackendAnnotationEntryContext backendAnnotationEntry() throws RecognitionException { BackendAnnotationEntryContext _localctx = new BackendAnnotationEntryContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_backendAnnotationEntry); + enterRule(_localctx, 102, RULE_backendAnnotationEntry); int _la; try { enterOuterAlt(_localctx, 1); { - setState(791); + setState(803); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(790); + setState(802); _la = _input.LA(1); if ( _la <= 0 || (((((_la - 106)) & ~0x3f) == 0 && ((1L << (_la - 106)) & 131L) != 0)) ) { _errHandler.recoverInline(this); @@ -3555,7 +3640,7 @@ public final BackendAnnotationEntryContext backendAnnotationEntry() throws Recog } } } - setState(793); + setState(805); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -576144092954625L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 137438953471L) != 0) ); @@ -3597,26 +3682,26 @@ public T accept(ParseTreeVisitor visitor) { public final ListOfValuesContext listOfValues() throws RecognitionException { ListOfValuesContext _localctx = new ListOfValuesContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_listOfValues); + enterRule(_localctx, 104, RULE_listOfValues); int _la; try { enterOuterAlt(_localctx, 1); { - setState(795); + setState(807); backendAnnotationEntry(); - setState(800); + setState(812); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(796); + setState(808); match(COMMA); - setState(797); + setState(809); backendAnnotationEntry(); } } - setState(802); + setState(814); _errHandler.sync(this); _la = _input.LA(1); } @@ -3656,26 +3741,26 @@ public T accept(ParseTreeVisitor visitor) { public final SingleBackendAnnotationContext singleBackendAnnotation() throws RecognitionException { SingleBackendAnnotationContext _localctx = new SingleBackendAnnotationContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_singleBackendAnnotation); + enterRule(_localctx, 106, RULE_singleBackendAnnotation); int _la; try { enterOuterAlt(_localctx, 1); { - setState(803); + setState(815); backendAnnotationEntry(); - setState(804); + setState(816); match(L_PAREN); - setState(806); + setState(818); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -576144092954625L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 137438953471L) != 0)) { { - setState(805); + setState(817); listOfValues(); } } - setState(808); + setState(820); match(R_PAREN); } } @@ -3715,26 +3800,26 @@ public T accept(ParseTreeVisitor visitor) { public final BackendAnnotationListContext backendAnnotationList() throws RecognitionException { BackendAnnotationListContext _localctx = new BackendAnnotationListContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_backendAnnotationList); + enterRule(_localctx, 108, RULE_backendAnnotationList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(810); + setState(822); singleBackendAnnotation(); - setState(815); + setState(827); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(811); + setState(823); match(COMMA); - setState(812); + setState(824); singleBackendAnnotation(); } } - setState(817); + setState(829); _errHandler.sync(this); _la = _input.LA(1); } @@ -3775,27 +3860,27 @@ public T accept(ParseTreeVisitor visitor) { public final BackendAnnotationContext backendAnnotation() throws RecognitionException { BackendAnnotationContext _localctx = new BackendAnnotationContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_backendAnnotation); + enterRule(_localctx, 110, RULE_backendAnnotation); try { enterOuterAlt(_localctx, 1); { - setState(818); + setState(830); match(BACKEND); - setState(819); + setState(831); match(L_BRACKET); - setState(821); + setState(833); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(820); + setState(832); backendAnnotationList(); } break; } - setState(823); + setState(835); match(R_BRACKET); - setState(824); + setState(836); eos(); } } @@ -3836,44 +3921,44 @@ public T accept(ParseTreeVisitor visitor) { public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_specStatement); + enterRule(_localctx, 112, RULE_specStatement); try { - setState(834); + setState(846); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(826); + setState(838); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(827); + setState(839); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(828); + setState(840); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(829); + setState(841); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(830); + setState(842); ((SpecStatementContext)_localctx).kind = match(POST); - setState(831); + setState(843); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(832); + setState(844); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(833); + setState(845); terminationMeasure(); } break; @@ -3914,28 +3999,28 @@ public T accept(ParseTreeVisitor visitor) { public final TerminationMeasureContext terminationMeasure() throws RecognitionException { TerminationMeasureContext _localctx = new TerminationMeasureContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_terminationMeasure); + enterRule(_localctx, 114, RULE_terminationMeasure); try { enterOuterAlt(_localctx, 1); { - setState(837); + setState(849); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(836); + setState(848); expressionList(); } break; } - setState(841); + setState(853); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(839); + setState(851); match(IF); - setState(840); + setState(852); expression(0); } break; @@ -3971,11 +4056,11 @@ public T accept(ParseTreeVisitor visitor) { public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_assertion); + enterRule(_localctx, 116, RULE_assertion); try { - setState(845); + setState(857); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { @@ -3984,7 +4069,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(844); + setState(856); expression(0); } break; @@ -4028,32 +4113,32 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtContext matchStmt() throws RecognitionException { MatchStmtContext _localctx = new MatchStmtContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_matchStmt); + enterRule(_localctx, 118, RULE_matchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(847); + setState(859); match(MATCH); - setState(848); + setState(860); expression(0); - setState(849); + setState(861); match(L_CURLY); - setState(853); + setState(865); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(850); + setState(862); matchStmtClause(); } } - setState(855); + setState(867); _errHandler.sync(this); _la = _input.LA(1); } - setState(856); + setState(868); match(R_CURLY); } } @@ -4090,20 +4175,20 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtClauseContext matchStmtClause() throws RecognitionException { MatchStmtClauseContext _localctx = new MatchStmtClauseContext(_ctx, getState()); - enterRule(_localctx, 118, RULE_matchStmtClause); + enterRule(_localctx, 120, RULE_matchStmtClause); try { enterOuterAlt(_localctx, 1); { - setState(858); + setState(870); matchCase(); - setState(859); + setState(871); match(COLON); - setState(861); + setState(873); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { case 1: { - setState(860); + setState(872); statementList(); } break; @@ -4141,24 +4226,24 @@ public T accept(ParseTreeVisitor visitor) { public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); - enterRule(_localctx, 120, RULE_matchCase); + enterRule(_localctx, 122, RULE_matchCase); try { - setState(866); + setState(878); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(863); + setState(875); match(CASE); - setState(864); + setState(876); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(865); + setState(877); match(DEFAULT); } break; @@ -4233,19 +4318,19 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternContext matchPattern() throws RecognitionException { MatchPatternContext _localctx = new MatchPatternContext(_ctx, getState()); - enterRule(_localctx, 122, RULE_matchPattern); + enterRule(_localctx, 124, RULE_matchPattern); int _la; try { - setState(881); + setState(893); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(868); + setState(880); match(QMARK); - setState(869); + setState(881); match(IDENTIFIER); } break; @@ -4253,23 +4338,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(870); + setState(882); literalType(); - setState(871); + setState(883); match(L_CURLY); - setState(876); + setState(888); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913343522074138L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(872); + setState(884); matchPatternList(); - setState(874); + setState(886); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(873); + setState(885); match(COMMA); } } @@ -4277,7 +4362,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(878); + setState(890); match(R_CURLY); } break; @@ -4285,7 +4370,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(880); + setState(892); expression(0); } break; @@ -4327,30 +4412,30 @@ public T accept(ParseTreeVisitor visitor) { public final MatchPatternListContext matchPatternList() throws RecognitionException { MatchPatternListContext _localctx = new MatchPatternListContext(_ctx, getState()); - enterRule(_localctx, 124, RULE_matchPatternList); + enterRule(_localctx, 126, RULE_matchPatternList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(883); + setState(895); matchPattern(); - setState(888); + setState(900); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,53,_ctx); + _alt = getInterpreter().adaptivePredict(_input,56,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(884); + setState(896); match(COMMA); - setState(885); + setState(897); matchPattern(); } } } - setState(890); + setState(902); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,53,_ctx); + _alt = getInterpreter().adaptivePredict(_input,56,_ctx); } } } @@ -4392,37 +4477,37 @@ public T accept(ParseTreeVisitor visitor) { public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException { BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState()); - enterRule(_localctx, 126, RULE_blockWithBodyParameterInfo); + enterRule(_localctx, 128, RULE_blockWithBodyParameterInfo); try { enterOuterAlt(_localctx, 1); { - setState(891); + setState(903); match(L_CURLY); - setState(896); + setState(908); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(892); + setState(904); match(SHARE); - setState(893); + setState(905); identifierList(); - setState(894); + setState(906); eos(); } break; } - setState(899); + setState(911); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { - setState(898); + setState(910); statementList(); } break; } - setState(901); + setState(913); match(R_CURLY); } } @@ -4462,47 +4547,47 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecInstanceContext closureSpecInstance() throws RecognitionException { ClosureSpecInstanceContext _localctx = new ClosureSpecInstanceContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_closureSpecInstance); + enterRule(_localctx, 130, RULE_closureSpecInstance); int _la; try { enterOuterAlt(_localctx, 1); { - setState(905); + setState(917); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { case 1: { - setState(903); + setState(915); qualifiedIdent(); } break; case 2: { - setState(904); + setState(916); match(IDENTIFIER); } break; } - setState(915); + setState(927); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { case 1: { - setState(907); + setState(919); match(L_CURLY); - setState(912); + setState(924); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(908); + setState(920); closureSpecParams(); - setState(910); + setState(922); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(909); + setState(921); match(COMMA); } } @@ -4510,7 +4595,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(914); + setState(926); match(R_CURLY); } break; @@ -4553,30 +4638,30 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamsContext closureSpecParams() throws RecognitionException { ClosureSpecParamsContext _localctx = new ClosureSpecParamsContext(_ctx, getState()); - enterRule(_localctx, 130, RULE_closureSpecParams); + enterRule(_localctx, 132, RULE_closureSpecParams); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(917); + setState(929); closureSpecParam(); - setState(922); + setState(934); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,60,_ctx); + _alt = getInterpreter().adaptivePredict(_input,63,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(918); + setState(930); match(COMMA); - setState(919); + setState(931); closureSpecParam(); } } } - setState(924); + setState(936); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,60,_ctx); + _alt = getInterpreter().adaptivePredict(_input,63,_ctx); } } } @@ -4611,23 +4696,23 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureSpecParamContext closureSpecParam() throws RecognitionException { ClosureSpecParamContext _localctx = new ClosureSpecParamContext(_ctx, getState()); - enterRule(_localctx, 132, RULE_closureSpecParam); + enterRule(_localctx, 134, RULE_closureSpecParam); try { enterOuterAlt(_localctx, 1); { - setState(927); + setState(939); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { case 1: { - setState(925); + setState(937); match(IDENTIFIER); - setState(926); + setState(938); match(COLON); } break; } - setState(929); + setState(941); expression(0); } } @@ -4668,19 +4753,19 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureImplProofStmtContext closureImplProofStmt() throws RecognitionException { ClosureImplProofStmtContext _localctx = new ClosureImplProofStmtContext(_ctx, getState()); - enterRule(_localctx, 134, RULE_closureImplProofStmt); + enterRule(_localctx, 136, RULE_closureImplProofStmt); try { enterOuterAlt(_localctx, 1); { - setState(931); + setState(943); match(PROOF); - setState(932); + setState(944); expression(0); - setState(933); + setState(945); match(IMPL); - setState(934); + setState(946); closureSpecInstance(); - setState(935); + setState(947); block(); } } @@ -4737,57 +4822,57 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofContext implementationProof() throws RecognitionException { ImplementationProofContext _localctx = new ImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 136, RULE_implementationProof); + enterRule(_localctx, 138, RULE_implementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(937); + setState(949); type_(); - setState(938); + setState(950); match(IMPL); - setState(939); + setState(951); type_(); - setState(958); + setState(970); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(940); + setState(952); match(L_CURLY); - setState(946); + setState(958); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(941); + setState(953); implementationProofPredicateAlias(); - setState(942); + setState(954); eos(); } } - setState(948); + setState(960); _errHandler.sync(this); _la = _input.LA(1); } - setState(954); + setState(966); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(949); + setState(961); methodImplementationProof(); - setState(950); + setState(962); eos(); } } - setState(956); + setState(968); _errHandler.sync(this); _la = _input.LA(1); } - setState(957); + setState(969); match(R_CURLY); } break; @@ -4831,33 +4916,33 @@ public T accept(ParseTreeVisitor visitor) { public final MethodImplementationProofContext methodImplementationProof() throws RecognitionException { MethodImplementationProofContext _localctx = new MethodImplementationProofContext(_ctx, getState()); - enterRule(_localctx, 138, RULE_methodImplementationProof); + enterRule(_localctx, 140, RULE_methodImplementationProof); int _la; try { enterOuterAlt(_localctx, 1); { - setState(961); + setState(973); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(960); + setState(972); match(PURE); } } - setState(963); + setState(975); nonLocalReceiver(); - setState(964); + setState(976); match(IDENTIFIER); - setState(965); + setState(977); signature(); - setState(967); + setState(979); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: { - setState(966); + setState(978); block(); } break; @@ -4897,36 +4982,36 @@ public T accept(ParseTreeVisitor visitor) { public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionException { NonLocalReceiverContext _localctx = new NonLocalReceiverContext(_ctx, getState()); - enterRule(_localctx, 140, RULE_nonLocalReceiver); + enterRule(_localctx, 142, RULE_nonLocalReceiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(969); + setState(981); match(L_PAREN); - setState(971); + setState(983); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(970); + setState(982); match(IDENTIFIER); } break; } - setState(974); + setState(986); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(973); + setState(985); match(STAR); } } - setState(976); + setState(988); typeName(); - setState(977); + setState(989); match(R_PAREN); } } @@ -4964,26 +5049,26 @@ public T accept(ParseTreeVisitor visitor) { public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); - enterRule(_localctx, 142, RULE_selection); + enterRule(_localctx, 144, RULE_selection); try { - setState(984); + setState(996); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(979); + setState(991); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(980); + setState(992); type_(); - setState(981); + setState(993); match(DOT); - setState(982); + setState(994); match(IDENTIFIER); } break; @@ -5024,28 +5109,28 @@ public T accept(ParseTreeVisitor visitor) { public final ImplementationProofPredicateAliasContext implementationProofPredicateAlias() throws RecognitionException { ImplementationProofPredicateAliasContext _localctx = new ImplementationProofPredicateAliasContext(_ctx, getState()); - enterRule(_localctx, 144, RULE_implementationProofPredicateAlias); + enterRule(_localctx, 146, RULE_implementationProofPredicateAlias); try { enterOuterAlt(_localctx, 1); { - setState(986); + setState(998); match(PRED); - setState(987); + setState(999); match(IDENTIFIER); - setState(988); + setState(1000); match(DECLARE_ASSIGN); - setState(991); + setState(1003); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: { - setState(989); + setState(1001); selection(); } break; case 2: { - setState(990); + setState(1002); operandName(); } break; @@ -5088,30 +5173,30 @@ public T accept(ParseTreeVisitor visitor) { public final MakeContext make() throws RecognitionException { MakeContext _localctx = new MakeContext(_ctx, getState()); - enterRule(_localctx, 146, RULE_make); + enterRule(_localctx, 148, RULE_make); int _la; try { enterOuterAlt(_localctx, 1); { - setState(993); + setState(1005); match(MAKE); - setState(994); + setState(1006); match(L_PAREN); - setState(995); + setState(1007); type_(); - setState(998); + setState(1010); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(996); + setState(1008); match(COMMA); - setState(997); + setState(1009); expressionList(); } } - setState(1000); + setState(1012); match(R_PAREN); } } @@ -5147,17 +5232,17 @@ public T accept(ParseTreeVisitor visitor) { public final New_Context new_() throws RecognitionException { New_Context _localctx = new New_Context(_ctx, getState()); - enterRule(_localctx, 148, RULE_new_); + enterRule(_localctx, 150, RULE_new_); try { enterOuterAlt(_localctx, 1); { - setState(1002); + setState(1014); match(NEW); - setState(1003); + setState(1015); match(L_PAREN); - setState(1004); + setState(1016); type_(); - setState(1005); + setState(1017); match(R_PAREN); } } @@ -5197,24 +5282,24 @@ public T accept(ParseTreeVisitor visitor) { public final SpecMemberContext specMember() throws RecognitionException { SpecMemberContext _localctx = new SpecMemberContext(_ctx, getState()); - enterRule(_localctx, 150, RULE_specMember); + enterRule(_localctx, 152, RULE_specMember); try { enterOuterAlt(_localctx, 1); { - setState(1007); + setState(1019); ((SpecMemberContext)_localctx).specification = specification(); - setState(1010); + setState(1022); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { case 1: { - setState(1008); + setState(1020); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; case 2: { - setState(1009); + setState(1021); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; @@ -5262,23 +5347,23 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionDeclContext functionDecl(boolean trusted,boolean pure,boolean opaque) throws RecognitionException { FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure, opaque); - enterRule(_localctx, 152, RULE_functionDecl); + enterRule(_localctx, 154, RULE_functionDecl); try { enterOuterAlt(_localctx, 1); { - setState(1012); + setState(1024); match(FUNC); - setState(1013); + setState(1025); match(IDENTIFIER); { - setState(1014); + setState(1026); signature(); - setState(1016); + setState(1028); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: { - setState(1015); + setState(1027); blockWithBodyParameterInfo(); } break; @@ -5330,25 +5415,25 @@ public T accept(ParseTreeVisitor visitor) { public final MethodDeclContext methodDecl(boolean trusted,boolean pure,boolean opaque) throws RecognitionException { MethodDeclContext _localctx = new MethodDeclContext(_ctx, getState(), trusted, pure, opaque); - enterRule(_localctx, 154, RULE_methodDecl); + enterRule(_localctx, 156, RULE_methodDecl); try { enterOuterAlt(_localctx, 1); { - setState(1018); + setState(1030); match(FUNC); - setState(1019); + setState(1031); receiver(); - setState(1020); + setState(1032); match(IDENTIFIER); { - setState(1021); + setState(1033); signature(); - setState(1023); + setState(1035); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: { - setState(1022); + setState(1034); blockWithBodyParameterInfo(); } break; @@ -5389,13 +5474,13 @@ public T accept(ParseTreeVisitor visitor) { public final ExplicitGhostMemberContext explicitGhostMember() throws RecognitionException { ExplicitGhostMemberContext _localctx = new ExplicitGhostMemberContext(_ctx, getState()); - enterRule(_localctx, 156, RULE_explicitGhostMember); + enterRule(_localctx, 158, RULE_explicitGhostMember); try { enterOuterAlt(_localctx, 1); { - setState(1025); + setState(1037); match(GHOST); - setState(1028); + setState(1040); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -5408,7 +5493,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case BACKEND: case FUNC: { - setState(1026); + setState(1038); specMember(); } break; @@ -5416,7 +5501,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(1027); + setState(1039); declaration(); } break; @@ -5459,22 +5544,22 @@ public T accept(ParseTreeVisitor visitor) { public final FpredicateDeclContext fpredicateDecl() throws RecognitionException { FpredicateDeclContext _localctx = new FpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 158, RULE_fpredicateDecl); + enterRule(_localctx, 160, RULE_fpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(1030); + setState(1042); match(PRED); - setState(1031); + setState(1043); match(IDENTIFIER); - setState(1032); + setState(1044); parameters(); - setState(1034); + setState(1046); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { case 1: { - setState(1033); + setState(1045); predicateBody(); } break; @@ -5515,17 +5600,17 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateBodyContext predicateBody() throws RecognitionException { PredicateBodyContext _localctx = new PredicateBodyContext(_ctx, getState()); - enterRule(_localctx, 160, RULE_predicateBody); + enterRule(_localctx, 162, RULE_predicateBody); try { enterOuterAlt(_localctx, 1); { - setState(1036); + setState(1048); match(L_CURLY); - setState(1037); + setState(1049); expression(0); - setState(1038); + setState(1050); eos(); - setState(1039); + setState(1051); match(R_CURLY); } } @@ -5566,24 +5651,24 @@ public T accept(ParseTreeVisitor visitor) { public final MpredicateDeclContext mpredicateDecl() throws RecognitionException { MpredicateDeclContext _localctx = new MpredicateDeclContext(_ctx, getState()); - enterRule(_localctx, 162, RULE_mpredicateDecl); + enterRule(_localctx, 164, RULE_mpredicateDecl); try { enterOuterAlt(_localctx, 1); { - setState(1041); + setState(1053); match(PRED); - setState(1042); + setState(1054); receiver(); - setState(1043); + setState(1055); match(IDENTIFIER); - setState(1044); + setState(1056); parameters(); - setState(1046); + setState(1058); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: { - setState(1045); + setState(1057); predicateBody(); } break; @@ -5626,13 +5711,13 @@ public T accept(ParseTreeVisitor visitor) { public final VarSpecContext varSpec() throws RecognitionException { VarSpecContext _localctx = new VarSpecContext(_ctx, getState()); - enterRule(_localctx, 164, RULE_varSpec); + enterRule(_localctx, 166, RULE_varSpec); try { enterOuterAlt(_localctx, 1); { - setState(1048); + setState(1060); maybeAddressableIdentifierList(); - setState(1056); + setState(1068); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5656,16 +5741,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(1049); + setState(1061); type_(); - setState(1052); + setState(1064); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { - setState(1050); + setState(1062); match(ASSIGN); - setState(1051); + setState(1063); expressionList(); } break; @@ -5674,9 +5759,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(1054); + setState(1066); match(ASSIGN); - setState(1055); + setState(1067); expressionList(); } break; @@ -5718,15 +5803,15 @@ public T accept(ParseTreeVisitor visitor) { public final ShortVarDeclContext shortVarDecl() throws RecognitionException { ShortVarDeclContext _localctx = new ShortVarDeclContext(_ctx, getState()); - enterRule(_localctx, 166, RULE_shortVarDecl); + enterRule(_localctx, 168, RULE_shortVarDecl); try { enterOuterAlt(_localctx, 1); { - setState(1058); + setState(1070); maybeAddressableIdentifierList(); - setState(1059); + setState(1071); match(DECLARE_ASSIGN); - setState(1060); + setState(1072); expressionList(); } } @@ -5765,36 +5850,36 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverContext receiver() throws RecognitionException { ReceiverContext _localctx = new ReceiverContext(_ctx, getState()); - enterRule(_localctx, 168, RULE_receiver); + enterRule(_localctx, 170, RULE_receiver); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1062); + setState(1074); match(L_PAREN); - setState(1064); + setState(1076); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { case 1: { - setState(1063); + setState(1075); maybeAddressableIdentifier(); } break; } - setState(1066); + setState(1078); type_(); - setState(1068); + setState(1080); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1067); + setState(1079); match(COMMA); } } - setState(1070); + setState(1082); match(R_PAREN); } } @@ -5830,22 +5915,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 170, RULE_parameterDecl); + enterRule(_localctx, 172, RULE_parameterDecl); try { - setState(1074); + setState(1086); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1072); + setState(1084); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1073); + setState(1085); ghostParameterDecl(); } break; @@ -5883,21 +5968,21 @@ public T accept(ParseTreeVisitor visitor) { public final ActualParameterDeclContext actualParameterDecl() throws RecognitionException { ActualParameterDeclContext _localctx = new ActualParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 172, RULE_actualParameterDecl); + enterRule(_localctx, 174, RULE_actualParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(1077); + setState(1089); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { case 1: { - setState(1076); + setState(1088); identifierList(); } break; } - setState(1079); + setState(1091); parameterType(); } } @@ -5934,23 +6019,23 @@ public T accept(ParseTreeVisitor visitor) { public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionException { GhostParameterDeclContext _localctx = new GhostParameterDeclContext(_ctx, getState()); - enterRule(_localctx, 174, RULE_ghostParameterDecl); + enterRule(_localctx, 176, RULE_ghostParameterDecl); try { enterOuterAlt(_localctx, 1); { - setState(1081); + setState(1093); match(GHOST); - setState(1083); + setState(1095); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: { - setState(1082); + setState(1094); identifierList(); } break; } - setState(1085); + setState(1097); parameterType(); } } @@ -5984,22 +6069,22 @@ public T accept(ParseTreeVisitor visitor) { public final ParameterTypeContext parameterType() throws RecognitionException { ParameterTypeContext _localctx = new ParameterTypeContext(_ctx, getState()); - enterRule(_localctx, 176, RULE_parameterType); + enterRule(_localctx, 178, RULE_parameterType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1088); + setState(1100); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1087); + setState(1099); match(ELLIPSIS); } } - setState(1090); + setState(1102); type_(); } } @@ -6314,23 +6399,23 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _parentState = getState(); ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); ExpressionContext _prevctx = _localctx; - int _startState = 178; - enterRecursionRule(_localctx, 178, RULE_expression, _p); + int _startState = 180; + enterRecursionRule(_localctx, 180, RULE_expression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1113); + setState(1125); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { case 1: { _localctx = new UnaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1093); + setState(1105); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 127L) != 0)) ) { @@ -6341,7 +6426,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1094); + setState(1106); expression(15); } break; @@ -6350,7 +6435,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1095); + setState(1107); primaryExpr(0); } break; @@ -6359,13 +6444,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1096); + setState(1108); match(UNFOLDING); - setState(1097); + setState(1109); predicateAccess(); - setState(1098); + setState(1110); match(IN); - setState(1099); + setState(1111); expression(3); } break; @@ -6374,13 +6459,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1101); + setState(1113); match(LET); - setState(1102); + setState(1114); shortVarDecl(); - setState(1103); + setState(1115); match(IN); - setState(1104); + setState(1116); expression(2); } break; @@ -6389,7 +6474,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1106); + setState(1118); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -6399,38 +6484,38 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1107); + setState(1119); boundVariables(); - setState(1108); + setState(1120); match(COLON); - setState(1109); + setState(1121); match(COLON); - setState(1110); + setState(1122); triggers(); - setState(1111); + setState(1123); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1150); + setState(1162); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + _alt = getInterpreter().adaptivePredict(_input,91,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1148); + setState(1160); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1115); + setState(1127); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1116); + setState(1128); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & 1567L) != 0)) ) { @@ -6441,7 +6526,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1117); + setState(1129); expression(14); } break; @@ -6449,9 +6534,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1118); + setState(1130); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1119); + setState(1131); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); if ( !(_la==WAND || ((((_la - 117)) & ~0x3f) == 0 && ((1L << (_la - 117)) & 3674113L) != 0)) ) { @@ -6462,7 +6547,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1120); + setState(1132); expression(13); } break; @@ -6470,9 +6555,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1121); + setState(1133); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1122); + setState(1134); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { @@ -6483,7 +6568,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1123); + setState(1135); expression(12); } break; @@ -6491,9 +6576,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1124); + setState(1136); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1125); + setState(1137); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { @@ -6504,7 +6589,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1126); + setState(1138); expression(11); } break; @@ -6512,9 +6597,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1127); + setState(1139); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1128); + setState(1140); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 70931694131085315L) != 0)) ) { @@ -6525,7 +6610,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1129); + setState(1141); expression(10); } break; @@ -6533,11 +6618,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1130); + setState(1142); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1131); + setState(1143); match(LOGICAL_AND); - setState(1132); + setState(1144); expression(8); } break; @@ -6545,11 +6630,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1133); + setState(1145); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1134); + setState(1146); match(LOGICAL_OR); - setState(1135); + setState(1147); expression(7); } break; @@ -6557,11 +6642,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1136); + setState(1148); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1137); + setState(1149); match(IMPLIES); - setState(1138); + setState(1150); expression(5); } break; @@ -6569,15 +6654,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1139); + setState(1151); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1140); + setState(1152); match(QMARK); - setState(1141); + setState(1153); expression(0); - setState(1142); + setState(1154); match(COLON); - setState(1143); + setState(1155); expression(4); } break; @@ -6585,20 +6670,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1145); + setState(1157); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1146); + setState(1158); match(IMPL); - setState(1147); + setState(1159); closureSpecInstance(); } break; } } } - setState(1152); + setState(1164); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + _alt = getInterpreter().adaptivePredict(_input,91,_ctx); } } } @@ -6688,148 +6773,148 @@ public T accept(ParseTreeVisitor visitor) { public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); - enterRule(_localctx, 180, RULE_statement); + enterRule(_localctx, 182, RULE_statement); try { - setState(1173); + setState(1185); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,92,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1153); + setState(1165); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1154); + setState(1166); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1155); + setState(1167); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1156); + setState(1168); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1157); + setState(1169); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1158); + setState(1170); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1159); + setState(1171); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1160); + setState(1172); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1161); + setState(1173); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1162); + setState(1174); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1163); + setState(1175); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1164); + setState(1176); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1165); + setState(1177); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1166); + setState(1178); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1167); + setState(1179); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1168); + setState(1180); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1169); + setState(1181); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1170); + setState(1182); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1171); + setState(1183); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1172); + setState(1184); closureImplProofStmt(); } break; @@ -6865,13 +6950,13 @@ public T accept(ParseTreeVisitor visitor) { public final ApplyStmtContext applyStmt() throws RecognitionException { ApplyStmtContext _localctx = new ApplyStmtContext(_ctx, getState()); - enterRule(_localctx, 182, RULE_applyStmt); + enterRule(_localctx, 184, RULE_applyStmt); try { enterOuterAlt(_localctx, 1); { - setState(1175); + setState(1187); match(APPLY); - setState(1176); + setState(1188); expression(0); } } @@ -6908,20 +6993,20 @@ public T accept(ParseTreeVisitor visitor) { public final PackageStmtContext packageStmt() throws RecognitionException { PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState()); - enterRule(_localctx, 184, RULE_packageStmt); + enterRule(_localctx, 186, RULE_packageStmt); try { enterOuterAlt(_localctx, 1); { - setState(1178); + setState(1190); match(PACKAGE); - setState(1179); + setState(1191); expression(0); - setState(1181); + setState(1193); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(1180); + setState(1192); block(); } break; @@ -6960,13 +7045,13 @@ public T accept(ParseTreeVisitor visitor) { public final SpecForStmtContext specForStmt() throws RecognitionException { SpecForStmtContext _localctx = new SpecForStmtContext(_ctx, getState()); - enterRule(_localctx, 186, RULE_specForStmt); + enterRule(_localctx, 188, RULE_specForStmt); try { enterOuterAlt(_localctx, 1); { - setState(1183); + setState(1195); loopSpec(); - setState(1184); + setState(1196); forStmt(); } } @@ -7016,39 +7101,39 @@ public T accept(ParseTreeVisitor visitor) { public final LoopSpecContext loopSpec() throws RecognitionException { LoopSpecContext _localctx = new LoopSpecContext(_ctx, getState()); - enterRule(_localctx, 188, RULE_loopSpec); + enterRule(_localctx, 190, RULE_loopSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1192); + setState(1204); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1186); + setState(1198); match(INV); - setState(1187); + setState(1199); expression(0); - setState(1188); + setState(1200); eos(); } } - setState(1194); + setState(1206); _errHandler.sync(this); _la = _input.LA(1); } - setState(1199); + setState(1211); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1195); + setState(1207); match(DEC); - setState(1196); + setState(1208); terminationMeasure(); - setState(1197); + setState(1209); eos(); } } @@ -7091,27 +7176,27 @@ public T accept(ParseTreeVisitor visitor) { public final DeferStmtContext deferStmt() throws RecognitionException { DeferStmtContext _localctx = new DeferStmtContext(_ctx, getState()); - enterRule(_localctx, 190, RULE_deferStmt); + enterRule(_localctx, 192, RULE_deferStmt); int _la; try { - setState(1206); + setState(1218); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1201); + setState(1213); match(DEFER); - setState(1202); + setState(1214); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1203); + setState(1215); match(DEFER); - setState(1204); + setState(1216); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -7122,7 +7207,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1205); + setState(1217); predicateAccess(); } break; @@ -7166,64 +7251,64 @@ public T accept(ParseTreeVisitor visitor) { public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); - enterRule(_localctx, 192, RULE_basicLit); + enterRule(_localctx, 194, RULE_basicLit); try { - setState(1216); + setState(1228); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1208); + setState(1220); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1209); + setState(1221); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1210); + setState(1222); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1211); + setState(1223); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1212); + setState(1224); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1213); + setState(1225); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1214); + setState(1226); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1215); + setState(1227); match(RUNE_LIT); } break; @@ -7492,23 +7577,23 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _parentState = getState(); PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, _parentState); PrimaryExprContext _prevctx = _localctx; - int _startState = 194; - enterRecursionRule(_localctx, 194, RULE_primaryExpr, _p); + int _startState = 196; + enterRecursionRule(_localctx, 196, RULE_primaryExpr, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1234); + setState(1246); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { case 1: { _localctx = new OperandPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1219); + setState(1231); operand(); } break; @@ -7517,7 +7602,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1220); + setState(1232); conversion(); } break; @@ -7526,7 +7611,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1221); + setState(1233); methodExpr(); } break; @@ -7535,7 +7620,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1222); + setState(1234); ghostPrimaryExpr(); } break; @@ -7544,7 +7629,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1223); + setState(1235); new_(); } break; @@ -7553,7 +7638,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1224); + setState(1236); make(); } break; @@ -7562,11 +7647,11 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new RevealInvokePrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1225); + setState(1237); match(REVEAL); - setState(1226); + setState(1238); primaryExpr(0); - setState(1227); + setState(1239); arguments(); } break; @@ -7575,7 +7660,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1229); + setState(1241); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 46)) & ~0x3f) == 0 && ((1L << (_la - 46)) & 2251799813685321L) != 0)) ) { @@ -7586,36 +7671,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1230); + setState(1242); match(L_PAREN); - setState(1231); + setState(1243); expression(0); - setState(1232); + setState(1244); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1258); + setState(1270); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,97,_ctx); + _alt = getInterpreter().adaptivePredict(_input,100,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1256); + setState(1268); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1236); + setState(1248); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1237); + setState(1249); match(DOT); - setState(1238); + setState(1250); match(IDENTIFIER); } break; @@ -7623,9 +7708,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1239); + setState(1251); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1240); + setState(1252); index(); } break; @@ -7633,9 +7718,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1241); + setState(1253); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1242); + setState(1254); slice_(); } break; @@ -7643,9 +7728,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1243); + setState(1255); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1244); + setState(1256); seqUpdExp(); } break; @@ -7653,9 +7738,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1245); + setState(1257); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1246); + setState(1258); typeAssertion(); } break; @@ -7663,9 +7748,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1247); + setState(1259); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1248); + setState(1260); arguments(); } break; @@ -7673,13 +7758,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1249); + setState(1261); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1250); + setState(1262); arguments(); - setState(1251); + setState(1263); match(AS); - setState(1252); + setState(1264); closureSpecInstance(); } break; @@ -7687,18 +7772,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1254); + setState(1266); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1255); + setState(1267); predConstructArgs(); } break; } } } - setState(1260); + setState(1272); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,97,_ctx); + _alt = getInterpreter().adaptivePredict(_input,100,_ctx); } } } @@ -7735,13 +7820,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionLitContext functionLit() throws RecognitionException { FunctionLitContext _localctx = new FunctionLitContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_functionLit); + enterRule(_localctx, 198, RULE_functionLit); try { enterOuterAlt(_localctx, 1); { - setState(1261); + setState(1273); ((FunctionLitContext)_localctx).specification = specification(); - setState(1262); + setState(1274); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7784,32 +7869,32 @@ public T accept(ParseTreeVisitor visitor) { public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws RecognitionException { ClosureDeclContext _localctx = new ClosureDeclContext(_ctx, getState(), trusted, pure); - enterRule(_localctx, 198, RULE_closureDecl); + enterRule(_localctx, 200, RULE_closureDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1264); + setState(1276); match(FUNC); - setState(1266); + setState(1278); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1265); + setState(1277); match(IDENTIFIER); } } { - setState(1268); + setState(1280); signature(); - setState(1270); + setState(1282); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { case 1: { - setState(1269); + setState(1281); blockWithBodyParameterInfo(); } break; @@ -7849,34 +7934,34 @@ public T accept(ParseTreeVisitor visitor) { public final PredConstructArgsContext predConstructArgs() throws RecognitionException { PredConstructArgsContext _localctx = new PredConstructArgsContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_predConstructArgs); + enterRule(_localctx, 202, RULE_predConstructArgs); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1272); + setState(1284); match(L_PRED); - setState(1274); + setState(1286); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1273); + setState(1285); expressionList(); } } - setState(1277); + setState(1289); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1276); + setState(1288); match(COMMA); } } - setState(1279); + setState(1291); match(R_PRED); } } @@ -7933,52 +8018,52 @@ public T accept(ParseTreeVisitor visitor) { public final InterfaceTypeContext interfaceType() throws RecognitionException { InterfaceTypeContext _localctx = new InterfaceTypeContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_interfaceType); + enterRule(_localctx, 204, RULE_interfaceType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1281); + setState(1293); match(INTERFACE); - setState(1282); + setState(1294); match(L_CURLY); - setState(1292); + setState(1304); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 144115188210101760L) != 0) || ((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & 137438954753L) != 0)) { { { - setState(1286); + setState(1298); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,105,_ctx) ) { case 1: { - setState(1283); + setState(1295); methodSpec(); } break; case 2: { - setState(1284); + setState(1296); typeName(); } break; case 3: { - setState(1285); + setState(1297); predicateSpec(); } break; } - setState(1288); + setState(1300); eos(); } } - setState(1294); + setState(1306); _errHandler.sync(this); _la = _input.LA(1); } - setState(1295); + setState(1307); match(R_CURLY); } } @@ -8013,15 +8098,15 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateSpecContext predicateSpec() throws RecognitionException { PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState()); - enterRule(_localctx, 204, RULE_predicateSpec); + enterRule(_localctx, 206, RULE_predicateSpec); try { enterOuterAlt(_localctx, 1); { - setState(1297); + setState(1309); match(PRED); - setState(1298); + setState(1310); match(IDENTIFIER); - setState(1299); + setState(1311); parameters(); } } @@ -8062,53 +8147,53 @@ public T accept(ParseTreeVisitor visitor) { public final MethodSpecContext methodSpec() throws RecognitionException { MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_methodSpec); + enterRule(_localctx, 208, RULE_methodSpec); int _la; try { - setState(1316); + setState(1328); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1302); + setState(1314); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1301); + setState(1313); match(GHOST); } } - setState(1304); + setState(1316); specification(); - setState(1305); + setState(1317); match(IDENTIFIER); - setState(1306); + setState(1318); parameters(); - setState(1307); + setState(1319); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1310); + setState(1322); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1309); + setState(1321); match(GHOST); } } - setState(1312); + setState(1324); specification(); - setState(1313); + setState(1325); match(IDENTIFIER); - setState(1314); + setState(1326); parameters(); } break; @@ -8154,15 +8239,15 @@ public T accept(ParseTreeVisitor visitor) { public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); - enterRule(_localctx, 208, RULE_type_); + enterRule(_localctx, 210, RULE_type_); try { - setState(1325); + setState(1337); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1318); + setState(1330); typeName(); } break; @@ -8177,7 +8262,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1319); + setState(1331); typeLit(); } break; @@ -8192,18 +8277,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1320); + setState(1332); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1321); + setState(1333); match(L_PAREN); - setState(1322); + setState(1334); type_(); - setState(1323); + setState(1335); match(R_PAREN); } break; @@ -8264,71 +8349,71 @@ public T accept(ParseTreeVisitor visitor) { public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_typeLit); + enterRule(_localctx, 212, RULE_typeLit); try { - setState(1336); + setState(1348); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,111,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1327); + setState(1339); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1328); + setState(1340); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1329); + setState(1341); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1330); + setState(1342); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1331); + setState(1343); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1332); + setState(1344); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1333); + setState(1345); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1334); + setState(1346); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1335); + setState(1347); predType(); } break; @@ -8364,13 +8449,13 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeContext predType() throws RecognitionException { PredTypeContext _localctx = new PredTypeContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_predType); + enterRule(_localctx, 214, RULE_predType); try { enterOuterAlt(_localctx, 1); { - setState(1338); + setState(1350); match(PRED); - setState(1339); + setState(1351); predTypeParams(); } } @@ -8412,45 +8497,45 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeParamsContext predTypeParams() throws RecognitionException { PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_predTypeParams); + enterRule(_localctx, 216, RULE_predTypeParams); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1341); - match(L_PAREN); setState(1353); + match(L_PAREN); + setState(1365); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441151881345761731L) != 0)) { { - setState(1342); + setState(1354); type_(); - setState(1347); + setState(1359); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,109,_ctx); + _alt = getInterpreter().adaptivePredict(_input,112,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1343); + setState(1355); match(COMMA); - setState(1344); + setState(1356); type_(); } } } - setState(1349); + setState(1361); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,109,_ctx); + _alt = getInterpreter().adaptivePredict(_input,112,_ctx); } - setState(1351); + setState(1363); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1350); + setState(1362); match(COMMA); } } @@ -8458,7 +8543,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1355); + setState(1367); match(R_PAREN); } } @@ -8509,57 +8594,57 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_literalType); + enterRule(_localctx, 218, RULE_literalType); try { - setState(1364); + setState(1376); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1357); + setState(1369); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1358); + setState(1370); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1359); + setState(1371); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1360); + setState(1372); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1361); + setState(1373); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1362); + setState(1374); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1363); + setState(1375); typeName(); } break; @@ -8597,17 +8682,17 @@ public T accept(ParseTreeVisitor visitor) { public final ImplicitArrayContext implicitArray() throws RecognitionException { ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_implicitArray); + enterRule(_localctx, 220, RULE_implicitArray); try { enterOuterAlt(_localctx, 1); { - setState(1366); + setState(1378); match(L_BRACKET); - setState(1367); + setState(1379); match(ELLIPSIS); - setState(1368); + setState(1380); match(R_BRACKET); - setState(1369); + setState(1381); elementType(); } } @@ -8652,36 +8737,36 @@ public T accept(ParseTreeVisitor visitor) { public final Slice_Context slice_() throws RecognitionException { Slice_Context _localctx = new Slice_Context(_ctx, getState()); - enterRule(_localctx, 220, RULE_slice_); + enterRule(_localctx, 222, RULE_slice_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1371); + setState(1383); match(L_BRACKET); - setState(1387); + setState(1399); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { case 1: { - setState(1373); + setState(1385); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1372); + setState(1384); low(); } } - setState(1375); + setState(1387); match(COLON); - setState(1377); + setState(1389); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1376); + setState(1388); high(); } } @@ -8690,28 +8775,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1380); + setState(1392); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1379); + setState(1391); low(); } } - setState(1382); + setState(1394); match(COLON); - setState(1383); + setState(1395); high(); - setState(1384); + setState(1396); match(COLON); - setState(1385); + setState(1397); cap(); } break; } - setState(1389); + setState(1401); match(R_BRACKET); } } @@ -8744,11 +8829,11 @@ public T accept(ParseTreeVisitor visitor) { public final LowContext low() throws RecognitionException { LowContext _localctx = new LowContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_low); + enterRule(_localctx, 224, RULE_low); try { enterOuterAlt(_localctx, 1); { - setState(1391); + setState(1403); expression(0); } } @@ -8781,11 +8866,11 @@ public T accept(ParseTreeVisitor visitor) { public final HighContext high() throws RecognitionException { HighContext _localctx = new HighContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_high); + enterRule(_localctx, 226, RULE_high); try { enterOuterAlt(_localctx, 1); { - setState(1393); + setState(1405); expression(0); } } @@ -8818,11 +8903,11 @@ public T accept(ParseTreeVisitor visitor) { public final CapContext cap() throws RecognitionException { CapContext _localctx = new CapContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_cap); + enterRule(_localctx, 228, RULE_cap); try { enterOuterAlt(_localctx, 1); { - setState(1395); + setState(1407); expression(0); } } @@ -8865,17 +8950,17 @@ public T accept(ParseTreeVisitor visitor) { public final Assign_opContext assign_op() throws RecognitionException { Assign_opContext _localctx = new Assign_opContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_assign_op); + enterRule(_localctx, 230, RULE_assign_op); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1398); + setState(1410); _errHandler.sync(this); _la = _input.LA(1); if (((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & 4031L) != 0)) { { - setState(1397); + setState(1409); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & 4031L) != 0)) ) { @@ -8889,7 +8974,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1400); + setState(1412); match(ASSIGN); } } @@ -8933,48 +9018,48 @@ public T accept(ParseTreeVisitor visitor) { public final RangeClauseContext rangeClause() throws RecognitionException { RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_rangeClause); + enterRule(_localctx, 232, RULE_rangeClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1408); + setState(1420); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { case 1: { - setState(1402); + setState(1414); expressionList(); - setState(1403); + setState(1415); match(ASSIGN); } break; case 2: { - setState(1405); + setState(1417); maybeAddressableIdentifierList(); - setState(1406); + setState(1418); match(DECLARE_ASSIGN); } break; } - setState(1410); + setState(1422); match(RANGE); - setState(1411); + setState(1423); expression(0); - setState(1416); + setState(1428); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1412); + setState(1424); match(WITH); - setState(1414); + setState(1426); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1413); + setState(1425); match(IDENTIFIER); } } @@ -9013,13 +9098,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_packageClause); + enterRule(_localctx, 234, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1418); + setState(1430); match(PACKAGE); - setState(1419); + setState(1431); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -9052,11 +9137,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_importPath); + enterRule(_localctx, 236, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1421); + setState(1433); string_(); } } @@ -9095,29 +9180,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_declaration); + enterRule(_localctx, 238, RULE_declaration); try { - setState(1426); + setState(1438); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1423); + setState(1435); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1424); + setState(1436); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1425); + setState(1437); varDecl(); } break; @@ -9166,43 +9251,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_constDecl); + enterRule(_localctx, 240, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1428); - match(CONST); setState(1440); + match(CONST); + setState(1452); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1429); + setState(1441); constSpec(); } break; case L_PAREN: { - setState(1430); + setState(1442); match(L_PAREN); - setState(1436); + setState(1448); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1431); + setState(1443); constSpec(); - setState(1432); + setState(1444); eos(); } } - setState(1438); + setState(1450); _errHandler.sync(this); _la = _input.LA(1); } - setState(1439); + setState(1451); match(R_PAREN); } break; @@ -9247,31 +9332,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_constSpec); + enterRule(_localctx, 242, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1442); + setState(1454); identifierList(); - setState(1448); + setState(1460); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { case 1: { - setState(1444); + setState(1456); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441151881345761731L) != 0)) { { - setState(1443); + setState(1455); type_(); } } - setState(1446); + setState(1458); match(ASSIGN); - setState(1447); + setState(1459); expressionList(); } break; @@ -9312,30 +9397,30 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_identifierList); + enterRule(_localctx, 244, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1450); + setState(1462); match(IDENTIFIER); - setState(1455); + setState(1467); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,126,_ctx); + _alt = getInterpreter().adaptivePredict(_input,129,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1451); + setState(1463); match(COMMA); - setState(1452); + setState(1464); match(IDENTIFIER); } } } - setState(1457); + setState(1469); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,126,_ctx); + _alt = getInterpreter().adaptivePredict(_input,129,_ctx); } } } @@ -9375,30 +9460,30 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_expressionList); + enterRule(_localctx, 246, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1458); + setState(1470); expression(0); - setState(1463); + setState(1475); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,127,_ctx); + _alt = getInterpreter().adaptivePredict(_input,130,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1459); + setState(1471); match(COMMA); - setState(1460); + setState(1472); expression(0); } } } - setState(1465); + setState(1477); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,127,_ctx); + _alt = getInterpreter().adaptivePredict(_input,130,_ctx); } } } @@ -9443,43 +9528,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_typeDecl); + enterRule(_localctx, 248, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1466); - match(TYPE); setState(1478); + match(TYPE); + setState(1490); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1467); + setState(1479); typeSpec(); } break; case L_PAREN: { - setState(1468); + setState(1480); match(L_PAREN); - setState(1474); + setState(1486); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1469); + setState(1481); typeSpec(); - setState(1470); + setState(1482); eos(); } } - setState(1476); + setState(1488); _errHandler.sync(this); _la = _input.LA(1); } - setState(1477); + setState(1489); match(R_PAREN); } break; @@ -9519,24 +9604,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_typeSpec); + enterRule(_localctx, 250, RULE_typeSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1480); + setState(1492); match(IDENTIFIER); - setState(1482); + setState(1494); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1481); + setState(1493); match(ASSIGN); } } - setState(1484); + setState(1496); type_(); } } @@ -9581,43 +9666,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_varDecl); + enterRule(_localctx, 252, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1486); - match(VAR); setState(1498); + match(VAR); + setState(1510); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1487); + setState(1499); varSpec(); } break; case L_PAREN: { - setState(1488); + setState(1500); match(L_PAREN); - setState(1494); + setState(1506); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1489); + setState(1501); varSpec(); - setState(1490); + setState(1502); eos(); } } - setState(1496); + setState(1508); _errHandler.sync(this); _la = _input.LA(1); } - setState(1497); + setState(1509); match(R_PAREN); } break; @@ -9657,23 +9742,23 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_block); + enterRule(_localctx, 254, RULE_block); try { enterOuterAlt(_localctx, 1); { - setState(1500); + setState(1512); match(L_CURLY); - setState(1502); + setState(1514); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { case 1: { - setState(1501); + setState(1513); statementList(); } break; } - setState(1504); + setState(1516); match(R_CURLY); } } @@ -9723,13 +9808,13 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_statementList); + enterRule(_localctx, 256, RULE_statementList); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1518); + setState(1530); _errHandler.sync(this); _alt = 1; do { @@ -9737,17 +9822,17 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1513); + setState(1525); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: { - setState(1507); + setState(1519); _errHandler.sync(this); _la = _input.LA(1); if (_la==SEMI) { { - setState(1506); + setState(1518); match(SEMI); } } @@ -9756,12 +9841,12 @@ public final StatementListContext statementList() throws RecognitionException { break; case 2: { - setState(1510); + setState(1522); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOS) { { - setState(1509); + setState(1521); match(EOS); } } @@ -9770,14 +9855,14 @@ public final StatementListContext statementList() throws RecognitionException { break; case 3: { - setState(1512); + setState(1524); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; } - setState(1515); + setState(1527); statement(); - setState(1516); + setState(1528); eos(); } } @@ -9785,9 +9870,9 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1520); + setState(1532); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,137,_ctx); + _alt = getInterpreter().adaptivePredict(_input,140,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -9832,43 +9917,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_simpleStmt); + enterRule(_localctx, 258, RULE_simpleStmt); try { - setState(1527); + setState(1539); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1522); + setState(1534); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1523); + setState(1535); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1524); + setState(1536); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1525); + setState(1537); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1526); + setState(1538); shortVarDecl(); } break; @@ -9903,11 +9988,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_expressionStmt); + enterRule(_localctx, 260, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1529); + setState(1541); expression(0); } } @@ -9945,15 +10030,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_sendStmt); + enterRule(_localctx, 262, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1531); + setState(1543); ((SendStmtContext)_localctx).channel = expression(0); - setState(1532); + setState(1544); match(RECEIVE); - setState(1533); + setState(1545); expression(0); } } @@ -9988,14 +10073,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_incDecStmt); + enterRule(_localctx, 264, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1535); + setState(1547); expression(0); - setState(1536); + setState(1548); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -10042,15 +10127,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_assignment); + enterRule(_localctx, 266, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1538); + setState(1550); expressionList(); - setState(1539); + setState(1551); assign_op(); - setState(1540); + setState(1552); expressionList(); } } @@ -10082,12 +10167,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_emptyStmt); + enterRule(_localctx, 268, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1542); + setState(1554); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -10130,20 +10215,20 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_labeledStmt); + enterRule(_localctx, 270, RULE_labeledStmt); try { enterOuterAlt(_localctx, 1); { - setState(1544); + setState(1556); match(IDENTIFIER); - setState(1545); + setState(1557); match(COLON); - setState(1547); + setState(1559); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1546); + setState(1558); statement(); } break; @@ -10180,18 +10265,18 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_returnStmt); + enterRule(_localctx, 272, RULE_returnStmt); try { enterOuterAlt(_localctx, 1); { - setState(1549); + setState(1561); match(RETURN); - setState(1551); + setState(1563); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: { - setState(1550); + setState(1562); expressionList(); } break; @@ -10226,18 +10311,18 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_breakStmt); + enterRule(_localctx, 274, RULE_breakStmt); try { enterOuterAlt(_localctx, 1); { - setState(1553); + setState(1565); match(BREAK); - setState(1555); + setState(1567); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { case 1: { - setState(1554); + setState(1566); match(IDENTIFIER); } break; @@ -10272,18 +10357,18 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_continueStmt); + enterRule(_localctx, 276, RULE_continueStmt); try { enterOuterAlt(_localctx, 1); { - setState(1557); + setState(1569); match(CONTINUE); - setState(1559); + setState(1571); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1558); + setState(1570); match(IDENTIFIER); } break; @@ -10318,13 +10403,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_gotoStmt); + enterRule(_localctx, 278, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1561); + setState(1573); match(GOTO); - setState(1562); + setState(1574); match(IDENTIFIER); } } @@ -10355,11 +10440,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 278, RULE_fallthroughStmt); + enterRule(_localctx, 280, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1564); + setState(1576); match(FALLTHROUGH); } } @@ -10409,61 +10494,61 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 280, RULE_ifStmt); + enterRule(_localctx, 282, RULE_ifStmt); try { enterOuterAlt(_localctx, 1); { - setState(1566); + setState(1578); match(IF); - setState(1575); + setState(1587); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1567); + setState(1579); expression(0); } break; case 2: { - setState(1568); + setState(1580); eos(); - setState(1569); + setState(1581); expression(0); } break; case 3: { - setState(1571); + setState(1583); simpleStmt(); - setState(1572); + setState(1584); eos(); - setState(1573); + setState(1585); expression(0); } break; } - setState(1577); + setState(1589); block(); - setState(1583); + setState(1595); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1578); + setState(1590); match(ELSE); - setState(1581); + setState(1593); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1579); + setState(1591); ifStmt(); } break; case L_CURLY: { - setState(1580); + setState(1592); block(); } break; @@ -10507,22 +10592,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 282, RULE_switchStmt); + enterRule(_localctx, 284, RULE_switchStmt); try { - setState(1587); + setState(1599); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1585); + setState(1597); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1586); + setState(1598); typeSwitchStmt(); } break; @@ -10572,24 +10657,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 284, RULE_exprSwitchStmt); + enterRule(_localctx, 286, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1589); + setState(1601); match(SWITCH); - setState(1600); + setState(1612); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { case 1: { - setState(1591); + setState(1603); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1590); + setState(1602); expression(0); } } @@ -10598,24 +10683,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1594); + setState(1606); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { case 1: { - setState(1593); + setState(1605); simpleStmt(); } break; } - setState(1596); + setState(1608); eos(); - setState(1598); + setState(1610); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1597); + setState(1609); expression(0); } } @@ -10623,23 +10708,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1602); + setState(1614); match(L_CURLY); - setState(1606); + setState(1618); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1603); + setState(1615); exprCaseClause(); } } - setState(1608); + setState(1620); _errHandler.sync(this); _la = _input.LA(1); } - setState(1609); + setState(1621); match(R_CURLY); } } @@ -10676,20 +10761,20 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 286, RULE_exprCaseClause); + enterRule(_localctx, 288, RULE_exprCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1611); + setState(1623); exprSwitchCase(); - setState(1612); + setState(1624); match(COLON); - setState(1614); + setState(1626); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { case 1: { - setState(1613); + setState(1625); statementList(); } break; @@ -10727,24 +10812,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_exprSwitchCase); + enterRule(_localctx, 290, RULE_exprSwitchCase); try { - setState(1619); + setState(1631); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1616); + setState(1628); match(CASE); - setState(1617); + setState(1629); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1618); + setState(1630); match(DEFAULT); } break; @@ -10796,58 +10881,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 290, RULE_typeSwitchStmt); + enterRule(_localctx, 292, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1621); + setState(1633); match(SWITCH); - setState(1630); + setState(1642); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,154,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: { - setState(1622); + setState(1634); typeSwitchGuard(); } break; case 2: { - setState(1623); + setState(1635); eos(); - setState(1624); + setState(1636); typeSwitchGuard(); } break; case 3: { - setState(1626); + setState(1638); simpleStmt(); - setState(1627); + setState(1639); eos(); - setState(1628); + setState(1640); typeSwitchGuard(); } break; } - setState(1632); + setState(1644); match(L_CURLY); - setState(1636); + setState(1648); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1633); + setState(1645); typeCaseClause(); } } - setState(1638); + setState(1650); _errHandler.sync(this); _la = _input.LA(1); } - setState(1639); + setState(1651); match(R_CURLY); } } @@ -10886,31 +10971,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 292, RULE_typeSwitchGuard); + enterRule(_localctx, 294, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1643); + setState(1655); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { case 1: { - setState(1641); + setState(1653); match(IDENTIFIER); - setState(1642); + setState(1654); match(DECLARE_ASSIGN); } break; } - setState(1645); + setState(1657); primaryExpr(0); - setState(1646); + setState(1658); match(DOT); - setState(1647); + setState(1659); match(L_PAREN); - setState(1648); + setState(1660); match(TYPE); - setState(1649); + setState(1661); match(R_PAREN); } } @@ -10947,20 +11032,20 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 294, RULE_typeCaseClause); + enterRule(_localctx, 296, RULE_typeCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1651); + setState(1663); typeSwitchCase(); - setState(1652); + setState(1664); match(COLON); - setState(1654); + setState(1666); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: { - setState(1653); + setState(1665); statementList(); } break; @@ -10998,24 +11083,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 296, RULE_typeSwitchCase); + enterRule(_localctx, 298, RULE_typeSwitchCase); try { - setState(1659); + setState(1671); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1656); + setState(1668); match(CASE); - setState(1657); + setState(1669); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1658); + setState(1670); match(DEFAULT); } break; @@ -11063,12 +11148,12 @@ public T accept(ParseTreeVisitor visitor) { public final TypeListContext typeList() throws RecognitionException { TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 298, RULE_typeList); + enterRule(_localctx, 300, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1663); + setState(1675); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -11092,28 +11177,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1661); + setState(1673); type_(); } break; case NIL_LIT: { - setState(1662); + setState(1674); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1672); + setState(1684); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1665); + setState(1677); match(COMMA); - setState(1668); + setState(1680); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -11137,13 +11222,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1666); + setState(1678); type_(); } break; case NIL_LIT: { - setState(1667); + setState(1679); match(NIL_LIT); } break; @@ -11152,7 +11237,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1674); + setState(1686); _errHandler.sync(this); _la = _input.LA(1); } @@ -11193,30 +11278,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 300, RULE_selectStmt); + enterRule(_localctx, 302, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1675); + setState(1687); match(SELECT); - setState(1676); + setState(1688); match(L_CURLY); - setState(1680); + setState(1692); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1677); + setState(1689); commClause(); } } - setState(1682); + setState(1694); _errHandler.sync(this); _la = _input.LA(1); } - setState(1683); + setState(1695); match(R_CURLY); } } @@ -11253,20 +11338,20 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 302, RULE_commClause); + enterRule(_localctx, 304, RULE_commClause); try { enterOuterAlt(_localctx, 1); { - setState(1685); + setState(1697); commCase(); - setState(1686); + setState(1698); match(COLON); - setState(1688); + setState(1700); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { case 1: { - setState(1687); + setState(1699); statementList(); } break; @@ -11307,28 +11392,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 304, RULE_commCase); + enterRule(_localctx, 306, RULE_commCase); try { - setState(1696); + setState(1708); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1690); + setState(1702); match(CASE); - setState(1693); + setState(1705); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { case 1: { - setState(1691); + setState(1703); sendStmt(); } break; case 2: { - setState(1692); + setState(1704); recvStmt(); } break; @@ -11338,7 +11423,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1695); + setState(1707); match(DEFAULT); } break; @@ -11384,31 +11469,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_recvStmt); + enterRule(_localctx, 308, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1704); + setState(1716); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: { - setState(1698); + setState(1710); expressionList(); - setState(1699); + setState(1711); match(ASSIGN); } break; case 2: { - setState(1701); + setState(1713); identifierList(); - setState(1702); + setState(1714); match(DECLARE_ASSIGN); } break; } - setState(1706); + setState(1718); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -11451,24 +11536,24 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_forStmt); + enterRule(_localctx, 310, RULE_forStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1708); + setState(1720); match(FOR); - setState(1716); + setState(1728); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) { case 1: { - setState(1710); + setState(1722); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1709); + setState(1721); expression(0); } } @@ -11477,18 +11562,18 @@ public final ForStmtContext forStmt() throws RecognitionException { break; case 2: { - setState(1712); + setState(1724); forClause(); } break; case 3: { - setState(1714); + setState(1726); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1713); + setState(1725); rangeClause(); } } @@ -11496,7 +11581,7 @@ public final ForStmtContext forStmt() throws RecognitionException { } break; } - setState(1718); + setState(1730); block(); } } @@ -11543,41 +11628,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_forClause); + enterRule(_localctx, 312, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1721); + setState(1733); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) { case 1: { - setState(1720); + setState(1732); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1723); + setState(1735); eos(); - setState(1725); + setState(1737); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { case 1: { - setState(1724); + setState(1736); expression(0); } break; } - setState(1727); + setState(1739); eos(); - setState(1729); + setState(1741); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1728); + setState(1740); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -11614,13 +11699,13 @@ public T accept(ParseTreeVisitor visitor) { public final GoStmtContext goStmt() throws RecognitionException { GoStmtContext _localctx = new GoStmtContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_goStmt); + enterRule(_localctx, 314, RULE_goStmt); try { enterOuterAlt(_localctx, 1); { - setState(1731); + setState(1743); match(GO); - setState(1732); + setState(1744); expression(0); } } @@ -11654,22 +11739,22 @@ public T accept(ParseTreeVisitor visitor) { public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_typeName); + enterRule(_localctx, 316, RULE_typeName); try { - setState(1736); + setState(1748); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1734); + setState(1746); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1735); + setState(1747); match(IDENTIFIER); } break; @@ -11709,17 +11794,17 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayTypeContext arrayType() throws RecognitionException { ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_arrayType); + enterRule(_localctx, 318, RULE_arrayType); try { enterOuterAlt(_localctx, 1); { - setState(1738); + setState(1750); match(L_BRACKET); - setState(1739); + setState(1751); arrayLength(); - setState(1740); + setState(1752); match(R_BRACKET); - setState(1741); + setState(1753); elementType(); } } @@ -11752,11 +11837,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayLengthContext arrayLength() throws RecognitionException { ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_arrayLength); + enterRule(_localctx, 320, RULE_arrayLength); try { enterOuterAlt(_localctx, 1); { - setState(1743); + setState(1755); expression(0); } } @@ -11789,11 +11874,11 @@ public T accept(ParseTreeVisitor visitor) { public final ElementTypeContext elementType() throws RecognitionException { ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_elementType); + enterRule(_localctx, 322, RULE_elementType); try { enterOuterAlt(_localctx, 1); { - setState(1745); + setState(1757); type_(); } } @@ -11827,13 +11912,13 @@ public T accept(ParseTreeVisitor visitor) { public final PointerTypeContext pointerType() throws RecognitionException { PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_pointerType); + enterRule(_localctx, 324, RULE_pointerType); try { enterOuterAlt(_localctx, 1); { - setState(1747); + setState(1759); match(STAR); - setState(1748); + setState(1760); type_(); } } @@ -11868,15 +11953,15 @@ public T accept(ParseTreeVisitor visitor) { public final SliceTypeContext sliceType() throws RecognitionException { SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_sliceType); + enterRule(_localctx, 326, RULE_sliceType); try { enterOuterAlt(_localctx, 1); { - setState(1750); + setState(1762); match(L_BRACKET); - setState(1751); + setState(1763); match(R_BRACKET); - setState(1752); + setState(1764); elementType(); } } @@ -11915,19 +12000,19 @@ public T accept(ParseTreeVisitor visitor) { public final MapTypeContext mapType() throws RecognitionException { MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_mapType); + enterRule(_localctx, 328, RULE_mapType); try { enterOuterAlt(_localctx, 1); { - setState(1754); + setState(1766); match(MAP); - setState(1755); + setState(1767); match(L_BRACKET); - setState(1756); + setState(1768); type_(); - setState(1757); + setState(1769); match(R_BRACKET); - setState(1758); + setState(1770); elementType(); } } @@ -11962,37 +12047,37 @@ public T accept(ParseTreeVisitor visitor) { public final ChannelTypeContext channelType() throws RecognitionException { ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_channelType); + enterRule(_localctx, 330, RULE_channelType); try { enterOuterAlt(_localctx, 1); { - setState(1765); + setState(1777); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,177,_ctx) ) { case 1: { - setState(1760); + setState(1772); match(CHAN); } break; case 2: { - setState(1761); + setState(1773); match(CHAN); - setState(1762); + setState(1774); match(RECEIVE); } break; case 3: { - setState(1763); + setState(1775); match(RECEIVE); - setState(1764); + setState(1776); match(CHAN); } break; } - setState(1767); + setState(1779); elementType(); } } @@ -12026,13 +12111,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTypeContext functionType() throws RecognitionException { FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_functionType); + enterRule(_localctx, 332, RULE_functionType); try { enterOuterAlt(_localctx, 1); { - setState(1769); + setState(1781); match(FUNC); - setState(1770); + setState(1782); signature(); } } @@ -12068,24 +12153,24 @@ public T accept(ParseTreeVisitor visitor) { public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_signature); + enterRule(_localctx, 334, RULE_signature); try { - setState(1776); + setState(1788); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,175,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1772); + setState(1784); parameters(); - setState(1773); + setState(1785); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1775); + setState(1787); parameters(); } break; @@ -12123,22 +12208,22 @@ public T accept(ParseTreeVisitor visitor) { public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); - enterRule(_localctx, 334, RULE_result); + enterRule(_localctx, 336, RULE_result); try { - setState(1780); + setState(1792); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1778); + setState(1790); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1779); + setState(1791); type_(); } break; @@ -12182,45 +12267,45 @@ public T accept(ParseTreeVisitor visitor) { public final ParametersContext parameters() throws RecognitionException { ParametersContext _localctx = new ParametersContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_parameters); + enterRule(_localctx, 338, RULE_parameters); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1782); - match(L_PAREN); setState(1794); + match(L_PAREN); + setState(1806); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441152431101575619L) != 0)) { { - setState(1783); + setState(1795); parameterDecl(); - setState(1788); + setState(1800); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,177,_ctx); + _alt = getInterpreter().adaptivePredict(_input,180,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1784); + setState(1796); match(COMMA); - setState(1785); + setState(1797); parameterDecl(); } } } - setState(1790); + setState(1802); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,177,_ctx); + _alt = getInterpreter().adaptivePredict(_input,180,_ctx); } - setState(1792); + setState(1804); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1791); + setState(1803); match(COMMA); } } @@ -12228,7 +12313,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1796); + setState(1808); match(R_PAREN); } } @@ -12267,28 +12352,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConversionContext conversion() throws RecognitionException { ConversionContext _localctx = new ConversionContext(_ctx, getState()); - enterRule(_localctx, 338, RULE_conversion); + enterRule(_localctx, 340, RULE_conversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1798); + setState(1810); nonNamedType(); - setState(1799); + setState(1811); match(L_PAREN); - setState(1800); + setState(1812); expression(0); - setState(1802); + setState(1814); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1801); + setState(1813); match(COMMA); } } - setState(1804); + setState(1816); match(R_PAREN); } } @@ -12326,9 +12411,9 @@ public T accept(ParseTreeVisitor visitor) { public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_nonNamedType); + enterRule(_localctx, 342, RULE_nonNamedType); try { - setState(1811); + setState(1823); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -12342,18 +12427,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1806); + setState(1818); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1807); + setState(1819); match(L_PAREN); - setState(1808); + setState(1820); nonNamedType(); - setState(1809); + setState(1821); match(R_PAREN); } break; @@ -12398,33 +12483,33 @@ public T accept(ParseTreeVisitor visitor) { public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_operand); + enterRule(_localctx, 344, RULE_operand); try { - setState(1819); + setState(1831); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,182,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1813); + setState(1825); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1814); + setState(1826); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1815); + setState(1827); match(L_PAREN); - setState(1816); + setState(1828); expression(0); - setState(1817); + setState(1829); match(R_PAREN); } break; @@ -12465,9 +12550,9 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_literal); + enterRule(_localctx, 346, RULE_literal); try { - setState(1824); + setState(1836); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12484,7 +12569,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1821); + setState(1833); basicLit(); } break; @@ -12503,7 +12588,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1822); + setState(1834); compositeLit(); } break; @@ -12518,7 +12603,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1823); + setState(1835); functionLit(); } break; @@ -12558,12 +12643,12 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerContext integer() throws RecognitionException { IntegerContext _localctx = new IntegerContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_integer); + enterRule(_localctx, 348, RULE_integer); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1826); + setState(1838); _la = _input.LA(1); if ( !(((((_la - 142)) & ~0x3f) == 0 && ((1L << (_la - 142)) & 111L) != 0)) ) { _errHandler.recoverInline(this); @@ -12602,11 +12687,11 @@ public T accept(ParseTreeVisitor visitor) { public final OperandNameContext operandName() throws RecognitionException { OperandNameContext _localctx = new OperandNameContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_operandName); + enterRule(_localctx, 350, RULE_operandName); try { enterOuterAlt(_localctx, 1); { - setState(1828); + setState(1840); match(IDENTIFIER); } } @@ -12641,15 +12726,15 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedIdentContext qualifiedIdent() throws RecognitionException { QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState()); - enterRule(_localctx, 350, RULE_qualifiedIdent); + enterRule(_localctx, 352, RULE_qualifiedIdent); try { enterOuterAlt(_localctx, 1); { - setState(1830); + setState(1842); match(IDENTIFIER); - setState(1831); + setState(1843); match(DOT); - setState(1832); + setState(1844); match(IDENTIFIER); } } @@ -12685,13 +12770,13 @@ public T accept(ParseTreeVisitor visitor) { public final CompositeLitContext compositeLit() throws RecognitionException { CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState()); - enterRule(_localctx, 352, RULE_compositeLit); + enterRule(_localctx, 354, RULE_compositeLit); try { enterOuterAlt(_localctx, 1); { - setState(1834); + setState(1846); literalType(); - setState(1835); + setState(1847); literalValue(); } } @@ -12727,26 +12812,26 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralValueContext literalValue() throws RecognitionException { LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState()); - enterRule(_localctx, 354, RULE_literalValue); + enterRule(_localctx, 356, RULE_literalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1837); + setState(1849); match(L_CURLY); - setState(1842); + setState(1854); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 23920835140615L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1838); + setState(1850); elementList(); - setState(1840); + setState(1852); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1839); + setState(1851); match(COMMA); } } @@ -12754,7 +12839,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1844); + setState(1856); match(R_CURLY); } } @@ -12794,30 +12879,30 @@ public T accept(ParseTreeVisitor visitor) { public final ElementListContext elementList() throws RecognitionException { ElementListContext _localctx = new ElementListContext(_ctx, getState()); - enterRule(_localctx, 356, RULE_elementList); + enterRule(_localctx, 358, RULE_elementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1846); + setState(1858); keyedElement(); - setState(1851); + setState(1863); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,186,_ctx); + _alt = getInterpreter().adaptivePredict(_input,189,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1847); + setState(1859); match(COMMA); - setState(1848); + setState(1860); keyedElement(); } } } - setState(1853); + setState(1865); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,186,_ctx); + _alt = getInterpreter().adaptivePredict(_input,189,_ctx); } } } @@ -12854,23 +12939,23 @@ public T accept(ParseTreeVisitor visitor) { public final KeyedElementContext keyedElement() throws RecognitionException { KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState()); - enterRule(_localctx, 358, RULE_keyedElement); + enterRule(_localctx, 360, RULE_keyedElement); try { enterOuterAlt(_localctx, 1); { - setState(1857); + setState(1869); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,187,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,190,_ctx) ) { case 1: { - setState(1854); + setState(1866); key(); - setState(1855); + setState(1867); match(COLON); } break; } - setState(1859); + setState(1871); element(); } } @@ -12906,9 +12991,9 @@ public T accept(ParseTreeVisitor visitor) { public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); - enterRule(_localctx, 360, RULE_key); + enterRule(_localctx, 362, RULE_key); try { - setState(1863); + setState(1875); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12980,14 +13065,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1861); + setState(1873); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1862); + setState(1874); literalValue(); } break; @@ -13027,9 +13112,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 362, RULE_element); + enterRule(_localctx, 364, RULE_element); try { - setState(1867); + setState(1879); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -13101,14 +13186,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1865); + setState(1877); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1866); + setState(1878); literalValue(); } break; @@ -13157,32 +13242,32 @@ public T accept(ParseTreeVisitor visitor) { public final StructTypeContext structType() throws RecognitionException { StructTypeContext _localctx = new StructTypeContext(_ctx, getState()); - enterRule(_localctx, 364, RULE_structType); + enterRule(_localctx, 366, RULE_structType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1869); + setState(1881); match(STRUCT); - setState(1870); + setState(1882); match(L_CURLY); - setState(1876); + setState(1888); _errHandler.sync(this); _la = _input.LA(1); - while (_la==IDENTIFIER || _la==STAR) { + while (_la==GHOST || _la==IDENTIFIER || _la==STAR) { { { - setState(1871); + setState(1883); fieldDecl(); - setState(1872); + setState(1884); eos(); } } - setState(1878); + setState(1890); _errHandler.sync(this); _la = _input.LA(1); } - setState(1879); + setState(1891); match(R_CURLY); } } @@ -13197,79 +13282,6 @@ public final StructTypeContext structType() throws RecognitionException { return _localctx; } - @SuppressWarnings("CheckReturnValue") - public static class FieldDeclContext extends ParserRuleContext { - public String_Context tag; - public IdentifierListContext identifierList() { - return getRuleContext(IdentifierListContext.class,0); - } - public Type_Context type_() { - return getRuleContext(Type_Context.class,0); - } - public EmbeddedFieldContext embeddedField() { - return getRuleContext(EmbeddedFieldContext.class,0); - } - public String_Context string_() { - return getRuleContext(String_Context.class,0); - } - public FieldDeclContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_fieldDecl; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitFieldDecl(this); - else return visitor.visitChildren(this); - } - } - - public final FieldDeclContext fieldDecl() throws RecognitionException { - FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); - enterRule(_localctx, 366, RULE_fieldDecl); - try { - enterOuterAlt(_localctx, 1); - { - setState(1885); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,191,_ctx) ) { - case 1: - { - setState(1881); - identifierList(); - setState(1882); - type_(); - } - break; - case 2: - { - setState(1884); - embeddedField(); - } - break; - } - setState(1888); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,192,_ctx) ) { - case 1: - { - setState(1887); - ((FieldDeclContext)_localctx).tag = string_(); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - @SuppressWarnings("CheckReturnValue") public static class String_Context extends ParserRuleContext { public TerminalNode RAW_STRING_LIT() { return getToken(GobraParser.RAW_STRING_LIT, 0); } @@ -13292,7 +13304,7 @@ public final String_Context string_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1890); + setState(1893); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -13339,17 +13351,17 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1893); + setState(1896); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1892); + setState(1895); match(STAR); } } - setState(1895); + setState(1898); typeName(); } } @@ -13388,11 +13400,11 @@ public final IndexContext index() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1897); + setState(1900); match(L_BRACKET); - setState(1898); + setState(1901); expression(0); - setState(1899); + setState(1902); match(R_BRACKET); } } @@ -13432,13 +13444,13 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1901); + setState(1904); match(DOT); - setState(1902); + setState(1905); match(L_PAREN); - setState(1903); + setState(1906); type_(); - setState(1904); + setState(1907); match(R_PAREN); } } @@ -13486,34 +13498,34 @@ public final ArgumentsContext arguments() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1906); + setState(1909); match(L_PAREN); - setState(1921); + setState(1924); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1913); + setState(1916); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,195,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,196,_ctx) ) { case 1: { - setState(1907); + setState(1910); expressionList(); } break; case 2: { - setState(1908); - nonNamedType(); setState(1911); + nonNamedType(); + setState(1914); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,194,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,195,_ctx) ) { case 1: { - setState(1909); + setState(1912); match(COMMA); - setState(1910); + setState(1913); expressionList(); } break; @@ -13521,22 +13533,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1916); + setState(1919); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1915); + setState(1918); match(ELLIPSIS); } } - setState(1919); + setState(1922); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1918); + setState(1921); match(COMMA); } } @@ -13544,7 +13556,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1923); + setState(1926); match(R_PAREN); } } @@ -13583,11 +13595,11 @@ public final MethodExprContext methodExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1925); + setState(1928); nonNamedType(); - setState(1926); + setState(1929); match(DOT); - setState(1927); + setState(1930); match(IDENTIFIER); } } @@ -13624,7 +13636,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1929); + setState(1932); type_(); } } @@ -13659,34 +13671,34 @@ public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); enterRule(_localctx, 382, RULE_eos); try { - setState(1935); + setState(1938); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,199,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,200,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1931); + setState(1934); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1932); + setState(1935); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1933); + setState(1936); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1934); + setState(1937); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; @@ -13705,11 +13717,11 @@ public final EosContext eos() throws RecognitionException { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 89: + case 90: return expression_sempred((ExpressionContext)_localctx, predIndex); - case 97: + case 98: return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex); - case 127: + case 128: return statementList_sempred((StatementListContext)_localctx, predIndex); case 191: return eos_sempred((EosContext)_localctx, predIndex); @@ -13778,7 +13790,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a4\u0792\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a4\u0795\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -13879,1154 +13891,1157 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "+\f+\u02d5\t+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0005,"+ "\u02de\b,\n,\f,\u02e1\t,\u0001,\u0001,\u0001-\u0003-\u02e6\b-\u0001-\u0001"+ "-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ - "0\u00010\u00030\u02ff\b0\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+ - "1\u00031\u0308\b1\u00011\u00051\u030b\b1\n1\f1\u030e\t1\u00011\u00011"+ - "\u00031\u0312\b1\u00011\u00031\u0315\b1\u00012\u00042\u0318\b2\u000b2"+ - "\f2\u0319\u00013\u00013\u00013\u00053\u031f\b3\n3\f3\u0322\t3\u00014\u0001"+ - "4\u00014\u00034\u0327\b4\u00014\u00014\u00015\u00015\u00015\u00055\u032e"+ - "\b5\n5\f5\u0331\t5\u00016\u00016\u00016\u00036\u0336\b6\u00016\u00016"+ - "\u00016\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0003"+ - "7\u0343\b7\u00018\u00038\u0346\b8\u00018\u00018\u00038\u034a\b8\u0001"+ - "9\u00019\u00039\u034e\b9\u0001:\u0001:\u0001:\u0001:\u0005:\u0354\b:\n"+ - ":\f:\u0357\t:\u0001:\u0001:\u0001;\u0001;\u0001;\u0003;\u035e\b;\u0001"+ - "<\u0001<\u0001<\u0003<\u0363\b<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ - "=\u0003=\u036b\b=\u0003=\u036d\b=\u0001=\u0001=\u0001=\u0003=\u0372\b"+ - "=\u0001>\u0001>\u0001>\u0005>\u0377\b>\n>\f>\u037a\t>\u0001?\u0001?\u0001"+ - "?\u0001?\u0001?\u0003?\u0381\b?\u0001?\u0003?\u0384\b?\u0001?\u0001?\u0001"+ - "@\u0001@\u0003@\u038a\b@\u0001@\u0001@\u0001@\u0003@\u038f\b@\u0003@\u0391"+ - "\b@\u0001@\u0003@\u0394\b@\u0001A\u0001A\u0001A\u0005A\u0399\bA\nA\fA"+ - "\u039c\tA\u0001B\u0001B\u0003B\u03a0\bB\u0001B\u0001B\u0001C\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ - "D\u0005D\u03b1\bD\nD\fD\u03b4\tD\u0001D\u0001D\u0001D\u0005D\u03b9\bD"+ - "\nD\fD\u03bc\tD\u0001D\u0003D\u03bf\bD\u0001E\u0003E\u03c2\bE\u0001E\u0001"+ - "E\u0001E\u0001E\u0003E\u03c8\bE\u0001F\u0001F\u0003F\u03cc\bF\u0001F\u0003"+ - "F\u03cf\bF\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001G\u0003"+ - "G\u03d9\bG\u0001H\u0001H\u0001H\u0001H\u0001H\u0003H\u03e0\bH\u0001I\u0001"+ - "I\u0001I\u0001I\u0001I\u0003I\u03e7\bI\u0001I\u0001I\u0001J\u0001J\u0001"+ - "J\u0001J\u0001J\u0001K\u0001K\u0001K\u0003K\u03f3\bK\u0001L\u0001L\u0001"+ - "L\u0001L\u0003L\u03f9\bL\u0001M\u0001M\u0001M\u0001M\u0001M\u0003M\u0400"+ - "\bM\u0001N\u0001N\u0001N\u0003N\u0405\bN\u0001O\u0001O\u0001O\u0001O\u0003"+ - "O\u040b\bO\u0001P\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0001Q\u0003Q\u0417\bQ\u0001R\u0001R\u0001R\u0001R\u0003R\u041d\bR\u0001"+ - "R\u0001R\u0003R\u0421\bR\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0003"+ - "T\u0429\bT\u0001T\u0001T\u0003T\u042d\bT\u0001T\u0001T\u0001U\u0001U\u0003"+ - "U\u0433\bU\u0001V\u0003V\u0436\bV\u0001V\u0001V\u0001W\u0001W\u0003W\u043c"+ - "\bW\u0001W\u0001W\u0001X\u0003X\u0441\bX\u0001X\u0001X\u0001Y\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0003Y\u045a"+ - "\bY\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0005Y\u047d\bY\nY\fY\u0480\tY\u0001Z\u0001Z\u0001"+ + "/\u00010\u00030\u02f5\b0\u00010\u00010\u00010\u00010\u00030\u02fb\b0\u0001"+ + "0\u00030\u02fe\b0\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+ + "1\u00011\u00011\u00011\u00031\u030b\b1\u00012\u00012\u00012\u00012\u0001"+ + "2\u00012\u00012\u00032\u0314\b2\u00012\u00052\u0317\b2\n2\f2\u031a\t2"+ + "\u00012\u00012\u00032\u031e\b2\u00012\u00032\u0321\b2\u00013\u00043\u0324"+ + "\b3\u000b3\f3\u0325\u00014\u00014\u00014\u00054\u032b\b4\n4\f4\u032e\t"+ + "4\u00015\u00015\u00015\u00035\u0333\b5\u00015\u00015\u00016\u00016\u0001"+ + "6\u00056\u033a\b6\n6\f6\u033d\t6\u00017\u00017\u00017\u00037\u0342\b7"+ + "\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ + "8\u00018\u00038\u034f\b8\u00019\u00039\u0352\b9\u00019\u00019\u00039\u0356"+ + "\b9\u0001:\u0001:\u0003:\u035a\b:\u0001;\u0001;\u0001;\u0001;\u0005;\u0360"+ + "\b;\n;\f;\u0363\t;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003<\u036a\b<"+ + "\u0001=\u0001=\u0001=\u0003=\u036f\b=\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0003>\u0377\b>\u0003>\u0379\b>\u0001>\u0001>\u0001>\u0003>\u037e"+ + "\b>\u0001?\u0001?\u0001?\u0005?\u0383\b?\n?\f?\u0386\t?\u0001@\u0001@"+ + "\u0001@\u0001@\u0001@\u0003@\u038d\b@\u0001@\u0003@\u0390\b@\u0001@\u0001"+ + "@\u0001A\u0001A\u0003A\u0396\bA\u0001A\u0001A\u0001A\u0003A\u039b\bA\u0003"+ + "A\u039d\bA\u0001A\u0003A\u03a0\bA\u0001B\u0001B\u0001B\u0005B\u03a5\b"+ + "B\nB\fB\u03a8\tB\u0001C\u0001C\u0003C\u03ac\bC\u0001C\u0001C\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0005E\u03bd\bE\nE\fE\u03c0\tE\u0001E\u0001E\u0001E\u0005E\u03c5"+ + "\bE\nE\fE\u03c8\tE\u0001E\u0003E\u03cb\bE\u0001F\u0003F\u03ce\bF\u0001"+ + "F\u0001F\u0001F\u0001F\u0003F\u03d4\bF\u0001G\u0001G\u0003G\u03d8\bG\u0001"+ + "G\u0003G\u03db\bG\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001"+ + "H\u0003H\u03e5\bH\u0001I\u0001I\u0001I\u0001I\u0001I\u0003I\u03ec\bI\u0001"+ + "J\u0001J\u0001J\u0001J\u0001J\u0003J\u03f3\bJ\u0001J\u0001J\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0003L\u03ff\bL\u0001M\u0001"+ + "M\u0001M\u0001M\u0003M\u0405\bM\u0001N\u0001N\u0001N\u0001N\u0001N\u0003"+ + "N\u040c\bN\u0001O\u0001O\u0001O\u0003O\u0411\bO\u0001P\u0001P\u0001P\u0001"+ + "P\u0003P\u0417\bP\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0003R\u0423\bR\u0001S\u0001S\u0001S\u0001S\u0003S\u0429"+ + "\bS\u0001S\u0001S\u0003S\u042d\bS\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ + "U\u0003U\u0435\bU\u0001U\u0001U\u0003U\u0439\bU\u0001U\u0001U\u0001V\u0001"+ + "V\u0003V\u043f\bV\u0001W\u0003W\u0442\bW\u0001W\u0001W\u0001X\u0001X\u0003"+ + "X\u0448\bX\u0001X\u0001X\u0001Y\u0003Y\u044d\bY\u0001Y\u0001Y\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003"+ + "Z\u0466\bZ\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003Z\u0496\bZ\u0001"+ - "[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0003\\\u049e\b\\\u0001]\u0001"+ - "]\u0001]\u0001^\u0001^\u0001^\u0001^\u0005^\u04a7\b^\n^\f^\u04aa\t^\u0001"+ - "^\u0001^\u0001^\u0001^\u0003^\u04b0\b^\u0001_\u0001_\u0001_\u0001_\u0001"+ - "_\u0003_\u04b7\b_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ - "`\u0003`\u04c1\b`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ - "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0003a\u04d3"+ - "\ba\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ - "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ - "a\u0005a\u04e9\ba\na\fa\u04ec\ta\u0001b\u0001b\u0001b\u0001c\u0001c\u0003"+ - "c\u04f3\bc\u0001c\u0001c\u0003c\u04f7\bc\u0001d\u0001d\u0003d\u04fb\b"+ - "d\u0001d\u0003d\u04fe\bd\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001"+ - "e\u0003e\u0507\be\u0001e\u0001e\u0005e\u050b\be\ne\fe\u050e\te\u0001e"+ - "\u0001e\u0001f\u0001f\u0001f\u0001f\u0001g\u0003g\u0517\bg\u0001g\u0001"+ - "g\u0001g\u0001g\u0001g\u0001g\u0003g\u051f\bg\u0001g\u0001g\u0001g\u0001"+ - "g\u0003g\u0525\bg\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003"+ - "h\u052e\bh\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001"+ - "i\u0003i\u0539\bi\u0001j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0005"+ - "k\u0542\bk\nk\fk\u0545\tk\u0001k\u0003k\u0548\bk\u0003k\u054a\bk\u0001"+ - "k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0003l\u0555"+ - "\bl\u0001m\u0001m\u0001m\u0001m\u0001m\u0001n\u0001n\u0003n\u055e\bn\u0001"+ - "n\u0001n\u0003n\u0562\bn\u0001n\u0003n\u0565\bn\u0001n\u0001n\u0001n\u0001"+ - "n\u0001n\u0003n\u056c\bn\u0001n\u0001n\u0001o\u0001o\u0001p\u0001p\u0001"+ - "q\u0001q\u0001r\u0003r\u0577\br\u0001r\u0001r\u0001s\u0001s\u0001s\u0001"+ - "s\u0001s\u0001s\u0003s\u0581\bs\u0001s\u0001s\u0001s\u0001s\u0003s\u0587"+ - "\bs\u0003s\u0589\bs\u0001t\u0001t\u0001t\u0001u\u0001u\u0001v\u0001v\u0001"+ - "v\u0003v\u0593\bv\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0005w\u059b"+ - "\bw\nw\fw\u059e\tw\u0001w\u0003w\u05a1\bw\u0001x\u0001x\u0003x\u05a5\b"+ - "x\u0001x\u0001x\u0003x\u05a9\bx\u0001y\u0001y\u0001y\u0005y\u05ae\by\n"+ - "y\fy\u05b1\ty\u0001z\u0001z\u0001z\u0005z\u05b6\bz\nz\fz\u05b9\tz\u0001"+ - "{\u0001{\u0001{\u0001{\u0001{\u0001{\u0005{\u05c1\b{\n{\f{\u05c4\t{\u0001"+ - "{\u0003{\u05c7\b{\u0001|\u0001|\u0003|\u05cb\b|\u0001|\u0001|\u0001}\u0001"+ - "}\u0001}\u0001}\u0001}\u0001}\u0005}\u05d5\b}\n}\f}\u05d8\t}\u0001}\u0003"+ - "}\u05db\b}\u0001~\u0001~\u0003~\u05df\b~\u0001~\u0001~\u0001\u007f\u0003"+ - "\u007f\u05e4\b\u007f\u0001\u007f\u0003\u007f\u05e7\b\u007f\u0001\u007f"+ - "\u0003\u007f\u05ea\b\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0004\u007f"+ - "\u05ef\b\u007f\u000b\u007f\f\u007f\u05f0\u0001\u0080\u0001\u0080\u0001"+ - "\u0080\u0001\u0080\u0001\u0080\u0003\u0080\u05f8\b\u0080\u0001\u0081\u0001"+ - "\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001"+ - "\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+ - "\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0003\u0086\u060c"+ - "\b\u0086\u0001\u0087\u0001\u0087\u0003\u0087\u0610\b\u0087\u0001\u0088"+ - "\u0001\u0088\u0003\u0088\u0614\b\u0088\u0001\u0089\u0001\u0089\u0003\u0089"+ - "\u0618\b\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b"+ - "\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c"+ - "\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u0628\b\u008c\u0001\u008c"+ - "\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u062e\b\u008c\u0003\u008c"+ - "\u0630\b\u008c\u0001\u008d\u0001\u008d\u0003\u008d\u0634\b\u008d\u0001"+ - "\u008e\u0001\u008e\u0003\u008e\u0638\b\u008e\u0001\u008e\u0003\u008e\u063b"+ - "\b\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u063f\b\u008e\u0003\u008e"+ - "\u0641\b\u008e\u0001\u008e\u0001\u008e\u0005\u008e\u0645\b\u008e\n\u008e"+ - "\f\u008e\u0648\t\u008e\u0001\u008e\u0001\u008e\u0001\u008f\u0001\u008f"+ - "\u0001\u008f\u0003\u008f\u064f\b\u008f\u0001\u0090\u0001\u0090\u0001\u0090"+ - "\u0003\u0090\u0654\b\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091"+ - "\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091"+ - "\u065f\b\u0091\u0001\u0091\u0001\u0091\u0005\u0091\u0663\b\u0091\n\u0091"+ - "\f\u0091\u0666\t\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092"+ - "\u0003\u0092\u066c\b\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0003\u0093"+ - "\u0677\b\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0003\u0094\u067c\b"+ - "\u0094\u0001\u0095\u0001\u0095\u0003\u0095\u0680\b\u0095\u0001\u0095\u0001"+ - "\u0095\u0001\u0095\u0003\u0095\u0685\b\u0095\u0005\u0095\u0687\b\u0095"+ - "\n\u0095\f\u0095\u068a\t\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0005"+ - "\u0096\u068f\b\u0096\n\u0096\f\u0096\u0692\t\u0096\u0001\u0096\u0001\u0096"+ - "\u0001\u0097\u0001\u0097\u0001\u0097\u0003\u0097\u0699\b\u0097\u0001\u0098"+ - "\u0001\u0098\u0001\u0098\u0003\u0098\u069e\b\u0098\u0001\u0098\u0003\u0098"+ - "\u06a1\b\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ - "\u0001\u0099\u0003\u0099\u06a9\b\u0099\u0001\u0099\u0001\u0099\u0001\u009a"+ - "\u0001\u009a\u0003\u009a\u06af\b\u009a\u0001\u009a\u0001\u009a\u0003\u009a"+ - "\u06b3\b\u009a\u0003\u009a\u06b5\b\u009a\u0001\u009a\u0001\u009a\u0001"+ - "\u009b\u0003\u009b\u06ba\b\u009b\u0001\u009b\u0001\u009b\u0003\u009b\u06be"+ - "\b\u009b\u0001\u009b\u0001\u009b\u0003\u009b\u06c2\b\u009b\u0001\u009c"+ - "\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0003\u009d\u06c9\b\u009d"+ - "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f"+ - "\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1"+ - "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3"+ - "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4"+ - "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0003\u00a4\u06e6\b\u00a4\u0001\u00a4"+ - "\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6"+ - "\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06f1\b\u00a6\u0001\u00a7\u0001\u00a7"+ - "\u0003\u00a7\u06f5\b\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8"+ - "\u0005\u00a8\u06fb\b\u00a8\n\u00a8\f\u00a8\u06fe\t\u00a8\u0001\u00a8\u0003"+ - "\u00a8\u0701\b\u00a8\u0003\u00a8\u0703\b\u00a8\u0001\u00a8\u0001\u00a8"+ - "\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0003\u00a9\u070b\b\u00a9"+ - "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ - "\u0001\u00aa\u0003\u00aa\u0714\b\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ - "\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0003\u00ab\u071c\b\u00ab\u0001\u00ac"+ - "\u0001\u00ac\u0001\u00ac\u0003\u00ac\u0721\b\u00ac\u0001\u00ad\u0001\u00ad"+ - "\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af"+ - "\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1"+ - "\u0003\u00b1\u0731\b\u00b1\u0003\u00b1\u0733\b\u00b1\u0001\u00b1\u0001"+ - "\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0005\u00b2\u073a\b\u00b2\n"+ - "\u00b2\f\u00b2\u073d\t\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0003"+ - "\u00b3\u0742\b\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0003"+ - "\u00b4\u0748\b\u00b4\u0001\u00b5\u0001\u00b5\u0003\u00b5\u074c\b\u00b5"+ - "\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0005\u00b6"+ - "\u0753\b\u00b6\n\u00b6\f\u00b6\u0756\t\u00b6\u0001\u00b6\u0001\u00b6\u0001"+ - "\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0003\u00b7\u075e\b\u00b7\u0001"+ - "\u00b7\u0003\u00b7\u0761\b\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0003"+ - "\u00b9\u0766\b\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001"+ - "\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001"+ - "\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0003"+ - "\u00bc\u0778\b\u00bc\u0003\u00bc\u077a\b\u00bc\u0001\u00bc\u0003\u00bc"+ - "\u077d\b\u00bc\u0001\u00bc\u0003\u00bc\u0780\b\u00bc\u0003\u00bc\u0782"+ - "\b\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ - "\u00bd\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001"+ - "\u00bf\u0003\u00bf\u0790\b\u00bf\u0001\u00bf\u0001\u030c\u0002\u00b2\u00c2"+ - "\u00c0\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ - "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ - "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+ - "\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0"+ - "\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8"+ - "\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0"+ - "\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8"+ - "\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110"+ - "\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128"+ - "\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140"+ - "\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158"+ - "\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170"+ - "\u0172\u0174\u0176\u0178\u017a\u017c\u017e\u0000\u0014\u0002\u0000iit"+ - "t\u0001\u0000\u0017\u0018\u0001\u0000\u0005\b\u0001\u0000BC\u0001\u0000"+ - "(*\u0002\u0000(*,,\u0002\u0000jkqq\u0001\u0000\u0087\u008d\u0001\u0000"+ - "\u0014\u0015\u0002\u0000\u0082\u0086\u008b\u008c\u0004\u0000##uu\u0081"+ - "\u0081\u0088\u008a\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000"+ - "IJ{\u0080\u0004\u0000..1144aa\u0002\u0000\u0081\u0086\u0088\u008c\u0001"+ - "\u0000uv\u0002\u0000rr\u00a3\u00a3\u0002\u0000\u008e\u0091\u0093\u0094"+ - "\u0001\u0000\u009a\u009b\u07fe\u0000\u0180\u0001\u0000\u0000\u0000\u0002"+ - "\u0183\u0001\u0000\u0000\u0000\u0004\u0186\u0001\u0000\u0000\u0000\u0006"+ - "\u0189\u0001\u0000\u0000\u0000\b\u0191\u0001\u0000\u0000\u0000\n\u019a"+ - "\u0001\u0000\u0000\u0000\f\u01ba\u0001\u0000\u0000\u0000\u000e\u01c7\u0001"+ - "\u0000\u0000\u0000\u0010\u01ca\u0001\u0000\u0000\u0000\u0012\u01d2\u0001"+ - "\u0000\u0000\u0000\u0014\u01df\u0001\u0000\u0000\u0000\u0016\u01f5\u0001"+ - "\u0000\u0000\u0000\u0018\u01fe\u0001\u0000\u0000\u0000\u001a\u0200\u0001"+ - "\u0000\u0000\u0000\u001c\u0202\u0001\u0000\u0000\u0000\u001e\u0205\u0001"+ - "\u0000\u0000\u0000 \u0219\u0001\u0000\u0000\u0000\"\u021b\u0001\u0000"+ - "\u0000\u0000$\u021d\u0001\u0000\u0000\u0000&\u0222\u0001\u0000\u0000\u0000"+ - "(\u022d\u0001\u0000\u0000\u0000*\u023a\u0001\u0000\u0000\u0000,\u023d"+ - "\u0001\u0000\u0000\u0000.\u0248\u0001\u0000\u0000\u00000\u024a\u0001\u0000"+ - "\u0000\u00002\u024f\u0001\u0000\u0000\u00004\u0254\u0001\u0000\u0000\u0000"+ - "6\u0259\u0001\u0000\u0000\u00008\u025e\u0001\u0000\u0000\u0000:\u026b"+ - "\u0001\u0000\u0000\u0000<\u026d\u0001\u0000\u0000\u0000>\u026f\u0001\u0000"+ - "\u0000\u0000@\u0274\u0001\u0000\u0000\u0000B\u0279\u0001\u0000\u0000\u0000"+ - "D\u027e\u0001\u0000\u0000\u0000F\u0287\u0001\u0000\u0000\u0000H\u028e"+ - "\u0001\u0000\u0000\u0000J\u029b\u0001\u0000\u0000\u0000L\u029f\u0001\u0000"+ - "\u0000\u0000N\u02aa\u0001\u0000\u0000\u0000P\u02b3\u0001\u0000\u0000\u0000"+ - "R\u02b5\u0001\u0000\u0000\u0000T\u02ca\u0001\u0000\u0000\u0000V\u02cc"+ - "\u0001\u0000\u0000\u0000X\u02d8\u0001\u0000\u0000\u0000Z\u02e5\u0001\u0000"+ - "\u0000\u0000\\\u02e9\u0001\u0000\u0000\u0000^\u02ee\u0001\u0000\u0000"+ - "\u0000`\u02fe\u0001\u0000\u0000\u0000b\u030c\u0001\u0000\u0000\u0000d"+ - "\u0317\u0001\u0000\u0000\u0000f\u031b\u0001\u0000\u0000\u0000h\u0323\u0001"+ - "\u0000\u0000\u0000j\u032a\u0001\u0000\u0000\u0000l\u0332\u0001\u0000\u0000"+ - "\u0000n\u0342\u0001\u0000\u0000\u0000p\u0345\u0001\u0000\u0000\u0000r"+ - "\u034d\u0001\u0000\u0000\u0000t\u034f\u0001\u0000\u0000\u0000v\u035a\u0001"+ - "\u0000\u0000\u0000x\u0362\u0001\u0000\u0000\u0000z\u0371\u0001\u0000\u0000"+ - "\u0000|\u0373\u0001\u0000\u0000\u0000~\u037b\u0001\u0000\u0000\u0000\u0080"+ - "\u0389\u0001\u0000\u0000\u0000\u0082\u0395\u0001\u0000\u0000\u0000\u0084"+ - "\u039f\u0001\u0000\u0000\u0000\u0086\u03a3\u0001\u0000\u0000\u0000\u0088"+ - "\u03a9\u0001\u0000\u0000\u0000\u008a\u03c1\u0001\u0000\u0000\u0000\u008c"+ - "\u03c9\u0001\u0000\u0000\u0000\u008e\u03d8\u0001\u0000\u0000\u0000\u0090"+ - "\u03da\u0001\u0000\u0000\u0000\u0092\u03e1\u0001\u0000\u0000\u0000\u0094"+ - "\u03ea\u0001\u0000\u0000\u0000\u0096\u03ef\u0001\u0000\u0000\u0000\u0098"+ - "\u03f4\u0001\u0000\u0000\u0000\u009a\u03fa\u0001\u0000\u0000\u0000\u009c"+ - "\u0401\u0001\u0000\u0000\u0000\u009e\u0406\u0001\u0000\u0000\u0000\u00a0"+ - "\u040c\u0001\u0000\u0000\u0000\u00a2\u0411\u0001\u0000\u0000\u0000\u00a4"+ - "\u0418\u0001\u0000\u0000\u0000\u00a6\u0422\u0001\u0000\u0000\u0000\u00a8"+ - "\u0426\u0001\u0000\u0000\u0000\u00aa\u0432\u0001\u0000\u0000\u0000\u00ac"+ - "\u0435\u0001\u0000\u0000\u0000\u00ae\u0439\u0001\u0000\u0000\u0000\u00b0"+ - "\u0440\u0001\u0000\u0000\u0000\u00b2\u0459\u0001\u0000\u0000\u0000\u00b4"+ - "\u0495\u0001\u0000\u0000\u0000\u00b6\u0497\u0001\u0000\u0000\u0000\u00b8"+ - "\u049a\u0001\u0000\u0000\u0000\u00ba\u049f\u0001\u0000\u0000\u0000\u00bc"+ - "\u04a8\u0001\u0000\u0000\u0000\u00be\u04b6\u0001\u0000\u0000\u0000\u00c0"+ - "\u04c0\u0001\u0000\u0000\u0000\u00c2\u04d2\u0001\u0000\u0000\u0000\u00c4"+ - "\u04ed\u0001\u0000\u0000\u0000\u00c6\u04f0\u0001\u0000\u0000\u0000\u00c8"+ - "\u04f8\u0001\u0000\u0000\u0000\u00ca\u0501\u0001\u0000\u0000\u0000\u00cc"+ - "\u0511\u0001\u0000\u0000\u0000\u00ce\u0524\u0001\u0000\u0000\u0000\u00d0"+ - "\u052d\u0001\u0000\u0000\u0000\u00d2\u0538\u0001\u0000\u0000\u0000\u00d4"+ - "\u053a\u0001\u0000\u0000\u0000\u00d6\u053d\u0001\u0000\u0000\u0000\u00d8"+ - "\u0554\u0001\u0000\u0000\u0000\u00da\u0556\u0001\u0000\u0000\u0000\u00dc"+ - "\u055b\u0001\u0000\u0000\u0000\u00de\u056f\u0001\u0000\u0000\u0000\u00e0"+ - "\u0571\u0001\u0000\u0000\u0000\u00e2\u0573\u0001\u0000\u0000\u0000\u00e4"+ - "\u0576\u0001\u0000\u0000\u0000\u00e6\u0580\u0001\u0000\u0000\u0000\u00e8"+ - "\u058a\u0001\u0000\u0000\u0000\u00ea\u058d\u0001\u0000\u0000\u0000\u00ec"+ - "\u0592\u0001\u0000\u0000\u0000\u00ee\u0594\u0001\u0000\u0000\u0000\u00f0"+ - "\u05a2\u0001\u0000\u0000\u0000\u00f2\u05aa\u0001\u0000\u0000\u0000\u00f4"+ - "\u05b2\u0001\u0000\u0000\u0000\u00f6\u05ba\u0001\u0000\u0000\u0000\u00f8"+ - "\u05c8\u0001\u0000\u0000\u0000\u00fa\u05ce\u0001\u0000\u0000\u0000\u00fc"+ - "\u05dc\u0001\u0000\u0000\u0000\u00fe\u05ee\u0001\u0000\u0000\u0000\u0100"+ - "\u05f7\u0001\u0000\u0000\u0000\u0102\u05f9\u0001\u0000\u0000\u0000\u0104"+ - "\u05fb\u0001\u0000\u0000\u0000\u0106\u05ff\u0001\u0000\u0000\u0000\u0108"+ - "\u0602\u0001\u0000\u0000\u0000\u010a\u0606\u0001\u0000\u0000\u0000\u010c"+ - "\u0608\u0001\u0000\u0000\u0000\u010e\u060d\u0001\u0000\u0000\u0000\u0110"+ - "\u0611\u0001\u0000\u0000\u0000\u0112\u0615\u0001\u0000\u0000\u0000\u0114"+ - "\u0619\u0001\u0000\u0000\u0000\u0116\u061c\u0001\u0000\u0000\u0000\u0118"+ - "\u061e\u0001\u0000\u0000\u0000\u011a\u0633\u0001\u0000\u0000\u0000\u011c"+ - "\u0635\u0001\u0000\u0000\u0000\u011e\u064b\u0001\u0000\u0000\u0000\u0120"+ - "\u0653\u0001\u0000\u0000\u0000\u0122\u0655\u0001\u0000\u0000\u0000\u0124"+ - "\u066b\u0001\u0000\u0000\u0000\u0126\u0673\u0001\u0000\u0000\u0000\u0128"+ - "\u067b\u0001\u0000\u0000\u0000\u012a\u067f\u0001\u0000\u0000\u0000\u012c"+ - "\u068b\u0001\u0000\u0000\u0000\u012e\u0695\u0001\u0000\u0000\u0000\u0130"+ - "\u06a0\u0001\u0000\u0000\u0000\u0132\u06a8\u0001\u0000\u0000\u0000\u0134"+ - "\u06ac\u0001\u0000\u0000\u0000\u0136\u06b9\u0001\u0000\u0000\u0000\u0138"+ - "\u06c3\u0001\u0000\u0000\u0000\u013a\u06c8\u0001\u0000\u0000\u0000\u013c"+ - "\u06ca\u0001\u0000\u0000\u0000\u013e\u06cf\u0001\u0000\u0000\u0000\u0140"+ - "\u06d1\u0001\u0000\u0000\u0000\u0142\u06d3\u0001\u0000\u0000\u0000\u0144"+ - "\u06d6\u0001\u0000\u0000\u0000\u0146\u06da\u0001\u0000\u0000\u0000\u0148"+ - "\u06e5\u0001\u0000\u0000\u0000\u014a\u06e9\u0001\u0000\u0000\u0000\u014c"+ - "\u06f0\u0001\u0000\u0000\u0000\u014e\u06f4\u0001\u0000\u0000\u0000\u0150"+ - "\u06f6\u0001\u0000\u0000\u0000\u0152\u0706\u0001\u0000\u0000\u0000\u0154"+ - "\u0713\u0001\u0000\u0000\u0000\u0156\u071b\u0001\u0000\u0000\u0000\u0158"+ - "\u0720\u0001\u0000\u0000\u0000\u015a\u0722\u0001\u0000\u0000\u0000\u015c"+ - "\u0724\u0001\u0000\u0000\u0000\u015e\u0726\u0001\u0000\u0000\u0000\u0160"+ - "\u072a\u0001\u0000\u0000\u0000\u0162\u072d\u0001\u0000\u0000\u0000\u0164"+ - "\u0736\u0001\u0000\u0000\u0000\u0166\u0741\u0001\u0000\u0000\u0000\u0168"+ - "\u0747\u0001\u0000\u0000\u0000\u016a\u074b\u0001\u0000\u0000\u0000\u016c"+ - "\u074d\u0001\u0000\u0000\u0000\u016e\u075d\u0001\u0000\u0000\u0000\u0170"+ - "\u0762\u0001\u0000\u0000\u0000\u0172\u0765\u0001\u0000\u0000\u0000\u0174"+ - "\u0769\u0001\u0000\u0000\u0000\u0176\u076d\u0001\u0000\u0000\u0000\u0178"+ - "\u0772\u0001\u0000\u0000\u0000\u017a\u0785\u0001\u0000\u0000\u0000\u017c"+ - "\u0789\u0001\u0000\u0000\u0000\u017e\u078f\u0001\u0000\u0000\u0000\u0180"+ - "\u0181\u0003\u00b2Y\u0000\u0181\u0182\u0005\u0000\u0000\u0001\u0182\u0001"+ - "\u0001\u0000\u0000\u0000\u0183\u0184\u0003\u00b4Z\u0000\u0184\u0185\u0005"+ - "\u0000\u0000\u0001\u0185\u0003\u0001\u0000\u0000\u0000\u0186\u0187\u0003"+ - "\u00d0h\u0000\u0187\u0188\u0005\u0000\u0000\u0001\u0188\u0005\u0001\u0000"+ - "\u0000\u0000\u0189\u018e\u0003\b\u0004\u0000\u018a\u018b\u0005q\u0000"+ - "\u0000\u018b\u018d\u0003\b\u0004\u0000\u018c\u018a\u0001\u0000\u0000\u0000"+ - "\u018d\u0190\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000"+ - "\u018e\u018f\u0001\u0000\u0000\u0000\u018f\u0007\u0001\u0000\u0000\u0000"+ - "\u0190\u018e\u0001\u0000\u0000\u0000\u0191\u0193\u0005i\u0000\u0000\u0192"+ - "\u0194\u0005=\u0000\u0000\u0193\u0192\u0001\u0000\u0000\u0000\u0193\u0194"+ - "\u0001\u0000\u0000\u0000\u0194\t\u0001\u0000\u0000\u0000\u0195\u0196\u0003"+ - "\u000e\u0007\u0000\u0196\u0197\u0003\u017e\u00bf\u0000\u0197\u0199\u0001"+ - "\u0000\u0000\u0000\u0198\u0195\u0001\u0000\u0000\u0000\u0199\u019c\u0001"+ - "\u0000\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000\u019a\u019b\u0001"+ - "\u0000\u0000\u0000\u019b\u019d\u0001\u0000\u0000\u0000\u019c\u019a\u0001"+ - "\u0000\u0000\u0000\u019d\u019e\u0003\u00e8t\u0000\u019e\u01a4\u0003\u017e"+ - "\u00bf\u0000\u019f\u01a0\u0003\u0014\n\u0000\u01a0\u01a1\u0003\u017e\u00bf"+ - "\u0000\u01a1\u01a3\u0001\u0000\u0000\u0000\u01a2\u019f\u0001\u0000\u0000"+ - "\u0000\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4\u01a2\u0001\u0000\u0000"+ - "\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5\u01b0\u0001\u0000\u0000"+ - "\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a7\u01ab\u0003\u0096K\u0000"+ - "\u01a8\u01ab\u0003\u00ecv\u0000\u01a9\u01ab\u0003\u0016\u000b\u0000\u01aa"+ - "\u01a7\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001\u0000\u0000\u0000\u01aa"+ - "\u01a9\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000\u01ac"+ - "\u01ad\u0003\u017e\u00bf\u0000\u01ad\u01af\u0001\u0000\u0000\u0000\u01ae"+ - "\u01aa\u0001\u0000\u0000\u0000\u01af\u01b2\u0001\u0000\u0000\u0000\u01b0"+ - "\u01ae\u0001\u0000\u0000\u0000\u01b0\u01b1\u0001\u0000\u0000\u0000\u01b1"+ - "\u01b3\u0001\u0000\u0000\u0000\u01b2\u01b0\u0001\u0000\u0000\u0000\u01b3"+ - "\u01b4\u0005\u0000\u0000\u0001\u01b4\u000b\u0001\u0000\u0000\u0000\u01b5"+ - "\u01b6\u0003\u000e\u0007\u0000\u01b6\u01b7\u0003\u017e\u00bf\u0000\u01b7"+ - "\u01b9\u0001\u0000\u0000\u0000\u01b8\u01b5\u0001\u0000\u0000\u0000\u01b9"+ - "\u01bc\u0001\u0000\u0000\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01ba"+ - "\u01bb\u0001\u0000\u0000\u0000\u01bb\u01bd\u0001\u0000\u0000\u0000\u01bc"+ - "\u01ba\u0001\u0000\u0000\u0000\u01bd\u01be\u0003\u00e8t\u0000\u01be\u01c4"+ - "\u0003\u017e\u00bf\u0000\u01bf\u01c0\u0003\u0014\n\u0000\u01c0\u01c1\u0003"+ - "\u017e\u00bf\u0000\u01c1\u01c3\u0001\u0000\u0000\u0000\u01c2\u01bf\u0001"+ - "\u0000\u0000\u0000\u01c3\u01c6\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001"+ - "\u0000\u0000\u0000\u01c4\u01c5\u0001\u0000\u0000\u0000\u01c5\r\u0001\u0000"+ - "\u0000\u0000\u01c6\u01c4\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005F\u0000"+ - "\u0000\u01c8\u01c9\u0003\u00b2Y\u0000\u01c9\u000f\u0001\u0000\u0000\u0000"+ - "\u01ca\u01cb\u0005G\u0000\u0000\u01cb\u01cc\u0003\u00b2Y\u0000\u01cc\u0011"+ - "\u0001\u0000\u0000\u0000\u01cd\u01ce\u0003\u0010\b\u0000\u01ce\u01cf\u0003"+ - "\u017e\u00bf\u0000\u01cf\u01d1\u0001\u0000\u0000\u0000\u01d0\u01cd\u0001"+ - "\u0000\u0000\u0000\u01d1\u01d4\u0001\u0000\u0000\u0000\u01d2\u01d0\u0001"+ - "\u0000\u0000\u0000\u01d2\u01d3\u0001\u0000\u0000\u0000\u01d3\u01d6\u0001"+ - "\u0000\u0000\u0000\u01d4\u01d2\u0001\u0000\u0000\u0000\u01d5\u01d7\u0007"+ - "\u0000\u0000\u0000\u01d6\u01d5\u0001\u0000\u0000\u0000\u01d6\u01d7\u0001"+ - "\u0000\u0000\u0000\u01d7\u01d8\u0001\u0000\u0000\u0000\u01d8\u01d9\u0003"+ - "\u00eau\u0000\u01d9\u0013\u0001\u0000\u0000\u0000\u01da\u01db\u0003\u0010"+ - "\b\u0000\u01db\u01dc\u0003\u017e\u00bf\u0000\u01dc\u01de\u0001\u0000\u0000"+ - "\u0000\u01dd\u01da\u0001\u0000\u0000\u0000\u01de\u01e1\u0001\u0000\u0000"+ - "\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df\u01e0\u0001\u0000\u0000"+ - "\u0000\u01e0\u01ef\u0001\u0000\u0000\u0000\u01e1\u01df\u0001\u0000\u0000"+ - "\u0000\u01e2\u01e3\u0005e\u0000\u0000\u01e3\u01f0\u0003\u0012\t\u0000"+ - "\u01e4\u01e5\u0005e\u0000\u0000\u01e5\u01eb\u0005j\u0000\u0000\u01e6\u01e7"+ - "\u0003\u0012\t\u0000\u01e7\u01e8\u0003\u017e\u00bf\u0000\u01e8\u01ea\u0001"+ - "\u0000\u0000\u0000\u01e9\u01e6\u0001\u0000\u0000\u0000\u01ea\u01ed\u0001"+ - "\u0000\u0000\u0000\u01eb\u01e9\u0001\u0000\u0000\u0000\u01eb\u01ec\u0001"+ - "\u0000\u0000\u0000\u01ec\u01ee\u0001\u0000\u0000\u0000\u01ed\u01eb\u0001"+ - "\u0000\u0000\u0000\u01ee\u01f0\u0005k\u0000\u0000\u01ef\u01e2\u0001\u0000"+ - "\u0000\u0000\u01ef\u01e4\u0001\u0000\u0000\u0000\u01f0\u0015\u0001\u0000"+ - "\u0000\u0000\u01f1\u01f6\u0003\u0088D\u0000\u01f2\u01f6\u0003\u009eO\u0000"+ - "\u01f3\u01f6\u0003\u00a2Q\u0000\u01f4\u01f6\u0003\u009cN\u0000\u01f5\u01f1"+ - "\u0001\u0000\u0000\u0000\u01f5\u01f2\u0001\u0000\u0000\u0000\u01f5\u01f3"+ - "\u0001\u0000\u0000\u0000\u01f5\u01f4\u0001\u0000\u0000\u0000\u01f6\u0017"+ - "\u0001\u0000\u0000\u0000\u01f7\u01f8\u0005\u001b\u0000\u0000\u01f8\u01ff"+ - "\u0003\u00b4Z\u0000\u01f9\u01fa\u0007\u0001\u0000\u0000\u01fa\u01ff\u0003"+ - ".\u0017\u0000\u01fb\u01fc\u0007\u0002\u0000\u0000\u01fc\u01ff\u0003\u00b2"+ - "Y\u0000\u01fd\u01ff\u0003t:\u0000\u01fe\u01f7\u0001\u0000\u0000\u0000"+ - "\u01fe\u01f9\u0001\u0000\u0000\u0000\u01fe\u01fb\u0001\u0000\u0000\u0000"+ - "\u01fe\u01fd\u0001\u0000\u0000\u0000\u01ff\u0019\u0001\u0000\u0000\u0000"+ - "\u0200\u0201\u0003\u001c\u000e\u0000\u0201\u001b\u0001\u0000\u0000\u0000"+ - "\u0202\u0203\u0003b1\u0000\u0203\u0204\u0003\u001e\u000f\u0000\u0204\u001d"+ - "\u0001\u0000\u0000\u0000\u0205\u0206\u0005E\u0000\u0000\u0206\u0208\u0005"+ - "j\u0000\u0000\u0207\u0209\u0003\u00fe\u007f\u0000\u0208\u0207\u0001\u0000"+ - "\u0000\u0000\u0208\u0209\u0001\u0000\u0000\u0000\u0209\u020a\u0001\u0000"+ - "\u0000\u0000\u020a\u020b\u0005k\u0000\u0000\u020b\u001f\u0001\u0000\u0000"+ - "\u0000\u020c\u021a\u0003F#\u0000\u020d\u021a\u0003D\"\u0000\u020e\u021a"+ - "\u0003B!\u0000\u020f\u021a\u0003$\u0012\u0000\u0210\u021a\u0003@ \u0000"+ - "\u0211\u021a\u00038\u001c\u0000\u0212\u021a\u0003>\u001f\u0000\u0213\u021a"+ - "\u00036\u001b\u0000\u0214\u021a\u00032\u0019\u0000\u0215\u021a\u00030"+ - "\u0018\u0000\u0216\u021a\u00034\u001a\u0000\u0217\u021a\u0003\"\u0011"+ - "\u0000\u0218\u021a\u0003H$\u0000\u0219\u020c\u0001\u0000\u0000\u0000\u0219"+ - "\u020d\u0001\u0000\u0000\u0000\u0219\u020e\u0001\u0000\u0000\u0000\u0219"+ - "\u020f\u0001\u0000\u0000\u0000\u0219\u0210\u0001\u0000\u0000\u0000\u0219"+ - "\u0211\u0001\u0000\u0000\u0000\u0219\u0212\u0001\u0000\u0000\u0000\u0219"+ - "\u0213\u0001\u0000\u0000\u0000\u0219\u0214\u0001\u0000\u0000\u0000\u0219"+ - "\u0215\u0001\u0000\u0000\u0000\u0219\u0216\u0001\u0000\u0000\u0000\u0219"+ - "\u0217\u0001\u0000\u0000\u0000\u0219\u0218\u0001\u0000\u0000\u0000\u021a"+ - "!\u0001\u0000\u0000\u0000\u021b\u021c\u0007\u0003\u0000\u0000\u021c#\u0001"+ - "\u0000\u0000\u0000\u021d\u021e\u0005b\u0000\u0000\u021e\u021f\u0005n\u0000"+ - "\u0000\u021f\u0220\u0003\u00d0h\u0000\u0220\u0221\u0005o\u0000\u0000\u0221"+ - "%\u0001\u0000\u0000\u0000\u0222\u0227\u0003(\u0014\u0000\u0223\u0224\u0005"+ - "q\u0000\u0000\u0224\u0226\u0003(\u0014\u0000\u0225\u0223\u0001\u0000\u0000"+ - "\u0000\u0226\u0229\u0001\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000"+ - "\u0000\u0227\u0228\u0001\u0000\u0000\u0000\u0228\u022b\u0001\u0000\u0000"+ - "\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u022a\u022c\u0005q\u0000\u0000"+ - "\u022b\u022a\u0001\u0000\u0000\u0000\u022b\u022c\u0001\u0000\u0000\u0000"+ - "\u022c\'\u0001\u0000\u0000\u0000\u022d\u0232\u0005i\u0000\u0000\u022e"+ - "\u022f\u0005q\u0000\u0000\u022f\u0231\u0005i\u0000\u0000\u0230\u022e\u0001"+ - "\u0000\u0000\u0000\u0231\u0234\u0001\u0000\u0000\u0000\u0232\u0230\u0001"+ - "\u0000\u0000\u0000\u0232\u0233\u0001\u0000\u0000\u0000\u0233\u0235\u0001"+ - "\u0000\u0000\u0000\u0234\u0232\u0001\u0000\u0000\u0000\u0235\u0236\u0003"+ - "\u0140\u00a0\u0000\u0236)\u0001\u0000\u0000\u0000\u0237\u0239\u0003,\u0016"+ - "\u0000\u0238\u0237\u0001\u0000\u0000\u0000\u0239\u023c\u0001\u0000\u0000"+ - "\u0000\u023a\u0238\u0001\u0000\u0000\u0000\u023a\u023b\u0001\u0000\u0000"+ - "\u0000\u023b+\u0001\u0000\u0000\u0000\u023c\u023a\u0001\u0000\u0000\u0000"+ - "\u023d\u023e\u0005l\u0000\u0000\u023e\u0243\u0003\u00b2Y\u0000\u023f\u0240"+ - "\u0005q\u0000\u0000\u0240\u0242\u0003\u00b2Y\u0000\u0241\u023f\u0001\u0000"+ - "\u0000\u0000\u0242\u0245\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000"+ - "\u0000\u0000\u0243\u0244\u0001\u0000\u0000\u0000\u0244\u0246\u0001\u0000"+ - "\u0000\u0000\u0245\u0243\u0001\u0000\u0000\u0000\u0246\u0247\u0005m\u0000"+ - "\u0000\u0247-\u0001\u0000\u0000\u0000\u0248\u0249\u0003\u00c2a\u0000\u0249"+ - "/\u0001\u0000\u0000\u0000\u024a\u024b\u00052\u0000\u0000\u024b\u024c\u0005"+ - "j\u0000\u0000\u024c\u024d\u0003\u00b2Y\u0000\u024d\u024e\u0005k\u0000"+ - "\u0000\u024e1\u0001\u0000\u0000\u0000\u024f\u0250\u00058\u0000\u0000\u0250"+ - "\u0251\u0005n\u0000\u0000\u0251\u0252\u0003\u00d0h\u0000\u0252\u0253\u0005"+ - "o\u0000\u0000\u02533\u0001\u0000\u0000\u0000\u0254\u0255\u00053\u0000"+ - "\u0000\u0255\u0256\u0005j\u0000\u0000\u0256\u0257\u0003\u00b2Y\u0000\u0257"+ - "\u0258\u0005k\u0000\u0000\u02585\u0001\u0000\u0000\u0000\u0259\u025a\u0007"+ - "\u0004\u0000\u0000\u025a\u025b\u0005j\u0000\u0000\u025b\u025c\u0003\u00b2"+ - "Y\u0000\u025c\u025d\u0005k\u0000\u0000\u025d7\u0001\u0000\u0000\u0000"+ - "\u025e\u0263\u0005\u0011\u0000\u0000\u025f\u0260\u0005n\u0000\u0000\u0260"+ - "\u0261\u0003:\u001d\u0000\u0261\u0262\u0005o\u0000\u0000\u0262\u0264\u0001"+ - "\u0000\u0000\u0000\u0263\u025f\u0001\u0000\u0000\u0000\u0263\u0264\u0001"+ - "\u0000\u0000\u0000\u0264\u0265\u0001\u0000\u0000\u0000\u0265\u0266\u0005"+ - "j\u0000\u0000\u0266\u0267\u0003\u00b2Y\u0000\u0267\u0268\u0005k\u0000"+ - "\u0000\u02689\u0001\u0000\u0000\u0000\u0269\u026c\u0003<\u001e\u0000\u026a"+ - "\u026c\u0005\u0013\u0000\u0000\u026b\u0269\u0001\u0000\u0000\u0000\u026b"+ - "\u026a\u0001\u0000\u0000\u0000\u026c;\u0001\u0000\u0000\u0000\u026d\u026e"+ - "\u0005i\u0000\u0000\u026e=\u0001\u0000\u0000\u0000\u026f\u0270\u0005\u0012"+ - "\u0000\u0000\u0270\u0271\u0005j\u0000\u0000\u0271\u0272\u0003\u00b2Y\u0000"+ - "\u0272\u0273\u0005k\u0000\u0000\u0273?\u0001\u0000\u0000\u0000\u0274\u0275"+ - "\u0005;\u0000\u0000\u0275\u0276\u0005j\u0000\u0000\u0276\u0277\u0003\u00b2"+ - "Y\u0000\u0277\u0278\u0005k\u0000\u0000\u0278A\u0001\u0000\u0000\u0000"+ - "\u0279\u027a\u0005:\u0000\u0000\u027a\u027b\u0005j\u0000\u0000\u027b\u027c"+ - "\u0003\u00b2Y\u0000\u027c\u027d\u0005k\u0000\u0000\u027dC\u0001\u0000"+ - "\u0000\u0000\u027e\u027f\u0005\u0016\u0000\u0000\u027f\u0280\u0005j\u0000"+ - "\u0000\u0280\u0283\u0003\u00b2Y\u0000\u0281\u0282\u0005q\u0000\u0000\u0282"+ - "\u0284\u0003\u00b2Y\u0000\u0283\u0281\u0001\u0000\u0000\u0000\u0283\u0284"+ - "\u0001\u0000\u0000\u0000\u0284\u0285\u0001\u0000\u0000\u0000\u0285\u0286"+ - "\u0005k\u0000\u0000\u0286E\u0001\u0000\u0000\u0000\u0287\u0288\u0007\u0004"+ - "\u0000\u0000\u0288\u0289\u0005n\u0000\u0000\u0289\u028a\u0003\u00b2Y\u0000"+ - "\u028a\u028b\u0005>\u0000\u0000\u028b\u028c\u0003\u00b2Y\u0000\u028c\u028d"+ - "\u0005o\u0000\u0000\u028dG\u0001\u0000\u0000\u0000\u028e\u028f\u00057"+ - "\u0000\u0000\u028f\u0290\u0003\u00b2Y\u0000\u0290\u0296\u0005l\u0000\u0000"+ - "\u0291\u0292\u0003J%\u0000\u0292\u0293\u0003\u017e\u00bf\u0000\u0293\u0295"+ - "\u0001\u0000\u0000\u0000\u0294\u0291\u0001\u0000\u0000\u0000\u0295\u0298"+ - "\u0001\u0000\u0000\u0000\u0296\u0294\u0001\u0000\u0000\u0000\u0296\u0297"+ - "\u0001\u0000\u0000\u0000\u0297\u0299\u0001\u0000\u0000\u0000\u0298\u0296"+ - "\u0001\u0000\u0000\u0000\u0299\u029a\u0005m\u0000\u0000\u029aI\u0001\u0000"+ - "\u0000\u0000\u029b\u029c\u0003x<\u0000\u029c\u029d\u0005s\u0000\u0000"+ - "\u029d\u029e\u0003\u00b2Y\u0000\u029eK\u0001\u0000\u0000\u0000\u029f\u02a0"+ - "\u0005n\u0000\u0000\u02a0\u02a5\u0003N\'\u0000\u02a1\u02a2\u0005q\u0000"+ - "\u0000\u02a2\u02a4\u0003N\'\u0000\u02a3\u02a1\u0001\u0000\u0000\u0000"+ - "\u02a4\u02a7\u0001\u0000\u0000\u0000\u02a5\u02a3\u0001\u0000\u0000\u0000"+ - "\u02a5\u02a6\u0001\u0000\u0000\u0000\u02a6\u02a8\u0001\u0000\u0000\u0000"+ - "\u02a7\u02a5\u0001\u0000\u0000\u0000\u02a8\u02a9\u0005o\u0000\u0000\u02a9"+ - "M\u0001\u0000\u0000\u0000\u02aa\u02ab\u0003\u00b2Y\u0000\u02ab\u02ac\u0005"+ - "p\u0000\u0000\u02ac\u02ad\u0003\u00b2Y\u0000\u02adO\u0001\u0000\u0000"+ - "\u0000\u02ae\u02b4\u0003`0\u0000\u02af\u02b4\u0003\\.\u0000\u02b0\u02b4"+ - "\u0003^/\u0000\u02b1\u02b4\u0003R)\u0000\u02b2\u02b4\u0003V+\u0000\u02b3"+ - "\u02ae\u0001\u0000\u0000\u0000\u02b3\u02af\u0001\u0000\u0000\u0000\u02b3"+ - "\u02b0\u0001\u0000\u0000\u0000\u02b3\u02b1\u0001\u0000\u0000\u0000\u02b3"+ - "\u02b2\u0001\u0000\u0000\u0000\u02b4Q\u0001\u0000\u0000\u0000\u02b5\u02b6"+ - "\u00054\u0000\u0000\u02b6\u02bc\u0005l\u0000\u0000\u02b7\u02b8\u0003T"+ - "*\u0000\u02b8\u02b9\u0003\u017e\u00bf\u0000\u02b9\u02bb\u0001\u0000\u0000"+ - "\u0000\u02ba\u02b7\u0001\u0000\u0000\u0000\u02bb\u02be\u0001\u0000\u0000"+ - "\u0000\u02bc\u02ba\u0001\u0000\u0000\u0000\u02bc\u02bd\u0001\u0000\u0000"+ - "\u0000\u02bd\u02bf\u0001\u0000\u0000\u0000\u02be\u02bc\u0001\u0000\u0000"+ - "\u0000\u02bf\u02c0\u0005m\u0000\u0000\u02c0S\u0001\u0000\u0000\u0000\u02c1"+ - "\u02c2\u0005Q\u0000\u0000\u02c2\u02c3\u0005i\u0000\u0000\u02c3\u02cb\u0003"+ - "\u014c\u00a6\u0000\u02c4\u02c5\u00055\u0000\u0000\u02c5\u02c6\u0005l\u0000"+ - "\u0000\u02c6\u02c7\u0003\u00b2Y\u0000\u02c7\u02c8\u0003\u017e\u00bf\u0000"+ - "\u02c8\u02c9\u0005m\u0000\u0000\u02c9\u02cb\u0001\u0000\u0000\u0000\u02ca"+ - "\u02c1\u0001\u0000\u0000\u0000\u02ca\u02c4\u0001\u0000\u0000\u0000\u02cb"+ - "U\u0001\u0000\u0000\u0000\u02cc\u02cd\u00056\u0000\u0000\u02cd\u02d3\u0005"+ - "l\u0000\u0000\u02ce\u02cf\u0003X,\u0000\u02cf\u02d0\u0003\u017e\u00bf"+ - "\u0000\u02d0\u02d2\u0001\u0000\u0000\u0000\u02d1\u02ce\u0001\u0000\u0000"+ - "\u0000\u02d2\u02d5\u0001\u0000\u0000\u0000\u02d3\u02d1\u0001\u0000\u0000"+ - "\u0000\u02d3\u02d4\u0001\u0000\u0000\u0000\u02d4\u02d6\u0001\u0000\u0000"+ - "\u0000\u02d5\u02d3\u0001\u0000\u0000\u0000\u02d6\u02d7\u0005m\u0000\u0000"+ - "\u02d7W\u0001\u0000\u0000\u0000\u02d8\u02d9\u0005i\u0000\u0000\u02d9\u02df"+ - "\u0005l\u0000\u0000\u02da\u02db\u0003Z-\u0000\u02db\u02dc\u0003\u017e"+ - "\u00bf\u0000\u02dc\u02de\u0001\u0000\u0000\u0000\u02dd\u02da\u0001\u0000"+ - "\u0000\u0000\u02de\u02e1\u0001\u0000\u0000\u0000\u02df\u02dd\u0001\u0000"+ - "\u0000\u0000\u02df\u02e0\u0001\u0000\u0000\u0000\u02e0\u02e2\u0001\u0000"+ - "\u0000\u0000\u02e1\u02df\u0001\u0000\u0000\u0000\u02e2\u02e3\u0005m\u0000"+ - "\u0000\u02e3Y\u0001\u0000\u0000\u0000\u02e4\u02e6\u0003\u00f2y\u0000\u02e5"+ - "\u02e4\u0001\u0000\u0000\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6"+ - "\u02e7\u0001\u0000\u0000\u0000\u02e7\u02e8\u0003\u00d0h\u0000\u02e8[\u0001"+ - "\u0000\u0000\u0000\u02e9\u02ea\u0005\u001b\u0000\u0000\u02ea\u02eb\u0005"+ - "n\u0000\u0000\u02eb\u02ec\u0005o\u0000\u0000\u02ec\u02ed\u0003\u0140\u00a0"+ - "\u0000\u02ed]\u0001\u0000\u0000\u0000\u02ee\u02ef\u0005-\u0000\u0000\u02ef"+ - "\u02f0\u0005n\u0000\u0000\u02f0\u02f1\u0003\u0140\u00a0\u0000\u02f1\u02f2"+ - "\u0005o\u0000\u0000\u02f2_\u0001\u0000\u0000\u0000\u02f3\u02f4\u0007\u0005"+ - "\u0000\u0000\u02f4\u02f5\u0005n\u0000\u0000\u02f5\u02f6\u0003\u00d0h\u0000"+ - "\u02f6\u02f7\u0005o\u0000\u0000\u02f7\u02ff\u0001\u0000\u0000\u0000\u02f8"+ - "\u02f9\u0005+\u0000\u0000\u02f9\u02fa\u0005n\u0000\u0000\u02fa\u02fb\u0003"+ - "\u00d0h\u0000\u02fb\u02fc\u0005o\u0000\u0000\u02fc\u02fd\u0003\u00d0h"+ - "\u0000\u02fd\u02ff\u0001\u0000\u0000\u0000\u02fe\u02f3\u0001\u0000\u0000"+ - "\u0000\u02fe\u02f8\u0001\u0000\u0000\u0000\u02ffa\u0001\u0000\u0000\u0000"+ - "\u0300\u0308\u0003n7\u0000\u0301\u0302\u0005L\u0000\u0000\u0302\u0308"+ - "\u00061\uffff\uffff\u0000\u0303\u0304\u0005\u000e\u0000\u0000\u0304\u0308"+ - "\u00061\uffff\uffff\u0000\u0305\u0306\u0005D\u0000\u0000\u0306\u0308\u0006"+ - "1\uffff\uffff\u0000\u0307\u0300\u0001\u0000\u0000\u0000\u0307\u0301\u0001"+ - "\u0000\u0000\u0000\u0307\u0303\u0001\u0000\u0000\u0000\u0307\u0305\u0001"+ - "\u0000\u0000\u0000\u0308\u0309\u0001\u0000\u0000\u0000\u0309\u030b\u0003"+ - "\u017e\u00bf\u0000\u030a\u0307\u0001\u0000\u0000\u0000\u030b\u030e\u0001"+ - "\u0000\u0000\u0000\u030c\u030d\u0001\u0000\u0000\u0000\u030c\u030a\u0001"+ - "\u0000\u0000\u0000\u030d\u0311\u0001\u0000\u0000\u0000\u030e\u030c\u0001"+ - "\u0000\u0000\u0000\u030f\u0310\u0005\u000e\u0000\u0000\u0310\u0312\u0006"+ - "1\uffff\uffff\u0000\u0311\u030f\u0001\u0000\u0000\u0000\u0311\u0312\u0001"+ - "\u0000\u0000\u0000\u0312\u0314\u0001\u0000\u0000\u0000\u0313\u0315\u0003"+ - "l6\u0000\u0314\u0313\u0001\u0000\u0000\u0000\u0314\u0315\u0001\u0000\u0000"+ - "\u0000\u0315c\u0001\u0000\u0000\u0000\u0316\u0318\b\u0006\u0000\u0000"+ - "\u0317\u0316\u0001\u0000\u0000\u0000\u0318\u0319\u0001\u0000\u0000\u0000"+ - "\u0319\u0317\u0001\u0000\u0000\u0000\u0319\u031a\u0001\u0000\u0000\u0000"+ - "\u031ae\u0001\u0000\u0000\u0000\u031b\u0320\u0003d2\u0000\u031c\u031d"+ - "\u0005q\u0000\u0000\u031d\u031f\u0003d2\u0000\u031e\u031c\u0001\u0000"+ - "\u0000\u0000\u031f\u0322\u0001\u0000\u0000\u0000\u0320\u031e\u0001\u0000"+ - "\u0000\u0000\u0320\u0321\u0001\u0000\u0000\u0000\u0321g\u0001\u0000\u0000"+ - "\u0000\u0322\u0320\u0001\u0000\u0000\u0000\u0323\u0324\u0003d2\u0000\u0324"+ - "\u0326\u0005j\u0000\u0000\u0325\u0327\u0003f3\u0000\u0326\u0325\u0001"+ - "\u0000\u0000\u0000\u0326\u0327\u0001\u0000\u0000\u0000\u0327\u0328\u0001"+ - "\u0000\u0000\u0000\u0328\u0329\u0005k\u0000\u0000\u0329i\u0001\u0000\u0000"+ - "\u0000\u032a\u032f\u0003h4\u0000\u032b\u032c\u0005q\u0000\u0000\u032c"+ - "\u032e\u0003h4\u0000\u032d\u032b\u0001\u0000\u0000\u0000\u032e\u0331\u0001"+ - "\u0000\u0000\u0000\u032f\u032d\u0001\u0000\u0000\u0000\u032f\u0330\u0001"+ - "\u0000\u0000\u0000\u0330k\u0001\u0000\u0000\u0000\u0331\u032f\u0001\u0000"+ - "\u0000\u0000\u0332\u0333\u0005N\u0000\u0000\u0333\u0335\u0005n\u0000\u0000"+ - "\u0334\u0336\u0003j5\u0000\u0335\u0334\u0001\u0000\u0000\u0000\u0335\u0336"+ - "\u0001\u0000\u0000\u0000\u0336\u0337\u0001\u0000\u0000\u0000\u0337\u0338"+ - "\u0005o\u0000\u0000\u0338\u0339\u0003\u017e\u00bf\u0000\u0339m\u0001\u0000"+ - "\u0000\u0000\u033a\u033b\u0005\t\u0000\u0000\u033b\u0343\u0003r9\u0000"+ - "\u033c\u033d\u0005\n\u0000\u0000\u033d\u0343\u0003r9\u0000\u033e\u033f"+ - "\u0005\u000b\u0000\u0000\u033f\u0343\u0003r9\u0000\u0340\u0341\u0005\r"+ - "\u0000\u0000\u0341\u0343\u0003p8\u0000\u0342\u033a\u0001\u0000\u0000\u0000"+ - "\u0342\u033c\u0001\u0000\u0000\u0000\u0342\u033e\u0001\u0000\u0000\u0000"+ - "\u0342\u0340\u0001\u0000\u0000\u0000\u0343o\u0001\u0000\u0000\u0000\u0344"+ - "\u0346\u0003\u00f4z\u0000\u0345\u0344\u0001\u0000\u0000\u0000\u0345\u0346"+ - "\u0001\u0000\u0000\u0000\u0346\u0349\u0001\u0000\u0000\u0000\u0347\u0348"+ - "\u0005`\u0000\u0000\u0348\u034a\u0003\u00b2Y\u0000\u0349\u0347\u0001\u0000"+ - "\u0000\u0000\u0349\u034a\u0001\u0000\u0000\u0000\u034aq\u0001\u0000\u0000"+ - "\u0000\u034b\u034e\u0001\u0000\u0000\u0000\u034c\u034e\u0003\u00b2Y\u0000"+ - "\u034d\u034b\u0001\u0000\u0000\u0000\u034d\u034c\u0001\u0000\u0000\u0000"+ - "\u034es\u0001\u0000\u0000\u0000\u034f\u0350\u00057\u0000\u0000\u0350\u0351"+ - "\u0003\u00b2Y\u0000\u0351\u0355\u0005l\u0000\u0000\u0352\u0354\u0003v"+ - ";\u0000\u0353\u0352\u0001\u0000\u0000\u0000\u0354\u0357\u0001\u0000\u0000"+ - "\u0000\u0355\u0353\u0001\u0000\u0000\u0000\u0355\u0356\u0001\u0000\u0000"+ - "\u0000\u0356\u0358\u0001\u0000\u0000\u0000\u0357\u0355\u0001\u0000\u0000"+ - "\u0000\u0358\u0359\u0005m\u0000\u0000\u0359u\u0001\u0000\u0000\u0000\u035a"+ - "\u035b\u0003x<\u0000\u035b\u035d\u0005s\u0000\u0000\u035c\u035e\u0003"+ - "\u00fe\u007f\u0000\u035d\u035c\u0001\u0000\u0000\u0000\u035d\u035e\u0001"+ - "\u0000\u0000\u0000\u035ew\u0001\u0000\u0000\u0000\u035f\u0360\u0005T\u0000"+ - "\u0000\u0360\u0363\u0003z=\u0000\u0361\u0363\u0005P\u0000\u0000\u0362"+ - "\u035f\u0001\u0000\u0000\u0000\u0362\u0361\u0001\u0000\u0000\u0000\u0363"+ - "y\u0001\u0000\u0000\u0000\u0364\u0365\u0005%\u0000\u0000\u0365\u0372\u0005"+ - "i\u0000\u0000\u0366\u0367\u0003\u00d8l\u0000\u0367\u036c\u0005l\u0000"+ - "\u0000\u0368\u036a\u0003|>\u0000\u0369\u036b\u0005q\u0000\u0000\u036a"+ - "\u0369\u0001\u0000\u0000\u0000\u036a\u036b\u0001\u0000\u0000\u0000\u036b"+ - "\u036d\u0001\u0000\u0000\u0000\u036c\u0368\u0001\u0000\u0000\u0000\u036c"+ - "\u036d\u0001\u0000\u0000\u0000\u036d\u036e\u0001\u0000\u0000\u0000\u036e"+ - "\u036f\u0005m\u0000\u0000\u036f\u0372\u0001\u0000\u0000\u0000\u0370\u0372"+ - "\u0003\u00b2Y\u0000\u0371\u0364\u0001\u0000\u0000\u0000\u0371\u0366\u0001"+ - "\u0000\u0000\u0000\u0371\u0370\u0001\u0000\u0000\u0000\u0372{\u0001\u0000"+ - "\u0000\u0000\u0373\u0378\u0003z=\u0000\u0374\u0375\u0005q\u0000\u0000"+ - "\u0375\u0377\u0003z=\u0000\u0376\u0374\u0001\u0000\u0000\u0000\u0377\u037a"+ - "\u0001\u0000\u0000\u0000\u0378\u0376\u0001\u0000\u0000\u0000\u0378\u0379"+ - "\u0001\u0000\u0000\u0000\u0379}\u0001\u0000\u0000\u0000\u037a\u0378\u0001"+ - "\u0000\u0000\u0000\u037b\u0380\u0005l\u0000\u0000\u037c\u037d\u0005<\u0000"+ - "\u0000\u037d\u037e\u0003\u00f2y\u0000\u037e\u037f\u0003\u017e\u00bf\u0000"+ - "\u037f\u0381\u0001\u0000\u0000\u0000\u0380\u037c\u0001\u0000\u0000\u0000"+ - "\u0380\u0381\u0001\u0000\u0000\u0000\u0381\u0383\u0001\u0000\u0000\u0000"+ - "\u0382\u0384\u0003\u00fe\u007f\u0000\u0383\u0382\u0001\u0000\u0000\u0000"+ - "\u0383\u0384\u0001\u0000\u0000\u0000\u0384\u0385\u0001\u0000\u0000\u0000"+ - "\u0385\u0386\u0005m\u0000\u0000\u0386\u007f\u0001\u0000\u0000\u0000\u0387"+ - "\u038a\u0003\u015e\u00af\u0000\u0388\u038a\u0005i\u0000\u0000\u0389\u0387"+ - "\u0001\u0000\u0000\u0000\u0389\u0388\u0001\u0000\u0000\u0000\u038a\u0393"+ - "\u0001\u0000\u0000\u0000\u038b\u0390\u0005l\u0000\u0000\u038c\u038e\u0003"+ - "\u0082A\u0000\u038d\u038f\u0005q\u0000\u0000\u038e\u038d\u0001\u0000\u0000"+ - "\u0000\u038e\u038f\u0001\u0000\u0000\u0000\u038f\u0391\u0001\u0000\u0000"+ - "\u0000\u0390\u038c\u0001\u0000\u0000\u0000\u0390\u0391\u0001\u0000\u0000"+ - "\u0000\u0391\u0392\u0001\u0000\u0000\u0000\u0392\u0394\u0005m\u0000\u0000"+ - "\u0393\u038b\u0001\u0000\u0000\u0000\u0393\u0394\u0001\u0000\u0000\u0000"+ - "\u0394\u0081\u0001\u0000\u0000\u0000\u0395\u039a\u0003\u0084B\u0000\u0396"+ - "\u0397\u0005q\u0000\u0000\u0397\u0399\u0003\u0084B\u0000\u0398\u0396\u0001"+ - "\u0000\u0000\u0000\u0399\u039c\u0001\u0000\u0000\u0000\u039a\u0398\u0001"+ - "\u0000\u0000\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u0083\u0001"+ - "\u0000\u0000\u0000\u039c\u039a\u0001\u0000\u0000\u0000\u039d\u039e\u0005"+ - "i\u0000\u0000\u039e\u03a0\u0005s\u0000\u0000\u039f\u039d\u0001\u0000\u0000"+ - "\u0000\u039f\u03a0\u0001\u0000\u0000\u0000\u03a0\u03a1\u0001\u0000\u0000"+ - "\u0000\u03a1\u03a2\u0003\u00b2Y\u0000\u03a2\u0085\u0001\u0000\u0000\u0000"+ - "\u03a3\u03a4\u0005H\u0000\u0000\u03a4\u03a5\u0003\u00b2Y\u0000\u03a5\u03a6"+ - "\u0005\u000f\u0000\u0000\u03a6\u03a7\u0003\u0080@\u0000\u03a7\u03a8\u0003"+ - "\u00fc~\u0000\u03a8\u0087\u0001\u0000\u0000\u0000\u03a9\u03aa\u0003\u00d0"+ - "h\u0000\u03aa\u03ab\u0005\u000f\u0000\u0000\u03ab\u03be\u0003\u00d0h\u0000"+ - "\u03ac\u03b2\u0005l\u0000\u0000\u03ad\u03ae\u0003\u0090H\u0000\u03ae\u03af"+ - "\u0003\u017e\u00bf\u0000\u03af\u03b1\u0001\u0000\u0000\u0000\u03b0\u03ad"+ - "\u0001\u0000\u0000\u0000\u03b1\u03b4\u0001\u0000\u0000\u0000\u03b2\u03b0"+ - "\u0001\u0000\u0000\u0000\u03b2\u03b3\u0001\u0000\u0000\u0000\u03b3\u03ba"+ - "\u0001\u0000\u0000\u0000\u03b4\u03b2\u0001\u0000\u0000\u0000\u03b5\u03b6"+ - "\u0003\u008aE\u0000\u03b6\u03b7\u0003\u017e\u00bf\u0000\u03b7\u03b9\u0001"+ - "\u0000\u0000\u0000\u03b8\u03b5\u0001\u0000\u0000\u0000\u03b9\u03bc\u0001"+ - "\u0000\u0000\u0000\u03ba\u03b8\u0001\u0000\u0000\u0000\u03ba\u03bb\u0001"+ - "\u0000\u0000\u0000\u03bb\u03bd\u0001\u0000\u0000\u0000\u03bc\u03ba\u0001"+ - "\u0000\u0000\u0000\u03bd\u03bf\u0005m\u0000\u0000\u03be\u03ac\u0001\u0000"+ - "\u0000\u0000\u03be\u03bf\u0001\u0000\u0000\u0000\u03bf\u0089\u0001\u0000"+ - "\u0000\u0000\u03c0\u03c2\u0005\u000e\u0000\u0000\u03c1\u03c0\u0001\u0000"+ - "\u0000\u0000\u03c1\u03c2\u0001\u0000\u0000\u0000\u03c2\u03c3\u0001\u0000"+ - "\u0000\u0000\u03c3\u03c4\u0003\u008cF\u0000\u03c4\u03c5\u0005i\u0000\u0000"+ - "\u03c5\u03c7\u0003\u014c\u00a6\u0000\u03c6\u03c8\u0003\u00fc~\u0000\u03c7"+ - "\u03c6\u0001\u0000\u0000\u0000\u03c7\u03c8\u0001\u0000\u0000\u0000\u03c8"+ - "\u008b\u0001\u0000\u0000\u0000\u03c9\u03cb\u0005j\u0000\u0000\u03ca\u03cc"+ - "\u0005i\u0000\u0000\u03cb\u03ca\u0001\u0000\u0000\u0000\u03cb\u03cc\u0001"+ - "\u0000\u0000\u0000\u03cc\u03ce\u0001\u0000\u0000\u0000\u03cd\u03cf\u0005"+ - "\u008b\u0000\u0000\u03ce\u03cd\u0001\u0000\u0000\u0000\u03ce\u03cf\u0001"+ - "\u0000\u0000\u0000\u03cf\u03d0\u0001\u0000\u0000\u0000\u03d0\u03d1\u0003"+ - "\u013a\u009d\u0000\u03d1\u03d2\u0005k\u0000\u0000\u03d2\u008d\u0001\u0000"+ - "\u0000\u0000\u03d3\u03d9\u0003\u00c2a\u0000\u03d4\u03d5\u0003\u00d0h\u0000"+ - "\u03d5\u03d6\u0005t\u0000\u0000\u03d6\u03d7\u0005i\u0000\u0000\u03d7\u03d9"+ - "\u0001\u0000\u0000\u0000\u03d8\u03d3\u0001\u0000\u0000\u0000\u03d8\u03d4"+ - "\u0001\u0000\u0000\u0000\u03d9\u008f\u0001\u0000\u0000\u0000\u03da\u03db"+ - "\u00059\u0000\u0000\u03db\u03dc\u0005i\u0000\u0000\u03dc\u03df\u0005w"+ - "\u0000\u0000\u03dd\u03e0\u0003\u008eG\u0000\u03de\u03e0\u0003\u015c\u00ae"+ - "\u0000\u03df\u03dd\u0001\u0000\u0000\u0000\u03df\u03de\u0001\u0000\u0000"+ - "\u0000\u03e0\u0091\u0001\u0000\u0000\u0000\u03e1\u03e2\u00050\u0000\u0000"+ - "\u03e2\u03e3\u0005j\u0000\u0000\u03e3\u03e6\u0003\u00d0h\u0000\u03e4\u03e5"+ - "\u0005q\u0000\u0000\u03e5\u03e7\u0003\u00f4z\u0000\u03e6\u03e4\u0001\u0000"+ - "\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000\u03e7\u03e8\u0001\u0000"+ - "\u0000\u0000\u03e8\u03e9\u0005k\u0000\u0000\u03e9\u0093\u0001\u0000\u0000"+ - "\u0000\u03ea\u03eb\u0005/\u0000\u0000\u03eb\u03ec\u0005j\u0000\u0000\u03ec"+ - "\u03ed\u0003\u00d0h\u0000\u03ed\u03ee\u0005k\u0000\u0000\u03ee\u0095\u0001"+ - "\u0000\u0000\u0000\u03ef\u03f2\u0003b1\u0000\u03f0\u03f3\u0003\u0098L"+ - "\u0000\u03f1\u03f3\u0003\u009aM\u0000\u03f2\u03f0\u0001\u0000\u0000\u0000"+ - "\u03f2\u03f1\u0001\u0000\u0000\u0000\u03f3\u0097\u0001\u0000\u0000\u0000"+ - "\u03f4\u03f5\u0005Q\u0000\u0000\u03f5\u03f6\u0005i\u0000\u0000\u03f6\u03f8"+ - "\u0003\u014c\u00a6\u0000\u03f7\u03f9\u0003~?\u0000\u03f8\u03f7\u0001\u0000"+ - "\u0000\u0000\u03f8\u03f9\u0001\u0000\u0000\u0000\u03f9\u0099\u0001\u0000"+ - "\u0000\u0000\u03fa\u03fb\u0005Q\u0000\u0000\u03fb\u03fc\u0003\u00a8T\u0000"+ - "\u03fc\u03fd\u0005i\u0000\u0000\u03fd\u03ff\u0003\u014c\u00a6\u0000\u03fe"+ - "\u0400\u0003~?\u0000\u03ff\u03fe\u0001\u0000\u0000\u0000\u03ff\u0400\u0001"+ - "\u0000\u0000\u0000\u0400\u009b\u0001\u0000\u0000\u0000\u0401\u0404\u0005"+ - "\u001b\u0000\u0000\u0402\u0405\u0003\u0096K\u0000\u0403\u0405\u0003\u00ec"+ - "v\u0000\u0404\u0402\u0001\u0000\u0000\u0000\u0404\u0403\u0001\u0000\u0000"+ - "\u0000\u0405\u009d\u0001\u0000\u0000\u0000\u0406\u0407\u00059\u0000\u0000"+ - "\u0407\u0408\u0005i\u0000\u0000\u0408\u040a\u0003\u0150\u00a8\u0000\u0409"+ - "\u040b\u0003\u00a0P\u0000\u040a\u0409\u0001\u0000\u0000\u0000\u040a\u040b"+ - "\u0001\u0000\u0000\u0000\u040b\u009f\u0001\u0000\u0000\u0000\u040c\u040d"+ - "\u0005l\u0000\u0000\u040d\u040e\u0003\u00b2Y\u0000\u040e\u040f\u0003\u017e"+ - "\u00bf\u0000\u040f\u0410\u0005m\u0000\u0000\u0410\u00a1\u0001\u0000\u0000"+ - "\u0000\u0411\u0412\u00059\u0000\u0000\u0412\u0413\u0003\u00a8T\u0000\u0413"+ - "\u0414\u0005i\u0000\u0000\u0414\u0416\u0003\u0150\u00a8\u0000\u0415\u0417"+ - "\u0003\u00a0P\u0000\u0416\u0415\u0001\u0000\u0000\u0000\u0416\u0417\u0001"+ - "\u0000\u0000\u0000\u0417\u00a3\u0001\u0000\u0000\u0000\u0418\u0420\u0003"+ - "\u0006\u0003\u0000\u0419\u041c\u0003\u00d0h\u0000\u041a\u041b\u0005p\u0000"+ - "\u0000\u041b\u041d\u0003\u00f4z\u0000\u041c\u041a\u0001\u0000\u0000\u0000"+ - "\u041c\u041d\u0001\u0000\u0000\u0000\u041d\u0421\u0001\u0000\u0000\u0000"+ - "\u041e\u041f\u0005p\u0000\u0000\u041f\u0421\u0003\u00f4z\u0000\u0420\u0419"+ - "\u0001\u0000\u0000\u0000\u0420\u041e\u0001\u0000\u0000\u0000\u0421\u00a5"+ - "\u0001\u0000\u0000\u0000\u0422\u0423\u0003\u0006\u0003\u0000\u0423\u0424"+ - "\u0005w\u0000\u0000\u0424\u0425\u0003\u00f4z\u0000\u0425\u00a7\u0001\u0000"+ - "\u0000\u0000\u0426\u0428\u0005j\u0000\u0000\u0427\u0429\u0003\b\u0004"+ - "\u0000\u0428\u0427\u0001\u0000\u0000\u0000\u0428\u0429\u0001\u0000\u0000"+ - "\u0000\u0429\u042a\u0001\u0000\u0000\u0000\u042a\u042c\u0003\u00d0h\u0000"+ - "\u042b\u042d\u0005q\u0000\u0000\u042c\u042b\u0001\u0000\u0000\u0000\u042c"+ - "\u042d\u0001\u0000\u0000\u0000\u042d\u042e\u0001\u0000\u0000\u0000\u042e"+ - "\u042f\u0005k\u0000\u0000\u042f\u00a9\u0001\u0000\u0000\u0000\u0430\u0433"+ - "\u0003\u00acV\u0000\u0431\u0433\u0003\u00aeW\u0000\u0432\u0430\u0001\u0000"+ - "\u0000\u0000\u0432\u0431\u0001\u0000\u0000\u0000\u0433\u00ab\u0001\u0000"+ - "\u0000\u0000\u0434\u0436\u0003\u00f2y\u0000\u0435\u0434\u0001\u0000\u0000"+ - "\u0000\u0435\u0436\u0001\u0000\u0000\u0000\u0436\u0437\u0001\u0000\u0000"+ - "\u0000\u0437\u0438\u0003\u00b0X\u0000\u0438\u00ad\u0001\u0000\u0000\u0000"+ - "\u0439\u043b\u0005\u001b\u0000\u0000\u043a\u043c\u0003\u00f2y\u0000\u043b"+ - "\u043a\u0001\u0000\u0000\u0000\u043b\u043c\u0001\u0000\u0000\u0000\u043c"+ - "\u043d\u0001\u0000\u0000\u0000\u043d\u043e\u0003\u00b0X\u0000\u043e\u00af"+ - "\u0001\u0000\u0000\u0000\u043f\u0441\u0005x\u0000\u0000\u0440\u043f\u0001"+ - "\u0000\u0000\u0000\u0440\u0441\u0001\u0000\u0000\u0000\u0441\u0442\u0001"+ - "\u0000\u0000\u0000\u0442\u0443\u0003\u00d0h\u0000\u0443\u00b1\u0001\u0000"+ - "\u0000\u0000\u0444\u0445\u0006Y\uffff\uffff\u0000\u0445\u0446\u0007\u0007"+ - "\u0000\u0000\u0446\u045a\u0003\u00b2Y\u000f\u0447\u045a\u0003\u00c2a\u0000"+ - "\u0448\u0449\u0005\u0019\u0000\u0000\u0449\u044a\u0003.\u0017\u0000\u044a"+ - "\u044b\u0005\u001c\u0000\u0000\u044b\u044c\u0003\u00b2Y\u0003\u044c\u045a"+ - "\u0001\u0000\u0000\u0000\u044d\u044e\u0005\u001a\u0000\u0000\u044e\u044f"+ - "\u0003\u00a6S\u0000\u044f\u0450\u0005\u001c\u0000\u0000\u0450\u0451\u0003"+ - "\u00b2Y\u0002\u0451\u045a\u0001\u0000\u0000\u0000\u0452\u0453\u0007\b"+ - "\u0000\u0000\u0453\u0454\u0003&\u0013\u0000\u0454\u0455\u0005s\u0000\u0000"+ - "\u0455\u0456\u0005s\u0000\u0000\u0456\u0457\u0003*\u0015\u0000\u0457\u0458"+ - "\u0003\u00b2Y\u0001\u0458\u045a\u0001\u0000\u0000\u0000\u0459\u0444\u0001"+ - "\u0000\u0000\u0000\u0459\u0447\u0001\u0000\u0000\u0000\u0459\u0448\u0001"+ - "\u0000\u0000\u0000\u0459\u044d\u0001\u0000\u0000\u0000\u0459\u0452\u0001"+ - "\u0000\u0000\u0000\u045a\u047e\u0001\u0000\u0000\u0000\u045b\u045c\n\r"+ - "\u0000\u0000\u045c\u045d\u0007\t\u0000\u0000\u045d\u047d\u0003\u00b2Y"+ - "\u000e\u045e\u045f\n\f\u0000\u0000\u045f\u0460\u0007\n\u0000\u0000\u0460"+ - "\u047d\u0003\u00b2Y\r\u0461\u0462\n\u000b\u0000\u0000\u0462\u0463\u0007"+ - "\u000b\u0000\u0000\u0463\u047d\u0003\u00b2Y\f\u0464\u0465\n\n\u0000\u0000"+ - "\u0465\u0466\u0007\f\u0000\u0000\u0466\u047d\u0003\u00b2Y\u000b\u0467"+ - "\u0468\n\t\u0000\u0000\u0468\u0469\u0007\r\u0000\u0000\u0469\u047d\u0003"+ - "\u00b2Y\n\u046a\u046b\n\u0007\u0000\u0000\u046b\u046c\u0005z\u0000\u0000"+ - "\u046c\u047d\u0003\u00b2Y\b\u046d\u046e\n\u0006\u0000\u0000\u046e\u046f"+ - "\u0005y\u0000\u0000\u046f\u047d\u0003\u00b2Y\u0007\u0470\u0471\n\u0005"+ - "\u0000\u0000\u0471\u0472\u0005\"\u0000\u0000\u0472\u047d\u0003\u00b2Y"+ - "\u0005\u0473\u0474\n\u0004\u0000\u0000\u0474\u0475\u0005%\u0000\u0000"+ - "\u0475\u0476\u0003\u00b2Y\u0000\u0476\u0477\u0005s\u0000\u0000\u0477\u0478"+ - "\u0003\u00b2Y\u0004\u0478\u047d\u0001\u0000\u0000\u0000\u0479\u047a\n"+ - "\b\u0000\u0000\u047a\u047b\u0005\u000f\u0000\u0000\u047b\u047d\u0003\u0080"+ - "@\u0000\u047c\u045b\u0001\u0000\u0000\u0000\u047c\u045e\u0001\u0000\u0000"+ - "\u0000\u047c\u0461\u0001\u0000\u0000\u0000\u047c\u0464\u0001\u0000\u0000"+ - "\u0000\u047c\u0467\u0001\u0000\u0000\u0000\u047c\u046a\u0001\u0000\u0000"+ - "\u0000\u047c\u046d\u0001\u0000\u0000\u0000\u047c\u0470\u0001\u0000\u0000"+ - "\u0000\u047c\u0473\u0001\u0000\u0000\u0000\u047c\u0479\u0001\u0000\u0000"+ - "\u0000\u047d\u0480\u0001\u0000\u0000\u0000\u047e\u047c\u0001\u0000\u0000"+ - "\u0000\u047e\u047f\u0001\u0000\u0000\u0000\u047f\u00b3\u0001\u0000\u0000"+ - "\u0000\u0480\u047e\u0001\u0000\u0000\u0000\u0481\u0496\u0003\u0018\f\u0000"+ - "\u0482\u0496\u0003\u001a\r\u0000\u0483\u0496\u0003\u00b8\\\u0000\u0484"+ - "\u0496\u0003\u00b6[\u0000\u0485\u0496\u0003\u00ecv\u0000\u0486\u0496\u0003"+ - "\u010c\u0086\u0000\u0487\u0496\u0003\u0100\u0080\u0000\u0488\u0496\u0003"+ - "\u0138\u009c\u0000\u0489\u0496\u0003\u010e\u0087\u0000\u048a\u0496\u0003"+ - "\u0110\u0088\u0000\u048b\u0496\u0003\u0112\u0089\u0000\u048c\u0496\u0003"+ - "\u0114\u008a\u0000\u048d\u0496\u0003\u0116\u008b\u0000\u048e\u0496\u0003"+ - "\u00fc~\u0000\u048f\u0496\u0003\u0118\u008c\u0000\u0490\u0496\u0003\u011a"+ - "\u008d\u0000\u0491\u0496\u0003\u012c\u0096\u0000\u0492\u0496\u0003\u00ba"+ - "]\u0000\u0493\u0496\u0003\u00be_\u0000\u0494\u0496\u0003\u0086C\u0000"+ - "\u0495\u0481\u0001\u0000\u0000\u0000\u0495\u0482\u0001\u0000\u0000\u0000"+ - "\u0495\u0483\u0001\u0000\u0000\u0000\u0495\u0484\u0001\u0000\u0000\u0000"+ - "\u0495\u0485\u0001\u0000\u0000\u0000\u0495\u0486\u0001\u0000\u0000\u0000"+ - "\u0495\u0487\u0001\u0000\u0000\u0000\u0495\u0488\u0001\u0000\u0000\u0000"+ - "\u0495\u0489\u0001\u0000\u0000\u0000\u0495\u048a\u0001\u0000\u0000\u0000"+ - "\u0495\u048b\u0001\u0000\u0000\u0000\u0495\u048c\u0001\u0000\u0000\u0000"+ - "\u0495\u048d\u0001\u0000\u0000\u0000\u0495\u048e\u0001\u0000\u0000\u0000"+ - "\u0495\u048f\u0001\u0000\u0000\u0000\u0495\u0490\u0001\u0000\u0000\u0000"+ - "\u0495\u0491\u0001\u0000\u0000\u0000\u0495\u0492\u0001\u0000\u0000\u0000"+ - "\u0495\u0493\u0001\u0000\u0000\u0000\u0495\u0494\u0001\u0000\u0000\u0000"+ - "\u0496\u00b5\u0001\u0000\u0000\u0000\u0497\u0498\u0005$\u0000\u0000\u0498"+ - "\u0499\u0003\u00b2Y\u0000\u0499\u00b7\u0001\u0000\u0000\u0000\u049a\u049b"+ - "\u0005\\\u0000\u0000\u049b\u049d\u0003\u00b2Y\u0000\u049c\u049e\u0003"+ - "\u00fc~\u0000\u049d\u049c\u0001\u0000\u0000\u0000\u049d\u049e\u0001\u0000"+ - "\u0000\u0000\u049e\u00b9\u0001\u0000\u0000\u0000\u049f\u04a0\u0003\u00bc"+ - "^\u0000\u04a0\u04a1\u0003\u0134\u009a\u0000\u04a1\u00bb\u0001\u0000\u0000"+ - "\u0000\u04a2\u04a3\u0005\f\u0000\u0000\u04a3\u04a4\u0003\u00b2Y\u0000"+ - "\u04a4\u04a5\u0003\u017e\u00bf\u0000\u04a5\u04a7\u0001\u0000\u0000\u0000"+ - "\u04a6\u04a2\u0001\u0000\u0000\u0000\u04a7\u04aa\u0001\u0000\u0000\u0000"+ - "\u04a8\u04a6\u0001\u0000\u0000\u0000\u04a8\u04a9\u0001\u0000\u0000\u0000"+ - "\u04a9\u04af\u0001\u0000\u0000\u0000\u04aa\u04a8\u0001\u0000\u0000\u0000"+ - "\u04ab\u04ac\u0005\r\u0000\u0000\u04ac\u04ad\u0003p8\u0000\u04ad\u04ae"+ - "\u0003\u017e\u00bf\u0000\u04ae\u04b0\u0001\u0000\u0000\u0000\u04af\u04ab"+ - "\u0001\u0000\u0000\u0000\u04af\u04b0\u0001\u0000\u0000\u0000\u04b0\u00bd"+ - "\u0001\u0000\u0000\u0000\u04b1\u04b2\u0005U\u0000\u0000\u04b2\u04b7\u0003"+ - "\u00b2Y\u0000\u04b3\u04b4\u0005U\u0000\u0000\u04b4\u04b5\u0007\u0001\u0000"+ - "\u0000\u04b5\u04b7\u0003.\u0017\u0000\u04b6\u04b1\u0001\u0000\u0000\u0000"+ - "\u04b6\u04b3\u0001\u0000\u0000\u0000\u04b7\u00bf\u0001\u0000\u0000\u0000"+ - "\u04b8\u04c1\u0005\u0003\u0000\u0000\u04b9\u04c1\u0005\u0004\u0000\u0000"+ - "\u04ba\u04c1\u0005h\u0000\u0000\u04bb\u04c1\u0003\u015a\u00ad\u0000\u04bc"+ - "\u04c1\u0003\u0170\u00b8\u0000\u04bd\u04c1\u0005\u0001\u0000\u0000\u04be"+ - "\u04c1\u0005\u0093\u0000\u0000\u04bf\u04c1\u0005\u0094\u0000\u0000\u04c0"+ - "\u04b8\u0001\u0000\u0000\u0000\u04c0\u04b9\u0001\u0000\u0000\u0000\u04c0"+ - "\u04ba\u0001\u0000\u0000\u0000\u04c0\u04bb\u0001\u0000\u0000\u0000\u04c0"+ - "\u04bc\u0001\u0000\u0000\u0000\u04c0\u04bd\u0001\u0000\u0000\u0000\u04c0"+ - "\u04be\u0001\u0000\u0000\u0000\u04c0\u04bf\u0001\u0000\u0000\u0000\u04c1"+ - "\u00c1\u0001\u0000\u0000\u0000\u04c2\u04c3\u0006a\uffff\uffff\u0000\u04c3"+ - "\u04d3\u0003\u0156\u00ab\u0000\u04c4\u04d3\u0003\u0152\u00a9\u0000\u04c5"+ - "\u04d3\u0003\u017a\u00bd\u0000\u04c6\u04d3\u0003 \u0010\u0000\u04c7\u04d3"+ - "\u0003\u0094J\u0000\u04c8\u04d3\u0003\u0092I\u0000\u04c9\u04ca\u0005M"+ - "\u0000\u0000\u04ca\u04cb\u0003\u00c2a\u0000\u04cb\u04cc\u0003\u0178\u00bc"+ - "\u0000\u04cc\u04d3\u0001\u0000\u0000\u0000\u04cd\u04ce\u0007\u000e\u0000"+ - "\u0000\u04ce\u04cf\u0005j\u0000\u0000\u04cf\u04d0\u0003\u00b2Y\u0000\u04d0"+ - "\u04d1\u0005k\u0000\u0000\u04d1\u04d3\u0001\u0000\u0000\u0000\u04d2\u04c2"+ - "\u0001\u0000\u0000\u0000\u04d2\u04c4\u0001\u0000\u0000\u0000\u04d2\u04c5"+ - "\u0001\u0000\u0000\u0000\u04d2\u04c6\u0001\u0000\u0000\u0000\u04d2\u04c7"+ - "\u0001\u0000\u0000\u0000\u04d2\u04c8\u0001\u0000\u0000\u0000\u04d2\u04c9"+ - "\u0001\u0000\u0000\u0000\u04d2\u04cd\u0001\u0000\u0000\u0000\u04d3\u04ea"+ - "\u0001\u0000\u0000\u0000\u04d4\u04d5\n\n\u0000\u0000\u04d5\u04d6\u0005"+ - "t\u0000\u0000\u04d6\u04e9\u0005i\u0000\u0000\u04d7\u04d8\n\t\u0000\u0000"+ - "\u04d8\u04e9\u0003\u0174\u00ba\u0000\u04d9\u04da\n\b\u0000\u0000\u04da"+ - "\u04e9\u0003\u00dcn\u0000\u04db\u04dc\n\u0007\u0000\u0000\u04dc\u04e9"+ - "\u0003L&\u0000\u04dd\u04de\n\u0006\u0000\u0000\u04de\u04e9\u0003\u0176"+ - "\u00bb\u0000\u04df\u04e0\n\u0005\u0000\u0000\u04e0\u04e9\u0003\u0178\u00bc"+ - "\u0000\u04e1\u04e2\n\u0003\u0000\u0000\u04e2\u04e3\u0003\u0178\u00bc\u0000"+ - "\u04e3\u04e4\u0005\u0010\u0000\u0000\u04e4\u04e5\u0003\u0080@\u0000\u04e5"+ - "\u04e9\u0001\u0000\u0000\u0000\u04e6\u04e7\n\u0002\u0000\u0000\u04e7\u04e9"+ - "\u0003\u00c8d\u0000\u04e8\u04d4\u0001\u0000\u0000\u0000\u04e8\u04d7\u0001"+ - "\u0000\u0000\u0000\u04e8\u04d9\u0001\u0000\u0000\u0000\u04e8\u04db\u0001"+ - "\u0000\u0000\u0000\u04e8\u04dd\u0001\u0000\u0000\u0000\u04e8\u04df\u0001"+ - "\u0000\u0000\u0000\u04e8\u04e1\u0001\u0000\u0000\u0000\u04e8\u04e6\u0001"+ - "\u0000\u0000\u0000\u04e9\u04ec\u0001\u0000\u0000\u0000\u04ea\u04e8\u0001"+ - "\u0000\u0000\u0000\u04ea\u04eb\u0001\u0000\u0000\u0000\u04eb\u00c3\u0001"+ - "\u0000\u0000\u0000\u04ec\u04ea\u0001\u0000\u0000\u0000\u04ed\u04ee\u0003"+ - "b1\u0000\u04ee\u04ef\u0003\u00c6c\u0000\u04ef\u00c5\u0001\u0000\u0000"+ - "\u0000\u04f0\u04f2\u0005Q\u0000\u0000\u04f1\u04f3\u0005i\u0000\u0000\u04f2"+ - "\u04f1\u0001\u0000\u0000\u0000\u04f2\u04f3\u0001\u0000\u0000\u0000\u04f3"+ - "\u04f4\u0001\u0000\u0000\u0000\u04f4\u04f6\u0003\u014c\u00a6\u0000\u04f5"+ - "\u04f7\u0003~?\u0000\u04f6\u04f5\u0001\u0000\u0000\u0000\u04f6\u04f7\u0001"+ - "\u0000\u0000\u0000\u04f7\u00c7\u0001\u0000\u0000\u0000\u04f8\u04fa\u0005"+ - "&\u0000\u0000\u04f9\u04fb\u0003\u00f4z\u0000\u04fa\u04f9\u0001\u0000\u0000"+ - "\u0000\u04fa\u04fb\u0001\u0000\u0000\u0000\u04fb\u04fd\u0001\u0000\u0000"+ - "\u0000\u04fc\u04fe\u0005q\u0000\u0000\u04fd\u04fc\u0001\u0000\u0000\u0000"+ - "\u04fd\u04fe\u0001\u0000\u0000\u0000\u04fe\u04ff\u0001\u0000\u0000\u0000"+ - "\u04ff\u0500\u0005\'\u0000\u0000\u0500\u00c9\u0001\u0000\u0000\u0000\u0501"+ - "\u0502\u0005R\u0000\u0000\u0502\u050c\u0005l\u0000\u0000\u0503\u0507\u0003"+ - "\u00ceg\u0000\u0504\u0507\u0003\u013a\u009d\u0000\u0505\u0507\u0003\u00cc"+ - "f\u0000\u0506\u0503\u0001\u0000\u0000\u0000\u0506\u0504\u0001\u0000\u0000"+ - "\u0000\u0506\u0505\u0001\u0000\u0000\u0000\u0507\u0508\u0001\u0000\u0000"+ - "\u0000\u0508\u0509\u0003\u017e\u00bf\u0000\u0509\u050b\u0001\u0000\u0000"+ - "\u0000\u050a\u0506\u0001\u0000\u0000\u0000\u050b\u050e\u0001\u0000\u0000"+ - "\u0000\u050c\u050a\u0001\u0000\u0000\u0000\u050c\u050d\u0001\u0000\u0000"+ - "\u0000\u050d\u050f\u0001\u0000\u0000\u0000\u050e\u050c\u0001\u0000\u0000"+ - "\u0000\u050f\u0510\u0005m\u0000\u0000\u0510\u00cb\u0001\u0000\u0000\u0000"+ - "\u0511\u0512\u00059\u0000\u0000\u0512\u0513\u0005i\u0000\u0000\u0513\u0514"+ - "\u0003\u0150\u00a8\u0000\u0514\u00cd\u0001\u0000\u0000\u0000\u0515\u0517"+ - "\u0005\u001b\u0000\u0000\u0516\u0515\u0001\u0000\u0000\u0000\u0516\u0517"+ - "\u0001\u0000\u0000\u0000\u0517\u0518\u0001\u0000\u0000\u0000\u0518\u0519"+ - "\u0003b1\u0000\u0519\u051a\u0005i\u0000\u0000\u051a\u051b\u0003\u0150"+ - "\u00a8\u0000\u051b\u051c\u0003\u014e\u00a7\u0000\u051c\u0525\u0001\u0000"+ - "\u0000\u0000\u051d\u051f\u0005\u001b\u0000\u0000\u051e\u051d\u0001\u0000"+ - "\u0000\u0000\u051e\u051f\u0001\u0000\u0000\u0000\u051f\u0520\u0001\u0000"+ - "\u0000\u0000\u0520\u0521\u0003b1\u0000\u0521\u0522\u0005i\u0000\u0000"+ - "\u0522\u0523\u0003\u0150\u00a8\u0000\u0523\u0525\u0001\u0000\u0000\u0000"+ - "\u0524\u0516\u0001\u0000\u0000\u0000\u0524\u051e\u0001\u0000\u0000\u0000"+ - "\u0525\u00cf\u0001\u0000\u0000\u0000\u0526\u052e\u0003\u013a\u009d\u0000"+ - "\u0527\u052e\u0003\u00d2i\u0000\u0528\u052e\u0003P(\u0000\u0529\u052a"+ - "\u0005j\u0000\u0000\u052a\u052b\u0003\u00d0h\u0000\u052b\u052c\u0005k"+ - "\u0000\u0000\u052c\u052e\u0001\u0000\u0000\u0000\u052d\u0526\u0001\u0000"+ - "\u0000\u0000\u052d\u0527\u0001\u0000\u0000\u0000\u052d\u0528\u0001\u0000"+ - "\u0000\u0000\u052d\u0529\u0001\u0000\u0000\u0000\u052e\u00d1\u0001\u0000"+ - "\u0000\u0000\u052f\u0539\u0003\u013c\u009e\u0000\u0530\u0539\u0003\u016c"+ - "\u00b6\u0000\u0531\u0539\u0003\u0142\u00a1\u0000\u0532\u0539\u0003\u014a"+ - "\u00a5\u0000\u0533\u0539\u0003\u00cae\u0000\u0534\u0539\u0003\u0144\u00a2"+ - "\u0000\u0535\u0539\u0003\u0146\u00a3\u0000\u0536\u0539\u0003\u0148\u00a4"+ - "\u0000\u0537\u0539\u0003\u00d4j\u0000\u0538\u052f\u0001\u0000\u0000\u0000"+ - "\u0538\u0530\u0001\u0000\u0000\u0000\u0538\u0531\u0001\u0000\u0000\u0000"+ - "\u0538\u0532\u0001\u0000\u0000\u0000\u0538\u0533\u0001\u0000\u0000\u0000"+ - "\u0538\u0534\u0001\u0000\u0000\u0000\u0538\u0535\u0001\u0000\u0000\u0000"+ - "\u0538\u0536\u0001\u0000\u0000\u0000\u0538\u0537\u0001\u0000\u0000\u0000"+ - "\u0539\u00d3\u0001\u0000\u0000\u0000\u053a\u053b\u00059\u0000\u0000\u053b"+ - "\u053c\u0003\u00d6k\u0000\u053c\u00d5\u0001\u0000\u0000\u0000\u053d\u0549"+ - "\u0005j\u0000\u0000\u053e\u0543\u0003\u00d0h\u0000\u053f\u0540\u0005q"+ - "\u0000\u0000\u0540\u0542\u0003\u00d0h\u0000\u0541\u053f\u0001\u0000\u0000"+ - "\u0000\u0542\u0545\u0001\u0000\u0000\u0000\u0543\u0541\u0001\u0000\u0000"+ - "\u0000\u0543\u0544\u0001\u0000\u0000\u0000\u0544\u0547\u0001\u0000\u0000"+ - "\u0000\u0545\u0543\u0001\u0000\u0000\u0000\u0546\u0548\u0005q\u0000\u0000"+ - "\u0547\u0546\u0001\u0000\u0000\u0000\u0547\u0548\u0001\u0000\u0000\u0000"+ - "\u0548\u054a\u0001\u0000\u0000\u0000\u0549\u053e\u0001\u0000\u0000\u0000"+ - "\u0549\u054a\u0001\u0000\u0000\u0000\u054a\u054b\u0001\u0000\u0000\u0000"+ - "\u054b\u054c\u0005k\u0000\u0000\u054c\u00d7\u0001\u0000\u0000\u0000\u054d"+ - "\u0555\u0003\u016c\u00b6\u0000\u054e\u0555\u0003\u013c\u009e\u0000\u054f"+ - "\u0555\u0003\u00dam\u0000\u0550\u0555\u0003\u0144\u00a2\u0000\u0551\u0555"+ - "\u0003\u0146\u00a3\u0000\u0552\u0555\u0003P(\u0000\u0553\u0555\u0003\u013a"+ - "\u009d\u0000\u0554\u054d\u0001\u0000\u0000\u0000\u0554\u054e\u0001\u0000"+ - "\u0000\u0000\u0554\u054f\u0001\u0000\u0000\u0000\u0554\u0550\u0001\u0000"+ - "\u0000\u0000\u0554\u0551\u0001\u0000\u0000\u0000\u0554\u0552\u0001\u0000"+ - "\u0000\u0000\u0554\u0553\u0001\u0000\u0000\u0000\u0555\u00d9\u0001\u0000"+ - "\u0000\u0000\u0556\u0557\u0005n\u0000\u0000\u0557\u0558\u0005x\u0000\u0000"+ - "\u0558\u0559\u0005o\u0000\u0000\u0559\u055a\u0003\u0140\u00a0\u0000\u055a"+ - "\u00db\u0001\u0000\u0000\u0000\u055b\u056b\u0005n\u0000\u0000\u055c\u055e"+ - "\u0003\u00deo\u0000\u055d\u055c\u0001\u0000\u0000\u0000\u055d\u055e\u0001"+ - "\u0000\u0000\u0000\u055e\u055f\u0001\u0000\u0000\u0000\u055f\u0561\u0005"+ - "s\u0000\u0000\u0560\u0562\u0003\u00e0p\u0000\u0561\u0560\u0001\u0000\u0000"+ - "\u0000\u0561\u0562\u0001\u0000\u0000\u0000\u0562\u056c\u0001\u0000\u0000"+ - "\u0000\u0563\u0565\u0003\u00deo\u0000\u0564\u0563\u0001\u0000\u0000\u0000"+ - "\u0564\u0565\u0001\u0000\u0000\u0000\u0565\u0566\u0001\u0000\u0000\u0000"+ - "\u0566\u0567\u0005s\u0000\u0000\u0567\u0568\u0003\u00e0p\u0000\u0568\u0569"+ - "\u0005s\u0000\u0000\u0569\u056a\u0003\u00e2q\u0000\u056a\u056c\u0001\u0000"+ - "\u0000\u0000\u056b\u055d\u0001\u0000\u0000\u0000\u056b\u0564\u0001\u0000"+ - "\u0000\u0000\u056c\u056d\u0001\u0000\u0000\u0000\u056d\u056e\u0005o\u0000"+ - "\u0000\u056e\u00dd\u0001\u0000\u0000\u0000\u056f\u0570\u0003\u00b2Y\u0000"+ - "\u0570\u00df\u0001\u0000\u0000\u0000\u0571\u0572\u0003\u00b2Y\u0000\u0572"+ - "\u00e1\u0001\u0000\u0000\u0000\u0573\u0574\u0003\u00b2Y\u0000\u0574\u00e3"+ - "\u0001\u0000\u0000\u0000\u0575\u0577\u0007\u000f\u0000\u0000\u0576\u0575"+ - "\u0001\u0000\u0000\u0000\u0576\u0577\u0001\u0000\u0000\u0000\u0577\u0578"+ - "\u0001\u0000\u0000\u0000\u0578\u0579\u0005p\u0000\u0000\u0579\u00e5\u0001"+ - "\u0000\u0000\u0000\u057a\u057b\u0003\u00f4z\u0000\u057b\u057c\u0005p\u0000"+ - "\u0000\u057c\u0581\u0001\u0000\u0000\u0000\u057d\u057e\u0003\u0006\u0003"+ - "\u0000\u057e\u057f\u0005w\u0000\u0000\u057f\u0581\u0001\u0000\u0000\u0000"+ - "\u0580\u057a\u0001\u0000\u0000\u0000\u0580\u057d\u0001\u0000\u0000\u0000"+ - "\u0580\u0581\u0001\u0000\u0000\u0000\u0581\u0582\u0001\u0000\u0000\u0000"+ - "\u0582\u0583\u0005a\u0000\u0000\u0583\u0588\u0003\u00b2Y\u0000\u0584\u0586"+ - "\u0005K\u0000\u0000\u0585\u0587\u0005i\u0000\u0000\u0586\u0585\u0001\u0000"+ - "\u0000\u0000\u0586\u0587\u0001\u0000\u0000\u0000\u0587\u0589\u0001\u0000"+ - "\u0000\u0000\u0588\u0584\u0001\u0000\u0000\u0000\u0588\u0589\u0001\u0000"+ - "\u0000\u0000\u0589\u00e7\u0001\u0000\u0000\u0000\u058a\u058b\u0005\\\u0000"+ - "\u0000\u058b\u058c\u0005i\u0000\u0000\u058c\u00e9\u0001\u0000\u0000\u0000"+ - "\u058d\u058e\u0003\u0170\u00b8\u0000\u058e\u00eb\u0001\u0000\u0000\u0000"+ - "\u058f\u0593\u0003\u00eew\u0000\u0590\u0593\u0003\u00f6{\u0000\u0591\u0593"+ - "\u0003\u00fa}\u0000\u0592\u058f\u0001\u0000\u0000\u0000\u0592\u0590\u0001"+ - "\u0000\u0000\u0000\u0592\u0591\u0001\u0000\u0000\u0000\u0593\u00ed\u0001"+ - "\u0000\u0000\u0000\u0594\u05a0\u0005^\u0000\u0000\u0595\u05a1\u0003\u00f0"+ - "x\u0000\u0596\u059c\u0005j\u0000\u0000\u0597\u0598\u0003\u00f0x\u0000"+ - "\u0598\u0599\u0003\u017e\u00bf\u0000\u0599\u059b\u0001\u0000\u0000\u0000"+ - "\u059a\u0597\u0001\u0000\u0000\u0000\u059b\u059e\u0001\u0000\u0000\u0000"+ - "\u059c\u059a\u0001\u0000\u0000\u0000\u059c\u059d\u0001\u0000\u0000\u0000"+ - "\u059d\u059f\u0001\u0000\u0000\u0000\u059e\u059c\u0001\u0000\u0000\u0000"+ - "\u059f\u05a1\u0005k\u0000\u0000\u05a0\u0595\u0001\u0000\u0000\u0000\u05a0"+ - "\u0596\u0001\u0000\u0000\u0000\u05a1\u00ef\u0001\u0000\u0000\u0000\u05a2"+ - "\u05a8\u0003\u00f2y\u0000\u05a3\u05a5\u0003\u00d0h\u0000\u05a4\u05a3\u0001"+ - "\u0000\u0000\u0000\u05a4\u05a5\u0001\u0000\u0000\u0000\u05a5\u05a6\u0001"+ - "\u0000\u0000\u0000\u05a6\u05a7\u0005p\u0000\u0000\u05a7\u05a9\u0003\u00f4"+ - "z\u0000\u05a8\u05a4\u0001\u0000\u0000\u0000\u05a8\u05a9\u0001\u0000\u0000"+ - "\u0000\u05a9\u00f1\u0001\u0000\u0000\u0000\u05aa\u05af\u0005i\u0000\u0000"+ - "\u05ab\u05ac\u0005q\u0000\u0000\u05ac\u05ae\u0005i\u0000\u0000\u05ad\u05ab"+ - "\u0001\u0000\u0000\u0000\u05ae\u05b1\u0001\u0000\u0000\u0000\u05af\u05ad"+ - "\u0001\u0000\u0000\u0000\u05af\u05b0\u0001\u0000\u0000\u0000\u05b0\u00f3"+ - "\u0001\u0000\u0000\u0000\u05b1\u05af\u0001\u0000\u0000\u0000\u05b2\u05b7"+ - "\u0003\u00b2Y\u0000\u05b3\u05b4\u0005q\u0000\u0000\u05b4\u05b6\u0003\u00b2"+ - "Y\u0000\u05b5\u05b3\u0001\u0000\u0000\u0000\u05b6\u05b9\u0001\u0000\u0000"+ - "\u0000\u05b7\u05b5\u0001\u0000\u0000\u0000\u05b7\u05b8\u0001\u0000\u0000"+ - "\u0000\u05b8\u00f5\u0001\u0000\u0000\u0000\u05b9\u05b7\u0001\u0000\u0000"+ - "\u0000\u05ba\u05c6\u0005b\u0000\u0000\u05bb\u05c7\u0003\u00f8|\u0000\u05bc"+ - "\u05c2\u0005j\u0000\u0000\u05bd\u05be\u0003\u00f8|\u0000\u05be\u05bf\u0003"+ - "\u017e\u00bf\u0000\u05bf\u05c1\u0001\u0000\u0000\u0000\u05c0\u05bd\u0001"+ - "\u0000\u0000\u0000\u05c1\u05c4\u0001\u0000\u0000\u0000\u05c2\u05c0\u0001"+ - "\u0000\u0000\u0000\u05c2\u05c3\u0001\u0000\u0000\u0000\u05c3\u05c5\u0001"+ - "\u0000\u0000\u0000\u05c4\u05c2\u0001\u0000\u0000\u0000\u05c5\u05c7\u0005"+ - "k\u0000\u0000\u05c6\u05bb\u0001\u0000\u0000\u0000\u05c6\u05bc\u0001\u0000"+ - "\u0000\u0000\u05c7\u00f7\u0001\u0000\u0000\u0000\u05c8\u05ca\u0005i\u0000"+ - "\u0000\u05c9\u05cb\u0005p\u0000\u0000\u05ca\u05c9\u0001\u0000\u0000\u0000"+ - "\u05ca\u05cb\u0001\u0000\u0000\u0000\u05cb\u05cc\u0001\u0000\u0000\u0000"+ - "\u05cc\u05cd\u0003\u00d0h\u0000\u05cd\u00f9\u0001\u0000\u0000\u0000\u05ce"+ - "\u05da\u0005g\u0000\u0000\u05cf\u05db\u0003\u00a4R\u0000\u05d0\u05d6\u0005"+ - "j\u0000\u0000\u05d1\u05d2\u0003\u00a4R\u0000\u05d2\u05d3\u0003\u017e\u00bf"+ - "\u0000\u05d3\u05d5\u0001\u0000\u0000\u0000\u05d4\u05d1\u0001\u0000\u0000"+ - "\u0000\u05d5\u05d8\u0001\u0000\u0000\u0000\u05d6\u05d4\u0001\u0000\u0000"+ - "\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000\u05d7\u05d9\u0001\u0000\u0000"+ - "\u0000\u05d8\u05d6\u0001\u0000\u0000\u0000\u05d9\u05db\u0005k\u0000\u0000"+ - "\u05da\u05cf\u0001\u0000\u0000\u0000\u05da\u05d0\u0001\u0000\u0000\u0000"+ - "\u05db\u00fb\u0001\u0000\u0000\u0000\u05dc\u05de\u0005l\u0000\u0000\u05dd"+ - "\u05df\u0003\u00fe\u007f\u0000\u05de\u05dd\u0001\u0000\u0000\u0000\u05de"+ - "\u05df\u0001\u0000\u0000\u0000\u05df\u05e0\u0001\u0000\u0000\u0000\u05e0"+ - "\u05e1\u0005m\u0000\u0000\u05e1\u00fd\u0001\u0000\u0000\u0000\u05e2\u05e4"+ - "\u0005r\u0000\u0000\u05e3\u05e2\u0001\u0000\u0000\u0000\u05e3\u05e4\u0001"+ - "\u0000\u0000\u0000\u05e4\u05ea\u0001\u0000\u0000\u0000\u05e5\u05e7\u0005"+ - "\u00a3\u0000\u0000\u05e6\u05e5\u0001\u0000\u0000\u0000\u05e6\u05e7\u0001"+ - "\u0000\u0000\u0000\u05e7\u05ea\u0001\u0000\u0000\u0000\u05e8\u05ea\u0004"+ - "\u007f\u0012\u0000\u05e9\u05e3\u0001\u0000\u0000\u0000\u05e9\u05e6\u0001"+ - "\u0000\u0000\u0000\u05e9\u05e8\u0001\u0000\u0000\u0000\u05ea\u05eb\u0001"+ - "\u0000\u0000\u0000\u05eb\u05ec\u0003\u00b4Z\u0000\u05ec\u05ed\u0003\u017e"+ - "\u00bf\u0000\u05ed\u05ef\u0001\u0000\u0000\u0000\u05ee\u05e9\u0001\u0000"+ - "\u0000\u0000\u05ef\u05f0\u0001\u0000\u0000\u0000\u05f0\u05ee\u0001\u0000"+ - "\u0000\u0000\u05f0\u05f1\u0001\u0000\u0000\u0000\u05f1\u00ff\u0001\u0000"+ - "\u0000\u0000\u05f2\u05f8\u0003\u0104\u0082\u0000\u05f3\u05f8\u0003\u0106"+ - "\u0083\u0000\u05f4\u05f8\u0003\u0108\u0084\u0000\u05f5\u05f8\u0003\u0102"+ - "\u0081\u0000\u05f6\u05f8\u0003\u00a6S\u0000\u05f7\u05f2\u0001\u0000\u0000"+ - "\u0000\u05f7\u05f3\u0001\u0000\u0000\u0000\u05f7\u05f4\u0001\u0000\u0000"+ - "\u0000\u05f7\u05f5\u0001\u0000\u0000\u0000\u05f7\u05f6\u0001\u0000\u0000"+ - "\u0000\u05f8\u0101\u0001\u0000\u0000\u0000\u05f9\u05fa\u0003\u00b2Y\u0000"+ - "\u05fa\u0103\u0001\u0000\u0000\u0000\u05fb\u05fc\u0003\u00b2Y\u0000\u05fc"+ - "\u05fd\u0005\u008d\u0000\u0000\u05fd\u05fe\u0003\u00b2Y\u0000\u05fe\u0105"+ - "\u0001\u0000\u0000\u0000\u05ff\u0600\u0003\u00b2Y\u0000\u0600\u0601\u0007"+ - "\u0010\u0000\u0000\u0601\u0107\u0001\u0000\u0000\u0000\u0602\u0603\u0003"+ - "\u00f4z\u0000\u0603\u0604\u0003\u00e4r\u0000\u0604\u0605\u0003\u00f4z"+ - "\u0000\u0605\u0109\u0001\u0000\u0000\u0000\u0606\u0607\u0007\u0011\u0000"+ - "\u0000\u0607\u010b\u0001\u0000\u0000\u0000\u0608\u0609\u0005i\u0000\u0000"+ - "\u0609\u060b\u0005s\u0000\u0000\u060a\u060c\u0003\u00b4Z\u0000\u060b\u060a"+ - "\u0001\u0000\u0000\u0000\u060b\u060c\u0001\u0000\u0000\u0000\u060c\u010d"+ - "\u0001\u0000\u0000\u0000\u060d\u060f\u0005f\u0000\u0000\u060e\u0610\u0003"+ - "\u00f4z\u0000\u060f\u060e\u0001\u0000\u0000\u0000\u060f\u0610\u0001\u0000"+ - "\u0000\u0000\u0610\u010f\u0001\u0000\u0000\u0000\u0611\u0613\u0005O\u0000"+ - "\u0000\u0612\u0614\u0005i\u0000\u0000\u0613\u0612\u0001\u0000\u0000\u0000"+ - "\u0613\u0614\u0001\u0000\u0000\u0000\u0614\u0111\u0001\u0000\u0000\u0000"+ - "\u0615\u0617\u0005c\u0000\u0000\u0616\u0618\u0005i\u0000\u0000\u0617\u0616"+ - "\u0001\u0000\u0000\u0000\u0617\u0618\u0001\u0000\u0000\u0000\u0618\u0113"+ - "\u0001\u0000\u0000\u0000\u0619\u061a\u0005[\u0000\u0000\u061a\u061b\u0005"+ - "i\u0000\u0000\u061b\u0115\u0001\u0000\u0000\u0000\u061c\u061d\u0005_\u0000"+ - "\u0000\u061d\u0117\u0001\u0000\u0000\u0000\u061e\u0627\u0005`\u0000\u0000"+ - "\u061f\u0628\u0003\u00b2Y\u0000\u0620\u0621\u0003\u017e\u00bf\u0000\u0621"+ - "\u0622\u0003\u00b2Y\u0000\u0622\u0628\u0001\u0000\u0000\u0000\u0623\u0624"+ - "\u0003\u0100\u0080\u0000\u0624\u0625\u0003\u017e\u00bf\u0000\u0625\u0626"+ - "\u0003\u00b2Y\u0000\u0626\u0628\u0001\u0000\u0000\u0000\u0627\u061f\u0001"+ - "\u0000\u0000\u0000\u0627\u0620\u0001\u0000\u0000\u0000\u0627\u0623\u0001"+ - "\u0000\u0000\u0000\u0628\u0629\u0001\u0000\u0000\u0000\u0629\u062f\u0003"+ - "\u00fc~\u0000\u062a\u062d\u0005Z\u0000\u0000\u062b\u062e\u0003\u0118\u008c"+ - "\u0000\u062c\u062e\u0003\u00fc~\u0000\u062d\u062b\u0001\u0000\u0000\u0000"+ - "\u062d\u062c\u0001\u0000\u0000\u0000\u062e\u0630\u0001\u0000\u0000\u0000"+ - "\u062f\u062a\u0001\u0000\u0000\u0000\u062f\u0630\u0001\u0000\u0000\u0000"+ - "\u0630\u0119\u0001\u0000\u0000\u0000\u0631\u0634\u0003\u011c\u008e\u0000"+ - "\u0632\u0634\u0003\u0122\u0091\u0000\u0633\u0631\u0001\u0000\u0000\u0000"+ - "\u0633\u0632\u0001\u0000\u0000\u0000\u0634\u011b\u0001\u0000\u0000\u0000"+ - "\u0635\u0640\u0005]\u0000\u0000\u0636\u0638\u0003\u00b2Y\u0000\u0637\u0636"+ - "\u0001\u0000\u0000\u0000\u0637\u0638\u0001\u0000\u0000\u0000\u0638\u0641"+ - "\u0001\u0000\u0000\u0000\u0639\u063b\u0003\u0100\u0080\u0000\u063a\u0639"+ - "\u0001\u0000\u0000\u0000\u063a\u063b\u0001\u0000\u0000\u0000\u063b\u063c"+ - "\u0001\u0000\u0000\u0000\u063c\u063e\u0003\u017e\u00bf\u0000\u063d\u063f"+ - "\u0003\u00b2Y\u0000\u063e\u063d\u0001\u0000\u0000\u0000\u063e\u063f\u0001"+ - "\u0000\u0000\u0000\u063f\u0641\u0001\u0000\u0000\u0000\u0640\u0637\u0001"+ - "\u0000\u0000\u0000\u0640\u063a\u0001\u0000\u0000\u0000\u0641\u0642\u0001"+ - "\u0000\u0000\u0000\u0642\u0646\u0005l\u0000\u0000\u0643\u0645\u0003\u011e"+ - "\u008f\u0000\u0644\u0643\u0001\u0000\u0000\u0000\u0645\u0648\u0001\u0000"+ - "\u0000\u0000\u0646\u0644\u0001\u0000\u0000\u0000\u0646\u0647\u0001\u0000"+ - "\u0000\u0000\u0647\u0649\u0001\u0000\u0000\u0000\u0648\u0646\u0001\u0000"+ - "\u0000\u0000\u0649\u064a\u0005m\u0000\u0000\u064a\u011d\u0001\u0000\u0000"+ - "\u0000\u064b\u064c\u0003\u0120\u0090\u0000\u064c\u064e\u0005s\u0000\u0000"+ - "\u064d\u064f\u0003\u00fe\u007f\u0000\u064e\u064d\u0001\u0000\u0000\u0000"+ - "\u064e\u064f\u0001\u0000\u0000\u0000\u064f\u011f\u0001\u0000\u0000\u0000"+ - "\u0650\u0651\u0005T\u0000\u0000\u0651\u0654\u0003\u00f4z\u0000\u0652\u0654"+ - "\u0005P\u0000\u0000\u0653\u0650\u0001\u0000\u0000\u0000\u0653\u0652\u0001"+ - "\u0000\u0000\u0000\u0654\u0121\u0001\u0000\u0000\u0000\u0655\u065e\u0005"+ - "]\u0000\u0000\u0656\u065f\u0003\u0124\u0092\u0000\u0657\u0658\u0003\u017e"+ - "\u00bf\u0000\u0658\u0659\u0003\u0124\u0092\u0000\u0659\u065f\u0001\u0000"+ - "\u0000\u0000\u065a\u065b\u0003\u0100\u0080\u0000\u065b\u065c\u0003\u017e"+ - "\u00bf\u0000\u065c\u065d\u0003\u0124\u0092\u0000\u065d\u065f\u0001\u0000"+ - "\u0000\u0000\u065e\u0656\u0001\u0000\u0000\u0000\u065e\u0657\u0001\u0000"+ - "\u0000\u0000\u065e\u065a\u0001\u0000\u0000\u0000\u065f\u0660\u0001\u0000"+ - "\u0000\u0000\u0660\u0664\u0005l\u0000\u0000\u0661\u0663\u0003\u0126\u0093"+ - "\u0000\u0662\u0661\u0001\u0000\u0000\u0000\u0663\u0666\u0001\u0000\u0000"+ - "\u0000\u0664\u0662\u0001\u0000\u0000\u0000\u0664\u0665\u0001\u0000\u0000"+ - "\u0000\u0665\u0667\u0001\u0000\u0000\u0000\u0666\u0664\u0001\u0000\u0000"+ - "\u0000\u0667\u0668\u0005m\u0000\u0000\u0668\u0123\u0001\u0000\u0000\u0000"+ - "\u0669\u066a\u0005i\u0000\u0000\u066a\u066c\u0005w\u0000\u0000\u066b\u0669"+ - "\u0001\u0000\u0000\u0000\u066b\u066c\u0001\u0000\u0000\u0000\u066c\u066d"+ - "\u0001\u0000\u0000\u0000\u066d\u066e\u0003\u00c2a\u0000\u066e\u066f\u0005"+ - "t\u0000\u0000\u066f\u0670\u0005j\u0000\u0000\u0670\u0671\u0005b\u0000"+ - "\u0000\u0671\u0672\u0005k\u0000\u0000\u0672\u0125\u0001\u0000\u0000\u0000"+ - "\u0673\u0674\u0003\u0128\u0094\u0000\u0674\u0676\u0005s\u0000\u0000\u0675"+ - "\u0677\u0003\u00fe\u007f\u0000\u0676\u0675\u0001\u0000\u0000\u0000\u0676"+ - "\u0677\u0001\u0000\u0000\u0000\u0677\u0127\u0001\u0000\u0000\u0000\u0678"+ - "\u0679\u0005T\u0000\u0000\u0679\u067c\u0003\u012a\u0095\u0000\u067a\u067c"+ - "\u0005P\u0000\u0000\u067b\u0678\u0001\u0000\u0000\u0000\u067b\u067a\u0001"+ - "\u0000\u0000\u0000\u067c\u0129\u0001\u0000\u0000\u0000\u067d\u0680\u0003"+ - "\u00d0h\u0000\u067e\u0680\u0005h\u0000\u0000\u067f\u067d\u0001\u0000\u0000"+ - "\u0000\u067f\u067e\u0001\u0000\u0000\u0000\u0680\u0688\u0001\u0000\u0000"+ - "\u0000\u0681\u0684\u0005q\u0000\u0000\u0682\u0685\u0003\u00d0h\u0000\u0683"+ - "\u0685\u0005h\u0000\u0000\u0684\u0682\u0001\u0000\u0000\u0000\u0684\u0683"+ - "\u0001\u0000\u0000\u0000\u0685\u0687\u0001\u0000\u0000\u0000\u0686\u0681"+ - "\u0001\u0000\u0000\u0000\u0687\u068a\u0001\u0000\u0000\u0000\u0688\u0686"+ - "\u0001\u0000\u0000\u0000\u0688\u0689\u0001\u0000\u0000\u0000\u0689\u012b"+ - "\u0001\u0000\u0000\u0000\u068a\u0688\u0001\u0000\u0000\u0000\u068b\u068c"+ - "\u0005S\u0000\u0000\u068c\u0690\u0005l\u0000\u0000\u068d\u068f\u0003\u012e"+ - "\u0097\u0000\u068e\u068d\u0001\u0000\u0000\u0000\u068f\u0692\u0001\u0000"+ - "\u0000\u0000\u0690\u068e\u0001\u0000\u0000\u0000\u0690\u0691\u0001\u0000"+ - "\u0000\u0000\u0691\u0693\u0001\u0000\u0000\u0000\u0692\u0690\u0001\u0000"+ - "\u0000\u0000\u0693\u0694\u0005m\u0000\u0000\u0694\u012d\u0001\u0000\u0000"+ - "\u0000\u0695\u0696\u0003\u0130\u0098\u0000\u0696\u0698\u0005s\u0000\u0000"+ - "\u0697\u0699\u0003\u00fe\u007f\u0000\u0698\u0697\u0001\u0000\u0000\u0000"+ - "\u0698\u0699\u0001\u0000\u0000\u0000\u0699\u012f\u0001\u0000\u0000\u0000"+ - "\u069a\u069d\u0005T\u0000\u0000\u069b\u069e\u0003\u0104\u0082\u0000\u069c"+ - "\u069e\u0003\u0132\u0099\u0000\u069d\u069b\u0001\u0000\u0000\u0000\u069d"+ - "\u069c\u0001\u0000\u0000\u0000\u069e\u06a1\u0001\u0000\u0000\u0000\u069f"+ - "\u06a1\u0005P\u0000\u0000\u06a0\u069a\u0001\u0000\u0000\u0000\u06a0\u069f"+ - "\u0001\u0000\u0000\u0000\u06a1\u0131\u0001\u0000\u0000\u0000\u06a2\u06a3"+ - "\u0003\u00f4z\u0000\u06a3\u06a4\u0005p\u0000\u0000\u06a4\u06a9\u0001\u0000"+ - "\u0000\u0000\u06a5\u06a6\u0003\u00f2y\u0000\u06a6\u06a7\u0005w\u0000\u0000"+ - "\u06a7\u06a9\u0001\u0000\u0000\u0000\u06a8\u06a2\u0001\u0000\u0000\u0000"+ - "\u06a8\u06a5\u0001\u0000\u0000\u0000\u06a8\u06a9\u0001\u0000\u0000\u0000"+ - "\u06a9\u06aa\u0001\u0000\u0000\u0000\u06aa\u06ab\u0003\u00b2Y\u0000\u06ab"+ - "\u0133\u0001\u0000\u0000\u0000\u06ac\u06b4\u0005d\u0000\u0000\u06ad\u06af"+ - "\u0003\u00b2Y\u0000\u06ae\u06ad\u0001\u0000\u0000\u0000\u06ae\u06af\u0001"+ - "\u0000\u0000\u0000\u06af\u06b5\u0001\u0000\u0000\u0000\u06b0\u06b5\u0003"+ - "\u0136\u009b\u0000\u06b1\u06b3\u0003\u00e6s\u0000\u06b2\u06b1\u0001\u0000"+ - "\u0000\u0000\u06b2\u06b3\u0001\u0000\u0000\u0000\u06b3\u06b5\u0001\u0000"+ - "\u0000\u0000\u06b4\u06ae\u0001\u0000\u0000\u0000\u06b4\u06b0\u0001\u0000"+ - "\u0000\u0000\u06b4\u06b2\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001\u0000"+ - "\u0000\u0000\u06b6\u06b7\u0003\u00fc~\u0000\u06b7\u0135\u0001\u0000\u0000"+ - "\u0000\u06b8\u06ba\u0003\u0100\u0080\u0000\u06b9\u06b8\u0001\u0000\u0000"+ - "\u0000\u06b9\u06ba\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000"+ - "\u0000\u06bb\u06bd\u0003\u017e\u00bf\u0000\u06bc\u06be\u0003\u00b2Y\u0000"+ - "\u06bd\u06bc\u0001\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000"+ - "\u06be\u06bf\u0001\u0000\u0000\u0000\u06bf\u06c1\u0003\u017e\u00bf\u0000"+ - "\u06c0\u06c2\u0003\u0100\u0080\u0000\u06c1\u06c0\u0001\u0000\u0000\u0000"+ - "\u06c1\u06c2\u0001\u0000\u0000\u0000\u06c2\u0137\u0001\u0000\u0000\u0000"+ - "\u06c3\u06c4\u0005V\u0000\u0000\u06c4\u06c5\u0003\u00b2Y\u0000\u06c5\u0139"+ - "\u0001\u0000\u0000\u0000\u06c6\u06c9\u0003\u015e\u00af\u0000\u06c7\u06c9"+ - "\u0005i\u0000\u0000\u06c8\u06c6\u0001\u0000\u0000\u0000\u06c8\u06c7\u0001"+ - "\u0000\u0000\u0000\u06c9\u013b\u0001\u0000\u0000\u0000\u06ca\u06cb\u0005"+ - "n\u0000\u0000\u06cb\u06cc\u0003\u013e\u009f\u0000\u06cc\u06cd\u0005o\u0000"+ - "\u0000\u06cd\u06ce\u0003\u0140\u00a0\u0000\u06ce\u013d\u0001\u0000\u0000"+ - "\u0000\u06cf\u06d0\u0003\u00b2Y\u0000\u06d0\u013f\u0001\u0000\u0000\u0000"+ - "\u06d1\u06d2\u0003\u00d0h\u0000\u06d2\u0141\u0001\u0000\u0000\u0000\u06d3"+ - "\u06d4\u0005\u008b\u0000\u0000\u06d4\u06d5\u0003\u00d0h\u0000\u06d5\u0143"+ - "\u0001\u0000\u0000\u0000\u06d6\u06d7\u0005n\u0000\u0000\u06d7\u06d8\u0005"+ - "o\u0000\u0000\u06d8\u06d9\u0003\u0140\u00a0\u0000\u06d9\u0145\u0001\u0000"+ - "\u0000\u0000\u06da\u06db\u0005W\u0000\u0000\u06db\u06dc\u0005n\u0000\u0000"+ - "\u06dc\u06dd\u0003\u00d0h\u0000\u06dd\u06de\u0005o\u0000\u0000\u06de\u06df"+ - "\u0003\u0140\u00a0\u0000\u06df\u0147\u0001\u0000\u0000\u0000\u06e0\u06e6"+ - "\u0005Y\u0000\u0000\u06e1\u06e2\u0005Y\u0000\u0000\u06e2\u06e6\u0005\u008d"+ - "\u0000\u0000\u06e3\u06e4\u0005\u008d\u0000\u0000\u06e4\u06e6\u0005Y\u0000"+ - "\u0000\u06e5\u06e0\u0001\u0000\u0000\u0000\u06e5\u06e1\u0001\u0000\u0000"+ - "\u0000\u06e5\u06e3\u0001\u0000\u0000\u0000\u06e6\u06e7\u0001\u0000\u0000"+ - "\u0000\u06e7\u06e8\u0003\u0140\u00a0\u0000\u06e8\u0149\u0001\u0000\u0000"+ - "\u0000\u06e9\u06ea\u0005Q\u0000\u0000\u06ea\u06eb\u0003\u014c\u00a6\u0000"+ - "\u06eb\u014b\u0001\u0000\u0000\u0000\u06ec\u06ed\u0003\u0150\u00a8\u0000"+ - "\u06ed\u06ee\u0003\u014e\u00a7\u0000\u06ee\u06f1\u0001\u0000\u0000\u0000"+ - "\u06ef\u06f1\u0003\u0150\u00a8\u0000\u06f0\u06ec\u0001\u0000\u0000\u0000"+ - "\u06f0\u06ef\u0001\u0000\u0000\u0000\u06f1\u014d\u0001\u0000\u0000\u0000"+ - "\u06f2\u06f5\u0003\u0150\u00a8\u0000\u06f3\u06f5\u0003\u00d0h\u0000\u06f4"+ - "\u06f2\u0001\u0000\u0000\u0000\u06f4\u06f3\u0001\u0000\u0000\u0000\u06f5"+ - "\u014f\u0001\u0000\u0000\u0000\u06f6\u0702\u0005j\u0000\u0000\u06f7\u06fc"+ - "\u0003\u00aaU\u0000\u06f8\u06f9\u0005q\u0000\u0000\u06f9\u06fb\u0003\u00aa"+ - "U\u0000\u06fa\u06f8\u0001\u0000\u0000\u0000\u06fb\u06fe\u0001\u0000\u0000"+ - "\u0000\u06fc\u06fa\u0001\u0000\u0000\u0000\u06fc\u06fd\u0001\u0000\u0000"+ - "\u0000\u06fd\u0700\u0001\u0000\u0000\u0000\u06fe\u06fc\u0001\u0000\u0000"+ - "\u0000\u06ff\u0701\u0005q\u0000\u0000\u0700\u06ff\u0001\u0000\u0000\u0000"+ - "\u0700\u0701\u0001\u0000\u0000\u0000\u0701\u0703\u0001\u0000\u0000\u0000"+ - "\u0702\u06f7\u0001\u0000\u0000\u0000\u0702\u0703\u0001\u0000\u0000\u0000"+ - "\u0703\u0704\u0001\u0000\u0000\u0000\u0704\u0705\u0005k\u0000\u0000\u0705"+ - "\u0151\u0001\u0000\u0000\u0000\u0706\u0707\u0003\u0154\u00aa\u0000\u0707"+ - "\u0708\u0005j\u0000\u0000\u0708\u070a\u0003\u00b2Y\u0000\u0709\u070b\u0005"+ - "q\u0000\u0000\u070a\u0709\u0001\u0000\u0000\u0000\u070a\u070b\u0001\u0000"+ - "\u0000\u0000\u070b\u070c\u0001\u0000\u0000\u0000\u070c\u070d\u0005k\u0000"+ - "\u0000\u070d\u0153\u0001\u0000\u0000\u0000\u070e\u0714\u0003\u00d2i\u0000"+ - "\u070f\u0710\u0005j\u0000\u0000\u0710\u0711\u0003\u0154\u00aa\u0000\u0711"+ - "\u0712\u0005k\u0000\u0000\u0712\u0714\u0001\u0000\u0000\u0000\u0713\u070e"+ - "\u0001\u0000\u0000\u0000\u0713\u070f\u0001\u0000\u0000\u0000\u0714\u0155"+ - "\u0001\u0000\u0000\u0000\u0715\u071c\u0003\u0158\u00ac\u0000\u0716\u071c"+ - "\u0003\u015c\u00ae\u0000\u0717\u0718\u0005j\u0000\u0000\u0718\u0719\u0003"+ - "\u00b2Y\u0000\u0719\u071a\u0005k\u0000\u0000\u071a\u071c\u0001\u0000\u0000"+ - "\u0000\u071b\u0715\u0001\u0000\u0000\u0000\u071b\u0716\u0001\u0000\u0000"+ - "\u0000\u071b\u0717\u0001\u0000\u0000\u0000\u071c\u0157\u0001\u0000\u0000"+ - "\u0000\u071d\u0721\u0003\u00c0`\u0000\u071e\u0721\u0003\u0160\u00b0\u0000"+ - "\u071f\u0721\u0003\u00c4b\u0000\u0720\u071d\u0001\u0000\u0000\u0000\u0720"+ - "\u071e\u0001\u0000\u0000\u0000\u0720\u071f\u0001\u0000\u0000\u0000\u0721"+ - "\u0159\u0001\u0000\u0000\u0000\u0722\u0723\u0007\u0012\u0000\u0000\u0723"+ - "\u015b\u0001\u0000\u0000\u0000\u0724\u0725\u0005i\u0000\u0000\u0725\u015d"+ - "\u0001\u0000\u0000\u0000\u0726\u0727\u0005i\u0000\u0000\u0727\u0728\u0005"+ - "t\u0000\u0000\u0728\u0729\u0005i\u0000\u0000\u0729\u015f\u0001\u0000\u0000"+ - "\u0000\u072a\u072b\u0003\u00d8l\u0000\u072b\u072c\u0003\u0162\u00b1\u0000"+ - "\u072c\u0161\u0001\u0000\u0000\u0000\u072d\u0732\u0005l\u0000\u0000\u072e"+ - "\u0730\u0003\u0164\u00b2\u0000\u072f\u0731\u0005q\u0000\u0000\u0730\u072f"+ - "\u0001\u0000\u0000\u0000\u0730\u0731\u0001\u0000\u0000\u0000\u0731\u0733"+ - "\u0001\u0000\u0000\u0000\u0732\u072e\u0001\u0000\u0000\u0000\u0732\u0733"+ - "\u0001\u0000\u0000\u0000\u0733\u0734\u0001\u0000\u0000\u0000\u0734\u0735"+ - "\u0005m\u0000\u0000\u0735\u0163\u0001\u0000\u0000\u0000\u0736\u073b\u0003"+ - "\u0166\u00b3\u0000\u0737\u0738\u0005q\u0000\u0000\u0738\u073a\u0003\u0166"+ - "\u00b3\u0000\u0739\u0737\u0001\u0000\u0000\u0000\u073a\u073d\u0001\u0000"+ - "\u0000\u0000\u073b\u0739\u0001\u0000\u0000\u0000\u073b\u073c\u0001\u0000"+ - "\u0000\u0000\u073c\u0165\u0001\u0000\u0000\u0000\u073d\u073b\u0001\u0000"+ - "\u0000\u0000\u073e\u073f\u0003\u0168\u00b4\u0000\u073f\u0740\u0005s\u0000"+ - "\u0000\u0740\u0742\u0001\u0000\u0000\u0000\u0741\u073e\u0001\u0000\u0000"+ - "\u0000\u0741\u0742\u0001\u0000\u0000\u0000\u0742\u0743\u0001\u0000\u0000"+ - "\u0000\u0743\u0744\u0003\u016a\u00b5\u0000\u0744\u0167\u0001\u0000\u0000"+ - "\u0000\u0745\u0748\u0003\u00b2Y\u0000\u0746\u0748\u0003\u0162\u00b1\u0000"+ - "\u0747\u0745\u0001\u0000\u0000\u0000\u0747\u0746\u0001\u0000\u0000\u0000"+ - "\u0748\u0169\u0001\u0000\u0000\u0000\u0749\u074c\u0003\u00b2Y\u0000\u074a"+ - "\u074c\u0003\u0162\u00b1\u0000\u074b\u0749\u0001\u0000\u0000\u0000\u074b"+ - "\u074a\u0001\u0000\u0000\u0000\u074c\u016b\u0001\u0000\u0000\u0000\u074d"+ - "\u074e\u0005X\u0000\u0000\u074e\u0754\u0005l\u0000\u0000\u074f\u0750\u0003"+ - "\u016e\u00b7\u0000\u0750\u0751\u0003\u017e\u00bf\u0000\u0751\u0753\u0001"+ - "\u0000\u0000\u0000\u0752\u074f\u0001\u0000\u0000\u0000\u0753\u0756\u0001"+ - "\u0000\u0000\u0000\u0754\u0752\u0001\u0000\u0000\u0000\u0754\u0755\u0001"+ - "\u0000\u0000\u0000\u0755\u0757\u0001\u0000\u0000\u0000\u0756\u0754\u0001"+ - "\u0000\u0000\u0000\u0757\u0758\u0005m\u0000\u0000\u0758\u016d\u0001\u0000"+ - "\u0000\u0000\u0759\u075a\u0003\u00f2y\u0000\u075a\u075b\u0003\u00d0h\u0000"+ - "\u075b\u075e\u0001\u0000\u0000\u0000\u075c\u075e\u0003\u0172\u00b9\u0000"+ - "\u075d\u0759\u0001\u0000\u0000\u0000\u075d\u075c\u0001\u0000\u0000\u0000"+ - "\u075e\u0760\u0001\u0000\u0000\u0000\u075f\u0761\u0003\u0170\u00b8\u0000"+ - "\u0760\u075f\u0001\u0000\u0000\u0000\u0760\u0761\u0001\u0000\u0000\u0000"+ - "\u0761\u016f\u0001\u0000\u0000\u0000\u0762\u0763\u0007\u0013\u0000\u0000"+ - "\u0763\u0171\u0001\u0000\u0000\u0000\u0764\u0766\u0005\u008b\u0000\u0000"+ - "\u0765\u0764\u0001\u0000\u0000\u0000\u0765\u0766\u0001\u0000\u0000\u0000"+ - "\u0766\u0767\u0001\u0000\u0000\u0000\u0767\u0768\u0003\u013a\u009d\u0000"+ - "\u0768\u0173\u0001\u0000\u0000\u0000\u0769\u076a\u0005n\u0000\u0000\u076a"+ - "\u076b\u0003\u00b2Y\u0000\u076b\u076c\u0005o\u0000\u0000\u076c\u0175\u0001"+ - "\u0000\u0000\u0000\u076d\u076e\u0005t\u0000\u0000\u076e\u076f\u0005j\u0000"+ - "\u0000\u076f\u0770\u0003\u00d0h\u0000\u0770\u0771\u0005k\u0000\u0000\u0771"+ - "\u0177\u0001\u0000\u0000\u0000\u0772\u0781\u0005j\u0000\u0000\u0773\u077a"+ - "\u0003\u00f4z\u0000\u0774\u0777\u0003\u0154\u00aa\u0000\u0775\u0776\u0005"+ - "q\u0000\u0000\u0776\u0778\u0003\u00f4z\u0000\u0777\u0775\u0001\u0000\u0000"+ - "\u0000\u0777\u0778\u0001\u0000\u0000\u0000\u0778\u077a\u0001\u0000\u0000"+ - "\u0000\u0779\u0773\u0001\u0000\u0000\u0000\u0779\u0774\u0001\u0000\u0000"+ - "\u0000\u077a\u077c\u0001\u0000\u0000\u0000\u077b\u077d\u0005x\u0000\u0000"+ - "\u077c\u077b\u0001\u0000\u0000\u0000\u077c\u077d\u0001\u0000\u0000\u0000"+ - "\u077d\u077f\u0001\u0000\u0000\u0000\u077e\u0780\u0005q\u0000\u0000\u077f"+ - "\u077e\u0001\u0000\u0000\u0000\u077f\u0780\u0001\u0000\u0000\u0000\u0780"+ - "\u0782\u0001\u0000\u0000\u0000\u0781\u0779\u0001\u0000\u0000\u0000\u0781"+ - "\u0782\u0001\u0000\u0000\u0000\u0782\u0783\u0001\u0000\u0000\u0000\u0783"+ - "\u0784\u0005k\u0000\u0000\u0784\u0179\u0001\u0000\u0000\u0000\u0785\u0786"+ - "\u0003\u0154\u00aa\u0000\u0786\u0787\u0005t\u0000\u0000\u0787\u0788\u0005"+ - "i\u0000\u0000\u0788\u017b\u0001\u0000\u0000\u0000\u0789\u078a\u0003\u00d0"+ - "h\u0000\u078a\u017d\u0001\u0000\u0000\u0000\u078b\u0790\u0005r\u0000\u0000"+ - "\u078c\u0790\u0005\u0000\u0000\u0001\u078d\u0790\u0005\u00a3\u0000\u0000"+ - "\u078e\u0790\u0004\u00bf\u0013\u0000\u078f\u078b\u0001\u0000\u0000\u0000"+ - "\u078f\u078c\u0001\u0000\u0000\u0000\u078f\u078d\u0001\u0000\u0000\u0000"+ - "\u078f\u078e\u0001\u0000\u0000\u0000\u0790\u017f\u0001\u0000\u0000\u0000"+ - "\u00c8\u018e\u0193\u019a\u01a4\u01aa\u01b0\u01ba\u01c4\u01d2\u01d6\u01df"+ - "\u01eb\u01ef\u01f5\u01fe\u0208\u0219\u0227\u022b\u0232\u023a\u0243\u0263"+ - "\u026b\u0283\u0296\u02a5\u02b3\u02bc\u02ca\u02d3\u02df\u02e5\u02fe\u0307"+ - "\u030c\u0311\u0314\u0319\u0320\u0326\u032f\u0335\u0342\u0345\u0349\u034d"+ - "\u0355\u035d\u0362\u036a\u036c\u0371\u0378\u0380\u0383\u0389\u038e\u0390"+ - "\u0393\u039a\u039f\u03b2\u03ba\u03be\u03c1\u03c7\u03cb\u03ce\u03d8\u03df"+ - "\u03e6\u03f2\u03f8\u03ff\u0404\u040a\u0416\u041c\u0420\u0428\u042c\u0432"+ - "\u0435\u043b\u0440\u0459\u047c\u047e\u0495\u049d\u04a8\u04af\u04b6\u04c0"+ - "\u04d2\u04e8\u04ea\u04f2\u04f6\u04fa\u04fd\u0506\u050c\u0516\u051e\u0524"+ - "\u052d\u0538\u0543\u0547\u0549\u0554\u055d\u0561\u0564\u056b\u0576\u0580"+ - "\u0586\u0588\u0592\u059c\u05a0\u05a4\u05a8\u05af\u05b7\u05c2\u05c6\u05ca"+ - "\u05d6\u05da\u05de\u05e3\u05e6\u05e9\u05f0\u05f7\u060b\u060f\u0613\u0617"+ - "\u0627\u062d\u062f\u0633\u0637\u063a\u063e\u0640\u0646\u064e\u0653\u065e"+ - "\u0664\u066b\u0676\u067b\u067f\u0684\u0688\u0690\u0698\u069d\u06a0\u06a8"+ - "\u06ae\u06b2\u06b4\u06b9\u06bd\u06c1\u06c8\u06e5\u06f0\u06f4\u06fc\u0700"+ - "\u0702\u070a\u0713\u071b\u0720\u0730\u0732\u073b\u0741\u0747\u074b\u0754"+ - "\u075d\u0760\u0765\u0777\u0779\u077c\u077f\u0781\u078f"; + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0005Z\u0489\bZ\nZ\fZ\u048c\tZ\u0001[\u0001"+ + "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ + "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0003[\u04a2"+ + "\b[\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0003]\u04aa\b]\u0001"+ + "^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0005_\u04b3\b_\n_\f_\u04b6"+ + "\t_\u0001_\u0001_\u0001_\u0001_\u0003_\u04bc\b_\u0001`\u0001`\u0001`\u0001"+ + "`\u0001`\u0003`\u04c3\b`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ + "a\u0001a\u0003a\u04cd\ba\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003"+ + "b\u04df\bb\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0005b\u04f5\bb\nb\fb\u04f8\tb\u0001c\u0001c\u0001c\u0001d\u0001"+ + "d\u0003d\u04ff\bd\u0001d\u0001d\u0003d\u0503\bd\u0001e\u0001e\u0003e\u0507"+ + "\be\u0001e\u0003e\u050a\be\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001"+ + "f\u0003f\u0513\bf\u0001f\u0001f\u0005f\u0517\bf\nf\ff\u051a\tf\u0001f"+ + "\u0001f\u0001g\u0001g\u0001g\u0001g\u0001h\u0003h\u0523\bh\u0001h\u0001"+ + "h\u0001h\u0001h\u0001h\u0001h\u0003h\u052b\bh\u0001h\u0001h\u0001h\u0001"+ + "h\u0003h\u0531\bh\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0003"+ + "i\u053a\bi\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001"+ + "j\u0003j\u0545\bj\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0005"+ + "l\u054e\bl\nl\fl\u0551\tl\u0001l\u0003l\u0554\bl\u0003l\u0556\bl\u0001"+ + "l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0003m\u0561"+ + "\bm\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0003o\u056a\bo\u0001"+ + "o\u0001o\u0003o\u056e\bo\u0001o\u0003o\u0571\bo\u0001o\u0001o\u0001o\u0001"+ + "o\u0001o\u0003o\u0578\bo\u0001o\u0001o\u0001p\u0001p\u0001q\u0001q\u0001"+ + "r\u0001r\u0001s\u0003s\u0583\bs\u0001s\u0001s\u0001t\u0001t\u0001t\u0001"+ + "t\u0001t\u0001t\u0003t\u058d\bt\u0001t\u0001t\u0001t\u0001t\u0003t\u0593"+ + "\bt\u0003t\u0595\bt\u0001u\u0001u\u0001u\u0001v\u0001v\u0001w\u0001w\u0001"+ + "w\u0003w\u059f\bw\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0005x\u05a7"+ + "\bx\nx\fx\u05aa\tx\u0001x\u0003x\u05ad\bx\u0001y\u0001y\u0003y\u05b1\b"+ + "y\u0001y\u0001y\u0003y\u05b5\by\u0001z\u0001z\u0001z\u0005z\u05ba\bz\n"+ + "z\fz\u05bd\tz\u0001{\u0001{\u0001{\u0005{\u05c2\b{\n{\f{\u05c5\t{\u0001"+ + "|\u0001|\u0001|\u0001|\u0001|\u0001|\u0005|\u05cd\b|\n|\f|\u05d0\t|\u0001"+ + "|\u0003|\u05d3\b|\u0001}\u0001}\u0003}\u05d7\b}\u0001}\u0001}\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0005~\u05e1\b~\n~\f~\u05e4\t~\u0001~\u0003"+ + "~\u05e7\b~\u0001\u007f\u0001\u007f\u0003\u007f\u05eb\b\u007f\u0001\u007f"+ + "\u0001\u007f\u0001\u0080\u0003\u0080\u05f0\b\u0080\u0001\u0080\u0003\u0080"+ + "\u05f3\b\u0080\u0001\u0080\u0003\u0080\u05f6\b\u0080\u0001\u0080\u0001"+ + "\u0080\u0001\u0080\u0004\u0080\u05fb\b\u0080\u000b\u0080\f\u0080\u05fc"+ + "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0003\u0081"+ + "\u0604\b\u0081\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083"+ + "\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085"+ + "\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087"+ + "\u0001\u0087\u0003\u0087\u0618\b\u0087\u0001\u0088\u0001\u0088\u0003\u0088"+ + "\u061c\b\u0088\u0001\u0089\u0001\u0089\u0003\u0089\u0620\b\u0089\u0001"+ + "\u008a\u0001\u008a\u0003\u008a\u0624\b\u008a\u0001\u008b\u0001\u008b\u0001"+ + "\u008b\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001"+ + "\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0003"+ + "\u008d\u0634\b\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0003"+ + "\u008d\u063a\b\u008d\u0003\u008d\u063c\b\u008d\u0001\u008e\u0001\u008e"+ + "\u0003\u008e\u0640\b\u008e\u0001\u008f\u0001\u008f\u0003\u008f\u0644\b"+ + "\u008f\u0001\u008f\u0003\u008f\u0647\b\u008f\u0001\u008f\u0001\u008f\u0003"+ + "\u008f\u064b\b\u008f\u0003\u008f\u064d\b\u008f\u0001\u008f\u0001\u008f"+ + "\u0005\u008f\u0651\b\u008f\n\u008f\f\u008f\u0654\t\u008f\u0001\u008f\u0001"+ + "\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u065b\b\u0090\u0001"+ + "\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u0660\b\u0091\u0001\u0092\u0001"+ + "\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001"+ + "\u0092\u0001\u0092\u0003\u0092\u066b\b\u0092\u0001\u0092\u0001\u0092\u0005"+ + "\u0092\u066f\b\u0092\n\u0092\f\u0092\u0672\t\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0093\u0001\u0093\u0003\u0093\u0678\b\u0093\u0001\u0093\u0001\u0093"+ + "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0003\u0094\u0683\b\u0094\u0001\u0095\u0001\u0095\u0001\u0095"+ + "\u0003\u0095\u0688\b\u0095\u0001\u0096\u0001\u0096\u0003\u0096\u068c\b"+ + "\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0003\u0096\u0691\b\u0096\u0005"+ + "\u0096\u0693\b\u0096\n\u0096\f\u0096\u0696\t\u0096\u0001\u0097\u0001\u0097"+ + "\u0001\u0097\u0005\u0097\u069b\b\u0097\n\u0097\f\u0097\u069e\t\u0097\u0001"+ + "\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0003\u0098\u06a5"+ + "\b\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0003\u0099\u06aa\b\u0099"+ + "\u0001\u0099\u0003\u0099\u06ad\b\u0099\u0001\u009a\u0001\u009a\u0001\u009a"+ + "\u0001\u009a\u0001\u009a\u0001\u009a\u0003\u009a\u06b5\b\u009a\u0001\u009a"+ + "\u0001\u009a\u0001\u009b\u0001\u009b\u0003\u009b\u06bb\b\u009b\u0001\u009b"+ + "\u0001\u009b\u0003\u009b\u06bf\b\u009b\u0003\u009b\u06c1\b\u009b\u0001"+ + "\u009b\u0001\u009b\u0001\u009c\u0003\u009c\u06c6\b\u009c\u0001\u009c\u0001"+ + "\u009c\u0003\u009c\u06ca\b\u009c\u0001\u009c\u0001\u009c\u0003\u009c\u06ce"+ + "\b\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0003"+ + "\u009e\u06d5\b\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ + "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ + "\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06f2"+ + "\b\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001"+ + "\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0003\u00a7\u06fd\b\u00a7\u0001"+ + "\u00a8\u0001\u00a8\u0003\u00a8\u0701\b\u00a8\u0001\u00a9\u0001\u00a9\u0001"+ + "\u00a9\u0001\u00a9\u0005\u00a9\u0707\b\u00a9\n\u00a9\f\u00a9\u070a\t\u00a9"+ + "\u0001\u00a9\u0003\u00a9\u070d\b\u00a9\u0003\u00a9\u070f\b\u00a9\u0001"+ + "\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0003"+ + "\u00aa\u0717\b\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ab\u0001\u00ab\u0003\u00ab\u0720\b\u00ab\u0001\u00ac\u0001"+ + "\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0003\u00ac\u0728"+ + "\b\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003\u00ad\u072d\b\u00ad"+ + "\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0"+ + "\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2"+ + "\u0001\u00b2\u0001\u00b2\u0003\u00b2\u073d\b\u00b2\u0003\u00b2\u073f\b"+ + "\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0005"+ + "\u00b3\u0746\b\u00b3\n\u00b3\f\u00b3\u0749\t\u00b3\u0001\u00b4\u0001\u00b4"+ + "\u0001\u00b4\u0003\u00b4\u074e\b\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5"+ + "\u0001\u00b5\u0003\u00b5\u0754\b\u00b5\u0001\u00b6\u0001\u00b6\u0003\u00b6"+ + "\u0758\b\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ + "\u0005\u00b7\u075f\b\u00b7\n\u00b7\f\u00b7\u0762\t\u00b7\u0001\u00b7\u0001"+ + "\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0003\u00b9\u0769\b\u00b9\u0001"+ + "\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001"+ + "\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001"+ + "\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0003\u00bc\u077b\b\u00bc\u0003"+ + "\u00bc\u077d\b\u00bc\u0001\u00bc\u0003\u00bc\u0780\b\u00bc\u0001\u00bc"+ + "\u0003\u00bc\u0783\b\u00bc\u0003\u00bc\u0785\b\u00bc\u0001\u00bc\u0001"+ + "\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001"+ + "\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0003\u00bf\u0793"+ + "\b\u00bf\u0001\u00bf\u0001\u0318\u0002\u00b4\u00c4\u00c0\u0000\u0002\u0004"+ + "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ + "$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086"+ + "\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e"+ + "\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6"+ + "\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce"+ + "\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6"+ + "\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe"+ + "\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116"+ + "\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e"+ + "\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146"+ + "\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e"+ + "\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176"+ + "\u0178\u017a\u017c\u017e\u0000\u0014\u0002\u0000iitt\u0001\u0000\u0017"+ + "\u0018\u0001\u0000\u0005\b\u0001\u0000BC\u0001\u0000(*\u0002\u0000(*,"+ + ",\u0002\u0000jkqq\u0001\u0000\u0087\u008d\u0001\u0000\u0014\u0015\u0002"+ + "\u0000\u0082\u0086\u008b\u008c\u0004\u0000##uu\u0081\u0081\u0088\u008a"+ + "\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000IJ{\u0080\u0004"+ + "\u0000..1144aa\u0002\u0000\u0081\u0086\u0088\u008c\u0001\u0000uv\u0002"+ + "\u0000rr\u00a3\u00a3\u0002\u0000\u008e\u0091\u0093\u0094\u0001\u0000\u009a"+ + "\u009b\u0802\u0000\u0180\u0001\u0000\u0000\u0000\u0002\u0183\u0001\u0000"+ + "\u0000\u0000\u0004\u0186\u0001\u0000\u0000\u0000\u0006\u0189\u0001\u0000"+ + "\u0000\u0000\b\u0191\u0001\u0000\u0000\u0000\n\u019a\u0001\u0000\u0000"+ + "\u0000\f\u01ba\u0001\u0000\u0000\u0000\u000e\u01c7\u0001\u0000\u0000\u0000"+ + "\u0010\u01ca\u0001\u0000\u0000\u0000\u0012\u01d2\u0001\u0000\u0000\u0000"+ + "\u0014\u01df\u0001\u0000\u0000\u0000\u0016\u01f5\u0001\u0000\u0000\u0000"+ + "\u0018\u01fe\u0001\u0000\u0000\u0000\u001a\u0200\u0001\u0000\u0000\u0000"+ + "\u001c\u0202\u0001\u0000\u0000\u0000\u001e\u0205\u0001\u0000\u0000\u0000"+ + " \u0219\u0001\u0000\u0000\u0000\"\u021b\u0001\u0000\u0000\u0000$\u021d"+ + "\u0001\u0000\u0000\u0000&\u0222\u0001\u0000\u0000\u0000(\u022d\u0001\u0000"+ + "\u0000\u0000*\u023a\u0001\u0000\u0000\u0000,\u023d\u0001\u0000\u0000\u0000"+ + ".\u0248\u0001\u0000\u0000\u00000\u024a\u0001\u0000\u0000\u00002\u024f"+ + "\u0001\u0000\u0000\u00004\u0254\u0001\u0000\u0000\u00006\u0259\u0001\u0000"+ + "\u0000\u00008\u025e\u0001\u0000\u0000\u0000:\u026b\u0001\u0000\u0000\u0000"+ + "<\u026d\u0001\u0000\u0000\u0000>\u026f\u0001\u0000\u0000\u0000@\u0274"+ + "\u0001\u0000\u0000\u0000B\u0279\u0001\u0000\u0000\u0000D\u027e\u0001\u0000"+ + "\u0000\u0000F\u0287\u0001\u0000\u0000\u0000H\u028e\u0001\u0000\u0000\u0000"+ + "J\u029b\u0001\u0000\u0000\u0000L\u029f\u0001\u0000\u0000\u0000N\u02aa"+ + "\u0001\u0000\u0000\u0000P\u02b3\u0001\u0000\u0000\u0000R\u02b5\u0001\u0000"+ + "\u0000\u0000T\u02ca\u0001\u0000\u0000\u0000V\u02cc\u0001\u0000\u0000\u0000"+ + "X\u02d8\u0001\u0000\u0000\u0000Z\u02e5\u0001\u0000\u0000\u0000\\\u02e9"+ + "\u0001\u0000\u0000\u0000^\u02ee\u0001\u0000\u0000\u0000`\u02fa\u0001\u0000"+ + "\u0000\u0000b\u030a\u0001\u0000\u0000\u0000d\u0318\u0001\u0000\u0000\u0000"+ + "f\u0323\u0001\u0000\u0000\u0000h\u0327\u0001\u0000\u0000\u0000j\u032f"+ + "\u0001\u0000\u0000\u0000l\u0336\u0001\u0000\u0000\u0000n\u033e\u0001\u0000"+ + "\u0000\u0000p\u034e\u0001\u0000\u0000\u0000r\u0351\u0001\u0000\u0000\u0000"+ + "t\u0359\u0001\u0000\u0000\u0000v\u035b\u0001\u0000\u0000\u0000x\u0366"+ + "\u0001\u0000\u0000\u0000z\u036e\u0001\u0000\u0000\u0000|\u037d\u0001\u0000"+ + "\u0000\u0000~\u037f\u0001\u0000\u0000\u0000\u0080\u0387\u0001\u0000\u0000"+ + "\u0000\u0082\u0395\u0001\u0000\u0000\u0000\u0084\u03a1\u0001\u0000\u0000"+ + "\u0000\u0086\u03ab\u0001\u0000\u0000\u0000\u0088\u03af\u0001\u0000\u0000"+ + "\u0000\u008a\u03b5\u0001\u0000\u0000\u0000\u008c\u03cd\u0001\u0000\u0000"+ + "\u0000\u008e\u03d5\u0001\u0000\u0000\u0000\u0090\u03e4\u0001\u0000\u0000"+ + "\u0000\u0092\u03e6\u0001\u0000\u0000\u0000\u0094\u03ed\u0001\u0000\u0000"+ + "\u0000\u0096\u03f6\u0001\u0000\u0000\u0000\u0098\u03fb\u0001\u0000\u0000"+ + "\u0000\u009a\u0400\u0001\u0000\u0000\u0000\u009c\u0406\u0001\u0000\u0000"+ + "\u0000\u009e\u040d\u0001\u0000\u0000\u0000\u00a0\u0412\u0001\u0000\u0000"+ + "\u0000\u00a2\u0418\u0001\u0000\u0000\u0000\u00a4\u041d\u0001\u0000\u0000"+ + "\u0000\u00a6\u0424\u0001\u0000\u0000\u0000\u00a8\u042e\u0001\u0000\u0000"+ + "\u0000\u00aa\u0432\u0001\u0000\u0000\u0000\u00ac\u043e\u0001\u0000\u0000"+ + "\u0000\u00ae\u0441\u0001\u0000\u0000\u0000\u00b0\u0445\u0001\u0000\u0000"+ + "\u0000\u00b2\u044c\u0001\u0000\u0000\u0000\u00b4\u0465\u0001\u0000\u0000"+ + "\u0000\u00b6\u04a1\u0001\u0000\u0000\u0000\u00b8\u04a3\u0001\u0000\u0000"+ + "\u0000\u00ba\u04a6\u0001\u0000\u0000\u0000\u00bc\u04ab\u0001\u0000\u0000"+ + "\u0000\u00be\u04b4\u0001\u0000\u0000\u0000\u00c0\u04c2\u0001\u0000\u0000"+ + "\u0000\u00c2\u04cc\u0001\u0000\u0000\u0000\u00c4\u04de\u0001\u0000\u0000"+ + "\u0000\u00c6\u04f9\u0001\u0000\u0000\u0000\u00c8\u04fc\u0001\u0000\u0000"+ + "\u0000\u00ca\u0504\u0001\u0000\u0000\u0000\u00cc\u050d\u0001\u0000\u0000"+ + "\u0000\u00ce\u051d\u0001\u0000\u0000\u0000\u00d0\u0530\u0001\u0000\u0000"+ + "\u0000\u00d2\u0539\u0001\u0000\u0000\u0000\u00d4\u0544\u0001\u0000\u0000"+ + "\u0000\u00d6\u0546\u0001\u0000\u0000\u0000\u00d8\u0549\u0001\u0000\u0000"+ + "\u0000\u00da\u0560\u0001\u0000\u0000\u0000\u00dc\u0562\u0001\u0000\u0000"+ + "\u0000\u00de\u0567\u0001\u0000\u0000\u0000\u00e0\u057b\u0001\u0000\u0000"+ + "\u0000\u00e2\u057d\u0001\u0000\u0000\u0000\u00e4\u057f\u0001\u0000\u0000"+ + "\u0000\u00e6\u0582\u0001\u0000\u0000\u0000\u00e8\u058c\u0001\u0000\u0000"+ + "\u0000\u00ea\u0596\u0001\u0000\u0000\u0000\u00ec\u0599\u0001\u0000\u0000"+ + "\u0000\u00ee\u059e\u0001\u0000\u0000\u0000\u00f0\u05a0\u0001\u0000\u0000"+ + "\u0000\u00f2\u05ae\u0001\u0000\u0000\u0000\u00f4\u05b6\u0001\u0000\u0000"+ + "\u0000\u00f6\u05be\u0001\u0000\u0000\u0000\u00f8\u05c6\u0001\u0000\u0000"+ + "\u0000\u00fa\u05d4\u0001\u0000\u0000\u0000\u00fc\u05da\u0001\u0000\u0000"+ + "\u0000\u00fe\u05e8\u0001\u0000\u0000\u0000\u0100\u05fa\u0001\u0000\u0000"+ + "\u0000\u0102\u0603\u0001\u0000\u0000\u0000\u0104\u0605\u0001\u0000\u0000"+ + "\u0000\u0106\u0607\u0001\u0000\u0000\u0000\u0108\u060b\u0001\u0000\u0000"+ + "\u0000\u010a\u060e\u0001\u0000\u0000\u0000\u010c\u0612\u0001\u0000\u0000"+ + "\u0000\u010e\u0614\u0001\u0000\u0000\u0000\u0110\u0619\u0001\u0000\u0000"+ + "\u0000\u0112\u061d\u0001\u0000\u0000\u0000\u0114\u0621\u0001\u0000\u0000"+ + "\u0000\u0116\u0625\u0001\u0000\u0000\u0000\u0118\u0628\u0001\u0000\u0000"+ + "\u0000\u011a\u062a\u0001\u0000\u0000\u0000\u011c\u063f\u0001\u0000\u0000"+ + "\u0000\u011e\u0641\u0001\u0000\u0000\u0000\u0120\u0657\u0001\u0000\u0000"+ + "\u0000\u0122\u065f\u0001\u0000\u0000\u0000\u0124\u0661\u0001\u0000\u0000"+ + "\u0000\u0126\u0677\u0001\u0000\u0000\u0000\u0128\u067f\u0001\u0000\u0000"+ + "\u0000\u012a\u0687\u0001\u0000\u0000\u0000\u012c\u068b\u0001\u0000\u0000"+ + "\u0000\u012e\u0697\u0001\u0000\u0000\u0000\u0130\u06a1\u0001\u0000\u0000"+ + "\u0000\u0132\u06ac\u0001\u0000\u0000\u0000\u0134\u06b4\u0001\u0000\u0000"+ + "\u0000\u0136\u06b8\u0001\u0000\u0000\u0000\u0138\u06c5\u0001\u0000\u0000"+ + "\u0000\u013a\u06cf\u0001\u0000\u0000\u0000\u013c\u06d4\u0001\u0000\u0000"+ + "\u0000\u013e\u06d6\u0001\u0000\u0000\u0000\u0140\u06db\u0001\u0000\u0000"+ + "\u0000\u0142\u06dd\u0001\u0000\u0000\u0000\u0144\u06df\u0001\u0000\u0000"+ + "\u0000\u0146\u06e2\u0001\u0000\u0000\u0000\u0148\u06e6\u0001\u0000\u0000"+ + "\u0000\u014a\u06f1\u0001\u0000\u0000\u0000\u014c\u06f5\u0001\u0000\u0000"+ + "\u0000\u014e\u06fc\u0001\u0000\u0000\u0000\u0150\u0700\u0001\u0000\u0000"+ + "\u0000\u0152\u0702\u0001\u0000\u0000\u0000\u0154\u0712\u0001\u0000\u0000"+ + "\u0000\u0156\u071f\u0001\u0000\u0000\u0000\u0158\u0727\u0001\u0000\u0000"+ + "\u0000\u015a\u072c\u0001\u0000\u0000\u0000\u015c\u072e\u0001\u0000\u0000"+ + "\u0000\u015e\u0730\u0001\u0000\u0000\u0000\u0160\u0732\u0001\u0000\u0000"+ + "\u0000\u0162\u0736\u0001\u0000\u0000\u0000\u0164\u0739\u0001\u0000\u0000"+ + "\u0000\u0166\u0742\u0001\u0000\u0000\u0000\u0168\u074d\u0001\u0000\u0000"+ + "\u0000\u016a\u0753\u0001\u0000\u0000\u0000\u016c\u0757\u0001\u0000\u0000"+ + "\u0000\u016e\u0759\u0001\u0000\u0000\u0000\u0170\u0765\u0001\u0000\u0000"+ + "\u0000\u0172\u0768\u0001\u0000\u0000\u0000\u0174\u076c\u0001\u0000\u0000"+ + "\u0000\u0176\u0770\u0001\u0000\u0000\u0000\u0178\u0775\u0001\u0000\u0000"+ + "\u0000\u017a\u0788\u0001\u0000\u0000\u0000\u017c\u078c\u0001\u0000\u0000"+ + "\u0000\u017e\u0792\u0001\u0000\u0000\u0000\u0180\u0181\u0003\u00b4Z\u0000"+ + "\u0181\u0182\u0005\u0000\u0000\u0001\u0182\u0001\u0001\u0000\u0000\u0000"+ + "\u0183\u0184\u0003\u00b6[\u0000\u0184\u0185\u0005\u0000\u0000\u0001\u0185"+ + "\u0003\u0001\u0000\u0000\u0000\u0186\u0187\u0003\u00d2i\u0000\u0187\u0188"+ + "\u0005\u0000\u0000\u0001\u0188\u0005\u0001\u0000\u0000\u0000\u0189\u018e"+ + "\u0003\b\u0004\u0000\u018a\u018b\u0005q\u0000\u0000\u018b\u018d\u0003"+ + "\b\u0004\u0000\u018c\u018a\u0001\u0000\u0000\u0000\u018d\u0190\u0001\u0000"+ + "\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000"+ + "\u0000\u0000\u018f\u0007\u0001\u0000\u0000\u0000\u0190\u018e\u0001\u0000"+ + "\u0000\u0000\u0191\u0193\u0005i\u0000\u0000\u0192\u0194\u0005=\u0000\u0000"+ + "\u0193\u0192\u0001\u0000\u0000\u0000\u0193\u0194\u0001\u0000\u0000\u0000"+ + "\u0194\t\u0001\u0000\u0000\u0000\u0195\u0196\u0003\u000e\u0007\u0000\u0196"+ + "\u0197\u0003\u017e\u00bf\u0000\u0197\u0199\u0001\u0000\u0000\u0000\u0198"+ + "\u0195\u0001\u0000\u0000\u0000\u0199\u019c\u0001\u0000\u0000\u0000\u019a"+ + "\u0198\u0001\u0000\u0000\u0000\u019a\u019b\u0001\u0000\u0000\u0000\u019b"+ + "\u019d\u0001\u0000\u0000\u0000\u019c\u019a\u0001\u0000\u0000\u0000\u019d"+ + "\u019e\u0003\u00eau\u0000\u019e\u01a4\u0003\u017e\u00bf\u0000\u019f\u01a0"+ + "\u0003\u0014\n\u0000\u01a0\u01a1\u0003\u017e\u00bf\u0000\u01a1\u01a3\u0001"+ + "\u0000\u0000\u0000\u01a2\u019f\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001"+ + "\u0000\u0000\u0000\u01a4\u01a2\u0001\u0000\u0000\u0000\u01a4\u01a5\u0001"+ + "\u0000\u0000\u0000\u01a5\u01b0\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001"+ + "\u0000\u0000\u0000\u01a7\u01ab\u0003\u0098L\u0000\u01a8\u01ab\u0003\u00ee"+ + "w\u0000\u01a9\u01ab\u0003\u0016\u000b\u0000\u01aa\u01a7\u0001\u0000\u0000"+ + "\u0000\u01aa\u01a8\u0001\u0000\u0000\u0000\u01aa\u01a9\u0001\u0000\u0000"+ + "\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000\u01ac\u01ad\u0003\u017e\u00bf"+ + "\u0000\u01ad\u01af\u0001\u0000\u0000\u0000\u01ae\u01aa\u0001\u0000\u0000"+ + "\u0000\u01af\u01b2\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000"+ + "\u0000\u01b0\u01b1\u0001\u0000\u0000\u0000\u01b1\u01b3\u0001\u0000\u0000"+ + "\u0000\u01b2\u01b0\u0001\u0000\u0000\u0000\u01b3\u01b4\u0005\u0000\u0000"+ + "\u0001\u01b4\u000b\u0001\u0000\u0000\u0000\u01b5\u01b6\u0003\u000e\u0007"+ + "\u0000\u01b6\u01b7\u0003\u017e\u00bf\u0000\u01b7\u01b9\u0001\u0000\u0000"+ + "\u0000\u01b8\u01b5\u0001\u0000\u0000\u0000\u01b9\u01bc\u0001\u0000\u0000"+ + "\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01ba\u01bb\u0001\u0000\u0000"+ + "\u0000\u01bb\u01bd\u0001\u0000\u0000\u0000\u01bc\u01ba\u0001\u0000\u0000"+ + "\u0000\u01bd\u01be\u0003\u00eau\u0000\u01be\u01c4\u0003\u017e\u00bf\u0000"+ + "\u01bf\u01c0\u0003\u0014\n\u0000\u01c0\u01c1\u0003\u017e\u00bf\u0000\u01c1"+ + "\u01c3\u0001\u0000\u0000\u0000\u01c2\u01bf\u0001\u0000\u0000\u0000\u01c3"+ + "\u01c6\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c4"+ + "\u01c5\u0001\u0000\u0000\u0000\u01c5\r\u0001\u0000\u0000\u0000\u01c6\u01c4"+ + "\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005F\u0000\u0000\u01c8\u01c9\u0003"+ + "\u00b4Z\u0000\u01c9\u000f\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005G\u0000"+ + "\u0000\u01cb\u01cc\u0003\u00b4Z\u0000\u01cc\u0011\u0001\u0000\u0000\u0000"+ + "\u01cd\u01ce\u0003\u0010\b\u0000\u01ce\u01cf\u0003\u017e\u00bf\u0000\u01cf"+ + "\u01d1\u0001\u0000\u0000\u0000\u01d0\u01cd\u0001\u0000\u0000\u0000\u01d1"+ + "\u01d4\u0001\u0000\u0000\u0000\u01d2\u01d0\u0001\u0000\u0000\u0000\u01d2"+ + "\u01d3\u0001\u0000\u0000\u0000\u01d3\u01d6\u0001\u0000\u0000\u0000\u01d4"+ + "\u01d2\u0001\u0000\u0000\u0000\u01d5\u01d7\u0007\u0000\u0000\u0000\u01d6"+ + "\u01d5\u0001\u0000\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7"+ + "\u01d8\u0001\u0000\u0000\u0000\u01d8\u01d9\u0003\u00ecv\u0000\u01d9\u0013"+ + "\u0001\u0000\u0000\u0000\u01da\u01db\u0003\u0010\b\u0000\u01db\u01dc\u0003"+ + "\u017e\u00bf\u0000\u01dc\u01de\u0001\u0000\u0000\u0000\u01dd\u01da\u0001"+ + "\u0000\u0000\u0000\u01de\u01e1\u0001\u0000\u0000\u0000\u01df\u01dd\u0001"+ + "\u0000\u0000\u0000\u01df\u01e0\u0001\u0000\u0000\u0000\u01e0\u01ef\u0001"+ + "\u0000\u0000\u0000\u01e1\u01df\u0001\u0000\u0000\u0000\u01e2\u01e3\u0005"+ + "e\u0000\u0000\u01e3\u01f0\u0003\u0012\t\u0000\u01e4\u01e5\u0005e\u0000"+ + "\u0000\u01e5\u01eb\u0005j\u0000\u0000\u01e6\u01e7\u0003\u0012\t\u0000"+ + "\u01e7\u01e8\u0003\u017e\u00bf\u0000\u01e8\u01ea\u0001\u0000\u0000\u0000"+ + "\u01e9\u01e6\u0001\u0000\u0000\u0000\u01ea\u01ed\u0001\u0000\u0000\u0000"+ + "\u01eb\u01e9\u0001\u0000\u0000\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000"+ + "\u01ec\u01ee\u0001\u0000\u0000\u0000\u01ed\u01eb\u0001\u0000\u0000\u0000"+ + "\u01ee\u01f0\u0005k\u0000\u0000\u01ef\u01e2\u0001\u0000\u0000\u0000\u01ef"+ + "\u01e4\u0001\u0000\u0000\u0000\u01f0\u0015\u0001\u0000\u0000\u0000\u01f1"+ + "\u01f6\u0003\u008aE\u0000\u01f2\u01f6\u0003\u00a0P\u0000\u01f3\u01f6\u0003"+ + "\u00a4R\u0000\u01f4\u01f6\u0003\u009eO\u0000\u01f5\u01f1\u0001\u0000\u0000"+ + "\u0000\u01f5\u01f2\u0001\u0000\u0000\u0000\u01f5\u01f3\u0001\u0000\u0000"+ + "\u0000\u01f5\u01f4\u0001\u0000\u0000\u0000\u01f6\u0017\u0001\u0000\u0000"+ + "\u0000\u01f7\u01f8\u0005\u001b\u0000\u0000\u01f8\u01ff\u0003\u00b6[\u0000"+ + "\u01f9\u01fa\u0007\u0001\u0000\u0000\u01fa\u01ff\u0003.\u0017\u0000\u01fb"+ + "\u01fc\u0007\u0002\u0000\u0000\u01fc\u01ff\u0003\u00b4Z\u0000\u01fd\u01ff"+ + "\u0003v;\u0000\u01fe\u01f7\u0001\u0000\u0000\u0000\u01fe\u01f9\u0001\u0000"+ + "\u0000\u0000\u01fe\u01fb\u0001\u0000\u0000\u0000\u01fe\u01fd\u0001\u0000"+ + "\u0000\u0000\u01ff\u0019\u0001\u0000\u0000\u0000\u0200\u0201\u0003\u001c"+ + "\u000e\u0000\u0201\u001b\u0001\u0000\u0000\u0000\u0202\u0203\u0003d2\u0000"+ + "\u0203\u0204\u0003\u001e\u000f\u0000\u0204\u001d\u0001\u0000\u0000\u0000"+ + "\u0205\u0206\u0005E\u0000\u0000\u0206\u0208\u0005j\u0000\u0000\u0207\u0209"+ + "\u0003\u0100\u0080\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0208\u0209"+ + "\u0001\u0000\u0000\u0000\u0209\u020a\u0001\u0000\u0000\u0000\u020a\u020b"+ + "\u0005k\u0000\u0000\u020b\u001f\u0001\u0000\u0000\u0000\u020c\u021a\u0003"+ + "F#\u0000\u020d\u021a\u0003D\"\u0000\u020e\u021a\u0003B!\u0000\u020f\u021a"+ + "\u0003$\u0012\u0000\u0210\u021a\u0003@ \u0000\u0211\u021a\u00038\u001c"+ + "\u0000\u0212\u021a\u0003>\u001f\u0000\u0213\u021a\u00036\u001b\u0000\u0214"+ + "\u021a\u00032\u0019\u0000\u0215\u021a\u00030\u0018\u0000\u0216\u021a\u0003"+ + "4\u001a\u0000\u0217\u021a\u0003\"\u0011\u0000\u0218\u021a\u0003H$\u0000"+ + "\u0219\u020c\u0001\u0000\u0000\u0000\u0219\u020d\u0001\u0000\u0000\u0000"+ + "\u0219\u020e\u0001\u0000\u0000\u0000\u0219\u020f\u0001\u0000\u0000\u0000"+ + "\u0219\u0210\u0001\u0000\u0000\u0000\u0219\u0211\u0001\u0000\u0000\u0000"+ + "\u0219\u0212\u0001\u0000\u0000\u0000\u0219\u0213\u0001\u0000\u0000\u0000"+ + "\u0219\u0214\u0001\u0000\u0000\u0000\u0219\u0215\u0001\u0000\u0000\u0000"+ + "\u0219\u0216\u0001\u0000\u0000\u0000\u0219\u0217\u0001\u0000\u0000\u0000"+ + "\u0219\u0218\u0001\u0000\u0000\u0000\u021a!\u0001\u0000\u0000\u0000\u021b"+ + "\u021c\u0007\u0003\u0000\u0000\u021c#\u0001\u0000\u0000\u0000\u021d\u021e"+ + "\u0005b\u0000\u0000\u021e\u021f\u0005n\u0000\u0000\u021f\u0220\u0003\u00d2"+ + "i\u0000\u0220\u0221\u0005o\u0000\u0000\u0221%\u0001\u0000\u0000\u0000"+ + "\u0222\u0227\u0003(\u0014\u0000\u0223\u0224\u0005q\u0000\u0000\u0224\u0226"+ + "\u0003(\u0014\u0000\u0225\u0223\u0001\u0000\u0000\u0000\u0226\u0229\u0001"+ + "\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0228\u0001"+ + "\u0000\u0000\u0000\u0228\u022b\u0001\u0000\u0000\u0000\u0229\u0227\u0001"+ + "\u0000\u0000\u0000\u022a\u022c\u0005q\u0000\u0000\u022b\u022a\u0001\u0000"+ + "\u0000\u0000\u022b\u022c\u0001\u0000\u0000\u0000\u022c\'\u0001\u0000\u0000"+ + "\u0000\u022d\u0232\u0005i\u0000\u0000\u022e\u022f\u0005q\u0000\u0000\u022f"+ + "\u0231\u0005i\u0000\u0000\u0230\u022e\u0001\u0000\u0000\u0000\u0231\u0234"+ + "\u0001\u0000\u0000\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0232\u0233"+ + "\u0001\u0000\u0000\u0000\u0233\u0235\u0001\u0000\u0000\u0000\u0234\u0232"+ + "\u0001\u0000\u0000\u0000\u0235\u0236\u0003\u0142\u00a1\u0000\u0236)\u0001"+ + "\u0000\u0000\u0000\u0237\u0239\u0003,\u0016\u0000\u0238\u0237\u0001\u0000"+ + "\u0000\u0000\u0239\u023c\u0001\u0000\u0000\u0000\u023a\u0238\u0001\u0000"+ + "\u0000\u0000\u023a\u023b\u0001\u0000\u0000\u0000\u023b+\u0001\u0000\u0000"+ + "\u0000\u023c\u023a\u0001\u0000\u0000\u0000\u023d\u023e\u0005l\u0000\u0000"+ + "\u023e\u0243\u0003\u00b4Z\u0000\u023f\u0240\u0005q\u0000\u0000\u0240\u0242"+ + "\u0003\u00b4Z\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0242\u0245\u0001"+ + "\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0243\u0244\u0001"+ + "\u0000\u0000\u0000\u0244\u0246\u0001\u0000\u0000\u0000\u0245\u0243\u0001"+ + "\u0000\u0000\u0000\u0246\u0247\u0005m\u0000\u0000\u0247-\u0001\u0000\u0000"+ + "\u0000\u0248\u0249\u0003\u00c4b\u0000\u0249/\u0001\u0000\u0000\u0000\u024a"+ + "\u024b\u00052\u0000\u0000\u024b\u024c\u0005j\u0000\u0000\u024c\u024d\u0003"+ + "\u00b4Z\u0000\u024d\u024e\u0005k\u0000\u0000\u024e1\u0001\u0000\u0000"+ + "\u0000\u024f\u0250\u00058\u0000\u0000\u0250\u0251\u0005n\u0000\u0000\u0251"+ + "\u0252\u0003\u00d2i\u0000\u0252\u0253\u0005o\u0000\u0000\u02533\u0001"+ + "\u0000\u0000\u0000\u0254\u0255\u00053\u0000\u0000\u0255\u0256\u0005j\u0000"+ + "\u0000\u0256\u0257\u0003\u00b4Z\u0000\u0257\u0258\u0005k\u0000\u0000\u0258"+ + "5\u0001\u0000\u0000\u0000\u0259\u025a\u0007\u0004\u0000\u0000\u025a\u025b"+ + "\u0005j\u0000\u0000\u025b\u025c\u0003\u00b4Z\u0000\u025c\u025d\u0005k"+ + "\u0000\u0000\u025d7\u0001\u0000\u0000\u0000\u025e\u0263\u0005\u0011\u0000"+ + "\u0000\u025f\u0260\u0005n\u0000\u0000\u0260\u0261\u0003:\u001d\u0000\u0261"+ + "\u0262\u0005o\u0000\u0000\u0262\u0264\u0001\u0000\u0000\u0000\u0263\u025f"+ + "\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000\u0000\u0264\u0265"+ + "\u0001\u0000\u0000\u0000\u0265\u0266\u0005j\u0000\u0000\u0266\u0267\u0003"+ + "\u00b4Z\u0000\u0267\u0268\u0005k\u0000\u0000\u02689\u0001\u0000\u0000"+ + "\u0000\u0269\u026c\u0003<\u001e\u0000\u026a\u026c\u0005\u0013\u0000\u0000"+ + "\u026b\u0269\u0001\u0000\u0000\u0000\u026b\u026a\u0001\u0000\u0000\u0000"+ + "\u026c;\u0001\u0000\u0000\u0000\u026d\u026e\u0005i\u0000\u0000\u026e="+ + "\u0001\u0000\u0000\u0000\u026f\u0270\u0005\u0012\u0000\u0000\u0270\u0271"+ + "\u0005j\u0000\u0000\u0271\u0272\u0003\u00b4Z\u0000\u0272\u0273\u0005k"+ + "\u0000\u0000\u0273?\u0001\u0000\u0000\u0000\u0274\u0275\u0005;\u0000\u0000"+ + "\u0275\u0276\u0005j\u0000\u0000\u0276\u0277\u0003\u00b4Z\u0000\u0277\u0278"+ + "\u0005k\u0000\u0000\u0278A\u0001\u0000\u0000\u0000\u0279\u027a\u0005:"+ + "\u0000\u0000\u027a\u027b\u0005j\u0000\u0000\u027b\u027c\u0003\u00b4Z\u0000"+ + "\u027c\u027d\u0005k\u0000\u0000\u027dC\u0001\u0000\u0000\u0000\u027e\u027f"+ + "\u0005\u0016\u0000\u0000\u027f\u0280\u0005j\u0000\u0000\u0280\u0283\u0003"+ + "\u00b4Z\u0000\u0281\u0282\u0005q\u0000\u0000\u0282\u0284\u0003\u00b4Z"+ + "\u0000\u0283\u0281\u0001\u0000\u0000\u0000\u0283\u0284\u0001\u0000\u0000"+ + "\u0000\u0284\u0285\u0001\u0000\u0000\u0000\u0285\u0286\u0005k\u0000\u0000"+ + "\u0286E\u0001\u0000\u0000\u0000\u0287\u0288\u0007\u0004\u0000\u0000\u0288"+ + "\u0289\u0005n\u0000\u0000\u0289\u028a\u0003\u00b4Z\u0000\u028a\u028b\u0005"+ + ">\u0000\u0000\u028b\u028c\u0003\u00b4Z\u0000\u028c\u028d\u0005o\u0000"+ + "\u0000\u028dG\u0001\u0000\u0000\u0000\u028e\u028f\u00057\u0000\u0000\u028f"+ + "\u0290\u0003\u00b4Z\u0000\u0290\u0296\u0005l\u0000\u0000\u0291\u0292\u0003"+ + "J%\u0000\u0292\u0293\u0003\u017e\u00bf\u0000\u0293\u0295\u0001\u0000\u0000"+ + "\u0000\u0294\u0291\u0001\u0000\u0000\u0000\u0295\u0298\u0001\u0000\u0000"+ + "\u0000\u0296\u0294\u0001\u0000\u0000\u0000\u0296\u0297\u0001\u0000\u0000"+ + "\u0000\u0297\u0299\u0001\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000"+ + "\u0000\u0299\u029a\u0005m\u0000\u0000\u029aI\u0001\u0000\u0000\u0000\u029b"+ + "\u029c\u0003z=\u0000\u029c\u029d\u0005s\u0000\u0000\u029d\u029e\u0003"+ + "\u00b4Z\u0000\u029eK\u0001\u0000\u0000\u0000\u029f\u02a0\u0005n\u0000"+ + "\u0000\u02a0\u02a5\u0003N\'\u0000\u02a1\u02a2\u0005q\u0000\u0000\u02a2"+ + "\u02a4\u0003N\'\u0000\u02a3\u02a1\u0001\u0000\u0000\u0000\u02a4\u02a7"+ + "\u0001\u0000\u0000\u0000\u02a5\u02a3\u0001\u0000\u0000\u0000\u02a5\u02a6"+ + "\u0001\u0000\u0000\u0000\u02a6\u02a8\u0001\u0000\u0000\u0000\u02a7\u02a5"+ + "\u0001\u0000\u0000\u0000\u02a8\u02a9\u0005o\u0000\u0000\u02a9M\u0001\u0000"+ + "\u0000\u0000\u02aa\u02ab\u0003\u00b4Z\u0000\u02ab\u02ac\u0005p\u0000\u0000"+ + "\u02ac\u02ad\u0003\u00b4Z\u0000\u02adO\u0001\u0000\u0000\u0000\u02ae\u02b4"+ + "\u0003b1\u0000\u02af\u02b4\u0003\\.\u0000\u02b0\u02b4\u0003^/\u0000\u02b1"+ + "\u02b4\u0003R)\u0000\u02b2\u02b4\u0003V+\u0000\u02b3\u02ae\u0001\u0000"+ + "\u0000\u0000\u02b3\u02af\u0001\u0000\u0000\u0000\u02b3\u02b0\u0001\u0000"+ + "\u0000\u0000\u02b3\u02b1\u0001\u0000\u0000\u0000\u02b3\u02b2\u0001\u0000"+ + "\u0000\u0000\u02b4Q\u0001\u0000\u0000\u0000\u02b5\u02b6\u00054\u0000\u0000"+ + "\u02b6\u02bc\u0005l\u0000\u0000\u02b7\u02b8\u0003T*\u0000\u02b8\u02b9"+ + "\u0003\u017e\u00bf\u0000\u02b9\u02bb\u0001\u0000\u0000\u0000\u02ba\u02b7"+ + "\u0001\u0000\u0000\u0000\u02bb\u02be\u0001\u0000\u0000\u0000\u02bc\u02ba"+ + "\u0001\u0000\u0000\u0000\u02bc\u02bd\u0001\u0000\u0000\u0000\u02bd\u02bf"+ + "\u0001\u0000\u0000\u0000\u02be\u02bc\u0001\u0000\u0000\u0000\u02bf\u02c0"+ + "\u0005m\u0000\u0000\u02c0S\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005Q"+ + "\u0000\u0000\u02c2\u02c3\u0005i\u0000\u0000\u02c3\u02cb\u0003\u014e\u00a7"+ + "\u0000\u02c4\u02c5\u00055\u0000\u0000\u02c5\u02c6\u0005l\u0000\u0000\u02c6"+ + "\u02c7\u0003\u00b4Z\u0000\u02c7\u02c8\u0003\u017e\u00bf\u0000\u02c8\u02c9"+ + "\u0005m\u0000\u0000\u02c9\u02cb\u0001\u0000\u0000\u0000\u02ca\u02c1\u0001"+ + "\u0000\u0000\u0000\u02ca\u02c4\u0001\u0000\u0000\u0000\u02cbU\u0001\u0000"+ + "\u0000\u0000\u02cc\u02cd\u00056\u0000\u0000\u02cd\u02d3\u0005l\u0000\u0000"+ + "\u02ce\u02cf\u0003X,\u0000\u02cf\u02d0\u0003\u017e\u00bf\u0000\u02d0\u02d2"+ + "\u0001\u0000\u0000\u0000\u02d1\u02ce\u0001\u0000\u0000\u0000\u02d2\u02d5"+ + "\u0001\u0000\u0000\u0000\u02d3\u02d1\u0001\u0000\u0000\u0000\u02d3\u02d4"+ + "\u0001\u0000\u0000\u0000\u02d4\u02d6\u0001\u0000\u0000\u0000\u02d5\u02d3"+ + "\u0001\u0000\u0000\u0000\u02d6\u02d7\u0005m\u0000\u0000\u02d7W\u0001\u0000"+ + "\u0000\u0000\u02d8\u02d9\u0005i\u0000\u0000\u02d9\u02df\u0005l\u0000\u0000"+ + "\u02da\u02db\u0003Z-\u0000\u02db\u02dc\u0003\u017e\u00bf\u0000\u02dc\u02de"+ + "\u0001\u0000\u0000\u0000\u02dd\u02da\u0001\u0000\u0000\u0000\u02de\u02e1"+ + "\u0001\u0000\u0000\u0000\u02df\u02dd\u0001\u0000\u0000\u0000\u02df\u02e0"+ + "\u0001\u0000\u0000\u0000\u02e0\u02e2\u0001\u0000\u0000\u0000\u02e1\u02df"+ + "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0005m\u0000\u0000\u02e3Y\u0001\u0000"+ + "\u0000\u0000\u02e4\u02e6\u0003\u00f4z\u0000\u02e5\u02e4\u0001\u0000\u0000"+ + "\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u02e7\u0001\u0000\u0000"+ + "\u0000\u02e7\u02e8\u0003\u00d2i\u0000\u02e8[\u0001\u0000\u0000\u0000\u02e9"+ + "\u02ea\u0005\u001b\u0000\u0000\u02ea\u02eb\u0005n\u0000\u0000\u02eb\u02ec"+ + "\u0005o\u0000\u0000\u02ec\u02ed\u0003\u0142\u00a1\u0000\u02ed]\u0001\u0000"+ + "\u0000\u0000\u02ee\u02ef\u0005-\u0000\u0000\u02ef\u02f0\u0005n\u0000\u0000"+ + "\u02f0\u02f1\u0003\u0142\u00a1\u0000\u02f1\u02f2\u0005o\u0000\u0000\u02f2"+ + "_\u0001\u0000\u0000\u0000\u02f3\u02f5\u0005\u001b\u0000\u0000\u02f4\u02f3"+ + "\u0001\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5\u02f6"+ + "\u0001\u0000\u0000\u0000\u02f6\u02f7\u0003\u00f4z\u0000\u02f7\u02f8\u0003"+ + "\u00d2i\u0000\u02f8\u02fb\u0001\u0000\u0000\u0000\u02f9\u02fb\u0003\u0172"+ + "\u00b9\u0000\u02fa\u02f4\u0001\u0000\u0000\u0000\u02fa\u02f9\u0001\u0000"+ + "\u0000\u0000\u02fb\u02fd\u0001\u0000\u0000\u0000\u02fc\u02fe\u0003\u0170"+ + "\u00b8\u0000\u02fd\u02fc\u0001\u0000\u0000\u0000\u02fd\u02fe\u0001\u0000"+ + "\u0000\u0000\u02fea\u0001\u0000\u0000\u0000\u02ff\u0300\u0007\u0005\u0000"+ + "\u0000\u0300\u0301\u0005n\u0000\u0000\u0301\u0302\u0003\u00d2i\u0000\u0302"+ + "\u0303\u0005o\u0000\u0000\u0303\u030b\u0001\u0000\u0000\u0000\u0304\u0305"+ + "\u0005+\u0000\u0000\u0305\u0306\u0005n\u0000\u0000\u0306\u0307\u0003\u00d2"+ + "i\u0000\u0307\u0308\u0005o\u0000\u0000\u0308\u0309\u0003\u00d2i\u0000"+ + "\u0309\u030b\u0001\u0000\u0000\u0000\u030a\u02ff\u0001\u0000\u0000\u0000"+ + "\u030a\u0304\u0001\u0000\u0000\u0000\u030bc\u0001\u0000\u0000\u0000\u030c"+ + "\u0314\u0003p8\u0000\u030d\u030e\u0005L\u0000\u0000\u030e\u0314\u0006"+ + "2\uffff\uffff\u0000\u030f\u0310\u0005\u000e\u0000\u0000\u0310\u0314\u0006"+ + "2\uffff\uffff\u0000\u0311\u0312\u0005D\u0000\u0000\u0312\u0314\u00062"+ + "\uffff\uffff\u0000\u0313\u030c\u0001\u0000\u0000\u0000\u0313\u030d\u0001"+ + "\u0000\u0000\u0000\u0313\u030f\u0001\u0000\u0000\u0000\u0313\u0311\u0001"+ + "\u0000\u0000\u0000\u0314\u0315\u0001\u0000\u0000\u0000\u0315\u0317\u0003"+ + "\u017e\u00bf\u0000\u0316\u0313\u0001\u0000\u0000\u0000\u0317\u031a\u0001"+ + "\u0000\u0000\u0000\u0318\u0319\u0001\u0000\u0000\u0000\u0318\u0316\u0001"+ + "\u0000\u0000\u0000\u0319\u031d\u0001\u0000\u0000\u0000\u031a\u0318\u0001"+ + "\u0000\u0000\u0000\u031b\u031c\u0005\u000e\u0000\u0000\u031c\u031e\u0006"+ + "2\uffff\uffff\u0000\u031d\u031b\u0001\u0000\u0000\u0000\u031d\u031e\u0001"+ + "\u0000\u0000\u0000\u031e\u0320\u0001\u0000\u0000\u0000\u031f\u0321\u0003"+ + "n7\u0000\u0320\u031f\u0001\u0000\u0000\u0000\u0320\u0321\u0001\u0000\u0000"+ + "\u0000\u0321e\u0001\u0000\u0000\u0000\u0322\u0324\b\u0006\u0000\u0000"+ + "\u0323\u0322\u0001\u0000\u0000\u0000\u0324\u0325\u0001\u0000\u0000\u0000"+ + "\u0325\u0323\u0001\u0000\u0000\u0000\u0325\u0326\u0001\u0000\u0000\u0000"+ + "\u0326g\u0001\u0000\u0000\u0000\u0327\u032c\u0003f3\u0000\u0328\u0329"+ + "\u0005q\u0000\u0000\u0329\u032b\u0003f3\u0000\u032a\u0328\u0001\u0000"+ + "\u0000\u0000\u032b\u032e\u0001\u0000\u0000\u0000\u032c\u032a\u0001\u0000"+ + "\u0000\u0000\u032c\u032d\u0001\u0000\u0000\u0000\u032di\u0001\u0000\u0000"+ + "\u0000\u032e\u032c\u0001\u0000\u0000\u0000\u032f\u0330\u0003f3\u0000\u0330"+ + "\u0332\u0005j\u0000\u0000\u0331\u0333\u0003h4\u0000\u0332\u0331\u0001"+ + "\u0000\u0000\u0000\u0332\u0333\u0001\u0000\u0000\u0000\u0333\u0334\u0001"+ + "\u0000\u0000\u0000\u0334\u0335\u0005k\u0000\u0000\u0335k\u0001\u0000\u0000"+ + "\u0000\u0336\u033b\u0003j5\u0000\u0337\u0338\u0005q\u0000\u0000\u0338"+ + "\u033a\u0003j5\u0000\u0339\u0337\u0001\u0000\u0000\u0000\u033a\u033d\u0001"+ + "\u0000\u0000\u0000\u033b\u0339\u0001\u0000\u0000\u0000\u033b\u033c\u0001"+ + "\u0000\u0000\u0000\u033cm\u0001\u0000\u0000\u0000\u033d\u033b\u0001\u0000"+ + "\u0000\u0000\u033e\u033f\u0005N\u0000\u0000\u033f\u0341\u0005n\u0000\u0000"+ + "\u0340\u0342\u0003l6\u0000\u0341\u0340\u0001\u0000\u0000\u0000\u0341\u0342"+ + "\u0001\u0000\u0000\u0000\u0342\u0343\u0001\u0000\u0000\u0000\u0343\u0344"+ + "\u0005o\u0000\u0000\u0344\u0345\u0003\u017e\u00bf\u0000\u0345o\u0001\u0000"+ + "\u0000\u0000\u0346\u0347\u0005\t\u0000\u0000\u0347\u034f\u0003t:\u0000"+ + "\u0348\u0349\u0005\n\u0000\u0000\u0349\u034f\u0003t:\u0000\u034a\u034b"+ + "\u0005\u000b\u0000\u0000\u034b\u034f\u0003t:\u0000\u034c\u034d\u0005\r"+ + "\u0000\u0000\u034d\u034f\u0003r9\u0000\u034e\u0346\u0001\u0000\u0000\u0000"+ + "\u034e\u0348\u0001\u0000\u0000\u0000\u034e\u034a\u0001\u0000\u0000\u0000"+ + "\u034e\u034c\u0001\u0000\u0000\u0000\u034fq\u0001\u0000\u0000\u0000\u0350"+ + "\u0352\u0003\u00f6{\u0000\u0351\u0350\u0001\u0000\u0000\u0000\u0351\u0352"+ + "\u0001\u0000\u0000\u0000\u0352\u0355\u0001\u0000\u0000\u0000\u0353\u0354"+ + "\u0005`\u0000\u0000\u0354\u0356\u0003\u00b4Z\u0000\u0355\u0353\u0001\u0000"+ + "\u0000\u0000\u0355\u0356\u0001\u0000\u0000\u0000\u0356s\u0001\u0000\u0000"+ + "\u0000\u0357\u035a\u0001\u0000\u0000\u0000\u0358\u035a\u0003\u00b4Z\u0000"+ + "\u0359\u0357\u0001\u0000\u0000\u0000\u0359\u0358\u0001\u0000\u0000\u0000"+ + "\u035au\u0001\u0000\u0000\u0000\u035b\u035c\u00057\u0000\u0000\u035c\u035d"+ + "\u0003\u00b4Z\u0000\u035d\u0361\u0005l\u0000\u0000\u035e\u0360\u0003x"+ + "<\u0000\u035f\u035e\u0001\u0000\u0000\u0000\u0360\u0363\u0001\u0000\u0000"+ + "\u0000\u0361\u035f\u0001\u0000\u0000\u0000\u0361\u0362\u0001\u0000\u0000"+ + "\u0000\u0362\u0364\u0001\u0000\u0000\u0000\u0363\u0361\u0001\u0000\u0000"+ + "\u0000\u0364\u0365\u0005m\u0000\u0000\u0365w\u0001\u0000\u0000\u0000\u0366"+ + "\u0367\u0003z=\u0000\u0367\u0369\u0005s\u0000\u0000\u0368\u036a\u0003"+ + "\u0100\u0080\u0000\u0369\u0368\u0001\u0000\u0000\u0000\u0369\u036a\u0001"+ + "\u0000\u0000\u0000\u036ay\u0001\u0000\u0000\u0000\u036b\u036c\u0005T\u0000"+ + "\u0000\u036c\u036f\u0003|>\u0000\u036d\u036f\u0005P\u0000\u0000\u036e"+ + "\u036b\u0001\u0000\u0000\u0000\u036e\u036d\u0001\u0000\u0000\u0000\u036f"+ + "{\u0001\u0000\u0000\u0000\u0370\u0371\u0005%\u0000\u0000\u0371\u037e\u0005"+ + "i\u0000\u0000\u0372\u0373\u0003\u00dam\u0000\u0373\u0378\u0005l\u0000"+ + "\u0000\u0374\u0376\u0003~?\u0000\u0375\u0377\u0005q\u0000\u0000\u0376"+ + "\u0375\u0001\u0000\u0000\u0000\u0376\u0377\u0001\u0000\u0000\u0000\u0377"+ + "\u0379\u0001\u0000\u0000\u0000\u0378\u0374\u0001\u0000\u0000\u0000\u0378"+ + "\u0379\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000\u037a"+ + "\u037b\u0005m\u0000\u0000\u037b\u037e\u0001\u0000\u0000\u0000\u037c\u037e"+ + "\u0003\u00b4Z\u0000\u037d\u0370\u0001\u0000\u0000\u0000\u037d\u0372\u0001"+ + "\u0000\u0000\u0000\u037d\u037c\u0001\u0000\u0000\u0000\u037e}\u0001\u0000"+ + "\u0000\u0000\u037f\u0384\u0003|>\u0000\u0380\u0381\u0005q\u0000\u0000"+ + "\u0381\u0383\u0003|>\u0000\u0382\u0380\u0001\u0000\u0000\u0000\u0383\u0386"+ + "\u0001\u0000\u0000\u0000\u0384\u0382\u0001\u0000\u0000\u0000\u0384\u0385"+ + "\u0001\u0000\u0000\u0000\u0385\u007f\u0001\u0000\u0000\u0000\u0386\u0384"+ + "\u0001\u0000\u0000\u0000\u0387\u038c\u0005l\u0000\u0000\u0388\u0389\u0005"+ + "<\u0000\u0000\u0389\u038a\u0003\u00f4z\u0000\u038a\u038b\u0003\u017e\u00bf"+ + "\u0000\u038b\u038d\u0001\u0000\u0000\u0000\u038c\u0388\u0001\u0000\u0000"+ + "\u0000\u038c\u038d\u0001\u0000\u0000\u0000\u038d\u038f\u0001\u0000\u0000"+ + "\u0000\u038e\u0390\u0003\u0100\u0080\u0000\u038f\u038e\u0001\u0000\u0000"+ + "\u0000\u038f\u0390\u0001\u0000\u0000\u0000\u0390\u0391\u0001\u0000\u0000"+ + "\u0000\u0391\u0392\u0005m\u0000\u0000\u0392\u0081\u0001\u0000\u0000\u0000"+ + "\u0393\u0396\u0003\u0160\u00b0\u0000\u0394\u0396\u0005i\u0000\u0000\u0395"+ + "\u0393\u0001\u0000\u0000\u0000\u0395\u0394\u0001\u0000\u0000\u0000\u0396"+ + "\u039f\u0001\u0000\u0000\u0000\u0397\u039c\u0005l\u0000\u0000\u0398\u039a"+ + "\u0003\u0084B\u0000\u0399\u039b\u0005q\u0000\u0000\u039a\u0399\u0001\u0000"+ + "\u0000\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u039d\u0001\u0000"+ + "\u0000\u0000\u039c\u0398\u0001\u0000\u0000\u0000\u039c\u039d\u0001\u0000"+ + "\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u03a0\u0005m\u0000"+ + "\u0000\u039f\u0397\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000"+ + "\u0000\u03a0\u0083\u0001\u0000\u0000\u0000\u03a1\u03a6\u0003\u0086C\u0000"+ + "\u03a2\u03a3\u0005q\u0000\u0000\u03a3\u03a5\u0003\u0086C\u0000\u03a4\u03a2"+ + "\u0001\u0000\u0000\u0000\u03a5\u03a8\u0001\u0000\u0000\u0000\u03a6\u03a4"+ + "\u0001\u0000\u0000\u0000\u03a6\u03a7\u0001\u0000\u0000\u0000\u03a7\u0085"+ + "\u0001\u0000\u0000\u0000\u03a8\u03a6\u0001\u0000\u0000\u0000\u03a9\u03aa"+ + "\u0005i\u0000\u0000\u03aa\u03ac\u0005s\u0000\u0000\u03ab\u03a9\u0001\u0000"+ + "\u0000\u0000\u03ab\u03ac\u0001\u0000\u0000\u0000\u03ac\u03ad\u0001\u0000"+ + "\u0000\u0000\u03ad\u03ae\u0003\u00b4Z\u0000\u03ae\u0087\u0001\u0000\u0000"+ + "\u0000\u03af\u03b0\u0005H\u0000\u0000\u03b0\u03b1\u0003\u00b4Z\u0000\u03b1"+ + "\u03b2\u0005\u000f\u0000\u0000\u03b2\u03b3\u0003\u0082A\u0000\u03b3\u03b4"+ + "\u0003\u00fe\u007f\u0000\u03b4\u0089\u0001\u0000\u0000\u0000\u03b5\u03b6"+ + "\u0003\u00d2i\u0000\u03b6\u03b7\u0005\u000f\u0000\u0000\u03b7\u03ca\u0003"+ + "\u00d2i\u0000\u03b8\u03be\u0005l\u0000\u0000\u03b9\u03ba\u0003\u0092I"+ + "\u0000\u03ba\u03bb\u0003\u017e\u00bf\u0000\u03bb\u03bd\u0001\u0000\u0000"+ + "\u0000\u03bc\u03b9\u0001\u0000\u0000\u0000\u03bd\u03c0\u0001\u0000\u0000"+ + "\u0000\u03be\u03bc\u0001\u0000\u0000\u0000\u03be\u03bf\u0001\u0000\u0000"+ + "\u0000\u03bf\u03c6\u0001\u0000\u0000\u0000\u03c0\u03be\u0001\u0000\u0000"+ + "\u0000\u03c1\u03c2\u0003\u008cF\u0000\u03c2\u03c3\u0003\u017e\u00bf\u0000"+ + "\u03c3\u03c5\u0001\u0000\u0000\u0000\u03c4\u03c1\u0001\u0000\u0000\u0000"+ + "\u03c5\u03c8\u0001\u0000\u0000\u0000\u03c6\u03c4\u0001\u0000\u0000\u0000"+ + "\u03c6\u03c7\u0001\u0000\u0000\u0000\u03c7\u03c9\u0001\u0000\u0000\u0000"+ + "\u03c8\u03c6\u0001\u0000\u0000\u0000\u03c9\u03cb\u0005m\u0000\u0000\u03ca"+ + "\u03b8\u0001\u0000\u0000\u0000\u03ca\u03cb\u0001\u0000\u0000\u0000\u03cb"+ + "\u008b\u0001\u0000\u0000\u0000\u03cc\u03ce\u0005\u000e\u0000\u0000\u03cd"+ + "\u03cc\u0001\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce"+ + "\u03cf\u0001\u0000\u0000\u0000\u03cf\u03d0\u0003\u008eG\u0000\u03d0\u03d1"+ + "\u0005i\u0000\u0000\u03d1\u03d3\u0003\u014e\u00a7\u0000\u03d2\u03d4\u0003"+ + "\u00fe\u007f\u0000\u03d3\u03d2\u0001\u0000\u0000\u0000\u03d3\u03d4\u0001"+ + "\u0000\u0000\u0000\u03d4\u008d\u0001\u0000\u0000\u0000\u03d5\u03d7\u0005"+ + "j\u0000\u0000\u03d6\u03d8\u0005i\u0000\u0000\u03d7\u03d6\u0001\u0000\u0000"+ + "\u0000\u03d7\u03d8\u0001\u0000\u0000\u0000\u03d8\u03da\u0001\u0000\u0000"+ + "\u0000\u03d9\u03db\u0005\u008b\u0000\u0000\u03da\u03d9\u0001\u0000\u0000"+ + "\u0000\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u03dc\u0001\u0000\u0000"+ + "\u0000\u03dc\u03dd\u0003\u013c\u009e\u0000\u03dd\u03de\u0005k\u0000\u0000"+ + "\u03de\u008f\u0001\u0000\u0000\u0000\u03df\u03e5\u0003\u00c4b\u0000\u03e0"+ + "\u03e1\u0003\u00d2i\u0000\u03e1\u03e2\u0005t\u0000\u0000\u03e2\u03e3\u0005"+ + "i\u0000\u0000\u03e3\u03e5\u0001\u0000\u0000\u0000\u03e4\u03df\u0001\u0000"+ + "\u0000\u0000\u03e4\u03e0\u0001\u0000\u0000\u0000\u03e5\u0091\u0001\u0000"+ + "\u0000\u0000\u03e6\u03e7\u00059\u0000\u0000\u03e7\u03e8\u0005i\u0000\u0000"+ + "\u03e8\u03eb\u0005w\u0000\u0000\u03e9\u03ec\u0003\u0090H\u0000\u03ea\u03ec"+ + "\u0003\u015e\u00af\u0000\u03eb\u03e9\u0001\u0000\u0000\u0000\u03eb\u03ea"+ + "\u0001\u0000\u0000\u0000\u03ec\u0093\u0001\u0000\u0000\u0000\u03ed\u03ee"+ + "\u00050\u0000\u0000\u03ee\u03ef\u0005j\u0000\u0000\u03ef\u03f2\u0003\u00d2"+ + "i\u0000\u03f0\u03f1\u0005q\u0000\u0000\u03f1\u03f3\u0003\u00f6{\u0000"+ + "\u03f2\u03f0\u0001\u0000\u0000\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000"+ + "\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0005k\u0000\u0000\u03f5"+ + "\u0095\u0001\u0000\u0000\u0000\u03f6\u03f7\u0005/\u0000\u0000\u03f7\u03f8"+ + "\u0005j\u0000\u0000\u03f8\u03f9\u0003\u00d2i\u0000\u03f9\u03fa\u0005k"+ + "\u0000\u0000\u03fa\u0097\u0001\u0000\u0000\u0000\u03fb\u03fe\u0003d2\u0000"+ + "\u03fc\u03ff\u0003\u009aM\u0000\u03fd\u03ff\u0003\u009cN\u0000\u03fe\u03fc"+ + "\u0001\u0000\u0000\u0000\u03fe\u03fd\u0001\u0000\u0000\u0000\u03ff\u0099"+ + "\u0001\u0000\u0000\u0000\u0400\u0401\u0005Q\u0000\u0000\u0401\u0402\u0005"+ + "i\u0000\u0000\u0402\u0404\u0003\u014e\u00a7\u0000\u0403\u0405\u0003\u0080"+ + "@\u0000\u0404\u0403\u0001\u0000\u0000\u0000\u0404\u0405\u0001\u0000\u0000"+ + "\u0000\u0405\u009b\u0001\u0000\u0000\u0000\u0406\u0407\u0005Q\u0000\u0000"+ + "\u0407\u0408\u0003\u00aaU\u0000\u0408\u0409\u0005i\u0000\u0000\u0409\u040b"+ + "\u0003\u014e\u00a7\u0000\u040a\u040c\u0003\u0080@\u0000\u040b\u040a\u0001"+ + "\u0000\u0000\u0000\u040b\u040c\u0001\u0000\u0000\u0000\u040c\u009d\u0001"+ + "\u0000\u0000\u0000\u040d\u0410\u0005\u001b\u0000\u0000\u040e\u0411\u0003"+ + "\u0098L\u0000\u040f\u0411\u0003\u00eew\u0000\u0410\u040e\u0001\u0000\u0000"+ + "\u0000\u0410\u040f\u0001\u0000\u0000\u0000\u0411\u009f\u0001\u0000\u0000"+ + "\u0000\u0412\u0413\u00059\u0000\u0000\u0413\u0414\u0005i\u0000\u0000\u0414"+ + "\u0416\u0003\u0152\u00a9\u0000\u0415\u0417\u0003\u00a2Q\u0000\u0416\u0415"+ + "\u0001\u0000\u0000\u0000\u0416\u0417\u0001\u0000\u0000\u0000\u0417\u00a1"+ + "\u0001\u0000\u0000\u0000\u0418\u0419\u0005l\u0000\u0000\u0419\u041a\u0003"+ + "\u00b4Z\u0000\u041a\u041b\u0003\u017e\u00bf\u0000\u041b\u041c\u0005m\u0000"+ + "\u0000\u041c\u00a3\u0001\u0000\u0000\u0000\u041d\u041e\u00059\u0000\u0000"+ + "\u041e\u041f\u0003\u00aaU\u0000\u041f\u0420\u0005i\u0000\u0000\u0420\u0422"+ + "\u0003\u0152\u00a9\u0000\u0421\u0423\u0003\u00a2Q\u0000\u0422\u0421\u0001"+ + "\u0000\u0000\u0000\u0422\u0423\u0001\u0000\u0000\u0000\u0423\u00a5\u0001"+ + "\u0000\u0000\u0000\u0424\u042c\u0003\u0006\u0003\u0000\u0425\u0428\u0003"+ + "\u00d2i\u0000\u0426\u0427\u0005p\u0000\u0000\u0427\u0429\u0003\u00f6{"+ + "\u0000\u0428\u0426\u0001\u0000\u0000\u0000\u0428\u0429\u0001\u0000\u0000"+ + "\u0000\u0429\u042d\u0001\u0000\u0000\u0000\u042a\u042b\u0005p\u0000\u0000"+ + "\u042b\u042d\u0003\u00f6{\u0000\u042c\u0425\u0001\u0000\u0000\u0000\u042c"+ + "\u042a\u0001\u0000\u0000\u0000\u042d\u00a7\u0001\u0000\u0000\u0000\u042e"+ + "\u042f\u0003\u0006\u0003\u0000\u042f\u0430\u0005w\u0000\u0000\u0430\u0431"+ + "\u0003\u00f6{\u0000\u0431\u00a9\u0001\u0000\u0000\u0000\u0432\u0434\u0005"+ + "j\u0000\u0000\u0433\u0435\u0003\b\u0004\u0000\u0434\u0433\u0001\u0000"+ + "\u0000\u0000\u0434\u0435\u0001\u0000\u0000\u0000\u0435\u0436\u0001\u0000"+ + "\u0000\u0000\u0436\u0438\u0003\u00d2i\u0000\u0437\u0439\u0005q\u0000\u0000"+ + "\u0438\u0437\u0001\u0000\u0000\u0000\u0438\u0439\u0001\u0000\u0000\u0000"+ + "\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0005k\u0000\u0000\u043b"+ + "\u00ab\u0001\u0000\u0000\u0000\u043c\u043f\u0003\u00aeW\u0000\u043d\u043f"+ + "\u0003\u00b0X\u0000\u043e\u043c\u0001\u0000\u0000\u0000\u043e\u043d\u0001"+ + "\u0000\u0000\u0000\u043f\u00ad\u0001\u0000\u0000\u0000\u0440\u0442\u0003"+ + "\u00f4z\u0000\u0441\u0440\u0001\u0000\u0000\u0000\u0441\u0442\u0001\u0000"+ + "\u0000\u0000\u0442\u0443\u0001\u0000\u0000\u0000\u0443\u0444\u0003\u00b2"+ + "Y\u0000\u0444\u00af\u0001\u0000\u0000\u0000\u0445\u0447\u0005\u001b\u0000"+ + "\u0000\u0446\u0448\u0003\u00f4z\u0000\u0447\u0446\u0001\u0000\u0000\u0000"+ + "\u0447\u0448\u0001\u0000\u0000\u0000\u0448\u0449\u0001\u0000\u0000\u0000"+ + "\u0449\u044a\u0003\u00b2Y\u0000\u044a\u00b1\u0001\u0000\u0000\u0000\u044b"+ + "\u044d\u0005x\u0000\u0000\u044c\u044b\u0001\u0000\u0000\u0000\u044c\u044d"+ + "\u0001\u0000\u0000\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f"+ + "\u0003\u00d2i\u0000\u044f\u00b3\u0001\u0000\u0000\u0000\u0450\u0451\u0006"+ + "Z\uffff\uffff\u0000\u0451\u0452\u0007\u0007\u0000\u0000\u0452\u0466\u0003"+ + "\u00b4Z\u000f\u0453\u0466\u0003\u00c4b\u0000\u0454\u0455\u0005\u0019\u0000"+ + "\u0000\u0455\u0456\u0003.\u0017\u0000\u0456\u0457\u0005\u001c\u0000\u0000"+ + "\u0457\u0458\u0003\u00b4Z\u0003\u0458\u0466\u0001\u0000\u0000\u0000\u0459"+ + "\u045a\u0005\u001a\u0000\u0000\u045a\u045b\u0003\u00a8T\u0000\u045b\u045c"+ + "\u0005\u001c\u0000\u0000\u045c\u045d\u0003\u00b4Z\u0002\u045d\u0466\u0001"+ + "\u0000\u0000\u0000\u045e\u045f\u0007\b\u0000\u0000\u045f\u0460\u0003&"+ + "\u0013\u0000\u0460\u0461\u0005s\u0000\u0000\u0461\u0462\u0005s\u0000\u0000"+ + "\u0462\u0463\u0003*\u0015\u0000\u0463\u0464\u0003\u00b4Z\u0001\u0464\u0466"+ + "\u0001\u0000\u0000\u0000\u0465\u0450\u0001\u0000\u0000\u0000\u0465\u0453"+ + "\u0001\u0000\u0000\u0000\u0465\u0454\u0001\u0000\u0000\u0000\u0465\u0459"+ + "\u0001\u0000\u0000\u0000\u0465\u045e\u0001\u0000\u0000\u0000\u0466\u048a"+ + "\u0001\u0000\u0000\u0000\u0467\u0468\n\r\u0000\u0000\u0468\u0469\u0007"+ + "\t\u0000\u0000\u0469\u0489\u0003\u00b4Z\u000e\u046a\u046b\n\f\u0000\u0000"+ + "\u046b\u046c\u0007\n\u0000\u0000\u046c\u0489\u0003\u00b4Z\r\u046d\u046e"+ + "\n\u000b\u0000\u0000\u046e\u046f\u0007\u000b\u0000\u0000\u046f\u0489\u0003"+ + "\u00b4Z\f\u0470\u0471\n\n\u0000\u0000\u0471\u0472\u0007\f\u0000\u0000"+ + "\u0472\u0489\u0003\u00b4Z\u000b\u0473\u0474\n\t\u0000\u0000\u0474\u0475"+ + "\u0007\r\u0000\u0000\u0475\u0489\u0003\u00b4Z\n\u0476\u0477\n\u0007\u0000"+ + "\u0000\u0477\u0478\u0005z\u0000\u0000\u0478\u0489\u0003\u00b4Z\b\u0479"+ + "\u047a\n\u0006\u0000\u0000\u047a\u047b\u0005y\u0000\u0000\u047b\u0489"+ + "\u0003\u00b4Z\u0007\u047c\u047d\n\u0005\u0000\u0000\u047d\u047e\u0005"+ + "\"\u0000\u0000\u047e\u0489\u0003\u00b4Z\u0005\u047f\u0480\n\u0004\u0000"+ + "\u0000\u0480\u0481\u0005%\u0000\u0000\u0481\u0482\u0003\u00b4Z\u0000\u0482"+ + "\u0483\u0005s\u0000\u0000\u0483\u0484\u0003\u00b4Z\u0004\u0484\u0489\u0001"+ + "\u0000\u0000\u0000\u0485\u0486\n\b\u0000\u0000\u0486\u0487\u0005\u000f"+ + "\u0000\u0000\u0487\u0489\u0003\u0082A\u0000\u0488\u0467\u0001\u0000\u0000"+ + "\u0000\u0488\u046a\u0001\u0000\u0000\u0000\u0488\u046d\u0001\u0000\u0000"+ + "\u0000\u0488\u0470\u0001\u0000\u0000\u0000\u0488\u0473\u0001\u0000\u0000"+ + "\u0000\u0488\u0476\u0001\u0000\u0000\u0000\u0488\u0479\u0001\u0000\u0000"+ + "\u0000\u0488\u047c\u0001\u0000\u0000\u0000\u0488\u047f\u0001\u0000\u0000"+ + "\u0000\u0488\u0485\u0001\u0000\u0000\u0000\u0489\u048c\u0001\u0000\u0000"+ + "\u0000\u048a\u0488\u0001\u0000\u0000\u0000\u048a\u048b\u0001\u0000\u0000"+ + "\u0000\u048b\u00b5\u0001\u0000\u0000\u0000\u048c\u048a\u0001\u0000\u0000"+ + "\u0000\u048d\u04a2\u0003\u0018\f\u0000\u048e\u04a2\u0003\u001a\r\u0000"+ + "\u048f\u04a2\u0003\u00ba]\u0000\u0490\u04a2\u0003\u00b8\\\u0000\u0491"+ + "\u04a2\u0003\u00eew\u0000\u0492\u04a2\u0003\u010e\u0087\u0000\u0493\u04a2"+ + "\u0003\u0102\u0081\u0000\u0494\u04a2\u0003\u013a\u009d\u0000\u0495\u04a2"+ + "\u0003\u0110\u0088\u0000\u0496\u04a2\u0003\u0112\u0089\u0000\u0497\u04a2"+ + "\u0003\u0114\u008a\u0000\u0498\u04a2\u0003\u0116\u008b\u0000\u0499\u04a2"+ + "\u0003\u0118\u008c\u0000\u049a\u04a2\u0003\u00fe\u007f\u0000\u049b\u04a2"+ + "\u0003\u011a\u008d\u0000\u049c\u04a2\u0003\u011c\u008e\u0000\u049d\u04a2"+ + "\u0003\u012e\u0097\u0000\u049e\u04a2\u0003\u00bc^\u0000\u049f\u04a2\u0003"+ + "\u00c0`\u0000\u04a0\u04a2\u0003\u0088D\u0000\u04a1\u048d\u0001\u0000\u0000"+ + "\u0000\u04a1\u048e\u0001\u0000\u0000\u0000\u04a1\u048f\u0001\u0000\u0000"+ + "\u0000\u04a1\u0490\u0001\u0000\u0000\u0000\u04a1\u0491\u0001\u0000\u0000"+ + "\u0000\u04a1\u0492\u0001\u0000\u0000\u0000\u04a1\u0493\u0001\u0000\u0000"+ + "\u0000\u04a1\u0494\u0001\u0000\u0000\u0000\u04a1\u0495\u0001\u0000\u0000"+ + "\u0000\u04a1\u0496\u0001\u0000\u0000\u0000\u04a1\u0497\u0001\u0000\u0000"+ + "\u0000\u04a1\u0498\u0001\u0000\u0000\u0000\u04a1\u0499\u0001\u0000\u0000"+ + "\u0000\u04a1\u049a\u0001\u0000\u0000\u0000\u04a1\u049b\u0001\u0000\u0000"+ + "\u0000\u04a1\u049c\u0001\u0000\u0000\u0000\u04a1\u049d\u0001\u0000\u0000"+ + "\u0000\u04a1\u049e\u0001\u0000\u0000\u0000\u04a1\u049f\u0001\u0000\u0000"+ + "\u0000\u04a1\u04a0\u0001\u0000\u0000\u0000\u04a2\u00b7\u0001\u0000\u0000"+ + "\u0000\u04a3\u04a4\u0005$\u0000\u0000\u04a4\u04a5\u0003\u00b4Z\u0000\u04a5"+ + "\u00b9\u0001\u0000\u0000\u0000\u04a6\u04a7\u0005\\\u0000\u0000\u04a7\u04a9"+ + "\u0003\u00b4Z\u0000\u04a8\u04aa\u0003\u00fe\u007f\u0000\u04a9\u04a8\u0001"+ + "\u0000\u0000\u0000\u04a9\u04aa\u0001\u0000\u0000\u0000\u04aa\u00bb\u0001"+ + "\u0000\u0000\u0000\u04ab\u04ac\u0003\u00be_\u0000\u04ac\u04ad\u0003\u0136"+ + "\u009b\u0000\u04ad\u00bd\u0001\u0000\u0000\u0000\u04ae\u04af\u0005\f\u0000"+ + "\u0000\u04af\u04b0\u0003\u00b4Z\u0000\u04b0\u04b1\u0003\u017e\u00bf\u0000"+ + "\u04b1\u04b3\u0001\u0000\u0000\u0000\u04b2\u04ae\u0001\u0000\u0000\u0000"+ + "\u04b3\u04b6\u0001\u0000\u0000\u0000\u04b4\u04b2\u0001\u0000\u0000\u0000"+ + "\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04bb\u0001\u0000\u0000\u0000"+ + "\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b7\u04b8\u0005\r\u0000\u0000\u04b8"+ + "\u04b9\u0003r9\u0000\u04b9\u04ba\u0003\u017e\u00bf\u0000\u04ba\u04bc\u0001"+ + "\u0000\u0000\u0000\u04bb\u04b7\u0001\u0000\u0000\u0000\u04bb\u04bc\u0001"+ + "\u0000\u0000\u0000\u04bc\u00bf\u0001\u0000\u0000\u0000\u04bd\u04be\u0005"+ + "U\u0000\u0000\u04be\u04c3\u0003\u00b4Z\u0000\u04bf\u04c0\u0005U\u0000"+ + "\u0000\u04c0\u04c1\u0007\u0001\u0000\u0000\u04c1\u04c3\u0003.\u0017\u0000"+ + "\u04c2\u04bd\u0001\u0000\u0000\u0000\u04c2\u04bf\u0001\u0000\u0000\u0000"+ + "\u04c3\u00c1\u0001\u0000\u0000\u0000\u04c4\u04cd\u0005\u0003\u0000\u0000"+ + "\u04c5\u04cd\u0005\u0004\u0000\u0000\u04c6\u04cd\u0005h\u0000\u0000\u04c7"+ + "\u04cd\u0003\u015c\u00ae\u0000\u04c8\u04cd\u0003\u0170\u00b8\u0000\u04c9"+ + "\u04cd\u0005\u0001\u0000\u0000\u04ca\u04cd\u0005\u0093\u0000\u0000\u04cb"+ + "\u04cd\u0005\u0094\u0000\u0000\u04cc\u04c4\u0001\u0000\u0000\u0000\u04cc"+ + "\u04c5\u0001\u0000\u0000\u0000\u04cc\u04c6\u0001\u0000\u0000\u0000\u04cc"+ + "\u04c7\u0001\u0000\u0000\u0000\u04cc\u04c8\u0001\u0000\u0000\u0000\u04cc"+ + "\u04c9\u0001\u0000\u0000\u0000\u04cc\u04ca\u0001\u0000\u0000\u0000\u04cc"+ + "\u04cb\u0001\u0000\u0000\u0000\u04cd\u00c3\u0001\u0000\u0000\u0000\u04ce"+ + "\u04cf\u0006b\uffff\uffff\u0000\u04cf\u04df\u0003\u0158\u00ac\u0000\u04d0"+ + "\u04df\u0003\u0154\u00aa\u0000\u04d1\u04df\u0003\u017a\u00bd\u0000\u04d2"+ + "\u04df\u0003 \u0010\u0000\u04d3\u04df\u0003\u0096K\u0000\u04d4\u04df\u0003"+ + "\u0094J\u0000\u04d5\u04d6\u0005M\u0000\u0000\u04d6\u04d7\u0003\u00c4b"+ + "\u0000\u04d7\u04d8\u0003\u0178\u00bc\u0000\u04d8\u04df\u0001\u0000\u0000"+ + "\u0000\u04d9\u04da\u0007\u000e\u0000\u0000\u04da\u04db\u0005j\u0000\u0000"+ + "\u04db\u04dc\u0003\u00b4Z\u0000\u04dc\u04dd\u0005k\u0000\u0000\u04dd\u04df"+ + "\u0001\u0000\u0000\u0000\u04de\u04ce\u0001\u0000\u0000\u0000\u04de\u04d0"+ + "\u0001\u0000\u0000\u0000\u04de\u04d1\u0001\u0000\u0000\u0000\u04de\u04d2"+ + "\u0001\u0000\u0000\u0000\u04de\u04d3\u0001\u0000\u0000\u0000\u04de\u04d4"+ + "\u0001\u0000\u0000\u0000\u04de\u04d5\u0001\u0000\u0000\u0000\u04de\u04d9"+ + "\u0001\u0000\u0000\u0000\u04df\u04f6\u0001\u0000\u0000\u0000\u04e0\u04e1"+ + "\n\n\u0000\u0000\u04e1\u04e2\u0005t\u0000\u0000\u04e2\u04f5\u0005i\u0000"+ + "\u0000\u04e3\u04e4\n\t\u0000\u0000\u04e4\u04f5\u0003\u0174\u00ba\u0000"+ + "\u04e5\u04e6\n\b\u0000\u0000\u04e6\u04f5\u0003\u00deo\u0000\u04e7\u04e8"+ + "\n\u0007\u0000\u0000\u04e8\u04f5\u0003L&\u0000\u04e9\u04ea\n\u0006\u0000"+ + "\u0000\u04ea\u04f5\u0003\u0176\u00bb\u0000\u04eb\u04ec\n\u0005\u0000\u0000"+ + "\u04ec\u04f5\u0003\u0178\u00bc\u0000\u04ed\u04ee\n\u0003\u0000\u0000\u04ee"+ + "\u04ef\u0003\u0178\u00bc\u0000\u04ef\u04f0\u0005\u0010\u0000\u0000\u04f0"+ + "\u04f1\u0003\u0082A\u0000\u04f1\u04f5\u0001\u0000\u0000\u0000\u04f2\u04f3"+ + "\n\u0002\u0000\u0000\u04f3\u04f5\u0003\u00cae\u0000\u04f4\u04e0\u0001"+ + "\u0000\u0000\u0000\u04f4\u04e3\u0001\u0000\u0000\u0000\u04f4\u04e5\u0001"+ + "\u0000\u0000\u0000\u04f4\u04e7\u0001\u0000\u0000\u0000\u04f4\u04e9\u0001"+ + "\u0000\u0000\u0000\u04f4\u04eb\u0001\u0000\u0000\u0000\u04f4\u04ed\u0001"+ + "\u0000\u0000\u0000\u04f4\u04f2\u0001\u0000\u0000\u0000\u04f5\u04f8\u0001"+ + "\u0000\u0000\u0000\u04f6\u04f4\u0001\u0000\u0000\u0000\u04f6\u04f7\u0001"+ + "\u0000\u0000\u0000\u04f7\u00c5\u0001\u0000\u0000\u0000\u04f8\u04f6\u0001"+ + "\u0000\u0000\u0000\u04f9\u04fa\u0003d2\u0000\u04fa\u04fb\u0003\u00c8d"+ + "\u0000\u04fb\u00c7\u0001\u0000\u0000\u0000\u04fc\u04fe\u0005Q\u0000\u0000"+ + "\u04fd\u04ff\u0005i\u0000\u0000\u04fe\u04fd\u0001\u0000\u0000\u0000\u04fe"+ + "\u04ff\u0001\u0000\u0000\u0000\u04ff\u0500\u0001\u0000\u0000\u0000\u0500"+ + "\u0502\u0003\u014e\u00a7\u0000\u0501\u0503\u0003\u0080@\u0000\u0502\u0501"+ + "\u0001\u0000\u0000\u0000\u0502\u0503\u0001\u0000\u0000\u0000\u0503\u00c9"+ + "\u0001\u0000\u0000\u0000\u0504\u0506\u0005&\u0000\u0000\u0505\u0507\u0003"+ + "\u00f6{\u0000\u0506\u0505\u0001\u0000\u0000\u0000\u0506\u0507\u0001\u0000"+ + "\u0000\u0000\u0507\u0509\u0001\u0000\u0000\u0000\u0508\u050a\u0005q\u0000"+ + "\u0000\u0509\u0508\u0001\u0000\u0000\u0000\u0509\u050a\u0001\u0000\u0000"+ + "\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050c\u0005\'\u0000\u0000"+ + "\u050c\u00cb\u0001\u0000\u0000\u0000\u050d\u050e\u0005R\u0000\u0000\u050e"+ + "\u0518\u0005l\u0000\u0000\u050f\u0513\u0003\u00d0h\u0000\u0510\u0513\u0003"+ + "\u013c\u009e\u0000\u0511\u0513\u0003\u00ceg\u0000\u0512\u050f\u0001\u0000"+ + "\u0000\u0000\u0512\u0510\u0001\u0000\u0000\u0000\u0512\u0511\u0001\u0000"+ + "\u0000\u0000\u0513\u0514\u0001\u0000\u0000\u0000\u0514\u0515\u0003\u017e"+ + "\u00bf\u0000\u0515\u0517\u0001\u0000\u0000\u0000\u0516\u0512\u0001\u0000"+ + "\u0000\u0000\u0517\u051a\u0001\u0000\u0000\u0000\u0518\u0516\u0001\u0000"+ + "\u0000\u0000\u0518\u0519\u0001\u0000\u0000\u0000\u0519\u051b\u0001\u0000"+ + "\u0000\u0000\u051a\u0518\u0001\u0000\u0000\u0000\u051b\u051c\u0005m\u0000"+ + "\u0000\u051c\u00cd\u0001\u0000\u0000\u0000\u051d\u051e\u00059\u0000\u0000"+ + "\u051e\u051f\u0005i\u0000\u0000\u051f\u0520\u0003\u0152\u00a9\u0000\u0520"+ + "\u00cf\u0001\u0000\u0000\u0000\u0521\u0523\u0005\u001b\u0000\u0000\u0522"+ + "\u0521\u0001\u0000\u0000\u0000\u0522\u0523\u0001\u0000\u0000\u0000\u0523"+ + "\u0524\u0001\u0000\u0000\u0000\u0524\u0525\u0003d2\u0000\u0525\u0526\u0005"+ + "i\u0000\u0000\u0526\u0527\u0003\u0152\u00a9\u0000\u0527\u0528\u0003\u0150"+ + "\u00a8\u0000\u0528\u0531\u0001\u0000\u0000\u0000\u0529\u052b\u0005\u001b"+ + "\u0000\u0000\u052a\u0529\u0001\u0000\u0000\u0000\u052a\u052b\u0001\u0000"+ + "\u0000\u0000\u052b\u052c\u0001\u0000\u0000\u0000\u052c\u052d\u0003d2\u0000"+ + "\u052d\u052e\u0005i\u0000\u0000\u052e\u052f\u0003\u0152\u00a9\u0000\u052f"+ + "\u0531\u0001\u0000\u0000\u0000\u0530\u0522\u0001\u0000\u0000\u0000\u0530"+ + "\u052a\u0001\u0000\u0000\u0000\u0531\u00d1\u0001\u0000\u0000\u0000\u0532"+ + "\u053a\u0003\u013c\u009e\u0000\u0533\u053a\u0003\u00d4j\u0000\u0534\u053a"+ + "\u0003P(\u0000\u0535\u0536\u0005j\u0000\u0000\u0536\u0537\u0003\u00d2"+ + "i\u0000\u0537\u0538\u0005k\u0000\u0000\u0538\u053a\u0001\u0000\u0000\u0000"+ + "\u0539\u0532\u0001\u0000\u0000\u0000\u0539\u0533\u0001\u0000\u0000\u0000"+ + "\u0539\u0534\u0001\u0000\u0000\u0000\u0539\u0535\u0001\u0000\u0000\u0000"+ + "\u053a\u00d3\u0001\u0000\u0000\u0000\u053b\u0545\u0003\u013e\u009f\u0000"+ + "\u053c\u0545\u0003\u016e\u00b7\u0000\u053d\u0545\u0003\u0144\u00a2\u0000"+ + "\u053e\u0545\u0003\u014c\u00a6\u0000\u053f\u0545\u0003\u00ccf\u0000\u0540"+ + "\u0545\u0003\u0146\u00a3\u0000\u0541\u0545\u0003\u0148\u00a4\u0000\u0542"+ + "\u0545\u0003\u014a\u00a5\u0000\u0543\u0545\u0003\u00d6k\u0000\u0544\u053b"+ + "\u0001\u0000\u0000\u0000\u0544\u053c\u0001\u0000\u0000\u0000\u0544\u053d"+ + "\u0001\u0000\u0000\u0000\u0544\u053e\u0001\u0000\u0000\u0000\u0544\u053f"+ + "\u0001\u0000\u0000\u0000\u0544\u0540\u0001\u0000\u0000\u0000\u0544\u0541"+ + "\u0001\u0000\u0000\u0000\u0544\u0542\u0001\u0000\u0000\u0000\u0544\u0543"+ + "\u0001\u0000\u0000\u0000\u0545\u00d5\u0001\u0000\u0000\u0000\u0546\u0547"+ + "\u00059\u0000\u0000\u0547\u0548\u0003\u00d8l\u0000\u0548\u00d7\u0001\u0000"+ + "\u0000\u0000\u0549\u0555\u0005j\u0000\u0000\u054a\u054f\u0003\u00d2i\u0000"+ + "\u054b\u054c\u0005q\u0000\u0000\u054c\u054e\u0003\u00d2i\u0000\u054d\u054b"+ + "\u0001\u0000\u0000\u0000\u054e\u0551\u0001\u0000\u0000\u0000\u054f\u054d"+ + "\u0001\u0000\u0000\u0000\u054f\u0550\u0001\u0000\u0000\u0000\u0550\u0553"+ + "\u0001\u0000\u0000\u0000\u0551\u054f\u0001\u0000\u0000\u0000\u0552\u0554"+ + "\u0005q\u0000\u0000\u0553\u0552\u0001\u0000\u0000\u0000\u0553\u0554\u0001"+ + "\u0000\u0000\u0000\u0554\u0556\u0001\u0000\u0000\u0000\u0555\u054a\u0001"+ + "\u0000\u0000\u0000\u0555\u0556\u0001\u0000\u0000\u0000\u0556\u0557\u0001"+ + "\u0000\u0000\u0000\u0557\u0558\u0005k\u0000\u0000\u0558\u00d9\u0001\u0000"+ + "\u0000\u0000\u0559\u0561\u0003\u016e\u00b7\u0000\u055a\u0561\u0003\u013e"+ + "\u009f\u0000\u055b\u0561\u0003\u00dcn\u0000\u055c\u0561\u0003\u0146\u00a3"+ + "\u0000\u055d\u0561\u0003\u0148\u00a4\u0000\u055e\u0561\u0003P(\u0000\u055f"+ + "\u0561\u0003\u013c\u009e\u0000\u0560\u0559\u0001\u0000\u0000\u0000\u0560"+ + "\u055a\u0001\u0000\u0000\u0000\u0560\u055b\u0001\u0000\u0000\u0000\u0560"+ + "\u055c\u0001\u0000\u0000\u0000\u0560\u055d\u0001\u0000\u0000\u0000\u0560"+ + "\u055e\u0001\u0000\u0000\u0000\u0560\u055f\u0001\u0000\u0000\u0000\u0561"+ + "\u00db\u0001\u0000\u0000\u0000\u0562\u0563\u0005n\u0000\u0000\u0563\u0564"+ + "\u0005x\u0000\u0000\u0564\u0565\u0005o\u0000\u0000\u0565\u0566\u0003\u0142"+ + "\u00a1\u0000\u0566\u00dd\u0001\u0000\u0000\u0000\u0567\u0577\u0005n\u0000"+ + "\u0000\u0568\u056a\u0003\u00e0p\u0000\u0569\u0568\u0001\u0000\u0000\u0000"+ + "\u0569\u056a\u0001\u0000\u0000\u0000\u056a\u056b\u0001\u0000\u0000\u0000"+ + "\u056b\u056d\u0005s\u0000\u0000\u056c\u056e\u0003\u00e2q\u0000\u056d\u056c"+ + "\u0001\u0000\u0000\u0000\u056d\u056e\u0001\u0000\u0000\u0000\u056e\u0578"+ + "\u0001\u0000\u0000\u0000\u056f\u0571\u0003\u00e0p\u0000\u0570\u056f\u0001"+ + "\u0000\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u0572\u0001"+ + "\u0000\u0000\u0000\u0572\u0573\u0005s\u0000\u0000\u0573\u0574\u0003\u00e2"+ + "q\u0000\u0574\u0575\u0005s\u0000\u0000\u0575\u0576\u0003\u00e4r\u0000"+ + "\u0576\u0578\u0001\u0000\u0000\u0000\u0577\u0569\u0001\u0000\u0000\u0000"+ + "\u0577\u0570\u0001\u0000\u0000\u0000\u0578\u0579\u0001\u0000\u0000\u0000"+ + "\u0579\u057a\u0005o\u0000\u0000\u057a\u00df\u0001\u0000\u0000\u0000\u057b"+ + "\u057c\u0003\u00b4Z\u0000\u057c\u00e1\u0001\u0000\u0000\u0000\u057d\u057e"+ + "\u0003\u00b4Z\u0000\u057e\u00e3\u0001\u0000\u0000\u0000\u057f\u0580\u0003"+ + "\u00b4Z\u0000\u0580\u00e5\u0001\u0000\u0000\u0000\u0581\u0583\u0007\u000f"+ + "\u0000\u0000\u0582\u0581\u0001\u0000\u0000\u0000\u0582\u0583\u0001\u0000"+ + "\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584\u0585\u0005p\u0000"+ + "\u0000\u0585\u00e7\u0001\u0000\u0000\u0000\u0586\u0587\u0003\u00f6{\u0000"+ + "\u0587\u0588\u0005p\u0000\u0000\u0588\u058d\u0001\u0000\u0000\u0000\u0589"+ + "\u058a\u0003\u0006\u0003\u0000\u058a\u058b\u0005w\u0000\u0000\u058b\u058d"+ + "\u0001\u0000\u0000\u0000\u058c\u0586\u0001\u0000\u0000\u0000\u058c\u0589"+ + "\u0001\u0000\u0000\u0000\u058c\u058d\u0001\u0000\u0000\u0000\u058d\u058e"+ + "\u0001\u0000\u0000\u0000\u058e\u058f\u0005a\u0000\u0000\u058f\u0594\u0003"+ + "\u00b4Z\u0000\u0590\u0592\u0005K\u0000\u0000\u0591\u0593\u0005i\u0000"+ + "\u0000\u0592\u0591\u0001\u0000\u0000\u0000\u0592\u0593\u0001\u0000\u0000"+ + "\u0000\u0593\u0595\u0001\u0000\u0000\u0000\u0594\u0590\u0001\u0000\u0000"+ + "\u0000\u0594\u0595\u0001\u0000\u0000\u0000\u0595\u00e9\u0001\u0000\u0000"+ + "\u0000\u0596\u0597\u0005\\\u0000\u0000\u0597\u0598\u0005i\u0000\u0000"+ + "\u0598\u00eb\u0001\u0000\u0000\u0000\u0599\u059a\u0003\u0170\u00b8\u0000"+ + "\u059a\u00ed\u0001\u0000\u0000\u0000\u059b\u059f\u0003\u00f0x\u0000\u059c"+ + "\u059f\u0003\u00f8|\u0000\u059d\u059f\u0003\u00fc~\u0000\u059e\u059b\u0001"+ + "\u0000\u0000\u0000\u059e\u059c\u0001\u0000\u0000\u0000\u059e\u059d\u0001"+ + "\u0000\u0000\u0000\u059f\u00ef\u0001\u0000\u0000\u0000\u05a0\u05ac\u0005"+ + "^\u0000\u0000\u05a1\u05ad\u0003\u00f2y\u0000\u05a2\u05a8\u0005j\u0000"+ + "\u0000\u05a3\u05a4\u0003\u00f2y\u0000\u05a4\u05a5\u0003\u017e\u00bf\u0000"+ + "\u05a5\u05a7\u0001\u0000\u0000\u0000\u05a6\u05a3\u0001\u0000\u0000\u0000"+ + "\u05a7\u05aa\u0001\u0000\u0000\u0000\u05a8\u05a6\u0001\u0000\u0000\u0000"+ + "\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u05ab\u0001\u0000\u0000\u0000"+ + "\u05aa\u05a8\u0001\u0000\u0000\u0000\u05ab\u05ad\u0005k\u0000\u0000\u05ac"+ + "\u05a1\u0001\u0000\u0000\u0000\u05ac\u05a2\u0001\u0000\u0000\u0000\u05ad"+ + "\u00f1\u0001\u0000\u0000\u0000\u05ae\u05b4\u0003\u00f4z\u0000\u05af\u05b1"+ + "\u0003\u00d2i\u0000\u05b0\u05af\u0001\u0000\u0000\u0000\u05b0\u05b1\u0001"+ + "\u0000\u0000\u0000\u05b1\u05b2\u0001\u0000\u0000\u0000\u05b2\u05b3\u0005"+ + "p\u0000\u0000\u05b3\u05b5\u0003\u00f6{\u0000\u05b4\u05b0\u0001\u0000\u0000"+ + "\u0000\u05b4\u05b5\u0001\u0000\u0000\u0000\u05b5\u00f3\u0001\u0000\u0000"+ + "\u0000\u05b6\u05bb\u0005i\u0000\u0000\u05b7\u05b8\u0005q\u0000\u0000\u05b8"+ + "\u05ba\u0005i\u0000\u0000\u05b9\u05b7\u0001\u0000\u0000\u0000\u05ba\u05bd"+ + "\u0001\u0000\u0000\u0000\u05bb\u05b9\u0001\u0000\u0000\u0000\u05bb\u05bc"+ + "\u0001\u0000\u0000\u0000\u05bc\u00f5\u0001\u0000\u0000\u0000\u05bd\u05bb"+ + "\u0001\u0000\u0000\u0000\u05be\u05c3\u0003\u00b4Z\u0000\u05bf\u05c0\u0005"+ + "q\u0000\u0000\u05c0\u05c2\u0003\u00b4Z\u0000\u05c1\u05bf\u0001\u0000\u0000"+ + "\u0000\u05c2\u05c5\u0001\u0000\u0000\u0000\u05c3\u05c1\u0001\u0000\u0000"+ + "\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000\u05c4\u00f7\u0001\u0000\u0000"+ + "\u0000\u05c5\u05c3\u0001\u0000\u0000\u0000\u05c6\u05d2\u0005b\u0000\u0000"+ + "\u05c7\u05d3\u0003\u00fa}\u0000\u05c8\u05ce\u0005j\u0000\u0000\u05c9\u05ca"+ + "\u0003\u00fa}\u0000\u05ca\u05cb\u0003\u017e\u00bf\u0000\u05cb\u05cd\u0001"+ + "\u0000\u0000\u0000\u05cc\u05c9\u0001\u0000\u0000\u0000\u05cd\u05d0\u0001"+ + "\u0000\u0000\u0000\u05ce\u05cc\u0001\u0000\u0000\u0000\u05ce\u05cf\u0001"+ + "\u0000\u0000\u0000\u05cf\u05d1\u0001\u0000\u0000\u0000\u05d0\u05ce\u0001"+ + "\u0000\u0000\u0000\u05d1\u05d3\u0005k\u0000\u0000\u05d2\u05c7\u0001\u0000"+ + "\u0000\u0000\u05d2\u05c8\u0001\u0000\u0000\u0000\u05d3\u00f9\u0001\u0000"+ + "\u0000\u0000\u05d4\u05d6\u0005i\u0000\u0000\u05d5\u05d7\u0005p\u0000\u0000"+ + "\u05d6\u05d5\u0001\u0000\u0000\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000"+ + "\u05d7\u05d8\u0001\u0000\u0000\u0000\u05d8\u05d9\u0003\u00d2i\u0000\u05d9"+ + "\u00fb\u0001\u0000\u0000\u0000\u05da\u05e6\u0005g\u0000\u0000\u05db\u05e7"+ + "\u0003\u00a6S\u0000\u05dc\u05e2\u0005j\u0000\u0000\u05dd\u05de\u0003\u00a6"+ + "S\u0000\u05de\u05df\u0003\u017e\u00bf\u0000\u05df\u05e1\u0001\u0000\u0000"+ + "\u0000\u05e0\u05dd\u0001\u0000\u0000\u0000\u05e1\u05e4\u0001\u0000\u0000"+ + "\u0000\u05e2\u05e0\u0001\u0000\u0000\u0000\u05e2\u05e3\u0001\u0000\u0000"+ + "\u0000\u05e3\u05e5\u0001\u0000\u0000\u0000\u05e4\u05e2\u0001\u0000\u0000"+ + "\u0000\u05e5\u05e7\u0005k\u0000\u0000\u05e6\u05db\u0001\u0000\u0000\u0000"+ + "\u05e6\u05dc\u0001\u0000\u0000\u0000\u05e7\u00fd\u0001\u0000\u0000\u0000"+ + "\u05e8\u05ea\u0005l\u0000\u0000\u05e9\u05eb\u0003\u0100\u0080\u0000\u05ea"+ + "\u05e9\u0001\u0000\u0000\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb"+ + "\u05ec\u0001\u0000\u0000\u0000\u05ec\u05ed\u0005m\u0000\u0000\u05ed\u00ff"+ + "\u0001\u0000\u0000\u0000\u05ee\u05f0\u0005r\u0000\u0000\u05ef\u05ee\u0001"+ + "\u0000\u0000\u0000\u05ef\u05f0\u0001\u0000\u0000\u0000\u05f0\u05f6\u0001"+ + "\u0000\u0000\u0000\u05f1\u05f3\u0005\u00a3\u0000\u0000\u05f2\u05f1\u0001"+ + "\u0000\u0000\u0000\u05f2\u05f3\u0001\u0000\u0000\u0000\u05f3\u05f6\u0001"+ + "\u0000\u0000\u0000\u05f4\u05f6\u0004\u0080\u0012\u0000\u05f5\u05ef\u0001"+ + "\u0000\u0000\u0000\u05f5\u05f2\u0001\u0000\u0000\u0000\u05f5\u05f4\u0001"+ + "\u0000\u0000\u0000\u05f6\u05f7\u0001\u0000\u0000\u0000\u05f7\u05f8\u0003"+ + "\u00b6[\u0000\u05f8\u05f9\u0003\u017e\u00bf\u0000\u05f9\u05fb\u0001\u0000"+ + "\u0000\u0000\u05fa\u05f5\u0001\u0000\u0000\u0000\u05fb\u05fc\u0001\u0000"+ + "\u0000\u0000\u05fc\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000"+ + "\u0000\u0000\u05fd\u0101\u0001\u0000\u0000\u0000\u05fe\u0604\u0003\u0106"+ + "\u0083\u0000\u05ff\u0604\u0003\u0108\u0084\u0000\u0600\u0604\u0003\u010a"+ + "\u0085\u0000\u0601\u0604\u0003\u0104\u0082\u0000\u0602\u0604\u0003\u00a8"+ + "T\u0000\u0603\u05fe\u0001\u0000\u0000\u0000\u0603\u05ff\u0001\u0000\u0000"+ + "\u0000\u0603\u0600\u0001\u0000\u0000\u0000\u0603\u0601\u0001\u0000\u0000"+ + "\u0000\u0603\u0602\u0001\u0000\u0000\u0000\u0604\u0103\u0001\u0000\u0000"+ + "\u0000\u0605\u0606\u0003\u00b4Z\u0000\u0606\u0105\u0001\u0000\u0000\u0000"+ + "\u0607\u0608\u0003\u00b4Z\u0000\u0608\u0609\u0005\u008d\u0000\u0000\u0609"+ + "\u060a\u0003\u00b4Z\u0000\u060a\u0107\u0001\u0000\u0000\u0000\u060b\u060c"+ + "\u0003\u00b4Z\u0000\u060c\u060d\u0007\u0010\u0000\u0000\u060d\u0109\u0001"+ + "\u0000\u0000\u0000\u060e\u060f\u0003\u00f6{\u0000\u060f\u0610\u0003\u00e6"+ + "s\u0000\u0610\u0611\u0003\u00f6{\u0000\u0611\u010b\u0001\u0000\u0000\u0000"+ + "\u0612\u0613\u0007\u0011\u0000\u0000\u0613\u010d\u0001\u0000\u0000\u0000"+ + "\u0614\u0615\u0005i\u0000\u0000\u0615\u0617\u0005s\u0000\u0000\u0616\u0618"+ + "\u0003\u00b6[\u0000\u0617\u0616\u0001\u0000\u0000\u0000\u0617\u0618\u0001"+ + "\u0000\u0000\u0000\u0618\u010f\u0001\u0000\u0000\u0000\u0619\u061b\u0005"+ + "f\u0000\u0000\u061a\u061c\u0003\u00f6{\u0000\u061b\u061a\u0001\u0000\u0000"+ + "\u0000\u061b\u061c\u0001\u0000\u0000\u0000\u061c\u0111\u0001\u0000\u0000"+ + "\u0000\u061d\u061f\u0005O\u0000\u0000\u061e\u0620\u0005i\u0000\u0000\u061f"+ + "\u061e\u0001\u0000\u0000\u0000\u061f\u0620\u0001\u0000\u0000\u0000\u0620"+ + "\u0113\u0001\u0000\u0000\u0000\u0621\u0623\u0005c\u0000\u0000\u0622\u0624"+ + "\u0005i\u0000\u0000\u0623\u0622\u0001\u0000\u0000\u0000\u0623\u0624\u0001"+ + "\u0000\u0000\u0000\u0624\u0115\u0001\u0000\u0000\u0000\u0625\u0626\u0005"+ + "[\u0000\u0000\u0626\u0627\u0005i\u0000\u0000\u0627\u0117\u0001\u0000\u0000"+ + "\u0000\u0628\u0629\u0005_\u0000\u0000\u0629\u0119\u0001\u0000\u0000\u0000"+ + "\u062a\u0633\u0005`\u0000\u0000\u062b\u0634\u0003\u00b4Z\u0000\u062c\u062d"+ + "\u0003\u017e\u00bf\u0000\u062d\u062e\u0003\u00b4Z\u0000\u062e\u0634\u0001"+ + "\u0000\u0000\u0000\u062f\u0630\u0003\u0102\u0081\u0000\u0630\u0631\u0003"+ + "\u017e\u00bf\u0000\u0631\u0632\u0003\u00b4Z\u0000\u0632\u0634\u0001\u0000"+ + "\u0000\u0000\u0633\u062b\u0001\u0000\u0000\u0000\u0633\u062c\u0001\u0000"+ + "\u0000\u0000\u0633\u062f\u0001\u0000\u0000\u0000\u0634\u0635\u0001\u0000"+ + "\u0000\u0000\u0635\u063b\u0003\u00fe\u007f\u0000\u0636\u0639\u0005Z\u0000"+ + "\u0000\u0637\u063a\u0003\u011a\u008d\u0000\u0638\u063a\u0003\u00fe\u007f"+ + "\u0000\u0639\u0637\u0001\u0000\u0000\u0000\u0639\u0638\u0001\u0000\u0000"+ + "\u0000\u063a\u063c\u0001\u0000\u0000\u0000\u063b\u0636\u0001\u0000\u0000"+ + "\u0000\u063b\u063c\u0001\u0000\u0000\u0000\u063c\u011b\u0001\u0000\u0000"+ + "\u0000\u063d\u0640\u0003\u011e\u008f\u0000\u063e\u0640\u0003\u0124\u0092"+ + "\u0000\u063f\u063d\u0001\u0000\u0000\u0000\u063f\u063e\u0001\u0000\u0000"+ + "\u0000\u0640\u011d\u0001\u0000\u0000\u0000\u0641\u064c\u0005]\u0000\u0000"+ + "\u0642\u0644\u0003\u00b4Z\u0000\u0643\u0642\u0001\u0000\u0000\u0000\u0643"+ + "\u0644\u0001\u0000\u0000\u0000\u0644\u064d\u0001\u0000\u0000\u0000\u0645"+ + "\u0647\u0003\u0102\u0081\u0000\u0646\u0645\u0001\u0000\u0000\u0000\u0646"+ + "\u0647\u0001\u0000\u0000\u0000\u0647\u0648\u0001\u0000\u0000\u0000\u0648"+ + "\u064a\u0003\u017e\u00bf\u0000\u0649\u064b\u0003\u00b4Z\u0000\u064a\u0649"+ + "\u0001\u0000\u0000\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b\u064d"+ + "\u0001\u0000\u0000\u0000\u064c\u0643\u0001\u0000\u0000\u0000\u064c\u0646"+ + "\u0001\u0000\u0000\u0000\u064d\u064e\u0001\u0000\u0000\u0000\u064e\u0652"+ + "\u0005l\u0000\u0000\u064f\u0651\u0003\u0120\u0090\u0000\u0650\u064f\u0001"+ + "\u0000\u0000\u0000\u0651\u0654\u0001\u0000\u0000\u0000\u0652\u0650\u0001"+ + "\u0000\u0000\u0000\u0652\u0653\u0001\u0000\u0000\u0000\u0653\u0655\u0001"+ + "\u0000\u0000\u0000\u0654\u0652\u0001\u0000\u0000\u0000\u0655\u0656\u0005"+ + "m\u0000\u0000\u0656\u011f\u0001\u0000\u0000\u0000\u0657\u0658\u0003\u0122"+ + "\u0091\u0000\u0658\u065a\u0005s\u0000\u0000\u0659\u065b\u0003\u0100\u0080"+ + "\u0000\u065a\u0659\u0001\u0000\u0000\u0000\u065a\u065b\u0001\u0000\u0000"+ + "\u0000\u065b\u0121\u0001\u0000\u0000\u0000\u065c\u065d\u0005T\u0000\u0000"+ + "\u065d\u0660\u0003\u00f6{\u0000\u065e\u0660\u0005P\u0000\u0000\u065f\u065c"+ + "\u0001\u0000\u0000\u0000\u065f\u065e\u0001\u0000\u0000\u0000\u0660\u0123"+ + "\u0001\u0000\u0000\u0000\u0661\u066a\u0005]\u0000\u0000\u0662\u066b\u0003"+ + "\u0126\u0093\u0000\u0663\u0664\u0003\u017e\u00bf\u0000\u0664\u0665\u0003"+ + "\u0126\u0093\u0000\u0665\u066b\u0001\u0000\u0000\u0000\u0666\u0667\u0003"+ + "\u0102\u0081\u0000\u0667\u0668\u0003\u017e\u00bf\u0000\u0668\u0669\u0003"+ + "\u0126\u0093\u0000\u0669\u066b\u0001\u0000\u0000\u0000\u066a\u0662\u0001"+ + "\u0000\u0000\u0000\u066a\u0663\u0001\u0000\u0000\u0000\u066a\u0666\u0001"+ + "\u0000\u0000\u0000\u066b\u066c\u0001\u0000\u0000\u0000\u066c\u0670\u0005"+ + "l\u0000\u0000\u066d\u066f\u0003\u0128\u0094\u0000\u066e\u066d\u0001\u0000"+ + "\u0000\u0000\u066f\u0672\u0001\u0000\u0000\u0000\u0670\u066e\u0001\u0000"+ + "\u0000\u0000\u0670\u0671\u0001\u0000\u0000\u0000\u0671\u0673\u0001\u0000"+ + "\u0000\u0000\u0672\u0670\u0001\u0000\u0000\u0000\u0673\u0674\u0005m\u0000"+ + "\u0000\u0674\u0125\u0001\u0000\u0000\u0000\u0675\u0676\u0005i\u0000\u0000"+ + "\u0676\u0678\u0005w\u0000\u0000\u0677\u0675\u0001\u0000\u0000\u0000\u0677"+ + "\u0678\u0001\u0000\u0000\u0000\u0678\u0679\u0001\u0000\u0000\u0000\u0679"+ + "\u067a\u0003\u00c4b\u0000\u067a\u067b\u0005t\u0000\u0000\u067b\u067c\u0005"+ + "j\u0000\u0000\u067c\u067d\u0005b\u0000\u0000\u067d\u067e\u0005k\u0000"+ + "\u0000\u067e\u0127\u0001\u0000\u0000\u0000\u067f\u0680\u0003\u012a\u0095"+ + "\u0000\u0680\u0682\u0005s\u0000\u0000\u0681\u0683\u0003\u0100\u0080\u0000"+ + "\u0682\u0681\u0001\u0000\u0000\u0000\u0682\u0683\u0001\u0000\u0000\u0000"+ + "\u0683\u0129\u0001\u0000\u0000\u0000\u0684\u0685\u0005T\u0000\u0000\u0685"+ + "\u0688\u0003\u012c\u0096\u0000\u0686\u0688\u0005P\u0000\u0000\u0687\u0684"+ + "\u0001\u0000\u0000\u0000\u0687\u0686\u0001\u0000\u0000\u0000\u0688\u012b"+ + "\u0001\u0000\u0000\u0000\u0689\u068c\u0003\u00d2i\u0000\u068a\u068c\u0005"+ + "h\u0000\u0000\u068b\u0689\u0001\u0000\u0000\u0000\u068b\u068a\u0001\u0000"+ + "\u0000\u0000\u068c\u0694\u0001\u0000\u0000\u0000\u068d\u0690\u0005q\u0000"+ + "\u0000\u068e\u0691\u0003\u00d2i\u0000\u068f\u0691\u0005h\u0000\u0000\u0690"+ + "\u068e\u0001\u0000\u0000\u0000\u0690\u068f\u0001\u0000\u0000\u0000\u0691"+ + "\u0693\u0001\u0000\u0000\u0000\u0692\u068d\u0001\u0000\u0000\u0000\u0693"+ + "\u0696\u0001\u0000\u0000\u0000\u0694\u0692\u0001\u0000\u0000\u0000\u0694"+ + "\u0695\u0001\u0000\u0000\u0000\u0695\u012d\u0001\u0000\u0000\u0000\u0696"+ + "\u0694\u0001\u0000\u0000\u0000\u0697\u0698\u0005S\u0000\u0000\u0698\u069c"+ + "\u0005l\u0000\u0000\u0699\u069b\u0003\u0130\u0098\u0000\u069a\u0699\u0001"+ + "\u0000\u0000\u0000\u069b\u069e\u0001\u0000\u0000\u0000\u069c\u069a\u0001"+ + "\u0000\u0000\u0000\u069c\u069d\u0001\u0000\u0000\u0000\u069d\u069f\u0001"+ + "\u0000\u0000\u0000\u069e\u069c\u0001\u0000\u0000\u0000\u069f\u06a0\u0005"+ + "m\u0000\u0000\u06a0\u012f\u0001\u0000\u0000\u0000\u06a1\u06a2\u0003\u0132"+ + "\u0099\u0000\u06a2\u06a4\u0005s\u0000\u0000\u06a3\u06a5\u0003\u0100\u0080"+ + "\u0000\u06a4\u06a3\u0001\u0000\u0000\u0000\u06a4\u06a5\u0001\u0000\u0000"+ + "\u0000\u06a5\u0131\u0001\u0000\u0000\u0000\u06a6\u06a9\u0005T\u0000\u0000"+ + "\u06a7\u06aa\u0003\u0106\u0083\u0000\u06a8\u06aa\u0003\u0134\u009a\u0000"+ + "\u06a9\u06a7\u0001\u0000\u0000\u0000\u06a9\u06a8\u0001\u0000\u0000\u0000"+ + "\u06aa\u06ad\u0001\u0000\u0000\u0000\u06ab\u06ad\u0005P\u0000\u0000\u06ac"+ + "\u06a6\u0001\u0000\u0000\u0000\u06ac\u06ab\u0001\u0000\u0000\u0000\u06ad"+ + "\u0133\u0001\u0000\u0000\u0000\u06ae\u06af\u0003\u00f6{\u0000\u06af\u06b0"+ + "\u0005p\u0000\u0000\u06b0\u06b5\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003"+ + "\u00f4z\u0000\u06b2\u06b3\u0005w\u0000\u0000\u06b3\u06b5\u0001\u0000\u0000"+ + "\u0000\u06b4\u06ae\u0001\u0000\u0000\u0000\u06b4\u06b1\u0001\u0000\u0000"+ + "\u0000\u06b4\u06b5\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001\u0000\u0000"+ + "\u0000\u06b6\u06b7\u0003\u00b4Z\u0000\u06b7\u0135\u0001\u0000\u0000\u0000"+ + "\u06b8\u06c0\u0005d\u0000\u0000\u06b9\u06bb\u0003\u00b4Z\u0000\u06ba\u06b9"+ + "\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000\u06bb\u06c1"+ + "\u0001\u0000\u0000\u0000\u06bc\u06c1\u0003\u0138\u009c\u0000\u06bd\u06bf"+ + "\u0003\u00e8t\u0000\u06be\u06bd\u0001\u0000\u0000\u0000\u06be\u06bf\u0001"+ + "\u0000\u0000\u0000\u06bf\u06c1\u0001\u0000\u0000\u0000\u06c0\u06ba\u0001"+ + "\u0000\u0000\u0000\u06c0\u06bc\u0001\u0000\u0000\u0000\u06c0\u06be\u0001"+ + "\u0000\u0000\u0000\u06c1\u06c2\u0001\u0000\u0000\u0000\u06c2\u06c3\u0003"+ + "\u00fe\u007f\u0000\u06c3\u0137\u0001\u0000\u0000\u0000\u06c4\u06c6\u0003"+ + "\u0102\u0081\u0000\u06c5\u06c4\u0001\u0000\u0000\u0000\u06c5\u06c6\u0001"+ + "\u0000\u0000\u0000\u06c6\u06c7\u0001\u0000\u0000\u0000\u06c7\u06c9\u0003"+ + "\u017e\u00bf\u0000\u06c8\u06ca\u0003\u00b4Z\u0000\u06c9\u06c8\u0001\u0000"+ + "\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000"+ + "\u0000\u0000\u06cb\u06cd\u0003\u017e\u00bf\u0000\u06cc\u06ce\u0003\u0102"+ + "\u0081\u0000\u06cd\u06cc\u0001\u0000\u0000\u0000\u06cd\u06ce\u0001\u0000"+ + "\u0000\u0000\u06ce\u0139\u0001\u0000\u0000\u0000\u06cf\u06d0\u0005V\u0000"+ + "\u0000\u06d0\u06d1\u0003\u00b4Z\u0000\u06d1\u013b\u0001\u0000\u0000\u0000"+ + "\u06d2\u06d5\u0003\u0160\u00b0\u0000\u06d3\u06d5\u0005i\u0000\u0000\u06d4"+ + "\u06d2\u0001\u0000\u0000\u0000\u06d4\u06d3\u0001\u0000\u0000\u0000\u06d5"+ + "\u013d\u0001\u0000\u0000\u0000\u06d6\u06d7\u0005n\u0000\u0000\u06d7\u06d8"+ + "\u0003\u0140\u00a0\u0000\u06d8\u06d9\u0005o\u0000\u0000\u06d9\u06da\u0003"+ + "\u0142\u00a1\u0000\u06da\u013f\u0001\u0000\u0000\u0000\u06db\u06dc\u0003"+ + "\u00b4Z\u0000\u06dc\u0141\u0001\u0000\u0000\u0000\u06dd\u06de\u0003\u00d2"+ + "i\u0000\u06de\u0143\u0001\u0000\u0000\u0000\u06df\u06e0\u0005\u008b\u0000"+ + "\u0000\u06e0\u06e1\u0003\u00d2i\u0000\u06e1\u0145\u0001\u0000\u0000\u0000"+ + "\u06e2\u06e3\u0005n\u0000\u0000\u06e3\u06e4\u0005o\u0000\u0000\u06e4\u06e5"+ + "\u0003\u0142\u00a1\u0000\u06e5\u0147\u0001\u0000\u0000\u0000\u06e6\u06e7"+ + "\u0005W\u0000\u0000\u06e7\u06e8\u0005n\u0000\u0000\u06e8\u06e9\u0003\u00d2"+ + "i\u0000\u06e9\u06ea\u0005o\u0000\u0000\u06ea\u06eb\u0003\u0142\u00a1\u0000"+ + "\u06eb\u0149\u0001\u0000\u0000\u0000\u06ec\u06f2\u0005Y\u0000\u0000\u06ed"+ + "\u06ee\u0005Y\u0000\u0000\u06ee\u06f2\u0005\u008d\u0000\u0000\u06ef\u06f0"+ + "\u0005\u008d\u0000\u0000\u06f0\u06f2\u0005Y\u0000\u0000\u06f1\u06ec\u0001"+ + "\u0000\u0000\u0000\u06f1\u06ed\u0001\u0000\u0000\u0000\u06f1\u06ef\u0001"+ + "\u0000\u0000\u0000\u06f2\u06f3\u0001\u0000\u0000\u0000\u06f3\u06f4\u0003"+ + "\u0142\u00a1\u0000\u06f4\u014b\u0001\u0000\u0000\u0000\u06f5\u06f6\u0005"+ + "Q\u0000\u0000\u06f6\u06f7\u0003\u014e\u00a7\u0000\u06f7\u014d\u0001\u0000"+ + "\u0000\u0000\u06f8\u06f9\u0003\u0152\u00a9\u0000\u06f9\u06fa\u0003\u0150"+ + "\u00a8\u0000\u06fa\u06fd\u0001\u0000\u0000\u0000\u06fb\u06fd\u0003\u0152"+ + "\u00a9\u0000\u06fc\u06f8\u0001\u0000\u0000\u0000\u06fc\u06fb\u0001\u0000"+ + "\u0000\u0000\u06fd\u014f\u0001\u0000\u0000\u0000\u06fe\u0701\u0003\u0152"+ + "\u00a9\u0000\u06ff\u0701\u0003\u00d2i\u0000\u0700\u06fe\u0001\u0000\u0000"+ + "\u0000\u0700\u06ff\u0001\u0000\u0000\u0000\u0701\u0151\u0001\u0000\u0000"+ + "\u0000\u0702\u070e\u0005j\u0000\u0000\u0703\u0708\u0003\u00acV\u0000\u0704"+ + "\u0705\u0005q\u0000\u0000\u0705\u0707\u0003\u00acV\u0000\u0706\u0704\u0001"+ + "\u0000\u0000\u0000\u0707\u070a\u0001\u0000\u0000\u0000\u0708\u0706\u0001"+ + "\u0000\u0000\u0000\u0708\u0709\u0001\u0000\u0000\u0000\u0709\u070c\u0001"+ + "\u0000\u0000\u0000\u070a\u0708\u0001\u0000\u0000\u0000\u070b\u070d\u0005"+ + "q\u0000\u0000\u070c\u070b\u0001\u0000\u0000\u0000\u070c\u070d\u0001\u0000"+ + "\u0000\u0000\u070d\u070f\u0001\u0000\u0000\u0000\u070e\u0703\u0001\u0000"+ + "\u0000\u0000\u070e\u070f\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000"+ + "\u0000\u0000\u0710\u0711\u0005k\u0000\u0000\u0711\u0153\u0001\u0000\u0000"+ + "\u0000\u0712\u0713\u0003\u0156\u00ab\u0000\u0713\u0714\u0005j\u0000\u0000"+ + "\u0714\u0716\u0003\u00b4Z\u0000\u0715\u0717\u0005q\u0000\u0000\u0716\u0715"+ + "\u0001\u0000\u0000\u0000\u0716\u0717\u0001\u0000\u0000\u0000\u0717\u0718"+ + "\u0001\u0000\u0000\u0000\u0718\u0719\u0005k\u0000\u0000\u0719\u0155\u0001"+ + "\u0000\u0000\u0000\u071a\u0720\u0003\u00d4j\u0000\u071b\u071c\u0005j\u0000"+ + "\u0000\u071c\u071d\u0003\u0156\u00ab\u0000\u071d\u071e\u0005k\u0000\u0000"+ + "\u071e\u0720\u0001\u0000\u0000\u0000\u071f\u071a\u0001\u0000\u0000\u0000"+ + "\u071f\u071b\u0001\u0000\u0000\u0000\u0720\u0157\u0001\u0000\u0000\u0000"+ + "\u0721\u0728\u0003\u015a\u00ad\u0000\u0722\u0728\u0003\u015e\u00af\u0000"+ + "\u0723\u0724\u0005j\u0000\u0000\u0724\u0725\u0003\u00b4Z\u0000\u0725\u0726"+ + "\u0005k\u0000\u0000\u0726\u0728\u0001\u0000\u0000\u0000\u0727\u0721\u0001"+ + "\u0000\u0000\u0000\u0727\u0722\u0001\u0000\u0000\u0000\u0727\u0723\u0001"+ + "\u0000\u0000\u0000\u0728\u0159\u0001\u0000\u0000\u0000\u0729\u072d\u0003"+ + "\u00c2a\u0000\u072a\u072d\u0003\u0162\u00b1\u0000\u072b\u072d\u0003\u00c6"+ + "c\u0000\u072c\u0729\u0001\u0000\u0000\u0000\u072c\u072a\u0001\u0000\u0000"+ + "\u0000\u072c\u072b\u0001\u0000\u0000\u0000\u072d\u015b\u0001\u0000\u0000"+ + "\u0000\u072e\u072f\u0007\u0012\u0000\u0000\u072f\u015d\u0001\u0000\u0000"+ + "\u0000\u0730\u0731\u0005i\u0000\u0000\u0731\u015f\u0001\u0000\u0000\u0000"+ + "\u0732\u0733\u0005i\u0000\u0000\u0733\u0734\u0005t\u0000\u0000\u0734\u0735"+ + "\u0005i\u0000\u0000\u0735\u0161\u0001\u0000\u0000\u0000\u0736\u0737\u0003"+ + "\u00dam\u0000\u0737\u0738\u0003\u0164\u00b2\u0000\u0738\u0163\u0001\u0000"+ + "\u0000\u0000\u0739\u073e\u0005l\u0000\u0000\u073a\u073c\u0003\u0166\u00b3"+ + "\u0000\u073b\u073d\u0005q\u0000\u0000\u073c\u073b\u0001\u0000\u0000\u0000"+ + "\u073c\u073d\u0001\u0000\u0000\u0000\u073d\u073f\u0001\u0000\u0000\u0000"+ + "\u073e\u073a\u0001\u0000\u0000\u0000\u073e\u073f\u0001\u0000\u0000\u0000"+ + "\u073f\u0740\u0001\u0000\u0000\u0000\u0740\u0741\u0005m\u0000\u0000\u0741"+ + "\u0165\u0001\u0000\u0000\u0000\u0742\u0747\u0003\u0168\u00b4\u0000\u0743"+ + "\u0744\u0005q\u0000\u0000\u0744\u0746\u0003\u0168\u00b4\u0000\u0745\u0743"+ + "\u0001\u0000\u0000\u0000\u0746\u0749\u0001\u0000\u0000\u0000\u0747\u0745"+ + "\u0001\u0000\u0000\u0000\u0747\u0748\u0001\u0000\u0000\u0000\u0748\u0167"+ + "\u0001\u0000\u0000\u0000\u0749\u0747\u0001\u0000\u0000\u0000\u074a\u074b"+ + "\u0003\u016a\u00b5\u0000\u074b\u074c\u0005s\u0000\u0000\u074c\u074e\u0001"+ + "\u0000\u0000\u0000\u074d\u074a\u0001\u0000\u0000\u0000\u074d\u074e\u0001"+ + "\u0000\u0000\u0000\u074e\u074f\u0001\u0000\u0000\u0000\u074f\u0750\u0003"+ + "\u016c\u00b6\u0000\u0750\u0169\u0001\u0000\u0000\u0000\u0751\u0754\u0003"+ + "\u00b4Z\u0000\u0752\u0754\u0003\u0164\u00b2\u0000\u0753\u0751\u0001\u0000"+ + "\u0000\u0000\u0753\u0752\u0001\u0000\u0000\u0000\u0754\u016b\u0001\u0000"+ + "\u0000\u0000\u0755\u0758\u0003\u00b4Z\u0000\u0756\u0758\u0003\u0164\u00b2"+ + "\u0000\u0757\u0755\u0001\u0000\u0000\u0000\u0757\u0756\u0001\u0000\u0000"+ + "\u0000\u0758\u016d\u0001\u0000\u0000\u0000\u0759\u075a\u0005X\u0000\u0000"+ + "\u075a\u0760\u0005l\u0000\u0000\u075b\u075c\u0003`0\u0000\u075c\u075d"+ + "\u0003\u017e\u00bf\u0000\u075d\u075f\u0001\u0000\u0000\u0000\u075e\u075b"+ + "\u0001\u0000\u0000\u0000\u075f\u0762\u0001\u0000\u0000\u0000\u0760\u075e"+ + "\u0001\u0000\u0000\u0000\u0760\u0761\u0001\u0000\u0000\u0000\u0761\u0763"+ + "\u0001\u0000\u0000\u0000\u0762\u0760\u0001\u0000\u0000\u0000\u0763\u0764"+ + "\u0005m\u0000\u0000\u0764\u016f\u0001\u0000\u0000\u0000\u0765\u0766\u0007"+ + "\u0013\u0000\u0000\u0766\u0171\u0001\u0000\u0000\u0000\u0767\u0769\u0005"+ + "\u008b\u0000\u0000\u0768\u0767\u0001\u0000\u0000\u0000\u0768\u0769\u0001"+ + "\u0000\u0000\u0000\u0769\u076a\u0001\u0000\u0000\u0000\u076a\u076b\u0003"+ + "\u013c\u009e\u0000\u076b\u0173\u0001\u0000\u0000\u0000\u076c\u076d\u0005"+ + "n\u0000\u0000\u076d\u076e\u0003\u00b4Z\u0000\u076e\u076f\u0005o\u0000"+ + "\u0000\u076f\u0175\u0001\u0000\u0000\u0000\u0770\u0771\u0005t\u0000\u0000"+ + "\u0771\u0772\u0005j\u0000\u0000\u0772\u0773\u0003\u00d2i\u0000\u0773\u0774"+ + "\u0005k\u0000\u0000\u0774\u0177\u0001\u0000\u0000\u0000\u0775\u0784\u0005"+ + "j\u0000\u0000\u0776\u077d\u0003\u00f6{\u0000\u0777\u077a\u0003\u0156\u00ab"+ + "\u0000\u0778\u0779\u0005q\u0000\u0000\u0779\u077b\u0003\u00f6{\u0000\u077a"+ + "\u0778\u0001\u0000\u0000\u0000\u077a\u077b\u0001\u0000\u0000\u0000\u077b"+ + "\u077d\u0001\u0000\u0000\u0000\u077c\u0776\u0001\u0000\u0000\u0000\u077c"+ + "\u0777\u0001\u0000\u0000\u0000\u077d\u077f\u0001\u0000\u0000\u0000\u077e"+ + "\u0780\u0005x\u0000\u0000\u077f\u077e\u0001\u0000\u0000\u0000\u077f\u0780"+ + "\u0001\u0000\u0000\u0000\u0780\u0782\u0001\u0000\u0000\u0000\u0781\u0783"+ + "\u0005q\u0000\u0000\u0782\u0781\u0001\u0000\u0000\u0000\u0782\u0783\u0001"+ + "\u0000\u0000\u0000\u0783\u0785\u0001\u0000\u0000\u0000\u0784\u077c\u0001"+ + "\u0000\u0000\u0000\u0784\u0785\u0001\u0000\u0000\u0000\u0785\u0786\u0001"+ + "\u0000\u0000\u0000\u0786\u0787\u0005k\u0000\u0000\u0787\u0179\u0001\u0000"+ + "\u0000\u0000\u0788\u0789\u0003\u0156\u00ab\u0000\u0789\u078a\u0005t\u0000"+ + "\u0000\u078a\u078b\u0005i\u0000\u0000\u078b\u017b\u0001\u0000\u0000\u0000"+ + "\u078c\u078d\u0003\u00d2i\u0000\u078d\u017d\u0001\u0000\u0000\u0000\u078e"+ + "\u0793\u0005r\u0000\u0000\u078f\u0793\u0005\u0000\u0000\u0001\u0790\u0793"+ + "\u0005\u00a3\u0000\u0000\u0791\u0793\u0004\u00bf\u0013\u0000\u0792\u078e"+ + "\u0001\u0000\u0000\u0000\u0792\u078f\u0001\u0000\u0000\u0000\u0792\u0790"+ + "\u0001\u0000\u0000\u0000\u0792\u0791\u0001\u0000\u0000\u0000\u0793\u017f"+ + "\u0001\u0000\u0000\u0000\u00c9\u018e\u0193\u019a\u01a4\u01aa\u01b0\u01ba"+ + "\u01c4\u01d2\u01d6\u01df\u01eb\u01ef\u01f5\u01fe\u0208\u0219\u0227\u022b"+ + "\u0232\u023a\u0243\u0263\u026b\u0283\u0296\u02a5\u02b3\u02bc\u02ca\u02d3"+ + "\u02df\u02e5\u02f4\u02fa\u02fd\u030a\u0313\u0318\u031d\u0320\u0325\u032c"+ + "\u0332\u033b\u0341\u034e\u0351\u0355\u0359\u0361\u0369\u036e\u0376\u0378"+ + "\u037d\u0384\u038c\u038f\u0395\u039a\u039c\u039f\u03a6\u03ab\u03be\u03c6"+ + "\u03ca\u03cd\u03d3\u03d7\u03da\u03e4\u03eb\u03f2\u03fe\u0404\u040b\u0410"+ + "\u0416\u0422\u0428\u042c\u0434\u0438\u043e\u0441\u0447\u044c\u0465\u0488"+ + "\u048a\u04a1\u04a9\u04b4\u04bb\u04c2\u04cc\u04de\u04f4\u04f6\u04fe\u0502"+ + "\u0506\u0509\u0512\u0518\u0522\u052a\u0530\u0539\u0544\u054f\u0553\u0555"+ + "\u0560\u0569\u056d\u0570\u0577\u0582\u058c\u0592\u0594\u059e\u05a8\u05ac"+ + "\u05b0\u05b4\u05bb\u05c3\u05ce\u05d2\u05d6\u05e2\u05e6\u05ea\u05ef\u05f2"+ + "\u05f5\u05fc\u0603\u0617\u061b\u061f\u0623\u0633\u0639\u063b\u063f\u0643"+ + "\u0646\u064a\u064c\u0652\u065a\u065f\u066a\u0670\u0677\u0682\u0687\u068b"+ + "\u0690\u0694\u069c\u06a4\u06a9\u06ac\u06b4\u06ba\u06be\u06c0\u06c5\u06c9"+ + "\u06cd\u06d4\u06f1\u06fc\u0700\u0708\u070c\u070e\u0716\u071f\u0727\u072c"+ + "\u073c\u073e\u0747\u074d\u0753\u0757\u0760\u0768\u077a\u077c\u077f\u0782"+ + "\u0784\u0792"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index ea41681a0..cda3f9907 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -369,6 +369,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitGhostPointerType(GobraParser.GhostPointerTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFieldDecl(GobraParser.FieldDeclContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1531,13 +1538,6 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitStructType(GobraParser.StructTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitFieldDecl(GobraParser.FieldDeclContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 37344b222..598d6de5d 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -320,6 +320,12 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitGhostPointerType(GobraParser.GhostPointerTypeContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#fieldDecl}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFieldDecl(GobraParser.FieldDeclContext ctx); /** * Visit a parse tree produced by {@link GobraParser#sqType}. * @param ctx the parse tree @@ -1350,12 +1356,6 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitStructType(GobraParser.StructTypeContext ctx); - /** - * Visit a parse tree produced by {@link GobraParser#fieldDecl}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitFieldDecl(GobraParser.FieldDeclContext ctx); /** * Visit a parse tree produced by {@link GobraParser#string_}. * @param ctx the parse tree From dcf73c3472799763752e9b7c2d7a92fed1967cfa Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Mon, 6 May 2024 14:15:46 +0200 Subject: [PATCH 273/296] Updates submodules (#765) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index c45bfd4c7..7feca5dfd 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit c45bfd4c7ce75e7321249461ade16c0d0355b64d +Subproject commit 7feca5dfdc7790a6993c56501f68af9e7d038df5 From 6b3bf10767ae819b0b566b4bbdb2d48e757076c5 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 6 May 2024 16:29:44 +0200 Subject: [PATCH 274/296] implements ghost fields --- .../scala/viper/gobra/frontend/Desugar.scala | 30 ++--- .../gobra/frontend/ParseTreeTranslator.scala | 4 +- .../viper/gobra/frontend/info/base/Type.scala | 28 +++- .../implementation/property/Implements.scala | 7 +- .../property/TypeIdentity.scala | 6 +- .../implementation/typing/TypeTyping.scala | 39 ++++-- .../encodings/structs/StructEncoding.scala | 22 +++- .../ghost-field-comparison-simple01.gobra | 39 ++++++ .../ghost_field/ghost-field-fail01.gobra | 23 ++++ .../ghost-field-ghost-type-fail01.gobra | 12 ++ .../ghost-field-ghost-type-simple01.gobra | 24 ++++ .../ghost-field-interface-fail01.gobra | 54 ++++++++ .../ghost-field-interface-simple01.gobra | 121 ++++++++++++++++++ .../ghost_field/ghost-field-map-fail01.gobra | 38 ++++++ .../ghost_field/ghost-field-simple01.gobra | 14 ++ 15 files changed, 422 insertions(+), 39 deletions(-) create mode 100644 src/test/resources/regressions/features/ghost_field/ghost-field-comparison-simple01.gobra create mode 100644 src/test/resources/regressions/features/ghost_field/ghost-field-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_field/ghost-field-ghost-type-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_field/ghost-field-ghost-type-simple01.gobra create mode 100644 src/test/resources/regressions/features/ghost_field/ghost-field-interface-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_field/ghost-field-interface-simple01.gobra create mode 100644 src/test/resources/regressions/features/ghost_field/ghost-field-map-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_field/ghost-field-simple01.gobra diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 493d67587..0c5808975 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -2938,7 +2938,7 @@ object Desugar extends LazyLogging { case MemberPath.Deref => in.Deref(e, underlyingType(e.typ))(pinfo) case MemberPath.Ref => in.Ref(e)(pinfo) case MemberPath.Next(g) => - in.FieldRef(e, embeddedDeclD(g.decl, Addressability.fieldLookup(e.typ.addressability), g.context)(pinfo))(pinfo) + in.FieldRef(e, embeddedDeclD(g.decl, Addressability.fieldLookup(e.typ.addressability), g.ghost, g.context)(pinfo))(pinfo) case _: MemberPath.EmbeddedInterface => e }} } @@ -4025,36 +4025,36 @@ object Desugar extends LazyLogging { def structD(struct: StructT, addrMod: Addressability)(src: Meta): Vector[in.Field] = struct.clauses.map { - case (name, (true, typ)) => fieldDeclD((name, typ), Addressability.field(addrMod), struct)(src) - case (name, (false, typ)) => embeddedDeclD((name, typ), Addressability.field(addrMod), struct)(src) + case (name, t: StructFieldT) => fieldDeclD((name, t), Addressability.field(addrMod), struct)(src) + case (name, t: StructEmbeddedT) => embeddedDeclD((name, t), Addressability.field(addrMod), struct)(src) }.toVector def structMemberD(m: st.StructMember, addrMod: Addressability)(src: Meta): in.Field = m match { - case st.Field(decl, _, context) => fieldDeclD(decl, addrMod, context)(src) - case st.Embbed(decl, _, context) => embeddedDeclD(decl, addrMod, context)(src) + case st.Field(decl, isGhost, context) => fieldDeclD(decl, addrMod, isGhost, context)(src) + case st.Embbed(decl, isGhost, context) => embeddedDeclD(decl, addrMod, isGhost, context)(src) } - def embeddedDeclD(embedded: (String, Type), fieldAddrMod: Addressability, struct: StructT)(src: Source.Parser.Info): in.Field = { + def embeddedDeclD(embedded: (String, StructEmbeddedT), fieldAddrMod: Addressability, struct: StructT)(src: Source.Parser.Info): in.Field = { val idname = nm.field(embedded._1, struct) - val td = typeD(embedded._2, fieldAddrMod)(src) - in.Field(idname, td, ghost = false)(src) // TODO: fix ghost attribute + val td = typeD(embedded._2.typ, fieldAddrMod)(src) + in.Field(idname, td, ghost = embedded._2.isGhost)(src) } - def embeddedDeclD(decl: PEmbeddedDecl, addrMod: Addressability, context: ExternalTypeInfo)(src: Meta): in.Field = { + def embeddedDeclD(decl: PEmbeddedDecl, addrMod: Addressability, isGhost: Boolean, context: ExternalTypeInfo)(src: Meta): in.Field = { val struct = context.struct(decl) - val embedded: (String, Type) = (decl.id.name, context.typ(decl.typ)) + val embedded: (String, StructEmbeddedT) = (decl.id.name, StructEmbeddedT(context.typ(decl.typ), isGhost)) embeddedDeclD(embedded, addrMod, struct.get)(src) } - def fieldDeclD(field: (String, Type), fieldAddrMod: Addressability, struct: StructT)(src: Source.Parser.Info): in.Field = { + def fieldDeclD(field: (String, StructFieldT), fieldAddrMod: Addressability, struct: StructT)(src: Source.Parser.Info): in.Field = { val idname = nm.field(field._1, struct) - val td = typeD(field._2, fieldAddrMod)(src) - in.Field(idname, td, ghost = false)(src) // TODO: fix ghost attribute + val td = typeD(field._2.typ, fieldAddrMod)(src) + in.Field(idname, td, ghost = field._2.isGhost)(src) } - def fieldDeclD(decl: PFieldDecl, addrMod: Addressability, context: ExternalTypeInfo)(src: Meta): in.Field = { + def fieldDeclD(decl: PFieldDecl, addrMod: Addressability, isGhost: Boolean, context: ExternalTypeInfo)(src: Meta): in.Field = { val struct = context.struct(decl) - val field: (String, Type) = (decl.id.name, context.symbType(decl.typ)) + val field: (String, StructFieldT) = (decl.id.name, StructFieldT(context.symbType(decl.typ), isGhost)) fieldDeclD(field, addrMod, struct.get)(src) } diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 28447cd79..4b8b4aa60 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -305,9 +305,11 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole val et = visitNode[PEmbeddedType](ctx.embeddedField()) PEmbeddedDecl(et, PIdnDef(et.name).at(et)) } else { + val ghost = has(ctx.GHOST()) val goIdnDefList(ids) = visitIdentifierList(ctx.identifierList()) val t = visitNode[PType](ctx.type_()) - PFieldDecls(ids map (id => PFieldDecl(id, t.copy).at(id))) + val fieldDecls = PFieldDecls(ids map (id => PFieldDecl(id, t.copy).at(id))) + if (ghost) PExplicitGhostStructClause(fieldDecls).at(ctx) else fieldDecls } } diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala index df867da6b..c4dc0f80c 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -99,15 +99,29 @@ object Type { case object Send extends ChannelModus("chan<-") } - case class StructT(clauses: ListMap[String, (Boolean, Type)], decl: PStructType, context: ExternalTypeInfo) extends ContextualType { - lazy val fieldsAndEmbedded: ListMap[String, Type] = clauses.map(removeFieldIndicator) - lazy val fields: ListMap[String, Type] = clauses.filter(isField).map(removeFieldIndicator) - lazy val embedded: ListMap[String, Type] = clauses.filterNot(isField).map(removeFieldIndicator) - private def isField(clause: (String, (Boolean, Type))): Boolean = clause._2._1 - private def removeFieldIndicator(clause: (String, (Boolean, Type))): (String, Type) = (clause._1, clause._2._2) + trait StructClauseT extends Type { + def typ: Type + def isGhost: Boolean + } + + case class StructFieldT(typ: Type, isGhost: Boolean) extends PrettyType(s"$typ") with StructClauseT + + case class StructEmbeddedT(typ: Type, isGhost: Boolean) extends PrettyType(s"$typ") with StructClauseT + + case class StructT(clauses: ListMap[String, StructClauseT], decl: PStructType, context: ExternalTypeInfo) extends ContextualType { + lazy val fieldsAndEmbedded: ListMap[String, Type] = clauses.map(extractTyp) + lazy val fields: ListMap[String, Type] = clauses.filter(isField).map(extractTyp) + lazy val embedded: ListMap[String, Type] = clauses.filterNot(isField).map(extractTyp) + + private def isField(clause: (String, StructClauseT)): Boolean = clause._2 match { + case _: StructFieldT => true + case _ => false + } + + private def extractTyp(clause: (String, StructClauseT)): (String, Type) = (clause._1, clause._2.typ) override lazy val toString: String = { - val fields = clauses.map{ case (n, (_, t)) => s"$n: $t" } + val fields = clauses.map { case (n, i) => s"$n: $i" } s"struct{ ${fields.mkString("; ")}}" } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala index 4ab3a32ce..24756797f 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala @@ -89,9 +89,10 @@ trait Implements { this: TypeInfoImpl => case _ => failedProp(s"$r is not an interface") } - /** Returns true if the type is supported for interfaces. All finite types are supported. */ + /** Returns true if the type is supported for interfaces. All finite types are supported except for structs with ghost fields. */ def supportedSortForInterfaces(t: Type): PropertyResult = { - failedProp(s"The type $t is not supported for interface", !isIdentityPreservingType(t)) + failedProp(s"The type $t is not supported for interface", !isIdentityPreservingType(t)) and + failedProp(s"Structs containing ghost fields are not supported for interface", isStructTypeWithGhostFields(t)) } /** Returns whether values of type 't' satisfy that [x] == [y] in Viper implies x == y in Gobra. */ @@ -104,7 +105,7 @@ trait Implements { this: TypeInfoImpl => case Type.NilType | Type.BooleanT | _: Type.IntT | Type.StringT => true case ut: Type.PointerT => go(ut.elem) case ut: Type.StructT => - ut.clauses.forall{ case (_, (_, fieldType)) => go(fieldType) } + ut.clauses.forall{ case (_, info) => go(info.typ) } case ut: Type.ArrayT => go(ut.elem) case _: Type.SliceT => true case _: Type.MapT => true diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala index 4a01fe2b1..7b8154519 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala @@ -42,7 +42,11 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl => case (StructT(clausesL, _, contextL), StructT(clausesR, _, contextR)) => contextL == contextR && clausesL.size == clausesR.size && clausesL.zip(clausesR).forall { - case (lm, rm) => lm._1 == rm._1 && lm._2._1 == rm._2._1 && identicalTypes(lm._2._2, rm._2._2) + case ((lId, lc), (rId, rc)) => lId == rId && identicalTypes(lc.typ, rc.typ) && ((lc, rc) match { + case (_: StructFieldT, _: StructFieldT) => true + case (_: StructEmbeddedT, _: StructEmbeddedT) => true + case _ => false + }) } case (l: InterfaceT, r: InterfaceT) => diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index f28bc6505..da79d8fc0 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -11,6 +11,7 @@ import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages import scala.collection.immutable.ListMap import viper.gobra.ast.frontend._ import viper.gobra.ast.frontend.{AstPattern => ap} +import viper.gobra.frontend.info.base.SymbolTable.{Embbed, Field} import viper.gobra.frontend.info.base.Type.{StructT, _} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.property.UnderlyingType @@ -55,7 +56,8 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case _: PPredType => noMessages // well definedness implied by well definedness of children case n@ PMapType(key, elem) => isType(key).out ++ isType(elem).out ++ - error(n, s"map key $key is not comparable", !comparableType(typeSymbType(key))) + error(n, s"map key $key is not comparable", !comparableType(typeSymbType(key))) ++ + error(n, s"map key $key cannot contain ghost fields", isStructTypeWithGhostFields(typeSymbType(key))) case t: PStructType => t.embedded.flatMap(e => isNotPointerTypePE.errors(e.typ)(e)) ++ @@ -75,6 +77,19 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case t: PExpressionAndType => wellDefExprAndType(t).out ++ isType(t).out } + def isStructTypeWithGhostFields(t: Type): Boolean = t match { + case Single(st) => underlyingType(st) match { + case t: StructT => + structMemberSet(t).collect { + case (_, f: Field) => f.ghost + case (_, e: Embbed) => isStructTypeWithGhostFields(e.context.typ(e.decl.typ)) + }.exists(identity) + + case _ => false + } + case _ => false + } + lazy val typeSymbType: Typing[PType] = { // TODO: currently, this is required in order for Gobra to handle type alias to types from another package. This // should be eventually generalized to all typing operations. @@ -164,17 +179,19 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => } private def structSymbType(t: PStructType): Type = { - def makeFields(x: PFieldDecls): ListMap[String, (Boolean, Type)] = { - x.fields.foldLeft(ListMap[String, (Boolean, Type)]()) { case (prev, f) => prev + (f.id.name -> (true, typeSymbType(f.typ))) } + def infoFromFieldDecl(f: PFieldDecl, isGhost: Boolean): StructFieldT = StructFieldT(typeSymbType(f.typ), isGhost) + + def makeFields(x: PFieldDecls, isGhost: Boolean): ListMap[String, StructClauseT] = { + x.fields.foldLeft(ListMap[String, StructClauseT]()) { case (prev, f) => prev + (f.id.name -> infoFromFieldDecl(f, isGhost)) } } - def makeEmbedded(x: PEmbeddedDecl): ListMap[String, (Boolean, Type)] = - ListMap[String, (Boolean, Type)](x.id.name -> (false, miscType(x.typ))) - - val clauses = t.clauses.foldLeft(ListMap[String, (Boolean, Type)]()) { - case (prev, x: PFieldDecls) => prev ++ makeFields(x) - case (prev, PExplicitGhostStructClause(x: PFieldDecls)) => prev ++ makeFields(x) - case (prev, x: PEmbeddedDecl) => prev ++ makeEmbedded(x) - case (prev, PExplicitGhostStructClause(x: PEmbeddedDecl)) => prev ++ makeEmbedded(x) + def makeEmbedded(x: PEmbeddedDecl, isGhost: Boolean): ListMap[String, StructClauseT] = + ListMap(x.id.name -> StructEmbeddedT(miscType(x.typ), isGhost)) + + val clauses = t.clauses.foldLeft(ListMap[String, StructClauseT]()) { + case (prev, x: PFieldDecls) => prev ++ makeFields(x, isGhost = false) + case (prev, PExplicitGhostStructClause(x: PFieldDecls)) => prev ++ makeFields(x, isGhost = true) + case (prev, x: PEmbeddedDecl) => prev ++ makeEmbedded(x, isGhost = false) + case (prev, PExplicitGhostStructClause(x: PEmbeddedDecl)) => prev ++ makeEmbedded(x, isGhost = true) } StructT(clauses, t, this) } diff --git a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala index 92dbc3360..f0c96a729 100644 --- a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala @@ -125,7 +125,7 @@ class StructEncoding extends TypeEncoding { * [lhs: T == rhs: T] -> [lhs] == [rhs] * [lhs: *T° == rhs: *T] -> [lhs] == [rhs] * - * [(lhs: Struct{F}) == rhs: Struct{_}] -> AND f in F: [lhs.f == rhs.f] + * [(lhs: Struct{F}) == rhs: Struct{_}] -> AND f in F: [lhs.f == rhs.f] (NOTE: f ranges over actual & ghost fields since `equal` corresponds to ghost comparison) * // According to the Go spec, pointers to distinct zero-sized data may or may not be equal. Thus: * [(x: *Struct{}°) == x: *Struct{}] -> true * [(lhs: *Struct{}°) == rhs: *Struct{}] -> unknown() @@ -155,6 +155,26 @@ class StructEncoding extends TypeEncoding { } } + /** + * Encodes equal operation with go semantics + * + * [(lhs: Struct{F}) == rhs: Struct{_}] -> AND f in actual(F): [lhs.f == rhs.f] (NOTE: f ranges only over actual fields since `goEqual` corresponds to actual comparison) + */ + override def goEqual(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = { + case (lhs :: ctx.Struct(lhsFs), rhs :: ctx.Struct(rhsFs), src) => + val (pos, info, errT) = src.vprMeta + val actualFieldFilter: in.FieldRef => Boolean = fr => !fr.field.ghost + pure( + for { + x <- bind(lhs)(ctx) + y <- bind(rhs)(ctx) + lhsFAccs = fieldAccesses(x, lhsFs).filter(actualFieldFilter) + rhsFAccs = fieldAccesses(y, rhsFs).filter(actualFieldFilter) + equalFields <- sequence((lhsFAccs zip rhsFAccs).map { case (lhsFA, rhsFA) => ctx.equal(lhsFA, rhsFA)(src) }) + } yield VU.bigAnd(equalFields)(pos, info, errT) + )(ctx) + } + /** * Encodes expressions as values that do not occupy some identifiable location in memory. * diff --git a/src/test/resources/regressions/features/ghost_field/ghost-field-comparison-simple01.gobra b/src/test/resources/regressions/features/ghost_field/ghost-field-comparison-simple01.gobra new file mode 100644 index 000000000..38a72eefa --- /dev/null +++ b/src/test/resources/regressions/features/ghost_field/ghost-field-comparison-simple01.gobra @@ -0,0 +1,39 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// tests that Gobra correctly excludes ghost fields when comparing structs using the standard Go comparison + +package GhostFieldComparisonSimple01 + +type Test struct { + actualField int + ghost ghostField int +} + +decreases +func foo() { + t1 := Test{0, 0} + t2 := Test{0, 42} + t3 := Test{0, 42} + assert t1 == t2 // actual comparison, i.e., ghost fields are ignored + assert t2 === t3 // ghost comparison + assert t1 !== t2 // ghost comparison + + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} + +// behavior is the same independent of ghost/actual context +ghost +decreases +func ghostFoo() { + t1 := Test{0, 0} + t2 := Test{0, 42} + t3 := Test{0, 42} + assert t1 == t2 // actual comparison, i.e., ghost fields are ignored + assert t2 === t3 // ghost comparison + assert t1 !== t2 // ghost comparison + + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} diff --git a/src/test/resources/regressions/features/ghost_field/ghost-field-fail01.gobra b/src/test/resources/regressions/features/ghost_field/ghost-field-fail01.gobra new file mode 100644 index 000000000..ad4bfe5ed --- /dev/null +++ b/src/test/resources/regressions/features/ghost_field/ghost-field-fail01.gobra @@ -0,0 +1,23 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostFieldFail01 + +type Test struct { + actualField int + ghost ghostField int +} + +func foo() { + t := &Test{0, 42} + GhostFunc(t) +} + +ghost +decreases +preserves acc(t) +func GhostFunc(t *Test) { + t.ghostField = 42 + //:: ExpectedOutput(type_error) + t.actualField = 42 +} diff --git a/src/test/resources/regressions/features/ghost_field/ghost-field-ghost-type-fail01.gobra b/src/test/resources/regressions/features/ghost_field/ghost-field-ghost-type-fail01.gobra new file mode 100644 index 000000000..42c9f58d0 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_field/ghost-field-ghost-type-fail01.gobra @@ -0,0 +1,12 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// tests that ghost types cannot be used for actual fields + +package GhostFieldGhostTypeFail01 + +type Test struct { + //:: ExpectedOutput(type_error) + actualField mset[int] + ghost ghostField int +} diff --git a/src/test/resources/regressions/features/ghost_field/ghost-field-ghost-type-simple01.gobra b/src/test/resources/regressions/features/ghost_field/ghost-field-ghost-type-simple01.gobra new file mode 100644 index 000000000..e6c5a3920 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_field/ghost-field-ghost-type-simple01.gobra @@ -0,0 +1,24 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// tests that ghost types can be used for ghost fields + +package GhostFieldGhostTypeSimple01 + +type Test struct { + actualField int + ghost ghostField mset[int] +} + +decreases +func foo() { + t1 := Test{0, mset[int]{0, 1, 2}} + t2 := &Test{0, mset[int]{42}} + + // the following assertion is needed for triggering purposes: + assert len(t1.ghostField) != len(t2.ghostField) + assert t1.ghostField != t2.ghostField + + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} diff --git a/src/test/resources/regressions/features/ghost_field/ghost-field-interface-fail01.gobra b/src/test/resources/regressions/features/ghost_field/ghost-field-interface-fail01.gobra new file mode 100644 index 000000000..3bfad2b8a --- /dev/null +++ b/src/test/resources/regressions/features/ghost_field/ghost-field-interface-fail01.gobra @@ -0,0 +1,54 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// tests that a struct with ghost fields cannot be put under an interface + +package GhostFieldInterfaceFail01 + +type SomeIntf interface { + pred Mem() + + decreases + requires acc(Mem(), _) + pure Get() int + + ghost + decreases + requires acc(Mem(), _) + pure Get2() int +} + +decreases +requires s != nil && acc(s.Mem(), _) +pure func callee(s SomeIntf) int { + return s.Get() +} + + +type TestcaseStruct struct { + actualField int + ghost ghostField int +} + +pred (s TestcaseStruct) Mem() { + true +} + +decreases +pure func (s TestcaseStruct) Get() int { + return s.actualField +} + +ghost +decreases +pure func (s TestcaseStruct) Get2() int { + return s.ghostField +} + +func testcase() { + s := TestcaseStruct{ 42, 101 } + fold s.Mem() + //:: ExpectedOutput(type_error) + callee(s) + assert s.Get2() == 101 +} diff --git a/src/test/resources/regressions/features/ghost_field/ghost-field-interface-simple01.gobra b/src/test/resources/regressions/features/ghost_field/ghost-field-interface-simple01.gobra new file mode 100644 index 000000000..beeb63935 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_field/ghost-field-interface-simple01.gobra @@ -0,0 +1,121 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// tests that (1) a struct without ghost fields, (2) a pointer to a struct without ghost fields, and (3) a pointer to +// a struct with ghost fields can be put under an interface + +package GhostFieldInterfaceSimple01 + +type SomeIntf interface { + pred Mem() + + decreases + requires acc(Mem(), _) + pure Get() int + + ghost + decreases + requires acc(Mem(), _) + pure Get2() int +} + +decreases +requires s != nil && acc(s.Mem(), _) +pure func callee(s SomeIntf) int { + return s.Get() +} + + +// ----- Testcase 1 +type Testcase1Struct struct { + actualField int +} + +pred (s Testcase1Struct) Mem() { + true +} + +decreases +pure func (s Testcase1Struct) Get() int { + return s.actualField +} + +ghost +decreases +pure func (s Testcase1Struct) Get2() int { + return 0 +} + +func testcase1() { + s := Testcase1Struct{ 42 } + fold s.Mem() + callee(s) + + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} + + +// ----- Testcase 2 +type Testcase2Struct struct { + actualField int +} + +pred (s *Testcase2Struct) Mem() { + acc(s) +} + +decreases +requires acc(s.Mem(), _) +pure func (s *Testcase2Struct) Get() int { + return unfolding acc(s.Mem(), _) in s.actualField +} + +ghost +decreases +pure func (s *Testcase2Struct) Get2() int { + return 0 +} + +func testcase2() { + s := &Testcase2Struct{ 42 } + fold s.Mem() + callee(s) + + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} + + +// ----- Testcase 3 +type Testcase3Struct struct { + actualField int + ghost ghostField int +} + +pred (s *Testcase3Struct) Mem() { + acc(s) +} + +decreases +requires acc(s.Mem(), _) +pure func (s *Testcase3Struct) Get() int { + return unfolding acc(s.Mem(), _) in s.actualField +} + +ghost +decreases +requires acc(s.Mem(), _) +pure func (s *Testcase3Struct) Get2() int { + return unfolding acc(s.Mem(), _) in s.ghostField +} + +func testcase3() { + s := &Testcase3Struct{ 42, 101 } + fold s.Mem() + callee(s) + assert s.Get2() == 101 + + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} diff --git a/src/test/resources/regressions/features/ghost_field/ghost-field-map-fail01.gobra b/src/test/resources/regressions/features/ghost_field/ghost-field-map-fail01.gobra new file mode 100644 index 000000000..cbf314971 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_field/ghost-field-map-fail01.gobra @@ -0,0 +1,38 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// tests that Gobra correctly rejects Go maps that use a struct with ghost fields as a key because two structs that +// are equal modulo their ghost fields would map to the same map entry. However, we could extend the encoding to support +// such map key types. + +package GhostFieldMapFail01 + +type TestWithoutGhostFields struct { + actualField int +} + +type TestWithGhostFields struct { + actualField int + ghost ghostField int +} + +func foo() { + var m1 map[TestWithoutGhostFields]int + m2 := make(map[TestWithoutGhostFields]int) + + //:: ExpectedOutput(type_error) + var m3 map[TestWithGhostFields]int + //:: ExpectedOutput(type_error) + m4 := make(map[TestWithGhostFields]int) +} + +// however, it's fine to use structs with ghost fields as a value type: +func bar() { + var m1 map[int]TestWithoutGhostFields + m2 := make(map[int]TestWithoutGhostFields) + m2[0] = TestWithoutGhostFields{ 42 } + + var m3 map[int]TestWithGhostFields + m4 := make(map[int]TestWithGhostFields) + m4[42] = TestWithGhostFields{ 0, 42 } +} diff --git a/src/test/resources/regressions/features/ghost_field/ghost-field-simple01.gobra b/src/test/resources/regressions/features/ghost_field/ghost-field-simple01.gobra new file mode 100644 index 000000000..836a51fa5 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_field/ghost-field-simple01.gobra @@ -0,0 +1,14 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostFieldSimple01 + +type Test struct { + actualField int + ghost ghostField int +} + +func foo() { + t := Test{0, 42} + assert t.ghostField == 42 +} From 8fcebc42ba9cfed7fe0a273b58b727f0c03b46e7 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 6 May 2024 16:42:43 +0200 Subject: [PATCH 275/296] fixes struct encoding and adds a magic wands test with ghost pointers and ghost fields --- .../encodings/structs/StructEncoding.scala | 2 +- .../features/wands/ghost-list.gobra | 59 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/regressions/features/wands/ghost-list.gobra diff --git a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala index f0c96a729..3eab6ec3f 100644 --- a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala @@ -160,7 +160,7 @@ class StructEncoding extends TypeEncoding { * * [(lhs: Struct{F}) == rhs: Struct{_}] -> AND f in actual(F): [lhs.f == rhs.f] (NOTE: f ranges only over actual fields since `goEqual` corresponds to actual comparison) */ - override def goEqual(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = { + override def goEqual(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = default(super.goEqual(ctx)) { case (lhs :: ctx.Struct(lhsFs), rhs :: ctx.Struct(rhsFs), src) => val (pos, info, errT) = src.vprMeta val actualFieldFilter: in.FieldRef => Boolean = fr => !fr.field.ghost diff --git a/src/test/resources/regressions/features/wands/ghost-list.gobra b/src/test/resources/regressions/features/wands/ghost-list.gobra new file mode 100644 index 000000000..7c9c57d57 --- /dev/null +++ b/src/test/resources/regressions/features/wands/ghost-list.gobra @@ -0,0 +1,59 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ +package list + +type List struct { + val int + ghost next gpointer[List] +} + +pred (start gpointer[List]) Mem() { + acc(&start.val) && acc(&start.next) && + (start.next != nil ==> start.next.Mem()) +} + +ghost +decreases start.Mem() +requires start.Mem() +pure func elems(start gpointer[List]) (res seq[int]) { + return unfolding start.Mem() in (start.next == nil? seq[int]{start.val} : (seq[int]{start.val} ++ elems(start.next))) +} + +ghost +decreases +requires l1.Mem() && l2.Mem() && l2 != nil +ensures l1.Mem() && elems(l1) == old(elems(l1) ++ elems(l2)) +func (l1 gpointer[List]) Append(l2 gpointer[List]) { + unfold l1.Mem() + if l1.next == nil { + l1.next = l2 + fold l1.Mem() + } else { + var tmp gpointer[List] = l1.next + index := 1 + assert tmp.Mem() + + package tmp.Mem() --* (l1.Mem() && elems(l1) == old((elems(l1))[:index] ++ old[#lhs](elems(tmp)))) { + fold l1.Mem() + } + + invariant tmp.Mem() --* (l1.Mem() && elems(l1) == old((elems(l1))[:index] ++ old[#lhs](elems(tmp)))) + invariant index >= 0 + invariant tmp.Mem() && elems(tmp) == old(elems(l1))[index:] + decreases tmp.Mem() + for (unfolding tmp.Mem() in tmp.next != nil) { + unfold tmp.Mem() + prev := tmp + tmp = tmp.next + index = index + 1 + package tmp.Mem() --* (l1.Mem() && elems(l1) == old((elems(l1))[:index] ++ old[#lhs](elems(tmp)))) { + fold prev.Mem() + apply prev.Mem() --* (l1.Mem() && elems(l1) == old((elems(l1))[:index-1] ++ old[#lhs](elems(prev)))) + } + } + unfold tmp.Mem() + tmp.next = l2 + fold tmp.Mem() + apply tmp.Mem() --* (l1.Mem() && elems(l1) == old((elems(l1))[:index] ++ old[#lhs](elems(tmp)))) + } +} From 948c052b587a802472fc7c85fb669920cda2f0c6 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Mon, 6 May 2024 17:07:27 +0200 Subject: [PATCH 276/296] adds explanation to 'ghost-list.gobra' --- src/test/resources/regressions/features/wands/ghost-list.gobra | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/resources/regressions/features/wands/ghost-list.gobra b/src/test/resources/regressions/features/wands/ghost-list.gobra index 7c9c57d57..3a5e31d0c 100644 --- a/src/test/resources/regressions/features/wands/ghost-list.gobra +++ b/src/test/resources/regressions/features/wands/ghost-list.gobra @@ -2,6 +2,9 @@ // http://creativecommons.org/publicdomain/zero/1.0/ package list +// this testcase demonstrates (in comparison to list.gobra) how `Append` can be made ghost. Since this function +// modifies state, this testcase requires the use of ghost pointers and ghost fields. + type List struct { val int ghost next gpointer[List] From f78e4912b4acbb5d650ff6478bfaa1c9e9841625 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Mon, 6 May 2024 23:43:24 +0200 Subject: [PATCH 277/296] Updates submodules (#767) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 7feca5dfd..3e9347219 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 7feca5dfdc7790a6993c56501f68af9e7d038df5 +Subproject commit 3e9347219c323948c57ab627adbfe22ff490e1f5 From a2245928a596ddaf7e4b2674ef24ab3d6d97da06 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 15 May 2024 11:59:42 +0200 Subject: [PATCH 278/296] Update src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: JoĂ£o Pereira --- .../implementation/typing/ghost/separation/GhostWellDef.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala index fb6db771f..f21336fae 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala @@ -142,7 +142,7 @@ trait GhostWellDef { this: TypeInfoImpl => case e: PNew => if (isEnclosingGhost(e)) { - Violation.violation(exprType(e).isInstanceOf[GhostPointerT], s"All memory allocated within ghost code must be located on the ghost heap") + Violation.violation(exprType(e).isInstanceOf[GhostPointerT], s"Cannot allocate non-ghost memory in ghost code.") } else { Violation.violation(exprType(e).isInstanceOf[ActualPointerT], s"All memory allocated within actual code must be located on the actual heap") } From 2cd47869d13a699811f4e4059b953690a6f2b4ce Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 15 May 2024 14:26:28 +0200 Subject: [PATCH 279/296] Update src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: JoĂ£o Pereira --- .../gobra/frontend/info/implementation/typing/StmtTyping.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala index 554a223b9..70e0d7deb 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala @@ -346,7 +346,7 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl => val expectedResults = result.outs.flatMap(nameFromParam).map(t => PNamedOperand(PIdnUse(t))) def isExpectedAssignment(ass: PAssignment): Boolean = ass match { - case PAssignment(Vector(i: PInvoke), left) if isExpectedCall(i) && expectedResults == left => true + case PAssignment(Vector(i: PInvoke), left) => isExpectedCall(i) && expectedResults == left case _ => false } From 6908ecf29b2efdfc998b79196a8931c4580ad716 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Wed, 15 May 2024 14:39:23 +0200 Subject: [PATCH 280/296] Implements PR suggestions by Joao --- .../resolution/NameResolution.scala | 7 +- .../ghost/separation/GhostWellDef.scala | 2 +- .../ghostnessOfImplementation-fail1.gobra | 65 +++++++++++++++++++ .../issues/{000037.gobra => 000037-1.gobra} | 7 +- .../regressions/issues/000037-2.gobra | 29 +++++++++ 5 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/regressions/features/interfaces/ghostnessOfImplementation-fail1.gobra rename src/test/resources/regressions/issues/{000037.gobra => 000037-1.gobra} (62%) create mode 100644 src/test/resources/regressions/issues/000037-2.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index 8135f35bf..9f89376aa 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -144,9 +144,10 @@ trait NameResolution { case _ => violation("PIdnUnk always has a parent") } - // technically, `isGhostDef` should consider for implementation proofs whether the method getting implemented is ghost - // however, since implementation proofs are syntactically restricted, we assume for now that definitions in all - // implementation proofs are non-ghost. + // technically, `isGhostDef` should consider for implementation proofs whether the method getting implemented is ghost or not. + // however, we treat all implementation proofs as non-ghost and ignore whether an implementation proof is related to a + // ghost or actual method because the implementation proof is syntactically restricted and can only call the implemented + // method and/or fold and unfold the interface's predicate. private[resolution] lazy val isGhostDef: PNode => Boolean = n => isEnclosingGhost(n) private[resolution] def serialize(id: PIdnNode): String = id.name diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala index f21336fae..5aeb92fcf 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala @@ -144,7 +144,7 @@ trait GhostWellDef { this: TypeInfoImpl => if (isEnclosingGhost(e)) { Violation.violation(exprType(e).isInstanceOf[GhostPointerT], s"Cannot allocate non-ghost memory in ghost code.") } else { - Violation.violation(exprType(e).isInstanceOf[ActualPointerT], s"All memory allocated within actual code must be located on the actual heap") + Violation.violation(exprType(e).isInstanceOf[ActualPointerT], s"Cannot allocate ghost memory in non-ghost code.") } noMessages diff --git a/src/test/resources/regressions/features/interfaces/ghostnessOfImplementation-fail1.gobra b/src/test/resources/regressions/features/interfaces/ghostnessOfImplementation-fail1.gobra new file mode 100644 index 000000000..e9bc60d14 --- /dev/null +++ b/src/test/resources/regressions/features/interfaces/ghostnessOfImplementation-fail1.gobra @@ -0,0 +1,65 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// this test makes sure that a method's implementation has the same ghostness as specified in the interface + +package pkg + +type itfWithActualMethod interface { + decreases + actualMethod() int +} + +type itfWithActualPureMethod interface { + decreases + pure actualPureMethod() int +} + +type itfWithGhostMethod interface { + ghost + decreases + ghostMethod() int +} + +type itfWithGhostPureMethod interface { + ghost + decreases + pure ghostPureMethod() int +} + +type someImplementation struct { + value int +} + +// checks that `someImplementation` is indeed considered an implementation of each interface, i.e., that the ghost +// attribute in the interface and implementation is correctly handled. +//:: ExpectedOutput(type_error) +*someImplementation implements itfWithActualMethod +//:: ExpectedOutput(type_error) +*someImplementation implements itfWithActualPureMethod +//:: ExpectedOutput(type_error) +*someImplementation implements itfWithGhostMethod +//:: ExpectedOutput(type_error) +*someImplementation implements itfWithGhostPureMethod + +ghost +decreases +func (impl *someImplementation) actualMethod() int { + return 42 +} + +ghost +decreases +pure func (impl *someImplementation) actualPureMethod() int { + return 42 +} + +decreases +func (impl *someImplementation) ghostMethod() int { + return 42 +} + +decreases +pure func (impl *someImplementation) ghostPureMethod() int { + return 42 +} diff --git a/src/test/resources/regressions/issues/000037.gobra b/src/test/resources/regressions/issues/000037-1.gobra similarity index 62% rename from src/test/resources/regressions/issues/000037.gobra rename to src/test/resources/regressions/issues/000037-1.gobra index 6bdc8d3c7..d92838bb5 100644 --- a/src/test/resources/regressions/issues/000037.gobra +++ b/src/test/resources/regressions/issues/000037-1.gobra @@ -8,12 +8,17 @@ type Rectangle struct { } ghost +decreases pure func GetHeight(r Rectangle) (res int) { return r.Height } func main() { + someActualVariable := 42 r := Rectangle{Width: 2, Height: 5} h := GetHeight(r) assert h == GetHeight(r) && h == 5 -} \ No newline at end of file + // h is implicitly a ghost variable. Thus, the following assignment (to a non-ghost variable) should fail: + //:: ExpectedOutput(type_error) + someActualVariable = h +} diff --git a/src/test/resources/regressions/issues/000037-2.gobra b/src/test/resources/regressions/issues/000037-2.gobra new file mode 100644 index 000000000..b5025cc6d --- /dev/null +++ b/src/test/resources/regressions/issues/000037-2.gobra @@ -0,0 +1,29 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package main + +ghost +decreases x +pure func more(x int) int { + return x <= 0 ? 1 : more(x - 2) + 3 +} + +ghost /* lemma */ +decreases x +ensures x < more(x) +func increasing(x int) + +// returning b (a ghost variable) is not allowed as this is an actual function +//:: ExpectedOutput(type_error) +func exampleLemmaUse(a int) int { + increasing(a) + b := more(a) + c := more(b) + if a < 1000 { + increasing(more(a)) + assert 2 <= c - a + } + assert 2 <= c - a || 200 <= a + return b +} From 004f0191cd050be2b01e2d2b6f721a7b62343cf2 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Mon, 20 May 2024 11:32:56 +0200 Subject: [PATCH 281/296] Updates submodules (#769) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 3e9347219..b6f996d4b 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 3e9347219c323948c57ab627adbfe22ff490e1f5 +Subproject commit b6f996d4b305c54b3addcbd236055db08f9fa3c7 From 2765d8ee6188ac939bb40d4c34b59da40bb3185c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Tue, 21 May 2024 10:47:27 +0200 Subject: [PATCH 282/296] Fix purity classification of composite literals (#768) * Fix pure classification of composite literals * fix tests * fix failing test * add case for ghost slice * implement feedback from PR review * use unapply --- .../scala/viper/gobra/ast/frontend/Ast.scala | 2 +- .../property/UnderlyingType.scala | 6 ++++++ .../typing/ghost/GhostExprTyping.scala | 19 +++++++++++++++++-- .../arrays/array-length-simple2.gobra | 6 +++--- .../arrays/array-literal-simple1.gobra | 7 +++++++ .../features/maps/maps-fail1.gobra | 9 +++++++++ .../features/maps/maps-simple1.gobra | 3 ++- .../slices/slice-literal-simple1.gobra | 12 +++++++----- .../features/slices/slice-type-fail1.gobra | 9 +++++++++ .../regressions/issues/000129-2.gobra | 3 ++- .../gobra/typing/ExprTypingUnitTests.scala | 4 ++-- 11 files changed, 65 insertions(+), 15 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index d2066094e..564590e7a 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -689,7 +689,7 @@ case class PImplicitSizeArrayType(elem: PType) extends PLiteralType case class PSliceType(elem: PType) extends PTypeLit with PLiteralType -case class PVariadicType(elem: PType) extends PTypeLit with PLiteralType +case class PVariadicType(elem: PType) extends PTypeLit case class PMapType(key: PType, elem: PType) extends PTypeLit with PLiteralType diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala index d9c47981b..96f613c18 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala @@ -19,6 +19,10 @@ trait UnderlyingType { this: TypeInfoImpl => def unapply(t: Type): Option[Type] = Some(underlyingType(t)) } + object UnderlyingPType { + def unapply(t: PType): Option[PType] = underlyingTypeP(t) + } + lazy val underlyingType: Type => Type = attr[Type, Type] { case Single(DeclaredT(t: PTypeDecl, context: ExternalTypeInfo)) => underlyingType(context.symbType(t.right)) @@ -44,11 +48,13 @@ trait UnderlyingType { this: TypeInfoImpl => case value : PType => Some(value, this) case _ => None } + case st.AdtClause(_, typeDecl, _) => Some((typeDecl.right, this)) case _ => None // type not defined } case PDot(_, id) => entity(id) match { case st.NamedType(decl, _, ctx) => inCtx(ctx, decl.right) case st.TypeAlias(decl, _, ctx) => inCtx(ctx, decl.right) + case st.AdtClause(_, typeDecl, _) => Some((typeDecl.right, this)) case _ => None // type not defined } case t => Some((t, this)) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index 7161c528c..2fcba6af7 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -466,8 +466,23 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case n: PIsComparable => asExpr(n.exp).forall(go) case PCompositeLit(typ, _) => typ match { - case _: PArrayType | _: PImplicitSizeArrayType => !strong - case _ => true + case _: PImplicitSizeArrayType => true + case UnderlyingPType(t: PLiteralType) => t match { + case g: PGhostLiteralType => g match { + case _: PGhostSliceType => false + case _: PAdtType | _: PDomainType | _: PMathematicalMapType | + _: PMultisetType | _: POptionType | _: PSequenceType | _: PSetType => true + } + case _: PArrayType | _: PStructType => true + case _: PMapType | _: PSliceType => false + case d@(_: PDot | _: PNamedOperand) => + // UnderlyingPType should never return any of these types + violation(s"Unexpected underlying type $d") + } + case t => + // the type system should already have rejected composite literals whose underlying type is not a valid + // literal type. + violation(s"Unexpected literal type $t") } case POptionNone(_) => true diff --git a/src/test/resources/regressions/features/arrays/array-length-simple2.gobra b/src/test/resources/regressions/features/arrays/array-length-simple2.gobra index 71d7b1d64..2250357af 100644 --- a/src/test/resources/regressions/features/arrays/array-length-simple2.gobra +++ b/src/test/resources/regressions/features/arrays/array-length-simple2.gobra @@ -6,7 +6,7 @@ package pkg const N = 42 func foo() { - var a [N]int - assert len(a) == N - assert len(a) == 42 + var a [N]int + assert len(a) == N + assert len(a) == 42 } diff --git a/src/test/resources/regressions/features/arrays/array-literal-simple1.gobra b/src/test/resources/regressions/features/arrays/array-literal-simple1.gobra index aa7c62704..958c26be5 100644 --- a/src/test/resources/regressions/features/arrays/array-literal-simple1.gobra +++ b/src/test/resources/regressions/features/arrays/array-literal-simple1.gobra @@ -60,3 +60,10 @@ func test10() { assert [4]int { 0, 1, 42, 8 }[2] == 42 assert forall i int :: 0 <= i && i < 4 ==> ([4]int { 0, 2, 4, 6 })[i] == i + i } + +pure +decreases +func test11() [3]int { + // pure functions may contain array literals + return [3]int{} +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/maps/maps-fail1.gobra b/src/test/resources/regressions/features/maps/maps-fail1.gobra index 1b333c57f..702689741 100644 --- a/src/test/resources/regressions/features/maps/maps-fail1.gobra +++ b/src/test/resources/regressions/features/maps/maps-fail1.gobra @@ -30,3 +30,12 @@ func test4() { //:: ExpectedOutput(type_error) _ = map[int]int {1: 2, 1: 3} } + +// error: expected pure expression without permissions, but got map[int]int { } +pure +decreases +func test5() map[int]int { + // pure functions may NOT contain map literals + //:: ExpectedOutput(type_error) + return map[int]int{} +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/maps/maps-simple1.gobra b/src/test/resources/regressions/features/maps/maps-simple1.gobra index 571d8437a..1b0d769ed 100644 --- a/src/test/resources/regressions/features/maps/maps-simple1.gobra +++ b/src/test/resources/regressions/features/maps/maps-simple1.gobra @@ -73,7 +73,8 @@ func test8() { m := map[string]int { "hello": 5, "bye": 3 } v, ok := m["hello"] assert ok && v == 5 - assert len(map[int]int{}) == 0 + e := map[int]int{} + assert len(e) == 0 } func test9() { diff --git a/src/test/resources/regressions/features/slices/slice-literal-simple1.gobra b/src/test/resources/regressions/features/slices/slice-literal-simple1.gobra index 888ea17d3..a12796c1d 100644 --- a/src/test/resources/regressions/features/slices/slice-literal-simple1.gobra +++ b/src/test/resources/regressions/features/slices/slice-literal-simple1.gobra @@ -11,15 +11,17 @@ func test1() { } func test2() { - s@ := [][]int{[]int{1}, []int{2}} + s@ := [][]int{[]int{1}, []int{2}} assert len(s) == 2 } func test3() { - assert len([]int { 1, 2, 3 }) == 3 - assert cap([]int { 4, 5 }[:]) == 2 - assert len([]int { 1, 2, 3 }[:2]) == 2 - assert cap([]int { 4, 5 }[1:]) == 1 + oneTwoThree := []int { 1, 2, 3 } + fourFive := []int { 4, 5 } + assert len(oneTwoThree) == 3 + assert cap(fourFive[:]) == 2 + assert len(oneTwoThree[:2]) == 2 + assert cap(fourFive[1:]) == 1 } func test4() { diff --git a/src/test/resources/regressions/features/slices/slice-type-fail1.gobra b/src/test/resources/regressions/features/slices/slice-type-fail1.gobra index d7fddf71a..e7f551d12 100644 --- a/src/test/resources/regressions/features/slices/slice-type-fail1.gobra +++ b/src/test/resources/regressions/features/slices/slice-type-fail1.gobra @@ -7,4 +7,13 @@ package pkg //:: ExpectedOutput(type_error) requires s == t func foo(s []int, t []int) { +} + +// error: expected pure expression without permissions, but got []int { } +pure +decreases +func f() []int { + // pure functions may NOT contain slice literals + //:: ExpectedOutput(type_error) + return []int{} } \ No newline at end of file diff --git a/src/test/resources/regressions/issues/000129-2.gobra b/src/test/resources/regressions/issues/000129-2.gobra index 82b223a0c..56b874e62 100644 --- a/src/test/resources/regressions/issues/000129-2.gobra +++ b/src/test/resources/regressions/issues/000129-2.gobra @@ -4,7 +4,8 @@ package pkg func issue () { - assert []int{4: 20, 1: 10}[2] == 0 + s := []int{4: 20, 1: 10} + assert s[2] == 0 } func extra1() { diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index 7583beb60..7dfbcf8d9 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -2843,13 +2843,13 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert (frontend.wellDefExpr(expr)().valid) } - test("TypeChecker: should not let an array literal be classified as pure") { + test("TypeChecker: should classify an array literal containing only integer literals as pure") { val expr = PLiteral.array( PBoolType(), Vector(PIntLit(1), PIntLit(2)) ) - assert (!frontend.isPureExpr(expr)()) + assert (frontend.isPureExpr(expr)()) } test("TypeChecker: should not let a simple array literal be classified as ghost if its inner type isn't ghost") { From d84036f25d42f5d79a3cc56d2e886983ff963320 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 21 May 2024 13:59:30 +0200 Subject: [PATCH 283/296] implements first batch of CR suggestions by Joao --- src/main/antlr4/GobraParser.g4 | 4 +- .../viper/gobra/frontend/GobraParser.java | 4087 +++++++++-------- .../gobra/frontend/ParseTreeTranslator.scala | 8 +- .../viper/gobra/frontend/info/base/Type.scala | 7 +- .../implementation/typing/TypeTyping.scala | 2 +- .../typing/ghost/separation/GhostTyping.scala | 9 +- .../ghost_field/ghost-embedding-fail01.gobra | 56 + .../ghost-embedding-simple01.gobra | 49 + 8 files changed, 2173 insertions(+), 2049 deletions(-) create mode 100644 src/test/resources/regressions/features/ghost_field/ghost-embedding-fail01.gobra create mode 100644 src/test/resources/regressions/features/ghost_field/ghost-embedding-simple01.gobra diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 92c990ec4..2a082113a 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -157,10 +157,10 @@ ghostSliceType: GHOST L_BRACKET R_BRACKET elementType; ghostPointerType: GPOINTER L_BRACKET elementType R_BRACKET; -// copy of `fieldDecl` from GoParser.g4 extended with an optional `GHOST` modifier for fields: +// copy of `fieldDecl` from GoParser.g4 extended with an optional `GHOST` modifier for fields and embedded fields: fieldDecl: ( GHOST? identifierList type_ - | embeddedField + | GHOST? embeddedField ) tag = string_?; sqType: (kind=(SEQ | SET | MSET | OPT) L_BRACKET type_ R_BRACKET) diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index c6e617a80..1adecb560 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -3310,9 +3310,9 @@ public final FieldDeclContext fieldDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(762); + setState(765); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { case 1: { setState(756); @@ -3333,17 +3333,27 @@ public final FieldDeclContext fieldDecl() throws RecognitionException { break; case 2: { - setState(761); + setState(762); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==GHOST) { + { + setState(761); + match(GHOST); + } + } + + setState(764); embeddedField(); } break; } - setState(765); + setState(768); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { case 1: { - setState(764); + setState(767); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -3393,7 +3403,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterRule(_localctx, 98, RULE_sqType); int _la; try { - setState(778); + setState(781); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3403,7 +3413,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(767); + setState(770); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) { @@ -3414,11 +3424,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(768); + setState(771); match(L_BRACKET); - setState(769); + setState(772); type_(); - setState(770); + setState(773); match(R_BRACKET); } } @@ -3426,15 +3436,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(772); + setState(775); ((SqTypeContext)_localctx).kind = match(DICT); - setState(773); + setState(776); match(L_BRACKET); - setState(774); + setState(777); type_(); - setState(775); + setState(778); match(R_BRACKET); - setState(776); + setState(779); type_(); } break; @@ -3504,14 +3514,14 @@ public final SpecificationContext specification() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(792); + setState(795); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,38,_ctx); + _alt = getInterpreter().adaptivePredict(_input,39,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(787); + setState(790); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3519,27 +3529,27 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(780); + setState(783); specStatement(); } break; case OPAQUE: { - setState(781); + setState(784); match(OPAQUE); ((SpecificationContext)_localctx).opaque = true; } break; case PURE: { - setState(783); + setState(786); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(785); + setState(788); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3547,32 +3557,32 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(789); + setState(792); eos(); } } } - setState(794); + setState(797); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,38,_ctx); + _alt = getInterpreter().adaptivePredict(_input,39,_ctx); } - setState(797); + setState(800); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(795); + setState(798); match(PURE); ((SpecificationContext)_localctx).pure = true; } } - setState(800); + setState(803); _errHandler.sync(this); _la = _input.LA(1); if (_la==BACKEND) { { - setState(799); + setState(802); backendAnnotation(); } } @@ -3622,13 +3632,13 @@ public final BackendAnnotationEntryContext backendAnnotationEntry() throws Recog try { enterOuterAlt(_localctx, 1); { - setState(803); + setState(806); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(802); + setState(805); _la = _input.LA(1); if ( _la <= 0 || (((((_la - 106)) & ~0x3f) == 0 && ((1L << (_la - 106)) & 131L) != 0)) ) { _errHandler.recoverInline(this); @@ -3640,7 +3650,7 @@ public final BackendAnnotationEntryContext backendAnnotationEntry() throws Recog } } } - setState(805); + setState(808); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -576144092954625L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 137438953471L) != 0) ); @@ -3687,21 +3697,21 @@ public final ListOfValuesContext listOfValues() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(807); + setState(810); backendAnnotationEntry(); - setState(812); + setState(815); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(808); + setState(811); match(COMMA); - setState(809); + setState(812); backendAnnotationEntry(); } } - setState(814); + setState(817); _errHandler.sync(this); _la = _input.LA(1); } @@ -3746,21 +3756,21 @@ public final SingleBackendAnnotationContext singleBackendAnnotation() throws Rec try { enterOuterAlt(_localctx, 1); { - setState(815); + setState(818); backendAnnotationEntry(); - setState(816); + setState(819); match(L_PAREN); - setState(818); + setState(821); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -576144092954625L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 137438953471L) != 0)) { { - setState(817); + setState(820); listOfValues(); } } - setState(820); + setState(823); match(R_PAREN); } } @@ -3805,21 +3815,21 @@ public final BackendAnnotationListContext backendAnnotationList() throws Recogni try { enterOuterAlt(_localctx, 1); { - setState(822); + setState(825); singleBackendAnnotation(); - setState(827); + setState(830); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(823); + setState(826); match(COMMA); - setState(824); + setState(827); singleBackendAnnotation(); } } - setState(829); + setState(832); _errHandler.sync(this); _la = _input.LA(1); } @@ -3864,23 +3874,23 @@ public final BackendAnnotationContext backendAnnotation() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(830); + setState(833); match(BACKEND); - setState(831); + setState(834); match(L_BRACKET); - setState(833); + setState(836); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: { - setState(832); + setState(835); backendAnnotationList(); } break; } - setState(835); + setState(838); match(R_BRACKET); - setState(836); + setState(839); eos(); } } @@ -3923,42 +3933,42 @@ public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); enterRule(_localctx, 112, RULE_specStatement); try { - setState(846); + setState(849); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(838); + setState(841); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(839); + setState(842); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(840); + setState(843); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(841); + setState(844); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(842); + setState(845); ((SpecStatementContext)_localctx).kind = match(POST); - setState(843); + setState(846); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(844); + setState(847); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(845); + setState(848); terminationMeasure(); } break; @@ -4003,24 +4013,24 @@ public final TerminationMeasureContext terminationMeasure() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(849); + setState(852); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(848); + setState(851); expressionList(); } break; } - setState(853); + setState(856); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: { - setState(851); + setState(854); match(IF); - setState(852); + setState(855); expression(0); } break; @@ -4058,9 +4068,9 @@ public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); enterRule(_localctx, 116, RULE_assertion); try { - setState(857); + setState(860); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { @@ -4069,7 +4079,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(856); + setState(859); expression(0); } break; @@ -4118,27 +4128,27 @@ public final MatchStmtContext matchStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(859); + setState(862); match(MATCH); - setState(860); + setState(863); expression(0); - setState(861); + setState(864); match(L_CURLY); - setState(865); + setState(868); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(862); + setState(865); matchStmtClause(); } } - setState(867); + setState(870); _errHandler.sync(this); _la = _input.LA(1); } - setState(868); + setState(871); match(R_CURLY); } } @@ -4179,16 +4189,16 @@ public final MatchStmtClauseContext matchStmtClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(870); + setState(873); matchCase(); - setState(871); + setState(874); match(COLON); - setState(873); + setState(876); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(872); + setState(875); statementList(); } break; @@ -4228,22 +4238,22 @@ public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); enterRule(_localctx, 122, RULE_matchCase); try { - setState(878); + setState(881); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(875); + setState(878); match(CASE); - setState(876); + setState(879); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(877); + setState(880); match(DEFAULT); } break; @@ -4321,16 +4331,16 @@ public final MatchPatternContext matchPattern() throws RecognitionException { enterRule(_localctx, 124, RULE_matchPattern); int _la; try { - setState(893); + setState(896); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(880); + setState(883); match(QMARK); - setState(881); + setState(884); match(IDENTIFIER); } break; @@ -4338,23 +4348,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(882); + setState(885); literalType(); - setState(883); + setState(886); match(L_CURLY); - setState(888); + setState(891); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913343522074138L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(884); + setState(887); matchPatternList(); - setState(886); + setState(889); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(885); + setState(888); match(COMMA); } } @@ -4362,7 +4372,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(890); + setState(893); match(R_CURLY); } break; @@ -4370,7 +4380,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(892); + setState(895); expression(0); } break; @@ -4417,25 +4427,25 @@ public final MatchPatternListContext matchPatternList() throws RecognitionExcept int _alt; enterOuterAlt(_localctx, 1); { - setState(895); + setState(898); matchPattern(); - setState(900); + setState(903); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,56,_ctx); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(896); + setState(899); match(COMMA); - setState(897); + setState(900); matchPattern(); } } } - setState(902); + setState(905); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,56,_ctx); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); } } } @@ -4481,33 +4491,33 @@ public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() thro try { enterOuterAlt(_localctx, 1); { - setState(903); + setState(906); match(L_CURLY); - setState(908); + setState(911); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { - setState(904); + setState(907); match(SHARE); - setState(905); + setState(908); identifierList(); - setState(906); + setState(909); eos(); } break; } - setState(911); + setState(914); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { case 1: { - setState(910); + setState(913); statementList(); } break; } - setState(913); + setState(916); match(R_CURLY); } } @@ -4552,42 +4562,42 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(917); + setState(920); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: { - setState(915); + setState(918); qualifiedIdent(); } break; case 2: { - setState(916); + setState(919); match(IDENTIFIER); } break; } - setState(927); + setState(930); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: { - setState(919); + setState(922); match(L_CURLY); - setState(924); + setState(927); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(920); + setState(923); closureSpecParams(); - setState(922); + setState(925); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(921); + setState(924); match(COMMA); } } @@ -4595,7 +4605,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(926); + setState(929); match(R_CURLY); } break; @@ -4643,25 +4653,25 @@ public final ClosureSpecParamsContext closureSpecParams() throws RecognitionExce int _alt; enterOuterAlt(_localctx, 1); { - setState(929); + setState(932); closureSpecParam(); - setState(934); + setState(937); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,63,_ctx); + _alt = getInterpreter().adaptivePredict(_input,64,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(930); + setState(933); match(COMMA); - setState(931); + setState(934); closureSpecParam(); } } } - setState(936); + setState(939); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,63,_ctx); + _alt = getInterpreter().adaptivePredict(_input,64,_ctx); } } } @@ -4700,19 +4710,19 @@ public final ClosureSpecParamContext closureSpecParam() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(939); + setState(942); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { - setState(937); + setState(940); match(IDENTIFIER); - setState(938); + setState(941); match(COLON); } break; } - setState(941); + setState(944); expression(0); } } @@ -4757,15 +4767,15 @@ public final ClosureImplProofStmtContext closureImplProofStmt() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(943); + setState(946); match(PROOF); - setState(944); + setState(947); expression(0); - setState(945); + setState(948); match(IMPL); - setState(946); + setState(949); closureSpecInstance(); - setState(947); + setState(950); block(); } } @@ -4827,52 +4837,52 @@ public final ImplementationProofContext implementationProof() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(949); + setState(952); type_(); - setState(950); + setState(953); match(IMPL); - setState(951); + setState(954); type_(); - setState(970); + setState(973); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(952); + setState(955); match(L_CURLY); - setState(958); + setState(961); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(953); + setState(956); implementationProofPredicateAlias(); - setState(954); + setState(957); eos(); } } - setState(960); + setState(963); _errHandler.sync(this); _la = _input.LA(1); } - setState(966); + setState(969); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(961); + setState(964); methodImplementationProof(); - setState(962); + setState(965); eos(); } } - setState(968); + setState(971); _errHandler.sync(this); _la = _input.LA(1); } - setState(969); + setState(972); match(R_CURLY); } break; @@ -4921,28 +4931,28 @@ public final MethodImplementationProofContext methodImplementationProof() throws try { enterOuterAlt(_localctx, 1); { - setState(973); + setState(976); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(972); + setState(975); match(PURE); } } - setState(975); + setState(978); nonLocalReceiver(); - setState(976); + setState(979); match(IDENTIFIER); - setState(977); + setState(980); signature(); - setState(979); + setState(982); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(978); + setState(981); block(); } break; @@ -4987,31 +4997,31 @@ public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(981); + setState(984); match(L_PAREN); - setState(983); + setState(986); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: { - setState(982); + setState(985); match(IDENTIFIER); } break; } - setState(986); + setState(989); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(985); + setState(988); match(STAR); } } - setState(988); + setState(991); typeName(); - setState(989); + setState(992); match(R_PAREN); } } @@ -5051,24 +5061,24 @@ public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); enterRule(_localctx, 144, RULE_selection); try { - setState(996); + setState(999); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(991); + setState(994); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(992); + setState(995); type_(); - setState(993); + setState(996); match(DOT); - setState(994); + setState(997); match(IDENTIFIER); } break; @@ -5113,24 +5123,24 @@ public final ImplementationProofPredicateAliasContext implementationProofPredica try { enterOuterAlt(_localctx, 1); { - setState(998); + setState(1001); match(PRED); - setState(999); + setState(1002); match(IDENTIFIER); - setState(1000); - match(DECLARE_ASSIGN); setState(1003); + match(DECLARE_ASSIGN); + setState(1006); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: { - setState(1001); + setState(1004); selection(); } break; case 2: { - setState(1002); + setState(1005); operandName(); } break; @@ -5178,25 +5188,25 @@ public final MakeContext make() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1005); + setState(1008); match(MAKE); - setState(1006); + setState(1009); match(L_PAREN); - setState(1007); - type_(); setState(1010); + type_(); + setState(1013); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1008); + setState(1011); match(COMMA); - setState(1009); + setState(1012); expressionList(); } } - setState(1012); + setState(1015); match(R_PAREN); } } @@ -5236,13 +5246,13 @@ public final New_Context new_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1014); + setState(1017); match(NEW); - setState(1015); + setState(1018); match(L_PAREN); - setState(1016); + setState(1019); type_(); - setState(1017); + setState(1020); match(R_PAREN); } } @@ -5286,20 +5296,20 @@ public final SpecMemberContext specMember() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1019); - ((SpecMemberContext)_localctx).specification = specification(); setState(1022); + ((SpecMemberContext)_localctx).specification = specification(); + setState(1025); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: { - setState(1020); + setState(1023); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; case 2: { - setState(1021); + setState(1024); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; @@ -5351,19 +5361,19 @@ public final FunctionDeclContext functionDecl(boolean trusted,boolean pure,boole try { enterOuterAlt(_localctx, 1); { - setState(1024); + setState(1027); match(FUNC); - setState(1025); + setState(1028); match(IDENTIFIER); { - setState(1026); + setState(1029); signature(); - setState(1028); + setState(1031); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: { - setState(1027); + setState(1030); blockWithBodyParameterInfo(); } break; @@ -5419,21 +5429,21 @@ public final MethodDeclContext methodDecl(boolean trusted,boolean pure,boolean o try { enterOuterAlt(_localctx, 1); { - setState(1030); + setState(1033); match(FUNC); - setState(1031); + setState(1034); receiver(); - setState(1032); + setState(1035); match(IDENTIFIER); { - setState(1033); + setState(1036); signature(); - setState(1035); + setState(1038); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { - setState(1034); + setState(1037); blockWithBodyParameterInfo(); } break; @@ -5478,9 +5488,9 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(1037); - match(GHOST); setState(1040); + match(GHOST); + setState(1043); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -5493,7 +5503,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case BACKEND: case FUNC: { - setState(1038); + setState(1041); specMember(); } break; @@ -5501,7 +5511,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(1039); + setState(1042); declaration(); } break; @@ -5548,18 +5558,18 @@ public final FpredicateDeclContext fpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1042); + setState(1045); match(PRED); - setState(1043); + setState(1046); match(IDENTIFIER); - setState(1044); + setState(1047); parameters(); - setState(1046); + setState(1049); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: { - setState(1045); + setState(1048); predicateBody(); } break; @@ -5604,13 +5614,13 @@ public final PredicateBodyContext predicateBody() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1048); + setState(1051); match(L_CURLY); - setState(1049); + setState(1052); expression(0); - setState(1050); + setState(1053); eos(); - setState(1051); + setState(1054); match(R_CURLY); } } @@ -5655,20 +5665,20 @@ public final MpredicateDeclContext mpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1053); + setState(1056); match(PRED); - setState(1054); + setState(1057); receiver(); - setState(1055); + setState(1058); match(IDENTIFIER); - setState(1056); + setState(1059); parameters(); - setState(1058); + setState(1061); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { - setState(1057); + setState(1060); predicateBody(); } break; @@ -5715,9 +5725,9 @@ public final VarSpecContext varSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1060); + setState(1063); maybeAddressableIdentifierList(); - setState(1068); + setState(1071); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5741,16 +5751,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(1061); - type_(); setState(1064); + type_(); + setState(1067); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { case 1: { - setState(1062); + setState(1065); match(ASSIGN); - setState(1063); + setState(1066); expressionList(); } break; @@ -5759,9 +5769,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(1066); + setState(1069); match(ASSIGN); - setState(1067); + setState(1070); expressionList(); } break; @@ -5807,11 +5817,11 @@ public final ShortVarDeclContext shortVarDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1070); + setState(1073); maybeAddressableIdentifierList(); - setState(1071); + setState(1074); match(DECLARE_ASSIGN); - setState(1072); + setState(1075); expressionList(); } } @@ -5855,31 +5865,31 @@ public final ReceiverContext receiver() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1074); + setState(1077); match(L_PAREN); - setState(1076); + setState(1079); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: { - setState(1075); + setState(1078); maybeAddressableIdentifier(); } break; } - setState(1078); + setState(1081); type_(); - setState(1080); + setState(1083); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1079); + setState(1082); match(COMMA); } } - setState(1082); + setState(1085); match(R_PAREN); } } @@ -5917,20 +5927,20 @@ public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); enterRule(_localctx, 172, RULE_parameterDecl); try { - setState(1086); + setState(1089); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1084); + setState(1087); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1085); + setState(1088); ghostParameterDecl(); } break; @@ -5972,17 +5982,17 @@ public final ActualParameterDeclContext actualParameterDecl() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(1089); + setState(1092); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: { - setState(1088); + setState(1091); identifierList(); } break; } - setState(1091); + setState(1094); parameterType(); } } @@ -6023,19 +6033,19 @@ public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1093); + setState(1096); match(GHOST); - setState(1095); + setState(1098); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { case 1: { - setState(1094); + setState(1097); identifierList(); } break; } - setState(1097); + setState(1100); parameterType(); } } @@ -6074,17 +6084,17 @@ public final ParameterTypeContext parameterType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1100); + setState(1103); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1099); + setState(1102); match(ELLIPSIS); } } - setState(1102); + setState(1105); type_(); } } @@ -6406,16 +6416,16 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1125); + setState(1128); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { _localctx = new UnaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1105); + setState(1108); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 127L) != 0)) ) { @@ -6426,7 +6436,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1106); + setState(1109); expression(15); } break; @@ -6435,7 +6445,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1107); + setState(1110); primaryExpr(0); } break; @@ -6444,13 +6454,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1108); + setState(1111); match(UNFOLDING); - setState(1109); + setState(1112); predicateAccess(); - setState(1110); + setState(1113); match(IN); - setState(1111); + setState(1114); expression(3); } break; @@ -6459,13 +6469,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1113); + setState(1116); match(LET); - setState(1114); + setState(1117); shortVarDecl(); - setState(1115); + setState(1118); match(IN); - setState(1116); + setState(1119); expression(2); } break; @@ -6474,7 +6484,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1118); + setState(1121); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -6484,38 +6494,38 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1119); + setState(1122); boundVariables(); - setState(1120); + setState(1123); match(COLON); - setState(1121); + setState(1124); match(COLON); - setState(1122); + setState(1125); triggers(); - setState(1123); + setState(1126); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1162); + setState(1165); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,91,_ctx); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1160); + setState(1163); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1127); + setState(1130); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1128); + setState(1131); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & 1567L) != 0)) ) { @@ -6526,7 +6536,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1129); + setState(1132); expression(14); } break; @@ -6534,9 +6544,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1130); + setState(1133); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1131); + setState(1134); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); if ( !(_la==WAND || ((((_la - 117)) & ~0x3f) == 0 && ((1L << (_la - 117)) & 3674113L) != 0)) ) { @@ -6547,7 +6557,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1132); + setState(1135); expression(13); } break; @@ -6555,9 +6565,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1133); + setState(1136); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1134); + setState(1137); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { @@ -6568,7 +6578,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1135); + setState(1138); expression(12); } break; @@ -6576,9 +6586,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1136); + setState(1139); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1137); + setState(1140); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { @@ -6589,7 +6599,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1138); + setState(1141); expression(11); } break; @@ -6597,9 +6607,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1139); + setState(1142); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1140); + setState(1143); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 70931694131085315L) != 0)) ) { @@ -6610,7 +6620,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1141); + setState(1144); expression(10); } break; @@ -6618,11 +6628,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1142); + setState(1145); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1143); + setState(1146); match(LOGICAL_AND); - setState(1144); + setState(1147); expression(8); } break; @@ -6630,11 +6640,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1145); + setState(1148); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1146); + setState(1149); match(LOGICAL_OR); - setState(1147); + setState(1150); expression(7); } break; @@ -6642,11 +6652,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1148); + setState(1151); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1149); + setState(1152); match(IMPLIES); - setState(1150); + setState(1153); expression(5); } break; @@ -6654,15 +6664,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1151); + setState(1154); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1152); + setState(1155); match(QMARK); - setState(1153); + setState(1156); expression(0); - setState(1154); + setState(1157); match(COLON); - setState(1155); + setState(1158); expression(4); } break; @@ -6670,20 +6680,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1157); + setState(1160); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1158); + setState(1161); match(IMPL); - setState(1159); + setState(1162); closureSpecInstance(); } break; } } } - setState(1164); + setState(1167); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,91,_ctx); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); } } } @@ -6775,146 +6785,146 @@ public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 182, RULE_statement); try { - setState(1185); + setState(1188); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,92,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1165); + setState(1168); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1166); + setState(1169); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1167); + setState(1170); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1168); + setState(1171); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1169); + setState(1172); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1170); + setState(1173); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1171); + setState(1174); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1172); + setState(1175); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1173); + setState(1176); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1174); + setState(1177); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1175); + setState(1178); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1176); + setState(1179); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1177); + setState(1180); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1178); + setState(1181); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1179); + setState(1182); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1180); + setState(1183); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1181); + setState(1184); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1182); + setState(1185); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1183); + setState(1186); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1184); + setState(1187); closureImplProofStmt(); } break; @@ -6954,9 +6964,9 @@ public final ApplyStmtContext applyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1187); + setState(1190); match(APPLY); - setState(1188); + setState(1191); expression(0); } } @@ -6997,16 +7007,16 @@ public final PackageStmtContext packageStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1190); + setState(1193); match(PACKAGE); - setState(1191); + setState(1194); expression(0); - setState(1193); + setState(1196); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { case 1: { - setState(1192); + setState(1195); block(); } break; @@ -7049,9 +7059,9 @@ public final SpecForStmtContext specForStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1195); + setState(1198); loopSpec(); - setState(1196); + setState(1199); forStmt(); } } @@ -7106,34 +7116,34 @@ public final LoopSpecContext loopSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1204); + setState(1207); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1198); + setState(1201); match(INV); - setState(1199); + setState(1202); expression(0); - setState(1200); + setState(1203); eos(); } } - setState(1206); + setState(1209); _errHandler.sync(this); _la = _input.LA(1); } - setState(1211); + setState(1214); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1207); + setState(1210); match(DEC); - setState(1208); + setState(1211); terminationMeasure(); - setState(1209); + setState(1212); eos(); } } @@ -7179,24 +7189,24 @@ public final DeferStmtContext deferStmt() throws RecognitionException { enterRule(_localctx, 192, RULE_deferStmt); int _la; try { - setState(1218); + setState(1221); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1213); + setState(1216); match(DEFER); - setState(1214); + setState(1217); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1215); + setState(1218); match(DEFER); - setState(1216); + setState(1219); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -7207,7 +7217,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1217); + setState(1220); predicateAccess(); } break; @@ -7253,62 +7263,62 @@ public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); enterRule(_localctx, 194, RULE_basicLit); try { - setState(1228); + setState(1231); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1220); + setState(1223); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1221); + setState(1224); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1222); + setState(1225); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1223); + setState(1226); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1224); + setState(1227); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1225); + setState(1228); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1226); + setState(1229); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1227); + setState(1230); match(RUNE_LIT); } break; @@ -7584,16 +7594,16 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1246); + setState(1249); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: { _localctx = new OperandPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1231); + setState(1234); operand(); } break; @@ -7602,7 +7612,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1232); + setState(1235); conversion(); } break; @@ -7611,7 +7621,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1233); + setState(1236); methodExpr(); } break; @@ -7620,7 +7630,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1234); + setState(1237); ghostPrimaryExpr(); } break; @@ -7629,7 +7639,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1235); + setState(1238); new_(); } break; @@ -7638,7 +7648,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1236); + setState(1239); make(); } break; @@ -7647,11 +7657,11 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new RevealInvokePrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1237); + setState(1240); match(REVEAL); - setState(1238); + setState(1241); primaryExpr(0); - setState(1239); + setState(1242); arguments(); } break; @@ -7660,7 +7670,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1241); + setState(1244); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 46)) & ~0x3f) == 0 && ((1L << (_la - 46)) & 2251799813685321L) != 0)) ) { @@ -7671,36 +7681,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1242); + setState(1245); match(L_PAREN); - setState(1243); + setState(1246); expression(0); - setState(1244); + setState(1247); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1270); + setState(1273); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,100,_ctx); + _alt = getInterpreter().adaptivePredict(_input,101,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1268); + setState(1271); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,100,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1248); + setState(1251); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1249); + setState(1252); match(DOT); - setState(1250); + setState(1253); match(IDENTIFIER); } break; @@ -7708,9 +7718,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1251); + setState(1254); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1252); + setState(1255); index(); } break; @@ -7718,9 +7728,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1253); + setState(1256); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1254); + setState(1257); slice_(); } break; @@ -7728,9 +7738,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1255); + setState(1258); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1256); + setState(1259); seqUpdExp(); } break; @@ -7738,9 +7748,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1257); + setState(1260); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1258); + setState(1261); typeAssertion(); } break; @@ -7748,9 +7758,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1259); + setState(1262); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1260); + setState(1263); arguments(); } break; @@ -7758,13 +7768,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1261); + setState(1264); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1262); + setState(1265); arguments(); - setState(1263); + setState(1266); match(AS); - setState(1264); + setState(1267); closureSpecInstance(); } break; @@ -7772,18 +7782,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1266); + setState(1269); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1267); + setState(1270); predConstructArgs(); } break; } } } - setState(1272); + setState(1275); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,100,_ctx); + _alt = getInterpreter().adaptivePredict(_input,101,_ctx); } } } @@ -7824,9 +7834,9 @@ public final FunctionLitContext functionLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1273); + setState(1276); ((FunctionLitContext)_localctx).specification = specification(); - setState(1274); + setState(1277); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7874,27 +7884,27 @@ public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws try { enterOuterAlt(_localctx, 1); { - setState(1276); + setState(1279); match(FUNC); - setState(1278); + setState(1281); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1277); + setState(1280); match(IDENTIFIER); } } { - setState(1280); + setState(1283); signature(); - setState(1282); + setState(1285); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { case 1: { - setState(1281); + setState(1284); blockWithBodyParameterInfo(); } break; @@ -7939,29 +7949,29 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1284); + setState(1287); match(L_PRED); - setState(1286); + setState(1289); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1285); + setState(1288); expressionList(); } } - setState(1289); + setState(1292); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1288); + setState(1291); match(COMMA); } } - setState(1291); + setState(1294); match(R_PRED); } } @@ -8023,47 +8033,47 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1293); + setState(1296); match(INTERFACE); - setState(1294); + setState(1297); match(L_CURLY); - setState(1304); + setState(1307); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 144115188210101760L) != 0) || ((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & 137438954753L) != 0)) { { { - setState(1298); + setState(1301); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,105,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: { - setState(1295); + setState(1298); methodSpec(); } break; case 2: { - setState(1296); + setState(1299); typeName(); } break; case 3: { - setState(1297); + setState(1300); predicateSpec(); } break; } - setState(1300); + setState(1303); eos(); } } - setState(1306); + setState(1309); _errHandler.sync(this); _la = _input.LA(1); } - setState(1307); + setState(1310); match(R_CURLY); } } @@ -8102,11 +8112,11 @@ public final PredicateSpecContext predicateSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1309); + setState(1312); match(PRED); - setState(1310); + setState(1313); match(IDENTIFIER); - setState(1311); + setState(1314); parameters(); } } @@ -8150,50 +8160,50 @@ public final MethodSpecContext methodSpec() throws RecognitionException { enterRule(_localctx, 208, RULE_methodSpec); int _la; try { - setState(1328); + setState(1331); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,110,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1314); + setState(1317); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1313); + setState(1316); match(GHOST); } } - setState(1316); + setState(1319); specification(); - setState(1317); + setState(1320); match(IDENTIFIER); - setState(1318); + setState(1321); parameters(); - setState(1319); + setState(1322); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1322); + setState(1325); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1321); + setState(1324); match(GHOST); } } - setState(1324); + setState(1327); specification(); - setState(1325); + setState(1328); match(IDENTIFIER); - setState(1326); + setState(1329); parameters(); } break; @@ -8241,13 +8251,13 @@ public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); enterRule(_localctx, 210, RULE_type_); try { - setState(1337); + setState(1340); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1330); + setState(1333); typeName(); } break; @@ -8262,7 +8272,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1331); + setState(1334); typeLit(); } break; @@ -8277,18 +8287,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1332); + setState(1335); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1333); + setState(1336); match(L_PAREN); - setState(1334); + setState(1337); type_(); - setState(1335); + setState(1338); match(R_PAREN); } break; @@ -8351,69 +8361,69 @@ public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); enterRule(_localctx, 212, RULE_typeLit); try { - setState(1348); + setState(1351); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,111,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1339); + setState(1342); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1340); + setState(1343); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1341); + setState(1344); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1342); + setState(1345); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1343); + setState(1346); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1344); + setState(1347); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1345); + setState(1348); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1346); + setState(1349); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1347); + setState(1350); predType(); } break; @@ -8453,9 +8463,9 @@ public final PredTypeContext predType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1350); + setState(1353); match(PRED); - setState(1351); + setState(1354); predTypeParams(); } } @@ -8503,39 +8513,39 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1353); + setState(1356); match(L_PAREN); - setState(1365); + setState(1368); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441151881345761731L) != 0)) { { - setState(1354); + setState(1357); type_(); - setState(1359); + setState(1362); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,112,_ctx); + _alt = getInterpreter().adaptivePredict(_input,113,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1355); + setState(1358); match(COMMA); - setState(1356); + setState(1359); type_(); } } } - setState(1361); + setState(1364); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,112,_ctx); + _alt = getInterpreter().adaptivePredict(_input,113,_ctx); } - setState(1363); + setState(1366); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1362); + setState(1365); match(COMMA); } } @@ -8543,7 +8553,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1367); + setState(1370); match(R_PAREN); } } @@ -8596,55 +8606,55 @@ public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); enterRule(_localctx, 218, RULE_literalType); try { - setState(1376); + setState(1379); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1369); + setState(1372); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1370); + setState(1373); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1371); + setState(1374); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1372); + setState(1375); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1373); + setState(1376); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1374); + setState(1377); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1375); + setState(1378); typeName(); } break; @@ -8686,13 +8696,13 @@ public final ImplicitArrayContext implicitArray() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1378); + setState(1381); match(L_BRACKET); - setState(1379); + setState(1382); match(ELLIPSIS); - setState(1380); + setState(1383); match(R_BRACKET); - setState(1381); + setState(1384); elementType(); } } @@ -8742,31 +8752,31 @@ public final Slice_Context slice_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1383); + setState(1386); match(L_BRACKET); - setState(1399); + setState(1402); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { case 1: { - setState(1385); + setState(1388); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1384); + setState(1387); low(); } } - setState(1387); + setState(1390); match(COLON); - setState(1389); + setState(1392); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1388); + setState(1391); high(); } } @@ -8775,28 +8785,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1392); + setState(1395); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1391); + setState(1394); low(); } } - setState(1394); + setState(1397); match(COLON); - setState(1395); + setState(1398); high(); - setState(1396); + setState(1399); match(COLON); - setState(1397); + setState(1400); cap(); } break; } - setState(1401); + setState(1404); match(R_BRACKET); } } @@ -8833,7 +8843,7 @@ public final LowContext low() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1403); + setState(1406); expression(0); } } @@ -8870,7 +8880,7 @@ public final HighContext high() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1405); + setState(1408); expression(0); } } @@ -8907,7 +8917,7 @@ public final CapContext cap() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1407); + setState(1410); expression(0); } } @@ -8955,12 +8965,12 @@ public final Assign_opContext assign_op() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1410); + setState(1413); _errHandler.sync(this); _la = _input.LA(1); if (((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & 4031L) != 0)) { { - setState(1409); + setState(1412); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & 4031L) != 0)) ) { @@ -8974,7 +8984,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1412); + setState(1415); match(ASSIGN); } } @@ -9023,43 +9033,43 @@ public final RangeClauseContext rangeClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1420); + setState(1423); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) { case 1: { - setState(1414); + setState(1417); expressionList(); - setState(1415); + setState(1418); match(ASSIGN); } break; case 2: { - setState(1417); + setState(1420); maybeAddressableIdentifierList(); - setState(1418); + setState(1421); match(DECLARE_ASSIGN); } break; } - setState(1422); + setState(1425); match(RANGE); - setState(1423); + setState(1426); expression(0); - setState(1428); + setState(1431); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1424); + setState(1427); match(WITH); - setState(1426); + setState(1429); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1425); + setState(1428); match(IDENTIFIER); } } @@ -9102,9 +9112,9 @@ public final PackageClauseContext packageClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1430); + setState(1433); match(PACKAGE); - setState(1431); + setState(1434); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -9141,7 +9151,7 @@ public final ImportPathContext importPath() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1433); + setState(1436); string_(); } } @@ -9182,27 +9192,27 @@ public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); enterRule(_localctx, 238, RULE_declaration); try { - setState(1438); + setState(1441); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1435); + setState(1438); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1436); + setState(1439); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1437); + setState(1440); varDecl(); } break; @@ -9256,38 +9266,38 @@ public final ConstDeclContext constDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1440); + setState(1443); match(CONST); - setState(1452); + setState(1455); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1441); + setState(1444); constSpec(); } break; case L_PAREN: { - setState(1442); + setState(1445); match(L_PAREN); - setState(1448); + setState(1451); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1443); + setState(1446); constSpec(); - setState(1444); + setState(1447); eos(); } } - setState(1450); + setState(1453); _errHandler.sync(this); _la = _input.LA(1); } - setState(1451); + setState(1454); match(R_PAREN); } break; @@ -9337,26 +9347,26 @@ public final ConstSpecContext constSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1454); + setState(1457); identifierList(); - setState(1460); + setState(1463); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: { - setState(1456); + setState(1459); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441151881345761731L) != 0)) { { - setState(1455); + setState(1458); type_(); } } - setState(1458); + setState(1461); match(ASSIGN); - setState(1459); + setState(1462); expressionList(); } break; @@ -9402,25 +9412,25 @@ public final IdentifierListContext identifierList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1462); + setState(1465); match(IDENTIFIER); - setState(1467); + setState(1470); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,129,_ctx); + _alt = getInterpreter().adaptivePredict(_input,130,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1463); + setState(1466); match(COMMA); - setState(1464); + setState(1467); match(IDENTIFIER); } } } - setState(1469); + setState(1472); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,129,_ctx); + _alt = getInterpreter().adaptivePredict(_input,130,_ctx); } } } @@ -9465,25 +9475,25 @@ public final ExpressionListContext expressionList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1470); + setState(1473); expression(0); - setState(1475); + setState(1478); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,130,_ctx); + _alt = getInterpreter().adaptivePredict(_input,131,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1471); + setState(1474); match(COMMA); - setState(1472); + setState(1475); expression(0); } } } - setState(1477); + setState(1480); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,130,_ctx); + _alt = getInterpreter().adaptivePredict(_input,131,_ctx); } } } @@ -9533,38 +9543,38 @@ public final TypeDeclContext typeDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1478); + setState(1481); match(TYPE); - setState(1490); + setState(1493); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1479); + setState(1482); typeSpec(); } break; case L_PAREN: { - setState(1480); + setState(1483); match(L_PAREN); - setState(1486); + setState(1489); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1481); + setState(1484); typeSpec(); - setState(1482); + setState(1485); eos(); } } - setState(1488); + setState(1491); _errHandler.sync(this); _la = _input.LA(1); } - setState(1489); + setState(1492); match(R_PAREN); } break; @@ -9609,19 +9619,19 @@ public final TypeSpecContext typeSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1492); + setState(1495); match(IDENTIFIER); - setState(1494); + setState(1497); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1493); + setState(1496); match(ASSIGN); } } - setState(1496); + setState(1499); type_(); } } @@ -9671,38 +9681,38 @@ public final VarDeclContext varDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1498); + setState(1501); match(VAR); - setState(1510); + setState(1513); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1499); + setState(1502); varSpec(); } break; case L_PAREN: { - setState(1500); + setState(1503); match(L_PAREN); - setState(1506); + setState(1509); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1501); + setState(1504); varSpec(); - setState(1502); + setState(1505); eos(); } } - setState(1508); + setState(1511); _errHandler.sync(this); _la = _input.LA(1); } - setState(1509); + setState(1512); match(R_PAREN); } break; @@ -9746,19 +9756,19 @@ public final BlockContext block() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1512); + setState(1515); match(L_CURLY); - setState(1514); + setState(1517); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { case 1: { - setState(1513); + setState(1516); statementList(); } break; } - setState(1516); + setState(1519); match(R_CURLY); } } @@ -9814,7 +9824,7 @@ public final StatementListContext statementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1530); + setState(1533); _errHandler.sync(this); _alt = 1; do { @@ -9822,17 +9832,17 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1525); + setState(1528); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { case 1: { - setState(1519); + setState(1522); _errHandler.sync(this); _la = _input.LA(1); if (_la==SEMI) { { - setState(1518); + setState(1521); match(SEMI); } } @@ -9841,12 +9851,12 @@ public final StatementListContext statementList() throws RecognitionException { break; case 2: { - setState(1522); + setState(1525); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOS) { { - setState(1521); + setState(1524); match(EOS); } } @@ -9855,14 +9865,14 @@ public final StatementListContext statementList() throws RecognitionException { break; case 3: { - setState(1524); + setState(1527); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; } - setState(1527); + setState(1530); statement(); - setState(1528); + setState(1531); eos(); } } @@ -9870,9 +9880,9 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1532); + setState(1535); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,140,_ctx); + _alt = getInterpreter().adaptivePredict(_input,141,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -9919,41 +9929,41 @@ public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); enterRule(_localctx, 258, RULE_simpleStmt); try { - setState(1539); + setState(1542); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1534); + setState(1537); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1535); + setState(1538); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1536); + setState(1539); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1537); + setState(1540); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1538); + setState(1541); shortVarDecl(); } break; @@ -9992,7 +10002,7 @@ public final ExpressionStmtContext expressionStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1541); + setState(1544); expression(0); } } @@ -10034,11 +10044,11 @@ public final SendStmtContext sendStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1543); + setState(1546); ((SendStmtContext)_localctx).channel = expression(0); - setState(1544); + setState(1547); match(RECEIVE); - setState(1545); + setState(1548); expression(0); } } @@ -10078,9 +10088,9 @@ public final IncDecStmtContext incDecStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1547); + setState(1550); expression(0); - setState(1548); + setState(1551); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -10131,11 +10141,11 @@ public final AssignmentContext assignment() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1550); + setState(1553); expressionList(); - setState(1551); + setState(1554); assign_op(); - setState(1552); + setState(1555); expressionList(); } } @@ -10172,7 +10182,7 @@ public final EmptyStmtContext emptyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1554); + setState(1557); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -10219,16 +10229,16 @@ public final LabeledStmtContext labeledStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1556); + setState(1559); match(IDENTIFIER); - setState(1557); + setState(1560); match(COLON); - setState(1559); + setState(1562); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: { - setState(1558); + setState(1561); statement(); } break; @@ -10269,14 +10279,14 @@ public final ReturnStmtContext returnStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1561); + setState(1564); match(RETURN); - setState(1563); + setState(1566); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { case 1: { - setState(1562); + setState(1565); expressionList(); } break; @@ -10315,14 +10325,14 @@ public final BreakStmtContext breakStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1565); + setState(1568); match(BREAK); - setState(1567); + setState(1570); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1566); + setState(1569); match(IDENTIFIER); } break; @@ -10361,14 +10371,14 @@ public final ContinueStmtContext continueStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1569); + setState(1572); match(CONTINUE); - setState(1571); + setState(1574); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1570); + setState(1573); match(IDENTIFIER); } break; @@ -10407,9 +10417,9 @@ public final GotoStmtContext gotoStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1573); + setState(1576); match(GOTO); - setState(1574); + setState(1577); match(IDENTIFIER); } } @@ -10444,7 +10454,7 @@ public final FallthroughStmtContext fallthroughStmt() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1576); + setState(1579); match(FALLTHROUGH); } } @@ -10498,57 +10508,57 @@ public final IfStmtContext ifStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1578); + setState(1581); match(IF); - setState(1587); + setState(1590); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { case 1: { - setState(1579); + setState(1582); expression(0); } break; case 2: { - setState(1580); + setState(1583); eos(); - setState(1581); + setState(1584); expression(0); } break; case 3: { - setState(1583); + setState(1586); simpleStmt(); - setState(1584); + setState(1587); eos(); - setState(1585); + setState(1588); expression(0); } break; } - setState(1589); + setState(1592); block(); - setState(1595); + setState(1598); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { case 1: { - setState(1590); - match(ELSE); setState(1593); + match(ELSE); + setState(1596); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1591); + setState(1594); ifStmt(); } break; case L_CURLY: { - setState(1592); + setState(1595); block(); } break; @@ -10594,20 +10604,20 @@ public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); enterRule(_localctx, 284, RULE_switchStmt); try { - setState(1599); + setState(1602); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1597); + setState(1600); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1598); + setState(1601); typeSwitchStmt(); } break; @@ -10662,19 +10672,19 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1601); + setState(1604); match(SWITCH); - setState(1612); + setState(1615); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,154,_ctx) ) { case 1: { - setState(1603); + setState(1606); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1602); + setState(1605); expression(0); } } @@ -10683,24 +10693,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1606); + setState(1609); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { case 1: { - setState(1605); + setState(1608); simpleStmt(); } break; } - setState(1608); + setState(1611); eos(); - setState(1610); + setState(1613); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1609); + setState(1612); expression(0); } } @@ -10708,23 +10718,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1614); + setState(1617); match(L_CURLY); - setState(1618); + setState(1621); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1615); + setState(1618); exprCaseClause(); } } - setState(1620); + setState(1623); _errHandler.sync(this); _la = _input.LA(1); } - setState(1621); + setState(1624); match(R_CURLY); } } @@ -10765,16 +10775,16 @@ public final ExprCaseClauseContext exprCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1623); + setState(1626); exprSwitchCase(); - setState(1624); + setState(1627); match(COLON); - setState(1626); + setState(1629); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { case 1: { - setState(1625); + setState(1628); statementList(); } break; @@ -10814,22 +10824,22 @@ public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 290, RULE_exprSwitchCase); try { - setState(1631); + setState(1634); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1628); + setState(1631); match(CASE); - setState(1629); + setState(1632); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1630); + setState(1633); match(DEFAULT); } break; @@ -10886,53 +10896,53 @@ public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1633); + setState(1636); match(SWITCH); - setState(1642); + setState(1645); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { case 1: { - setState(1634); + setState(1637); typeSwitchGuard(); } break; case 2: { - setState(1635); + setState(1638); eos(); - setState(1636); + setState(1639); typeSwitchGuard(); } break; case 3: { - setState(1638); + setState(1641); simpleStmt(); - setState(1639); + setState(1642); eos(); - setState(1640); + setState(1643); typeSwitchGuard(); } break; } - setState(1644); + setState(1647); match(L_CURLY); - setState(1648); + setState(1651); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1645); + setState(1648); typeCaseClause(); } } - setState(1650); + setState(1653); _errHandler.sync(this); _la = _input.LA(1); } - setState(1651); + setState(1654); match(R_CURLY); } } @@ -10975,27 +10985,27 @@ public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1655); + setState(1658); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: { - setState(1653); + setState(1656); match(IDENTIFIER); - setState(1654); + setState(1657); match(DECLARE_ASSIGN); } break; } - setState(1657); + setState(1660); primaryExpr(0); - setState(1658); + setState(1661); match(DOT); - setState(1659); + setState(1662); match(L_PAREN); - setState(1660); + setState(1663); match(TYPE); - setState(1661); + setState(1664); match(R_PAREN); } } @@ -11036,16 +11046,16 @@ public final TypeCaseClauseContext typeCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1663); + setState(1666); typeSwitchCase(); - setState(1664); + setState(1667); match(COLON); - setState(1666); + setState(1669); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { case 1: { - setState(1665); + setState(1668); statementList(); } break; @@ -11085,22 +11095,22 @@ public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 298, RULE_typeSwitchCase); try { - setState(1671); + setState(1674); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1668); + setState(1671); match(CASE); - setState(1669); + setState(1672); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1670); + setState(1673); match(DEFAULT); } break; @@ -11153,7 +11163,7 @@ public final TypeListContext typeList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1675); + setState(1678); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -11177,28 +11187,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1673); + setState(1676); type_(); } break; case NIL_LIT: { - setState(1674); + setState(1677); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1684); + setState(1687); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1677); - match(COMMA); setState(1680); + match(COMMA); + setState(1683); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -11222,13 +11232,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1678); + setState(1681); type_(); } break; case NIL_LIT: { - setState(1679); + setState(1682); match(NIL_LIT); } break; @@ -11237,7 +11247,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1686); + setState(1689); _errHandler.sync(this); _la = _input.LA(1); } @@ -11283,25 +11293,25 @@ public final SelectStmtContext selectStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1687); + setState(1690); match(SELECT); - setState(1688); + setState(1691); match(L_CURLY); - setState(1692); + setState(1695); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1689); + setState(1692); commClause(); } } - setState(1694); + setState(1697); _errHandler.sync(this); _la = _input.LA(1); } - setState(1695); + setState(1698); match(R_CURLY); } } @@ -11342,16 +11352,16 @@ public final CommClauseContext commClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1697); + setState(1700); commCase(); - setState(1698); + setState(1701); match(COLON); - setState(1700); + setState(1703); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { case 1: { - setState(1699); + setState(1702); statementList(); } break; @@ -11394,26 +11404,26 @@ public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); enterRule(_localctx, 306, RULE_commCase); try { - setState(1708); + setState(1711); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1702); - match(CASE); setState(1705); + match(CASE); + setState(1708); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { case 1: { - setState(1703); + setState(1706); sendStmt(); } break; case 2: { - setState(1704); + setState(1707); recvStmt(); } break; @@ -11423,7 +11433,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1707); + setState(1710); match(DEFAULT); } break; @@ -11473,27 +11483,27 @@ public final RecvStmtContext recvStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1716); + setState(1719); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { case 1: { - setState(1710); + setState(1713); expressionList(); - setState(1711); + setState(1714); match(ASSIGN); } break; case 2: { - setState(1713); + setState(1716); identifierList(); - setState(1714); + setState(1717); match(DECLARE_ASSIGN); } break; } - setState(1718); + setState(1721); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -11541,19 +11551,19 @@ public final ForStmtContext forStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1720); + setState(1723); match(FOR); - setState(1728); + setState(1731); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) { case 1: { - setState(1722); + setState(1725); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1721); + setState(1724); expression(0); } } @@ -11562,18 +11572,18 @@ public final ForStmtContext forStmt() throws RecognitionException { break; case 2: { - setState(1724); + setState(1727); forClause(); } break; case 3: { - setState(1726); + setState(1729); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1725); + setState(1728); rangeClause(); } } @@ -11581,7 +11591,7 @@ public final ForStmtContext forStmt() throws RecognitionException { } break; } - setState(1730); + setState(1733); block(); } } @@ -11633,36 +11643,36 @@ public final ForClauseContext forClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1733); + setState(1736); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { case 1: { - setState(1732); + setState(1735); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1735); + setState(1738); eos(); - setState(1737); + setState(1740); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,175,_ctx) ) { case 1: { - setState(1736); + setState(1739); expression(0); } break; } - setState(1739); + setState(1742); eos(); - setState(1741); + setState(1744); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1740); + setState(1743); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -11703,9 +11713,9 @@ public final GoStmtContext goStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1743); + setState(1746); match(GO); - setState(1744); + setState(1747); expression(0); } } @@ -11741,20 +11751,20 @@ public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); enterRule(_localctx, 316, RULE_typeName); try { - setState(1748); + setState(1751); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,177,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1746); + setState(1749); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1747); + setState(1750); match(IDENTIFIER); } break; @@ -11798,13 +11808,13 @@ public final ArrayTypeContext arrayType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1750); + setState(1753); match(L_BRACKET); - setState(1751); + setState(1754); arrayLength(); - setState(1752); + setState(1755); match(R_BRACKET); - setState(1753); + setState(1756); elementType(); } } @@ -11841,7 +11851,7 @@ public final ArrayLengthContext arrayLength() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1755); + setState(1758); expression(0); } } @@ -11878,7 +11888,7 @@ public final ElementTypeContext elementType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1757); + setState(1760); type_(); } } @@ -11916,9 +11926,9 @@ public final PointerTypeContext pointerType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1759); + setState(1762); match(STAR); - setState(1760); + setState(1763); type_(); } } @@ -11957,11 +11967,11 @@ public final SliceTypeContext sliceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1762); + setState(1765); match(L_BRACKET); - setState(1763); + setState(1766); match(R_BRACKET); - setState(1764); + setState(1767); elementType(); } } @@ -12004,15 +12014,15 @@ public final MapTypeContext mapType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1766); + setState(1769); match(MAP); - setState(1767); + setState(1770); match(L_BRACKET); - setState(1768); + setState(1771); type_(); - setState(1769); + setState(1772); match(R_BRACKET); - setState(1770); + setState(1773); elementType(); } } @@ -12051,33 +12061,33 @@ public final ChannelTypeContext channelType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1777); + setState(1780); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,177,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { case 1: { - setState(1772); + setState(1775); match(CHAN); } break; case 2: { - setState(1773); + setState(1776); match(CHAN); - setState(1774); + setState(1777); match(RECEIVE); } break; case 3: { - setState(1775); + setState(1778); match(RECEIVE); - setState(1776); + setState(1779); match(CHAN); } break; } - setState(1779); + setState(1782); elementType(); } } @@ -12115,9 +12125,9 @@ public final FunctionTypeContext functionType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1781); + setState(1784); match(FUNC); - setState(1782); + setState(1785); signature(); } } @@ -12155,22 +12165,22 @@ public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); enterRule(_localctx, 334, RULE_signature); try { - setState(1788); + setState(1791); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1784); + setState(1787); parameters(); - setState(1785); + setState(1788); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1787); + setState(1790); parameters(); } break; @@ -12210,20 +12220,20 @@ public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); enterRule(_localctx, 336, RULE_result); try { - setState(1792); + setState(1795); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,180,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1790); + setState(1793); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1791); + setState(1794); type_(); } break; @@ -12273,39 +12283,39 @@ public final ParametersContext parameters() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1794); + setState(1797); match(L_PAREN); - setState(1806); + setState(1809); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441152431101575619L) != 0)) { { - setState(1795); + setState(1798); parameterDecl(); - setState(1800); + setState(1803); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,180,_ctx); + _alt = getInterpreter().adaptivePredict(_input,181,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1796); + setState(1799); match(COMMA); - setState(1797); + setState(1800); parameterDecl(); } } } - setState(1802); + setState(1805); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,180,_ctx); + _alt = getInterpreter().adaptivePredict(_input,181,_ctx); } - setState(1804); + setState(1807); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1803); + setState(1806); match(COMMA); } } @@ -12313,7 +12323,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1808); + setState(1811); match(R_PAREN); } } @@ -12357,23 +12367,23 @@ public final ConversionContext conversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1810); + setState(1813); nonNamedType(); - setState(1811); + setState(1814); match(L_PAREN); - setState(1812); + setState(1815); expression(0); - setState(1814); + setState(1817); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1813); + setState(1816); match(COMMA); } } - setState(1816); + setState(1819); match(R_PAREN); } } @@ -12413,7 +12423,7 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); enterRule(_localctx, 342, RULE_nonNamedType); try { - setState(1823); + setState(1826); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -12427,18 +12437,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1818); + setState(1821); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1819); + setState(1822); match(L_PAREN); - setState(1820); + setState(1823); nonNamedType(); - setState(1821); + setState(1824); match(R_PAREN); } break; @@ -12485,31 +12495,31 @@ public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); enterRule(_localctx, 344, RULE_operand); try { - setState(1831); + setState(1834); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1825); + setState(1828); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1826); + setState(1829); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1827); + setState(1830); match(L_PAREN); - setState(1828); + setState(1831); expression(0); - setState(1829); + setState(1832); match(R_PAREN); } break; @@ -12552,7 +12562,7 @@ public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); enterRule(_localctx, 346, RULE_literal); try { - setState(1836); + setState(1839); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12569,7 +12579,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1833); + setState(1836); basicLit(); } break; @@ -12588,7 +12598,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1834); + setState(1837); compositeLit(); } break; @@ -12603,7 +12613,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1835); + setState(1838); functionLit(); } break; @@ -12648,7 +12658,7 @@ public final IntegerContext integer() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1838); + setState(1841); _la = _input.LA(1); if ( !(((((_la - 142)) & ~0x3f) == 0 && ((1L << (_la - 142)) & 111L) != 0)) ) { _errHandler.recoverInline(this); @@ -12691,7 +12701,7 @@ public final OperandNameContext operandName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1840); + setState(1843); match(IDENTIFIER); } } @@ -12730,11 +12740,11 @@ public final QualifiedIdentContext qualifiedIdent() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1842); + setState(1845); match(IDENTIFIER); - setState(1843); + setState(1846); match(DOT); - setState(1844); + setState(1847); match(IDENTIFIER); } } @@ -12774,9 +12784,9 @@ public final CompositeLitContext compositeLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1846); + setState(1849); literalType(); - setState(1847); + setState(1850); literalValue(); } } @@ -12817,21 +12827,21 @@ public final LiteralValueContext literalValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1849); + setState(1852); match(L_CURLY); - setState(1854); + setState(1857); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 23920835140615L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1850); + setState(1853); elementList(); - setState(1852); + setState(1855); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1851); + setState(1854); match(COMMA); } } @@ -12839,7 +12849,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1856); + setState(1859); match(R_CURLY); } } @@ -12884,25 +12894,25 @@ public final ElementListContext elementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1858); + setState(1861); keyedElement(); - setState(1863); + setState(1866); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,189,_ctx); + _alt = getInterpreter().adaptivePredict(_input,190,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1859); + setState(1862); match(COMMA); - setState(1860); + setState(1863); keyedElement(); } } } - setState(1865); + setState(1868); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,189,_ctx); + _alt = getInterpreter().adaptivePredict(_input,190,_ctx); } } } @@ -12943,19 +12953,19 @@ public final KeyedElementContext keyedElement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1869); + setState(1872); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,190,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,191,_ctx) ) { case 1: { - setState(1866); + setState(1869); key(); - setState(1867); + setState(1870); match(COLON); } break; } - setState(1871); + setState(1874); element(); } } @@ -12993,7 +13003,7 @@ public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); enterRule(_localctx, 362, RULE_key); try { - setState(1875); + setState(1878); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -13065,14 +13075,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1873); + setState(1876); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1874); + setState(1877); literalValue(); } break; @@ -13114,7 +13124,7 @@ public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); enterRule(_localctx, 364, RULE_element); try { - setState(1879); + setState(1882); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -13186,14 +13196,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1877); + setState(1880); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1878); + setState(1881); literalValue(); } break; @@ -13247,27 +13257,27 @@ public final StructTypeContext structType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1881); + setState(1884); match(STRUCT); - setState(1882); + setState(1885); match(L_CURLY); - setState(1888); + setState(1891); _errHandler.sync(this); _la = _input.LA(1); while (_la==GHOST || _la==IDENTIFIER || _la==STAR) { { { - setState(1883); + setState(1886); fieldDecl(); - setState(1884); + setState(1887); eos(); } } - setState(1890); + setState(1893); _errHandler.sync(this); _la = _input.LA(1); } - setState(1891); + setState(1894); match(R_CURLY); } } @@ -13304,7 +13314,7 @@ public final String_Context string_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1893); + setState(1896); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -13351,17 +13361,17 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1896); + setState(1899); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1895); + setState(1898); match(STAR); } } - setState(1898); + setState(1901); typeName(); } } @@ -13400,11 +13410,11 @@ public final IndexContext index() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1900); + setState(1903); match(L_BRACKET); - setState(1901); + setState(1904); expression(0); - setState(1902); + setState(1905); match(R_BRACKET); } } @@ -13444,13 +13454,13 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1904); + setState(1907); match(DOT); - setState(1905); + setState(1908); match(L_PAREN); - setState(1906); + setState(1909); type_(); - setState(1907); + setState(1910); match(R_PAREN); } } @@ -13498,34 +13508,34 @@ public final ArgumentsContext arguments() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1909); + setState(1912); match(L_PAREN); - setState(1924); + setState(1927); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1916); + setState(1919); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,196,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,197,_ctx) ) { case 1: { - setState(1910); + setState(1913); expressionList(); } break; case 2: { - setState(1911); - nonNamedType(); setState(1914); + nonNamedType(); + setState(1917); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,195,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,196,_ctx) ) { case 1: { - setState(1912); + setState(1915); match(COMMA); - setState(1913); + setState(1916); expressionList(); } break; @@ -13533,22 +13543,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1919); + setState(1922); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1918); + setState(1921); match(ELLIPSIS); } } - setState(1922); + setState(1925); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1921); + setState(1924); match(COMMA); } } @@ -13556,7 +13566,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1926); + setState(1929); match(R_PAREN); } } @@ -13595,11 +13605,11 @@ public final MethodExprContext methodExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1928); + setState(1931); nonNamedType(); - setState(1929); + setState(1932); match(DOT); - setState(1930); + setState(1933); match(IDENTIFIER); } } @@ -13636,7 +13646,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1932); + setState(1935); type_(); } } @@ -13671,34 +13681,34 @@ public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); enterRule(_localctx, 382, RULE_eos); try { - setState(1938); + setState(1941); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,200,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,201,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1934); + setState(1937); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1935); + setState(1938); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1936); + setState(1939); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1937); + setState(1940); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; @@ -13790,7 +13800,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a4\u0795\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a4\u0798\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -13892,412 +13902,413 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u02de\b,\n,\f,\u02e1\t,\u0001,\u0001,\u0001-\u0003-\u02e6\b-\u0001-\u0001"+ "-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001"+ "/\u00010\u00030\u02f5\b0\u00010\u00010\u00010\u00010\u00030\u02fb\b0\u0001"+ - "0\u00030\u02fe\b0\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+ - "1\u00011\u00011\u00011\u00031\u030b\b1\u00012\u00012\u00012\u00012\u0001"+ - "2\u00012\u00012\u00032\u0314\b2\u00012\u00052\u0317\b2\n2\f2\u031a\t2"+ - "\u00012\u00012\u00032\u031e\b2\u00012\u00032\u0321\b2\u00013\u00043\u0324"+ - "\b3\u000b3\f3\u0325\u00014\u00014\u00014\u00054\u032b\b4\n4\f4\u032e\t"+ - "4\u00015\u00015\u00015\u00035\u0333\b5\u00015\u00015\u00016\u00016\u0001"+ - "6\u00056\u033a\b6\n6\f6\u033d\t6\u00017\u00017\u00017\u00037\u0342\b7"+ - "\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ - "8\u00018\u00038\u034f\b8\u00019\u00039\u0352\b9\u00019\u00019\u00039\u0356"+ - "\b9\u0001:\u0001:\u0003:\u035a\b:\u0001;\u0001;\u0001;\u0001;\u0005;\u0360"+ - "\b;\n;\f;\u0363\t;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003<\u036a\b<"+ - "\u0001=\u0001=\u0001=\u0003=\u036f\b=\u0001>\u0001>\u0001>\u0001>\u0001"+ - ">\u0001>\u0003>\u0377\b>\u0003>\u0379\b>\u0001>\u0001>\u0001>\u0003>\u037e"+ - "\b>\u0001?\u0001?\u0001?\u0005?\u0383\b?\n?\f?\u0386\t?\u0001@\u0001@"+ - "\u0001@\u0001@\u0001@\u0003@\u038d\b@\u0001@\u0003@\u0390\b@\u0001@\u0001"+ - "@\u0001A\u0001A\u0003A\u0396\bA\u0001A\u0001A\u0001A\u0003A\u039b\bA\u0003"+ - "A\u039d\bA\u0001A\u0003A\u03a0\bA\u0001B\u0001B\u0001B\u0005B\u03a5\b"+ - "B\nB\fB\u03a8\tB\u0001C\u0001C\u0003C\u03ac\bC\u0001C\u0001C\u0001D\u0001"+ - "D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ - "E\u0001E\u0005E\u03bd\bE\nE\fE\u03c0\tE\u0001E\u0001E\u0001E\u0005E\u03c5"+ - "\bE\nE\fE\u03c8\tE\u0001E\u0003E\u03cb\bE\u0001F\u0003F\u03ce\bF\u0001"+ - "F\u0001F\u0001F\u0001F\u0003F\u03d4\bF\u0001G\u0001G\u0003G\u03d8\bG\u0001"+ - "G\u0003G\u03db\bG\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001"+ - "H\u0003H\u03e5\bH\u0001I\u0001I\u0001I\u0001I\u0001I\u0003I\u03ec\bI\u0001"+ - "J\u0001J\u0001J\u0001J\u0001J\u0003J\u03f3\bJ\u0001J\u0001J\u0001K\u0001"+ - "K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0003L\u03ff\bL\u0001M\u0001"+ - "M\u0001M\u0001M\u0003M\u0405\bM\u0001N\u0001N\u0001N\u0001N\u0001N\u0003"+ - "N\u040c\bN\u0001O\u0001O\u0001O\u0003O\u0411\bO\u0001P\u0001P\u0001P\u0001"+ - "P\u0003P\u0417\bP\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001"+ - "R\u0001R\u0001R\u0003R\u0423\bR\u0001S\u0001S\u0001S\u0001S\u0003S\u0429"+ - "\bS\u0001S\u0001S\u0003S\u042d\bS\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ - "U\u0003U\u0435\bU\u0001U\u0001U\u0003U\u0439\bU\u0001U\u0001U\u0001V\u0001"+ - "V\u0003V\u043f\bV\u0001W\u0003W\u0442\bW\u0001W\u0001W\u0001X\u0001X\u0003"+ - "X\u0448\bX\u0001X\u0001X\u0001Y\u0003Y\u044d\bY\u0001Y\u0001Y\u0001Z\u0001"+ + "0\u00030\u02fe\b0\u00010\u00030\u0301\b0\u00011\u00011\u00011\u00011\u0001"+ + "1\u00011\u00011\u00011\u00011\u00011\u00011\u00031\u030e\b1\u00012\u0001"+ + "2\u00012\u00012\u00012\u00012\u00012\u00032\u0317\b2\u00012\u00052\u031a"+ + "\b2\n2\f2\u031d\t2\u00012\u00012\u00032\u0321\b2\u00012\u00032\u0324\b"+ + "2\u00013\u00043\u0327\b3\u000b3\f3\u0328\u00014\u00014\u00014\u00054\u032e"+ + "\b4\n4\f4\u0331\t4\u00015\u00015\u00015\u00035\u0336\b5\u00015\u00015"+ + "\u00016\u00016\u00016\u00056\u033d\b6\n6\f6\u0340\t6\u00017\u00017\u0001"+ + "7\u00037\u0345\b7\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+ + "8\u00018\u00018\u00018\u00038\u0352\b8\u00019\u00039\u0355\b9\u00019\u0001"+ + "9\u00039\u0359\b9\u0001:\u0001:\u0003:\u035d\b:\u0001;\u0001;\u0001;\u0001"+ + ";\u0005;\u0363\b;\n;\f;\u0366\t;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003"+ + "<\u036d\b<\u0001=\u0001=\u0001=\u0003=\u0372\b=\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0003>\u037a\b>\u0003>\u037c\b>\u0001>\u0001>\u0001>\u0003"+ + ">\u0381\b>\u0001?\u0001?\u0001?\u0005?\u0386\b?\n?\f?\u0389\t?\u0001@"+ + "\u0001@\u0001@\u0001@\u0001@\u0003@\u0390\b@\u0001@\u0003@\u0393\b@\u0001"+ + "@\u0001@\u0001A\u0001A\u0003A\u0399\bA\u0001A\u0001A\u0001A\u0003A\u039e"+ + "\bA\u0003A\u03a0\bA\u0001A\u0003A\u03a3\bA\u0001B\u0001B\u0001B\u0005"+ + "B\u03a8\bB\nB\fB\u03ab\tB\u0001C\u0001C\u0003C\u03af\bC\u0001C\u0001C"+ + "\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0005E\u03c0\bE\nE\fE\u03c3\tE\u0001E\u0001E\u0001"+ + "E\u0005E\u03c8\bE\nE\fE\u03cb\tE\u0001E\u0003E\u03ce\bE\u0001F\u0003F"+ + "\u03d1\bF\u0001F\u0001F\u0001F\u0001F\u0003F\u03d7\bF\u0001G\u0001G\u0003"+ + "G\u03db\bG\u0001G\u0003G\u03de\bG\u0001G\u0001G\u0001G\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0003H\u03e8\bH\u0001I\u0001I\u0001I\u0001I\u0001I\u0003"+ + "I\u03ef\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0003J\u03f6\bJ\u0001J\u0001"+ + "J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0003L\u0402"+ + "\bL\u0001M\u0001M\u0001M\u0001M\u0003M\u0408\bM\u0001N\u0001N\u0001N\u0001"+ + "N\u0001N\u0003N\u040f\bN\u0001O\u0001O\u0001O\u0003O\u0414\bO\u0001P\u0001"+ + "P\u0001P\u0001P\u0003P\u041a\bP\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0003R\u0426\bR\u0001S\u0001S\u0001S\u0001"+ + "S\u0003S\u042c\bS\u0001S\u0001S\u0003S\u0430\bS\u0001T\u0001T\u0001T\u0001"+ + "T\u0001U\u0001U\u0003U\u0438\bU\u0001U\u0001U\u0003U\u043c\bU\u0001U\u0001"+ + "U\u0001V\u0001V\u0003V\u0442\bV\u0001W\u0003W\u0445\bW\u0001W\u0001W\u0001"+ + "X\u0001X\u0003X\u044b\bX\u0001X\u0001X\u0001Y\u0003Y\u0450\bY\u0001Y\u0001"+ + "Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003"+ - "Z\u0466\bZ\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0003Z\u0469\bZ\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0005Z\u0489\bZ\nZ\fZ\u048c\tZ\u0001[\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0005Z\u048c\bZ\nZ\fZ\u048f"+ + "\tZ\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0003[\u04a2"+ - "\b[\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0003]\u04aa\b]\u0001"+ - "^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0005_\u04b3\b_\n_\f_\u04b6"+ - "\t_\u0001_\u0001_\u0001_\u0001_\u0003_\u04bc\b_\u0001`\u0001`\u0001`\u0001"+ - "`\u0001`\u0003`\u04c3\b`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ - "a\u0001a\u0003a\u04cd\ba\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003"+ - "b\u04df\bb\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ + "[\u0003[\u04a5\b[\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0003]"+ + "\u04ad\b]\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0005_\u04b6"+ + "\b_\n_\f_\u04b9\t_\u0001_\u0001_\u0001_\u0001_\u0003_\u04bf\b_\u0001`"+ + "\u0001`\u0001`\u0001`\u0001`\u0003`\u04c6\b`\u0001a\u0001a\u0001a\u0001"+ + "a\u0001a\u0001a\u0001a\u0001a\u0003a\u04d0\ba\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0003b\u04e2\bb\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ - "b\u0001b\u0005b\u04f5\bb\nb\fb\u04f8\tb\u0001c\u0001c\u0001c\u0001d\u0001"+ - "d\u0003d\u04ff\bd\u0001d\u0001d\u0003d\u0503\bd\u0001e\u0001e\u0003e\u0507"+ - "\be\u0001e\u0003e\u050a\be\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001"+ - "f\u0003f\u0513\bf\u0001f\u0001f\u0005f\u0517\bf\nf\ff\u051a\tf\u0001f"+ - "\u0001f\u0001g\u0001g\u0001g\u0001g\u0001h\u0003h\u0523\bh\u0001h\u0001"+ - "h\u0001h\u0001h\u0001h\u0001h\u0003h\u052b\bh\u0001h\u0001h\u0001h\u0001"+ - "h\u0003h\u0531\bh\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0003"+ - "i\u053a\bi\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001"+ - "j\u0003j\u0545\bj\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0005"+ - "l\u054e\bl\nl\fl\u0551\tl\u0001l\u0003l\u0554\bl\u0003l\u0556\bl\u0001"+ - "l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0003m\u0561"+ - "\bm\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0003o\u056a\bo\u0001"+ - "o\u0001o\u0003o\u056e\bo\u0001o\u0003o\u0571\bo\u0001o\u0001o\u0001o\u0001"+ - "o\u0001o\u0003o\u0578\bo\u0001o\u0001o\u0001p\u0001p\u0001q\u0001q\u0001"+ - "r\u0001r\u0001s\u0003s\u0583\bs\u0001s\u0001s\u0001t\u0001t\u0001t\u0001"+ - "t\u0001t\u0001t\u0003t\u058d\bt\u0001t\u0001t\u0001t\u0001t\u0003t\u0593"+ - "\bt\u0003t\u0595\bt\u0001u\u0001u\u0001u\u0001v\u0001v\u0001w\u0001w\u0001"+ - "w\u0003w\u059f\bw\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0005x\u05a7"+ - "\bx\nx\fx\u05aa\tx\u0001x\u0003x\u05ad\bx\u0001y\u0001y\u0003y\u05b1\b"+ - "y\u0001y\u0001y\u0003y\u05b5\by\u0001z\u0001z\u0001z\u0005z\u05ba\bz\n"+ - "z\fz\u05bd\tz\u0001{\u0001{\u0001{\u0005{\u05c2\b{\n{\f{\u05c5\t{\u0001"+ - "|\u0001|\u0001|\u0001|\u0001|\u0001|\u0005|\u05cd\b|\n|\f|\u05d0\t|\u0001"+ - "|\u0003|\u05d3\b|\u0001}\u0001}\u0003}\u05d7\b}\u0001}\u0001}\u0001~\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0005~\u05e1\b~\n~\f~\u05e4\t~\u0001~\u0003"+ - "~\u05e7\b~\u0001\u007f\u0001\u007f\u0003\u007f\u05eb\b\u007f\u0001\u007f"+ - "\u0001\u007f\u0001\u0080\u0003\u0080\u05f0\b\u0080\u0001\u0080\u0003\u0080"+ - "\u05f3\b\u0080\u0001\u0080\u0003\u0080\u05f6\b\u0080\u0001\u0080\u0001"+ - "\u0080\u0001\u0080\u0004\u0080\u05fb\b\u0080\u000b\u0080\f\u0080\u05fc"+ - "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0003\u0081"+ - "\u0604\b\u0081\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083"+ - "\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085"+ - "\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087"+ - "\u0001\u0087\u0003\u0087\u0618\b\u0087\u0001\u0088\u0001\u0088\u0003\u0088"+ - "\u061c\b\u0088\u0001\u0089\u0001\u0089\u0003\u0089\u0620\b\u0089\u0001"+ - "\u008a\u0001\u008a\u0003\u008a\u0624\b\u008a\u0001\u008b\u0001\u008b\u0001"+ - "\u008b\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001"+ - "\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0003"+ - "\u008d\u0634\b\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0003"+ - "\u008d\u063a\b\u008d\u0003\u008d\u063c\b\u008d\u0001\u008e\u0001\u008e"+ - "\u0003\u008e\u0640\b\u008e\u0001\u008f\u0001\u008f\u0003\u008f\u0644\b"+ - "\u008f\u0001\u008f\u0003\u008f\u0647\b\u008f\u0001\u008f\u0001\u008f\u0003"+ - "\u008f\u064b\b\u008f\u0003\u008f\u064d\b\u008f\u0001\u008f\u0001\u008f"+ - "\u0005\u008f\u0651\b\u008f\n\u008f\f\u008f\u0654\t\u008f\u0001\u008f\u0001"+ - "\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u065b\b\u0090\u0001"+ - "\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u0660\b\u0091\u0001\u0092\u0001"+ - "\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001"+ - "\u0092\u0001\u0092\u0003\u0092\u066b\b\u0092\u0001\u0092\u0001\u0092\u0005"+ - "\u0092\u066f\b\u0092\n\u0092\f\u0092\u0672\t\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0093\u0001\u0093\u0003\u0093\u0678\b\u0093\u0001\u0093\u0001\u0093"+ - "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ - "\u0001\u0094\u0003\u0094\u0683\b\u0094\u0001\u0095\u0001\u0095\u0001\u0095"+ - "\u0003\u0095\u0688\b\u0095\u0001\u0096\u0001\u0096\u0003\u0096\u068c\b"+ - "\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0003\u0096\u0691\b\u0096\u0005"+ - "\u0096\u0693\b\u0096\n\u0096\f\u0096\u0696\t\u0096\u0001\u0097\u0001\u0097"+ - "\u0001\u0097\u0005\u0097\u069b\b\u0097\n\u0097\f\u0097\u069e\t\u0097\u0001"+ - "\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0003\u0098\u06a5"+ - "\b\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0003\u0099\u06aa\b\u0099"+ - "\u0001\u0099\u0003\u0099\u06ad\b\u0099\u0001\u009a\u0001\u009a\u0001\u009a"+ - "\u0001\u009a\u0001\u009a\u0001\u009a\u0003\u009a\u06b5\b\u009a\u0001\u009a"+ - "\u0001\u009a\u0001\u009b\u0001\u009b\u0003\u009b\u06bb\b\u009b\u0001\u009b"+ - "\u0001\u009b\u0003\u009b\u06bf\b\u009b\u0003\u009b\u06c1\b\u009b\u0001"+ - "\u009b\u0001\u009b\u0001\u009c\u0003\u009c\u06c6\b\u009c\u0001\u009c\u0001"+ - "\u009c\u0003\u009c\u06ca\b\u009c\u0001\u009c\u0001\u009c\u0003\u009c\u06ce"+ - "\b\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0003"+ - "\u009e\u06d5\b\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ - "\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001"+ - "\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ - "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ - "\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06f2"+ - "\b\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001"+ - "\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0003\u00a7\u06fd\b\u00a7\u0001"+ - "\u00a8\u0001\u00a8\u0003\u00a8\u0701\b\u00a8\u0001\u00a9\u0001\u00a9\u0001"+ - "\u00a9\u0001\u00a9\u0005\u00a9\u0707\b\u00a9\n\u00a9\f\u00a9\u070a\t\u00a9"+ - "\u0001\u00a9\u0003\u00a9\u070d\b\u00a9\u0003\u00a9\u070f\b\u00a9\u0001"+ - "\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0003"+ - "\u00aa\u0717\b\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001"+ - "\u00ab\u0001\u00ab\u0001\u00ab\u0003\u00ab\u0720\b\u00ab\u0001\u00ac\u0001"+ - "\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0003\u00ac\u0728"+ - "\b\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003\u00ad\u072d\b\u00ad"+ - "\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0"+ - "\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2"+ - "\u0001\u00b2\u0001\u00b2\u0003\u00b2\u073d\b\u00b2\u0003\u00b2\u073f\b"+ - "\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0005"+ - "\u00b3\u0746\b\u00b3\n\u00b3\f\u00b3\u0749\t\u00b3\u0001\u00b4\u0001\u00b4"+ - "\u0001\u00b4\u0003\u00b4\u074e\b\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5"+ - "\u0001\u00b5\u0003\u00b5\u0754\b\u00b5\u0001\u00b6\u0001\u00b6\u0003\u00b6"+ - "\u0758\b\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ - "\u0005\u00b7\u075f\b\u00b7\n\u00b7\f\u00b7\u0762\t\u00b7\u0001\u00b7\u0001"+ - "\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0003\u00b9\u0769\b\u00b9\u0001"+ - "\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001"+ - "\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001"+ - "\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0003\u00bc\u077b\b\u00bc\u0003"+ - "\u00bc\u077d\b\u00bc\u0001\u00bc\u0003\u00bc\u0780\b\u00bc\u0001\u00bc"+ - "\u0003\u00bc\u0783\b\u00bc\u0003\u00bc\u0785\b\u00bc\u0001\u00bc\u0001"+ - "\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001"+ - "\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0003\u00bf\u0793"+ - "\b\u00bf\u0001\u00bf\u0001\u0318\u0002\u00b4\u00c4\u00c0\u0000\u0002\u0004"+ - "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ - "$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086"+ - "\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e"+ - "\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6"+ - "\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce"+ - "\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6"+ - "\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe"+ - "\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116"+ - "\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e"+ - "\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146"+ - "\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e"+ - "\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176"+ - "\u0178\u017a\u017c\u017e\u0000\u0014\u0002\u0000iitt\u0001\u0000\u0017"+ - "\u0018\u0001\u0000\u0005\b\u0001\u0000BC\u0001\u0000(*\u0002\u0000(*,"+ - ",\u0002\u0000jkqq\u0001\u0000\u0087\u008d\u0001\u0000\u0014\u0015\u0002"+ - "\u0000\u0082\u0086\u008b\u008c\u0004\u0000##uu\u0081\u0081\u0088\u008a"+ - "\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000IJ{\u0080\u0004"+ - "\u0000..1144aa\u0002\u0000\u0081\u0086\u0088\u008c\u0001\u0000uv\u0002"+ - "\u0000rr\u00a3\u00a3\u0002\u0000\u008e\u0091\u0093\u0094\u0001\u0000\u009a"+ - "\u009b\u0802\u0000\u0180\u0001\u0000\u0000\u0000\u0002\u0183\u0001\u0000"+ - "\u0000\u0000\u0004\u0186\u0001\u0000\u0000\u0000\u0006\u0189\u0001\u0000"+ - "\u0000\u0000\b\u0191\u0001\u0000\u0000\u0000\n\u019a\u0001\u0000\u0000"+ - "\u0000\f\u01ba\u0001\u0000\u0000\u0000\u000e\u01c7\u0001\u0000\u0000\u0000"+ - "\u0010\u01ca\u0001\u0000\u0000\u0000\u0012\u01d2\u0001\u0000\u0000\u0000"+ - "\u0014\u01df\u0001\u0000\u0000\u0000\u0016\u01f5\u0001\u0000\u0000\u0000"+ - "\u0018\u01fe\u0001\u0000\u0000\u0000\u001a\u0200\u0001\u0000\u0000\u0000"+ - "\u001c\u0202\u0001\u0000\u0000\u0000\u001e\u0205\u0001\u0000\u0000\u0000"+ - " \u0219\u0001\u0000\u0000\u0000\"\u021b\u0001\u0000\u0000\u0000$\u021d"+ - "\u0001\u0000\u0000\u0000&\u0222\u0001\u0000\u0000\u0000(\u022d\u0001\u0000"+ - "\u0000\u0000*\u023a\u0001\u0000\u0000\u0000,\u023d\u0001\u0000\u0000\u0000"+ - ".\u0248\u0001\u0000\u0000\u00000\u024a\u0001\u0000\u0000\u00002\u024f"+ - "\u0001\u0000\u0000\u00004\u0254\u0001\u0000\u0000\u00006\u0259\u0001\u0000"+ - "\u0000\u00008\u025e\u0001\u0000\u0000\u0000:\u026b\u0001\u0000\u0000\u0000"+ - "<\u026d\u0001\u0000\u0000\u0000>\u026f\u0001\u0000\u0000\u0000@\u0274"+ - "\u0001\u0000\u0000\u0000B\u0279\u0001\u0000\u0000\u0000D\u027e\u0001\u0000"+ - "\u0000\u0000F\u0287\u0001\u0000\u0000\u0000H\u028e\u0001\u0000\u0000\u0000"+ - "J\u029b\u0001\u0000\u0000\u0000L\u029f\u0001\u0000\u0000\u0000N\u02aa"+ - "\u0001\u0000\u0000\u0000P\u02b3\u0001\u0000\u0000\u0000R\u02b5\u0001\u0000"+ - "\u0000\u0000T\u02ca\u0001\u0000\u0000\u0000V\u02cc\u0001\u0000\u0000\u0000"+ - "X\u02d8\u0001\u0000\u0000\u0000Z\u02e5\u0001\u0000\u0000\u0000\\\u02e9"+ - "\u0001\u0000\u0000\u0000^\u02ee\u0001\u0000\u0000\u0000`\u02fa\u0001\u0000"+ - "\u0000\u0000b\u030a\u0001\u0000\u0000\u0000d\u0318\u0001\u0000\u0000\u0000"+ - "f\u0323\u0001\u0000\u0000\u0000h\u0327\u0001\u0000\u0000\u0000j\u032f"+ - "\u0001\u0000\u0000\u0000l\u0336\u0001\u0000\u0000\u0000n\u033e\u0001\u0000"+ - "\u0000\u0000p\u034e\u0001\u0000\u0000\u0000r\u0351\u0001\u0000\u0000\u0000"+ - "t\u0359\u0001\u0000\u0000\u0000v\u035b\u0001\u0000\u0000\u0000x\u0366"+ - "\u0001\u0000\u0000\u0000z\u036e\u0001\u0000\u0000\u0000|\u037d\u0001\u0000"+ - "\u0000\u0000~\u037f\u0001\u0000\u0000\u0000\u0080\u0387\u0001\u0000\u0000"+ - "\u0000\u0082\u0395\u0001\u0000\u0000\u0000\u0084\u03a1\u0001\u0000\u0000"+ - "\u0000\u0086\u03ab\u0001\u0000\u0000\u0000\u0088\u03af\u0001\u0000\u0000"+ - "\u0000\u008a\u03b5\u0001\u0000\u0000\u0000\u008c\u03cd\u0001\u0000\u0000"+ - "\u0000\u008e\u03d5\u0001\u0000\u0000\u0000\u0090\u03e4\u0001\u0000\u0000"+ - "\u0000\u0092\u03e6\u0001\u0000\u0000\u0000\u0094\u03ed\u0001\u0000\u0000"+ - "\u0000\u0096\u03f6\u0001\u0000\u0000\u0000\u0098\u03fb\u0001\u0000\u0000"+ - "\u0000\u009a\u0400\u0001\u0000\u0000\u0000\u009c\u0406\u0001\u0000\u0000"+ - "\u0000\u009e\u040d\u0001\u0000\u0000\u0000\u00a0\u0412\u0001\u0000\u0000"+ - "\u0000\u00a2\u0418\u0001\u0000\u0000\u0000\u00a4\u041d\u0001\u0000\u0000"+ - "\u0000\u00a6\u0424\u0001\u0000\u0000\u0000\u00a8\u042e\u0001\u0000\u0000"+ - "\u0000\u00aa\u0432\u0001\u0000\u0000\u0000\u00ac\u043e\u0001\u0000\u0000"+ - "\u0000\u00ae\u0441\u0001\u0000\u0000\u0000\u00b0\u0445\u0001\u0000\u0000"+ - "\u0000\u00b2\u044c\u0001\u0000\u0000\u0000\u00b4\u0465\u0001\u0000\u0000"+ - "\u0000\u00b6\u04a1\u0001\u0000\u0000\u0000\u00b8\u04a3\u0001\u0000\u0000"+ - "\u0000\u00ba\u04a6\u0001\u0000\u0000\u0000\u00bc\u04ab\u0001\u0000\u0000"+ - "\u0000\u00be\u04b4\u0001\u0000\u0000\u0000\u00c0\u04c2\u0001\u0000\u0000"+ - "\u0000\u00c2\u04cc\u0001\u0000\u0000\u0000\u00c4\u04de\u0001\u0000\u0000"+ - "\u0000\u00c6\u04f9\u0001\u0000\u0000\u0000\u00c8\u04fc\u0001\u0000\u0000"+ - "\u0000\u00ca\u0504\u0001\u0000\u0000\u0000\u00cc\u050d\u0001\u0000\u0000"+ - "\u0000\u00ce\u051d\u0001\u0000\u0000\u0000\u00d0\u0530\u0001\u0000\u0000"+ - "\u0000\u00d2\u0539\u0001\u0000\u0000\u0000\u00d4\u0544\u0001\u0000\u0000"+ - "\u0000\u00d6\u0546\u0001\u0000\u0000\u0000\u00d8\u0549\u0001\u0000\u0000"+ - "\u0000\u00da\u0560\u0001\u0000\u0000\u0000\u00dc\u0562\u0001\u0000\u0000"+ - "\u0000\u00de\u0567\u0001\u0000\u0000\u0000\u00e0\u057b\u0001\u0000\u0000"+ - "\u0000\u00e2\u057d\u0001\u0000\u0000\u0000\u00e4\u057f\u0001\u0000\u0000"+ - "\u0000\u00e6\u0582\u0001\u0000\u0000\u0000\u00e8\u058c\u0001\u0000\u0000"+ - "\u0000\u00ea\u0596\u0001\u0000\u0000\u0000\u00ec\u0599\u0001\u0000\u0000"+ - "\u0000\u00ee\u059e\u0001\u0000\u0000\u0000\u00f0\u05a0\u0001\u0000\u0000"+ - "\u0000\u00f2\u05ae\u0001\u0000\u0000\u0000\u00f4\u05b6\u0001\u0000\u0000"+ - "\u0000\u00f6\u05be\u0001\u0000\u0000\u0000\u00f8\u05c6\u0001\u0000\u0000"+ - "\u0000\u00fa\u05d4\u0001\u0000\u0000\u0000\u00fc\u05da\u0001\u0000\u0000"+ - "\u0000\u00fe\u05e8\u0001\u0000\u0000\u0000\u0100\u05fa\u0001\u0000\u0000"+ - "\u0000\u0102\u0603\u0001\u0000\u0000\u0000\u0104\u0605\u0001\u0000\u0000"+ - "\u0000\u0106\u0607\u0001\u0000\u0000\u0000\u0108\u060b\u0001\u0000\u0000"+ - "\u0000\u010a\u060e\u0001\u0000\u0000\u0000\u010c\u0612\u0001\u0000\u0000"+ - "\u0000\u010e\u0614\u0001\u0000\u0000\u0000\u0110\u0619\u0001\u0000\u0000"+ - "\u0000\u0112\u061d\u0001\u0000\u0000\u0000\u0114\u0621\u0001\u0000\u0000"+ - "\u0000\u0116\u0625\u0001\u0000\u0000\u0000\u0118\u0628\u0001\u0000\u0000"+ - "\u0000\u011a\u062a\u0001\u0000\u0000\u0000\u011c\u063f\u0001\u0000\u0000"+ - "\u0000\u011e\u0641\u0001\u0000\u0000\u0000\u0120\u0657\u0001\u0000\u0000"+ - "\u0000\u0122\u065f\u0001\u0000\u0000\u0000\u0124\u0661\u0001\u0000\u0000"+ - "\u0000\u0126\u0677\u0001\u0000\u0000\u0000\u0128\u067f\u0001\u0000\u0000"+ - "\u0000\u012a\u0687\u0001\u0000\u0000\u0000\u012c\u068b\u0001\u0000\u0000"+ - "\u0000\u012e\u0697\u0001\u0000\u0000\u0000\u0130\u06a1\u0001\u0000\u0000"+ - "\u0000\u0132\u06ac\u0001\u0000\u0000\u0000\u0134\u06b4\u0001\u0000\u0000"+ - "\u0000\u0136\u06b8\u0001\u0000\u0000\u0000\u0138\u06c5\u0001\u0000\u0000"+ - "\u0000\u013a\u06cf\u0001\u0000\u0000\u0000\u013c\u06d4\u0001\u0000\u0000"+ - "\u0000\u013e\u06d6\u0001\u0000\u0000\u0000\u0140\u06db\u0001\u0000\u0000"+ - "\u0000\u0142\u06dd\u0001\u0000\u0000\u0000\u0144\u06df\u0001\u0000\u0000"+ - "\u0000\u0146\u06e2\u0001\u0000\u0000\u0000\u0148\u06e6\u0001\u0000\u0000"+ - "\u0000\u014a\u06f1\u0001\u0000\u0000\u0000\u014c\u06f5\u0001\u0000\u0000"+ - "\u0000\u014e\u06fc\u0001\u0000\u0000\u0000\u0150\u0700\u0001\u0000\u0000"+ - "\u0000\u0152\u0702\u0001\u0000\u0000\u0000\u0154\u0712\u0001\u0000\u0000"+ - "\u0000\u0156\u071f\u0001\u0000\u0000\u0000\u0158\u0727\u0001\u0000\u0000"+ - "\u0000\u015a\u072c\u0001\u0000\u0000\u0000\u015c\u072e\u0001\u0000\u0000"+ - "\u0000\u015e\u0730\u0001\u0000\u0000\u0000\u0160\u0732\u0001\u0000\u0000"+ - "\u0000\u0162\u0736\u0001\u0000\u0000\u0000\u0164\u0739\u0001\u0000\u0000"+ - "\u0000\u0166\u0742\u0001\u0000\u0000\u0000\u0168\u074d\u0001\u0000\u0000"+ - "\u0000\u016a\u0753\u0001\u0000\u0000\u0000\u016c\u0757\u0001\u0000\u0000"+ - "\u0000\u016e\u0759\u0001\u0000\u0000\u0000\u0170\u0765\u0001\u0000\u0000"+ - "\u0000\u0172\u0768\u0001\u0000\u0000\u0000\u0174\u076c\u0001\u0000\u0000"+ - "\u0000\u0176\u0770\u0001\u0000\u0000\u0000\u0178\u0775\u0001\u0000\u0000"+ - "\u0000\u017a\u0788\u0001\u0000\u0000\u0000\u017c\u078c\u0001\u0000\u0000"+ - "\u0000\u017e\u0792\u0001\u0000\u0000\u0000\u0180\u0181\u0003\u00b4Z\u0000"+ - "\u0181\u0182\u0005\u0000\u0000\u0001\u0182\u0001\u0001\u0000\u0000\u0000"+ - "\u0183\u0184\u0003\u00b6[\u0000\u0184\u0185\u0005\u0000\u0000\u0001\u0185"+ - "\u0003\u0001\u0000\u0000\u0000\u0186\u0187\u0003\u00d2i\u0000\u0187\u0188"+ - "\u0005\u0000\u0000\u0001\u0188\u0005\u0001\u0000\u0000\u0000\u0189\u018e"+ - "\u0003\b\u0004\u0000\u018a\u018b\u0005q\u0000\u0000\u018b\u018d\u0003"+ - "\b\u0004\u0000\u018c\u018a\u0001\u0000\u0000\u0000\u018d\u0190\u0001\u0000"+ - "\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000"+ - "\u0000\u0000\u018f\u0007\u0001\u0000\u0000\u0000\u0190\u018e\u0001\u0000"+ - "\u0000\u0000\u0191\u0193\u0005i\u0000\u0000\u0192\u0194\u0005=\u0000\u0000"+ - "\u0193\u0192\u0001\u0000\u0000\u0000\u0193\u0194\u0001\u0000\u0000\u0000"+ - "\u0194\t\u0001\u0000\u0000\u0000\u0195\u0196\u0003\u000e\u0007\u0000\u0196"+ - "\u0197\u0003\u017e\u00bf\u0000\u0197\u0199\u0001\u0000\u0000\u0000\u0198"+ - "\u0195\u0001\u0000\u0000\u0000\u0199\u019c\u0001\u0000\u0000\u0000\u019a"+ - "\u0198\u0001\u0000\u0000\u0000\u019a\u019b\u0001\u0000\u0000\u0000\u019b"+ - "\u019d\u0001\u0000\u0000\u0000\u019c\u019a\u0001\u0000\u0000\u0000\u019d"+ - "\u019e\u0003\u00eau\u0000\u019e\u01a4\u0003\u017e\u00bf\u0000\u019f\u01a0"+ - "\u0003\u0014\n\u0000\u01a0\u01a1\u0003\u017e\u00bf\u0000\u01a1\u01a3\u0001"+ - "\u0000\u0000\u0000\u01a2\u019f\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001"+ - "\u0000\u0000\u0000\u01a4\u01a2\u0001\u0000\u0000\u0000\u01a4\u01a5\u0001"+ - "\u0000\u0000\u0000\u01a5\u01b0\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001"+ - "\u0000\u0000\u0000\u01a7\u01ab\u0003\u0098L\u0000\u01a8\u01ab\u0003\u00ee"+ - "w\u0000\u01a9\u01ab\u0003\u0016\u000b\u0000\u01aa\u01a7\u0001\u0000\u0000"+ - "\u0000\u01aa\u01a8\u0001\u0000\u0000\u0000\u01aa\u01a9\u0001\u0000\u0000"+ - "\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000\u01ac\u01ad\u0003\u017e\u00bf"+ - "\u0000\u01ad\u01af\u0001\u0000\u0000\u0000\u01ae\u01aa\u0001\u0000\u0000"+ - "\u0000\u01af\u01b2\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000"+ - "\u0000\u01b0\u01b1\u0001\u0000\u0000\u0000\u01b1\u01b3\u0001\u0000\u0000"+ - "\u0000\u01b2\u01b0\u0001\u0000\u0000\u0000\u01b3\u01b4\u0005\u0000\u0000"+ - "\u0001\u01b4\u000b\u0001\u0000\u0000\u0000\u01b5\u01b6\u0003\u000e\u0007"+ - "\u0000\u01b6\u01b7\u0003\u017e\u00bf\u0000\u01b7\u01b9\u0001\u0000\u0000"+ - "\u0000\u01b8\u01b5\u0001\u0000\u0000\u0000\u01b9\u01bc\u0001\u0000\u0000"+ - "\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01ba\u01bb\u0001\u0000\u0000"+ - "\u0000\u01bb\u01bd\u0001\u0000\u0000\u0000\u01bc\u01ba\u0001\u0000\u0000"+ - "\u0000\u01bd\u01be\u0003\u00eau\u0000\u01be\u01c4\u0003\u017e\u00bf\u0000"+ - "\u01bf\u01c0\u0003\u0014\n\u0000\u01c0\u01c1\u0003\u017e\u00bf\u0000\u01c1"+ - "\u01c3\u0001\u0000\u0000\u0000\u01c2\u01bf\u0001\u0000\u0000\u0000\u01c3"+ - "\u01c6\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c4"+ - "\u01c5\u0001\u0000\u0000\u0000\u01c5\r\u0001\u0000\u0000\u0000\u01c6\u01c4"+ - "\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005F\u0000\u0000\u01c8\u01c9\u0003"+ - "\u00b4Z\u0000\u01c9\u000f\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005G\u0000"+ - "\u0000\u01cb\u01cc\u0003\u00b4Z\u0000\u01cc\u0011\u0001\u0000\u0000\u0000"+ - "\u01cd\u01ce\u0003\u0010\b\u0000\u01ce\u01cf\u0003\u017e\u00bf\u0000\u01cf"+ - "\u01d1\u0001\u0000\u0000\u0000\u01d0\u01cd\u0001\u0000\u0000\u0000\u01d1"+ - "\u01d4\u0001\u0000\u0000\u0000\u01d2\u01d0\u0001\u0000\u0000\u0000\u01d2"+ - "\u01d3\u0001\u0000\u0000\u0000\u01d3\u01d6\u0001\u0000\u0000\u0000\u01d4"+ - "\u01d2\u0001\u0000\u0000\u0000\u01d5\u01d7\u0007\u0000\u0000\u0000\u01d6"+ - "\u01d5\u0001\u0000\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7"+ - "\u01d8\u0001\u0000\u0000\u0000\u01d8\u01d9\u0003\u00ecv\u0000\u01d9\u0013"+ - "\u0001\u0000\u0000\u0000\u01da\u01db\u0003\u0010\b\u0000\u01db\u01dc\u0003"+ - "\u017e\u00bf\u0000\u01dc\u01de\u0001\u0000\u0000\u0000\u01dd\u01da\u0001"+ - "\u0000\u0000\u0000\u01de\u01e1\u0001\u0000\u0000\u0000\u01df\u01dd\u0001"+ - "\u0000\u0000\u0000\u01df\u01e0\u0001\u0000\u0000\u0000\u01e0\u01ef\u0001"+ - "\u0000\u0000\u0000\u01e1\u01df\u0001\u0000\u0000\u0000\u01e2\u01e3\u0005"+ - "e\u0000\u0000\u01e3\u01f0\u0003\u0012\t\u0000\u01e4\u01e5\u0005e\u0000"+ - "\u0000\u01e5\u01eb\u0005j\u0000\u0000\u01e6\u01e7\u0003\u0012\t\u0000"+ - "\u01e7\u01e8\u0003\u017e\u00bf\u0000\u01e8\u01ea\u0001\u0000\u0000\u0000"+ - "\u01e9\u01e6\u0001\u0000\u0000\u0000\u01ea\u01ed\u0001\u0000\u0000\u0000"+ - "\u01eb\u01e9\u0001\u0000\u0000\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000"+ - "\u01ec\u01ee\u0001\u0000\u0000\u0000\u01ed\u01eb\u0001\u0000\u0000\u0000"+ - "\u01ee\u01f0\u0005k\u0000\u0000\u01ef\u01e2\u0001\u0000\u0000\u0000\u01ef"+ - "\u01e4\u0001\u0000\u0000\u0000\u01f0\u0015\u0001\u0000\u0000\u0000\u01f1"+ - "\u01f6\u0003\u008aE\u0000\u01f2\u01f6\u0003\u00a0P\u0000\u01f3\u01f6\u0003"+ - "\u00a4R\u0000\u01f4\u01f6\u0003\u009eO\u0000\u01f5\u01f1\u0001\u0000\u0000"+ - "\u0000\u01f5\u01f2\u0001\u0000\u0000\u0000\u01f5\u01f3\u0001\u0000\u0000"+ - "\u0000\u01f5\u01f4\u0001\u0000\u0000\u0000\u01f6\u0017\u0001\u0000\u0000"+ - "\u0000\u01f7\u01f8\u0005\u001b\u0000\u0000\u01f8\u01ff\u0003\u00b6[\u0000"+ - "\u01f9\u01fa\u0007\u0001\u0000\u0000\u01fa\u01ff\u0003.\u0017\u0000\u01fb"+ - "\u01fc\u0007\u0002\u0000\u0000\u01fc\u01ff\u0003\u00b4Z\u0000\u01fd\u01ff"+ - "\u0003v;\u0000\u01fe\u01f7\u0001\u0000\u0000\u0000\u01fe\u01f9\u0001\u0000"+ - "\u0000\u0000\u01fe\u01fb\u0001\u0000\u0000\u0000\u01fe\u01fd\u0001\u0000"+ - "\u0000\u0000\u01ff\u0019\u0001\u0000\u0000\u0000\u0200\u0201\u0003\u001c"+ - "\u000e\u0000\u0201\u001b\u0001\u0000\u0000\u0000\u0202\u0203\u0003d2\u0000"+ - "\u0203\u0204\u0003\u001e\u000f\u0000\u0204\u001d\u0001\u0000\u0000\u0000"+ - "\u0205\u0206\u0005E\u0000\u0000\u0206\u0208\u0005j\u0000\u0000\u0207\u0209"+ - "\u0003\u0100\u0080\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0208\u0209"+ - "\u0001\u0000\u0000\u0000\u0209\u020a\u0001\u0000\u0000\u0000\u020a\u020b"+ - "\u0005k\u0000\u0000\u020b\u001f\u0001\u0000\u0000\u0000\u020c\u021a\u0003"+ - "F#\u0000\u020d\u021a\u0003D\"\u0000\u020e\u021a\u0003B!\u0000\u020f\u021a"+ - "\u0003$\u0012\u0000\u0210\u021a\u0003@ \u0000\u0211\u021a\u00038\u001c"+ - "\u0000\u0212\u021a\u0003>\u001f\u0000\u0213\u021a\u00036\u001b\u0000\u0214"+ - "\u021a\u00032\u0019\u0000\u0215\u021a\u00030\u0018\u0000\u0216\u021a\u0003"+ - "4\u001a\u0000\u0217\u021a\u0003\"\u0011\u0000\u0218\u021a\u0003H$\u0000"+ - "\u0219\u020c\u0001\u0000\u0000\u0000\u0219\u020d\u0001\u0000\u0000\u0000"+ - "\u0219\u020e\u0001\u0000\u0000\u0000\u0219\u020f\u0001\u0000\u0000\u0000"+ - "\u0219\u0210\u0001\u0000\u0000\u0000\u0219\u0211\u0001\u0000\u0000\u0000"+ - "\u0219\u0212\u0001\u0000\u0000\u0000\u0219\u0213\u0001\u0000\u0000\u0000"+ - "\u0219\u0214\u0001\u0000\u0000\u0000\u0219\u0215\u0001\u0000\u0000\u0000"+ - "\u0219\u0216\u0001\u0000\u0000\u0000\u0219\u0217\u0001\u0000\u0000\u0000"+ - "\u0219\u0218\u0001\u0000\u0000\u0000\u021a!\u0001\u0000\u0000\u0000\u021b"+ - "\u021c\u0007\u0003\u0000\u0000\u021c#\u0001\u0000\u0000\u0000\u021d\u021e"+ - "\u0005b\u0000\u0000\u021e\u021f\u0005n\u0000\u0000\u021f\u0220\u0003\u00d2"+ - "i\u0000\u0220\u0221\u0005o\u0000\u0000\u0221%\u0001\u0000\u0000\u0000"+ - "\u0222\u0227\u0003(\u0014\u0000\u0223\u0224\u0005q\u0000\u0000\u0224\u0226"+ - "\u0003(\u0014\u0000\u0225\u0223\u0001\u0000\u0000\u0000\u0226\u0229\u0001"+ - "\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0228\u0001"+ - "\u0000\u0000\u0000\u0228\u022b\u0001\u0000\u0000\u0000\u0229\u0227\u0001"+ - "\u0000\u0000\u0000\u022a\u022c\u0005q\u0000\u0000\u022b\u022a\u0001\u0000"+ - "\u0000\u0000\u022b\u022c\u0001\u0000\u0000\u0000\u022c\'\u0001\u0000\u0000"+ - "\u0000\u022d\u0232\u0005i\u0000\u0000\u022e\u022f\u0005q\u0000\u0000\u022f"+ - "\u0231\u0005i\u0000\u0000\u0230\u022e\u0001\u0000\u0000\u0000\u0231\u0234"+ - "\u0001\u0000\u0000\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0232\u0233"+ - "\u0001\u0000\u0000\u0000\u0233\u0235\u0001\u0000\u0000\u0000\u0234\u0232"+ - "\u0001\u0000\u0000\u0000\u0235\u0236\u0003\u0142\u00a1\u0000\u0236)\u0001"+ - "\u0000\u0000\u0000\u0237\u0239\u0003,\u0016\u0000\u0238\u0237\u0001\u0000"+ - "\u0000\u0000\u0239\u023c\u0001\u0000\u0000\u0000\u023a\u0238\u0001\u0000"+ - "\u0000\u0000\u023a\u023b\u0001\u0000\u0000\u0000\u023b+\u0001\u0000\u0000"+ - "\u0000\u023c\u023a\u0001\u0000\u0000\u0000\u023d\u023e\u0005l\u0000\u0000"+ - "\u023e\u0243\u0003\u00b4Z\u0000\u023f\u0240\u0005q\u0000\u0000\u0240\u0242"+ - "\u0003\u00b4Z\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0242\u0245\u0001"+ - "\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0243\u0244\u0001"+ - "\u0000\u0000\u0000\u0244\u0246\u0001\u0000\u0000\u0000\u0245\u0243\u0001"+ - "\u0000\u0000\u0000\u0246\u0247\u0005m\u0000\u0000\u0247-\u0001\u0000\u0000"+ - "\u0000\u0248\u0249\u0003\u00c4b\u0000\u0249/\u0001\u0000\u0000\u0000\u024a"+ - "\u024b\u00052\u0000\u0000\u024b\u024c\u0005j\u0000\u0000\u024c\u024d\u0003"+ - "\u00b4Z\u0000\u024d\u024e\u0005k\u0000\u0000\u024e1\u0001\u0000\u0000"+ - "\u0000\u024f\u0250\u00058\u0000\u0000\u0250\u0251\u0005n\u0000\u0000\u0251"+ - "\u0252\u0003\u00d2i\u0000\u0252\u0253\u0005o\u0000\u0000\u02533\u0001"+ - "\u0000\u0000\u0000\u0254\u0255\u00053\u0000\u0000\u0255\u0256\u0005j\u0000"+ - "\u0000\u0256\u0257\u0003\u00b4Z\u0000\u0257\u0258\u0005k\u0000\u0000\u0258"+ - "5\u0001\u0000\u0000\u0000\u0259\u025a\u0007\u0004\u0000\u0000\u025a\u025b"+ - "\u0005j\u0000\u0000\u025b\u025c\u0003\u00b4Z\u0000\u025c\u025d\u0005k"+ - "\u0000\u0000\u025d7\u0001\u0000\u0000\u0000\u025e\u0263\u0005\u0011\u0000"+ - "\u0000\u025f\u0260\u0005n\u0000\u0000\u0260\u0261\u0003:\u001d\u0000\u0261"+ - "\u0262\u0005o\u0000\u0000\u0262\u0264\u0001\u0000\u0000\u0000\u0263\u025f"+ - "\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000\u0000\u0264\u0265"+ - "\u0001\u0000\u0000\u0000\u0265\u0266\u0005j\u0000\u0000\u0266\u0267\u0003"+ - "\u00b4Z\u0000\u0267\u0268\u0005k\u0000\u0000\u02689\u0001\u0000\u0000"+ - "\u0000\u0269\u026c\u0003<\u001e\u0000\u026a\u026c\u0005\u0013\u0000\u0000"+ - "\u026b\u0269\u0001\u0000\u0000\u0000\u026b\u026a\u0001\u0000\u0000\u0000"+ - "\u026c;\u0001\u0000\u0000\u0000\u026d\u026e\u0005i\u0000\u0000\u026e="+ - "\u0001\u0000\u0000\u0000\u026f\u0270\u0005\u0012\u0000\u0000\u0270\u0271"+ - "\u0005j\u0000\u0000\u0271\u0272\u0003\u00b4Z\u0000\u0272\u0273\u0005k"+ - "\u0000\u0000\u0273?\u0001\u0000\u0000\u0000\u0274\u0275\u0005;\u0000\u0000"+ - "\u0275\u0276\u0005j\u0000\u0000\u0276\u0277\u0003\u00b4Z\u0000\u0277\u0278"+ - "\u0005k\u0000\u0000\u0278A\u0001\u0000\u0000\u0000\u0279\u027a\u0005:"+ - "\u0000\u0000\u027a\u027b\u0005j\u0000\u0000\u027b\u027c\u0003\u00b4Z\u0000"+ - "\u027c\u027d\u0005k\u0000\u0000\u027dC\u0001\u0000\u0000\u0000\u027e\u027f"+ - "\u0005\u0016\u0000\u0000\u027f\u0280\u0005j\u0000\u0000\u0280\u0283\u0003"+ - "\u00b4Z\u0000\u0281\u0282\u0005q\u0000\u0000\u0282\u0284\u0003\u00b4Z"+ - "\u0000\u0283\u0281\u0001\u0000\u0000\u0000\u0283\u0284\u0001\u0000\u0000"+ - "\u0000\u0284\u0285\u0001\u0000\u0000\u0000\u0285\u0286\u0005k\u0000\u0000"+ - "\u0286E\u0001\u0000\u0000\u0000\u0287\u0288\u0007\u0004\u0000\u0000\u0288"+ - "\u0289\u0005n\u0000\u0000\u0289\u028a\u0003\u00b4Z\u0000\u028a\u028b\u0005"+ - ">\u0000\u0000\u028b\u028c\u0003\u00b4Z\u0000\u028c\u028d\u0005o\u0000"+ - "\u0000\u028dG\u0001\u0000\u0000\u0000\u028e\u028f\u00057\u0000\u0000\u028f"+ - "\u0290\u0003\u00b4Z\u0000\u0290\u0296\u0005l\u0000\u0000\u0291\u0292\u0003"+ - "J%\u0000\u0292\u0293\u0003\u017e\u00bf\u0000\u0293\u0295\u0001\u0000\u0000"+ + "b\u0001b\u0001b\u0001b\u0001b\u0005b\u04f8\bb\nb\fb\u04fb\tb\u0001c\u0001"+ + "c\u0001c\u0001d\u0001d\u0003d\u0502\bd\u0001d\u0001d\u0003d\u0506\bd\u0001"+ + "e\u0001e\u0003e\u050a\be\u0001e\u0003e\u050d\be\u0001e\u0001e\u0001f\u0001"+ + "f\u0001f\u0001f\u0001f\u0003f\u0516\bf\u0001f\u0001f\u0005f\u051a\bf\n"+ + "f\ff\u051d\tf\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001h\u0003h"+ + "\u0526\bh\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u052e\bh\u0001"+ + "h\u0001h\u0001h\u0001h\u0003h\u0534\bh\u0001i\u0001i\u0001i\u0001i\u0001"+ + "i\u0001i\u0001i\u0003i\u053d\bi\u0001j\u0001j\u0001j\u0001j\u0001j\u0001"+ + "j\u0001j\u0001j\u0001j\u0003j\u0548\bj\u0001k\u0001k\u0001k\u0001l\u0001"+ + "l\u0001l\u0001l\u0005l\u0551\bl\nl\fl\u0554\tl\u0001l\u0003l\u0557\bl"+ + "\u0003l\u0559\bl\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001"+ + "m\u0001m\u0003m\u0564\bm\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001"+ + "o\u0003o\u056d\bo\u0001o\u0001o\u0003o\u0571\bo\u0001o\u0003o\u0574\b"+ + "o\u0001o\u0001o\u0001o\u0001o\u0001o\u0003o\u057b\bo\u0001o\u0001o\u0001"+ + "p\u0001p\u0001q\u0001q\u0001r\u0001r\u0001s\u0003s\u0586\bs\u0001s\u0001"+ + "s\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0003t\u0590\bt\u0001t\u0001"+ + "t\u0001t\u0001t\u0003t\u0596\bt\u0003t\u0598\bt\u0001u\u0001u\u0001u\u0001"+ + "v\u0001v\u0001w\u0001w\u0001w\u0003w\u05a2\bw\u0001x\u0001x\u0001x\u0001"+ + "x\u0001x\u0001x\u0005x\u05aa\bx\nx\fx\u05ad\tx\u0001x\u0003x\u05b0\bx"+ + "\u0001y\u0001y\u0003y\u05b4\by\u0001y\u0001y\u0003y\u05b8\by\u0001z\u0001"+ + "z\u0001z\u0005z\u05bd\bz\nz\fz\u05c0\tz\u0001{\u0001{\u0001{\u0005{\u05c5"+ + "\b{\n{\f{\u05c8\t{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0005|\u05d0"+ + "\b|\n|\f|\u05d3\t|\u0001|\u0003|\u05d6\b|\u0001}\u0001}\u0003}\u05da\b"+ + "}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u05e4"+ + "\b~\n~\f~\u05e7\t~\u0001~\u0003~\u05ea\b~\u0001\u007f\u0001\u007f\u0003"+ + "\u007f\u05ee\b\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0003\u0080\u05f3"+ + "\b\u0080\u0001\u0080\u0003\u0080\u05f6\b\u0080\u0001\u0080\u0003\u0080"+ + "\u05f9\b\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0004\u0080\u05fe\b"+ + "\u0080\u000b\u0080\f\u0080\u05ff\u0001\u0081\u0001\u0081\u0001\u0081\u0001"+ + "\u0081\u0001\u0081\u0003\u0081\u0607\b\u0081\u0001\u0082\u0001\u0082\u0001"+ + "\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001"+ + "\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0086\u0001"+ + "\u0086\u0001\u0087\u0001\u0087\u0001\u0087\u0003\u0087\u061b\b\u0087\u0001"+ + "\u0088\u0001\u0088\u0003\u0088\u061f\b\u0088\u0001\u0089\u0001\u0089\u0003"+ + "\u0089\u0623\b\u0089\u0001\u008a\u0001\u008a\u0003\u008a\u0627\b\u008a"+ + "\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008d"+ + "\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ + "\u0001\u008d\u0001\u008d\u0003\u008d\u0637\b\u008d\u0001\u008d\u0001\u008d"+ + "\u0001\u008d\u0001\u008d\u0003\u008d\u063d\b\u008d\u0003\u008d\u063f\b"+ + "\u008d\u0001\u008e\u0001\u008e\u0003\u008e\u0643\b\u008e\u0001\u008f\u0001"+ + "\u008f\u0003\u008f\u0647\b\u008f\u0001\u008f\u0003\u008f\u064a\b\u008f"+ + "\u0001\u008f\u0001\u008f\u0003\u008f\u064e\b\u008f\u0003\u008f\u0650\b"+ + "\u008f\u0001\u008f\u0001\u008f\u0005\u008f\u0654\b\u008f\n\u008f\f\u008f"+ + "\u0657\t\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090"+ + "\u0003\u0090\u065e\b\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091"+ + "\u0663\b\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u066e\b\u0092"+ + "\u0001\u0092\u0001\u0092\u0005\u0092\u0672\b\u0092\n\u0092\f\u0092\u0675"+ + "\t\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0003\u0093\u067b"+ + "\b\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+ + "\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0003\u0094\u0686\b\u0094\u0001"+ + "\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u068b\b\u0095\u0001\u0096\u0001"+ + "\u0096\u0003\u0096\u068f\b\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0003"+ + "\u0096\u0694\b\u0096\u0005\u0096\u0696\b\u0096\n\u0096\f\u0096\u0699\t"+ + "\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0005\u0097\u069e\b\u0097\n"+ + "\u0097\f\u0097\u06a1\t\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001"+ + "\u0098\u0001\u0098\u0003\u0098\u06a8\b\u0098\u0001\u0099\u0001\u0099\u0001"+ + "\u0099\u0003\u0099\u06ad\b\u0099\u0001\u0099\u0003\u0099\u06b0\b\u0099"+ + "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a"+ + "\u0003\u009a\u06b8\b\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b"+ + "\u0003\u009b\u06be\b\u009b\u0001\u009b\u0001\u009b\u0003\u009b\u06c2\b"+ + "\u009b\u0003\u009b\u06c4\b\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0003"+ + "\u009c\u06c9\b\u009c\u0001\u009c\u0001\u009c\u0003\u009c\u06cd\b\u009c"+ + "\u0001\u009c\u0001\u009c\u0003\u009c\u06d1\b\u009c\u0001\u009d\u0001\u009d"+ + "\u0001\u009d\u0001\u009e\u0001\u009e\u0003\u009e\u06d8\b\u009e\u0001\u009f"+ + "\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0"+ + "\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3"+ + "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06f5\b\u00a5\u0001\u00a5\u0001\u00a5"+ + "\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ + "\u0001\u00a7\u0003\u00a7\u0700\b\u00a7\u0001\u00a8\u0001\u00a8\u0003\u00a8"+ + "\u0704\b\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0005\u00a9"+ + "\u070a\b\u00a9\n\u00a9\f\u00a9\u070d\t\u00a9\u0001\u00a9\u0003\u00a9\u0710"+ + "\b\u00a9\u0003\u00a9\u0712\b\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa"+ + "\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0003\u00aa\u071a\b\u00aa\u0001\u00aa"+ + "\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ + "\u0003\u00ab\u0723\b\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac"+ + "\u0001\u00ac\u0001\u00ac\u0003\u00ac\u072b\b\u00ac\u0001\u00ad\u0001\u00ad"+ + "\u0001\u00ad\u0003\u00ad\u0730\b\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00af"+ + "\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1"+ + "\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0003\u00b2"+ + "\u0740\b\u00b2\u0003\u00b2\u0742\b\u00b2\u0001\u00b2\u0001\u00b2\u0001"+ + "\u00b3\u0001\u00b3\u0001\u00b3\u0005\u00b3\u0749\b\u00b3\n\u00b3\f\u00b3"+ + "\u074c\t\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0003\u00b4\u0751\b"+ + "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0003\u00b5\u0757"+ + "\b\u00b5\u0001\u00b6\u0001\u00b6\u0003\u00b6\u075b\b\u00b6\u0001\u00b7"+ + "\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0005\u00b7\u0762\b\u00b7"+ + "\n\u00b7\f\u00b7\u0765\t\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001"+ + "\u00b8\u0001\u00b9\u0003\u00b9\u076c\b\u00b9\u0001\u00b9\u0001\u00b9\u0001"+ + "\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001"+ + "\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001"+ + "\u00bc\u0001\u00bc\u0003\u00bc\u077e\b\u00bc\u0003\u00bc\u0780\b\u00bc"+ + "\u0001\u00bc\u0003\u00bc\u0783\b\u00bc\u0001\u00bc\u0003\u00bc\u0786\b"+ + "\u00bc\u0003\u00bc\u0788\b\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001"+ + "\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00bf\u0001"+ + "\u00bf\u0001\u00bf\u0001\u00bf\u0003\u00bf\u0796\b\u00bf\u0001\u00bf\u0001"+ + "\u031b\u0002\u00b4\u00c4\u00c0\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ + "\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPR"+ + "TVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e"+ + "\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6"+ + "\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be"+ + "\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6"+ + "\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee"+ + "\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106"+ + "\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e"+ + "\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136"+ + "\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c\u014e"+ + "\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166"+ + "\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u017a\u017c\u017e"+ + "\u0000\u0014\u0002\u0000iitt\u0001\u0000\u0017\u0018\u0001\u0000\u0005"+ + "\b\u0001\u0000BC\u0001\u0000(*\u0002\u0000(*,,\u0002\u0000jkqq\u0001\u0000"+ + "\u0087\u008d\u0001\u0000\u0014\u0015\u0002\u0000\u0082\u0086\u008b\u008c"+ + "\u0004\u0000##uu\u0081\u0081\u0088\u008a\u0001\u0000\u001f!\u0001\u0000"+ + "\u001c\u001e\u0002\u0000IJ{\u0080\u0004\u0000..1144aa\u0002\u0000\u0081"+ + "\u0086\u0088\u008c\u0001\u0000uv\u0002\u0000rr\u00a3\u00a3\u0002\u0000"+ + "\u008e\u0091\u0093\u0094\u0001\u0000\u009a\u009b\u0806\u0000\u0180\u0001"+ + "\u0000\u0000\u0000\u0002\u0183\u0001\u0000\u0000\u0000\u0004\u0186\u0001"+ + "\u0000\u0000\u0000\u0006\u0189\u0001\u0000\u0000\u0000\b\u0191\u0001\u0000"+ + "\u0000\u0000\n\u019a\u0001\u0000\u0000\u0000\f\u01ba\u0001\u0000\u0000"+ + "\u0000\u000e\u01c7\u0001\u0000\u0000\u0000\u0010\u01ca\u0001\u0000\u0000"+ + "\u0000\u0012\u01d2\u0001\u0000\u0000\u0000\u0014\u01df\u0001\u0000\u0000"+ + "\u0000\u0016\u01f5\u0001\u0000\u0000\u0000\u0018\u01fe\u0001\u0000\u0000"+ + "\u0000\u001a\u0200\u0001\u0000\u0000\u0000\u001c\u0202\u0001\u0000\u0000"+ + "\u0000\u001e\u0205\u0001\u0000\u0000\u0000 \u0219\u0001\u0000\u0000\u0000"+ + "\"\u021b\u0001\u0000\u0000\u0000$\u021d\u0001\u0000\u0000\u0000&\u0222"+ + "\u0001\u0000\u0000\u0000(\u022d\u0001\u0000\u0000\u0000*\u023a\u0001\u0000"+ + "\u0000\u0000,\u023d\u0001\u0000\u0000\u0000.\u0248\u0001\u0000\u0000\u0000"+ + "0\u024a\u0001\u0000\u0000\u00002\u024f\u0001\u0000\u0000\u00004\u0254"+ + "\u0001\u0000\u0000\u00006\u0259\u0001\u0000\u0000\u00008\u025e\u0001\u0000"+ + "\u0000\u0000:\u026b\u0001\u0000\u0000\u0000<\u026d\u0001\u0000\u0000\u0000"+ + ">\u026f\u0001\u0000\u0000\u0000@\u0274\u0001\u0000\u0000\u0000B\u0279"+ + "\u0001\u0000\u0000\u0000D\u027e\u0001\u0000\u0000\u0000F\u0287\u0001\u0000"+ + "\u0000\u0000H\u028e\u0001\u0000\u0000\u0000J\u029b\u0001\u0000\u0000\u0000"+ + "L\u029f\u0001\u0000\u0000\u0000N\u02aa\u0001\u0000\u0000\u0000P\u02b3"+ + "\u0001\u0000\u0000\u0000R\u02b5\u0001\u0000\u0000\u0000T\u02ca\u0001\u0000"+ + "\u0000\u0000V\u02cc\u0001\u0000\u0000\u0000X\u02d8\u0001\u0000\u0000\u0000"+ + "Z\u02e5\u0001\u0000\u0000\u0000\\\u02e9\u0001\u0000\u0000\u0000^\u02ee"+ + "\u0001\u0000\u0000\u0000`\u02fd\u0001\u0000\u0000\u0000b\u030d\u0001\u0000"+ + "\u0000\u0000d\u031b\u0001\u0000\u0000\u0000f\u0326\u0001\u0000\u0000\u0000"+ + "h\u032a\u0001\u0000\u0000\u0000j\u0332\u0001\u0000\u0000\u0000l\u0339"+ + "\u0001\u0000\u0000\u0000n\u0341\u0001\u0000\u0000\u0000p\u0351\u0001\u0000"+ + "\u0000\u0000r\u0354\u0001\u0000\u0000\u0000t\u035c\u0001\u0000\u0000\u0000"+ + "v\u035e\u0001\u0000\u0000\u0000x\u0369\u0001\u0000\u0000\u0000z\u0371"+ + "\u0001\u0000\u0000\u0000|\u0380\u0001\u0000\u0000\u0000~\u0382\u0001\u0000"+ + "\u0000\u0000\u0080\u038a\u0001\u0000\u0000\u0000\u0082\u0398\u0001\u0000"+ + "\u0000\u0000\u0084\u03a4\u0001\u0000\u0000\u0000\u0086\u03ae\u0001\u0000"+ + "\u0000\u0000\u0088\u03b2\u0001\u0000\u0000\u0000\u008a\u03b8\u0001\u0000"+ + "\u0000\u0000\u008c\u03d0\u0001\u0000\u0000\u0000\u008e\u03d8\u0001\u0000"+ + "\u0000\u0000\u0090\u03e7\u0001\u0000\u0000\u0000\u0092\u03e9\u0001\u0000"+ + "\u0000\u0000\u0094\u03f0\u0001\u0000\u0000\u0000\u0096\u03f9\u0001\u0000"+ + "\u0000\u0000\u0098\u03fe\u0001\u0000\u0000\u0000\u009a\u0403\u0001\u0000"+ + "\u0000\u0000\u009c\u0409\u0001\u0000\u0000\u0000\u009e\u0410\u0001\u0000"+ + "\u0000\u0000\u00a0\u0415\u0001\u0000\u0000\u0000\u00a2\u041b\u0001\u0000"+ + "\u0000\u0000\u00a4\u0420\u0001\u0000\u0000\u0000\u00a6\u0427\u0001\u0000"+ + "\u0000\u0000\u00a8\u0431\u0001\u0000\u0000\u0000\u00aa\u0435\u0001\u0000"+ + "\u0000\u0000\u00ac\u0441\u0001\u0000\u0000\u0000\u00ae\u0444\u0001\u0000"+ + "\u0000\u0000\u00b0\u0448\u0001\u0000\u0000\u0000\u00b2\u044f\u0001\u0000"+ + "\u0000\u0000\u00b4\u0468\u0001\u0000\u0000\u0000\u00b6\u04a4\u0001\u0000"+ + "\u0000\u0000\u00b8\u04a6\u0001\u0000\u0000\u0000\u00ba\u04a9\u0001\u0000"+ + "\u0000\u0000\u00bc\u04ae\u0001\u0000\u0000\u0000\u00be\u04b7\u0001\u0000"+ + "\u0000\u0000\u00c0\u04c5\u0001\u0000\u0000\u0000\u00c2\u04cf\u0001\u0000"+ + "\u0000\u0000\u00c4\u04e1\u0001\u0000\u0000\u0000\u00c6\u04fc\u0001\u0000"+ + "\u0000\u0000\u00c8\u04ff\u0001\u0000\u0000\u0000\u00ca\u0507\u0001\u0000"+ + "\u0000\u0000\u00cc\u0510\u0001\u0000\u0000\u0000\u00ce\u0520\u0001\u0000"+ + "\u0000\u0000\u00d0\u0533\u0001\u0000\u0000\u0000\u00d2\u053c\u0001\u0000"+ + "\u0000\u0000\u00d4\u0547\u0001\u0000\u0000\u0000\u00d6\u0549\u0001\u0000"+ + "\u0000\u0000\u00d8\u054c\u0001\u0000\u0000\u0000\u00da\u0563\u0001\u0000"+ + "\u0000\u0000\u00dc\u0565\u0001\u0000\u0000\u0000\u00de\u056a\u0001\u0000"+ + "\u0000\u0000\u00e0\u057e\u0001\u0000\u0000\u0000\u00e2\u0580\u0001\u0000"+ + "\u0000\u0000\u00e4\u0582\u0001\u0000\u0000\u0000\u00e6\u0585\u0001\u0000"+ + "\u0000\u0000\u00e8\u058f\u0001\u0000\u0000\u0000\u00ea\u0599\u0001\u0000"+ + "\u0000\u0000\u00ec\u059c\u0001\u0000\u0000\u0000\u00ee\u05a1\u0001\u0000"+ + "\u0000\u0000\u00f0\u05a3\u0001\u0000\u0000\u0000\u00f2\u05b1\u0001\u0000"+ + "\u0000\u0000\u00f4\u05b9\u0001\u0000\u0000\u0000\u00f6\u05c1\u0001\u0000"+ + "\u0000\u0000\u00f8\u05c9\u0001\u0000\u0000\u0000\u00fa\u05d7\u0001\u0000"+ + "\u0000\u0000\u00fc\u05dd\u0001\u0000\u0000\u0000\u00fe\u05eb\u0001\u0000"+ + "\u0000\u0000\u0100\u05fd\u0001\u0000\u0000\u0000\u0102\u0606\u0001\u0000"+ + "\u0000\u0000\u0104\u0608\u0001\u0000\u0000\u0000\u0106\u060a\u0001\u0000"+ + "\u0000\u0000\u0108\u060e\u0001\u0000\u0000\u0000\u010a\u0611\u0001\u0000"+ + "\u0000\u0000\u010c\u0615\u0001\u0000\u0000\u0000\u010e\u0617\u0001\u0000"+ + "\u0000\u0000\u0110\u061c\u0001\u0000\u0000\u0000\u0112\u0620\u0001\u0000"+ + "\u0000\u0000\u0114\u0624\u0001\u0000\u0000\u0000\u0116\u0628\u0001\u0000"+ + "\u0000\u0000\u0118\u062b\u0001\u0000\u0000\u0000\u011a\u062d\u0001\u0000"+ + "\u0000\u0000\u011c\u0642\u0001\u0000\u0000\u0000\u011e\u0644\u0001\u0000"+ + "\u0000\u0000\u0120\u065a\u0001\u0000\u0000\u0000\u0122\u0662\u0001\u0000"+ + "\u0000\u0000\u0124\u0664\u0001\u0000\u0000\u0000\u0126\u067a\u0001\u0000"+ + "\u0000\u0000\u0128\u0682\u0001\u0000\u0000\u0000\u012a\u068a\u0001\u0000"+ + "\u0000\u0000\u012c\u068e\u0001\u0000\u0000\u0000\u012e\u069a\u0001\u0000"+ + "\u0000\u0000\u0130\u06a4\u0001\u0000\u0000\u0000\u0132\u06af\u0001\u0000"+ + "\u0000\u0000\u0134\u06b7\u0001\u0000\u0000\u0000\u0136\u06bb\u0001\u0000"+ + "\u0000\u0000\u0138\u06c8\u0001\u0000\u0000\u0000\u013a\u06d2\u0001\u0000"+ + "\u0000\u0000\u013c\u06d7\u0001\u0000\u0000\u0000\u013e\u06d9\u0001\u0000"+ + "\u0000\u0000\u0140\u06de\u0001\u0000\u0000\u0000\u0142\u06e0\u0001\u0000"+ + "\u0000\u0000\u0144\u06e2\u0001\u0000\u0000\u0000\u0146\u06e5\u0001\u0000"+ + "\u0000\u0000\u0148\u06e9\u0001\u0000\u0000\u0000\u014a\u06f4\u0001\u0000"+ + "\u0000\u0000\u014c\u06f8\u0001\u0000\u0000\u0000\u014e\u06ff\u0001\u0000"+ + "\u0000\u0000\u0150\u0703\u0001\u0000\u0000\u0000\u0152\u0705\u0001\u0000"+ + "\u0000\u0000\u0154\u0715\u0001\u0000\u0000\u0000\u0156\u0722\u0001\u0000"+ + "\u0000\u0000\u0158\u072a\u0001\u0000\u0000\u0000\u015a\u072f\u0001\u0000"+ + "\u0000\u0000\u015c\u0731\u0001\u0000\u0000\u0000\u015e\u0733\u0001\u0000"+ + "\u0000\u0000\u0160\u0735\u0001\u0000\u0000\u0000\u0162\u0739\u0001\u0000"+ + "\u0000\u0000\u0164\u073c\u0001\u0000\u0000\u0000\u0166\u0745\u0001\u0000"+ + "\u0000\u0000\u0168\u0750\u0001\u0000\u0000\u0000\u016a\u0756\u0001\u0000"+ + "\u0000\u0000\u016c\u075a\u0001\u0000\u0000\u0000\u016e\u075c\u0001\u0000"+ + "\u0000\u0000\u0170\u0768\u0001\u0000\u0000\u0000\u0172\u076b\u0001\u0000"+ + "\u0000\u0000\u0174\u076f\u0001\u0000\u0000\u0000\u0176\u0773\u0001\u0000"+ + "\u0000\u0000\u0178\u0778\u0001\u0000\u0000\u0000\u017a\u078b\u0001\u0000"+ + "\u0000\u0000\u017c\u078f\u0001\u0000\u0000\u0000\u017e\u0795\u0001\u0000"+ + "\u0000\u0000\u0180\u0181\u0003\u00b4Z\u0000\u0181\u0182\u0005\u0000\u0000"+ + "\u0001\u0182\u0001\u0001\u0000\u0000\u0000\u0183\u0184\u0003\u00b6[\u0000"+ + "\u0184\u0185\u0005\u0000\u0000\u0001\u0185\u0003\u0001\u0000\u0000\u0000"+ + "\u0186\u0187\u0003\u00d2i\u0000\u0187\u0188\u0005\u0000\u0000\u0001\u0188"+ + "\u0005\u0001\u0000\u0000\u0000\u0189\u018e\u0003\b\u0004\u0000\u018a\u018b"+ + "\u0005q\u0000\u0000\u018b\u018d\u0003\b\u0004\u0000\u018c\u018a\u0001"+ + "\u0000\u0000\u0000\u018d\u0190\u0001\u0000\u0000\u0000\u018e\u018c\u0001"+ + "\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000\u018f\u0007\u0001"+ + "\u0000\u0000\u0000\u0190\u018e\u0001\u0000\u0000\u0000\u0191\u0193\u0005"+ + "i\u0000\u0000\u0192\u0194\u0005=\u0000\u0000\u0193\u0192\u0001\u0000\u0000"+ + "\u0000\u0193\u0194\u0001\u0000\u0000\u0000\u0194\t\u0001\u0000\u0000\u0000"+ + "\u0195\u0196\u0003\u000e\u0007\u0000\u0196\u0197\u0003\u017e\u00bf\u0000"+ + "\u0197\u0199\u0001\u0000\u0000\u0000\u0198\u0195\u0001\u0000\u0000\u0000"+ + "\u0199\u019c\u0001\u0000\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000"+ + "\u019a\u019b\u0001\u0000\u0000\u0000\u019b\u019d\u0001\u0000\u0000\u0000"+ + "\u019c\u019a\u0001\u0000\u0000\u0000\u019d\u019e\u0003\u00eau\u0000\u019e"+ + "\u01a4\u0003\u017e\u00bf\u0000\u019f\u01a0\u0003\u0014\n\u0000\u01a0\u01a1"+ + "\u0003\u017e\u00bf\u0000\u01a1\u01a3\u0001\u0000\u0000\u0000\u01a2\u019f"+ + "\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4\u01a2"+ + "\u0001\u0000\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5\u01b0"+ + "\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a7\u01ab"+ + "\u0003\u0098L\u0000\u01a8\u01ab\u0003\u00eew\u0000\u01a9\u01ab\u0003\u0016"+ + "\u000b\u0000\u01aa\u01a7\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001\u0000"+ + "\u0000\u0000\u01aa\u01a9\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000"+ + "\u0000\u0000\u01ac\u01ad\u0003\u017e\u00bf\u0000\u01ad\u01af\u0001\u0000"+ + "\u0000\u0000\u01ae\u01aa\u0001\u0000\u0000\u0000\u01af\u01b2\u0001\u0000"+ + "\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000\u0000\u01b0\u01b1\u0001\u0000"+ + "\u0000\u0000\u01b1\u01b3\u0001\u0000\u0000\u0000\u01b2\u01b0\u0001\u0000"+ + "\u0000\u0000\u01b3\u01b4\u0005\u0000\u0000\u0001\u01b4\u000b\u0001\u0000"+ + "\u0000\u0000\u01b5\u01b6\u0003\u000e\u0007\u0000\u01b6\u01b7\u0003\u017e"+ + "\u00bf\u0000\u01b7\u01b9\u0001\u0000\u0000\u0000\u01b8\u01b5\u0001\u0000"+ + "\u0000\u0000\u01b9\u01bc\u0001\u0000\u0000\u0000\u01ba\u01b8\u0001\u0000"+ + "\u0000\u0000\u01ba\u01bb\u0001\u0000\u0000\u0000\u01bb\u01bd\u0001\u0000"+ + "\u0000\u0000\u01bc\u01ba\u0001\u0000\u0000\u0000\u01bd\u01be\u0003\u00ea"+ + "u\u0000\u01be\u01c4\u0003\u017e\u00bf\u0000\u01bf\u01c0\u0003\u0014\n"+ + "\u0000\u01c0\u01c1\u0003\u017e\u00bf\u0000\u01c1\u01c3\u0001\u0000\u0000"+ + "\u0000\u01c2\u01bf\u0001\u0000\u0000\u0000\u01c3\u01c6\u0001\u0000\u0000"+ + "\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c4\u01c5\u0001\u0000\u0000"+ + "\u0000\u01c5\r\u0001\u0000\u0000\u0000\u01c6\u01c4\u0001\u0000\u0000\u0000"+ + "\u01c7\u01c8\u0005F\u0000\u0000\u01c8\u01c9\u0003\u00b4Z\u0000\u01c9\u000f"+ + "\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005G\u0000\u0000\u01cb\u01cc\u0003"+ + "\u00b4Z\u0000\u01cc\u0011\u0001\u0000\u0000\u0000\u01cd\u01ce\u0003\u0010"+ + "\b\u0000\u01ce\u01cf\u0003\u017e\u00bf\u0000\u01cf\u01d1\u0001\u0000\u0000"+ + "\u0000\u01d0\u01cd\u0001\u0000\u0000\u0000\u01d1\u01d4\u0001\u0000\u0000"+ + "\u0000\u01d2\u01d0\u0001\u0000\u0000\u0000\u01d2\u01d3\u0001\u0000\u0000"+ + "\u0000\u01d3\u01d6\u0001\u0000\u0000\u0000\u01d4\u01d2\u0001\u0000\u0000"+ + "\u0000\u01d5\u01d7\u0007\u0000\u0000\u0000\u01d6\u01d5\u0001\u0000\u0000"+ + "\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7\u01d8\u0001\u0000\u0000"+ + "\u0000\u01d8\u01d9\u0003\u00ecv\u0000\u01d9\u0013\u0001\u0000\u0000\u0000"+ + "\u01da\u01db\u0003\u0010\b\u0000\u01db\u01dc\u0003\u017e\u00bf\u0000\u01dc"+ + "\u01de\u0001\u0000\u0000\u0000\u01dd\u01da\u0001\u0000\u0000\u0000\u01de"+ + "\u01e1\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df"+ + "\u01e0\u0001\u0000\u0000\u0000\u01e0\u01ef\u0001\u0000\u0000\u0000\u01e1"+ + "\u01df\u0001\u0000\u0000\u0000\u01e2\u01e3\u0005e\u0000\u0000\u01e3\u01f0"+ + "\u0003\u0012\t\u0000\u01e4\u01e5\u0005e\u0000\u0000\u01e5\u01eb\u0005"+ + "j\u0000\u0000\u01e6\u01e7\u0003\u0012\t\u0000\u01e7\u01e8\u0003\u017e"+ + "\u00bf\u0000\u01e8\u01ea\u0001\u0000\u0000\u0000\u01e9\u01e6\u0001\u0000"+ + "\u0000\u0000\u01ea\u01ed\u0001\u0000\u0000\u0000\u01eb\u01e9\u0001\u0000"+ + "\u0000\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000\u01ec\u01ee\u0001\u0000"+ + "\u0000\u0000\u01ed\u01eb\u0001\u0000\u0000\u0000\u01ee\u01f0\u0005k\u0000"+ + "\u0000\u01ef\u01e2\u0001\u0000\u0000\u0000\u01ef\u01e4\u0001\u0000\u0000"+ + "\u0000\u01f0\u0015\u0001\u0000\u0000\u0000\u01f1\u01f6\u0003\u008aE\u0000"+ + "\u01f2\u01f6\u0003\u00a0P\u0000\u01f3\u01f6\u0003\u00a4R\u0000\u01f4\u01f6"+ + "\u0003\u009eO\u0000\u01f5\u01f1\u0001\u0000\u0000\u0000\u01f5\u01f2\u0001"+ + "\u0000\u0000\u0000\u01f5\u01f3\u0001\u0000\u0000\u0000\u01f5\u01f4\u0001"+ + "\u0000\u0000\u0000\u01f6\u0017\u0001\u0000\u0000\u0000\u01f7\u01f8\u0005"+ + "\u001b\u0000\u0000\u01f8\u01ff\u0003\u00b6[\u0000\u01f9\u01fa\u0007\u0001"+ + "\u0000\u0000\u01fa\u01ff\u0003.\u0017\u0000\u01fb\u01fc\u0007\u0002\u0000"+ + "\u0000\u01fc\u01ff\u0003\u00b4Z\u0000\u01fd\u01ff\u0003v;\u0000\u01fe"+ + "\u01f7\u0001\u0000\u0000\u0000\u01fe\u01f9\u0001\u0000\u0000\u0000\u01fe"+ + "\u01fb\u0001\u0000\u0000\u0000\u01fe\u01fd\u0001\u0000\u0000\u0000\u01ff"+ + "\u0019\u0001\u0000\u0000\u0000\u0200\u0201\u0003\u001c\u000e\u0000\u0201"+ + "\u001b\u0001\u0000\u0000\u0000\u0202\u0203\u0003d2\u0000\u0203\u0204\u0003"+ + "\u001e\u000f\u0000\u0204\u001d\u0001\u0000\u0000\u0000\u0205\u0206\u0005"+ + "E\u0000\u0000\u0206\u0208\u0005j\u0000\u0000\u0207\u0209\u0003\u0100\u0080"+ + "\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0208\u0209\u0001\u0000\u0000"+ + "\u0000\u0209\u020a\u0001\u0000\u0000\u0000\u020a\u020b\u0005k\u0000\u0000"+ + "\u020b\u001f\u0001\u0000\u0000\u0000\u020c\u021a\u0003F#\u0000\u020d\u021a"+ + "\u0003D\"\u0000\u020e\u021a\u0003B!\u0000\u020f\u021a\u0003$\u0012\u0000"+ + "\u0210\u021a\u0003@ \u0000\u0211\u021a\u00038\u001c\u0000\u0212\u021a"+ + "\u0003>\u001f\u0000\u0213\u021a\u00036\u001b\u0000\u0214\u021a\u00032"+ + "\u0019\u0000\u0215\u021a\u00030\u0018\u0000\u0216\u021a\u00034\u001a\u0000"+ + "\u0217\u021a\u0003\"\u0011\u0000\u0218\u021a\u0003H$\u0000\u0219\u020c"+ + "\u0001\u0000\u0000\u0000\u0219\u020d\u0001\u0000\u0000\u0000\u0219\u020e"+ + "\u0001\u0000\u0000\u0000\u0219\u020f\u0001\u0000\u0000\u0000\u0219\u0210"+ + "\u0001\u0000\u0000\u0000\u0219\u0211\u0001\u0000\u0000\u0000\u0219\u0212"+ + "\u0001\u0000\u0000\u0000\u0219\u0213\u0001\u0000\u0000\u0000\u0219\u0214"+ + "\u0001\u0000\u0000\u0000\u0219\u0215\u0001\u0000\u0000\u0000\u0219\u0216"+ + "\u0001\u0000\u0000\u0000\u0219\u0217\u0001\u0000\u0000\u0000\u0219\u0218"+ + "\u0001\u0000\u0000\u0000\u021a!\u0001\u0000\u0000\u0000\u021b\u021c\u0007"+ + "\u0003\u0000\u0000\u021c#\u0001\u0000\u0000\u0000\u021d\u021e\u0005b\u0000"+ + "\u0000\u021e\u021f\u0005n\u0000\u0000\u021f\u0220\u0003\u00d2i\u0000\u0220"+ + "\u0221\u0005o\u0000\u0000\u0221%\u0001\u0000\u0000\u0000\u0222\u0227\u0003"+ + "(\u0014\u0000\u0223\u0224\u0005q\u0000\u0000\u0224\u0226\u0003(\u0014"+ + "\u0000\u0225\u0223\u0001\u0000\u0000\u0000\u0226\u0229\u0001\u0000\u0000"+ + "\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0228\u0001\u0000\u0000"+ + "\u0000\u0228\u022b\u0001\u0000\u0000\u0000\u0229\u0227\u0001\u0000\u0000"+ + "\u0000\u022a\u022c\u0005q\u0000\u0000\u022b\u022a\u0001\u0000\u0000\u0000"+ + "\u022b\u022c\u0001\u0000\u0000\u0000\u022c\'\u0001\u0000\u0000\u0000\u022d"+ + "\u0232\u0005i\u0000\u0000\u022e\u022f\u0005q\u0000\u0000\u022f\u0231\u0005"+ + "i\u0000\u0000\u0230\u022e\u0001\u0000\u0000\u0000\u0231\u0234\u0001\u0000"+ + "\u0000\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0232\u0233\u0001\u0000"+ + "\u0000\u0000\u0233\u0235\u0001\u0000\u0000\u0000\u0234\u0232\u0001\u0000"+ + "\u0000\u0000\u0235\u0236\u0003\u0142\u00a1\u0000\u0236)\u0001\u0000\u0000"+ + "\u0000\u0237\u0239\u0003,\u0016\u0000\u0238\u0237\u0001\u0000\u0000\u0000"+ + "\u0239\u023c\u0001\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000"+ + "\u023a\u023b\u0001\u0000\u0000\u0000\u023b+\u0001\u0000\u0000\u0000\u023c"+ + "\u023a\u0001\u0000\u0000\u0000\u023d\u023e\u0005l\u0000\u0000\u023e\u0243"+ + "\u0003\u00b4Z\u0000\u023f\u0240\u0005q\u0000\u0000\u0240\u0242\u0003\u00b4"+ + "Z\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0242\u0245\u0001\u0000\u0000"+ + "\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0243\u0244\u0001\u0000\u0000"+ + "\u0000\u0244\u0246\u0001\u0000\u0000\u0000\u0245\u0243\u0001\u0000\u0000"+ + "\u0000\u0246\u0247\u0005m\u0000\u0000\u0247-\u0001\u0000\u0000\u0000\u0248"+ + "\u0249\u0003\u00c4b\u0000\u0249/\u0001\u0000\u0000\u0000\u024a\u024b\u0005"+ + "2\u0000\u0000\u024b\u024c\u0005j\u0000\u0000\u024c\u024d\u0003\u00b4Z"+ + "\u0000\u024d\u024e\u0005k\u0000\u0000\u024e1\u0001\u0000\u0000\u0000\u024f"+ + "\u0250\u00058\u0000\u0000\u0250\u0251\u0005n\u0000\u0000\u0251\u0252\u0003"+ + "\u00d2i\u0000\u0252\u0253\u0005o\u0000\u0000\u02533\u0001\u0000\u0000"+ + "\u0000\u0254\u0255\u00053\u0000\u0000\u0255\u0256\u0005j\u0000\u0000\u0256"+ + "\u0257\u0003\u00b4Z\u0000\u0257\u0258\u0005k\u0000\u0000\u02585\u0001"+ + "\u0000\u0000\u0000\u0259\u025a\u0007\u0004\u0000\u0000\u025a\u025b\u0005"+ + "j\u0000\u0000\u025b\u025c\u0003\u00b4Z\u0000\u025c\u025d\u0005k\u0000"+ + "\u0000\u025d7\u0001\u0000\u0000\u0000\u025e\u0263\u0005\u0011\u0000\u0000"+ + "\u025f\u0260\u0005n\u0000\u0000\u0260\u0261\u0003:\u001d\u0000\u0261\u0262"+ + "\u0005o\u0000\u0000\u0262\u0264\u0001\u0000\u0000\u0000\u0263\u025f\u0001"+ + "\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000\u0000\u0264\u0265\u0001"+ + "\u0000\u0000\u0000\u0265\u0266\u0005j\u0000\u0000\u0266\u0267\u0003\u00b4"+ + "Z\u0000\u0267\u0268\u0005k\u0000\u0000\u02689\u0001\u0000\u0000\u0000"+ + "\u0269\u026c\u0003<\u001e\u0000\u026a\u026c\u0005\u0013\u0000\u0000\u026b"+ + "\u0269\u0001\u0000\u0000\u0000\u026b\u026a\u0001\u0000\u0000\u0000\u026c"+ + ";\u0001\u0000\u0000\u0000\u026d\u026e\u0005i\u0000\u0000\u026e=\u0001"+ + "\u0000\u0000\u0000\u026f\u0270\u0005\u0012\u0000\u0000\u0270\u0271\u0005"+ + "j\u0000\u0000\u0271\u0272\u0003\u00b4Z\u0000\u0272\u0273\u0005k\u0000"+ + "\u0000\u0273?\u0001\u0000\u0000\u0000\u0274\u0275\u0005;\u0000\u0000\u0275"+ + "\u0276\u0005j\u0000\u0000\u0276\u0277\u0003\u00b4Z\u0000\u0277\u0278\u0005"+ + "k\u0000\u0000\u0278A\u0001\u0000\u0000\u0000\u0279\u027a\u0005:\u0000"+ + "\u0000\u027a\u027b\u0005j\u0000\u0000\u027b\u027c\u0003\u00b4Z\u0000\u027c"+ + "\u027d\u0005k\u0000\u0000\u027dC\u0001\u0000\u0000\u0000\u027e\u027f\u0005"+ + "\u0016\u0000\u0000\u027f\u0280\u0005j\u0000\u0000\u0280\u0283\u0003\u00b4"+ + "Z\u0000\u0281\u0282\u0005q\u0000\u0000\u0282\u0284\u0003\u00b4Z\u0000"+ + "\u0283\u0281\u0001\u0000\u0000\u0000\u0283\u0284\u0001\u0000\u0000\u0000"+ + "\u0284\u0285\u0001\u0000\u0000\u0000\u0285\u0286\u0005k\u0000\u0000\u0286"+ + "E\u0001\u0000\u0000\u0000\u0287\u0288\u0007\u0004\u0000\u0000\u0288\u0289"+ + "\u0005n\u0000\u0000\u0289\u028a\u0003\u00b4Z\u0000\u028a\u028b\u0005>"+ + "\u0000\u0000\u028b\u028c\u0003\u00b4Z\u0000\u028c\u028d\u0005o\u0000\u0000"+ + "\u028dG\u0001\u0000\u0000\u0000\u028e\u028f\u00057\u0000\u0000\u028f\u0290"+ + "\u0003\u00b4Z\u0000\u0290\u0296\u0005l\u0000\u0000\u0291\u0292\u0003J"+ + "%\u0000\u0292\u0293\u0003\u017e\u00bf\u0000\u0293\u0295\u0001\u0000\u0000"+ "\u0000\u0294\u0291\u0001\u0000\u0000\u0000\u0295\u0298\u0001\u0000\u0000"+ "\u0000\u0296\u0294\u0001\u0000\u0000\u0000\u0296\u0297\u0001\u0000\u0000"+ "\u0000\u0297\u0299\u0001\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000"+ @@ -14349,699 +14360,701 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "_\u0001\u0000\u0000\u0000\u02f3\u02f5\u0005\u001b\u0000\u0000\u02f4\u02f3"+ "\u0001\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5\u02f6"+ "\u0001\u0000\u0000\u0000\u02f6\u02f7\u0003\u00f4z\u0000\u02f7\u02f8\u0003"+ - "\u00d2i\u0000\u02f8\u02fb\u0001\u0000\u0000\u0000\u02f9\u02fb\u0003\u0172"+ - "\u00b9\u0000\u02fa\u02f4\u0001\u0000\u0000\u0000\u02fa\u02f9\u0001\u0000"+ - "\u0000\u0000\u02fb\u02fd\u0001\u0000\u0000\u0000\u02fc\u02fe\u0003\u0170"+ - "\u00b8\u0000\u02fd\u02fc\u0001\u0000\u0000\u0000\u02fd\u02fe\u0001\u0000"+ - "\u0000\u0000\u02fea\u0001\u0000\u0000\u0000\u02ff\u0300\u0007\u0005\u0000"+ - "\u0000\u0300\u0301\u0005n\u0000\u0000\u0301\u0302\u0003\u00d2i\u0000\u0302"+ - "\u0303\u0005o\u0000\u0000\u0303\u030b\u0001\u0000\u0000\u0000\u0304\u0305"+ - "\u0005+\u0000\u0000\u0305\u0306\u0005n\u0000\u0000\u0306\u0307\u0003\u00d2"+ - "i\u0000\u0307\u0308\u0005o\u0000\u0000\u0308\u0309\u0003\u00d2i\u0000"+ - "\u0309\u030b\u0001\u0000\u0000\u0000\u030a\u02ff\u0001\u0000\u0000\u0000"+ - "\u030a\u0304\u0001\u0000\u0000\u0000\u030bc\u0001\u0000\u0000\u0000\u030c"+ - "\u0314\u0003p8\u0000\u030d\u030e\u0005L\u0000\u0000\u030e\u0314\u0006"+ - "2\uffff\uffff\u0000\u030f\u0310\u0005\u000e\u0000\u0000\u0310\u0314\u0006"+ - "2\uffff\uffff\u0000\u0311\u0312\u0005D\u0000\u0000\u0312\u0314\u00062"+ - "\uffff\uffff\u0000\u0313\u030c\u0001\u0000\u0000\u0000\u0313\u030d\u0001"+ - "\u0000\u0000\u0000\u0313\u030f\u0001\u0000\u0000\u0000\u0313\u0311\u0001"+ - "\u0000\u0000\u0000\u0314\u0315\u0001\u0000\u0000\u0000\u0315\u0317\u0003"+ - "\u017e\u00bf\u0000\u0316\u0313\u0001\u0000\u0000\u0000\u0317\u031a\u0001"+ - "\u0000\u0000\u0000\u0318\u0319\u0001\u0000\u0000\u0000\u0318\u0316\u0001"+ - "\u0000\u0000\u0000\u0319\u031d\u0001\u0000\u0000\u0000\u031a\u0318\u0001"+ - "\u0000\u0000\u0000\u031b\u031c\u0005\u000e\u0000\u0000\u031c\u031e\u0006"+ - "2\uffff\uffff\u0000\u031d\u031b\u0001\u0000\u0000\u0000\u031d\u031e\u0001"+ - "\u0000\u0000\u0000\u031e\u0320\u0001\u0000\u0000\u0000\u031f\u0321\u0003"+ - "n7\u0000\u0320\u031f\u0001\u0000\u0000\u0000\u0320\u0321\u0001\u0000\u0000"+ - "\u0000\u0321e\u0001\u0000\u0000\u0000\u0322\u0324\b\u0006\u0000\u0000"+ - "\u0323\u0322\u0001\u0000\u0000\u0000\u0324\u0325\u0001\u0000\u0000\u0000"+ - "\u0325\u0323\u0001\u0000\u0000\u0000\u0325\u0326\u0001\u0000\u0000\u0000"+ - "\u0326g\u0001\u0000\u0000\u0000\u0327\u032c\u0003f3\u0000\u0328\u0329"+ - "\u0005q\u0000\u0000\u0329\u032b\u0003f3\u0000\u032a\u0328\u0001\u0000"+ - "\u0000\u0000\u032b\u032e\u0001\u0000\u0000\u0000\u032c\u032a\u0001\u0000"+ - "\u0000\u0000\u032c\u032d\u0001\u0000\u0000\u0000\u032di\u0001\u0000\u0000"+ - "\u0000\u032e\u032c\u0001\u0000\u0000\u0000\u032f\u0330\u0003f3\u0000\u0330"+ - "\u0332\u0005j\u0000\u0000\u0331\u0333\u0003h4\u0000\u0332\u0331\u0001"+ - "\u0000\u0000\u0000\u0332\u0333\u0001\u0000\u0000\u0000\u0333\u0334\u0001"+ - "\u0000\u0000\u0000\u0334\u0335\u0005k\u0000\u0000\u0335k\u0001\u0000\u0000"+ - "\u0000\u0336\u033b\u0003j5\u0000\u0337\u0338\u0005q\u0000\u0000\u0338"+ - "\u033a\u0003j5\u0000\u0339\u0337\u0001\u0000\u0000\u0000\u033a\u033d\u0001"+ - "\u0000\u0000\u0000\u033b\u0339\u0001\u0000\u0000\u0000\u033b\u033c\u0001"+ - "\u0000\u0000\u0000\u033cm\u0001\u0000\u0000\u0000\u033d\u033b\u0001\u0000"+ - "\u0000\u0000\u033e\u033f\u0005N\u0000\u0000\u033f\u0341\u0005n\u0000\u0000"+ - "\u0340\u0342\u0003l6\u0000\u0341\u0340\u0001\u0000\u0000\u0000\u0341\u0342"+ - "\u0001\u0000\u0000\u0000\u0342\u0343\u0001\u0000\u0000\u0000\u0343\u0344"+ - "\u0005o\u0000\u0000\u0344\u0345\u0003\u017e\u00bf\u0000\u0345o\u0001\u0000"+ - "\u0000\u0000\u0346\u0347\u0005\t\u0000\u0000\u0347\u034f\u0003t:\u0000"+ - "\u0348\u0349\u0005\n\u0000\u0000\u0349\u034f\u0003t:\u0000\u034a\u034b"+ - "\u0005\u000b\u0000\u0000\u034b\u034f\u0003t:\u0000\u034c\u034d\u0005\r"+ - "\u0000\u0000\u034d\u034f\u0003r9\u0000\u034e\u0346\u0001\u0000\u0000\u0000"+ - "\u034e\u0348\u0001\u0000\u0000\u0000\u034e\u034a\u0001\u0000\u0000\u0000"+ - "\u034e\u034c\u0001\u0000\u0000\u0000\u034fq\u0001\u0000\u0000\u0000\u0350"+ - "\u0352\u0003\u00f6{\u0000\u0351\u0350\u0001\u0000\u0000\u0000\u0351\u0352"+ - "\u0001\u0000\u0000\u0000\u0352\u0355\u0001\u0000\u0000\u0000\u0353\u0354"+ - "\u0005`\u0000\u0000\u0354\u0356\u0003\u00b4Z\u0000\u0355\u0353\u0001\u0000"+ - "\u0000\u0000\u0355\u0356\u0001\u0000\u0000\u0000\u0356s\u0001\u0000\u0000"+ - "\u0000\u0357\u035a\u0001\u0000\u0000\u0000\u0358\u035a\u0003\u00b4Z\u0000"+ - "\u0359\u0357\u0001\u0000\u0000\u0000\u0359\u0358\u0001\u0000\u0000\u0000"+ - "\u035au\u0001\u0000\u0000\u0000\u035b\u035c\u00057\u0000\u0000\u035c\u035d"+ - "\u0003\u00b4Z\u0000\u035d\u0361\u0005l\u0000\u0000\u035e\u0360\u0003x"+ - "<\u0000\u035f\u035e\u0001\u0000\u0000\u0000\u0360\u0363\u0001\u0000\u0000"+ - "\u0000\u0361\u035f\u0001\u0000\u0000\u0000\u0361\u0362\u0001\u0000\u0000"+ - "\u0000\u0362\u0364\u0001\u0000\u0000\u0000\u0363\u0361\u0001\u0000\u0000"+ - "\u0000\u0364\u0365\u0005m\u0000\u0000\u0365w\u0001\u0000\u0000\u0000\u0366"+ - "\u0367\u0003z=\u0000\u0367\u0369\u0005s\u0000\u0000\u0368\u036a\u0003"+ - "\u0100\u0080\u0000\u0369\u0368\u0001\u0000\u0000\u0000\u0369\u036a\u0001"+ - "\u0000\u0000\u0000\u036ay\u0001\u0000\u0000\u0000\u036b\u036c\u0005T\u0000"+ - "\u0000\u036c\u036f\u0003|>\u0000\u036d\u036f\u0005P\u0000\u0000\u036e"+ - "\u036b\u0001\u0000\u0000\u0000\u036e\u036d\u0001\u0000\u0000\u0000\u036f"+ - "{\u0001\u0000\u0000\u0000\u0370\u0371\u0005%\u0000\u0000\u0371\u037e\u0005"+ - "i\u0000\u0000\u0372\u0373\u0003\u00dam\u0000\u0373\u0378\u0005l\u0000"+ - "\u0000\u0374\u0376\u0003~?\u0000\u0375\u0377\u0005q\u0000\u0000\u0376"+ - "\u0375\u0001\u0000\u0000\u0000\u0376\u0377\u0001\u0000\u0000\u0000\u0377"+ - "\u0379\u0001\u0000\u0000\u0000\u0378\u0374\u0001\u0000\u0000\u0000\u0378"+ - "\u0379\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000\u037a"+ - "\u037b\u0005m\u0000\u0000\u037b\u037e\u0001\u0000\u0000\u0000\u037c\u037e"+ - "\u0003\u00b4Z\u0000\u037d\u0370\u0001\u0000\u0000\u0000\u037d\u0372\u0001"+ - "\u0000\u0000\u0000\u037d\u037c\u0001\u0000\u0000\u0000\u037e}\u0001\u0000"+ - "\u0000\u0000\u037f\u0384\u0003|>\u0000\u0380\u0381\u0005q\u0000\u0000"+ - "\u0381\u0383\u0003|>\u0000\u0382\u0380\u0001\u0000\u0000\u0000\u0383\u0386"+ - "\u0001\u0000\u0000\u0000\u0384\u0382\u0001\u0000\u0000\u0000\u0384\u0385"+ - "\u0001\u0000\u0000\u0000\u0385\u007f\u0001\u0000\u0000\u0000\u0386\u0384"+ - "\u0001\u0000\u0000\u0000\u0387\u038c\u0005l\u0000\u0000\u0388\u0389\u0005"+ - "<\u0000\u0000\u0389\u038a\u0003\u00f4z\u0000\u038a\u038b\u0003\u017e\u00bf"+ - "\u0000\u038b\u038d\u0001\u0000\u0000\u0000\u038c\u0388\u0001\u0000\u0000"+ - "\u0000\u038c\u038d\u0001\u0000\u0000\u0000\u038d\u038f\u0001\u0000\u0000"+ - "\u0000\u038e\u0390\u0003\u0100\u0080\u0000\u038f\u038e\u0001\u0000\u0000"+ - "\u0000\u038f\u0390\u0001\u0000\u0000\u0000\u0390\u0391\u0001\u0000\u0000"+ - "\u0000\u0391\u0392\u0005m\u0000\u0000\u0392\u0081\u0001\u0000\u0000\u0000"+ - "\u0393\u0396\u0003\u0160\u00b0\u0000\u0394\u0396\u0005i\u0000\u0000\u0395"+ - "\u0393\u0001\u0000\u0000\u0000\u0395\u0394\u0001\u0000\u0000\u0000\u0396"+ - "\u039f\u0001\u0000\u0000\u0000\u0397\u039c\u0005l\u0000\u0000\u0398\u039a"+ - "\u0003\u0084B\u0000\u0399\u039b\u0005q\u0000\u0000\u039a\u0399\u0001\u0000"+ - "\u0000\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u039d\u0001\u0000"+ - "\u0000\u0000\u039c\u0398\u0001\u0000\u0000\u0000\u039c\u039d\u0001\u0000"+ - "\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u03a0\u0005m\u0000"+ - "\u0000\u039f\u0397\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000"+ - "\u0000\u03a0\u0083\u0001\u0000\u0000\u0000\u03a1\u03a6\u0003\u0086C\u0000"+ - "\u03a2\u03a3\u0005q\u0000\u0000\u03a3\u03a5\u0003\u0086C\u0000\u03a4\u03a2"+ - "\u0001\u0000\u0000\u0000\u03a5\u03a8\u0001\u0000\u0000\u0000\u03a6\u03a4"+ - "\u0001\u0000\u0000\u0000\u03a6\u03a7\u0001\u0000\u0000\u0000\u03a7\u0085"+ - "\u0001\u0000\u0000\u0000\u03a8\u03a6\u0001\u0000\u0000\u0000\u03a9\u03aa"+ - "\u0005i\u0000\u0000\u03aa\u03ac\u0005s\u0000\u0000\u03ab\u03a9\u0001\u0000"+ - "\u0000\u0000\u03ab\u03ac\u0001\u0000\u0000\u0000\u03ac\u03ad\u0001\u0000"+ - "\u0000\u0000\u03ad\u03ae\u0003\u00b4Z\u0000\u03ae\u0087\u0001\u0000\u0000"+ - "\u0000\u03af\u03b0\u0005H\u0000\u0000\u03b0\u03b1\u0003\u00b4Z\u0000\u03b1"+ - "\u03b2\u0005\u000f\u0000\u0000\u03b2\u03b3\u0003\u0082A\u0000\u03b3\u03b4"+ - "\u0003\u00fe\u007f\u0000\u03b4\u0089\u0001\u0000\u0000\u0000\u03b5\u03b6"+ - "\u0003\u00d2i\u0000\u03b6\u03b7\u0005\u000f\u0000\u0000\u03b7\u03ca\u0003"+ - "\u00d2i\u0000\u03b8\u03be\u0005l\u0000\u0000\u03b9\u03ba\u0003\u0092I"+ - "\u0000\u03ba\u03bb\u0003\u017e\u00bf\u0000\u03bb\u03bd\u0001\u0000\u0000"+ - "\u0000\u03bc\u03b9\u0001\u0000\u0000\u0000\u03bd\u03c0\u0001\u0000\u0000"+ - "\u0000\u03be\u03bc\u0001\u0000\u0000\u0000\u03be\u03bf\u0001\u0000\u0000"+ - "\u0000\u03bf\u03c6\u0001\u0000\u0000\u0000\u03c0\u03be\u0001\u0000\u0000"+ - "\u0000\u03c1\u03c2\u0003\u008cF\u0000\u03c2\u03c3\u0003\u017e\u00bf\u0000"+ - "\u03c3\u03c5\u0001\u0000\u0000\u0000\u03c4\u03c1\u0001\u0000\u0000\u0000"+ - "\u03c5\u03c8\u0001\u0000\u0000\u0000\u03c6\u03c4\u0001\u0000\u0000\u0000"+ - "\u03c6\u03c7\u0001\u0000\u0000\u0000\u03c7\u03c9\u0001\u0000\u0000\u0000"+ - "\u03c8\u03c6\u0001\u0000\u0000\u0000\u03c9\u03cb\u0005m\u0000\u0000\u03ca"+ - "\u03b8\u0001\u0000\u0000\u0000\u03ca\u03cb\u0001\u0000\u0000\u0000\u03cb"+ - "\u008b\u0001\u0000\u0000\u0000\u03cc\u03ce\u0005\u000e\u0000\u0000\u03cd"+ - "\u03cc\u0001\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce"+ - "\u03cf\u0001\u0000\u0000\u0000\u03cf\u03d0\u0003\u008eG\u0000\u03d0\u03d1"+ - "\u0005i\u0000\u0000\u03d1\u03d3\u0003\u014e\u00a7\u0000\u03d2\u03d4\u0003"+ - "\u00fe\u007f\u0000\u03d3\u03d2\u0001\u0000\u0000\u0000\u03d3\u03d4\u0001"+ - "\u0000\u0000\u0000\u03d4\u008d\u0001\u0000\u0000\u0000\u03d5\u03d7\u0005"+ - "j\u0000\u0000\u03d6\u03d8\u0005i\u0000\u0000\u03d7\u03d6\u0001\u0000\u0000"+ - "\u0000\u03d7\u03d8\u0001\u0000\u0000\u0000\u03d8\u03da\u0001\u0000\u0000"+ - "\u0000\u03d9\u03db\u0005\u008b\u0000\u0000\u03da\u03d9\u0001\u0000\u0000"+ - "\u0000\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u03dc\u0001\u0000\u0000"+ - "\u0000\u03dc\u03dd\u0003\u013c\u009e\u0000\u03dd\u03de\u0005k\u0000\u0000"+ - "\u03de\u008f\u0001\u0000\u0000\u0000\u03df\u03e5\u0003\u00c4b\u0000\u03e0"+ - "\u03e1\u0003\u00d2i\u0000\u03e1\u03e2\u0005t\u0000\u0000\u03e2\u03e3\u0005"+ - "i\u0000\u0000\u03e3\u03e5\u0001\u0000\u0000\u0000\u03e4\u03df\u0001\u0000"+ - "\u0000\u0000\u03e4\u03e0\u0001\u0000\u0000\u0000\u03e5\u0091\u0001\u0000"+ - "\u0000\u0000\u03e6\u03e7\u00059\u0000\u0000\u03e7\u03e8\u0005i\u0000\u0000"+ - "\u03e8\u03eb\u0005w\u0000\u0000\u03e9\u03ec\u0003\u0090H\u0000\u03ea\u03ec"+ - "\u0003\u015e\u00af\u0000\u03eb\u03e9\u0001\u0000\u0000\u0000\u03eb\u03ea"+ - "\u0001\u0000\u0000\u0000\u03ec\u0093\u0001\u0000\u0000\u0000\u03ed\u03ee"+ - "\u00050\u0000\u0000\u03ee\u03ef\u0005j\u0000\u0000\u03ef\u03f2\u0003\u00d2"+ - "i\u0000\u03f0\u03f1\u0005q\u0000\u0000\u03f1\u03f3\u0003\u00f6{\u0000"+ - "\u03f2\u03f0\u0001\u0000\u0000\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000"+ - "\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0005k\u0000\u0000\u03f5"+ - "\u0095\u0001\u0000\u0000\u0000\u03f6\u03f7\u0005/\u0000\u0000\u03f7\u03f8"+ - "\u0005j\u0000\u0000\u03f8\u03f9\u0003\u00d2i\u0000\u03f9\u03fa\u0005k"+ - "\u0000\u0000\u03fa\u0097\u0001\u0000\u0000\u0000\u03fb\u03fe\u0003d2\u0000"+ - "\u03fc\u03ff\u0003\u009aM\u0000\u03fd\u03ff\u0003\u009cN\u0000\u03fe\u03fc"+ - "\u0001\u0000\u0000\u0000\u03fe\u03fd\u0001\u0000\u0000\u0000\u03ff\u0099"+ - "\u0001\u0000\u0000\u0000\u0400\u0401\u0005Q\u0000\u0000\u0401\u0402\u0005"+ - "i\u0000\u0000\u0402\u0404\u0003\u014e\u00a7\u0000\u0403\u0405\u0003\u0080"+ - "@\u0000\u0404\u0403\u0001\u0000\u0000\u0000\u0404\u0405\u0001\u0000\u0000"+ - "\u0000\u0405\u009b\u0001\u0000\u0000\u0000\u0406\u0407\u0005Q\u0000\u0000"+ - "\u0407\u0408\u0003\u00aaU\u0000\u0408\u0409\u0005i\u0000\u0000\u0409\u040b"+ - "\u0003\u014e\u00a7\u0000\u040a\u040c\u0003\u0080@\u0000\u040b\u040a\u0001"+ - "\u0000\u0000\u0000\u040b\u040c\u0001\u0000\u0000\u0000\u040c\u009d\u0001"+ - "\u0000\u0000\u0000\u040d\u0410\u0005\u001b\u0000\u0000\u040e\u0411\u0003"+ - "\u0098L\u0000\u040f\u0411\u0003\u00eew\u0000\u0410\u040e\u0001\u0000\u0000"+ - "\u0000\u0410\u040f\u0001\u0000\u0000\u0000\u0411\u009f\u0001\u0000\u0000"+ - "\u0000\u0412\u0413\u00059\u0000\u0000\u0413\u0414\u0005i\u0000\u0000\u0414"+ - "\u0416\u0003\u0152\u00a9\u0000\u0415\u0417\u0003\u00a2Q\u0000\u0416\u0415"+ - "\u0001\u0000\u0000\u0000\u0416\u0417\u0001\u0000\u0000\u0000\u0417\u00a1"+ - "\u0001\u0000\u0000\u0000\u0418\u0419\u0005l\u0000\u0000\u0419\u041a\u0003"+ - "\u00b4Z\u0000\u041a\u041b\u0003\u017e\u00bf\u0000\u041b\u041c\u0005m\u0000"+ - "\u0000\u041c\u00a3\u0001\u0000\u0000\u0000\u041d\u041e\u00059\u0000\u0000"+ - "\u041e\u041f\u0003\u00aaU\u0000\u041f\u0420\u0005i\u0000\u0000\u0420\u0422"+ - "\u0003\u0152\u00a9\u0000\u0421\u0423\u0003\u00a2Q\u0000\u0422\u0421\u0001"+ - "\u0000\u0000\u0000\u0422\u0423\u0001\u0000\u0000\u0000\u0423\u00a5\u0001"+ - "\u0000\u0000\u0000\u0424\u042c\u0003\u0006\u0003\u0000\u0425\u0428\u0003"+ - "\u00d2i\u0000\u0426\u0427\u0005p\u0000\u0000\u0427\u0429\u0003\u00f6{"+ - "\u0000\u0428\u0426\u0001\u0000\u0000\u0000\u0428\u0429\u0001\u0000\u0000"+ - "\u0000\u0429\u042d\u0001\u0000\u0000\u0000\u042a\u042b\u0005p\u0000\u0000"+ - "\u042b\u042d\u0003\u00f6{\u0000\u042c\u0425\u0001\u0000\u0000\u0000\u042c"+ - "\u042a\u0001\u0000\u0000\u0000\u042d\u00a7\u0001\u0000\u0000\u0000\u042e"+ - "\u042f\u0003\u0006\u0003\u0000\u042f\u0430\u0005w\u0000\u0000\u0430\u0431"+ - "\u0003\u00f6{\u0000\u0431\u00a9\u0001\u0000\u0000\u0000\u0432\u0434\u0005"+ - "j\u0000\u0000\u0433\u0435\u0003\b\u0004\u0000\u0434\u0433\u0001\u0000"+ - "\u0000\u0000\u0434\u0435\u0001\u0000\u0000\u0000\u0435\u0436\u0001\u0000"+ - "\u0000\u0000\u0436\u0438\u0003\u00d2i\u0000\u0437\u0439\u0005q\u0000\u0000"+ - "\u0438\u0437\u0001\u0000\u0000\u0000\u0438\u0439\u0001\u0000\u0000\u0000"+ - "\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0005k\u0000\u0000\u043b"+ - "\u00ab\u0001\u0000\u0000\u0000\u043c\u043f\u0003\u00aeW\u0000\u043d\u043f"+ - "\u0003\u00b0X\u0000\u043e\u043c\u0001\u0000\u0000\u0000\u043e\u043d\u0001"+ - "\u0000\u0000\u0000\u043f\u00ad\u0001\u0000\u0000\u0000\u0440\u0442\u0003"+ - "\u00f4z\u0000\u0441\u0440\u0001\u0000\u0000\u0000\u0441\u0442\u0001\u0000"+ - "\u0000\u0000\u0442\u0443\u0001\u0000\u0000\u0000\u0443\u0444\u0003\u00b2"+ - "Y\u0000\u0444\u00af\u0001\u0000\u0000\u0000\u0445\u0447\u0005\u001b\u0000"+ - "\u0000\u0446\u0448\u0003\u00f4z\u0000\u0447\u0446\u0001\u0000\u0000\u0000"+ - "\u0447\u0448\u0001\u0000\u0000\u0000\u0448\u0449\u0001\u0000\u0000\u0000"+ - "\u0449\u044a\u0003\u00b2Y\u0000\u044a\u00b1\u0001\u0000\u0000\u0000\u044b"+ - "\u044d\u0005x\u0000\u0000\u044c\u044b\u0001\u0000\u0000\u0000\u044c\u044d"+ - "\u0001\u0000\u0000\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f"+ - "\u0003\u00d2i\u0000\u044f\u00b3\u0001\u0000\u0000\u0000\u0450\u0451\u0006"+ - "Z\uffff\uffff\u0000\u0451\u0452\u0007\u0007\u0000\u0000\u0452\u0466\u0003"+ - "\u00b4Z\u000f\u0453\u0466\u0003\u00c4b\u0000\u0454\u0455\u0005\u0019\u0000"+ - "\u0000\u0455\u0456\u0003.\u0017\u0000\u0456\u0457\u0005\u001c\u0000\u0000"+ - "\u0457\u0458\u0003\u00b4Z\u0003\u0458\u0466\u0001\u0000\u0000\u0000\u0459"+ - "\u045a\u0005\u001a\u0000\u0000\u045a\u045b\u0003\u00a8T\u0000\u045b\u045c"+ - "\u0005\u001c\u0000\u0000\u045c\u045d\u0003\u00b4Z\u0002\u045d\u0466\u0001"+ - "\u0000\u0000\u0000\u045e\u045f\u0007\b\u0000\u0000\u045f\u0460\u0003&"+ - "\u0013\u0000\u0460\u0461\u0005s\u0000\u0000\u0461\u0462\u0005s\u0000\u0000"+ - "\u0462\u0463\u0003*\u0015\u0000\u0463\u0464\u0003\u00b4Z\u0001\u0464\u0466"+ - "\u0001\u0000\u0000\u0000\u0465\u0450\u0001\u0000\u0000\u0000\u0465\u0453"+ - "\u0001\u0000\u0000\u0000\u0465\u0454\u0001\u0000\u0000\u0000\u0465\u0459"+ - "\u0001\u0000\u0000\u0000\u0465\u045e\u0001\u0000\u0000\u0000\u0466\u048a"+ - "\u0001\u0000\u0000\u0000\u0467\u0468\n\r\u0000\u0000\u0468\u0469\u0007"+ - "\t\u0000\u0000\u0469\u0489\u0003\u00b4Z\u000e\u046a\u046b\n\f\u0000\u0000"+ - "\u046b\u046c\u0007\n\u0000\u0000\u046c\u0489\u0003\u00b4Z\r\u046d\u046e"+ - "\n\u000b\u0000\u0000\u046e\u046f\u0007\u000b\u0000\u0000\u046f\u0489\u0003"+ - "\u00b4Z\f\u0470\u0471\n\n\u0000\u0000\u0471\u0472\u0007\f\u0000\u0000"+ - "\u0472\u0489\u0003\u00b4Z\u000b\u0473\u0474\n\t\u0000\u0000\u0474\u0475"+ - "\u0007\r\u0000\u0000\u0475\u0489\u0003\u00b4Z\n\u0476\u0477\n\u0007\u0000"+ - "\u0000\u0477\u0478\u0005z\u0000\u0000\u0478\u0489\u0003\u00b4Z\b\u0479"+ - "\u047a\n\u0006\u0000\u0000\u047a\u047b\u0005y\u0000\u0000\u047b\u0489"+ - "\u0003\u00b4Z\u0007\u047c\u047d\n\u0005\u0000\u0000\u047d\u047e\u0005"+ - "\"\u0000\u0000\u047e\u0489\u0003\u00b4Z\u0005\u047f\u0480\n\u0004\u0000"+ - "\u0000\u0480\u0481\u0005%\u0000\u0000\u0481\u0482\u0003\u00b4Z\u0000\u0482"+ - "\u0483\u0005s\u0000\u0000\u0483\u0484\u0003\u00b4Z\u0004\u0484\u0489\u0001"+ - "\u0000\u0000\u0000\u0485\u0486\n\b\u0000\u0000\u0486\u0487\u0005\u000f"+ - "\u0000\u0000\u0487\u0489\u0003\u0082A\u0000\u0488\u0467\u0001\u0000\u0000"+ - "\u0000\u0488\u046a\u0001\u0000\u0000\u0000\u0488\u046d\u0001\u0000\u0000"+ - "\u0000\u0488\u0470\u0001\u0000\u0000\u0000\u0488\u0473\u0001\u0000\u0000"+ - "\u0000\u0488\u0476\u0001\u0000\u0000\u0000\u0488\u0479\u0001\u0000\u0000"+ - "\u0000\u0488\u047c\u0001\u0000\u0000\u0000\u0488\u047f\u0001\u0000\u0000"+ - "\u0000\u0488\u0485\u0001\u0000\u0000\u0000\u0489\u048c\u0001\u0000\u0000"+ - "\u0000\u048a\u0488\u0001\u0000\u0000\u0000\u048a\u048b\u0001\u0000\u0000"+ - "\u0000\u048b\u00b5\u0001\u0000\u0000\u0000\u048c\u048a\u0001\u0000\u0000"+ - "\u0000\u048d\u04a2\u0003\u0018\f\u0000\u048e\u04a2\u0003\u001a\r\u0000"+ - "\u048f\u04a2\u0003\u00ba]\u0000\u0490\u04a2\u0003\u00b8\\\u0000\u0491"+ - "\u04a2\u0003\u00eew\u0000\u0492\u04a2\u0003\u010e\u0087\u0000\u0493\u04a2"+ - "\u0003\u0102\u0081\u0000\u0494\u04a2\u0003\u013a\u009d\u0000\u0495\u04a2"+ - "\u0003\u0110\u0088\u0000\u0496\u04a2\u0003\u0112\u0089\u0000\u0497\u04a2"+ - "\u0003\u0114\u008a\u0000\u0498\u04a2\u0003\u0116\u008b\u0000\u0499\u04a2"+ - "\u0003\u0118\u008c\u0000\u049a\u04a2\u0003\u00fe\u007f\u0000\u049b\u04a2"+ - "\u0003\u011a\u008d\u0000\u049c\u04a2\u0003\u011c\u008e\u0000\u049d\u04a2"+ - "\u0003\u012e\u0097\u0000\u049e\u04a2\u0003\u00bc^\u0000\u049f\u04a2\u0003"+ - "\u00c0`\u0000\u04a0\u04a2\u0003\u0088D\u0000\u04a1\u048d\u0001\u0000\u0000"+ - "\u0000\u04a1\u048e\u0001\u0000\u0000\u0000\u04a1\u048f\u0001\u0000\u0000"+ - "\u0000\u04a1\u0490\u0001\u0000\u0000\u0000\u04a1\u0491\u0001\u0000\u0000"+ - "\u0000\u04a1\u0492\u0001\u0000\u0000\u0000\u04a1\u0493\u0001\u0000\u0000"+ - "\u0000\u04a1\u0494\u0001\u0000\u0000\u0000\u04a1\u0495\u0001\u0000\u0000"+ - "\u0000\u04a1\u0496\u0001\u0000\u0000\u0000\u04a1\u0497\u0001\u0000\u0000"+ - "\u0000\u04a1\u0498\u0001\u0000\u0000\u0000\u04a1\u0499\u0001\u0000\u0000"+ - "\u0000\u04a1\u049a\u0001\u0000\u0000\u0000\u04a1\u049b\u0001\u0000\u0000"+ - "\u0000\u04a1\u049c\u0001\u0000\u0000\u0000\u04a1\u049d\u0001\u0000\u0000"+ - "\u0000\u04a1\u049e\u0001\u0000\u0000\u0000\u04a1\u049f\u0001\u0000\u0000"+ - "\u0000\u04a1\u04a0\u0001\u0000\u0000\u0000\u04a2\u00b7\u0001\u0000\u0000"+ - "\u0000\u04a3\u04a4\u0005$\u0000\u0000\u04a4\u04a5\u0003\u00b4Z\u0000\u04a5"+ - "\u00b9\u0001\u0000\u0000\u0000\u04a6\u04a7\u0005\\\u0000\u0000\u04a7\u04a9"+ - "\u0003\u00b4Z\u0000\u04a8\u04aa\u0003\u00fe\u007f\u0000\u04a9\u04a8\u0001"+ - "\u0000\u0000\u0000\u04a9\u04aa\u0001\u0000\u0000\u0000\u04aa\u00bb\u0001"+ - "\u0000\u0000\u0000\u04ab\u04ac\u0003\u00be_\u0000\u04ac\u04ad\u0003\u0136"+ - "\u009b\u0000\u04ad\u00bd\u0001\u0000\u0000\u0000\u04ae\u04af\u0005\f\u0000"+ - "\u0000\u04af\u04b0\u0003\u00b4Z\u0000\u04b0\u04b1\u0003\u017e\u00bf\u0000"+ - "\u04b1\u04b3\u0001\u0000\u0000\u0000\u04b2\u04ae\u0001\u0000\u0000\u0000"+ - "\u04b3\u04b6\u0001\u0000\u0000\u0000\u04b4\u04b2\u0001\u0000\u0000\u0000"+ - "\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04bb\u0001\u0000\u0000\u0000"+ - "\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b7\u04b8\u0005\r\u0000\u0000\u04b8"+ - "\u04b9\u0003r9\u0000\u04b9\u04ba\u0003\u017e\u00bf\u0000\u04ba\u04bc\u0001"+ - "\u0000\u0000\u0000\u04bb\u04b7\u0001\u0000\u0000\u0000\u04bb\u04bc\u0001"+ - "\u0000\u0000\u0000\u04bc\u00bf\u0001\u0000\u0000\u0000\u04bd\u04be\u0005"+ - "U\u0000\u0000\u04be\u04c3\u0003\u00b4Z\u0000\u04bf\u04c0\u0005U\u0000"+ - "\u0000\u04c0\u04c1\u0007\u0001\u0000\u0000\u04c1\u04c3\u0003.\u0017\u0000"+ - "\u04c2\u04bd\u0001\u0000\u0000\u0000\u04c2\u04bf\u0001\u0000\u0000\u0000"+ - "\u04c3\u00c1\u0001\u0000\u0000\u0000\u04c4\u04cd\u0005\u0003\u0000\u0000"+ - "\u04c5\u04cd\u0005\u0004\u0000\u0000\u04c6\u04cd\u0005h\u0000\u0000\u04c7"+ - "\u04cd\u0003\u015c\u00ae\u0000\u04c8\u04cd\u0003\u0170\u00b8\u0000\u04c9"+ - "\u04cd\u0005\u0001\u0000\u0000\u04ca\u04cd\u0005\u0093\u0000\u0000\u04cb"+ - "\u04cd\u0005\u0094\u0000\u0000\u04cc\u04c4\u0001\u0000\u0000\u0000\u04cc"+ - "\u04c5\u0001\u0000\u0000\u0000\u04cc\u04c6\u0001\u0000\u0000\u0000\u04cc"+ - "\u04c7\u0001\u0000\u0000\u0000\u04cc\u04c8\u0001\u0000\u0000\u0000\u04cc"+ - "\u04c9\u0001\u0000\u0000\u0000\u04cc\u04ca\u0001\u0000\u0000\u0000\u04cc"+ - "\u04cb\u0001\u0000\u0000\u0000\u04cd\u00c3\u0001\u0000\u0000\u0000\u04ce"+ - "\u04cf\u0006b\uffff\uffff\u0000\u04cf\u04df\u0003\u0158\u00ac\u0000\u04d0"+ - "\u04df\u0003\u0154\u00aa\u0000\u04d1\u04df\u0003\u017a\u00bd\u0000\u04d2"+ - "\u04df\u0003 \u0010\u0000\u04d3\u04df\u0003\u0096K\u0000\u04d4\u04df\u0003"+ - "\u0094J\u0000\u04d5\u04d6\u0005M\u0000\u0000\u04d6\u04d7\u0003\u00c4b"+ - "\u0000\u04d7\u04d8\u0003\u0178\u00bc\u0000\u04d8\u04df\u0001\u0000\u0000"+ - "\u0000\u04d9\u04da\u0007\u000e\u0000\u0000\u04da\u04db\u0005j\u0000\u0000"+ - "\u04db\u04dc\u0003\u00b4Z\u0000\u04dc\u04dd\u0005k\u0000\u0000\u04dd\u04df"+ - "\u0001\u0000\u0000\u0000\u04de\u04ce\u0001\u0000\u0000\u0000\u04de\u04d0"+ - "\u0001\u0000\u0000\u0000\u04de\u04d1\u0001\u0000\u0000\u0000\u04de\u04d2"+ - "\u0001\u0000\u0000\u0000\u04de\u04d3\u0001\u0000\u0000\u0000\u04de\u04d4"+ - "\u0001\u0000\u0000\u0000\u04de\u04d5\u0001\u0000\u0000\u0000\u04de\u04d9"+ - "\u0001\u0000\u0000\u0000\u04df\u04f6\u0001\u0000\u0000\u0000\u04e0\u04e1"+ - "\n\n\u0000\u0000\u04e1\u04e2\u0005t\u0000\u0000\u04e2\u04f5\u0005i\u0000"+ - "\u0000\u04e3\u04e4\n\t\u0000\u0000\u04e4\u04f5\u0003\u0174\u00ba\u0000"+ - "\u04e5\u04e6\n\b\u0000\u0000\u04e6\u04f5\u0003\u00deo\u0000\u04e7\u04e8"+ - "\n\u0007\u0000\u0000\u04e8\u04f5\u0003L&\u0000\u04e9\u04ea\n\u0006\u0000"+ - "\u0000\u04ea\u04f5\u0003\u0176\u00bb\u0000\u04eb\u04ec\n\u0005\u0000\u0000"+ - "\u04ec\u04f5\u0003\u0178\u00bc\u0000\u04ed\u04ee\n\u0003\u0000\u0000\u04ee"+ - "\u04ef\u0003\u0178\u00bc\u0000\u04ef\u04f0\u0005\u0010\u0000\u0000\u04f0"+ - "\u04f1\u0003\u0082A\u0000\u04f1\u04f5\u0001\u0000\u0000\u0000\u04f2\u04f3"+ - "\n\u0002\u0000\u0000\u04f3\u04f5\u0003\u00cae\u0000\u04f4\u04e0\u0001"+ - "\u0000\u0000\u0000\u04f4\u04e3\u0001\u0000\u0000\u0000\u04f4\u04e5\u0001"+ - "\u0000\u0000\u0000\u04f4\u04e7\u0001\u0000\u0000\u0000\u04f4\u04e9\u0001"+ - "\u0000\u0000\u0000\u04f4\u04eb\u0001\u0000\u0000\u0000\u04f4\u04ed\u0001"+ - "\u0000\u0000\u0000\u04f4\u04f2\u0001\u0000\u0000\u0000\u04f5\u04f8\u0001"+ - "\u0000\u0000\u0000\u04f6\u04f4\u0001\u0000\u0000\u0000\u04f6\u04f7\u0001"+ - "\u0000\u0000\u0000\u04f7\u00c5\u0001\u0000\u0000\u0000\u04f8\u04f6\u0001"+ - "\u0000\u0000\u0000\u04f9\u04fa\u0003d2\u0000\u04fa\u04fb\u0003\u00c8d"+ - "\u0000\u04fb\u00c7\u0001\u0000\u0000\u0000\u04fc\u04fe\u0005Q\u0000\u0000"+ - "\u04fd\u04ff\u0005i\u0000\u0000\u04fe\u04fd\u0001\u0000\u0000\u0000\u04fe"+ - "\u04ff\u0001\u0000\u0000\u0000\u04ff\u0500\u0001\u0000\u0000\u0000\u0500"+ - "\u0502\u0003\u014e\u00a7\u0000\u0501\u0503\u0003\u0080@\u0000\u0502\u0501"+ - "\u0001\u0000\u0000\u0000\u0502\u0503\u0001\u0000\u0000\u0000\u0503\u00c9"+ - "\u0001\u0000\u0000\u0000\u0504\u0506\u0005&\u0000\u0000\u0505\u0507\u0003"+ - "\u00f6{\u0000\u0506\u0505\u0001\u0000\u0000\u0000\u0506\u0507\u0001\u0000"+ - "\u0000\u0000\u0507\u0509\u0001\u0000\u0000\u0000\u0508\u050a\u0005q\u0000"+ - "\u0000\u0509\u0508\u0001\u0000\u0000\u0000\u0509\u050a\u0001\u0000\u0000"+ - "\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050c\u0005\'\u0000\u0000"+ - "\u050c\u00cb\u0001\u0000\u0000\u0000\u050d\u050e\u0005R\u0000\u0000\u050e"+ - "\u0518\u0005l\u0000\u0000\u050f\u0513\u0003\u00d0h\u0000\u0510\u0513\u0003"+ - "\u013c\u009e\u0000\u0511\u0513\u0003\u00ceg\u0000\u0512\u050f\u0001\u0000"+ - "\u0000\u0000\u0512\u0510\u0001\u0000\u0000\u0000\u0512\u0511\u0001\u0000"+ - "\u0000\u0000\u0513\u0514\u0001\u0000\u0000\u0000\u0514\u0515\u0003\u017e"+ - "\u00bf\u0000\u0515\u0517\u0001\u0000\u0000\u0000\u0516\u0512\u0001\u0000"+ - "\u0000\u0000\u0517\u051a\u0001\u0000\u0000\u0000\u0518\u0516\u0001\u0000"+ - "\u0000\u0000\u0518\u0519\u0001\u0000\u0000\u0000\u0519\u051b\u0001\u0000"+ - "\u0000\u0000\u051a\u0518\u0001\u0000\u0000\u0000\u051b\u051c\u0005m\u0000"+ - "\u0000\u051c\u00cd\u0001\u0000\u0000\u0000\u051d\u051e\u00059\u0000\u0000"+ - "\u051e\u051f\u0005i\u0000\u0000\u051f\u0520\u0003\u0152\u00a9\u0000\u0520"+ - "\u00cf\u0001\u0000\u0000\u0000\u0521\u0523\u0005\u001b\u0000\u0000\u0522"+ - "\u0521\u0001\u0000\u0000\u0000\u0522\u0523\u0001\u0000\u0000\u0000\u0523"+ - "\u0524\u0001\u0000\u0000\u0000\u0524\u0525\u0003d2\u0000\u0525\u0526\u0005"+ - "i\u0000\u0000\u0526\u0527\u0003\u0152\u00a9\u0000\u0527\u0528\u0003\u0150"+ - "\u00a8\u0000\u0528\u0531\u0001\u0000\u0000\u0000\u0529\u052b\u0005\u001b"+ - "\u0000\u0000\u052a\u0529\u0001\u0000\u0000\u0000\u052a\u052b\u0001\u0000"+ - "\u0000\u0000\u052b\u052c\u0001\u0000\u0000\u0000\u052c\u052d\u0003d2\u0000"+ - "\u052d\u052e\u0005i\u0000\u0000\u052e\u052f\u0003\u0152\u00a9\u0000\u052f"+ - "\u0531\u0001\u0000\u0000\u0000\u0530\u0522\u0001\u0000\u0000\u0000\u0530"+ - "\u052a\u0001\u0000\u0000\u0000\u0531\u00d1\u0001\u0000\u0000\u0000\u0532"+ - "\u053a\u0003\u013c\u009e\u0000\u0533\u053a\u0003\u00d4j\u0000\u0534\u053a"+ - "\u0003P(\u0000\u0535\u0536\u0005j\u0000\u0000\u0536\u0537\u0003\u00d2"+ - "i\u0000\u0537\u0538\u0005k\u0000\u0000\u0538\u053a\u0001\u0000\u0000\u0000"+ - "\u0539\u0532\u0001\u0000\u0000\u0000\u0539\u0533\u0001\u0000\u0000\u0000"+ - "\u0539\u0534\u0001\u0000\u0000\u0000\u0539\u0535\u0001\u0000\u0000\u0000"+ - "\u053a\u00d3\u0001\u0000\u0000\u0000\u053b\u0545\u0003\u013e\u009f\u0000"+ - "\u053c\u0545\u0003\u016e\u00b7\u0000\u053d\u0545\u0003\u0144\u00a2\u0000"+ - "\u053e\u0545\u0003\u014c\u00a6\u0000\u053f\u0545\u0003\u00ccf\u0000\u0540"+ - "\u0545\u0003\u0146\u00a3\u0000\u0541\u0545\u0003\u0148\u00a4\u0000\u0542"+ - "\u0545\u0003\u014a\u00a5\u0000\u0543\u0545\u0003\u00d6k\u0000\u0544\u053b"+ - "\u0001\u0000\u0000\u0000\u0544\u053c\u0001\u0000\u0000\u0000\u0544\u053d"+ - "\u0001\u0000\u0000\u0000\u0544\u053e\u0001\u0000\u0000\u0000\u0544\u053f"+ - "\u0001\u0000\u0000\u0000\u0544\u0540\u0001\u0000\u0000\u0000\u0544\u0541"+ - "\u0001\u0000\u0000\u0000\u0544\u0542\u0001\u0000\u0000\u0000\u0544\u0543"+ - "\u0001\u0000\u0000\u0000\u0545\u00d5\u0001\u0000\u0000\u0000\u0546\u0547"+ - "\u00059\u0000\u0000\u0547\u0548\u0003\u00d8l\u0000\u0548\u00d7\u0001\u0000"+ - "\u0000\u0000\u0549\u0555\u0005j\u0000\u0000\u054a\u054f\u0003\u00d2i\u0000"+ - "\u054b\u054c\u0005q\u0000\u0000\u054c\u054e\u0003\u00d2i\u0000\u054d\u054b"+ - "\u0001\u0000\u0000\u0000\u054e\u0551\u0001\u0000\u0000\u0000\u054f\u054d"+ - "\u0001\u0000\u0000\u0000\u054f\u0550\u0001\u0000\u0000\u0000\u0550\u0553"+ - "\u0001\u0000\u0000\u0000\u0551\u054f\u0001\u0000\u0000\u0000\u0552\u0554"+ - "\u0005q\u0000\u0000\u0553\u0552\u0001\u0000\u0000\u0000\u0553\u0554\u0001"+ - "\u0000\u0000\u0000\u0554\u0556\u0001\u0000\u0000\u0000\u0555\u054a\u0001"+ - "\u0000\u0000\u0000\u0555\u0556\u0001\u0000\u0000\u0000\u0556\u0557\u0001"+ - "\u0000\u0000\u0000\u0557\u0558\u0005k\u0000\u0000\u0558\u00d9\u0001\u0000"+ - "\u0000\u0000\u0559\u0561\u0003\u016e\u00b7\u0000\u055a\u0561\u0003\u013e"+ - "\u009f\u0000\u055b\u0561\u0003\u00dcn\u0000\u055c\u0561\u0003\u0146\u00a3"+ - "\u0000\u055d\u0561\u0003\u0148\u00a4\u0000\u055e\u0561\u0003P(\u0000\u055f"+ - "\u0561\u0003\u013c\u009e\u0000\u0560\u0559\u0001\u0000\u0000\u0000\u0560"+ - "\u055a\u0001\u0000\u0000\u0000\u0560\u055b\u0001\u0000\u0000\u0000\u0560"+ - "\u055c\u0001\u0000\u0000\u0000\u0560\u055d\u0001\u0000\u0000\u0000\u0560"+ - "\u055e\u0001\u0000\u0000\u0000\u0560\u055f\u0001\u0000\u0000\u0000\u0561"+ - "\u00db\u0001\u0000\u0000\u0000\u0562\u0563\u0005n\u0000\u0000\u0563\u0564"+ - "\u0005x\u0000\u0000\u0564\u0565\u0005o\u0000\u0000\u0565\u0566\u0003\u0142"+ - "\u00a1\u0000\u0566\u00dd\u0001\u0000\u0000\u0000\u0567\u0577\u0005n\u0000"+ - "\u0000\u0568\u056a\u0003\u00e0p\u0000\u0569\u0568\u0001\u0000\u0000\u0000"+ - "\u0569\u056a\u0001\u0000\u0000\u0000\u056a\u056b\u0001\u0000\u0000\u0000"+ - "\u056b\u056d\u0005s\u0000\u0000\u056c\u056e\u0003\u00e2q\u0000\u056d\u056c"+ - "\u0001\u0000\u0000\u0000\u056d\u056e\u0001\u0000\u0000\u0000\u056e\u0578"+ - "\u0001\u0000\u0000\u0000\u056f\u0571\u0003\u00e0p\u0000\u0570\u056f\u0001"+ - "\u0000\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u0572\u0001"+ - "\u0000\u0000\u0000\u0572\u0573\u0005s\u0000\u0000\u0573\u0574\u0003\u00e2"+ - "q\u0000\u0574\u0575\u0005s\u0000\u0000\u0575\u0576\u0003\u00e4r\u0000"+ - "\u0576\u0578\u0001\u0000\u0000\u0000\u0577\u0569\u0001\u0000\u0000\u0000"+ - "\u0577\u0570\u0001\u0000\u0000\u0000\u0578\u0579\u0001\u0000\u0000\u0000"+ - "\u0579\u057a\u0005o\u0000\u0000\u057a\u00df\u0001\u0000\u0000\u0000\u057b"+ - "\u057c\u0003\u00b4Z\u0000\u057c\u00e1\u0001\u0000\u0000\u0000\u057d\u057e"+ - "\u0003\u00b4Z\u0000\u057e\u00e3\u0001\u0000\u0000\u0000\u057f\u0580\u0003"+ - "\u00b4Z\u0000\u0580\u00e5\u0001\u0000\u0000\u0000\u0581\u0583\u0007\u000f"+ - "\u0000\u0000\u0582\u0581\u0001\u0000\u0000\u0000\u0582\u0583\u0001\u0000"+ - "\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584\u0585\u0005p\u0000"+ - "\u0000\u0585\u00e7\u0001\u0000\u0000\u0000\u0586\u0587\u0003\u00f6{\u0000"+ - "\u0587\u0588\u0005p\u0000\u0000\u0588\u058d\u0001\u0000\u0000\u0000\u0589"+ - "\u058a\u0003\u0006\u0003\u0000\u058a\u058b\u0005w\u0000\u0000\u058b\u058d"+ - "\u0001\u0000\u0000\u0000\u058c\u0586\u0001\u0000\u0000\u0000\u058c\u0589"+ - "\u0001\u0000\u0000\u0000\u058c\u058d\u0001\u0000\u0000\u0000\u058d\u058e"+ - "\u0001\u0000\u0000\u0000\u058e\u058f\u0005a\u0000\u0000\u058f\u0594\u0003"+ - "\u00b4Z\u0000\u0590\u0592\u0005K\u0000\u0000\u0591\u0593\u0005i\u0000"+ - "\u0000\u0592\u0591\u0001\u0000\u0000\u0000\u0592\u0593\u0001\u0000\u0000"+ - "\u0000\u0593\u0595\u0001\u0000\u0000\u0000\u0594\u0590\u0001\u0000\u0000"+ - "\u0000\u0594\u0595\u0001\u0000\u0000\u0000\u0595\u00e9\u0001\u0000\u0000"+ - "\u0000\u0596\u0597\u0005\\\u0000\u0000\u0597\u0598\u0005i\u0000\u0000"+ - "\u0598\u00eb\u0001\u0000\u0000\u0000\u0599\u059a\u0003\u0170\u00b8\u0000"+ - "\u059a\u00ed\u0001\u0000\u0000\u0000\u059b\u059f\u0003\u00f0x\u0000\u059c"+ - "\u059f\u0003\u00f8|\u0000\u059d\u059f\u0003\u00fc~\u0000\u059e\u059b\u0001"+ - "\u0000\u0000\u0000\u059e\u059c\u0001\u0000\u0000\u0000\u059e\u059d\u0001"+ - "\u0000\u0000\u0000\u059f\u00ef\u0001\u0000\u0000\u0000\u05a0\u05ac\u0005"+ - "^\u0000\u0000\u05a1\u05ad\u0003\u00f2y\u0000\u05a2\u05a8\u0005j\u0000"+ - "\u0000\u05a3\u05a4\u0003\u00f2y\u0000\u05a4\u05a5\u0003\u017e\u00bf\u0000"+ - "\u05a5\u05a7\u0001\u0000\u0000\u0000\u05a6\u05a3\u0001\u0000\u0000\u0000"+ - "\u05a7\u05aa\u0001\u0000\u0000\u0000\u05a8\u05a6\u0001\u0000\u0000\u0000"+ - "\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u05ab\u0001\u0000\u0000\u0000"+ - "\u05aa\u05a8\u0001\u0000\u0000\u0000\u05ab\u05ad\u0005k\u0000\u0000\u05ac"+ - "\u05a1\u0001\u0000\u0000\u0000\u05ac\u05a2\u0001\u0000\u0000\u0000\u05ad"+ - "\u00f1\u0001\u0000\u0000\u0000\u05ae\u05b4\u0003\u00f4z\u0000\u05af\u05b1"+ - "\u0003\u00d2i\u0000\u05b0\u05af\u0001\u0000\u0000\u0000\u05b0\u05b1\u0001"+ - "\u0000\u0000\u0000\u05b1\u05b2\u0001\u0000\u0000\u0000\u05b2\u05b3\u0005"+ - "p\u0000\u0000\u05b3\u05b5\u0003\u00f6{\u0000\u05b4\u05b0\u0001\u0000\u0000"+ - "\u0000\u05b4\u05b5\u0001\u0000\u0000\u0000\u05b5\u00f3\u0001\u0000\u0000"+ - "\u0000\u05b6\u05bb\u0005i\u0000\u0000\u05b7\u05b8\u0005q\u0000\u0000\u05b8"+ - "\u05ba\u0005i\u0000\u0000\u05b9\u05b7\u0001\u0000\u0000\u0000\u05ba\u05bd"+ - "\u0001\u0000\u0000\u0000\u05bb\u05b9\u0001\u0000\u0000\u0000\u05bb\u05bc"+ - "\u0001\u0000\u0000\u0000\u05bc\u00f5\u0001\u0000\u0000\u0000\u05bd\u05bb"+ - "\u0001\u0000\u0000\u0000\u05be\u05c3\u0003\u00b4Z\u0000\u05bf\u05c0\u0005"+ - "q\u0000\u0000\u05c0\u05c2\u0003\u00b4Z\u0000\u05c1\u05bf\u0001\u0000\u0000"+ - "\u0000\u05c2\u05c5\u0001\u0000\u0000\u0000\u05c3\u05c1\u0001\u0000\u0000"+ - "\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000\u05c4\u00f7\u0001\u0000\u0000"+ - "\u0000\u05c5\u05c3\u0001\u0000\u0000\u0000\u05c6\u05d2\u0005b\u0000\u0000"+ - "\u05c7\u05d3\u0003\u00fa}\u0000\u05c8\u05ce\u0005j\u0000\u0000\u05c9\u05ca"+ - "\u0003\u00fa}\u0000\u05ca\u05cb\u0003\u017e\u00bf\u0000\u05cb\u05cd\u0001"+ - "\u0000\u0000\u0000\u05cc\u05c9\u0001\u0000\u0000\u0000\u05cd\u05d0\u0001"+ - "\u0000\u0000\u0000\u05ce\u05cc\u0001\u0000\u0000\u0000\u05ce\u05cf\u0001"+ - "\u0000\u0000\u0000\u05cf\u05d1\u0001\u0000\u0000\u0000\u05d0\u05ce\u0001"+ - "\u0000\u0000\u0000\u05d1\u05d3\u0005k\u0000\u0000\u05d2\u05c7\u0001\u0000"+ - "\u0000\u0000\u05d2\u05c8\u0001\u0000\u0000\u0000\u05d3\u00f9\u0001\u0000"+ - "\u0000\u0000\u05d4\u05d6\u0005i\u0000\u0000\u05d5\u05d7\u0005p\u0000\u0000"+ - "\u05d6\u05d5\u0001\u0000\u0000\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000"+ - "\u05d7\u05d8\u0001\u0000\u0000\u0000\u05d8\u05d9\u0003\u00d2i\u0000\u05d9"+ - "\u00fb\u0001\u0000\u0000\u0000\u05da\u05e6\u0005g\u0000\u0000\u05db\u05e7"+ - "\u0003\u00a6S\u0000\u05dc\u05e2\u0005j\u0000\u0000\u05dd\u05de\u0003\u00a6"+ - "S\u0000\u05de\u05df\u0003\u017e\u00bf\u0000\u05df\u05e1\u0001\u0000\u0000"+ - "\u0000\u05e0\u05dd\u0001\u0000\u0000\u0000\u05e1\u05e4\u0001\u0000\u0000"+ - "\u0000\u05e2\u05e0\u0001\u0000\u0000\u0000\u05e2\u05e3\u0001\u0000\u0000"+ - "\u0000\u05e3\u05e5\u0001\u0000\u0000\u0000\u05e4\u05e2\u0001\u0000\u0000"+ - "\u0000\u05e5\u05e7\u0005k\u0000\u0000\u05e6\u05db\u0001\u0000\u0000\u0000"+ - "\u05e6\u05dc\u0001\u0000\u0000\u0000\u05e7\u00fd\u0001\u0000\u0000\u0000"+ - "\u05e8\u05ea\u0005l\u0000\u0000\u05e9\u05eb\u0003\u0100\u0080\u0000\u05ea"+ - "\u05e9\u0001\u0000\u0000\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb"+ - "\u05ec\u0001\u0000\u0000\u0000\u05ec\u05ed\u0005m\u0000\u0000\u05ed\u00ff"+ - "\u0001\u0000\u0000\u0000\u05ee\u05f0\u0005r\u0000\u0000\u05ef\u05ee\u0001"+ - "\u0000\u0000\u0000\u05ef\u05f0\u0001\u0000\u0000\u0000\u05f0\u05f6\u0001"+ - "\u0000\u0000\u0000\u05f1\u05f3\u0005\u00a3\u0000\u0000\u05f2\u05f1\u0001"+ - "\u0000\u0000\u0000\u05f2\u05f3\u0001\u0000\u0000\u0000\u05f3\u05f6\u0001"+ - "\u0000\u0000\u0000\u05f4\u05f6\u0004\u0080\u0012\u0000\u05f5\u05ef\u0001"+ - "\u0000\u0000\u0000\u05f5\u05f2\u0001\u0000\u0000\u0000\u05f5\u05f4\u0001"+ - "\u0000\u0000\u0000\u05f6\u05f7\u0001\u0000\u0000\u0000\u05f7\u05f8\u0003"+ - "\u00b6[\u0000\u05f8\u05f9\u0003\u017e\u00bf\u0000\u05f9\u05fb\u0001\u0000"+ - "\u0000\u0000\u05fa\u05f5\u0001\u0000\u0000\u0000\u05fb\u05fc\u0001\u0000"+ - "\u0000\u0000\u05fc\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000"+ - "\u0000\u0000\u05fd\u0101\u0001\u0000\u0000\u0000\u05fe\u0604\u0003\u0106"+ - "\u0083\u0000\u05ff\u0604\u0003\u0108\u0084\u0000\u0600\u0604\u0003\u010a"+ - "\u0085\u0000\u0601\u0604\u0003\u0104\u0082\u0000\u0602\u0604\u0003\u00a8"+ - "T\u0000\u0603\u05fe\u0001\u0000\u0000\u0000\u0603\u05ff\u0001\u0000\u0000"+ - "\u0000\u0603\u0600\u0001\u0000\u0000\u0000\u0603\u0601\u0001\u0000\u0000"+ - "\u0000\u0603\u0602\u0001\u0000\u0000\u0000\u0604\u0103\u0001\u0000\u0000"+ - "\u0000\u0605\u0606\u0003\u00b4Z\u0000\u0606\u0105\u0001\u0000\u0000\u0000"+ - "\u0607\u0608\u0003\u00b4Z\u0000\u0608\u0609\u0005\u008d\u0000\u0000\u0609"+ - "\u060a\u0003\u00b4Z\u0000\u060a\u0107\u0001\u0000\u0000\u0000\u060b\u060c"+ - "\u0003\u00b4Z\u0000\u060c\u060d\u0007\u0010\u0000\u0000\u060d\u0109\u0001"+ - "\u0000\u0000\u0000\u060e\u060f\u0003\u00f6{\u0000\u060f\u0610\u0003\u00e6"+ - "s\u0000\u0610\u0611\u0003\u00f6{\u0000\u0611\u010b\u0001\u0000\u0000\u0000"+ - "\u0612\u0613\u0007\u0011\u0000\u0000\u0613\u010d\u0001\u0000\u0000\u0000"+ - "\u0614\u0615\u0005i\u0000\u0000\u0615\u0617\u0005s\u0000\u0000\u0616\u0618"+ - "\u0003\u00b6[\u0000\u0617\u0616\u0001\u0000\u0000\u0000\u0617\u0618\u0001"+ - "\u0000\u0000\u0000\u0618\u010f\u0001\u0000\u0000\u0000\u0619\u061b\u0005"+ - "f\u0000\u0000\u061a\u061c\u0003\u00f6{\u0000\u061b\u061a\u0001\u0000\u0000"+ - "\u0000\u061b\u061c\u0001\u0000\u0000\u0000\u061c\u0111\u0001\u0000\u0000"+ - "\u0000\u061d\u061f\u0005O\u0000\u0000\u061e\u0620\u0005i\u0000\u0000\u061f"+ - "\u061e\u0001\u0000\u0000\u0000\u061f\u0620\u0001\u0000\u0000\u0000\u0620"+ - "\u0113\u0001\u0000\u0000\u0000\u0621\u0623\u0005c\u0000\u0000\u0622\u0624"+ - "\u0005i\u0000\u0000\u0623\u0622\u0001\u0000\u0000\u0000\u0623\u0624\u0001"+ - "\u0000\u0000\u0000\u0624\u0115\u0001\u0000\u0000\u0000\u0625\u0626\u0005"+ - "[\u0000\u0000\u0626\u0627\u0005i\u0000\u0000\u0627\u0117\u0001\u0000\u0000"+ - "\u0000\u0628\u0629\u0005_\u0000\u0000\u0629\u0119\u0001\u0000\u0000\u0000"+ - "\u062a\u0633\u0005`\u0000\u0000\u062b\u0634\u0003\u00b4Z\u0000\u062c\u062d"+ - "\u0003\u017e\u00bf\u0000\u062d\u062e\u0003\u00b4Z\u0000\u062e\u0634\u0001"+ - "\u0000\u0000\u0000\u062f\u0630\u0003\u0102\u0081\u0000\u0630\u0631\u0003"+ - "\u017e\u00bf\u0000\u0631\u0632\u0003\u00b4Z\u0000\u0632\u0634\u0001\u0000"+ - "\u0000\u0000\u0633\u062b\u0001\u0000\u0000\u0000\u0633\u062c\u0001\u0000"+ - "\u0000\u0000\u0633\u062f\u0001\u0000\u0000\u0000\u0634\u0635\u0001\u0000"+ - "\u0000\u0000\u0635\u063b\u0003\u00fe\u007f\u0000\u0636\u0639\u0005Z\u0000"+ - "\u0000\u0637\u063a\u0003\u011a\u008d\u0000\u0638\u063a\u0003\u00fe\u007f"+ - "\u0000\u0639\u0637\u0001\u0000\u0000\u0000\u0639\u0638\u0001\u0000\u0000"+ - "\u0000\u063a\u063c\u0001\u0000\u0000\u0000\u063b\u0636\u0001\u0000\u0000"+ - "\u0000\u063b\u063c\u0001\u0000\u0000\u0000\u063c\u011b\u0001\u0000\u0000"+ - "\u0000\u063d\u0640\u0003\u011e\u008f\u0000\u063e\u0640\u0003\u0124\u0092"+ - "\u0000\u063f\u063d\u0001\u0000\u0000\u0000\u063f\u063e\u0001\u0000\u0000"+ - "\u0000\u0640\u011d\u0001\u0000\u0000\u0000\u0641\u064c\u0005]\u0000\u0000"+ - "\u0642\u0644\u0003\u00b4Z\u0000\u0643\u0642\u0001\u0000\u0000\u0000\u0643"+ - "\u0644\u0001\u0000\u0000\u0000\u0644\u064d\u0001\u0000\u0000\u0000\u0645"+ - "\u0647\u0003\u0102\u0081\u0000\u0646\u0645\u0001\u0000\u0000\u0000\u0646"+ - "\u0647\u0001\u0000\u0000\u0000\u0647\u0648\u0001\u0000\u0000\u0000\u0648"+ - "\u064a\u0003\u017e\u00bf\u0000\u0649\u064b\u0003\u00b4Z\u0000\u064a\u0649"+ - "\u0001\u0000\u0000\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b\u064d"+ - "\u0001\u0000\u0000\u0000\u064c\u0643\u0001\u0000\u0000\u0000\u064c\u0646"+ - "\u0001\u0000\u0000\u0000\u064d\u064e\u0001\u0000\u0000\u0000\u064e\u0652"+ - "\u0005l\u0000\u0000\u064f\u0651\u0003\u0120\u0090\u0000\u0650\u064f\u0001"+ - "\u0000\u0000\u0000\u0651\u0654\u0001\u0000\u0000\u0000\u0652\u0650\u0001"+ - "\u0000\u0000\u0000\u0652\u0653\u0001\u0000\u0000\u0000\u0653\u0655\u0001"+ - "\u0000\u0000\u0000\u0654\u0652\u0001\u0000\u0000\u0000\u0655\u0656\u0005"+ - "m\u0000\u0000\u0656\u011f\u0001\u0000\u0000\u0000\u0657\u0658\u0003\u0122"+ - "\u0091\u0000\u0658\u065a\u0005s\u0000\u0000\u0659\u065b\u0003\u0100\u0080"+ - "\u0000\u065a\u0659\u0001\u0000\u0000\u0000\u065a\u065b\u0001\u0000\u0000"+ - "\u0000\u065b\u0121\u0001\u0000\u0000\u0000\u065c\u065d\u0005T\u0000\u0000"+ - "\u065d\u0660\u0003\u00f6{\u0000\u065e\u0660\u0005P\u0000\u0000\u065f\u065c"+ - "\u0001\u0000\u0000\u0000\u065f\u065e\u0001\u0000\u0000\u0000\u0660\u0123"+ - "\u0001\u0000\u0000\u0000\u0661\u066a\u0005]\u0000\u0000\u0662\u066b\u0003"+ - "\u0126\u0093\u0000\u0663\u0664\u0003\u017e\u00bf\u0000\u0664\u0665\u0003"+ - "\u0126\u0093\u0000\u0665\u066b\u0001\u0000\u0000\u0000\u0666\u0667\u0003"+ - "\u0102\u0081\u0000\u0667\u0668\u0003\u017e\u00bf\u0000\u0668\u0669\u0003"+ - "\u0126\u0093\u0000\u0669\u066b\u0001\u0000\u0000\u0000\u066a\u0662\u0001"+ - "\u0000\u0000\u0000\u066a\u0663\u0001\u0000\u0000\u0000\u066a\u0666\u0001"+ - "\u0000\u0000\u0000\u066b\u066c\u0001\u0000\u0000\u0000\u066c\u0670\u0005"+ - "l\u0000\u0000\u066d\u066f\u0003\u0128\u0094\u0000\u066e\u066d\u0001\u0000"+ - "\u0000\u0000\u066f\u0672\u0001\u0000\u0000\u0000\u0670\u066e\u0001\u0000"+ - "\u0000\u0000\u0670\u0671\u0001\u0000\u0000\u0000\u0671\u0673\u0001\u0000"+ - "\u0000\u0000\u0672\u0670\u0001\u0000\u0000\u0000\u0673\u0674\u0005m\u0000"+ - "\u0000\u0674\u0125\u0001\u0000\u0000\u0000\u0675\u0676\u0005i\u0000\u0000"+ - "\u0676\u0678\u0005w\u0000\u0000\u0677\u0675\u0001\u0000\u0000\u0000\u0677"+ - "\u0678\u0001\u0000\u0000\u0000\u0678\u0679\u0001\u0000\u0000\u0000\u0679"+ - "\u067a\u0003\u00c4b\u0000\u067a\u067b\u0005t\u0000\u0000\u067b\u067c\u0005"+ - "j\u0000\u0000\u067c\u067d\u0005b\u0000\u0000\u067d\u067e\u0005k\u0000"+ - "\u0000\u067e\u0127\u0001\u0000\u0000\u0000\u067f\u0680\u0003\u012a\u0095"+ - "\u0000\u0680\u0682\u0005s\u0000\u0000\u0681\u0683\u0003\u0100\u0080\u0000"+ - "\u0682\u0681\u0001\u0000\u0000\u0000\u0682\u0683\u0001\u0000\u0000\u0000"+ - "\u0683\u0129\u0001\u0000\u0000\u0000\u0684\u0685\u0005T\u0000\u0000\u0685"+ - "\u0688\u0003\u012c\u0096\u0000\u0686\u0688\u0005P\u0000\u0000\u0687\u0684"+ - "\u0001\u0000\u0000\u0000\u0687\u0686\u0001\u0000\u0000\u0000\u0688\u012b"+ - "\u0001\u0000\u0000\u0000\u0689\u068c\u0003\u00d2i\u0000\u068a\u068c\u0005"+ - "h\u0000\u0000\u068b\u0689\u0001\u0000\u0000\u0000\u068b\u068a\u0001\u0000"+ - "\u0000\u0000\u068c\u0694\u0001\u0000\u0000\u0000\u068d\u0690\u0005q\u0000"+ - "\u0000\u068e\u0691\u0003\u00d2i\u0000\u068f\u0691\u0005h\u0000\u0000\u0690"+ - "\u068e\u0001\u0000\u0000\u0000\u0690\u068f\u0001\u0000\u0000\u0000\u0691"+ - "\u0693\u0001\u0000\u0000\u0000\u0692\u068d\u0001\u0000\u0000\u0000\u0693"+ - "\u0696\u0001\u0000\u0000\u0000\u0694\u0692\u0001\u0000\u0000\u0000\u0694"+ - "\u0695\u0001\u0000\u0000\u0000\u0695\u012d\u0001\u0000\u0000\u0000\u0696"+ - "\u0694\u0001\u0000\u0000\u0000\u0697\u0698\u0005S\u0000\u0000\u0698\u069c"+ - "\u0005l\u0000\u0000\u0699\u069b\u0003\u0130\u0098\u0000\u069a\u0699\u0001"+ - "\u0000\u0000\u0000\u069b\u069e\u0001\u0000\u0000\u0000\u069c\u069a\u0001"+ - "\u0000\u0000\u0000\u069c\u069d\u0001\u0000\u0000\u0000\u069d\u069f\u0001"+ - "\u0000\u0000\u0000\u069e\u069c\u0001\u0000\u0000\u0000\u069f\u06a0\u0005"+ - "m\u0000\u0000\u06a0\u012f\u0001\u0000\u0000\u0000\u06a1\u06a2\u0003\u0132"+ - "\u0099\u0000\u06a2\u06a4\u0005s\u0000\u0000\u06a3\u06a5\u0003\u0100\u0080"+ - "\u0000\u06a4\u06a3\u0001\u0000\u0000\u0000\u06a4\u06a5\u0001\u0000\u0000"+ - "\u0000\u06a5\u0131\u0001\u0000\u0000\u0000\u06a6\u06a9\u0005T\u0000\u0000"+ - "\u06a7\u06aa\u0003\u0106\u0083\u0000\u06a8\u06aa\u0003\u0134\u009a\u0000"+ - "\u06a9\u06a7\u0001\u0000\u0000\u0000\u06a9\u06a8\u0001\u0000\u0000\u0000"+ - "\u06aa\u06ad\u0001\u0000\u0000\u0000\u06ab\u06ad\u0005P\u0000\u0000\u06ac"+ - "\u06a6\u0001\u0000\u0000\u0000\u06ac\u06ab\u0001\u0000\u0000\u0000\u06ad"+ - "\u0133\u0001\u0000\u0000\u0000\u06ae\u06af\u0003\u00f6{\u0000\u06af\u06b0"+ - "\u0005p\u0000\u0000\u06b0\u06b5\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003"+ - "\u00f4z\u0000\u06b2\u06b3\u0005w\u0000\u0000\u06b3\u06b5\u0001\u0000\u0000"+ - "\u0000\u06b4\u06ae\u0001\u0000\u0000\u0000\u06b4\u06b1\u0001\u0000\u0000"+ - "\u0000\u06b4\u06b5\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001\u0000\u0000"+ - "\u0000\u06b6\u06b7\u0003\u00b4Z\u0000\u06b7\u0135\u0001\u0000\u0000\u0000"+ - "\u06b8\u06c0\u0005d\u0000\u0000\u06b9\u06bb\u0003\u00b4Z\u0000\u06ba\u06b9"+ - "\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000\u06bb\u06c1"+ - "\u0001\u0000\u0000\u0000\u06bc\u06c1\u0003\u0138\u009c\u0000\u06bd\u06bf"+ - "\u0003\u00e8t\u0000\u06be\u06bd\u0001\u0000\u0000\u0000\u06be\u06bf\u0001"+ - "\u0000\u0000\u0000\u06bf\u06c1\u0001\u0000\u0000\u0000\u06c0\u06ba\u0001"+ - "\u0000\u0000\u0000\u06c0\u06bc\u0001\u0000\u0000\u0000\u06c0\u06be\u0001"+ - "\u0000\u0000\u0000\u06c1\u06c2\u0001\u0000\u0000\u0000\u06c2\u06c3\u0003"+ - "\u00fe\u007f\u0000\u06c3\u0137\u0001\u0000\u0000\u0000\u06c4\u06c6\u0003"+ - "\u0102\u0081\u0000\u06c5\u06c4\u0001\u0000\u0000\u0000\u06c5\u06c6\u0001"+ - "\u0000\u0000\u0000\u06c6\u06c7\u0001\u0000\u0000\u0000\u06c7\u06c9\u0003"+ - "\u017e\u00bf\u0000\u06c8\u06ca\u0003\u00b4Z\u0000\u06c9\u06c8\u0001\u0000"+ - "\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000"+ - "\u0000\u0000\u06cb\u06cd\u0003\u017e\u00bf\u0000\u06cc\u06ce\u0003\u0102"+ - "\u0081\u0000\u06cd\u06cc\u0001\u0000\u0000\u0000\u06cd\u06ce\u0001\u0000"+ - "\u0000\u0000\u06ce\u0139\u0001\u0000\u0000\u0000\u06cf\u06d0\u0005V\u0000"+ - "\u0000\u06d0\u06d1\u0003\u00b4Z\u0000\u06d1\u013b\u0001\u0000\u0000\u0000"+ - "\u06d2\u06d5\u0003\u0160\u00b0\u0000\u06d3\u06d5\u0005i\u0000\u0000\u06d4"+ - "\u06d2\u0001\u0000\u0000\u0000\u06d4\u06d3\u0001\u0000\u0000\u0000\u06d5"+ - "\u013d\u0001\u0000\u0000\u0000\u06d6\u06d7\u0005n\u0000\u0000\u06d7\u06d8"+ - "\u0003\u0140\u00a0\u0000\u06d8\u06d9\u0005o\u0000\u0000\u06d9\u06da\u0003"+ - "\u0142\u00a1\u0000\u06da\u013f\u0001\u0000\u0000\u0000\u06db\u06dc\u0003"+ - "\u00b4Z\u0000\u06dc\u0141\u0001\u0000\u0000\u0000\u06dd\u06de\u0003\u00d2"+ - "i\u0000\u06de\u0143\u0001\u0000\u0000\u0000\u06df\u06e0\u0005\u008b\u0000"+ - "\u0000\u06e0\u06e1\u0003\u00d2i\u0000\u06e1\u0145\u0001\u0000\u0000\u0000"+ - "\u06e2\u06e3\u0005n\u0000\u0000\u06e3\u06e4\u0005o\u0000\u0000\u06e4\u06e5"+ - "\u0003\u0142\u00a1\u0000\u06e5\u0147\u0001\u0000\u0000\u0000\u06e6\u06e7"+ - "\u0005W\u0000\u0000\u06e7\u06e8\u0005n\u0000\u0000\u06e8\u06e9\u0003\u00d2"+ - "i\u0000\u06e9\u06ea\u0005o\u0000\u0000\u06ea\u06eb\u0003\u0142\u00a1\u0000"+ - "\u06eb\u0149\u0001\u0000\u0000\u0000\u06ec\u06f2\u0005Y\u0000\u0000\u06ed"+ - "\u06ee\u0005Y\u0000\u0000\u06ee\u06f2\u0005\u008d\u0000\u0000\u06ef\u06f0"+ - "\u0005\u008d\u0000\u0000\u06f0\u06f2\u0005Y\u0000\u0000\u06f1\u06ec\u0001"+ - "\u0000\u0000\u0000\u06f1\u06ed\u0001\u0000\u0000\u0000\u06f1\u06ef\u0001"+ - "\u0000\u0000\u0000\u06f2\u06f3\u0001\u0000\u0000\u0000\u06f3\u06f4\u0003"+ - "\u0142\u00a1\u0000\u06f4\u014b\u0001\u0000\u0000\u0000\u06f5\u06f6\u0005"+ - "Q\u0000\u0000\u06f6\u06f7\u0003\u014e\u00a7\u0000\u06f7\u014d\u0001\u0000"+ - "\u0000\u0000\u06f8\u06f9\u0003\u0152\u00a9\u0000\u06f9\u06fa\u0003\u0150"+ - "\u00a8\u0000\u06fa\u06fd\u0001\u0000\u0000\u0000\u06fb\u06fd\u0003\u0152"+ - "\u00a9\u0000\u06fc\u06f8\u0001\u0000\u0000\u0000\u06fc\u06fb\u0001\u0000"+ - "\u0000\u0000\u06fd\u014f\u0001\u0000\u0000\u0000\u06fe\u0701\u0003\u0152"+ - "\u00a9\u0000\u06ff\u0701\u0003\u00d2i\u0000\u0700\u06fe\u0001\u0000\u0000"+ - "\u0000\u0700\u06ff\u0001\u0000\u0000\u0000\u0701\u0151\u0001\u0000\u0000"+ - "\u0000\u0702\u070e\u0005j\u0000\u0000\u0703\u0708\u0003\u00acV\u0000\u0704"+ - "\u0705\u0005q\u0000\u0000\u0705\u0707\u0003\u00acV\u0000\u0706\u0704\u0001"+ - "\u0000\u0000\u0000\u0707\u070a\u0001\u0000\u0000\u0000\u0708\u0706\u0001"+ - "\u0000\u0000\u0000\u0708\u0709\u0001\u0000\u0000\u0000\u0709\u070c\u0001"+ - "\u0000\u0000\u0000\u070a\u0708\u0001\u0000\u0000\u0000\u070b\u070d\u0005"+ - "q\u0000\u0000\u070c\u070b\u0001\u0000\u0000\u0000\u070c\u070d\u0001\u0000"+ - "\u0000\u0000\u070d\u070f\u0001\u0000\u0000\u0000\u070e\u0703\u0001\u0000"+ - "\u0000\u0000\u070e\u070f\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000"+ - "\u0000\u0000\u0710\u0711\u0005k\u0000\u0000\u0711\u0153\u0001\u0000\u0000"+ - "\u0000\u0712\u0713\u0003\u0156\u00ab\u0000\u0713\u0714\u0005j\u0000\u0000"+ - "\u0714\u0716\u0003\u00b4Z\u0000\u0715\u0717\u0005q\u0000\u0000\u0716\u0715"+ - "\u0001\u0000\u0000\u0000\u0716\u0717\u0001\u0000\u0000\u0000\u0717\u0718"+ - "\u0001\u0000\u0000\u0000\u0718\u0719\u0005k\u0000\u0000\u0719\u0155\u0001"+ - "\u0000\u0000\u0000\u071a\u0720\u0003\u00d4j\u0000\u071b\u071c\u0005j\u0000"+ - "\u0000\u071c\u071d\u0003\u0156\u00ab\u0000\u071d\u071e\u0005k\u0000\u0000"+ - "\u071e\u0720\u0001\u0000\u0000\u0000\u071f\u071a\u0001\u0000\u0000\u0000"+ - "\u071f\u071b\u0001\u0000\u0000\u0000\u0720\u0157\u0001\u0000\u0000\u0000"+ - "\u0721\u0728\u0003\u015a\u00ad\u0000\u0722\u0728\u0003\u015e\u00af\u0000"+ - "\u0723\u0724\u0005j\u0000\u0000\u0724\u0725\u0003\u00b4Z\u0000\u0725\u0726"+ - "\u0005k\u0000\u0000\u0726\u0728\u0001\u0000\u0000\u0000\u0727\u0721\u0001"+ - "\u0000\u0000\u0000\u0727\u0722\u0001\u0000\u0000\u0000\u0727\u0723\u0001"+ - "\u0000\u0000\u0000\u0728\u0159\u0001\u0000\u0000\u0000\u0729\u072d\u0003"+ - "\u00c2a\u0000\u072a\u072d\u0003\u0162\u00b1\u0000\u072b\u072d\u0003\u00c6"+ - "c\u0000\u072c\u0729\u0001\u0000\u0000\u0000\u072c\u072a\u0001\u0000\u0000"+ - "\u0000\u072c\u072b\u0001\u0000\u0000\u0000\u072d\u015b\u0001\u0000\u0000"+ - "\u0000\u072e\u072f\u0007\u0012\u0000\u0000\u072f\u015d\u0001\u0000\u0000"+ - "\u0000\u0730\u0731\u0005i\u0000\u0000\u0731\u015f\u0001\u0000\u0000\u0000"+ - "\u0732\u0733\u0005i\u0000\u0000\u0733\u0734\u0005t\u0000\u0000\u0734\u0735"+ - "\u0005i\u0000\u0000\u0735\u0161\u0001\u0000\u0000\u0000\u0736\u0737\u0003"+ - "\u00dam\u0000\u0737\u0738\u0003\u0164\u00b2\u0000\u0738\u0163\u0001\u0000"+ - "\u0000\u0000\u0739\u073e\u0005l\u0000\u0000\u073a\u073c\u0003\u0166\u00b3"+ - "\u0000\u073b\u073d\u0005q\u0000\u0000\u073c\u073b\u0001\u0000\u0000\u0000"+ - "\u073c\u073d\u0001\u0000\u0000\u0000\u073d\u073f\u0001\u0000\u0000\u0000"+ - "\u073e\u073a\u0001\u0000\u0000\u0000\u073e\u073f\u0001\u0000\u0000\u0000"+ - "\u073f\u0740\u0001\u0000\u0000\u0000\u0740\u0741\u0005m\u0000\u0000\u0741"+ - "\u0165\u0001\u0000\u0000\u0000\u0742\u0747\u0003\u0168\u00b4\u0000\u0743"+ - "\u0744\u0005q\u0000\u0000\u0744\u0746\u0003\u0168\u00b4\u0000\u0745\u0743"+ - "\u0001\u0000\u0000\u0000\u0746\u0749\u0001\u0000\u0000\u0000\u0747\u0745"+ - "\u0001\u0000\u0000\u0000\u0747\u0748\u0001\u0000\u0000\u0000\u0748\u0167"+ - "\u0001\u0000\u0000\u0000\u0749\u0747\u0001\u0000\u0000\u0000\u074a\u074b"+ - "\u0003\u016a\u00b5\u0000\u074b\u074c\u0005s\u0000\u0000\u074c\u074e\u0001"+ - "\u0000\u0000\u0000\u074d\u074a\u0001\u0000\u0000\u0000\u074d\u074e\u0001"+ - "\u0000\u0000\u0000\u074e\u074f\u0001\u0000\u0000\u0000\u074f\u0750\u0003"+ - "\u016c\u00b6\u0000\u0750\u0169\u0001\u0000\u0000\u0000\u0751\u0754\u0003"+ - "\u00b4Z\u0000\u0752\u0754\u0003\u0164\u00b2\u0000\u0753\u0751\u0001\u0000"+ - "\u0000\u0000\u0753\u0752\u0001\u0000\u0000\u0000\u0754\u016b\u0001\u0000"+ - "\u0000\u0000\u0755\u0758\u0003\u00b4Z\u0000\u0756\u0758\u0003\u0164\u00b2"+ - "\u0000\u0757\u0755\u0001\u0000\u0000\u0000\u0757\u0756\u0001\u0000\u0000"+ - "\u0000\u0758\u016d\u0001\u0000\u0000\u0000\u0759\u075a\u0005X\u0000\u0000"+ - "\u075a\u0760\u0005l\u0000\u0000\u075b\u075c\u0003`0\u0000\u075c\u075d"+ - "\u0003\u017e\u00bf\u0000\u075d\u075f\u0001\u0000\u0000\u0000\u075e\u075b"+ - "\u0001\u0000\u0000\u0000\u075f\u0762\u0001\u0000\u0000\u0000\u0760\u075e"+ - "\u0001\u0000\u0000\u0000\u0760\u0761\u0001\u0000\u0000\u0000\u0761\u0763"+ - "\u0001\u0000\u0000\u0000\u0762\u0760\u0001\u0000\u0000\u0000\u0763\u0764"+ - "\u0005m\u0000\u0000\u0764\u016f\u0001\u0000\u0000\u0000\u0765\u0766\u0007"+ - "\u0013\u0000\u0000\u0766\u0171\u0001\u0000\u0000\u0000\u0767\u0769\u0005"+ - "\u008b\u0000\u0000\u0768\u0767\u0001\u0000\u0000\u0000\u0768\u0769\u0001"+ - "\u0000\u0000\u0000\u0769\u076a\u0001\u0000\u0000\u0000\u076a\u076b\u0003"+ - "\u013c\u009e\u0000\u076b\u0173\u0001\u0000\u0000\u0000\u076c\u076d\u0005"+ - "n\u0000\u0000\u076d\u076e\u0003\u00b4Z\u0000\u076e\u076f\u0005o\u0000"+ - "\u0000\u076f\u0175\u0001\u0000\u0000\u0000\u0770\u0771\u0005t\u0000\u0000"+ - "\u0771\u0772\u0005j\u0000\u0000\u0772\u0773\u0003\u00d2i\u0000\u0773\u0774"+ - "\u0005k\u0000\u0000\u0774\u0177\u0001\u0000\u0000\u0000\u0775\u0784\u0005"+ - "j\u0000\u0000\u0776\u077d\u0003\u00f6{\u0000\u0777\u077a\u0003\u0156\u00ab"+ - "\u0000\u0778\u0779\u0005q\u0000\u0000\u0779\u077b\u0003\u00f6{\u0000\u077a"+ - "\u0778\u0001\u0000\u0000\u0000\u077a\u077b\u0001\u0000\u0000\u0000\u077b"+ - "\u077d\u0001\u0000\u0000\u0000\u077c\u0776\u0001\u0000\u0000\u0000\u077c"+ - "\u0777\u0001\u0000\u0000\u0000\u077d\u077f\u0001\u0000\u0000\u0000\u077e"+ - "\u0780\u0005x\u0000\u0000\u077f\u077e\u0001\u0000\u0000\u0000\u077f\u0780"+ - "\u0001\u0000\u0000\u0000\u0780\u0782\u0001\u0000\u0000\u0000\u0781\u0783"+ - "\u0005q\u0000\u0000\u0782\u0781\u0001\u0000\u0000\u0000\u0782\u0783\u0001"+ - "\u0000\u0000\u0000\u0783\u0785\u0001\u0000\u0000\u0000\u0784\u077c\u0001"+ - "\u0000\u0000\u0000\u0784\u0785\u0001\u0000\u0000\u0000\u0785\u0786\u0001"+ - "\u0000\u0000\u0000\u0786\u0787\u0005k\u0000\u0000\u0787\u0179\u0001\u0000"+ - "\u0000\u0000\u0788\u0789\u0003\u0156\u00ab\u0000\u0789\u078a\u0005t\u0000"+ - "\u0000\u078a\u078b\u0005i\u0000\u0000\u078b\u017b\u0001\u0000\u0000\u0000"+ - "\u078c\u078d\u0003\u00d2i\u0000\u078d\u017d\u0001\u0000\u0000\u0000\u078e"+ - "\u0793\u0005r\u0000\u0000\u078f\u0793\u0005\u0000\u0000\u0001\u0790\u0793"+ - "\u0005\u00a3\u0000\u0000\u0791\u0793\u0004\u00bf\u0013\u0000\u0792\u078e"+ - "\u0001\u0000\u0000\u0000\u0792\u078f\u0001\u0000\u0000\u0000\u0792\u0790"+ - "\u0001\u0000\u0000\u0000\u0792\u0791\u0001\u0000\u0000\u0000\u0793\u017f"+ - "\u0001\u0000\u0000\u0000\u00c9\u018e\u0193\u019a\u01a4\u01aa\u01b0\u01ba"+ + "\u00d2i\u0000\u02f8\u02fe\u0001\u0000\u0000\u0000\u02f9\u02fb\u0005\u001b"+ + "\u0000\u0000\u02fa\u02f9\u0001\u0000\u0000\u0000\u02fa\u02fb\u0001\u0000"+ + "\u0000\u0000\u02fb\u02fc\u0001\u0000\u0000\u0000\u02fc\u02fe\u0003\u0172"+ + "\u00b9\u0000\u02fd\u02f4\u0001\u0000\u0000\u0000\u02fd\u02fa\u0001\u0000"+ + "\u0000\u0000\u02fe\u0300\u0001\u0000\u0000\u0000\u02ff\u0301\u0003\u0170"+ + "\u00b8\u0000\u0300\u02ff\u0001\u0000\u0000\u0000\u0300\u0301\u0001\u0000"+ + "\u0000\u0000\u0301a\u0001\u0000\u0000\u0000\u0302\u0303\u0007\u0005\u0000"+ + "\u0000\u0303\u0304\u0005n\u0000\u0000\u0304\u0305\u0003\u00d2i\u0000\u0305"+ + "\u0306\u0005o\u0000\u0000\u0306\u030e\u0001\u0000\u0000\u0000\u0307\u0308"+ + "\u0005+\u0000\u0000\u0308\u0309\u0005n\u0000\u0000\u0309\u030a\u0003\u00d2"+ + "i\u0000\u030a\u030b\u0005o\u0000\u0000\u030b\u030c\u0003\u00d2i\u0000"+ + "\u030c\u030e\u0001\u0000\u0000\u0000\u030d\u0302\u0001\u0000\u0000\u0000"+ + "\u030d\u0307\u0001\u0000\u0000\u0000\u030ec\u0001\u0000\u0000\u0000\u030f"+ + "\u0317\u0003p8\u0000\u0310\u0311\u0005L\u0000\u0000\u0311\u0317\u0006"+ + "2\uffff\uffff\u0000\u0312\u0313\u0005\u000e\u0000\u0000\u0313\u0317\u0006"+ + "2\uffff\uffff\u0000\u0314\u0315\u0005D\u0000\u0000\u0315\u0317\u00062"+ + "\uffff\uffff\u0000\u0316\u030f\u0001\u0000\u0000\u0000\u0316\u0310\u0001"+ + "\u0000\u0000\u0000\u0316\u0312\u0001\u0000\u0000\u0000\u0316\u0314\u0001"+ + "\u0000\u0000\u0000\u0317\u0318\u0001\u0000\u0000\u0000\u0318\u031a\u0003"+ + "\u017e\u00bf\u0000\u0319\u0316\u0001\u0000\u0000\u0000\u031a\u031d\u0001"+ + "\u0000\u0000\u0000\u031b\u031c\u0001\u0000\u0000\u0000\u031b\u0319\u0001"+ + "\u0000\u0000\u0000\u031c\u0320\u0001\u0000\u0000\u0000\u031d\u031b\u0001"+ + "\u0000\u0000\u0000\u031e\u031f\u0005\u000e\u0000\u0000\u031f\u0321\u0006"+ + "2\uffff\uffff\u0000\u0320\u031e\u0001\u0000\u0000\u0000\u0320\u0321\u0001"+ + "\u0000\u0000\u0000\u0321\u0323\u0001\u0000\u0000\u0000\u0322\u0324\u0003"+ + "n7\u0000\u0323\u0322\u0001\u0000\u0000\u0000\u0323\u0324\u0001\u0000\u0000"+ + "\u0000\u0324e\u0001\u0000\u0000\u0000\u0325\u0327\b\u0006\u0000\u0000"+ + "\u0326\u0325\u0001\u0000\u0000\u0000\u0327\u0328\u0001\u0000\u0000\u0000"+ + "\u0328\u0326\u0001\u0000\u0000\u0000\u0328\u0329\u0001\u0000\u0000\u0000"+ + "\u0329g\u0001\u0000\u0000\u0000\u032a\u032f\u0003f3\u0000\u032b\u032c"+ + "\u0005q\u0000\u0000\u032c\u032e\u0003f3\u0000\u032d\u032b\u0001\u0000"+ + "\u0000\u0000\u032e\u0331\u0001\u0000\u0000\u0000\u032f\u032d\u0001\u0000"+ + "\u0000\u0000\u032f\u0330\u0001\u0000\u0000\u0000\u0330i\u0001\u0000\u0000"+ + "\u0000\u0331\u032f\u0001\u0000\u0000\u0000\u0332\u0333\u0003f3\u0000\u0333"+ + "\u0335\u0005j\u0000\u0000\u0334\u0336\u0003h4\u0000\u0335\u0334\u0001"+ + "\u0000\u0000\u0000\u0335\u0336\u0001\u0000\u0000\u0000\u0336\u0337\u0001"+ + "\u0000\u0000\u0000\u0337\u0338\u0005k\u0000\u0000\u0338k\u0001\u0000\u0000"+ + "\u0000\u0339\u033e\u0003j5\u0000\u033a\u033b\u0005q\u0000\u0000\u033b"+ + "\u033d\u0003j5\u0000\u033c\u033a\u0001\u0000\u0000\u0000\u033d\u0340\u0001"+ + "\u0000\u0000\u0000\u033e\u033c\u0001\u0000\u0000\u0000\u033e\u033f\u0001"+ + "\u0000\u0000\u0000\u033fm\u0001\u0000\u0000\u0000\u0340\u033e\u0001\u0000"+ + "\u0000\u0000\u0341\u0342\u0005N\u0000\u0000\u0342\u0344\u0005n\u0000\u0000"+ + "\u0343\u0345\u0003l6\u0000\u0344\u0343\u0001\u0000\u0000\u0000\u0344\u0345"+ + "\u0001\u0000\u0000\u0000\u0345\u0346\u0001\u0000\u0000\u0000\u0346\u0347"+ + "\u0005o\u0000\u0000\u0347\u0348\u0003\u017e\u00bf\u0000\u0348o\u0001\u0000"+ + "\u0000\u0000\u0349\u034a\u0005\t\u0000\u0000\u034a\u0352\u0003t:\u0000"+ + "\u034b\u034c\u0005\n\u0000\u0000\u034c\u0352\u0003t:\u0000\u034d\u034e"+ + "\u0005\u000b\u0000\u0000\u034e\u0352\u0003t:\u0000\u034f\u0350\u0005\r"+ + "\u0000\u0000\u0350\u0352\u0003r9\u0000\u0351\u0349\u0001\u0000\u0000\u0000"+ + "\u0351\u034b\u0001\u0000\u0000\u0000\u0351\u034d\u0001\u0000\u0000\u0000"+ + "\u0351\u034f\u0001\u0000\u0000\u0000\u0352q\u0001\u0000\u0000\u0000\u0353"+ + "\u0355\u0003\u00f6{\u0000\u0354\u0353\u0001\u0000\u0000\u0000\u0354\u0355"+ + "\u0001\u0000\u0000\u0000\u0355\u0358\u0001\u0000\u0000\u0000\u0356\u0357"+ + "\u0005`\u0000\u0000\u0357\u0359\u0003\u00b4Z\u0000\u0358\u0356\u0001\u0000"+ + "\u0000\u0000\u0358\u0359\u0001\u0000\u0000\u0000\u0359s\u0001\u0000\u0000"+ + "\u0000\u035a\u035d\u0001\u0000\u0000\u0000\u035b\u035d\u0003\u00b4Z\u0000"+ + "\u035c\u035a\u0001\u0000\u0000\u0000\u035c\u035b\u0001\u0000\u0000\u0000"+ + "\u035du\u0001\u0000\u0000\u0000\u035e\u035f\u00057\u0000\u0000\u035f\u0360"+ + "\u0003\u00b4Z\u0000\u0360\u0364\u0005l\u0000\u0000\u0361\u0363\u0003x"+ + "<\u0000\u0362\u0361\u0001\u0000\u0000\u0000\u0363\u0366\u0001\u0000\u0000"+ + "\u0000\u0364\u0362\u0001\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000"+ + "\u0000\u0365\u0367\u0001\u0000\u0000\u0000\u0366\u0364\u0001\u0000\u0000"+ + "\u0000\u0367\u0368\u0005m\u0000\u0000\u0368w\u0001\u0000\u0000\u0000\u0369"+ + "\u036a\u0003z=\u0000\u036a\u036c\u0005s\u0000\u0000\u036b\u036d\u0003"+ + "\u0100\u0080\u0000\u036c\u036b\u0001\u0000\u0000\u0000\u036c\u036d\u0001"+ + "\u0000\u0000\u0000\u036dy\u0001\u0000\u0000\u0000\u036e\u036f\u0005T\u0000"+ + "\u0000\u036f\u0372\u0003|>\u0000\u0370\u0372\u0005P\u0000\u0000\u0371"+ + "\u036e\u0001\u0000\u0000\u0000\u0371\u0370\u0001\u0000\u0000\u0000\u0372"+ + "{\u0001\u0000\u0000\u0000\u0373\u0374\u0005%\u0000\u0000\u0374\u0381\u0005"+ + "i\u0000\u0000\u0375\u0376\u0003\u00dam\u0000\u0376\u037b\u0005l\u0000"+ + "\u0000\u0377\u0379\u0003~?\u0000\u0378\u037a\u0005q\u0000\u0000\u0379"+ + "\u0378\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000\u037a"+ + "\u037c\u0001\u0000\u0000\u0000\u037b\u0377\u0001\u0000\u0000\u0000\u037b"+ + "\u037c\u0001\u0000\u0000\u0000\u037c\u037d\u0001\u0000\u0000\u0000\u037d"+ + "\u037e\u0005m\u0000\u0000\u037e\u0381\u0001\u0000\u0000\u0000\u037f\u0381"+ + "\u0003\u00b4Z\u0000\u0380\u0373\u0001\u0000\u0000\u0000\u0380\u0375\u0001"+ + "\u0000\u0000\u0000\u0380\u037f\u0001\u0000\u0000\u0000\u0381}\u0001\u0000"+ + "\u0000\u0000\u0382\u0387\u0003|>\u0000\u0383\u0384\u0005q\u0000\u0000"+ + "\u0384\u0386\u0003|>\u0000\u0385\u0383\u0001\u0000\u0000\u0000\u0386\u0389"+ + "\u0001\u0000\u0000\u0000\u0387\u0385\u0001\u0000\u0000\u0000\u0387\u0388"+ + "\u0001\u0000\u0000\u0000\u0388\u007f\u0001\u0000\u0000\u0000\u0389\u0387"+ + "\u0001\u0000\u0000\u0000\u038a\u038f\u0005l\u0000\u0000\u038b\u038c\u0005"+ + "<\u0000\u0000\u038c\u038d\u0003\u00f4z\u0000\u038d\u038e\u0003\u017e\u00bf"+ + "\u0000\u038e\u0390\u0001\u0000\u0000\u0000\u038f\u038b\u0001\u0000\u0000"+ + "\u0000\u038f\u0390\u0001\u0000\u0000\u0000\u0390\u0392\u0001\u0000\u0000"+ + "\u0000\u0391\u0393\u0003\u0100\u0080\u0000\u0392\u0391\u0001\u0000\u0000"+ + "\u0000\u0392\u0393\u0001\u0000\u0000\u0000\u0393\u0394\u0001\u0000\u0000"+ + "\u0000\u0394\u0395\u0005m\u0000\u0000\u0395\u0081\u0001\u0000\u0000\u0000"+ + "\u0396\u0399\u0003\u0160\u00b0\u0000\u0397\u0399\u0005i\u0000\u0000\u0398"+ + "\u0396\u0001\u0000\u0000\u0000\u0398\u0397\u0001\u0000\u0000\u0000\u0399"+ + "\u03a2\u0001\u0000\u0000\u0000\u039a\u039f\u0005l\u0000\u0000\u039b\u039d"+ + "\u0003\u0084B\u0000\u039c\u039e\u0005q\u0000\u0000\u039d\u039c\u0001\u0000"+ + "\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u03a0\u0001\u0000"+ + "\u0000\u0000\u039f\u039b\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000"+ + "\u0000\u0000\u03a0\u03a1\u0001\u0000\u0000\u0000\u03a1\u03a3\u0005m\u0000"+ + "\u0000\u03a2\u039a\u0001\u0000\u0000\u0000\u03a2\u03a3\u0001\u0000\u0000"+ + "\u0000\u03a3\u0083\u0001\u0000\u0000\u0000\u03a4\u03a9\u0003\u0086C\u0000"+ + "\u03a5\u03a6\u0005q\u0000\u0000\u03a6\u03a8\u0003\u0086C\u0000\u03a7\u03a5"+ + "\u0001\u0000\u0000\u0000\u03a8\u03ab\u0001\u0000\u0000\u0000\u03a9\u03a7"+ + "\u0001\u0000\u0000\u0000\u03a9\u03aa\u0001\u0000\u0000\u0000\u03aa\u0085"+ + "\u0001\u0000\u0000\u0000\u03ab\u03a9\u0001\u0000\u0000\u0000\u03ac\u03ad"+ + "\u0005i\u0000\u0000\u03ad\u03af\u0005s\u0000\u0000\u03ae\u03ac\u0001\u0000"+ + "\u0000\u0000\u03ae\u03af\u0001\u0000\u0000\u0000\u03af\u03b0\u0001\u0000"+ + "\u0000\u0000\u03b0\u03b1\u0003\u00b4Z\u0000\u03b1\u0087\u0001\u0000\u0000"+ + "\u0000\u03b2\u03b3\u0005H\u0000\u0000\u03b3\u03b4\u0003\u00b4Z\u0000\u03b4"+ + "\u03b5\u0005\u000f\u0000\u0000\u03b5\u03b6\u0003\u0082A\u0000\u03b6\u03b7"+ + "\u0003\u00fe\u007f\u0000\u03b7\u0089\u0001\u0000\u0000\u0000\u03b8\u03b9"+ + "\u0003\u00d2i\u0000\u03b9\u03ba\u0005\u000f\u0000\u0000\u03ba\u03cd\u0003"+ + "\u00d2i\u0000\u03bb\u03c1\u0005l\u0000\u0000\u03bc\u03bd\u0003\u0092I"+ + "\u0000\u03bd\u03be\u0003\u017e\u00bf\u0000\u03be\u03c0\u0001\u0000\u0000"+ + "\u0000\u03bf\u03bc\u0001\u0000\u0000\u0000\u03c0\u03c3\u0001\u0000\u0000"+ + "\u0000\u03c1\u03bf\u0001\u0000\u0000\u0000\u03c1\u03c2\u0001\u0000\u0000"+ + "\u0000\u03c2\u03c9\u0001\u0000\u0000\u0000\u03c3\u03c1\u0001\u0000\u0000"+ + "\u0000\u03c4\u03c5\u0003\u008cF\u0000\u03c5\u03c6\u0003\u017e\u00bf\u0000"+ + "\u03c6\u03c8\u0001\u0000\u0000\u0000\u03c7\u03c4\u0001\u0000\u0000\u0000"+ + "\u03c8\u03cb\u0001\u0000\u0000\u0000\u03c9\u03c7\u0001\u0000\u0000\u0000"+ + "\u03c9\u03ca\u0001\u0000\u0000\u0000\u03ca\u03cc\u0001\u0000\u0000\u0000"+ + "\u03cb\u03c9\u0001\u0000\u0000\u0000\u03cc\u03ce\u0005m\u0000\u0000\u03cd"+ + "\u03bb\u0001\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce"+ + "\u008b\u0001\u0000\u0000\u0000\u03cf\u03d1\u0005\u000e\u0000\u0000\u03d0"+ + "\u03cf\u0001\u0000\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000\u0000\u03d1"+ + "\u03d2\u0001\u0000\u0000\u0000\u03d2\u03d3\u0003\u008eG\u0000\u03d3\u03d4"+ + "\u0005i\u0000\u0000\u03d4\u03d6\u0003\u014e\u00a7\u0000\u03d5\u03d7\u0003"+ + "\u00fe\u007f\u0000\u03d6\u03d5\u0001\u0000\u0000\u0000\u03d6\u03d7\u0001"+ + "\u0000\u0000\u0000\u03d7\u008d\u0001\u0000\u0000\u0000\u03d8\u03da\u0005"+ + "j\u0000\u0000\u03d9\u03db\u0005i\u0000\u0000\u03da\u03d9\u0001\u0000\u0000"+ + "\u0000\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u03dd\u0001\u0000\u0000"+ + "\u0000\u03dc\u03de\u0005\u008b\u0000\u0000\u03dd\u03dc\u0001\u0000\u0000"+ + "\u0000\u03dd\u03de\u0001\u0000\u0000\u0000\u03de\u03df\u0001\u0000\u0000"+ + "\u0000\u03df\u03e0\u0003\u013c\u009e\u0000\u03e0\u03e1\u0005k\u0000\u0000"+ + "\u03e1\u008f\u0001\u0000\u0000\u0000\u03e2\u03e8\u0003\u00c4b\u0000\u03e3"+ + "\u03e4\u0003\u00d2i\u0000\u03e4\u03e5\u0005t\u0000\u0000\u03e5\u03e6\u0005"+ + "i\u0000\u0000\u03e6\u03e8\u0001\u0000\u0000\u0000\u03e7\u03e2\u0001\u0000"+ + "\u0000\u0000\u03e7\u03e3\u0001\u0000\u0000\u0000\u03e8\u0091\u0001\u0000"+ + "\u0000\u0000\u03e9\u03ea\u00059\u0000\u0000\u03ea\u03eb\u0005i\u0000\u0000"+ + "\u03eb\u03ee\u0005w\u0000\u0000\u03ec\u03ef\u0003\u0090H\u0000\u03ed\u03ef"+ + "\u0003\u015e\u00af\u0000\u03ee\u03ec\u0001\u0000\u0000\u0000\u03ee\u03ed"+ + "\u0001\u0000\u0000\u0000\u03ef\u0093\u0001\u0000\u0000\u0000\u03f0\u03f1"+ + "\u00050\u0000\u0000\u03f1\u03f2\u0005j\u0000\u0000\u03f2\u03f5\u0003\u00d2"+ + "i\u0000\u03f3\u03f4\u0005q\u0000\u0000\u03f4\u03f6\u0003\u00f6{\u0000"+ + "\u03f5\u03f3\u0001\u0000\u0000\u0000\u03f5\u03f6\u0001\u0000\u0000\u0000"+ + "\u03f6\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0005k\u0000\u0000\u03f8"+ + "\u0095\u0001\u0000\u0000\u0000\u03f9\u03fa\u0005/\u0000\u0000\u03fa\u03fb"+ + "\u0005j\u0000\u0000\u03fb\u03fc\u0003\u00d2i\u0000\u03fc\u03fd\u0005k"+ + "\u0000\u0000\u03fd\u0097\u0001\u0000\u0000\u0000\u03fe\u0401\u0003d2\u0000"+ + "\u03ff\u0402\u0003\u009aM\u0000\u0400\u0402\u0003\u009cN\u0000\u0401\u03ff"+ + "\u0001\u0000\u0000\u0000\u0401\u0400\u0001\u0000\u0000\u0000\u0402\u0099"+ + "\u0001\u0000\u0000\u0000\u0403\u0404\u0005Q\u0000\u0000\u0404\u0405\u0005"+ + "i\u0000\u0000\u0405\u0407\u0003\u014e\u00a7\u0000\u0406\u0408\u0003\u0080"+ + "@\u0000\u0407\u0406\u0001\u0000\u0000\u0000\u0407\u0408\u0001\u0000\u0000"+ + "\u0000\u0408\u009b\u0001\u0000\u0000\u0000\u0409\u040a\u0005Q\u0000\u0000"+ + "\u040a\u040b\u0003\u00aaU\u0000\u040b\u040c\u0005i\u0000\u0000\u040c\u040e"+ + "\u0003\u014e\u00a7\u0000\u040d\u040f\u0003\u0080@\u0000\u040e\u040d\u0001"+ + "\u0000\u0000\u0000\u040e\u040f\u0001\u0000\u0000\u0000\u040f\u009d\u0001"+ + "\u0000\u0000\u0000\u0410\u0413\u0005\u001b\u0000\u0000\u0411\u0414\u0003"+ + "\u0098L\u0000\u0412\u0414\u0003\u00eew\u0000\u0413\u0411\u0001\u0000\u0000"+ + "\u0000\u0413\u0412\u0001\u0000\u0000\u0000\u0414\u009f\u0001\u0000\u0000"+ + "\u0000\u0415\u0416\u00059\u0000\u0000\u0416\u0417\u0005i\u0000\u0000\u0417"+ + "\u0419\u0003\u0152\u00a9\u0000\u0418\u041a\u0003\u00a2Q\u0000\u0419\u0418"+ + "\u0001\u0000\u0000\u0000\u0419\u041a\u0001\u0000\u0000\u0000\u041a\u00a1"+ + "\u0001\u0000\u0000\u0000\u041b\u041c\u0005l\u0000\u0000\u041c\u041d\u0003"+ + "\u00b4Z\u0000\u041d\u041e\u0003\u017e\u00bf\u0000\u041e\u041f\u0005m\u0000"+ + "\u0000\u041f\u00a3\u0001\u0000\u0000\u0000\u0420\u0421\u00059\u0000\u0000"+ + "\u0421\u0422\u0003\u00aaU\u0000\u0422\u0423\u0005i\u0000\u0000\u0423\u0425"+ + "\u0003\u0152\u00a9\u0000\u0424\u0426\u0003\u00a2Q\u0000\u0425\u0424\u0001"+ + "\u0000\u0000\u0000\u0425\u0426\u0001\u0000\u0000\u0000\u0426\u00a5\u0001"+ + "\u0000\u0000\u0000\u0427\u042f\u0003\u0006\u0003\u0000\u0428\u042b\u0003"+ + "\u00d2i\u0000\u0429\u042a\u0005p\u0000\u0000\u042a\u042c\u0003\u00f6{"+ + "\u0000\u042b\u0429\u0001\u0000\u0000\u0000\u042b\u042c\u0001\u0000\u0000"+ + "\u0000\u042c\u0430\u0001\u0000\u0000\u0000\u042d\u042e\u0005p\u0000\u0000"+ + "\u042e\u0430\u0003\u00f6{\u0000\u042f\u0428\u0001\u0000\u0000\u0000\u042f"+ + "\u042d\u0001\u0000\u0000\u0000\u0430\u00a7\u0001\u0000\u0000\u0000\u0431"+ + "\u0432\u0003\u0006\u0003\u0000\u0432\u0433\u0005w\u0000\u0000\u0433\u0434"+ + "\u0003\u00f6{\u0000\u0434\u00a9\u0001\u0000\u0000\u0000\u0435\u0437\u0005"+ + "j\u0000\u0000\u0436\u0438\u0003\b\u0004\u0000\u0437\u0436\u0001\u0000"+ + "\u0000\u0000\u0437\u0438\u0001\u0000\u0000\u0000\u0438\u0439\u0001\u0000"+ + "\u0000\u0000\u0439\u043b\u0003\u00d2i\u0000\u043a\u043c\u0005q\u0000\u0000"+ + "\u043b\u043a\u0001\u0000\u0000\u0000\u043b\u043c\u0001\u0000\u0000\u0000"+ + "\u043c\u043d\u0001\u0000\u0000\u0000\u043d\u043e\u0005k\u0000\u0000\u043e"+ + "\u00ab\u0001\u0000\u0000\u0000\u043f\u0442\u0003\u00aeW\u0000\u0440\u0442"+ + "\u0003\u00b0X\u0000\u0441\u043f\u0001\u0000\u0000\u0000\u0441\u0440\u0001"+ + "\u0000\u0000\u0000\u0442\u00ad\u0001\u0000\u0000\u0000\u0443\u0445\u0003"+ + "\u00f4z\u0000\u0444\u0443\u0001\u0000\u0000\u0000\u0444\u0445\u0001\u0000"+ + "\u0000\u0000\u0445\u0446\u0001\u0000\u0000\u0000\u0446\u0447\u0003\u00b2"+ + "Y\u0000\u0447\u00af\u0001\u0000\u0000\u0000\u0448\u044a\u0005\u001b\u0000"+ + "\u0000\u0449\u044b\u0003\u00f4z\u0000\u044a\u0449\u0001\u0000\u0000\u0000"+ + "\u044a\u044b\u0001\u0000\u0000\u0000\u044b\u044c\u0001\u0000\u0000\u0000"+ + "\u044c\u044d\u0003\u00b2Y\u0000\u044d\u00b1\u0001\u0000\u0000\u0000\u044e"+ + "\u0450\u0005x\u0000\u0000\u044f\u044e\u0001\u0000\u0000\u0000\u044f\u0450"+ + "\u0001\u0000\u0000\u0000\u0450\u0451\u0001\u0000\u0000\u0000\u0451\u0452"+ + "\u0003\u00d2i\u0000\u0452\u00b3\u0001\u0000\u0000\u0000\u0453\u0454\u0006"+ + "Z\uffff\uffff\u0000\u0454\u0455\u0007\u0007\u0000\u0000\u0455\u0469\u0003"+ + "\u00b4Z\u000f\u0456\u0469\u0003\u00c4b\u0000\u0457\u0458\u0005\u0019\u0000"+ + "\u0000\u0458\u0459\u0003.\u0017\u0000\u0459\u045a\u0005\u001c\u0000\u0000"+ + "\u045a\u045b\u0003\u00b4Z\u0003\u045b\u0469\u0001\u0000\u0000\u0000\u045c"+ + "\u045d\u0005\u001a\u0000\u0000\u045d\u045e\u0003\u00a8T\u0000\u045e\u045f"+ + "\u0005\u001c\u0000\u0000\u045f\u0460\u0003\u00b4Z\u0002\u0460\u0469\u0001"+ + "\u0000\u0000\u0000\u0461\u0462\u0007\b\u0000\u0000\u0462\u0463\u0003&"+ + "\u0013\u0000\u0463\u0464\u0005s\u0000\u0000\u0464\u0465\u0005s\u0000\u0000"+ + "\u0465\u0466\u0003*\u0015\u0000\u0466\u0467\u0003\u00b4Z\u0001\u0467\u0469"+ + "\u0001\u0000\u0000\u0000\u0468\u0453\u0001\u0000\u0000\u0000\u0468\u0456"+ + "\u0001\u0000\u0000\u0000\u0468\u0457\u0001\u0000\u0000\u0000\u0468\u045c"+ + "\u0001\u0000\u0000\u0000\u0468\u0461\u0001\u0000\u0000\u0000\u0469\u048d"+ + "\u0001\u0000\u0000\u0000\u046a\u046b\n\r\u0000\u0000\u046b\u046c\u0007"+ + "\t\u0000\u0000\u046c\u048c\u0003\u00b4Z\u000e\u046d\u046e\n\f\u0000\u0000"+ + "\u046e\u046f\u0007\n\u0000\u0000\u046f\u048c\u0003\u00b4Z\r\u0470\u0471"+ + "\n\u000b\u0000\u0000\u0471\u0472\u0007\u000b\u0000\u0000\u0472\u048c\u0003"+ + "\u00b4Z\f\u0473\u0474\n\n\u0000\u0000\u0474\u0475\u0007\f\u0000\u0000"+ + "\u0475\u048c\u0003\u00b4Z\u000b\u0476\u0477\n\t\u0000\u0000\u0477\u0478"+ + "\u0007\r\u0000\u0000\u0478\u048c\u0003\u00b4Z\n\u0479\u047a\n\u0007\u0000"+ + "\u0000\u047a\u047b\u0005z\u0000\u0000\u047b\u048c\u0003\u00b4Z\b\u047c"+ + "\u047d\n\u0006\u0000\u0000\u047d\u047e\u0005y\u0000\u0000\u047e\u048c"+ + "\u0003\u00b4Z\u0007\u047f\u0480\n\u0005\u0000\u0000\u0480\u0481\u0005"+ + "\"\u0000\u0000\u0481\u048c\u0003\u00b4Z\u0005\u0482\u0483\n\u0004\u0000"+ + "\u0000\u0483\u0484\u0005%\u0000\u0000\u0484\u0485\u0003\u00b4Z\u0000\u0485"+ + "\u0486\u0005s\u0000\u0000\u0486\u0487\u0003\u00b4Z\u0004\u0487\u048c\u0001"+ + "\u0000\u0000\u0000\u0488\u0489\n\b\u0000\u0000\u0489\u048a\u0005\u000f"+ + "\u0000\u0000\u048a\u048c\u0003\u0082A\u0000\u048b\u046a\u0001\u0000\u0000"+ + "\u0000\u048b\u046d\u0001\u0000\u0000\u0000\u048b\u0470\u0001\u0000\u0000"+ + "\u0000\u048b\u0473\u0001\u0000\u0000\u0000\u048b\u0476\u0001\u0000\u0000"+ + "\u0000\u048b\u0479\u0001\u0000\u0000\u0000\u048b\u047c\u0001\u0000\u0000"+ + "\u0000\u048b\u047f\u0001\u0000\u0000\u0000\u048b\u0482\u0001\u0000\u0000"+ + "\u0000\u048b\u0488\u0001\u0000\u0000\u0000\u048c\u048f\u0001\u0000\u0000"+ + "\u0000\u048d\u048b\u0001\u0000\u0000\u0000\u048d\u048e\u0001\u0000\u0000"+ + "\u0000\u048e\u00b5\u0001\u0000\u0000\u0000\u048f\u048d\u0001\u0000\u0000"+ + "\u0000\u0490\u04a5\u0003\u0018\f\u0000\u0491\u04a5\u0003\u001a\r\u0000"+ + "\u0492\u04a5\u0003\u00ba]\u0000\u0493\u04a5\u0003\u00b8\\\u0000\u0494"+ + "\u04a5\u0003\u00eew\u0000\u0495\u04a5\u0003\u010e\u0087\u0000\u0496\u04a5"+ + "\u0003\u0102\u0081\u0000\u0497\u04a5\u0003\u013a\u009d\u0000\u0498\u04a5"+ + "\u0003\u0110\u0088\u0000\u0499\u04a5\u0003\u0112\u0089\u0000\u049a\u04a5"+ + "\u0003\u0114\u008a\u0000\u049b\u04a5\u0003\u0116\u008b\u0000\u049c\u04a5"+ + "\u0003\u0118\u008c\u0000\u049d\u04a5\u0003\u00fe\u007f\u0000\u049e\u04a5"+ + "\u0003\u011a\u008d\u0000\u049f\u04a5\u0003\u011c\u008e\u0000\u04a0\u04a5"+ + "\u0003\u012e\u0097\u0000\u04a1\u04a5\u0003\u00bc^\u0000\u04a2\u04a5\u0003"+ + "\u00c0`\u0000\u04a3\u04a5\u0003\u0088D\u0000\u04a4\u0490\u0001\u0000\u0000"+ + "\u0000\u04a4\u0491\u0001\u0000\u0000\u0000\u04a4\u0492\u0001\u0000\u0000"+ + "\u0000\u04a4\u0493\u0001\u0000\u0000\u0000\u04a4\u0494\u0001\u0000\u0000"+ + "\u0000\u04a4\u0495\u0001\u0000\u0000\u0000\u04a4\u0496\u0001\u0000\u0000"+ + "\u0000\u04a4\u0497\u0001\u0000\u0000\u0000\u04a4\u0498\u0001\u0000\u0000"+ + "\u0000\u04a4\u0499\u0001\u0000\u0000\u0000\u04a4\u049a\u0001\u0000\u0000"+ + "\u0000\u04a4\u049b\u0001\u0000\u0000\u0000\u04a4\u049c\u0001\u0000\u0000"+ + "\u0000\u04a4\u049d\u0001\u0000\u0000\u0000\u04a4\u049e\u0001\u0000\u0000"+ + "\u0000\u04a4\u049f\u0001\u0000\u0000\u0000\u04a4\u04a0\u0001\u0000\u0000"+ + "\u0000\u04a4\u04a1\u0001\u0000\u0000\u0000\u04a4\u04a2\u0001\u0000\u0000"+ + "\u0000\u04a4\u04a3\u0001\u0000\u0000\u0000\u04a5\u00b7\u0001\u0000\u0000"+ + "\u0000\u04a6\u04a7\u0005$\u0000\u0000\u04a7\u04a8\u0003\u00b4Z\u0000\u04a8"+ + "\u00b9\u0001\u0000\u0000\u0000\u04a9\u04aa\u0005\\\u0000\u0000\u04aa\u04ac"+ + "\u0003\u00b4Z\u0000\u04ab\u04ad\u0003\u00fe\u007f\u0000\u04ac\u04ab\u0001"+ + "\u0000\u0000\u0000\u04ac\u04ad\u0001\u0000\u0000\u0000\u04ad\u00bb\u0001"+ + "\u0000\u0000\u0000\u04ae\u04af\u0003\u00be_\u0000\u04af\u04b0\u0003\u0136"+ + "\u009b\u0000\u04b0\u00bd\u0001\u0000\u0000\u0000\u04b1\u04b2\u0005\f\u0000"+ + "\u0000\u04b2\u04b3\u0003\u00b4Z\u0000\u04b3\u04b4\u0003\u017e\u00bf\u0000"+ + "\u04b4\u04b6\u0001\u0000\u0000\u0000\u04b5\u04b1\u0001\u0000\u0000\u0000"+ + "\u04b6\u04b9\u0001\u0000\u0000\u0000\u04b7\u04b5\u0001\u0000\u0000\u0000"+ + "\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8\u04be\u0001\u0000\u0000\u0000"+ + "\u04b9\u04b7\u0001\u0000\u0000\u0000\u04ba\u04bb\u0005\r\u0000\u0000\u04bb"+ + "\u04bc\u0003r9\u0000\u04bc\u04bd\u0003\u017e\u00bf\u0000\u04bd\u04bf\u0001"+ + "\u0000\u0000\u0000\u04be\u04ba\u0001\u0000\u0000\u0000\u04be\u04bf\u0001"+ + "\u0000\u0000\u0000\u04bf\u00bf\u0001\u0000\u0000\u0000\u04c0\u04c1\u0005"+ + "U\u0000\u0000\u04c1\u04c6\u0003\u00b4Z\u0000\u04c2\u04c3\u0005U\u0000"+ + "\u0000\u04c3\u04c4\u0007\u0001\u0000\u0000\u04c4\u04c6\u0003.\u0017\u0000"+ + "\u04c5\u04c0\u0001\u0000\u0000\u0000\u04c5\u04c2\u0001\u0000\u0000\u0000"+ + "\u04c6\u00c1\u0001\u0000\u0000\u0000\u04c7\u04d0\u0005\u0003\u0000\u0000"+ + "\u04c8\u04d0\u0005\u0004\u0000\u0000\u04c9\u04d0\u0005h\u0000\u0000\u04ca"+ + "\u04d0\u0003\u015c\u00ae\u0000\u04cb\u04d0\u0003\u0170\u00b8\u0000\u04cc"+ + "\u04d0\u0005\u0001\u0000\u0000\u04cd\u04d0\u0005\u0093\u0000\u0000\u04ce"+ + "\u04d0\u0005\u0094\u0000\u0000\u04cf\u04c7\u0001\u0000\u0000\u0000\u04cf"+ + "\u04c8\u0001\u0000\u0000\u0000\u04cf\u04c9\u0001\u0000\u0000\u0000\u04cf"+ + "\u04ca\u0001\u0000\u0000\u0000\u04cf\u04cb\u0001\u0000\u0000\u0000\u04cf"+ + "\u04cc\u0001\u0000\u0000\u0000\u04cf\u04cd\u0001\u0000\u0000\u0000\u04cf"+ + "\u04ce\u0001\u0000\u0000\u0000\u04d0\u00c3\u0001\u0000\u0000\u0000\u04d1"+ + "\u04d2\u0006b\uffff\uffff\u0000\u04d2\u04e2\u0003\u0158\u00ac\u0000\u04d3"+ + "\u04e2\u0003\u0154\u00aa\u0000\u04d4\u04e2\u0003\u017a\u00bd\u0000\u04d5"+ + "\u04e2\u0003 \u0010\u0000\u04d6\u04e2\u0003\u0096K\u0000\u04d7\u04e2\u0003"+ + "\u0094J\u0000\u04d8\u04d9\u0005M\u0000\u0000\u04d9\u04da\u0003\u00c4b"+ + "\u0000\u04da\u04db\u0003\u0178\u00bc\u0000\u04db\u04e2\u0001\u0000\u0000"+ + "\u0000\u04dc\u04dd\u0007\u000e\u0000\u0000\u04dd\u04de\u0005j\u0000\u0000"+ + "\u04de\u04df\u0003\u00b4Z\u0000\u04df\u04e0\u0005k\u0000\u0000\u04e0\u04e2"+ + "\u0001\u0000\u0000\u0000\u04e1\u04d1\u0001\u0000\u0000\u0000\u04e1\u04d3"+ + "\u0001\u0000\u0000\u0000\u04e1\u04d4\u0001\u0000\u0000\u0000\u04e1\u04d5"+ + "\u0001\u0000\u0000\u0000\u04e1\u04d6\u0001\u0000\u0000\u0000\u04e1\u04d7"+ + "\u0001\u0000\u0000\u0000\u04e1\u04d8\u0001\u0000\u0000\u0000\u04e1\u04dc"+ + "\u0001\u0000\u0000\u0000\u04e2\u04f9\u0001\u0000\u0000\u0000\u04e3\u04e4"+ + "\n\n\u0000\u0000\u04e4\u04e5\u0005t\u0000\u0000\u04e5\u04f8\u0005i\u0000"+ + "\u0000\u04e6\u04e7\n\t\u0000\u0000\u04e7\u04f8\u0003\u0174\u00ba\u0000"+ + "\u04e8\u04e9\n\b\u0000\u0000\u04e9\u04f8\u0003\u00deo\u0000\u04ea\u04eb"+ + "\n\u0007\u0000\u0000\u04eb\u04f8\u0003L&\u0000\u04ec\u04ed\n\u0006\u0000"+ + "\u0000\u04ed\u04f8\u0003\u0176\u00bb\u0000\u04ee\u04ef\n\u0005\u0000\u0000"+ + "\u04ef\u04f8\u0003\u0178\u00bc\u0000\u04f0\u04f1\n\u0003\u0000\u0000\u04f1"+ + "\u04f2\u0003\u0178\u00bc\u0000\u04f2\u04f3\u0005\u0010\u0000\u0000\u04f3"+ + "\u04f4\u0003\u0082A\u0000\u04f4\u04f8\u0001\u0000\u0000\u0000\u04f5\u04f6"+ + "\n\u0002\u0000\u0000\u04f6\u04f8\u0003\u00cae\u0000\u04f7\u04e3\u0001"+ + "\u0000\u0000\u0000\u04f7\u04e6\u0001\u0000\u0000\u0000\u04f7\u04e8\u0001"+ + "\u0000\u0000\u0000\u04f7\u04ea\u0001\u0000\u0000\u0000\u04f7\u04ec\u0001"+ + "\u0000\u0000\u0000\u04f7\u04ee\u0001\u0000\u0000\u0000\u04f7\u04f0\u0001"+ + "\u0000\u0000\u0000\u04f7\u04f5\u0001\u0000\u0000\u0000\u04f8\u04fb\u0001"+ + "\u0000\u0000\u0000\u04f9\u04f7\u0001\u0000\u0000\u0000\u04f9\u04fa\u0001"+ + "\u0000\u0000\u0000\u04fa\u00c5\u0001\u0000\u0000\u0000\u04fb\u04f9\u0001"+ + "\u0000\u0000\u0000\u04fc\u04fd\u0003d2\u0000\u04fd\u04fe\u0003\u00c8d"+ + "\u0000\u04fe\u00c7\u0001\u0000\u0000\u0000\u04ff\u0501\u0005Q\u0000\u0000"+ + "\u0500\u0502\u0005i\u0000\u0000\u0501\u0500\u0001\u0000\u0000\u0000\u0501"+ + "\u0502\u0001\u0000\u0000\u0000\u0502\u0503\u0001\u0000\u0000\u0000\u0503"+ + "\u0505\u0003\u014e\u00a7\u0000\u0504\u0506\u0003\u0080@\u0000\u0505\u0504"+ + "\u0001\u0000\u0000\u0000\u0505\u0506\u0001\u0000\u0000\u0000\u0506\u00c9"+ + "\u0001\u0000\u0000\u0000\u0507\u0509\u0005&\u0000\u0000\u0508\u050a\u0003"+ + "\u00f6{\u0000\u0509\u0508\u0001\u0000\u0000\u0000\u0509\u050a\u0001\u0000"+ + "\u0000\u0000\u050a\u050c\u0001\u0000\u0000\u0000\u050b\u050d\u0005q\u0000"+ + "\u0000\u050c\u050b\u0001\u0000\u0000\u0000\u050c\u050d\u0001\u0000\u0000"+ + "\u0000\u050d\u050e\u0001\u0000\u0000\u0000\u050e\u050f\u0005\'\u0000\u0000"+ + "\u050f\u00cb\u0001\u0000\u0000\u0000\u0510\u0511\u0005R\u0000\u0000\u0511"+ + "\u051b\u0005l\u0000\u0000\u0512\u0516\u0003\u00d0h\u0000\u0513\u0516\u0003"+ + "\u013c\u009e\u0000\u0514\u0516\u0003\u00ceg\u0000\u0515\u0512\u0001\u0000"+ + "\u0000\u0000\u0515\u0513\u0001\u0000\u0000\u0000\u0515\u0514\u0001\u0000"+ + "\u0000\u0000\u0516\u0517\u0001\u0000\u0000\u0000\u0517\u0518\u0003\u017e"+ + "\u00bf\u0000\u0518\u051a\u0001\u0000\u0000\u0000\u0519\u0515\u0001\u0000"+ + "\u0000\u0000\u051a\u051d\u0001\u0000\u0000\u0000\u051b\u0519\u0001\u0000"+ + "\u0000\u0000\u051b\u051c\u0001\u0000\u0000\u0000\u051c\u051e\u0001\u0000"+ + "\u0000\u0000\u051d\u051b\u0001\u0000\u0000\u0000\u051e\u051f\u0005m\u0000"+ + "\u0000\u051f\u00cd\u0001\u0000\u0000\u0000\u0520\u0521\u00059\u0000\u0000"+ + "\u0521\u0522\u0005i\u0000\u0000\u0522\u0523\u0003\u0152\u00a9\u0000\u0523"+ + "\u00cf\u0001\u0000\u0000\u0000\u0524\u0526\u0005\u001b\u0000\u0000\u0525"+ + "\u0524\u0001\u0000\u0000\u0000\u0525\u0526\u0001\u0000\u0000\u0000\u0526"+ + "\u0527\u0001\u0000\u0000\u0000\u0527\u0528\u0003d2\u0000\u0528\u0529\u0005"+ + "i\u0000\u0000\u0529\u052a\u0003\u0152\u00a9\u0000\u052a\u052b\u0003\u0150"+ + "\u00a8\u0000\u052b\u0534\u0001\u0000\u0000\u0000\u052c\u052e\u0005\u001b"+ + "\u0000\u0000\u052d\u052c\u0001\u0000\u0000\u0000\u052d\u052e\u0001\u0000"+ + "\u0000\u0000\u052e\u052f\u0001\u0000\u0000\u0000\u052f\u0530\u0003d2\u0000"+ + "\u0530\u0531\u0005i\u0000\u0000\u0531\u0532\u0003\u0152\u00a9\u0000\u0532"+ + "\u0534\u0001\u0000\u0000\u0000\u0533\u0525\u0001\u0000\u0000\u0000\u0533"+ + "\u052d\u0001\u0000\u0000\u0000\u0534\u00d1\u0001\u0000\u0000\u0000\u0535"+ + "\u053d\u0003\u013c\u009e\u0000\u0536\u053d\u0003\u00d4j\u0000\u0537\u053d"+ + "\u0003P(\u0000\u0538\u0539\u0005j\u0000\u0000\u0539\u053a\u0003\u00d2"+ + "i\u0000\u053a\u053b\u0005k\u0000\u0000\u053b\u053d\u0001\u0000\u0000\u0000"+ + "\u053c\u0535\u0001\u0000\u0000\u0000\u053c\u0536\u0001\u0000\u0000\u0000"+ + "\u053c\u0537\u0001\u0000\u0000\u0000\u053c\u0538\u0001\u0000\u0000\u0000"+ + "\u053d\u00d3\u0001\u0000\u0000\u0000\u053e\u0548\u0003\u013e\u009f\u0000"+ + "\u053f\u0548\u0003\u016e\u00b7\u0000\u0540\u0548\u0003\u0144\u00a2\u0000"+ + "\u0541\u0548\u0003\u014c\u00a6\u0000\u0542\u0548\u0003\u00ccf\u0000\u0543"+ + "\u0548\u0003\u0146\u00a3\u0000\u0544\u0548\u0003\u0148\u00a4\u0000\u0545"+ + "\u0548\u0003\u014a\u00a5\u0000\u0546\u0548\u0003\u00d6k\u0000\u0547\u053e"+ + "\u0001\u0000\u0000\u0000\u0547\u053f\u0001\u0000\u0000\u0000\u0547\u0540"+ + "\u0001\u0000\u0000\u0000\u0547\u0541\u0001\u0000\u0000\u0000\u0547\u0542"+ + "\u0001\u0000\u0000\u0000\u0547\u0543\u0001\u0000\u0000\u0000\u0547\u0544"+ + "\u0001\u0000\u0000\u0000\u0547\u0545\u0001\u0000\u0000\u0000\u0547\u0546"+ + "\u0001\u0000\u0000\u0000\u0548\u00d5\u0001\u0000\u0000\u0000\u0549\u054a"+ + "\u00059\u0000\u0000\u054a\u054b\u0003\u00d8l\u0000\u054b\u00d7\u0001\u0000"+ + "\u0000\u0000\u054c\u0558\u0005j\u0000\u0000\u054d\u0552\u0003\u00d2i\u0000"+ + "\u054e\u054f\u0005q\u0000\u0000\u054f\u0551\u0003\u00d2i\u0000\u0550\u054e"+ + "\u0001\u0000\u0000\u0000\u0551\u0554\u0001\u0000\u0000\u0000\u0552\u0550"+ + "\u0001\u0000\u0000\u0000\u0552\u0553\u0001\u0000\u0000\u0000\u0553\u0556"+ + "\u0001\u0000\u0000\u0000\u0554\u0552\u0001\u0000\u0000\u0000\u0555\u0557"+ + "\u0005q\u0000\u0000\u0556\u0555\u0001\u0000\u0000\u0000\u0556\u0557\u0001"+ + "\u0000\u0000\u0000\u0557\u0559\u0001\u0000\u0000\u0000\u0558\u054d\u0001"+ + "\u0000\u0000\u0000\u0558\u0559\u0001\u0000\u0000\u0000\u0559\u055a\u0001"+ + "\u0000\u0000\u0000\u055a\u055b\u0005k\u0000\u0000\u055b\u00d9\u0001\u0000"+ + "\u0000\u0000\u055c\u0564\u0003\u016e\u00b7\u0000\u055d\u0564\u0003\u013e"+ + "\u009f\u0000\u055e\u0564\u0003\u00dcn\u0000\u055f\u0564\u0003\u0146\u00a3"+ + "\u0000\u0560\u0564\u0003\u0148\u00a4\u0000\u0561\u0564\u0003P(\u0000\u0562"+ + "\u0564\u0003\u013c\u009e\u0000\u0563\u055c\u0001\u0000\u0000\u0000\u0563"+ + "\u055d\u0001\u0000\u0000\u0000\u0563\u055e\u0001\u0000\u0000\u0000\u0563"+ + "\u055f\u0001\u0000\u0000\u0000\u0563\u0560\u0001\u0000\u0000\u0000\u0563"+ + "\u0561\u0001\u0000\u0000\u0000\u0563\u0562\u0001\u0000\u0000\u0000\u0564"+ + "\u00db\u0001\u0000\u0000\u0000\u0565\u0566\u0005n\u0000\u0000\u0566\u0567"+ + "\u0005x\u0000\u0000\u0567\u0568\u0005o\u0000\u0000\u0568\u0569\u0003\u0142"+ + "\u00a1\u0000\u0569\u00dd\u0001\u0000\u0000\u0000\u056a\u057a\u0005n\u0000"+ + "\u0000\u056b\u056d\u0003\u00e0p\u0000\u056c\u056b\u0001\u0000\u0000\u0000"+ + "\u056c\u056d\u0001\u0000\u0000\u0000\u056d\u056e\u0001\u0000\u0000\u0000"+ + "\u056e\u0570\u0005s\u0000\u0000\u056f\u0571\u0003\u00e2q\u0000\u0570\u056f"+ + "\u0001\u0000\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u057b"+ + "\u0001\u0000\u0000\u0000\u0572\u0574\u0003\u00e0p\u0000\u0573\u0572\u0001"+ + "\u0000\u0000\u0000\u0573\u0574\u0001\u0000\u0000\u0000\u0574\u0575\u0001"+ + "\u0000\u0000\u0000\u0575\u0576\u0005s\u0000\u0000\u0576\u0577\u0003\u00e2"+ + "q\u0000\u0577\u0578\u0005s\u0000\u0000\u0578\u0579\u0003\u00e4r\u0000"+ + "\u0579\u057b\u0001\u0000\u0000\u0000\u057a\u056c\u0001\u0000\u0000\u0000"+ + "\u057a\u0573\u0001\u0000\u0000\u0000\u057b\u057c\u0001\u0000\u0000\u0000"+ + "\u057c\u057d\u0005o\u0000\u0000\u057d\u00df\u0001\u0000\u0000\u0000\u057e"+ + "\u057f\u0003\u00b4Z\u0000\u057f\u00e1\u0001\u0000\u0000\u0000\u0580\u0581"+ + "\u0003\u00b4Z\u0000\u0581\u00e3\u0001\u0000\u0000\u0000\u0582\u0583\u0003"+ + "\u00b4Z\u0000\u0583\u00e5\u0001\u0000\u0000\u0000\u0584\u0586\u0007\u000f"+ + "\u0000\u0000\u0585\u0584\u0001\u0000\u0000\u0000\u0585\u0586\u0001\u0000"+ + "\u0000\u0000\u0586\u0587\u0001\u0000\u0000\u0000\u0587\u0588\u0005p\u0000"+ + "\u0000\u0588\u00e7\u0001\u0000\u0000\u0000\u0589\u058a\u0003\u00f6{\u0000"+ + "\u058a\u058b\u0005p\u0000\u0000\u058b\u0590\u0001\u0000\u0000\u0000\u058c"+ + "\u058d\u0003\u0006\u0003\u0000\u058d\u058e\u0005w\u0000\u0000\u058e\u0590"+ + "\u0001\u0000\u0000\u0000\u058f\u0589\u0001\u0000\u0000\u0000\u058f\u058c"+ + "\u0001\u0000\u0000\u0000\u058f\u0590\u0001\u0000\u0000\u0000\u0590\u0591"+ + "\u0001\u0000\u0000\u0000\u0591\u0592\u0005a\u0000\u0000\u0592\u0597\u0003"+ + "\u00b4Z\u0000\u0593\u0595\u0005K\u0000\u0000\u0594\u0596\u0005i\u0000"+ + "\u0000\u0595\u0594\u0001\u0000\u0000\u0000\u0595\u0596\u0001\u0000\u0000"+ + "\u0000\u0596\u0598\u0001\u0000\u0000\u0000\u0597\u0593\u0001\u0000\u0000"+ + "\u0000\u0597\u0598\u0001\u0000\u0000\u0000\u0598\u00e9\u0001\u0000\u0000"+ + "\u0000\u0599\u059a\u0005\\\u0000\u0000\u059a\u059b\u0005i\u0000\u0000"+ + "\u059b\u00eb\u0001\u0000\u0000\u0000\u059c\u059d\u0003\u0170\u00b8\u0000"+ + "\u059d\u00ed\u0001\u0000\u0000\u0000\u059e\u05a2\u0003\u00f0x\u0000\u059f"+ + "\u05a2\u0003\u00f8|\u0000\u05a0\u05a2\u0003\u00fc~\u0000\u05a1\u059e\u0001"+ + "\u0000\u0000\u0000\u05a1\u059f\u0001\u0000\u0000\u0000\u05a1\u05a0\u0001"+ + "\u0000\u0000\u0000\u05a2\u00ef\u0001\u0000\u0000\u0000\u05a3\u05af\u0005"+ + "^\u0000\u0000\u05a4\u05b0\u0003\u00f2y\u0000\u05a5\u05ab\u0005j\u0000"+ + "\u0000\u05a6\u05a7\u0003\u00f2y\u0000\u05a7\u05a8\u0003\u017e\u00bf\u0000"+ + "\u05a8\u05aa\u0001\u0000\u0000\u0000\u05a9\u05a6\u0001\u0000\u0000\u0000"+ + "\u05aa\u05ad\u0001\u0000\u0000\u0000\u05ab\u05a9\u0001\u0000\u0000\u0000"+ + "\u05ab\u05ac\u0001\u0000\u0000\u0000\u05ac\u05ae\u0001\u0000\u0000\u0000"+ + "\u05ad\u05ab\u0001\u0000\u0000\u0000\u05ae\u05b0\u0005k\u0000\u0000\u05af"+ + "\u05a4\u0001\u0000\u0000\u0000\u05af\u05a5\u0001\u0000\u0000\u0000\u05b0"+ + "\u00f1\u0001\u0000\u0000\u0000\u05b1\u05b7\u0003\u00f4z\u0000\u05b2\u05b4"+ + "\u0003\u00d2i\u0000\u05b3\u05b2\u0001\u0000\u0000\u0000\u05b3\u05b4\u0001"+ + "\u0000\u0000\u0000\u05b4\u05b5\u0001\u0000\u0000\u0000\u05b5\u05b6\u0005"+ + "p\u0000\u0000\u05b6\u05b8\u0003\u00f6{\u0000\u05b7\u05b3\u0001\u0000\u0000"+ + "\u0000\u05b7\u05b8\u0001\u0000\u0000\u0000\u05b8\u00f3\u0001\u0000\u0000"+ + "\u0000\u05b9\u05be\u0005i\u0000\u0000\u05ba\u05bb\u0005q\u0000\u0000\u05bb"+ + "\u05bd\u0005i\u0000\u0000\u05bc\u05ba\u0001\u0000\u0000\u0000\u05bd\u05c0"+ + "\u0001\u0000\u0000\u0000\u05be\u05bc\u0001\u0000\u0000\u0000\u05be\u05bf"+ + "\u0001\u0000\u0000\u0000\u05bf\u00f5\u0001\u0000\u0000\u0000\u05c0\u05be"+ + "\u0001\u0000\u0000\u0000\u05c1\u05c6\u0003\u00b4Z\u0000\u05c2\u05c3\u0005"+ + "q\u0000\u0000\u05c3\u05c5\u0003\u00b4Z\u0000\u05c4\u05c2\u0001\u0000\u0000"+ + "\u0000\u05c5\u05c8\u0001\u0000\u0000\u0000\u05c6\u05c4\u0001\u0000\u0000"+ + "\u0000\u05c6\u05c7\u0001\u0000\u0000\u0000\u05c7\u00f7\u0001\u0000\u0000"+ + "\u0000\u05c8\u05c6\u0001\u0000\u0000\u0000\u05c9\u05d5\u0005b\u0000\u0000"+ + "\u05ca\u05d6\u0003\u00fa}\u0000\u05cb\u05d1\u0005j\u0000\u0000\u05cc\u05cd"+ + "\u0003\u00fa}\u0000\u05cd\u05ce\u0003\u017e\u00bf\u0000\u05ce\u05d0\u0001"+ + "\u0000\u0000\u0000\u05cf\u05cc\u0001\u0000\u0000\u0000\u05d0\u05d3\u0001"+ + "\u0000\u0000\u0000\u05d1\u05cf\u0001\u0000\u0000\u0000\u05d1\u05d2\u0001"+ + "\u0000\u0000\u0000\u05d2\u05d4\u0001\u0000\u0000\u0000\u05d3\u05d1\u0001"+ + "\u0000\u0000\u0000\u05d4\u05d6\u0005k\u0000\u0000\u05d5\u05ca\u0001\u0000"+ + "\u0000\u0000\u05d5\u05cb\u0001\u0000\u0000\u0000\u05d6\u00f9\u0001\u0000"+ + "\u0000\u0000\u05d7\u05d9\u0005i\u0000\u0000\u05d8\u05da\u0005p\u0000\u0000"+ + "\u05d9\u05d8\u0001\u0000\u0000\u0000\u05d9\u05da\u0001\u0000\u0000\u0000"+ + "\u05da\u05db\u0001\u0000\u0000\u0000\u05db\u05dc\u0003\u00d2i\u0000\u05dc"+ + "\u00fb\u0001\u0000\u0000\u0000\u05dd\u05e9\u0005g\u0000\u0000\u05de\u05ea"+ + "\u0003\u00a6S\u0000\u05df\u05e5\u0005j\u0000\u0000\u05e0\u05e1\u0003\u00a6"+ + "S\u0000\u05e1\u05e2\u0003\u017e\u00bf\u0000\u05e2\u05e4\u0001\u0000\u0000"+ + "\u0000\u05e3\u05e0\u0001\u0000\u0000\u0000\u05e4\u05e7\u0001\u0000\u0000"+ + "\u0000\u05e5\u05e3\u0001\u0000\u0000\u0000\u05e5\u05e6\u0001\u0000\u0000"+ + "\u0000\u05e6\u05e8\u0001\u0000\u0000\u0000\u05e7\u05e5\u0001\u0000\u0000"+ + "\u0000\u05e8\u05ea\u0005k\u0000\u0000\u05e9\u05de\u0001\u0000\u0000\u0000"+ + "\u05e9\u05df\u0001\u0000\u0000\u0000\u05ea\u00fd\u0001\u0000\u0000\u0000"+ + "\u05eb\u05ed\u0005l\u0000\u0000\u05ec\u05ee\u0003\u0100\u0080\u0000\u05ed"+ + "\u05ec\u0001\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000\u0000\u05ee"+ + "\u05ef\u0001\u0000\u0000\u0000\u05ef\u05f0\u0005m\u0000\u0000\u05f0\u00ff"+ + "\u0001\u0000\u0000\u0000\u05f1\u05f3\u0005r\u0000\u0000\u05f2\u05f1\u0001"+ + "\u0000\u0000\u0000\u05f2\u05f3\u0001\u0000\u0000\u0000\u05f3\u05f9\u0001"+ + "\u0000\u0000\u0000\u05f4\u05f6\u0005\u00a3\u0000\u0000\u05f5\u05f4\u0001"+ + "\u0000\u0000\u0000\u05f5\u05f6\u0001\u0000\u0000\u0000\u05f6\u05f9\u0001"+ + "\u0000\u0000\u0000\u05f7\u05f9\u0004\u0080\u0012\u0000\u05f8\u05f2\u0001"+ + "\u0000\u0000\u0000\u05f8\u05f5\u0001\u0000\u0000\u0000\u05f8\u05f7\u0001"+ + "\u0000\u0000\u0000\u05f9\u05fa\u0001\u0000\u0000\u0000\u05fa\u05fb\u0003"+ + "\u00b6[\u0000\u05fb\u05fc\u0003\u017e\u00bf\u0000\u05fc\u05fe\u0001\u0000"+ + "\u0000\u0000\u05fd\u05f8\u0001\u0000\u0000\u0000\u05fe\u05ff\u0001\u0000"+ + "\u0000\u0000\u05ff\u05fd\u0001\u0000\u0000\u0000\u05ff\u0600\u0001\u0000"+ + "\u0000\u0000\u0600\u0101\u0001\u0000\u0000\u0000\u0601\u0607\u0003\u0106"+ + "\u0083\u0000\u0602\u0607\u0003\u0108\u0084\u0000\u0603\u0607\u0003\u010a"+ + "\u0085\u0000\u0604\u0607\u0003\u0104\u0082\u0000\u0605\u0607\u0003\u00a8"+ + "T\u0000\u0606\u0601\u0001\u0000\u0000\u0000\u0606\u0602\u0001\u0000\u0000"+ + "\u0000\u0606\u0603\u0001\u0000\u0000\u0000\u0606\u0604\u0001\u0000\u0000"+ + "\u0000\u0606\u0605\u0001\u0000\u0000\u0000\u0607\u0103\u0001\u0000\u0000"+ + "\u0000\u0608\u0609\u0003\u00b4Z\u0000\u0609\u0105\u0001\u0000\u0000\u0000"+ + "\u060a\u060b\u0003\u00b4Z\u0000\u060b\u060c\u0005\u008d\u0000\u0000\u060c"+ + "\u060d\u0003\u00b4Z\u0000\u060d\u0107\u0001\u0000\u0000\u0000\u060e\u060f"+ + "\u0003\u00b4Z\u0000\u060f\u0610\u0007\u0010\u0000\u0000\u0610\u0109\u0001"+ + "\u0000\u0000\u0000\u0611\u0612\u0003\u00f6{\u0000\u0612\u0613\u0003\u00e6"+ + "s\u0000\u0613\u0614\u0003\u00f6{\u0000\u0614\u010b\u0001\u0000\u0000\u0000"+ + "\u0615\u0616\u0007\u0011\u0000\u0000\u0616\u010d\u0001\u0000\u0000\u0000"+ + "\u0617\u0618\u0005i\u0000\u0000\u0618\u061a\u0005s\u0000\u0000\u0619\u061b"+ + "\u0003\u00b6[\u0000\u061a\u0619\u0001\u0000\u0000\u0000\u061a\u061b\u0001"+ + "\u0000\u0000\u0000\u061b\u010f\u0001\u0000\u0000\u0000\u061c\u061e\u0005"+ + "f\u0000\u0000\u061d\u061f\u0003\u00f6{\u0000\u061e\u061d\u0001\u0000\u0000"+ + "\u0000\u061e\u061f\u0001\u0000\u0000\u0000\u061f\u0111\u0001\u0000\u0000"+ + "\u0000\u0620\u0622\u0005O\u0000\u0000\u0621\u0623\u0005i\u0000\u0000\u0622"+ + "\u0621\u0001\u0000\u0000\u0000\u0622\u0623\u0001\u0000\u0000\u0000\u0623"+ + "\u0113\u0001\u0000\u0000\u0000\u0624\u0626\u0005c\u0000\u0000\u0625\u0627"+ + "\u0005i\u0000\u0000\u0626\u0625\u0001\u0000\u0000\u0000\u0626\u0627\u0001"+ + "\u0000\u0000\u0000\u0627\u0115\u0001\u0000\u0000\u0000\u0628\u0629\u0005"+ + "[\u0000\u0000\u0629\u062a\u0005i\u0000\u0000\u062a\u0117\u0001\u0000\u0000"+ + "\u0000\u062b\u062c\u0005_\u0000\u0000\u062c\u0119\u0001\u0000\u0000\u0000"+ + "\u062d\u0636\u0005`\u0000\u0000\u062e\u0637\u0003\u00b4Z\u0000\u062f\u0630"+ + "\u0003\u017e\u00bf\u0000\u0630\u0631\u0003\u00b4Z\u0000\u0631\u0637\u0001"+ + "\u0000\u0000\u0000\u0632\u0633\u0003\u0102\u0081\u0000\u0633\u0634\u0003"+ + "\u017e\u00bf\u0000\u0634\u0635\u0003\u00b4Z\u0000\u0635\u0637\u0001\u0000"+ + "\u0000\u0000\u0636\u062e\u0001\u0000\u0000\u0000\u0636\u062f\u0001\u0000"+ + "\u0000\u0000\u0636\u0632\u0001\u0000\u0000\u0000\u0637\u0638\u0001\u0000"+ + "\u0000\u0000\u0638\u063e\u0003\u00fe\u007f\u0000\u0639\u063c\u0005Z\u0000"+ + "\u0000\u063a\u063d\u0003\u011a\u008d\u0000\u063b\u063d\u0003\u00fe\u007f"+ + "\u0000\u063c\u063a\u0001\u0000\u0000\u0000\u063c\u063b\u0001\u0000\u0000"+ + "\u0000\u063d\u063f\u0001\u0000\u0000\u0000\u063e\u0639\u0001\u0000\u0000"+ + "\u0000\u063e\u063f\u0001\u0000\u0000\u0000\u063f\u011b\u0001\u0000\u0000"+ + "\u0000\u0640\u0643\u0003\u011e\u008f\u0000\u0641\u0643\u0003\u0124\u0092"+ + "\u0000\u0642\u0640\u0001\u0000\u0000\u0000\u0642\u0641\u0001\u0000\u0000"+ + "\u0000\u0643\u011d\u0001\u0000\u0000\u0000\u0644\u064f\u0005]\u0000\u0000"+ + "\u0645\u0647\u0003\u00b4Z\u0000\u0646\u0645\u0001\u0000\u0000\u0000\u0646"+ + "\u0647\u0001\u0000\u0000\u0000\u0647\u0650\u0001\u0000\u0000\u0000\u0648"+ + "\u064a\u0003\u0102\u0081\u0000\u0649\u0648\u0001\u0000\u0000\u0000\u0649"+ + "\u064a\u0001\u0000\u0000\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b"+ + "\u064d\u0003\u017e\u00bf\u0000\u064c\u064e\u0003\u00b4Z\u0000\u064d\u064c"+ + "\u0001\u0000\u0000\u0000\u064d\u064e\u0001\u0000\u0000\u0000\u064e\u0650"+ + "\u0001\u0000\u0000\u0000\u064f\u0646\u0001\u0000\u0000\u0000\u064f\u0649"+ + "\u0001\u0000\u0000\u0000\u0650\u0651\u0001\u0000\u0000\u0000\u0651\u0655"+ + "\u0005l\u0000\u0000\u0652\u0654\u0003\u0120\u0090\u0000\u0653\u0652\u0001"+ + "\u0000\u0000\u0000\u0654\u0657\u0001\u0000\u0000\u0000\u0655\u0653\u0001"+ + "\u0000\u0000\u0000\u0655\u0656\u0001\u0000\u0000\u0000\u0656\u0658\u0001"+ + "\u0000\u0000\u0000\u0657\u0655\u0001\u0000\u0000\u0000\u0658\u0659\u0005"+ + "m\u0000\u0000\u0659\u011f\u0001\u0000\u0000\u0000\u065a\u065b\u0003\u0122"+ + "\u0091\u0000\u065b\u065d\u0005s\u0000\u0000\u065c\u065e\u0003\u0100\u0080"+ + "\u0000\u065d\u065c\u0001\u0000\u0000\u0000\u065d\u065e\u0001\u0000\u0000"+ + "\u0000\u065e\u0121\u0001\u0000\u0000\u0000\u065f\u0660\u0005T\u0000\u0000"+ + "\u0660\u0663\u0003\u00f6{\u0000\u0661\u0663\u0005P\u0000\u0000\u0662\u065f"+ + "\u0001\u0000\u0000\u0000\u0662\u0661\u0001\u0000\u0000\u0000\u0663\u0123"+ + "\u0001\u0000\u0000\u0000\u0664\u066d\u0005]\u0000\u0000\u0665\u066e\u0003"+ + "\u0126\u0093\u0000\u0666\u0667\u0003\u017e\u00bf\u0000\u0667\u0668\u0003"+ + "\u0126\u0093\u0000\u0668\u066e\u0001\u0000\u0000\u0000\u0669\u066a\u0003"+ + "\u0102\u0081\u0000\u066a\u066b\u0003\u017e\u00bf\u0000\u066b\u066c\u0003"+ + "\u0126\u0093\u0000\u066c\u066e\u0001\u0000\u0000\u0000\u066d\u0665\u0001"+ + "\u0000\u0000\u0000\u066d\u0666\u0001\u0000\u0000\u0000\u066d\u0669\u0001"+ + "\u0000\u0000\u0000\u066e\u066f\u0001\u0000\u0000\u0000\u066f\u0673\u0005"+ + "l\u0000\u0000\u0670\u0672\u0003\u0128\u0094\u0000\u0671\u0670\u0001\u0000"+ + "\u0000\u0000\u0672\u0675\u0001\u0000\u0000\u0000\u0673\u0671\u0001\u0000"+ + "\u0000\u0000\u0673\u0674\u0001\u0000\u0000\u0000\u0674\u0676\u0001\u0000"+ + "\u0000\u0000\u0675\u0673\u0001\u0000\u0000\u0000\u0676\u0677\u0005m\u0000"+ + "\u0000\u0677\u0125\u0001\u0000\u0000\u0000\u0678\u0679\u0005i\u0000\u0000"+ + "\u0679\u067b\u0005w\u0000\u0000\u067a\u0678\u0001\u0000\u0000\u0000\u067a"+ + "\u067b\u0001\u0000\u0000\u0000\u067b\u067c\u0001\u0000\u0000\u0000\u067c"+ + "\u067d\u0003\u00c4b\u0000\u067d\u067e\u0005t\u0000\u0000\u067e\u067f\u0005"+ + "j\u0000\u0000\u067f\u0680\u0005b\u0000\u0000\u0680\u0681\u0005k\u0000"+ + "\u0000\u0681\u0127\u0001\u0000\u0000\u0000\u0682\u0683\u0003\u012a\u0095"+ + "\u0000\u0683\u0685\u0005s\u0000\u0000\u0684\u0686\u0003\u0100\u0080\u0000"+ + "\u0685\u0684\u0001\u0000\u0000\u0000\u0685\u0686\u0001\u0000\u0000\u0000"+ + "\u0686\u0129\u0001\u0000\u0000\u0000\u0687\u0688\u0005T\u0000\u0000\u0688"+ + "\u068b\u0003\u012c\u0096\u0000\u0689\u068b\u0005P\u0000\u0000\u068a\u0687"+ + "\u0001\u0000\u0000\u0000\u068a\u0689\u0001\u0000\u0000\u0000\u068b\u012b"+ + "\u0001\u0000\u0000\u0000\u068c\u068f\u0003\u00d2i\u0000\u068d\u068f\u0005"+ + "h\u0000\u0000\u068e\u068c\u0001\u0000\u0000\u0000\u068e\u068d\u0001\u0000"+ + "\u0000\u0000\u068f\u0697\u0001\u0000\u0000\u0000\u0690\u0693\u0005q\u0000"+ + "\u0000\u0691\u0694\u0003\u00d2i\u0000\u0692\u0694\u0005h\u0000\u0000\u0693"+ + "\u0691\u0001\u0000\u0000\u0000\u0693\u0692\u0001\u0000\u0000\u0000\u0694"+ + "\u0696\u0001\u0000\u0000\u0000\u0695\u0690\u0001\u0000\u0000\u0000\u0696"+ + "\u0699\u0001\u0000\u0000\u0000\u0697\u0695\u0001\u0000\u0000\u0000\u0697"+ + "\u0698\u0001\u0000\u0000\u0000\u0698\u012d\u0001\u0000\u0000\u0000\u0699"+ + "\u0697\u0001\u0000\u0000\u0000\u069a\u069b\u0005S\u0000\u0000\u069b\u069f"+ + "\u0005l\u0000\u0000\u069c\u069e\u0003\u0130\u0098\u0000\u069d\u069c\u0001"+ + "\u0000\u0000\u0000\u069e\u06a1\u0001\u0000\u0000\u0000\u069f\u069d\u0001"+ + "\u0000\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u06a2\u0001"+ + "\u0000\u0000\u0000\u06a1\u069f\u0001\u0000\u0000\u0000\u06a2\u06a3\u0005"+ + "m\u0000\u0000\u06a3\u012f\u0001\u0000\u0000\u0000\u06a4\u06a5\u0003\u0132"+ + "\u0099\u0000\u06a5\u06a7\u0005s\u0000\u0000\u06a6\u06a8\u0003\u0100\u0080"+ + "\u0000\u06a7\u06a6\u0001\u0000\u0000\u0000\u06a7\u06a8\u0001\u0000\u0000"+ + "\u0000\u06a8\u0131\u0001\u0000\u0000\u0000\u06a9\u06ac\u0005T\u0000\u0000"+ + "\u06aa\u06ad\u0003\u0106\u0083\u0000\u06ab\u06ad\u0003\u0134\u009a\u0000"+ + "\u06ac\u06aa\u0001\u0000\u0000\u0000\u06ac\u06ab\u0001\u0000\u0000\u0000"+ + "\u06ad\u06b0\u0001\u0000\u0000\u0000\u06ae\u06b0\u0005P\u0000\u0000\u06af"+ + "\u06a9\u0001\u0000\u0000\u0000\u06af\u06ae\u0001\u0000\u0000\u0000\u06b0"+ + "\u0133\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003\u00f6{\u0000\u06b2\u06b3"+ + "\u0005p\u0000\u0000\u06b3\u06b8\u0001\u0000\u0000\u0000\u06b4\u06b5\u0003"+ + "\u00f4z\u0000\u06b5\u06b6\u0005w\u0000\u0000\u06b6\u06b8\u0001\u0000\u0000"+ + "\u0000\u06b7\u06b1\u0001\u0000\u0000\u0000\u06b7\u06b4\u0001\u0000\u0000"+ + "\u0000\u06b7\u06b8\u0001\u0000\u0000\u0000\u06b8\u06b9\u0001\u0000\u0000"+ + "\u0000\u06b9\u06ba\u0003\u00b4Z\u0000\u06ba\u0135\u0001\u0000\u0000\u0000"+ + "\u06bb\u06c3\u0005d\u0000\u0000\u06bc\u06be\u0003\u00b4Z\u0000\u06bd\u06bc"+ + "\u0001\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be\u06c4"+ + "\u0001\u0000\u0000\u0000\u06bf\u06c4\u0003\u0138\u009c\u0000\u06c0\u06c2"+ + "\u0003\u00e8t\u0000\u06c1\u06c0\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001"+ + "\u0000\u0000\u0000\u06c2\u06c4\u0001\u0000\u0000\u0000\u06c3\u06bd\u0001"+ + "\u0000\u0000\u0000\u06c3\u06bf\u0001\u0000\u0000\u0000\u06c3\u06c1\u0001"+ + "\u0000\u0000\u0000\u06c4\u06c5\u0001\u0000\u0000\u0000\u06c5\u06c6\u0003"+ + "\u00fe\u007f\u0000\u06c6\u0137\u0001\u0000\u0000\u0000\u06c7\u06c9\u0003"+ + "\u0102\u0081\u0000\u06c8\u06c7\u0001\u0000\u0000\u0000\u06c8\u06c9\u0001"+ + "\u0000\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cc\u0003"+ + "\u017e\u00bf\u0000\u06cb\u06cd\u0003\u00b4Z\u0000\u06cc\u06cb\u0001\u0000"+ + "\u0000\u0000\u06cc\u06cd\u0001\u0000\u0000\u0000\u06cd\u06ce\u0001\u0000"+ + "\u0000\u0000\u06ce\u06d0\u0003\u017e\u00bf\u0000\u06cf\u06d1\u0003\u0102"+ + "\u0081\u0000\u06d0\u06cf\u0001\u0000\u0000\u0000\u06d0\u06d1\u0001\u0000"+ + "\u0000\u0000\u06d1\u0139\u0001\u0000\u0000\u0000\u06d2\u06d3\u0005V\u0000"+ + "\u0000\u06d3\u06d4\u0003\u00b4Z\u0000\u06d4\u013b\u0001\u0000\u0000\u0000"+ + "\u06d5\u06d8\u0003\u0160\u00b0\u0000\u06d6\u06d8\u0005i\u0000\u0000\u06d7"+ + "\u06d5\u0001\u0000\u0000\u0000\u06d7\u06d6\u0001\u0000\u0000\u0000\u06d8"+ + "\u013d\u0001\u0000\u0000\u0000\u06d9\u06da\u0005n\u0000\u0000\u06da\u06db"+ + "\u0003\u0140\u00a0\u0000\u06db\u06dc\u0005o\u0000\u0000\u06dc\u06dd\u0003"+ + "\u0142\u00a1\u0000\u06dd\u013f\u0001\u0000\u0000\u0000\u06de\u06df\u0003"+ + "\u00b4Z\u0000\u06df\u0141\u0001\u0000\u0000\u0000\u06e0\u06e1\u0003\u00d2"+ + "i\u0000\u06e1\u0143\u0001\u0000\u0000\u0000\u06e2\u06e3\u0005\u008b\u0000"+ + "\u0000\u06e3\u06e4\u0003\u00d2i\u0000\u06e4\u0145\u0001\u0000\u0000\u0000"+ + "\u06e5\u06e6\u0005n\u0000\u0000\u06e6\u06e7\u0005o\u0000\u0000\u06e7\u06e8"+ + "\u0003\u0142\u00a1\u0000\u06e8\u0147\u0001\u0000\u0000\u0000\u06e9\u06ea"+ + "\u0005W\u0000\u0000\u06ea\u06eb\u0005n\u0000\u0000\u06eb\u06ec\u0003\u00d2"+ + "i\u0000\u06ec\u06ed\u0005o\u0000\u0000\u06ed\u06ee\u0003\u0142\u00a1\u0000"+ + "\u06ee\u0149\u0001\u0000\u0000\u0000\u06ef\u06f5\u0005Y\u0000\u0000\u06f0"+ + "\u06f1\u0005Y\u0000\u0000\u06f1\u06f5\u0005\u008d\u0000\u0000\u06f2\u06f3"+ + "\u0005\u008d\u0000\u0000\u06f3\u06f5\u0005Y\u0000\u0000\u06f4\u06ef\u0001"+ + "\u0000\u0000\u0000\u06f4\u06f0\u0001\u0000\u0000\u0000\u06f4\u06f2\u0001"+ + "\u0000\u0000\u0000\u06f5\u06f6\u0001\u0000\u0000\u0000\u06f6\u06f7\u0003"+ + "\u0142\u00a1\u0000\u06f7\u014b\u0001\u0000\u0000\u0000\u06f8\u06f9\u0005"+ + "Q\u0000\u0000\u06f9\u06fa\u0003\u014e\u00a7\u0000\u06fa\u014d\u0001\u0000"+ + "\u0000\u0000\u06fb\u06fc\u0003\u0152\u00a9\u0000\u06fc\u06fd\u0003\u0150"+ + "\u00a8\u0000\u06fd\u0700\u0001\u0000\u0000\u0000\u06fe\u0700\u0003\u0152"+ + "\u00a9\u0000\u06ff\u06fb\u0001\u0000\u0000\u0000\u06ff\u06fe\u0001\u0000"+ + "\u0000\u0000\u0700\u014f\u0001\u0000\u0000\u0000\u0701\u0704\u0003\u0152"+ + "\u00a9\u0000\u0702\u0704\u0003\u00d2i\u0000\u0703\u0701\u0001\u0000\u0000"+ + "\u0000\u0703\u0702\u0001\u0000\u0000\u0000\u0704\u0151\u0001\u0000\u0000"+ + "\u0000\u0705\u0711\u0005j\u0000\u0000\u0706\u070b\u0003\u00acV\u0000\u0707"+ + "\u0708\u0005q\u0000\u0000\u0708\u070a\u0003\u00acV\u0000\u0709\u0707\u0001"+ + "\u0000\u0000\u0000\u070a\u070d\u0001\u0000\u0000\u0000\u070b\u0709\u0001"+ + "\u0000\u0000\u0000\u070b\u070c\u0001\u0000\u0000\u0000\u070c\u070f\u0001"+ + "\u0000\u0000\u0000\u070d\u070b\u0001\u0000\u0000\u0000\u070e\u0710\u0005"+ + "q\u0000\u0000\u070f\u070e\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000"+ + "\u0000\u0000\u0710\u0712\u0001\u0000\u0000\u0000\u0711\u0706\u0001\u0000"+ + "\u0000\u0000\u0711\u0712\u0001\u0000\u0000\u0000\u0712\u0713\u0001\u0000"+ + "\u0000\u0000\u0713\u0714\u0005k\u0000\u0000\u0714\u0153\u0001\u0000\u0000"+ + "\u0000\u0715\u0716\u0003\u0156\u00ab\u0000\u0716\u0717\u0005j\u0000\u0000"+ + "\u0717\u0719\u0003\u00b4Z\u0000\u0718\u071a\u0005q\u0000\u0000\u0719\u0718"+ + "\u0001\u0000\u0000\u0000\u0719\u071a\u0001\u0000\u0000\u0000\u071a\u071b"+ + "\u0001\u0000\u0000\u0000\u071b\u071c\u0005k\u0000\u0000\u071c\u0155\u0001"+ + "\u0000\u0000\u0000\u071d\u0723\u0003\u00d4j\u0000\u071e\u071f\u0005j\u0000"+ + "\u0000\u071f\u0720\u0003\u0156\u00ab\u0000\u0720\u0721\u0005k\u0000\u0000"+ + "\u0721\u0723\u0001\u0000\u0000\u0000\u0722\u071d\u0001\u0000\u0000\u0000"+ + "\u0722\u071e\u0001\u0000\u0000\u0000\u0723\u0157\u0001\u0000\u0000\u0000"+ + "\u0724\u072b\u0003\u015a\u00ad\u0000\u0725\u072b\u0003\u015e\u00af\u0000"+ + "\u0726\u0727\u0005j\u0000\u0000\u0727\u0728\u0003\u00b4Z\u0000\u0728\u0729"+ + "\u0005k\u0000\u0000\u0729\u072b\u0001\u0000\u0000\u0000\u072a\u0724\u0001"+ + "\u0000\u0000\u0000\u072a\u0725\u0001\u0000\u0000\u0000\u072a\u0726\u0001"+ + "\u0000\u0000\u0000\u072b\u0159\u0001\u0000\u0000\u0000\u072c\u0730\u0003"+ + "\u00c2a\u0000\u072d\u0730\u0003\u0162\u00b1\u0000\u072e\u0730\u0003\u00c6"+ + "c\u0000\u072f\u072c\u0001\u0000\u0000\u0000\u072f\u072d\u0001\u0000\u0000"+ + "\u0000\u072f\u072e\u0001\u0000\u0000\u0000\u0730\u015b\u0001\u0000\u0000"+ + "\u0000\u0731\u0732\u0007\u0012\u0000\u0000\u0732\u015d\u0001\u0000\u0000"+ + "\u0000\u0733\u0734\u0005i\u0000\u0000\u0734\u015f\u0001\u0000\u0000\u0000"+ + "\u0735\u0736\u0005i\u0000\u0000\u0736\u0737\u0005t\u0000\u0000\u0737\u0738"+ + "\u0005i\u0000\u0000\u0738\u0161\u0001\u0000\u0000\u0000\u0739\u073a\u0003"+ + "\u00dam\u0000\u073a\u073b\u0003\u0164\u00b2\u0000\u073b\u0163\u0001\u0000"+ + "\u0000\u0000\u073c\u0741\u0005l\u0000\u0000\u073d\u073f\u0003\u0166\u00b3"+ + "\u0000\u073e\u0740\u0005q\u0000\u0000\u073f\u073e\u0001\u0000\u0000\u0000"+ + "\u073f\u0740\u0001\u0000\u0000\u0000\u0740\u0742\u0001\u0000\u0000\u0000"+ + "\u0741\u073d\u0001\u0000\u0000\u0000\u0741\u0742\u0001\u0000\u0000\u0000"+ + "\u0742\u0743\u0001\u0000\u0000\u0000\u0743\u0744\u0005m\u0000\u0000\u0744"+ + "\u0165\u0001\u0000\u0000\u0000\u0745\u074a\u0003\u0168\u00b4\u0000\u0746"+ + "\u0747\u0005q\u0000\u0000\u0747\u0749\u0003\u0168\u00b4\u0000\u0748\u0746"+ + "\u0001\u0000\u0000\u0000\u0749\u074c\u0001\u0000\u0000\u0000\u074a\u0748"+ + "\u0001\u0000\u0000\u0000\u074a\u074b\u0001\u0000\u0000\u0000\u074b\u0167"+ + "\u0001\u0000\u0000\u0000\u074c\u074a\u0001\u0000\u0000\u0000\u074d\u074e"+ + "\u0003\u016a\u00b5\u0000\u074e\u074f\u0005s\u0000\u0000\u074f\u0751\u0001"+ + "\u0000\u0000\u0000\u0750\u074d\u0001\u0000\u0000\u0000\u0750\u0751\u0001"+ + "\u0000\u0000\u0000\u0751\u0752\u0001\u0000\u0000\u0000\u0752\u0753\u0003"+ + "\u016c\u00b6\u0000\u0753\u0169\u0001\u0000\u0000\u0000\u0754\u0757\u0003"+ + "\u00b4Z\u0000\u0755\u0757\u0003\u0164\u00b2\u0000\u0756\u0754\u0001\u0000"+ + "\u0000\u0000\u0756\u0755\u0001\u0000\u0000\u0000\u0757\u016b\u0001\u0000"+ + "\u0000\u0000\u0758\u075b\u0003\u00b4Z\u0000\u0759\u075b\u0003\u0164\u00b2"+ + "\u0000\u075a\u0758\u0001\u0000\u0000\u0000\u075a\u0759\u0001\u0000\u0000"+ + "\u0000\u075b\u016d\u0001\u0000\u0000\u0000\u075c\u075d\u0005X\u0000\u0000"+ + "\u075d\u0763\u0005l\u0000\u0000\u075e\u075f\u0003`0\u0000\u075f\u0760"+ + "\u0003\u017e\u00bf\u0000\u0760\u0762\u0001\u0000\u0000\u0000\u0761\u075e"+ + "\u0001\u0000\u0000\u0000\u0762\u0765\u0001\u0000\u0000\u0000\u0763\u0761"+ + "\u0001\u0000\u0000\u0000\u0763\u0764\u0001\u0000\u0000\u0000\u0764\u0766"+ + "\u0001\u0000\u0000\u0000\u0765\u0763\u0001\u0000\u0000\u0000\u0766\u0767"+ + "\u0005m\u0000\u0000\u0767\u016f\u0001\u0000\u0000\u0000\u0768\u0769\u0007"+ + "\u0013\u0000\u0000\u0769\u0171\u0001\u0000\u0000\u0000\u076a\u076c\u0005"+ + "\u008b\u0000\u0000\u076b\u076a\u0001\u0000\u0000\u0000\u076b\u076c\u0001"+ + "\u0000\u0000\u0000\u076c\u076d\u0001\u0000\u0000\u0000\u076d\u076e\u0003"+ + "\u013c\u009e\u0000\u076e\u0173\u0001\u0000\u0000\u0000\u076f\u0770\u0005"+ + "n\u0000\u0000\u0770\u0771\u0003\u00b4Z\u0000\u0771\u0772\u0005o\u0000"+ + "\u0000\u0772\u0175\u0001\u0000\u0000\u0000\u0773\u0774\u0005t\u0000\u0000"+ + "\u0774\u0775\u0005j\u0000\u0000\u0775\u0776\u0003\u00d2i\u0000\u0776\u0777"+ + "\u0005k\u0000\u0000\u0777\u0177\u0001\u0000\u0000\u0000\u0778\u0787\u0005"+ + "j\u0000\u0000\u0779\u0780\u0003\u00f6{\u0000\u077a\u077d\u0003\u0156\u00ab"+ + "\u0000\u077b\u077c\u0005q\u0000\u0000\u077c\u077e\u0003\u00f6{\u0000\u077d"+ + "\u077b\u0001\u0000\u0000\u0000\u077d\u077e\u0001\u0000\u0000\u0000\u077e"+ + "\u0780\u0001\u0000\u0000\u0000\u077f\u0779\u0001\u0000\u0000\u0000\u077f"+ + "\u077a\u0001\u0000\u0000\u0000\u0780\u0782\u0001\u0000\u0000\u0000\u0781"+ + "\u0783\u0005x\u0000\u0000\u0782\u0781\u0001\u0000\u0000\u0000\u0782\u0783"+ + "\u0001\u0000\u0000\u0000\u0783\u0785\u0001\u0000\u0000\u0000\u0784\u0786"+ + "\u0005q\u0000\u0000\u0785\u0784\u0001\u0000\u0000\u0000\u0785\u0786\u0001"+ + "\u0000\u0000\u0000\u0786\u0788\u0001\u0000\u0000\u0000\u0787\u077f\u0001"+ + "\u0000\u0000\u0000\u0787\u0788\u0001\u0000\u0000\u0000\u0788\u0789\u0001"+ + "\u0000\u0000\u0000\u0789\u078a\u0005k\u0000\u0000\u078a\u0179\u0001\u0000"+ + "\u0000\u0000\u078b\u078c\u0003\u0156\u00ab\u0000\u078c\u078d\u0005t\u0000"+ + "\u0000\u078d\u078e\u0005i\u0000\u0000\u078e\u017b\u0001\u0000\u0000\u0000"+ + "\u078f\u0790\u0003\u00d2i\u0000\u0790\u017d\u0001\u0000\u0000\u0000\u0791"+ + "\u0796\u0005r\u0000\u0000\u0792\u0796\u0005\u0000\u0000\u0001\u0793\u0796"+ + "\u0005\u00a3\u0000\u0000\u0794\u0796\u0004\u00bf\u0013\u0000\u0795\u0791"+ + "\u0001\u0000\u0000\u0000\u0795\u0792\u0001\u0000\u0000\u0000\u0795\u0793"+ + "\u0001\u0000\u0000\u0000\u0795\u0794\u0001\u0000\u0000\u0000\u0796\u017f"+ + "\u0001\u0000\u0000\u0000\u00ca\u018e\u0193\u019a\u01a4\u01aa\u01b0\u01ba"+ "\u01c4\u01d2\u01d6\u01df\u01eb\u01ef\u01f5\u01fe\u0208\u0219\u0227\u022b"+ "\u0232\u023a\u0243\u0263\u026b\u0283\u0296\u02a5\u02b3\u02bc\u02ca\u02d3"+ - "\u02df\u02e5\u02f4\u02fa\u02fd\u030a\u0313\u0318\u031d\u0320\u0325\u032c"+ - "\u0332\u033b\u0341\u034e\u0351\u0355\u0359\u0361\u0369\u036e\u0376\u0378"+ - "\u037d\u0384\u038c\u038f\u0395\u039a\u039c\u039f\u03a6\u03ab\u03be\u03c6"+ - "\u03ca\u03cd\u03d3\u03d7\u03da\u03e4\u03eb\u03f2\u03fe\u0404\u040b\u0410"+ - "\u0416\u0422\u0428\u042c\u0434\u0438\u043e\u0441\u0447\u044c\u0465\u0488"+ - "\u048a\u04a1\u04a9\u04b4\u04bb\u04c2\u04cc\u04de\u04f4\u04f6\u04fe\u0502"+ - "\u0506\u0509\u0512\u0518\u0522\u052a\u0530\u0539\u0544\u054f\u0553\u0555"+ - "\u0560\u0569\u056d\u0570\u0577\u0582\u058c\u0592\u0594\u059e\u05a8\u05ac"+ - "\u05b0\u05b4\u05bb\u05c3\u05ce\u05d2\u05d6\u05e2\u05e6\u05ea\u05ef\u05f2"+ - "\u05f5\u05fc\u0603\u0617\u061b\u061f\u0623\u0633\u0639\u063b\u063f\u0643"+ - "\u0646\u064a\u064c\u0652\u065a\u065f\u066a\u0670\u0677\u0682\u0687\u068b"+ - "\u0690\u0694\u069c\u06a4\u06a9\u06ac\u06b4\u06ba\u06be\u06c0\u06c5\u06c9"+ - "\u06cd\u06d4\u06f1\u06fc\u0700\u0708\u070c\u070e\u0716\u071f\u0727\u072c"+ - "\u073c\u073e\u0747\u074d\u0753\u0757\u0760\u0768\u077a\u077c\u077f\u0782"+ - "\u0784\u0792"; + "\u02df\u02e5\u02f4\u02fa\u02fd\u0300\u030d\u0316\u031b\u0320\u0323\u0328"+ + "\u032f\u0335\u033e\u0344\u0351\u0354\u0358\u035c\u0364\u036c\u0371\u0379"+ + "\u037b\u0380\u0387\u038f\u0392\u0398\u039d\u039f\u03a2\u03a9\u03ae\u03c1"+ + "\u03c9\u03cd\u03d0\u03d6\u03da\u03dd\u03e7\u03ee\u03f5\u0401\u0407\u040e"+ + "\u0413\u0419\u0425\u042b\u042f\u0437\u043b\u0441\u0444\u044a\u044f\u0468"+ + "\u048b\u048d\u04a4\u04ac\u04b7\u04be\u04c5\u04cf\u04e1\u04f7\u04f9\u0501"+ + "\u0505\u0509\u050c\u0515\u051b\u0525\u052d\u0533\u053c\u0547\u0552\u0556"+ + "\u0558\u0563\u056c\u0570\u0573\u057a\u0585\u058f\u0595\u0597\u05a1\u05ab"+ + "\u05af\u05b3\u05b7\u05be\u05c6\u05d1\u05d5\u05d9\u05e5\u05e9\u05ed\u05f2"+ + "\u05f5\u05f8\u05ff\u0606\u061a\u061e\u0622\u0626\u0636\u063c\u063e\u0642"+ + "\u0646\u0649\u064d\u064f\u0655\u065d\u0662\u066d\u0673\u067a\u0685\u068a"+ + "\u068e\u0693\u0697\u069f\u06a7\u06ac\u06af\u06b7\u06bd\u06c1\u06c3\u06c8"+ + "\u06cc\u06d0\u06d7\u06f4\u06ff\u0703\u070b\u070f\u0711\u0719\u0722\u072a"+ + "\u072f\u073f\u0741\u074a\u0750\u0756\u075a\u0763\u076b\u077d\u077f\u0782"+ + "\u0785\u0787\u0795"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 4b8b4aa60..628d681de 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -301,16 +301,16 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link #visitChildren} on {@code ctx}.

*/ override def visitFieldDecl(ctx: FieldDeclContext): PStructClause = { - if (ctx.embeddedField() != null) { + val ghost = has(ctx.GHOST()) + val actualDecl = if (ctx.embeddedField() != null) { val et = visitNode[PEmbeddedType](ctx.embeddedField()) PEmbeddedDecl(et, PIdnDef(et.name).at(et)) } else { - val ghost = has(ctx.GHOST()) val goIdnDefList(ids) = visitIdentifierList(ctx.identifierList()) val t = visitNode[PType](ctx.type_()) - val fieldDecls = PFieldDecls(ids map (id => PFieldDecl(id, t.copy).at(id))) - if (ghost) PExplicitGhostStructClause(fieldDecls).at(ctx) else fieldDecls + PFieldDecls(ids map (id => PFieldDecl(id, t.copy).at(id))) } + if (ghost) PExplicitGhostStructClause(actualDecl).at(ctx) else actualDecl } /** diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala index c4dc0f80c..c8d6ccd55 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -99,14 +99,15 @@ object Type { case object Send extends ChannelModus("chan<-") } - trait StructClauseT extends Type { + trait StructClauseT { def typ: Type def isGhost: Boolean + override lazy val toString: String = typ.toString } - case class StructFieldT(typ: Type, isGhost: Boolean) extends PrettyType(s"$typ") with StructClauseT + case class StructFieldT(typ: Type, isGhost: Boolean) extends StructClauseT - case class StructEmbeddedT(typ: Type, isGhost: Boolean) extends PrettyType(s"$typ") with StructClauseT + case class StructEmbeddedT(typ: Type, isGhost: Boolean) extends StructClauseT case class StructT(clauses: ListMap[String, StructClauseT], decl: PStructType, context: ExternalTypeInfo) extends ContextualType { lazy val fieldsAndEmbedded: ListMap[String, Type] = clauses.map(extractTyp) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index da79d8fc0..73479897c 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -82,7 +82,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case t: StructT => structMemberSet(t).collect { case (_, f: Field) => f.ghost - case (_, e: Embbed) => isStructTypeWithGhostFields(e.context.typ(e.decl.typ)) + case (_, e: Embbed) => e.ghost || isStructTypeWithGhostFields(e.context.typ(e.decl.typ)) }.exists(identity) case _ => false diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala index 308d66ff6..df187e262 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala @@ -12,6 +12,7 @@ import viper.gobra.frontend.info.base.Type import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.ast.frontend.{AstPattern => ap} import viper.gobra.frontend.info.implementation.property.{AssignMode, StrictAssignMode} +import viper.gobra.frontend.info.implementation.resolution.MemberPath import viper.gobra.util.Violation trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => @@ -140,8 +141,12 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => case e: PDot => resolve(e) match { case Some(s: ap.FieldSelection) => val isGhostField = ghostIdClassification(s.id) - (underlyingType(typ(s.base)), isGhostField) match { - case (_, true) => isGhost // ghost fields are always ghost memory + val isGhostEmbedding = s.path.exists { + case MemberPath.Next(decl) => decl.ghost + case _ => false + } + (underlyingType(typ(s.base)), isGhostField || isGhostEmbedding) match { + case (_, true) => isGhost // ghost fields and ghost embeddings are always ghost memory case (tb: Type.PointerT, _) => ghost(tb.isInstanceOf[Type.GhostPointerT]) // (implicitly) dereferencing a field of a ghost pointer leads to a ghost heap location case _ => ghostLocationTyping(s.base) // assignee is on the stack, recurse to find out if it's a ghost or actual variable } diff --git a/src/test/resources/regressions/features/ghost_field/ghost-embedding-fail01.gobra b/src/test/resources/regressions/features/ghost_field/ghost-embedding-fail01.gobra new file mode 100644 index 000000000..7575e2751 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_field/ghost-embedding-fail01.gobra @@ -0,0 +1,56 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// tests that Gobra correctly treats ghost embeddings and embeddings with ghost fields + +package GhostEmbeddingFail01 + +type Embedded struct { + actualEmbeddedField int + ghost ghostEmbeddedField int +} + +type TestWithActualEmbedding struct { + Embedded + actualField2 int + ghost ghostField2 int +} + +type TestWithGhostEmbedding struct { + ghost Embedded + actualField2 int + ghost ghostField2 int +} + +ghost +decreases +preserves acc(s) +func foo(s *TestWithActualEmbedding) { + // writing to an actual field is forbidden in ghost code but writing to fields treated as ghost is fine + + //:: ExpectedOutput(type_error) + s.actualEmbeddedField = 42 + + s.ghostEmbeddedField = 42 + + //:: ExpectedOutput(type_error) + s.actualField2 = 42 + + s.ghostField2 = 42 +} + +ghost +decreases +preserves acc(s) +func foo2(s *TestWithGhostEmbedding) { + // writing to an actual field is forbidden in ghost code but writing to fields treated as ghost is fine + + s.actualEmbeddedField = 42 // this is fine as it's a ghost embedding + + s.ghostEmbeddedField = 42 + + //:: ExpectedOutput(type_error) + s.actualField2 = 42 + + s.ghostField2 = 42 +} diff --git a/src/test/resources/regressions/features/ghost_field/ghost-embedding-simple01.gobra b/src/test/resources/regressions/features/ghost_field/ghost-embedding-simple01.gobra new file mode 100644 index 000000000..1ac3a78e2 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_field/ghost-embedding-simple01.gobra @@ -0,0 +1,49 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// tests that Gobra correctly treats ghost embeddings and embeddings with ghost fields + +package GhostEmbeddingSimple01 + +type Embedded struct { + actualEmbeddedField int + ghost ghostEmbeddedField int +} + +type TestWithActualEmbedding struct { + Embedded + actualField2 int + ghost ghostField2 int +} + +type TestWithGhostEmbedding struct { + ghost Embedded + actualField2 int + ghost ghostField2 int +} + +ghost +decreases +preserves acc(s) +func foo(s *TestWithActualEmbedding) { + // writing to an actual field is forbidden in ghost code but writing to fields treated as ghost is fine + s.ghostEmbeddedField = 42 + s.ghostField2 = 42 + + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} + +ghost +decreases +preserves acc(s) +func foo2(s *TestWithGhostEmbedding) { + // writing to an actual field is forbidden in ghost code but writing to fields treated as ghost is fine + + s.actualEmbeddedField = 42 // this is fine as it's a ghost embedding + s.ghostEmbeddedField = 42 + s.ghostField2 = 42 + + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} From 76d0cc2f5d01875f7621dc4289911f338915baf8 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 21 May 2024 14:03:13 +0200 Subject: [PATCH 284/296] slightly improves parser rules --- src/main/antlr4/GobraParser.g4 | 6 +- .../viper/gobra/frontend/GobraParser.java | 4109 ++++++++--------- 2 files changed, 2051 insertions(+), 2064 deletions(-) diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 2a082113a..568d55541 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -158,9 +158,9 @@ ghostSliceType: GHOST L_BRACKET R_BRACKET elementType; ghostPointerType: GPOINTER L_BRACKET elementType R_BRACKET; // copy of `fieldDecl` from GoParser.g4 extended with an optional `GHOST` modifier for fields and embedded fields: -fieldDecl: ( - GHOST? identifierList type_ - | GHOST? embeddedField +fieldDecl: GHOST? ( + identifierList type_ + | embeddedField ) tag = string_?; sqType: (kind=(SEQ | SET | MSET | OPT) L_BRACKET type_ R_BRACKET) diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 1adecb560..477e1d11c 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -3288,10 +3288,10 @@ public Type_Context type_() { public EmbeddedFieldContext embeddedField() { return getRuleContext(EmbeddedFieldContext.class,0); } + public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public String_Context string_() { return getRuleContext(String_Context.class,0); } - public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public FieldDeclContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -3310,21 +3310,21 @@ public final FieldDeclContext fieldDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(765); + setState(756); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { - case 1: + _la = _input.LA(1); + if (_la==GHOST) { { - setState(756); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==GHOST) { - { - setState(755); - match(GHOST); - } + setState(755); + match(GHOST); } + } + setState(762); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) { + case 1: + { setState(758); identifierList(); setState(759); @@ -3333,27 +3333,17 @@ public final FieldDeclContext fieldDecl() throws RecognitionException { break; case 2: { - setState(762); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==GHOST) { - { - setState(761); - match(GHOST); - } - } - - setState(764); + setState(761); embeddedField(); } break; } - setState(768); + setState(765); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { case 1: { - setState(767); + setState(764); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -3403,7 +3393,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterRule(_localctx, 98, RULE_sqType); int _la; try { - setState(781); + setState(778); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3413,7 +3403,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(770); + setState(767); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) { @@ -3424,11 +3414,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(771); + setState(768); match(L_BRACKET); - setState(772); + setState(769); type_(); - setState(773); + setState(770); match(R_BRACKET); } } @@ -3436,15 +3426,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(775); + setState(772); ((SqTypeContext)_localctx).kind = match(DICT); - setState(776); + setState(773); match(L_BRACKET); - setState(777); + setState(774); type_(); - setState(778); + setState(775); match(R_BRACKET); - setState(779); + setState(776); type_(); } break; @@ -3514,14 +3504,14 @@ public final SpecificationContext specification() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(795); + setState(792); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,39,_ctx); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(790); + setState(787); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3529,27 +3519,27 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(783); + setState(780); specStatement(); } break; case OPAQUE: { - setState(784); + setState(781); match(OPAQUE); ((SpecificationContext)_localctx).opaque = true; } break; case PURE: { - setState(786); + setState(783); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(788); + setState(785); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3557,32 +3547,32 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(792); + setState(789); eos(); } } } - setState(797); + setState(794); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,39,_ctx); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); } - setState(800); + setState(797); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(798); + setState(795); match(PURE); ((SpecificationContext)_localctx).pure = true; } } - setState(803); + setState(800); _errHandler.sync(this); _la = _input.LA(1); if (_la==BACKEND) { { - setState(802); + setState(799); backendAnnotation(); } } @@ -3632,13 +3622,13 @@ public final BackendAnnotationEntryContext backendAnnotationEntry() throws Recog try { enterOuterAlt(_localctx, 1); { - setState(806); + setState(803); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(805); + setState(802); _la = _input.LA(1); if ( _la <= 0 || (((((_la - 106)) & ~0x3f) == 0 && ((1L << (_la - 106)) & 131L) != 0)) ) { _errHandler.recoverInline(this); @@ -3650,7 +3640,7 @@ public final BackendAnnotationEntryContext backendAnnotationEntry() throws Recog } } } - setState(808); + setState(805); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -576144092954625L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 137438953471L) != 0) ); @@ -3697,21 +3687,21 @@ public final ListOfValuesContext listOfValues() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(810); + setState(807); backendAnnotationEntry(); - setState(815); + setState(812); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(811); + setState(808); match(COMMA); - setState(812); + setState(809); backendAnnotationEntry(); } } - setState(817); + setState(814); _errHandler.sync(this); _la = _input.LA(1); } @@ -3756,21 +3746,21 @@ public final SingleBackendAnnotationContext singleBackendAnnotation() throws Rec try { enterOuterAlt(_localctx, 1); { - setState(818); + setState(815); backendAnnotationEntry(); - setState(819); + setState(816); match(L_PAREN); - setState(821); + setState(818); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -576144092954625L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 137438953471L) != 0)) { { - setState(820); + setState(817); listOfValues(); } } - setState(823); + setState(820); match(R_PAREN); } } @@ -3815,21 +3805,21 @@ public final BackendAnnotationListContext backendAnnotationList() throws Recogni try { enterOuterAlt(_localctx, 1); { - setState(825); + setState(822); singleBackendAnnotation(); - setState(830); + setState(827); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(826); + setState(823); match(COMMA); - setState(827); + setState(824); singleBackendAnnotation(); } } - setState(832); + setState(829); _errHandler.sync(this); _la = _input.LA(1); } @@ -3874,23 +3864,23 @@ public final BackendAnnotationContext backendAnnotation() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(833); + setState(830); match(BACKEND); - setState(834); + setState(831); match(L_BRACKET); - setState(836); + setState(833); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(835); + setState(832); backendAnnotationList(); } break; } - setState(838); + setState(835); match(R_BRACKET); - setState(839); + setState(836); eos(); } } @@ -3933,42 +3923,42 @@ public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); enterRule(_localctx, 112, RULE_specStatement); try { - setState(849); + setState(846); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(841); + setState(838); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(842); + setState(839); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(843); + setState(840); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(844); + setState(841); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(845); + setState(842); ((SpecStatementContext)_localctx).kind = match(POST); - setState(846); + setState(843); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(847); + setState(844); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(848); + setState(845); terminationMeasure(); } break; @@ -4013,24 +4003,24 @@ public final TerminationMeasureContext terminationMeasure() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(852); + setState(849); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(851); + setState(848); expressionList(); } break; } - setState(856); + setState(853); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(854); + setState(851); match(IF); - setState(855); + setState(852); expression(0); } break; @@ -4068,9 +4058,9 @@ public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); enterRule(_localctx, 116, RULE_assertion); try { - setState(860); + setState(857); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { @@ -4079,7 +4069,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(859); + setState(856); expression(0); } break; @@ -4128,27 +4118,27 @@ public final MatchStmtContext matchStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(862); + setState(859); match(MATCH); - setState(863); + setState(860); expression(0); - setState(864); + setState(861); match(L_CURLY); - setState(868); + setState(865); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(865); + setState(862); matchStmtClause(); } } - setState(870); + setState(867); _errHandler.sync(this); _la = _input.LA(1); } - setState(871); + setState(868); match(R_CURLY); } } @@ -4189,16 +4179,16 @@ public final MatchStmtClauseContext matchStmtClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(873); + setState(870); matchCase(); - setState(874); + setState(871); match(COLON); - setState(876); + setState(873); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { case 1: { - setState(875); + setState(872); statementList(); } break; @@ -4238,22 +4228,22 @@ public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); enterRule(_localctx, 122, RULE_matchCase); try { - setState(881); + setState(878); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(878); + setState(875); match(CASE); - setState(879); + setState(876); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(880); + setState(877); match(DEFAULT); } break; @@ -4331,16 +4321,16 @@ public final MatchPatternContext matchPattern() throws RecognitionException { enterRule(_localctx, 124, RULE_matchPattern); int _la; try { - setState(896); + setState(893); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(883); + setState(880); match(QMARK); - setState(884); + setState(881); match(IDENTIFIER); } break; @@ -4348,23 +4338,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(885); + setState(882); literalType(); - setState(886); + setState(883); match(L_CURLY); - setState(891); + setState(888); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913343522074138L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(887); + setState(884); matchPatternList(); - setState(889); + setState(886); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(888); + setState(885); match(COMMA); } } @@ -4372,7 +4362,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(893); + setState(890); match(R_CURLY); } break; @@ -4380,7 +4370,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(895); + setState(892); expression(0); } break; @@ -4427,25 +4417,25 @@ public final MatchPatternListContext matchPatternList() throws RecognitionExcept int _alt; enterOuterAlt(_localctx, 1); { - setState(898); + setState(895); matchPattern(); - setState(903); + setState(900); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,57,_ctx); + _alt = getInterpreter().adaptivePredict(_input,56,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(899); + setState(896); match(COMMA); - setState(900); + setState(897); matchPattern(); } } } - setState(905); + setState(902); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,57,_ctx); + _alt = getInterpreter().adaptivePredict(_input,56,_ctx); } } } @@ -4491,33 +4481,33 @@ public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() thro try { enterOuterAlt(_localctx, 1); { - setState(906); + setState(903); match(L_CURLY); - setState(911); + setState(908); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(907); + setState(904); match(SHARE); - setState(908); + setState(905); identifierList(); - setState(909); + setState(906); eos(); } break; } - setState(914); + setState(911); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { - setState(913); + setState(910); statementList(); } break; } - setState(916); + setState(913); match(R_CURLY); } } @@ -4562,42 +4552,42 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(920); + setState(917); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { case 1: { - setState(918); + setState(915); qualifiedIdent(); } break; case 2: { - setState(919); + setState(916); match(IDENTIFIER); } break; } - setState(930); + setState(927); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { case 1: { - setState(922); + setState(919); match(L_CURLY); - setState(927); + setState(924); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(923); + setState(920); closureSpecParams(); - setState(925); + setState(922); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(924); + setState(921); match(COMMA); } } @@ -4605,7 +4595,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(929); + setState(926); match(R_CURLY); } break; @@ -4653,25 +4643,25 @@ public final ClosureSpecParamsContext closureSpecParams() throws RecognitionExce int _alt; enterOuterAlt(_localctx, 1); { - setState(932); + setState(929); closureSpecParam(); - setState(937); + setState(934); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,64,_ctx); + _alt = getInterpreter().adaptivePredict(_input,63,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(933); + setState(930); match(COMMA); - setState(934); + setState(931); closureSpecParam(); } } } - setState(939); + setState(936); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,64,_ctx); + _alt = getInterpreter().adaptivePredict(_input,63,_ctx); } } } @@ -4710,19 +4700,19 @@ public final ClosureSpecParamContext closureSpecParam() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(942); + setState(939); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { case 1: { - setState(940); + setState(937); match(IDENTIFIER); - setState(941); + setState(938); match(COLON); } break; } - setState(944); + setState(941); expression(0); } } @@ -4767,15 +4757,15 @@ public final ClosureImplProofStmtContext closureImplProofStmt() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(946); + setState(943); match(PROOF); - setState(947); + setState(944); expression(0); - setState(948); + setState(945); match(IMPL); - setState(949); + setState(946); closureSpecInstance(); - setState(950); + setState(947); block(); } } @@ -4837,52 +4827,52 @@ public final ImplementationProofContext implementationProof() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(952); + setState(949); type_(); - setState(953); + setState(950); match(IMPL); - setState(954); + setState(951); type_(); - setState(973); + setState(970); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(955); + setState(952); match(L_CURLY); - setState(961); + setState(958); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(956); + setState(953); implementationProofPredicateAlias(); - setState(957); + setState(954); eos(); } } - setState(963); + setState(960); _errHandler.sync(this); _la = _input.LA(1); } - setState(969); + setState(966); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(964); + setState(961); methodImplementationProof(); - setState(965); + setState(962); eos(); } } - setState(971); + setState(968); _errHandler.sync(this); _la = _input.LA(1); } - setState(972); + setState(969); match(R_CURLY); } break; @@ -4931,28 +4921,28 @@ public final MethodImplementationProofContext methodImplementationProof() throws try { enterOuterAlt(_localctx, 1); { - setState(976); + setState(973); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(975); + setState(972); match(PURE); } } - setState(978); + setState(975); nonLocalReceiver(); - setState(979); + setState(976); match(IDENTIFIER); - setState(980); + setState(977); signature(); - setState(982); + setState(979); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: { - setState(981); + setState(978); block(); } break; @@ -4997,31 +4987,31 @@ public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(984); + setState(981); match(L_PAREN); - setState(986); + setState(983); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(985); + setState(982); match(IDENTIFIER); } break; } - setState(989); + setState(986); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(988); + setState(985); match(STAR); } } - setState(991); + setState(988); typeName(); - setState(992); + setState(989); match(R_PAREN); } } @@ -5061,24 +5051,24 @@ public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); enterRule(_localctx, 144, RULE_selection); try { - setState(999); + setState(996); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(994); + setState(991); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(995); + setState(992); type_(); - setState(996); + setState(993); match(DOT); - setState(997); + setState(994); match(IDENTIFIER); } break; @@ -5123,24 +5113,24 @@ public final ImplementationProofPredicateAliasContext implementationProofPredica try { enterOuterAlt(_localctx, 1); { - setState(1001); + setState(998); match(PRED); - setState(1002); + setState(999); match(IDENTIFIER); - setState(1003); + setState(1000); match(DECLARE_ASSIGN); - setState(1006); + setState(1003); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: { - setState(1004); + setState(1001); selection(); } break; case 2: { - setState(1005); + setState(1002); operandName(); } break; @@ -5188,25 +5178,25 @@ public final MakeContext make() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1008); + setState(1005); match(MAKE); - setState(1009); + setState(1006); match(L_PAREN); - setState(1010); + setState(1007); type_(); - setState(1013); + setState(1010); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1011); + setState(1008); match(COMMA); - setState(1012); + setState(1009); expressionList(); } } - setState(1015); + setState(1012); match(R_PAREN); } } @@ -5246,13 +5236,13 @@ public final New_Context new_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1017); + setState(1014); match(NEW); - setState(1018); + setState(1015); match(L_PAREN); - setState(1019); + setState(1016); type_(); - setState(1020); + setState(1017); match(R_PAREN); } } @@ -5296,20 +5286,20 @@ public final SpecMemberContext specMember() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1022); + setState(1019); ((SpecMemberContext)_localctx).specification = specification(); - setState(1025); + setState(1022); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { case 1: { - setState(1023); + setState(1020); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; case 2: { - setState(1024); + setState(1021); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure, ((SpecMemberContext)_localctx).specification.opaque); } break; @@ -5361,19 +5351,19 @@ public final FunctionDeclContext functionDecl(boolean trusted,boolean pure,boole try { enterOuterAlt(_localctx, 1); { - setState(1027); + setState(1024); match(FUNC); - setState(1028); + setState(1025); match(IDENTIFIER); { - setState(1029); + setState(1026); signature(); - setState(1031); + setState(1028); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: { - setState(1030); + setState(1027); blockWithBodyParameterInfo(); } break; @@ -5429,21 +5419,21 @@ public final MethodDeclContext methodDecl(boolean trusted,boolean pure,boolean o try { enterOuterAlt(_localctx, 1); { - setState(1033); + setState(1030); match(FUNC); - setState(1034); + setState(1031); receiver(); - setState(1035); + setState(1032); match(IDENTIFIER); { - setState(1036); + setState(1033); signature(); - setState(1038); + setState(1035); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: { - setState(1037); + setState(1034); blockWithBodyParameterInfo(); } break; @@ -5488,9 +5478,9 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(1040); + setState(1037); match(GHOST); - setState(1043); + setState(1040); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -5503,7 +5493,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case BACKEND: case FUNC: { - setState(1041); + setState(1038); specMember(); } break; @@ -5511,7 +5501,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(1042); + setState(1039); declaration(); } break; @@ -5558,18 +5548,18 @@ public final FpredicateDeclContext fpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1045); + setState(1042); match(PRED); - setState(1046); + setState(1043); match(IDENTIFIER); - setState(1047); + setState(1044); parameters(); - setState(1049); + setState(1046); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { case 1: { - setState(1048); + setState(1045); predicateBody(); } break; @@ -5614,13 +5604,13 @@ public final PredicateBodyContext predicateBody() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1051); + setState(1048); match(L_CURLY); - setState(1052); + setState(1049); expression(0); - setState(1053); + setState(1050); eos(); - setState(1054); + setState(1051); match(R_CURLY); } } @@ -5665,20 +5655,20 @@ public final MpredicateDeclContext mpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1056); + setState(1053); match(PRED); - setState(1057); + setState(1054); receiver(); - setState(1058); + setState(1055); match(IDENTIFIER); - setState(1059); + setState(1056); parameters(); - setState(1061); + setState(1058); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: { - setState(1060); + setState(1057); predicateBody(); } break; @@ -5725,9 +5715,9 @@ public final VarSpecContext varSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1063); + setState(1060); maybeAddressableIdentifierList(); - setState(1071); + setState(1068); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5751,16 +5741,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(1064); + setState(1061); type_(); - setState(1067); + setState(1064); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { - setState(1065); + setState(1062); match(ASSIGN); - setState(1066); + setState(1063); expressionList(); } break; @@ -5769,9 +5759,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(1069); + setState(1066); match(ASSIGN); - setState(1070); + setState(1067); expressionList(); } break; @@ -5817,11 +5807,11 @@ public final ShortVarDeclContext shortVarDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1073); + setState(1070); maybeAddressableIdentifierList(); - setState(1074); + setState(1071); match(DECLARE_ASSIGN); - setState(1075); + setState(1072); expressionList(); } } @@ -5865,31 +5855,31 @@ public final ReceiverContext receiver() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1077); + setState(1074); match(L_PAREN); - setState(1079); + setState(1076); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { case 1: { - setState(1078); + setState(1075); maybeAddressableIdentifier(); } break; } - setState(1081); + setState(1078); type_(); - setState(1083); + setState(1080); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1082); + setState(1079); match(COMMA); } } - setState(1085); + setState(1082); match(R_PAREN); } } @@ -5927,20 +5917,20 @@ public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); enterRule(_localctx, 172, RULE_parameterDecl); try { - setState(1089); + setState(1086); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1087); + setState(1084); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1088); + setState(1085); ghostParameterDecl(); } break; @@ -5982,17 +5972,17 @@ public final ActualParameterDeclContext actualParameterDecl() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(1092); + setState(1089); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { case 1: { - setState(1091); + setState(1088); identifierList(); } break; } - setState(1094); + setState(1091); parameterType(); } } @@ -6033,19 +6023,19 @@ public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1096); + setState(1093); match(GHOST); - setState(1098); + setState(1095); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: { - setState(1097); + setState(1094); identifierList(); } break; } - setState(1100); + setState(1097); parameterType(); } } @@ -6084,17 +6074,17 @@ public final ParameterTypeContext parameterType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1103); + setState(1100); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1102); + setState(1099); match(ELLIPSIS); } } - setState(1105); + setState(1102); type_(); } } @@ -6416,16 +6406,16 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1128); + setState(1125); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { case 1: { _localctx = new UnaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1108); + setState(1105); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 127L) != 0)) ) { @@ -6436,7 +6426,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1109); + setState(1106); expression(15); } break; @@ -6445,7 +6435,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1110); + setState(1107); primaryExpr(0); } break; @@ -6454,13 +6444,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1111); + setState(1108); match(UNFOLDING); - setState(1112); + setState(1109); predicateAccess(); - setState(1113); + setState(1110); match(IN); - setState(1114); + setState(1111); expression(3); } break; @@ -6469,13 +6459,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1116); + setState(1113); match(LET); - setState(1117); + setState(1114); shortVarDecl(); - setState(1118); + setState(1115); match(IN); - setState(1119); + setState(1116); expression(2); } break; @@ -6484,7 +6474,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1121); + setState(1118); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -6494,38 +6484,38 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1122); + setState(1119); boundVariables(); - setState(1123); + setState(1120); match(COLON); - setState(1124); + setState(1121); match(COLON); - setState(1125); + setState(1122); triggers(); - setState(1126); + setState(1123); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1165); + setState(1162); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,92,_ctx); + _alt = getInterpreter().adaptivePredict(_input,91,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1163); + setState(1160); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1130); + setState(1127); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1131); + setState(1128); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & 1567L) != 0)) ) { @@ -6536,7 +6526,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1132); + setState(1129); expression(14); } break; @@ -6544,9 +6534,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1133); + setState(1130); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1134); + setState(1131); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); if ( !(_la==WAND || ((((_la - 117)) & ~0x3f) == 0 && ((1L << (_la - 117)) & 3674113L) != 0)) ) { @@ -6557,7 +6547,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1135); + setState(1132); expression(13); } break; @@ -6565,9 +6555,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1136); + setState(1133); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1137); + setState(1134); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { @@ -6578,7 +6568,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1138); + setState(1135); expression(12); } break; @@ -6586,9 +6576,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1139); + setState(1136); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1140); + setState(1137); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { @@ -6599,7 +6589,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1141); + setState(1138); expression(11); } break; @@ -6607,9 +6597,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1142); + setState(1139); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1143); + setState(1140); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 70931694131085315L) != 0)) ) { @@ -6620,7 +6610,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1144); + setState(1141); expression(10); } break; @@ -6628,11 +6618,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1145); + setState(1142); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1146); + setState(1143); match(LOGICAL_AND); - setState(1147); + setState(1144); expression(8); } break; @@ -6640,11 +6630,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1148); + setState(1145); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1149); + setState(1146); match(LOGICAL_OR); - setState(1150); + setState(1147); expression(7); } break; @@ -6652,11 +6642,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1151); + setState(1148); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1152); + setState(1149); match(IMPLIES); - setState(1153); + setState(1150); expression(5); } break; @@ -6664,15 +6654,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1154); + setState(1151); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1155); + setState(1152); match(QMARK); - setState(1156); + setState(1153); expression(0); - setState(1157); + setState(1154); match(COLON); - setState(1158); + setState(1155); expression(4); } break; @@ -6680,20 +6670,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1160); + setState(1157); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1161); + setState(1158); match(IMPL); - setState(1162); + setState(1159); closureSpecInstance(); } break; } } } - setState(1167); + setState(1164); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,92,_ctx); + _alt = getInterpreter().adaptivePredict(_input,91,_ctx); } } } @@ -6785,146 +6775,146 @@ public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 182, RULE_statement); try { - setState(1188); + setState(1185); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,92,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1168); + setState(1165); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1169); + setState(1166); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1170); + setState(1167); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1171); + setState(1168); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1172); + setState(1169); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1173); + setState(1170); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1174); + setState(1171); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1175); + setState(1172); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1176); + setState(1173); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1177); + setState(1174); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1178); + setState(1175); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1179); + setState(1176); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1180); + setState(1177); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1181); + setState(1178); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1182); + setState(1179); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1183); + setState(1180); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1184); + setState(1181); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1185); + setState(1182); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1186); + setState(1183); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1187); + setState(1184); closureImplProofStmt(); } break; @@ -6964,9 +6954,9 @@ public final ApplyStmtContext applyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1190); + setState(1187); match(APPLY); - setState(1191); + setState(1188); expression(0); } } @@ -7007,16 +6997,16 @@ public final PackageStmtContext packageStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1193); + setState(1190); match(PACKAGE); - setState(1194); + setState(1191); expression(0); - setState(1196); + setState(1193); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(1195); + setState(1192); block(); } break; @@ -7059,9 +7049,9 @@ public final SpecForStmtContext specForStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1198); + setState(1195); loopSpec(); - setState(1199); + setState(1196); forStmt(); } } @@ -7116,34 +7106,34 @@ public final LoopSpecContext loopSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1207); + setState(1204); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1201); + setState(1198); match(INV); - setState(1202); + setState(1199); expression(0); - setState(1203); + setState(1200); eos(); } } - setState(1209); + setState(1206); _errHandler.sync(this); _la = _input.LA(1); } - setState(1214); + setState(1211); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1210); + setState(1207); match(DEC); - setState(1211); + setState(1208); terminationMeasure(); - setState(1212); + setState(1209); eos(); } } @@ -7189,24 +7179,24 @@ public final DeferStmtContext deferStmt() throws RecognitionException { enterRule(_localctx, 192, RULE_deferStmt); int _la; try { - setState(1221); + setState(1218); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1216); + setState(1213); match(DEFER); - setState(1217); + setState(1214); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1218); + setState(1215); match(DEFER); - setState(1219); + setState(1216); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -7217,7 +7207,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1220); + setState(1217); predicateAccess(); } break; @@ -7263,62 +7253,62 @@ public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); enterRule(_localctx, 194, RULE_basicLit); try { - setState(1231); + setState(1228); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1223); + setState(1220); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1224); + setState(1221); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1225); + setState(1222); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1226); + setState(1223); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1227); + setState(1224); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1228); + setState(1225); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1229); + setState(1226); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1230); + setState(1227); match(RUNE_LIT); } break; @@ -7594,16 +7584,16 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1249); + setState(1246); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { case 1: { _localctx = new OperandPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1234); + setState(1231); operand(); } break; @@ -7612,7 +7602,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1235); + setState(1232); conversion(); } break; @@ -7621,7 +7611,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1236); + setState(1233); methodExpr(); } break; @@ -7630,7 +7620,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1237); + setState(1234); ghostPrimaryExpr(); } break; @@ -7639,7 +7629,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1238); + setState(1235); new_(); } break; @@ -7648,7 +7638,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1239); + setState(1236); make(); } break; @@ -7657,11 +7647,11 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new RevealInvokePrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1240); + setState(1237); match(REVEAL); - setState(1241); + setState(1238); primaryExpr(0); - setState(1242); + setState(1239); arguments(); } break; @@ -7670,7 +7660,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1244); + setState(1241); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 46)) & ~0x3f) == 0 && ((1L << (_la - 46)) & 2251799813685321L) != 0)) ) { @@ -7681,36 +7671,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1245); + setState(1242); match(L_PAREN); - setState(1246); + setState(1243); expression(0); - setState(1247); + setState(1244); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1273); + setState(1270); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,101,_ctx); + _alt = getInterpreter().adaptivePredict(_input,100,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1271); + setState(1268); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,100,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1251); + setState(1248); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1252); + setState(1249); match(DOT); - setState(1253); + setState(1250); match(IDENTIFIER); } break; @@ -7718,9 +7708,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1254); + setState(1251); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1255); + setState(1252); index(); } break; @@ -7728,9 +7718,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1256); + setState(1253); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1257); + setState(1254); slice_(); } break; @@ -7738,9 +7728,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1258); + setState(1255); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1259); + setState(1256); seqUpdExp(); } break; @@ -7748,9 +7738,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1260); + setState(1257); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1261); + setState(1258); typeAssertion(); } break; @@ -7758,9 +7748,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1262); + setState(1259); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1263); + setState(1260); arguments(); } break; @@ -7768,13 +7758,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1264); + setState(1261); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1265); + setState(1262); arguments(); - setState(1266); + setState(1263); match(AS); - setState(1267); + setState(1264); closureSpecInstance(); } break; @@ -7782,18 +7772,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1269); + setState(1266); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1270); + setState(1267); predConstructArgs(); } break; } } } - setState(1275); + setState(1272); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,101,_ctx); + _alt = getInterpreter().adaptivePredict(_input,100,_ctx); } } } @@ -7834,9 +7824,9 @@ public final FunctionLitContext functionLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1276); + setState(1273); ((FunctionLitContext)_localctx).specification = specification(); - setState(1277); + setState(1274); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7884,27 +7874,27 @@ public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws try { enterOuterAlt(_localctx, 1); { - setState(1279); + setState(1276); match(FUNC); - setState(1281); + setState(1278); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1280); + setState(1277); match(IDENTIFIER); } } { - setState(1283); + setState(1280); signature(); - setState(1285); + setState(1282); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { case 1: { - setState(1284); + setState(1281); blockWithBodyParameterInfo(); } break; @@ -7949,29 +7939,29 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1287); + setState(1284); match(L_PRED); - setState(1289); + setState(1286); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1288); + setState(1285); expressionList(); } } - setState(1292); + setState(1289); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1291); + setState(1288); match(COMMA); } } - setState(1294); + setState(1291); match(R_PRED); } } @@ -8033,47 +8023,47 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1296); + setState(1293); match(INTERFACE); - setState(1297); + setState(1294); match(L_CURLY); - setState(1307); + setState(1304); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 144115188210101760L) != 0) || ((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & 137438954753L) != 0)) { { { - setState(1301); + setState(1298); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,105,_ctx) ) { case 1: { - setState(1298); + setState(1295); methodSpec(); } break; case 2: { - setState(1299); + setState(1296); typeName(); } break; case 3: { - setState(1300); + setState(1297); predicateSpec(); } break; } - setState(1303); + setState(1300); eos(); } } - setState(1309); + setState(1306); _errHandler.sync(this); _la = _input.LA(1); } - setState(1310); + setState(1307); match(R_CURLY); } } @@ -8112,11 +8102,11 @@ public final PredicateSpecContext predicateSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1312); + setState(1309); match(PRED); - setState(1313); + setState(1310); match(IDENTIFIER); - setState(1314); + setState(1311); parameters(); } } @@ -8160,50 +8150,50 @@ public final MethodSpecContext methodSpec() throws RecognitionException { enterRule(_localctx, 208, RULE_methodSpec); int _la; try { - setState(1331); + setState(1328); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,110,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1317); + setState(1314); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1316); + setState(1313); match(GHOST); } } - setState(1319); + setState(1316); specification(); - setState(1320); + setState(1317); match(IDENTIFIER); - setState(1321); + setState(1318); parameters(); - setState(1322); + setState(1319); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1325); + setState(1322); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1324); + setState(1321); match(GHOST); } } - setState(1327); + setState(1324); specification(); - setState(1328); + setState(1325); match(IDENTIFIER); - setState(1329); + setState(1326); parameters(); } break; @@ -8251,13 +8241,13 @@ public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); enterRule(_localctx, 210, RULE_type_); try { - setState(1340); + setState(1337); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1333); + setState(1330); typeName(); } break; @@ -8272,7 +8262,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1334); + setState(1331); typeLit(); } break; @@ -8287,18 +8277,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1335); + setState(1332); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1336); + setState(1333); match(L_PAREN); - setState(1337); + setState(1334); type_(); - setState(1338); + setState(1335); match(R_PAREN); } break; @@ -8361,69 +8351,69 @@ public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); enterRule(_localctx, 212, RULE_typeLit); try { - setState(1351); + setState(1348); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,111,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1342); + setState(1339); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1343); + setState(1340); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1344); + setState(1341); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1345); + setState(1342); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1346); + setState(1343); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1347); + setState(1344); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1348); + setState(1345); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1349); + setState(1346); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1350); + setState(1347); predType(); } break; @@ -8463,9 +8453,9 @@ public final PredTypeContext predType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1353); + setState(1350); match(PRED); - setState(1354); + setState(1351); predTypeParams(); } } @@ -8513,39 +8503,39 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1356); + setState(1353); match(L_PAREN); - setState(1368); + setState(1365); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441151881345761731L) != 0)) { { - setState(1357); + setState(1354); type_(); - setState(1362); + setState(1359); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,113,_ctx); + _alt = getInterpreter().adaptivePredict(_input,112,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1358); + setState(1355); match(COMMA); - setState(1359); + setState(1356); type_(); } } } - setState(1364); + setState(1361); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,113,_ctx); + _alt = getInterpreter().adaptivePredict(_input,112,_ctx); } - setState(1366); + setState(1363); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1365); + setState(1362); match(COMMA); } } @@ -8553,7 +8543,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1370); + setState(1367); match(R_PAREN); } } @@ -8606,55 +8596,55 @@ public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); enterRule(_localctx, 218, RULE_literalType); try { - setState(1379); + setState(1376); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1372); + setState(1369); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1373); + setState(1370); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1374); + setState(1371); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1375); + setState(1372); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1376); + setState(1373); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1377); + setState(1374); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1378); + setState(1375); typeName(); } break; @@ -8696,13 +8686,13 @@ public final ImplicitArrayContext implicitArray() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1381); + setState(1378); match(L_BRACKET); - setState(1382); + setState(1379); match(ELLIPSIS); - setState(1383); + setState(1380); match(R_BRACKET); - setState(1384); + setState(1381); elementType(); } } @@ -8752,31 +8742,31 @@ public final Slice_Context slice_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1386); + setState(1383); match(L_BRACKET); - setState(1402); + setState(1399); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { case 1: { - setState(1388); + setState(1385); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1387); + setState(1384); low(); } } - setState(1390); + setState(1387); match(COLON); - setState(1392); + setState(1389); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1391); + setState(1388); high(); } } @@ -8785,28 +8775,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1395); + setState(1392); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1394); + setState(1391); low(); } } - setState(1397); + setState(1394); match(COLON); - setState(1398); + setState(1395); high(); - setState(1399); + setState(1396); match(COLON); - setState(1400); + setState(1397); cap(); } break; } - setState(1404); + setState(1401); match(R_BRACKET); } } @@ -8843,7 +8833,7 @@ public final LowContext low() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1406); + setState(1403); expression(0); } } @@ -8880,7 +8870,7 @@ public final HighContext high() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1408); + setState(1405); expression(0); } } @@ -8917,7 +8907,7 @@ public final CapContext cap() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1410); + setState(1407); expression(0); } } @@ -8965,12 +8955,12 @@ public final Assign_opContext assign_op() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1413); + setState(1410); _errHandler.sync(this); _la = _input.LA(1); if (((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & 4031L) != 0)) { { - setState(1412); + setState(1409); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & 4031L) != 0)) ) { @@ -8984,7 +8974,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1415); + setState(1412); match(ASSIGN); } } @@ -9033,43 +9023,43 @@ public final RangeClauseContext rangeClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1423); + setState(1420); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { case 1: { - setState(1417); + setState(1414); expressionList(); - setState(1418); + setState(1415); match(ASSIGN); } break; case 2: { - setState(1420); + setState(1417); maybeAddressableIdentifierList(); - setState(1421); + setState(1418); match(DECLARE_ASSIGN); } break; } - setState(1425); + setState(1422); match(RANGE); - setState(1426); + setState(1423); expression(0); - setState(1431); + setState(1428); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1427); + setState(1424); match(WITH); - setState(1429); + setState(1426); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1428); + setState(1425); match(IDENTIFIER); } } @@ -9112,9 +9102,9 @@ public final PackageClauseContext packageClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1433); + setState(1430); match(PACKAGE); - setState(1434); + setState(1431); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -9151,7 +9141,7 @@ public final ImportPathContext importPath() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1436); + setState(1433); string_(); } } @@ -9192,27 +9182,27 @@ public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); enterRule(_localctx, 238, RULE_declaration); try { - setState(1441); + setState(1438); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1438); + setState(1435); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1439); + setState(1436); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1440); + setState(1437); varDecl(); } break; @@ -9266,38 +9256,38 @@ public final ConstDeclContext constDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1443); + setState(1440); match(CONST); - setState(1455); + setState(1452); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1444); + setState(1441); constSpec(); } break; case L_PAREN: { - setState(1445); + setState(1442); match(L_PAREN); - setState(1451); + setState(1448); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1446); + setState(1443); constSpec(); - setState(1447); + setState(1444); eos(); } } - setState(1453); + setState(1450); _errHandler.sync(this); _la = _input.LA(1); } - setState(1454); + setState(1451); match(R_PAREN); } break; @@ -9347,26 +9337,26 @@ public final ConstSpecContext constSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1457); + setState(1454); identifierList(); - setState(1463); + setState(1460); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { case 1: { - setState(1459); + setState(1456); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441151881345761731L) != 0)) { { - setState(1458); + setState(1455); type_(); } } - setState(1461); + setState(1458); match(ASSIGN); - setState(1462); + setState(1459); expressionList(); } break; @@ -9412,25 +9402,25 @@ public final IdentifierListContext identifierList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1465); + setState(1462); match(IDENTIFIER); - setState(1470); + setState(1467); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,130,_ctx); + _alt = getInterpreter().adaptivePredict(_input,129,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1466); + setState(1463); match(COMMA); - setState(1467); + setState(1464); match(IDENTIFIER); } } } - setState(1472); + setState(1469); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,130,_ctx); + _alt = getInterpreter().adaptivePredict(_input,129,_ctx); } } } @@ -9475,25 +9465,25 @@ public final ExpressionListContext expressionList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1473); + setState(1470); expression(0); - setState(1478); + setState(1475); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,131,_ctx); + _alt = getInterpreter().adaptivePredict(_input,130,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1474); + setState(1471); match(COMMA); - setState(1475); + setState(1472); expression(0); } } } - setState(1480); + setState(1477); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,131,_ctx); + _alt = getInterpreter().adaptivePredict(_input,130,_ctx); } } } @@ -9543,38 +9533,38 @@ public final TypeDeclContext typeDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1481); + setState(1478); match(TYPE); - setState(1493); + setState(1490); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1482); + setState(1479); typeSpec(); } break; case L_PAREN: { - setState(1483); + setState(1480); match(L_PAREN); - setState(1489); + setState(1486); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1484); + setState(1481); typeSpec(); - setState(1485); + setState(1482); eos(); } } - setState(1491); + setState(1488); _errHandler.sync(this); _la = _input.LA(1); } - setState(1492); + setState(1489); match(R_PAREN); } break; @@ -9619,19 +9609,19 @@ public final TypeSpecContext typeSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1495); + setState(1492); match(IDENTIFIER); - setState(1497); + setState(1494); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1496); + setState(1493); match(ASSIGN); } } - setState(1499); + setState(1496); type_(); } } @@ -9681,38 +9671,38 @@ public final VarDeclContext varDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1501); + setState(1498); match(VAR); - setState(1513); + setState(1510); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1502); + setState(1499); varSpec(); } break; case L_PAREN: { - setState(1503); + setState(1500); match(L_PAREN); - setState(1509); + setState(1506); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1504); + setState(1501); varSpec(); - setState(1505); + setState(1502); eos(); } } - setState(1511); + setState(1508); _errHandler.sync(this); _la = _input.LA(1); } - setState(1512); + setState(1509); match(R_PAREN); } break; @@ -9756,19 +9746,19 @@ public final BlockContext block() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1515); + setState(1512); match(L_CURLY); - setState(1517); + setState(1514); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { case 1: { - setState(1516); + setState(1513); statementList(); } break; } - setState(1519); + setState(1516); match(R_CURLY); } } @@ -9824,7 +9814,7 @@ public final StatementListContext statementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1533); + setState(1530); _errHandler.sync(this); _alt = 1; do { @@ -9832,17 +9822,17 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1528); + setState(1525); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: { - setState(1522); + setState(1519); _errHandler.sync(this); _la = _input.LA(1); if (_la==SEMI) { { - setState(1521); + setState(1518); match(SEMI); } } @@ -9851,12 +9841,12 @@ public final StatementListContext statementList() throws RecognitionException { break; case 2: { - setState(1525); + setState(1522); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOS) { { - setState(1524); + setState(1521); match(EOS); } } @@ -9865,14 +9855,14 @@ public final StatementListContext statementList() throws RecognitionException { break; case 3: { - setState(1527); + setState(1524); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; } - setState(1530); + setState(1527); statement(); - setState(1531); + setState(1528); eos(); } } @@ -9880,9 +9870,9 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1535); + setState(1532); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,141,_ctx); + _alt = getInterpreter().adaptivePredict(_input,140,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -9929,41 +9919,41 @@ public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); enterRule(_localctx, 258, RULE_simpleStmt); try { - setState(1542); + setState(1539); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1537); + setState(1534); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1538); + setState(1535); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1539); + setState(1536); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1540); + setState(1537); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1541); + setState(1538); shortVarDecl(); } break; @@ -10002,7 +9992,7 @@ public final ExpressionStmtContext expressionStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1544); + setState(1541); expression(0); } } @@ -10044,11 +10034,11 @@ public final SendStmtContext sendStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1546); + setState(1543); ((SendStmtContext)_localctx).channel = expression(0); - setState(1547); + setState(1544); match(RECEIVE); - setState(1548); + setState(1545); expression(0); } } @@ -10088,9 +10078,9 @@ public final IncDecStmtContext incDecStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1550); + setState(1547); expression(0); - setState(1551); + setState(1548); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -10141,11 +10131,11 @@ public final AssignmentContext assignment() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1553); + setState(1550); expressionList(); - setState(1554); + setState(1551); assign_op(); - setState(1555); + setState(1552); expressionList(); } } @@ -10182,7 +10172,7 @@ public final EmptyStmtContext emptyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1557); + setState(1554); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -10229,16 +10219,16 @@ public final LabeledStmtContext labeledStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1559); + setState(1556); match(IDENTIFIER); - setState(1560); + setState(1557); match(COLON); - setState(1562); + setState(1559); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1561); + setState(1558); statement(); } break; @@ -10279,14 +10269,14 @@ public final ReturnStmtContext returnStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1564); + setState(1561); match(RETURN); - setState(1566); + setState(1563); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: { - setState(1565); + setState(1562); expressionList(); } break; @@ -10325,14 +10315,14 @@ public final BreakStmtContext breakStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1568); + setState(1565); match(BREAK); - setState(1570); + setState(1567); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { case 1: { - setState(1569); + setState(1566); match(IDENTIFIER); } break; @@ -10371,14 +10361,14 @@ public final ContinueStmtContext continueStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1572); + setState(1569); match(CONTINUE); - setState(1574); + setState(1571); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1573); + setState(1570); match(IDENTIFIER); } break; @@ -10417,9 +10407,9 @@ public final GotoStmtContext gotoStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1576); + setState(1573); match(GOTO); - setState(1577); + setState(1574); match(IDENTIFIER); } } @@ -10454,7 +10444,7 @@ public final FallthroughStmtContext fallthroughStmt() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1579); + setState(1576); match(FALLTHROUGH); } } @@ -10508,57 +10498,57 @@ public final IfStmtContext ifStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1581); + setState(1578); match(IF); - setState(1590); + setState(1587); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1582); + setState(1579); expression(0); } break; case 2: { - setState(1583); + setState(1580); eos(); - setState(1584); + setState(1581); expression(0); } break; case 3: { - setState(1586); + setState(1583); simpleStmt(); - setState(1587); + setState(1584); eos(); - setState(1588); + setState(1585); expression(0); } break; } - setState(1592); + setState(1589); block(); - setState(1598); + setState(1595); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1593); + setState(1590); match(ELSE); - setState(1596); + setState(1593); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1594); + setState(1591); ifStmt(); } break; case L_CURLY: { - setState(1595); + setState(1592); block(); } break; @@ -10604,20 +10594,20 @@ public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); enterRule(_localctx, 284, RULE_switchStmt); try { - setState(1602); + setState(1599); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1600); + setState(1597); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1601); + setState(1598); typeSwitchStmt(); } break; @@ -10672,19 +10662,19 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1604); + setState(1601); match(SWITCH); - setState(1615); + setState(1612); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,154,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { case 1: { - setState(1606); + setState(1603); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1605); + setState(1602); expression(0); } } @@ -10693,24 +10683,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1609); + setState(1606); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { case 1: { - setState(1608); + setState(1605); simpleStmt(); } break; } - setState(1611); + setState(1608); eos(); - setState(1613); + setState(1610); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1612); + setState(1609); expression(0); } } @@ -10718,23 +10708,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1617); + setState(1614); match(L_CURLY); - setState(1621); + setState(1618); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1618); + setState(1615); exprCaseClause(); } } - setState(1623); + setState(1620); _errHandler.sync(this); _la = _input.LA(1); } - setState(1624); + setState(1621); match(R_CURLY); } } @@ -10775,16 +10765,16 @@ public final ExprCaseClauseContext exprCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1626); + setState(1623); exprSwitchCase(); - setState(1627); + setState(1624); match(COLON); - setState(1629); + setState(1626); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { case 1: { - setState(1628); + setState(1625); statementList(); } break; @@ -10824,22 +10814,22 @@ public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 290, RULE_exprSwitchCase); try { - setState(1634); + setState(1631); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1631); + setState(1628); match(CASE); - setState(1632); + setState(1629); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1633); + setState(1630); match(DEFAULT); } break; @@ -10896,53 +10886,53 @@ public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1636); + setState(1633); match(SWITCH); - setState(1645); + setState(1642); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { case 1: { - setState(1637); + setState(1634); typeSwitchGuard(); } break; case 2: { - setState(1638); + setState(1635); eos(); - setState(1639); + setState(1636); typeSwitchGuard(); } break; case 3: { - setState(1641); + setState(1638); simpleStmt(); - setState(1642); + setState(1639); eos(); - setState(1643); + setState(1640); typeSwitchGuard(); } break; } - setState(1647); + setState(1644); match(L_CURLY); - setState(1651); + setState(1648); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1648); + setState(1645); typeCaseClause(); } } - setState(1653); + setState(1650); _errHandler.sync(this); _la = _input.LA(1); } - setState(1654); + setState(1651); match(R_CURLY); } } @@ -10985,27 +10975,27 @@ public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1658); + setState(1655); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { case 1: { - setState(1656); + setState(1653); match(IDENTIFIER); - setState(1657); + setState(1654); match(DECLARE_ASSIGN); } break; } - setState(1660); + setState(1657); primaryExpr(0); - setState(1661); + setState(1658); match(DOT); - setState(1662); + setState(1659); match(L_PAREN); - setState(1663); + setState(1660); match(TYPE); - setState(1664); + setState(1661); match(R_PAREN); } } @@ -11046,16 +11036,16 @@ public final TypeCaseClauseContext typeCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1666); + setState(1663); typeSwitchCase(); - setState(1667); + setState(1664); match(COLON); - setState(1669); + setState(1666); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: { - setState(1668); + setState(1665); statementList(); } break; @@ -11095,22 +11085,22 @@ public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 298, RULE_typeSwitchCase); try { - setState(1674); + setState(1671); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1671); + setState(1668); match(CASE); - setState(1672); + setState(1669); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1673); + setState(1670); match(DEFAULT); } break; @@ -11163,7 +11153,7 @@ public final TypeListContext typeList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1678); + setState(1675); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -11187,28 +11177,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1676); + setState(1673); type_(); } break; case NIL_LIT: { - setState(1677); + setState(1674); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1687); + setState(1684); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1680); + setState(1677); match(COMMA); - setState(1683); + setState(1680); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -11232,13 +11222,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1681); + setState(1678); type_(); } break; case NIL_LIT: { - setState(1682); + setState(1679); match(NIL_LIT); } break; @@ -11247,7 +11237,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1689); + setState(1686); _errHandler.sync(this); _la = _input.LA(1); } @@ -11293,25 +11283,25 @@ public final SelectStmtContext selectStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1690); + setState(1687); match(SELECT); - setState(1691); + setState(1688); match(L_CURLY); - setState(1695); + setState(1692); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1692); + setState(1689); commClause(); } } - setState(1697); + setState(1694); _errHandler.sync(this); _la = _input.LA(1); } - setState(1698); + setState(1695); match(R_CURLY); } } @@ -11352,16 +11342,16 @@ public final CommClauseContext commClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1700); + setState(1697); commCase(); - setState(1701); + setState(1698); match(COLON); - setState(1703); + setState(1700); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { case 1: { - setState(1702); + setState(1699); statementList(); } break; @@ -11404,26 +11394,26 @@ public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); enterRule(_localctx, 306, RULE_commCase); try { - setState(1711); + setState(1708); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1705); + setState(1702); match(CASE); - setState(1708); + setState(1705); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { case 1: { - setState(1706); + setState(1703); sendStmt(); } break; case 2: { - setState(1707); + setState(1704); recvStmt(); } break; @@ -11433,7 +11423,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1710); + setState(1707); match(DEFAULT); } break; @@ -11483,27 +11473,27 @@ public final RecvStmtContext recvStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1719); + setState(1716); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: { - setState(1713); + setState(1710); expressionList(); - setState(1714); + setState(1711); match(ASSIGN); } break; case 2: { - setState(1716); + setState(1713); identifierList(); - setState(1717); + setState(1714); match(DECLARE_ASSIGN); } break; } - setState(1721); + setState(1718); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -11551,19 +11541,19 @@ public final ForStmtContext forStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1723); + setState(1720); match(FOR); - setState(1731); + setState(1728); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) { case 1: { - setState(1725); + setState(1722); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1724); + setState(1721); expression(0); } } @@ -11572,18 +11562,18 @@ public final ForStmtContext forStmt() throws RecognitionException { break; case 2: { - setState(1727); + setState(1724); forClause(); } break; case 3: { - setState(1729); + setState(1726); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1728); + setState(1725); rangeClause(); } } @@ -11591,7 +11581,7 @@ public final ForStmtContext forStmt() throws RecognitionException { } break; } - setState(1733); + setState(1730); block(); } } @@ -11643,36 +11633,36 @@ public final ForClauseContext forClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1736); + setState(1733); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) { case 1: { - setState(1735); + setState(1732); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1738); + setState(1735); eos(); - setState(1740); + setState(1737); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,175,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { case 1: { - setState(1739); + setState(1736); expression(0); } break; } - setState(1742); + setState(1739); eos(); - setState(1744); + setState(1741); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1743); + setState(1740); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -11713,9 +11703,9 @@ public final GoStmtContext goStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1746); + setState(1743); match(GO); - setState(1747); + setState(1744); expression(0); } } @@ -11751,20 +11741,20 @@ public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); enterRule(_localctx, 316, RULE_typeName); try { - setState(1751); + setState(1748); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,177,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1749); + setState(1746); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1750); + setState(1747); match(IDENTIFIER); } break; @@ -11808,13 +11798,13 @@ public final ArrayTypeContext arrayType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1753); + setState(1750); match(L_BRACKET); - setState(1754); + setState(1751); arrayLength(); - setState(1755); + setState(1752); match(R_BRACKET); - setState(1756); + setState(1753); elementType(); } } @@ -11851,7 +11841,7 @@ public final ArrayLengthContext arrayLength() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1758); + setState(1755); expression(0); } } @@ -11888,7 +11878,7 @@ public final ElementTypeContext elementType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1760); + setState(1757); type_(); } } @@ -11926,9 +11916,9 @@ public final PointerTypeContext pointerType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1762); + setState(1759); match(STAR); - setState(1763); + setState(1760); type_(); } } @@ -11967,11 +11957,11 @@ public final SliceTypeContext sliceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1765); + setState(1762); match(L_BRACKET); - setState(1766); + setState(1763); match(R_BRACKET); - setState(1767); + setState(1764); elementType(); } } @@ -12014,15 +12004,15 @@ public final MapTypeContext mapType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1769); + setState(1766); match(MAP); - setState(1770); + setState(1767); match(L_BRACKET); - setState(1771); + setState(1768); type_(); - setState(1772); + setState(1769); match(R_BRACKET); - setState(1773); + setState(1770); elementType(); } } @@ -12061,33 +12051,33 @@ public final ChannelTypeContext channelType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1780); + setState(1777); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,177,_ctx) ) { case 1: { - setState(1775); + setState(1772); match(CHAN); } break; case 2: { - setState(1776); + setState(1773); match(CHAN); - setState(1777); + setState(1774); match(RECEIVE); } break; case 3: { - setState(1778); + setState(1775); match(RECEIVE); - setState(1779); + setState(1776); match(CHAN); } break; } - setState(1782); + setState(1779); elementType(); } } @@ -12125,9 +12115,9 @@ public final FunctionTypeContext functionType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1784); + setState(1781); match(FUNC); - setState(1785); + setState(1782); signature(); } } @@ -12165,22 +12155,22 @@ public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); enterRule(_localctx, 334, RULE_signature); try { - setState(1791); + setState(1788); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1787); + setState(1784); parameters(); - setState(1788); + setState(1785); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1790); + setState(1787); parameters(); } break; @@ -12220,20 +12210,20 @@ public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); enterRule(_localctx, 336, RULE_result); try { - setState(1795); + setState(1792); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,180,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1793); + setState(1790); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1794); + setState(1791); type_(); } break; @@ -12283,39 +12273,39 @@ public final ParametersContext parameters() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1797); + setState(1794); match(L_PAREN); - setState(1809); + setState(1806); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441152431101575619L) != 0)) { { - setState(1798); + setState(1795); parameterDecl(); - setState(1803); + setState(1800); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,181,_ctx); + _alt = getInterpreter().adaptivePredict(_input,180,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1799); + setState(1796); match(COMMA); - setState(1800); + setState(1797); parameterDecl(); } } } - setState(1805); + setState(1802); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,181,_ctx); + _alt = getInterpreter().adaptivePredict(_input,180,_ctx); } - setState(1807); + setState(1804); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1806); + setState(1803); match(COMMA); } } @@ -12323,7 +12313,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1811); + setState(1808); match(R_PAREN); } } @@ -12367,23 +12357,23 @@ public final ConversionContext conversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1813); + setState(1810); nonNamedType(); - setState(1814); + setState(1811); match(L_PAREN); - setState(1815); + setState(1812); expression(0); - setState(1817); + setState(1814); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1816); + setState(1813); match(COMMA); } } - setState(1819); + setState(1816); match(R_PAREN); } } @@ -12423,7 +12413,7 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); enterRule(_localctx, 342, RULE_nonNamedType); try { - setState(1826); + setState(1823); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -12437,18 +12427,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1821); + setState(1818); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1822); + setState(1819); match(L_PAREN); - setState(1823); + setState(1820); nonNamedType(); - setState(1824); + setState(1821); match(R_PAREN); } break; @@ -12495,31 +12485,31 @@ public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); enterRule(_localctx, 344, RULE_operand); try { - setState(1834); + setState(1831); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1828); + setState(1825); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1829); + setState(1826); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1830); + setState(1827); match(L_PAREN); - setState(1831); + setState(1828); expression(0); - setState(1832); + setState(1829); match(R_PAREN); } break; @@ -12562,7 +12552,7 @@ public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); enterRule(_localctx, 346, RULE_literal); try { - setState(1839); + setState(1836); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12579,7 +12569,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1836); + setState(1833); basicLit(); } break; @@ -12598,7 +12588,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1837); + setState(1834); compositeLit(); } break; @@ -12613,7 +12603,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1838); + setState(1835); functionLit(); } break; @@ -12658,7 +12648,7 @@ public final IntegerContext integer() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1841); + setState(1838); _la = _input.LA(1); if ( !(((((_la - 142)) & ~0x3f) == 0 && ((1L << (_la - 142)) & 111L) != 0)) ) { _errHandler.recoverInline(this); @@ -12701,7 +12691,7 @@ public final OperandNameContext operandName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1843); + setState(1840); match(IDENTIFIER); } } @@ -12740,11 +12730,11 @@ public final QualifiedIdentContext qualifiedIdent() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1845); + setState(1842); match(IDENTIFIER); - setState(1846); + setState(1843); match(DOT); - setState(1847); + setState(1844); match(IDENTIFIER); } } @@ -12784,9 +12774,9 @@ public final CompositeLitContext compositeLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1849); + setState(1846); literalType(); - setState(1850); + setState(1847); literalValue(); } } @@ -12827,21 +12817,21 @@ public final LiteralValueContext literalValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1852); + setState(1849); match(L_CURLY); - setState(1857); + setState(1854); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 23920835140615L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1853); + setState(1850); elementList(); - setState(1855); + setState(1852); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1854); + setState(1851); match(COMMA); } } @@ -12849,7 +12839,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1859); + setState(1856); match(R_CURLY); } } @@ -12894,25 +12884,25 @@ public final ElementListContext elementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1861); + setState(1858); keyedElement(); - setState(1866); + setState(1863); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,190,_ctx); + _alt = getInterpreter().adaptivePredict(_input,189,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1862); + setState(1859); match(COMMA); - setState(1863); + setState(1860); keyedElement(); } } } - setState(1868); + setState(1865); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,190,_ctx); + _alt = getInterpreter().adaptivePredict(_input,189,_ctx); } } } @@ -12953,19 +12943,19 @@ public final KeyedElementContext keyedElement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1872); + setState(1869); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,191,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,190,_ctx) ) { case 1: { - setState(1869); + setState(1866); key(); - setState(1870); + setState(1867); match(COLON); } break; } - setState(1874); + setState(1871); element(); } } @@ -13003,7 +12993,7 @@ public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); enterRule(_localctx, 362, RULE_key); try { - setState(1878); + setState(1875); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -13075,14 +13065,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1876); + setState(1873); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1877); + setState(1874); literalValue(); } break; @@ -13124,7 +13114,7 @@ public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); enterRule(_localctx, 364, RULE_element); try { - setState(1882); + setState(1879); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -13196,14 +13186,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1880); + setState(1877); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1881); + setState(1878); literalValue(); } break; @@ -13257,27 +13247,27 @@ public final StructTypeContext structType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1884); + setState(1881); match(STRUCT); - setState(1885); + setState(1882); match(L_CURLY); - setState(1891); + setState(1888); _errHandler.sync(this); _la = _input.LA(1); while (_la==GHOST || _la==IDENTIFIER || _la==STAR) { { { - setState(1886); + setState(1883); fieldDecl(); - setState(1887); + setState(1884); eos(); } } - setState(1893); + setState(1890); _errHandler.sync(this); _la = _input.LA(1); } - setState(1894); + setState(1891); match(R_CURLY); } } @@ -13314,7 +13304,7 @@ public final String_Context string_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1896); + setState(1893); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -13361,17 +13351,17 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1899); + setState(1896); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1898); + setState(1895); match(STAR); } } - setState(1901); + setState(1898); typeName(); } } @@ -13410,11 +13400,11 @@ public final IndexContext index() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1903); + setState(1900); match(L_BRACKET); - setState(1904); + setState(1901); expression(0); - setState(1905); + setState(1902); match(R_BRACKET); } } @@ -13454,13 +13444,13 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1907); + setState(1904); match(DOT); - setState(1908); + setState(1905); match(L_PAREN); - setState(1909); + setState(1906); type_(); - setState(1910); + setState(1907); match(R_PAREN); } } @@ -13508,34 +13498,34 @@ public final ArgumentsContext arguments() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1912); + setState(1909); match(L_PAREN); - setState(1927); + setState(1924); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { { - setState(1919); + setState(1916); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,197,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,196,_ctx) ) { case 1: { - setState(1913); + setState(1910); expressionList(); } break; case 2: { - setState(1914); + setState(1911); nonNamedType(); - setState(1917); + setState(1914); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,196,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,195,_ctx) ) { case 1: { - setState(1915); + setState(1912); match(COMMA); - setState(1916); + setState(1913); expressionList(); } break; @@ -13543,22 +13533,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1922); + setState(1919); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1921); + setState(1918); match(ELLIPSIS); } } - setState(1925); + setState(1922); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1924); + setState(1921); match(COMMA); } } @@ -13566,7 +13556,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1929); + setState(1926); match(R_PAREN); } } @@ -13605,11 +13595,11 @@ public final MethodExprContext methodExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1931); + setState(1928); nonNamedType(); - setState(1932); + setState(1929); match(DOT); - setState(1933); + setState(1930); match(IDENTIFIER); } } @@ -13646,7 +13636,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1935); + setState(1932); type_(); } } @@ -13681,34 +13671,34 @@ public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); enterRule(_localctx, 382, RULE_eos); try { - setState(1941); + setState(1938); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,201,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,200,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1937); + setState(1934); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1938); + setState(1935); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1939); + setState(1936); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1940); + setState(1937); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; @@ -13800,7 +13790,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a4\u0798\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a4\u0795\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -13902,413 +13892,412 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u02de\b,\n,\f,\u02e1\t,\u0001,\u0001,\u0001-\u0003-\u02e6\b-\u0001-\u0001"+ "-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001"+ "/\u00010\u00030\u02f5\b0\u00010\u00010\u00010\u00010\u00030\u02fb\b0\u0001"+ - "0\u00030\u02fe\b0\u00010\u00030\u0301\b0\u00011\u00011\u00011\u00011\u0001"+ - "1\u00011\u00011\u00011\u00011\u00011\u00011\u00031\u030e\b1\u00012\u0001"+ - "2\u00012\u00012\u00012\u00012\u00012\u00032\u0317\b2\u00012\u00052\u031a"+ - "\b2\n2\f2\u031d\t2\u00012\u00012\u00032\u0321\b2\u00012\u00032\u0324\b"+ - "2\u00013\u00043\u0327\b3\u000b3\f3\u0328\u00014\u00014\u00014\u00054\u032e"+ - "\b4\n4\f4\u0331\t4\u00015\u00015\u00015\u00035\u0336\b5\u00015\u00015"+ - "\u00016\u00016\u00016\u00056\u033d\b6\n6\f6\u0340\t6\u00017\u00017\u0001"+ - "7\u00037\u0345\b7\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+ - "8\u00018\u00018\u00018\u00038\u0352\b8\u00019\u00039\u0355\b9\u00019\u0001"+ - "9\u00039\u0359\b9\u0001:\u0001:\u0003:\u035d\b:\u0001;\u0001;\u0001;\u0001"+ - ";\u0005;\u0363\b;\n;\f;\u0366\t;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003"+ - "<\u036d\b<\u0001=\u0001=\u0001=\u0003=\u0372\b=\u0001>\u0001>\u0001>\u0001"+ - ">\u0001>\u0001>\u0003>\u037a\b>\u0003>\u037c\b>\u0001>\u0001>\u0001>\u0003"+ - ">\u0381\b>\u0001?\u0001?\u0001?\u0005?\u0386\b?\n?\f?\u0389\t?\u0001@"+ - "\u0001@\u0001@\u0001@\u0001@\u0003@\u0390\b@\u0001@\u0003@\u0393\b@\u0001"+ - "@\u0001@\u0001A\u0001A\u0003A\u0399\bA\u0001A\u0001A\u0001A\u0003A\u039e"+ - "\bA\u0003A\u03a0\bA\u0001A\u0003A\u03a3\bA\u0001B\u0001B\u0001B\u0005"+ - "B\u03a8\bB\nB\fB\u03ab\tB\u0001C\u0001C\u0003C\u03af\bC\u0001C\u0001C"+ - "\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+ - "E\u0001E\u0001E\u0001E\u0005E\u03c0\bE\nE\fE\u03c3\tE\u0001E\u0001E\u0001"+ - "E\u0005E\u03c8\bE\nE\fE\u03cb\tE\u0001E\u0003E\u03ce\bE\u0001F\u0003F"+ - "\u03d1\bF\u0001F\u0001F\u0001F\u0001F\u0003F\u03d7\bF\u0001G\u0001G\u0003"+ - "G\u03db\bG\u0001G\u0003G\u03de\bG\u0001G\u0001G\u0001G\u0001H\u0001H\u0001"+ - "H\u0001H\u0001H\u0003H\u03e8\bH\u0001I\u0001I\u0001I\u0001I\u0001I\u0003"+ - "I\u03ef\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0003J\u03f6\bJ\u0001J\u0001"+ - "J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0003L\u0402"+ - "\bL\u0001M\u0001M\u0001M\u0001M\u0003M\u0408\bM\u0001N\u0001N\u0001N\u0001"+ - "N\u0001N\u0003N\u040f\bN\u0001O\u0001O\u0001O\u0003O\u0414\bO\u0001P\u0001"+ - "P\u0001P\u0001P\u0003P\u041a\bP\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0003R\u0426\bR\u0001S\u0001S\u0001S\u0001"+ - "S\u0003S\u042c\bS\u0001S\u0001S\u0003S\u0430\bS\u0001T\u0001T\u0001T\u0001"+ - "T\u0001U\u0001U\u0003U\u0438\bU\u0001U\u0001U\u0003U\u043c\bU\u0001U\u0001"+ - "U\u0001V\u0001V\u0003V\u0442\bV\u0001W\u0003W\u0445\bW\u0001W\u0001W\u0001"+ - "X\u0001X\u0003X\u044b\bX\u0001X\u0001X\u0001Y\u0003Y\u0450\bY\u0001Y\u0001"+ - "Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "0\u00030\u02fe\b0\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+ + "1\u00011\u00011\u00011\u00031\u030b\b1\u00012\u00012\u00012\u00012\u0001"+ + "2\u00012\u00012\u00032\u0314\b2\u00012\u00052\u0317\b2\n2\f2\u031a\t2"+ + "\u00012\u00012\u00032\u031e\b2\u00012\u00032\u0321\b2\u00013\u00043\u0324"+ + "\b3\u000b3\f3\u0325\u00014\u00014\u00014\u00054\u032b\b4\n4\f4\u032e\t"+ + "4\u00015\u00015\u00015\u00035\u0333\b5\u00015\u00015\u00016\u00016\u0001"+ + "6\u00056\u033a\b6\n6\f6\u033d\t6\u00017\u00017\u00017\u00037\u0342\b7"+ + "\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ + "8\u00018\u00038\u034f\b8\u00019\u00039\u0352\b9\u00019\u00019\u00039\u0356"+ + "\b9\u0001:\u0001:\u0003:\u035a\b:\u0001;\u0001;\u0001;\u0001;\u0005;\u0360"+ + "\b;\n;\f;\u0363\t;\u0001;\u0001;\u0001<\u0001<\u0001<\u0003<\u036a\b<"+ + "\u0001=\u0001=\u0001=\u0003=\u036f\b=\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0003>\u0377\b>\u0003>\u0379\b>\u0001>\u0001>\u0001>\u0003>\u037e"+ + "\b>\u0001?\u0001?\u0001?\u0005?\u0383\b?\n?\f?\u0386\t?\u0001@\u0001@"+ + "\u0001@\u0001@\u0001@\u0003@\u038d\b@\u0001@\u0003@\u0390\b@\u0001@\u0001"+ + "@\u0001A\u0001A\u0003A\u0396\bA\u0001A\u0001A\u0001A\u0003A\u039b\bA\u0003"+ + "A\u039d\bA\u0001A\u0003A\u03a0\bA\u0001B\u0001B\u0001B\u0005B\u03a5\b"+ + "B\nB\fB\u03a8\tB\u0001C\u0001C\u0003C\u03ac\bC\u0001C\u0001C\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0005E\u03bd\bE\nE\fE\u03c0\tE\u0001E\u0001E\u0001E\u0005E\u03c5"+ + "\bE\nE\fE\u03c8\tE\u0001E\u0003E\u03cb\bE\u0001F\u0003F\u03ce\bF\u0001"+ + "F\u0001F\u0001F\u0001F\u0003F\u03d4\bF\u0001G\u0001G\u0003G\u03d8\bG\u0001"+ + "G\u0003G\u03db\bG\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001"+ + "H\u0003H\u03e5\bH\u0001I\u0001I\u0001I\u0001I\u0001I\u0003I\u03ec\bI\u0001"+ + "J\u0001J\u0001J\u0001J\u0001J\u0003J\u03f3\bJ\u0001J\u0001J\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0003L\u03ff\bL\u0001M\u0001"+ + "M\u0001M\u0001M\u0003M\u0405\bM\u0001N\u0001N\u0001N\u0001N\u0001N\u0003"+ + "N\u040c\bN\u0001O\u0001O\u0001O\u0003O\u0411\bO\u0001P\u0001P\u0001P\u0001"+ + "P\u0003P\u0417\bP\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0003R\u0423\bR\u0001S\u0001S\u0001S\u0001S\u0003S\u0429"+ + "\bS\u0001S\u0001S\u0003S\u042d\bS\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ + "U\u0003U\u0435\bU\u0001U\u0001U\u0003U\u0439\bU\u0001U\u0001U\u0001V\u0001"+ + "V\u0003V\u043f\bV\u0001W\u0003W\u0442\bW\u0001W\u0001W\u0001X\u0001X\u0003"+ + "X\u0448\bX\u0001X\u0001X\u0001Y\u0003Y\u044d\bY\u0001Y\u0001Y\u0001Z\u0001"+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0003Z\u0469\bZ\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003"+ + "Z\u0466\bZ\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0005Z\u048c\bZ\nZ\fZ\u048f"+ - "\tZ\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0005Z\u0489\bZ\nZ\fZ\u048c\tZ\u0001[\u0001"+ "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0003[\u04a5\b[\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0003]"+ - "\u04ad\b]\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0005_\u04b6"+ - "\b_\n_\f_\u04b9\t_\u0001_\u0001_\u0001_\u0001_\u0003_\u04bf\b_\u0001`"+ - "\u0001`\u0001`\u0001`\u0001`\u0003`\u04c6\b`\u0001a\u0001a\u0001a\u0001"+ - "a\u0001a\u0001a\u0001a\u0001a\u0003a\u04d0\ba\u0001b\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0003b\u04e2\bb\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ + "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0003[\u04a2"+ + "\b[\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0003]\u04aa\b]\u0001"+ + "^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0005_\u04b3\b_\n_\f_\u04b6"+ + "\t_\u0001_\u0001_\u0001_\u0001_\u0003_\u04bc\b_\u0001`\u0001`\u0001`\u0001"+ + "`\u0001`\u0003`\u04c3\b`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ + "a\u0001a\u0003a\u04cd\ba\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003"+ + "b\u04df\bb\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001b\u0005b\u04f8\bb\nb\fb\u04fb\tb\u0001c\u0001"+ - "c\u0001c\u0001d\u0001d\u0003d\u0502\bd\u0001d\u0001d\u0003d\u0506\bd\u0001"+ - "e\u0001e\u0003e\u050a\be\u0001e\u0003e\u050d\be\u0001e\u0001e\u0001f\u0001"+ - "f\u0001f\u0001f\u0001f\u0003f\u0516\bf\u0001f\u0001f\u0005f\u051a\bf\n"+ - "f\ff\u051d\tf\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001h\u0003h"+ - "\u0526\bh\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u052e\bh\u0001"+ - "h\u0001h\u0001h\u0001h\u0003h\u0534\bh\u0001i\u0001i\u0001i\u0001i\u0001"+ - "i\u0001i\u0001i\u0003i\u053d\bi\u0001j\u0001j\u0001j\u0001j\u0001j\u0001"+ - "j\u0001j\u0001j\u0001j\u0003j\u0548\bj\u0001k\u0001k\u0001k\u0001l\u0001"+ - "l\u0001l\u0001l\u0005l\u0551\bl\nl\fl\u0554\tl\u0001l\u0003l\u0557\bl"+ - "\u0003l\u0559\bl\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001"+ - "m\u0001m\u0003m\u0564\bm\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001"+ - "o\u0003o\u056d\bo\u0001o\u0001o\u0003o\u0571\bo\u0001o\u0003o\u0574\b"+ - "o\u0001o\u0001o\u0001o\u0001o\u0001o\u0003o\u057b\bo\u0001o\u0001o\u0001"+ - "p\u0001p\u0001q\u0001q\u0001r\u0001r\u0001s\u0003s\u0586\bs\u0001s\u0001"+ - "s\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0003t\u0590\bt\u0001t\u0001"+ - "t\u0001t\u0001t\u0003t\u0596\bt\u0003t\u0598\bt\u0001u\u0001u\u0001u\u0001"+ - "v\u0001v\u0001w\u0001w\u0001w\u0003w\u05a2\bw\u0001x\u0001x\u0001x\u0001"+ - "x\u0001x\u0001x\u0005x\u05aa\bx\nx\fx\u05ad\tx\u0001x\u0003x\u05b0\bx"+ - "\u0001y\u0001y\u0003y\u05b4\by\u0001y\u0001y\u0003y\u05b8\by\u0001z\u0001"+ - "z\u0001z\u0005z\u05bd\bz\nz\fz\u05c0\tz\u0001{\u0001{\u0001{\u0005{\u05c5"+ - "\b{\n{\f{\u05c8\t{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0005|\u05d0"+ - "\b|\n|\f|\u05d3\t|\u0001|\u0003|\u05d6\b|\u0001}\u0001}\u0003}\u05da\b"+ - "}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0005~\u05e4"+ - "\b~\n~\f~\u05e7\t~\u0001~\u0003~\u05ea\b~\u0001\u007f\u0001\u007f\u0003"+ - "\u007f\u05ee\b\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0003\u0080\u05f3"+ - "\b\u0080\u0001\u0080\u0003\u0080\u05f6\b\u0080\u0001\u0080\u0003\u0080"+ - "\u05f9\b\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0004\u0080\u05fe\b"+ - "\u0080\u000b\u0080\f\u0080\u05ff\u0001\u0081\u0001\u0081\u0001\u0081\u0001"+ - "\u0081\u0001\u0081\u0003\u0081\u0607\b\u0081\u0001\u0082\u0001\u0082\u0001"+ - "\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001"+ - "\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0086\u0001"+ - "\u0086\u0001\u0087\u0001\u0087\u0001\u0087\u0003\u0087\u061b\b\u0087\u0001"+ - "\u0088\u0001\u0088\u0003\u0088\u061f\b\u0088\u0001\u0089\u0001\u0089\u0003"+ - "\u0089\u0623\b\u0089\u0001\u008a\u0001\u008a\u0003\u008a\u0627\b\u008a"+ - "\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008d"+ - "\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d"+ - "\u0001\u008d\u0001\u008d\u0003\u008d\u0637\b\u008d\u0001\u008d\u0001\u008d"+ - "\u0001\u008d\u0001\u008d\u0003\u008d\u063d\b\u008d\u0003\u008d\u063f\b"+ - "\u008d\u0001\u008e\u0001\u008e\u0003\u008e\u0643\b\u008e\u0001\u008f\u0001"+ - "\u008f\u0003\u008f\u0647\b\u008f\u0001\u008f\u0003\u008f\u064a\b\u008f"+ - "\u0001\u008f\u0001\u008f\u0003\u008f\u064e\b\u008f\u0003\u008f\u0650\b"+ - "\u008f\u0001\u008f\u0001\u008f\u0005\u008f\u0654\b\u008f\n\u008f\f\u008f"+ - "\u0657\t\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090"+ - "\u0003\u0090\u065e\b\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091"+ - "\u0663\b\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u066e\b\u0092"+ - "\u0001\u0092\u0001\u0092\u0005\u0092\u0672\b\u0092\n\u0092\f\u0092\u0675"+ - "\t\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0003\u0093\u067b"+ - "\b\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+ - "\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0003\u0094\u0686\b\u0094\u0001"+ - "\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u068b\b\u0095\u0001\u0096\u0001"+ - "\u0096\u0003\u0096\u068f\b\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0003"+ - "\u0096\u0694\b\u0096\u0005\u0096\u0696\b\u0096\n\u0096\f\u0096\u0699\t"+ - "\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0005\u0097\u069e\b\u0097\n"+ - "\u0097\f\u0097\u06a1\t\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001"+ - "\u0098\u0001\u0098\u0003\u0098\u06a8\b\u0098\u0001\u0099\u0001\u0099\u0001"+ - "\u0099\u0003\u0099\u06ad\b\u0099\u0001\u0099\u0003\u0099\u06b0\b\u0099"+ - "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a"+ - "\u0003\u009a\u06b8\b\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b"+ - "\u0003\u009b\u06be\b\u009b\u0001\u009b\u0001\u009b\u0003\u009b\u06c2\b"+ - "\u009b\u0003\u009b\u06c4\b\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0003"+ - "\u009c\u06c9\b\u009c\u0001\u009c\u0001\u009c\u0003\u009c\u06cd\b\u009c"+ - "\u0001\u009c\u0001\u009c\u0003\u009c\u06d1\b\u009c\u0001\u009d\u0001\u009d"+ - "\u0001\u009d\u0001\u009e\u0001\u009e\u0003\u009e\u06d8\b\u009e\u0001\u009f"+ - "\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0"+ - "\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3"+ - "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4"+ - "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ - "\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06f5\b\u00a5\u0001\u00a5\u0001\u00a5"+ - "\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ - "\u0001\u00a7\u0003\u00a7\u0700\b\u00a7\u0001\u00a8\u0001\u00a8\u0003\u00a8"+ - "\u0704\b\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0005\u00a9"+ - "\u070a\b\u00a9\n\u00a9\f\u00a9\u070d\t\u00a9\u0001\u00a9\u0003\u00a9\u0710"+ - "\b\u00a9\u0003\u00a9\u0712\b\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa"+ - "\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0003\u00aa\u071a\b\u00aa\u0001\u00aa"+ - "\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ - "\u0003\u00ab\u0723\b\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac"+ - "\u0001\u00ac\u0001\u00ac\u0003\u00ac\u072b\b\u00ac\u0001\u00ad\u0001\u00ad"+ - "\u0001\u00ad\u0003\u00ad\u0730\b\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00af"+ - "\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1"+ - "\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0003\u00b2"+ - "\u0740\b\u00b2\u0003\u00b2\u0742\b\u00b2\u0001\u00b2\u0001\u00b2\u0001"+ - "\u00b3\u0001\u00b3\u0001\u00b3\u0005\u00b3\u0749\b\u00b3\n\u00b3\f\u00b3"+ - "\u074c\t\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0003\u00b4\u0751\b"+ - "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0003\u00b5\u0757"+ - "\b\u00b5\u0001\u00b6\u0001\u00b6\u0003\u00b6\u075b\b\u00b6\u0001\u00b7"+ - "\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0005\u00b7\u0762\b\u00b7"+ - "\n\u00b7\f\u00b7\u0765\t\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001"+ - "\u00b8\u0001\u00b9\u0003\u00b9\u076c\b\u00b9\u0001\u00b9\u0001\u00b9\u0001"+ - "\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001"+ - "\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001"+ - "\u00bc\u0001\u00bc\u0003\u00bc\u077e\b\u00bc\u0003\u00bc\u0780\b\u00bc"+ - "\u0001\u00bc\u0003\u00bc\u0783\b\u00bc\u0001\u00bc\u0003\u00bc\u0786\b"+ - "\u00bc\u0003\u00bc\u0788\b\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001"+ - "\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00bf\u0001"+ - "\u00bf\u0001\u00bf\u0001\u00bf\u0003\u00bf\u0796\b\u00bf\u0001\u00bf\u0001"+ - "\u031b\u0002\u00b4\u00c4\u00c0\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ - "\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPR"+ - "TVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e"+ - "\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6"+ - "\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be"+ - "\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6"+ - "\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee"+ - "\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106"+ - "\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e"+ - "\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136"+ - "\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c\u014e"+ - "\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166"+ - "\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u017a\u017c\u017e"+ - "\u0000\u0014\u0002\u0000iitt\u0001\u0000\u0017\u0018\u0001\u0000\u0005"+ - "\b\u0001\u0000BC\u0001\u0000(*\u0002\u0000(*,,\u0002\u0000jkqq\u0001\u0000"+ - "\u0087\u008d\u0001\u0000\u0014\u0015\u0002\u0000\u0082\u0086\u008b\u008c"+ - "\u0004\u0000##uu\u0081\u0081\u0088\u008a\u0001\u0000\u001f!\u0001\u0000"+ - "\u001c\u001e\u0002\u0000IJ{\u0080\u0004\u0000..1144aa\u0002\u0000\u0081"+ - "\u0086\u0088\u008c\u0001\u0000uv\u0002\u0000rr\u00a3\u00a3\u0002\u0000"+ - "\u008e\u0091\u0093\u0094\u0001\u0000\u009a\u009b\u0806\u0000\u0180\u0001"+ - "\u0000\u0000\u0000\u0002\u0183\u0001\u0000\u0000\u0000\u0004\u0186\u0001"+ - "\u0000\u0000\u0000\u0006\u0189\u0001\u0000\u0000\u0000\b\u0191\u0001\u0000"+ - "\u0000\u0000\n\u019a\u0001\u0000\u0000\u0000\f\u01ba\u0001\u0000\u0000"+ - "\u0000\u000e\u01c7\u0001\u0000\u0000\u0000\u0010\u01ca\u0001\u0000\u0000"+ - "\u0000\u0012\u01d2\u0001\u0000\u0000\u0000\u0014\u01df\u0001\u0000\u0000"+ - "\u0000\u0016\u01f5\u0001\u0000\u0000\u0000\u0018\u01fe\u0001\u0000\u0000"+ - "\u0000\u001a\u0200\u0001\u0000\u0000\u0000\u001c\u0202\u0001\u0000\u0000"+ - "\u0000\u001e\u0205\u0001\u0000\u0000\u0000 \u0219\u0001\u0000\u0000\u0000"+ - "\"\u021b\u0001\u0000\u0000\u0000$\u021d\u0001\u0000\u0000\u0000&\u0222"+ - "\u0001\u0000\u0000\u0000(\u022d\u0001\u0000\u0000\u0000*\u023a\u0001\u0000"+ - "\u0000\u0000,\u023d\u0001\u0000\u0000\u0000.\u0248\u0001\u0000\u0000\u0000"+ - "0\u024a\u0001\u0000\u0000\u00002\u024f\u0001\u0000\u0000\u00004\u0254"+ - "\u0001\u0000\u0000\u00006\u0259\u0001\u0000\u0000\u00008\u025e\u0001\u0000"+ - "\u0000\u0000:\u026b\u0001\u0000\u0000\u0000<\u026d\u0001\u0000\u0000\u0000"+ - ">\u026f\u0001\u0000\u0000\u0000@\u0274\u0001\u0000\u0000\u0000B\u0279"+ - "\u0001\u0000\u0000\u0000D\u027e\u0001\u0000\u0000\u0000F\u0287\u0001\u0000"+ - "\u0000\u0000H\u028e\u0001\u0000\u0000\u0000J\u029b\u0001\u0000\u0000\u0000"+ - "L\u029f\u0001\u0000\u0000\u0000N\u02aa\u0001\u0000\u0000\u0000P\u02b3"+ - "\u0001\u0000\u0000\u0000R\u02b5\u0001\u0000\u0000\u0000T\u02ca\u0001\u0000"+ - "\u0000\u0000V\u02cc\u0001\u0000\u0000\u0000X\u02d8\u0001\u0000\u0000\u0000"+ - "Z\u02e5\u0001\u0000\u0000\u0000\\\u02e9\u0001\u0000\u0000\u0000^\u02ee"+ - "\u0001\u0000\u0000\u0000`\u02fd\u0001\u0000\u0000\u0000b\u030d\u0001\u0000"+ - "\u0000\u0000d\u031b\u0001\u0000\u0000\u0000f\u0326\u0001\u0000\u0000\u0000"+ - "h\u032a\u0001\u0000\u0000\u0000j\u0332\u0001\u0000\u0000\u0000l\u0339"+ - "\u0001\u0000\u0000\u0000n\u0341\u0001\u0000\u0000\u0000p\u0351\u0001\u0000"+ - "\u0000\u0000r\u0354\u0001\u0000\u0000\u0000t\u035c\u0001\u0000\u0000\u0000"+ - "v\u035e\u0001\u0000\u0000\u0000x\u0369\u0001\u0000\u0000\u0000z\u0371"+ - "\u0001\u0000\u0000\u0000|\u0380\u0001\u0000\u0000\u0000~\u0382\u0001\u0000"+ - "\u0000\u0000\u0080\u038a\u0001\u0000\u0000\u0000\u0082\u0398\u0001\u0000"+ - "\u0000\u0000\u0084\u03a4\u0001\u0000\u0000\u0000\u0086\u03ae\u0001\u0000"+ - "\u0000\u0000\u0088\u03b2\u0001\u0000\u0000\u0000\u008a\u03b8\u0001\u0000"+ - "\u0000\u0000\u008c\u03d0\u0001\u0000\u0000\u0000\u008e\u03d8\u0001\u0000"+ - "\u0000\u0000\u0090\u03e7\u0001\u0000\u0000\u0000\u0092\u03e9\u0001\u0000"+ - "\u0000\u0000\u0094\u03f0\u0001\u0000\u0000\u0000\u0096\u03f9\u0001\u0000"+ - "\u0000\u0000\u0098\u03fe\u0001\u0000\u0000\u0000\u009a\u0403\u0001\u0000"+ - "\u0000\u0000\u009c\u0409\u0001\u0000\u0000\u0000\u009e\u0410\u0001\u0000"+ - "\u0000\u0000\u00a0\u0415\u0001\u0000\u0000\u0000\u00a2\u041b\u0001\u0000"+ - "\u0000\u0000\u00a4\u0420\u0001\u0000\u0000\u0000\u00a6\u0427\u0001\u0000"+ - "\u0000\u0000\u00a8\u0431\u0001\u0000\u0000\u0000\u00aa\u0435\u0001\u0000"+ - "\u0000\u0000\u00ac\u0441\u0001\u0000\u0000\u0000\u00ae\u0444\u0001\u0000"+ - "\u0000\u0000\u00b0\u0448\u0001\u0000\u0000\u0000\u00b2\u044f\u0001\u0000"+ - "\u0000\u0000\u00b4\u0468\u0001\u0000\u0000\u0000\u00b6\u04a4\u0001\u0000"+ - "\u0000\u0000\u00b8\u04a6\u0001\u0000\u0000\u0000\u00ba\u04a9\u0001\u0000"+ - "\u0000\u0000\u00bc\u04ae\u0001\u0000\u0000\u0000\u00be\u04b7\u0001\u0000"+ - "\u0000\u0000\u00c0\u04c5\u0001\u0000\u0000\u0000\u00c2\u04cf\u0001\u0000"+ - "\u0000\u0000\u00c4\u04e1\u0001\u0000\u0000\u0000\u00c6\u04fc\u0001\u0000"+ - "\u0000\u0000\u00c8\u04ff\u0001\u0000\u0000\u0000\u00ca\u0507\u0001\u0000"+ - "\u0000\u0000\u00cc\u0510\u0001\u0000\u0000\u0000\u00ce\u0520\u0001\u0000"+ - "\u0000\u0000\u00d0\u0533\u0001\u0000\u0000\u0000\u00d2\u053c\u0001\u0000"+ - "\u0000\u0000\u00d4\u0547\u0001\u0000\u0000\u0000\u00d6\u0549\u0001\u0000"+ - "\u0000\u0000\u00d8\u054c\u0001\u0000\u0000\u0000\u00da\u0563\u0001\u0000"+ - "\u0000\u0000\u00dc\u0565\u0001\u0000\u0000\u0000\u00de\u056a\u0001\u0000"+ - "\u0000\u0000\u00e0\u057e\u0001\u0000\u0000\u0000\u00e2\u0580\u0001\u0000"+ - "\u0000\u0000\u00e4\u0582\u0001\u0000\u0000\u0000\u00e6\u0585\u0001\u0000"+ - "\u0000\u0000\u00e8\u058f\u0001\u0000\u0000\u0000\u00ea\u0599\u0001\u0000"+ - "\u0000\u0000\u00ec\u059c\u0001\u0000\u0000\u0000\u00ee\u05a1\u0001\u0000"+ - "\u0000\u0000\u00f0\u05a3\u0001\u0000\u0000\u0000\u00f2\u05b1\u0001\u0000"+ - "\u0000\u0000\u00f4\u05b9\u0001\u0000\u0000\u0000\u00f6\u05c1\u0001\u0000"+ - "\u0000\u0000\u00f8\u05c9\u0001\u0000\u0000\u0000\u00fa\u05d7\u0001\u0000"+ - "\u0000\u0000\u00fc\u05dd\u0001\u0000\u0000\u0000\u00fe\u05eb\u0001\u0000"+ - "\u0000\u0000\u0100\u05fd\u0001\u0000\u0000\u0000\u0102\u0606\u0001\u0000"+ - "\u0000\u0000\u0104\u0608\u0001\u0000\u0000\u0000\u0106\u060a\u0001\u0000"+ - "\u0000\u0000\u0108\u060e\u0001\u0000\u0000\u0000\u010a\u0611\u0001\u0000"+ - "\u0000\u0000\u010c\u0615\u0001\u0000\u0000\u0000\u010e\u0617\u0001\u0000"+ - "\u0000\u0000\u0110\u061c\u0001\u0000\u0000\u0000\u0112\u0620\u0001\u0000"+ - "\u0000\u0000\u0114\u0624\u0001\u0000\u0000\u0000\u0116\u0628\u0001\u0000"+ - "\u0000\u0000\u0118\u062b\u0001\u0000\u0000\u0000\u011a\u062d\u0001\u0000"+ - "\u0000\u0000\u011c\u0642\u0001\u0000\u0000\u0000\u011e\u0644\u0001\u0000"+ - "\u0000\u0000\u0120\u065a\u0001\u0000\u0000\u0000\u0122\u0662\u0001\u0000"+ - "\u0000\u0000\u0124\u0664\u0001\u0000\u0000\u0000\u0126\u067a\u0001\u0000"+ - "\u0000\u0000\u0128\u0682\u0001\u0000\u0000\u0000\u012a\u068a\u0001\u0000"+ - "\u0000\u0000\u012c\u068e\u0001\u0000\u0000\u0000\u012e\u069a\u0001\u0000"+ - "\u0000\u0000\u0130\u06a4\u0001\u0000\u0000\u0000\u0132\u06af\u0001\u0000"+ - "\u0000\u0000\u0134\u06b7\u0001\u0000\u0000\u0000\u0136\u06bb\u0001\u0000"+ - "\u0000\u0000\u0138\u06c8\u0001\u0000\u0000\u0000\u013a\u06d2\u0001\u0000"+ - "\u0000\u0000\u013c\u06d7\u0001\u0000\u0000\u0000\u013e\u06d9\u0001\u0000"+ - "\u0000\u0000\u0140\u06de\u0001\u0000\u0000\u0000\u0142\u06e0\u0001\u0000"+ - "\u0000\u0000\u0144\u06e2\u0001\u0000\u0000\u0000\u0146\u06e5\u0001\u0000"+ - "\u0000\u0000\u0148\u06e9\u0001\u0000\u0000\u0000\u014a\u06f4\u0001\u0000"+ - "\u0000\u0000\u014c\u06f8\u0001\u0000\u0000\u0000\u014e\u06ff\u0001\u0000"+ - "\u0000\u0000\u0150\u0703\u0001\u0000\u0000\u0000\u0152\u0705\u0001\u0000"+ - "\u0000\u0000\u0154\u0715\u0001\u0000\u0000\u0000\u0156\u0722\u0001\u0000"+ - "\u0000\u0000\u0158\u072a\u0001\u0000\u0000\u0000\u015a\u072f\u0001\u0000"+ - "\u0000\u0000\u015c\u0731\u0001\u0000\u0000\u0000\u015e\u0733\u0001\u0000"+ - "\u0000\u0000\u0160\u0735\u0001\u0000\u0000\u0000\u0162\u0739\u0001\u0000"+ - "\u0000\u0000\u0164\u073c\u0001\u0000\u0000\u0000\u0166\u0745\u0001\u0000"+ - "\u0000\u0000\u0168\u0750\u0001\u0000\u0000\u0000\u016a\u0756\u0001\u0000"+ - "\u0000\u0000\u016c\u075a\u0001\u0000\u0000\u0000\u016e\u075c\u0001\u0000"+ - "\u0000\u0000\u0170\u0768\u0001\u0000\u0000\u0000\u0172\u076b\u0001\u0000"+ - "\u0000\u0000\u0174\u076f\u0001\u0000\u0000\u0000\u0176\u0773\u0001\u0000"+ - "\u0000\u0000\u0178\u0778\u0001\u0000\u0000\u0000\u017a\u078b\u0001\u0000"+ - "\u0000\u0000\u017c\u078f\u0001\u0000\u0000\u0000\u017e\u0795\u0001\u0000"+ - "\u0000\u0000\u0180\u0181\u0003\u00b4Z\u0000\u0181\u0182\u0005\u0000\u0000"+ - "\u0001\u0182\u0001\u0001\u0000\u0000\u0000\u0183\u0184\u0003\u00b6[\u0000"+ - "\u0184\u0185\u0005\u0000\u0000\u0001\u0185\u0003\u0001\u0000\u0000\u0000"+ - "\u0186\u0187\u0003\u00d2i\u0000\u0187\u0188\u0005\u0000\u0000\u0001\u0188"+ - "\u0005\u0001\u0000\u0000\u0000\u0189\u018e\u0003\b\u0004\u0000\u018a\u018b"+ - "\u0005q\u0000\u0000\u018b\u018d\u0003\b\u0004\u0000\u018c\u018a\u0001"+ - "\u0000\u0000\u0000\u018d\u0190\u0001\u0000\u0000\u0000\u018e\u018c\u0001"+ - "\u0000\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000\u018f\u0007\u0001"+ - "\u0000\u0000\u0000\u0190\u018e\u0001\u0000\u0000\u0000\u0191\u0193\u0005"+ - "i\u0000\u0000\u0192\u0194\u0005=\u0000\u0000\u0193\u0192\u0001\u0000\u0000"+ - "\u0000\u0193\u0194\u0001\u0000\u0000\u0000\u0194\t\u0001\u0000\u0000\u0000"+ - "\u0195\u0196\u0003\u000e\u0007\u0000\u0196\u0197\u0003\u017e\u00bf\u0000"+ - "\u0197\u0199\u0001\u0000\u0000\u0000\u0198\u0195\u0001\u0000\u0000\u0000"+ - "\u0199\u019c\u0001\u0000\u0000\u0000\u019a\u0198\u0001\u0000\u0000\u0000"+ - "\u019a\u019b\u0001\u0000\u0000\u0000\u019b\u019d\u0001\u0000\u0000\u0000"+ - "\u019c\u019a\u0001\u0000\u0000\u0000\u019d\u019e\u0003\u00eau\u0000\u019e"+ - "\u01a4\u0003\u017e\u00bf\u0000\u019f\u01a0\u0003\u0014\n\u0000\u01a0\u01a1"+ - "\u0003\u017e\u00bf\u0000\u01a1\u01a3\u0001\u0000\u0000\u0000\u01a2\u019f"+ - "\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4\u01a2"+ - "\u0001\u0000\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5\u01b0"+ - "\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a7\u01ab"+ - "\u0003\u0098L\u0000\u01a8\u01ab\u0003\u00eew\u0000\u01a9\u01ab\u0003\u0016"+ - "\u000b\u0000\u01aa\u01a7\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001\u0000"+ - "\u0000\u0000\u01aa\u01a9\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000"+ - "\u0000\u0000\u01ac\u01ad\u0003\u017e\u00bf\u0000\u01ad\u01af\u0001\u0000"+ - "\u0000\u0000\u01ae\u01aa\u0001\u0000\u0000\u0000\u01af\u01b2\u0001\u0000"+ - "\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000\u0000\u01b0\u01b1\u0001\u0000"+ - "\u0000\u0000\u01b1\u01b3\u0001\u0000\u0000\u0000\u01b2\u01b0\u0001\u0000"+ - "\u0000\u0000\u01b3\u01b4\u0005\u0000\u0000\u0001\u01b4\u000b\u0001\u0000"+ - "\u0000\u0000\u01b5\u01b6\u0003\u000e\u0007\u0000\u01b6\u01b7\u0003\u017e"+ - "\u00bf\u0000\u01b7\u01b9\u0001\u0000\u0000\u0000\u01b8\u01b5\u0001\u0000"+ - "\u0000\u0000\u01b9\u01bc\u0001\u0000\u0000\u0000\u01ba\u01b8\u0001\u0000"+ - "\u0000\u0000\u01ba\u01bb\u0001\u0000\u0000\u0000\u01bb\u01bd\u0001\u0000"+ - "\u0000\u0000\u01bc\u01ba\u0001\u0000\u0000\u0000\u01bd\u01be\u0003\u00ea"+ - "u\u0000\u01be\u01c4\u0003\u017e\u00bf\u0000\u01bf\u01c0\u0003\u0014\n"+ - "\u0000\u01c0\u01c1\u0003\u017e\u00bf\u0000\u01c1\u01c3\u0001\u0000\u0000"+ - "\u0000\u01c2\u01bf\u0001\u0000\u0000\u0000\u01c3\u01c6\u0001\u0000\u0000"+ - "\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c4\u01c5\u0001\u0000\u0000"+ - "\u0000\u01c5\r\u0001\u0000\u0000\u0000\u01c6\u01c4\u0001\u0000\u0000\u0000"+ - "\u01c7\u01c8\u0005F\u0000\u0000\u01c8\u01c9\u0003\u00b4Z\u0000\u01c9\u000f"+ - "\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005G\u0000\u0000\u01cb\u01cc\u0003"+ - "\u00b4Z\u0000\u01cc\u0011\u0001\u0000\u0000\u0000\u01cd\u01ce\u0003\u0010"+ - "\b\u0000\u01ce\u01cf\u0003\u017e\u00bf\u0000\u01cf\u01d1\u0001\u0000\u0000"+ - "\u0000\u01d0\u01cd\u0001\u0000\u0000\u0000\u01d1\u01d4\u0001\u0000\u0000"+ - "\u0000\u01d2\u01d0\u0001\u0000\u0000\u0000\u01d2\u01d3\u0001\u0000\u0000"+ - "\u0000\u01d3\u01d6\u0001\u0000\u0000\u0000\u01d4\u01d2\u0001\u0000\u0000"+ - "\u0000\u01d5\u01d7\u0007\u0000\u0000\u0000\u01d6\u01d5\u0001\u0000\u0000"+ - "\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7\u01d8\u0001\u0000\u0000"+ - "\u0000\u01d8\u01d9\u0003\u00ecv\u0000\u01d9\u0013\u0001\u0000\u0000\u0000"+ - "\u01da\u01db\u0003\u0010\b\u0000\u01db\u01dc\u0003\u017e\u00bf\u0000\u01dc"+ - "\u01de\u0001\u0000\u0000\u0000\u01dd\u01da\u0001\u0000\u0000\u0000\u01de"+ - "\u01e1\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df"+ - "\u01e0\u0001\u0000\u0000\u0000\u01e0\u01ef\u0001\u0000\u0000\u0000\u01e1"+ - "\u01df\u0001\u0000\u0000\u0000\u01e2\u01e3\u0005e\u0000\u0000\u01e3\u01f0"+ - "\u0003\u0012\t\u0000\u01e4\u01e5\u0005e\u0000\u0000\u01e5\u01eb\u0005"+ - "j\u0000\u0000\u01e6\u01e7\u0003\u0012\t\u0000\u01e7\u01e8\u0003\u017e"+ - "\u00bf\u0000\u01e8\u01ea\u0001\u0000\u0000\u0000\u01e9\u01e6\u0001\u0000"+ - "\u0000\u0000\u01ea\u01ed\u0001\u0000\u0000\u0000\u01eb\u01e9\u0001\u0000"+ - "\u0000\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000\u01ec\u01ee\u0001\u0000"+ - "\u0000\u0000\u01ed\u01eb\u0001\u0000\u0000\u0000\u01ee\u01f0\u0005k\u0000"+ - "\u0000\u01ef\u01e2\u0001\u0000\u0000\u0000\u01ef\u01e4\u0001\u0000\u0000"+ - "\u0000\u01f0\u0015\u0001\u0000\u0000\u0000\u01f1\u01f6\u0003\u008aE\u0000"+ - "\u01f2\u01f6\u0003\u00a0P\u0000\u01f3\u01f6\u0003\u00a4R\u0000\u01f4\u01f6"+ - "\u0003\u009eO\u0000\u01f5\u01f1\u0001\u0000\u0000\u0000\u01f5\u01f2\u0001"+ - "\u0000\u0000\u0000\u01f5\u01f3\u0001\u0000\u0000\u0000\u01f5\u01f4\u0001"+ - "\u0000\u0000\u0000\u01f6\u0017\u0001\u0000\u0000\u0000\u01f7\u01f8\u0005"+ - "\u001b\u0000\u0000\u01f8\u01ff\u0003\u00b6[\u0000\u01f9\u01fa\u0007\u0001"+ - "\u0000\u0000\u01fa\u01ff\u0003.\u0017\u0000\u01fb\u01fc\u0007\u0002\u0000"+ - "\u0000\u01fc\u01ff\u0003\u00b4Z\u0000\u01fd\u01ff\u0003v;\u0000\u01fe"+ - "\u01f7\u0001\u0000\u0000\u0000\u01fe\u01f9\u0001\u0000\u0000\u0000\u01fe"+ - "\u01fb\u0001\u0000\u0000\u0000\u01fe\u01fd\u0001\u0000\u0000\u0000\u01ff"+ - "\u0019\u0001\u0000\u0000\u0000\u0200\u0201\u0003\u001c\u000e\u0000\u0201"+ - "\u001b\u0001\u0000\u0000\u0000\u0202\u0203\u0003d2\u0000\u0203\u0204\u0003"+ - "\u001e\u000f\u0000\u0204\u001d\u0001\u0000\u0000\u0000\u0205\u0206\u0005"+ - "E\u0000\u0000\u0206\u0208\u0005j\u0000\u0000\u0207\u0209\u0003\u0100\u0080"+ - "\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0208\u0209\u0001\u0000\u0000"+ - "\u0000\u0209\u020a\u0001\u0000\u0000\u0000\u020a\u020b\u0005k\u0000\u0000"+ - "\u020b\u001f\u0001\u0000\u0000\u0000\u020c\u021a\u0003F#\u0000\u020d\u021a"+ - "\u0003D\"\u0000\u020e\u021a\u0003B!\u0000\u020f\u021a\u0003$\u0012\u0000"+ - "\u0210\u021a\u0003@ \u0000\u0211\u021a\u00038\u001c\u0000\u0212\u021a"+ - "\u0003>\u001f\u0000\u0213\u021a\u00036\u001b\u0000\u0214\u021a\u00032"+ - "\u0019\u0000\u0215\u021a\u00030\u0018\u0000\u0216\u021a\u00034\u001a\u0000"+ - "\u0217\u021a\u0003\"\u0011\u0000\u0218\u021a\u0003H$\u0000\u0219\u020c"+ - "\u0001\u0000\u0000\u0000\u0219\u020d\u0001\u0000\u0000\u0000\u0219\u020e"+ - "\u0001\u0000\u0000\u0000\u0219\u020f\u0001\u0000\u0000\u0000\u0219\u0210"+ - "\u0001\u0000\u0000\u0000\u0219\u0211\u0001\u0000\u0000\u0000\u0219\u0212"+ - "\u0001\u0000\u0000\u0000\u0219\u0213\u0001\u0000\u0000\u0000\u0219\u0214"+ - "\u0001\u0000\u0000\u0000\u0219\u0215\u0001\u0000\u0000\u0000\u0219\u0216"+ - "\u0001\u0000\u0000\u0000\u0219\u0217\u0001\u0000\u0000\u0000\u0219\u0218"+ - "\u0001\u0000\u0000\u0000\u021a!\u0001\u0000\u0000\u0000\u021b\u021c\u0007"+ - "\u0003\u0000\u0000\u021c#\u0001\u0000\u0000\u0000\u021d\u021e\u0005b\u0000"+ - "\u0000\u021e\u021f\u0005n\u0000\u0000\u021f\u0220\u0003\u00d2i\u0000\u0220"+ - "\u0221\u0005o\u0000\u0000\u0221%\u0001\u0000\u0000\u0000\u0222\u0227\u0003"+ - "(\u0014\u0000\u0223\u0224\u0005q\u0000\u0000\u0224\u0226\u0003(\u0014"+ - "\u0000\u0225\u0223\u0001\u0000\u0000\u0000\u0226\u0229\u0001\u0000\u0000"+ - "\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0228\u0001\u0000\u0000"+ - "\u0000\u0228\u022b\u0001\u0000\u0000\u0000\u0229\u0227\u0001\u0000\u0000"+ - "\u0000\u022a\u022c\u0005q\u0000\u0000\u022b\u022a\u0001\u0000\u0000\u0000"+ - "\u022b\u022c\u0001\u0000\u0000\u0000\u022c\'\u0001\u0000\u0000\u0000\u022d"+ - "\u0232\u0005i\u0000\u0000\u022e\u022f\u0005q\u0000\u0000\u022f\u0231\u0005"+ - "i\u0000\u0000\u0230\u022e\u0001\u0000\u0000\u0000\u0231\u0234\u0001\u0000"+ - "\u0000\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0232\u0233\u0001\u0000"+ - "\u0000\u0000\u0233\u0235\u0001\u0000\u0000\u0000\u0234\u0232\u0001\u0000"+ - "\u0000\u0000\u0235\u0236\u0003\u0142\u00a1\u0000\u0236)\u0001\u0000\u0000"+ - "\u0000\u0237\u0239\u0003,\u0016\u0000\u0238\u0237\u0001\u0000\u0000\u0000"+ - "\u0239\u023c\u0001\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000"+ - "\u023a\u023b\u0001\u0000\u0000\u0000\u023b+\u0001\u0000\u0000\u0000\u023c"+ - "\u023a\u0001\u0000\u0000\u0000\u023d\u023e\u0005l\u0000\u0000\u023e\u0243"+ - "\u0003\u00b4Z\u0000\u023f\u0240\u0005q\u0000\u0000\u0240\u0242\u0003\u00b4"+ - "Z\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0242\u0245\u0001\u0000\u0000"+ - "\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0243\u0244\u0001\u0000\u0000"+ - "\u0000\u0244\u0246\u0001\u0000\u0000\u0000\u0245\u0243\u0001\u0000\u0000"+ - "\u0000\u0246\u0247\u0005m\u0000\u0000\u0247-\u0001\u0000\u0000\u0000\u0248"+ - "\u0249\u0003\u00c4b\u0000\u0249/\u0001\u0000\u0000\u0000\u024a\u024b\u0005"+ - "2\u0000\u0000\u024b\u024c\u0005j\u0000\u0000\u024c\u024d\u0003\u00b4Z"+ - "\u0000\u024d\u024e\u0005k\u0000\u0000\u024e1\u0001\u0000\u0000\u0000\u024f"+ - "\u0250\u00058\u0000\u0000\u0250\u0251\u0005n\u0000\u0000\u0251\u0252\u0003"+ - "\u00d2i\u0000\u0252\u0253\u0005o\u0000\u0000\u02533\u0001\u0000\u0000"+ - "\u0000\u0254\u0255\u00053\u0000\u0000\u0255\u0256\u0005j\u0000\u0000\u0256"+ - "\u0257\u0003\u00b4Z\u0000\u0257\u0258\u0005k\u0000\u0000\u02585\u0001"+ - "\u0000\u0000\u0000\u0259\u025a\u0007\u0004\u0000\u0000\u025a\u025b\u0005"+ - "j\u0000\u0000\u025b\u025c\u0003\u00b4Z\u0000\u025c\u025d\u0005k\u0000"+ - "\u0000\u025d7\u0001\u0000\u0000\u0000\u025e\u0263\u0005\u0011\u0000\u0000"+ - "\u025f\u0260\u0005n\u0000\u0000\u0260\u0261\u0003:\u001d\u0000\u0261\u0262"+ - "\u0005o\u0000\u0000\u0262\u0264\u0001\u0000\u0000\u0000\u0263\u025f\u0001"+ - "\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000\u0000\u0264\u0265\u0001"+ - "\u0000\u0000\u0000\u0265\u0266\u0005j\u0000\u0000\u0266\u0267\u0003\u00b4"+ - "Z\u0000\u0267\u0268\u0005k\u0000\u0000\u02689\u0001\u0000\u0000\u0000"+ - "\u0269\u026c\u0003<\u001e\u0000\u026a\u026c\u0005\u0013\u0000\u0000\u026b"+ - "\u0269\u0001\u0000\u0000\u0000\u026b\u026a\u0001\u0000\u0000\u0000\u026c"+ - ";\u0001\u0000\u0000\u0000\u026d\u026e\u0005i\u0000\u0000\u026e=\u0001"+ - "\u0000\u0000\u0000\u026f\u0270\u0005\u0012\u0000\u0000\u0270\u0271\u0005"+ - "j\u0000\u0000\u0271\u0272\u0003\u00b4Z\u0000\u0272\u0273\u0005k\u0000"+ - "\u0000\u0273?\u0001\u0000\u0000\u0000\u0274\u0275\u0005;\u0000\u0000\u0275"+ - "\u0276\u0005j\u0000\u0000\u0276\u0277\u0003\u00b4Z\u0000\u0277\u0278\u0005"+ - "k\u0000\u0000\u0278A\u0001\u0000\u0000\u0000\u0279\u027a\u0005:\u0000"+ - "\u0000\u027a\u027b\u0005j\u0000\u0000\u027b\u027c\u0003\u00b4Z\u0000\u027c"+ - "\u027d\u0005k\u0000\u0000\u027dC\u0001\u0000\u0000\u0000\u027e\u027f\u0005"+ - "\u0016\u0000\u0000\u027f\u0280\u0005j\u0000\u0000\u0280\u0283\u0003\u00b4"+ - "Z\u0000\u0281\u0282\u0005q\u0000\u0000\u0282\u0284\u0003\u00b4Z\u0000"+ - "\u0283\u0281\u0001\u0000\u0000\u0000\u0283\u0284\u0001\u0000\u0000\u0000"+ - "\u0284\u0285\u0001\u0000\u0000\u0000\u0285\u0286\u0005k\u0000\u0000\u0286"+ - "E\u0001\u0000\u0000\u0000\u0287\u0288\u0007\u0004\u0000\u0000\u0288\u0289"+ - "\u0005n\u0000\u0000\u0289\u028a\u0003\u00b4Z\u0000\u028a\u028b\u0005>"+ - "\u0000\u0000\u028b\u028c\u0003\u00b4Z\u0000\u028c\u028d\u0005o\u0000\u0000"+ - "\u028dG\u0001\u0000\u0000\u0000\u028e\u028f\u00057\u0000\u0000\u028f\u0290"+ - "\u0003\u00b4Z\u0000\u0290\u0296\u0005l\u0000\u0000\u0291\u0292\u0003J"+ - "%\u0000\u0292\u0293\u0003\u017e\u00bf\u0000\u0293\u0295\u0001\u0000\u0000"+ + "b\u0001b\u0005b\u04f5\bb\nb\fb\u04f8\tb\u0001c\u0001c\u0001c\u0001d\u0001"+ + "d\u0003d\u04ff\bd\u0001d\u0001d\u0003d\u0503\bd\u0001e\u0001e\u0003e\u0507"+ + "\be\u0001e\u0003e\u050a\be\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001"+ + "f\u0003f\u0513\bf\u0001f\u0001f\u0005f\u0517\bf\nf\ff\u051a\tf\u0001f"+ + "\u0001f\u0001g\u0001g\u0001g\u0001g\u0001h\u0003h\u0523\bh\u0001h\u0001"+ + "h\u0001h\u0001h\u0001h\u0001h\u0003h\u052b\bh\u0001h\u0001h\u0001h\u0001"+ + "h\u0003h\u0531\bh\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0003"+ + "i\u053a\bi\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001"+ + "j\u0003j\u0545\bj\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0005"+ + "l\u054e\bl\nl\fl\u0551\tl\u0001l\u0003l\u0554\bl\u0003l\u0556\bl\u0001"+ + "l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0003m\u0561"+ + "\bm\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0003o\u056a\bo\u0001"+ + "o\u0001o\u0003o\u056e\bo\u0001o\u0003o\u0571\bo\u0001o\u0001o\u0001o\u0001"+ + "o\u0001o\u0003o\u0578\bo\u0001o\u0001o\u0001p\u0001p\u0001q\u0001q\u0001"+ + "r\u0001r\u0001s\u0003s\u0583\bs\u0001s\u0001s\u0001t\u0001t\u0001t\u0001"+ + "t\u0001t\u0001t\u0003t\u058d\bt\u0001t\u0001t\u0001t\u0001t\u0003t\u0593"+ + "\bt\u0003t\u0595\bt\u0001u\u0001u\u0001u\u0001v\u0001v\u0001w\u0001w\u0001"+ + "w\u0003w\u059f\bw\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0005x\u05a7"+ + "\bx\nx\fx\u05aa\tx\u0001x\u0003x\u05ad\bx\u0001y\u0001y\u0003y\u05b1\b"+ + "y\u0001y\u0001y\u0003y\u05b5\by\u0001z\u0001z\u0001z\u0005z\u05ba\bz\n"+ + "z\fz\u05bd\tz\u0001{\u0001{\u0001{\u0005{\u05c2\b{\n{\f{\u05c5\t{\u0001"+ + "|\u0001|\u0001|\u0001|\u0001|\u0001|\u0005|\u05cd\b|\n|\f|\u05d0\t|\u0001"+ + "|\u0003|\u05d3\b|\u0001}\u0001}\u0003}\u05d7\b}\u0001}\u0001}\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0005~\u05e1\b~\n~\f~\u05e4\t~\u0001~\u0003"+ + "~\u05e7\b~\u0001\u007f\u0001\u007f\u0003\u007f\u05eb\b\u007f\u0001\u007f"+ + "\u0001\u007f\u0001\u0080\u0003\u0080\u05f0\b\u0080\u0001\u0080\u0003\u0080"+ + "\u05f3\b\u0080\u0001\u0080\u0003\u0080\u05f6\b\u0080\u0001\u0080\u0001"+ + "\u0080\u0001\u0080\u0004\u0080\u05fb\b\u0080\u000b\u0080\f\u0080\u05fc"+ + "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0003\u0081"+ + "\u0604\b\u0081\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083"+ + "\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085"+ + "\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087"+ + "\u0001\u0087\u0003\u0087\u0618\b\u0087\u0001\u0088\u0001\u0088\u0003\u0088"+ + "\u061c\b\u0088\u0001\u0089\u0001\u0089\u0003\u0089\u0620\b\u0089\u0001"+ + "\u008a\u0001\u008a\u0003\u008a\u0624\b\u008a\u0001\u008b\u0001\u008b\u0001"+ + "\u008b\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001"+ + "\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0003"+ + "\u008d\u0634\b\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0003"+ + "\u008d\u063a\b\u008d\u0003\u008d\u063c\b\u008d\u0001\u008e\u0001\u008e"+ + "\u0003\u008e\u0640\b\u008e\u0001\u008f\u0001\u008f\u0003\u008f\u0644\b"+ + "\u008f\u0001\u008f\u0003\u008f\u0647\b\u008f\u0001\u008f\u0001\u008f\u0003"+ + "\u008f\u064b\b\u008f\u0003\u008f\u064d\b\u008f\u0001\u008f\u0001\u008f"+ + "\u0005\u008f\u0651\b\u008f\n\u008f\f\u008f\u0654\t\u008f\u0001\u008f\u0001"+ + "\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u065b\b\u0090\u0001"+ + "\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u0660\b\u0091\u0001\u0092\u0001"+ + "\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001"+ + "\u0092\u0001\u0092\u0003\u0092\u066b\b\u0092\u0001\u0092\u0001\u0092\u0005"+ + "\u0092\u066f\b\u0092\n\u0092\f\u0092\u0672\t\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0093\u0001\u0093\u0003\u0093\u0678\b\u0093\u0001\u0093\u0001\u0093"+ + "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0003\u0094\u0683\b\u0094\u0001\u0095\u0001\u0095\u0001\u0095"+ + "\u0003\u0095\u0688\b\u0095\u0001\u0096\u0001\u0096\u0003\u0096\u068c\b"+ + "\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0003\u0096\u0691\b\u0096\u0005"+ + "\u0096\u0693\b\u0096\n\u0096\f\u0096\u0696\t\u0096\u0001\u0097\u0001\u0097"+ + "\u0001\u0097\u0005\u0097\u069b\b\u0097\n\u0097\f\u0097\u069e\t\u0097\u0001"+ + "\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0003\u0098\u06a5"+ + "\b\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0003\u0099\u06aa\b\u0099"+ + "\u0001\u0099\u0003\u0099\u06ad\b\u0099\u0001\u009a\u0001\u009a\u0001\u009a"+ + "\u0001\u009a\u0001\u009a\u0001\u009a\u0003\u009a\u06b5\b\u009a\u0001\u009a"+ + "\u0001\u009a\u0001\u009b\u0001\u009b\u0003\u009b\u06bb\b\u009b\u0001\u009b"+ + "\u0001\u009b\u0003\u009b\u06bf\b\u009b\u0003\u009b\u06c1\b\u009b\u0001"+ + "\u009b\u0001\u009b\u0001\u009c\u0003\u009c\u06c6\b\u009c\u0001\u009c\u0001"+ + "\u009c\u0003\u009c\u06ca\b\u009c\u0001\u009c\u0001\u009c\u0003\u009c\u06ce"+ + "\b\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0003"+ + "\u009e\u06d5\b\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001"+ + "\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ + "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ + "\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06f2"+ + "\b\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001"+ + "\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0003\u00a7\u06fd\b\u00a7\u0001"+ + "\u00a8\u0001\u00a8\u0003\u00a8\u0701\b\u00a8\u0001\u00a9\u0001\u00a9\u0001"+ + "\u00a9\u0001\u00a9\u0005\u00a9\u0707\b\u00a9\n\u00a9\f\u00a9\u070a\t\u00a9"+ + "\u0001\u00a9\u0003\u00a9\u070d\b\u00a9\u0003\u00a9\u070f\b\u00a9\u0001"+ + "\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0003"+ + "\u00aa\u0717\b\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ab\u0001\u00ab\u0003\u00ab\u0720\b\u00ab\u0001\u00ac\u0001"+ + "\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0003\u00ac\u0728"+ + "\b\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003\u00ad\u072d\b\u00ad"+ + "\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0"+ + "\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2"+ + "\u0001\u00b2\u0001\u00b2\u0003\u00b2\u073d\b\u00b2\u0003\u00b2\u073f\b"+ + "\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0005"+ + "\u00b3\u0746\b\u00b3\n\u00b3\f\u00b3\u0749\t\u00b3\u0001\u00b4\u0001\u00b4"+ + "\u0001\u00b4\u0003\u00b4\u074e\b\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5"+ + "\u0001\u00b5\u0003\u00b5\u0754\b\u00b5\u0001\u00b6\u0001\u00b6\u0003\u00b6"+ + "\u0758\b\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ + "\u0005\u00b7\u075f\b\u00b7\n\u00b7\f\u00b7\u0762\t\u00b7\u0001\u00b7\u0001"+ + "\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0003\u00b9\u0769\b\u00b9\u0001"+ + "\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001"+ + "\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001"+ + "\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0003\u00bc\u077b\b\u00bc\u0003"+ + "\u00bc\u077d\b\u00bc\u0001\u00bc\u0003\u00bc\u0780\b\u00bc\u0001\u00bc"+ + "\u0003\u00bc\u0783\b\u00bc\u0003\u00bc\u0785\b\u00bc\u0001\u00bc\u0001"+ + "\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001"+ + "\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0003\u00bf\u0793"+ + "\b\u00bf\u0001\u00bf\u0001\u0318\u0002\u00b4\u00c4\u00c0\u0000\u0002\u0004"+ + "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ + "$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086"+ + "\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e"+ + "\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6"+ + "\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce"+ + "\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6"+ + "\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe"+ + "\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116"+ + "\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e"+ + "\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146"+ + "\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e"+ + "\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176"+ + "\u0178\u017a\u017c\u017e\u0000\u0014\u0002\u0000iitt\u0001\u0000\u0017"+ + "\u0018\u0001\u0000\u0005\b\u0001\u0000BC\u0001\u0000(*\u0002\u0000(*,"+ + ",\u0002\u0000jkqq\u0001\u0000\u0087\u008d\u0001\u0000\u0014\u0015\u0002"+ + "\u0000\u0082\u0086\u008b\u008c\u0004\u0000##uu\u0081\u0081\u0088\u008a"+ + "\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000IJ{\u0080\u0004"+ + "\u0000..1144aa\u0002\u0000\u0081\u0086\u0088\u008c\u0001\u0000uv\u0002"+ + "\u0000rr\u00a3\u00a3\u0002\u0000\u008e\u0091\u0093\u0094\u0001\u0000\u009a"+ + "\u009b\u0802\u0000\u0180\u0001\u0000\u0000\u0000\u0002\u0183\u0001\u0000"+ + "\u0000\u0000\u0004\u0186\u0001\u0000\u0000\u0000\u0006\u0189\u0001\u0000"+ + "\u0000\u0000\b\u0191\u0001\u0000\u0000\u0000\n\u019a\u0001\u0000\u0000"+ + "\u0000\f\u01ba\u0001\u0000\u0000\u0000\u000e\u01c7\u0001\u0000\u0000\u0000"+ + "\u0010\u01ca\u0001\u0000\u0000\u0000\u0012\u01d2\u0001\u0000\u0000\u0000"+ + "\u0014\u01df\u0001\u0000\u0000\u0000\u0016\u01f5\u0001\u0000\u0000\u0000"+ + "\u0018\u01fe\u0001\u0000\u0000\u0000\u001a\u0200\u0001\u0000\u0000\u0000"+ + "\u001c\u0202\u0001\u0000\u0000\u0000\u001e\u0205\u0001\u0000\u0000\u0000"+ + " \u0219\u0001\u0000\u0000\u0000\"\u021b\u0001\u0000\u0000\u0000$\u021d"+ + "\u0001\u0000\u0000\u0000&\u0222\u0001\u0000\u0000\u0000(\u022d\u0001\u0000"+ + "\u0000\u0000*\u023a\u0001\u0000\u0000\u0000,\u023d\u0001\u0000\u0000\u0000"+ + ".\u0248\u0001\u0000\u0000\u00000\u024a\u0001\u0000\u0000\u00002\u024f"+ + "\u0001\u0000\u0000\u00004\u0254\u0001\u0000\u0000\u00006\u0259\u0001\u0000"+ + "\u0000\u00008\u025e\u0001\u0000\u0000\u0000:\u026b\u0001\u0000\u0000\u0000"+ + "<\u026d\u0001\u0000\u0000\u0000>\u026f\u0001\u0000\u0000\u0000@\u0274"+ + "\u0001\u0000\u0000\u0000B\u0279\u0001\u0000\u0000\u0000D\u027e\u0001\u0000"+ + "\u0000\u0000F\u0287\u0001\u0000\u0000\u0000H\u028e\u0001\u0000\u0000\u0000"+ + "J\u029b\u0001\u0000\u0000\u0000L\u029f\u0001\u0000\u0000\u0000N\u02aa"+ + "\u0001\u0000\u0000\u0000P\u02b3\u0001\u0000\u0000\u0000R\u02b5\u0001\u0000"+ + "\u0000\u0000T\u02ca\u0001\u0000\u0000\u0000V\u02cc\u0001\u0000\u0000\u0000"+ + "X\u02d8\u0001\u0000\u0000\u0000Z\u02e5\u0001\u0000\u0000\u0000\\\u02e9"+ + "\u0001\u0000\u0000\u0000^\u02ee\u0001\u0000\u0000\u0000`\u02f4\u0001\u0000"+ + "\u0000\u0000b\u030a\u0001\u0000\u0000\u0000d\u0318\u0001\u0000\u0000\u0000"+ + "f\u0323\u0001\u0000\u0000\u0000h\u0327\u0001\u0000\u0000\u0000j\u032f"+ + "\u0001\u0000\u0000\u0000l\u0336\u0001\u0000\u0000\u0000n\u033e\u0001\u0000"+ + "\u0000\u0000p\u034e\u0001\u0000\u0000\u0000r\u0351\u0001\u0000\u0000\u0000"+ + "t\u0359\u0001\u0000\u0000\u0000v\u035b\u0001\u0000\u0000\u0000x\u0366"+ + "\u0001\u0000\u0000\u0000z\u036e\u0001\u0000\u0000\u0000|\u037d\u0001\u0000"+ + "\u0000\u0000~\u037f\u0001\u0000\u0000\u0000\u0080\u0387\u0001\u0000\u0000"+ + "\u0000\u0082\u0395\u0001\u0000\u0000\u0000\u0084\u03a1\u0001\u0000\u0000"+ + "\u0000\u0086\u03ab\u0001\u0000\u0000\u0000\u0088\u03af\u0001\u0000\u0000"+ + "\u0000\u008a\u03b5\u0001\u0000\u0000\u0000\u008c\u03cd\u0001\u0000\u0000"+ + "\u0000\u008e\u03d5\u0001\u0000\u0000\u0000\u0090\u03e4\u0001\u0000\u0000"+ + "\u0000\u0092\u03e6\u0001\u0000\u0000\u0000\u0094\u03ed\u0001\u0000\u0000"+ + "\u0000\u0096\u03f6\u0001\u0000\u0000\u0000\u0098\u03fb\u0001\u0000\u0000"+ + "\u0000\u009a\u0400\u0001\u0000\u0000\u0000\u009c\u0406\u0001\u0000\u0000"+ + "\u0000\u009e\u040d\u0001\u0000\u0000\u0000\u00a0\u0412\u0001\u0000\u0000"+ + "\u0000\u00a2\u0418\u0001\u0000\u0000\u0000\u00a4\u041d\u0001\u0000\u0000"+ + "\u0000\u00a6\u0424\u0001\u0000\u0000\u0000\u00a8\u042e\u0001\u0000\u0000"+ + "\u0000\u00aa\u0432\u0001\u0000\u0000\u0000\u00ac\u043e\u0001\u0000\u0000"+ + "\u0000\u00ae\u0441\u0001\u0000\u0000\u0000\u00b0\u0445\u0001\u0000\u0000"+ + "\u0000\u00b2\u044c\u0001\u0000\u0000\u0000\u00b4\u0465\u0001\u0000\u0000"+ + "\u0000\u00b6\u04a1\u0001\u0000\u0000\u0000\u00b8\u04a3\u0001\u0000\u0000"+ + "\u0000\u00ba\u04a6\u0001\u0000\u0000\u0000\u00bc\u04ab\u0001\u0000\u0000"+ + "\u0000\u00be\u04b4\u0001\u0000\u0000\u0000\u00c0\u04c2\u0001\u0000\u0000"+ + "\u0000\u00c2\u04cc\u0001\u0000\u0000\u0000\u00c4\u04de\u0001\u0000\u0000"+ + "\u0000\u00c6\u04f9\u0001\u0000\u0000\u0000\u00c8\u04fc\u0001\u0000\u0000"+ + "\u0000\u00ca\u0504\u0001\u0000\u0000\u0000\u00cc\u050d\u0001\u0000\u0000"+ + "\u0000\u00ce\u051d\u0001\u0000\u0000\u0000\u00d0\u0530\u0001\u0000\u0000"+ + "\u0000\u00d2\u0539\u0001\u0000\u0000\u0000\u00d4\u0544\u0001\u0000\u0000"+ + "\u0000\u00d6\u0546\u0001\u0000\u0000\u0000\u00d8\u0549\u0001\u0000\u0000"+ + "\u0000\u00da\u0560\u0001\u0000\u0000\u0000\u00dc\u0562\u0001\u0000\u0000"+ + "\u0000\u00de\u0567\u0001\u0000\u0000\u0000\u00e0\u057b\u0001\u0000\u0000"+ + "\u0000\u00e2\u057d\u0001\u0000\u0000\u0000\u00e4\u057f\u0001\u0000\u0000"+ + "\u0000\u00e6\u0582\u0001\u0000\u0000\u0000\u00e8\u058c\u0001\u0000\u0000"+ + "\u0000\u00ea\u0596\u0001\u0000\u0000\u0000\u00ec\u0599\u0001\u0000\u0000"+ + "\u0000\u00ee\u059e\u0001\u0000\u0000\u0000\u00f0\u05a0\u0001\u0000\u0000"+ + "\u0000\u00f2\u05ae\u0001\u0000\u0000\u0000\u00f4\u05b6\u0001\u0000\u0000"+ + "\u0000\u00f6\u05be\u0001\u0000\u0000\u0000\u00f8\u05c6\u0001\u0000\u0000"+ + "\u0000\u00fa\u05d4\u0001\u0000\u0000\u0000\u00fc\u05da\u0001\u0000\u0000"+ + "\u0000\u00fe\u05e8\u0001\u0000\u0000\u0000\u0100\u05fa\u0001\u0000\u0000"+ + "\u0000\u0102\u0603\u0001\u0000\u0000\u0000\u0104\u0605\u0001\u0000\u0000"+ + "\u0000\u0106\u0607\u0001\u0000\u0000\u0000\u0108\u060b\u0001\u0000\u0000"+ + "\u0000\u010a\u060e\u0001\u0000\u0000\u0000\u010c\u0612\u0001\u0000\u0000"+ + "\u0000\u010e\u0614\u0001\u0000\u0000\u0000\u0110\u0619\u0001\u0000\u0000"+ + "\u0000\u0112\u061d\u0001\u0000\u0000\u0000\u0114\u0621\u0001\u0000\u0000"+ + "\u0000\u0116\u0625\u0001\u0000\u0000\u0000\u0118\u0628\u0001\u0000\u0000"+ + "\u0000\u011a\u062a\u0001\u0000\u0000\u0000\u011c\u063f\u0001\u0000\u0000"+ + "\u0000\u011e\u0641\u0001\u0000\u0000\u0000\u0120\u0657\u0001\u0000\u0000"+ + "\u0000\u0122\u065f\u0001\u0000\u0000\u0000\u0124\u0661\u0001\u0000\u0000"+ + "\u0000\u0126\u0677\u0001\u0000\u0000\u0000\u0128\u067f\u0001\u0000\u0000"+ + "\u0000\u012a\u0687\u0001\u0000\u0000\u0000\u012c\u068b\u0001\u0000\u0000"+ + "\u0000\u012e\u0697\u0001\u0000\u0000\u0000\u0130\u06a1\u0001\u0000\u0000"+ + "\u0000\u0132\u06ac\u0001\u0000\u0000\u0000\u0134\u06b4\u0001\u0000\u0000"+ + "\u0000\u0136\u06b8\u0001\u0000\u0000\u0000\u0138\u06c5\u0001\u0000\u0000"+ + "\u0000\u013a\u06cf\u0001\u0000\u0000\u0000\u013c\u06d4\u0001\u0000\u0000"+ + "\u0000\u013e\u06d6\u0001\u0000\u0000\u0000\u0140\u06db\u0001\u0000\u0000"+ + "\u0000\u0142\u06dd\u0001\u0000\u0000\u0000\u0144\u06df\u0001\u0000\u0000"+ + "\u0000\u0146\u06e2\u0001\u0000\u0000\u0000\u0148\u06e6\u0001\u0000\u0000"+ + "\u0000\u014a\u06f1\u0001\u0000\u0000\u0000\u014c\u06f5\u0001\u0000\u0000"+ + "\u0000\u014e\u06fc\u0001\u0000\u0000\u0000\u0150\u0700\u0001\u0000\u0000"+ + "\u0000\u0152\u0702\u0001\u0000\u0000\u0000\u0154\u0712\u0001\u0000\u0000"+ + "\u0000\u0156\u071f\u0001\u0000\u0000\u0000\u0158\u0727\u0001\u0000\u0000"+ + "\u0000\u015a\u072c\u0001\u0000\u0000\u0000\u015c\u072e\u0001\u0000\u0000"+ + "\u0000\u015e\u0730\u0001\u0000\u0000\u0000\u0160\u0732\u0001\u0000\u0000"+ + "\u0000\u0162\u0736\u0001\u0000\u0000\u0000\u0164\u0739\u0001\u0000\u0000"+ + "\u0000\u0166\u0742\u0001\u0000\u0000\u0000\u0168\u074d\u0001\u0000\u0000"+ + "\u0000\u016a\u0753\u0001\u0000\u0000\u0000\u016c\u0757\u0001\u0000\u0000"+ + "\u0000\u016e\u0759\u0001\u0000\u0000\u0000\u0170\u0765\u0001\u0000\u0000"+ + "\u0000\u0172\u0768\u0001\u0000\u0000\u0000\u0174\u076c\u0001\u0000\u0000"+ + "\u0000\u0176\u0770\u0001\u0000\u0000\u0000\u0178\u0775\u0001\u0000\u0000"+ + "\u0000\u017a\u0788\u0001\u0000\u0000\u0000\u017c\u078c\u0001\u0000\u0000"+ + "\u0000\u017e\u0792\u0001\u0000\u0000\u0000\u0180\u0181\u0003\u00b4Z\u0000"+ + "\u0181\u0182\u0005\u0000\u0000\u0001\u0182\u0001\u0001\u0000\u0000\u0000"+ + "\u0183\u0184\u0003\u00b6[\u0000\u0184\u0185\u0005\u0000\u0000\u0001\u0185"+ + "\u0003\u0001\u0000\u0000\u0000\u0186\u0187\u0003\u00d2i\u0000\u0187\u0188"+ + "\u0005\u0000\u0000\u0001\u0188\u0005\u0001\u0000\u0000\u0000\u0189\u018e"+ + "\u0003\b\u0004\u0000\u018a\u018b\u0005q\u0000\u0000\u018b\u018d\u0003"+ + "\b\u0004\u0000\u018c\u018a\u0001\u0000\u0000\u0000\u018d\u0190\u0001\u0000"+ + "\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000"+ + "\u0000\u0000\u018f\u0007\u0001\u0000\u0000\u0000\u0190\u018e\u0001\u0000"+ + "\u0000\u0000\u0191\u0193\u0005i\u0000\u0000\u0192\u0194\u0005=\u0000\u0000"+ + "\u0193\u0192\u0001\u0000\u0000\u0000\u0193\u0194\u0001\u0000\u0000\u0000"+ + "\u0194\t\u0001\u0000\u0000\u0000\u0195\u0196\u0003\u000e\u0007\u0000\u0196"+ + "\u0197\u0003\u017e\u00bf\u0000\u0197\u0199\u0001\u0000\u0000\u0000\u0198"+ + "\u0195\u0001\u0000\u0000\u0000\u0199\u019c\u0001\u0000\u0000\u0000\u019a"+ + "\u0198\u0001\u0000\u0000\u0000\u019a\u019b\u0001\u0000\u0000\u0000\u019b"+ + "\u019d\u0001\u0000\u0000\u0000\u019c\u019a\u0001\u0000\u0000\u0000\u019d"+ + "\u019e\u0003\u00eau\u0000\u019e\u01a4\u0003\u017e\u00bf\u0000\u019f\u01a0"+ + "\u0003\u0014\n\u0000\u01a0\u01a1\u0003\u017e\u00bf\u0000\u01a1\u01a3\u0001"+ + "\u0000\u0000\u0000\u01a2\u019f\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001"+ + "\u0000\u0000\u0000\u01a4\u01a2\u0001\u0000\u0000\u0000\u01a4\u01a5\u0001"+ + "\u0000\u0000\u0000\u01a5\u01b0\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001"+ + "\u0000\u0000\u0000\u01a7\u01ab\u0003\u0098L\u0000\u01a8\u01ab\u0003\u00ee"+ + "w\u0000\u01a9\u01ab\u0003\u0016\u000b\u0000\u01aa\u01a7\u0001\u0000\u0000"+ + "\u0000\u01aa\u01a8\u0001\u0000\u0000\u0000\u01aa\u01a9\u0001\u0000\u0000"+ + "\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000\u01ac\u01ad\u0003\u017e\u00bf"+ + "\u0000\u01ad\u01af\u0001\u0000\u0000\u0000\u01ae\u01aa\u0001\u0000\u0000"+ + "\u0000\u01af\u01b2\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000"+ + "\u0000\u01b0\u01b1\u0001\u0000\u0000\u0000\u01b1\u01b3\u0001\u0000\u0000"+ + "\u0000\u01b2\u01b0\u0001\u0000\u0000\u0000\u01b3\u01b4\u0005\u0000\u0000"+ + "\u0001\u01b4\u000b\u0001\u0000\u0000\u0000\u01b5\u01b6\u0003\u000e\u0007"+ + "\u0000\u01b6\u01b7\u0003\u017e\u00bf\u0000\u01b7\u01b9\u0001\u0000\u0000"+ + "\u0000\u01b8\u01b5\u0001\u0000\u0000\u0000\u01b9\u01bc\u0001\u0000\u0000"+ + "\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01ba\u01bb\u0001\u0000\u0000"+ + "\u0000\u01bb\u01bd\u0001\u0000\u0000\u0000\u01bc\u01ba\u0001\u0000\u0000"+ + "\u0000\u01bd\u01be\u0003\u00eau\u0000\u01be\u01c4\u0003\u017e\u00bf\u0000"+ + "\u01bf\u01c0\u0003\u0014\n\u0000\u01c0\u01c1\u0003\u017e\u00bf\u0000\u01c1"+ + "\u01c3\u0001\u0000\u0000\u0000\u01c2\u01bf\u0001\u0000\u0000\u0000\u01c3"+ + "\u01c6\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c4"+ + "\u01c5\u0001\u0000\u0000\u0000\u01c5\r\u0001\u0000\u0000\u0000\u01c6\u01c4"+ + "\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005F\u0000\u0000\u01c8\u01c9\u0003"+ + "\u00b4Z\u0000\u01c9\u000f\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005G\u0000"+ + "\u0000\u01cb\u01cc\u0003\u00b4Z\u0000\u01cc\u0011\u0001\u0000\u0000\u0000"+ + "\u01cd\u01ce\u0003\u0010\b\u0000\u01ce\u01cf\u0003\u017e\u00bf\u0000\u01cf"+ + "\u01d1\u0001\u0000\u0000\u0000\u01d0\u01cd\u0001\u0000\u0000\u0000\u01d1"+ + "\u01d4\u0001\u0000\u0000\u0000\u01d2\u01d0\u0001\u0000\u0000\u0000\u01d2"+ + "\u01d3\u0001\u0000\u0000\u0000\u01d3\u01d6\u0001\u0000\u0000\u0000\u01d4"+ + "\u01d2\u0001\u0000\u0000\u0000\u01d5\u01d7\u0007\u0000\u0000\u0000\u01d6"+ + "\u01d5\u0001\u0000\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7"+ + "\u01d8\u0001\u0000\u0000\u0000\u01d8\u01d9\u0003\u00ecv\u0000\u01d9\u0013"+ + "\u0001\u0000\u0000\u0000\u01da\u01db\u0003\u0010\b\u0000\u01db\u01dc\u0003"+ + "\u017e\u00bf\u0000\u01dc\u01de\u0001\u0000\u0000\u0000\u01dd\u01da\u0001"+ + "\u0000\u0000\u0000\u01de\u01e1\u0001\u0000\u0000\u0000\u01df\u01dd\u0001"+ + "\u0000\u0000\u0000\u01df\u01e0\u0001\u0000\u0000\u0000\u01e0\u01ef\u0001"+ + "\u0000\u0000\u0000\u01e1\u01df\u0001\u0000\u0000\u0000\u01e2\u01e3\u0005"+ + "e\u0000\u0000\u01e3\u01f0\u0003\u0012\t\u0000\u01e4\u01e5\u0005e\u0000"+ + "\u0000\u01e5\u01eb\u0005j\u0000\u0000\u01e6\u01e7\u0003\u0012\t\u0000"+ + "\u01e7\u01e8\u0003\u017e\u00bf\u0000\u01e8\u01ea\u0001\u0000\u0000\u0000"+ + "\u01e9\u01e6\u0001\u0000\u0000\u0000\u01ea\u01ed\u0001\u0000\u0000\u0000"+ + "\u01eb\u01e9\u0001\u0000\u0000\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000"+ + "\u01ec\u01ee\u0001\u0000\u0000\u0000\u01ed\u01eb\u0001\u0000\u0000\u0000"+ + "\u01ee\u01f0\u0005k\u0000\u0000\u01ef\u01e2\u0001\u0000\u0000\u0000\u01ef"+ + "\u01e4\u0001\u0000\u0000\u0000\u01f0\u0015\u0001\u0000\u0000\u0000\u01f1"+ + "\u01f6\u0003\u008aE\u0000\u01f2\u01f6\u0003\u00a0P\u0000\u01f3\u01f6\u0003"+ + "\u00a4R\u0000\u01f4\u01f6\u0003\u009eO\u0000\u01f5\u01f1\u0001\u0000\u0000"+ + "\u0000\u01f5\u01f2\u0001\u0000\u0000\u0000\u01f5\u01f3\u0001\u0000\u0000"+ + "\u0000\u01f5\u01f4\u0001\u0000\u0000\u0000\u01f6\u0017\u0001\u0000\u0000"+ + "\u0000\u01f7\u01f8\u0005\u001b\u0000\u0000\u01f8\u01ff\u0003\u00b6[\u0000"+ + "\u01f9\u01fa\u0007\u0001\u0000\u0000\u01fa\u01ff\u0003.\u0017\u0000\u01fb"+ + "\u01fc\u0007\u0002\u0000\u0000\u01fc\u01ff\u0003\u00b4Z\u0000\u01fd\u01ff"+ + "\u0003v;\u0000\u01fe\u01f7\u0001\u0000\u0000\u0000\u01fe\u01f9\u0001\u0000"+ + "\u0000\u0000\u01fe\u01fb\u0001\u0000\u0000\u0000\u01fe\u01fd\u0001\u0000"+ + "\u0000\u0000\u01ff\u0019\u0001\u0000\u0000\u0000\u0200\u0201\u0003\u001c"+ + "\u000e\u0000\u0201\u001b\u0001\u0000\u0000\u0000\u0202\u0203\u0003d2\u0000"+ + "\u0203\u0204\u0003\u001e\u000f\u0000\u0204\u001d\u0001\u0000\u0000\u0000"+ + "\u0205\u0206\u0005E\u0000\u0000\u0206\u0208\u0005j\u0000\u0000\u0207\u0209"+ + "\u0003\u0100\u0080\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0208\u0209"+ + "\u0001\u0000\u0000\u0000\u0209\u020a\u0001\u0000\u0000\u0000\u020a\u020b"+ + "\u0005k\u0000\u0000\u020b\u001f\u0001\u0000\u0000\u0000\u020c\u021a\u0003"+ + "F#\u0000\u020d\u021a\u0003D\"\u0000\u020e\u021a\u0003B!\u0000\u020f\u021a"+ + "\u0003$\u0012\u0000\u0210\u021a\u0003@ \u0000\u0211\u021a\u00038\u001c"+ + "\u0000\u0212\u021a\u0003>\u001f\u0000\u0213\u021a\u00036\u001b\u0000\u0214"+ + "\u021a\u00032\u0019\u0000\u0215\u021a\u00030\u0018\u0000\u0216\u021a\u0003"+ + "4\u001a\u0000\u0217\u021a\u0003\"\u0011\u0000\u0218\u021a\u0003H$\u0000"+ + "\u0219\u020c\u0001\u0000\u0000\u0000\u0219\u020d\u0001\u0000\u0000\u0000"+ + "\u0219\u020e\u0001\u0000\u0000\u0000\u0219\u020f\u0001\u0000\u0000\u0000"+ + "\u0219\u0210\u0001\u0000\u0000\u0000\u0219\u0211\u0001\u0000\u0000\u0000"+ + "\u0219\u0212\u0001\u0000\u0000\u0000\u0219\u0213\u0001\u0000\u0000\u0000"+ + "\u0219\u0214\u0001\u0000\u0000\u0000\u0219\u0215\u0001\u0000\u0000\u0000"+ + "\u0219\u0216\u0001\u0000\u0000\u0000\u0219\u0217\u0001\u0000\u0000\u0000"+ + "\u0219\u0218\u0001\u0000\u0000\u0000\u021a!\u0001\u0000\u0000\u0000\u021b"+ + "\u021c\u0007\u0003\u0000\u0000\u021c#\u0001\u0000\u0000\u0000\u021d\u021e"+ + "\u0005b\u0000\u0000\u021e\u021f\u0005n\u0000\u0000\u021f\u0220\u0003\u00d2"+ + "i\u0000\u0220\u0221\u0005o\u0000\u0000\u0221%\u0001\u0000\u0000\u0000"+ + "\u0222\u0227\u0003(\u0014\u0000\u0223\u0224\u0005q\u0000\u0000\u0224\u0226"+ + "\u0003(\u0014\u0000\u0225\u0223\u0001\u0000\u0000\u0000\u0226\u0229\u0001"+ + "\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0228\u0001"+ + "\u0000\u0000\u0000\u0228\u022b\u0001\u0000\u0000\u0000\u0229\u0227\u0001"+ + "\u0000\u0000\u0000\u022a\u022c\u0005q\u0000\u0000\u022b\u022a\u0001\u0000"+ + "\u0000\u0000\u022b\u022c\u0001\u0000\u0000\u0000\u022c\'\u0001\u0000\u0000"+ + "\u0000\u022d\u0232\u0005i\u0000\u0000\u022e\u022f\u0005q\u0000\u0000\u022f"+ + "\u0231\u0005i\u0000\u0000\u0230\u022e\u0001\u0000\u0000\u0000\u0231\u0234"+ + "\u0001\u0000\u0000\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0232\u0233"+ + "\u0001\u0000\u0000\u0000\u0233\u0235\u0001\u0000\u0000\u0000\u0234\u0232"+ + "\u0001\u0000\u0000\u0000\u0235\u0236\u0003\u0142\u00a1\u0000\u0236)\u0001"+ + "\u0000\u0000\u0000\u0237\u0239\u0003,\u0016\u0000\u0238\u0237\u0001\u0000"+ + "\u0000\u0000\u0239\u023c\u0001\u0000\u0000\u0000\u023a\u0238\u0001\u0000"+ + "\u0000\u0000\u023a\u023b\u0001\u0000\u0000\u0000\u023b+\u0001\u0000\u0000"+ + "\u0000\u023c\u023a\u0001\u0000\u0000\u0000\u023d\u023e\u0005l\u0000\u0000"+ + "\u023e\u0243\u0003\u00b4Z\u0000\u023f\u0240\u0005q\u0000\u0000\u0240\u0242"+ + "\u0003\u00b4Z\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0242\u0245\u0001"+ + "\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0243\u0244\u0001"+ + "\u0000\u0000\u0000\u0244\u0246\u0001\u0000\u0000\u0000\u0245\u0243\u0001"+ + "\u0000\u0000\u0000\u0246\u0247\u0005m\u0000\u0000\u0247-\u0001\u0000\u0000"+ + "\u0000\u0248\u0249\u0003\u00c4b\u0000\u0249/\u0001\u0000\u0000\u0000\u024a"+ + "\u024b\u00052\u0000\u0000\u024b\u024c\u0005j\u0000\u0000\u024c\u024d\u0003"+ + "\u00b4Z\u0000\u024d\u024e\u0005k\u0000\u0000\u024e1\u0001\u0000\u0000"+ + "\u0000\u024f\u0250\u00058\u0000\u0000\u0250\u0251\u0005n\u0000\u0000\u0251"+ + "\u0252\u0003\u00d2i\u0000\u0252\u0253\u0005o\u0000\u0000\u02533\u0001"+ + "\u0000\u0000\u0000\u0254\u0255\u00053\u0000\u0000\u0255\u0256\u0005j\u0000"+ + "\u0000\u0256\u0257\u0003\u00b4Z\u0000\u0257\u0258\u0005k\u0000\u0000\u0258"+ + "5\u0001\u0000\u0000\u0000\u0259\u025a\u0007\u0004\u0000\u0000\u025a\u025b"+ + "\u0005j\u0000\u0000\u025b\u025c\u0003\u00b4Z\u0000\u025c\u025d\u0005k"+ + "\u0000\u0000\u025d7\u0001\u0000\u0000\u0000\u025e\u0263\u0005\u0011\u0000"+ + "\u0000\u025f\u0260\u0005n\u0000\u0000\u0260\u0261\u0003:\u001d\u0000\u0261"+ + "\u0262\u0005o\u0000\u0000\u0262\u0264\u0001\u0000\u0000\u0000\u0263\u025f"+ + "\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000\u0000\u0264\u0265"+ + "\u0001\u0000\u0000\u0000\u0265\u0266\u0005j\u0000\u0000\u0266\u0267\u0003"+ + "\u00b4Z\u0000\u0267\u0268\u0005k\u0000\u0000\u02689\u0001\u0000\u0000"+ + "\u0000\u0269\u026c\u0003<\u001e\u0000\u026a\u026c\u0005\u0013\u0000\u0000"+ + "\u026b\u0269\u0001\u0000\u0000\u0000\u026b\u026a\u0001\u0000\u0000\u0000"+ + "\u026c;\u0001\u0000\u0000\u0000\u026d\u026e\u0005i\u0000\u0000\u026e="+ + "\u0001\u0000\u0000\u0000\u026f\u0270\u0005\u0012\u0000\u0000\u0270\u0271"+ + "\u0005j\u0000\u0000\u0271\u0272\u0003\u00b4Z\u0000\u0272\u0273\u0005k"+ + "\u0000\u0000\u0273?\u0001\u0000\u0000\u0000\u0274\u0275\u0005;\u0000\u0000"+ + "\u0275\u0276\u0005j\u0000\u0000\u0276\u0277\u0003\u00b4Z\u0000\u0277\u0278"+ + "\u0005k\u0000\u0000\u0278A\u0001\u0000\u0000\u0000\u0279\u027a\u0005:"+ + "\u0000\u0000\u027a\u027b\u0005j\u0000\u0000\u027b\u027c\u0003\u00b4Z\u0000"+ + "\u027c\u027d\u0005k\u0000\u0000\u027dC\u0001\u0000\u0000\u0000\u027e\u027f"+ + "\u0005\u0016\u0000\u0000\u027f\u0280\u0005j\u0000\u0000\u0280\u0283\u0003"+ + "\u00b4Z\u0000\u0281\u0282\u0005q\u0000\u0000\u0282\u0284\u0003\u00b4Z"+ + "\u0000\u0283\u0281\u0001\u0000\u0000\u0000\u0283\u0284\u0001\u0000\u0000"+ + "\u0000\u0284\u0285\u0001\u0000\u0000\u0000\u0285\u0286\u0005k\u0000\u0000"+ + "\u0286E\u0001\u0000\u0000\u0000\u0287\u0288\u0007\u0004\u0000\u0000\u0288"+ + "\u0289\u0005n\u0000\u0000\u0289\u028a\u0003\u00b4Z\u0000\u028a\u028b\u0005"+ + ">\u0000\u0000\u028b\u028c\u0003\u00b4Z\u0000\u028c\u028d\u0005o\u0000"+ + "\u0000\u028dG\u0001\u0000\u0000\u0000\u028e\u028f\u00057\u0000\u0000\u028f"+ + "\u0290\u0003\u00b4Z\u0000\u0290\u0296\u0005l\u0000\u0000\u0291\u0292\u0003"+ + "J%\u0000\u0292\u0293\u0003\u017e\u00bf\u0000\u0293\u0295\u0001\u0000\u0000"+ "\u0000\u0294\u0291\u0001\u0000\u0000\u0000\u0295\u0298\u0001\u0000\u0000"+ "\u0000\u0296\u0294\u0001\u0000\u0000\u0000\u0296\u0297\u0001\u0000\u0000"+ "\u0000\u0297\u0299\u0001\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000"+ @@ -14358,703 +14347,701 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0000\u0000\u02ee\u02ef\u0005-\u0000\u0000\u02ef\u02f0\u0005n\u0000\u0000"+ "\u02f0\u02f1\u0003\u0142\u00a1\u0000\u02f1\u02f2\u0005o\u0000\u0000\u02f2"+ "_\u0001\u0000\u0000\u0000\u02f3\u02f5\u0005\u001b\u0000\u0000\u02f4\u02f3"+ - "\u0001\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5\u02f6"+ + "\u0001\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5\u02fa"+ "\u0001\u0000\u0000\u0000\u02f6\u02f7\u0003\u00f4z\u0000\u02f7\u02f8\u0003"+ - "\u00d2i\u0000\u02f8\u02fe\u0001\u0000\u0000\u0000\u02f9\u02fb\u0005\u001b"+ - "\u0000\u0000\u02fa\u02f9\u0001\u0000\u0000\u0000\u02fa\u02fb\u0001\u0000"+ - "\u0000\u0000\u02fb\u02fc\u0001\u0000\u0000\u0000\u02fc\u02fe\u0003\u0172"+ - "\u00b9\u0000\u02fd\u02f4\u0001\u0000\u0000\u0000\u02fd\u02fa\u0001\u0000"+ - "\u0000\u0000\u02fe\u0300\u0001\u0000\u0000\u0000\u02ff\u0301\u0003\u0170"+ - "\u00b8\u0000\u0300\u02ff\u0001\u0000\u0000\u0000\u0300\u0301\u0001\u0000"+ - "\u0000\u0000\u0301a\u0001\u0000\u0000\u0000\u0302\u0303\u0007\u0005\u0000"+ - "\u0000\u0303\u0304\u0005n\u0000\u0000\u0304\u0305\u0003\u00d2i\u0000\u0305"+ - "\u0306\u0005o\u0000\u0000\u0306\u030e\u0001\u0000\u0000\u0000\u0307\u0308"+ - "\u0005+\u0000\u0000\u0308\u0309\u0005n\u0000\u0000\u0309\u030a\u0003\u00d2"+ - "i\u0000\u030a\u030b\u0005o\u0000\u0000\u030b\u030c\u0003\u00d2i\u0000"+ - "\u030c\u030e\u0001\u0000\u0000\u0000\u030d\u0302\u0001\u0000\u0000\u0000"+ - "\u030d\u0307\u0001\u0000\u0000\u0000\u030ec\u0001\u0000\u0000\u0000\u030f"+ - "\u0317\u0003p8\u0000\u0310\u0311\u0005L\u0000\u0000\u0311\u0317\u0006"+ - "2\uffff\uffff\u0000\u0312\u0313\u0005\u000e\u0000\u0000\u0313\u0317\u0006"+ - "2\uffff\uffff\u0000\u0314\u0315\u0005D\u0000\u0000\u0315\u0317\u00062"+ - "\uffff\uffff\u0000\u0316\u030f\u0001\u0000\u0000\u0000\u0316\u0310\u0001"+ - "\u0000\u0000\u0000\u0316\u0312\u0001\u0000\u0000\u0000\u0316\u0314\u0001"+ - "\u0000\u0000\u0000\u0317\u0318\u0001\u0000\u0000\u0000\u0318\u031a\u0003"+ - "\u017e\u00bf\u0000\u0319\u0316\u0001\u0000\u0000\u0000\u031a\u031d\u0001"+ - "\u0000\u0000\u0000\u031b\u031c\u0001\u0000\u0000\u0000\u031b\u0319\u0001"+ - "\u0000\u0000\u0000\u031c\u0320\u0001\u0000\u0000\u0000\u031d\u031b\u0001"+ - "\u0000\u0000\u0000\u031e\u031f\u0005\u000e\u0000\u0000\u031f\u0321\u0006"+ - "2\uffff\uffff\u0000\u0320\u031e\u0001\u0000\u0000\u0000\u0320\u0321\u0001"+ - "\u0000\u0000\u0000\u0321\u0323\u0001\u0000\u0000\u0000\u0322\u0324\u0003"+ - "n7\u0000\u0323\u0322\u0001\u0000\u0000\u0000\u0323\u0324\u0001\u0000\u0000"+ - "\u0000\u0324e\u0001\u0000\u0000\u0000\u0325\u0327\b\u0006\u0000\u0000"+ - "\u0326\u0325\u0001\u0000\u0000\u0000\u0327\u0328\u0001\u0000\u0000\u0000"+ - "\u0328\u0326\u0001\u0000\u0000\u0000\u0328\u0329\u0001\u0000\u0000\u0000"+ - "\u0329g\u0001\u0000\u0000\u0000\u032a\u032f\u0003f3\u0000\u032b\u032c"+ - "\u0005q\u0000\u0000\u032c\u032e\u0003f3\u0000\u032d\u032b\u0001\u0000"+ - "\u0000\u0000\u032e\u0331\u0001\u0000\u0000\u0000\u032f\u032d\u0001\u0000"+ - "\u0000\u0000\u032f\u0330\u0001\u0000\u0000\u0000\u0330i\u0001\u0000\u0000"+ - "\u0000\u0331\u032f\u0001\u0000\u0000\u0000\u0332\u0333\u0003f3\u0000\u0333"+ - "\u0335\u0005j\u0000\u0000\u0334\u0336\u0003h4\u0000\u0335\u0334\u0001"+ - "\u0000\u0000\u0000\u0335\u0336\u0001\u0000\u0000\u0000\u0336\u0337\u0001"+ - "\u0000\u0000\u0000\u0337\u0338\u0005k\u0000\u0000\u0338k\u0001\u0000\u0000"+ - "\u0000\u0339\u033e\u0003j5\u0000\u033a\u033b\u0005q\u0000\u0000\u033b"+ - "\u033d\u0003j5\u0000\u033c\u033a\u0001\u0000\u0000\u0000\u033d\u0340\u0001"+ - "\u0000\u0000\u0000\u033e\u033c\u0001\u0000\u0000\u0000\u033e\u033f\u0001"+ - "\u0000\u0000\u0000\u033fm\u0001\u0000\u0000\u0000\u0340\u033e\u0001\u0000"+ - "\u0000\u0000\u0341\u0342\u0005N\u0000\u0000\u0342\u0344\u0005n\u0000\u0000"+ - "\u0343\u0345\u0003l6\u0000\u0344\u0343\u0001\u0000\u0000\u0000\u0344\u0345"+ - "\u0001\u0000\u0000\u0000\u0345\u0346\u0001\u0000\u0000\u0000\u0346\u0347"+ - "\u0005o\u0000\u0000\u0347\u0348\u0003\u017e\u00bf\u0000\u0348o\u0001\u0000"+ - "\u0000\u0000\u0349\u034a\u0005\t\u0000\u0000\u034a\u0352\u0003t:\u0000"+ - "\u034b\u034c\u0005\n\u0000\u0000\u034c\u0352\u0003t:\u0000\u034d\u034e"+ - "\u0005\u000b\u0000\u0000\u034e\u0352\u0003t:\u0000\u034f\u0350\u0005\r"+ - "\u0000\u0000\u0350\u0352\u0003r9\u0000\u0351\u0349\u0001\u0000\u0000\u0000"+ - "\u0351\u034b\u0001\u0000\u0000\u0000\u0351\u034d\u0001\u0000\u0000\u0000"+ - "\u0351\u034f\u0001\u0000\u0000\u0000\u0352q\u0001\u0000\u0000\u0000\u0353"+ - "\u0355\u0003\u00f6{\u0000\u0354\u0353\u0001\u0000\u0000\u0000\u0354\u0355"+ - "\u0001\u0000\u0000\u0000\u0355\u0358\u0001\u0000\u0000\u0000\u0356\u0357"+ - "\u0005`\u0000\u0000\u0357\u0359\u0003\u00b4Z\u0000\u0358\u0356\u0001\u0000"+ - "\u0000\u0000\u0358\u0359\u0001\u0000\u0000\u0000\u0359s\u0001\u0000\u0000"+ - "\u0000\u035a\u035d\u0001\u0000\u0000\u0000\u035b\u035d\u0003\u00b4Z\u0000"+ - "\u035c\u035a\u0001\u0000\u0000\u0000\u035c\u035b\u0001\u0000\u0000\u0000"+ - "\u035du\u0001\u0000\u0000\u0000\u035e\u035f\u00057\u0000\u0000\u035f\u0360"+ - "\u0003\u00b4Z\u0000\u0360\u0364\u0005l\u0000\u0000\u0361\u0363\u0003x"+ - "<\u0000\u0362\u0361\u0001\u0000\u0000\u0000\u0363\u0366\u0001\u0000\u0000"+ - "\u0000\u0364\u0362\u0001\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000"+ - "\u0000\u0365\u0367\u0001\u0000\u0000\u0000\u0366\u0364\u0001\u0000\u0000"+ - "\u0000\u0367\u0368\u0005m\u0000\u0000\u0368w\u0001\u0000\u0000\u0000\u0369"+ - "\u036a\u0003z=\u0000\u036a\u036c\u0005s\u0000\u0000\u036b\u036d\u0003"+ - "\u0100\u0080\u0000\u036c\u036b\u0001\u0000\u0000\u0000\u036c\u036d\u0001"+ - "\u0000\u0000\u0000\u036dy\u0001\u0000\u0000\u0000\u036e\u036f\u0005T\u0000"+ - "\u0000\u036f\u0372\u0003|>\u0000\u0370\u0372\u0005P\u0000\u0000\u0371"+ - "\u036e\u0001\u0000\u0000\u0000\u0371\u0370\u0001\u0000\u0000\u0000\u0372"+ - "{\u0001\u0000\u0000\u0000\u0373\u0374\u0005%\u0000\u0000\u0374\u0381\u0005"+ - "i\u0000\u0000\u0375\u0376\u0003\u00dam\u0000\u0376\u037b\u0005l\u0000"+ - "\u0000\u0377\u0379\u0003~?\u0000\u0378\u037a\u0005q\u0000\u0000\u0379"+ - "\u0378\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000\u037a"+ - "\u037c\u0001\u0000\u0000\u0000\u037b\u0377\u0001\u0000\u0000\u0000\u037b"+ - "\u037c\u0001\u0000\u0000\u0000\u037c\u037d\u0001\u0000\u0000\u0000\u037d"+ - "\u037e\u0005m\u0000\u0000\u037e\u0381\u0001\u0000\u0000\u0000\u037f\u0381"+ - "\u0003\u00b4Z\u0000\u0380\u0373\u0001\u0000\u0000\u0000\u0380\u0375\u0001"+ - "\u0000\u0000\u0000\u0380\u037f\u0001\u0000\u0000\u0000\u0381}\u0001\u0000"+ - "\u0000\u0000\u0382\u0387\u0003|>\u0000\u0383\u0384\u0005q\u0000\u0000"+ - "\u0384\u0386\u0003|>\u0000\u0385\u0383\u0001\u0000\u0000\u0000\u0386\u0389"+ - "\u0001\u0000\u0000\u0000\u0387\u0385\u0001\u0000\u0000\u0000\u0387\u0388"+ - "\u0001\u0000\u0000\u0000\u0388\u007f\u0001\u0000\u0000\u0000\u0389\u0387"+ - "\u0001\u0000\u0000\u0000\u038a\u038f\u0005l\u0000\u0000\u038b\u038c\u0005"+ - "<\u0000\u0000\u038c\u038d\u0003\u00f4z\u0000\u038d\u038e\u0003\u017e\u00bf"+ - "\u0000\u038e\u0390\u0001\u0000\u0000\u0000\u038f\u038b\u0001\u0000\u0000"+ - "\u0000\u038f\u0390\u0001\u0000\u0000\u0000\u0390\u0392\u0001\u0000\u0000"+ - "\u0000\u0391\u0393\u0003\u0100\u0080\u0000\u0392\u0391\u0001\u0000\u0000"+ - "\u0000\u0392\u0393\u0001\u0000\u0000\u0000\u0393\u0394\u0001\u0000\u0000"+ - "\u0000\u0394\u0395\u0005m\u0000\u0000\u0395\u0081\u0001\u0000\u0000\u0000"+ - "\u0396\u0399\u0003\u0160\u00b0\u0000\u0397\u0399\u0005i\u0000\u0000\u0398"+ - "\u0396\u0001\u0000\u0000\u0000\u0398\u0397\u0001\u0000\u0000\u0000\u0399"+ - "\u03a2\u0001\u0000\u0000\u0000\u039a\u039f\u0005l\u0000\u0000\u039b\u039d"+ - "\u0003\u0084B\u0000\u039c\u039e\u0005q\u0000\u0000\u039d\u039c\u0001\u0000"+ - "\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u03a0\u0001\u0000"+ - "\u0000\u0000\u039f\u039b\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000"+ - "\u0000\u0000\u03a0\u03a1\u0001\u0000\u0000\u0000\u03a1\u03a3\u0005m\u0000"+ - "\u0000\u03a2\u039a\u0001\u0000\u0000\u0000\u03a2\u03a3\u0001\u0000\u0000"+ - "\u0000\u03a3\u0083\u0001\u0000\u0000\u0000\u03a4\u03a9\u0003\u0086C\u0000"+ - "\u03a5\u03a6\u0005q\u0000\u0000\u03a6\u03a8\u0003\u0086C\u0000\u03a7\u03a5"+ - "\u0001\u0000\u0000\u0000\u03a8\u03ab\u0001\u0000\u0000\u0000\u03a9\u03a7"+ - "\u0001\u0000\u0000\u0000\u03a9\u03aa\u0001\u0000\u0000\u0000\u03aa\u0085"+ - "\u0001\u0000\u0000\u0000\u03ab\u03a9\u0001\u0000\u0000\u0000\u03ac\u03ad"+ - "\u0005i\u0000\u0000\u03ad\u03af\u0005s\u0000\u0000\u03ae\u03ac\u0001\u0000"+ - "\u0000\u0000\u03ae\u03af\u0001\u0000\u0000\u0000\u03af\u03b0\u0001\u0000"+ - "\u0000\u0000\u03b0\u03b1\u0003\u00b4Z\u0000\u03b1\u0087\u0001\u0000\u0000"+ - "\u0000\u03b2\u03b3\u0005H\u0000\u0000\u03b3\u03b4\u0003\u00b4Z\u0000\u03b4"+ - "\u03b5\u0005\u000f\u0000\u0000\u03b5\u03b6\u0003\u0082A\u0000\u03b6\u03b7"+ - "\u0003\u00fe\u007f\u0000\u03b7\u0089\u0001\u0000\u0000\u0000\u03b8\u03b9"+ - "\u0003\u00d2i\u0000\u03b9\u03ba\u0005\u000f\u0000\u0000\u03ba\u03cd\u0003"+ - "\u00d2i\u0000\u03bb\u03c1\u0005l\u0000\u0000\u03bc\u03bd\u0003\u0092I"+ - "\u0000\u03bd\u03be\u0003\u017e\u00bf\u0000\u03be\u03c0\u0001\u0000\u0000"+ - "\u0000\u03bf\u03bc\u0001\u0000\u0000\u0000\u03c0\u03c3\u0001\u0000\u0000"+ - "\u0000\u03c1\u03bf\u0001\u0000\u0000\u0000\u03c1\u03c2\u0001\u0000\u0000"+ - "\u0000\u03c2\u03c9\u0001\u0000\u0000\u0000\u03c3\u03c1\u0001\u0000\u0000"+ - "\u0000\u03c4\u03c5\u0003\u008cF\u0000\u03c5\u03c6\u0003\u017e\u00bf\u0000"+ - "\u03c6\u03c8\u0001\u0000\u0000\u0000\u03c7\u03c4\u0001\u0000\u0000\u0000"+ - "\u03c8\u03cb\u0001\u0000\u0000\u0000\u03c9\u03c7\u0001\u0000\u0000\u0000"+ - "\u03c9\u03ca\u0001\u0000\u0000\u0000\u03ca\u03cc\u0001\u0000\u0000\u0000"+ - "\u03cb\u03c9\u0001\u0000\u0000\u0000\u03cc\u03ce\u0005m\u0000\u0000\u03cd"+ - "\u03bb\u0001\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce"+ - "\u008b\u0001\u0000\u0000\u0000\u03cf\u03d1\u0005\u000e\u0000\u0000\u03d0"+ - "\u03cf\u0001\u0000\u0000\u0000\u03d0\u03d1\u0001\u0000\u0000\u0000\u03d1"+ - "\u03d2\u0001\u0000\u0000\u0000\u03d2\u03d3\u0003\u008eG\u0000\u03d3\u03d4"+ - "\u0005i\u0000\u0000\u03d4\u03d6\u0003\u014e\u00a7\u0000\u03d5\u03d7\u0003"+ - "\u00fe\u007f\u0000\u03d6\u03d5\u0001\u0000\u0000\u0000\u03d6\u03d7\u0001"+ - "\u0000\u0000\u0000\u03d7\u008d\u0001\u0000\u0000\u0000\u03d8\u03da\u0005"+ - "j\u0000\u0000\u03d9\u03db\u0005i\u0000\u0000\u03da\u03d9\u0001\u0000\u0000"+ - "\u0000\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u03dd\u0001\u0000\u0000"+ - "\u0000\u03dc\u03de\u0005\u008b\u0000\u0000\u03dd\u03dc\u0001\u0000\u0000"+ - "\u0000\u03dd\u03de\u0001\u0000\u0000\u0000\u03de\u03df\u0001\u0000\u0000"+ - "\u0000\u03df\u03e0\u0003\u013c\u009e\u0000\u03e0\u03e1\u0005k\u0000\u0000"+ - "\u03e1\u008f\u0001\u0000\u0000\u0000\u03e2\u03e8\u0003\u00c4b\u0000\u03e3"+ - "\u03e4\u0003\u00d2i\u0000\u03e4\u03e5\u0005t\u0000\u0000\u03e5\u03e6\u0005"+ - "i\u0000\u0000\u03e6\u03e8\u0001\u0000\u0000\u0000\u03e7\u03e2\u0001\u0000"+ - "\u0000\u0000\u03e7\u03e3\u0001\u0000\u0000\u0000\u03e8\u0091\u0001\u0000"+ - "\u0000\u0000\u03e9\u03ea\u00059\u0000\u0000\u03ea\u03eb\u0005i\u0000\u0000"+ - "\u03eb\u03ee\u0005w\u0000\u0000\u03ec\u03ef\u0003\u0090H\u0000\u03ed\u03ef"+ - "\u0003\u015e\u00af\u0000\u03ee\u03ec\u0001\u0000\u0000\u0000\u03ee\u03ed"+ - "\u0001\u0000\u0000\u0000\u03ef\u0093\u0001\u0000\u0000\u0000\u03f0\u03f1"+ - "\u00050\u0000\u0000\u03f1\u03f2\u0005j\u0000\u0000\u03f2\u03f5\u0003\u00d2"+ - "i\u0000\u03f3\u03f4\u0005q\u0000\u0000\u03f4\u03f6\u0003\u00f6{\u0000"+ - "\u03f5\u03f3\u0001\u0000\u0000\u0000\u03f5\u03f6\u0001\u0000\u0000\u0000"+ - "\u03f6\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0005k\u0000\u0000\u03f8"+ - "\u0095\u0001\u0000\u0000\u0000\u03f9\u03fa\u0005/\u0000\u0000\u03fa\u03fb"+ - "\u0005j\u0000\u0000\u03fb\u03fc\u0003\u00d2i\u0000\u03fc\u03fd\u0005k"+ - "\u0000\u0000\u03fd\u0097\u0001\u0000\u0000\u0000\u03fe\u0401\u0003d2\u0000"+ - "\u03ff\u0402\u0003\u009aM\u0000\u0400\u0402\u0003\u009cN\u0000\u0401\u03ff"+ - "\u0001\u0000\u0000\u0000\u0401\u0400\u0001\u0000\u0000\u0000\u0402\u0099"+ - "\u0001\u0000\u0000\u0000\u0403\u0404\u0005Q\u0000\u0000\u0404\u0405\u0005"+ - "i\u0000\u0000\u0405\u0407\u0003\u014e\u00a7\u0000\u0406\u0408\u0003\u0080"+ - "@\u0000\u0407\u0406\u0001\u0000\u0000\u0000\u0407\u0408\u0001\u0000\u0000"+ - "\u0000\u0408\u009b\u0001\u0000\u0000\u0000\u0409\u040a\u0005Q\u0000\u0000"+ - "\u040a\u040b\u0003\u00aaU\u0000\u040b\u040c\u0005i\u0000\u0000\u040c\u040e"+ - "\u0003\u014e\u00a7\u0000\u040d\u040f\u0003\u0080@\u0000\u040e\u040d\u0001"+ - "\u0000\u0000\u0000\u040e\u040f\u0001\u0000\u0000\u0000\u040f\u009d\u0001"+ - "\u0000\u0000\u0000\u0410\u0413\u0005\u001b\u0000\u0000\u0411\u0414\u0003"+ - "\u0098L\u0000\u0412\u0414\u0003\u00eew\u0000\u0413\u0411\u0001\u0000\u0000"+ - "\u0000\u0413\u0412\u0001\u0000\u0000\u0000\u0414\u009f\u0001\u0000\u0000"+ - "\u0000\u0415\u0416\u00059\u0000\u0000\u0416\u0417\u0005i\u0000\u0000\u0417"+ - "\u0419\u0003\u0152\u00a9\u0000\u0418\u041a\u0003\u00a2Q\u0000\u0419\u0418"+ - "\u0001\u0000\u0000\u0000\u0419\u041a\u0001\u0000\u0000\u0000\u041a\u00a1"+ - "\u0001\u0000\u0000\u0000\u041b\u041c\u0005l\u0000\u0000\u041c\u041d\u0003"+ - "\u00b4Z\u0000\u041d\u041e\u0003\u017e\u00bf\u0000\u041e\u041f\u0005m\u0000"+ - "\u0000\u041f\u00a3\u0001\u0000\u0000\u0000\u0420\u0421\u00059\u0000\u0000"+ - "\u0421\u0422\u0003\u00aaU\u0000\u0422\u0423\u0005i\u0000\u0000\u0423\u0425"+ - "\u0003\u0152\u00a9\u0000\u0424\u0426\u0003\u00a2Q\u0000\u0425\u0424\u0001"+ - "\u0000\u0000\u0000\u0425\u0426\u0001\u0000\u0000\u0000\u0426\u00a5\u0001"+ - "\u0000\u0000\u0000\u0427\u042f\u0003\u0006\u0003\u0000\u0428\u042b\u0003"+ - "\u00d2i\u0000\u0429\u042a\u0005p\u0000\u0000\u042a\u042c\u0003\u00f6{"+ - "\u0000\u042b\u0429\u0001\u0000\u0000\u0000\u042b\u042c\u0001\u0000\u0000"+ - "\u0000\u042c\u0430\u0001\u0000\u0000\u0000\u042d\u042e\u0005p\u0000\u0000"+ - "\u042e\u0430\u0003\u00f6{\u0000\u042f\u0428\u0001\u0000\u0000\u0000\u042f"+ - "\u042d\u0001\u0000\u0000\u0000\u0430\u00a7\u0001\u0000\u0000\u0000\u0431"+ - "\u0432\u0003\u0006\u0003\u0000\u0432\u0433\u0005w\u0000\u0000\u0433\u0434"+ - "\u0003\u00f6{\u0000\u0434\u00a9\u0001\u0000\u0000\u0000\u0435\u0437\u0005"+ - "j\u0000\u0000\u0436\u0438\u0003\b\u0004\u0000\u0437\u0436\u0001\u0000"+ - "\u0000\u0000\u0437\u0438\u0001\u0000\u0000\u0000\u0438\u0439\u0001\u0000"+ - "\u0000\u0000\u0439\u043b\u0003\u00d2i\u0000\u043a\u043c\u0005q\u0000\u0000"+ - "\u043b\u043a\u0001\u0000\u0000\u0000\u043b\u043c\u0001\u0000\u0000\u0000"+ - "\u043c\u043d\u0001\u0000\u0000\u0000\u043d\u043e\u0005k\u0000\u0000\u043e"+ - "\u00ab\u0001\u0000\u0000\u0000\u043f\u0442\u0003\u00aeW\u0000\u0440\u0442"+ - "\u0003\u00b0X\u0000\u0441\u043f\u0001\u0000\u0000\u0000\u0441\u0440\u0001"+ - "\u0000\u0000\u0000\u0442\u00ad\u0001\u0000\u0000\u0000\u0443\u0445\u0003"+ - "\u00f4z\u0000\u0444\u0443\u0001\u0000\u0000\u0000\u0444\u0445\u0001\u0000"+ - "\u0000\u0000\u0445\u0446\u0001\u0000\u0000\u0000\u0446\u0447\u0003\u00b2"+ - "Y\u0000\u0447\u00af\u0001\u0000\u0000\u0000\u0448\u044a\u0005\u001b\u0000"+ - "\u0000\u0449\u044b\u0003\u00f4z\u0000\u044a\u0449\u0001\u0000\u0000\u0000"+ - "\u044a\u044b\u0001\u0000\u0000\u0000\u044b\u044c\u0001\u0000\u0000\u0000"+ - "\u044c\u044d\u0003\u00b2Y\u0000\u044d\u00b1\u0001\u0000\u0000\u0000\u044e"+ - "\u0450\u0005x\u0000\u0000\u044f\u044e\u0001\u0000\u0000\u0000\u044f\u0450"+ - "\u0001\u0000\u0000\u0000\u0450\u0451\u0001\u0000\u0000\u0000\u0451\u0452"+ - "\u0003\u00d2i\u0000\u0452\u00b3\u0001\u0000\u0000\u0000\u0453\u0454\u0006"+ - "Z\uffff\uffff\u0000\u0454\u0455\u0007\u0007\u0000\u0000\u0455\u0469\u0003"+ - "\u00b4Z\u000f\u0456\u0469\u0003\u00c4b\u0000\u0457\u0458\u0005\u0019\u0000"+ - "\u0000\u0458\u0459\u0003.\u0017\u0000\u0459\u045a\u0005\u001c\u0000\u0000"+ - "\u045a\u045b\u0003\u00b4Z\u0003\u045b\u0469\u0001\u0000\u0000\u0000\u045c"+ - "\u045d\u0005\u001a\u0000\u0000\u045d\u045e\u0003\u00a8T\u0000\u045e\u045f"+ - "\u0005\u001c\u0000\u0000\u045f\u0460\u0003\u00b4Z\u0002\u0460\u0469\u0001"+ - "\u0000\u0000\u0000\u0461\u0462\u0007\b\u0000\u0000\u0462\u0463\u0003&"+ - "\u0013\u0000\u0463\u0464\u0005s\u0000\u0000\u0464\u0465\u0005s\u0000\u0000"+ - "\u0465\u0466\u0003*\u0015\u0000\u0466\u0467\u0003\u00b4Z\u0001\u0467\u0469"+ - "\u0001\u0000\u0000\u0000\u0468\u0453\u0001\u0000\u0000\u0000\u0468\u0456"+ - "\u0001\u0000\u0000\u0000\u0468\u0457\u0001\u0000\u0000\u0000\u0468\u045c"+ - "\u0001\u0000\u0000\u0000\u0468\u0461\u0001\u0000\u0000\u0000\u0469\u048d"+ - "\u0001\u0000\u0000\u0000\u046a\u046b\n\r\u0000\u0000\u046b\u046c\u0007"+ - "\t\u0000\u0000\u046c\u048c\u0003\u00b4Z\u000e\u046d\u046e\n\f\u0000\u0000"+ - "\u046e\u046f\u0007\n\u0000\u0000\u046f\u048c\u0003\u00b4Z\r\u0470\u0471"+ - "\n\u000b\u0000\u0000\u0471\u0472\u0007\u000b\u0000\u0000\u0472\u048c\u0003"+ - "\u00b4Z\f\u0473\u0474\n\n\u0000\u0000\u0474\u0475\u0007\f\u0000\u0000"+ - "\u0475\u048c\u0003\u00b4Z\u000b\u0476\u0477\n\t\u0000\u0000\u0477\u0478"+ - "\u0007\r\u0000\u0000\u0478\u048c\u0003\u00b4Z\n\u0479\u047a\n\u0007\u0000"+ - "\u0000\u047a\u047b\u0005z\u0000\u0000\u047b\u048c\u0003\u00b4Z\b\u047c"+ - "\u047d\n\u0006\u0000\u0000\u047d\u047e\u0005y\u0000\u0000\u047e\u048c"+ - "\u0003\u00b4Z\u0007\u047f\u0480\n\u0005\u0000\u0000\u0480\u0481\u0005"+ - "\"\u0000\u0000\u0481\u048c\u0003\u00b4Z\u0005\u0482\u0483\n\u0004\u0000"+ - "\u0000\u0483\u0484\u0005%\u0000\u0000\u0484\u0485\u0003\u00b4Z\u0000\u0485"+ - "\u0486\u0005s\u0000\u0000\u0486\u0487\u0003\u00b4Z\u0004\u0487\u048c\u0001"+ - "\u0000\u0000\u0000\u0488\u0489\n\b\u0000\u0000\u0489\u048a\u0005\u000f"+ - "\u0000\u0000\u048a\u048c\u0003\u0082A\u0000\u048b\u046a\u0001\u0000\u0000"+ - "\u0000\u048b\u046d\u0001\u0000\u0000\u0000\u048b\u0470\u0001\u0000\u0000"+ - "\u0000\u048b\u0473\u0001\u0000\u0000\u0000\u048b\u0476\u0001\u0000\u0000"+ - "\u0000\u048b\u0479\u0001\u0000\u0000\u0000\u048b\u047c\u0001\u0000\u0000"+ - "\u0000\u048b\u047f\u0001\u0000\u0000\u0000\u048b\u0482\u0001\u0000\u0000"+ - "\u0000\u048b\u0488\u0001\u0000\u0000\u0000\u048c\u048f\u0001\u0000\u0000"+ - "\u0000\u048d\u048b\u0001\u0000\u0000\u0000\u048d\u048e\u0001\u0000\u0000"+ - "\u0000\u048e\u00b5\u0001\u0000\u0000\u0000\u048f\u048d\u0001\u0000\u0000"+ - "\u0000\u0490\u04a5\u0003\u0018\f\u0000\u0491\u04a5\u0003\u001a\r\u0000"+ - "\u0492\u04a5\u0003\u00ba]\u0000\u0493\u04a5\u0003\u00b8\\\u0000\u0494"+ - "\u04a5\u0003\u00eew\u0000\u0495\u04a5\u0003\u010e\u0087\u0000\u0496\u04a5"+ - "\u0003\u0102\u0081\u0000\u0497\u04a5\u0003\u013a\u009d\u0000\u0498\u04a5"+ - "\u0003\u0110\u0088\u0000\u0499\u04a5\u0003\u0112\u0089\u0000\u049a\u04a5"+ - "\u0003\u0114\u008a\u0000\u049b\u04a5\u0003\u0116\u008b\u0000\u049c\u04a5"+ - "\u0003\u0118\u008c\u0000\u049d\u04a5\u0003\u00fe\u007f\u0000\u049e\u04a5"+ - "\u0003\u011a\u008d\u0000\u049f\u04a5\u0003\u011c\u008e\u0000\u04a0\u04a5"+ - "\u0003\u012e\u0097\u0000\u04a1\u04a5\u0003\u00bc^\u0000\u04a2\u04a5\u0003"+ - "\u00c0`\u0000\u04a3\u04a5\u0003\u0088D\u0000\u04a4\u0490\u0001\u0000\u0000"+ - "\u0000\u04a4\u0491\u0001\u0000\u0000\u0000\u04a4\u0492\u0001\u0000\u0000"+ - "\u0000\u04a4\u0493\u0001\u0000\u0000\u0000\u04a4\u0494\u0001\u0000\u0000"+ - "\u0000\u04a4\u0495\u0001\u0000\u0000\u0000\u04a4\u0496\u0001\u0000\u0000"+ - "\u0000\u04a4\u0497\u0001\u0000\u0000\u0000\u04a4\u0498\u0001\u0000\u0000"+ - "\u0000\u04a4\u0499\u0001\u0000\u0000\u0000\u04a4\u049a\u0001\u0000\u0000"+ - "\u0000\u04a4\u049b\u0001\u0000\u0000\u0000\u04a4\u049c\u0001\u0000\u0000"+ - "\u0000\u04a4\u049d\u0001\u0000\u0000\u0000\u04a4\u049e\u0001\u0000\u0000"+ - "\u0000\u04a4\u049f\u0001\u0000\u0000\u0000\u04a4\u04a0\u0001\u0000\u0000"+ - "\u0000\u04a4\u04a1\u0001\u0000\u0000\u0000\u04a4\u04a2\u0001\u0000\u0000"+ - "\u0000\u04a4\u04a3\u0001\u0000\u0000\u0000\u04a5\u00b7\u0001\u0000\u0000"+ - "\u0000\u04a6\u04a7\u0005$\u0000\u0000\u04a7\u04a8\u0003\u00b4Z\u0000\u04a8"+ - "\u00b9\u0001\u0000\u0000\u0000\u04a9\u04aa\u0005\\\u0000\u0000\u04aa\u04ac"+ - "\u0003\u00b4Z\u0000\u04ab\u04ad\u0003\u00fe\u007f\u0000\u04ac\u04ab\u0001"+ - "\u0000\u0000\u0000\u04ac\u04ad\u0001\u0000\u0000\u0000\u04ad\u00bb\u0001"+ - "\u0000\u0000\u0000\u04ae\u04af\u0003\u00be_\u0000\u04af\u04b0\u0003\u0136"+ - "\u009b\u0000\u04b0\u00bd\u0001\u0000\u0000\u0000\u04b1\u04b2\u0005\f\u0000"+ - "\u0000\u04b2\u04b3\u0003\u00b4Z\u0000\u04b3\u04b4\u0003\u017e\u00bf\u0000"+ - "\u04b4\u04b6\u0001\u0000\u0000\u0000\u04b5\u04b1\u0001\u0000\u0000\u0000"+ - "\u04b6\u04b9\u0001\u0000\u0000\u0000\u04b7\u04b5\u0001\u0000\u0000\u0000"+ - "\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8\u04be\u0001\u0000\u0000\u0000"+ - "\u04b9\u04b7\u0001\u0000\u0000\u0000\u04ba\u04bb\u0005\r\u0000\u0000\u04bb"+ - "\u04bc\u0003r9\u0000\u04bc\u04bd\u0003\u017e\u00bf\u0000\u04bd\u04bf\u0001"+ - "\u0000\u0000\u0000\u04be\u04ba\u0001\u0000\u0000\u0000\u04be\u04bf\u0001"+ - "\u0000\u0000\u0000\u04bf\u00bf\u0001\u0000\u0000\u0000\u04c0\u04c1\u0005"+ - "U\u0000\u0000\u04c1\u04c6\u0003\u00b4Z\u0000\u04c2\u04c3\u0005U\u0000"+ - "\u0000\u04c3\u04c4\u0007\u0001\u0000\u0000\u04c4\u04c6\u0003.\u0017\u0000"+ - "\u04c5\u04c0\u0001\u0000\u0000\u0000\u04c5\u04c2\u0001\u0000\u0000\u0000"+ - "\u04c6\u00c1\u0001\u0000\u0000\u0000\u04c7\u04d0\u0005\u0003\u0000\u0000"+ - "\u04c8\u04d0\u0005\u0004\u0000\u0000\u04c9\u04d0\u0005h\u0000\u0000\u04ca"+ - "\u04d0\u0003\u015c\u00ae\u0000\u04cb\u04d0\u0003\u0170\u00b8\u0000\u04cc"+ - "\u04d0\u0005\u0001\u0000\u0000\u04cd\u04d0\u0005\u0093\u0000\u0000\u04ce"+ - "\u04d0\u0005\u0094\u0000\u0000\u04cf\u04c7\u0001\u0000\u0000\u0000\u04cf"+ - "\u04c8\u0001\u0000\u0000\u0000\u04cf\u04c9\u0001\u0000\u0000\u0000\u04cf"+ - "\u04ca\u0001\u0000\u0000\u0000\u04cf\u04cb\u0001\u0000\u0000\u0000\u04cf"+ - "\u04cc\u0001\u0000\u0000\u0000\u04cf\u04cd\u0001\u0000\u0000\u0000\u04cf"+ - "\u04ce\u0001\u0000\u0000\u0000\u04d0\u00c3\u0001\u0000\u0000\u0000\u04d1"+ - "\u04d2\u0006b\uffff\uffff\u0000\u04d2\u04e2\u0003\u0158\u00ac\u0000\u04d3"+ - "\u04e2\u0003\u0154\u00aa\u0000\u04d4\u04e2\u0003\u017a\u00bd\u0000\u04d5"+ - "\u04e2\u0003 \u0010\u0000\u04d6\u04e2\u0003\u0096K\u0000\u04d7\u04e2\u0003"+ - "\u0094J\u0000\u04d8\u04d9\u0005M\u0000\u0000\u04d9\u04da\u0003\u00c4b"+ - "\u0000\u04da\u04db\u0003\u0178\u00bc\u0000\u04db\u04e2\u0001\u0000\u0000"+ - "\u0000\u04dc\u04dd\u0007\u000e\u0000\u0000\u04dd\u04de\u0005j\u0000\u0000"+ - "\u04de\u04df\u0003\u00b4Z\u0000\u04df\u04e0\u0005k\u0000\u0000\u04e0\u04e2"+ - "\u0001\u0000\u0000\u0000\u04e1\u04d1\u0001\u0000\u0000\u0000\u04e1\u04d3"+ - "\u0001\u0000\u0000\u0000\u04e1\u04d4\u0001\u0000\u0000\u0000\u04e1\u04d5"+ - "\u0001\u0000\u0000\u0000\u04e1\u04d6\u0001\u0000\u0000\u0000\u04e1\u04d7"+ - "\u0001\u0000\u0000\u0000\u04e1\u04d8\u0001\u0000\u0000\u0000\u04e1\u04dc"+ - "\u0001\u0000\u0000\u0000\u04e2\u04f9\u0001\u0000\u0000\u0000\u04e3\u04e4"+ - "\n\n\u0000\u0000\u04e4\u04e5\u0005t\u0000\u0000\u04e5\u04f8\u0005i\u0000"+ - "\u0000\u04e6\u04e7\n\t\u0000\u0000\u04e7\u04f8\u0003\u0174\u00ba\u0000"+ - "\u04e8\u04e9\n\b\u0000\u0000\u04e9\u04f8\u0003\u00deo\u0000\u04ea\u04eb"+ - "\n\u0007\u0000\u0000\u04eb\u04f8\u0003L&\u0000\u04ec\u04ed\n\u0006\u0000"+ - "\u0000\u04ed\u04f8\u0003\u0176\u00bb\u0000\u04ee\u04ef\n\u0005\u0000\u0000"+ - "\u04ef\u04f8\u0003\u0178\u00bc\u0000\u04f0\u04f1\n\u0003\u0000\u0000\u04f1"+ - "\u04f2\u0003\u0178\u00bc\u0000\u04f2\u04f3\u0005\u0010\u0000\u0000\u04f3"+ - "\u04f4\u0003\u0082A\u0000\u04f4\u04f8\u0001\u0000\u0000\u0000\u04f5\u04f6"+ - "\n\u0002\u0000\u0000\u04f6\u04f8\u0003\u00cae\u0000\u04f7\u04e3\u0001"+ - "\u0000\u0000\u0000\u04f7\u04e6\u0001\u0000\u0000\u0000\u04f7\u04e8\u0001"+ - "\u0000\u0000\u0000\u04f7\u04ea\u0001\u0000\u0000\u0000\u04f7\u04ec\u0001"+ - "\u0000\u0000\u0000\u04f7\u04ee\u0001\u0000\u0000\u0000\u04f7\u04f0\u0001"+ - "\u0000\u0000\u0000\u04f7\u04f5\u0001\u0000\u0000\u0000\u04f8\u04fb\u0001"+ - "\u0000\u0000\u0000\u04f9\u04f7\u0001\u0000\u0000\u0000\u04f9\u04fa\u0001"+ - "\u0000\u0000\u0000\u04fa\u00c5\u0001\u0000\u0000\u0000\u04fb\u04f9\u0001"+ - "\u0000\u0000\u0000\u04fc\u04fd\u0003d2\u0000\u04fd\u04fe\u0003\u00c8d"+ - "\u0000\u04fe\u00c7\u0001\u0000\u0000\u0000\u04ff\u0501\u0005Q\u0000\u0000"+ - "\u0500\u0502\u0005i\u0000\u0000\u0501\u0500\u0001\u0000\u0000\u0000\u0501"+ - "\u0502\u0001\u0000\u0000\u0000\u0502\u0503\u0001\u0000\u0000\u0000\u0503"+ - "\u0505\u0003\u014e\u00a7\u0000\u0504\u0506\u0003\u0080@\u0000\u0505\u0504"+ - "\u0001\u0000\u0000\u0000\u0505\u0506\u0001\u0000\u0000\u0000\u0506\u00c9"+ - "\u0001\u0000\u0000\u0000\u0507\u0509\u0005&\u0000\u0000\u0508\u050a\u0003"+ - "\u00f6{\u0000\u0509\u0508\u0001\u0000\u0000\u0000\u0509\u050a\u0001\u0000"+ - "\u0000\u0000\u050a\u050c\u0001\u0000\u0000\u0000\u050b\u050d\u0005q\u0000"+ - "\u0000\u050c\u050b\u0001\u0000\u0000\u0000\u050c\u050d\u0001\u0000\u0000"+ - "\u0000\u050d\u050e\u0001\u0000\u0000\u0000\u050e\u050f\u0005\'\u0000\u0000"+ - "\u050f\u00cb\u0001\u0000\u0000\u0000\u0510\u0511\u0005R\u0000\u0000\u0511"+ - "\u051b\u0005l\u0000\u0000\u0512\u0516\u0003\u00d0h\u0000\u0513\u0516\u0003"+ - "\u013c\u009e\u0000\u0514\u0516\u0003\u00ceg\u0000\u0515\u0512\u0001\u0000"+ - "\u0000\u0000\u0515\u0513\u0001\u0000\u0000\u0000\u0515\u0514\u0001\u0000"+ - "\u0000\u0000\u0516\u0517\u0001\u0000\u0000\u0000\u0517\u0518\u0003\u017e"+ - "\u00bf\u0000\u0518\u051a\u0001\u0000\u0000\u0000\u0519\u0515\u0001\u0000"+ - "\u0000\u0000\u051a\u051d\u0001\u0000\u0000\u0000\u051b\u0519\u0001\u0000"+ - "\u0000\u0000\u051b\u051c\u0001\u0000\u0000\u0000\u051c\u051e\u0001\u0000"+ - "\u0000\u0000\u051d\u051b\u0001\u0000\u0000\u0000\u051e\u051f\u0005m\u0000"+ - "\u0000\u051f\u00cd\u0001\u0000\u0000\u0000\u0520\u0521\u00059\u0000\u0000"+ - "\u0521\u0522\u0005i\u0000\u0000\u0522\u0523\u0003\u0152\u00a9\u0000\u0523"+ - "\u00cf\u0001\u0000\u0000\u0000\u0524\u0526\u0005\u001b\u0000\u0000\u0525"+ - "\u0524\u0001\u0000\u0000\u0000\u0525\u0526\u0001\u0000\u0000\u0000\u0526"+ - "\u0527\u0001\u0000\u0000\u0000\u0527\u0528\u0003d2\u0000\u0528\u0529\u0005"+ - "i\u0000\u0000\u0529\u052a\u0003\u0152\u00a9\u0000\u052a\u052b\u0003\u0150"+ - "\u00a8\u0000\u052b\u0534\u0001\u0000\u0000\u0000\u052c\u052e\u0005\u001b"+ - "\u0000\u0000\u052d\u052c\u0001\u0000\u0000\u0000\u052d\u052e\u0001\u0000"+ - "\u0000\u0000\u052e\u052f\u0001\u0000\u0000\u0000\u052f\u0530\u0003d2\u0000"+ - "\u0530\u0531\u0005i\u0000\u0000\u0531\u0532\u0003\u0152\u00a9\u0000\u0532"+ - "\u0534\u0001\u0000\u0000\u0000\u0533\u0525\u0001\u0000\u0000\u0000\u0533"+ - "\u052d\u0001\u0000\u0000\u0000\u0534\u00d1\u0001\u0000\u0000\u0000\u0535"+ - "\u053d\u0003\u013c\u009e\u0000\u0536\u053d\u0003\u00d4j\u0000\u0537\u053d"+ - "\u0003P(\u0000\u0538\u0539\u0005j\u0000\u0000\u0539\u053a\u0003\u00d2"+ - "i\u0000\u053a\u053b\u0005k\u0000\u0000\u053b\u053d\u0001\u0000\u0000\u0000"+ - "\u053c\u0535\u0001\u0000\u0000\u0000\u053c\u0536\u0001\u0000\u0000\u0000"+ - "\u053c\u0537\u0001\u0000\u0000\u0000\u053c\u0538\u0001\u0000\u0000\u0000"+ - "\u053d\u00d3\u0001\u0000\u0000\u0000\u053e\u0548\u0003\u013e\u009f\u0000"+ - "\u053f\u0548\u0003\u016e\u00b7\u0000\u0540\u0548\u0003\u0144\u00a2\u0000"+ - "\u0541\u0548\u0003\u014c\u00a6\u0000\u0542\u0548\u0003\u00ccf\u0000\u0543"+ - "\u0548\u0003\u0146\u00a3\u0000\u0544\u0548\u0003\u0148\u00a4\u0000\u0545"+ - "\u0548\u0003\u014a\u00a5\u0000\u0546\u0548\u0003\u00d6k\u0000\u0547\u053e"+ - "\u0001\u0000\u0000\u0000\u0547\u053f\u0001\u0000\u0000\u0000\u0547\u0540"+ - "\u0001\u0000\u0000\u0000\u0547\u0541\u0001\u0000\u0000\u0000\u0547\u0542"+ - "\u0001\u0000\u0000\u0000\u0547\u0543\u0001\u0000\u0000\u0000\u0547\u0544"+ - "\u0001\u0000\u0000\u0000\u0547\u0545\u0001\u0000\u0000\u0000\u0547\u0546"+ - "\u0001\u0000\u0000\u0000\u0548\u00d5\u0001\u0000\u0000\u0000\u0549\u054a"+ - "\u00059\u0000\u0000\u054a\u054b\u0003\u00d8l\u0000\u054b\u00d7\u0001\u0000"+ - "\u0000\u0000\u054c\u0558\u0005j\u0000\u0000\u054d\u0552\u0003\u00d2i\u0000"+ - "\u054e\u054f\u0005q\u0000\u0000\u054f\u0551\u0003\u00d2i\u0000\u0550\u054e"+ - "\u0001\u0000\u0000\u0000\u0551\u0554\u0001\u0000\u0000\u0000\u0552\u0550"+ - "\u0001\u0000\u0000\u0000\u0552\u0553\u0001\u0000\u0000\u0000\u0553\u0556"+ - "\u0001\u0000\u0000\u0000\u0554\u0552\u0001\u0000\u0000\u0000\u0555\u0557"+ - "\u0005q\u0000\u0000\u0556\u0555\u0001\u0000\u0000\u0000\u0556\u0557\u0001"+ - "\u0000\u0000\u0000\u0557\u0559\u0001\u0000\u0000\u0000\u0558\u054d\u0001"+ - "\u0000\u0000\u0000\u0558\u0559\u0001\u0000\u0000\u0000\u0559\u055a\u0001"+ - "\u0000\u0000\u0000\u055a\u055b\u0005k\u0000\u0000\u055b\u00d9\u0001\u0000"+ - "\u0000\u0000\u055c\u0564\u0003\u016e\u00b7\u0000\u055d\u0564\u0003\u013e"+ - "\u009f\u0000\u055e\u0564\u0003\u00dcn\u0000\u055f\u0564\u0003\u0146\u00a3"+ - "\u0000\u0560\u0564\u0003\u0148\u00a4\u0000\u0561\u0564\u0003P(\u0000\u0562"+ - "\u0564\u0003\u013c\u009e\u0000\u0563\u055c\u0001\u0000\u0000\u0000\u0563"+ - "\u055d\u0001\u0000\u0000\u0000\u0563\u055e\u0001\u0000\u0000\u0000\u0563"+ - "\u055f\u0001\u0000\u0000\u0000\u0563\u0560\u0001\u0000\u0000\u0000\u0563"+ - "\u0561\u0001\u0000\u0000\u0000\u0563\u0562\u0001\u0000\u0000\u0000\u0564"+ - "\u00db\u0001\u0000\u0000\u0000\u0565\u0566\u0005n\u0000\u0000\u0566\u0567"+ - "\u0005x\u0000\u0000\u0567\u0568\u0005o\u0000\u0000\u0568\u0569\u0003\u0142"+ - "\u00a1\u0000\u0569\u00dd\u0001\u0000\u0000\u0000\u056a\u057a\u0005n\u0000"+ - "\u0000\u056b\u056d\u0003\u00e0p\u0000\u056c\u056b\u0001\u0000\u0000\u0000"+ - "\u056c\u056d\u0001\u0000\u0000\u0000\u056d\u056e\u0001\u0000\u0000\u0000"+ - "\u056e\u0570\u0005s\u0000\u0000\u056f\u0571\u0003\u00e2q\u0000\u0570\u056f"+ - "\u0001\u0000\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u057b"+ - "\u0001\u0000\u0000\u0000\u0572\u0574\u0003\u00e0p\u0000\u0573\u0572\u0001"+ - "\u0000\u0000\u0000\u0573\u0574\u0001\u0000\u0000\u0000\u0574\u0575\u0001"+ - "\u0000\u0000\u0000\u0575\u0576\u0005s\u0000\u0000\u0576\u0577\u0003\u00e2"+ - "q\u0000\u0577\u0578\u0005s\u0000\u0000\u0578\u0579\u0003\u00e4r\u0000"+ - "\u0579\u057b\u0001\u0000\u0000\u0000\u057a\u056c\u0001\u0000\u0000\u0000"+ - "\u057a\u0573\u0001\u0000\u0000\u0000\u057b\u057c\u0001\u0000\u0000\u0000"+ - "\u057c\u057d\u0005o\u0000\u0000\u057d\u00df\u0001\u0000\u0000\u0000\u057e"+ - "\u057f\u0003\u00b4Z\u0000\u057f\u00e1\u0001\u0000\u0000\u0000\u0580\u0581"+ - "\u0003\u00b4Z\u0000\u0581\u00e3\u0001\u0000\u0000\u0000\u0582\u0583\u0003"+ - "\u00b4Z\u0000\u0583\u00e5\u0001\u0000\u0000\u0000\u0584\u0586\u0007\u000f"+ - "\u0000\u0000\u0585\u0584\u0001\u0000\u0000\u0000\u0585\u0586\u0001\u0000"+ - "\u0000\u0000\u0586\u0587\u0001\u0000\u0000\u0000\u0587\u0588\u0005p\u0000"+ - "\u0000\u0588\u00e7\u0001\u0000\u0000\u0000\u0589\u058a\u0003\u00f6{\u0000"+ - "\u058a\u058b\u0005p\u0000\u0000\u058b\u0590\u0001\u0000\u0000\u0000\u058c"+ - "\u058d\u0003\u0006\u0003\u0000\u058d\u058e\u0005w\u0000\u0000\u058e\u0590"+ - "\u0001\u0000\u0000\u0000\u058f\u0589\u0001\u0000\u0000\u0000\u058f\u058c"+ - "\u0001\u0000\u0000\u0000\u058f\u0590\u0001\u0000\u0000\u0000\u0590\u0591"+ - "\u0001\u0000\u0000\u0000\u0591\u0592\u0005a\u0000\u0000\u0592\u0597\u0003"+ - "\u00b4Z\u0000\u0593\u0595\u0005K\u0000\u0000\u0594\u0596\u0005i\u0000"+ - "\u0000\u0595\u0594\u0001\u0000\u0000\u0000\u0595\u0596\u0001\u0000\u0000"+ - "\u0000\u0596\u0598\u0001\u0000\u0000\u0000\u0597\u0593\u0001\u0000\u0000"+ - "\u0000\u0597\u0598\u0001\u0000\u0000\u0000\u0598\u00e9\u0001\u0000\u0000"+ - "\u0000\u0599\u059a\u0005\\\u0000\u0000\u059a\u059b\u0005i\u0000\u0000"+ - "\u059b\u00eb\u0001\u0000\u0000\u0000\u059c\u059d\u0003\u0170\u00b8\u0000"+ - "\u059d\u00ed\u0001\u0000\u0000\u0000\u059e\u05a2\u0003\u00f0x\u0000\u059f"+ - "\u05a2\u0003\u00f8|\u0000\u05a0\u05a2\u0003\u00fc~\u0000\u05a1\u059e\u0001"+ - "\u0000\u0000\u0000\u05a1\u059f\u0001\u0000\u0000\u0000\u05a1\u05a0\u0001"+ - "\u0000\u0000\u0000\u05a2\u00ef\u0001\u0000\u0000\u0000\u05a3\u05af\u0005"+ - "^\u0000\u0000\u05a4\u05b0\u0003\u00f2y\u0000\u05a5\u05ab\u0005j\u0000"+ - "\u0000\u05a6\u05a7\u0003\u00f2y\u0000\u05a7\u05a8\u0003\u017e\u00bf\u0000"+ - "\u05a8\u05aa\u0001\u0000\u0000\u0000\u05a9\u05a6\u0001\u0000\u0000\u0000"+ - "\u05aa\u05ad\u0001\u0000\u0000\u0000\u05ab\u05a9\u0001\u0000\u0000\u0000"+ - "\u05ab\u05ac\u0001\u0000\u0000\u0000\u05ac\u05ae\u0001\u0000\u0000\u0000"+ - "\u05ad\u05ab\u0001\u0000\u0000\u0000\u05ae\u05b0\u0005k\u0000\u0000\u05af"+ - "\u05a4\u0001\u0000\u0000\u0000\u05af\u05a5\u0001\u0000\u0000\u0000\u05b0"+ - "\u00f1\u0001\u0000\u0000\u0000\u05b1\u05b7\u0003\u00f4z\u0000\u05b2\u05b4"+ - "\u0003\u00d2i\u0000\u05b3\u05b2\u0001\u0000\u0000\u0000\u05b3\u05b4\u0001"+ - "\u0000\u0000\u0000\u05b4\u05b5\u0001\u0000\u0000\u0000\u05b5\u05b6\u0005"+ - "p\u0000\u0000\u05b6\u05b8\u0003\u00f6{\u0000\u05b7\u05b3\u0001\u0000\u0000"+ - "\u0000\u05b7\u05b8\u0001\u0000\u0000\u0000\u05b8\u00f3\u0001\u0000\u0000"+ - "\u0000\u05b9\u05be\u0005i\u0000\u0000\u05ba\u05bb\u0005q\u0000\u0000\u05bb"+ - "\u05bd\u0005i\u0000\u0000\u05bc\u05ba\u0001\u0000\u0000\u0000\u05bd\u05c0"+ - "\u0001\u0000\u0000\u0000\u05be\u05bc\u0001\u0000\u0000\u0000\u05be\u05bf"+ - "\u0001\u0000\u0000\u0000\u05bf\u00f5\u0001\u0000\u0000\u0000\u05c0\u05be"+ - "\u0001\u0000\u0000\u0000\u05c1\u05c6\u0003\u00b4Z\u0000\u05c2\u05c3\u0005"+ - "q\u0000\u0000\u05c3\u05c5\u0003\u00b4Z\u0000\u05c4\u05c2\u0001\u0000\u0000"+ - "\u0000\u05c5\u05c8\u0001\u0000\u0000\u0000\u05c6\u05c4\u0001\u0000\u0000"+ - "\u0000\u05c6\u05c7\u0001\u0000\u0000\u0000\u05c7\u00f7\u0001\u0000\u0000"+ - "\u0000\u05c8\u05c6\u0001\u0000\u0000\u0000\u05c9\u05d5\u0005b\u0000\u0000"+ - "\u05ca\u05d6\u0003\u00fa}\u0000\u05cb\u05d1\u0005j\u0000\u0000\u05cc\u05cd"+ - "\u0003\u00fa}\u0000\u05cd\u05ce\u0003\u017e\u00bf\u0000\u05ce\u05d0\u0001"+ - "\u0000\u0000\u0000\u05cf\u05cc\u0001\u0000\u0000\u0000\u05d0\u05d3\u0001"+ - "\u0000\u0000\u0000\u05d1\u05cf\u0001\u0000\u0000\u0000\u05d1\u05d2\u0001"+ - "\u0000\u0000\u0000\u05d2\u05d4\u0001\u0000\u0000\u0000\u05d3\u05d1\u0001"+ - "\u0000\u0000\u0000\u05d4\u05d6\u0005k\u0000\u0000\u05d5\u05ca\u0001\u0000"+ - "\u0000\u0000\u05d5\u05cb\u0001\u0000\u0000\u0000\u05d6\u00f9\u0001\u0000"+ - "\u0000\u0000\u05d7\u05d9\u0005i\u0000\u0000\u05d8\u05da\u0005p\u0000\u0000"+ - "\u05d9\u05d8\u0001\u0000\u0000\u0000\u05d9\u05da\u0001\u0000\u0000\u0000"+ - "\u05da\u05db\u0001\u0000\u0000\u0000\u05db\u05dc\u0003\u00d2i\u0000\u05dc"+ - "\u00fb\u0001\u0000\u0000\u0000\u05dd\u05e9\u0005g\u0000\u0000\u05de\u05ea"+ - "\u0003\u00a6S\u0000\u05df\u05e5\u0005j\u0000\u0000\u05e0\u05e1\u0003\u00a6"+ - "S\u0000\u05e1\u05e2\u0003\u017e\u00bf\u0000\u05e2\u05e4\u0001\u0000\u0000"+ - "\u0000\u05e3\u05e0\u0001\u0000\u0000\u0000\u05e4\u05e7\u0001\u0000\u0000"+ - "\u0000\u05e5\u05e3\u0001\u0000\u0000\u0000\u05e5\u05e6\u0001\u0000\u0000"+ - "\u0000\u05e6\u05e8\u0001\u0000\u0000\u0000\u05e7\u05e5\u0001\u0000\u0000"+ - "\u0000\u05e8\u05ea\u0005k\u0000\u0000\u05e9\u05de\u0001\u0000\u0000\u0000"+ - "\u05e9\u05df\u0001\u0000\u0000\u0000\u05ea\u00fd\u0001\u0000\u0000\u0000"+ - "\u05eb\u05ed\u0005l\u0000\u0000\u05ec\u05ee\u0003\u0100\u0080\u0000\u05ed"+ - "\u05ec\u0001\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000\u0000\u05ee"+ - "\u05ef\u0001\u0000\u0000\u0000\u05ef\u05f0\u0005m\u0000\u0000\u05f0\u00ff"+ - "\u0001\u0000\u0000\u0000\u05f1\u05f3\u0005r\u0000\u0000\u05f2\u05f1\u0001"+ - "\u0000\u0000\u0000\u05f2\u05f3\u0001\u0000\u0000\u0000\u05f3\u05f9\u0001"+ - "\u0000\u0000\u0000\u05f4\u05f6\u0005\u00a3\u0000\u0000\u05f5\u05f4\u0001"+ - "\u0000\u0000\u0000\u05f5\u05f6\u0001\u0000\u0000\u0000\u05f6\u05f9\u0001"+ - "\u0000\u0000\u0000\u05f7\u05f9\u0004\u0080\u0012\u0000\u05f8\u05f2\u0001"+ - "\u0000\u0000\u0000\u05f8\u05f5\u0001\u0000\u0000\u0000\u05f8\u05f7\u0001"+ - "\u0000\u0000\u0000\u05f9\u05fa\u0001\u0000\u0000\u0000\u05fa\u05fb\u0003"+ - "\u00b6[\u0000\u05fb\u05fc\u0003\u017e\u00bf\u0000\u05fc\u05fe\u0001\u0000"+ - "\u0000\u0000\u05fd\u05f8\u0001\u0000\u0000\u0000\u05fe\u05ff\u0001\u0000"+ - "\u0000\u0000\u05ff\u05fd\u0001\u0000\u0000\u0000\u05ff\u0600\u0001\u0000"+ - "\u0000\u0000\u0600\u0101\u0001\u0000\u0000\u0000\u0601\u0607\u0003\u0106"+ - "\u0083\u0000\u0602\u0607\u0003\u0108\u0084\u0000\u0603\u0607\u0003\u010a"+ - "\u0085\u0000\u0604\u0607\u0003\u0104\u0082\u0000\u0605\u0607\u0003\u00a8"+ - "T\u0000\u0606\u0601\u0001\u0000\u0000\u0000\u0606\u0602\u0001\u0000\u0000"+ - "\u0000\u0606\u0603\u0001\u0000\u0000\u0000\u0606\u0604\u0001\u0000\u0000"+ - "\u0000\u0606\u0605\u0001\u0000\u0000\u0000\u0607\u0103\u0001\u0000\u0000"+ - "\u0000\u0608\u0609\u0003\u00b4Z\u0000\u0609\u0105\u0001\u0000\u0000\u0000"+ - "\u060a\u060b\u0003\u00b4Z\u0000\u060b\u060c\u0005\u008d\u0000\u0000\u060c"+ - "\u060d\u0003\u00b4Z\u0000\u060d\u0107\u0001\u0000\u0000\u0000\u060e\u060f"+ - "\u0003\u00b4Z\u0000\u060f\u0610\u0007\u0010\u0000\u0000\u0610\u0109\u0001"+ - "\u0000\u0000\u0000\u0611\u0612\u0003\u00f6{\u0000\u0612\u0613\u0003\u00e6"+ - "s\u0000\u0613\u0614\u0003\u00f6{\u0000\u0614\u010b\u0001\u0000\u0000\u0000"+ - "\u0615\u0616\u0007\u0011\u0000\u0000\u0616\u010d\u0001\u0000\u0000\u0000"+ - "\u0617\u0618\u0005i\u0000\u0000\u0618\u061a\u0005s\u0000\u0000\u0619\u061b"+ - "\u0003\u00b6[\u0000\u061a\u0619\u0001\u0000\u0000\u0000\u061a\u061b\u0001"+ - "\u0000\u0000\u0000\u061b\u010f\u0001\u0000\u0000\u0000\u061c\u061e\u0005"+ - "f\u0000\u0000\u061d\u061f\u0003\u00f6{\u0000\u061e\u061d\u0001\u0000\u0000"+ - "\u0000\u061e\u061f\u0001\u0000\u0000\u0000\u061f\u0111\u0001\u0000\u0000"+ - "\u0000\u0620\u0622\u0005O\u0000\u0000\u0621\u0623\u0005i\u0000\u0000\u0622"+ - "\u0621\u0001\u0000\u0000\u0000\u0622\u0623\u0001\u0000\u0000\u0000\u0623"+ - "\u0113\u0001\u0000\u0000\u0000\u0624\u0626\u0005c\u0000\u0000\u0625\u0627"+ - "\u0005i\u0000\u0000\u0626\u0625\u0001\u0000\u0000\u0000\u0626\u0627\u0001"+ - "\u0000\u0000\u0000\u0627\u0115\u0001\u0000\u0000\u0000\u0628\u0629\u0005"+ - "[\u0000\u0000\u0629\u062a\u0005i\u0000\u0000\u062a\u0117\u0001\u0000\u0000"+ - "\u0000\u062b\u062c\u0005_\u0000\u0000\u062c\u0119\u0001\u0000\u0000\u0000"+ - "\u062d\u0636\u0005`\u0000\u0000\u062e\u0637\u0003\u00b4Z\u0000\u062f\u0630"+ - "\u0003\u017e\u00bf\u0000\u0630\u0631\u0003\u00b4Z\u0000\u0631\u0637\u0001"+ - "\u0000\u0000\u0000\u0632\u0633\u0003\u0102\u0081\u0000\u0633\u0634\u0003"+ - "\u017e\u00bf\u0000\u0634\u0635\u0003\u00b4Z\u0000\u0635\u0637\u0001\u0000"+ - "\u0000\u0000\u0636\u062e\u0001\u0000\u0000\u0000\u0636\u062f\u0001\u0000"+ - "\u0000\u0000\u0636\u0632\u0001\u0000\u0000\u0000\u0637\u0638\u0001\u0000"+ - "\u0000\u0000\u0638\u063e\u0003\u00fe\u007f\u0000\u0639\u063c\u0005Z\u0000"+ - "\u0000\u063a\u063d\u0003\u011a\u008d\u0000\u063b\u063d\u0003\u00fe\u007f"+ - "\u0000\u063c\u063a\u0001\u0000\u0000\u0000\u063c\u063b\u0001\u0000\u0000"+ - "\u0000\u063d\u063f\u0001\u0000\u0000\u0000\u063e\u0639\u0001\u0000\u0000"+ - "\u0000\u063e\u063f\u0001\u0000\u0000\u0000\u063f\u011b\u0001\u0000\u0000"+ - "\u0000\u0640\u0643\u0003\u011e\u008f\u0000\u0641\u0643\u0003\u0124\u0092"+ - "\u0000\u0642\u0640\u0001\u0000\u0000\u0000\u0642\u0641\u0001\u0000\u0000"+ - "\u0000\u0643\u011d\u0001\u0000\u0000\u0000\u0644\u064f\u0005]\u0000\u0000"+ - "\u0645\u0647\u0003\u00b4Z\u0000\u0646\u0645\u0001\u0000\u0000\u0000\u0646"+ - "\u0647\u0001\u0000\u0000\u0000\u0647\u0650\u0001\u0000\u0000\u0000\u0648"+ - "\u064a\u0003\u0102\u0081\u0000\u0649\u0648\u0001\u0000\u0000\u0000\u0649"+ - "\u064a\u0001\u0000\u0000\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b"+ - "\u064d\u0003\u017e\u00bf\u0000\u064c\u064e\u0003\u00b4Z\u0000\u064d\u064c"+ - "\u0001\u0000\u0000\u0000\u064d\u064e\u0001\u0000\u0000\u0000\u064e\u0650"+ - "\u0001\u0000\u0000\u0000\u064f\u0646\u0001\u0000\u0000\u0000\u064f\u0649"+ - "\u0001\u0000\u0000\u0000\u0650\u0651\u0001\u0000\u0000\u0000\u0651\u0655"+ - "\u0005l\u0000\u0000\u0652\u0654\u0003\u0120\u0090\u0000\u0653\u0652\u0001"+ - "\u0000\u0000\u0000\u0654\u0657\u0001\u0000\u0000\u0000\u0655\u0653\u0001"+ - "\u0000\u0000\u0000\u0655\u0656\u0001\u0000\u0000\u0000\u0656\u0658\u0001"+ - "\u0000\u0000\u0000\u0657\u0655\u0001\u0000\u0000\u0000\u0658\u0659\u0005"+ - "m\u0000\u0000\u0659\u011f\u0001\u0000\u0000\u0000\u065a\u065b\u0003\u0122"+ - "\u0091\u0000\u065b\u065d\u0005s\u0000\u0000\u065c\u065e\u0003\u0100\u0080"+ - "\u0000\u065d\u065c\u0001\u0000\u0000\u0000\u065d\u065e\u0001\u0000\u0000"+ - "\u0000\u065e\u0121\u0001\u0000\u0000\u0000\u065f\u0660\u0005T\u0000\u0000"+ - "\u0660\u0663\u0003\u00f6{\u0000\u0661\u0663\u0005P\u0000\u0000\u0662\u065f"+ - "\u0001\u0000\u0000\u0000\u0662\u0661\u0001\u0000\u0000\u0000\u0663\u0123"+ - "\u0001\u0000\u0000\u0000\u0664\u066d\u0005]\u0000\u0000\u0665\u066e\u0003"+ - "\u0126\u0093\u0000\u0666\u0667\u0003\u017e\u00bf\u0000\u0667\u0668\u0003"+ - "\u0126\u0093\u0000\u0668\u066e\u0001\u0000\u0000\u0000\u0669\u066a\u0003"+ - "\u0102\u0081\u0000\u066a\u066b\u0003\u017e\u00bf\u0000\u066b\u066c\u0003"+ - "\u0126\u0093\u0000\u066c\u066e\u0001\u0000\u0000\u0000\u066d\u0665\u0001"+ - "\u0000\u0000\u0000\u066d\u0666\u0001\u0000\u0000\u0000\u066d\u0669\u0001"+ - "\u0000\u0000\u0000\u066e\u066f\u0001\u0000\u0000\u0000\u066f\u0673\u0005"+ - "l\u0000\u0000\u0670\u0672\u0003\u0128\u0094\u0000\u0671\u0670\u0001\u0000"+ - "\u0000\u0000\u0672\u0675\u0001\u0000\u0000\u0000\u0673\u0671\u0001\u0000"+ - "\u0000\u0000\u0673\u0674\u0001\u0000\u0000\u0000\u0674\u0676\u0001\u0000"+ - "\u0000\u0000\u0675\u0673\u0001\u0000\u0000\u0000\u0676\u0677\u0005m\u0000"+ - "\u0000\u0677\u0125\u0001\u0000\u0000\u0000\u0678\u0679\u0005i\u0000\u0000"+ - "\u0679\u067b\u0005w\u0000\u0000\u067a\u0678\u0001\u0000\u0000\u0000\u067a"+ - "\u067b\u0001\u0000\u0000\u0000\u067b\u067c\u0001\u0000\u0000\u0000\u067c"+ - "\u067d\u0003\u00c4b\u0000\u067d\u067e\u0005t\u0000\u0000\u067e\u067f\u0005"+ - "j\u0000\u0000\u067f\u0680\u0005b\u0000\u0000\u0680\u0681\u0005k\u0000"+ - "\u0000\u0681\u0127\u0001\u0000\u0000\u0000\u0682\u0683\u0003\u012a\u0095"+ - "\u0000\u0683\u0685\u0005s\u0000\u0000\u0684\u0686\u0003\u0100\u0080\u0000"+ - "\u0685\u0684\u0001\u0000\u0000\u0000\u0685\u0686\u0001\u0000\u0000\u0000"+ - "\u0686\u0129\u0001\u0000\u0000\u0000\u0687\u0688\u0005T\u0000\u0000\u0688"+ - "\u068b\u0003\u012c\u0096\u0000\u0689\u068b\u0005P\u0000\u0000\u068a\u0687"+ - "\u0001\u0000\u0000\u0000\u068a\u0689\u0001\u0000\u0000\u0000\u068b\u012b"+ - "\u0001\u0000\u0000\u0000\u068c\u068f\u0003\u00d2i\u0000\u068d\u068f\u0005"+ - "h\u0000\u0000\u068e\u068c\u0001\u0000\u0000\u0000\u068e\u068d\u0001\u0000"+ - "\u0000\u0000\u068f\u0697\u0001\u0000\u0000\u0000\u0690\u0693\u0005q\u0000"+ - "\u0000\u0691\u0694\u0003\u00d2i\u0000\u0692\u0694\u0005h\u0000\u0000\u0693"+ - "\u0691\u0001\u0000\u0000\u0000\u0693\u0692\u0001\u0000\u0000\u0000\u0694"+ - "\u0696\u0001\u0000\u0000\u0000\u0695\u0690\u0001\u0000\u0000\u0000\u0696"+ - "\u0699\u0001\u0000\u0000\u0000\u0697\u0695\u0001\u0000\u0000\u0000\u0697"+ - "\u0698\u0001\u0000\u0000\u0000\u0698\u012d\u0001\u0000\u0000\u0000\u0699"+ - "\u0697\u0001\u0000\u0000\u0000\u069a\u069b\u0005S\u0000\u0000\u069b\u069f"+ - "\u0005l\u0000\u0000\u069c\u069e\u0003\u0130\u0098\u0000\u069d\u069c\u0001"+ - "\u0000\u0000\u0000\u069e\u06a1\u0001\u0000\u0000\u0000\u069f\u069d\u0001"+ - "\u0000\u0000\u0000\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u06a2\u0001"+ - "\u0000\u0000\u0000\u06a1\u069f\u0001\u0000\u0000\u0000\u06a2\u06a3\u0005"+ - "m\u0000\u0000\u06a3\u012f\u0001\u0000\u0000\u0000\u06a4\u06a5\u0003\u0132"+ - "\u0099\u0000\u06a5\u06a7\u0005s\u0000\u0000\u06a6\u06a8\u0003\u0100\u0080"+ - "\u0000\u06a7\u06a6\u0001\u0000\u0000\u0000\u06a7\u06a8\u0001\u0000\u0000"+ - "\u0000\u06a8\u0131\u0001\u0000\u0000\u0000\u06a9\u06ac\u0005T\u0000\u0000"+ - "\u06aa\u06ad\u0003\u0106\u0083\u0000\u06ab\u06ad\u0003\u0134\u009a\u0000"+ - "\u06ac\u06aa\u0001\u0000\u0000\u0000\u06ac\u06ab\u0001\u0000\u0000\u0000"+ - "\u06ad\u06b0\u0001\u0000\u0000\u0000\u06ae\u06b0\u0005P\u0000\u0000\u06af"+ - "\u06a9\u0001\u0000\u0000\u0000\u06af\u06ae\u0001\u0000\u0000\u0000\u06b0"+ - "\u0133\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003\u00f6{\u0000\u06b2\u06b3"+ - "\u0005p\u0000\u0000\u06b3\u06b8\u0001\u0000\u0000\u0000\u06b4\u06b5\u0003"+ - "\u00f4z\u0000\u06b5\u06b6\u0005w\u0000\u0000\u06b6\u06b8\u0001\u0000\u0000"+ - "\u0000\u06b7\u06b1\u0001\u0000\u0000\u0000\u06b7\u06b4\u0001\u0000\u0000"+ - "\u0000\u06b7\u06b8\u0001\u0000\u0000\u0000\u06b8\u06b9\u0001\u0000\u0000"+ - "\u0000\u06b9\u06ba\u0003\u00b4Z\u0000\u06ba\u0135\u0001\u0000\u0000\u0000"+ - "\u06bb\u06c3\u0005d\u0000\u0000\u06bc\u06be\u0003\u00b4Z\u0000\u06bd\u06bc"+ - "\u0001\u0000\u0000\u0000\u06bd\u06be\u0001\u0000\u0000\u0000\u06be\u06c4"+ - "\u0001\u0000\u0000\u0000\u06bf\u06c4\u0003\u0138\u009c\u0000\u06c0\u06c2"+ - "\u0003\u00e8t\u0000\u06c1\u06c0\u0001\u0000\u0000\u0000\u06c1\u06c2\u0001"+ - "\u0000\u0000\u0000\u06c2\u06c4\u0001\u0000\u0000\u0000\u06c3\u06bd\u0001"+ - "\u0000\u0000\u0000\u06c3\u06bf\u0001\u0000\u0000\u0000\u06c3\u06c1\u0001"+ - "\u0000\u0000\u0000\u06c4\u06c5\u0001\u0000\u0000\u0000\u06c5\u06c6\u0003"+ - "\u00fe\u007f\u0000\u06c6\u0137\u0001\u0000\u0000\u0000\u06c7\u06c9\u0003"+ - "\u0102\u0081\u0000\u06c8\u06c7\u0001\u0000\u0000\u0000\u06c8\u06c9\u0001"+ - "\u0000\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cc\u0003"+ - "\u017e\u00bf\u0000\u06cb\u06cd\u0003\u00b4Z\u0000\u06cc\u06cb\u0001\u0000"+ - "\u0000\u0000\u06cc\u06cd\u0001\u0000\u0000\u0000\u06cd\u06ce\u0001\u0000"+ - "\u0000\u0000\u06ce\u06d0\u0003\u017e\u00bf\u0000\u06cf\u06d1\u0003\u0102"+ - "\u0081\u0000\u06d0\u06cf\u0001\u0000\u0000\u0000\u06d0\u06d1\u0001\u0000"+ - "\u0000\u0000\u06d1\u0139\u0001\u0000\u0000\u0000\u06d2\u06d3\u0005V\u0000"+ - "\u0000\u06d3\u06d4\u0003\u00b4Z\u0000\u06d4\u013b\u0001\u0000\u0000\u0000"+ - "\u06d5\u06d8\u0003\u0160\u00b0\u0000\u06d6\u06d8\u0005i\u0000\u0000\u06d7"+ - "\u06d5\u0001\u0000\u0000\u0000\u06d7\u06d6\u0001\u0000\u0000\u0000\u06d8"+ - "\u013d\u0001\u0000\u0000\u0000\u06d9\u06da\u0005n\u0000\u0000\u06da\u06db"+ - "\u0003\u0140\u00a0\u0000\u06db\u06dc\u0005o\u0000\u0000\u06dc\u06dd\u0003"+ - "\u0142\u00a1\u0000\u06dd\u013f\u0001\u0000\u0000\u0000\u06de\u06df\u0003"+ - "\u00b4Z\u0000\u06df\u0141\u0001\u0000\u0000\u0000\u06e0\u06e1\u0003\u00d2"+ - "i\u0000\u06e1\u0143\u0001\u0000\u0000\u0000\u06e2\u06e3\u0005\u008b\u0000"+ - "\u0000\u06e3\u06e4\u0003\u00d2i\u0000\u06e4\u0145\u0001\u0000\u0000\u0000"+ - "\u06e5\u06e6\u0005n\u0000\u0000\u06e6\u06e7\u0005o\u0000\u0000\u06e7\u06e8"+ - "\u0003\u0142\u00a1\u0000\u06e8\u0147\u0001\u0000\u0000\u0000\u06e9\u06ea"+ - "\u0005W\u0000\u0000\u06ea\u06eb\u0005n\u0000\u0000\u06eb\u06ec\u0003\u00d2"+ - "i\u0000\u06ec\u06ed\u0005o\u0000\u0000\u06ed\u06ee\u0003\u0142\u00a1\u0000"+ - "\u06ee\u0149\u0001\u0000\u0000\u0000\u06ef\u06f5\u0005Y\u0000\u0000\u06f0"+ - "\u06f1\u0005Y\u0000\u0000\u06f1\u06f5\u0005\u008d\u0000\u0000\u06f2\u06f3"+ - "\u0005\u008d\u0000\u0000\u06f3\u06f5\u0005Y\u0000\u0000\u06f4\u06ef\u0001"+ - "\u0000\u0000\u0000\u06f4\u06f0\u0001\u0000\u0000\u0000\u06f4\u06f2\u0001"+ - "\u0000\u0000\u0000\u06f5\u06f6\u0001\u0000\u0000\u0000\u06f6\u06f7\u0003"+ - "\u0142\u00a1\u0000\u06f7\u014b\u0001\u0000\u0000\u0000\u06f8\u06f9\u0005"+ - "Q\u0000\u0000\u06f9\u06fa\u0003\u014e\u00a7\u0000\u06fa\u014d\u0001\u0000"+ - "\u0000\u0000\u06fb\u06fc\u0003\u0152\u00a9\u0000\u06fc\u06fd\u0003\u0150"+ - "\u00a8\u0000\u06fd\u0700\u0001\u0000\u0000\u0000\u06fe\u0700\u0003\u0152"+ - "\u00a9\u0000\u06ff\u06fb\u0001\u0000\u0000\u0000\u06ff\u06fe\u0001\u0000"+ - "\u0000\u0000\u0700\u014f\u0001\u0000\u0000\u0000\u0701\u0704\u0003\u0152"+ - "\u00a9\u0000\u0702\u0704\u0003\u00d2i\u0000\u0703\u0701\u0001\u0000\u0000"+ - "\u0000\u0703\u0702\u0001\u0000\u0000\u0000\u0704\u0151\u0001\u0000\u0000"+ - "\u0000\u0705\u0711\u0005j\u0000\u0000\u0706\u070b\u0003\u00acV\u0000\u0707"+ - "\u0708\u0005q\u0000\u0000\u0708\u070a\u0003\u00acV\u0000\u0709\u0707\u0001"+ - "\u0000\u0000\u0000\u070a\u070d\u0001\u0000\u0000\u0000\u070b\u0709\u0001"+ - "\u0000\u0000\u0000\u070b\u070c\u0001\u0000\u0000\u0000\u070c\u070f\u0001"+ - "\u0000\u0000\u0000\u070d\u070b\u0001\u0000\u0000\u0000\u070e\u0710\u0005"+ - "q\u0000\u0000\u070f\u070e\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000"+ - "\u0000\u0000\u0710\u0712\u0001\u0000\u0000\u0000\u0711\u0706\u0001\u0000"+ - "\u0000\u0000\u0711\u0712\u0001\u0000\u0000\u0000\u0712\u0713\u0001\u0000"+ - "\u0000\u0000\u0713\u0714\u0005k\u0000\u0000\u0714\u0153\u0001\u0000\u0000"+ - "\u0000\u0715\u0716\u0003\u0156\u00ab\u0000\u0716\u0717\u0005j\u0000\u0000"+ - "\u0717\u0719\u0003\u00b4Z\u0000\u0718\u071a\u0005q\u0000\u0000\u0719\u0718"+ - "\u0001\u0000\u0000\u0000\u0719\u071a\u0001\u0000\u0000\u0000\u071a\u071b"+ - "\u0001\u0000\u0000\u0000\u071b\u071c\u0005k\u0000\u0000\u071c\u0155\u0001"+ - "\u0000\u0000\u0000\u071d\u0723\u0003\u00d4j\u0000\u071e\u071f\u0005j\u0000"+ - "\u0000\u071f\u0720\u0003\u0156\u00ab\u0000\u0720\u0721\u0005k\u0000\u0000"+ - "\u0721\u0723\u0001\u0000\u0000\u0000\u0722\u071d\u0001\u0000\u0000\u0000"+ - "\u0722\u071e\u0001\u0000\u0000\u0000\u0723\u0157\u0001\u0000\u0000\u0000"+ - "\u0724\u072b\u0003\u015a\u00ad\u0000\u0725\u072b\u0003\u015e\u00af\u0000"+ - "\u0726\u0727\u0005j\u0000\u0000\u0727\u0728\u0003\u00b4Z\u0000\u0728\u0729"+ - "\u0005k\u0000\u0000\u0729\u072b\u0001\u0000\u0000\u0000\u072a\u0724\u0001"+ - "\u0000\u0000\u0000\u072a\u0725\u0001\u0000\u0000\u0000\u072a\u0726\u0001"+ - "\u0000\u0000\u0000\u072b\u0159\u0001\u0000\u0000\u0000\u072c\u0730\u0003"+ - "\u00c2a\u0000\u072d\u0730\u0003\u0162\u00b1\u0000\u072e\u0730\u0003\u00c6"+ - "c\u0000\u072f\u072c\u0001\u0000\u0000\u0000\u072f\u072d\u0001\u0000\u0000"+ - "\u0000\u072f\u072e\u0001\u0000\u0000\u0000\u0730\u015b\u0001\u0000\u0000"+ - "\u0000\u0731\u0732\u0007\u0012\u0000\u0000\u0732\u015d\u0001\u0000\u0000"+ - "\u0000\u0733\u0734\u0005i\u0000\u0000\u0734\u015f\u0001\u0000\u0000\u0000"+ - "\u0735\u0736\u0005i\u0000\u0000\u0736\u0737\u0005t\u0000\u0000\u0737\u0738"+ - "\u0005i\u0000\u0000\u0738\u0161\u0001\u0000\u0000\u0000\u0739\u073a\u0003"+ - "\u00dam\u0000\u073a\u073b\u0003\u0164\u00b2\u0000\u073b\u0163\u0001\u0000"+ - "\u0000\u0000\u073c\u0741\u0005l\u0000\u0000\u073d\u073f\u0003\u0166\u00b3"+ - "\u0000\u073e\u0740\u0005q\u0000\u0000\u073f\u073e\u0001\u0000\u0000\u0000"+ - "\u073f\u0740\u0001\u0000\u0000\u0000\u0740\u0742\u0001\u0000\u0000\u0000"+ - "\u0741\u073d\u0001\u0000\u0000\u0000\u0741\u0742\u0001\u0000\u0000\u0000"+ - "\u0742\u0743\u0001\u0000\u0000\u0000\u0743\u0744\u0005m\u0000\u0000\u0744"+ - "\u0165\u0001\u0000\u0000\u0000\u0745\u074a\u0003\u0168\u00b4\u0000\u0746"+ - "\u0747\u0005q\u0000\u0000\u0747\u0749\u0003\u0168\u00b4\u0000\u0748\u0746"+ - "\u0001\u0000\u0000\u0000\u0749\u074c\u0001\u0000\u0000\u0000\u074a\u0748"+ - "\u0001\u0000\u0000\u0000\u074a\u074b\u0001\u0000\u0000\u0000\u074b\u0167"+ - "\u0001\u0000\u0000\u0000\u074c\u074a\u0001\u0000\u0000\u0000\u074d\u074e"+ - "\u0003\u016a\u00b5\u0000\u074e\u074f\u0005s\u0000\u0000\u074f\u0751\u0001"+ - "\u0000\u0000\u0000\u0750\u074d\u0001\u0000\u0000\u0000\u0750\u0751\u0001"+ - "\u0000\u0000\u0000\u0751\u0752\u0001\u0000\u0000\u0000\u0752\u0753\u0003"+ - "\u016c\u00b6\u0000\u0753\u0169\u0001\u0000\u0000\u0000\u0754\u0757\u0003"+ - "\u00b4Z\u0000\u0755\u0757\u0003\u0164\u00b2\u0000\u0756\u0754\u0001\u0000"+ - "\u0000\u0000\u0756\u0755\u0001\u0000\u0000\u0000\u0757\u016b\u0001\u0000"+ - "\u0000\u0000\u0758\u075b\u0003\u00b4Z\u0000\u0759\u075b\u0003\u0164\u00b2"+ - "\u0000\u075a\u0758\u0001\u0000\u0000\u0000\u075a\u0759\u0001\u0000\u0000"+ - "\u0000\u075b\u016d\u0001\u0000\u0000\u0000\u075c\u075d\u0005X\u0000\u0000"+ - "\u075d\u0763\u0005l\u0000\u0000\u075e\u075f\u0003`0\u0000\u075f\u0760"+ - "\u0003\u017e\u00bf\u0000\u0760\u0762\u0001\u0000\u0000\u0000\u0761\u075e"+ - "\u0001\u0000\u0000\u0000\u0762\u0765\u0001\u0000\u0000\u0000\u0763\u0761"+ - "\u0001\u0000\u0000\u0000\u0763\u0764\u0001\u0000\u0000\u0000\u0764\u0766"+ - "\u0001\u0000\u0000\u0000\u0765\u0763\u0001\u0000\u0000\u0000\u0766\u0767"+ - "\u0005m\u0000\u0000\u0767\u016f\u0001\u0000\u0000\u0000\u0768\u0769\u0007"+ - "\u0013\u0000\u0000\u0769\u0171\u0001\u0000\u0000\u0000\u076a\u076c\u0005"+ - "\u008b\u0000\u0000\u076b\u076a\u0001\u0000\u0000\u0000\u076b\u076c\u0001"+ - "\u0000\u0000\u0000\u076c\u076d\u0001\u0000\u0000\u0000\u076d\u076e\u0003"+ - "\u013c\u009e\u0000\u076e\u0173\u0001\u0000\u0000\u0000\u076f\u0770\u0005"+ - "n\u0000\u0000\u0770\u0771\u0003\u00b4Z\u0000\u0771\u0772\u0005o\u0000"+ - "\u0000\u0772\u0175\u0001\u0000\u0000\u0000\u0773\u0774\u0005t\u0000\u0000"+ - "\u0774\u0775\u0005j\u0000\u0000\u0775\u0776\u0003\u00d2i\u0000\u0776\u0777"+ - "\u0005k\u0000\u0000\u0777\u0177\u0001\u0000\u0000\u0000\u0778\u0787\u0005"+ - "j\u0000\u0000\u0779\u0780\u0003\u00f6{\u0000\u077a\u077d\u0003\u0156\u00ab"+ - "\u0000\u077b\u077c\u0005q\u0000\u0000\u077c\u077e\u0003\u00f6{\u0000\u077d"+ - "\u077b\u0001\u0000\u0000\u0000\u077d\u077e\u0001\u0000\u0000\u0000\u077e"+ - "\u0780\u0001\u0000\u0000\u0000\u077f\u0779\u0001\u0000\u0000\u0000\u077f"+ - "\u077a\u0001\u0000\u0000\u0000\u0780\u0782\u0001\u0000\u0000\u0000\u0781"+ - "\u0783\u0005x\u0000\u0000\u0782\u0781\u0001\u0000\u0000\u0000\u0782\u0783"+ - "\u0001\u0000\u0000\u0000\u0783\u0785\u0001\u0000\u0000\u0000\u0784\u0786"+ - "\u0005q\u0000\u0000\u0785\u0784\u0001\u0000\u0000\u0000\u0785\u0786\u0001"+ - "\u0000\u0000\u0000\u0786\u0788\u0001\u0000\u0000\u0000\u0787\u077f\u0001"+ - "\u0000\u0000\u0000\u0787\u0788\u0001\u0000\u0000\u0000\u0788\u0789\u0001"+ - "\u0000\u0000\u0000\u0789\u078a\u0005k\u0000\u0000\u078a\u0179\u0001\u0000"+ - "\u0000\u0000\u078b\u078c\u0003\u0156\u00ab\u0000\u078c\u078d\u0005t\u0000"+ - "\u0000\u078d\u078e\u0005i\u0000\u0000\u078e\u017b\u0001\u0000\u0000\u0000"+ - "\u078f\u0790\u0003\u00d2i\u0000\u0790\u017d\u0001\u0000\u0000\u0000\u0791"+ - "\u0796\u0005r\u0000\u0000\u0792\u0796\u0005\u0000\u0000\u0001\u0793\u0796"+ - "\u0005\u00a3\u0000\u0000\u0794\u0796\u0004\u00bf\u0013\u0000\u0795\u0791"+ - "\u0001\u0000\u0000\u0000\u0795\u0792\u0001\u0000\u0000\u0000\u0795\u0793"+ - "\u0001\u0000\u0000\u0000\u0795\u0794\u0001\u0000\u0000\u0000\u0796\u017f"+ - "\u0001\u0000\u0000\u0000\u00ca\u018e\u0193\u019a\u01a4\u01aa\u01b0\u01ba"+ + "\u00d2i\u0000\u02f8\u02fb\u0001\u0000\u0000\u0000\u02f9\u02fb\u0003\u0172"+ + "\u00b9\u0000\u02fa\u02f6\u0001\u0000\u0000\u0000\u02fa\u02f9\u0001\u0000"+ + "\u0000\u0000\u02fb\u02fd\u0001\u0000\u0000\u0000\u02fc\u02fe\u0003\u0170"+ + "\u00b8\u0000\u02fd\u02fc\u0001\u0000\u0000\u0000\u02fd\u02fe\u0001\u0000"+ + "\u0000\u0000\u02fea\u0001\u0000\u0000\u0000\u02ff\u0300\u0007\u0005\u0000"+ + "\u0000\u0300\u0301\u0005n\u0000\u0000\u0301\u0302\u0003\u00d2i\u0000\u0302"+ + "\u0303\u0005o\u0000\u0000\u0303\u030b\u0001\u0000\u0000\u0000\u0304\u0305"+ + "\u0005+\u0000\u0000\u0305\u0306\u0005n\u0000\u0000\u0306\u0307\u0003\u00d2"+ + "i\u0000\u0307\u0308\u0005o\u0000\u0000\u0308\u0309\u0003\u00d2i\u0000"+ + "\u0309\u030b\u0001\u0000\u0000\u0000\u030a\u02ff\u0001\u0000\u0000\u0000"+ + "\u030a\u0304\u0001\u0000\u0000\u0000\u030bc\u0001\u0000\u0000\u0000\u030c"+ + "\u0314\u0003p8\u0000\u030d\u030e\u0005L\u0000\u0000\u030e\u0314\u0006"+ + "2\uffff\uffff\u0000\u030f\u0310\u0005\u000e\u0000\u0000\u0310\u0314\u0006"+ + "2\uffff\uffff\u0000\u0311\u0312\u0005D\u0000\u0000\u0312\u0314\u00062"+ + "\uffff\uffff\u0000\u0313\u030c\u0001\u0000\u0000\u0000\u0313\u030d\u0001"+ + "\u0000\u0000\u0000\u0313\u030f\u0001\u0000\u0000\u0000\u0313\u0311\u0001"+ + "\u0000\u0000\u0000\u0314\u0315\u0001\u0000\u0000\u0000\u0315\u0317\u0003"+ + "\u017e\u00bf\u0000\u0316\u0313\u0001\u0000\u0000\u0000\u0317\u031a\u0001"+ + "\u0000\u0000\u0000\u0318\u0319\u0001\u0000\u0000\u0000\u0318\u0316\u0001"+ + "\u0000\u0000\u0000\u0319\u031d\u0001\u0000\u0000\u0000\u031a\u0318\u0001"+ + "\u0000\u0000\u0000\u031b\u031c\u0005\u000e\u0000\u0000\u031c\u031e\u0006"+ + "2\uffff\uffff\u0000\u031d\u031b\u0001\u0000\u0000\u0000\u031d\u031e\u0001"+ + "\u0000\u0000\u0000\u031e\u0320\u0001\u0000\u0000\u0000\u031f\u0321\u0003"+ + "n7\u0000\u0320\u031f\u0001\u0000\u0000\u0000\u0320\u0321\u0001\u0000\u0000"+ + "\u0000\u0321e\u0001\u0000\u0000\u0000\u0322\u0324\b\u0006\u0000\u0000"+ + "\u0323\u0322\u0001\u0000\u0000\u0000\u0324\u0325\u0001\u0000\u0000\u0000"+ + "\u0325\u0323\u0001\u0000\u0000\u0000\u0325\u0326\u0001\u0000\u0000\u0000"+ + "\u0326g\u0001\u0000\u0000\u0000\u0327\u032c\u0003f3\u0000\u0328\u0329"+ + "\u0005q\u0000\u0000\u0329\u032b\u0003f3\u0000\u032a\u0328\u0001\u0000"+ + "\u0000\u0000\u032b\u032e\u0001\u0000\u0000\u0000\u032c\u032a\u0001\u0000"+ + "\u0000\u0000\u032c\u032d\u0001\u0000\u0000\u0000\u032di\u0001\u0000\u0000"+ + "\u0000\u032e\u032c\u0001\u0000\u0000\u0000\u032f\u0330\u0003f3\u0000\u0330"+ + "\u0332\u0005j\u0000\u0000\u0331\u0333\u0003h4\u0000\u0332\u0331\u0001"+ + "\u0000\u0000\u0000\u0332\u0333\u0001\u0000\u0000\u0000\u0333\u0334\u0001"+ + "\u0000\u0000\u0000\u0334\u0335\u0005k\u0000\u0000\u0335k\u0001\u0000\u0000"+ + "\u0000\u0336\u033b\u0003j5\u0000\u0337\u0338\u0005q\u0000\u0000\u0338"+ + "\u033a\u0003j5\u0000\u0339\u0337\u0001\u0000\u0000\u0000\u033a\u033d\u0001"+ + "\u0000\u0000\u0000\u033b\u0339\u0001\u0000\u0000\u0000\u033b\u033c\u0001"+ + "\u0000\u0000\u0000\u033cm\u0001\u0000\u0000\u0000\u033d\u033b\u0001\u0000"+ + "\u0000\u0000\u033e\u033f\u0005N\u0000\u0000\u033f\u0341\u0005n\u0000\u0000"+ + "\u0340\u0342\u0003l6\u0000\u0341\u0340\u0001\u0000\u0000\u0000\u0341\u0342"+ + "\u0001\u0000\u0000\u0000\u0342\u0343\u0001\u0000\u0000\u0000\u0343\u0344"+ + "\u0005o\u0000\u0000\u0344\u0345\u0003\u017e\u00bf\u0000\u0345o\u0001\u0000"+ + "\u0000\u0000\u0346\u0347\u0005\t\u0000\u0000\u0347\u034f\u0003t:\u0000"+ + "\u0348\u0349\u0005\n\u0000\u0000\u0349\u034f\u0003t:\u0000\u034a\u034b"+ + "\u0005\u000b\u0000\u0000\u034b\u034f\u0003t:\u0000\u034c\u034d\u0005\r"+ + "\u0000\u0000\u034d\u034f\u0003r9\u0000\u034e\u0346\u0001\u0000\u0000\u0000"+ + "\u034e\u0348\u0001\u0000\u0000\u0000\u034e\u034a\u0001\u0000\u0000\u0000"+ + "\u034e\u034c\u0001\u0000\u0000\u0000\u034fq\u0001\u0000\u0000\u0000\u0350"+ + "\u0352\u0003\u00f6{\u0000\u0351\u0350\u0001\u0000\u0000\u0000\u0351\u0352"+ + "\u0001\u0000\u0000\u0000\u0352\u0355\u0001\u0000\u0000\u0000\u0353\u0354"+ + "\u0005`\u0000\u0000\u0354\u0356\u0003\u00b4Z\u0000\u0355\u0353\u0001\u0000"+ + "\u0000\u0000\u0355\u0356\u0001\u0000\u0000\u0000\u0356s\u0001\u0000\u0000"+ + "\u0000\u0357\u035a\u0001\u0000\u0000\u0000\u0358\u035a\u0003\u00b4Z\u0000"+ + "\u0359\u0357\u0001\u0000\u0000\u0000\u0359\u0358\u0001\u0000\u0000\u0000"+ + "\u035au\u0001\u0000\u0000\u0000\u035b\u035c\u00057\u0000\u0000\u035c\u035d"+ + "\u0003\u00b4Z\u0000\u035d\u0361\u0005l\u0000\u0000\u035e\u0360\u0003x"+ + "<\u0000\u035f\u035e\u0001\u0000\u0000\u0000\u0360\u0363\u0001\u0000\u0000"+ + "\u0000\u0361\u035f\u0001\u0000\u0000\u0000\u0361\u0362\u0001\u0000\u0000"+ + "\u0000\u0362\u0364\u0001\u0000\u0000\u0000\u0363\u0361\u0001\u0000\u0000"+ + "\u0000\u0364\u0365\u0005m\u0000\u0000\u0365w\u0001\u0000\u0000\u0000\u0366"+ + "\u0367\u0003z=\u0000\u0367\u0369\u0005s\u0000\u0000\u0368\u036a\u0003"+ + "\u0100\u0080\u0000\u0369\u0368\u0001\u0000\u0000\u0000\u0369\u036a\u0001"+ + "\u0000\u0000\u0000\u036ay\u0001\u0000\u0000\u0000\u036b\u036c\u0005T\u0000"+ + "\u0000\u036c\u036f\u0003|>\u0000\u036d\u036f\u0005P\u0000\u0000\u036e"+ + "\u036b\u0001\u0000\u0000\u0000\u036e\u036d\u0001\u0000\u0000\u0000\u036f"+ + "{\u0001\u0000\u0000\u0000\u0370\u0371\u0005%\u0000\u0000\u0371\u037e\u0005"+ + "i\u0000\u0000\u0372\u0373\u0003\u00dam\u0000\u0373\u0378\u0005l\u0000"+ + "\u0000\u0374\u0376\u0003~?\u0000\u0375\u0377\u0005q\u0000\u0000\u0376"+ + "\u0375\u0001\u0000\u0000\u0000\u0376\u0377\u0001\u0000\u0000\u0000\u0377"+ + "\u0379\u0001\u0000\u0000\u0000\u0378\u0374\u0001\u0000\u0000\u0000\u0378"+ + "\u0379\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000\u037a"+ + "\u037b\u0005m\u0000\u0000\u037b\u037e\u0001\u0000\u0000\u0000\u037c\u037e"+ + "\u0003\u00b4Z\u0000\u037d\u0370\u0001\u0000\u0000\u0000\u037d\u0372\u0001"+ + "\u0000\u0000\u0000\u037d\u037c\u0001\u0000\u0000\u0000\u037e}\u0001\u0000"+ + "\u0000\u0000\u037f\u0384\u0003|>\u0000\u0380\u0381\u0005q\u0000\u0000"+ + "\u0381\u0383\u0003|>\u0000\u0382\u0380\u0001\u0000\u0000\u0000\u0383\u0386"+ + "\u0001\u0000\u0000\u0000\u0384\u0382\u0001\u0000\u0000\u0000\u0384\u0385"+ + "\u0001\u0000\u0000\u0000\u0385\u007f\u0001\u0000\u0000\u0000\u0386\u0384"+ + "\u0001\u0000\u0000\u0000\u0387\u038c\u0005l\u0000\u0000\u0388\u0389\u0005"+ + "<\u0000\u0000\u0389\u038a\u0003\u00f4z\u0000\u038a\u038b\u0003\u017e\u00bf"+ + "\u0000\u038b\u038d\u0001\u0000\u0000\u0000\u038c\u0388\u0001\u0000\u0000"+ + "\u0000\u038c\u038d\u0001\u0000\u0000\u0000\u038d\u038f\u0001\u0000\u0000"+ + "\u0000\u038e\u0390\u0003\u0100\u0080\u0000\u038f\u038e\u0001\u0000\u0000"+ + "\u0000\u038f\u0390\u0001\u0000\u0000\u0000\u0390\u0391\u0001\u0000\u0000"+ + "\u0000\u0391\u0392\u0005m\u0000\u0000\u0392\u0081\u0001\u0000\u0000\u0000"+ + "\u0393\u0396\u0003\u0160\u00b0\u0000\u0394\u0396\u0005i\u0000\u0000\u0395"+ + "\u0393\u0001\u0000\u0000\u0000\u0395\u0394\u0001\u0000\u0000\u0000\u0396"+ + "\u039f\u0001\u0000\u0000\u0000\u0397\u039c\u0005l\u0000\u0000\u0398\u039a"+ + "\u0003\u0084B\u0000\u0399\u039b\u0005q\u0000\u0000\u039a\u0399\u0001\u0000"+ + "\u0000\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u039d\u0001\u0000"+ + "\u0000\u0000\u039c\u0398\u0001\u0000\u0000\u0000\u039c\u039d\u0001\u0000"+ + "\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u03a0\u0005m\u0000"+ + "\u0000\u039f\u0397\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000"+ + "\u0000\u03a0\u0083\u0001\u0000\u0000\u0000\u03a1\u03a6\u0003\u0086C\u0000"+ + "\u03a2\u03a3\u0005q\u0000\u0000\u03a3\u03a5\u0003\u0086C\u0000\u03a4\u03a2"+ + "\u0001\u0000\u0000\u0000\u03a5\u03a8\u0001\u0000\u0000\u0000\u03a6\u03a4"+ + "\u0001\u0000\u0000\u0000\u03a6\u03a7\u0001\u0000\u0000\u0000\u03a7\u0085"+ + "\u0001\u0000\u0000\u0000\u03a8\u03a6\u0001\u0000\u0000\u0000\u03a9\u03aa"+ + "\u0005i\u0000\u0000\u03aa\u03ac\u0005s\u0000\u0000\u03ab\u03a9\u0001\u0000"+ + "\u0000\u0000\u03ab\u03ac\u0001\u0000\u0000\u0000\u03ac\u03ad\u0001\u0000"+ + "\u0000\u0000\u03ad\u03ae\u0003\u00b4Z\u0000\u03ae\u0087\u0001\u0000\u0000"+ + "\u0000\u03af\u03b0\u0005H\u0000\u0000\u03b0\u03b1\u0003\u00b4Z\u0000\u03b1"+ + "\u03b2\u0005\u000f\u0000\u0000\u03b2\u03b3\u0003\u0082A\u0000\u03b3\u03b4"+ + "\u0003\u00fe\u007f\u0000\u03b4\u0089\u0001\u0000\u0000\u0000\u03b5\u03b6"+ + "\u0003\u00d2i\u0000\u03b6\u03b7\u0005\u000f\u0000\u0000\u03b7\u03ca\u0003"+ + "\u00d2i\u0000\u03b8\u03be\u0005l\u0000\u0000\u03b9\u03ba\u0003\u0092I"+ + "\u0000\u03ba\u03bb\u0003\u017e\u00bf\u0000\u03bb\u03bd\u0001\u0000\u0000"+ + "\u0000\u03bc\u03b9\u0001\u0000\u0000\u0000\u03bd\u03c0\u0001\u0000\u0000"+ + "\u0000\u03be\u03bc\u0001\u0000\u0000\u0000\u03be\u03bf\u0001\u0000\u0000"+ + "\u0000\u03bf\u03c6\u0001\u0000\u0000\u0000\u03c0\u03be\u0001\u0000\u0000"+ + "\u0000\u03c1\u03c2\u0003\u008cF\u0000\u03c2\u03c3\u0003\u017e\u00bf\u0000"+ + "\u03c3\u03c5\u0001\u0000\u0000\u0000\u03c4\u03c1\u0001\u0000\u0000\u0000"+ + "\u03c5\u03c8\u0001\u0000\u0000\u0000\u03c6\u03c4\u0001\u0000\u0000\u0000"+ + "\u03c6\u03c7\u0001\u0000\u0000\u0000\u03c7\u03c9\u0001\u0000\u0000\u0000"+ + "\u03c8\u03c6\u0001\u0000\u0000\u0000\u03c9\u03cb\u0005m\u0000\u0000\u03ca"+ + "\u03b8\u0001\u0000\u0000\u0000\u03ca\u03cb\u0001\u0000\u0000\u0000\u03cb"+ + "\u008b\u0001\u0000\u0000\u0000\u03cc\u03ce\u0005\u000e\u0000\u0000\u03cd"+ + "\u03cc\u0001\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce"+ + "\u03cf\u0001\u0000\u0000\u0000\u03cf\u03d0\u0003\u008eG\u0000\u03d0\u03d1"+ + "\u0005i\u0000\u0000\u03d1\u03d3\u0003\u014e\u00a7\u0000\u03d2\u03d4\u0003"+ + "\u00fe\u007f\u0000\u03d3\u03d2\u0001\u0000\u0000\u0000\u03d3\u03d4\u0001"+ + "\u0000\u0000\u0000\u03d4\u008d\u0001\u0000\u0000\u0000\u03d5\u03d7\u0005"+ + "j\u0000\u0000\u03d6\u03d8\u0005i\u0000\u0000\u03d7\u03d6\u0001\u0000\u0000"+ + "\u0000\u03d7\u03d8\u0001\u0000\u0000\u0000\u03d8\u03da\u0001\u0000\u0000"+ + "\u0000\u03d9\u03db\u0005\u008b\u0000\u0000\u03da\u03d9\u0001\u0000\u0000"+ + "\u0000\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u03dc\u0001\u0000\u0000"+ + "\u0000\u03dc\u03dd\u0003\u013c\u009e\u0000\u03dd\u03de\u0005k\u0000\u0000"+ + "\u03de\u008f\u0001\u0000\u0000\u0000\u03df\u03e5\u0003\u00c4b\u0000\u03e0"+ + "\u03e1\u0003\u00d2i\u0000\u03e1\u03e2\u0005t\u0000\u0000\u03e2\u03e3\u0005"+ + "i\u0000\u0000\u03e3\u03e5\u0001\u0000\u0000\u0000\u03e4\u03df\u0001\u0000"+ + "\u0000\u0000\u03e4\u03e0\u0001\u0000\u0000\u0000\u03e5\u0091\u0001\u0000"+ + "\u0000\u0000\u03e6\u03e7\u00059\u0000\u0000\u03e7\u03e8\u0005i\u0000\u0000"+ + "\u03e8\u03eb\u0005w\u0000\u0000\u03e9\u03ec\u0003\u0090H\u0000\u03ea\u03ec"+ + "\u0003\u015e\u00af\u0000\u03eb\u03e9\u0001\u0000\u0000\u0000\u03eb\u03ea"+ + "\u0001\u0000\u0000\u0000\u03ec\u0093\u0001\u0000\u0000\u0000\u03ed\u03ee"+ + "\u00050\u0000\u0000\u03ee\u03ef\u0005j\u0000\u0000\u03ef\u03f2\u0003\u00d2"+ + "i\u0000\u03f0\u03f1\u0005q\u0000\u0000\u03f1\u03f3\u0003\u00f6{\u0000"+ + "\u03f2\u03f0\u0001\u0000\u0000\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000"+ + "\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0005k\u0000\u0000\u03f5"+ + "\u0095\u0001\u0000\u0000\u0000\u03f6\u03f7\u0005/\u0000\u0000\u03f7\u03f8"+ + "\u0005j\u0000\u0000\u03f8\u03f9\u0003\u00d2i\u0000\u03f9\u03fa\u0005k"+ + "\u0000\u0000\u03fa\u0097\u0001\u0000\u0000\u0000\u03fb\u03fe\u0003d2\u0000"+ + "\u03fc\u03ff\u0003\u009aM\u0000\u03fd\u03ff\u0003\u009cN\u0000\u03fe\u03fc"+ + "\u0001\u0000\u0000\u0000\u03fe\u03fd\u0001\u0000\u0000\u0000\u03ff\u0099"+ + "\u0001\u0000\u0000\u0000\u0400\u0401\u0005Q\u0000\u0000\u0401\u0402\u0005"+ + "i\u0000\u0000\u0402\u0404\u0003\u014e\u00a7\u0000\u0403\u0405\u0003\u0080"+ + "@\u0000\u0404\u0403\u0001\u0000\u0000\u0000\u0404\u0405\u0001\u0000\u0000"+ + "\u0000\u0405\u009b\u0001\u0000\u0000\u0000\u0406\u0407\u0005Q\u0000\u0000"+ + "\u0407\u0408\u0003\u00aaU\u0000\u0408\u0409\u0005i\u0000\u0000\u0409\u040b"+ + "\u0003\u014e\u00a7\u0000\u040a\u040c\u0003\u0080@\u0000\u040b\u040a\u0001"+ + "\u0000\u0000\u0000\u040b\u040c\u0001\u0000\u0000\u0000\u040c\u009d\u0001"+ + "\u0000\u0000\u0000\u040d\u0410\u0005\u001b\u0000\u0000\u040e\u0411\u0003"+ + "\u0098L\u0000\u040f\u0411\u0003\u00eew\u0000\u0410\u040e\u0001\u0000\u0000"+ + "\u0000\u0410\u040f\u0001\u0000\u0000\u0000\u0411\u009f\u0001\u0000\u0000"+ + "\u0000\u0412\u0413\u00059\u0000\u0000\u0413\u0414\u0005i\u0000\u0000\u0414"+ + "\u0416\u0003\u0152\u00a9\u0000\u0415\u0417\u0003\u00a2Q\u0000\u0416\u0415"+ + "\u0001\u0000\u0000\u0000\u0416\u0417\u0001\u0000\u0000\u0000\u0417\u00a1"+ + "\u0001\u0000\u0000\u0000\u0418\u0419\u0005l\u0000\u0000\u0419\u041a\u0003"+ + "\u00b4Z\u0000\u041a\u041b\u0003\u017e\u00bf\u0000\u041b\u041c\u0005m\u0000"+ + "\u0000\u041c\u00a3\u0001\u0000\u0000\u0000\u041d\u041e\u00059\u0000\u0000"+ + "\u041e\u041f\u0003\u00aaU\u0000\u041f\u0420\u0005i\u0000\u0000\u0420\u0422"+ + "\u0003\u0152\u00a9\u0000\u0421\u0423\u0003\u00a2Q\u0000\u0422\u0421\u0001"+ + "\u0000\u0000\u0000\u0422\u0423\u0001\u0000\u0000\u0000\u0423\u00a5\u0001"+ + "\u0000\u0000\u0000\u0424\u042c\u0003\u0006\u0003\u0000\u0425\u0428\u0003"+ + "\u00d2i\u0000\u0426\u0427\u0005p\u0000\u0000\u0427\u0429\u0003\u00f6{"+ + "\u0000\u0428\u0426\u0001\u0000\u0000\u0000\u0428\u0429\u0001\u0000\u0000"+ + "\u0000\u0429\u042d\u0001\u0000\u0000\u0000\u042a\u042b\u0005p\u0000\u0000"+ + "\u042b\u042d\u0003\u00f6{\u0000\u042c\u0425\u0001\u0000\u0000\u0000\u042c"+ + "\u042a\u0001\u0000\u0000\u0000\u042d\u00a7\u0001\u0000\u0000\u0000\u042e"+ + "\u042f\u0003\u0006\u0003\u0000\u042f\u0430\u0005w\u0000\u0000\u0430\u0431"+ + "\u0003\u00f6{\u0000\u0431\u00a9\u0001\u0000\u0000\u0000\u0432\u0434\u0005"+ + "j\u0000\u0000\u0433\u0435\u0003\b\u0004\u0000\u0434\u0433\u0001\u0000"+ + "\u0000\u0000\u0434\u0435\u0001\u0000\u0000\u0000\u0435\u0436\u0001\u0000"+ + "\u0000\u0000\u0436\u0438\u0003\u00d2i\u0000\u0437\u0439\u0005q\u0000\u0000"+ + "\u0438\u0437\u0001\u0000\u0000\u0000\u0438\u0439\u0001\u0000\u0000\u0000"+ + "\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0005k\u0000\u0000\u043b"+ + "\u00ab\u0001\u0000\u0000\u0000\u043c\u043f\u0003\u00aeW\u0000\u043d\u043f"+ + "\u0003\u00b0X\u0000\u043e\u043c\u0001\u0000\u0000\u0000\u043e\u043d\u0001"+ + "\u0000\u0000\u0000\u043f\u00ad\u0001\u0000\u0000\u0000\u0440\u0442\u0003"+ + "\u00f4z\u0000\u0441\u0440\u0001\u0000\u0000\u0000\u0441\u0442\u0001\u0000"+ + "\u0000\u0000\u0442\u0443\u0001\u0000\u0000\u0000\u0443\u0444\u0003\u00b2"+ + "Y\u0000\u0444\u00af\u0001\u0000\u0000\u0000\u0445\u0447\u0005\u001b\u0000"+ + "\u0000\u0446\u0448\u0003\u00f4z\u0000\u0447\u0446\u0001\u0000\u0000\u0000"+ + "\u0447\u0448\u0001\u0000\u0000\u0000\u0448\u0449\u0001\u0000\u0000\u0000"+ + "\u0449\u044a\u0003\u00b2Y\u0000\u044a\u00b1\u0001\u0000\u0000\u0000\u044b"+ + "\u044d\u0005x\u0000\u0000\u044c\u044b\u0001\u0000\u0000\u0000\u044c\u044d"+ + "\u0001\u0000\u0000\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f"+ + "\u0003\u00d2i\u0000\u044f\u00b3\u0001\u0000\u0000\u0000\u0450\u0451\u0006"+ + "Z\uffff\uffff\u0000\u0451\u0452\u0007\u0007\u0000\u0000\u0452\u0466\u0003"+ + "\u00b4Z\u000f\u0453\u0466\u0003\u00c4b\u0000\u0454\u0455\u0005\u0019\u0000"+ + "\u0000\u0455\u0456\u0003.\u0017\u0000\u0456\u0457\u0005\u001c\u0000\u0000"+ + "\u0457\u0458\u0003\u00b4Z\u0003\u0458\u0466\u0001\u0000\u0000\u0000\u0459"+ + "\u045a\u0005\u001a\u0000\u0000\u045a\u045b\u0003\u00a8T\u0000\u045b\u045c"+ + "\u0005\u001c\u0000\u0000\u045c\u045d\u0003\u00b4Z\u0002\u045d\u0466\u0001"+ + "\u0000\u0000\u0000\u045e\u045f\u0007\b\u0000\u0000\u045f\u0460\u0003&"+ + "\u0013\u0000\u0460\u0461\u0005s\u0000\u0000\u0461\u0462\u0005s\u0000\u0000"+ + "\u0462\u0463\u0003*\u0015\u0000\u0463\u0464\u0003\u00b4Z\u0001\u0464\u0466"+ + "\u0001\u0000\u0000\u0000\u0465\u0450\u0001\u0000\u0000\u0000\u0465\u0453"+ + "\u0001\u0000\u0000\u0000\u0465\u0454\u0001\u0000\u0000\u0000\u0465\u0459"+ + "\u0001\u0000\u0000\u0000\u0465\u045e\u0001\u0000\u0000\u0000\u0466\u048a"+ + "\u0001\u0000\u0000\u0000\u0467\u0468\n\r\u0000\u0000\u0468\u0469\u0007"+ + "\t\u0000\u0000\u0469\u0489\u0003\u00b4Z\u000e\u046a\u046b\n\f\u0000\u0000"+ + "\u046b\u046c\u0007\n\u0000\u0000\u046c\u0489\u0003\u00b4Z\r\u046d\u046e"+ + "\n\u000b\u0000\u0000\u046e\u046f\u0007\u000b\u0000\u0000\u046f\u0489\u0003"+ + "\u00b4Z\f\u0470\u0471\n\n\u0000\u0000\u0471\u0472\u0007\f\u0000\u0000"+ + "\u0472\u0489\u0003\u00b4Z\u000b\u0473\u0474\n\t\u0000\u0000\u0474\u0475"+ + "\u0007\r\u0000\u0000\u0475\u0489\u0003\u00b4Z\n\u0476\u0477\n\u0007\u0000"+ + "\u0000\u0477\u0478\u0005z\u0000\u0000\u0478\u0489\u0003\u00b4Z\b\u0479"+ + "\u047a\n\u0006\u0000\u0000\u047a\u047b\u0005y\u0000\u0000\u047b\u0489"+ + "\u0003\u00b4Z\u0007\u047c\u047d\n\u0005\u0000\u0000\u047d\u047e\u0005"+ + "\"\u0000\u0000\u047e\u0489\u0003\u00b4Z\u0005\u047f\u0480\n\u0004\u0000"+ + "\u0000\u0480\u0481\u0005%\u0000\u0000\u0481\u0482\u0003\u00b4Z\u0000\u0482"+ + "\u0483\u0005s\u0000\u0000\u0483\u0484\u0003\u00b4Z\u0004\u0484\u0489\u0001"+ + "\u0000\u0000\u0000\u0485\u0486\n\b\u0000\u0000\u0486\u0487\u0005\u000f"+ + "\u0000\u0000\u0487\u0489\u0003\u0082A\u0000\u0488\u0467\u0001\u0000\u0000"+ + "\u0000\u0488\u046a\u0001\u0000\u0000\u0000\u0488\u046d\u0001\u0000\u0000"+ + "\u0000\u0488\u0470\u0001\u0000\u0000\u0000\u0488\u0473\u0001\u0000\u0000"+ + "\u0000\u0488\u0476\u0001\u0000\u0000\u0000\u0488\u0479\u0001\u0000\u0000"+ + "\u0000\u0488\u047c\u0001\u0000\u0000\u0000\u0488\u047f\u0001\u0000\u0000"+ + "\u0000\u0488\u0485\u0001\u0000\u0000\u0000\u0489\u048c\u0001\u0000\u0000"+ + "\u0000\u048a\u0488\u0001\u0000\u0000\u0000\u048a\u048b\u0001\u0000\u0000"+ + "\u0000\u048b\u00b5\u0001\u0000\u0000\u0000\u048c\u048a\u0001\u0000\u0000"+ + "\u0000\u048d\u04a2\u0003\u0018\f\u0000\u048e\u04a2\u0003\u001a\r\u0000"+ + "\u048f\u04a2\u0003\u00ba]\u0000\u0490\u04a2\u0003\u00b8\\\u0000\u0491"+ + "\u04a2\u0003\u00eew\u0000\u0492\u04a2\u0003\u010e\u0087\u0000\u0493\u04a2"+ + "\u0003\u0102\u0081\u0000\u0494\u04a2\u0003\u013a\u009d\u0000\u0495\u04a2"+ + "\u0003\u0110\u0088\u0000\u0496\u04a2\u0003\u0112\u0089\u0000\u0497\u04a2"+ + "\u0003\u0114\u008a\u0000\u0498\u04a2\u0003\u0116\u008b\u0000\u0499\u04a2"+ + "\u0003\u0118\u008c\u0000\u049a\u04a2\u0003\u00fe\u007f\u0000\u049b\u04a2"+ + "\u0003\u011a\u008d\u0000\u049c\u04a2\u0003\u011c\u008e\u0000\u049d\u04a2"+ + "\u0003\u012e\u0097\u0000\u049e\u04a2\u0003\u00bc^\u0000\u049f\u04a2\u0003"+ + "\u00c0`\u0000\u04a0\u04a2\u0003\u0088D\u0000\u04a1\u048d\u0001\u0000\u0000"+ + "\u0000\u04a1\u048e\u0001\u0000\u0000\u0000\u04a1\u048f\u0001\u0000\u0000"+ + "\u0000\u04a1\u0490\u0001\u0000\u0000\u0000\u04a1\u0491\u0001\u0000\u0000"+ + "\u0000\u04a1\u0492\u0001\u0000\u0000\u0000\u04a1\u0493\u0001\u0000\u0000"+ + "\u0000\u04a1\u0494\u0001\u0000\u0000\u0000\u04a1\u0495\u0001\u0000\u0000"+ + "\u0000\u04a1\u0496\u0001\u0000\u0000\u0000\u04a1\u0497\u0001\u0000\u0000"+ + "\u0000\u04a1\u0498\u0001\u0000\u0000\u0000\u04a1\u0499\u0001\u0000\u0000"+ + "\u0000\u04a1\u049a\u0001\u0000\u0000\u0000\u04a1\u049b\u0001\u0000\u0000"+ + "\u0000\u04a1\u049c\u0001\u0000\u0000\u0000\u04a1\u049d\u0001\u0000\u0000"+ + "\u0000\u04a1\u049e\u0001\u0000\u0000\u0000\u04a1\u049f\u0001\u0000\u0000"+ + "\u0000\u04a1\u04a0\u0001\u0000\u0000\u0000\u04a2\u00b7\u0001\u0000\u0000"+ + "\u0000\u04a3\u04a4\u0005$\u0000\u0000\u04a4\u04a5\u0003\u00b4Z\u0000\u04a5"+ + "\u00b9\u0001\u0000\u0000\u0000\u04a6\u04a7\u0005\\\u0000\u0000\u04a7\u04a9"+ + "\u0003\u00b4Z\u0000\u04a8\u04aa\u0003\u00fe\u007f\u0000\u04a9\u04a8\u0001"+ + "\u0000\u0000\u0000\u04a9\u04aa\u0001\u0000\u0000\u0000\u04aa\u00bb\u0001"+ + "\u0000\u0000\u0000\u04ab\u04ac\u0003\u00be_\u0000\u04ac\u04ad\u0003\u0136"+ + "\u009b\u0000\u04ad\u00bd\u0001\u0000\u0000\u0000\u04ae\u04af\u0005\f\u0000"+ + "\u0000\u04af\u04b0\u0003\u00b4Z\u0000\u04b0\u04b1\u0003\u017e\u00bf\u0000"+ + "\u04b1\u04b3\u0001\u0000\u0000\u0000\u04b2\u04ae\u0001\u0000\u0000\u0000"+ + "\u04b3\u04b6\u0001\u0000\u0000\u0000\u04b4\u04b2\u0001\u0000\u0000\u0000"+ + "\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04bb\u0001\u0000\u0000\u0000"+ + "\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b7\u04b8\u0005\r\u0000\u0000\u04b8"+ + "\u04b9\u0003r9\u0000\u04b9\u04ba\u0003\u017e\u00bf\u0000\u04ba\u04bc\u0001"+ + "\u0000\u0000\u0000\u04bb\u04b7\u0001\u0000\u0000\u0000\u04bb\u04bc\u0001"+ + "\u0000\u0000\u0000\u04bc\u00bf\u0001\u0000\u0000\u0000\u04bd\u04be\u0005"+ + "U\u0000\u0000\u04be\u04c3\u0003\u00b4Z\u0000\u04bf\u04c0\u0005U\u0000"+ + "\u0000\u04c0\u04c1\u0007\u0001\u0000\u0000\u04c1\u04c3\u0003.\u0017\u0000"+ + "\u04c2\u04bd\u0001\u0000\u0000\u0000\u04c2\u04bf\u0001\u0000\u0000\u0000"+ + "\u04c3\u00c1\u0001\u0000\u0000\u0000\u04c4\u04cd\u0005\u0003\u0000\u0000"+ + "\u04c5\u04cd\u0005\u0004\u0000\u0000\u04c6\u04cd\u0005h\u0000\u0000\u04c7"+ + "\u04cd\u0003\u015c\u00ae\u0000\u04c8\u04cd\u0003\u0170\u00b8\u0000\u04c9"+ + "\u04cd\u0005\u0001\u0000\u0000\u04ca\u04cd\u0005\u0093\u0000\u0000\u04cb"+ + "\u04cd\u0005\u0094\u0000\u0000\u04cc\u04c4\u0001\u0000\u0000\u0000\u04cc"+ + "\u04c5\u0001\u0000\u0000\u0000\u04cc\u04c6\u0001\u0000\u0000\u0000\u04cc"+ + "\u04c7\u0001\u0000\u0000\u0000\u04cc\u04c8\u0001\u0000\u0000\u0000\u04cc"+ + "\u04c9\u0001\u0000\u0000\u0000\u04cc\u04ca\u0001\u0000\u0000\u0000\u04cc"+ + "\u04cb\u0001\u0000\u0000\u0000\u04cd\u00c3\u0001\u0000\u0000\u0000\u04ce"+ + "\u04cf\u0006b\uffff\uffff\u0000\u04cf\u04df\u0003\u0158\u00ac\u0000\u04d0"+ + "\u04df\u0003\u0154\u00aa\u0000\u04d1\u04df\u0003\u017a\u00bd\u0000\u04d2"+ + "\u04df\u0003 \u0010\u0000\u04d3\u04df\u0003\u0096K\u0000\u04d4\u04df\u0003"+ + "\u0094J\u0000\u04d5\u04d6\u0005M\u0000\u0000\u04d6\u04d7\u0003\u00c4b"+ + "\u0000\u04d7\u04d8\u0003\u0178\u00bc\u0000\u04d8\u04df\u0001\u0000\u0000"+ + "\u0000\u04d9\u04da\u0007\u000e\u0000\u0000\u04da\u04db\u0005j\u0000\u0000"+ + "\u04db\u04dc\u0003\u00b4Z\u0000\u04dc\u04dd\u0005k\u0000\u0000\u04dd\u04df"+ + "\u0001\u0000\u0000\u0000\u04de\u04ce\u0001\u0000\u0000\u0000\u04de\u04d0"+ + "\u0001\u0000\u0000\u0000\u04de\u04d1\u0001\u0000\u0000\u0000\u04de\u04d2"+ + "\u0001\u0000\u0000\u0000\u04de\u04d3\u0001\u0000\u0000\u0000\u04de\u04d4"+ + "\u0001\u0000\u0000\u0000\u04de\u04d5\u0001\u0000\u0000\u0000\u04de\u04d9"+ + "\u0001\u0000\u0000\u0000\u04df\u04f6\u0001\u0000\u0000\u0000\u04e0\u04e1"+ + "\n\n\u0000\u0000\u04e1\u04e2\u0005t\u0000\u0000\u04e2\u04f5\u0005i\u0000"+ + "\u0000\u04e3\u04e4\n\t\u0000\u0000\u04e4\u04f5\u0003\u0174\u00ba\u0000"+ + "\u04e5\u04e6\n\b\u0000\u0000\u04e6\u04f5\u0003\u00deo\u0000\u04e7\u04e8"+ + "\n\u0007\u0000\u0000\u04e8\u04f5\u0003L&\u0000\u04e9\u04ea\n\u0006\u0000"+ + "\u0000\u04ea\u04f5\u0003\u0176\u00bb\u0000\u04eb\u04ec\n\u0005\u0000\u0000"+ + "\u04ec\u04f5\u0003\u0178\u00bc\u0000\u04ed\u04ee\n\u0003\u0000\u0000\u04ee"+ + "\u04ef\u0003\u0178\u00bc\u0000\u04ef\u04f0\u0005\u0010\u0000\u0000\u04f0"+ + "\u04f1\u0003\u0082A\u0000\u04f1\u04f5\u0001\u0000\u0000\u0000\u04f2\u04f3"+ + "\n\u0002\u0000\u0000\u04f3\u04f5\u0003\u00cae\u0000\u04f4\u04e0\u0001"+ + "\u0000\u0000\u0000\u04f4\u04e3\u0001\u0000\u0000\u0000\u04f4\u04e5\u0001"+ + "\u0000\u0000\u0000\u04f4\u04e7\u0001\u0000\u0000\u0000\u04f4\u04e9\u0001"+ + "\u0000\u0000\u0000\u04f4\u04eb\u0001\u0000\u0000\u0000\u04f4\u04ed\u0001"+ + "\u0000\u0000\u0000\u04f4\u04f2\u0001\u0000\u0000\u0000\u04f5\u04f8\u0001"+ + "\u0000\u0000\u0000\u04f6\u04f4\u0001\u0000\u0000\u0000\u04f6\u04f7\u0001"+ + "\u0000\u0000\u0000\u04f7\u00c5\u0001\u0000\u0000\u0000\u04f8\u04f6\u0001"+ + "\u0000\u0000\u0000\u04f9\u04fa\u0003d2\u0000\u04fa\u04fb\u0003\u00c8d"+ + "\u0000\u04fb\u00c7\u0001\u0000\u0000\u0000\u04fc\u04fe\u0005Q\u0000\u0000"+ + "\u04fd\u04ff\u0005i\u0000\u0000\u04fe\u04fd\u0001\u0000\u0000\u0000\u04fe"+ + "\u04ff\u0001\u0000\u0000\u0000\u04ff\u0500\u0001\u0000\u0000\u0000\u0500"+ + "\u0502\u0003\u014e\u00a7\u0000\u0501\u0503\u0003\u0080@\u0000\u0502\u0501"+ + "\u0001\u0000\u0000\u0000\u0502\u0503\u0001\u0000\u0000\u0000\u0503\u00c9"+ + "\u0001\u0000\u0000\u0000\u0504\u0506\u0005&\u0000\u0000\u0505\u0507\u0003"+ + "\u00f6{\u0000\u0506\u0505\u0001\u0000\u0000\u0000\u0506\u0507\u0001\u0000"+ + "\u0000\u0000\u0507\u0509\u0001\u0000\u0000\u0000\u0508\u050a\u0005q\u0000"+ + "\u0000\u0509\u0508\u0001\u0000\u0000\u0000\u0509\u050a\u0001\u0000\u0000"+ + "\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050c\u0005\'\u0000\u0000"+ + "\u050c\u00cb\u0001\u0000\u0000\u0000\u050d\u050e\u0005R\u0000\u0000\u050e"+ + "\u0518\u0005l\u0000\u0000\u050f\u0513\u0003\u00d0h\u0000\u0510\u0513\u0003"+ + "\u013c\u009e\u0000\u0511\u0513\u0003\u00ceg\u0000\u0512\u050f\u0001\u0000"+ + "\u0000\u0000\u0512\u0510\u0001\u0000\u0000\u0000\u0512\u0511\u0001\u0000"+ + "\u0000\u0000\u0513\u0514\u0001\u0000\u0000\u0000\u0514\u0515\u0003\u017e"+ + "\u00bf\u0000\u0515\u0517\u0001\u0000\u0000\u0000\u0516\u0512\u0001\u0000"+ + "\u0000\u0000\u0517\u051a\u0001\u0000\u0000\u0000\u0518\u0516\u0001\u0000"+ + "\u0000\u0000\u0518\u0519\u0001\u0000\u0000\u0000\u0519\u051b\u0001\u0000"+ + "\u0000\u0000\u051a\u0518\u0001\u0000\u0000\u0000\u051b\u051c\u0005m\u0000"+ + "\u0000\u051c\u00cd\u0001\u0000\u0000\u0000\u051d\u051e\u00059\u0000\u0000"+ + "\u051e\u051f\u0005i\u0000\u0000\u051f\u0520\u0003\u0152\u00a9\u0000\u0520"+ + "\u00cf\u0001\u0000\u0000\u0000\u0521\u0523\u0005\u001b\u0000\u0000\u0522"+ + "\u0521\u0001\u0000\u0000\u0000\u0522\u0523\u0001\u0000\u0000\u0000\u0523"+ + "\u0524\u0001\u0000\u0000\u0000\u0524\u0525\u0003d2\u0000\u0525\u0526\u0005"+ + "i\u0000\u0000\u0526\u0527\u0003\u0152\u00a9\u0000\u0527\u0528\u0003\u0150"+ + "\u00a8\u0000\u0528\u0531\u0001\u0000\u0000\u0000\u0529\u052b\u0005\u001b"+ + "\u0000\u0000\u052a\u0529\u0001\u0000\u0000\u0000\u052a\u052b\u0001\u0000"+ + "\u0000\u0000\u052b\u052c\u0001\u0000\u0000\u0000\u052c\u052d\u0003d2\u0000"+ + "\u052d\u052e\u0005i\u0000\u0000\u052e\u052f\u0003\u0152\u00a9\u0000\u052f"+ + "\u0531\u0001\u0000\u0000\u0000\u0530\u0522\u0001\u0000\u0000\u0000\u0530"+ + "\u052a\u0001\u0000\u0000\u0000\u0531\u00d1\u0001\u0000\u0000\u0000\u0532"+ + "\u053a\u0003\u013c\u009e\u0000\u0533\u053a\u0003\u00d4j\u0000\u0534\u053a"+ + "\u0003P(\u0000\u0535\u0536\u0005j\u0000\u0000\u0536\u0537\u0003\u00d2"+ + "i\u0000\u0537\u0538\u0005k\u0000\u0000\u0538\u053a\u0001\u0000\u0000\u0000"+ + "\u0539\u0532\u0001\u0000\u0000\u0000\u0539\u0533\u0001\u0000\u0000\u0000"+ + "\u0539\u0534\u0001\u0000\u0000\u0000\u0539\u0535\u0001\u0000\u0000\u0000"+ + "\u053a\u00d3\u0001\u0000\u0000\u0000\u053b\u0545\u0003\u013e\u009f\u0000"+ + "\u053c\u0545\u0003\u016e\u00b7\u0000\u053d\u0545\u0003\u0144\u00a2\u0000"+ + "\u053e\u0545\u0003\u014c\u00a6\u0000\u053f\u0545\u0003\u00ccf\u0000\u0540"+ + "\u0545\u0003\u0146\u00a3\u0000\u0541\u0545\u0003\u0148\u00a4\u0000\u0542"+ + "\u0545\u0003\u014a\u00a5\u0000\u0543\u0545\u0003\u00d6k\u0000\u0544\u053b"+ + "\u0001\u0000\u0000\u0000\u0544\u053c\u0001\u0000\u0000\u0000\u0544\u053d"+ + "\u0001\u0000\u0000\u0000\u0544\u053e\u0001\u0000\u0000\u0000\u0544\u053f"+ + "\u0001\u0000\u0000\u0000\u0544\u0540\u0001\u0000\u0000\u0000\u0544\u0541"+ + "\u0001\u0000\u0000\u0000\u0544\u0542\u0001\u0000\u0000\u0000\u0544\u0543"+ + "\u0001\u0000\u0000\u0000\u0545\u00d5\u0001\u0000\u0000\u0000\u0546\u0547"+ + "\u00059\u0000\u0000\u0547\u0548\u0003\u00d8l\u0000\u0548\u00d7\u0001\u0000"+ + "\u0000\u0000\u0549\u0555\u0005j\u0000\u0000\u054a\u054f\u0003\u00d2i\u0000"+ + "\u054b\u054c\u0005q\u0000\u0000\u054c\u054e\u0003\u00d2i\u0000\u054d\u054b"+ + "\u0001\u0000\u0000\u0000\u054e\u0551\u0001\u0000\u0000\u0000\u054f\u054d"+ + "\u0001\u0000\u0000\u0000\u054f\u0550\u0001\u0000\u0000\u0000\u0550\u0553"+ + "\u0001\u0000\u0000\u0000\u0551\u054f\u0001\u0000\u0000\u0000\u0552\u0554"+ + "\u0005q\u0000\u0000\u0553\u0552\u0001\u0000\u0000\u0000\u0553\u0554\u0001"+ + "\u0000\u0000\u0000\u0554\u0556\u0001\u0000\u0000\u0000\u0555\u054a\u0001"+ + "\u0000\u0000\u0000\u0555\u0556\u0001\u0000\u0000\u0000\u0556\u0557\u0001"+ + "\u0000\u0000\u0000\u0557\u0558\u0005k\u0000\u0000\u0558\u00d9\u0001\u0000"+ + "\u0000\u0000\u0559\u0561\u0003\u016e\u00b7\u0000\u055a\u0561\u0003\u013e"+ + "\u009f\u0000\u055b\u0561\u0003\u00dcn\u0000\u055c\u0561\u0003\u0146\u00a3"+ + "\u0000\u055d\u0561\u0003\u0148\u00a4\u0000\u055e\u0561\u0003P(\u0000\u055f"+ + "\u0561\u0003\u013c\u009e\u0000\u0560\u0559\u0001\u0000\u0000\u0000\u0560"+ + "\u055a\u0001\u0000\u0000\u0000\u0560\u055b\u0001\u0000\u0000\u0000\u0560"+ + "\u055c\u0001\u0000\u0000\u0000\u0560\u055d\u0001\u0000\u0000\u0000\u0560"+ + "\u055e\u0001\u0000\u0000\u0000\u0560\u055f\u0001\u0000\u0000\u0000\u0561"+ + "\u00db\u0001\u0000\u0000\u0000\u0562\u0563\u0005n\u0000\u0000\u0563\u0564"+ + "\u0005x\u0000\u0000\u0564\u0565\u0005o\u0000\u0000\u0565\u0566\u0003\u0142"+ + "\u00a1\u0000\u0566\u00dd\u0001\u0000\u0000\u0000\u0567\u0577\u0005n\u0000"+ + "\u0000\u0568\u056a\u0003\u00e0p\u0000\u0569\u0568\u0001\u0000\u0000\u0000"+ + "\u0569\u056a\u0001\u0000\u0000\u0000\u056a\u056b\u0001\u0000\u0000\u0000"+ + "\u056b\u056d\u0005s\u0000\u0000\u056c\u056e\u0003\u00e2q\u0000\u056d\u056c"+ + "\u0001\u0000\u0000\u0000\u056d\u056e\u0001\u0000\u0000\u0000\u056e\u0578"+ + "\u0001\u0000\u0000\u0000\u056f\u0571\u0003\u00e0p\u0000\u0570\u056f\u0001"+ + "\u0000\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u0572\u0001"+ + "\u0000\u0000\u0000\u0572\u0573\u0005s\u0000\u0000\u0573\u0574\u0003\u00e2"+ + "q\u0000\u0574\u0575\u0005s\u0000\u0000\u0575\u0576\u0003\u00e4r\u0000"+ + "\u0576\u0578\u0001\u0000\u0000\u0000\u0577\u0569\u0001\u0000\u0000\u0000"+ + "\u0577\u0570\u0001\u0000\u0000\u0000\u0578\u0579\u0001\u0000\u0000\u0000"+ + "\u0579\u057a\u0005o\u0000\u0000\u057a\u00df\u0001\u0000\u0000\u0000\u057b"+ + "\u057c\u0003\u00b4Z\u0000\u057c\u00e1\u0001\u0000\u0000\u0000\u057d\u057e"+ + "\u0003\u00b4Z\u0000\u057e\u00e3\u0001\u0000\u0000\u0000\u057f\u0580\u0003"+ + "\u00b4Z\u0000\u0580\u00e5\u0001\u0000\u0000\u0000\u0581\u0583\u0007\u000f"+ + "\u0000\u0000\u0582\u0581\u0001\u0000\u0000\u0000\u0582\u0583\u0001\u0000"+ + "\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584\u0585\u0005p\u0000"+ + "\u0000\u0585\u00e7\u0001\u0000\u0000\u0000\u0586\u0587\u0003\u00f6{\u0000"+ + "\u0587\u0588\u0005p\u0000\u0000\u0588\u058d\u0001\u0000\u0000\u0000\u0589"+ + "\u058a\u0003\u0006\u0003\u0000\u058a\u058b\u0005w\u0000\u0000\u058b\u058d"+ + "\u0001\u0000\u0000\u0000\u058c\u0586\u0001\u0000\u0000\u0000\u058c\u0589"+ + "\u0001\u0000\u0000\u0000\u058c\u058d\u0001\u0000\u0000\u0000\u058d\u058e"+ + "\u0001\u0000\u0000\u0000\u058e\u058f\u0005a\u0000\u0000\u058f\u0594\u0003"+ + "\u00b4Z\u0000\u0590\u0592\u0005K\u0000\u0000\u0591\u0593\u0005i\u0000"+ + "\u0000\u0592\u0591\u0001\u0000\u0000\u0000\u0592\u0593\u0001\u0000\u0000"+ + "\u0000\u0593\u0595\u0001\u0000\u0000\u0000\u0594\u0590\u0001\u0000\u0000"+ + "\u0000\u0594\u0595\u0001\u0000\u0000\u0000\u0595\u00e9\u0001\u0000\u0000"+ + "\u0000\u0596\u0597\u0005\\\u0000\u0000\u0597\u0598\u0005i\u0000\u0000"+ + "\u0598\u00eb\u0001\u0000\u0000\u0000\u0599\u059a\u0003\u0170\u00b8\u0000"+ + "\u059a\u00ed\u0001\u0000\u0000\u0000\u059b\u059f\u0003\u00f0x\u0000\u059c"+ + "\u059f\u0003\u00f8|\u0000\u059d\u059f\u0003\u00fc~\u0000\u059e\u059b\u0001"+ + "\u0000\u0000\u0000\u059e\u059c\u0001\u0000\u0000\u0000\u059e\u059d\u0001"+ + "\u0000\u0000\u0000\u059f\u00ef\u0001\u0000\u0000\u0000\u05a0\u05ac\u0005"+ + "^\u0000\u0000\u05a1\u05ad\u0003\u00f2y\u0000\u05a2\u05a8\u0005j\u0000"+ + "\u0000\u05a3\u05a4\u0003\u00f2y\u0000\u05a4\u05a5\u0003\u017e\u00bf\u0000"+ + "\u05a5\u05a7\u0001\u0000\u0000\u0000\u05a6\u05a3\u0001\u0000\u0000\u0000"+ + "\u05a7\u05aa\u0001\u0000\u0000\u0000\u05a8\u05a6\u0001\u0000\u0000\u0000"+ + "\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u05ab\u0001\u0000\u0000\u0000"+ + "\u05aa\u05a8\u0001\u0000\u0000\u0000\u05ab\u05ad\u0005k\u0000\u0000\u05ac"+ + "\u05a1\u0001\u0000\u0000\u0000\u05ac\u05a2\u0001\u0000\u0000\u0000\u05ad"+ + "\u00f1\u0001\u0000\u0000\u0000\u05ae\u05b4\u0003\u00f4z\u0000\u05af\u05b1"+ + "\u0003\u00d2i\u0000\u05b0\u05af\u0001\u0000\u0000\u0000\u05b0\u05b1\u0001"+ + "\u0000\u0000\u0000\u05b1\u05b2\u0001\u0000\u0000\u0000\u05b2\u05b3\u0005"+ + "p\u0000\u0000\u05b3\u05b5\u0003\u00f6{\u0000\u05b4\u05b0\u0001\u0000\u0000"+ + "\u0000\u05b4\u05b5\u0001\u0000\u0000\u0000\u05b5\u00f3\u0001\u0000\u0000"+ + "\u0000\u05b6\u05bb\u0005i\u0000\u0000\u05b7\u05b8\u0005q\u0000\u0000\u05b8"+ + "\u05ba\u0005i\u0000\u0000\u05b9\u05b7\u0001\u0000\u0000\u0000\u05ba\u05bd"+ + "\u0001\u0000\u0000\u0000\u05bb\u05b9\u0001\u0000\u0000\u0000\u05bb\u05bc"+ + "\u0001\u0000\u0000\u0000\u05bc\u00f5\u0001\u0000\u0000\u0000\u05bd\u05bb"+ + "\u0001\u0000\u0000\u0000\u05be\u05c3\u0003\u00b4Z\u0000\u05bf\u05c0\u0005"+ + "q\u0000\u0000\u05c0\u05c2\u0003\u00b4Z\u0000\u05c1\u05bf\u0001\u0000\u0000"+ + "\u0000\u05c2\u05c5\u0001\u0000\u0000\u0000\u05c3\u05c1\u0001\u0000\u0000"+ + "\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000\u05c4\u00f7\u0001\u0000\u0000"+ + "\u0000\u05c5\u05c3\u0001\u0000\u0000\u0000\u05c6\u05d2\u0005b\u0000\u0000"+ + "\u05c7\u05d3\u0003\u00fa}\u0000\u05c8\u05ce\u0005j\u0000\u0000\u05c9\u05ca"+ + "\u0003\u00fa}\u0000\u05ca\u05cb\u0003\u017e\u00bf\u0000\u05cb\u05cd\u0001"+ + "\u0000\u0000\u0000\u05cc\u05c9\u0001\u0000\u0000\u0000\u05cd\u05d0\u0001"+ + "\u0000\u0000\u0000\u05ce\u05cc\u0001\u0000\u0000\u0000\u05ce\u05cf\u0001"+ + "\u0000\u0000\u0000\u05cf\u05d1\u0001\u0000\u0000\u0000\u05d0\u05ce\u0001"+ + "\u0000\u0000\u0000\u05d1\u05d3\u0005k\u0000\u0000\u05d2\u05c7\u0001\u0000"+ + "\u0000\u0000\u05d2\u05c8\u0001\u0000\u0000\u0000\u05d3\u00f9\u0001\u0000"+ + "\u0000\u0000\u05d4\u05d6\u0005i\u0000\u0000\u05d5\u05d7\u0005p\u0000\u0000"+ + "\u05d6\u05d5\u0001\u0000\u0000\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000"+ + "\u05d7\u05d8\u0001\u0000\u0000\u0000\u05d8\u05d9\u0003\u00d2i\u0000\u05d9"+ + "\u00fb\u0001\u0000\u0000\u0000\u05da\u05e6\u0005g\u0000\u0000\u05db\u05e7"+ + "\u0003\u00a6S\u0000\u05dc\u05e2\u0005j\u0000\u0000\u05dd\u05de\u0003\u00a6"+ + "S\u0000\u05de\u05df\u0003\u017e\u00bf\u0000\u05df\u05e1\u0001\u0000\u0000"+ + "\u0000\u05e0\u05dd\u0001\u0000\u0000\u0000\u05e1\u05e4\u0001\u0000\u0000"+ + "\u0000\u05e2\u05e0\u0001\u0000\u0000\u0000\u05e2\u05e3\u0001\u0000\u0000"+ + "\u0000\u05e3\u05e5\u0001\u0000\u0000\u0000\u05e4\u05e2\u0001\u0000\u0000"+ + "\u0000\u05e5\u05e7\u0005k\u0000\u0000\u05e6\u05db\u0001\u0000\u0000\u0000"+ + "\u05e6\u05dc\u0001\u0000\u0000\u0000\u05e7\u00fd\u0001\u0000\u0000\u0000"+ + "\u05e8\u05ea\u0005l\u0000\u0000\u05e9\u05eb\u0003\u0100\u0080\u0000\u05ea"+ + "\u05e9\u0001\u0000\u0000\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb"+ + "\u05ec\u0001\u0000\u0000\u0000\u05ec\u05ed\u0005m\u0000\u0000\u05ed\u00ff"+ + "\u0001\u0000\u0000\u0000\u05ee\u05f0\u0005r\u0000\u0000\u05ef\u05ee\u0001"+ + "\u0000\u0000\u0000\u05ef\u05f0\u0001\u0000\u0000\u0000\u05f0\u05f6\u0001"+ + "\u0000\u0000\u0000\u05f1\u05f3\u0005\u00a3\u0000\u0000\u05f2\u05f1\u0001"+ + "\u0000\u0000\u0000\u05f2\u05f3\u0001\u0000\u0000\u0000\u05f3\u05f6\u0001"+ + "\u0000\u0000\u0000\u05f4\u05f6\u0004\u0080\u0012\u0000\u05f5\u05ef\u0001"+ + "\u0000\u0000\u0000\u05f5\u05f2\u0001\u0000\u0000\u0000\u05f5\u05f4\u0001"+ + "\u0000\u0000\u0000\u05f6\u05f7\u0001\u0000\u0000\u0000\u05f7\u05f8\u0003"+ + "\u00b6[\u0000\u05f8\u05f9\u0003\u017e\u00bf\u0000\u05f9\u05fb\u0001\u0000"+ + "\u0000\u0000\u05fa\u05f5\u0001\u0000\u0000\u0000\u05fb\u05fc\u0001\u0000"+ + "\u0000\u0000\u05fc\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000"+ + "\u0000\u0000\u05fd\u0101\u0001\u0000\u0000\u0000\u05fe\u0604\u0003\u0106"+ + "\u0083\u0000\u05ff\u0604\u0003\u0108\u0084\u0000\u0600\u0604\u0003\u010a"+ + "\u0085\u0000\u0601\u0604\u0003\u0104\u0082\u0000\u0602\u0604\u0003\u00a8"+ + "T\u0000\u0603\u05fe\u0001\u0000\u0000\u0000\u0603\u05ff\u0001\u0000\u0000"+ + "\u0000\u0603\u0600\u0001\u0000\u0000\u0000\u0603\u0601\u0001\u0000\u0000"+ + "\u0000\u0603\u0602\u0001\u0000\u0000\u0000\u0604\u0103\u0001\u0000\u0000"+ + "\u0000\u0605\u0606\u0003\u00b4Z\u0000\u0606\u0105\u0001\u0000\u0000\u0000"+ + "\u0607\u0608\u0003\u00b4Z\u0000\u0608\u0609\u0005\u008d\u0000\u0000\u0609"+ + "\u060a\u0003\u00b4Z\u0000\u060a\u0107\u0001\u0000\u0000\u0000\u060b\u060c"+ + "\u0003\u00b4Z\u0000\u060c\u060d\u0007\u0010\u0000\u0000\u060d\u0109\u0001"+ + "\u0000\u0000\u0000\u060e\u060f\u0003\u00f6{\u0000\u060f\u0610\u0003\u00e6"+ + "s\u0000\u0610\u0611\u0003\u00f6{\u0000\u0611\u010b\u0001\u0000\u0000\u0000"+ + "\u0612\u0613\u0007\u0011\u0000\u0000\u0613\u010d\u0001\u0000\u0000\u0000"+ + "\u0614\u0615\u0005i\u0000\u0000\u0615\u0617\u0005s\u0000\u0000\u0616\u0618"+ + "\u0003\u00b6[\u0000\u0617\u0616\u0001\u0000\u0000\u0000\u0617\u0618\u0001"+ + "\u0000\u0000\u0000\u0618\u010f\u0001\u0000\u0000\u0000\u0619\u061b\u0005"+ + "f\u0000\u0000\u061a\u061c\u0003\u00f6{\u0000\u061b\u061a\u0001\u0000\u0000"+ + "\u0000\u061b\u061c\u0001\u0000\u0000\u0000\u061c\u0111\u0001\u0000\u0000"+ + "\u0000\u061d\u061f\u0005O\u0000\u0000\u061e\u0620\u0005i\u0000\u0000\u061f"+ + "\u061e\u0001\u0000\u0000\u0000\u061f\u0620\u0001\u0000\u0000\u0000\u0620"+ + "\u0113\u0001\u0000\u0000\u0000\u0621\u0623\u0005c\u0000\u0000\u0622\u0624"+ + "\u0005i\u0000\u0000\u0623\u0622\u0001\u0000\u0000\u0000\u0623\u0624\u0001"+ + "\u0000\u0000\u0000\u0624\u0115\u0001\u0000\u0000\u0000\u0625\u0626\u0005"+ + "[\u0000\u0000\u0626\u0627\u0005i\u0000\u0000\u0627\u0117\u0001\u0000\u0000"+ + "\u0000\u0628\u0629\u0005_\u0000\u0000\u0629\u0119\u0001\u0000\u0000\u0000"+ + "\u062a\u0633\u0005`\u0000\u0000\u062b\u0634\u0003\u00b4Z\u0000\u062c\u062d"+ + "\u0003\u017e\u00bf\u0000\u062d\u062e\u0003\u00b4Z\u0000\u062e\u0634\u0001"+ + "\u0000\u0000\u0000\u062f\u0630\u0003\u0102\u0081\u0000\u0630\u0631\u0003"+ + "\u017e\u00bf\u0000\u0631\u0632\u0003\u00b4Z\u0000\u0632\u0634\u0001\u0000"+ + "\u0000\u0000\u0633\u062b\u0001\u0000\u0000\u0000\u0633\u062c\u0001\u0000"+ + "\u0000\u0000\u0633\u062f\u0001\u0000\u0000\u0000\u0634\u0635\u0001\u0000"+ + "\u0000\u0000\u0635\u063b\u0003\u00fe\u007f\u0000\u0636\u0639\u0005Z\u0000"+ + "\u0000\u0637\u063a\u0003\u011a\u008d\u0000\u0638\u063a\u0003\u00fe\u007f"+ + "\u0000\u0639\u0637\u0001\u0000\u0000\u0000\u0639\u0638\u0001\u0000\u0000"+ + "\u0000\u063a\u063c\u0001\u0000\u0000\u0000\u063b\u0636\u0001\u0000\u0000"+ + "\u0000\u063b\u063c\u0001\u0000\u0000\u0000\u063c\u011b\u0001\u0000\u0000"+ + "\u0000\u063d\u0640\u0003\u011e\u008f\u0000\u063e\u0640\u0003\u0124\u0092"+ + "\u0000\u063f\u063d\u0001\u0000\u0000\u0000\u063f\u063e\u0001\u0000\u0000"+ + "\u0000\u0640\u011d\u0001\u0000\u0000\u0000\u0641\u064c\u0005]\u0000\u0000"+ + "\u0642\u0644\u0003\u00b4Z\u0000\u0643\u0642\u0001\u0000\u0000\u0000\u0643"+ + "\u0644\u0001\u0000\u0000\u0000\u0644\u064d\u0001\u0000\u0000\u0000\u0645"+ + "\u0647\u0003\u0102\u0081\u0000\u0646\u0645\u0001\u0000\u0000\u0000\u0646"+ + "\u0647\u0001\u0000\u0000\u0000\u0647\u0648\u0001\u0000\u0000\u0000\u0648"+ + "\u064a\u0003\u017e\u00bf\u0000\u0649\u064b\u0003\u00b4Z\u0000\u064a\u0649"+ + "\u0001\u0000\u0000\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b\u064d"+ + "\u0001\u0000\u0000\u0000\u064c\u0643\u0001\u0000\u0000\u0000\u064c\u0646"+ + "\u0001\u0000\u0000\u0000\u064d\u064e\u0001\u0000\u0000\u0000\u064e\u0652"+ + "\u0005l\u0000\u0000\u064f\u0651\u0003\u0120\u0090\u0000\u0650\u064f\u0001"+ + "\u0000\u0000\u0000\u0651\u0654\u0001\u0000\u0000\u0000\u0652\u0650\u0001"+ + "\u0000\u0000\u0000\u0652\u0653\u0001\u0000\u0000\u0000\u0653\u0655\u0001"+ + "\u0000\u0000\u0000\u0654\u0652\u0001\u0000\u0000\u0000\u0655\u0656\u0005"+ + "m\u0000\u0000\u0656\u011f\u0001\u0000\u0000\u0000\u0657\u0658\u0003\u0122"+ + "\u0091\u0000\u0658\u065a\u0005s\u0000\u0000\u0659\u065b\u0003\u0100\u0080"+ + "\u0000\u065a\u0659\u0001\u0000\u0000\u0000\u065a\u065b\u0001\u0000\u0000"+ + "\u0000\u065b\u0121\u0001\u0000\u0000\u0000\u065c\u065d\u0005T\u0000\u0000"+ + "\u065d\u0660\u0003\u00f6{\u0000\u065e\u0660\u0005P\u0000\u0000\u065f\u065c"+ + "\u0001\u0000\u0000\u0000\u065f\u065e\u0001\u0000\u0000\u0000\u0660\u0123"+ + "\u0001\u0000\u0000\u0000\u0661\u066a\u0005]\u0000\u0000\u0662\u066b\u0003"+ + "\u0126\u0093\u0000\u0663\u0664\u0003\u017e\u00bf\u0000\u0664\u0665\u0003"+ + "\u0126\u0093\u0000\u0665\u066b\u0001\u0000\u0000\u0000\u0666\u0667\u0003"+ + "\u0102\u0081\u0000\u0667\u0668\u0003\u017e\u00bf\u0000\u0668\u0669\u0003"+ + "\u0126\u0093\u0000\u0669\u066b\u0001\u0000\u0000\u0000\u066a\u0662\u0001"+ + "\u0000\u0000\u0000\u066a\u0663\u0001\u0000\u0000\u0000\u066a\u0666\u0001"+ + "\u0000\u0000\u0000\u066b\u066c\u0001\u0000\u0000\u0000\u066c\u0670\u0005"+ + "l\u0000\u0000\u066d\u066f\u0003\u0128\u0094\u0000\u066e\u066d\u0001\u0000"+ + "\u0000\u0000\u066f\u0672\u0001\u0000\u0000\u0000\u0670\u066e\u0001\u0000"+ + "\u0000\u0000\u0670\u0671\u0001\u0000\u0000\u0000\u0671\u0673\u0001\u0000"+ + "\u0000\u0000\u0672\u0670\u0001\u0000\u0000\u0000\u0673\u0674\u0005m\u0000"+ + "\u0000\u0674\u0125\u0001\u0000\u0000\u0000\u0675\u0676\u0005i\u0000\u0000"+ + "\u0676\u0678\u0005w\u0000\u0000\u0677\u0675\u0001\u0000\u0000\u0000\u0677"+ + "\u0678\u0001\u0000\u0000\u0000\u0678\u0679\u0001\u0000\u0000\u0000\u0679"+ + "\u067a\u0003\u00c4b\u0000\u067a\u067b\u0005t\u0000\u0000\u067b\u067c\u0005"+ + "j\u0000\u0000\u067c\u067d\u0005b\u0000\u0000\u067d\u067e\u0005k\u0000"+ + "\u0000\u067e\u0127\u0001\u0000\u0000\u0000\u067f\u0680\u0003\u012a\u0095"+ + "\u0000\u0680\u0682\u0005s\u0000\u0000\u0681\u0683\u0003\u0100\u0080\u0000"+ + "\u0682\u0681\u0001\u0000\u0000\u0000\u0682\u0683\u0001\u0000\u0000\u0000"+ + "\u0683\u0129\u0001\u0000\u0000\u0000\u0684\u0685\u0005T\u0000\u0000\u0685"+ + "\u0688\u0003\u012c\u0096\u0000\u0686\u0688\u0005P\u0000\u0000\u0687\u0684"+ + "\u0001\u0000\u0000\u0000\u0687\u0686\u0001\u0000\u0000\u0000\u0688\u012b"+ + "\u0001\u0000\u0000\u0000\u0689\u068c\u0003\u00d2i\u0000\u068a\u068c\u0005"+ + "h\u0000\u0000\u068b\u0689\u0001\u0000\u0000\u0000\u068b\u068a\u0001\u0000"+ + "\u0000\u0000\u068c\u0694\u0001\u0000\u0000\u0000\u068d\u0690\u0005q\u0000"+ + "\u0000\u068e\u0691\u0003\u00d2i\u0000\u068f\u0691\u0005h\u0000\u0000\u0690"+ + "\u068e\u0001\u0000\u0000\u0000\u0690\u068f\u0001\u0000\u0000\u0000\u0691"+ + "\u0693\u0001\u0000\u0000\u0000\u0692\u068d\u0001\u0000\u0000\u0000\u0693"+ + "\u0696\u0001\u0000\u0000\u0000\u0694\u0692\u0001\u0000\u0000\u0000\u0694"+ + "\u0695\u0001\u0000\u0000\u0000\u0695\u012d\u0001\u0000\u0000\u0000\u0696"+ + "\u0694\u0001\u0000\u0000\u0000\u0697\u0698\u0005S\u0000\u0000\u0698\u069c"+ + "\u0005l\u0000\u0000\u0699\u069b\u0003\u0130\u0098\u0000\u069a\u0699\u0001"+ + "\u0000\u0000\u0000\u069b\u069e\u0001\u0000\u0000\u0000\u069c\u069a\u0001"+ + "\u0000\u0000\u0000\u069c\u069d\u0001\u0000\u0000\u0000\u069d\u069f\u0001"+ + "\u0000\u0000\u0000\u069e\u069c\u0001\u0000\u0000\u0000\u069f\u06a0\u0005"+ + "m\u0000\u0000\u06a0\u012f\u0001\u0000\u0000\u0000\u06a1\u06a2\u0003\u0132"+ + "\u0099\u0000\u06a2\u06a4\u0005s\u0000\u0000\u06a3\u06a5\u0003\u0100\u0080"+ + "\u0000\u06a4\u06a3\u0001\u0000\u0000\u0000\u06a4\u06a5\u0001\u0000\u0000"+ + "\u0000\u06a5\u0131\u0001\u0000\u0000\u0000\u06a6\u06a9\u0005T\u0000\u0000"+ + "\u06a7\u06aa\u0003\u0106\u0083\u0000\u06a8\u06aa\u0003\u0134\u009a\u0000"+ + "\u06a9\u06a7\u0001\u0000\u0000\u0000\u06a9\u06a8\u0001\u0000\u0000\u0000"+ + "\u06aa\u06ad\u0001\u0000\u0000\u0000\u06ab\u06ad\u0005P\u0000\u0000\u06ac"+ + "\u06a6\u0001\u0000\u0000\u0000\u06ac\u06ab\u0001\u0000\u0000\u0000\u06ad"+ + "\u0133\u0001\u0000\u0000\u0000\u06ae\u06af\u0003\u00f6{\u0000\u06af\u06b0"+ + "\u0005p\u0000\u0000\u06b0\u06b5\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003"+ + "\u00f4z\u0000\u06b2\u06b3\u0005w\u0000\u0000\u06b3\u06b5\u0001\u0000\u0000"+ + "\u0000\u06b4\u06ae\u0001\u0000\u0000\u0000\u06b4\u06b1\u0001\u0000\u0000"+ + "\u0000\u06b4\u06b5\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001\u0000\u0000"+ + "\u0000\u06b6\u06b7\u0003\u00b4Z\u0000\u06b7\u0135\u0001\u0000\u0000\u0000"+ + "\u06b8\u06c0\u0005d\u0000\u0000\u06b9\u06bb\u0003\u00b4Z\u0000\u06ba\u06b9"+ + "\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000\u06bb\u06c1"+ + "\u0001\u0000\u0000\u0000\u06bc\u06c1\u0003\u0138\u009c\u0000\u06bd\u06bf"+ + "\u0003\u00e8t\u0000\u06be\u06bd\u0001\u0000\u0000\u0000\u06be\u06bf\u0001"+ + "\u0000\u0000\u0000\u06bf\u06c1\u0001\u0000\u0000\u0000\u06c0\u06ba\u0001"+ + "\u0000\u0000\u0000\u06c0\u06bc\u0001\u0000\u0000\u0000\u06c0\u06be\u0001"+ + "\u0000\u0000\u0000\u06c1\u06c2\u0001\u0000\u0000\u0000\u06c2\u06c3\u0003"+ + "\u00fe\u007f\u0000\u06c3\u0137\u0001\u0000\u0000\u0000\u06c4\u06c6\u0003"+ + "\u0102\u0081\u0000\u06c5\u06c4\u0001\u0000\u0000\u0000\u06c5\u06c6\u0001"+ + "\u0000\u0000\u0000\u06c6\u06c7\u0001\u0000\u0000\u0000\u06c7\u06c9\u0003"+ + "\u017e\u00bf\u0000\u06c8\u06ca\u0003\u00b4Z\u0000\u06c9\u06c8\u0001\u0000"+ + "\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000"+ + "\u0000\u0000\u06cb\u06cd\u0003\u017e\u00bf\u0000\u06cc\u06ce\u0003\u0102"+ + "\u0081\u0000\u06cd\u06cc\u0001\u0000\u0000\u0000\u06cd\u06ce\u0001\u0000"+ + "\u0000\u0000\u06ce\u0139\u0001\u0000\u0000\u0000\u06cf\u06d0\u0005V\u0000"+ + "\u0000\u06d0\u06d1\u0003\u00b4Z\u0000\u06d1\u013b\u0001\u0000\u0000\u0000"+ + "\u06d2\u06d5\u0003\u0160\u00b0\u0000\u06d3\u06d5\u0005i\u0000\u0000\u06d4"+ + "\u06d2\u0001\u0000\u0000\u0000\u06d4\u06d3\u0001\u0000\u0000\u0000\u06d5"+ + "\u013d\u0001\u0000\u0000\u0000\u06d6\u06d7\u0005n\u0000\u0000\u06d7\u06d8"+ + "\u0003\u0140\u00a0\u0000\u06d8\u06d9\u0005o\u0000\u0000\u06d9\u06da\u0003"+ + "\u0142\u00a1\u0000\u06da\u013f\u0001\u0000\u0000\u0000\u06db\u06dc\u0003"+ + "\u00b4Z\u0000\u06dc\u0141\u0001\u0000\u0000\u0000\u06dd\u06de\u0003\u00d2"+ + "i\u0000\u06de\u0143\u0001\u0000\u0000\u0000\u06df\u06e0\u0005\u008b\u0000"+ + "\u0000\u06e0\u06e1\u0003\u00d2i\u0000\u06e1\u0145\u0001\u0000\u0000\u0000"+ + "\u06e2\u06e3\u0005n\u0000\u0000\u06e3\u06e4\u0005o\u0000\u0000\u06e4\u06e5"+ + "\u0003\u0142\u00a1\u0000\u06e5\u0147\u0001\u0000\u0000\u0000\u06e6\u06e7"+ + "\u0005W\u0000\u0000\u06e7\u06e8\u0005n\u0000\u0000\u06e8\u06e9\u0003\u00d2"+ + "i\u0000\u06e9\u06ea\u0005o\u0000\u0000\u06ea\u06eb\u0003\u0142\u00a1\u0000"+ + "\u06eb\u0149\u0001\u0000\u0000\u0000\u06ec\u06f2\u0005Y\u0000\u0000\u06ed"+ + "\u06ee\u0005Y\u0000\u0000\u06ee\u06f2\u0005\u008d\u0000\u0000\u06ef\u06f0"+ + "\u0005\u008d\u0000\u0000\u06f0\u06f2\u0005Y\u0000\u0000\u06f1\u06ec\u0001"+ + "\u0000\u0000\u0000\u06f1\u06ed\u0001\u0000\u0000\u0000\u06f1\u06ef\u0001"+ + "\u0000\u0000\u0000\u06f2\u06f3\u0001\u0000\u0000\u0000\u06f3\u06f4\u0003"+ + "\u0142\u00a1\u0000\u06f4\u014b\u0001\u0000\u0000\u0000\u06f5\u06f6\u0005"+ + "Q\u0000\u0000\u06f6\u06f7\u0003\u014e\u00a7\u0000\u06f7\u014d\u0001\u0000"+ + "\u0000\u0000\u06f8\u06f9\u0003\u0152\u00a9\u0000\u06f9\u06fa\u0003\u0150"+ + "\u00a8\u0000\u06fa\u06fd\u0001\u0000\u0000\u0000\u06fb\u06fd\u0003\u0152"+ + "\u00a9\u0000\u06fc\u06f8\u0001\u0000\u0000\u0000\u06fc\u06fb\u0001\u0000"+ + "\u0000\u0000\u06fd\u014f\u0001\u0000\u0000\u0000\u06fe\u0701\u0003\u0152"+ + "\u00a9\u0000\u06ff\u0701\u0003\u00d2i\u0000\u0700\u06fe\u0001\u0000\u0000"+ + "\u0000\u0700\u06ff\u0001\u0000\u0000\u0000\u0701\u0151\u0001\u0000\u0000"+ + "\u0000\u0702\u070e\u0005j\u0000\u0000\u0703\u0708\u0003\u00acV\u0000\u0704"+ + "\u0705\u0005q\u0000\u0000\u0705\u0707\u0003\u00acV\u0000\u0706\u0704\u0001"+ + "\u0000\u0000\u0000\u0707\u070a\u0001\u0000\u0000\u0000\u0708\u0706\u0001"+ + "\u0000\u0000\u0000\u0708\u0709\u0001\u0000\u0000\u0000\u0709\u070c\u0001"+ + "\u0000\u0000\u0000\u070a\u0708\u0001\u0000\u0000\u0000\u070b\u070d\u0005"+ + "q\u0000\u0000\u070c\u070b\u0001\u0000\u0000\u0000\u070c\u070d\u0001\u0000"+ + "\u0000\u0000\u070d\u070f\u0001\u0000\u0000\u0000\u070e\u0703\u0001\u0000"+ + "\u0000\u0000\u070e\u070f\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000"+ + "\u0000\u0000\u0710\u0711\u0005k\u0000\u0000\u0711\u0153\u0001\u0000\u0000"+ + "\u0000\u0712\u0713\u0003\u0156\u00ab\u0000\u0713\u0714\u0005j\u0000\u0000"+ + "\u0714\u0716\u0003\u00b4Z\u0000\u0715\u0717\u0005q\u0000\u0000\u0716\u0715"+ + "\u0001\u0000\u0000\u0000\u0716\u0717\u0001\u0000\u0000\u0000\u0717\u0718"+ + "\u0001\u0000\u0000\u0000\u0718\u0719\u0005k\u0000\u0000\u0719\u0155\u0001"+ + "\u0000\u0000\u0000\u071a\u0720\u0003\u00d4j\u0000\u071b\u071c\u0005j\u0000"+ + "\u0000\u071c\u071d\u0003\u0156\u00ab\u0000\u071d\u071e\u0005k\u0000\u0000"+ + "\u071e\u0720\u0001\u0000\u0000\u0000\u071f\u071a\u0001\u0000\u0000\u0000"+ + "\u071f\u071b\u0001\u0000\u0000\u0000\u0720\u0157\u0001\u0000\u0000\u0000"+ + "\u0721\u0728\u0003\u015a\u00ad\u0000\u0722\u0728\u0003\u015e\u00af\u0000"+ + "\u0723\u0724\u0005j\u0000\u0000\u0724\u0725\u0003\u00b4Z\u0000\u0725\u0726"+ + "\u0005k\u0000\u0000\u0726\u0728\u0001\u0000\u0000\u0000\u0727\u0721\u0001"+ + "\u0000\u0000\u0000\u0727\u0722\u0001\u0000\u0000\u0000\u0727\u0723\u0001"+ + "\u0000\u0000\u0000\u0728\u0159\u0001\u0000\u0000\u0000\u0729\u072d\u0003"+ + "\u00c2a\u0000\u072a\u072d\u0003\u0162\u00b1\u0000\u072b\u072d\u0003\u00c6"+ + "c\u0000\u072c\u0729\u0001\u0000\u0000\u0000\u072c\u072a\u0001\u0000\u0000"+ + "\u0000\u072c\u072b\u0001\u0000\u0000\u0000\u072d\u015b\u0001\u0000\u0000"+ + "\u0000\u072e\u072f\u0007\u0012\u0000\u0000\u072f\u015d\u0001\u0000\u0000"+ + "\u0000\u0730\u0731\u0005i\u0000\u0000\u0731\u015f\u0001\u0000\u0000\u0000"+ + "\u0732\u0733\u0005i\u0000\u0000\u0733\u0734\u0005t\u0000\u0000\u0734\u0735"+ + "\u0005i\u0000\u0000\u0735\u0161\u0001\u0000\u0000\u0000\u0736\u0737\u0003"+ + "\u00dam\u0000\u0737\u0738\u0003\u0164\u00b2\u0000\u0738\u0163\u0001\u0000"+ + "\u0000\u0000\u0739\u073e\u0005l\u0000\u0000\u073a\u073c\u0003\u0166\u00b3"+ + "\u0000\u073b\u073d\u0005q\u0000\u0000\u073c\u073b\u0001\u0000\u0000\u0000"+ + "\u073c\u073d\u0001\u0000\u0000\u0000\u073d\u073f\u0001\u0000\u0000\u0000"+ + "\u073e\u073a\u0001\u0000\u0000\u0000\u073e\u073f\u0001\u0000\u0000\u0000"+ + "\u073f\u0740\u0001\u0000\u0000\u0000\u0740\u0741\u0005m\u0000\u0000\u0741"+ + "\u0165\u0001\u0000\u0000\u0000\u0742\u0747\u0003\u0168\u00b4\u0000\u0743"+ + "\u0744\u0005q\u0000\u0000\u0744\u0746\u0003\u0168\u00b4\u0000\u0745\u0743"+ + "\u0001\u0000\u0000\u0000\u0746\u0749\u0001\u0000\u0000\u0000\u0747\u0745"+ + "\u0001\u0000\u0000\u0000\u0747\u0748\u0001\u0000\u0000\u0000\u0748\u0167"+ + "\u0001\u0000\u0000\u0000\u0749\u0747\u0001\u0000\u0000\u0000\u074a\u074b"+ + "\u0003\u016a\u00b5\u0000\u074b\u074c\u0005s\u0000\u0000\u074c\u074e\u0001"+ + "\u0000\u0000\u0000\u074d\u074a\u0001\u0000\u0000\u0000\u074d\u074e\u0001"+ + "\u0000\u0000\u0000\u074e\u074f\u0001\u0000\u0000\u0000\u074f\u0750\u0003"+ + "\u016c\u00b6\u0000\u0750\u0169\u0001\u0000\u0000\u0000\u0751\u0754\u0003"+ + "\u00b4Z\u0000\u0752\u0754\u0003\u0164\u00b2\u0000\u0753\u0751\u0001\u0000"+ + "\u0000\u0000\u0753\u0752\u0001\u0000\u0000\u0000\u0754\u016b\u0001\u0000"+ + "\u0000\u0000\u0755\u0758\u0003\u00b4Z\u0000\u0756\u0758\u0003\u0164\u00b2"+ + "\u0000\u0757\u0755\u0001\u0000\u0000\u0000\u0757\u0756\u0001\u0000\u0000"+ + "\u0000\u0758\u016d\u0001\u0000\u0000\u0000\u0759\u075a\u0005X\u0000\u0000"+ + "\u075a\u0760\u0005l\u0000\u0000\u075b\u075c\u0003`0\u0000\u075c\u075d"+ + "\u0003\u017e\u00bf\u0000\u075d\u075f\u0001\u0000\u0000\u0000\u075e\u075b"+ + "\u0001\u0000\u0000\u0000\u075f\u0762\u0001\u0000\u0000\u0000\u0760\u075e"+ + "\u0001\u0000\u0000\u0000\u0760\u0761\u0001\u0000\u0000\u0000\u0761\u0763"+ + "\u0001\u0000\u0000\u0000\u0762\u0760\u0001\u0000\u0000\u0000\u0763\u0764"+ + "\u0005m\u0000\u0000\u0764\u016f\u0001\u0000\u0000\u0000\u0765\u0766\u0007"+ + "\u0013\u0000\u0000\u0766\u0171\u0001\u0000\u0000\u0000\u0767\u0769\u0005"+ + "\u008b\u0000\u0000\u0768\u0767\u0001\u0000\u0000\u0000\u0768\u0769\u0001"+ + "\u0000\u0000\u0000\u0769\u076a\u0001\u0000\u0000\u0000\u076a\u076b\u0003"+ + "\u013c\u009e\u0000\u076b\u0173\u0001\u0000\u0000\u0000\u076c\u076d\u0005"+ + "n\u0000\u0000\u076d\u076e\u0003\u00b4Z\u0000\u076e\u076f\u0005o\u0000"+ + "\u0000\u076f\u0175\u0001\u0000\u0000\u0000\u0770\u0771\u0005t\u0000\u0000"+ + "\u0771\u0772\u0005j\u0000\u0000\u0772\u0773\u0003\u00d2i\u0000\u0773\u0774"+ + "\u0005k\u0000\u0000\u0774\u0177\u0001\u0000\u0000\u0000\u0775\u0784\u0005"+ + "j\u0000\u0000\u0776\u077d\u0003\u00f6{\u0000\u0777\u077a\u0003\u0156\u00ab"+ + "\u0000\u0778\u0779\u0005q\u0000\u0000\u0779\u077b\u0003\u00f6{\u0000\u077a"+ + "\u0778\u0001\u0000\u0000\u0000\u077a\u077b\u0001\u0000\u0000\u0000\u077b"+ + "\u077d\u0001\u0000\u0000\u0000\u077c\u0776\u0001\u0000\u0000\u0000\u077c"+ + "\u0777\u0001\u0000\u0000\u0000\u077d\u077f\u0001\u0000\u0000\u0000\u077e"+ + "\u0780\u0005x\u0000\u0000\u077f\u077e\u0001\u0000\u0000\u0000\u077f\u0780"+ + "\u0001\u0000\u0000\u0000\u0780\u0782\u0001\u0000\u0000\u0000\u0781\u0783"+ + "\u0005q\u0000\u0000\u0782\u0781\u0001\u0000\u0000\u0000\u0782\u0783\u0001"+ + "\u0000\u0000\u0000\u0783\u0785\u0001\u0000\u0000\u0000\u0784\u077c\u0001"+ + "\u0000\u0000\u0000\u0784\u0785\u0001\u0000\u0000\u0000\u0785\u0786\u0001"+ + "\u0000\u0000\u0000\u0786\u0787\u0005k\u0000\u0000\u0787\u0179\u0001\u0000"+ + "\u0000\u0000\u0788\u0789\u0003\u0156\u00ab\u0000\u0789\u078a\u0005t\u0000"+ + "\u0000\u078a\u078b\u0005i\u0000\u0000\u078b\u017b\u0001\u0000\u0000\u0000"+ + "\u078c\u078d\u0003\u00d2i\u0000\u078d\u017d\u0001\u0000\u0000\u0000\u078e"+ + "\u0793\u0005r\u0000\u0000\u078f\u0793\u0005\u0000\u0000\u0001\u0790\u0793"+ + "\u0005\u00a3\u0000\u0000\u0791\u0793\u0004\u00bf\u0013\u0000\u0792\u078e"+ + "\u0001\u0000\u0000\u0000\u0792\u078f\u0001\u0000\u0000\u0000\u0792\u0790"+ + "\u0001\u0000\u0000\u0000\u0792\u0791\u0001\u0000\u0000\u0000\u0793\u017f"+ + "\u0001\u0000\u0000\u0000\u00c9\u018e\u0193\u019a\u01a4\u01aa\u01b0\u01ba"+ "\u01c4\u01d2\u01d6\u01df\u01eb\u01ef\u01f5\u01fe\u0208\u0219\u0227\u022b"+ "\u0232\u023a\u0243\u0263\u026b\u0283\u0296\u02a5\u02b3\u02bc\u02ca\u02d3"+ - "\u02df\u02e5\u02f4\u02fa\u02fd\u0300\u030d\u0316\u031b\u0320\u0323\u0328"+ - "\u032f\u0335\u033e\u0344\u0351\u0354\u0358\u035c\u0364\u036c\u0371\u0379"+ - "\u037b\u0380\u0387\u038f\u0392\u0398\u039d\u039f\u03a2\u03a9\u03ae\u03c1"+ - "\u03c9\u03cd\u03d0\u03d6\u03da\u03dd\u03e7\u03ee\u03f5\u0401\u0407\u040e"+ - "\u0413\u0419\u0425\u042b\u042f\u0437\u043b\u0441\u0444\u044a\u044f\u0468"+ - "\u048b\u048d\u04a4\u04ac\u04b7\u04be\u04c5\u04cf\u04e1\u04f7\u04f9\u0501"+ - "\u0505\u0509\u050c\u0515\u051b\u0525\u052d\u0533\u053c\u0547\u0552\u0556"+ - "\u0558\u0563\u056c\u0570\u0573\u057a\u0585\u058f\u0595\u0597\u05a1\u05ab"+ - "\u05af\u05b3\u05b7\u05be\u05c6\u05d1\u05d5\u05d9\u05e5\u05e9\u05ed\u05f2"+ - "\u05f5\u05f8\u05ff\u0606\u061a\u061e\u0622\u0626\u0636\u063c\u063e\u0642"+ - "\u0646\u0649\u064d\u064f\u0655\u065d\u0662\u066d\u0673\u067a\u0685\u068a"+ - "\u068e\u0693\u0697\u069f\u06a7\u06ac\u06af\u06b7\u06bd\u06c1\u06c3\u06c8"+ - "\u06cc\u06d0\u06d7\u06f4\u06ff\u0703\u070b\u070f\u0711\u0719\u0722\u072a"+ - "\u072f\u073f\u0741\u074a\u0750\u0756\u075a\u0763\u076b\u077d\u077f\u0782"+ - "\u0785\u0787\u0795"; + "\u02df\u02e5\u02f4\u02fa\u02fd\u030a\u0313\u0318\u031d\u0320\u0325\u032c"+ + "\u0332\u033b\u0341\u034e\u0351\u0355\u0359\u0361\u0369\u036e\u0376\u0378"+ + "\u037d\u0384\u038c\u038f\u0395\u039a\u039c\u039f\u03a6\u03ab\u03be\u03c6"+ + "\u03ca\u03cd\u03d3\u03d7\u03da\u03e4\u03eb\u03f2\u03fe\u0404\u040b\u0410"+ + "\u0416\u0422\u0428\u042c\u0434\u0438\u043e\u0441\u0447\u044c\u0465\u0488"+ + "\u048a\u04a1\u04a9\u04b4\u04bb\u04c2\u04cc\u04de\u04f4\u04f6\u04fe\u0502"+ + "\u0506\u0509\u0512\u0518\u0522\u052a\u0530\u0539\u0544\u054f\u0553\u0555"+ + "\u0560\u0569\u056d\u0570\u0577\u0582\u058c\u0592\u0594\u059e\u05a8\u05ac"+ + "\u05b0\u05b4\u05bb\u05c3\u05ce\u05d2\u05d6\u05e2\u05e6\u05ea\u05ef\u05f2"+ + "\u05f5\u05fc\u0603\u0617\u061b\u061f\u0623\u0633\u0639\u063b\u063f\u0643"+ + "\u0646\u064a\u064c\u0652\u065a\u065f\u066a\u0670\u0677\u0682\u0687\u068b"+ + "\u0690\u0694\u069c\u06a4\u06a9\u06ac\u06b4\u06ba\u06be\u06c0\u06c5\u06c9"+ + "\u06cd\u06d4\u06f1\u06fc\u0700\u0708\u070c\u070e\u0716\u071f\u0727\u072c"+ + "\u073c\u073e\u0747\u074d\u0753\u0757\u0760\u0768\u077a\u077c\u077f\u0782"+ + "\u0784\u0792"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { From 78e50965be4f338ca4f961fcb5476b29bf57a14e Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 21 May 2024 15:10:13 +0200 Subject: [PATCH 285/296] fixes an encoding issue where the getter functions' names for two different struct types collide --- src/main/scala/viper/gobra/translator/Names.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/translator/Names.scala b/src/main/scala/viper/gobra/translator/Names.scala index 3168fa953..943ed0089 100644 --- a/src/main/scala/viper/gobra/translator/Names.scala +++ b/src/main/scala/viper/gobra/translator/Names.scala @@ -85,7 +85,7 @@ object Names { } def serializeFields(fields: Vector[in.Field]): String = { - val serializedFields = fields.map(f => s"${f.name}_${serializeType(f.typ)}").mkString("_") + val serializedFields = fields.map(f => s"${f.name}_${serializeType(f.typ)}_${if (f.ghost) "g" else "a"}").mkString("_") // we use a dollar sign to mark the beginning and end of the type list to avoid that `Tuple(Tuple(X), Y)` and `Tuple(Tuple(X, Y))` map to the same name: s"$$$serializedFields$$" } From 0a7e9b54fc2ac27a2c8b7468e01e7d7afefd036c Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 21 May 2024 15:27:59 +0200 Subject: [PATCH 286/296] implements the remaining CR suggestions by Joao --- .../frontend/info/implementation/property/Implements.scala | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala index 24756797f..3f30f9442 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala @@ -92,6 +92,11 @@ trait Implements { this: TypeInfoImpl => /** Returns true if the type is supported for interfaces. All finite types are supported except for structs with ghost fields. */ def supportedSortForInterfaces(t: Type): PropertyResult = { failedProp(s"The type $t is not supported for interface", !isIdentityPreservingType(t)) and + // the following restriction is in place because Go considers two struct values under an interface to be equal if + // they agree on their struct fields. I.e., for `type S struct { val int, ghost gval int }`, `any(S{0, 0}) == any(S{0, 42})` holds + // in Go (after erasing the ghost fields). While we could extend the interface encoding to permit structs with ghost fields + // to implement an interface, we currently reject such cases. However, note that we already support a _pointer_ to a struct with + // ghost fields implementing an interface. failedProp(s"Structs containing ghost fields are not supported for interface", isStructTypeWithGhostFields(t)) } From d4409aeabd42bb2f85c1168e0fc54dba7643c352 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 23 May 2024 09:41:11 +0200 Subject: [PATCH 287/296] Apply suggestions from code review Co-authored-by: Felix Wolf <60103963+Felalolf@users.noreply.github.com> --- .../implementation/typing/ghost/separation/GhostWellDef.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala index 5aeb92fcf..ad1b2d94f 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala @@ -150,7 +150,7 @@ trait GhostWellDef { this: TypeInfoImpl => case e: PMake => (e, isEnclosingGhost(e)) match { case (PMake(_: PGhostSliceType, _), true) => noMessages - case (_, true) => error(e, "Allocating memory within ghost code is forbidden") + case (_, true) => error(e, "Allocating memory with make within ghost code is forbidden") case (PMake(_, args), false) => error( e, "ghost error: make expressions may not contain ghost expressions", From 8f0b09fbe8838bbc6f4e313de86318f123ae3c3b Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 23 May 2024 09:41:58 +0200 Subject: [PATCH 288/296] implements CR suggestions by Felix --- .../resolution/NameResolution.scala | 7 ++-- .../ghost-pointer-receiver-fail01.gobra | 9 ++++- .../ghost_pointer/ghost-write-fail02.gobra | 39 +++++++++++++++++++ 3 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/regressions/features/ghost_pointer/ghost-write-fail02.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index 9f89376aa..4f3ca0b4b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -144,10 +144,9 @@ trait NameResolution { case _ => violation("PIdnUnk always has a parent") } - // technically, `isGhostDef` should consider for implementation proofs whether the method getting implemented is ghost or not. - // however, we treat all implementation proofs as non-ghost and ignore whether an implementation proof is related to a - // ghost or actual method because the implementation proof is syntactically restricted and can only call the implemented - // method and/or fold and unfold the interface's predicate. + // `isGhostDef` returns true if a node is part of ghost code. However, implementation proofs are considered being + // non-ghost, independently of whether they are for a ghost or non-ghost method. Thus, implementation proofs for ghost + // and non-ghost methods are type-checked in the same way, which is unproblematic due to their syntactic restrictions. private[resolution] lazy val isGhostDef: PNode => Boolean = n => isEnclosingGhost(n) private[resolution] def serialize(id: PIdnNode): String = id.name diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra index c30c623c8..534034884 100644 --- a/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-pointer-receiver-fail01.gobra @@ -135,7 +135,14 @@ func (r Foo) ActualNonPointerReceiver() int { decreases preserves acc(r) //:: ExpectedOutput(type_error) -func (r gpointer[Foo]) ActualGhostPointerReceiver() int { // ghostpointer is only allowed for ghost methods +func (r gpointer[Foo]) ActualGhostPointerReceiver() int { // a receiver of type ghostpointer is only allowed for ghost methods + r.field = 0 + return r.field +} + +decreases +preserves acc(r) +func ActualMethodWithGhostPointerParam(ghost r gpointer[Foo]) (ghost res int) { // actual methods can take a ghostpointer as a ghost parameter r.field = 0 return r.field } diff --git a/src/test/resources/regressions/features/ghost_pointer/ghost-write-fail02.gobra b/src/test/resources/regressions/features/ghost_pointer/ghost-write-fail02.gobra new file mode 100644 index 000000000..79b2cd1b5 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_pointer/ghost-write-fail02.gobra @@ -0,0 +1,39 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package GhostWriteFail02 + +// this testcase checks that an actual method cannot be called within ghost code as this method might modify +// non-ghost memory. + +decreases +requires acc(x) +func foo(x *int) { + *x = 0 +} + +ghost +decreases +requires acc(x) +func bar(x *int) { + // the following two calls are type-checked in the same way as we are already in a ghost context. + // each call technically results in two type errors, i.e., (1) calling a non-ghost method in a ghost context and + // (2) assigning a ghost variable `x` to a non-ghost parameter. + + //:: ExpectedOutput(type_error) + ghost foo(x) + + //:: ExpectedOutput(type_error) + foo(x) +} + +decreases +requires acc(x) +func bar2(x *int) { + // the following call fails because we call a non-ghost method in a ghost context: + //:: ExpectedOutput(type_error) + ghost foo(x) + + // this is fine since we are in a non-ghost context: + foo(x) +} From e1a19d7150c7072a1241b86db8592e709b9fba04 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 23 May 2024 16:56:24 +0200 Subject: [PATCH 289/296] Implements CR suggestions by Felix --- .../implementation/property/Implements.scala | 16 +++---- .../resolution/AdvancedMemberSet.scala | 3 ++ .../implementation/typing/TypeTyping.scala | 9 ++-- .../encodings/structs/StructEncoding.scala | 37 ++++++++-------- .../ghost-field-comparison-simple02.gobra | 43 +++++++++++++++++++ 5 files changed, 76 insertions(+), 32 deletions(-) create mode 100644 src/test/resources/regressions/features/ghost_field/ghost-field-comparison-simple02.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala index 3f30f9442..50b70e936 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala @@ -89,18 +89,12 @@ trait Implements { this: TypeInfoImpl => case _ => failedProp(s"$r is not an interface") } - /** Returns true if the type is supported for interfaces. All finite types are supported except for structs with ghost fields. */ + /** Returns true if the type is supported for interfaces. All finite types are supported. */ def supportedSortForInterfaces(t: Type): PropertyResult = { - failedProp(s"The type $t is not supported for interface", !isIdentityPreservingType(t)) and - // the following restriction is in place because Go considers two struct values under an interface to be equal if - // they agree on their struct fields. I.e., for `type S struct { val int, ghost gval int }`, `any(S{0, 0}) == any(S{0, 42})` holds - // in Go (after erasing the ghost fields). While we could extend the interface encoding to permit structs with ghost fields - // to implement an interface, we currently reject such cases. However, note that we already support a _pointer_ to a struct with - // ghost fields implementing an interface. - failedProp(s"Structs containing ghost fields are not supported for interface", isStructTypeWithGhostFields(t)) + failedProp(s"The type $t is not supported for interface", !isIdentityPreservingType(t)) } - /** Returns whether values of type 't' satisfy that [x] == [y] in Viper implies x == y in Gobra. */ + /** Returns whether values of type 't' satisfy that [x] == [y] in Viper (using `TypeEncoding.equal`) <==> x == y in Go (using Go equality). */ private def isIdentityPreservingType(t: Type, encounteredTypes: Set[Type] = Set.empty): Boolean = { if (encounteredTypes contains t) { true @@ -110,7 +104,9 @@ trait Implements { this: TypeInfoImpl => case Type.NilType | Type.BooleanT | _: Type.IntT | Type.StringT => true case ut: Type.PointerT => go(ut.elem) case ut: Type.StructT => - ut.clauses.forall{ case (_, info) => go(info.typ) } + // a struct with ghost fields or ghost embeddings is not identity preserving. + // E.g., for `type S struct { val int, ghost gval int }`, `S{0, 0} == S{0, 42}` holds in Go (after erasing the ghost fields). + ut.clauses.forall{ case (_, info) => !info.isGhost && go(info.typ) } case ut: Type.ArrayT => go(ut.elem) case _: Type.SliceT => true case _: Type.MapT => true diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala index 43cc8d374..901a1f6f4 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AdvancedMemberSet.scala @@ -65,6 +65,9 @@ class AdvancedMemberSet[M <: TypeMember] private( def forall(f: (String, (M, Vector[MemberPath])) => Boolean): Boolean = internal.forall{ case (s, (m, p, _)) => f(s, (m,p)) } + def exists(f: (String, (M, Vector[MemberPath])) => Boolean): Boolean = + internal.exists{ case (s, (m, p, _)) => f(s, (m,p)) } + def map[T](f: (String, (M, Vector[MemberPath])) => T): Vector[T] = internal.map { case (s, (m, p, _)) => f(s, (m,p)) }.toVector diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index 73479897c..d91a5f68b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -80,10 +80,11 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => def isStructTypeWithGhostFields(t: Type): Boolean = t match { case Single(st) => underlyingType(st) match { case t: StructT => - structMemberSet(t).collect { - case (_, f: Field) => f.ghost - case (_, e: Embbed) => e.ghost || isStructTypeWithGhostFields(e.context.typ(e.decl.typ)) - }.exists(identity) + structMemberSet(t).exists { + case (_, (f: Field, _)) => f.ghost || isStructTypeWithGhostFields(f.context.symbType(f.decl.typ)) + case (_, (e: Embbed, _)) => e.ghost || isStructTypeWithGhostFields(e.context.typ(e.decl.typ)) + case _ => false + } case _ => false } diff --git a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala index 3eab6ec3f..f3f4e78e2 100644 --- a/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/structs/StructEncoding.scala @@ -131,19 +131,7 @@ class StructEncoding extends TypeEncoding { * [(lhs: *Struct{}°) == rhs: *Struct{}] -> unknown() * [(lhs: *Struct{F}°) == rhs: *Struct{_}] -> [lhs] == [rhs] */ - override def equal(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = { - case (lhs :: ctx.Struct(lhsFs), rhs :: ctx.Struct(rhsFs), src) => - val (pos, info, errT) = src.vprMeta - pure( - for { - x <- bind(lhs)(ctx) - y <- bind(rhs)(ctx) - lhsFAccs = fieldAccesses(x, lhsFs) - rhsFAccs = fieldAccesses(y, rhsFs) - equalFields <- sequence((lhsFAccs zip rhsFAccs).map { case (lhsFA, rhsFA) => ctx.equal(lhsFA, rhsFA)(src) }) - } yield VU.bigAnd(equalFields)(pos, info, errT) - )(ctx) - + override def equal(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = structEqual(ctx, useGoEquality = false) orElse { case (lhs :: ctx.*(ctx.Struct(lhsFs)) / Exclusive, rhs :: ctx.*(ctx.Struct(_)), src) => if (lhsFs.isEmpty) { unit(withSrc(if (lhs == rhs) vpr.TrueLit() else ctx.unknownValue.unkownValue(vpr.Bool), src)) @@ -160,17 +148,30 @@ class StructEncoding extends TypeEncoding { * * [(lhs: Struct{F}) == rhs: Struct{_}] -> AND f in actual(F): [lhs.f == rhs.f] (NOTE: f ranges only over actual fields since `goEqual` corresponds to actual comparison) */ - override def goEqual(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = default(super.goEqual(ctx)) { + override def goEqual(ctx: Context): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = default(super.goEqual(ctx))(structEqual(ctx, useGoEquality = true)) + + /** + * Encodes equality of two struct values under consideration of either the Go or Gobra/ghost semantics + * + * useGoEquality: + * [(lhs: Struct{F}) == rhs: Struct{_}] -> AND f in actual(F): [lhs.f == rhs.f] (NOTE: f ranges only over actual fields) + * + * !useGoEquality: + * [(lhs: Struct{F}) == rhs: Struct{_}] -> AND f in F: [lhs.f == rhs.f] (NOTE: f ranges over actual & ghost fields) + */ + private def structEqual(ctx: Context, useGoEquality: Boolean): (in.Expr, in.Expr, in.Node) ==> CodeWriter[vpr.Exp] = { case (lhs :: ctx.Struct(lhsFs), rhs :: ctx.Struct(rhsFs), src) => val (pos, info, errT) = src.vprMeta - val actualFieldFilter: in.FieldRef => Boolean = fr => !fr.field.ghost + // keep all fields if we are NOT using Go's equality. Otherwise, only keep actual fields: + val fieldFilter: in.FieldRef => Boolean = fr => !useGoEquality || !fr.field.ghost + val equalFn = (l: in.Expr, r: in.Expr) => if (useGoEquality) ctx.goEqual(l, r)(src) else ctx.equal(l, r)(src) pure( for { x <- bind(lhs)(ctx) y <- bind(rhs)(ctx) - lhsFAccs = fieldAccesses(x, lhsFs).filter(actualFieldFilter) - rhsFAccs = fieldAccesses(y, rhsFs).filter(actualFieldFilter) - equalFields <- sequence((lhsFAccs zip rhsFAccs).map { case (lhsFA, rhsFA) => ctx.equal(lhsFA, rhsFA)(src) }) + lhsFAccs = fieldAccesses(x, lhsFs).filter(fieldFilter) + rhsFAccs = fieldAccesses(y, rhsFs).filter(fieldFilter) + equalFields <- sequence((lhsFAccs zip rhsFAccs).map { case (lhsFA, rhsFA) => equalFn(lhsFA, rhsFA) }) } yield VU.bigAnd(equalFields)(pos, info, errT) )(ctx) } diff --git a/src/test/resources/regressions/features/ghost_field/ghost-field-comparison-simple02.gobra b/src/test/resources/regressions/features/ghost_field/ghost-field-comparison-simple02.gobra new file mode 100644 index 000000000..de9f95068 --- /dev/null +++ b/src/test/resources/regressions/features/ghost_field/ghost-field-comparison-simple02.gobra @@ -0,0 +1,43 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// tests that Gobra correctly excludes ghost fields of nested structs when comparing structs using the standard Go comparison + +package GhostFieldComparisonSimple02 + +type Test struct { + n NestedStruct +} + +type NestedStruct struct { + actualField int + ghost ghostField int +} + +decreases +func foo() { + t1 := Test{NestedStruct{0, 0}} + t2 := Test{NestedStruct{0, 42}} + t3 := Test{NestedStruct{0, 42}} + assert t1 == t2 // actual comparison, i.e., ghost fields are ignored + assert t2 === t3 // ghost comparison + assert t1 !== t2 // ghost comparison + + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} + +// behavior is the same independent of ghost/actual context +ghost +decreases +func ghostFoo() { + t1 := Test{NestedStruct{0, 0}} + t2 := Test{NestedStruct{0, 42}} + t3 := Test{NestedStruct{0, 42}} + assert t1 == t2 // actual comparison, i.e., ghost fields are ignored + assert t2 === t3 // ghost comparison + assert t1 !== t2 // ghost comparison + + //:: ExpectedOutput(assert_error:assertion_error) + assert false +} From e8d43bdb462236faee7589f3f5a73d6318cdadb8 Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Mon, 17 Jun 2024 21:09:26 +0200 Subject: [PATCH 290/296] Updates submodules (#772) Co-authored-by: jcp19 <6281876+jcp19@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index b6f996d4b..5a60803ce 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit b6f996d4b305c54b3addcbd236055db08f9fa3c7 +Subproject commit 5a60803cefeeff850dc43523a1f7632110fecdd3 From a1b0f8e5d894c4dfa9130fd2cda8d14d4af96c58 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Thu, 2 Feb 2023 17:49:00 +0100 Subject: [PATCH 291/296] improves documentation of Gobra's 3 input modes --- src/main/scala/viper/gobra/Gobra.scala | 2 +- .../scala/viper/gobra/frontend/Config.scala | 30 ++++++++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index 3b1e71757..8141ff7a6 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -34,7 +34,7 @@ import scala.concurrent.{Await, Future, TimeoutException} object GoVerifier { - val copyright = "(c) Copyright ETH Zurich 2012 - 2022" + val copyright = "(c) Copyright ETH Zurich 2012 - 2023" val name = "Gobra" diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index 684f7ec75..c66a078c4 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -443,8 +443,30 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals ) banner( - s""" Usage: ${GoVerifier.name} -i [OPTIONS] OR - | ${GoVerifier.name} -p [OPTIONS] + s""" ${GoVerifier.name} supports three modes for specifying input files that should be verified: + | ${GoVerifier.name} -i [OPTIONS] OR + | ${GoVerifier.name} -p [OPTIONS] OR + | ${GoVerifier.name} -r [OPTIONS] + | + | Mode 1 (-i): + | The first way interprets the list of files as one package that should be verified. + | Optionally, positional information can be provided for each file, e.g. @42,111, such that only + | members at these positions will be verified. + | + | Mode 2 (-p): + | Interprets each provided directory as a directory storing files belonging to a single package. + | Verifies these packages. The project root (by default the current working directory) is used to derive a + | unique package identifier, since package names might not be unique. + | + | Mode 3 (-r): + | Transitively locates source files in subdirectories relative to the project root (by default the current + | working directory) and groups them to packages based on the relative path and package name. + | --includePackages and --excludePackages can be used to allow- + | or block-list packages. + | + | Note that --include is unrelated to the modes above and controls how ${GoVerifier.name} resolves + | package imports. + | | | Options: |""".stripMargin @@ -763,14 +785,14 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals val noVerify: ScallopOption[Boolean] = opt[Boolean]( name = "noVerify", - descr = s"Skip the verification step performed after encoding the Gobra program into Viper.", + descr = s"Skip the verification step performed after encoding the ${GoVerifier.name} program into Viper.", default = Some(ConfigDefaults.DefaultNoVerify), noshort = true, ) val noStreamErrors: ScallopOption[Boolean] = opt[Boolean]( name = "noStreamErrors", - descr = "Do not stream errors produced by Gobra but instead print them all organized by package in the end.", + descr = s"Do not stream errors produced by ${GoVerifier.name} but instead print them all organized by package in the end.", default = Some(ConfigDefaults.DefaultNoStreamErrors), noshort = true, ) From 529b823a358642c539942a3ca1f02fc7b45507f8 Mon Sep 17 00:00:00 2001 From: Linard Arquint Date: Tue, 18 Jun 2024 08:42:26 +0200 Subject: [PATCH 292/296] Applies CR suggestions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: JoĂ£o Pereira --- src/main/scala/viper/gobra/Gobra.scala | 2 +- src/main/scala/viper/gobra/frontend/Config.scala | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/scala/viper/gobra/Gobra.scala b/src/main/scala/viper/gobra/Gobra.scala index 8141ff7a6..d7ffd5391 100644 --- a/src/main/scala/viper/gobra/Gobra.scala +++ b/src/main/scala/viper/gobra/Gobra.scala @@ -34,7 +34,7 @@ import scala.concurrent.{Await, Future, TimeoutException} object GoVerifier { - val copyright = "(c) Copyright ETH Zurich 2012 - 2023" + val copyright = "(c) Copyright ETH Zurich 2012 - 2024" val name = "Gobra" diff --git a/src/main/scala/viper/gobra/frontend/Config.scala b/src/main/scala/viper/gobra/frontend/Config.scala index c66a078c4..748f78909 100644 --- a/src/main/scala/viper/gobra/frontend/Config.scala +++ b/src/main/scala/viper/gobra/frontend/Config.scala @@ -449,12 +449,14 @@ class ScallopGobraConfig(arguments: Seq[String], isInputOptional: Boolean = fals | ${GoVerifier.name} -r [OPTIONS] | | Mode 1 (-i): - | The first way interprets the list of files as one package that should be verified. + | The first mode takes a list of files that must belong to the same package. + | Files belonging to the same package but missing in the list are not considered for type-checking and verification. | Optionally, positional information can be provided for each file, e.g. @42,111, such that only | members at these positions will be verified. | | Mode 2 (-p): - | Interprets each provided directory as a directory storing files belonging to a single package. + | ${GoVerifier.name} verifies all `.${PackageResolver.gobraExtension}` and `.${PackageResolver.goExtension}` files in the provided directories, + | while treating files in the same directory as belonging to the same package. | Verifies these packages. The project root (by default the current working directory) is used to derive a | unique package identifier, since package names might not be unique. | From b931d58df000a9d143c26b10c7cb13b4396ae76d Mon Sep 17 00:00:00 2001 From: viper-admin <59963956+viper-admin@users.noreply.github.com> Date: Tue, 2 Jul 2024 10:49:02 +0200 Subject: [PATCH 293/296] Updates submodules (#774) Co-authored-by: ArquintL <3762537+ArquintL@users.noreply.github.com> --- viperserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viperserver b/viperserver index 5a60803ce..2f7124f97 160000 --- a/viperserver +++ b/viperserver @@ -1 +1 @@ -Subproject commit 5a60803cefeeff850dc43523a1f7632110fecdd3 +Subproject commit 2f7124f970487c7faead97723269e373d49a2c6c From 59fc2b58e6eca9c358bf6662a95dea5267fab421 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 10:50:08 +0200 Subject: [PATCH 294/296] Bump docker/build-push-action from 5 to 6 in the all group (#775) Bumps the all group with 1 update: [docker/build-push-action](https://github.com/docker/build-push-action). Updates `docker/build-push-action` from 5 to 6 - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v5...v6) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index dc3743fb0..8a1da0d01 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -76,7 +76,7 @@ jobs: - name: Build image up to including stage 'build' id: image-build # note that the action's name is misleading: this step does NOT push - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: . load: true # make the built image available in docker (locally) @@ -191,7 +191,7 @@ jobs: path: sync/pidstat.txt - name: Build entire image - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: . load: true # make the built image available in docker (locally) @@ -236,7 +236,7 @@ jobs: - name: Push entire image if: env.SHOULD_DEPLOY == 'true' - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: . file: workflow-container/Dockerfile From b684ebc167a2724f834796d5ea73c6d9d6449421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Wed, 3 Jul 2024 16:34:45 +0200 Subject: [PATCH 295/296] Add purity checks to the ternary expression (#778) * fix issue * fix a few tests --- .../typing/ghost/GhostExprTyping.scala | 4 +++- .../resources/regressions/issues/000777-1.gobra | 12 ++++++++++++ .../resources/regressions/issues/000777-2.gobra | 16 ++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/regressions/issues/000777-1.gobra create mode 100644 src/test/resources/regressions/issues/000777-2.gobra diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index 2fcba6af7..2f2a04d60 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -44,7 +44,9 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => // check that `cond` is of type bool assignableTo.errors(exprType(cond), BooleanT)(expr) ++ // check that `thn` and `els` have a common type - mergeableTypes.errors(exprType(thn), exprType(els))(expr) + mergeableTypes.errors(exprType(thn), exprType(els))(expr) ++ + // check that all subexpressions are pure. + isPureExpr(cond) ++ isWeaklyPureExpr(thn) ++ isWeaklyPureExpr(els) case n@PForall(vars, triggers, body) => // check whether all triggers are valid and consistent diff --git a/src/test/resources/regressions/issues/000777-1.gobra b/src/test/resources/regressions/issues/000777-1.gobra new file mode 100644 index 000000000..29e2921ac --- /dev/null +++ b/src/test/resources/regressions/issues/000777-1.gobra @@ -0,0 +1,12 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package issue000777 + +ghost +requires i >= 0 +decreases i +func h(i int) (res int) { + //:: ExpectedOutput(type_error) + return i == 0 ? 0 : h(i - 1) +} \ No newline at end of file diff --git a/src/test/resources/regressions/issues/000777-2.gobra b/src/test/resources/regressions/issues/000777-2.gobra new file mode 100644 index 000000000..6dc507300 --- /dev/null +++ b/src/test/resources/regressions/issues/000777-2.gobra @@ -0,0 +1,16 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package issue000777 + +ghost +requires i > 0 +decreases i +pure func h(i int) (res int) + +ghost +requires 0 <= i +decreases +func test(i int) { + x := i == 0 ? 0 : h(i) +} \ No newline at end of file From c67e18f081cf5f6d110f355cd5b9585996a68723 Mon Sep 17 00:00:00 2001 From: Lea Salome Brugger <44122567+bruggerl@users.noreply.github.com> Date: Wed, 10 Jul 2024 17:12:42 +0200 Subject: [PATCH 296/296] Add refute statement (#776) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add refute statement * Update src/main/java/viper/gobra/frontend/GobraLexer.java Co-authored-by: JoĂ£o Pereira * Update src/main/java/viper/gobra/frontend/GobraParser.java Co-authored-by: JoĂ£o Pereira * Update src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java Co-authored-by: JoĂ£o Pereira * Update src/main/java/viper/gobra/frontend/GobraParserVisitor.java Co-authored-by: JoĂ£o Pereira * Inline plugin execution * Remove unused imports * Switch to frontend API for Silicon and Carbon * Remove explicit call to mapVerificationResult in RefutePlugin * Add tests for refute * Fix termination transformer * Remove refute transformer * Clean up error transformations for closures * Refine error message for refute errors Co-authored-by: JoĂ£o Pereira * Remove unnecessary parentheses Co-authored-by: JoĂ£o Pereira * Simplify documentation of TerminationDomainTransformer Co-authored-by: JoĂ£o Pereira * Convert spaces to tabs * Revert "Remove unnecessary parentheses" This reverts commit aee8e5378d1718e51c98a6a6c164e907241d59fc. --------- Co-authored-by: JoĂ£o Pereira --- src/main/antlr4/GobraLexer.g4 | 1 + src/main/antlr4/GobraParser.g4 | 2 +- .../java/viper/gobra/frontend/GobraLexer.java | 2303 +++++++++-------- .../viper/gobra/frontend/GobraParser.java | 1105 ++++---- .../scala/viper/gobra/ast/frontend/Ast.scala | 2 + .../gobra/ast/frontend/PrettyPrinter.scala | 1 + .../gobra/ast/internal/PrettyPrinter.scala | 2 + .../viper/gobra/ast/internal/Program.scala | 1 + .../transform/OverflowChecksTransform.scala | 2 +- .../viper/gobra/backend/BackendVerifier.scala | 19 +- .../scala/viper/gobra/backend/Carbon.scala | 14 +- .../scala/viper/gobra/backend/Silicon.scala | 12 +- .../scala/viper/gobra/frontend/Desugar.scala | 1 + .../gobra/frontend/ParseTreeTranslator.scala | 1 + .../implementation/typing/StmtTyping.scala | 2 +- .../typing/ghost/GhostStmtTyping.scala | 1 + .../DefaultErrorBackTranslator.scala | 37 +- .../viper/gobra/reporting/VerifierError.scala | 16 +- .../viper/gobra/translator/Translator.scala | 4 +- .../encodings/closures/ClosureEncoding.scala | 8 +- .../closures/ClosureSpecsEncoder.scala | 8 +- .../closures/MethodObjectEncoder.scala | 4 +- .../typeless/AssertionEncoding.scala | 2 + ...ala => TerminationDomainTransformer.scala} | 35 +- .../features/refute/refute-fail-01.gobra | 24 + .../features/refute/refute-fail-02.gobra | 40 + .../features/refute/refute-simple-01.gobra | 50 + 27 files changed, 1916 insertions(+), 1781 deletions(-) rename src/main/scala/viper/gobra/translator/transformers/{TerminationTransformer.scala => TerminationDomainTransformer.scala} (80%) create mode 100644 src/test/resources/regressions/features/refute/refute-fail-01.gobra create mode 100644 src/test/resources/regressions/features/refute/refute-fail-02.gobra create mode 100644 src/test/resources/regressions/features/refute/refute-simple-01.gobra diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4 index 4d1bdf8a8..b5e92eb5f 100644 --- a/src/main/antlr4/GobraLexer.g4 +++ b/src/main/antlr4/GobraLexer.g4 @@ -20,6 +20,7 @@ DECIMAL_FLOAT_LIT : DECIMALS ('.'{_input.LA(1) != '.'}? DECIMALS? EXPONENT? TRUE : 'true' -> mode(NLSEMI); FALSE : 'false' -> mode(NLSEMI); ASSERT : 'assert'; +REFUTE : 'refute'; ASSUME : 'assume'; INHALE : 'inhale'; EXHALE : 'exhale'; diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 568d55541..7daa704ce 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -60,7 +60,7 @@ ghostMember: implementationProof ghostStatement: GHOST statement #explicitGhostStatement | fold_stmt=(FOLD | UNFOLD) predicateAccess #foldStatement - | kind=(ASSUME | ASSERT | INHALE | EXHALE) expression #proofStatement + | kind=(ASSUME | ASSERT | REFUTE | INHALE | EXHALE) expression #proofStatement | matchStmt #matchStmt_ ; diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 96641cdc3..4690adf3e 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -17,32 +17,33 @@ public class GobraLexer extends Lexer { protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache(); public static final int - FLOAT_LIT=1, DECIMAL_FLOAT_LIT=2, TRUE=3, FALSE=4, ASSERT=5, ASSUME=6, - INHALE=7, EXHALE=8, PRE=9, PRESERVES=10, POST=11, INV=12, DEC=13, PURE=14, - IMPL=15, AS=16, OLD=17, BEFORE=18, LHS=19, FORALL=20, EXISTS=21, ACCESS=22, - FOLD=23, UNFOLD=24, UNFOLDING=25, LET=26, GHOST=27, IN=28, MULTI=29, SUBSET=30, - UNION=31, INTERSECTION=32, SETMINUS=33, IMPLIES=34, WAND=35, APPLY=36, - QMARK=37, L_PRED=38, R_PRED=39, SEQ=40, SET=41, MSET=42, DICT=43, OPT=44, - GPOINTER=45, LEN=46, NEW=47, MAKE=48, CAP=49, SOME=50, GET=51, DOM=52, - AXIOM=53, ADT=54, MATCH=55, NONE=56, PRED=57, TYPE_OF=58, IS_COMPARABLE=59, - SHARE=60, ADDR_MOD=61, DOT_DOT=62, SHARED=63, EXCLUSIVE=64, PREDICATE=65, - WRITEPERM=66, NOPERM=67, TRUSTED=68, OUTLINE=69, INIT_POST=70, IMPORT_PRE=71, - PROOF=72, GHOST_EQUALS=73, GHOST_NOT_EQUALS=74, WITH=75, OPAQUE=76, REVEAL=77, - BACKEND=78, BREAK=79, DEFAULT=80, FUNC=81, INTERFACE=82, SELECT=83, CASE=84, - DEFER=85, GO=86, MAP=87, STRUCT=88, CHAN=89, ELSE=90, GOTO=91, PACKAGE=92, - SWITCH=93, CONST=94, FALLTHROUGH=95, IF=96, RANGE=97, TYPE=98, CONTINUE=99, - FOR=100, IMPORT=101, RETURN=102, VAR=103, NIL_LIT=104, IDENTIFIER=105, - L_PAREN=106, R_PAREN=107, L_CURLY=108, R_CURLY=109, L_BRACKET=110, R_BRACKET=111, - ASSIGN=112, COMMA=113, SEMI=114, COLON=115, DOT=116, PLUS_PLUS=117, MINUS_MINUS=118, - DECLARE_ASSIGN=119, ELLIPSIS=120, LOGICAL_OR=121, LOGICAL_AND=122, EQUALS=123, - NOT_EQUALS=124, LESS=125, LESS_OR_EQUALS=126, GREATER=127, GREATER_OR_EQUALS=128, - OR=129, DIV=130, MOD=131, LSHIFT=132, RSHIFT=133, BIT_CLEAR=134, EXCLAMATION=135, - PLUS=136, MINUS=137, CARET=138, STAR=139, AMPERSAND=140, RECEIVE=141, - DECIMAL_LIT=142, BINARY_LIT=143, OCTAL_LIT=144, HEX_LIT=145, HEX_FLOAT_LIT=146, - IMAGINARY_LIT=147, RUNE_LIT=148, BYTE_VALUE=149, OCTAL_BYTE_VALUE=150, - HEX_BYTE_VALUE=151, LITTLE_U_VALUE=152, BIG_U_VALUE=153, RAW_STRING_LIT=154, - INTERPRETED_STRING_LIT=155, WS=156, COMMENT=157, TERMINATOR=158, LINE_COMMENT=159, - WS_NLSEMI=160, COMMENT_NLSEMI=161, LINE_COMMENT_NLSEMI=162, EOS=163, OTHER=164; + FLOAT_LIT=1, DECIMAL_FLOAT_LIT=2, TRUE=3, FALSE=4, ASSERT=5, REFUTE=6, + ASSUME=7, INHALE=8, EXHALE=9, PRE=10, PRESERVES=11, POST=12, INV=13, DEC=14, + PURE=15, IMPL=16, AS=17, OLD=18, BEFORE=19, LHS=20, FORALL=21, EXISTS=22, + ACCESS=23, FOLD=24, UNFOLD=25, UNFOLDING=26, LET=27, GHOST=28, IN=29, + MULTI=30, SUBSET=31, UNION=32, INTERSECTION=33, SETMINUS=34, IMPLIES=35, + WAND=36, APPLY=37, QMARK=38, L_PRED=39, R_PRED=40, SEQ=41, SET=42, MSET=43, + DICT=44, OPT=45, GPOINTER=46, LEN=47, NEW=48, MAKE=49, CAP=50, SOME=51, + GET=52, DOM=53, AXIOM=54, ADT=55, MATCH=56, NONE=57, PRED=58, TYPE_OF=59, + IS_COMPARABLE=60, SHARE=61, ADDR_MOD=62, DOT_DOT=63, SHARED=64, EXCLUSIVE=65, + PREDICATE=66, WRITEPERM=67, NOPERM=68, TRUSTED=69, OUTLINE=70, INIT_POST=71, + IMPORT_PRE=72, PROOF=73, GHOST_EQUALS=74, GHOST_NOT_EQUALS=75, WITH=76, + OPAQUE=77, REVEAL=78, BACKEND=79, BREAK=80, DEFAULT=81, FUNC=82, INTERFACE=83, + SELECT=84, CASE=85, DEFER=86, GO=87, MAP=88, STRUCT=89, CHAN=90, ELSE=91, + GOTO=92, PACKAGE=93, SWITCH=94, CONST=95, FALLTHROUGH=96, IF=97, RANGE=98, + TYPE=99, CONTINUE=100, FOR=101, IMPORT=102, RETURN=103, VAR=104, NIL_LIT=105, + IDENTIFIER=106, L_PAREN=107, R_PAREN=108, L_CURLY=109, R_CURLY=110, L_BRACKET=111, + R_BRACKET=112, ASSIGN=113, COMMA=114, SEMI=115, COLON=116, DOT=117, PLUS_PLUS=118, + MINUS_MINUS=119, DECLARE_ASSIGN=120, ELLIPSIS=121, LOGICAL_OR=122, LOGICAL_AND=123, + EQUALS=124, NOT_EQUALS=125, LESS=126, LESS_OR_EQUALS=127, GREATER=128, + GREATER_OR_EQUALS=129, OR=130, DIV=131, MOD=132, LSHIFT=133, RSHIFT=134, + BIT_CLEAR=135, EXCLAMATION=136, PLUS=137, MINUS=138, CARET=139, STAR=140, + AMPERSAND=141, RECEIVE=142, DECIMAL_LIT=143, BINARY_LIT=144, OCTAL_LIT=145, + HEX_LIT=146, HEX_FLOAT_LIT=147, IMAGINARY_LIT=148, RUNE_LIT=149, BYTE_VALUE=150, + OCTAL_BYTE_VALUE=151, HEX_BYTE_VALUE=152, LITTLE_U_VALUE=153, BIG_U_VALUE=154, + RAW_STRING_LIT=155, INTERPRETED_STRING_LIT=156, WS=157, COMMENT=158, TERMINATOR=159, + LINE_COMMENT=160, WS_NLSEMI=161, COMMENT_NLSEMI=162, LINE_COMMENT_NLSEMI=163, + EOS=164, OTHER=165; public static final int NLSEMI=1; public static String[] channelNames = { @@ -55,16 +56,16 @@ public class GobraLexer extends Lexer { private static String[] makeRuleNames() { return new String[] { - "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "TRUE", "FALSE", "ASSERT", "ASSUME", - "INHALE", "EXHALE", "PRE", "PRESERVES", "POST", "INV", "DEC", "PURE", - "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", "FOLD", - "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", "UNION", - "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", - "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "GPOINTER", "LEN", "NEW", - "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", - "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", - "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", - "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", + "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "TRUE", "FALSE", "ASSERT", "REFUTE", + "ASSUME", "INHALE", "EXHALE", "PRE", "PRESERVES", "POST", "INV", "DEC", + "PURE", "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", + "FOLD", "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", + "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", + "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "GPOINTER", + "LEN", "NEW", "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", + "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", + "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", + "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "OPAQUE", "REVEAL", "BACKEND", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", @@ -88,8 +89,8 @@ private static String[] makeRuleNames() { private static String[] makeLiteralNames() { return new String[] { - null, null, null, "'true'", "'false'", "'assert'", "'assume'", "'inhale'", - "'exhale'", "'requires'", "'preserves'", "'ensures'", "'invariant'", + null, null, null, "'true'", "'false'", "'assert'", "'refute'", "'assume'", + "'inhale'", "'exhale'", "'requires'", "'preserves'", "'ensures'", "'invariant'", "'decreases'", "'pure'", "'implements'", "'as'", "'old'", "'before'", "'#lhs'", "'forall'", "'exists'", "'acc'", "'fold'", "'unfold'", "'unfolding'", "'let'", "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", @@ -113,16 +114,16 @@ private static String[] makeLiteralNames() { private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { - null, "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "TRUE", "FALSE", "ASSERT", "ASSUME", - "INHALE", "EXHALE", "PRE", "PRESERVES", "POST", "INV", "DEC", "PURE", - "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", "FOLD", - "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", "UNION", - "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", - "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "GPOINTER", "LEN", "NEW", - "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", - "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", - "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", - "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", + null, "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "TRUE", "FALSE", "ASSERT", "REFUTE", + "ASSUME", "INHALE", "EXHALE", "PRE", "PRESERVES", "POST", "INV", "DEC", + "PURE", "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", + "FOLD", "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", + "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", + "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "GPOINTER", + "LEN", "NEW", "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", + "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", + "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", + "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "OPAQUE", "REVEAL", "BACKEND", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", @@ -217,7 +218,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\u0004\u0000\u00a4\u0607\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ + "\u0004\u0000\u00a5\u0610\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ @@ -263,1109 +264,1113 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+ "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+ "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002"+ - "\u00af\u0007\u00af\u0002\u00b0\u0007\u00b0\u0001\u0000\u0001\u0000\u0003"+ - "\u0000\u0167\b\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0003\u0001\u016f\b\u0001\u0001\u0001\u0003\u0001\u0172"+ - "\b\u0001\u0001\u0001\u0003\u0001\u0175\b\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0003\u0001\u017b\b\u0001\u0003\u0001\u017d\b"+ - "\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\u00af\u0007\u00af\u0002\u00b0\u0007\u00b0\u0002\u00b1\u0007\u00b1\u0001"+ + "\u0000\u0001\u0000\u0003\u0000\u0169\b\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u0171\b\u0001\u0001"+ + "\u0001\u0003\u0001\u0174\b\u0001\u0001\u0001\u0003\u0001\u0177\b\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u017d\b\u0001"+ + "\u0003\u0001\u017f\b\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004"+ + "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ "\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ - "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ - "\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014"+ + "\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ - "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017"+ - "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c"+ - "\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ - "\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ - "\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001\"\u0001"+ - "\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001"+ - "$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001"+ - "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001("+ - "\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001"+ - "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001"+ - "+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u0001"+ - "0\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00012\u00012\u0001"+ - "2\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ - "3\u00013\u00013\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u0001"+ - "4\u00015\u00015\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u0001"+ - "6\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u00017\u0001"+ - "7\u00017\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u0001"+ - "9\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001"+ - ":\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001"+ - ":\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001"+ - "<\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ - ">\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ - "?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ - "A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ - "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ - "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ - "F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001"+ - "G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001"+ - "I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001"+ - "K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001"+ - "L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+ - "M\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ - "O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001"+ - "P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ - "U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001"+ - "W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001"+ - "\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+ - "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ - "^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001"+ - "`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001c\u0001"+ - "c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001"+ - "e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001"+ - "f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001"+ - "h\u0001h\u0005h\u0450\bh\nh\fh\u0453\th\u0001h\u0001h\u0001i\u0001i\u0001"+ - "j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001"+ - "m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001p\u0001p\u0001"+ - "q\u0001q\u0001r\u0001r\u0001s\u0001s\u0001t\u0001t\u0001t\u0001t\u0001"+ - "t\u0001u\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001w\u0001"+ - "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001z\u0001"+ - "z\u0001z\u0001{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001}\u0001}\u0001"+ - "~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001"+ - "\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ - "\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001"+ - "\u0085\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ - "\u0088\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008b\u0001"+ - "\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001"+ - "\u008d\u0003\u008d\u04bb\b\u008d\u0001\u008d\u0005\u008d\u04be\b\u008d"+ - "\n\u008d\f\u008d\u04c1\t\u008d\u0003\u008d\u04c3\b\u008d\u0001\u008d\u0001"+ - "\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u04ca\b\u008e\u0001"+ - "\u008e\u0004\u008e\u04cd\b\u008e\u000b\u008e\f\u008e\u04ce\u0001\u008e"+ - "\u0001\u008e\u0001\u008f\u0001\u008f\u0003\u008f\u04d5\b\u008f\u0001\u008f"+ - "\u0003\u008f\u04d8\b\u008f\u0001\u008f\u0004\u008f\u04db\b\u008f\u000b"+ - "\u008f\f\u008f\u04dc\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001"+ - "\u0090\u0003\u0090\u04e4\b\u0090\u0001\u0090\u0004\u0090\u04e7\b\u0090"+ - "\u000b\u0090\f\u0090\u04e8\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091"+ - "\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0003\u0092\u04f3\b\u0092"+ - "\u0001\u0092\u0004\u0092\u04f6\b\u0092\u000b\u0092\f\u0092\u04f7\u0001"+ - "\u0092\u0001\u0092\u0003\u0092\u04fc\b\u0092\u0001\u0092\u0005\u0092\u04ff"+ - "\b\u0092\n\u0092\f\u0092\u0502\t\u0092\u0003\u0092\u0504\b\u0092\u0001"+ - "\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u0509\b\u0092\u0001\u0092\u0005"+ - "\u0092\u050c\b\u0092\n\u0092\f\u0092\u050f\t\u0092\u0003\u0092\u0511\b"+ - "\u0092\u0001\u0093\u0001\u0093\u0003\u0093\u0515\b\u0093\u0001\u0093\u0001"+ - "\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0003"+ - "\u0094\u051e\b\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001"+ - "\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u0527\b\u0095\u0001\u0095\u0001"+ - "\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001"+ - "\u0097\u0003\u0097\u0531\b\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ - "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ - "\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ - "\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ - "\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ - "\u009b\u0001\u009c\u0001\u009c\u0005\u009c\u0551\b\u009c\n\u009c\f\u009c"+ - "\u0554\t\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d"+ - "\u0001\u009d\u0001\u009d\u0005\u009d\u055d\b\u009d\n\u009d\f\u009d\u0560"+ - "\t\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0004"+ - "\u009e\u0567\b\u009e\u000b\u009e\f\u009e\u0568\u0001\u009e\u0001\u009e"+ - "\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0005\u009f\u0571\b\u009f"+ - "\n\u009f\f\u009f\u0574\t\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ - "\u009f\u0001\u009f\u0001\u00a0\u0004\u00a0\u057c\b\u00a0\u000b\u00a0\f"+ - "\u00a0\u057d\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1"+ - "\u0001\u00a1\u0005\u00a1\u0586\b\u00a1\n\u00a1\f\u00a1\u0589\t\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0003"+ - "\u00a2\u0591\b\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ - "\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ - "\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ - "\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ - "\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0003\u00a3\u05ad\b\u00a3\u0001"+ - "\u00a4\u0001\u00a4\u0003\u00a4\u05b1\b\u00a4\u0001\u00a4\u0005\u00a4\u05b4"+ - "\b\u00a4\n\u00a4\f\u00a4\u05b7\t\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a6"+ - "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0003\u00a8"+ - "\u05c1\b\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0003\u00a9"+ - "\u05c7\b\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ac"+ - "\u0004\u00ac\u05ce\b\u00ac\u000b\u00ac\f\u00ac\u05cf\u0001\u00ac\u0001"+ - "\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0005\u00ad\u05d8"+ - "\b\u00ad\n\u00ad\f\u00ad\u05db\t\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ - "\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae"+ - "\u0005\u00ae\u05e6\b\u00ae\n\u00ae\f\u00ae\u05e9\t\u00ae\u0001\u00ae\u0001"+ - "\u00ae\u0001\u00af\u0004\u00af\u05ee\b\u00af\u000b\u00af\f\u00af\u05ef"+ - "\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0005\u00af"+ - "\u05f7\b\u00af\n\u00af\f\u00af\u05fa\t\u00af\u0001\u00af\u0001\u00af\u0001"+ - "\u00af\u0003\u00af\u05ff\b\u00af\u0001\u00af\u0001\u00af\u0001\u00b0\u0001"+ - "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0003\u0572\u05d9\u05f8\u0000"+ - "\u00b1\u0002\u0001\u0004\u0002\u0006\u0003\b\u0004\n\u0005\f\u0006\u000e"+ - "\u0007\u0010\b\u0012\t\u0014\n\u0016\u000b\u0018\f\u001a\r\u001c\u000e"+ - "\u001e\u000f \u0010\"\u0011$\u0012&\u0013(\u0014*\u0015,\u0016.\u0017"+ - "0\u00182\u00194\u001a6\u001b8\u001c:\u001d<\u001e>\u001f@ B!D\"F#H$J%"+ - "L&N\'P(R)T*V+X,Z-\\.^/`0b1d2f3h4j5l6n7p8r9t:v;x~?\u0080@\u0082A\u0084"+ - "B\u0086C\u0088D\u008aE\u008cF\u008eG\u0090H\u0092I\u0094J\u0096K\u0098"+ - "L\u009aM\u009cN\u009eO\u00a0P\u00a2Q\u00a4R\u00a6S\u00a8T\u00aaU\u00ac"+ - "V\u00aeW\u00b0X\u00b2Y\u00b4Z\u00b6[\u00b8\\\u00ba]\u00bc^\u00be_\u00c0"+ - "`\u00c2a\u00c4b\u00c6c\u00c8d\u00cae\u00ccf\u00ceg\u00d0h\u00d2i\u00d4"+ - "j\u00d6k\u00d8l\u00dam\u00dcn\u00deo\u00e0p\u00e2q\u00e4r\u00e6s\u00e8"+ - "t\u00eau\u00ecv\u00eew\u00f0x\u00f2y\u00f4z\u00f6{\u00f8|\u00fa}\u00fc"+ - "~\u00fe\u007f\u0100\u0080\u0102\u0081\u0104\u0082\u0106\u0083\u0108\u0084"+ - "\u010a\u0085\u010c\u0086\u010e\u0087\u0110\u0088\u0112\u0089\u0114\u008a"+ - "\u0116\u008b\u0118\u008c\u011a\u008d\u011c\u008e\u011e\u008f\u0120\u0090"+ - "\u0122\u0091\u0124\u0092\u0126\u0000\u0128\u0000\u012a\u0093\u012c\u0000"+ - "\u012e\u0094\u0130\u0095\u0132\u0096\u0134\u0097\u0136\u0098\u0138\u0099"+ - "\u013a\u009a\u013c\u009b\u013e\u009c\u0140\u009d\u0142\u009e\u0144\u009f"+ - "\u0146\u0000\u0148\u0000\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0000"+ - "\u0152\u0000\u0154\u0000\u0156\u0000\u0158\u0000\u015a\u00a0\u015c\u00a1"+ - "\u015e\u00a2\u0160\u00a3\u0162\u00a4\u0002\u0000\u0001\u0013\u0001\u0000"+ - "19\u0001\u000009\u0002\u0000BBbb\u0002\u0000OOoo\u0002\u0000XXxx\u0002"+ - "\u0000PPpp\u0002\u0000++--\u0001\u0000``\u0002\u0000\"\"\\\\\u0002\u0000"+ - "\t\t \u0002\u0000\n\n\r\r\u0003\u0000\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\"+ - "abffnnrrttvv\u0001\u000007\u0003\u000009AFaf\u0001\u000001\u0002\u0000"+ - "EEee@\u000009\u0660\u0669\u06f0\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef"+ - "\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef"+ - "\u0d66\u0d6f\u0de6\u0def\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049"+ - "\u1090\u1099\u17e0\u17e9\u1810\u1819\u1946\u194f\u19d0\u19d9\u1a80\u1a89"+ - "\u1a90\u1a99\u1b50\u1b59\u1bb0\u1bb9\u1c40\u1c49\u1c50\u1c59\u8000\ua620"+ - "\u8000\ua629\u8000\ua8d0\u8000\ua8d9\u8000\ua900\u8000\ua909\u8000\ua9d0"+ - "\u8000\ua9d9\u8000\ua9f0\u8000\ua9f9\u8000\uaa50\u8000\uaa59\u8000\uabf0"+ - "\u8000\uabf9\u8000\uff10\u8000\uff19\u8001\u04a0\u8001\u04a9\u8001\u0d30"+ - "\u8001\u0d39\u8001\u1066\u8001\u106f\u8001\u10f0\u8001\u10f9\u8001\u1136"+ - "\u8001\u113f\u8001\u11d0\u8001\u11d9\u8001\u12f0\u8001\u12f9\u8001\u1450"+ - "\u8001\u1459\u8001\u14d0\u8001\u14d9\u8001\u1650\u8001\u1659\u8001\u16c0"+ - "\u8001\u16c9\u8001\u1730\u8001\u1739\u8001\u18e0\u8001\u18e9\u8001\u1950"+ - "\u8001\u1959\u8001\u1c50\u8001\u1c59\u8001\u1d50\u8001\u1d59\u8001\u1da0"+ - "\u8001\u1da9\u8001\u1f50\u8001\u1f59\u8001\u6a60\u8001\u6a69\u8001\u6ac0"+ - "\u8001\u6ac9\u8001\u6b50\u8001\u6b59\u8001\ud7ce\u8001\ud7ff\u8001\ue140"+ - "\u8001\ue149\u8001\ue2f0\u8001\ue2f9\u8001\ue4f0\u8001\ue4f9\u8001\ue950"+ - "\u8001\ue959\u8001\ufbf0\u8001\ufbf9\u0293\u0000AZaz\u00aa\u00aa\u00b5"+ - "\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0"+ - "\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376\u0377\u037a\u037d\u037f"+ - "\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03f5\u03f7"+ - "\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560\u0588\u05d0\u05ea\u05ef"+ - "\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee"+ - "\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1"+ - "\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800\u0815\u081a\u081a\u0824"+ - "\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870\u0887\u0889\u088e\u08a0"+ - "\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958\u0961\u0971\u0980\u0985"+ - "\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd"+ - "\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05"+ - "\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38"+ - "\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93"+ - "\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0"+ - "\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32"+ - "\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83"+ - "\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e"+ - "\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e"+ - "\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60"+ - "\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5"+ - "\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e"+ - "\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a"+ - "\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01"+ - "\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c"+ - "\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6"+ - "\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000"+ - "\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061\u1061\u1065\u1066\u106e"+ - "\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0"+ - "\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258\u1258\u125a\u125d\u1260"+ - "\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2"+ - "\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318\u135a\u1380\u138f\u13a0"+ - "\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681\u169a\u16a0\u16ea\u16f1"+ - "\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760\u176c\u176e\u1770\u1780"+ - "\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880\u1884\u1887\u18a8\u18aa"+ - "\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0"+ - "\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83"+ - "\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80"+ - "\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa"+ - "\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50"+ - "\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6"+ - "\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0"+ - "\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f\u207f\u2090\u209c\u2102"+ - "\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119\u211d\u2124\u2124\u2126"+ - "\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c\u213f\u2145\u2149\u214e"+ - "\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27"+ - "\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8"+ - "\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8"+ - "\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b\u303c\u3041\u3096\u309d"+ - "\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131\u318e\u31a0\u31bf\u31f0"+ - "\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0\u8000\ua4fd\u8000\ua500"+ - "\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a\u8000\ua62b\u8000\ua640"+ - "\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0\u8000\ua6e5\u8000\ua717"+ - "\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b\u8000\ua7ca\u8000\ua7d0"+ - "\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2"+ - "\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c"+ - "\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882\u8000\ua8b3\u8000\ua8f2"+ - "\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000\ua90a"+ - "\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960\u8000\ua97c\u8000\ua984"+ - "\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6"+ - "\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40"+ - "\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60\u8000\uaa76\u8000\uaa7a"+ - "\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1\u8000\uaab1\u8000\uaab5"+ - "\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0\u8000\uaac0\u8000\uaac2"+ - "\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0\u8000\uaaea\u8000\uaaf2"+ - "\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09\u8000\uab0e\u8000\uab11"+ - "\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28\u8000\uab2e\u8000\uab30"+ - "\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70\u8000\uabe2\u8000\uac00"+ - "\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000\uf900"+ - "\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00\u8000\ufb06\u8000\ufb13"+ - "\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f\u8000\ufb28\u8000\ufb2a"+ - "\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000\ufb40"+ - "\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46\u8000\ufbb1\u8000\ufbd3"+ - "\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92\u8000\ufdc7\u8000\ufdf0"+ - "\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76\u8000\ufefc\u8000\uff21"+ - "\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66\u8000\uffbe\u8000\uffc2"+ - "\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2\u8000\uffd7\u8000\uffda"+ - "\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001&\u8001(\u8001:\u8001"+ - "<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080\u8001\u00fa\u8001\u0280"+ - "\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300\u8001\u031f\u8001\u032d"+ - "\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350\u8001\u0375\u8001\u0380"+ - "\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8\u8001\u03cf\u8001\u0400"+ - "\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8\u8001\u04fb\u8001\u0500"+ - "\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570\u8001\u057a\u8001\u057c"+ - "\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594\u8001\u0595\u8001\u0597"+ - "\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3\u8001\u05b9\u8001\u05bb"+ - "\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740\u8001\u0755\u8001\u0760"+ - "\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787\u8001\u07b0\u8001\u07b2"+ - "\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808\u8001\u0808\u8001\u080a"+ - "\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c\u8001\u083c\u8001\u083f"+ - "\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880\u8001\u089e\u8001\u08e0"+ - "\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900\u8001\u0915\u8001\u0920"+ - "\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be\u8001\u09bf\u8001\u0a00"+ - "\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15\u8001\u0a17\u8001\u0a19"+ - "\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80\u8001\u0a9c\u8001\u0ac0"+ - "\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00\u8001\u0b35\u8001\u0b40"+ - "\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80\u8001\u0b91\u8001\u0c00"+ - "\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0\u8001\u0cf2\u8001\u0d00"+ - "\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0\u8001\u0eb1\u8001\u0f00"+ - "\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30\u8001\u0f45\u8001\u0f70"+ - "\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0\u8001\u0ff6\u8001\u1003"+ - "\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075\u8001\u1075\u8001\u1083"+ - "\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103\u8001\u1126\u8001\u1144"+ - "\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150\u8001\u1172\u8001\u1176"+ - "\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1\u8001\u11c4\u8001\u11da"+ - "\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200\u8001\u1211\u8001\u1213"+ - "\u8001\u122b\u8001\u123f\u8001\u1240\u8001\u1280\u8001\u1286\u8001\u1288"+ - "\u8001\u1288\u8001\u128a\u8001\u128d\u8001\u128f\u8001\u129d\u8001\u129f"+ - "\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001\u1305\u8001\u130c\u8001\u130f"+ - "\u8001\u1310\u8001\u1313\u8001\u1328\u8001\u132a\u8001\u1330\u8001\u1332"+ - "\u8001\u1333\u8001\u1335\u8001\u1339\u8001\u133d\u8001\u133d\u8001\u1350"+ - "\u8001\u1350\u8001\u135d\u8001\u1361\u8001\u1400\u8001\u1434\u8001\u1447"+ - "\u8001\u144a\u8001\u145f\u8001\u1461\u8001\u1480\u8001\u14af\u8001\u14c4"+ - "\u8001\u14c5\u8001\u14c7\u8001\u14c7\u8001\u1580\u8001\u15ae\u8001\u15d8"+ - "\u8001\u15db\u8001\u1600\u8001\u162f\u8001\u1644\u8001\u1644\u8001\u1680"+ - "\u8001\u16aa\u8001\u16b8\u8001\u16b8\u8001\u1700\u8001\u171a\u8001\u1740"+ - "\u8001\u1746\u8001\u1800\u8001\u182b\u8001\u18a0\u8001\u18df\u8001\u18ff"+ - "\u8001\u1906\u8001\u1909\u8001\u1909\u8001\u190c\u8001\u1913\u8001\u1915"+ - "\u8001\u1916\u8001\u1918\u8001\u192f\u8001\u193f\u8001\u193f\u8001\u1941"+ - "\u8001\u1941\u8001\u19a0\u8001\u19a7\u8001\u19aa\u8001\u19d0\u8001\u19e1"+ - "\u8001\u19e1\u8001\u19e3\u8001\u19e3\u8001\u1a00\u8001\u1a00\u8001\u1a0b"+ - "\u8001\u1a32\u8001\u1a3a\u8001\u1a3a\u8001\u1a50\u8001\u1a50\u8001\u1a5c"+ - "\u8001\u1a89\u8001\u1a9d\u8001\u1a9d\u8001\u1ab0\u8001\u1af8\u8001\u1c00"+ - "\u8001\u1c08\u8001\u1c0a\u8001\u1c2e\u8001\u1c40\u8001\u1c40\u8001\u1c72"+ - "\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001\u1d08\u8001\u1d09\u8001\u1d0b"+ - "\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001\u1d60\u8001\u1d65\u8001\u1d67"+ - "\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001\u1d98\u8001\u1d98\u8001\u1ee0"+ - "\u8001\u1ef2\u8001\u1f02\u8001\u1f02\u8001\u1f04\u8001\u1f10\u8001\u1f12"+ - "\u8001\u1f33\u8001\u1fb0\u8001\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480"+ - "\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342f\u8001\u3441"+ - "\u8001\u3446\u8001\u4400\u8001\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40"+ - "\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00"+ - "\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d"+ - "\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50"+ - "\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3"+ - "\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00"+ - "\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd"+ - "\u8001\uaffe\u8001\ub000\u8001\ub122\u8001\ub132\u8001\ub132\u8001\ub150"+ - "\u8001\ub152\u8001\ub155\u8001\ub155\u8001\ub164\u8001\ub167\u8001\ub170"+ - "\u8001\ub2fb\u8001\ubc00\u8001\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80"+ - "\u8001\ubc88\u8001\ubc90\u8001\ubc99\u8001\ud400\u8001\ud454\u8001\ud456"+ - "\u8001\ud49c\u8001\ud49e\u8001\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5"+ - "\u8001\ud4a6\u8001\ud4a9\u8001\ud4ac\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb"+ - "\u8001\ud4bb\u8001\ud4bd\u8001\ud4c3\u8001\ud4c5\u8001\ud505\u8001\ud507"+ - "\u8001\ud50a\u8001\ud50d\u8001\ud514\u8001\ud516\u8001\ud51c\u8001\ud51e"+ - "\u8001\ud539\u8001\ud53b\u8001\ud53e\u8001\ud540\u8001\ud544\u8001\ud546"+ - "\u8001\ud546\u8001\ud54a\u8001\ud550\u8001\ud552\u8001\ud6a5\u8001\ud6a8"+ - "\u8001\ud6c0\u8001\ud6c2\u8001\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc"+ - "\u8001\ud714\u8001\ud716\u8001\ud734\u8001\ud736\u8001\ud74e\u8001\ud750"+ - "\u8001\ud76e\u8001\ud770\u8001\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa"+ - "\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\udf25"+ - "\u8001\udf2a\u8001\ue030\u8001\ue06d\u8001\ue100\u8001\ue12c\u8001\ue137"+ - "\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290\u8001\ue2ad\u8001\ue2c0"+ - "\u8001\ue2eb\u8001\ue4d0\u8001\ue4eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8"+ - "\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001\ue7f0\u8001\ue7fe\u8001\ue800"+ - "\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001\ue94b\u8001\ue94b\u8001\uee00"+ - "\u8001\uee03\u8001\uee05\u8001\uee1f\u8001\uee21\u8001\uee22\u8001\uee24"+ - "\u8001\uee24\u8001\uee27\u8001\uee27\u8001\uee29\u8001\uee32\u8001\uee34"+ - "\u8001\uee37\u8001\uee39\u8001\uee39\u8001\uee3b\u8001\uee3b\u8001\uee42"+ - "\u8001\uee42\u8001\uee47\u8001\uee47\u8001\uee49\u8001\uee49\u8001\uee4b"+ - "\u8001\uee4b\u8001\uee4d\u8001\uee4f\u8001\uee51\u8001\uee52\u8001\uee54"+ - "\u8001\uee54\u8001\uee57\u8001\uee57\u8001\uee59\u8001\uee59\u8001\uee5b"+ - "\u8001\uee5b\u8001\uee5d\u8001\uee5d\u8001\uee5f\u8001\uee5f\u8001\uee61"+ - "\u8001\uee62\u8001\uee64\u8001\uee64\u8001\uee67\u8001\uee6a\u8001\uee6c"+ - "\u8001\uee72\u8001\uee74\u8001\uee77\u8001\uee79\u8001\uee7c\u8001\uee7e"+ - "\u8001\uee7e\u8001\uee80\u8001\uee89\u8001\uee8b\u8001\uee9b\u8001\ueea1"+ - "\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000"+ - "\u8002\ua6df\u8002\ua700\u8002\ub739\u8002\ub740\u8002\ub81d\u8002\ub820"+ - "\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000"+ - "\u8003\u134a\u8003\u1350\u8003\u23af\u0633\u0000\u0002\u0001\u0000\u0000"+ - "\u0000\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000"+ - "\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000"+ - "\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000"+ - "\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000"+ - "\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000"+ - "\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000"+ - "\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000"+ - " \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001"+ - "\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000"+ - "\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000"+ - ".\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001"+ - "\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000"+ - "\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000"+ - "<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001"+ - "\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000"+ - "\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000"+ - "J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001"+ - "\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000"+ - "\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000"+ - "X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001"+ - "\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000"+ - "\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000"+ - "f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000j\u0001"+ - "\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001\u0000\u0000"+ - "\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000"+ - "t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001"+ - "\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000"+ - "\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000\u0000\u0000"+ - "\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000\u0000\u0000"+ - "\u0000\u0086\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000\u0000\u0000"+ - "\u0000\u008a\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000\u0000\u0000"+ - "\u0000\u008e\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000\u0000\u0000"+ - "\u0000\u0092\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000\u0000\u0000"+ - "\u0000\u0096\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000\u0000\u0000"+ - "\u0000\u009a\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000\u0000\u0000"+ - "\u0000\u009e\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000\u0000\u0000"+ - "\u0000\u00a2\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000\u0000\u0000"+ - "\u0000\u00a6\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000\u0000\u0000"+ - "\u0000\u00aa\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000\u0000\u0000"+ - "\u0000\u00ae\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000\u0000\u0000"+ - "\u0000\u00b2\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000\u0000\u0000"+ - "\u0000\u00b6\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000\u0000\u0000"+ - "\u0000\u00ba\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000\u0000\u0000"+ - "\u0000\u00be\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000\u0000\u0000"+ - "\u0000\u00c2\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000\u0000\u0000"+ - "\u0000\u00c6\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000\u0000\u0000"+ - "\u0000\u00ca\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000\u0000\u0000"+ - "\u0000\u00ce\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000\u0000\u0000"+ - "\u0000\u00d2\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000\u0000\u0000"+ - "\u0000\u00d6\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000\u0000\u0000"+ - "\u0000\u00da\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000\u0000\u0000"+ - "\u0000\u00de\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000\u0000\u0000"+ - "\u0000\u00e2\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000\u0000\u0000"+ - "\u0000\u00e6\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000\u0000\u0000"+ - "\u0000\u00ea\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000\u0000\u0000"+ - "\u0000\u00ee\u0001\u0000\u0000\u0000\u0000\u00f0\u0001\u0000\u0000\u0000"+ - "\u0000\u00f2\u0001\u0000\u0000\u0000\u0000\u00f4\u0001\u0000\u0000\u0000"+ - "\u0000\u00f6\u0001\u0000\u0000\u0000\u0000\u00f8\u0001\u0000\u0000\u0000"+ - "\u0000\u00fa\u0001\u0000\u0000\u0000\u0000\u00fc\u0001\u0000\u0000\u0000"+ - "\u0000\u00fe\u0001\u0000\u0000\u0000\u0000\u0100\u0001\u0000\u0000\u0000"+ - "\u0000\u0102\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000\u0000\u0000"+ - "\u0000\u0106\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000\u0000\u0000"+ - "\u0000\u010a\u0001\u0000\u0000\u0000\u0000\u010c\u0001\u0000\u0000\u0000"+ - "\u0000\u010e\u0001\u0000\u0000\u0000\u0000\u0110\u0001\u0000\u0000\u0000"+ - "\u0000\u0112\u0001\u0000\u0000\u0000\u0000\u0114\u0001\u0000\u0000\u0000"+ - "\u0000\u0116\u0001\u0000\u0000\u0000\u0000\u0118\u0001\u0000\u0000\u0000"+ - "\u0000\u011a\u0001\u0000\u0000\u0000\u0000\u011c\u0001\u0000\u0000\u0000"+ - "\u0000\u011e\u0001\u0000\u0000\u0000\u0000\u0120\u0001\u0000\u0000\u0000"+ - "\u0000\u0122\u0001\u0000\u0000\u0000\u0000\u0124\u0001\u0000\u0000\u0000"+ - "\u0000\u012a\u0001\u0000\u0000\u0000\u0000\u012e\u0001\u0000\u0000\u0000"+ - "\u0000\u0130\u0001\u0000\u0000\u0000\u0000\u0132\u0001\u0000\u0000\u0000"+ - "\u0000\u0134\u0001\u0000\u0000\u0000\u0000\u0136\u0001\u0000\u0000\u0000"+ - "\u0000\u0138\u0001\u0000\u0000\u0000\u0000\u013a\u0001\u0000\u0000\u0000"+ - "\u0000\u013c\u0001\u0000\u0000\u0000\u0000\u013e\u0001\u0000\u0000\u0000"+ - "\u0000\u0140\u0001\u0000\u0000\u0000\u0000\u0142\u0001\u0000\u0000\u0000"+ - "\u0000\u0144\u0001\u0000\u0000\u0000\u0001\u015a\u0001\u0000\u0000\u0000"+ - "\u0001\u015c\u0001\u0000\u0000\u0000\u0001\u015e\u0001\u0000\u0000\u0000"+ - "\u0001\u0160\u0001\u0000\u0000\u0000\u0001\u0162\u0001\u0000\u0000\u0000"+ - "\u0002\u0166\u0001\u0000\u0000\u0000\u0004\u017c\u0001\u0000\u0000\u0000"+ - "\u0006\u017e\u0001\u0000\u0000\u0000\b\u0185\u0001\u0000\u0000\u0000\n"+ - "\u018d\u0001\u0000\u0000\u0000\f\u0194\u0001\u0000\u0000\u0000\u000e\u019b"+ - "\u0001\u0000\u0000\u0000\u0010\u01a2\u0001\u0000\u0000\u0000\u0012\u01a9"+ - "\u0001\u0000\u0000\u0000\u0014\u01b2\u0001\u0000\u0000\u0000\u0016\u01bc"+ - "\u0001\u0000\u0000\u0000\u0018\u01c4\u0001\u0000\u0000\u0000\u001a\u01ce"+ - "\u0001\u0000\u0000\u0000\u001c\u01da\u0001\u0000\u0000\u0000\u001e\u01e1"+ - "\u0001\u0000\u0000\u0000 \u01ec\u0001\u0000\u0000\u0000\"\u01ef\u0001"+ - "\u0000\u0000\u0000$\u01f5\u0001\u0000\u0000\u0000&\u01fe\u0001\u0000\u0000"+ - "\u0000(\u0203\u0001\u0000\u0000\u0000*\u020a\u0001\u0000\u0000\u0000,"+ - "\u0211\u0001\u0000\u0000\u0000.\u0217\u0001\u0000\u0000\u00000\u021c\u0001"+ - "\u0000\u0000\u00002\u0223\u0001\u0000\u0000\u00004\u022d\u0001\u0000\u0000"+ - "\u00006\u0231\u0001\u0000\u0000\u00008\u0237\u0001\u0000\u0000\u0000:"+ - "\u023a\u0001\u0000\u0000\u0000<\u023c\u0001\u0000\u0000\u0000>\u0243\u0001"+ - "\u0000\u0000\u0000@\u0249\u0001\u0000\u0000\u0000B\u0256\u0001\u0000\u0000"+ - "\u0000D\u025f\u0001\u0000\u0000\u0000F\u0263\u0001\u0000\u0000\u0000H"+ - "\u0267\u0001\u0000\u0000\u0000J\u026d\u0001\u0000\u0000\u0000L\u026f\u0001"+ - "\u0000\u0000\u0000N\u0272\u0001\u0000\u0000\u0000P\u0277\u0001\u0000\u0000"+ - "\u0000R\u027d\u0001\u0000\u0000\u0000T\u0283\u0001\u0000\u0000\u0000V"+ - "\u028a\u0001\u0000\u0000\u0000X\u0291\u0001\u0000\u0000\u0000Z\u029a\u0001"+ - "\u0000\u0000\u0000\\\u02a5\u0001\u0000\u0000\u0000^\u02ab\u0001\u0000"+ - "\u0000\u0000`\u02b1\u0001\u0000\u0000\u0000b\u02b8\u0001\u0000\u0000\u0000"+ - "d\u02be\u0001\u0000\u0000\u0000f\u02c5\u0001\u0000\u0000\u0000h\u02cb"+ - "\u0001\u0000\u0000\u0000j\u02d4\u0001\u0000\u0000\u0000l\u02dc\u0001\u0000"+ - "\u0000\u0000n\u02e2\u0001\u0000\u0000\u0000p\u02ea\u0001\u0000\u0000\u0000"+ - "r\u02f1\u0001\u0000\u0000\u0000t\u02f6\u0001\u0000\u0000\u0000v\u02ff"+ - "\u0001\u0000\u0000\u0000x\u030e\u0001\u0000\u0000\u0000z\u0314\u0001\u0000"+ - "\u0000\u0000|\u0318\u0001\u0000\u0000\u0000~\u031b\u0001\u0000\u0000\u0000"+ - "\u0080\u0322\u0001\u0000\u0000\u0000\u0082\u032c\u0001\u0000\u0000\u0000"+ - "\u0084\u0336\u0001\u0000\u0000\u0000\u0086\u0342\u0001\u0000\u0000\u0000"+ - "\u0088\u034b\u0001\u0000\u0000\u0000\u008a\u0355\u0001\u0000\u0000\u0000"+ - "\u008c\u035d\u0001\u0000\u0000\u0000\u008e\u0369\u0001\u0000\u0000\u0000"+ - "\u0090\u0378\u0001\u0000\u0000\u0000\u0092\u037e\u0001\u0000\u0000\u0000"+ - "\u0094\u0382\u0001\u0000\u0000\u0000\u0096\u0386\u0001\u0000\u0000\u0000"+ - "\u0098\u038b\u0001\u0000\u0000\u0000\u009a\u0394\u0001\u0000\u0000\u0000"+ - "\u009c\u039b\u0001\u0000\u0000\u0000\u009e\u03a4\u0001\u0000\u0000\u0000"+ - "\u00a0\u03ac\u0001\u0000\u0000\u0000\u00a2\u03b4\u0001\u0000\u0000\u0000"+ - "\u00a4\u03b9\u0001\u0000\u0000\u0000\u00a6\u03c3\u0001\u0000\u0000\u0000"+ - "\u00a8\u03ca\u0001\u0000\u0000\u0000\u00aa\u03cf\u0001\u0000\u0000\u0000"+ - "\u00ac\u03d5\u0001\u0000\u0000\u0000\u00ae\u03d8\u0001\u0000\u0000\u0000"+ - "\u00b0\u03dc\u0001\u0000\u0000\u0000\u00b2\u03e3\u0001\u0000\u0000\u0000"+ - "\u00b4\u03e8\u0001\u0000\u0000\u0000\u00b6\u03ed\u0001\u0000\u0000\u0000"+ - "\u00b8\u03f2\u0001\u0000\u0000\u0000\u00ba\u03fa\u0001\u0000\u0000\u0000"+ - "\u00bc\u0401\u0001\u0000\u0000\u0000\u00be\u0407\u0001\u0000\u0000\u0000"+ - "\u00c0\u0415\u0001\u0000\u0000\u0000\u00c2\u0418\u0001\u0000\u0000\u0000"+ - "\u00c4\u041e\u0001\u0000\u0000\u0000\u00c6\u0423\u0001\u0000\u0000\u0000"+ - "\u00c8\u042e\u0001\u0000\u0000\u0000\u00ca\u0432\u0001\u0000\u0000\u0000"+ - "\u00cc\u0439\u0001\u0000\u0000\u0000\u00ce\u0442\u0001\u0000\u0000\u0000"+ - "\u00d0\u0446\u0001\u0000\u0000\u0000\u00d2\u044c\u0001\u0000\u0000\u0000"+ - "\u00d4\u0456\u0001\u0000\u0000\u0000\u00d6\u0458\u0001\u0000\u0000\u0000"+ - "\u00d8\u045c\u0001\u0000\u0000\u0000\u00da\u045e\u0001\u0000\u0000\u0000"+ - "\u00dc\u0462\u0001\u0000\u0000\u0000\u00de\u0464\u0001\u0000\u0000\u0000"+ - "\u00e0\u0468\u0001\u0000\u0000\u0000\u00e2\u046a\u0001\u0000\u0000\u0000"+ - "\u00e4\u046c\u0001\u0000\u0000\u0000\u00e6\u046e\u0001\u0000\u0000\u0000"+ - "\u00e8\u0470\u0001\u0000\u0000\u0000\u00ea\u0472\u0001\u0000\u0000\u0000"+ - "\u00ec\u0477\u0001\u0000\u0000\u0000\u00ee\u047c\u0001\u0000\u0000\u0000"+ - "\u00f0\u047f\u0001\u0000\u0000\u0000\u00f2\u0483\u0001\u0000\u0000\u0000"+ - "\u00f4\u0486\u0001\u0000\u0000\u0000\u00f6\u0489\u0001\u0000\u0000\u0000"+ - "\u00f8\u048c\u0001\u0000\u0000\u0000\u00fa\u048f\u0001\u0000\u0000\u0000"+ - "\u00fc\u0491\u0001\u0000\u0000\u0000\u00fe\u0494\u0001\u0000\u0000\u0000"+ - "\u0100\u0496\u0001\u0000\u0000\u0000\u0102\u0499\u0001\u0000\u0000\u0000"+ - "\u0104\u049b\u0001\u0000\u0000\u0000\u0106\u049d\u0001\u0000\u0000\u0000"+ - "\u0108\u049f\u0001\u0000\u0000\u0000\u010a\u04a2\u0001\u0000\u0000\u0000"+ - "\u010c\u04a5\u0001\u0000\u0000\u0000\u010e\u04a8\u0001\u0000\u0000\u0000"+ - "\u0110\u04aa\u0001\u0000\u0000\u0000\u0112\u04ac\u0001\u0000\u0000\u0000"+ - "\u0114\u04ae\u0001\u0000\u0000\u0000\u0116\u04b0\u0001\u0000\u0000\u0000"+ - "\u0118\u04b2\u0001\u0000\u0000\u0000\u011a\u04b4\u0001\u0000\u0000\u0000"+ - "\u011c\u04c2\u0001\u0000\u0000\u0000\u011e\u04c6\u0001\u0000\u0000\u0000"+ - "\u0120\u04d2\u0001\u0000\u0000\u0000\u0122\u04e0\u0001\u0000\u0000\u0000"+ - "\u0124\u04ec\u0001\u0000\u0000\u0000\u0126\u0510\u0001\u0000\u0000\u0000"+ - "\u0128\u0512\u0001\u0000\u0000\u0000\u012a\u051d\u0001\u0000\u0000\u0000"+ - "\u012c\u0523\u0001\u0000\u0000\u0000\u012e\u052a\u0001\u0000\u0000\u0000"+ - "\u0130\u0530\u0001\u0000\u0000\u0000\u0132\u0532\u0001\u0000\u0000\u0000"+ - "\u0134\u0537\u0001\u0000\u0000\u0000\u0136\u053c\u0001\u0000\u0000\u0000"+ - "\u0138\u0543\u0001\u0000\u0000\u0000\u013a\u054e\u0001\u0000\u0000\u0000"+ - "\u013c\u0559\u0001\u0000\u0000\u0000\u013e\u0566\u0001\u0000\u0000\u0000"+ - "\u0140\u056c\u0001\u0000\u0000\u0000\u0142\u057b\u0001\u0000\u0000\u0000"+ - "\u0144\u0581\u0001\u0000\u0000\u0000\u0146\u0590\u0001\u0000\u0000\u0000"+ - "\u0148\u0592\u0001\u0000\u0000\u0000\u014a\u05ae\u0001\u0000\u0000\u0000"+ - "\u014c\u05b8\u0001\u0000\u0000\u0000\u014e\u05ba\u0001\u0000\u0000\u0000"+ - "\u0150\u05bc\u0001\u0000\u0000\u0000\u0152\u05be\u0001\u0000\u0000\u0000"+ - "\u0154\u05c6\u0001\u0000\u0000\u0000\u0156\u05c8\u0001\u0000\u0000\u0000"+ - "\u0158\u05ca\u0001\u0000\u0000\u0000\u015a\u05cd\u0001\u0000\u0000\u0000"+ - "\u015c\u05d3\u0001\u0000\u0000\u0000\u015e\u05e1\u0001\u0000\u0000\u0000"+ - "\u0160\u05fe\u0001\u0000\u0000\u0000\u0162\u0602\u0001\u0000\u0000\u0000"+ - "\u0164\u0167\u0003\u0004\u0001\u0000\u0165\u0167\u0003\u0124\u0091\u0000"+ - "\u0166\u0164\u0001\u0000\u0000\u0000\u0166\u0165\u0001\u0000\u0000\u0000"+ - "\u0167\u0168\u0001\u0000\u0000\u0000\u0168\u0169\u0006\u0000\u0000\u0000"+ - "\u0169\u0003\u0001\u0000\u0000\u0000\u016a\u0174\u0003\u014a\u00a4\u0000"+ - "\u016b\u016c\u0005.\u0000\u0000\u016c\u016e\u0004\u0001\u0000\u0000\u016d"+ - "\u016f\u0003\u014a\u00a4\u0000\u016e\u016d\u0001\u0000\u0000\u0000\u016e"+ - "\u016f\u0001\u0000\u0000\u0000\u016f\u0171\u0001\u0000\u0000\u0000\u0170"+ - "\u0172\u0003\u0152\u00a8\u0000\u0171\u0170\u0001\u0000\u0000\u0000\u0171"+ - "\u0172\u0001\u0000\u0000\u0000\u0172\u0175\u0001\u0000\u0000\u0000\u0173"+ - "\u0175\u0003\u0152\u00a8\u0000\u0174\u016b\u0001\u0000\u0000\u0000\u0174"+ - "\u0173\u0001\u0000\u0000\u0000\u0175\u017d\u0001\u0000\u0000\u0000\u0176"+ - "\u0177\u0005.\u0000\u0000\u0177\u0178\u0004\u0001\u0001\u0000\u0178\u017a"+ - "\u0003\u014a\u00a4\u0000\u0179\u017b\u0003\u0152\u00a8\u0000\u017a\u0179"+ - "\u0001\u0000\u0000\u0000\u017a\u017b\u0001\u0000\u0000\u0000\u017b\u017d"+ - "\u0001\u0000\u0000\u0000\u017c\u016a\u0001\u0000\u0000\u0000\u017c\u0176"+ - "\u0001\u0000\u0000\u0000\u017d\u0005\u0001\u0000\u0000\u0000\u017e\u017f"+ - "\u0005t\u0000\u0000\u017f\u0180\u0005r\u0000\u0000\u0180\u0181\u0005u"+ - "\u0000\u0000\u0181\u0182\u0005e\u0000\u0000\u0182\u0183\u0001\u0000\u0000"+ - "\u0000\u0183\u0184\u0006\u0002\u0000\u0000\u0184\u0007\u0001\u0000\u0000"+ - "\u0000\u0185\u0186\u0005f\u0000\u0000\u0186\u0187\u0005a\u0000\u0000\u0187"+ - "\u0188\u0005l\u0000\u0000\u0188\u0189\u0005s\u0000\u0000\u0189\u018a\u0005"+ - "e\u0000\u0000\u018a\u018b\u0001\u0000\u0000\u0000\u018b\u018c\u0006\u0003"+ - "\u0000\u0000\u018c\t\u0001\u0000\u0000\u0000\u018d\u018e\u0005a\u0000"+ - "\u0000\u018e\u018f\u0005s\u0000\u0000\u018f\u0190\u0005s\u0000\u0000\u0190"+ - "\u0191\u0005e\u0000\u0000\u0191\u0192\u0005r\u0000\u0000\u0192\u0193\u0005"+ - "t\u0000\u0000\u0193\u000b\u0001\u0000\u0000\u0000\u0194\u0195\u0005a\u0000"+ - "\u0000\u0195\u0196\u0005s\u0000\u0000\u0196\u0197\u0005s\u0000\u0000\u0197"+ - "\u0198\u0005u\u0000\u0000\u0198\u0199\u0005m\u0000\u0000\u0199\u019a\u0005"+ - "e\u0000\u0000\u019a\r\u0001\u0000\u0000\u0000\u019b\u019c\u0005i\u0000"+ - "\u0000\u019c\u019d\u0005n\u0000\u0000\u019d\u019e\u0005h\u0000\u0000\u019e"+ - "\u019f\u0005a\u0000\u0000\u019f\u01a0\u0005l\u0000\u0000\u01a0\u01a1\u0005"+ - "e\u0000\u0000\u01a1\u000f\u0001\u0000\u0000\u0000\u01a2\u01a3\u0005e\u0000"+ - "\u0000\u01a3\u01a4\u0005x\u0000\u0000\u01a4\u01a5\u0005h\u0000\u0000\u01a5"+ - "\u01a6\u0005a\u0000\u0000\u01a6\u01a7\u0005l\u0000\u0000\u01a7\u01a8\u0005"+ - "e\u0000\u0000\u01a8\u0011\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005r\u0000"+ - "\u0000\u01aa\u01ab\u0005e\u0000\u0000\u01ab\u01ac\u0005q\u0000\u0000\u01ac"+ - "\u01ad\u0005u\u0000\u0000\u01ad\u01ae\u0005i\u0000\u0000\u01ae\u01af\u0005"+ - "r\u0000\u0000\u01af\u01b0\u0005e\u0000\u0000\u01b0\u01b1\u0005s\u0000"+ - "\u0000\u01b1\u0013\u0001\u0000\u0000\u0000\u01b2\u01b3\u0005p\u0000\u0000"+ - "\u01b3\u01b4\u0005r\u0000\u0000\u01b4\u01b5\u0005e\u0000\u0000\u01b5\u01b6"+ - "\u0005s\u0000\u0000\u01b6\u01b7\u0005e\u0000\u0000\u01b7\u01b8\u0005r"+ - "\u0000\u0000\u01b8\u01b9\u0005v\u0000\u0000\u01b9\u01ba\u0005e\u0000\u0000"+ - "\u01ba\u01bb\u0005s\u0000\u0000\u01bb\u0015\u0001\u0000\u0000\u0000\u01bc"+ - "\u01bd\u0005e\u0000\u0000\u01bd\u01be\u0005n\u0000\u0000\u01be\u01bf\u0005"+ - "s\u0000\u0000\u01bf\u01c0\u0005u\u0000\u0000\u01c0\u01c1\u0005r\u0000"+ - "\u0000\u01c1\u01c2\u0005e\u0000\u0000\u01c2\u01c3\u0005s\u0000\u0000\u01c3"+ - "\u0017\u0001\u0000\u0000\u0000\u01c4\u01c5\u0005i\u0000\u0000\u01c5\u01c6"+ - "\u0005n\u0000\u0000\u01c6\u01c7\u0005v\u0000\u0000\u01c7\u01c8\u0005a"+ - "\u0000\u0000\u01c8\u01c9\u0005r\u0000\u0000\u01c9\u01ca\u0005i\u0000\u0000"+ - "\u01ca\u01cb\u0005a\u0000\u0000\u01cb\u01cc\u0005n\u0000\u0000\u01cc\u01cd"+ - "\u0005t\u0000\u0000\u01cd\u0019\u0001\u0000\u0000\u0000\u01ce\u01cf\u0005"+ - "d\u0000\u0000\u01cf\u01d0\u0005e\u0000\u0000\u01d0\u01d1\u0005c\u0000"+ - "\u0000\u01d1\u01d2\u0005r\u0000\u0000\u01d2\u01d3\u0005e\u0000\u0000\u01d3"+ - "\u01d4\u0005a\u0000\u0000\u01d4\u01d5\u0005s\u0000\u0000\u01d5\u01d6\u0005"+ - "e\u0000\u0000\u01d6\u01d7\u0005s\u0000\u0000\u01d7\u01d8\u0001\u0000\u0000"+ - "\u0000\u01d8\u01d9\u0006\f\u0000\u0000\u01d9\u001b\u0001\u0000\u0000\u0000"+ - "\u01da\u01db\u0005p\u0000\u0000\u01db\u01dc\u0005u\u0000\u0000\u01dc\u01dd"+ - "\u0005r\u0000\u0000\u01dd\u01de\u0005e\u0000\u0000\u01de\u01df\u0001\u0000"+ - "\u0000\u0000\u01df\u01e0\u0006\r\u0000\u0000\u01e0\u001d\u0001\u0000\u0000"+ - "\u0000\u01e1\u01e2\u0005i\u0000\u0000\u01e2\u01e3\u0005m\u0000\u0000\u01e3"+ - "\u01e4\u0005p\u0000\u0000\u01e4\u01e5\u0005l\u0000\u0000\u01e5\u01e6\u0005"+ - "e\u0000\u0000\u01e6\u01e7\u0005m\u0000\u0000\u01e7\u01e8\u0005e\u0000"+ - "\u0000\u01e8\u01e9\u0005n\u0000\u0000\u01e9\u01ea\u0005t\u0000\u0000\u01ea"+ - "\u01eb\u0005s\u0000\u0000\u01eb\u001f\u0001\u0000\u0000\u0000\u01ec\u01ed"+ - "\u0005a\u0000\u0000\u01ed\u01ee\u0005s\u0000\u0000\u01ee!\u0001\u0000"+ - "\u0000\u0000\u01ef\u01f0\u0005o\u0000\u0000\u01f0\u01f1\u0005l\u0000\u0000"+ - "\u01f1\u01f2\u0005d\u0000\u0000\u01f2\u01f3\u0001\u0000\u0000\u0000\u01f3"+ - "\u01f4\u0006\u0010\u0000\u0000\u01f4#\u0001\u0000\u0000\u0000\u01f5\u01f6"+ - "\u0005b\u0000\u0000\u01f6\u01f7\u0005e\u0000\u0000\u01f7\u01f8\u0005f"+ - "\u0000\u0000\u01f8\u01f9\u0005o\u0000\u0000\u01f9\u01fa\u0005r\u0000\u0000"+ - "\u01fa\u01fb\u0005e\u0000\u0000\u01fb\u01fc\u0001\u0000\u0000\u0000\u01fc"+ + "\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c"+ + "\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 "+ + "\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001"+ + "$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001&\u0001&\u0001&\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00011\u0001"+ + "1\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u0001"+ + "2\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u00014\u00014\u0001"+ + "4\u00014\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u00015\u0001"+ + "5\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u0001"+ + "6\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00018\u0001"+ + "8\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u00019\u0001"+ + "9\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001:\u0001"+ + ";\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001"+ + ";\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ + "<\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ + "F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001"+ + "G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+ + "G\u0001H\u0001H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001"+ + "I\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001"+ + "L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001M\u0001"+ + "M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001"+ + "N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001"+ + "O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+ + "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001"+ + "W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001"+ + "[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001"+ + "^\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+ + "_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001"+ + "`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ + "c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001"+ + "e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001f\u0001"+ + "f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001"+ + "h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0005i\u0459\bi\ni\fi\u045c"+ + "\ti\u0001i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001l\u0001"+ + "l\u0001m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001o\u0001"+ + "o\u0001p\u0001p\u0001q\u0001q\u0001r\u0001r\u0001s\u0001s\u0001t\u0001"+ + "t\u0001u\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001"+ + "v\u0001w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001"+ + "y\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001"+ + "}\u0001}\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u0080\u0001"+ + "\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001"+ + "\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001"+ + "\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001"+ + "\u0087\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u008a\u0001"+ + "\u008a\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008d\u0001"+ + "\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e\u04c4"+ + "\b\u008e\u0001\u008e\u0005\u008e\u04c7\b\u008e\n\u008e\f\u008e\u04ca\t"+ + "\u008e\u0003\u008e\u04cc\b\u008e\u0001\u008e\u0001\u008e\u0001\u008f\u0001"+ + "\u008f\u0001\u008f\u0003\u008f\u04d3\b\u008f\u0001\u008f\u0004\u008f\u04d6"+ + "\b\u008f\u000b\u008f\f\u008f\u04d7\u0001\u008f\u0001\u008f\u0001\u0090"+ + "\u0001\u0090\u0003\u0090\u04de\b\u0090\u0001\u0090\u0003\u0090\u04e1\b"+ + "\u0090\u0001\u0090\u0004\u0090\u04e4\b\u0090\u000b\u0090\f\u0090\u04e5"+ + "\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091"+ + "\u04ed\b\u0091\u0001\u0091\u0004\u0091\u04f0\b\u0091\u000b\u0091\f\u0091"+ + "\u04f1\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001"+ + "\u0092\u0001\u0092\u0001\u0093\u0003\u0093\u04fc\b\u0093\u0001\u0093\u0004"+ + "\u0093\u04ff\b\u0093\u000b\u0093\f\u0093\u0500\u0001\u0093\u0001\u0093"+ + "\u0003\u0093\u0505\b\u0093\u0001\u0093\u0005\u0093\u0508\b\u0093\n\u0093"+ + "\f\u0093\u050b\t\u0093\u0003\u0093\u050d\b\u0093\u0001\u0093\u0001\u0093"+ + "\u0001\u0093\u0003\u0093\u0512\b\u0093\u0001\u0093\u0005\u0093\u0515\b"+ + "\u0093\n\u0093\f\u0093\u0518\t\u0093\u0003\u0093\u051a\b\u0093\u0001\u0094"+ + "\u0001\u0094\u0003\u0094\u051e\b\u0094\u0001\u0094\u0001\u0094\u0001\u0095"+ + "\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0003\u0095\u0527\b\u0095"+ + "\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096"+ + "\u0001\u0096\u0003\u0096\u0530\b\u0096\u0001\u0096\u0001\u0096\u0001\u0097"+ + "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0003\u0098"+ + "\u053a\b\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ + "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b"+ + "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b"+ + "\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c"+ + "\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d"+ + "\u0001\u009d\u0005\u009d\u055a\b\u009d\n\u009d\f\u009d\u055d\t\u009d\u0001"+ + "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001"+ + "\u009e\u0005\u009e\u0566\b\u009e\n\u009e\f\u009e\u0569\t\u009e\u0001\u009e"+ + "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0004\u009f\u0570\b\u009f"+ + "\u000b\u009f\f\u009f\u0571\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0"+ + "\u0001\u00a0\u0001\u00a0\u0005\u00a0\u057a\b\u00a0\n\u00a0\f\u00a0\u057d"+ + "\t\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001"+ + "\u00a1\u0004\u00a1\u0585\b\u00a1\u000b\u00a1\f\u00a1\u0586\u0001\u00a1"+ + "\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0005\u00a2"+ + "\u058f\b\u00a2\n\u00a2\f\u00a2\u0592\t\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0003\u00a3\u059a\b\u00a3\u0001"+ + "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ + "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ + "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ + "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001"+ + "\u00a4\u0001\u00a4\u0003\u00a4\u05b6\b\u00a4\u0001\u00a5\u0001\u00a5\u0003"+ + "\u00a5\u05ba\b\u00a5\u0001\u00a5\u0005\u00a5\u05bd\b\u00a5\n\u00a5\f\u00a5"+ + "\u05c0\t\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a8"+ + "\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0003\u00a9\u05ca\b\u00a9\u0001\u00a9"+ + "\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0003\u00aa\u05d0\b\u00aa\u0001\u00ab"+ + "\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0004\u00ad\u05d7\b\u00ad"+ + "\u000b\u00ad\f\u00ad\u05d8\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae"+ + "\u0001\u00ae\u0001\u00ae\u0005\u00ae\u05e1\b\u00ae\n\u00ae\f\u00ae\u05e4"+ + "\t\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001"+ + "\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0005\u00af\u05ef\b\u00af\n"+ + "\u00af\f\u00af\u05f2\t\u00af\u0001\u00af\u0001\u00af\u0001\u00b0\u0004"+ + "\u00b0\u05f7\b\u00b0\u000b\u00b0\f\u00b0\u05f8\u0001\u00b0\u0001\u00b0"+ + "\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0005\u00b0\u0600\b\u00b0\n\u00b0"+ + "\f\u00b0\u0603\t\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0003\u00b0"+ + "\u0608\b\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1"+ + "\u0001\u00b1\u0001\u00b1\u0003\u057b\u05e2\u0601\u0000\u00b2\u0002\u0001"+ + "\u0004\u0002\u0006\u0003\b\u0004\n\u0005\f\u0006\u000e\u0007\u0010\b\u0012"+ + "\t\u0014\n\u0016\u000b\u0018\f\u001a\r\u001c\u000e\u001e\u000f \u0010"+ + "\"\u0011$\u0012&\u0013(\u0014*\u0015,\u0016.\u00170\u00182\u00194\u001a"+ + "6\u001b8\u001c:\u001d<\u001e>\u001f@ B!D\"F#H$J%L&N\'P(R)T*V+X,Z-\\.^"+ + "/`0b1d2f3h4j5l6n7p8r9t:v;x~?\u0080@\u0082A\u0084B\u0086C\u0088D\u008a"+ + "E\u008cF\u008eG\u0090H\u0092I\u0094J\u0096K\u0098L\u009aM\u009cN\u009e"+ + "O\u00a0P\u00a2Q\u00a4R\u00a6S\u00a8T\u00aaU\u00acV\u00aeW\u00b0X\u00b2"+ + "Y\u00b4Z\u00b6[\u00b8\\\u00ba]\u00bc^\u00be_\u00c0`\u00c2a\u00c4b\u00c6"+ + "c\u00c8d\u00cae\u00ccf\u00ceg\u00d0h\u00d2i\u00d4j\u00d6k\u00d8l\u00da"+ + "m\u00dcn\u00deo\u00e0p\u00e2q\u00e4r\u00e6s\u00e8t\u00eau\u00ecv\u00ee"+ + "w\u00f0x\u00f2y\u00f4z\u00f6{\u00f8|\u00fa}\u00fc~\u00fe\u007f\u0100\u0080"+ + "\u0102\u0081\u0104\u0082\u0106\u0083\u0108\u0084\u010a\u0085\u010c\u0086"+ + "\u010e\u0087\u0110\u0088\u0112\u0089\u0114\u008a\u0116\u008b\u0118\u008c"+ + "\u011a\u008d\u011c\u008e\u011e\u008f\u0120\u0090\u0122\u0091\u0124\u0092"+ + "\u0126\u0093\u0128\u0000\u012a\u0000\u012c\u0094\u012e\u0000\u0130\u0095"+ + "\u0132\u0096\u0134\u0097\u0136\u0098\u0138\u0099\u013a\u009a\u013c\u009b"+ + "\u013e\u009c\u0140\u009d\u0142\u009e\u0144\u009f\u0146\u00a0\u0148\u0000"+ + "\u014a\u0000\u014c\u0000\u014e\u0000\u0150\u0000\u0152\u0000\u0154\u0000"+ + "\u0156\u0000\u0158\u0000\u015a\u0000\u015c\u00a1\u015e\u00a2\u0160\u00a3"+ + "\u0162\u00a4\u0164\u00a5\u0002\u0000\u0001\u0013\u0001\u000019\u0001\u0000"+ + "09\u0002\u0000BBbb\u0002\u0000OOoo\u0002\u0000XXxx\u0002\u0000PPpp\u0002"+ + "\u0000++--\u0001\u0000``\u0002\u0000\"\"\\\\\u0002\u0000\t\t \u0002\u0000"+ + "\n\n\r\r\u0003\u0000\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\abffnnrrttvv\u0001"+ + "\u000007\u0003\u000009AFaf\u0001\u000001\u0002\u0000EEee@\u000009\u0660"+ + "\u0669\u06f0\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef\u0a66\u0a6f\u0ae6"+ + "\u0aef\u0b66\u0b6f\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef\u0d66\u0d6f\u0de6"+ + "\u0def\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049\u1090\u1099\u17e0"+ + "\u17e9\u1810\u1819\u1946\u194f\u19d0\u19d9\u1a80\u1a89\u1a90\u1a99\u1b50"+ + "\u1b59\u1bb0\u1bb9\u1c40\u1c49\u1c50\u1c59\u8000\ua620\u8000\ua629\u8000"+ + "\ua8d0\u8000\ua8d9\u8000\ua900\u8000\ua909\u8000\ua9d0\u8000\ua9d9\u8000"+ + "\ua9f0\u8000\ua9f9\u8000\uaa50\u8000\uaa59\u8000\uabf0\u8000\uabf9\u8000"+ + "\uff10\u8000\uff19\u8001\u04a0\u8001\u04a9\u8001\u0d30\u8001\u0d39\u8001"+ + "\u1066\u8001\u106f\u8001\u10f0\u8001\u10f9\u8001\u1136\u8001\u113f\u8001"+ + "\u11d0\u8001\u11d9\u8001\u12f0\u8001\u12f9\u8001\u1450\u8001\u1459\u8001"+ + "\u14d0\u8001\u14d9\u8001\u1650\u8001\u1659\u8001\u16c0\u8001\u16c9\u8001"+ + "\u1730\u8001\u1739\u8001\u18e0\u8001\u18e9\u8001\u1950\u8001\u1959\u8001"+ + "\u1c50\u8001\u1c59\u8001\u1d50\u8001\u1d59\u8001\u1da0\u8001\u1da9\u8001"+ + "\u1f50\u8001\u1f59\u8001\u6a60\u8001\u6a69\u8001\u6ac0\u8001\u6ac9\u8001"+ + "\u6b50\u8001\u6b59\u8001\ud7ce\u8001\ud7ff\u8001\ue140\u8001\ue149\u8001"+ + "\ue2f0\u8001\ue2f9\u8001\ue4f0\u8001\ue4f9\u8001\ue950\u8001\ue959\u8001"+ + "\ufbf0\u8001\ufbf9\u0293\u0000AZaz\u00aa\u00aa\u00b5\u00b5\u00ba\u00ba"+ + "\u00c0\u00d6\u00d8\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0\u02e4\u02ec\u02ec"+ + "\u02ee\u02ee\u0370\u0374\u0376\u0377\u037a\u037d\u037f\u037f\u0386\u0386"+ + "\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03f5\u03f7\u0481\u048a\u052f"+ + "\u0531\u0556\u0559\u0559\u0560\u0588\u05d0\u05ea\u05ef\u05f2\u0620\u064a"+ + "\u066e\u066f\u0671\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa\u06fc"+ + "\u06ff\u06ff\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1\u07b1\u07ca\u07ea"+ + "\u07f4\u07f5\u07fa\u07fa\u0800\u0815\u081a\u081a\u0824\u0824\u0828\u0828"+ + "\u0840\u0858\u0860\u086a\u0870\u0887\u0889\u088e\u08a0\u08c9\u0904\u0939"+ + "\u093d\u093d\u0950\u0950\u0958\u0961\u0971\u0980\u0985\u098c\u098f\u0990"+ + "\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd\u09bd\u09ce\u09ce"+ + "\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05\u0a0a\u0a0f\u0a10"+ + "\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c"+ + "\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0"+ + "\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0\u0ae1\u0af9\u0af9"+ + "\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b35\u0b39"+ + "\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83\u0b83\u0b85\u0b8a"+ + "\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4"+ + "\u0ba8\u0baa\u0bae\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28"+ + "\u0c2a\u0c39\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60\u0c61\u0c80\u0c80"+ + "\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbd\u0cbd"+ + "\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e\u0d10\u0d12\u0d3a"+ + "\u0d3d\u0d3d\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a\u0d7f\u0d85\u0d96"+ + "\u0d9a\u0db1\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01\u0e30\u0e32\u0e33"+ + "\u0e40\u0e46\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c\u0ea3\u0ea5\u0ea5"+ + "\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0edc\u0edf"+ + "\u0f00\u0f00\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000\u102a\u103f\u103f"+ + "\u1050\u1055\u105a\u105d\u1061\u1061\u1065\u1066\u106e\u1070\u1075\u1081"+ + "\u108e\u108e\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0\u10fa\u10fc\u1248"+ + "\u124a\u124d\u1250\u1256\u1258\u1258\u125a\u125d\u1260\u1288\u128a\u128d"+ + "\u1290\u12b0\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2\u12c5\u12c8\u12d6"+ + "\u12d8\u1310\u1312\u1315\u1318\u135a\u1380\u138f\u13a0\u13f5\u13f8\u13fd"+ + "\u1401\u166c\u166f\u167f\u1681\u169a\u16a0\u16ea\u16f1\u16f8\u1700\u1711"+ + "\u171f\u1731\u1740\u1751\u1760\u176c\u176e\u1770\u1780\u17b3\u17d7\u17d7"+ + "\u17dc\u17dc\u1820\u1878\u1880\u1884\u1887\u18a8\u18aa\u18aa\u18b0\u18f5"+ + "\u1900\u191e\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0\u19c9\u1a00\u1a16"+ + "\u1a20\u1a54\u1aa7\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83\u1ba0\u1bae\u1baf"+ + "\u1bba\u1be5\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80\u1c88\u1c90\u1cba"+ + "\u1cbd\u1cbf\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa\u1d00\u1dbf"+ + "\u1e00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59"+ + "\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe"+ + "\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4"+ + "\u1ff6\u1ffc\u2071\u2071\u207f\u207f\u2090\u209c\u2102\u2102\u2107\u2107"+ + "\u210a\u2113\u2115\u2115\u2119\u211d\u2124\u2124\u2126\u2126\u2128\u2128"+ + "\u212a\u212d\u212f\u2139\u213c\u213f\u2145\u2149\u214e\u214e\u2183\u2184"+ + "\u2c00\u2ce4\u2ceb\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27\u2d27\u2d2d\u2d2d"+ + "\u2d30\u2d67\u2d6f\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8\u2dae\u2db0\u2db6"+ + "\u2db8\u2dbe\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8\u2dde\u2e2f\u2e2f"+ + "\u3005\u3006\u3031\u3035\u303b\u303c\u3041\u3096\u309d\u309f\u30a1\u30fa"+ + "\u30fc\u30ff\u3105\u312f\u3131\u318e\u31a0\u31bf\u31f0\u31ff\u3400\u4dbf"+ + "\u4e00\u8000\ua48c\u8000\ua4d0\u8000\ua4fd\u8000\ua500\u8000\ua60c\u8000"+ + "\ua610\u8000\ua61f\u8000\ua62a\u8000\ua62b\u8000\ua640\u8000\ua66e\u8000"+ + "\ua67f\u8000\ua69d\u8000\ua6a0\u8000\ua6e5\u8000\ua717\u8000\ua71f\u8000"+ + "\ua722\u8000\ua788\u8000\ua78b\u8000\ua7ca\u8000\ua7d0\u8000\ua7d1\u8000"+ + "\ua7d3\u8000\ua7d3\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2\u8000\ua801\u8000"+ + "\ua803\u8000\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c\u8000\ua822\u8000"+ + "\ua840\u8000\ua873\u8000\ua882\u8000\ua8b3\u8000\ua8f2\u8000\ua8f7\u8000"+ + "\ua8fb\u8000\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000\ua90a\u8000\ua925\u8000"+ + "\ua930\u8000\ua946\u8000\ua960\u8000\ua97c\u8000\ua984\u8000\ua9b2\u8000"+ + "\ua9cf\u8000\ua9cf\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6\u8000\ua9ef\u8000"+ + "\ua9fa\u8000\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40\u8000\uaa42\u8000"+ + "\uaa44\u8000\uaa4b\u8000\uaa60\u8000\uaa76\u8000\uaa7a\u8000\uaa7a\u8000"+ + "\uaa7e\u8000\uaaaf\u8000\uaab1\u8000\uaab1\u8000\uaab5\u8000\uaab6\u8000"+ + "\uaab9\u8000\uaabd\u8000\uaac0\u8000\uaac0\u8000\uaac2\u8000\uaac2\u8000"+ + "\uaadb\u8000\uaadd\u8000\uaae0\u8000\uaaea\u8000\uaaf2\u8000\uaaf4\u8000"+ + "\uab01\u8000\uab06\u8000\uab09\u8000\uab0e\u8000\uab11\u8000\uab16\u8000"+ + "\uab20\u8000\uab26\u8000\uab28\u8000\uab2e\u8000\uab30\u8000\uab5a\u8000"+ + "\uab5c\u8000\uab69\u8000\uab70\u8000\uabe2\u8000\uac00\u8000\ud7a3\u8000"+ + "\ud7b0\u8000\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000\uf900\u8000\ufa6d\u8000"+ + "\ufa70\u8000\ufad9\u8000\ufb00\u8000\ufb06\u8000\ufb13\u8000\ufb17\u8000"+ + "\ufb1d\u8000\ufb1d\u8000\ufb1f\u8000\ufb28\u8000\ufb2a\u8000\ufb36\u8000"+ + "\ufb38\u8000\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000\ufb40\u8000\ufb41\u8000"+ + "\ufb43\u8000\ufb44\u8000\ufb46\u8000\ufbb1\u8000\ufbd3\u8000\ufd3d\u8000"+ + "\ufd50\u8000\ufd8f\u8000\ufd92\u8000\ufdc7\u8000\ufdf0\u8000\ufdfb\u8000"+ + "\ufe70\u8000\ufe74\u8000\ufe76\u8000\ufefc\u8000\uff21\u8000\uff3a\u8000"+ + "\uff41\u8000\uff5a\u8000\uff66\u8000\uffbe\u8000\uffc2\u8000\uffc7\u8000"+ + "\uffca\u8000\uffcf\u8000\uffd2\u8000\uffd7\u8000\uffda\u8000\uffdc\u8001"+ + "\u0000\u8001\u000b\u8001\r\u8001&\u8001(\u8001:\u8001<\u8001=\u8001?\u8001"+ + "M\u8001P\u8001]\u8001\u0080\u8001\u00fa\u8001\u0280\u8001\u029c\u8001"+ + "\u02a0\u8001\u02d0\u8001\u0300\u8001\u031f\u8001\u032d\u8001\u0340\u8001"+ + "\u0342\u8001\u0349\u8001\u0350\u8001\u0375\u8001\u0380\u8001\u039d\u8001"+ + "\u03a0\u8001\u03c3\u8001\u03c8\u8001\u03cf\u8001\u0400\u8001\u049d\u8001"+ + "\u04b0\u8001\u04d3\u8001\u04d8\u8001\u04fb\u8001\u0500\u8001\u0527\u8001"+ + "\u0530\u8001\u0563\u8001\u0570\u8001\u057a\u8001\u057c\u8001\u058a\u8001"+ + "\u058c\u8001\u0592\u8001\u0594\u8001\u0595\u8001\u0597\u8001\u05a1\u8001"+ + "\u05a3\u8001\u05b1\u8001\u05b3\u8001\u05b9\u8001\u05bb\u8001\u05bc\u8001"+ + "\u0600\u8001\u0736\u8001\u0740\u8001\u0755\u8001\u0760\u8001\u0767\u8001"+ + "\u0780\u8001\u0785\u8001\u0787\u8001\u07b0\u8001\u07b2\u8001\u07ba\u8001"+ + "\u0800\u8001\u0805\u8001\u0808\u8001\u0808\u8001\u080a\u8001\u0835\u8001"+ + "\u0837\u8001\u0838\u8001\u083c\u8001\u083c\u8001\u083f\u8001\u0855\u8001"+ + "\u0860\u8001\u0876\u8001\u0880\u8001\u089e\u8001\u08e0\u8001\u08f2\u8001"+ + "\u08f4\u8001\u08f5\u8001\u0900\u8001\u0915\u8001\u0920\u8001\u0939\u8001"+ + "\u0980\u8001\u09b7\u8001\u09be\u8001\u09bf\u8001\u0a00\u8001\u0a00\u8001"+ + "\u0a10\u8001\u0a13\u8001\u0a15\u8001\u0a17\u8001\u0a19\u8001\u0a35\u8001"+ + "\u0a60\u8001\u0a7c\u8001\u0a80\u8001\u0a9c\u8001\u0ac0\u8001\u0ac7\u8001"+ + "\u0ac9\u8001\u0ae4\u8001\u0b00\u8001\u0b35\u8001\u0b40\u8001\u0b55\u8001"+ + "\u0b60\u8001\u0b72\u8001\u0b80\u8001\u0b91\u8001\u0c00\u8001\u0c48\u8001"+ + "\u0c80\u8001\u0cb2\u8001\u0cc0\u8001\u0cf2\u8001\u0d00\u8001\u0d23\u8001"+ + "\u0e80\u8001\u0ea9\u8001\u0eb0\u8001\u0eb1\u8001\u0f00\u8001\u0f1c\u8001"+ + "\u0f27\u8001\u0f27\u8001\u0f30\u8001\u0f45\u8001\u0f70\u8001\u0f81\u8001"+ + "\u0fb0\u8001\u0fc4\u8001\u0fe0\u8001\u0ff6\u8001\u1003\u8001\u1037\u8001"+ + "\u1071\u8001\u1072\u8001\u1075\u8001\u1075\u8001\u1083\u8001\u10af\u8001"+ + "\u10d0\u8001\u10e8\u8001\u1103\u8001\u1126\u8001\u1144\u8001\u1144\u8001"+ + "\u1147\u8001\u1147\u8001\u1150\u8001\u1172\u8001\u1176\u8001\u1176\u8001"+ + "\u1183\u8001\u11b2\u8001\u11c1\u8001\u11c4\u8001\u11da\u8001\u11da\u8001"+ + "\u11dc\u8001\u11dc\u8001\u1200\u8001\u1211\u8001\u1213\u8001\u122b\u8001"+ + "\u123f\u8001\u1240\u8001\u1280\u8001\u1286\u8001\u1288\u8001\u1288\u8001"+ + "\u128a\u8001\u128d\u8001\u128f\u8001\u129d\u8001\u129f\u8001\u12a8\u8001"+ + "\u12b0\u8001\u12de\u8001\u1305\u8001\u130c\u8001\u130f\u8001\u1310\u8001"+ + "\u1313\u8001\u1328\u8001\u132a\u8001\u1330\u8001\u1332\u8001\u1333\u8001"+ + "\u1335\u8001\u1339\u8001\u133d\u8001\u133d\u8001\u1350\u8001\u1350\u8001"+ + "\u135d\u8001\u1361\u8001\u1400\u8001\u1434\u8001\u1447\u8001\u144a\u8001"+ + "\u145f\u8001\u1461\u8001\u1480\u8001\u14af\u8001\u14c4\u8001\u14c5\u8001"+ + "\u14c7\u8001\u14c7\u8001\u1580\u8001\u15ae\u8001\u15d8\u8001\u15db\u8001"+ + "\u1600\u8001\u162f\u8001\u1644\u8001\u1644\u8001\u1680\u8001\u16aa\u8001"+ + "\u16b8\u8001\u16b8\u8001\u1700\u8001\u171a\u8001\u1740\u8001\u1746\u8001"+ + "\u1800\u8001\u182b\u8001\u18a0\u8001\u18df\u8001\u18ff\u8001\u1906\u8001"+ + "\u1909\u8001\u1909\u8001\u190c\u8001\u1913\u8001\u1915\u8001\u1916\u8001"+ + "\u1918\u8001\u192f\u8001\u193f\u8001\u193f\u8001\u1941\u8001\u1941\u8001"+ + "\u19a0\u8001\u19a7\u8001\u19aa\u8001\u19d0\u8001\u19e1\u8001\u19e1\u8001"+ + "\u19e3\u8001\u19e3\u8001\u1a00\u8001\u1a00\u8001\u1a0b\u8001\u1a32\u8001"+ + "\u1a3a\u8001\u1a3a\u8001\u1a50\u8001\u1a50\u8001\u1a5c\u8001\u1a89\u8001"+ + "\u1a9d\u8001\u1a9d\u8001\u1ab0\u8001\u1af8\u8001\u1c00\u8001\u1c08\u8001"+ + "\u1c0a\u8001\u1c2e\u8001\u1c40\u8001\u1c40\u8001\u1c72\u8001\u1c8f\u8001"+ + "\u1d00\u8001\u1d06\u8001\u1d08\u8001\u1d09\u8001\u1d0b\u8001\u1d30\u8001"+ + "\u1d46\u8001\u1d46\u8001\u1d60\u8001\u1d65\u8001\u1d67\u8001\u1d68\u8001"+ + "\u1d6a\u8001\u1d89\u8001\u1d98\u8001\u1d98\u8001\u1ee0\u8001\u1ef2\u8001"+ + "\u1f02\u8001\u1f02\u8001\u1f04\u8001\u1f10\u8001\u1f12\u8001\u1f33\u8001"+ + "\u1fb0\u8001\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480\u8001\u2543\u8001"+ + "\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342f\u8001\u3441\u8001\u3446\u8001"+ + "\u4400\u8001\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40\u8001\u6a5e\u8001"+ + "\u6a70\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00\u8001\u6b2f\u8001"+ + "\u6b40\u8001\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d\u8001\u6b8f\u8001"+ + "\u6e40\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50\u8001\u6f50\u8001"+ + "\u6f93\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3\u8001\u6fe3\u8001"+ + "\u7000\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00\u8001\u8d08\u8001"+ + "\uaff0\u8001\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd\u8001\uaffe\u8001"+ + "\ub000\u8001\ub122\u8001\ub132\u8001\ub132\u8001\ub150\u8001\ub152\u8001"+ + "\ub155\u8001\ub155\u8001\ub164\u8001\ub167\u8001\ub170\u8001\ub2fb\u8001"+ + "\ubc00\u8001\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80\u8001\ubc88\u8001"+ + "\ubc90\u8001\ubc99\u8001\ud400\u8001\ud454\u8001\ud456\u8001\ud49c\u8001"+ + "\ud49e\u8001\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5\u8001\ud4a6\u8001"+ + "\ud4a9\u8001\ud4ac\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb\u8001\ud4bb\u8001"+ + "\ud4bd\u8001\ud4c3\u8001\ud4c5\u8001\ud505\u8001\ud507\u8001\ud50a\u8001"+ + "\ud50d\u8001\ud514\u8001\ud516\u8001\ud51c\u8001\ud51e\u8001\ud539\u8001"+ + "\ud53b\u8001\ud53e\u8001\ud540\u8001\ud544\u8001\ud546\u8001\ud546\u8001"+ + "\ud54a\u8001\ud550\u8001\ud552\u8001\ud6a5\u8001\ud6a8\u8001\ud6c0\u8001"+ + "\ud6c2\u8001\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc\u8001\ud714\u8001"+ + "\ud716\u8001\ud734\u8001\ud736\u8001\ud74e\u8001\ud750\u8001\ud76e\u8001"+ + "\ud770\u8001\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa\u8001\ud7c2\u8001"+ + "\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\udf25\u8001\udf2a\u8001"+ + "\ue030\u8001\ue06d\u8001\ue100\u8001\ue12c\u8001\ue137\u8001\ue13d\u8001"+ + "\ue14e\u8001\ue14e\u8001\ue290\u8001\ue2ad\u8001\ue2c0\u8001\ue2eb\u8001"+ + "\ue4d0\u8001\ue4eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8\u8001\ue7eb\u8001"+ + "\ue7ed\u8001\ue7ee\u8001\ue7f0\u8001\ue7fe\u8001\ue800\u8001\ue8c4\u8001"+ + "\ue900\u8001\ue943\u8001\ue94b\u8001\ue94b\u8001\uee00\u8001\uee03\u8001"+ + "\uee05\u8001\uee1f\u8001\uee21\u8001\uee22\u8001\uee24\u8001\uee24\u8001"+ + "\uee27\u8001\uee27\u8001\uee29\u8001\uee32\u8001\uee34\u8001\uee37\u8001"+ + "\uee39\u8001\uee39\u8001\uee3b\u8001\uee3b\u8001\uee42\u8001\uee42\u8001"+ + "\uee47\u8001\uee47\u8001\uee49\u8001\uee49\u8001\uee4b\u8001\uee4b\u8001"+ + "\uee4d\u8001\uee4f\u8001\uee51\u8001\uee52\u8001\uee54\u8001\uee54\u8001"+ + "\uee57\u8001\uee57\u8001\uee59\u8001\uee59\u8001\uee5b\u8001\uee5b\u8001"+ + "\uee5d\u8001\uee5d\u8001\uee5f\u8001\uee5f\u8001\uee61\u8001\uee62\u8001"+ + "\uee64\u8001\uee64\u8001\uee67\u8001\uee6a\u8001\uee6c\u8001\uee72\u8001"+ + "\uee74\u8001\uee77\u8001\uee79\u8001\uee7c\u8001\uee7e\u8001\uee7e\u8001"+ + "\uee80\u8001\uee89\u8001\uee8b\u8001\uee9b\u8001\ueea1\u8001\ueea3\u8001"+ + "\ueea5\u8001\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000\u8002\ua6df\u8002"+ + "\ua700\u8002\ub739\u8002\ub740\u8002\ub81d\u8002\ub820\u8002\ucea1\u8002"+ + "\uceb0\u8002\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000\u8003\u134a\u8003"+ + "\u1350\u8003\u23af\u063c\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0004"+ + "\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001"+ + "\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000"+ + "\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000"+ + "\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000"+ + "\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000"+ + "\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000"+ + "\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000"+ + "\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000"+ + "\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*"+ + "\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000"+ + "\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000"+ + "\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008"+ + "\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000"+ + "\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000"+ + "\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F"+ + "\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000"+ + "\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000"+ + "\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T"+ + "\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000"+ + "\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001\u0000\u0000"+ + "\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000\u0000\u0000"+ + "b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001"+ + "\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000j\u0001\u0000\u0000"+ + "\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001\u0000\u0000\u0000\u0000"+ + "p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000t\u0001"+ + "\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001\u0000\u0000"+ + "\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000\u0000\u0000"+ + "~\u0001\u0000\u0000\u0000\u0000\u0080\u0001\u0000\u0000\u0000\u0000\u0082"+ + "\u0001\u0000\u0000\u0000\u0000\u0084\u0001\u0000\u0000\u0000\u0000\u0086"+ + "\u0001\u0000\u0000\u0000\u0000\u0088\u0001\u0000\u0000\u0000\u0000\u008a"+ + "\u0001\u0000\u0000\u0000\u0000\u008c\u0001\u0000\u0000\u0000\u0000\u008e"+ + "\u0001\u0000\u0000\u0000\u0000\u0090\u0001\u0000\u0000\u0000\u0000\u0092"+ + "\u0001\u0000\u0000\u0000\u0000\u0094\u0001\u0000\u0000\u0000\u0000\u0096"+ + "\u0001\u0000\u0000\u0000\u0000\u0098\u0001\u0000\u0000\u0000\u0000\u009a"+ + "\u0001\u0000\u0000\u0000\u0000\u009c\u0001\u0000\u0000\u0000\u0000\u009e"+ + "\u0001\u0000\u0000\u0000\u0000\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2"+ + "\u0001\u0000\u0000\u0000\u0000\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6"+ + "\u0001\u0000\u0000\u0000\u0000\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa"+ + "\u0001\u0000\u0000\u0000\u0000\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae"+ + "\u0001\u0000\u0000\u0000\u0000\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2"+ + "\u0001\u0000\u0000\u0000\u0000\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6"+ + "\u0001\u0000\u0000\u0000\u0000\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba"+ + "\u0001\u0000\u0000\u0000\u0000\u00bc\u0001\u0000\u0000\u0000\u0000\u00be"+ + "\u0001\u0000\u0000\u0000\u0000\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2"+ + "\u0001\u0000\u0000\u0000\u0000\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6"+ + "\u0001\u0000\u0000\u0000\u0000\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca"+ + "\u0001\u0000\u0000\u0000\u0000\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce"+ + "\u0001\u0000\u0000\u0000\u0000\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2"+ + "\u0001\u0000\u0000\u0000\u0000\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6"+ + "\u0001\u0000\u0000\u0000\u0000\u00d8\u0001\u0000\u0000\u0000\u0000\u00da"+ + "\u0001\u0000\u0000\u0000\u0000\u00dc\u0001\u0000\u0000\u0000\u0000\u00de"+ + "\u0001\u0000\u0000\u0000\u0000\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2"+ + "\u0001\u0000\u0000\u0000\u0000\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6"+ + "\u0001\u0000\u0000\u0000\u0000\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea"+ + "\u0001\u0000\u0000\u0000\u0000\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee"+ + "\u0001\u0000\u0000\u0000\u0000\u00f0\u0001\u0000\u0000\u0000\u0000\u00f2"+ + "\u0001\u0000\u0000\u0000\u0000\u00f4\u0001\u0000\u0000\u0000\u0000\u00f6"+ + "\u0001\u0000\u0000\u0000\u0000\u00f8\u0001\u0000\u0000\u0000\u0000\u00fa"+ + "\u0001\u0000\u0000\u0000\u0000\u00fc\u0001\u0000\u0000\u0000\u0000\u00fe"+ + "\u0001\u0000\u0000\u0000\u0000\u0100\u0001\u0000\u0000\u0000\u0000\u0102"+ + "\u0001\u0000\u0000\u0000\u0000\u0104\u0001\u0000\u0000\u0000\u0000\u0106"+ + "\u0001\u0000\u0000\u0000\u0000\u0108\u0001\u0000\u0000\u0000\u0000\u010a"+ + "\u0001\u0000\u0000\u0000\u0000\u010c\u0001\u0000\u0000\u0000\u0000\u010e"+ + "\u0001\u0000\u0000\u0000\u0000\u0110\u0001\u0000\u0000\u0000\u0000\u0112"+ + "\u0001\u0000\u0000\u0000\u0000\u0114\u0001\u0000\u0000\u0000\u0000\u0116"+ + "\u0001\u0000\u0000\u0000\u0000\u0118\u0001\u0000\u0000\u0000\u0000\u011a"+ + "\u0001\u0000\u0000\u0000\u0000\u011c\u0001\u0000\u0000\u0000\u0000\u011e"+ + "\u0001\u0000\u0000\u0000\u0000\u0120\u0001\u0000\u0000\u0000\u0000\u0122"+ + "\u0001\u0000\u0000\u0000\u0000\u0124\u0001\u0000\u0000\u0000\u0000\u0126"+ + "\u0001\u0000\u0000\u0000\u0000\u012c\u0001\u0000\u0000\u0000\u0000\u0130"+ + "\u0001\u0000\u0000\u0000\u0000\u0132\u0001\u0000\u0000\u0000\u0000\u0134"+ + "\u0001\u0000\u0000\u0000\u0000\u0136\u0001\u0000\u0000\u0000\u0000\u0138"+ + "\u0001\u0000\u0000\u0000\u0000\u013a\u0001\u0000\u0000\u0000\u0000\u013c"+ + "\u0001\u0000\u0000\u0000\u0000\u013e\u0001\u0000\u0000\u0000\u0000\u0140"+ + "\u0001\u0000\u0000\u0000\u0000\u0142\u0001\u0000\u0000\u0000\u0000\u0144"+ + "\u0001\u0000\u0000\u0000\u0000\u0146\u0001\u0000\u0000\u0000\u0001\u015c"+ + "\u0001\u0000\u0000\u0000\u0001\u015e\u0001\u0000\u0000\u0000\u0001\u0160"+ + "\u0001\u0000\u0000\u0000\u0001\u0162\u0001\u0000\u0000\u0000\u0001\u0164"+ + "\u0001\u0000\u0000\u0000\u0002\u0168\u0001\u0000\u0000\u0000\u0004\u017e"+ + "\u0001\u0000\u0000\u0000\u0006\u0180\u0001\u0000\u0000\u0000\b\u0187\u0001"+ + "\u0000\u0000\u0000\n\u018f\u0001\u0000\u0000\u0000\f\u0196\u0001\u0000"+ + "\u0000\u0000\u000e\u019d\u0001\u0000\u0000\u0000\u0010\u01a4\u0001\u0000"+ + "\u0000\u0000\u0012\u01ab\u0001\u0000\u0000\u0000\u0014\u01b2\u0001\u0000"+ + "\u0000\u0000\u0016\u01bb\u0001\u0000\u0000\u0000\u0018\u01c5\u0001\u0000"+ + "\u0000\u0000\u001a\u01cd\u0001\u0000\u0000\u0000\u001c\u01d7\u0001\u0000"+ + "\u0000\u0000\u001e\u01e3\u0001\u0000\u0000\u0000 \u01ea\u0001\u0000\u0000"+ + "\u0000\"\u01f5\u0001\u0000\u0000\u0000$\u01f8\u0001\u0000\u0000\u0000"+ + "&\u01fe\u0001\u0000\u0000\u0000(\u0207\u0001\u0000\u0000\u0000*\u020c"+ + "\u0001\u0000\u0000\u0000,\u0213\u0001\u0000\u0000\u0000.\u021a\u0001\u0000"+ + "\u0000\u00000\u0220\u0001\u0000\u0000\u00002\u0225\u0001\u0000\u0000\u0000"+ + "4\u022c\u0001\u0000\u0000\u00006\u0236\u0001\u0000\u0000\u00008\u023a"+ + "\u0001\u0000\u0000\u0000:\u0240\u0001\u0000\u0000\u0000<\u0243\u0001\u0000"+ + "\u0000\u0000>\u0245\u0001\u0000\u0000\u0000@\u024c\u0001\u0000\u0000\u0000"+ + "B\u0252\u0001\u0000\u0000\u0000D\u025f\u0001\u0000\u0000\u0000F\u0268"+ + "\u0001\u0000\u0000\u0000H\u026c\u0001\u0000\u0000\u0000J\u0270\u0001\u0000"+ + "\u0000\u0000L\u0276\u0001\u0000\u0000\u0000N\u0278\u0001\u0000\u0000\u0000"+ + "P\u027b\u0001\u0000\u0000\u0000R\u0280\u0001\u0000\u0000\u0000T\u0286"+ + "\u0001\u0000\u0000\u0000V\u028c\u0001\u0000\u0000\u0000X\u0293\u0001\u0000"+ + "\u0000\u0000Z\u029a\u0001\u0000\u0000\u0000\\\u02a3\u0001\u0000\u0000"+ + "\u0000^\u02ae\u0001\u0000\u0000\u0000`\u02b4\u0001\u0000\u0000\u0000b"+ + "\u02ba\u0001\u0000\u0000\u0000d\u02c1\u0001\u0000\u0000\u0000f\u02c7\u0001"+ + "\u0000\u0000\u0000h\u02ce\u0001\u0000\u0000\u0000j\u02d4\u0001\u0000\u0000"+ + "\u0000l\u02dd\u0001\u0000\u0000\u0000n\u02e5\u0001\u0000\u0000\u0000p"+ + "\u02eb\u0001\u0000\u0000\u0000r\u02f3\u0001\u0000\u0000\u0000t\u02fa\u0001"+ + "\u0000\u0000\u0000v\u02ff\u0001\u0000\u0000\u0000x\u0308\u0001\u0000\u0000"+ + "\u0000z\u0317\u0001\u0000\u0000\u0000|\u031d\u0001\u0000\u0000\u0000~"+ + "\u0321\u0001\u0000\u0000\u0000\u0080\u0324\u0001\u0000\u0000\u0000\u0082"+ + "\u032b\u0001\u0000\u0000\u0000\u0084\u0335\u0001\u0000\u0000\u0000\u0086"+ + "\u033f\u0001\u0000\u0000\u0000\u0088\u034b\u0001\u0000\u0000\u0000\u008a"+ + "\u0354\u0001\u0000\u0000\u0000\u008c\u035e\u0001\u0000\u0000\u0000\u008e"+ + "\u0366\u0001\u0000\u0000\u0000\u0090\u0372\u0001\u0000\u0000\u0000\u0092"+ + "\u0381\u0001\u0000\u0000\u0000\u0094\u0387\u0001\u0000\u0000\u0000\u0096"+ + "\u038b\u0001\u0000\u0000\u0000\u0098\u038f\u0001\u0000\u0000\u0000\u009a"+ + "\u0394\u0001\u0000\u0000\u0000\u009c\u039d\u0001\u0000\u0000\u0000\u009e"+ + "\u03a4\u0001\u0000\u0000\u0000\u00a0\u03ad\u0001\u0000\u0000\u0000\u00a2"+ + "\u03b5\u0001\u0000\u0000\u0000\u00a4\u03bd\u0001\u0000\u0000\u0000\u00a6"+ + "\u03c2\u0001\u0000\u0000\u0000\u00a8\u03cc\u0001\u0000\u0000\u0000\u00aa"+ + "\u03d3\u0001\u0000\u0000\u0000\u00ac\u03d8\u0001\u0000\u0000\u0000\u00ae"+ + "\u03de\u0001\u0000\u0000\u0000\u00b0\u03e1\u0001\u0000\u0000\u0000\u00b2"+ + "\u03e5\u0001\u0000\u0000\u0000\u00b4\u03ec\u0001\u0000\u0000\u0000\u00b6"+ + "\u03f1\u0001\u0000\u0000\u0000\u00b8\u03f6\u0001\u0000\u0000\u0000\u00ba"+ + "\u03fb\u0001\u0000\u0000\u0000\u00bc\u0403\u0001\u0000\u0000\u0000\u00be"+ + "\u040a\u0001\u0000\u0000\u0000\u00c0\u0410\u0001\u0000\u0000\u0000\u00c2"+ + "\u041e\u0001\u0000\u0000\u0000\u00c4\u0421\u0001\u0000\u0000\u0000\u00c6"+ + "\u0427\u0001\u0000\u0000\u0000\u00c8\u042c\u0001\u0000\u0000\u0000\u00ca"+ + "\u0437\u0001\u0000\u0000\u0000\u00cc\u043b\u0001\u0000\u0000\u0000\u00ce"+ + "\u0442\u0001\u0000\u0000\u0000\u00d0\u044b\u0001\u0000\u0000\u0000\u00d2"+ + "\u044f\u0001\u0000\u0000\u0000\u00d4\u0455\u0001\u0000\u0000\u0000\u00d6"+ + "\u045f\u0001\u0000\u0000\u0000\u00d8\u0461\u0001\u0000\u0000\u0000\u00da"+ + "\u0465\u0001\u0000\u0000\u0000\u00dc\u0467\u0001\u0000\u0000\u0000\u00de"+ + "\u046b\u0001\u0000\u0000\u0000\u00e0\u046d\u0001\u0000\u0000\u0000\u00e2"+ + "\u0471\u0001\u0000\u0000\u0000\u00e4\u0473\u0001\u0000\u0000\u0000\u00e6"+ + "\u0475\u0001\u0000\u0000\u0000\u00e8\u0477\u0001\u0000\u0000\u0000\u00ea"+ + "\u0479\u0001\u0000\u0000\u0000\u00ec\u047b\u0001\u0000\u0000\u0000\u00ee"+ + "\u0480\u0001\u0000\u0000\u0000\u00f0\u0485\u0001\u0000\u0000\u0000\u00f2"+ + "\u0488\u0001\u0000\u0000\u0000\u00f4\u048c\u0001\u0000\u0000\u0000\u00f6"+ + "\u048f\u0001\u0000\u0000\u0000\u00f8\u0492\u0001\u0000\u0000\u0000\u00fa"+ + "\u0495\u0001\u0000\u0000\u0000\u00fc\u0498\u0001\u0000\u0000\u0000\u00fe"+ + "\u049a\u0001\u0000\u0000\u0000\u0100\u049d\u0001\u0000\u0000\u0000\u0102"+ + "\u049f\u0001\u0000\u0000\u0000\u0104\u04a2\u0001\u0000\u0000\u0000\u0106"+ + "\u04a4\u0001\u0000\u0000\u0000\u0108\u04a6\u0001\u0000\u0000\u0000\u010a"+ + "\u04a8\u0001\u0000\u0000\u0000\u010c\u04ab\u0001\u0000\u0000\u0000\u010e"+ + "\u04ae\u0001\u0000\u0000\u0000\u0110\u04b1\u0001\u0000\u0000\u0000\u0112"+ + "\u04b3\u0001\u0000\u0000\u0000\u0114\u04b5\u0001\u0000\u0000\u0000\u0116"+ + "\u04b7\u0001\u0000\u0000\u0000\u0118\u04b9\u0001\u0000\u0000\u0000\u011a"+ + "\u04bb\u0001\u0000\u0000\u0000\u011c\u04bd\u0001\u0000\u0000\u0000\u011e"+ + "\u04cb\u0001\u0000\u0000\u0000\u0120\u04cf\u0001\u0000\u0000\u0000\u0122"+ + "\u04db\u0001\u0000\u0000\u0000\u0124\u04e9\u0001\u0000\u0000\u0000\u0126"+ + "\u04f5\u0001\u0000\u0000\u0000\u0128\u0519\u0001\u0000\u0000\u0000\u012a"+ + "\u051b\u0001\u0000\u0000\u0000\u012c\u0526\u0001\u0000\u0000\u0000\u012e"+ + "\u052c\u0001\u0000\u0000\u0000\u0130\u0533\u0001\u0000\u0000\u0000\u0132"+ + "\u0539\u0001\u0000\u0000\u0000\u0134\u053b\u0001\u0000\u0000\u0000\u0136"+ + "\u0540\u0001\u0000\u0000\u0000\u0138\u0545\u0001\u0000\u0000\u0000\u013a"+ + "\u054c\u0001\u0000\u0000\u0000\u013c\u0557\u0001\u0000\u0000\u0000\u013e"+ + "\u0562\u0001\u0000\u0000\u0000\u0140\u056f\u0001\u0000\u0000\u0000\u0142"+ + "\u0575\u0001\u0000\u0000\u0000\u0144\u0584\u0001\u0000\u0000\u0000\u0146"+ + "\u058a\u0001\u0000\u0000\u0000\u0148\u0599\u0001\u0000\u0000\u0000\u014a"+ + "\u059b\u0001\u0000\u0000\u0000\u014c\u05b7\u0001\u0000\u0000\u0000\u014e"+ + "\u05c1\u0001\u0000\u0000\u0000\u0150\u05c3\u0001\u0000\u0000\u0000\u0152"+ + "\u05c5\u0001\u0000\u0000\u0000\u0154\u05c7\u0001\u0000\u0000\u0000\u0156"+ + "\u05cf\u0001\u0000\u0000\u0000\u0158\u05d1\u0001\u0000\u0000\u0000\u015a"+ + "\u05d3\u0001\u0000\u0000\u0000\u015c\u05d6\u0001\u0000\u0000\u0000\u015e"+ + "\u05dc\u0001\u0000\u0000\u0000\u0160\u05ea\u0001\u0000\u0000\u0000\u0162"+ + "\u0607\u0001\u0000\u0000\u0000\u0164\u060b\u0001\u0000\u0000\u0000\u0166"+ + "\u0169\u0003\u0004\u0001\u0000\u0167\u0169\u0003\u0126\u0092\u0000\u0168"+ + "\u0166\u0001\u0000\u0000\u0000\u0168\u0167\u0001\u0000\u0000\u0000\u0169"+ + "\u016a\u0001\u0000\u0000\u0000\u016a\u016b\u0006\u0000\u0000\u0000\u016b"+ + "\u0003\u0001\u0000\u0000\u0000\u016c\u0176\u0003\u014c\u00a5\u0000\u016d"+ + "\u016e\u0005.\u0000\u0000\u016e\u0170\u0004\u0001\u0000\u0000\u016f\u0171"+ + "\u0003\u014c\u00a5\u0000\u0170\u016f\u0001\u0000\u0000\u0000\u0170\u0171"+ + "\u0001\u0000\u0000\u0000\u0171\u0173\u0001\u0000\u0000\u0000\u0172\u0174"+ + "\u0003\u0154\u00a9\u0000\u0173\u0172\u0001\u0000\u0000\u0000\u0173\u0174"+ + "\u0001\u0000\u0000\u0000\u0174\u0177\u0001\u0000\u0000\u0000\u0175\u0177"+ + "\u0003\u0154\u00a9\u0000\u0176\u016d\u0001\u0000\u0000\u0000\u0176\u0175"+ + "\u0001\u0000\u0000\u0000\u0177\u017f\u0001\u0000\u0000\u0000\u0178\u0179"+ + "\u0005.\u0000\u0000\u0179\u017a\u0004\u0001\u0001\u0000\u017a\u017c\u0003"+ + "\u014c\u00a5\u0000\u017b\u017d\u0003\u0154\u00a9\u0000\u017c\u017b\u0001"+ + "\u0000\u0000\u0000\u017c\u017d\u0001\u0000\u0000\u0000\u017d\u017f\u0001"+ + "\u0000\u0000\u0000\u017e\u016c\u0001\u0000\u0000\u0000\u017e\u0178\u0001"+ + "\u0000\u0000\u0000\u017f\u0005\u0001\u0000\u0000\u0000\u0180\u0181\u0005"+ + "t\u0000\u0000\u0181\u0182\u0005r\u0000\u0000\u0182\u0183\u0005u\u0000"+ + "\u0000\u0183\u0184\u0005e\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000"+ + "\u0185\u0186\u0006\u0002\u0000\u0000\u0186\u0007\u0001\u0000\u0000\u0000"+ + "\u0187\u0188\u0005f\u0000\u0000\u0188\u0189\u0005a\u0000\u0000\u0189\u018a"+ + "\u0005l\u0000\u0000\u018a\u018b\u0005s\u0000\u0000\u018b\u018c\u0005e"+ + "\u0000\u0000\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u018e\u0006\u0003"+ + "\u0000\u0000\u018e\t\u0001\u0000\u0000\u0000\u018f\u0190\u0005a\u0000"+ + "\u0000\u0190\u0191\u0005s\u0000\u0000\u0191\u0192\u0005s\u0000\u0000\u0192"+ + "\u0193\u0005e\u0000\u0000\u0193\u0194\u0005r\u0000\u0000\u0194\u0195\u0005"+ + "t\u0000\u0000\u0195\u000b\u0001\u0000\u0000\u0000\u0196\u0197\u0005r\u0000"+ + "\u0000\u0197\u0198\u0005e\u0000\u0000\u0198\u0199\u0005f\u0000\u0000\u0199"+ + "\u019a\u0005u\u0000\u0000\u019a\u019b\u0005t\u0000\u0000\u019b\u019c\u0005"+ + "e\u0000\u0000\u019c\r\u0001\u0000\u0000\u0000\u019d\u019e\u0005a\u0000"+ + "\u0000\u019e\u019f\u0005s\u0000\u0000\u019f\u01a0\u0005s\u0000\u0000\u01a0"+ + "\u01a1\u0005u\u0000\u0000\u01a1\u01a2\u0005m\u0000\u0000\u01a2\u01a3\u0005"+ + "e\u0000\u0000\u01a3\u000f\u0001\u0000\u0000\u0000\u01a4\u01a5\u0005i\u0000"+ + "\u0000\u01a5\u01a6\u0005n\u0000\u0000\u01a6\u01a7\u0005h\u0000\u0000\u01a7"+ + "\u01a8\u0005a\u0000\u0000\u01a8\u01a9\u0005l\u0000\u0000\u01a9\u01aa\u0005"+ + "e\u0000\u0000\u01aa\u0011\u0001\u0000\u0000\u0000\u01ab\u01ac\u0005e\u0000"+ + "\u0000\u01ac\u01ad\u0005x\u0000\u0000\u01ad\u01ae\u0005h\u0000\u0000\u01ae"+ + "\u01af\u0005a\u0000\u0000\u01af\u01b0\u0005l\u0000\u0000\u01b0\u01b1\u0005"+ + "e\u0000\u0000\u01b1\u0013\u0001\u0000\u0000\u0000\u01b2\u01b3\u0005r\u0000"+ + "\u0000\u01b3\u01b4\u0005e\u0000\u0000\u01b4\u01b5\u0005q\u0000\u0000\u01b5"+ + "\u01b6\u0005u\u0000\u0000\u01b6\u01b7\u0005i\u0000\u0000\u01b7\u01b8\u0005"+ + "r\u0000\u0000\u01b8\u01b9\u0005e\u0000\u0000\u01b9\u01ba\u0005s\u0000"+ + "\u0000\u01ba\u0015\u0001\u0000\u0000\u0000\u01bb\u01bc\u0005p\u0000\u0000"+ + "\u01bc\u01bd\u0005r\u0000\u0000\u01bd\u01be\u0005e\u0000\u0000\u01be\u01bf"+ + "\u0005s\u0000\u0000\u01bf\u01c0\u0005e\u0000\u0000\u01c0\u01c1\u0005r"+ + "\u0000\u0000\u01c1\u01c2\u0005v\u0000\u0000\u01c2\u01c3\u0005e\u0000\u0000"+ + "\u01c3\u01c4\u0005s\u0000\u0000\u01c4\u0017\u0001\u0000\u0000\u0000\u01c5"+ + "\u01c6\u0005e\u0000\u0000\u01c6\u01c7\u0005n\u0000\u0000\u01c7\u01c8\u0005"+ + "s\u0000\u0000\u01c8\u01c9\u0005u\u0000\u0000\u01c9\u01ca\u0005r\u0000"+ + "\u0000\u01ca\u01cb\u0005e\u0000\u0000\u01cb\u01cc\u0005s\u0000\u0000\u01cc"+ + "\u0019\u0001\u0000\u0000\u0000\u01cd\u01ce\u0005i\u0000\u0000\u01ce\u01cf"+ + "\u0005n\u0000\u0000\u01cf\u01d0\u0005v\u0000\u0000\u01d0\u01d1\u0005a"+ + "\u0000\u0000\u01d1\u01d2\u0005r\u0000\u0000\u01d2\u01d3\u0005i\u0000\u0000"+ + "\u01d3\u01d4\u0005a\u0000\u0000\u01d4\u01d5\u0005n\u0000\u0000\u01d5\u01d6"+ + "\u0005t\u0000\u0000\u01d6\u001b\u0001\u0000\u0000\u0000\u01d7\u01d8\u0005"+ + "d\u0000\u0000\u01d8\u01d9\u0005e\u0000\u0000\u01d9\u01da\u0005c\u0000"+ + "\u0000\u01da\u01db\u0005r\u0000\u0000\u01db\u01dc\u0005e\u0000\u0000\u01dc"+ + "\u01dd\u0005a\u0000\u0000\u01dd\u01de\u0005s\u0000\u0000\u01de\u01df\u0005"+ + "e\u0000\u0000\u01df\u01e0\u0005s\u0000\u0000\u01e0\u01e1\u0001\u0000\u0000"+ + "\u0000\u01e1\u01e2\u0006\r\u0000\u0000\u01e2\u001d\u0001\u0000\u0000\u0000"+ + "\u01e3\u01e4\u0005p\u0000\u0000\u01e4\u01e5\u0005u\u0000\u0000\u01e5\u01e6"+ + "\u0005r\u0000\u0000\u01e6\u01e7\u0005e\u0000\u0000\u01e7\u01e8\u0001\u0000"+ + "\u0000\u0000\u01e8\u01e9\u0006\u000e\u0000\u0000\u01e9\u001f\u0001\u0000"+ + "\u0000\u0000\u01ea\u01eb\u0005i\u0000\u0000\u01eb\u01ec\u0005m\u0000\u0000"+ + "\u01ec\u01ed\u0005p\u0000\u0000\u01ed\u01ee\u0005l\u0000\u0000\u01ee\u01ef"+ + "\u0005e\u0000\u0000\u01ef\u01f0\u0005m\u0000\u0000\u01f0\u01f1\u0005e"+ + "\u0000\u0000\u01f1\u01f2\u0005n\u0000\u0000\u01f2\u01f3\u0005t\u0000\u0000"+ + "\u01f3\u01f4\u0005s\u0000\u0000\u01f4!\u0001\u0000\u0000\u0000\u01f5\u01f6"+ + "\u0005a\u0000\u0000\u01f6\u01f7\u0005s\u0000\u0000\u01f7#\u0001\u0000"+ + "\u0000\u0000\u01f8\u01f9\u0005o\u0000\u0000\u01f9\u01fa\u0005l\u0000\u0000"+ + "\u01fa\u01fb\u0005d\u0000\u0000\u01fb\u01fc\u0001\u0000\u0000\u0000\u01fc"+ "\u01fd\u0006\u0011\u0000\u0000\u01fd%\u0001\u0000\u0000\u0000\u01fe\u01ff"+ - "\u0005#\u0000\u0000\u01ff\u0200\u0005l\u0000\u0000\u0200\u0201\u0005h"+ - "\u0000\u0000\u0201\u0202\u0005s\u0000\u0000\u0202\'\u0001\u0000\u0000"+ - "\u0000\u0203\u0204\u0005f\u0000\u0000\u0204\u0205\u0005o\u0000\u0000\u0205"+ - "\u0206\u0005r\u0000\u0000\u0206\u0207\u0005a\u0000\u0000\u0207\u0208\u0005"+ - "l\u0000\u0000\u0208\u0209\u0005l\u0000\u0000\u0209)\u0001\u0000\u0000"+ - "\u0000\u020a\u020b\u0005e\u0000\u0000\u020b\u020c\u0005x\u0000\u0000\u020c"+ - "\u020d\u0005i\u0000\u0000\u020d\u020e\u0005s\u0000\u0000\u020e\u020f\u0005"+ - "t\u0000\u0000\u020f\u0210\u0005s\u0000\u0000\u0210+\u0001\u0000\u0000"+ - "\u0000\u0211\u0212\u0005a\u0000\u0000\u0212\u0213\u0005c\u0000\u0000\u0213"+ - "\u0214\u0005c\u0000\u0000\u0214\u0215\u0001\u0000\u0000\u0000\u0215\u0216"+ - "\u0006\u0015\u0000\u0000\u0216-\u0001\u0000\u0000\u0000\u0217\u0218\u0005"+ - "f\u0000\u0000\u0218\u0219\u0005o\u0000\u0000\u0219\u021a\u0005l\u0000"+ - "\u0000\u021a\u021b\u0005d\u0000\u0000\u021b/\u0001\u0000\u0000\u0000\u021c"+ - "\u021d\u0005u\u0000\u0000\u021d\u021e\u0005n\u0000\u0000\u021e\u021f\u0005"+ - "f\u0000\u0000\u021f\u0220\u0005o\u0000\u0000\u0220\u0221\u0005l\u0000"+ - "\u0000\u0221\u0222\u0005d\u0000\u0000\u02221\u0001\u0000\u0000\u0000\u0223"+ - "\u0224\u0005u\u0000\u0000\u0224\u0225\u0005n\u0000\u0000\u0225\u0226\u0005"+ - "f\u0000\u0000\u0226\u0227\u0005o\u0000\u0000\u0227\u0228\u0005l\u0000"+ - "\u0000\u0228\u0229\u0005d\u0000\u0000\u0229\u022a\u0005i\u0000\u0000\u022a"+ - "\u022b\u0005n\u0000\u0000\u022b\u022c\u0005g\u0000\u0000\u022c3\u0001"+ - "\u0000\u0000\u0000\u022d\u022e\u0005l\u0000\u0000\u022e\u022f\u0005e\u0000"+ - "\u0000\u022f\u0230\u0005t\u0000\u0000\u02305\u0001\u0000\u0000\u0000\u0231"+ - "\u0232\u0005g\u0000\u0000\u0232\u0233\u0005h\u0000\u0000\u0233\u0234\u0005"+ - "o\u0000\u0000\u0234\u0235\u0005s\u0000\u0000\u0235\u0236\u0005t\u0000"+ - "\u0000\u02367\u0001\u0000\u0000\u0000\u0237\u0238\u0005i\u0000\u0000\u0238"+ - "\u0239\u0005n\u0000\u0000\u02399\u0001\u0000\u0000\u0000\u023a\u023b\u0005"+ - "#\u0000\u0000\u023b;\u0001\u0000\u0000\u0000\u023c\u023d\u0005s\u0000"+ - "\u0000\u023d\u023e\u0005u\u0000\u0000\u023e\u023f\u0005b\u0000\u0000\u023f"+ - "\u0240\u0005s\u0000\u0000\u0240\u0241\u0005e\u0000\u0000\u0241\u0242\u0005"+ - "t\u0000\u0000\u0242=\u0001\u0000\u0000\u0000\u0243\u0244\u0005u\u0000"+ - "\u0000\u0244\u0245\u0005n\u0000\u0000\u0245\u0246\u0005i\u0000\u0000\u0246"+ - "\u0247\u0005o\u0000\u0000\u0247\u0248\u0005n\u0000\u0000\u0248?\u0001"+ - "\u0000\u0000\u0000\u0249\u024a\u0005i\u0000\u0000\u024a\u024b\u0005n\u0000"+ - "\u0000\u024b\u024c\u0005t\u0000\u0000\u024c\u024d\u0005e\u0000\u0000\u024d"+ - "\u024e\u0005r\u0000\u0000\u024e\u024f\u0005s\u0000\u0000\u024f\u0250\u0005"+ - "e\u0000\u0000\u0250\u0251\u0005c\u0000\u0000\u0251\u0252\u0005t\u0000"+ - "\u0000\u0252\u0253\u0005i\u0000\u0000\u0253\u0254\u0005o\u0000\u0000\u0254"+ - "\u0255\u0005n\u0000\u0000\u0255A\u0001\u0000\u0000\u0000\u0256\u0257\u0005"+ - "s\u0000\u0000\u0257\u0258\u0005e\u0000\u0000\u0258\u0259\u0005t\u0000"+ - "\u0000\u0259\u025a\u0005m\u0000\u0000\u025a\u025b\u0005i\u0000\u0000\u025b"+ - "\u025c\u0005n\u0000\u0000\u025c\u025d\u0005u\u0000\u0000\u025d\u025e\u0005"+ - "s\u0000\u0000\u025eC\u0001\u0000\u0000\u0000\u025f\u0260\u0005=\u0000"+ - "\u0000\u0260\u0261\u0005=\u0000\u0000\u0261\u0262\u0005>\u0000\u0000\u0262"+ - "E\u0001\u0000\u0000\u0000\u0263\u0264\u0005-\u0000\u0000\u0264\u0265\u0005"+ - "-\u0000\u0000\u0265\u0266\u0005*\u0000\u0000\u0266G\u0001\u0000\u0000"+ - "\u0000\u0267\u0268\u0005a\u0000\u0000\u0268\u0269\u0005p\u0000\u0000\u0269"+ - "\u026a\u0005p\u0000\u0000\u026a\u026b\u0005l\u0000\u0000\u026b\u026c\u0005"+ - "y\u0000\u0000\u026cI\u0001\u0000\u0000\u0000\u026d\u026e\u0005?\u0000"+ - "\u0000\u026eK\u0001\u0000\u0000\u0000\u026f\u0270\u0005!\u0000\u0000\u0270"+ - "\u0271\u0005<\u0000\u0000\u0271M\u0001\u0000\u0000\u0000\u0272\u0273\u0005"+ - "!\u0000\u0000\u0273\u0274\u0005>\u0000\u0000\u0274\u0275\u0001\u0000\u0000"+ - "\u0000\u0275\u0276\u0006&\u0000\u0000\u0276O\u0001\u0000\u0000\u0000\u0277"+ - "\u0278\u0005s\u0000\u0000\u0278\u0279\u0005e\u0000\u0000\u0279\u027a\u0005"+ - "q\u0000\u0000\u027a\u027b\u0001\u0000\u0000\u0000\u027b\u027c\u0006\'"+ - "\u0000\u0000\u027cQ\u0001\u0000\u0000\u0000\u027d\u027e\u0005s\u0000\u0000"+ - "\u027e\u027f\u0005e\u0000\u0000\u027f\u0280\u0005t\u0000\u0000\u0280\u0281"+ - "\u0001\u0000\u0000\u0000\u0281\u0282\u0006(\u0000\u0000\u0282S\u0001\u0000"+ - "\u0000\u0000\u0283\u0284\u0005m\u0000\u0000\u0284\u0285\u0005s\u0000\u0000"+ - "\u0285\u0286\u0005e\u0000\u0000\u0286\u0287\u0005t\u0000\u0000\u0287\u0288"+ - "\u0001\u0000\u0000\u0000\u0288\u0289\u0006)\u0000\u0000\u0289U\u0001\u0000"+ - "\u0000\u0000\u028a\u028b\u0005d\u0000\u0000\u028b\u028c\u0005i\u0000\u0000"+ - "\u028c\u028d\u0005c\u0000\u0000\u028d\u028e\u0005t\u0000\u0000\u028e\u028f"+ - "\u0001\u0000\u0000\u0000\u028f\u0290\u0006*\u0000\u0000\u0290W\u0001\u0000"+ - "\u0000\u0000\u0291\u0292\u0005o\u0000\u0000\u0292\u0293\u0005p\u0000\u0000"+ - "\u0293\u0294\u0005t\u0000\u0000\u0294\u0295\u0005i\u0000\u0000\u0295\u0296"+ - "\u0005o\u0000\u0000\u0296\u0297\u0005n\u0000\u0000\u0297\u0298\u0001\u0000"+ - "\u0000\u0000\u0298\u0299\u0006+\u0000\u0000\u0299Y\u0001\u0000\u0000\u0000"+ - "\u029a\u029b\u0005g\u0000\u0000\u029b\u029c\u0005p\u0000\u0000\u029c\u029d"+ - "\u0005o\u0000\u0000\u029d\u029e\u0005i\u0000\u0000\u029e\u029f\u0005n"+ - "\u0000\u0000\u029f\u02a0\u0005t\u0000\u0000\u02a0\u02a1\u0005e\u0000\u0000"+ - "\u02a1\u02a2\u0005r\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3"+ - "\u02a4\u0006,\u0000\u0000\u02a4[\u0001\u0000\u0000\u0000\u02a5\u02a6\u0005"+ - "l\u0000\u0000\u02a6\u02a7\u0005e\u0000\u0000\u02a7\u02a8\u0005n\u0000"+ - "\u0000\u02a8\u02a9\u0001\u0000\u0000\u0000\u02a9\u02aa\u0006-\u0000\u0000"+ - "\u02aa]\u0001\u0000\u0000\u0000\u02ab\u02ac\u0005n\u0000\u0000\u02ac\u02ad"+ - "\u0005e\u0000\u0000\u02ad\u02ae\u0005w\u0000\u0000\u02ae\u02af\u0001\u0000"+ - "\u0000\u0000\u02af\u02b0\u0006.\u0000\u0000\u02b0_\u0001\u0000\u0000\u0000"+ - "\u02b1\u02b2\u0005m\u0000\u0000\u02b2\u02b3\u0005a\u0000\u0000\u02b3\u02b4"+ - "\u0005k\u0000\u0000\u02b4\u02b5\u0005e\u0000\u0000\u02b5\u02b6\u0001\u0000"+ - "\u0000\u0000\u02b6\u02b7\u0006/\u0000\u0000\u02b7a\u0001\u0000\u0000\u0000"+ - "\u02b8\u02b9\u0005c\u0000\u0000\u02b9\u02ba\u0005a\u0000\u0000\u02ba\u02bb"+ - "\u0005p\u0000\u0000\u02bb\u02bc\u0001\u0000\u0000\u0000\u02bc\u02bd\u0006"+ - "0\u0000\u0000\u02bdc\u0001\u0000\u0000\u0000\u02be\u02bf\u0005s\u0000"+ - "\u0000\u02bf\u02c0\u0005o\u0000\u0000\u02c0\u02c1\u0005m\u0000\u0000\u02c1"+ - "\u02c2\u0005e\u0000\u0000\u02c2\u02c3\u0001\u0000\u0000\u0000\u02c3\u02c4"+ - "\u00061\u0000\u0000\u02c4e\u0001\u0000\u0000\u0000\u02c5\u02c6\u0005g"+ - "\u0000\u0000\u02c6\u02c7\u0005e\u0000\u0000\u02c7\u02c8\u0005t\u0000\u0000"+ - "\u02c8\u02c9\u0001\u0000\u0000\u0000\u02c9\u02ca\u00062\u0000\u0000\u02ca"+ - "g\u0001\u0000\u0000\u0000\u02cb\u02cc\u0005d\u0000\u0000\u02cc\u02cd\u0005"+ - "o\u0000\u0000\u02cd\u02ce\u0005m\u0000\u0000\u02ce\u02cf\u0005a\u0000"+ - "\u0000\u02cf\u02d0\u0005i\u0000\u0000\u02d0\u02d1\u0005n\u0000\u0000\u02d1"+ - "\u02d2\u0001\u0000\u0000\u0000\u02d2\u02d3\u00063\u0000\u0000\u02d3i\u0001"+ - "\u0000\u0000\u0000\u02d4\u02d5\u0005a\u0000\u0000\u02d5\u02d6\u0005x\u0000"+ - "\u0000\u02d6\u02d7\u0005i\u0000\u0000\u02d7\u02d8\u0005o\u0000\u0000\u02d8"+ - "\u02d9\u0005m\u0000\u0000\u02d9\u02da\u0001\u0000\u0000\u0000\u02da\u02db"+ - "\u00064\u0000\u0000\u02dbk\u0001\u0000\u0000\u0000\u02dc\u02dd\u0005a"+ - "\u0000\u0000\u02dd\u02de\u0005d\u0000\u0000\u02de\u02df\u0005t\u0000\u0000"+ - "\u02df\u02e0\u0001\u0000\u0000\u0000\u02e0\u02e1\u00065\u0000\u0000\u02e1"+ - "m\u0001\u0000\u0000\u0000\u02e2\u02e3\u0005m\u0000\u0000\u02e3\u02e4\u0005"+ - "a\u0000\u0000\u02e4\u02e5\u0005t\u0000\u0000\u02e5\u02e6\u0005c\u0000"+ - "\u0000\u02e6\u02e7\u0005h\u0000\u0000\u02e7\u02e8\u0001\u0000\u0000\u0000"+ - "\u02e8\u02e9\u00066\u0000\u0000\u02e9o\u0001\u0000\u0000\u0000\u02ea\u02eb"+ - "\u0005n\u0000\u0000\u02eb\u02ec\u0005o\u0000\u0000\u02ec\u02ed\u0005n"+ - "\u0000\u0000\u02ed\u02ee\u0005e\u0000\u0000\u02ee\u02ef\u0001\u0000\u0000"+ - "\u0000\u02ef\u02f0\u00067\u0000\u0000\u02f0q\u0001\u0000\u0000\u0000\u02f1"+ - "\u02f2\u0005p\u0000\u0000\u02f2\u02f3\u0005r\u0000\u0000\u02f3\u02f4\u0005"+ - "e\u0000\u0000\u02f4\u02f5\u0005d\u0000\u0000\u02f5s\u0001\u0000\u0000"+ - "\u0000\u02f6\u02f7\u0005t\u0000\u0000\u02f7\u02f8\u0005y\u0000\u0000\u02f8"+ - "\u02f9\u0005p\u0000\u0000\u02f9\u02fa\u0005e\u0000\u0000\u02fa\u02fb\u0005"+ - "O\u0000\u0000\u02fb\u02fc\u0005f\u0000\u0000\u02fc\u02fd\u0001\u0000\u0000"+ - "\u0000\u02fd\u02fe\u00069\u0000\u0000\u02feu\u0001\u0000\u0000\u0000\u02ff"+ - "\u0300\u0005i\u0000\u0000\u0300\u0301\u0005s\u0000\u0000\u0301\u0302\u0005"+ - "C\u0000\u0000\u0302\u0303\u0005o\u0000\u0000\u0303\u0304\u0005m\u0000"+ - "\u0000\u0304\u0305\u0005p\u0000\u0000\u0305\u0306\u0005a\u0000\u0000\u0306"+ - "\u0307\u0005r\u0000\u0000\u0307\u0308\u0005a\u0000\u0000\u0308\u0309\u0005"+ - "b\u0000\u0000\u0309\u030a\u0005l\u0000\u0000\u030a\u030b\u0005e\u0000"+ - "\u0000\u030b\u030c\u0001\u0000\u0000\u0000\u030c\u030d\u0006:\u0000\u0000"+ - "\u030dw\u0001\u0000\u0000\u0000\u030e\u030f\u0005s\u0000\u0000\u030f\u0310"+ - "\u0005h\u0000\u0000\u0310\u0311\u0005a\u0000\u0000\u0311\u0312\u0005r"+ - "\u0000\u0000\u0312\u0313\u0005e\u0000\u0000\u0313y\u0001\u0000\u0000\u0000"+ - "\u0314\u0315\u0005@\u0000\u0000\u0315\u0316\u0001\u0000\u0000\u0000\u0316"+ - "\u0317\u0006<\u0000\u0000\u0317{\u0001\u0000\u0000\u0000\u0318\u0319\u0005"+ - ".\u0000\u0000\u0319\u031a\u0005.\u0000\u0000\u031a}\u0001\u0000\u0000"+ - "\u0000\u031b\u031c\u0005s\u0000\u0000\u031c\u031d\u0005h\u0000\u0000\u031d"+ - "\u031e\u0005a\u0000\u0000\u031e\u031f\u0005r\u0000\u0000\u031f\u0320\u0005"+ - "e\u0000\u0000\u0320\u0321\u0005d\u0000\u0000\u0321\u007f\u0001\u0000\u0000"+ - "\u0000\u0322\u0323\u0005e\u0000\u0000\u0323\u0324\u0005x\u0000\u0000\u0324"+ - "\u0325\u0005c\u0000\u0000\u0325\u0326\u0005l\u0000\u0000\u0326\u0327\u0005"+ - "u\u0000\u0000\u0327\u0328\u0005s\u0000\u0000\u0328\u0329\u0005i\u0000"+ - "\u0000\u0329\u032a\u0005v\u0000\u0000\u032a\u032b\u0005e\u0000\u0000\u032b"+ - "\u0081\u0001\u0000\u0000\u0000\u032c\u032d\u0005p\u0000\u0000\u032d\u032e"+ - "\u0005r\u0000\u0000\u032e\u032f\u0005e\u0000\u0000\u032f\u0330\u0005d"+ - "\u0000\u0000\u0330\u0331\u0005i\u0000\u0000\u0331\u0332\u0005c\u0000\u0000"+ - "\u0332\u0333\u0005a\u0000\u0000\u0333\u0334\u0005t\u0000\u0000\u0334\u0335"+ - "\u0005e\u0000\u0000\u0335\u0083\u0001\u0000\u0000\u0000\u0336\u0337\u0005"+ - "w\u0000\u0000\u0337\u0338\u0005r\u0000\u0000\u0338\u0339\u0005i\u0000"+ - "\u0000\u0339\u033a\u0005t\u0000\u0000\u033a\u033b\u0005e\u0000\u0000\u033b"+ - "\u033c\u0005P\u0000\u0000\u033c\u033d\u0005e\u0000\u0000\u033d\u033e\u0005"+ - "r\u0000\u0000\u033e\u033f\u0005m\u0000\u0000\u033f\u0340\u0001\u0000\u0000"+ - "\u0000\u0340\u0341\u0006A\u0000\u0000\u0341\u0085\u0001\u0000\u0000\u0000"+ - "\u0342\u0343\u0005n\u0000\u0000\u0343\u0344\u0005o\u0000\u0000\u0344\u0345"+ - "\u0005P\u0000\u0000\u0345\u0346\u0005e\u0000\u0000\u0346\u0347\u0005r"+ - "\u0000\u0000\u0347\u0348\u0005m\u0000\u0000\u0348\u0349\u0001\u0000\u0000"+ - "\u0000\u0349\u034a\u0006B\u0000\u0000\u034a\u0087\u0001\u0000\u0000\u0000"+ - "\u034b\u034c\u0005t\u0000\u0000\u034c\u034d\u0005r\u0000\u0000\u034d\u034e"+ - "\u0005u\u0000\u0000\u034e\u034f\u0005s\u0000\u0000\u034f\u0350\u0005t"+ - "\u0000\u0000\u0350\u0351\u0005e\u0000\u0000\u0351\u0352\u0005d\u0000\u0000"+ - "\u0352\u0353\u0001\u0000\u0000\u0000\u0353\u0354\u0006C\u0000\u0000\u0354"+ - "\u0089\u0001\u0000\u0000\u0000\u0355\u0356\u0005o\u0000\u0000\u0356\u0357"+ - "\u0005u\u0000\u0000\u0357\u0358\u0005t\u0000\u0000\u0358\u0359\u0005l"+ - "\u0000\u0000\u0359\u035a\u0005i\u0000\u0000\u035a\u035b\u0005n\u0000\u0000"+ - "\u035b\u035c\u0005e\u0000\u0000\u035c\u008b\u0001\u0000\u0000\u0000\u035d"+ - "\u035e\u0005i\u0000\u0000\u035e\u035f\u0005n\u0000\u0000\u035f\u0360\u0005"+ - "i\u0000\u0000\u0360\u0361\u0005t\u0000\u0000\u0361\u0362\u0005E\u0000"+ - "\u0000\u0362\u0363\u0005n\u0000\u0000\u0363\u0364\u0005s\u0000\u0000\u0364"+ - "\u0365\u0005u\u0000\u0000\u0365\u0366\u0005r\u0000\u0000\u0366\u0367\u0005"+ - "e\u0000\u0000\u0367\u0368\u0005s\u0000\u0000\u0368\u008d\u0001\u0000\u0000"+ - "\u0000\u0369\u036a\u0005i\u0000\u0000\u036a\u036b\u0005m\u0000\u0000\u036b"+ - "\u036c\u0005p\u0000\u0000\u036c\u036d\u0005o\u0000\u0000\u036d\u036e\u0005"+ - "r\u0000\u0000\u036e\u036f\u0005t\u0000\u0000\u036f\u0370\u0005R\u0000"+ - "\u0000\u0370\u0371\u0005e\u0000\u0000\u0371\u0372\u0005q\u0000\u0000\u0372"+ - "\u0373\u0005u\u0000\u0000\u0373\u0374\u0005i\u0000\u0000\u0374\u0375\u0005"+ - "r\u0000\u0000\u0375\u0376\u0005e\u0000\u0000\u0376\u0377\u0005s\u0000"+ - "\u0000\u0377\u008f\u0001\u0000\u0000\u0000\u0378\u0379\u0005p\u0000\u0000"+ - "\u0379\u037a\u0005r\u0000\u0000\u037a\u037b\u0005o\u0000\u0000\u037b\u037c"+ - "\u0005o\u0000\u0000\u037c\u037d\u0005f\u0000\u0000\u037d\u0091\u0001\u0000"+ - "\u0000\u0000\u037e\u037f\u0005=\u0000\u0000\u037f\u0380\u0005=\u0000\u0000"+ - "\u0380\u0381\u0005=\u0000\u0000\u0381\u0093\u0001\u0000\u0000\u0000\u0382"+ - "\u0383\u0005!\u0000\u0000\u0383\u0384\u0005=\u0000\u0000\u0384\u0385\u0005"+ - "=\u0000\u0000\u0385\u0095\u0001\u0000\u0000\u0000\u0386\u0387\u0005w\u0000"+ - "\u0000\u0387\u0388\u0005i\u0000\u0000\u0388\u0389\u0005t\u0000\u0000\u0389"+ - "\u038a\u0005h\u0000\u0000\u038a\u0097\u0001\u0000\u0000\u0000\u038b\u038c"+ - "\u0005o\u0000\u0000\u038c\u038d\u0005p\u0000\u0000\u038d\u038e\u0005a"+ - "\u0000\u0000\u038e\u038f\u0005q\u0000\u0000\u038f\u0390\u0005u\u0000\u0000"+ - "\u0390\u0391\u0005e\u0000\u0000\u0391\u0392\u0001\u0000\u0000\u0000\u0392"+ - "\u0393\u0006K\u0000\u0000\u0393\u0099\u0001\u0000\u0000\u0000\u0394\u0395"+ - "\u0005r\u0000\u0000\u0395\u0396\u0005e\u0000\u0000\u0396\u0397\u0005v"+ - "\u0000\u0000\u0397\u0398\u0005e\u0000\u0000\u0398\u0399\u0005a\u0000\u0000"+ - "\u0399\u039a\u0005l\u0000\u0000\u039a\u009b\u0001\u0000\u0000\u0000\u039b"+ - "\u039c\u0005#\u0000\u0000\u039c\u039d\u0005b\u0000\u0000\u039d\u039e\u0005"+ - "a\u0000\u0000\u039e\u039f\u0005c\u0000\u0000\u039f\u03a0\u0005k\u0000"+ - "\u0000\u03a0\u03a1\u0005e\u0000\u0000\u03a1\u03a2\u0005n\u0000\u0000\u03a2"+ - "\u03a3\u0005d\u0000\u0000\u03a3\u009d\u0001\u0000\u0000\u0000\u03a4\u03a5"+ - "\u0005b\u0000\u0000\u03a5\u03a6\u0005r\u0000\u0000\u03a6\u03a7\u0005e"+ - "\u0000\u0000\u03a7\u03a8\u0005a\u0000\u0000\u03a8\u03a9\u0005k\u0000\u0000"+ - "\u03a9\u03aa\u0001\u0000\u0000\u0000\u03aa\u03ab\u0006N\u0000\u0000\u03ab"+ - "\u009f\u0001\u0000\u0000\u0000\u03ac\u03ad\u0005d\u0000\u0000\u03ad\u03ae"+ - "\u0005e\u0000\u0000\u03ae\u03af\u0005f\u0000\u0000\u03af\u03b0\u0005a"+ - "\u0000\u0000\u03b0\u03b1\u0005u\u0000\u0000\u03b1\u03b2\u0005l\u0000\u0000"+ - "\u03b2\u03b3\u0005t\u0000\u0000\u03b3\u00a1\u0001\u0000\u0000\u0000\u03b4"+ - "\u03b5\u0005f\u0000\u0000\u03b5\u03b6\u0005u\u0000\u0000\u03b6\u03b7\u0005"+ - "n\u0000\u0000\u03b7\u03b8\u0005c\u0000\u0000\u03b8\u00a3\u0001\u0000\u0000"+ - "\u0000\u03b9\u03ba\u0005i\u0000\u0000\u03ba\u03bb\u0005n\u0000\u0000\u03bb"+ - "\u03bc\u0005t\u0000\u0000\u03bc\u03bd\u0005e\u0000\u0000\u03bd\u03be\u0005"+ - "r\u0000\u0000\u03be\u03bf\u0005f\u0000\u0000\u03bf\u03c0\u0005a\u0000"+ - "\u0000\u03c0\u03c1\u0005c\u0000\u0000\u03c1\u03c2\u0005e\u0000\u0000\u03c2"+ - "\u00a5\u0001\u0000\u0000\u0000\u03c3\u03c4\u0005s\u0000\u0000\u03c4\u03c5"+ - "\u0005e\u0000\u0000\u03c5\u03c6\u0005l\u0000\u0000\u03c6\u03c7\u0005e"+ - "\u0000\u0000\u03c7\u03c8\u0005c\u0000\u0000\u03c8\u03c9\u0005t\u0000\u0000"+ - "\u03c9\u00a7\u0001\u0000\u0000\u0000\u03ca\u03cb\u0005c\u0000\u0000\u03cb"+ - "\u03cc\u0005a\u0000\u0000\u03cc\u03cd\u0005s\u0000\u0000\u03cd\u03ce\u0005"+ - "e\u0000\u0000\u03ce\u00a9\u0001\u0000\u0000\u0000\u03cf\u03d0\u0005d\u0000"+ - "\u0000\u03d0\u03d1\u0005e\u0000\u0000\u03d1\u03d2\u0005f\u0000\u0000\u03d2"+ - "\u03d3\u0005e\u0000\u0000\u03d3\u03d4\u0005r\u0000\u0000\u03d4\u00ab\u0001"+ - "\u0000\u0000\u0000\u03d5\u03d6\u0005g\u0000\u0000\u03d6\u03d7\u0005o\u0000"+ - "\u0000\u03d7\u00ad\u0001\u0000\u0000\u0000\u03d8\u03d9\u0005m\u0000\u0000"+ - "\u03d9\u03da\u0005a\u0000\u0000\u03da\u03db\u0005p\u0000\u0000\u03db\u00af"+ - "\u0001\u0000\u0000\u0000\u03dc\u03dd\u0005s\u0000\u0000\u03dd\u03de\u0005"+ - "t\u0000\u0000\u03de\u03df\u0005r\u0000\u0000\u03df\u03e0\u0005u\u0000"+ - "\u0000\u03e0\u03e1\u0005c\u0000\u0000\u03e1\u03e2\u0005t\u0000\u0000\u03e2"+ - "\u00b1\u0001\u0000\u0000\u0000\u03e3\u03e4\u0005c\u0000\u0000\u03e4\u03e5"+ - "\u0005h\u0000\u0000\u03e5\u03e6\u0005a\u0000\u0000\u03e6\u03e7\u0005n"+ - "\u0000\u0000\u03e7\u00b3\u0001\u0000\u0000\u0000\u03e8\u03e9\u0005e\u0000"+ - "\u0000\u03e9\u03ea\u0005l\u0000\u0000\u03ea\u03eb\u0005s\u0000\u0000\u03eb"+ - "\u03ec\u0005e\u0000\u0000\u03ec\u00b5\u0001\u0000\u0000\u0000\u03ed\u03ee"+ - "\u0005g\u0000\u0000\u03ee\u03ef\u0005o\u0000\u0000\u03ef\u03f0\u0005t"+ - "\u0000\u0000\u03f0\u03f1\u0005o\u0000\u0000\u03f1\u00b7\u0001\u0000\u0000"+ - "\u0000\u03f2\u03f3\u0005p\u0000\u0000\u03f3\u03f4\u0005a\u0000\u0000\u03f4"+ - "\u03f5\u0005c\u0000\u0000\u03f5\u03f6\u0005k\u0000\u0000\u03f6\u03f7\u0005"+ - "a\u0000\u0000\u03f7\u03f8\u0005g\u0000\u0000\u03f8\u03f9\u0005e\u0000"+ - "\u0000\u03f9\u00b9\u0001\u0000\u0000\u0000\u03fa\u03fb\u0005s\u0000\u0000"+ - "\u03fb\u03fc\u0005w\u0000\u0000\u03fc\u03fd\u0005i\u0000\u0000\u03fd\u03fe"+ - "\u0005t\u0000\u0000\u03fe\u03ff\u0005c\u0000\u0000\u03ff\u0400\u0005h"+ - "\u0000\u0000\u0400\u00bb\u0001\u0000\u0000\u0000\u0401\u0402\u0005c\u0000"+ - "\u0000\u0402\u0403\u0005o\u0000\u0000\u0403\u0404\u0005n\u0000\u0000\u0404"+ - "\u0405\u0005s\u0000\u0000\u0405\u0406\u0005t\u0000\u0000\u0406\u00bd\u0001"+ - "\u0000\u0000\u0000\u0407\u0408\u0005f\u0000\u0000\u0408\u0409\u0005a\u0000"+ - "\u0000\u0409\u040a\u0005l\u0000\u0000\u040a\u040b\u0005l\u0000\u0000\u040b"+ - "\u040c\u0005t\u0000\u0000\u040c\u040d\u0005h\u0000\u0000\u040d\u040e\u0005"+ - "r\u0000\u0000\u040e\u040f\u0005o\u0000\u0000\u040f\u0410\u0005u\u0000"+ - "\u0000\u0410\u0411\u0005g\u0000\u0000\u0411\u0412\u0005h\u0000\u0000\u0412"+ - "\u0413\u0001\u0000\u0000\u0000\u0413\u0414\u0006^\u0000\u0000\u0414\u00bf"+ - "\u0001\u0000\u0000\u0000\u0415\u0416\u0005i\u0000\u0000\u0416\u0417\u0005"+ - "f\u0000\u0000\u0417\u00c1\u0001\u0000\u0000\u0000\u0418\u0419\u0005r\u0000"+ - "\u0000\u0419\u041a\u0005a\u0000\u0000\u041a\u041b\u0005n\u0000\u0000\u041b"+ - "\u041c\u0005g\u0000\u0000\u041c\u041d\u0005e\u0000\u0000\u041d\u00c3\u0001"+ - "\u0000\u0000\u0000\u041e\u041f\u0005t\u0000\u0000\u041f\u0420\u0005y\u0000"+ - "\u0000\u0420\u0421\u0005p\u0000\u0000\u0421\u0422\u0005e\u0000\u0000\u0422"+ - "\u00c5\u0001\u0000\u0000\u0000\u0423\u0424\u0005c\u0000\u0000\u0424\u0425"+ - "\u0005o\u0000\u0000\u0425\u0426\u0005n\u0000\u0000\u0426\u0427\u0005t"+ - "\u0000\u0000\u0427\u0428\u0005i\u0000\u0000\u0428\u0429\u0005n\u0000\u0000"+ - "\u0429\u042a\u0005u\u0000\u0000\u042a\u042b\u0005e\u0000\u0000\u042b\u042c"+ - "\u0001\u0000\u0000\u0000\u042c\u042d\u0006b\u0000\u0000\u042d\u00c7\u0001"+ - "\u0000\u0000\u0000\u042e\u042f\u0005f\u0000\u0000\u042f\u0430\u0005o\u0000"+ - "\u0000\u0430\u0431\u0005r\u0000\u0000\u0431\u00c9\u0001\u0000\u0000\u0000"+ - "\u0432\u0433\u0005i\u0000\u0000\u0433\u0434\u0005m\u0000\u0000\u0434\u0435"+ - "\u0005p\u0000\u0000\u0435\u0436\u0005o\u0000\u0000\u0436\u0437\u0005r"+ - "\u0000\u0000\u0437\u0438\u0005t\u0000\u0000\u0438\u00cb\u0001\u0000\u0000"+ - "\u0000\u0439\u043a\u0005r\u0000\u0000\u043a\u043b\u0005e\u0000\u0000\u043b"+ - "\u043c\u0005t\u0000\u0000\u043c\u043d\u0005u\u0000\u0000\u043d\u043e\u0005"+ - "r\u0000\u0000\u043e\u043f\u0005n\u0000\u0000\u043f\u0440\u0001\u0000\u0000"+ - "\u0000\u0440\u0441\u0006e\u0000\u0000\u0441\u00cd\u0001\u0000\u0000\u0000"+ - "\u0442\u0443\u0005v\u0000\u0000\u0443\u0444\u0005a\u0000\u0000\u0444\u0445"+ - "\u0005r\u0000\u0000\u0445\u00cf\u0001\u0000\u0000\u0000\u0446\u0447\u0005"+ - "n\u0000\u0000\u0447\u0448\u0005i\u0000\u0000\u0448\u0449\u0005l\u0000"+ - "\u0000\u0449\u044a\u0001\u0000\u0000\u0000\u044a\u044b\u0006g\u0000\u0000"+ - "\u044b\u00d1\u0001\u0000\u0000\u0000\u044c\u0451\u0003\u0154\u00a9\u0000"+ - "\u044d\u0450\u0003\u0154\u00a9\u0000\u044e\u0450\u0003\u0156\u00aa\u0000"+ - "\u044f\u044d\u0001\u0000\u0000\u0000\u044f\u044e\u0001\u0000\u0000\u0000"+ - "\u0450\u0453\u0001\u0000\u0000\u0000\u0451\u044f\u0001\u0000\u0000\u0000"+ - "\u0451\u0452\u0001\u0000\u0000\u0000\u0452\u0454\u0001\u0000\u0000\u0000"+ - "\u0453\u0451\u0001\u0000\u0000\u0000\u0454\u0455\u0006h\u0000\u0000\u0455"+ - "\u00d3\u0001\u0000\u0000\u0000\u0456\u0457\u0005(\u0000\u0000\u0457\u00d5"+ - "\u0001\u0000\u0000\u0000\u0458\u0459\u0005)\u0000\u0000\u0459\u045a\u0001"+ - "\u0000\u0000\u0000\u045a\u045b\u0006j\u0000\u0000\u045b\u00d7\u0001\u0000"+ - "\u0000\u0000\u045c\u045d\u0005{\u0000\u0000\u045d\u00d9\u0001\u0000\u0000"+ - "\u0000\u045e\u045f\u0005}\u0000\u0000\u045f\u0460\u0001\u0000\u0000\u0000"+ - "\u0460\u0461\u0006l\u0000\u0000\u0461\u00db\u0001\u0000\u0000\u0000\u0462"+ - "\u0463\u0005[\u0000\u0000\u0463\u00dd\u0001\u0000\u0000\u0000\u0464\u0465"+ - "\u0005]\u0000\u0000\u0465\u0466\u0001\u0000\u0000\u0000\u0466\u0467\u0006"+ - "n\u0000\u0000\u0467\u00df\u0001\u0000\u0000\u0000\u0468\u0469\u0005=\u0000"+ - "\u0000\u0469\u00e1\u0001\u0000\u0000\u0000\u046a\u046b\u0005,\u0000\u0000"+ - "\u046b\u00e3\u0001\u0000\u0000\u0000\u046c\u046d\u0005;\u0000\u0000\u046d"+ - "\u00e5\u0001\u0000\u0000\u0000\u046e\u046f\u0005:\u0000\u0000\u046f\u00e7"+ - "\u0001\u0000\u0000\u0000\u0470\u0471\u0005.\u0000\u0000\u0471\u00e9\u0001"+ - "\u0000\u0000\u0000\u0472\u0473\u0005+\u0000\u0000\u0473\u0474\u0005+\u0000"+ - "\u0000\u0474\u0475\u0001\u0000\u0000\u0000\u0475\u0476\u0006t\u0000\u0000"+ - "\u0476\u00eb\u0001\u0000\u0000\u0000\u0477\u0478\u0005-\u0000\u0000\u0478"+ - "\u0479\u0005-\u0000\u0000\u0479\u047a\u0001\u0000\u0000\u0000\u047a\u047b"+ - "\u0006u\u0000\u0000\u047b\u00ed\u0001\u0000\u0000\u0000\u047c\u047d\u0005"+ - ":\u0000\u0000\u047d\u047e\u0005=\u0000\u0000\u047e\u00ef\u0001\u0000\u0000"+ - "\u0000\u047f\u0480\u0005.\u0000\u0000\u0480\u0481\u0005.\u0000\u0000\u0481"+ - "\u0482\u0005.\u0000\u0000\u0482\u00f1\u0001\u0000\u0000\u0000\u0483\u0484"+ - "\u0005|\u0000\u0000\u0484\u0485\u0005|\u0000\u0000\u0485\u00f3\u0001\u0000"+ - "\u0000\u0000\u0486\u0487\u0005&\u0000\u0000\u0487\u0488\u0005&\u0000\u0000"+ - "\u0488\u00f5\u0001\u0000\u0000\u0000\u0489\u048a\u0005=\u0000\u0000\u048a"+ - "\u048b\u0005=\u0000\u0000\u048b\u00f7\u0001\u0000\u0000\u0000\u048c\u048d"+ - "\u0005!\u0000\u0000\u048d\u048e\u0005=\u0000\u0000\u048e\u00f9\u0001\u0000"+ - "\u0000\u0000\u048f\u0490\u0005<\u0000\u0000\u0490\u00fb\u0001\u0000\u0000"+ - "\u0000\u0491\u0492\u0005<\u0000\u0000\u0492\u0493\u0005=\u0000\u0000\u0493"+ - "\u00fd\u0001\u0000\u0000\u0000\u0494\u0495\u0005>\u0000\u0000\u0495\u00ff"+ - "\u0001\u0000\u0000\u0000\u0496\u0497\u0005>\u0000\u0000\u0497\u0498\u0005"+ - "=\u0000\u0000\u0498\u0101\u0001\u0000\u0000\u0000\u0499\u049a\u0005|\u0000"+ - "\u0000\u049a\u0103\u0001\u0000\u0000\u0000\u049b\u049c\u0005/\u0000\u0000"+ - "\u049c\u0105\u0001\u0000\u0000\u0000\u049d\u049e\u0005%\u0000\u0000\u049e"+ - "\u0107\u0001\u0000\u0000\u0000\u049f\u04a0\u0005<\u0000\u0000\u04a0\u04a1"+ - "\u0005<\u0000\u0000\u04a1\u0109\u0001\u0000\u0000\u0000\u04a2\u04a3\u0005"+ - ">\u0000\u0000\u04a3\u04a4\u0005>\u0000\u0000\u04a4\u010b\u0001\u0000\u0000"+ - "\u0000\u04a5\u04a6\u0005&\u0000\u0000\u04a6\u04a7\u0005^\u0000\u0000\u04a7"+ - "\u010d\u0001\u0000\u0000\u0000\u04a8\u04a9\u0005!\u0000\u0000\u04a9\u010f"+ - "\u0001\u0000\u0000\u0000\u04aa\u04ab\u0005+\u0000\u0000\u04ab\u0111\u0001"+ - "\u0000\u0000\u0000\u04ac\u04ad\u0005-\u0000\u0000\u04ad\u0113\u0001\u0000"+ - "\u0000\u0000\u04ae\u04af\u0005^\u0000\u0000\u04af\u0115\u0001\u0000\u0000"+ - "\u0000\u04b0\u04b1\u0005*\u0000\u0000\u04b1\u0117\u0001\u0000\u0000\u0000"+ - "\u04b2\u04b3\u0005&\u0000\u0000\u04b3\u0119\u0001\u0000\u0000\u0000\u04b4"+ - "\u04b5\u0005<\u0000\u0000\u04b5\u04b6\u0005-\u0000\u0000\u04b6\u011b\u0001"+ - "\u0000\u0000\u0000\u04b7\u04c3\u00050\u0000\u0000\u04b8\u04bf\u0007\u0000"+ - "\u0000\u0000\u04b9\u04bb\u0005_\u0000\u0000\u04ba\u04b9\u0001\u0000\u0000"+ - "\u0000\u04ba\u04bb\u0001\u0000\u0000\u0000\u04bb\u04bc\u0001\u0000\u0000"+ - "\u0000\u04bc\u04be\u0007\u0001\u0000\u0000\u04bd\u04ba\u0001\u0000\u0000"+ - "\u0000\u04be\u04c1\u0001\u0000\u0000\u0000\u04bf\u04bd\u0001\u0000\u0000"+ - "\u0000\u04bf\u04c0\u0001\u0000\u0000\u0000\u04c0\u04c3\u0001\u0000\u0000"+ - "\u0000\u04c1\u04bf\u0001\u0000\u0000\u0000\u04c2\u04b7\u0001\u0000\u0000"+ - "\u0000\u04c2\u04b8\u0001\u0000\u0000\u0000\u04c3\u04c4\u0001\u0000\u0000"+ - "\u0000\u04c4\u04c5\u0006\u008d\u0000\u0000\u04c5\u011d\u0001\u0000\u0000"+ - "\u0000\u04c6\u04c7\u00050\u0000\u0000\u04c7\u04cc\u0007\u0002\u0000\u0000"+ - "\u04c8\u04ca\u0005_\u0000\u0000\u04c9\u04c8\u0001\u0000\u0000\u0000\u04c9"+ - "\u04ca\u0001\u0000\u0000\u0000\u04ca\u04cb\u0001\u0000\u0000\u0000\u04cb"+ - "\u04cd\u0003\u0150\u00a7\u0000\u04cc\u04c9\u0001\u0000\u0000\u0000\u04cd"+ - "\u04ce\u0001\u0000\u0000\u0000\u04ce\u04cc\u0001\u0000\u0000\u0000\u04ce"+ - "\u04cf\u0001\u0000\u0000\u0000\u04cf\u04d0\u0001\u0000\u0000\u0000\u04d0"+ - "\u04d1\u0006\u008e\u0000\u0000\u04d1\u011f\u0001\u0000\u0000\u0000\u04d2"+ - "\u04d4\u00050\u0000\u0000\u04d3\u04d5\u0007\u0003\u0000\u0000\u04d4\u04d3"+ - "\u0001\u0000\u0000\u0000\u04d4\u04d5\u0001\u0000\u0000\u0000\u04d5\u04da"+ - "\u0001\u0000\u0000\u0000\u04d6\u04d8\u0005_\u0000\u0000\u04d7\u04d6\u0001"+ - "\u0000\u0000\u0000\u04d7\u04d8\u0001\u0000\u0000\u0000\u04d8\u04d9\u0001"+ - "\u0000\u0000\u0000\u04d9\u04db\u0003\u014c\u00a5\u0000\u04da\u04d7\u0001"+ - "\u0000\u0000\u0000\u04db\u04dc\u0001\u0000\u0000\u0000\u04dc\u04da\u0001"+ - "\u0000\u0000\u0000\u04dc\u04dd\u0001\u0000\u0000\u0000\u04dd\u04de\u0001"+ - "\u0000\u0000\u0000\u04de\u04df\u0006\u008f\u0000\u0000\u04df\u0121\u0001"+ - "\u0000\u0000\u0000\u04e0\u04e1\u00050\u0000\u0000\u04e1\u04e6\u0007\u0004"+ - "\u0000\u0000\u04e2\u04e4\u0005_\u0000\u0000\u04e3\u04e2\u0001\u0000\u0000"+ - "\u0000\u04e3\u04e4\u0001\u0000\u0000\u0000\u04e4\u04e5\u0001\u0000\u0000"+ - "\u0000\u04e5\u04e7\u0003\u014e\u00a6\u0000\u04e6\u04e3\u0001\u0000\u0000"+ - "\u0000\u04e7\u04e8\u0001\u0000\u0000\u0000\u04e8\u04e6\u0001\u0000\u0000"+ - "\u0000\u04e8\u04e9\u0001\u0000\u0000\u0000\u04e9\u04ea\u0001\u0000\u0000"+ - "\u0000\u04ea\u04eb\u0006\u0090\u0000\u0000\u04eb\u0123\u0001\u0000\u0000"+ - "\u0000\u04ec\u04ed\u00050\u0000\u0000\u04ed\u04ee\u0007\u0004\u0000\u0000"+ - "\u04ee\u04ef\u0003\u0126\u0092\u0000\u04ef\u04f0\u0003\u0128\u0093\u0000"+ - "\u04f0\u0125\u0001\u0000\u0000\u0000\u04f1\u04f3\u0005_\u0000\u0000\u04f2"+ - "\u04f1\u0001\u0000\u0000\u0000\u04f2\u04f3\u0001\u0000\u0000\u0000\u04f3"+ - "\u04f4\u0001\u0000\u0000\u0000\u04f4\u04f6\u0003\u014e\u00a6\u0000\u04f5"+ - "\u04f2\u0001\u0000\u0000\u0000\u04f6\u04f7\u0001\u0000\u0000\u0000\u04f7"+ - "\u04f5\u0001\u0000\u0000\u0000\u04f7\u04f8\u0001\u0000\u0000\u0000\u04f8"+ - "\u0503\u0001\u0000\u0000\u0000\u04f9\u0500\u0005.\u0000\u0000\u04fa\u04fc"+ - "\u0005_\u0000\u0000\u04fb\u04fa\u0001\u0000\u0000\u0000\u04fb\u04fc\u0001"+ - "\u0000\u0000\u0000\u04fc\u04fd\u0001\u0000\u0000\u0000\u04fd\u04ff\u0003"+ - "\u014e\u00a6\u0000\u04fe\u04fb\u0001\u0000\u0000\u0000\u04ff\u0502\u0001"+ - "\u0000\u0000\u0000\u0500\u04fe\u0001\u0000\u0000\u0000\u0500\u0501\u0001"+ - "\u0000\u0000\u0000\u0501\u0504\u0001\u0000\u0000\u0000\u0502\u0500\u0001"+ - "\u0000\u0000\u0000\u0503\u04f9\u0001\u0000\u0000\u0000\u0503\u0504\u0001"+ - "\u0000\u0000\u0000\u0504\u0511\u0001\u0000\u0000\u0000\u0505\u0506\u0005"+ - ".\u0000\u0000\u0506\u050d\u0003\u014e\u00a6\u0000\u0507\u0509\u0005_\u0000"+ - "\u0000\u0508\u0507\u0001\u0000\u0000\u0000\u0508\u0509\u0001\u0000\u0000"+ - "\u0000\u0509\u050a\u0001\u0000\u0000\u0000\u050a\u050c\u0003\u014e\u00a6"+ - "\u0000\u050b\u0508\u0001\u0000\u0000\u0000\u050c\u050f\u0001\u0000\u0000"+ - "\u0000\u050d\u050b\u0001\u0000\u0000\u0000\u050d\u050e\u0001\u0000\u0000"+ - "\u0000\u050e\u0511\u0001\u0000\u0000\u0000\u050f\u050d\u0001\u0000\u0000"+ - "\u0000\u0510\u04f5\u0001\u0000\u0000\u0000\u0510\u0505\u0001\u0000\u0000"+ - "\u0000\u0511\u0127\u0001\u0000\u0000\u0000\u0512\u0514\u0007\u0005\u0000"+ - "\u0000\u0513\u0515\u0007\u0006\u0000\u0000\u0514\u0513\u0001\u0000\u0000"+ - "\u0000\u0514\u0515\u0001\u0000\u0000\u0000\u0515\u0516\u0001\u0000\u0000"+ - "\u0000\u0516\u0517\u0003\u014a\u00a4\u0000\u0517\u0129\u0001\u0000\u0000"+ - "\u0000\u0518\u051e\u0003\u011c\u008d\u0000\u0519\u051e\u0003\u011e\u008e"+ - "\u0000\u051a\u051e\u0003\u0120\u008f\u0000\u051b\u051e\u0003\u0122\u0090"+ - "\u0000\u051c\u051e\u0003\u0002\u0000\u0000\u051d\u0518\u0001\u0000\u0000"+ - "\u0000\u051d\u0519\u0001\u0000\u0000\u0000\u051d\u051a\u0001\u0000\u0000"+ - "\u0000\u051d\u051b\u0001\u0000\u0000\u0000\u051d\u051c\u0001\u0000\u0000"+ - "\u0000\u051e\u051f\u0001\u0000\u0000\u0000\u051f\u0520\u0005i\u0000\u0000"+ - "\u0520\u0521\u0001\u0000\u0000\u0000\u0521\u0522\u0006\u0094\u0000\u0000"+ - "\u0522\u012b\u0001\u0000\u0000\u0000\u0523\u0526\u0005\'\u0000\u0000\u0524"+ - "\u0527\u0003\u0146\u00a2\u0000\u0525\u0527\u0003\u0130\u0097\u0000\u0526"+ - "\u0524\u0001\u0000\u0000\u0000\u0526\u0525\u0001\u0000\u0000\u0000\u0527"+ - "\u0528\u0001\u0000\u0000\u0000\u0528\u0529\u0005\'\u0000\u0000\u0529\u012d"+ - "\u0001\u0000\u0000\u0000\u052a\u052b\u0003\u012c\u0095\u0000\u052b\u052c"+ - "\u0001\u0000\u0000\u0000\u052c\u052d\u0006\u0096\u0000\u0000\u052d\u012f"+ - "\u0001\u0000\u0000\u0000\u052e\u0531\u0003\u0132\u0098\u0000\u052f\u0531"+ - "\u0003\u0134\u0099\u0000\u0530\u052e\u0001\u0000\u0000\u0000\u0530\u052f"+ - "\u0001\u0000\u0000\u0000\u0531\u0131\u0001\u0000\u0000\u0000\u0532\u0533"+ - "\u0005\\\u0000\u0000\u0533\u0534\u0003\u014c\u00a5\u0000\u0534\u0535\u0003"+ - "\u014c\u00a5\u0000\u0535\u0536\u0003\u014c\u00a5\u0000\u0536\u0133\u0001"+ - "\u0000\u0000\u0000\u0537\u0538\u0005\\\u0000\u0000\u0538\u0539\u0005x"+ - "\u0000\u0000\u0539\u053a\u0003\u014e\u00a6\u0000\u053a\u053b\u0003\u014e"+ - "\u00a6\u0000\u053b\u0135\u0001\u0000\u0000\u0000\u053c\u053d\u0005\\\u0000"+ - "\u0000\u053d\u053e\u0005u\u0000\u0000\u053e\u053f\u0003\u014e\u00a6\u0000"+ - "\u053f\u0540\u0003\u014e\u00a6\u0000\u0540\u0541\u0003\u014e\u00a6\u0000"+ - "\u0541\u0542\u0003\u014e\u00a6\u0000\u0542\u0137\u0001\u0000\u0000\u0000"+ - "\u0543\u0544\u0005\\\u0000\u0000\u0544\u0545\u0005U\u0000\u0000\u0545"+ - "\u0546\u0003\u014e\u00a6\u0000\u0546\u0547\u0003\u014e\u00a6\u0000\u0547"+ - "\u0548\u0003\u014e\u00a6\u0000\u0548\u0549\u0003\u014e\u00a6\u0000\u0549"+ - "\u054a\u0003\u014e\u00a6\u0000\u054a\u054b\u0003\u014e\u00a6\u0000\u054b"+ - "\u054c\u0003\u014e\u00a6\u0000\u054c\u054d\u0003\u014e\u00a6\u0000\u054d"+ - "\u0139\u0001\u0000\u0000\u0000\u054e\u0552\u0005`\u0000\u0000\u054f\u0551"+ - "\b\u0007\u0000\u0000\u0550\u054f\u0001\u0000\u0000\u0000\u0551\u0554\u0001"+ - "\u0000\u0000\u0000\u0552\u0550\u0001\u0000\u0000\u0000\u0552\u0553\u0001"+ - "\u0000\u0000\u0000\u0553\u0555\u0001\u0000\u0000\u0000\u0554\u0552\u0001"+ - "\u0000\u0000\u0000\u0555\u0556\u0005`\u0000\u0000\u0556\u0557\u0001\u0000"+ - "\u0000\u0000\u0557\u0558\u0006\u009c\u0000\u0000\u0558\u013b\u0001\u0000"+ - "\u0000\u0000\u0559\u055e\u0005\"\u0000\u0000\u055a\u055d\b\b\u0000\u0000"+ - "\u055b\u055d\u0003\u0148\u00a3\u0000\u055c\u055a\u0001\u0000\u0000\u0000"+ - "\u055c\u055b\u0001\u0000\u0000\u0000\u055d\u0560\u0001\u0000\u0000\u0000"+ - "\u055e\u055c\u0001\u0000\u0000\u0000\u055e\u055f\u0001\u0000\u0000\u0000"+ - "\u055f\u0561\u0001\u0000\u0000\u0000\u0560\u055e\u0001\u0000\u0000\u0000"+ - "\u0561\u0562\u0005\"\u0000\u0000\u0562\u0563\u0001\u0000\u0000\u0000\u0563"+ - "\u0564\u0006\u009d\u0000\u0000\u0564\u013d\u0001\u0000\u0000\u0000\u0565"+ - "\u0567\u0007\t\u0000\u0000\u0566\u0565\u0001\u0000\u0000\u0000\u0567\u0568"+ - "\u0001\u0000\u0000\u0000\u0568\u0566\u0001\u0000\u0000\u0000\u0568\u0569"+ - "\u0001\u0000\u0000\u0000\u0569\u056a\u0001\u0000\u0000\u0000\u056a\u056b"+ - "\u0006\u009e\u0001\u0000\u056b\u013f\u0001\u0000\u0000\u0000\u056c\u056d"+ - "\u0005/\u0000\u0000\u056d\u056e\u0005*\u0000\u0000\u056e\u0572\u0001\u0000"+ - "\u0000\u0000\u056f\u0571\t\u0000\u0000\u0000\u0570\u056f\u0001\u0000\u0000"+ - "\u0000\u0571\u0574\u0001\u0000\u0000\u0000\u0572\u0573\u0001\u0000\u0000"+ - "\u0000\u0572\u0570\u0001\u0000\u0000\u0000\u0573\u0575\u0001\u0000\u0000"+ - "\u0000\u0574\u0572\u0001\u0000\u0000\u0000\u0575\u0576\u0005*\u0000\u0000"+ - "\u0576\u0577\u0005/\u0000\u0000\u0577\u0578\u0001\u0000\u0000\u0000\u0578"+ - "\u0579\u0006\u009f\u0001\u0000\u0579\u0141\u0001\u0000\u0000\u0000\u057a"+ - "\u057c\u0007\n\u0000\u0000\u057b\u057a\u0001\u0000\u0000\u0000\u057c\u057d"+ - "\u0001\u0000\u0000\u0000\u057d\u057b\u0001\u0000\u0000\u0000\u057d\u057e"+ - "\u0001\u0000\u0000\u0000\u057e\u057f\u0001\u0000\u0000\u0000\u057f\u0580"+ - "\u0006\u00a0\u0001\u0000\u0580\u0143\u0001\u0000\u0000\u0000\u0581\u0582"+ - "\u0005/\u0000\u0000\u0582\u0583\u0005/\u0000\u0000\u0583\u0587\u0001\u0000"+ - "\u0000\u0000\u0584\u0586\b\n\u0000\u0000\u0585\u0584\u0001\u0000\u0000"+ - "\u0000\u0586\u0589\u0001\u0000\u0000\u0000\u0587\u0585\u0001\u0000\u0000"+ - "\u0000\u0587\u0588\u0001\u0000\u0000\u0000\u0588\u058a\u0001\u0000\u0000"+ - "\u0000\u0589\u0587\u0001\u0000\u0000\u0000\u058a\u058b\u0006\u00a1\u0001"+ - "\u0000\u058b\u0145\u0001\u0000\u0000\u0000\u058c\u0591\b\u000b\u0000\u0000"+ - "\u058d\u0591\u0003\u0136\u009a\u0000\u058e\u0591\u0003\u0138\u009b\u0000"+ - "\u058f\u0591\u0003\u0148\u00a3\u0000\u0590\u058c\u0001\u0000\u0000\u0000"+ - "\u0590\u058d\u0001\u0000\u0000\u0000\u0590\u058e\u0001\u0000\u0000\u0000"+ - "\u0590\u058f\u0001\u0000\u0000\u0000\u0591\u0147\u0001\u0000\u0000\u0000"+ - "\u0592\u05ac\u0005\\\u0000\u0000\u0593\u0594\u0005u\u0000\u0000\u0594"+ - "\u0595\u0003\u014e\u00a6\u0000\u0595\u0596\u0003\u014e\u00a6\u0000\u0596"+ - "\u0597\u0003\u014e\u00a6\u0000\u0597\u0598\u0003\u014e\u00a6\u0000\u0598"+ - "\u05ad\u0001\u0000\u0000\u0000\u0599\u059a\u0005U\u0000\u0000\u059a\u059b"+ - "\u0003\u014e\u00a6\u0000\u059b\u059c\u0003\u014e\u00a6\u0000\u059c\u059d"+ - "\u0003\u014e\u00a6\u0000\u059d\u059e\u0003\u014e\u00a6\u0000\u059e\u059f"+ - "\u0003\u014e\u00a6\u0000\u059f\u05a0\u0003\u014e\u00a6\u0000\u05a0\u05a1"+ - "\u0003\u014e\u00a6\u0000\u05a1\u05a2\u0003\u014e\u00a6\u0000\u05a2\u05ad"+ - "\u0001\u0000\u0000\u0000\u05a3\u05ad\u0007\f\u0000\u0000\u05a4\u05a5\u0003"+ - "\u014c\u00a5\u0000\u05a5\u05a6\u0003\u014c\u00a5\u0000\u05a6\u05a7\u0003"+ - "\u014c\u00a5\u0000\u05a7\u05ad\u0001\u0000\u0000\u0000\u05a8\u05a9\u0005"+ - "x\u0000\u0000\u05a9\u05aa\u0003\u014e\u00a6\u0000\u05aa\u05ab\u0003\u014e"+ - "\u00a6\u0000\u05ab\u05ad\u0001\u0000\u0000\u0000\u05ac\u0593\u0001\u0000"+ - "\u0000\u0000\u05ac\u0599\u0001\u0000\u0000\u0000\u05ac\u05a3\u0001\u0000"+ - "\u0000\u0000\u05ac\u05a4\u0001\u0000\u0000\u0000\u05ac\u05a8\u0001\u0000"+ - "\u0000\u0000\u05ad\u0149\u0001\u0000\u0000\u0000\u05ae\u05b5\u0007\u0001"+ - "\u0000\u0000\u05af\u05b1\u0005_\u0000\u0000\u05b0\u05af\u0001\u0000\u0000"+ - "\u0000\u05b0\u05b1\u0001\u0000\u0000\u0000\u05b1\u05b2\u0001\u0000\u0000"+ - "\u0000\u05b2\u05b4\u0007\u0001\u0000\u0000\u05b3\u05b0\u0001\u0000\u0000"+ - "\u0000\u05b4\u05b7\u0001\u0000\u0000\u0000\u05b5\u05b3\u0001\u0000\u0000"+ - "\u0000\u05b5\u05b6\u0001\u0000\u0000\u0000\u05b6\u014b\u0001\u0000\u0000"+ - "\u0000\u05b7\u05b5\u0001\u0000\u0000\u0000\u05b8\u05b9\u0007\r\u0000\u0000"+ - "\u05b9\u014d\u0001\u0000\u0000\u0000\u05ba\u05bb\u0007\u000e\u0000\u0000"+ - "\u05bb\u014f\u0001\u0000\u0000\u0000\u05bc\u05bd\u0007\u000f\u0000\u0000"+ - "\u05bd\u0151\u0001\u0000\u0000\u0000\u05be\u05c0\u0007\u0010\u0000\u0000"+ - "\u05bf\u05c1\u0007\u0006\u0000\u0000\u05c0\u05bf\u0001\u0000\u0000\u0000"+ - "\u05c0\u05c1\u0001\u0000\u0000\u0000\u05c1\u05c2\u0001\u0000\u0000\u0000"+ - "\u05c2\u05c3\u0003\u014a\u00a4\u0000\u05c3\u0153\u0001\u0000\u0000\u0000"+ - "\u05c4\u05c7\u0003\u0158\u00ab\u0000\u05c5\u05c7\u0005_\u0000\u0000\u05c6"+ - "\u05c4\u0001\u0000\u0000\u0000\u05c6\u05c5\u0001\u0000\u0000\u0000\u05c7"+ - "\u0155\u0001\u0000\u0000\u0000\u05c8\u05c9\u0007\u0011\u0000\u0000\u05c9"+ - "\u0157\u0001\u0000\u0000\u0000\u05ca\u05cb\u0007\u0012\u0000\u0000\u05cb"+ - "\u0159\u0001\u0000\u0000\u0000\u05cc\u05ce\u0007\t\u0000\u0000\u05cd\u05cc"+ - "\u0001\u0000\u0000\u0000\u05ce\u05cf\u0001\u0000\u0000\u0000\u05cf\u05cd"+ - "\u0001\u0000\u0000\u0000\u05cf\u05d0\u0001\u0000\u0000\u0000\u05d0\u05d1"+ - "\u0001\u0000\u0000\u0000\u05d1\u05d2\u0006\u00ac\u0001\u0000\u05d2\u015b"+ - "\u0001\u0000\u0000\u0000\u05d3\u05d4\u0005/\u0000\u0000\u05d4\u05d5\u0005"+ - "*\u0000\u0000\u05d5\u05d9\u0001\u0000\u0000\u0000\u05d6\u05d8\b\n\u0000"+ - "\u0000\u05d7\u05d6\u0001\u0000\u0000\u0000\u05d8\u05db\u0001\u0000\u0000"+ - "\u0000\u05d9\u05da\u0001\u0000\u0000\u0000\u05d9\u05d7\u0001\u0000\u0000"+ - "\u0000\u05da\u05dc\u0001\u0000\u0000\u0000\u05db\u05d9\u0001\u0000\u0000"+ - "\u0000\u05dc\u05dd\u0005*\u0000\u0000\u05dd\u05de\u0005/\u0000\u0000\u05de"+ - "\u05df\u0001\u0000\u0000\u0000\u05df\u05e0\u0006\u00ad\u0001\u0000\u05e0"+ - "\u015d\u0001\u0000\u0000\u0000\u05e1\u05e2\u0005/\u0000\u0000\u05e2\u05e3"+ - "\u0005/\u0000\u0000\u05e3\u05e7\u0001\u0000\u0000\u0000\u05e4\u05e6\b"+ - "\n\u0000\u0000\u05e5\u05e4\u0001\u0000\u0000\u0000\u05e6\u05e9\u0001\u0000"+ - "\u0000\u0000\u05e7\u05e5\u0001\u0000\u0000\u0000\u05e7\u05e8\u0001\u0000"+ - "\u0000\u0000\u05e8\u05ea\u0001\u0000\u0000\u0000\u05e9\u05e7\u0001\u0000"+ - "\u0000\u0000\u05ea\u05eb\u0006\u00ae\u0001\u0000\u05eb\u015f\u0001\u0000"+ - "\u0000\u0000\u05ec\u05ee\u0007\n\u0000\u0000\u05ed\u05ec\u0001\u0000\u0000"+ - "\u0000\u05ee\u05ef\u0001\u0000\u0000\u0000\u05ef\u05ed\u0001\u0000\u0000"+ - "\u0000\u05ef\u05f0\u0001\u0000\u0000\u0000\u05f0\u05ff\u0001\u0000\u0000"+ - "\u0000\u05f1\u05ff\u0005;\u0000\u0000\u05f2\u05f3\u0005/\u0000\u0000\u05f3"+ - "\u05f4\u0005*\u0000\u0000\u05f4\u05f8\u0001\u0000\u0000\u0000\u05f5\u05f7"+ - "\t\u0000\u0000\u0000\u05f6\u05f5\u0001\u0000\u0000\u0000\u05f7\u05fa\u0001"+ - "\u0000\u0000\u0000\u05f8\u05f9\u0001\u0000\u0000\u0000\u05f8\u05f6\u0001"+ - "\u0000\u0000\u0000\u05f9\u05fb\u0001\u0000\u0000\u0000\u05fa\u05f8\u0001"+ - "\u0000\u0000\u0000\u05fb\u05fc\u0005*\u0000\u0000\u05fc\u05ff\u0005/\u0000"+ - "\u0000\u05fd\u05ff\u0005\u0000\u0000\u0001\u05fe\u05ed\u0001\u0000\u0000"+ - "\u0000\u05fe\u05f1\u0001\u0000\u0000\u0000\u05fe\u05f2\u0001\u0000\u0000"+ - "\u0000\u05fe\u05fd\u0001\u0000\u0000\u0000\u05ff\u0600\u0001\u0000\u0000"+ - "\u0000\u0600\u0601\u0006\u00af\u0002\u0000\u0601\u0161\u0001\u0000\u0000"+ - "\u0000\u0602\u0603\u0001\u0000\u0000\u0000\u0603\u0604\u0001\u0000\u0000"+ - "\u0000\u0604\u0605\u0006\u00b0\u0002\u0000\u0605\u0606\u0006\u00b0\u0001"+ - "\u0000\u0606\u0163\u0001\u0000\u0000\u00003\u0000\u0001\u0166\u016e\u0171"+ - "\u0174\u017a\u017c\u044f\u0451\u04ba\u04bf\u04c2\u04c9\u04ce\u04d4\u04d7"+ - "\u04dc\u04e3\u04e8\u04f2\u04f7\u04fb\u0500\u0503\u0508\u050d\u0510\u0514"+ - "\u051d\u0526\u0530\u0552\u055c\u055e\u0568\u0572\u057d\u0587\u0590\u05ac"+ - "\u05b0\u05b5\u05c0\u05c6\u05cf\u05d9\u05e7\u05ef\u05f8\u05fe\u0003\u0002"+ - "\u0001\u0000\u0000\u0001\u0000\u0002\u0000\u0000"; + "\u0005b\u0000\u0000\u01ff\u0200\u0005e\u0000\u0000\u0200\u0201\u0005f"+ + "\u0000\u0000\u0201\u0202\u0005o\u0000\u0000\u0202\u0203\u0005r\u0000\u0000"+ + "\u0203\u0204\u0005e\u0000\u0000\u0204\u0205\u0001\u0000\u0000\u0000\u0205"+ + "\u0206\u0006\u0012\u0000\u0000\u0206\'\u0001\u0000\u0000\u0000\u0207\u0208"+ + "\u0005#\u0000\u0000\u0208\u0209\u0005l\u0000\u0000\u0209\u020a\u0005h"+ + "\u0000\u0000\u020a\u020b\u0005s\u0000\u0000\u020b)\u0001\u0000\u0000\u0000"+ + "\u020c\u020d\u0005f\u0000\u0000\u020d\u020e\u0005o\u0000\u0000\u020e\u020f"+ + "\u0005r\u0000\u0000\u020f\u0210\u0005a\u0000\u0000\u0210\u0211\u0005l"+ + "\u0000\u0000\u0211\u0212\u0005l\u0000\u0000\u0212+\u0001\u0000\u0000\u0000"+ + "\u0213\u0214\u0005e\u0000\u0000\u0214\u0215\u0005x\u0000\u0000\u0215\u0216"+ + "\u0005i\u0000\u0000\u0216\u0217\u0005s\u0000\u0000\u0217\u0218\u0005t"+ + "\u0000\u0000\u0218\u0219\u0005s\u0000\u0000\u0219-\u0001\u0000\u0000\u0000"+ + "\u021a\u021b\u0005a\u0000\u0000\u021b\u021c\u0005c\u0000\u0000\u021c\u021d"+ + "\u0005c\u0000\u0000\u021d\u021e\u0001\u0000\u0000\u0000\u021e\u021f\u0006"+ + "\u0016\u0000\u0000\u021f/\u0001\u0000\u0000\u0000\u0220\u0221\u0005f\u0000"+ + "\u0000\u0221\u0222\u0005o\u0000\u0000\u0222\u0223\u0005l\u0000\u0000\u0223"+ + "\u0224\u0005d\u0000\u0000\u02241\u0001\u0000\u0000\u0000\u0225\u0226\u0005"+ + "u\u0000\u0000\u0226\u0227\u0005n\u0000\u0000\u0227\u0228\u0005f\u0000"+ + "\u0000\u0228\u0229\u0005o\u0000\u0000\u0229\u022a\u0005l\u0000\u0000\u022a"+ + "\u022b\u0005d\u0000\u0000\u022b3\u0001\u0000\u0000\u0000\u022c\u022d\u0005"+ + "u\u0000\u0000\u022d\u022e\u0005n\u0000\u0000\u022e\u022f\u0005f\u0000"+ + "\u0000\u022f\u0230\u0005o\u0000\u0000\u0230\u0231\u0005l\u0000\u0000\u0231"+ + "\u0232\u0005d\u0000\u0000\u0232\u0233\u0005i\u0000\u0000\u0233\u0234\u0005"+ + "n\u0000\u0000\u0234\u0235\u0005g\u0000\u0000\u02355\u0001\u0000\u0000"+ + "\u0000\u0236\u0237\u0005l\u0000\u0000\u0237\u0238\u0005e\u0000\u0000\u0238"+ + "\u0239\u0005t\u0000\u0000\u02397\u0001\u0000\u0000\u0000\u023a\u023b\u0005"+ + "g\u0000\u0000\u023b\u023c\u0005h\u0000\u0000\u023c\u023d\u0005o\u0000"+ + "\u0000\u023d\u023e\u0005s\u0000\u0000\u023e\u023f\u0005t\u0000\u0000\u023f"+ + "9\u0001\u0000\u0000\u0000\u0240\u0241\u0005i\u0000\u0000\u0241\u0242\u0005"+ + "n\u0000\u0000\u0242;\u0001\u0000\u0000\u0000\u0243\u0244\u0005#\u0000"+ + "\u0000\u0244=\u0001\u0000\u0000\u0000\u0245\u0246\u0005s\u0000\u0000\u0246"+ + "\u0247\u0005u\u0000\u0000\u0247\u0248\u0005b\u0000\u0000\u0248\u0249\u0005"+ + "s\u0000\u0000\u0249\u024a\u0005e\u0000\u0000\u024a\u024b\u0005t\u0000"+ + "\u0000\u024b?\u0001\u0000\u0000\u0000\u024c\u024d\u0005u\u0000\u0000\u024d"+ + "\u024e\u0005n\u0000\u0000\u024e\u024f\u0005i\u0000\u0000\u024f\u0250\u0005"+ + "o\u0000\u0000\u0250\u0251\u0005n\u0000\u0000\u0251A\u0001\u0000\u0000"+ + "\u0000\u0252\u0253\u0005i\u0000\u0000\u0253\u0254\u0005n\u0000\u0000\u0254"+ + "\u0255\u0005t\u0000\u0000\u0255\u0256\u0005e\u0000\u0000\u0256\u0257\u0005"+ + "r\u0000\u0000\u0257\u0258\u0005s\u0000\u0000\u0258\u0259\u0005e\u0000"+ + "\u0000\u0259\u025a\u0005c\u0000\u0000\u025a\u025b\u0005t\u0000\u0000\u025b"+ + "\u025c\u0005i\u0000\u0000\u025c\u025d\u0005o\u0000\u0000\u025d\u025e\u0005"+ + "n\u0000\u0000\u025eC\u0001\u0000\u0000\u0000\u025f\u0260\u0005s\u0000"+ + "\u0000\u0260\u0261\u0005e\u0000\u0000\u0261\u0262\u0005t\u0000\u0000\u0262"+ + "\u0263\u0005m\u0000\u0000\u0263\u0264\u0005i\u0000\u0000\u0264\u0265\u0005"+ + "n\u0000\u0000\u0265\u0266\u0005u\u0000\u0000\u0266\u0267\u0005s\u0000"+ + "\u0000\u0267E\u0001\u0000\u0000\u0000\u0268\u0269\u0005=\u0000\u0000\u0269"+ + "\u026a\u0005=\u0000\u0000\u026a\u026b\u0005>\u0000\u0000\u026bG\u0001"+ + "\u0000\u0000\u0000\u026c\u026d\u0005-\u0000\u0000\u026d\u026e\u0005-\u0000"+ + "\u0000\u026e\u026f\u0005*\u0000\u0000\u026fI\u0001\u0000\u0000\u0000\u0270"+ + "\u0271\u0005a\u0000\u0000\u0271\u0272\u0005p\u0000\u0000\u0272\u0273\u0005"+ + "p\u0000\u0000\u0273\u0274\u0005l\u0000\u0000\u0274\u0275\u0005y\u0000"+ + "\u0000\u0275K\u0001\u0000\u0000\u0000\u0276\u0277\u0005?\u0000\u0000\u0277"+ + "M\u0001\u0000\u0000\u0000\u0278\u0279\u0005!\u0000\u0000\u0279\u027a\u0005"+ + "<\u0000\u0000\u027aO\u0001\u0000\u0000\u0000\u027b\u027c\u0005!\u0000"+ + "\u0000\u027c\u027d\u0005>\u0000\u0000\u027d\u027e\u0001\u0000\u0000\u0000"+ + "\u027e\u027f\u0006\'\u0000\u0000\u027fQ\u0001\u0000\u0000\u0000\u0280"+ + "\u0281\u0005s\u0000\u0000\u0281\u0282\u0005e\u0000\u0000\u0282\u0283\u0005"+ + "q\u0000\u0000\u0283\u0284\u0001\u0000\u0000\u0000\u0284\u0285\u0006(\u0000"+ + "\u0000\u0285S\u0001\u0000\u0000\u0000\u0286\u0287\u0005s\u0000\u0000\u0287"+ + "\u0288\u0005e\u0000\u0000\u0288\u0289\u0005t\u0000\u0000\u0289\u028a\u0001"+ + "\u0000\u0000\u0000\u028a\u028b\u0006)\u0000\u0000\u028bU\u0001\u0000\u0000"+ + "\u0000\u028c\u028d\u0005m\u0000\u0000\u028d\u028e\u0005s\u0000\u0000\u028e"+ + "\u028f\u0005e\u0000\u0000\u028f\u0290\u0005t\u0000\u0000\u0290\u0291\u0001"+ + "\u0000\u0000\u0000\u0291\u0292\u0006*\u0000\u0000\u0292W\u0001\u0000\u0000"+ + "\u0000\u0293\u0294\u0005d\u0000\u0000\u0294\u0295\u0005i\u0000\u0000\u0295"+ + "\u0296\u0005c\u0000\u0000\u0296\u0297\u0005t\u0000\u0000\u0297\u0298\u0001"+ + "\u0000\u0000\u0000\u0298\u0299\u0006+\u0000\u0000\u0299Y\u0001\u0000\u0000"+ + "\u0000\u029a\u029b\u0005o\u0000\u0000\u029b\u029c\u0005p\u0000\u0000\u029c"+ + "\u029d\u0005t\u0000\u0000\u029d\u029e\u0005i\u0000\u0000\u029e\u029f\u0005"+ + "o\u0000\u0000\u029f\u02a0\u0005n\u0000\u0000\u02a0\u02a1\u0001\u0000\u0000"+ + "\u0000\u02a1\u02a2\u0006,\u0000\u0000\u02a2[\u0001\u0000\u0000\u0000\u02a3"+ + "\u02a4\u0005g\u0000\u0000\u02a4\u02a5\u0005p\u0000\u0000\u02a5\u02a6\u0005"+ + "o\u0000\u0000\u02a6\u02a7\u0005i\u0000\u0000\u02a7\u02a8\u0005n\u0000"+ + "\u0000\u02a8\u02a9\u0005t\u0000\u0000\u02a9\u02aa\u0005e\u0000\u0000\u02aa"+ + "\u02ab\u0005r\u0000\u0000\u02ab\u02ac\u0001\u0000\u0000\u0000\u02ac\u02ad"+ + "\u0006-\u0000\u0000\u02ad]\u0001\u0000\u0000\u0000\u02ae\u02af\u0005l"+ + "\u0000\u0000\u02af\u02b0\u0005e\u0000\u0000\u02b0\u02b1\u0005n\u0000\u0000"+ + "\u02b1\u02b2\u0001\u0000\u0000\u0000\u02b2\u02b3\u0006.\u0000\u0000\u02b3"+ + "_\u0001\u0000\u0000\u0000\u02b4\u02b5\u0005n\u0000\u0000\u02b5\u02b6\u0005"+ + "e\u0000\u0000\u02b6\u02b7\u0005w\u0000\u0000\u02b7\u02b8\u0001\u0000\u0000"+ + "\u0000\u02b8\u02b9\u0006/\u0000\u0000\u02b9a\u0001\u0000\u0000\u0000\u02ba"+ + "\u02bb\u0005m\u0000\u0000\u02bb\u02bc\u0005a\u0000\u0000\u02bc\u02bd\u0005"+ + "k\u0000\u0000\u02bd\u02be\u0005e\u0000\u0000\u02be\u02bf\u0001\u0000\u0000"+ + "\u0000\u02bf\u02c0\u00060\u0000\u0000\u02c0c\u0001\u0000\u0000\u0000\u02c1"+ + "\u02c2\u0005c\u0000\u0000\u02c2\u02c3\u0005a\u0000\u0000\u02c3\u02c4\u0005"+ + "p\u0000\u0000\u02c4\u02c5\u0001\u0000\u0000\u0000\u02c5\u02c6\u00061\u0000"+ + "\u0000\u02c6e\u0001\u0000\u0000\u0000\u02c7\u02c8\u0005s\u0000\u0000\u02c8"+ + "\u02c9\u0005o\u0000\u0000\u02c9\u02ca\u0005m\u0000\u0000\u02ca\u02cb\u0005"+ + "e\u0000\u0000\u02cb\u02cc\u0001\u0000\u0000\u0000\u02cc\u02cd\u00062\u0000"+ + "\u0000\u02cdg\u0001\u0000\u0000\u0000\u02ce\u02cf\u0005g\u0000\u0000\u02cf"+ + "\u02d0\u0005e\u0000\u0000\u02d0\u02d1\u0005t\u0000\u0000\u02d1\u02d2\u0001"+ + "\u0000\u0000\u0000\u02d2\u02d3\u00063\u0000\u0000\u02d3i\u0001\u0000\u0000"+ + "\u0000\u02d4\u02d5\u0005d\u0000\u0000\u02d5\u02d6\u0005o\u0000\u0000\u02d6"+ + "\u02d7\u0005m\u0000\u0000\u02d7\u02d8\u0005a\u0000\u0000\u02d8\u02d9\u0005"+ + "i\u0000\u0000\u02d9\u02da\u0005n\u0000\u0000\u02da\u02db\u0001\u0000\u0000"+ + "\u0000\u02db\u02dc\u00064\u0000\u0000\u02dck\u0001\u0000\u0000\u0000\u02dd"+ + "\u02de\u0005a\u0000\u0000\u02de\u02df\u0005x\u0000\u0000\u02df\u02e0\u0005"+ + "i\u0000\u0000\u02e0\u02e1\u0005o\u0000\u0000\u02e1\u02e2\u0005m\u0000"+ + "\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e4\u00065\u0000\u0000"+ + "\u02e4m\u0001\u0000\u0000\u0000\u02e5\u02e6\u0005a\u0000\u0000\u02e6\u02e7"+ + "\u0005d\u0000\u0000\u02e7\u02e8\u0005t\u0000\u0000\u02e8\u02e9\u0001\u0000"+ + "\u0000\u0000\u02e9\u02ea\u00066\u0000\u0000\u02eao\u0001\u0000\u0000\u0000"+ + "\u02eb\u02ec\u0005m\u0000\u0000\u02ec\u02ed\u0005a\u0000\u0000\u02ed\u02ee"+ + "\u0005t\u0000\u0000\u02ee\u02ef\u0005c\u0000\u0000\u02ef\u02f0\u0005h"+ + "\u0000\u0000\u02f0\u02f1\u0001\u0000\u0000\u0000\u02f1\u02f2\u00067\u0000"+ + "\u0000\u02f2q\u0001\u0000\u0000\u0000\u02f3\u02f4\u0005n\u0000\u0000\u02f4"+ + "\u02f5\u0005o\u0000\u0000\u02f5\u02f6\u0005n\u0000\u0000\u02f6\u02f7\u0005"+ + "e\u0000\u0000\u02f7\u02f8\u0001\u0000\u0000\u0000\u02f8\u02f9\u00068\u0000"+ + "\u0000\u02f9s\u0001\u0000\u0000\u0000\u02fa\u02fb\u0005p\u0000\u0000\u02fb"+ + "\u02fc\u0005r\u0000\u0000\u02fc\u02fd\u0005e\u0000\u0000\u02fd\u02fe\u0005"+ + "d\u0000\u0000\u02feu\u0001\u0000\u0000\u0000\u02ff\u0300\u0005t\u0000"+ + "\u0000\u0300\u0301\u0005y\u0000\u0000\u0301\u0302\u0005p\u0000\u0000\u0302"+ + "\u0303\u0005e\u0000\u0000\u0303\u0304\u0005O\u0000\u0000\u0304\u0305\u0005"+ + "f\u0000\u0000\u0305\u0306\u0001\u0000\u0000\u0000\u0306\u0307\u0006:\u0000"+ + "\u0000\u0307w\u0001\u0000\u0000\u0000\u0308\u0309\u0005i\u0000\u0000\u0309"+ + "\u030a\u0005s\u0000\u0000\u030a\u030b\u0005C\u0000\u0000\u030b\u030c\u0005"+ + "o\u0000\u0000\u030c\u030d\u0005m\u0000\u0000\u030d\u030e\u0005p\u0000"+ + "\u0000\u030e\u030f\u0005a\u0000\u0000\u030f\u0310\u0005r\u0000\u0000\u0310"+ + "\u0311\u0005a\u0000\u0000\u0311\u0312\u0005b\u0000\u0000\u0312\u0313\u0005"+ + "l\u0000\u0000\u0313\u0314\u0005e\u0000\u0000\u0314\u0315\u0001\u0000\u0000"+ + "\u0000\u0315\u0316\u0006;\u0000\u0000\u0316y\u0001\u0000\u0000\u0000\u0317"+ + "\u0318\u0005s\u0000\u0000\u0318\u0319\u0005h\u0000\u0000\u0319\u031a\u0005"+ + "a\u0000\u0000\u031a\u031b\u0005r\u0000\u0000\u031b\u031c\u0005e\u0000"+ + "\u0000\u031c{\u0001\u0000\u0000\u0000\u031d\u031e\u0005@\u0000\u0000\u031e"+ + "\u031f\u0001\u0000\u0000\u0000\u031f\u0320\u0006=\u0000\u0000\u0320}\u0001"+ + "\u0000\u0000\u0000\u0321\u0322\u0005.\u0000\u0000\u0322\u0323\u0005.\u0000"+ + "\u0000\u0323\u007f\u0001\u0000\u0000\u0000\u0324\u0325\u0005s\u0000\u0000"+ + "\u0325\u0326\u0005h\u0000\u0000\u0326\u0327\u0005a\u0000\u0000\u0327\u0328"+ + "\u0005r\u0000\u0000\u0328\u0329\u0005e\u0000\u0000\u0329\u032a\u0005d"+ + "\u0000\u0000\u032a\u0081\u0001\u0000\u0000\u0000\u032b\u032c\u0005e\u0000"+ + "\u0000\u032c\u032d\u0005x\u0000\u0000\u032d\u032e\u0005c\u0000\u0000\u032e"+ + "\u032f\u0005l\u0000\u0000\u032f\u0330\u0005u\u0000\u0000\u0330\u0331\u0005"+ + "s\u0000\u0000\u0331\u0332\u0005i\u0000\u0000\u0332\u0333\u0005v\u0000"+ + "\u0000\u0333\u0334\u0005e\u0000\u0000\u0334\u0083\u0001\u0000\u0000\u0000"+ + "\u0335\u0336\u0005p\u0000\u0000\u0336\u0337\u0005r\u0000\u0000\u0337\u0338"+ + "\u0005e\u0000\u0000\u0338\u0339\u0005d\u0000\u0000\u0339\u033a\u0005i"+ + "\u0000\u0000\u033a\u033b\u0005c\u0000\u0000\u033b\u033c\u0005a\u0000\u0000"+ + "\u033c\u033d\u0005t\u0000\u0000\u033d\u033e\u0005e\u0000\u0000\u033e\u0085"+ + "\u0001\u0000\u0000\u0000\u033f\u0340\u0005w\u0000\u0000\u0340\u0341\u0005"+ + "r\u0000\u0000\u0341\u0342\u0005i\u0000\u0000\u0342\u0343\u0005t\u0000"+ + "\u0000\u0343\u0344\u0005e\u0000\u0000\u0344\u0345\u0005P\u0000\u0000\u0345"+ + "\u0346\u0005e\u0000\u0000\u0346\u0347\u0005r\u0000\u0000\u0347\u0348\u0005"+ + "m\u0000\u0000\u0348\u0349\u0001\u0000\u0000\u0000\u0349\u034a\u0006B\u0000"+ + "\u0000\u034a\u0087\u0001\u0000\u0000\u0000\u034b\u034c\u0005n\u0000\u0000"+ + "\u034c\u034d\u0005o\u0000\u0000\u034d\u034e\u0005P\u0000\u0000\u034e\u034f"+ + "\u0005e\u0000\u0000\u034f\u0350\u0005r\u0000\u0000\u0350\u0351\u0005m"+ + "\u0000\u0000\u0351\u0352\u0001\u0000\u0000\u0000\u0352\u0353\u0006C\u0000"+ + "\u0000\u0353\u0089\u0001\u0000\u0000\u0000\u0354\u0355\u0005t\u0000\u0000"+ + "\u0355\u0356\u0005r\u0000\u0000\u0356\u0357\u0005u\u0000\u0000\u0357\u0358"+ + "\u0005s\u0000\u0000\u0358\u0359\u0005t\u0000\u0000\u0359\u035a\u0005e"+ + "\u0000\u0000\u035a\u035b\u0005d\u0000\u0000\u035b\u035c\u0001\u0000\u0000"+ + "\u0000\u035c\u035d\u0006D\u0000\u0000\u035d\u008b\u0001\u0000\u0000\u0000"+ + "\u035e\u035f\u0005o\u0000\u0000\u035f\u0360\u0005u\u0000\u0000\u0360\u0361"+ + "\u0005t\u0000\u0000\u0361\u0362\u0005l\u0000\u0000\u0362\u0363\u0005i"+ + "\u0000\u0000\u0363\u0364\u0005n\u0000\u0000\u0364\u0365\u0005e\u0000\u0000"+ + "\u0365\u008d\u0001\u0000\u0000\u0000\u0366\u0367\u0005i\u0000\u0000\u0367"+ + "\u0368\u0005n\u0000\u0000\u0368\u0369\u0005i\u0000\u0000\u0369\u036a\u0005"+ + "t\u0000\u0000\u036a\u036b\u0005E\u0000\u0000\u036b\u036c\u0005n\u0000"+ + "\u0000\u036c\u036d\u0005s\u0000\u0000\u036d\u036e\u0005u\u0000\u0000\u036e"+ + "\u036f\u0005r\u0000\u0000\u036f\u0370\u0005e\u0000\u0000\u0370\u0371\u0005"+ + "s\u0000\u0000\u0371\u008f\u0001\u0000\u0000\u0000\u0372\u0373\u0005i\u0000"+ + "\u0000\u0373\u0374\u0005m\u0000\u0000\u0374\u0375\u0005p\u0000\u0000\u0375"+ + "\u0376\u0005o\u0000\u0000\u0376\u0377\u0005r\u0000\u0000\u0377\u0378\u0005"+ + "t\u0000\u0000\u0378\u0379\u0005R\u0000\u0000\u0379\u037a\u0005e\u0000"+ + "\u0000\u037a\u037b\u0005q\u0000\u0000\u037b\u037c\u0005u\u0000\u0000\u037c"+ + "\u037d\u0005i\u0000\u0000\u037d\u037e\u0005r\u0000\u0000\u037e\u037f\u0005"+ + "e\u0000\u0000\u037f\u0380\u0005s\u0000\u0000\u0380\u0091\u0001\u0000\u0000"+ + "\u0000\u0381\u0382\u0005p\u0000\u0000\u0382\u0383\u0005r\u0000\u0000\u0383"+ + "\u0384\u0005o\u0000\u0000\u0384\u0385\u0005o\u0000\u0000\u0385\u0386\u0005"+ + "f\u0000\u0000\u0386\u0093\u0001\u0000\u0000\u0000\u0387\u0388\u0005=\u0000"+ + "\u0000\u0388\u0389\u0005=\u0000\u0000\u0389\u038a\u0005=\u0000\u0000\u038a"+ + "\u0095\u0001\u0000\u0000\u0000\u038b\u038c\u0005!\u0000\u0000\u038c\u038d"+ + "\u0005=\u0000\u0000\u038d\u038e\u0005=\u0000\u0000\u038e\u0097\u0001\u0000"+ + "\u0000\u0000\u038f\u0390\u0005w\u0000\u0000\u0390\u0391\u0005i\u0000\u0000"+ + "\u0391\u0392\u0005t\u0000\u0000\u0392\u0393\u0005h\u0000\u0000\u0393\u0099"+ + "\u0001\u0000\u0000\u0000\u0394\u0395\u0005o\u0000\u0000\u0395\u0396\u0005"+ + "p\u0000\u0000\u0396\u0397\u0005a\u0000\u0000\u0397\u0398\u0005q\u0000"+ + "\u0000\u0398\u0399\u0005u\u0000\u0000\u0399\u039a\u0005e\u0000\u0000\u039a"+ + "\u039b\u0001\u0000\u0000\u0000\u039b\u039c\u0006L\u0000\u0000\u039c\u009b"+ + "\u0001\u0000\u0000\u0000\u039d\u039e\u0005r\u0000\u0000\u039e\u039f\u0005"+ + "e\u0000\u0000\u039f\u03a0\u0005v\u0000\u0000\u03a0\u03a1\u0005e\u0000"+ + "\u0000\u03a1\u03a2\u0005a\u0000\u0000\u03a2\u03a3\u0005l\u0000\u0000\u03a3"+ + "\u009d\u0001\u0000\u0000\u0000\u03a4\u03a5\u0005#\u0000\u0000\u03a5\u03a6"+ + "\u0005b\u0000\u0000\u03a6\u03a7\u0005a\u0000\u0000\u03a7\u03a8\u0005c"+ + "\u0000\u0000\u03a8\u03a9\u0005k\u0000\u0000\u03a9\u03aa\u0005e\u0000\u0000"+ + "\u03aa\u03ab\u0005n\u0000\u0000\u03ab\u03ac\u0005d\u0000\u0000\u03ac\u009f"+ + "\u0001\u0000\u0000\u0000\u03ad\u03ae\u0005b\u0000\u0000\u03ae\u03af\u0005"+ + "r\u0000\u0000\u03af\u03b0\u0005e\u0000\u0000\u03b0\u03b1\u0005a\u0000"+ + "\u0000\u03b1\u03b2\u0005k\u0000\u0000\u03b2\u03b3\u0001\u0000\u0000\u0000"+ + "\u03b3\u03b4\u0006O\u0000\u0000\u03b4\u00a1\u0001\u0000\u0000\u0000\u03b5"+ + "\u03b6\u0005d\u0000\u0000\u03b6\u03b7\u0005e\u0000\u0000\u03b7\u03b8\u0005"+ + "f\u0000\u0000\u03b8\u03b9\u0005a\u0000\u0000\u03b9\u03ba\u0005u\u0000"+ + "\u0000\u03ba\u03bb\u0005l\u0000\u0000\u03bb\u03bc\u0005t\u0000\u0000\u03bc"+ + "\u00a3\u0001\u0000\u0000\u0000\u03bd\u03be\u0005f\u0000\u0000\u03be\u03bf"+ + "\u0005u\u0000\u0000\u03bf\u03c0\u0005n\u0000\u0000\u03c0\u03c1\u0005c"+ + "\u0000\u0000\u03c1\u00a5\u0001\u0000\u0000\u0000\u03c2\u03c3\u0005i\u0000"+ + "\u0000\u03c3\u03c4\u0005n\u0000\u0000\u03c4\u03c5\u0005t\u0000\u0000\u03c5"+ + "\u03c6\u0005e\u0000\u0000\u03c6\u03c7\u0005r\u0000\u0000\u03c7\u03c8\u0005"+ + "f\u0000\u0000\u03c8\u03c9\u0005a\u0000\u0000\u03c9\u03ca\u0005c\u0000"+ + "\u0000\u03ca\u03cb\u0005e\u0000\u0000\u03cb\u00a7\u0001\u0000\u0000\u0000"+ + "\u03cc\u03cd\u0005s\u0000\u0000\u03cd\u03ce\u0005e\u0000\u0000\u03ce\u03cf"+ + "\u0005l\u0000\u0000\u03cf\u03d0\u0005e\u0000\u0000\u03d0\u03d1\u0005c"+ + "\u0000\u0000\u03d1\u03d2\u0005t\u0000\u0000\u03d2\u00a9\u0001\u0000\u0000"+ + "\u0000\u03d3\u03d4\u0005c\u0000\u0000\u03d4\u03d5\u0005a\u0000\u0000\u03d5"+ + "\u03d6\u0005s\u0000\u0000\u03d6\u03d7\u0005e\u0000\u0000\u03d7\u00ab\u0001"+ + "\u0000\u0000\u0000\u03d8\u03d9\u0005d\u0000\u0000\u03d9\u03da\u0005e\u0000"+ + "\u0000\u03da\u03db\u0005f\u0000\u0000\u03db\u03dc\u0005e\u0000\u0000\u03dc"+ + "\u03dd\u0005r\u0000\u0000\u03dd\u00ad\u0001\u0000\u0000\u0000\u03de\u03df"+ + "\u0005g\u0000\u0000\u03df\u03e0\u0005o\u0000\u0000\u03e0\u00af\u0001\u0000"+ + "\u0000\u0000\u03e1\u03e2\u0005m\u0000\u0000\u03e2\u03e3\u0005a\u0000\u0000"+ + "\u03e3\u03e4\u0005p\u0000\u0000\u03e4\u00b1\u0001\u0000\u0000\u0000\u03e5"+ + "\u03e6\u0005s\u0000\u0000\u03e6\u03e7\u0005t\u0000\u0000\u03e7\u03e8\u0005"+ + "r\u0000\u0000\u03e8\u03e9\u0005u\u0000\u0000\u03e9\u03ea\u0005c\u0000"+ + "\u0000\u03ea\u03eb\u0005t\u0000\u0000\u03eb\u00b3\u0001\u0000\u0000\u0000"+ + "\u03ec\u03ed\u0005c\u0000\u0000\u03ed\u03ee\u0005h\u0000\u0000\u03ee\u03ef"+ + "\u0005a\u0000\u0000\u03ef\u03f0\u0005n\u0000\u0000\u03f0\u00b5\u0001\u0000"+ + "\u0000\u0000\u03f1\u03f2\u0005e\u0000\u0000\u03f2\u03f3\u0005l\u0000\u0000"+ + "\u03f3\u03f4\u0005s\u0000\u0000\u03f4\u03f5\u0005e\u0000\u0000\u03f5\u00b7"+ + "\u0001\u0000\u0000\u0000\u03f6\u03f7\u0005g\u0000\u0000\u03f7\u03f8\u0005"+ + "o\u0000\u0000\u03f8\u03f9\u0005t\u0000\u0000\u03f9\u03fa\u0005o\u0000"+ + "\u0000\u03fa\u00b9\u0001\u0000\u0000\u0000\u03fb\u03fc\u0005p\u0000\u0000"+ + "\u03fc\u03fd\u0005a\u0000\u0000\u03fd\u03fe\u0005c\u0000\u0000\u03fe\u03ff"+ + "\u0005k\u0000\u0000\u03ff\u0400\u0005a\u0000\u0000\u0400\u0401\u0005g"+ + "\u0000\u0000\u0401\u0402\u0005e\u0000\u0000\u0402\u00bb\u0001\u0000\u0000"+ + "\u0000\u0403\u0404\u0005s\u0000\u0000\u0404\u0405\u0005w\u0000\u0000\u0405"+ + "\u0406\u0005i\u0000\u0000\u0406\u0407\u0005t\u0000\u0000\u0407\u0408\u0005"+ + "c\u0000\u0000\u0408\u0409\u0005h\u0000\u0000\u0409\u00bd\u0001\u0000\u0000"+ + "\u0000\u040a\u040b\u0005c\u0000\u0000\u040b\u040c\u0005o\u0000\u0000\u040c"+ + "\u040d\u0005n\u0000\u0000\u040d\u040e\u0005s\u0000\u0000\u040e\u040f\u0005"+ + "t\u0000\u0000\u040f\u00bf\u0001\u0000\u0000\u0000\u0410\u0411\u0005f\u0000"+ + "\u0000\u0411\u0412\u0005a\u0000\u0000\u0412\u0413\u0005l\u0000\u0000\u0413"+ + "\u0414\u0005l\u0000\u0000\u0414\u0415\u0005t\u0000\u0000\u0415\u0416\u0005"+ + "h\u0000\u0000\u0416\u0417\u0005r\u0000\u0000\u0417\u0418\u0005o\u0000"+ + "\u0000\u0418\u0419\u0005u\u0000\u0000\u0419\u041a\u0005g\u0000\u0000\u041a"+ + "\u041b\u0005h\u0000\u0000\u041b\u041c\u0001\u0000\u0000\u0000\u041c\u041d"+ + "\u0006_\u0000\u0000\u041d\u00c1\u0001\u0000\u0000\u0000\u041e\u041f\u0005"+ + "i\u0000\u0000\u041f\u0420\u0005f\u0000\u0000\u0420\u00c3\u0001\u0000\u0000"+ + "\u0000\u0421\u0422\u0005r\u0000\u0000\u0422\u0423\u0005a\u0000\u0000\u0423"+ + "\u0424\u0005n\u0000\u0000\u0424\u0425\u0005g\u0000\u0000\u0425\u0426\u0005"+ + "e\u0000\u0000\u0426\u00c5\u0001\u0000\u0000\u0000\u0427\u0428\u0005t\u0000"+ + "\u0000\u0428\u0429\u0005y\u0000\u0000\u0429\u042a\u0005p\u0000\u0000\u042a"+ + "\u042b\u0005e\u0000\u0000\u042b\u00c7\u0001\u0000\u0000\u0000\u042c\u042d"+ + "\u0005c\u0000\u0000\u042d\u042e\u0005o\u0000\u0000\u042e\u042f\u0005n"+ + "\u0000\u0000\u042f\u0430\u0005t\u0000\u0000\u0430\u0431\u0005i\u0000\u0000"+ + "\u0431\u0432\u0005n\u0000\u0000\u0432\u0433\u0005u\u0000\u0000\u0433\u0434"+ + "\u0005e\u0000\u0000\u0434\u0435\u0001\u0000\u0000\u0000\u0435\u0436\u0006"+ + "c\u0000\u0000\u0436\u00c9\u0001\u0000\u0000\u0000\u0437\u0438\u0005f\u0000"+ + "\u0000\u0438\u0439\u0005o\u0000\u0000\u0439\u043a\u0005r\u0000\u0000\u043a"+ + "\u00cb\u0001\u0000\u0000\u0000\u043b\u043c\u0005i\u0000\u0000\u043c\u043d"+ + "\u0005m\u0000\u0000\u043d\u043e\u0005p\u0000\u0000\u043e\u043f\u0005o"+ + "\u0000\u0000\u043f\u0440\u0005r\u0000\u0000\u0440\u0441\u0005t\u0000\u0000"+ + "\u0441\u00cd\u0001\u0000\u0000\u0000\u0442\u0443\u0005r\u0000\u0000\u0443"+ + "\u0444\u0005e\u0000\u0000\u0444\u0445\u0005t\u0000\u0000\u0445\u0446\u0005"+ + "u\u0000\u0000\u0446\u0447\u0005r\u0000\u0000\u0447\u0448\u0005n\u0000"+ + "\u0000\u0448\u0449\u0001\u0000\u0000\u0000\u0449\u044a\u0006f\u0000\u0000"+ + "\u044a\u00cf\u0001\u0000\u0000\u0000\u044b\u044c\u0005v\u0000\u0000\u044c"+ + "\u044d\u0005a\u0000\u0000\u044d\u044e\u0005r\u0000\u0000\u044e\u00d1\u0001"+ + "\u0000\u0000\u0000\u044f\u0450\u0005n\u0000\u0000\u0450\u0451\u0005i\u0000"+ + "\u0000\u0451\u0452\u0005l\u0000\u0000\u0452\u0453\u0001\u0000\u0000\u0000"+ + "\u0453\u0454\u0006h\u0000\u0000\u0454\u00d3\u0001\u0000\u0000\u0000\u0455"+ + "\u045a\u0003\u0156\u00aa\u0000\u0456\u0459\u0003\u0156\u00aa\u0000\u0457"+ + "\u0459\u0003\u0158\u00ab\u0000\u0458\u0456\u0001\u0000\u0000\u0000\u0458"+ + "\u0457\u0001\u0000\u0000\u0000\u0459\u045c\u0001\u0000\u0000\u0000\u045a"+ + "\u0458\u0001\u0000\u0000\u0000\u045a\u045b\u0001\u0000\u0000\u0000\u045b"+ + "\u045d\u0001\u0000\u0000\u0000\u045c\u045a\u0001\u0000\u0000\u0000\u045d"+ + "\u045e\u0006i\u0000\u0000\u045e\u00d5\u0001\u0000\u0000\u0000\u045f\u0460"+ + "\u0005(\u0000\u0000\u0460\u00d7\u0001\u0000\u0000\u0000\u0461\u0462\u0005"+ + ")\u0000\u0000\u0462\u0463\u0001\u0000\u0000\u0000\u0463\u0464\u0006k\u0000"+ + "\u0000\u0464\u00d9\u0001\u0000\u0000\u0000\u0465\u0466\u0005{\u0000\u0000"+ + "\u0466\u00db\u0001\u0000\u0000\u0000\u0467\u0468\u0005}\u0000\u0000\u0468"+ + "\u0469\u0001\u0000\u0000\u0000\u0469\u046a\u0006m\u0000\u0000\u046a\u00dd"+ + "\u0001\u0000\u0000\u0000\u046b\u046c\u0005[\u0000\u0000\u046c\u00df\u0001"+ + "\u0000\u0000\u0000\u046d\u046e\u0005]\u0000\u0000\u046e\u046f\u0001\u0000"+ + "\u0000\u0000\u046f\u0470\u0006o\u0000\u0000\u0470\u00e1\u0001\u0000\u0000"+ + "\u0000\u0471\u0472\u0005=\u0000\u0000\u0472\u00e3\u0001\u0000\u0000\u0000"+ + "\u0473\u0474\u0005,\u0000\u0000\u0474\u00e5\u0001\u0000\u0000\u0000\u0475"+ + "\u0476\u0005;\u0000\u0000\u0476\u00e7\u0001\u0000\u0000\u0000\u0477\u0478"+ + "\u0005:\u0000\u0000\u0478\u00e9\u0001\u0000\u0000\u0000\u0479\u047a\u0005"+ + ".\u0000\u0000\u047a\u00eb\u0001\u0000\u0000\u0000\u047b\u047c\u0005+\u0000"+ + "\u0000\u047c\u047d\u0005+\u0000\u0000\u047d\u047e\u0001\u0000\u0000\u0000"+ + "\u047e\u047f\u0006u\u0000\u0000\u047f\u00ed\u0001\u0000\u0000\u0000\u0480"+ + "\u0481\u0005-\u0000\u0000\u0481\u0482\u0005-\u0000\u0000\u0482\u0483\u0001"+ + "\u0000\u0000\u0000\u0483\u0484\u0006v\u0000\u0000\u0484\u00ef\u0001\u0000"+ + "\u0000\u0000\u0485\u0486\u0005:\u0000\u0000\u0486\u0487\u0005=\u0000\u0000"+ + "\u0487\u00f1\u0001\u0000\u0000\u0000\u0488\u0489\u0005.\u0000\u0000\u0489"+ + "\u048a\u0005.\u0000\u0000\u048a\u048b\u0005.\u0000\u0000\u048b\u00f3\u0001"+ + "\u0000\u0000\u0000\u048c\u048d\u0005|\u0000\u0000\u048d\u048e\u0005|\u0000"+ + "\u0000\u048e\u00f5\u0001\u0000\u0000\u0000\u048f\u0490\u0005&\u0000\u0000"+ + "\u0490\u0491\u0005&\u0000\u0000\u0491\u00f7\u0001\u0000\u0000\u0000\u0492"+ + "\u0493\u0005=\u0000\u0000\u0493\u0494\u0005=\u0000\u0000\u0494\u00f9\u0001"+ + "\u0000\u0000\u0000\u0495\u0496\u0005!\u0000\u0000\u0496\u0497\u0005=\u0000"+ + "\u0000\u0497\u00fb\u0001\u0000\u0000\u0000\u0498\u0499\u0005<\u0000\u0000"+ + "\u0499\u00fd\u0001\u0000\u0000\u0000\u049a\u049b\u0005<\u0000\u0000\u049b"+ + "\u049c\u0005=\u0000\u0000\u049c\u00ff\u0001\u0000\u0000\u0000\u049d\u049e"+ + "\u0005>\u0000\u0000\u049e\u0101\u0001\u0000\u0000\u0000\u049f\u04a0\u0005"+ + ">\u0000\u0000\u04a0\u04a1\u0005=\u0000\u0000\u04a1\u0103\u0001\u0000\u0000"+ + "\u0000\u04a2\u04a3\u0005|\u0000\u0000\u04a3\u0105\u0001\u0000\u0000\u0000"+ + "\u04a4\u04a5\u0005/\u0000\u0000\u04a5\u0107\u0001\u0000\u0000\u0000\u04a6"+ + "\u04a7\u0005%\u0000\u0000\u04a7\u0109\u0001\u0000\u0000\u0000\u04a8\u04a9"+ + "\u0005<\u0000\u0000\u04a9\u04aa\u0005<\u0000\u0000\u04aa\u010b\u0001\u0000"+ + "\u0000\u0000\u04ab\u04ac\u0005>\u0000\u0000\u04ac\u04ad\u0005>\u0000\u0000"+ + "\u04ad\u010d\u0001\u0000\u0000\u0000\u04ae\u04af\u0005&\u0000\u0000\u04af"+ + "\u04b0\u0005^\u0000\u0000\u04b0\u010f\u0001\u0000\u0000\u0000\u04b1\u04b2"+ + "\u0005!\u0000\u0000\u04b2\u0111\u0001\u0000\u0000\u0000\u04b3\u04b4\u0005"+ + "+\u0000\u0000\u04b4\u0113\u0001\u0000\u0000\u0000\u04b5\u04b6\u0005-\u0000"+ + "\u0000\u04b6\u0115\u0001\u0000\u0000\u0000\u04b7\u04b8\u0005^\u0000\u0000"+ + "\u04b8\u0117\u0001\u0000\u0000\u0000\u04b9\u04ba\u0005*\u0000\u0000\u04ba"+ + "\u0119\u0001\u0000\u0000\u0000\u04bb\u04bc\u0005&\u0000\u0000\u04bc\u011b"+ + "\u0001\u0000\u0000\u0000\u04bd\u04be\u0005<\u0000\u0000\u04be\u04bf\u0005"+ + "-\u0000\u0000\u04bf\u011d\u0001\u0000\u0000\u0000\u04c0\u04cc\u00050\u0000"+ + "\u0000\u04c1\u04c8\u0007\u0000\u0000\u0000\u04c2\u04c4\u0005_\u0000\u0000"+ + "\u04c3\u04c2\u0001\u0000\u0000\u0000\u04c3\u04c4\u0001\u0000\u0000\u0000"+ + "\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c7\u0007\u0001\u0000\u0000"+ + "\u04c6\u04c3\u0001\u0000\u0000\u0000\u04c7\u04ca\u0001\u0000\u0000\u0000"+ + "\u04c8\u04c6\u0001\u0000\u0000\u0000\u04c8\u04c9\u0001\u0000\u0000\u0000"+ + "\u04c9\u04cc\u0001\u0000\u0000\u0000\u04ca\u04c8\u0001\u0000\u0000\u0000"+ + "\u04cb\u04c0\u0001\u0000\u0000\u0000\u04cb\u04c1\u0001\u0000\u0000\u0000"+ + "\u04cc\u04cd\u0001\u0000\u0000\u0000\u04cd\u04ce\u0006\u008e\u0000\u0000"+ + "\u04ce\u011f\u0001\u0000\u0000\u0000\u04cf\u04d0\u00050\u0000\u0000\u04d0"+ + "\u04d5\u0007\u0002\u0000\u0000\u04d1\u04d3\u0005_\u0000\u0000\u04d2\u04d1"+ + "\u0001\u0000\u0000\u0000\u04d2\u04d3\u0001\u0000\u0000\u0000\u04d3\u04d4"+ + "\u0001\u0000\u0000\u0000\u04d4\u04d6\u0003\u0152\u00a8\u0000\u04d5\u04d2"+ + "\u0001\u0000\u0000\u0000\u04d6\u04d7\u0001\u0000\u0000\u0000\u04d7\u04d5"+ + "\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001\u0000\u0000\u0000\u04d8\u04d9"+ + "\u0001\u0000\u0000\u0000\u04d9\u04da\u0006\u008f\u0000\u0000\u04da\u0121"+ + "\u0001\u0000\u0000\u0000\u04db\u04dd\u00050\u0000\u0000\u04dc\u04de\u0007"+ + "\u0003\u0000\u0000\u04dd\u04dc\u0001\u0000\u0000\u0000\u04dd\u04de\u0001"+ + "\u0000\u0000\u0000\u04de\u04e3\u0001\u0000\u0000\u0000\u04df\u04e1\u0005"+ + "_\u0000\u0000\u04e0\u04df\u0001\u0000\u0000\u0000\u04e0\u04e1\u0001\u0000"+ + "\u0000\u0000\u04e1\u04e2\u0001\u0000\u0000\u0000\u04e2\u04e4\u0003\u014e"+ + "\u00a6\u0000\u04e3\u04e0\u0001\u0000\u0000\u0000\u04e4\u04e5\u0001\u0000"+ + "\u0000\u0000\u04e5\u04e3\u0001\u0000\u0000\u0000\u04e5\u04e6\u0001\u0000"+ + "\u0000\u0000\u04e6\u04e7\u0001\u0000\u0000\u0000\u04e7\u04e8\u0006\u0090"+ + "\u0000\u0000\u04e8\u0123\u0001\u0000\u0000\u0000\u04e9\u04ea\u00050\u0000"+ + "\u0000\u04ea\u04ef\u0007\u0004\u0000\u0000\u04eb\u04ed\u0005_\u0000\u0000"+ + "\u04ec\u04eb\u0001\u0000\u0000\u0000\u04ec\u04ed\u0001\u0000\u0000\u0000"+ + "\u04ed\u04ee\u0001\u0000\u0000\u0000\u04ee\u04f0\u0003\u0150\u00a7\u0000"+ + "\u04ef\u04ec\u0001\u0000\u0000\u0000\u04f0\u04f1\u0001\u0000\u0000\u0000"+ + "\u04f1\u04ef\u0001\u0000\u0000\u0000\u04f1\u04f2\u0001\u0000\u0000\u0000"+ + "\u04f2\u04f3\u0001\u0000\u0000\u0000\u04f3\u04f4\u0006\u0091\u0000\u0000"+ + "\u04f4\u0125\u0001\u0000\u0000\u0000\u04f5\u04f6\u00050\u0000\u0000\u04f6"+ + "\u04f7\u0007\u0004\u0000\u0000\u04f7\u04f8\u0003\u0128\u0093\u0000\u04f8"+ + "\u04f9\u0003\u012a\u0094\u0000\u04f9\u0127\u0001\u0000\u0000\u0000\u04fa"+ + "\u04fc\u0005_\u0000\u0000\u04fb\u04fa\u0001\u0000\u0000\u0000\u04fb\u04fc"+ + "\u0001\u0000\u0000\u0000\u04fc\u04fd\u0001\u0000\u0000\u0000\u04fd\u04ff"+ + "\u0003\u0150\u00a7\u0000\u04fe\u04fb\u0001\u0000\u0000\u0000\u04ff\u0500"+ + "\u0001\u0000\u0000\u0000\u0500\u04fe\u0001\u0000\u0000\u0000\u0500\u0501"+ + "\u0001\u0000\u0000\u0000\u0501\u050c\u0001\u0000\u0000\u0000\u0502\u0509"+ + "\u0005.\u0000\u0000\u0503\u0505\u0005_\u0000\u0000\u0504\u0503\u0001\u0000"+ + "\u0000\u0000\u0504\u0505\u0001\u0000\u0000\u0000\u0505\u0506\u0001\u0000"+ + "\u0000\u0000\u0506\u0508\u0003\u0150\u00a7\u0000\u0507\u0504\u0001\u0000"+ + "\u0000\u0000\u0508\u050b\u0001\u0000\u0000\u0000\u0509\u0507\u0001\u0000"+ + "\u0000\u0000\u0509\u050a\u0001\u0000\u0000\u0000\u050a\u050d\u0001\u0000"+ + "\u0000\u0000\u050b\u0509\u0001\u0000\u0000\u0000\u050c\u0502\u0001\u0000"+ + "\u0000\u0000\u050c\u050d\u0001\u0000\u0000\u0000\u050d\u051a\u0001\u0000"+ + "\u0000\u0000\u050e\u050f\u0005.\u0000\u0000\u050f\u0516\u0003\u0150\u00a7"+ + "\u0000\u0510\u0512\u0005_\u0000\u0000\u0511\u0510\u0001\u0000\u0000\u0000"+ + "\u0511\u0512\u0001\u0000\u0000\u0000\u0512\u0513\u0001\u0000\u0000\u0000"+ + "\u0513\u0515\u0003\u0150\u00a7\u0000\u0514\u0511\u0001\u0000\u0000\u0000"+ + "\u0515\u0518\u0001\u0000\u0000\u0000\u0516\u0514\u0001\u0000\u0000\u0000"+ + "\u0516\u0517\u0001\u0000\u0000\u0000\u0517\u051a\u0001\u0000\u0000\u0000"+ + "\u0518\u0516\u0001\u0000\u0000\u0000\u0519\u04fe\u0001\u0000\u0000\u0000"+ + "\u0519\u050e\u0001\u0000\u0000\u0000\u051a\u0129\u0001\u0000\u0000\u0000"+ + "\u051b\u051d\u0007\u0005\u0000\u0000\u051c\u051e\u0007\u0006\u0000\u0000"+ + "\u051d\u051c\u0001\u0000\u0000\u0000\u051d\u051e\u0001\u0000\u0000\u0000"+ + "\u051e\u051f\u0001\u0000\u0000\u0000\u051f\u0520\u0003\u014c\u00a5\u0000"+ + "\u0520\u012b\u0001\u0000\u0000\u0000\u0521\u0527\u0003\u011e\u008e\u0000"+ + "\u0522\u0527\u0003\u0120\u008f\u0000\u0523\u0527\u0003\u0122\u0090\u0000"+ + "\u0524\u0527\u0003\u0124\u0091\u0000\u0525\u0527\u0003\u0002\u0000\u0000"+ + "\u0526\u0521\u0001\u0000\u0000\u0000\u0526\u0522\u0001\u0000\u0000\u0000"+ + "\u0526\u0523\u0001\u0000\u0000\u0000\u0526\u0524\u0001\u0000\u0000\u0000"+ + "\u0526\u0525\u0001\u0000\u0000\u0000\u0527\u0528\u0001\u0000\u0000\u0000"+ + "\u0528\u0529\u0005i\u0000\u0000\u0529\u052a\u0001\u0000\u0000\u0000\u052a"+ + "\u052b\u0006\u0095\u0000\u0000\u052b\u012d\u0001\u0000\u0000\u0000\u052c"+ + "\u052f\u0005\'\u0000\u0000\u052d\u0530\u0003\u0148\u00a3\u0000\u052e\u0530"+ + "\u0003\u0132\u0098\u0000\u052f\u052d\u0001\u0000\u0000\u0000\u052f\u052e"+ + "\u0001\u0000\u0000\u0000\u0530\u0531\u0001\u0000\u0000\u0000\u0531\u0532"+ + "\u0005\'\u0000\u0000\u0532\u012f\u0001\u0000\u0000\u0000\u0533\u0534\u0003"+ + "\u012e\u0096\u0000\u0534\u0535\u0001\u0000\u0000\u0000\u0535\u0536\u0006"+ + "\u0097\u0000\u0000\u0536\u0131\u0001\u0000\u0000\u0000\u0537\u053a\u0003"+ + "\u0134\u0099\u0000\u0538\u053a\u0003\u0136\u009a\u0000\u0539\u0537\u0001"+ + "\u0000\u0000\u0000\u0539\u0538\u0001\u0000\u0000\u0000\u053a\u0133\u0001"+ + "\u0000\u0000\u0000\u053b\u053c\u0005\\\u0000\u0000\u053c\u053d\u0003\u014e"+ + "\u00a6\u0000\u053d\u053e\u0003\u014e\u00a6\u0000\u053e\u053f\u0003\u014e"+ + "\u00a6\u0000\u053f\u0135\u0001\u0000\u0000\u0000\u0540\u0541\u0005\\\u0000"+ + "\u0000\u0541\u0542\u0005x\u0000\u0000\u0542\u0543\u0003\u0150\u00a7\u0000"+ + "\u0543\u0544\u0003\u0150\u00a7\u0000\u0544\u0137\u0001\u0000\u0000\u0000"+ + "\u0545\u0546\u0005\\\u0000\u0000\u0546\u0547\u0005u\u0000\u0000\u0547"+ + "\u0548\u0003\u0150\u00a7\u0000\u0548\u0549\u0003\u0150\u00a7\u0000\u0549"+ + "\u054a\u0003\u0150\u00a7\u0000\u054a\u054b\u0003\u0150\u00a7\u0000\u054b"+ + "\u0139\u0001\u0000\u0000\u0000\u054c\u054d\u0005\\\u0000\u0000\u054d\u054e"+ + "\u0005U\u0000\u0000\u054e\u054f\u0003\u0150\u00a7\u0000\u054f\u0550\u0003"+ + "\u0150\u00a7\u0000\u0550\u0551\u0003\u0150\u00a7\u0000\u0551\u0552\u0003"+ + "\u0150\u00a7\u0000\u0552\u0553\u0003\u0150\u00a7\u0000\u0553\u0554\u0003"+ + "\u0150\u00a7\u0000\u0554\u0555\u0003\u0150\u00a7\u0000\u0555\u0556\u0003"+ + "\u0150\u00a7\u0000\u0556\u013b\u0001\u0000\u0000\u0000\u0557\u055b\u0005"+ + "`\u0000\u0000\u0558\u055a\b\u0007\u0000\u0000\u0559\u0558\u0001\u0000"+ + "\u0000\u0000\u055a\u055d\u0001\u0000\u0000\u0000\u055b\u0559\u0001\u0000"+ + "\u0000\u0000\u055b\u055c\u0001\u0000\u0000\u0000\u055c\u055e\u0001\u0000"+ + "\u0000\u0000\u055d\u055b\u0001\u0000\u0000\u0000\u055e\u055f\u0005`\u0000"+ + "\u0000\u055f\u0560\u0001\u0000\u0000\u0000\u0560\u0561\u0006\u009d\u0000"+ + "\u0000\u0561\u013d\u0001\u0000\u0000\u0000\u0562\u0567\u0005\"\u0000\u0000"+ + "\u0563\u0566\b\b\u0000\u0000\u0564\u0566\u0003\u014a\u00a4\u0000\u0565"+ + "\u0563\u0001\u0000\u0000\u0000\u0565\u0564\u0001\u0000\u0000\u0000\u0566"+ + "\u0569\u0001\u0000\u0000\u0000\u0567\u0565\u0001\u0000\u0000\u0000\u0567"+ + "\u0568\u0001\u0000\u0000\u0000\u0568\u056a\u0001\u0000\u0000\u0000\u0569"+ + "\u0567\u0001\u0000\u0000\u0000\u056a\u056b\u0005\"\u0000\u0000\u056b\u056c"+ + "\u0001\u0000\u0000\u0000\u056c\u056d\u0006\u009e\u0000\u0000\u056d\u013f"+ + "\u0001\u0000\u0000\u0000\u056e\u0570\u0007\t\u0000\u0000\u056f\u056e\u0001"+ + "\u0000\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u056f\u0001"+ + "\u0000\u0000\u0000\u0571\u0572\u0001\u0000\u0000\u0000\u0572\u0573\u0001"+ + "\u0000\u0000\u0000\u0573\u0574\u0006\u009f\u0001\u0000\u0574\u0141\u0001"+ + "\u0000\u0000\u0000\u0575\u0576\u0005/\u0000\u0000\u0576\u0577\u0005*\u0000"+ + "\u0000\u0577\u057b\u0001\u0000\u0000\u0000\u0578\u057a\t\u0000\u0000\u0000"+ + "\u0579\u0578\u0001\u0000\u0000\u0000\u057a\u057d\u0001\u0000\u0000\u0000"+ + "\u057b\u057c\u0001\u0000\u0000\u0000\u057b\u0579\u0001\u0000\u0000\u0000"+ + "\u057c\u057e\u0001\u0000\u0000\u0000\u057d\u057b\u0001\u0000\u0000\u0000"+ + "\u057e\u057f\u0005*\u0000\u0000\u057f\u0580\u0005/\u0000\u0000\u0580\u0581"+ + "\u0001\u0000\u0000\u0000\u0581\u0582\u0006\u00a0\u0001\u0000\u0582\u0143"+ + "\u0001\u0000\u0000\u0000\u0583\u0585\u0007\n\u0000\u0000\u0584\u0583\u0001"+ + "\u0000\u0000\u0000\u0585\u0586\u0001\u0000\u0000\u0000\u0586\u0584\u0001"+ + "\u0000\u0000\u0000\u0586\u0587\u0001\u0000\u0000\u0000\u0587\u0588\u0001"+ + "\u0000\u0000\u0000\u0588\u0589\u0006\u00a1\u0001\u0000\u0589\u0145\u0001"+ + "\u0000\u0000\u0000\u058a\u058b\u0005/\u0000\u0000\u058b\u058c\u0005/\u0000"+ + "\u0000\u058c\u0590\u0001\u0000\u0000\u0000\u058d\u058f\b\n\u0000\u0000"+ + "\u058e\u058d\u0001\u0000\u0000\u0000\u058f\u0592\u0001\u0000\u0000\u0000"+ + "\u0590\u058e\u0001\u0000\u0000\u0000\u0590\u0591\u0001\u0000\u0000\u0000"+ + "\u0591\u0593\u0001\u0000\u0000\u0000\u0592\u0590\u0001\u0000\u0000\u0000"+ + "\u0593\u0594\u0006\u00a2\u0001\u0000\u0594\u0147\u0001\u0000\u0000\u0000"+ + "\u0595\u059a\b\u000b\u0000\u0000\u0596\u059a\u0003\u0138\u009b\u0000\u0597"+ + "\u059a\u0003\u013a\u009c\u0000\u0598\u059a\u0003\u014a\u00a4\u0000\u0599"+ + "\u0595\u0001\u0000\u0000\u0000\u0599\u0596\u0001\u0000\u0000\u0000\u0599"+ + "\u0597\u0001\u0000\u0000\u0000\u0599\u0598\u0001\u0000\u0000\u0000\u059a"+ + "\u0149\u0001\u0000\u0000\u0000\u059b\u05b5\u0005\\\u0000\u0000\u059c\u059d"+ + "\u0005u\u0000\u0000\u059d\u059e\u0003\u0150\u00a7\u0000\u059e\u059f\u0003"+ + "\u0150\u00a7\u0000\u059f\u05a0\u0003\u0150\u00a7\u0000\u05a0\u05a1\u0003"+ + "\u0150\u00a7\u0000\u05a1\u05b6\u0001\u0000\u0000\u0000\u05a2\u05a3\u0005"+ + "U\u0000\u0000\u05a3\u05a4\u0003\u0150\u00a7\u0000\u05a4\u05a5\u0003\u0150"+ + "\u00a7\u0000\u05a5\u05a6\u0003\u0150\u00a7\u0000\u05a6\u05a7\u0003\u0150"+ + "\u00a7\u0000\u05a7\u05a8\u0003\u0150\u00a7\u0000\u05a8\u05a9\u0003\u0150"+ + "\u00a7\u0000\u05a9\u05aa\u0003\u0150\u00a7\u0000\u05aa\u05ab\u0003\u0150"+ + "\u00a7\u0000\u05ab\u05b6\u0001\u0000\u0000\u0000\u05ac\u05b6\u0007\f\u0000"+ + "\u0000\u05ad\u05ae\u0003\u014e\u00a6\u0000\u05ae\u05af\u0003\u014e\u00a6"+ + "\u0000\u05af\u05b0\u0003\u014e\u00a6\u0000\u05b0\u05b6\u0001\u0000\u0000"+ + "\u0000\u05b1\u05b2\u0005x\u0000\u0000\u05b2\u05b3\u0003\u0150\u00a7\u0000"+ + "\u05b3\u05b4\u0003\u0150\u00a7\u0000\u05b4\u05b6\u0001\u0000\u0000\u0000"+ + "\u05b5\u059c\u0001\u0000\u0000\u0000\u05b5\u05a2\u0001\u0000\u0000\u0000"+ + "\u05b5\u05ac\u0001\u0000\u0000\u0000\u05b5\u05ad\u0001\u0000\u0000\u0000"+ + "\u05b5\u05b1\u0001\u0000\u0000\u0000\u05b6\u014b\u0001\u0000\u0000\u0000"+ + "\u05b7\u05be\u0007\u0001\u0000\u0000\u05b8\u05ba\u0005_\u0000\u0000\u05b9"+ + "\u05b8\u0001\u0000\u0000\u0000\u05b9\u05ba\u0001\u0000\u0000\u0000\u05ba"+ + "\u05bb\u0001\u0000\u0000\u0000\u05bb\u05bd\u0007\u0001\u0000\u0000\u05bc"+ + "\u05b9\u0001\u0000\u0000\u0000\u05bd\u05c0\u0001\u0000\u0000\u0000\u05be"+ + "\u05bc\u0001\u0000\u0000\u0000\u05be\u05bf\u0001\u0000\u0000\u0000\u05bf"+ + "\u014d\u0001\u0000\u0000\u0000\u05c0\u05be\u0001\u0000\u0000\u0000\u05c1"+ + "\u05c2\u0007\r\u0000\u0000\u05c2\u014f\u0001\u0000\u0000\u0000\u05c3\u05c4"+ + "\u0007\u000e\u0000\u0000\u05c4\u0151\u0001\u0000\u0000\u0000\u05c5\u05c6"+ + "\u0007\u000f\u0000\u0000\u05c6\u0153\u0001\u0000\u0000\u0000\u05c7\u05c9"+ + "\u0007\u0010\u0000\u0000\u05c8\u05ca\u0007\u0006\u0000\u0000\u05c9\u05c8"+ + "\u0001\u0000\u0000\u0000\u05c9\u05ca\u0001\u0000\u0000\u0000\u05ca\u05cb"+ + "\u0001\u0000\u0000\u0000\u05cb\u05cc\u0003\u014c\u00a5\u0000\u05cc\u0155"+ + "\u0001\u0000\u0000\u0000\u05cd\u05d0\u0003\u015a\u00ac\u0000\u05ce\u05d0"+ + "\u0005_\u0000\u0000\u05cf\u05cd\u0001\u0000\u0000\u0000\u05cf\u05ce\u0001"+ + "\u0000\u0000\u0000\u05d0\u0157\u0001\u0000\u0000\u0000\u05d1\u05d2\u0007"+ + "\u0011\u0000\u0000\u05d2\u0159\u0001\u0000\u0000\u0000\u05d3\u05d4\u0007"+ + "\u0012\u0000\u0000\u05d4\u015b\u0001\u0000\u0000\u0000\u05d5\u05d7\u0007"+ + "\t\u0000\u0000\u05d6\u05d5\u0001\u0000\u0000\u0000\u05d7\u05d8\u0001\u0000"+ + "\u0000\u0000\u05d8\u05d6\u0001\u0000\u0000\u0000\u05d8\u05d9\u0001\u0000"+ + "\u0000\u0000\u05d9\u05da\u0001\u0000\u0000\u0000\u05da\u05db\u0006\u00ad"+ + "\u0001\u0000\u05db\u015d\u0001\u0000\u0000\u0000\u05dc\u05dd\u0005/\u0000"+ + "\u0000\u05dd\u05de\u0005*\u0000\u0000\u05de\u05e2\u0001\u0000\u0000\u0000"+ + "\u05df\u05e1\b\n\u0000\u0000\u05e0\u05df\u0001\u0000\u0000\u0000\u05e1"+ + "\u05e4\u0001\u0000\u0000\u0000\u05e2\u05e3\u0001\u0000\u0000\u0000\u05e2"+ + "\u05e0\u0001\u0000\u0000\u0000\u05e3\u05e5\u0001\u0000\u0000\u0000\u05e4"+ + "\u05e2\u0001\u0000\u0000\u0000\u05e5\u05e6\u0005*\u0000\u0000\u05e6\u05e7"+ + "\u0005/\u0000\u0000\u05e7\u05e8\u0001\u0000\u0000\u0000\u05e8\u05e9\u0006"+ + "\u00ae\u0001\u0000\u05e9\u015f\u0001\u0000\u0000\u0000\u05ea\u05eb\u0005"+ + "/\u0000\u0000\u05eb\u05ec\u0005/\u0000\u0000\u05ec\u05f0\u0001\u0000\u0000"+ + "\u0000\u05ed\u05ef\b\n\u0000\u0000\u05ee\u05ed\u0001\u0000\u0000\u0000"+ + "\u05ef\u05f2\u0001\u0000\u0000\u0000\u05f0\u05ee\u0001\u0000\u0000\u0000"+ + "\u05f0\u05f1\u0001\u0000\u0000\u0000\u05f1\u05f3\u0001\u0000\u0000\u0000"+ + "\u05f2\u05f0\u0001\u0000\u0000\u0000\u05f3\u05f4\u0006\u00af\u0001\u0000"+ + "\u05f4\u0161\u0001\u0000\u0000\u0000\u05f5\u05f7\u0007\n\u0000\u0000\u05f6"+ + "\u05f5\u0001\u0000\u0000\u0000\u05f7\u05f8\u0001\u0000\u0000\u0000\u05f8"+ + "\u05f6\u0001\u0000\u0000\u0000\u05f8\u05f9\u0001\u0000\u0000\u0000\u05f9"+ + "\u0608\u0001\u0000\u0000\u0000\u05fa\u0608\u0005;\u0000\u0000\u05fb\u05fc"+ + "\u0005/\u0000\u0000\u05fc\u05fd\u0005*\u0000\u0000\u05fd\u0601\u0001\u0000"+ + "\u0000\u0000\u05fe\u0600\t\u0000\u0000\u0000\u05ff\u05fe\u0001\u0000\u0000"+ + "\u0000\u0600\u0603\u0001\u0000\u0000\u0000\u0601\u0602\u0001\u0000\u0000"+ + "\u0000\u0601\u05ff\u0001\u0000\u0000\u0000\u0602\u0604\u0001\u0000\u0000"+ + "\u0000\u0603\u0601\u0001\u0000\u0000\u0000\u0604\u0605\u0005*\u0000\u0000"+ + "\u0605\u0608\u0005/\u0000\u0000\u0606\u0608\u0005\u0000\u0000\u0001\u0607"+ + "\u05f6\u0001\u0000\u0000\u0000\u0607\u05fa\u0001\u0000\u0000\u0000\u0607"+ + "\u05fb\u0001\u0000\u0000\u0000\u0607\u0606\u0001\u0000\u0000\u0000\u0608"+ + "\u0609\u0001\u0000\u0000\u0000\u0609\u060a\u0006\u00b0\u0002\u0000\u060a"+ + "\u0163\u0001\u0000\u0000\u0000\u060b\u060c\u0001\u0000\u0000\u0000\u060c"+ + "\u060d\u0001\u0000\u0000\u0000\u060d\u060e\u0006\u00b1\u0002\u0000\u060e"+ + "\u060f\u0006\u00b1\u0001\u0000\u060f\u0165\u0001\u0000\u0000\u00003\u0000"+ + "\u0001\u0168\u0170\u0173\u0176\u017c\u017e\u0458\u045a\u04c3\u04c8\u04cb"+ + "\u04d2\u04d7\u04dd\u04e0\u04e5\u04ec\u04f1\u04fb\u0500\u0504\u0509\u050c"+ + "\u0511\u0516\u0519\u051d\u0526\u052f\u0539\u055b\u0565\u0567\u0571\u057b"+ + "\u0586\u0590\u0599\u05b5\u05b9\u05be\u05c9\u05cf\u05d8\u05e2\u05f0\u05f8"+ + "\u0601\u0607\u0003\u0002\u0001\u0000\u0000\u0001\u0000\u0002\u0000\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 477e1d11c..4a7c5fd65 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -17,32 +17,33 @@ public class GobraParser extends GobraParserBase { protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache(); public static final int - FLOAT_LIT=1, DECIMAL_FLOAT_LIT=2, TRUE=3, FALSE=4, ASSERT=5, ASSUME=6, - INHALE=7, EXHALE=8, PRE=9, PRESERVES=10, POST=11, INV=12, DEC=13, PURE=14, - IMPL=15, AS=16, OLD=17, BEFORE=18, LHS=19, FORALL=20, EXISTS=21, ACCESS=22, - FOLD=23, UNFOLD=24, UNFOLDING=25, LET=26, GHOST=27, IN=28, MULTI=29, SUBSET=30, - UNION=31, INTERSECTION=32, SETMINUS=33, IMPLIES=34, WAND=35, APPLY=36, - QMARK=37, L_PRED=38, R_PRED=39, SEQ=40, SET=41, MSET=42, DICT=43, OPT=44, - GPOINTER=45, LEN=46, NEW=47, MAKE=48, CAP=49, SOME=50, GET=51, DOM=52, - AXIOM=53, ADT=54, MATCH=55, NONE=56, PRED=57, TYPE_OF=58, IS_COMPARABLE=59, - SHARE=60, ADDR_MOD=61, DOT_DOT=62, SHARED=63, EXCLUSIVE=64, PREDICATE=65, - WRITEPERM=66, NOPERM=67, TRUSTED=68, OUTLINE=69, INIT_POST=70, IMPORT_PRE=71, - PROOF=72, GHOST_EQUALS=73, GHOST_NOT_EQUALS=74, WITH=75, OPAQUE=76, REVEAL=77, - BACKEND=78, BREAK=79, DEFAULT=80, FUNC=81, INTERFACE=82, SELECT=83, CASE=84, - DEFER=85, GO=86, MAP=87, STRUCT=88, CHAN=89, ELSE=90, GOTO=91, PACKAGE=92, - SWITCH=93, CONST=94, FALLTHROUGH=95, IF=96, RANGE=97, TYPE=98, CONTINUE=99, - FOR=100, IMPORT=101, RETURN=102, VAR=103, NIL_LIT=104, IDENTIFIER=105, - L_PAREN=106, R_PAREN=107, L_CURLY=108, R_CURLY=109, L_BRACKET=110, R_BRACKET=111, - ASSIGN=112, COMMA=113, SEMI=114, COLON=115, DOT=116, PLUS_PLUS=117, MINUS_MINUS=118, - DECLARE_ASSIGN=119, ELLIPSIS=120, LOGICAL_OR=121, LOGICAL_AND=122, EQUALS=123, - NOT_EQUALS=124, LESS=125, LESS_OR_EQUALS=126, GREATER=127, GREATER_OR_EQUALS=128, - OR=129, DIV=130, MOD=131, LSHIFT=132, RSHIFT=133, BIT_CLEAR=134, EXCLAMATION=135, - PLUS=136, MINUS=137, CARET=138, STAR=139, AMPERSAND=140, RECEIVE=141, - DECIMAL_LIT=142, BINARY_LIT=143, OCTAL_LIT=144, HEX_LIT=145, HEX_FLOAT_LIT=146, - IMAGINARY_LIT=147, RUNE_LIT=148, BYTE_VALUE=149, OCTAL_BYTE_VALUE=150, - HEX_BYTE_VALUE=151, LITTLE_U_VALUE=152, BIG_U_VALUE=153, RAW_STRING_LIT=154, - INTERPRETED_STRING_LIT=155, WS=156, COMMENT=157, TERMINATOR=158, LINE_COMMENT=159, - WS_NLSEMI=160, COMMENT_NLSEMI=161, LINE_COMMENT_NLSEMI=162, EOS=163, OTHER=164; + FLOAT_LIT=1, DECIMAL_FLOAT_LIT=2, TRUE=3, FALSE=4, ASSERT=5, REFUTE=6, + ASSUME=7, INHALE=8, EXHALE=9, PRE=10, PRESERVES=11, POST=12, INV=13, DEC=14, + PURE=15, IMPL=16, AS=17, OLD=18, BEFORE=19, LHS=20, FORALL=21, EXISTS=22, + ACCESS=23, FOLD=24, UNFOLD=25, UNFOLDING=26, LET=27, GHOST=28, IN=29, + MULTI=30, SUBSET=31, UNION=32, INTERSECTION=33, SETMINUS=34, IMPLIES=35, + WAND=36, APPLY=37, QMARK=38, L_PRED=39, R_PRED=40, SEQ=41, SET=42, MSET=43, + DICT=44, OPT=45, GPOINTER=46, LEN=47, NEW=48, MAKE=49, CAP=50, SOME=51, + GET=52, DOM=53, AXIOM=54, ADT=55, MATCH=56, NONE=57, PRED=58, TYPE_OF=59, + IS_COMPARABLE=60, SHARE=61, ADDR_MOD=62, DOT_DOT=63, SHARED=64, EXCLUSIVE=65, + PREDICATE=66, WRITEPERM=67, NOPERM=68, TRUSTED=69, OUTLINE=70, INIT_POST=71, + IMPORT_PRE=72, PROOF=73, GHOST_EQUALS=74, GHOST_NOT_EQUALS=75, WITH=76, + OPAQUE=77, REVEAL=78, BACKEND=79, BREAK=80, DEFAULT=81, FUNC=82, INTERFACE=83, + SELECT=84, CASE=85, DEFER=86, GO=87, MAP=88, STRUCT=89, CHAN=90, ELSE=91, + GOTO=92, PACKAGE=93, SWITCH=94, CONST=95, FALLTHROUGH=96, IF=97, RANGE=98, + TYPE=99, CONTINUE=100, FOR=101, IMPORT=102, RETURN=103, VAR=104, NIL_LIT=105, + IDENTIFIER=106, L_PAREN=107, R_PAREN=108, L_CURLY=109, R_CURLY=110, L_BRACKET=111, + R_BRACKET=112, ASSIGN=113, COMMA=114, SEMI=115, COLON=116, DOT=117, PLUS_PLUS=118, + MINUS_MINUS=119, DECLARE_ASSIGN=120, ELLIPSIS=121, LOGICAL_OR=122, LOGICAL_AND=123, + EQUALS=124, NOT_EQUALS=125, LESS=126, LESS_OR_EQUALS=127, GREATER=128, + GREATER_OR_EQUALS=129, OR=130, DIV=131, MOD=132, LSHIFT=133, RSHIFT=134, + BIT_CLEAR=135, EXCLAMATION=136, PLUS=137, MINUS=138, CARET=139, STAR=140, + AMPERSAND=141, RECEIVE=142, DECIMAL_LIT=143, BINARY_LIT=144, OCTAL_LIT=145, + HEX_LIT=146, HEX_FLOAT_LIT=147, IMAGINARY_LIT=148, RUNE_LIT=149, BYTE_VALUE=150, + OCTAL_BYTE_VALUE=151, HEX_BYTE_VALUE=152, LITTLE_U_VALUE=153, BIG_U_VALUE=154, + RAW_STRING_LIT=155, INTERPRETED_STRING_LIT=156, WS=157, COMMENT=158, TERMINATOR=159, + LINE_COMMENT=160, WS_NLSEMI=161, COMMENT_NLSEMI=162, LINE_COMMENT_NLSEMI=163, + EOS=164, OTHER=165; public static final int RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3, RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_preamble = 6, @@ -146,8 +147,8 @@ private static String[] makeRuleNames() { private static String[] makeLiteralNames() { return new String[] { - null, null, null, "'true'", "'false'", "'assert'", "'assume'", "'inhale'", - "'exhale'", "'requires'", "'preserves'", "'ensures'", "'invariant'", + null, null, null, "'true'", "'false'", "'assert'", "'refute'", "'assume'", + "'inhale'", "'exhale'", "'requires'", "'preserves'", "'ensures'", "'invariant'", "'decreases'", "'pure'", "'implements'", "'as'", "'old'", "'before'", "'#lhs'", "'forall'", "'exists'", "'acc'", "'fold'", "'unfold'", "'unfolding'", "'let'", "'ghost'", "'in'", "'#'", "'subset'", "'union'", "'intersection'", @@ -171,16 +172,16 @@ private static String[] makeLiteralNames() { private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { - null, "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "TRUE", "FALSE", "ASSERT", "ASSUME", - "INHALE", "EXHALE", "PRE", "PRESERVES", "POST", "INV", "DEC", "PURE", - "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", "FOLD", - "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", "UNION", - "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", "L_PRED", - "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "GPOINTER", "LEN", "NEW", - "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", "NONE", - "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", - "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", - "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", + null, "FLOAT_LIT", "DECIMAL_FLOAT_LIT", "TRUE", "FALSE", "ASSERT", "REFUTE", + "ASSUME", "INHALE", "EXHALE", "PRE", "PRESERVES", "POST", "INV", "DEC", + "PURE", "IMPL", "AS", "OLD", "BEFORE", "LHS", "FORALL", "EXISTS", "ACCESS", + "FOLD", "UNFOLD", "UNFOLDING", "LET", "GHOST", "IN", "MULTI", "SUBSET", + "UNION", "INTERSECTION", "SETMINUS", "IMPLIES", "WAND", "APPLY", "QMARK", + "L_PRED", "R_PRED", "SEQ", "SET", "MSET", "DICT", "OPT", "GPOINTER", + "LEN", "NEW", "MAKE", "CAP", "SOME", "GET", "DOM", "AXIOM", "ADT", "MATCH", + "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", + "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", + "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", "GHOST_NOT_EQUALS", "WITH", "OPAQUE", "REVEAL", "BACKEND", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", @@ -577,7 +578,7 @@ public final SourceFileContext sourceFile() throws RecognitionException { setState(432); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579504128L) != 0) || ((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & 4845867656449L) != 0) || _la==STAR || _la==RECEIVE) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 333404911159008256L) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 4845867656449L) != 0) || _la==STAR || _la==RECEIVE) { { { setState(426); @@ -960,7 +961,7 @@ public final ImportDeclContext importDecl() throws RecognitionException { setState(491); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & 35201551958017L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { + while (((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 35201551958017L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { setState(486); @@ -1084,6 +1085,7 @@ public ExpressionContext expression() { } public TerminalNode ASSUME() { return getToken(GobraParser.ASSUME, 0); } public TerminalNode ASSERT() { return getToken(GobraParser.ASSERT, 0); } + public TerminalNode REFUTE() { return getToken(GobraParser.REFUTE, 0); } public TerminalNode INHALE() { return getToken(GobraParser.INHALE, 0); } public TerminalNode EXHALE() { return getToken(GobraParser.EXHALE, 0); } public ProofStatementContext(GhostStatementContext ctx) { copyFrom(ctx); } @@ -1173,6 +1175,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException } break; case ASSERT: + case REFUTE: case ASSUME: case INHALE: case EXHALE: @@ -1182,7 +1185,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException setState(507); ((ProofStatementContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 480L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 992L) != 0)) ) { ((ProofStatementContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -2077,7 +2080,7 @@ public final SConversionContext sConversion() throws RecognitionException { setState(601); ((SConversionContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15393162788864L) != 0)) ) { ((SConversionContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -2495,7 +2498,7 @@ public final RangeContext range() throws RecognitionException { setState(647); ((RangeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15393162788864L) != 0)) ) { ((RangeContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -3106,7 +3109,7 @@ public final AdtClauseContext adtClause() throws RecognitionException { setState(735); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441151881345761731L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 333404911158951936L) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & 1441151881345761731L) != 0)) { { { setState(730); @@ -3406,7 +3409,7 @@ public final SqTypeContext sqType() throws RecognitionException { setState(767); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 50577534877696L) != 0)) ) { ((SqTypeContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -3630,7 +3633,7 @@ public final BackendAnnotationEntryContext backendAnnotationEntry() throws Recog { setState(802); _la = _input.LA(1); - if ( _la <= 0 || (((((_la - 106)) & ~0x3f) == 0 && ((1L << (_la - 106)) & 131L) != 0)) ) { + if ( _la <= 0 || (((((_la - 107)) & ~0x3f) == 0 && ((1L << (_la - 107)) & 131L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -3643,7 +3646,7 @@ public final BackendAnnotationEntryContext backendAnnotationEntry() throws Recog setState(805); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -576144092954625L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 137438953471L) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1152288185909249L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 274877906943L) != 0) ); } } catch (RecognitionException re) { @@ -3753,7 +3756,7 @@ public final SingleBackendAnnotationContext singleBackendAnnotation() throws Rec setState(818); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -576144092954625L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 137438953471L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & -2L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -1152288185909249L) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & 274877906943L) != 0)) { { setState(817); listOfValues(); @@ -4345,7 +4348,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { setState(888); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913343522074138L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826687044148250L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(884); matchPatternList(); @@ -4578,7 +4581,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition setState(924); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(920); closureSpecParams(); @@ -6418,7 +6421,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(1105); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 127L) != 0)) ) { + if ( !(((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 127L) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -6518,7 +6521,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(1128); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & 1567L) != 0)) ) { + if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1567L) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -6539,7 +6542,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(1131); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 117)) & ~0x3f) == 0 && ((1L << (_la - 117)) & 3674113L) != 0)) ) { + if ( !(_la==WAND || ((((_la - 118)) & ~0x3f) == 0 && ((1L << (_la - 118)) & 3674113L) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -6560,7 +6563,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(1134); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 30064771072L) != 0)) ) { ((P42ExprContext)_localctx).p42_op = (Token)_errHandler.recoverInline(this); } else { @@ -6581,7 +6584,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(1137); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 3758096384L) != 0)) ) { ((P41ExprContext)_localctx).p41_op = (Token)_errHandler.recoverInline(this); } else { @@ -6602,7 +6605,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(1140); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 70931694131085315L) != 0)) ) { + if ( !(((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & 70931694131085315L) != 0)) ) { ((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this); } else { @@ -7663,7 +7666,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { setState(1241); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 46)) & ~0x3f) == 0 && ((1L << (_la - 46)) & 2251799813685321L) != 0)) ) { + if ( !(((((_la - 47)) & ~0x3f) == 0 && ((1L << (_la - 47)) & 2251799813685321L) != 0)) ) { ((BuiltInCallExprContext)_localctx).call_op = (Token)_errHandler.recoverInline(this); } else { @@ -7944,7 +7947,7 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce setState(1286); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(1285); expressionList(); @@ -8030,7 +8033,7 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { setState(1304); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 144115188210101760L) != 0) || ((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & 137438954753L) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 288230376420203520L) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 137438954753L) != 0)) { { { setState(1298); @@ -8508,7 +8511,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException setState(1365); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441151881345761731L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 333404911158951936L) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & 1441151881345761731L) != 0)) { { setState(1354); type_(); @@ -8752,7 +8755,7 @@ public final Slice_Context slice_() throws RecognitionException { setState(1385); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(1384); low(); @@ -8764,7 +8767,7 @@ public final Slice_Context slice_() throws RecognitionException { setState(1389); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(1388); high(); @@ -8778,7 +8781,7 @@ public final Slice_Context slice_() throws RecognitionException { setState(1392); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(1391); low(); @@ -8958,12 +8961,12 @@ public final Assign_opContext assign_op() throws RecognitionException { setState(1410); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & 4031L) != 0)) { + if (((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & 4031L) != 0)) { { setState(1409); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & 4031L) != 0)) ) { + if ( !(((((_la - 130)) & ~0x3f) == 0 && ((1L << (_la - 130)) & 4031L) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -9347,7 +9350,7 @@ public final ConstSpecContext constSpec() throws RecognitionException { setState(1456); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441151881345761731L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 333404911158951936L) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & 1441151881345761731L) != 0)) { { setState(1455); type_(); @@ -10672,7 +10675,7 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException setState(1603); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(1602); expression(0); @@ -10698,7 +10701,7 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException setState(1610); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(1609); expression(0); @@ -11551,7 +11554,7 @@ public final ForStmtContext forStmt() throws RecognitionException { setState(1722); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(1721); expression(0); @@ -11571,7 +11574,7 @@ public final ForStmtContext forStmt() throws RecognitionException { setState(1726); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(1725); rangeClause(); @@ -11660,7 +11663,7 @@ public final ForClauseContext forClause() throws RecognitionException { setState(1741); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(1740); ((ForClauseContext)_localctx).postStmt = simpleStmt(); @@ -12278,7 +12281,7 @@ public final ParametersContext parameters() throws RecognitionException { setState(1806); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 166702455579475968L) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & 1441152431101575619L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 333404911158951936L) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & 1441152431101575619L) != 0)) { { setState(1795); parameterDecl(); @@ -12650,7 +12653,7 @@ public final IntegerContext integer() throws RecognitionException { { setState(1838); _la = _input.LA(1); - if ( !(((((_la - 142)) & ~0x3f) == 0 && ((1L << (_la - 142)) & 111L) != 0)) ) { + if ( !(((((_la - 143)) & ~0x3f) == 0 && ((1L << (_la - 143)) & 111L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -12822,7 +12825,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { setState(1854); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 23920835140615L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 23920835140615L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(1850); elementList(); @@ -13503,7 +13506,7 @@ public final ArgumentsContext arguments() throws RecognitionException { setState(1924); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1143913206083120666L) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & 19522788629511L) != 0) || ((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & 1587199L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2287826412166241306L) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & 19522788629511L) != 0) || ((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & 1587199L) != 0)) { { setState(1916); _errHandler.sync(this); @@ -13790,7 +13793,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a4\u0795\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a5\u0795\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -14051,34 +14054,34 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146"+ "\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e"+ "\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176"+ - "\u0178\u017a\u017c\u017e\u0000\u0014\u0002\u0000iitt\u0001\u0000\u0017"+ - "\u0018\u0001\u0000\u0005\b\u0001\u0000BC\u0001\u0000(*\u0002\u0000(*,"+ - ",\u0002\u0000jkqq\u0001\u0000\u0087\u008d\u0001\u0000\u0014\u0015\u0002"+ - "\u0000\u0082\u0086\u008b\u008c\u0004\u0000##uu\u0081\u0081\u0088\u008a"+ - "\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000IJ{\u0080\u0004"+ - "\u0000..1144aa\u0002\u0000\u0081\u0086\u0088\u008c\u0001\u0000uv\u0002"+ - "\u0000rr\u00a3\u00a3\u0002\u0000\u008e\u0091\u0093\u0094\u0001\u0000\u009a"+ - "\u009b\u0802\u0000\u0180\u0001\u0000\u0000\u0000\u0002\u0183\u0001\u0000"+ - "\u0000\u0000\u0004\u0186\u0001\u0000\u0000\u0000\u0006\u0189\u0001\u0000"+ - "\u0000\u0000\b\u0191\u0001\u0000\u0000\u0000\n\u019a\u0001\u0000\u0000"+ - "\u0000\f\u01ba\u0001\u0000\u0000\u0000\u000e\u01c7\u0001\u0000\u0000\u0000"+ - "\u0010\u01ca\u0001\u0000\u0000\u0000\u0012\u01d2\u0001\u0000\u0000\u0000"+ - "\u0014\u01df\u0001\u0000\u0000\u0000\u0016\u01f5\u0001\u0000\u0000\u0000"+ - "\u0018\u01fe\u0001\u0000\u0000\u0000\u001a\u0200\u0001\u0000\u0000\u0000"+ - "\u001c\u0202\u0001\u0000\u0000\u0000\u001e\u0205\u0001\u0000\u0000\u0000"+ - " \u0219\u0001\u0000\u0000\u0000\"\u021b\u0001\u0000\u0000\u0000$\u021d"+ - "\u0001\u0000\u0000\u0000&\u0222\u0001\u0000\u0000\u0000(\u022d\u0001\u0000"+ - "\u0000\u0000*\u023a\u0001\u0000\u0000\u0000,\u023d\u0001\u0000\u0000\u0000"+ - ".\u0248\u0001\u0000\u0000\u00000\u024a\u0001\u0000\u0000\u00002\u024f"+ - "\u0001\u0000\u0000\u00004\u0254\u0001\u0000\u0000\u00006\u0259\u0001\u0000"+ - "\u0000\u00008\u025e\u0001\u0000\u0000\u0000:\u026b\u0001\u0000\u0000\u0000"+ - "<\u026d\u0001\u0000\u0000\u0000>\u026f\u0001\u0000\u0000\u0000@\u0274"+ - "\u0001\u0000\u0000\u0000B\u0279\u0001\u0000\u0000\u0000D\u027e\u0001\u0000"+ - "\u0000\u0000F\u0287\u0001\u0000\u0000\u0000H\u028e\u0001\u0000\u0000\u0000"+ - "J\u029b\u0001\u0000\u0000\u0000L\u029f\u0001\u0000\u0000\u0000N\u02aa"+ - "\u0001\u0000\u0000\u0000P\u02b3\u0001\u0000\u0000\u0000R\u02b5\u0001\u0000"+ - "\u0000\u0000T\u02ca\u0001\u0000\u0000\u0000V\u02cc\u0001\u0000\u0000\u0000"+ - "X\u02d8\u0001\u0000\u0000\u0000Z\u02e5\u0001\u0000\u0000\u0000\\\u02e9"+ + "\u0178\u017a\u017c\u017e\u0000\u0014\u0002\u0000jjuu\u0001\u0000\u0018"+ + "\u0019\u0001\u0000\u0005\t\u0001\u0000CD\u0001\u0000)+\u0002\u0000)+-"+ + "-\u0002\u0000klrr\u0001\u0000\u0088\u008e\u0001\u0000\u0015\u0016\u0002"+ + "\u0000\u0083\u0087\u008c\u008d\u0004\u0000$$vv\u0082\u0082\u0089\u008b"+ + "\u0001\u0000 \"\u0001\u0000\u001d\u001f\u0002\u0000JK|\u0081\u0004\u0000"+ + "//2255bb\u0002\u0000\u0082\u0087\u0089\u008d\u0001\u0000vw\u0002\u0000"+ + "ss\u00a4\u00a4\u0002\u0000\u008f\u0092\u0094\u0095\u0001\u0000\u009b\u009c"+ + "\u0802\u0000\u0180\u0001\u0000\u0000\u0000\u0002\u0183\u0001\u0000\u0000"+ + "\u0000\u0004\u0186\u0001\u0000\u0000\u0000\u0006\u0189\u0001\u0000\u0000"+ + "\u0000\b\u0191\u0001\u0000\u0000\u0000\n\u019a\u0001\u0000\u0000\u0000"+ + "\f\u01ba\u0001\u0000\u0000\u0000\u000e\u01c7\u0001\u0000\u0000\u0000\u0010"+ + "\u01ca\u0001\u0000\u0000\u0000\u0012\u01d2\u0001\u0000\u0000\u0000\u0014"+ + "\u01df\u0001\u0000\u0000\u0000\u0016\u01f5\u0001\u0000\u0000\u0000\u0018"+ + "\u01fe\u0001\u0000\u0000\u0000\u001a\u0200\u0001\u0000\u0000\u0000\u001c"+ + "\u0202\u0001\u0000\u0000\u0000\u001e\u0205\u0001\u0000\u0000\u0000 \u0219"+ + "\u0001\u0000\u0000\u0000\"\u021b\u0001\u0000\u0000\u0000$\u021d\u0001"+ + "\u0000\u0000\u0000&\u0222\u0001\u0000\u0000\u0000(\u022d\u0001\u0000\u0000"+ + "\u0000*\u023a\u0001\u0000\u0000\u0000,\u023d\u0001\u0000\u0000\u0000."+ + "\u0248\u0001\u0000\u0000\u00000\u024a\u0001\u0000\u0000\u00002\u024f\u0001"+ + "\u0000\u0000\u00004\u0254\u0001\u0000\u0000\u00006\u0259\u0001\u0000\u0000"+ + "\u00008\u025e\u0001\u0000\u0000\u0000:\u026b\u0001\u0000\u0000\u0000<"+ + "\u026d\u0001\u0000\u0000\u0000>\u026f\u0001\u0000\u0000\u0000@\u0274\u0001"+ + "\u0000\u0000\u0000B\u0279\u0001\u0000\u0000\u0000D\u027e\u0001\u0000\u0000"+ + "\u0000F\u0287\u0001\u0000\u0000\u0000H\u028e\u0001\u0000\u0000\u0000J"+ + "\u029b\u0001\u0000\u0000\u0000L\u029f\u0001\u0000\u0000\u0000N\u02aa\u0001"+ + "\u0000\u0000\u0000P\u02b3\u0001\u0000\u0000\u0000R\u02b5\u0001\u0000\u0000"+ + "\u0000T\u02ca\u0001\u0000\u0000\u0000V\u02cc\u0001\u0000\u0000\u0000X"+ + "\u02d8\u0001\u0000\u0000\u0000Z\u02e5\u0001\u0000\u0000\u0000\\\u02e9"+ "\u0001\u0000\u0000\u0000^\u02ee\u0001\u0000\u0000\u0000`\u02f4\u0001\u0000"+ "\u0000\u0000b\u030a\u0001\u0000\u0000\u0000d\u0318\u0001\u0000\u0000\u0000"+ "f\u0323\u0001\u0000\u0000\u0000h\u0327\u0001\u0000\u0000\u0000j\u032f"+ @@ -14155,11 +14158,11 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0183\u0184\u0003\u00b6[\u0000\u0184\u0185\u0005\u0000\u0000\u0001\u0185"+ "\u0003\u0001\u0000\u0000\u0000\u0186\u0187\u0003\u00d2i\u0000\u0187\u0188"+ "\u0005\u0000\u0000\u0001\u0188\u0005\u0001\u0000\u0000\u0000\u0189\u018e"+ - "\u0003\b\u0004\u0000\u018a\u018b\u0005q\u0000\u0000\u018b\u018d\u0003"+ + "\u0003\b\u0004\u0000\u018a\u018b\u0005r\u0000\u0000\u018b\u018d\u0003"+ "\b\u0004\u0000\u018c\u018a\u0001\u0000\u0000\u0000\u018d\u0190\u0001\u0000"+ "\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000"+ "\u0000\u0000\u018f\u0007\u0001\u0000\u0000\u0000\u0190\u018e\u0001\u0000"+ - "\u0000\u0000\u0191\u0193\u0005i\u0000\u0000\u0192\u0194\u0005=\u0000\u0000"+ + "\u0000\u0000\u0191\u0193\u0005j\u0000\u0000\u0192\u0194\u0005>\u0000\u0000"+ "\u0193\u0192\u0001\u0000\u0000\u0000\u0193\u0194\u0001\u0000\u0000\u0000"+ "\u0194\t\u0001\u0000\u0000\u0000\u0195\u0196\u0003\u000e\u0007\u0000\u0196"+ "\u0197\u0003\u017e\u00bf\u0000\u0197\u0199\u0001\u0000\u0000\u0000\u0198"+ @@ -14189,8 +14192,8 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u01c3\u0001\u0000\u0000\u0000\u01c2\u01bf\u0001\u0000\u0000\u0000\u01c3"+ "\u01c6\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c4"+ "\u01c5\u0001\u0000\u0000\u0000\u01c5\r\u0001\u0000\u0000\u0000\u01c6\u01c4"+ - "\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005F\u0000\u0000\u01c8\u01c9\u0003"+ - "\u00b4Z\u0000\u01c9\u000f\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005G\u0000"+ + "\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005G\u0000\u0000\u01c8\u01c9\u0003"+ + "\u00b4Z\u0000\u01c9\u000f\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005H\u0000"+ "\u0000\u01cb\u01cc\u0003\u00b4Z\u0000\u01cc\u0011\u0001\u0000\u0000\u0000"+ "\u01cd\u01ce\u0003\u0010\b\u0000\u01ce\u01cf\u0003\u017e\u00bf\u0000\u01cf"+ "\u01d1\u0001\u0000\u0000\u0000\u01d0\u01cd\u0001\u0000\u0000\u0000\u01d1"+ @@ -14204,19 +14207,19 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0000\u0000\u0000\u01de\u01e1\u0001\u0000\u0000\u0000\u01df\u01dd\u0001"+ "\u0000\u0000\u0000\u01df\u01e0\u0001\u0000\u0000\u0000\u01e0\u01ef\u0001"+ "\u0000\u0000\u0000\u01e1\u01df\u0001\u0000\u0000\u0000\u01e2\u01e3\u0005"+ - "e\u0000\u0000\u01e3\u01f0\u0003\u0012\t\u0000\u01e4\u01e5\u0005e\u0000"+ - "\u0000\u01e5\u01eb\u0005j\u0000\u0000\u01e6\u01e7\u0003\u0012\t\u0000"+ + "f\u0000\u0000\u01e3\u01f0\u0003\u0012\t\u0000\u01e4\u01e5\u0005f\u0000"+ + "\u0000\u01e5\u01eb\u0005k\u0000\u0000\u01e6\u01e7\u0003\u0012\t\u0000"+ "\u01e7\u01e8\u0003\u017e\u00bf\u0000\u01e8\u01ea\u0001\u0000\u0000\u0000"+ "\u01e9\u01e6\u0001\u0000\u0000\u0000\u01ea\u01ed\u0001\u0000\u0000\u0000"+ "\u01eb\u01e9\u0001\u0000\u0000\u0000\u01eb\u01ec\u0001\u0000\u0000\u0000"+ "\u01ec\u01ee\u0001\u0000\u0000\u0000\u01ed\u01eb\u0001\u0000\u0000\u0000"+ - "\u01ee\u01f0\u0005k\u0000\u0000\u01ef\u01e2\u0001\u0000\u0000\u0000\u01ef"+ + "\u01ee\u01f0\u0005l\u0000\u0000\u01ef\u01e2\u0001\u0000\u0000\u0000\u01ef"+ "\u01e4\u0001\u0000\u0000\u0000\u01f0\u0015\u0001\u0000\u0000\u0000\u01f1"+ "\u01f6\u0003\u008aE\u0000\u01f2\u01f6\u0003\u00a0P\u0000\u01f3\u01f6\u0003"+ "\u00a4R\u0000\u01f4\u01f6\u0003\u009eO\u0000\u01f5\u01f1\u0001\u0000\u0000"+ "\u0000\u01f5\u01f2\u0001\u0000\u0000\u0000\u01f5\u01f3\u0001\u0000\u0000"+ "\u0000\u01f5\u01f4\u0001\u0000\u0000\u0000\u01f6\u0017\u0001\u0000\u0000"+ - "\u0000\u01f7\u01f8\u0005\u001b\u0000\u0000\u01f8\u01ff\u0003\u00b6[\u0000"+ + "\u0000\u01f7\u01f8\u0005\u001c\u0000\u0000\u01f8\u01ff\u0003\u00b6[\u0000"+ "\u01f9\u01fa\u0007\u0001\u0000\u0000\u01fa\u01ff\u0003.\u0017\u0000\u01fb"+ "\u01fc\u0007\u0002\u0000\u0000\u01fc\u01ff\u0003\u00b4Z\u0000\u01fd\u01ff"+ "\u0003v;\u0000\u01fe\u01f7\u0001\u0000\u0000\u0000\u01fe\u01f9\u0001\u0000"+ @@ -14224,10 +14227,10 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0000\u0000\u01ff\u0019\u0001\u0000\u0000\u0000\u0200\u0201\u0003\u001c"+ "\u000e\u0000\u0201\u001b\u0001\u0000\u0000\u0000\u0202\u0203\u0003d2\u0000"+ "\u0203\u0204\u0003\u001e\u000f\u0000\u0204\u001d\u0001\u0000\u0000\u0000"+ - "\u0205\u0206\u0005E\u0000\u0000\u0206\u0208\u0005j\u0000\u0000\u0207\u0209"+ + "\u0205\u0206\u0005F\u0000\u0000\u0206\u0208\u0005k\u0000\u0000\u0207\u0209"+ "\u0003\u0100\u0080\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0208\u0209"+ "\u0001\u0000\u0000\u0000\u0209\u020a\u0001\u0000\u0000\u0000\u020a\u020b"+ - "\u0005k\u0000\u0000\u020b\u001f\u0001\u0000\u0000\u0000\u020c\u021a\u0003"+ + "\u0005l\u0000\u0000\u020b\u001f\u0001\u0000\u0000\u0000\u020c\u021a\u0003"+ "F#\u0000\u020d\u021a\u0003D\"\u0000\u020e\u021a\u0003B!\u0000\u020f\u021a"+ "\u0003$\u0012\u0000\u0210\u021a\u0003@ \u0000\u0211\u021a\u00038\u001c"+ "\u0000\u0212\u021a\u0003>\u001f\u0000\u0213\u021a\u00036\u001b\u0000\u0214"+ @@ -14241,112 +14244,112 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0219\u0216\u0001\u0000\u0000\u0000\u0219\u0217\u0001\u0000\u0000\u0000"+ "\u0219\u0218\u0001\u0000\u0000\u0000\u021a!\u0001\u0000\u0000\u0000\u021b"+ "\u021c\u0007\u0003\u0000\u0000\u021c#\u0001\u0000\u0000\u0000\u021d\u021e"+ - "\u0005b\u0000\u0000\u021e\u021f\u0005n\u0000\u0000\u021f\u0220\u0003\u00d2"+ - "i\u0000\u0220\u0221\u0005o\u0000\u0000\u0221%\u0001\u0000\u0000\u0000"+ - "\u0222\u0227\u0003(\u0014\u0000\u0223\u0224\u0005q\u0000\u0000\u0224\u0226"+ + "\u0005c\u0000\u0000\u021e\u021f\u0005o\u0000\u0000\u021f\u0220\u0003\u00d2"+ + "i\u0000\u0220\u0221\u0005p\u0000\u0000\u0221%\u0001\u0000\u0000\u0000"+ + "\u0222\u0227\u0003(\u0014\u0000\u0223\u0224\u0005r\u0000\u0000\u0224\u0226"+ "\u0003(\u0014\u0000\u0225\u0223\u0001\u0000\u0000\u0000\u0226\u0229\u0001"+ "\u0000\u0000\u0000\u0227\u0225\u0001\u0000\u0000\u0000\u0227\u0228\u0001"+ "\u0000\u0000\u0000\u0228\u022b\u0001\u0000\u0000\u0000\u0229\u0227\u0001"+ - "\u0000\u0000\u0000\u022a\u022c\u0005q\u0000\u0000\u022b\u022a\u0001\u0000"+ + "\u0000\u0000\u0000\u022a\u022c\u0005r\u0000\u0000\u022b\u022a\u0001\u0000"+ "\u0000\u0000\u022b\u022c\u0001\u0000\u0000\u0000\u022c\'\u0001\u0000\u0000"+ - "\u0000\u022d\u0232\u0005i\u0000\u0000\u022e\u022f\u0005q\u0000\u0000\u022f"+ - "\u0231\u0005i\u0000\u0000\u0230\u022e\u0001\u0000\u0000\u0000\u0231\u0234"+ + "\u0000\u022d\u0232\u0005j\u0000\u0000\u022e\u022f\u0005r\u0000\u0000\u022f"+ + "\u0231\u0005j\u0000\u0000\u0230\u022e\u0001\u0000\u0000\u0000\u0231\u0234"+ "\u0001\u0000\u0000\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0232\u0233"+ "\u0001\u0000\u0000\u0000\u0233\u0235\u0001\u0000\u0000\u0000\u0234\u0232"+ "\u0001\u0000\u0000\u0000\u0235\u0236\u0003\u0142\u00a1\u0000\u0236)\u0001"+ "\u0000\u0000\u0000\u0237\u0239\u0003,\u0016\u0000\u0238\u0237\u0001\u0000"+ "\u0000\u0000\u0239\u023c\u0001\u0000\u0000\u0000\u023a\u0238\u0001\u0000"+ "\u0000\u0000\u023a\u023b\u0001\u0000\u0000\u0000\u023b+\u0001\u0000\u0000"+ - "\u0000\u023c\u023a\u0001\u0000\u0000\u0000\u023d\u023e\u0005l\u0000\u0000"+ - "\u023e\u0243\u0003\u00b4Z\u0000\u023f\u0240\u0005q\u0000\u0000\u0240\u0242"+ + "\u0000\u023c\u023a\u0001\u0000\u0000\u0000\u023d\u023e\u0005m\u0000\u0000"+ + "\u023e\u0243\u0003\u00b4Z\u0000\u023f\u0240\u0005r\u0000\u0000\u0240\u0242"+ "\u0003\u00b4Z\u0000\u0241\u023f\u0001\u0000\u0000\u0000\u0242\u0245\u0001"+ "\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000\u0000\u0243\u0244\u0001"+ "\u0000\u0000\u0000\u0244\u0246\u0001\u0000\u0000\u0000\u0245\u0243\u0001"+ - "\u0000\u0000\u0000\u0246\u0247\u0005m\u0000\u0000\u0247-\u0001\u0000\u0000"+ + "\u0000\u0000\u0000\u0246\u0247\u0005n\u0000\u0000\u0247-\u0001\u0000\u0000"+ "\u0000\u0248\u0249\u0003\u00c4b\u0000\u0249/\u0001\u0000\u0000\u0000\u024a"+ - "\u024b\u00052\u0000\u0000\u024b\u024c\u0005j\u0000\u0000\u024c\u024d\u0003"+ - "\u00b4Z\u0000\u024d\u024e\u0005k\u0000\u0000\u024e1\u0001\u0000\u0000"+ - "\u0000\u024f\u0250\u00058\u0000\u0000\u0250\u0251\u0005n\u0000\u0000\u0251"+ - "\u0252\u0003\u00d2i\u0000\u0252\u0253\u0005o\u0000\u0000\u02533\u0001"+ - "\u0000\u0000\u0000\u0254\u0255\u00053\u0000\u0000\u0255\u0256\u0005j\u0000"+ - "\u0000\u0256\u0257\u0003\u00b4Z\u0000\u0257\u0258\u0005k\u0000\u0000\u0258"+ + "\u024b\u00053\u0000\u0000\u024b\u024c\u0005k\u0000\u0000\u024c\u024d\u0003"+ + "\u00b4Z\u0000\u024d\u024e\u0005l\u0000\u0000\u024e1\u0001\u0000\u0000"+ + "\u0000\u024f\u0250\u00059\u0000\u0000\u0250\u0251\u0005o\u0000\u0000\u0251"+ + "\u0252\u0003\u00d2i\u0000\u0252\u0253\u0005p\u0000\u0000\u02533\u0001"+ + "\u0000\u0000\u0000\u0254\u0255\u00054\u0000\u0000\u0255\u0256\u0005k\u0000"+ + "\u0000\u0256\u0257\u0003\u00b4Z\u0000\u0257\u0258\u0005l\u0000\u0000\u0258"+ "5\u0001\u0000\u0000\u0000\u0259\u025a\u0007\u0004\u0000\u0000\u025a\u025b"+ - "\u0005j\u0000\u0000\u025b\u025c\u0003\u00b4Z\u0000\u025c\u025d\u0005k"+ - "\u0000\u0000\u025d7\u0001\u0000\u0000\u0000\u025e\u0263\u0005\u0011\u0000"+ - "\u0000\u025f\u0260\u0005n\u0000\u0000\u0260\u0261\u0003:\u001d\u0000\u0261"+ - "\u0262\u0005o\u0000\u0000\u0262\u0264\u0001\u0000\u0000\u0000\u0263\u025f"+ + "\u0005k\u0000\u0000\u025b\u025c\u0003\u00b4Z\u0000\u025c\u025d\u0005l"+ + "\u0000\u0000\u025d7\u0001\u0000\u0000\u0000\u025e\u0263\u0005\u0012\u0000"+ + "\u0000\u025f\u0260\u0005o\u0000\u0000\u0260\u0261\u0003:\u001d\u0000\u0261"+ + "\u0262\u0005p\u0000\u0000\u0262\u0264\u0001\u0000\u0000\u0000\u0263\u025f"+ "\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000\u0000\u0000\u0264\u0265"+ - "\u0001\u0000\u0000\u0000\u0265\u0266\u0005j\u0000\u0000\u0266\u0267\u0003"+ - "\u00b4Z\u0000\u0267\u0268\u0005k\u0000\u0000\u02689\u0001\u0000\u0000"+ - "\u0000\u0269\u026c\u0003<\u001e\u0000\u026a\u026c\u0005\u0013\u0000\u0000"+ + "\u0001\u0000\u0000\u0000\u0265\u0266\u0005k\u0000\u0000\u0266\u0267\u0003"+ + "\u00b4Z\u0000\u0267\u0268\u0005l\u0000\u0000\u02689\u0001\u0000\u0000"+ + "\u0000\u0269\u026c\u0003<\u001e\u0000\u026a\u026c\u0005\u0014\u0000\u0000"+ "\u026b\u0269\u0001\u0000\u0000\u0000\u026b\u026a\u0001\u0000\u0000\u0000"+ - "\u026c;\u0001\u0000\u0000\u0000\u026d\u026e\u0005i\u0000\u0000\u026e="+ - "\u0001\u0000\u0000\u0000\u026f\u0270\u0005\u0012\u0000\u0000\u0270\u0271"+ - "\u0005j\u0000\u0000\u0271\u0272\u0003\u00b4Z\u0000\u0272\u0273\u0005k"+ - "\u0000\u0000\u0273?\u0001\u0000\u0000\u0000\u0274\u0275\u0005;\u0000\u0000"+ - "\u0275\u0276\u0005j\u0000\u0000\u0276\u0277\u0003\u00b4Z\u0000\u0277\u0278"+ - "\u0005k\u0000\u0000\u0278A\u0001\u0000\u0000\u0000\u0279\u027a\u0005:"+ - "\u0000\u0000\u027a\u027b\u0005j\u0000\u0000\u027b\u027c\u0003\u00b4Z\u0000"+ - "\u027c\u027d\u0005k\u0000\u0000\u027dC\u0001\u0000\u0000\u0000\u027e\u027f"+ - "\u0005\u0016\u0000\u0000\u027f\u0280\u0005j\u0000\u0000\u0280\u0283\u0003"+ - "\u00b4Z\u0000\u0281\u0282\u0005q\u0000\u0000\u0282\u0284\u0003\u00b4Z"+ + "\u026c;\u0001\u0000\u0000\u0000\u026d\u026e\u0005j\u0000\u0000\u026e="+ + "\u0001\u0000\u0000\u0000\u026f\u0270\u0005\u0013\u0000\u0000\u0270\u0271"+ + "\u0005k\u0000\u0000\u0271\u0272\u0003\u00b4Z\u0000\u0272\u0273\u0005l"+ + "\u0000\u0000\u0273?\u0001\u0000\u0000\u0000\u0274\u0275\u0005<\u0000\u0000"+ + "\u0275\u0276\u0005k\u0000\u0000\u0276\u0277\u0003\u00b4Z\u0000\u0277\u0278"+ + "\u0005l\u0000\u0000\u0278A\u0001\u0000\u0000\u0000\u0279\u027a\u0005;"+ + "\u0000\u0000\u027a\u027b\u0005k\u0000\u0000\u027b\u027c\u0003\u00b4Z\u0000"+ + "\u027c\u027d\u0005l\u0000\u0000\u027dC\u0001\u0000\u0000\u0000\u027e\u027f"+ + "\u0005\u0017\u0000\u0000\u027f\u0280\u0005k\u0000\u0000\u0280\u0283\u0003"+ + "\u00b4Z\u0000\u0281\u0282\u0005r\u0000\u0000\u0282\u0284\u0003\u00b4Z"+ "\u0000\u0283\u0281\u0001\u0000\u0000\u0000\u0283\u0284\u0001\u0000\u0000"+ - "\u0000\u0284\u0285\u0001\u0000\u0000\u0000\u0285\u0286\u0005k\u0000\u0000"+ + "\u0000\u0284\u0285\u0001\u0000\u0000\u0000\u0285\u0286\u0005l\u0000\u0000"+ "\u0286E\u0001\u0000\u0000\u0000\u0287\u0288\u0007\u0004\u0000\u0000\u0288"+ - "\u0289\u0005n\u0000\u0000\u0289\u028a\u0003\u00b4Z\u0000\u028a\u028b\u0005"+ - ">\u0000\u0000\u028b\u028c\u0003\u00b4Z\u0000\u028c\u028d\u0005o\u0000"+ - "\u0000\u028dG\u0001\u0000\u0000\u0000\u028e\u028f\u00057\u0000\u0000\u028f"+ - "\u0290\u0003\u00b4Z\u0000\u0290\u0296\u0005l\u0000\u0000\u0291\u0292\u0003"+ + "\u0289\u0005o\u0000\u0000\u0289\u028a\u0003\u00b4Z\u0000\u028a\u028b\u0005"+ + "?\u0000\u0000\u028b\u028c\u0003\u00b4Z\u0000\u028c\u028d\u0005p\u0000"+ + "\u0000\u028dG\u0001\u0000\u0000\u0000\u028e\u028f\u00058\u0000\u0000\u028f"+ + "\u0290\u0003\u00b4Z\u0000\u0290\u0296\u0005m\u0000\u0000\u0291\u0292\u0003"+ "J%\u0000\u0292\u0293\u0003\u017e\u00bf\u0000\u0293\u0295\u0001\u0000\u0000"+ "\u0000\u0294\u0291\u0001\u0000\u0000\u0000\u0295\u0298\u0001\u0000\u0000"+ "\u0000\u0296\u0294\u0001\u0000\u0000\u0000\u0296\u0297\u0001\u0000\u0000"+ "\u0000\u0297\u0299\u0001\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000"+ - "\u0000\u0299\u029a\u0005m\u0000\u0000\u029aI\u0001\u0000\u0000\u0000\u029b"+ - "\u029c\u0003z=\u0000\u029c\u029d\u0005s\u0000\u0000\u029d\u029e\u0003"+ - "\u00b4Z\u0000\u029eK\u0001\u0000\u0000\u0000\u029f\u02a0\u0005n\u0000"+ - "\u0000\u02a0\u02a5\u0003N\'\u0000\u02a1\u02a2\u0005q\u0000\u0000\u02a2"+ + "\u0000\u0299\u029a\u0005n\u0000\u0000\u029aI\u0001\u0000\u0000\u0000\u029b"+ + "\u029c\u0003z=\u0000\u029c\u029d\u0005t\u0000\u0000\u029d\u029e\u0003"+ + "\u00b4Z\u0000\u029eK\u0001\u0000\u0000\u0000\u029f\u02a0\u0005o\u0000"+ + "\u0000\u02a0\u02a5\u0003N\'\u0000\u02a1\u02a2\u0005r\u0000\u0000\u02a2"+ "\u02a4\u0003N\'\u0000\u02a3\u02a1\u0001\u0000\u0000\u0000\u02a4\u02a7"+ "\u0001\u0000\u0000\u0000\u02a5\u02a3\u0001\u0000\u0000\u0000\u02a5\u02a6"+ "\u0001\u0000\u0000\u0000\u02a6\u02a8\u0001\u0000\u0000\u0000\u02a7\u02a5"+ - "\u0001\u0000\u0000\u0000\u02a8\u02a9\u0005o\u0000\u0000\u02a9M\u0001\u0000"+ - "\u0000\u0000\u02aa\u02ab\u0003\u00b4Z\u0000\u02ab\u02ac\u0005p\u0000\u0000"+ + "\u0001\u0000\u0000\u0000\u02a8\u02a9\u0005p\u0000\u0000\u02a9M\u0001\u0000"+ + "\u0000\u0000\u02aa\u02ab\u0003\u00b4Z\u0000\u02ab\u02ac\u0005q\u0000\u0000"+ "\u02ac\u02ad\u0003\u00b4Z\u0000\u02adO\u0001\u0000\u0000\u0000\u02ae\u02b4"+ "\u0003b1\u0000\u02af\u02b4\u0003\\.\u0000\u02b0\u02b4\u0003^/\u0000\u02b1"+ "\u02b4\u0003R)\u0000\u02b2\u02b4\u0003V+\u0000\u02b3\u02ae\u0001\u0000"+ "\u0000\u0000\u02b3\u02af\u0001\u0000\u0000\u0000\u02b3\u02b0\u0001\u0000"+ "\u0000\u0000\u02b3\u02b1\u0001\u0000\u0000\u0000\u02b3\u02b2\u0001\u0000"+ - "\u0000\u0000\u02b4Q\u0001\u0000\u0000\u0000\u02b5\u02b6\u00054\u0000\u0000"+ - "\u02b6\u02bc\u0005l\u0000\u0000\u02b7\u02b8\u0003T*\u0000\u02b8\u02b9"+ + "\u0000\u0000\u02b4Q\u0001\u0000\u0000\u0000\u02b5\u02b6\u00055\u0000\u0000"+ + "\u02b6\u02bc\u0005m\u0000\u0000\u02b7\u02b8\u0003T*\u0000\u02b8\u02b9"+ "\u0003\u017e\u00bf\u0000\u02b9\u02bb\u0001\u0000\u0000\u0000\u02ba\u02b7"+ "\u0001\u0000\u0000\u0000\u02bb\u02be\u0001\u0000\u0000\u0000\u02bc\u02ba"+ "\u0001\u0000\u0000\u0000\u02bc\u02bd\u0001\u0000\u0000\u0000\u02bd\u02bf"+ "\u0001\u0000\u0000\u0000\u02be\u02bc\u0001\u0000\u0000\u0000\u02bf\u02c0"+ - "\u0005m\u0000\u0000\u02c0S\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005Q"+ - "\u0000\u0000\u02c2\u02c3\u0005i\u0000\u0000\u02c3\u02cb\u0003\u014e\u00a7"+ - "\u0000\u02c4\u02c5\u00055\u0000\u0000\u02c5\u02c6\u0005l\u0000\u0000\u02c6"+ + "\u0005n\u0000\u0000\u02c0S\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005R"+ + "\u0000\u0000\u02c2\u02c3\u0005j\u0000\u0000\u02c3\u02cb\u0003\u014e\u00a7"+ + "\u0000\u02c4\u02c5\u00056\u0000\u0000\u02c5\u02c6\u0005m\u0000\u0000\u02c6"+ "\u02c7\u0003\u00b4Z\u0000\u02c7\u02c8\u0003\u017e\u00bf\u0000\u02c8\u02c9"+ - "\u0005m\u0000\u0000\u02c9\u02cb\u0001\u0000\u0000\u0000\u02ca\u02c1\u0001"+ + "\u0005n\u0000\u0000\u02c9\u02cb\u0001\u0000\u0000\u0000\u02ca\u02c1\u0001"+ "\u0000\u0000\u0000\u02ca\u02c4\u0001\u0000\u0000\u0000\u02cbU\u0001\u0000"+ - "\u0000\u0000\u02cc\u02cd\u00056\u0000\u0000\u02cd\u02d3\u0005l\u0000\u0000"+ + "\u0000\u0000\u02cc\u02cd\u00057\u0000\u0000\u02cd\u02d3\u0005m\u0000\u0000"+ "\u02ce\u02cf\u0003X,\u0000\u02cf\u02d0\u0003\u017e\u00bf\u0000\u02d0\u02d2"+ "\u0001\u0000\u0000\u0000\u02d1\u02ce\u0001\u0000\u0000\u0000\u02d2\u02d5"+ "\u0001\u0000\u0000\u0000\u02d3\u02d1\u0001\u0000\u0000\u0000\u02d3\u02d4"+ "\u0001\u0000\u0000\u0000\u02d4\u02d6\u0001\u0000\u0000\u0000\u02d5\u02d3"+ - "\u0001\u0000\u0000\u0000\u02d6\u02d7\u0005m\u0000\u0000\u02d7W\u0001\u0000"+ - "\u0000\u0000\u02d8\u02d9\u0005i\u0000\u0000\u02d9\u02df\u0005l\u0000\u0000"+ + "\u0001\u0000\u0000\u0000\u02d6\u02d7\u0005n\u0000\u0000\u02d7W\u0001\u0000"+ + "\u0000\u0000\u02d8\u02d9\u0005j\u0000\u0000\u02d9\u02df\u0005m\u0000\u0000"+ "\u02da\u02db\u0003Z-\u0000\u02db\u02dc\u0003\u017e\u00bf\u0000\u02dc\u02de"+ "\u0001\u0000\u0000\u0000\u02dd\u02da\u0001\u0000\u0000\u0000\u02de\u02e1"+ "\u0001\u0000\u0000\u0000\u02df\u02dd\u0001\u0000\u0000\u0000\u02df\u02e0"+ "\u0001\u0000\u0000\u0000\u02e0\u02e2\u0001\u0000\u0000\u0000\u02e1\u02df"+ - "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0005m\u0000\u0000\u02e3Y\u0001\u0000"+ + "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0005n\u0000\u0000\u02e3Y\u0001\u0000"+ "\u0000\u0000\u02e4\u02e6\u0003\u00f4z\u0000\u02e5\u02e4\u0001\u0000\u0000"+ "\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u02e7\u0001\u0000\u0000"+ "\u0000\u02e7\u02e8\u0003\u00d2i\u0000\u02e8[\u0001\u0000\u0000\u0000\u02e9"+ - "\u02ea\u0005\u001b\u0000\u0000\u02ea\u02eb\u0005n\u0000\u0000\u02eb\u02ec"+ - "\u0005o\u0000\u0000\u02ec\u02ed\u0003\u0142\u00a1\u0000\u02ed]\u0001\u0000"+ - "\u0000\u0000\u02ee\u02ef\u0005-\u0000\u0000\u02ef\u02f0\u0005n\u0000\u0000"+ - "\u02f0\u02f1\u0003\u0142\u00a1\u0000\u02f1\u02f2\u0005o\u0000\u0000\u02f2"+ - "_\u0001\u0000\u0000\u0000\u02f3\u02f5\u0005\u001b\u0000\u0000\u02f4\u02f3"+ + "\u02ea\u0005\u001c\u0000\u0000\u02ea\u02eb\u0005o\u0000\u0000\u02eb\u02ec"+ + "\u0005p\u0000\u0000\u02ec\u02ed\u0003\u0142\u00a1\u0000\u02ed]\u0001\u0000"+ + "\u0000\u0000\u02ee\u02ef\u0005.\u0000\u0000\u02ef\u02f0\u0005o\u0000\u0000"+ + "\u02f0\u02f1\u0003\u0142\u00a1\u0000\u02f1\u02f2\u0005p\u0000\u0000\u02f2"+ + "_\u0001\u0000\u0000\u0000\u02f3\u02f5\u0005\u001c\u0000\u0000\u02f4\u02f3"+ "\u0001\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5\u02fa"+ "\u0001\u0000\u0000\u0000\u02f6\u02f7\u0003\u00f4z\u0000\u02f7\u02f8\u0003"+ "\u00d2i\u0000\u02f8\u02fb\u0001\u0000\u0000\u0000\u02f9\u02fb\u0003\u0172"+ @@ -14354,22 +14357,22 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0000\u0000\u02fb\u02fd\u0001\u0000\u0000\u0000\u02fc\u02fe\u0003\u0170"+ "\u00b8\u0000\u02fd\u02fc\u0001\u0000\u0000\u0000\u02fd\u02fe\u0001\u0000"+ "\u0000\u0000\u02fea\u0001\u0000\u0000\u0000\u02ff\u0300\u0007\u0005\u0000"+ - "\u0000\u0300\u0301\u0005n\u0000\u0000\u0301\u0302\u0003\u00d2i\u0000\u0302"+ - "\u0303\u0005o\u0000\u0000\u0303\u030b\u0001\u0000\u0000\u0000\u0304\u0305"+ - "\u0005+\u0000\u0000\u0305\u0306\u0005n\u0000\u0000\u0306\u0307\u0003\u00d2"+ - "i\u0000\u0307\u0308\u0005o\u0000\u0000\u0308\u0309\u0003\u00d2i\u0000"+ + "\u0000\u0300\u0301\u0005o\u0000\u0000\u0301\u0302\u0003\u00d2i\u0000\u0302"+ + "\u0303\u0005p\u0000\u0000\u0303\u030b\u0001\u0000\u0000\u0000\u0304\u0305"+ + "\u0005,\u0000\u0000\u0305\u0306\u0005o\u0000\u0000\u0306\u0307\u0003\u00d2"+ + "i\u0000\u0307\u0308\u0005p\u0000\u0000\u0308\u0309\u0003\u00d2i\u0000"+ "\u0309\u030b\u0001\u0000\u0000\u0000\u030a\u02ff\u0001\u0000\u0000\u0000"+ "\u030a\u0304\u0001\u0000\u0000\u0000\u030bc\u0001\u0000\u0000\u0000\u030c"+ - "\u0314\u0003p8\u0000\u030d\u030e\u0005L\u0000\u0000\u030e\u0314\u0006"+ - "2\uffff\uffff\u0000\u030f\u0310\u0005\u000e\u0000\u0000\u0310\u0314\u0006"+ - "2\uffff\uffff\u0000\u0311\u0312\u0005D\u0000\u0000\u0312\u0314\u00062"+ + "\u0314\u0003p8\u0000\u030d\u030e\u0005M\u0000\u0000\u030e\u0314\u0006"+ + "2\uffff\uffff\u0000\u030f\u0310\u0005\u000f\u0000\u0000\u0310\u0314\u0006"+ + "2\uffff\uffff\u0000\u0311\u0312\u0005E\u0000\u0000\u0312\u0314\u00062"+ "\uffff\uffff\u0000\u0313\u030c\u0001\u0000\u0000\u0000\u0313\u030d\u0001"+ "\u0000\u0000\u0000\u0313\u030f\u0001\u0000\u0000\u0000\u0313\u0311\u0001"+ "\u0000\u0000\u0000\u0314\u0315\u0001\u0000\u0000\u0000\u0315\u0317\u0003"+ "\u017e\u00bf\u0000\u0316\u0313\u0001\u0000\u0000\u0000\u0317\u031a\u0001"+ "\u0000\u0000\u0000\u0318\u0319\u0001\u0000\u0000\u0000\u0318\u0316\u0001"+ "\u0000\u0000\u0000\u0319\u031d\u0001\u0000\u0000\u0000\u031a\u0318\u0001"+ - "\u0000\u0000\u0000\u031b\u031c\u0005\u000e\u0000\u0000\u031c\u031e\u0006"+ + "\u0000\u0000\u0000\u031b\u031c\u0005\u000f\u0000\u0000\u031c\u031e\u0006"+ "2\uffff\uffff\u0000\u031d\u031b\u0001\u0000\u0000\u0000\u031d\u031e\u0001"+ "\u0000\u0000\u0000\u031e\u0320\u0001\u0000\u0000\u0000\u031f\u0321\u0003"+ "n7\u0000\u0320\u031f\u0001\u0000\u0000\u0000\u0320\u0321\u0001\u0000\u0000"+ @@ -14377,85 +14380,85 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0323\u0322\u0001\u0000\u0000\u0000\u0324\u0325\u0001\u0000\u0000\u0000"+ "\u0325\u0323\u0001\u0000\u0000\u0000\u0325\u0326\u0001\u0000\u0000\u0000"+ "\u0326g\u0001\u0000\u0000\u0000\u0327\u032c\u0003f3\u0000\u0328\u0329"+ - "\u0005q\u0000\u0000\u0329\u032b\u0003f3\u0000\u032a\u0328\u0001\u0000"+ + "\u0005r\u0000\u0000\u0329\u032b\u0003f3\u0000\u032a\u0328\u0001\u0000"+ "\u0000\u0000\u032b\u032e\u0001\u0000\u0000\u0000\u032c\u032a\u0001\u0000"+ "\u0000\u0000\u032c\u032d\u0001\u0000\u0000\u0000\u032di\u0001\u0000\u0000"+ "\u0000\u032e\u032c\u0001\u0000\u0000\u0000\u032f\u0330\u0003f3\u0000\u0330"+ - "\u0332\u0005j\u0000\u0000\u0331\u0333\u0003h4\u0000\u0332\u0331\u0001"+ + "\u0332\u0005k\u0000\u0000\u0331\u0333\u0003h4\u0000\u0332\u0331\u0001"+ "\u0000\u0000\u0000\u0332\u0333\u0001\u0000\u0000\u0000\u0333\u0334\u0001"+ - "\u0000\u0000\u0000\u0334\u0335\u0005k\u0000\u0000\u0335k\u0001\u0000\u0000"+ - "\u0000\u0336\u033b\u0003j5\u0000\u0337\u0338\u0005q\u0000\u0000\u0338"+ + "\u0000\u0000\u0000\u0334\u0335\u0005l\u0000\u0000\u0335k\u0001\u0000\u0000"+ + "\u0000\u0336\u033b\u0003j5\u0000\u0337\u0338\u0005r\u0000\u0000\u0338"+ "\u033a\u0003j5\u0000\u0339\u0337\u0001\u0000\u0000\u0000\u033a\u033d\u0001"+ "\u0000\u0000\u0000\u033b\u0339\u0001\u0000\u0000\u0000\u033b\u033c\u0001"+ "\u0000\u0000\u0000\u033cm\u0001\u0000\u0000\u0000\u033d\u033b\u0001\u0000"+ - "\u0000\u0000\u033e\u033f\u0005N\u0000\u0000\u033f\u0341\u0005n\u0000\u0000"+ + "\u0000\u0000\u033e\u033f\u0005O\u0000\u0000\u033f\u0341\u0005o\u0000\u0000"+ "\u0340\u0342\u0003l6\u0000\u0341\u0340\u0001\u0000\u0000\u0000\u0341\u0342"+ "\u0001\u0000\u0000\u0000\u0342\u0343\u0001\u0000\u0000\u0000\u0343\u0344"+ - "\u0005o\u0000\u0000\u0344\u0345\u0003\u017e\u00bf\u0000\u0345o\u0001\u0000"+ - "\u0000\u0000\u0346\u0347\u0005\t\u0000\u0000\u0347\u034f\u0003t:\u0000"+ - "\u0348\u0349\u0005\n\u0000\u0000\u0349\u034f\u0003t:\u0000\u034a\u034b"+ - "\u0005\u000b\u0000\u0000\u034b\u034f\u0003t:\u0000\u034c\u034d\u0005\r"+ + "\u0005p\u0000\u0000\u0344\u0345\u0003\u017e\u00bf\u0000\u0345o\u0001\u0000"+ + "\u0000\u0000\u0346\u0347\u0005\n\u0000\u0000\u0347\u034f\u0003t:\u0000"+ + "\u0348\u0349\u0005\u000b\u0000\u0000\u0349\u034f\u0003t:\u0000\u034a\u034b"+ + "\u0005\f\u0000\u0000\u034b\u034f\u0003t:\u0000\u034c\u034d\u0005\u000e"+ "\u0000\u0000\u034d\u034f\u0003r9\u0000\u034e\u0346\u0001\u0000\u0000\u0000"+ "\u034e\u0348\u0001\u0000\u0000\u0000\u034e\u034a\u0001\u0000\u0000\u0000"+ "\u034e\u034c\u0001\u0000\u0000\u0000\u034fq\u0001\u0000\u0000\u0000\u0350"+ "\u0352\u0003\u00f6{\u0000\u0351\u0350\u0001\u0000\u0000\u0000\u0351\u0352"+ "\u0001\u0000\u0000\u0000\u0352\u0355\u0001\u0000\u0000\u0000\u0353\u0354"+ - "\u0005`\u0000\u0000\u0354\u0356\u0003\u00b4Z\u0000\u0355\u0353\u0001\u0000"+ + "\u0005a\u0000\u0000\u0354\u0356\u0003\u00b4Z\u0000\u0355\u0353\u0001\u0000"+ "\u0000\u0000\u0355\u0356\u0001\u0000\u0000\u0000\u0356s\u0001\u0000\u0000"+ "\u0000\u0357\u035a\u0001\u0000\u0000\u0000\u0358\u035a\u0003\u00b4Z\u0000"+ "\u0359\u0357\u0001\u0000\u0000\u0000\u0359\u0358\u0001\u0000\u0000\u0000"+ - "\u035au\u0001\u0000\u0000\u0000\u035b\u035c\u00057\u0000\u0000\u035c\u035d"+ - "\u0003\u00b4Z\u0000\u035d\u0361\u0005l\u0000\u0000\u035e\u0360\u0003x"+ + "\u035au\u0001\u0000\u0000\u0000\u035b\u035c\u00058\u0000\u0000\u035c\u035d"+ + "\u0003\u00b4Z\u0000\u035d\u0361\u0005m\u0000\u0000\u035e\u0360\u0003x"+ "<\u0000\u035f\u035e\u0001\u0000\u0000\u0000\u0360\u0363\u0001\u0000\u0000"+ "\u0000\u0361\u035f\u0001\u0000\u0000\u0000\u0361\u0362\u0001\u0000\u0000"+ "\u0000\u0362\u0364\u0001\u0000\u0000\u0000\u0363\u0361\u0001\u0000\u0000"+ - "\u0000\u0364\u0365\u0005m\u0000\u0000\u0365w\u0001\u0000\u0000\u0000\u0366"+ - "\u0367\u0003z=\u0000\u0367\u0369\u0005s\u0000\u0000\u0368\u036a\u0003"+ + "\u0000\u0364\u0365\u0005n\u0000\u0000\u0365w\u0001\u0000\u0000\u0000\u0366"+ + "\u0367\u0003z=\u0000\u0367\u0369\u0005t\u0000\u0000\u0368\u036a\u0003"+ "\u0100\u0080\u0000\u0369\u0368\u0001\u0000\u0000\u0000\u0369\u036a\u0001"+ - "\u0000\u0000\u0000\u036ay\u0001\u0000\u0000\u0000\u036b\u036c\u0005T\u0000"+ - "\u0000\u036c\u036f\u0003|>\u0000\u036d\u036f\u0005P\u0000\u0000\u036e"+ + "\u0000\u0000\u0000\u036ay\u0001\u0000\u0000\u0000\u036b\u036c\u0005U\u0000"+ + "\u0000\u036c\u036f\u0003|>\u0000\u036d\u036f\u0005Q\u0000\u0000\u036e"+ "\u036b\u0001\u0000\u0000\u0000\u036e\u036d\u0001\u0000\u0000\u0000\u036f"+ - "{\u0001\u0000\u0000\u0000\u0370\u0371\u0005%\u0000\u0000\u0371\u037e\u0005"+ - "i\u0000\u0000\u0372\u0373\u0003\u00dam\u0000\u0373\u0378\u0005l\u0000"+ - "\u0000\u0374\u0376\u0003~?\u0000\u0375\u0377\u0005q\u0000\u0000\u0376"+ + "{\u0001\u0000\u0000\u0000\u0370\u0371\u0005&\u0000\u0000\u0371\u037e\u0005"+ + "j\u0000\u0000\u0372\u0373\u0003\u00dam\u0000\u0373\u0378\u0005m\u0000"+ + "\u0000\u0374\u0376\u0003~?\u0000\u0375\u0377\u0005r\u0000\u0000\u0376"+ "\u0375\u0001\u0000\u0000\u0000\u0376\u0377\u0001\u0000\u0000\u0000\u0377"+ "\u0379\u0001\u0000\u0000\u0000\u0378\u0374\u0001\u0000\u0000\u0000\u0378"+ "\u0379\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000\u037a"+ - "\u037b\u0005m\u0000\u0000\u037b\u037e\u0001\u0000\u0000\u0000\u037c\u037e"+ + "\u037b\u0005n\u0000\u0000\u037b\u037e\u0001\u0000\u0000\u0000\u037c\u037e"+ "\u0003\u00b4Z\u0000\u037d\u0370\u0001\u0000\u0000\u0000\u037d\u0372\u0001"+ "\u0000\u0000\u0000\u037d\u037c\u0001\u0000\u0000\u0000\u037e}\u0001\u0000"+ - "\u0000\u0000\u037f\u0384\u0003|>\u0000\u0380\u0381\u0005q\u0000\u0000"+ + "\u0000\u0000\u037f\u0384\u0003|>\u0000\u0380\u0381\u0005r\u0000\u0000"+ "\u0381\u0383\u0003|>\u0000\u0382\u0380\u0001\u0000\u0000\u0000\u0383\u0386"+ "\u0001\u0000\u0000\u0000\u0384\u0382\u0001\u0000\u0000\u0000\u0384\u0385"+ "\u0001\u0000\u0000\u0000\u0385\u007f\u0001\u0000\u0000\u0000\u0386\u0384"+ - "\u0001\u0000\u0000\u0000\u0387\u038c\u0005l\u0000\u0000\u0388\u0389\u0005"+ - "<\u0000\u0000\u0389\u038a\u0003\u00f4z\u0000\u038a\u038b\u0003\u017e\u00bf"+ + "\u0001\u0000\u0000\u0000\u0387\u038c\u0005m\u0000\u0000\u0388\u0389\u0005"+ + "=\u0000\u0000\u0389\u038a\u0003\u00f4z\u0000\u038a\u038b\u0003\u017e\u00bf"+ "\u0000\u038b\u038d\u0001\u0000\u0000\u0000\u038c\u0388\u0001\u0000\u0000"+ "\u0000\u038c\u038d\u0001\u0000\u0000\u0000\u038d\u038f\u0001\u0000\u0000"+ "\u0000\u038e\u0390\u0003\u0100\u0080\u0000\u038f\u038e\u0001\u0000\u0000"+ "\u0000\u038f\u0390\u0001\u0000\u0000\u0000\u0390\u0391\u0001\u0000\u0000"+ - "\u0000\u0391\u0392\u0005m\u0000\u0000\u0392\u0081\u0001\u0000\u0000\u0000"+ - "\u0393\u0396\u0003\u0160\u00b0\u0000\u0394\u0396\u0005i\u0000\u0000\u0395"+ + "\u0000\u0391\u0392\u0005n\u0000\u0000\u0392\u0081\u0001\u0000\u0000\u0000"+ + "\u0393\u0396\u0003\u0160\u00b0\u0000\u0394\u0396\u0005j\u0000\u0000\u0395"+ "\u0393\u0001\u0000\u0000\u0000\u0395\u0394\u0001\u0000\u0000\u0000\u0396"+ - "\u039f\u0001\u0000\u0000\u0000\u0397\u039c\u0005l\u0000\u0000\u0398\u039a"+ - "\u0003\u0084B\u0000\u0399\u039b\u0005q\u0000\u0000\u039a\u0399\u0001\u0000"+ + "\u039f\u0001\u0000\u0000\u0000\u0397\u039c\u0005m\u0000\u0000\u0398\u039a"+ + "\u0003\u0084B\u0000\u0399\u039b\u0005r\u0000\u0000\u039a\u0399\u0001\u0000"+ "\u0000\u0000\u039a\u039b\u0001\u0000\u0000\u0000\u039b\u039d\u0001\u0000"+ "\u0000\u0000\u039c\u0398\u0001\u0000\u0000\u0000\u039c\u039d\u0001\u0000"+ - "\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u03a0\u0005m\u0000"+ + "\u0000\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u03a0\u0005n\u0000"+ "\u0000\u039f\u0397\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000"+ "\u0000\u03a0\u0083\u0001\u0000\u0000\u0000\u03a1\u03a6\u0003\u0086C\u0000"+ - "\u03a2\u03a3\u0005q\u0000\u0000\u03a3\u03a5\u0003\u0086C\u0000\u03a4\u03a2"+ + "\u03a2\u03a3\u0005r\u0000\u0000\u03a3\u03a5\u0003\u0086C\u0000\u03a4\u03a2"+ "\u0001\u0000\u0000\u0000\u03a5\u03a8\u0001\u0000\u0000\u0000\u03a6\u03a4"+ "\u0001\u0000\u0000\u0000\u03a6\u03a7\u0001\u0000\u0000\u0000\u03a7\u0085"+ "\u0001\u0000\u0000\u0000\u03a8\u03a6\u0001\u0000\u0000\u0000\u03a9\u03aa"+ - "\u0005i\u0000\u0000\u03aa\u03ac\u0005s\u0000\u0000\u03ab\u03a9\u0001\u0000"+ + "\u0005j\u0000\u0000\u03aa\u03ac\u0005t\u0000\u0000\u03ab\u03a9\u0001\u0000"+ "\u0000\u0000\u03ab\u03ac\u0001\u0000\u0000\u0000\u03ac\u03ad\u0001\u0000"+ "\u0000\u0000\u03ad\u03ae\u0003\u00b4Z\u0000\u03ae\u0087\u0001\u0000\u0000"+ - "\u0000\u03af\u03b0\u0005H\u0000\u0000\u03b0\u03b1\u0003\u00b4Z\u0000\u03b1"+ - "\u03b2\u0005\u000f\u0000\u0000\u03b2\u03b3\u0003\u0082A\u0000\u03b3\u03b4"+ + "\u0000\u03af\u03b0\u0005I\u0000\u0000\u03b0\u03b1\u0003\u00b4Z\u0000\u03b1"+ + "\u03b2\u0005\u0010\u0000\u0000\u03b2\u03b3\u0003\u0082A\u0000\u03b3\u03b4"+ "\u0003\u00fe\u007f\u0000\u03b4\u0089\u0001\u0000\u0000\u0000\u03b5\u03b6"+ - "\u0003\u00d2i\u0000\u03b6\u03b7\u0005\u000f\u0000\u0000\u03b7\u03ca\u0003"+ - "\u00d2i\u0000\u03b8\u03be\u0005l\u0000\u0000\u03b9\u03ba\u0003\u0092I"+ + "\u0003\u00d2i\u0000\u03b6\u03b7\u0005\u0010\u0000\u0000\u03b7\u03ca\u0003"+ + "\u00d2i\u0000\u03b8\u03be\u0005m\u0000\u0000\u03b9\u03ba\u0003\u0092I"+ "\u0000\u03ba\u03bb\u0003\u017e\u00bf\u0000\u03bb\u03bd\u0001\u0000\u0000"+ "\u0000\u03bc\u03b9\u0001\u0000\u0000\u0000\u03bd\u03c0\u0001\u0000\u0000"+ "\u0000\u03be\u03bc\u0001\u0000\u0000\u0000\u03be\u03bf\u0001\u0000\u0000"+ @@ -14464,88 +14467,88 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u03c3\u03c5\u0001\u0000\u0000\u0000\u03c4\u03c1\u0001\u0000\u0000\u0000"+ "\u03c5\u03c8\u0001\u0000\u0000\u0000\u03c6\u03c4\u0001\u0000\u0000\u0000"+ "\u03c6\u03c7\u0001\u0000\u0000\u0000\u03c7\u03c9\u0001\u0000\u0000\u0000"+ - "\u03c8\u03c6\u0001\u0000\u0000\u0000\u03c9\u03cb\u0005m\u0000\u0000\u03ca"+ + "\u03c8\u03c6\u0001\u0000\u0000\u0000\u03c9\u03cb\u0005n\u0000\u0000\u03ca"+ "\u03b8\u0001\u0000\u0000\u0000\u03ca\u03cb\u0001\u0000\u0000\u0000\u03cb"+ - "\u008b\u0001\u0000\u0000\u0000\u03cc\u03ce\u0005\u000e\u0000\u0000\u03cd"+ + "\u008b\u0001\u0000\u0000\u0000\u03cc\u03ce\u0005\u000f\u0000\u0000\u03cd"+ "\u03cc\u0001\u0000\u0000\u0000\u03cd\u03ce\u0001\u0000\u0000\u0000\u03ce"+ "\u03cf\u0001\u0000\u0000\u0000\u03cf\u03d0\u0003\u008eG\u0000\u03d0\u03d1"+ - "\u0005i\u0000\u0000\u03d1\u03d3\u0003\u014e\u00a7\u0000\u03d2\u03d4\u0003"+ + "\u0005j\u0000\u0000\u03d1\u03d3\u0003\u014e\u00a7\u0000\u03d2\u03d4\u0003"+ "\u00fe\u007f\u0000\u03d3\u03d2\u0001\u0000\u0000\u0000\u03d3\u03d4\u0001"+ "\u0000\u0000\u0000\u03d4\u008d\u0001\u0000\u0000\u0000\u03d5\u03d7\u0005"+ - "j\u0000\u0000\u03d6\u03d8\u0005i\u0000\u0000\u03d7\u03d6\u0001\u0000\u0000"+ + "k\u0000\u0000\u03d6\u03d8\u0005j\u0000\u0000\u03d7\u03d6\u0001\u0000\u0000"+ "\u0000\u03d7\u03d8\u0001\u0000\u0000\u0000\u03d8\u03da\u0001\u0000\u0000"+ - "\u0000\u03d9\u03db\u0005\u008b\u0000\u0000\u03da\u03d9\u0001\u0000\u0000"+ + "\u0000\u03d9\u03db\u0005\u008c\u0000\u0000\u03da\u03d9\u0001\u0000\u0000"+ "\u0000\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u03dc\u0001\u0000\u0000"+ - "\u0000\u03dc\u03dd\u0003\u013c\u009e\u0000\u03dd\u03de\u0005k\u0000\u0000"+ + "\u0000\u03dc\u03dd\u0003\u013c\u009e\u0000\u03dd\u03de\u0005l\u0000\u0000"+ "\u03de\u008f\u0001\u0000\u0000\u0000\u03df\u03e5\u0003\u00c4b\u0000\u03e0"+ - "\u03e1\u0003\u00d2i\u0000\u03e1\u03e2\u0005t\u0000\u0000\u03e2\u03e3\u0005"+ - "i\u0000\u0000\u03e3\u03e5\u0001\u0000\u0000\u0000\u03e4\u03df\u0001\u0000"+ + "\u03e1\u0003\u00d2i\u0000\u03e1\u03e2\u0005u\u0000\u0000\u03e2\u03e3\u0005"+ + "j\u0000\u0000\u03e3\u03e5\u0001\u0000\u0000\u0000\u03e4\u03df\u0001\u0000"+ "\u0000\u0000\u03e4\u03e0\u0001\u0000\u0000\u0000\u03e5\u0091\u0001\u0000"+ - "\u0000\u0000\u03e6\u03e7\u00059\u0000\u0000\u03e7\u03e8\u0005i\u0000\u0000"+ - "\u03e8\u03eb\u0005w\u0000\u0000\u03e9\u03ec\u0003\u0090H\u0000\u03ea\u03ec"+ + "\u0000\u0000\u03e6\u03e7\u0005:\u0000\u0000\u03e7\u03e8\u0005j\u0000\u0000"+ + "\u03e8\u03eb\u0005x\u0000\u0000\u03e9\u03ec\u0003\u0090H\u0000\u03ea\u03ec"+ "\u0003\u015e\u00af\u0000\u03eb\u03e9\u0001\u0000\u0000\u0000\u03eb\u03ea"+ "\u0001\u0000\u0000\u0000\u03ec\u0093\u0001\u0000\u0000\u0000\u03ed\u03ee"+ - "\u00050\u0000\u0000\u03ee\u03ef\u0005j\u0000\u0000\u03ef\u03f2\u0003\u00d2"+ - "i\u0000\u03f0\u03f1\u0005q\u0000\u0000\u03f1\u03f3\u0003\u00f6{\u0000"+ + "\u00051\u0000\u0000\u03ee\u03ef\u0005k\u0000\u0000\u03ef\u03f2\u0003\u00d2"+ + "i\u0000\u03f0\u03f1\u0005r\u0000\u0000\u03f1\u03f3\u0003\u00f6{\u0000"+ "\u03f2\u03f0\u0001\u0000\u0000\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000"+ - "\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0005k\u0000\u0000\u03f5"+ - "\u0095\u0001\u0000\u0000\u0000\u03f6\u03f7\u0005/\u0000\u0000\u03f7\u03f8"+ - "\u0005j\u0000\u0000\u03f8\u03f9\u0003\u00d2i\u0000\u03f9\u03fa\u0005k"+ + "\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0005l\u0000\u0000\u03f5"+ + "\u0095\u0001\u0000\u0000\u0000\u03f6\u03f7\u00050\u0000\u0000\u03f7\u03f8"+ + "\u0005k\u0000\u0000\u03f8\u03f9\u0003\u00d2i\u0000\u03f9\u03fa\u0005l"+ "\u0000\u0000\u03fa\u0097\u0001\u0000\u0000\u0000\u03fb\u03fe\u0003d2\u0000"+ "\u03fc\u03ff\u0003\u009aM\u0000\u03fd\u03ff\u0003\u009cN\u0000\u03fe\u03fc"+ "\u0001\u0000\u0000\u0000\u03fe\u03fd\u0001\u0000\u0000\u0000\u03ff\u0099"+ - "\u0001\u0000\u0000\u0000\u0400\u0401\u0005Q\u0000\u0000\u0401\u0402\u0005"+ - "i\u0000\u0000\u0402\u0404\u0003\u014e\u00a7\u0000\u0403\u0405\u0003\u0080"+ + "\u0001\u0000\u0000\u0000\u0400\u0401\u0005R\u0000\u0000\u0401\u0402\u0005"+ + "j\u0000\u0000\u0402\u0404\u0003\u014e\u00a7\u0000\u0403\u0405\u0003\u0080"+ "@\u0000\u0404\u0403\u0001\u0000\u0000\u0000\u0404\u0405\u0001\u0000\u0000"+ - "\u0000\u0405\u009b\u0001\u0000\u0000\u0000\u0406\u0407\u0005Q\u0000\u0000"+ - "\u0407\u0408\u0003\u00aaU\u0000\u0408\u0409\u0005i\u0000\u0000\u0409\u040b"+ + "\u0000\u0405\u009b\u0001\u0000\u0000\u0000\u0406\u0407\u0005R\u0000\u0000"+ + "\u0407\u0408\u0003\u00aaU\u0000\u0408\u0409\u0005j\u0000\u0000\u0409\u040b"+ "\u0003\u014e\u00a7\u0000\u040a\u040c\u0003\u0080@\u0000\u040b\u040a\u0001"+ "\u0000\u0000\u0000\u040b\u040c\u0001\u0000\u0000\u0000\u040c\u009d\u0001"+ - "\u0000\u0000\u0000\u040d\u0410\u0005\u001b\u0000\u0000\u040e\u0411\u0003"+ + "\u0000\u0000\u0000\u040d\u0410\u0005\u001c\u0000\u0000\u040e\u0411\u0003"+ "\u0098L\u0000\u040f\u0411\u0003\u00eew\u0000\u0410\u040e\u0001\u0000\u0000"+ "\u0000\u0410\u040f\u0001\u0000\u0000\u0000\u0411\u009f\u0001\u0000\u0000"+ - "\u0000\u0412\u0413\u00059\u0000\u0000\u0413\u0414\u0005i\u0000\u0000\u0414"+ + "\u0000\u0412\u0413\u0005:\u0000\u0000\u0413\u0414\u0005j\u0000\u0000\u0414"+ "\u0416\u0003\u0152\u00a9\u0000\u0415\u0417\u0003\u00a2Q\u0000\u0416\u0415"+ "\u0001\u0000\u0000\u0000\u0416\u0417\u0001\u0000\u0000\u0000\u0417\u00a1"+ - "\u0001\u0000\u0000\u0000\u0418\u0419\u0005l\u0000\u0000\u0419\u041a\u0003"+ - "\u00b4Z\u0000\u041a\u041b\u0003\u017e\u00bf\u0000\u041b\u041c\u0005m\u0000"+ - "\u0000\u041c\u00a3\u0001\u0000\u0000\u0000\u041d\u041e\u00059\u0000\u0000"+ - "\u041e\u041f\u0003\u00aaU\u0000\u041f\u0420\u0005i\u0000\u0000\u0420\u0422"+ + "\u0001\u0000\u0000\u0000\u0418\u0419\u0005m\u0000\u0000\u0419\u041a\u0003"+ + "\u00b4Z\u0000\u041a\u041b\u0003\u017e\u00bf\u0000\u041b\u041c\u0005n\u0000"+ + "\u0000\u041c\u00a3\u0001\u0000\u0000\u0000\u041d\u041e\u0005:\u0000\u0000"+ + "\u041e\u041f\u0003\u00aaU\u0000\u041f\u0420\u0005j\u0000\u0000\u0420\u0422"+ "\u0003\u0152\u00a9\u0000\u0421\u0423\u0003\u00a2Q\u0000\u0422\u0421\u0001"+ "\u0000\u0000\u0000\u0422\u0423\u0001\u0000\u0000\u0000\u0423\u00a5\u0001"+ "\u0000\u0000\u0000\u0424\u042c\u0003\u0006\u0003\u0000\u0425\u0428\u0003"+ - "\u00d2i\u0000\u0426\u0427\u0005p\u0000\u0000\u0427\u0429\u0003\u00f6{"+ + "\u00d2i\u0000\u0426\u0427\u0005q\u0000\u0000\u0427\u0429\u0003\u00f6{"+ "\u0000\u0428\u0426\u0001\u0000\u0000\u0000\u0428\u0429\u0001\u0000\u0000"+ - "\u0000\u0429\u042d\u0001\u0000\u0000\u0000\u042a\u042b\u0005p\u0000\u0000"+ + "\u0000\u0429\u042d\u0001\u0000\u0000\u0000\u042a\u042b\u0005q\u0000\u0000"+ "\u042b\u042d\u0003\u00f6{\u0000\u042c\u0425\u0001\u0000\u0000\u0000\u042c"+ "\u042a\u0001\u0000\u0000\u0000\u042d\u00a7\u0001\u0000\u0000\u0000\u042e"+ - "\u042f\u0003\u0006\u0003\u0000\u042f\u0430\u0005w\u0000\u0000\u0430\u0431"+ + "\u042f\u0003\u0006\u0003\u0000\u042f\u0430\u0005x\u0000\u0000\u0430\u0431"+ "\u0003\u00f6{\u0000\u0431\u00a9\u0001\u0000\u0000\u0000\u0432\u0434\u0005"+ - "j\u0000\u0000\u0433\u0435\u0003\b\u0004\u0000\u0434\u0433\u0001\u0000"+ + "k\u0000\u0000\u0433\u0435\u0003\b\u0004\u0000\u0434\u0433\u0001\u0000"+ "\u0000\u0000\u0434\u0435\u0001\u0000\u0000\u0000\u0435\u0436\u0001\u0000"+ - "\u0000\u0000\u0436\u0438\u0003\u00d2i\u0000\u0437\u0439\u0005q\u0000\u0000"+ + "\u0000\u0000\u0436\u0438\u0003\u00d2i\u0000\u0437\u0439\u0005r\u0000\u0000"+ "\u0438\u0437\u0001\u0000\u0000\u0000\u0438\u0439\u0001\u0000\u0000\u0000"+ - "\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0005k\u0000\u0000\u043b"+ + "\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0005l\u0000\u0000\u043b"+ "\u00ab\u0001\u0000\u0000\u0000\u043c\u043f\u0003\u00aeW\u0000\u043d\u043f"+ "\u0003\u00b0X\u0000\u043e\u043c\u0001\u0000\u0000\u0000\u043e\u043d\u0001"+ "\u0000\u0000\u0000\u043f\u00ad\u0001\u0000\u0000\u0000\u0440\u0442\u0003"+ "\u00f4z\u0000\u0441\u0440\u0001\u0000\u0000\u0000\u0441\u0442\u0001\u0000"+ "\u0000\u0000\u0442\u0443\u0001\u0000\u0000\u0000\u0443\u0444\u0003\u00b2"+ - "Y\u0000\u0444\u00af\u0001\u0000\u0000\u0000\u0445\u0447\u0005\u001b\u0000"+ + "Y\u0000\u0444\u00af\u0001\u0000\u0000\u0000\u0445\u0447\u0005\u001c\u0000"+ "\u0000\u0446\u0448\u0003\u00f4z\u0000\u0447\u0446\u0001\u0000\u0000\u0000"+ "\u0447\u0448\u0001\u0000\u0000\u0000\u0448\u0449\u0001\u0000\u0000\u0000"+ "\u0449\u044a\u0003\u00b2Y\u0000\u044a\u00b1\u0001\u0000\u0000\u0000\u044b"+ - "\u044d\u0005x\u0000\u0000\u044c\u044b\u0001\u0000\u0000\u0000\u044c\u044d"+ + "\u044d\u0005y\u0000\u0000\u044c\u044b\u0001\u0000\u0000\u0000\u044c\u044d"+ "\u0001\u0000\u0000\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f"+ "\u0003\u00d2i\u0000\u044f\u00b3\u0001\u0000\u0000\u0000\u0450\u0451\u0006"+ "Z\uffff\uffff\u0000\u0451\u0452\u0007\u0007\u0000\u0000\u0452\u0466\u0003"+ - "\u00b4Z\u000f\u0453\u0466\u0003\u00c4b\u0000\u0454\u0455\u0005\u0019\u0000"+ - "\u0000\u0455\u0456\u0003.\u0017\u0000\u0456\u0457\u0005\u001c\u0000\u0000"+ + "\u00b4Z\u000f\u0453\u0466\u0003\u00c4b\u0000\u0454\u0455\u0005\u001a\u0000"+ + "\u0000\u0455\u0456\u0003.\u0017\u0000\u0456\u0457\u0005\u001d\u0000\u0000"+ "\u0457\u0458\u0003\u00b4Z\u0003\u0458\u0466\u0001\u0000\u0000\u0000\u0459"+ - "\u045a\u0005\u001a\u0000\u0000\u045a\u045b\u0003\u00a8T\u0000\u045b\u045c"+ - "\u0005\u001c\u0000\u0000\u045c\u045d\u0003\u00b4Z\u0002\u045d\u0466\u0001"+ + "\u045a\u0005\u001b\u0000\u0000\u045a\u045b\u0003\u00a8T\u0000\u045b\u045c"+ + "\u0005\u001d\u0000\u0000\u045c\u045d\u0003\u00b4Z\u0002\u045d\u0466\u0001"+ "\u0000\u0000\u0000\u045e\u045f\u0007\b\u0000\u0000\u045f\u0460\u0003&"+ - "\u0013\u0000\u0460\u0461\u0005s\u0000\u0000\u0461\u0462\u0005s\u0000\u0000"+ + "\u0013\u0000\u0460\u0461\u0005t\u0000\u0000\u0461\u0462\u0005t\u0000\u0000"+ "\u0462\u0463\u0003*\u0015\u0000\u0463\u0464\u0003\u00b4Z\u0001\u0464\u0466"+ "\u0001\u0000\u0000\u0000\u0465\u0450\u0001\u0000\u0000\u0000\u0465\u0453"+ "\u0001\u0000\u0000\u0000\u0465\u0454\u0001\u0000\u0000\u0000\u0465\u0459"+ @@ -14557,13 +14560,13 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u00b4Z\f\u0470\u0471\n\n\u0000\u0000\u0471\u0472\u0007\f\u0000\u0000"+ "\u0472\u0489\u0003\u00b4Z\u000b\u0473\u0474\n\t\u0000\u0000\u0474\u0475"+ "\u0007\r\u0000\u0000\u0475\u0489\u0003\u00b4Z\n\u0476\u0477\n\u0007\u0000"+ - "\u0000\u0477\u0478\u0005z\u0000\u0000\u0478\u0489\u0003\u00b4Z\b\u0479"+ - "\u047a\n\u0006\u0000\u0000\u047a\u047b\u0005y\u0000\u0000\u047b\u0489"+ + "\u0000\u0477\u0478\u0005{\u0000\u0000\u0478\u0489\u0003\u00b4Z\b\u0479"+ + "\u047a\n\u0006\u0000\u0000\u047a\u047b\u0005z\u0000\u0000\u047b\u0489"+ "\u0003\u00b4Z\u0007\u047c\u047d\n\u0005\u0000\u0000\u047d\u047e\u0005"+ - "\"\u0000\u0000\u047e\u0489\u0003\u00b4Z\u0005\u047f\u0480\n\u0004\u0000"+ - "\u0000\u0480\u0481\u0005%\u0000\u0000\u0481\u0482\u0003\u00b4Z\u0000\u0482"+ - "\u0483\u0005s\u0000\u0000\u0483\u0484\u0003\u00b4Z\u0004\u0484\u0489\u0001"+ - "\u0000\u0000\u0000\u0485\u0486\n\b\u0000\u0000\u0486\u0487\u0005\u000f"+ + "#\u0000\u0000\u047e\u0489\u0003\u00b4Z\u0005\u047f\u0480\n\u0004\u0000"+ + "\u0000\u0480\u0481\u0005&\u0000\u0000\u0481\u0482\u0003\u00b4Z\u0000\u0482"+ + "\u0483\u0005t\u0000\u0000\u0483\u0484\u0003\u00b4Z\u0004\u0484\u0489\u0001"+ + "\u0000\u0000\u0000\u0485\u0486\n\b\u0000\u0000\u0486\u0487\u0005\u0010"+ "\u0000\u0000\u0487\u0489\u0003\u0082A\u0000\u0488\u0467\u0001\u0000\u0000"+ "\u0000\u0488\u046a\u0001\u0000\u0000\u0000\u0488\u046d\u0001\u0000\u0000"+ "\u0000\u0488\u0470\u0001\u0000\u0000\u0000\u0488\u0473\u0001\u0000\u0000"+ @@ -14592,51 +14595,51 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0000\u04a1\u049c\u0001\u0000\u0000\u0000\u04a1\u049d\u0001\u0000\u0000"+ "\u0000\u04a1\u049e\u0001\u0000\u0000\u0000\u04a1\u049f\u0001\u0000\u0000"+ "\u0000\u04a1\u04a0\u0001\u0000\u0000\u0000\u04a2\u00b7\u0001\u0000\u0000"+ - "\u0000\u04a3\u04a4\u0005$\u0000\u0000\u04a4\u04a5\u0003\u00b4Z\u0000\u04a5"+ - "\u00b9\u0001\u0000\u0000\u0000\u04a6\u04a7\u0005\\\u0000\u0000\u04a7\u04a9"+ + "\u0000\u04a3\u04a4\u0005%\u0000\u0000\u04a4\u04a5\u0003\u00b4Z\u0000\u04a5"+ + "\u00b9\u0001\u0000\u0000\u0000\u04a6\u04a7\u0005]\u0000\u0000\u04a7\u04a9"+ "\u0003\u00b4Z\u0000\u04a8\u04aa\u0003\u00fe\u007f\u0000\u04a9\u04a8\u0001"+ "\u0000\u0000\u0000\u04a9\u04aa\u0001\u0000\u0000\u0000\u04aa\u00bb\u0001"+ "\u0000\u0000\u0000\u04ab\u04ac\u0003\u00be_\u0000\u04ac\u04ad\u0003\u0136"+ - "\u009b\u0000\u04ad\u00bd\u0001\u0000\u0000\u0000\u04ae\u04af\u0005\f\u0000"+ + "\u009b\u0000\u04ad\u00bd\u0001\u0000\u0000\u0000\u04ae\u04af\u0005\r\u0000"+ "\u0000\u04af\u04b0\u0003\u00b4Z\u0000\u04b0\u04b1\u0003\u017e\u00bf\u0000"+ "\u04b1\u04b3\u0001\u0000\u0000\u0000\u04b2\u04ae\u0001\u0000\u0000\u0000"+ "\u04b3\u04b6\u0001\u0000\u0000\u0000\u04b4\u04b2\u0001\u0000\u0000\u0000"+ "\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04bb\u0001\u0000\u0000\u0000"+ - "\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b7\u04b8\u0005\r\u0000\u0000\u04b8"+ - "\u04b9\u0003r9\u0000\u04b9\u04ba\u0003\u017e\u00bf\u0000\u04ba\u04bc\u0001"+ - "\u0000\u0000\u0000\u04bb\u04b7\u0001\u0000\u0000\u0000\u04bb\u04bc\u0001"+ - "\u0000\u0000\u0000\u04bc\u00bf\u0001\u0000\u0000\u0000\u04bd\u04be\u0005"+ - "U\u0000\u0000\u04be\u04c3\u0003\u00b4Z\u0000\u04bf\u04c0\u0005U\u0000"+ - "\u0000\u04c0\u04c1\u0007\u0001\u0000\u0000\u04c1\u04c3\u0003.\u0017\u0000"+ - "\u04c2\u04bd\u0001\u0000\u0000\u0000\u04c2\u04bf\u0001\u0000\u0000\u0000"+ - "\u04c3\u00c1\u0001\u0000\u0000\u0000\u04c4\u04cd\u0005\u0003\u0000\u0000"+ - "\u04c5\u04cd\u0005\u0004\u0000\u0000\u04c6\u04cd\u0005h\u0000\u0000\u04c7"+ - "\u04cd\u0003\u015c\u00ae\u0000\u04c8\u04cd\u0003\u0170\u00b8\u0000\u04c9"+ - "\u04cd\u0005\u0001\u0000\u0000\u04ca\u04cd\u0005\u0093\u0000\u0000\u04cb"+ - "\u04cd\u0005\u0094\u0000\u0000\u04cc\u04c4\u0001\u0000\u0000\u0000\u04cc"+ - "\u04c5\u0001\u0000\u0000\u0000\u04cc\u04c6\u0001\u0000\u0000\u0000\u04cc"+ - "\u04c7\u0001\u0000\u0000\u0000\u04cc\u04c8\u0001\u0000\u0000\u0000\u04cc"+ - "\u04c9\u0001\u0000\u0000\u0000\u04cc\u04ca\u0001\u0000\u0000\u0000\u04cc"+ - "\u04cb\u0001\u0000\u0000\u0000\u04cd\u00c3\u0001\u0000\u0000\u0000\u04ce"+ - "\u04cf\u0006b\uffff\uffff\u0000\u04cf\u04df\u0003\u0158\u00ac\u0000\u04d0"+ - "\u04df\u0003\u0154\u00aa\u0000\u04d1\u04df\u0003\u017a\u00bd\u0000\u04d2"+ - "\u04df\u0003 \u0010\u0000\u04d3\u04df\u0003\u0096K\u0000\u04d4\u04df\u0003"+ - "\u0094J\u0000\u04d5\u04d6\u0005M\u0000\u0000\u04d6\u04d7\u0003\u00c4b"+ - "\u0000\u04d7\u04d8\u0003\u0178\u00bc\u0000\u04d8\u04df\u0001\u0000\u0000"+ - "\u0000\u04d9\u04da\u0007\u000e\u0000\u0000\u04da\u04db\u0005j\u0000\u0000"+ - "\u04db\u04dc\u0003\u00b4Z\u0000\u04dc\u04dd\u0005k\u0000\u0000\u04dd\u04df"+ + "\u04b6\u04b4\u0001\u0000\u0000\u0000\u04b7\u04b8\u0005\u000e\u0000\u0000"+ + "\u04b8\u04b9\u0003r9\u0000\u04b9\u04ba\u0003\u017e\u00bf\u0000\u04ba\u04bc"+ + "\u0001\u0000\u0000\u0000\u04bb\u04b7\u0001\u0000\u0000\u0000\u04bb\u04bc"+ + "\u0001\u0000\u0000\u0000\u04bc\u00bf\u0001\u0000\u0000\u0000\u04bd\u04be"+ + "\u0005V\u0000\u0000\u04be\u04c3\u0003\u00b4Z\u0000\u04bf\u04c0\u0005V"+ + "\u0000\u0000\u04c0\u04c1\u0007\u0001\u0000\u0000\u04c1\u04c3\u0003.\u0017"+ + "\u0000\u04c2\u04bd\u0001\u0000\u0000\u0000\u04c2\u04bf\u0001\u0000\u0000"+ + "\u0000\u04c3\u00c1\u0001\u0000\u0000\u0000\u04c4\u04cd\u0005\u0003\u0000"+ + "\u0000\u04c5\u04cd\u0005\u0004\u0000\u0000\u04c6\u04cd\u0005i\u0000\u0000"+ + "\u04c7\u04cd\u0003\u015c\u00ae\u0000\u04c8\u04cd\u0003\u0170\u00b8\u0000"+ + "\u04c9\u04cd\u0005\u0001\u0000\u0000\u04ca\u04cd\u0005\u0094\u0000\u0000"+ + "\u04cb\u04cd\u0005\u0095\u0000\u0000\u04cc\u04c4\u0001\u0000\u0000\u0000"+ + "\u04cc\u04c5\u0001\u0000\u0000\u0000\u04cc\u04c6\u0001\u0000\u0000\u0000"+ + "\u04cc\u04c7\u0001\u0000\u0000\u0000\u04cc\u04c8\u0001\u0000\u0000\u0000"+ + "\u04cc\u04c9\u0001\u0000\u0000\u0000\u04cc\u04ca\u0001\u0000\u0000\u0000"+ + "\u04cc\u04cb\u0001\u0000\u0000\u0000\u04cd\u00c3\u0001\u0000\u0000\u0000"+ + "\u04ce\u04cf\u0006b\uffff\uffff\u0000\u04cf\u04df\u0003\u0158\u00ac\u0000"+ + "\u04d0\u04df\u0003\u0154\u00aa\u0000\u04d1\u04df\u0003\u017a\u00bd\u0000"+ + "\u04d2\u04df\u0003 \u0010\u0000\u04d3\u04df\u0003\u0096K\u0000\u04d4\u04df"+ + "\u0003\u0094J\u0000\u04d5\u04d6\u0005N\u0000\u0000\u04d6\u04d7\u0003\u00c4"+ + "b\u0000\u04d7\u04d8\u0003\u0178\u00bc\u0000\u04d8\u04df\u0001\u0000\u0000"+ + "\u0000\u04d9\u04da\u0007\u000e\u0000\u0000\u04da\u04db\u0005k\u0000\u0000"+ + "\u04db\u04dc\u0003\u00b4Z\u0000\u04dc\u04dd\u0005l\u0000\u0000\u04dd\u04df"+ "\u0001\u0000\u0000\u0000\u04de\u04ce\u0001\u0000\u0000\u0000\u04de\u04d0"+ "\u0001\u0000\u0000\u0000\u04de\u04d1\u0001\u0000\u0000\u0000\u04de\u04d2"+ "\u0001\u0000\u0000\u0000\u04de\u04d3\u0001\u0000\u0000\u0000\u04de\u04d4"+ "\u0001\u0000\u0000\u0000\u04de\u04d5\u0001\u0000\u0000\u0000\u04de\u04d9"+ "\u0001\u0000\u0000\u0000\u04df\u04f6\u0001\u0000\u0000\u0000\u04e0\u04e1"+ - "\n\n\u0000\u0000\u04e1\u04e2\u0005t\u0000\u0000\u04e2\u04f5\u0005i\u0000"+ + "\n\n\u0000\u0000\u04e1\u04e2\u0005u\u0000\u0000\u04e2\u04f5\u0005j\u0000"+ "\u0000\u04e3\u04e4\n\t\u0000\u0000\u04e4\u04f5\u0003\u0174\u00ba\u0000"+ "\u04e5\u04e6\n\b\u0000\u0000\u04e6\u04f5\u0003\u00deo\u0000\u04e7\u04e8"+ "\n\u0007\u0000\u0000\u04e8\u04f5\u0003L&\u0000\u04e9\u04ea\n\u0006\u0000"+ "\u0000\u04ea\u04f5\u0003\u0176\u00bb\u0000\u04eb\u04ec\n\u0005\u0000\u0000"+ "\u04ec\u04f5\u0003\u0178\u00bc\u0000\u04ed\u04ee\n\u0003\u0000\u0000\u04ee"+ - "\u04ef\u0003\u0178\u00bc\u0000\u04ef\u04f0\u0005\u0010\u0000\u0000\u04f0"+ + "\u04ef\u0003\u0178\u00bc\u0000\u04ef\u04f0\u0005\u0011\u0000\u0000\u04f0"+ "\u04f1\u0003\u0082A\u0000\u04f1\u04f5\u0001\u0000\u0000\u0000\u04f2\u04f3"+ "\n\u0002\u0000\u0000\u04f3\u04f5\u0003\u00cae\u0000\u04f4\u04e0\u0001"+ "\u0000\u0000\u0000\u04f4\u04e3\u0001\u0000\u0000\u0000\u04f4\u04e5\u0001"+ @@ -14646,40 +14649,40 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0000\u0000\u0000\u04f6\u04f4\u0001\u0000\u0000\u0000\u04f6\u04f7\u0001"+ "\u0000\u0000\u0000\u04f7\u00c5\u0001\u0000\u0000\u0000\u04f8\u04f6\u0001"+ "\u0000\u0000\u0000\u04f9\u04fa\u0003d2\u0000\u04fa\u04fb\u0003\u00c8d"+ - "\u0000\u04fb\u00c7\u0001\u0000\u0000\u0000\u04fc\u04fe\u0005Q\u0000\u0000"+ - "\u04fd\u04ff\u0005i\u0000\u0000\u04fe\u04fd\u0001\u0000\u0000\u0000\u04fe"+ + "\u0000\u04fb\u00c7\u0001\u0000\u0000\u0000\u04fc\u04fe\u0005R\u0000\u0000"+ + "\u04fd\u04ff\u0005j\u0000\u0000\u04fe\u04fd\u0001\u0000\u0000\u0000\u04fe"+ "\u04ff\u0001\u0000\u0000\u0000\u04ff\u0500\u0001\u0000\u0000\u0000\u0500"+ "\u0502\u0003\u014e\u00a7\u0000\u0501\u0503\u0003\u0080@\u0000\u0502\u0501"+ "\u0001\u0000\u0000\u0000\u0502\u0503\u0001\u0000\u0000\u0000\u0503\u00c9"+ - "\u0001\u0000\u0000\u0000\u0504\u0506\u0005&\u0000\u0000\u0505\u0507\u0003"+ + "\u0001\u0000\u0000\u0000\u0504\u0506\u0005\'\u0000\u0000\u0505\u0507\u0003"+ "\u00f6{\u0000\u0506\u0505\u0001\u0000\u0000\u0000\u0506\u0507\u0001\u0000"+ - "\u0000\u0000\u0507\u0509\u0001\u0000\u0000\u0000\u0508\u050a\u0005q\u0000"+ + "\u0000\u0000\u0507\u0509\u0001\u0000\u0000\u0000\u0508\u050a\u0005r\u0000"+ "\u0000\u0509\u0508\u0001\u0000\u0000\u0000\u0509\u050a\u0001\u0000\u0000"+ - "\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050c\u0005\'\u0000\u0000"+ - "\u050c\u00cb\u0001\u0000\u0000\u0000\u050d\u050e\u0005R\u0000\u0000\u050e"+ - "\u0518\u0005l\u0000\u0000\u050f\u0513\u0003\u00d0h\u0000\u0510\u0513\u0003"+ + "\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050c\u0005(\u0000\u0000"+ + "\u050c\u00cb\u0001\u0000\u0000\u0000\u050d\u050e\u0005S\u0000\u0000\u050e"+ + "\u0518\u0005m\u0000\u0000\u050f\u0513\u0003\u00d0h\u0000\u0510\u0513\u0003"+ "\u013c\u009e\u0000\u0511\u0513\u0003\u00ceg\u0000\u0512\u050f\u0001\u0000"+ "\u0000\u0000\u0512\u0510\u0001\u0000\u0000\u0000\u0512\u0511\u0001\u0000"+ "\u0000\u0000\u0513\u0514\u0001\u0000\u0000\u0000\u0514\u0515\u0003\u017e"+ "\u00bf\u0000\u0515\u0517\u0001\u0000\u0000\u0000\u0516\u0512\u0001\u0000"+ "\u0000\u0000\u0517\u051a\u0001\u0000\u0000\u0000\u0518\u0516\u0001\u0000"+ "\u0000\u0000\u0518\u0519\u0001\u0000\u0000\u0000\u0519\u051b\u0001\u0000"+ - "\u0000\u0000\u051a\u0518\u0001\u0000\u0000\u0000\u051b\u051c\u0005m\u0000"+ - "\u0000\u051c\u00cd\u0001\u0000\u0000\u0000\u051d\u051e\u00059\u0000\u0000"+ - "\u051e\u051f\u0005i\u0000\u0000\u051f\u0520\u0003\u0152\u00a9\u0000\u0520"+ - "\u00cf\u0001\u0000\u0000\u0000\u0521\u0523\u0005\u001b\u0000\u0000\u0522"+ + "\u0000\u0000\u051a\u0518\u0001\u0000\u0000\u0000\u051b\u051c\u0005n\u0000"+ + "\u0000\u051c\u00cd\u0001\u0000\u0000\u0000\u051d\u051e\u0005:\u0000\u0000"+ + "\u051e\u051f\u0005j\u0000\u0000\u051f\u0520\u0003\u0152\u00a9\u0000\u0520"+ + "\u00cf\u0001\u0000\u0000\u0000\u0521\u0523\u0005\u001c\u0000\u0000\u0522"+ "\u0521\u0001\u0000\u0000\u0000\u0522\u0523\u0001\u0000\u0000\u0000\u0523"+ "\u0524\u0001\u0000\u0000\u0000\u0524\u0525\u0003d2\u0000\u0525\u0526\u0005"+ - "i\u0000\u0000\u0526\u0527\u0003\u0152\u00a9\u0000\u0527\u0528\u0003\u0150"+ - "\u00a8\u0000\u0528\u0531\u0001\u0000\u0000\u0000\u0529\u052b\u0005\u001b"+ + "j\u0000\u0000\u0526\u0527\u0003\u0152\u00a9\u0000\u0527\u0528\u0003\u0150"+ + "\u00a8\u0000\u0528\u0531\u0001\u0000\u0000\u0000\u0529\u052b\u0005\u001c"+ "\u0000\u0000\u052a\u0529\u0001\u0000\u0000\u0000\u052a\u052b\u0001\u0000"+ "\u0000\u0000\u052b\u052c\u0001\u0000\u0000\u0000\u052c\u052d\u0003d2\u0000"+ - "\u052d\u052e\u0005i\u0000\u0000\u052e\u052f\u0003\u0152\u00a9\u0000\u052f"+ + "\u052d\u052e\u0005j\u0000\u0000\u052e\u052f\u0003\u0152\u00a9\u0000\u052f"+ "\u0531\u0001\u0000\u0000\u0000\u0530\u0522\u0001\u0000\u0000\u0000\u0530"+ "\u052a\u0001\u0000\u0000\u0000\u0531\u00d1\u0001\u0000\u0000\u0000\u0532"+ "\u053a\u0003\u013c\u009e\u0000\u0533\u053a\u0003\u00d4j\u0000\u0534\u053a"+ - "\u0003P(\u0000\u0535\u0536\u0005j\u0000\u0000\u0536\u0537\u0003\u00d2"+ - "i\u0000\u0537\u0538\u0005k\u0000\u0000\u0538\u053a\u0001\u0000\u0000\u0000"+ + "\u0003P(\u0000\u0535\u0536\u0005k\u0000\u0000\u0536\u0537\u0003\u00d2"+ + "i\u0000\u0537\u0538\u0005l\u0000\u0000\u0538\u053a\u0001\u0000\u0000\u0000"+ "\u0539\u0532\u0001\u0000\u0000\u0000\u0539\u0533\u0001\u0000\u0000\u0000"+ "\u0539\u0534\u0001\u0000\u0000\u0000\u0539\u0535\u0001\u0000\u0000\u0000"+ "\u053a\u00d3\u0001\u0000\u0000\u0000\u053b\u0545\u0003\u013e\u009f\u0000"+ @@ -14692,16 +14695,16 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0001\u0000\u0000\u0000\u0544\u0540\u0001\u0000\u0000\u0000\u0544\u0541"+ "\u0001\u0000\u0000\u0000\u0544\u0542\u0001\u0000\u0000\u0000\u0544\u0543"+ "\u0001\u0000\u0000\u0000\u0545\u00d5\u0001\u0000\u0000\u0000\u0546\u0547"+ - "\u00059\u0000\u0000\u0547\u0548\u0003\u00d8l\u0000\u0548\u00d7\u0001\u0000"+ - "\u0000\u0000\u0549\u0555\u0005j\u0000\u0000\u054a\u054f\u0003\u00d2i\u0000"+ - "\u054b\u054c\u0005q\u0000\u0000\u054c\u054e\u0003\u00d2i\u0000\u054d\u054b"+ + "\u0005:\u0000\u0000\u0547\u0548\u0003\u00d8l\u0000\u0548\u00d7\u0001\u0000"+ + "\u0000\u0000\u0549\u0555\u0005k\u0000\u0000\u054a\u054f\u0003\u00d2i\u0000"+ + "\u054b\u054c\u0005r\u0000\u0000\u054c\u054e\u0003\u00d2i\u0000\u054d\u054b"+ "\u0001\u0000\u0000\u0000\u054e\u0551\u0001\u0000\u0000\u0000\u054f\u054d"+ "\u0001\u0000\u0000\u0000\u054f\u0550\u0001\u0000\u0000\u0000\u0550\u0553"+ "\u0001\u0000\u0000\u0000\u0551\u054f\u0001\u0000\u0000\u0000\u0552\u0554"+ - "\u0005q\u0000\u0000\u0553\u0552\u0001\u0000\u0000\u0000\u0553\u0554\u0001"+ + "\u0005r\u0000\u0000\u0553\u0552\u0001\u0000\u0000\u0000\u0553\u0554\u0001"+ "\u0000\u0000\u0000\u0554\u0556\u0001\u0000\u0000\u0000\u0555\u054a\u0001"+ "\u0000\u0000\u0000\u0555\u0556\u0001\u0000\u0000\u0000\u0556\u0557\u0001"+ - "\u0000\u0000\u0000\u0557\u0558\u0005k\u0000\u0000\u0558\u00d9\u0001\u0000"+ + "\u0000\u0000\u0000\u0557\u0558\u0005l\u0000\u0000\u0558\u00d9\u0001\u0000"+ "\u0000\u0000\u0559\u0561\u0003\u016e\u00b7\u0000\u055a\u0561\u0003\u013e"+ "\u009f\u0000\u055b\u0561\u0003\u00dcn\u0000\u055c\u0561\u0003\u0146\u00a3"+ "\u0000\u055d\u0561\u0003\u0148\u00a4\u0000\u055e\u0561\u0003P(\u0000\u055f"+ @@ -14709,281 +14712,281 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u055a\u0001\u0000\u0000\u0000\u0560\u055b\u0001\u0000\u0000\u0000\u0560"+ "\u055c\u0001\u0000\u0000\u0000\u0560\u055d\u0001\u0000\u0000\u0000\u0560"+ "\u055e\u0001\u0000\u0000\u0000\u0560\u055f\u0001\u0000\u0000\u0000\u0561"+ - "\u00db\u0001\u0000\u0000\u0000\u0562\u0563\u0005n\u0000\u0000\u0563\u0564"+ - "\u0005x\u0000\u0000\u0564\u0565\u0005o\u0000\u0000\u0565\u0566\u0003\u0142"+ - "\u00a1\u0000\u0566\u00dd\u0001\u0000\u0000\u0000\u0567\u0577\u0005n\u0000"+ + "\u00db\u0001\u0000\u0000\u0000\u0562\u0563\u0005o\u0000\u0000\u0563\u0564"+ + "\u0005y\u0000\u0000\u0564\u0565\u0005p\u0000\u0000\u0565\u0566\u0003\u0142"+ + "\u00a1\u0000\u0566\u00dd\u0001\u0000\u0000\u0000\u0567\u0577\u0005o\u0000"+ "\u0000\u0568\u056a\u0003\u00e0p\u0000\u0569\u0568\u0001\u0000\u0000\u0000"+ "\u0569\u056a\u0001\u0000\u0000\u0000\u056a\u056b\u0001\u0000\u0000\u0000"+ - "\u056b\u056d\u0005s\u0000\u0000\u056c\u056e\u0003\u00e2q\u0000\u056d\u056c"+ + "\u056b\u056d\u0005t\u0000\u0000\u056c\u056e\u0003\u00e2q\u0000\u056d\u056c"+ "\u0001\u0000\u0000\u0000\u056d\u056e\u0001\u0000\u0000\u0000\u056e\u0578"+ "\u0001\u0000\u0000\u0000\u056f\u0571\u0003\u00e0p\u0000\u0570\u056f\u0001"+ "\u0000\u0000\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u0572\u0001"+ - "\u0000\u0000\u0000\u0572\u0573\u0005s\u0000\u0000\u0573\u0574\u0003\u00e2"+ - "q\u0000\u0574\u0575\u0005s\u0000\u0000\u0575\u0576\u0003\u00e4r\u0000"+ + "\u0000\u0000\u0000\u0572\u0573\u0005t\u0000\u0000\u0573\u0574\u0003\u00e2"+ + "q\u0000\u0574\u0575\u0005t\u0000\u0000\u0575\u0576\u0003\u00e4r\u0000"+ "\u0576\u0578\u0001\u0000\u0000\u0000\u0577\u0569\u0001\u0000\u0000\u0000"+ "\u0577\u0570\u0001\u0000\u0000\u0000\u0578\u0579\u0001\u0000\u0000\u0000"+ - "\u0579\u057a\u0005o\u0000\u0000\u057a\u00df\u0001\u0000\u0000\u0000\u057b"+ + "\u0579\u057a\u0005p\u0000\u0000\u057a\u00df\u0001\u0000\u0000\u0000\u057b"+ "\u057c\u0003\u00b4Z\u0000\u057c\u00e1\u0001\u0000\u0000\u0000\u057d\u057e"+ "\u0003\u00b4Z\u0000\u057e\u00e3\u0001\u0000\u0000\u0000\u057f\u0580\u0003"+ "\u00b4Z\u0000\u0580\u00e5\u0001\u0000\u0000\u0000\u0581\u0583\u0007\u000f"+ "\u0000\u0000\u0582\u0581\u0001\u0000\u0000\u0000\u0582\u0583\u0001\u0000"+ - "\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584\u0585\u0005p\u0000"+ + "\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584\u0585\u0005q\u0000"+ "\u0000\u0585\u00e7\u0001\u0000\u0000\u0000\u0586\u0587\u0003\u00f6{\u0000"+ - "\u0587\u0588\u0005p\u0000\u0000\u0588\u058d\u0001\u0000\u0000\u0000\u0589"+ - "\u058a\u0003\u0006\u0003\u0000\u058a\u058b\u0005w\u0000\u0000\u058b\u058d"+ + "\u0587\u0588\u0005q\u0000\u0000\u0588\u058d\u0001\u0000\u0000\u0000\u0589"+ + "\u058a\u0003\u0006\u0003\u0000\u058a\u058b\u0005x\u0000\u0000\u058b\u058d"+ "\u0001\u0000\u0000\u0000\u058c\u0586\u0001\u0000\u0000\u0000\u058c\u0589"+ "\u0001\u0000\u0000\u0000\u058c\u058d\u0001\u0000\u0000\u0000\u058d\u058e"+ - "\u0001\u0000\u0000\u0000\u058e\u058f\u0005a\u0000\u0000\u058f\u0594\u0003"+ - "\u00b4Z\u0000\u0590\u0592\u0005K\u0000\u0000\u0591\u0593\u0005i\u0000"+ + "\u0001\u0000\u0000\u0000\u058e\u058f\u0005b\u0000\u0000\u058f\u0594\u0003"+ + "\u00b4Z\u0000\u0590\u0592\u0005L\u0000\u0000\u0591\u0593\u0005j\u0000"+ "\u0000\u0592\u0591\u0001\u0000\u0000\u0000\u0592\u0593\u0001\u0000\u0000"+ "\u0000\u0593\u0595\u0001\u0000\u0000\u0000\u0594\u0590\u0001\u0000\u0000"+ "\u0000\u0594\u0595\u0001\u0000\u0000\u0000\u0595\u00e9\u0001\u0000\u0000"+ - "\u0000\u0596\u0597\u0005\\\u0000\u0000\u0597\u0598\u0005i\u0000\u0000"+ - "\u0598\u00eb\u0001\u0000\u0000\u0000\u0599\u059a\u0003\u0170\u00b8\u0000"+ - "\u059a\u00ed\u0001\u0000\u0000\u0000\u059b\u059f\u0003\u00f0x\u0000\u059c"+ - "\u059f\u0003\u00f8|\u0000\u059d\u059f\u0003\u00fc~\u0000\u059e\u059b\u0001"+ - "\u0000\u0000\u0000\u059e\u059c\u0001\u0000\u0000\u0000\u059e\u059d\u0001"+ - "\u0000\u0000\u0000\u059f\u00ef\u0001\u0000\u0000\u0000\u05a0\u05ac\u0005"+ - "^\u0000\u0000\u05a1\u05ad\u0003\u00f2y\u0000\u05a2\u05a8\u0005j\u0000"+ - "\u0000\u05a3\u05a4\u0003\u00f2y\u0000\u05a4\u05a5\u0003\u017e\u00bf\u0000"+ - "\u05a5\u05a7\u0001\u0000\u0000\u0000\u05a6\u05a3\u0001\u0000\u0000\u0000"+ - "\u05a7\u05aa\u0001\u0000\u0000\u0000\u05a8\u05a6\u0001\u0000\u0000\u0000"+ - "\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u05ab\u0001\u0000\u0000\u0000"+ - "\u05aa\u05a8\u0001\u0000\u0000\u0000\u05ab\u05ad\u0005k\u0000\u0000\u05ac"+ - "\u05a1\u0001\u0000\u0000\u0000\u05ac\u05a2\u0001\u0000\u0000\u0000\u05ad"+ - "\u00f1\u0001\u0000\u0000\u0000\u05ae\u05b4\u0003\u00f4z\u0000\u05af\u05b1"+ - "\u0003\u00d2i\u0000\u05b0\u05af\u0001\u0000\u0000\u0000\u05b0\u05b1\u0001"+ - "\u0000\u0000\u0000\u05b1\u05b2\u0001\u0000\u0000\u0000\u05b2\u05b3\u0005"+ - "p\u0000\u0000\u05b3\u05b5\u0003\u00f6{\u0000\u05b4\u05b0\u0001\u0000\u0000"+ - "\u0000\u05b4\u05b5\u0001\u0000\u0000\u0000\u05b5\u00f3\u0001\u0000\u0000"+ - "\u0000\u05b6\u05bb\u0005i\u0000\u0000\u05b7\u05b8\u0005q\u0000\u0000\u05b8"+ - "\u05ba\u0005i\u0000\u0000\u05b9\u05b7\u0001\u0000\u0000\u0000\u05ba\u05bd"+ - "\u0001\u0000\u0000\u0000\u05bb\u05b9\u0001\u0000\u0000\u0000\u05bb\u05bc"+ - "\u0001\u0000\u0000\u0000\u05bc\u00f5\u0001\u0000\u0000\u0000\u05bd\u05bb"+ - "\u0001\u0000\u0000\u0000\u05be\u05c3\u0003\u00b4Z\u0000\u05bf\u05c0\u0005"+ - "q\u0000\u0000\u05c0\u05c2\u0003\u00b4Z\u0000\u05c1\u05bf\u0001\u0000\u0000"+ - "\u0000\u05c2\u05c5\u0001\u0000\u0000\u0000\u05c3\u05c1\u0001\u0000\u0000"+ - "\u0000\u05c3\u05c4\u0001\u0000\u0000\u0000\u05c4\u00f7\u0001\u0000\u0000"+ - "\u0000\u05c5\u05c3\u0001\u0000\u0000\u0000\u05c6\u05d2\u0005b\u0000\u0000"+ - "\u05c7\u05d3\u0003\u00fa}\u0000\u05c8\u05ce\u0005j\u0000\u0000\u05c9\u05ca"+ - "\u0003\u00fa}\u0000\u05ca\u05cb\u0003\u017e\u00bf\u0000\u05cb\u05cd\u0001"+ - "\u0000\u0000\u0000\u05cc\u05c9\u0001\u0000\u0000\u0000\u05cd\u05d0\u0001"+ - "\u0000\u0000\u0000\u05ce\u05cc\u0001\u0000\u0000\u0000\u05ce\u05cf\u0001"+ - "\u0000\u0000\u0000\u05cf\u05d1\u0001\u0000\u0000\u0000\u05d0\u05ce\u0001"+ - "\u0000\u0000\u0000\u05d1\u05d3\u0005k\u0000\u0000\u05d2\u05c7\u0001\u0000"+ - "\u0000\u0000\u05d2\u05c8\u0001\u0000\u0000\u0000\u05d3\u00f9\u0001\u0000"+ - "\u0000\u0000\u05d4\u05d6\u0005i\u0000\u0000\u05d5\u05d7\u0005p\u0000\u0000"+ - "\u05d6\u05d5\u0001\u0000\u0000\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000"+ - "\u05d7\u05d8\u0001\u0000\u0000\u0000\u05d8\u05d9\u0003\u00d2i\u0000\u05d9"+ - "\u00fb\u0001\u0000\u0000\u0000\u05da\u05e6\u0005g\u0000\u0000\u05db\u05e7"+ - "\u0003\u00a6S\u0000\u05dc\u05e2\u0005j\u0000\u0000\u05dd\u05de\u0003\u00a6"+ - "S\u0000\u05de\u05df\u0003\u017e\u00bf\u0000\u05df\u05e1\u0001\u0000\u0000"+ - "\u0000\u05e0\u05dd\u0001\u0000\u0000\u0000\u05e1\u05e4\u0001\u0000\u0000"+ - "\u0000\u05e2\u05e0\u0001\u0000\u0000\u0000\u05e2\u05e3\u0001\u0000\u0000"+ - "\u0000\u05e3\u05e5\u0001\u0000\u0000\u0000\u05e4\u05e2\u0001\u0000\u0000"+ - "\u0000\u05e5\u05e7\u0005k\u0000\u0000\u05e6\u05db\u0001\u0000\u0000\u0000"+ - "\u05e6\u05dc\u0001\u0000\u0000\u0000\u05e7\u00fd\u0001\u0000\u0000\u0000"+ - "\u05e8\u05ea\u0005l\u0000\u0000\u05e9\u05eb\u0003\u0100\u0080\u0000\u05ea"+ - "\u05e9\u0001\u0000\u0000\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb"+ - "\u05ec\u0001\u0000\u0000\u0000\u05ec\u05ed\u0005m\u0000\u0000\u05ed\u00ff"+ - "\u0001\u0000\u0000\u0000\u05ee\u05f0\u0005r\u0000\u0000\u05ef\u05ee\u0001"+ - "\u0000\u0000\u0000\u05ef\u05f0\u0001\u0000\u0000\u0000\u05f0\u05f6\u0001"+ - "\u0000\u0000\u0000\u05f1\u05f3\u0005\u00a3\u0000\u0000\u05f2\u05f1\u0001"+ - "\u0000\u0000\u0000\u05f2\u05f3\u0001\u0000\u0000\u0000\u05f3\u05f6\u0001"+ - "\u0000\u0000\u0000\u05f4\u05f6\u0004\u0080\u0012\u0000\u05f5\u05ef\u0001"+ - "\u0000\u0000\u0000\u05f5\u05f2\u0001\u0000\u0000\u0000\u05f5\u05f4\u0001"+ - "\u0000\u0000\u0000\u05f6\u05f7\u0001\u0000\u0000\u0000\u05f7\u05f8\u0003"+ - "\u00b6[\u0000\u05f8\u05f9\u0003\u017e\u00bf\u0000\u05f9\u05fb\u0001\u0000"+ - "\u0000\u0000\u05fa\u05f5\u0001\u0000\u0000\u0000\u05fb\u05fc\u0001\u0000"+ - "\u0000\u0000\u05fc\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000"+ - "\u0000\u0000\u05fd\u0101\u0001\u0000\u0000\u0000\u05fe\u0604\u0003\u0106"+ - "\u0083\u0000\u05ff\u0604\u0003\u0108\u0084\u0000\u0600\u0604\u0003\u010a"+ - "\u0085\u0000\u0601\u0604\u0003\u0104\u0082\u0000\u0602\u0604\u0003\u00a8"+ - "T\u0000\u0603\u05fe\u0001\u0000\u0000\u0000\u0603\u05ff\u0001\u0000\u0000"+ - "\u0000\u0603\u0600\u0001\u0000\u0000\u0000\u0603\u0601\u0001\u0000\u0000"+ - "\u0000\u0603\u0602\u0001\u0000\u0000\u0000\u0604\u0103\u0001\u0000\u0000"+ - "\u0000\u0605\u0606\u0003\u00b4Z\u0000\u0606\u0105\u0001\u0000\u0000\u0000"+ - "\u0607\u0608\u0003\u00b4Z\u0000\u0608\u0609\u0005\u008d\u0000\u0000\u0609"+ - "\u060a\u0003\u00b4Z\u0000\u060a\u0107\u0001\u0000\u0000\u0000\u060b\u060c"+ - "\u0003\u00b4Z\u0000\u060c\u060d\u0007\u0010\u0000\u0000\u060d\u0109\u0001"+ - "\u0000\u0000\u0000\u060e\u060f\u0003\u00f6{\u0000\u060f\u0610\u0003\u00e6"+ - "s\u0000\u0610\u0611\u0003\u00f6{\u0000\u0611\u010b\u0001\u0000\u0000\u0000"+ - "\u0612\u0613\u0007\u0011\u0000\u0000\u0613\u010d\u0001\u0000\u0000\u0000"+ - "\u0614\u0615\u0005i\u0000\u0000\u0615\u0617\u0005s\u0000\u0000\u0616\u0618"+ - "\u0003\u00b6[\u0000\u0617\u0616\u0001\u0000\u0000\u0000\u0617\u0618\u0001"+ - "\u0000\u0000\u0000\u0618\u010f\u0001\u0000\u0000\u0000\u0619\u061b\u0005"+ - "f\u0000\u0000\u061a\u061c\u0003\u00f6{\u0000\u061b\u061a\u0001\u0000\u0000"+ - "\u0000\u061b\u061c\u0001\u0000\u0000\u0000\u061c\u0111\u0001\u0000\u0000"+ - "\u0000\u061d\u061f\u0005O\u0000\u0000\u061e\u0620\u0005i\u0000\u0000\u061f"+ - "\u061e\u0001\u0000\u0000\u0000\u061f\u0620\u0001\u0000\u0000\u0000\u0620"+ - "\u0113\u0001\u0000\u0000\u0000\u0621\u0623\u0005c\u0000\u0000\u0622\u0624"+ - "\u0005i\u0000\u0000\u0623\u0622\u0001\u0000\u0000\u0000\u0623\u0624\u0001"+ - "\u0000\u0000\u0000\u0624\u0115\u0001\u0000\u0000\u0000\u0625\u0626\u0005"+ - "[\u0000\u0000\u0626\u0627\u0005i\u0000\u0000\u0627\u0117\u0001\u0000\u0000"+ - "\u0000\u0628\u0629\u0005_\u0000\u0000\u0629\u0119\u0001\u0000\u0000\u0000"+ - "\u062a\u0633\u0005`\u0000\u0000\u062b\u0634\u0003\u00b4Z\u0000\u062c\u062d"+ - "\u0003\u017e\u00bf\u0000\u062d\u062e\u0003\u00b4Z\u0000\u062e\u0634\u0001"+ - "\u0000\u0000\u0000\u062f\u0630\u0003\u0102\u0081\u0000\u0630\u0631\u0003"+ - "\u017e\u00bf\u0000\u0631\u0632\u0003\u00b4Z\u0000\u0632\u0634\u0001\u0000"+ - "\u0000\u0000\u0633\u062b\u0001\u0000\u0000\u0000\u0633\u062c\u0001\u0000"+ - "\u0000\u0000\u0633\u062f\u0001\u0000\u0000\u0000\u0634\u0635\u0001\u0000"+ - "\u0000\u0000\u0635\u063b\u0003\u00fe\u007f\u0000\u0636\u0639\u0005Z\u0000"+ - "\u0000\u0637\u063a\u0003\u011a\u008d\u0000\u0638\u063a\u0003\u00fe\u007f"+ - "\u0000\u0639\u0637\u0001\u0000\u0000\u0000\u0639\u0638\u0001\u0000\u0000"+ - "\u0000\u063a\u063c\u0001\u0000\u0000\u0000\u063b\u0636\u0001\u0000\u0000"+ - "\u0000\u063b\u063c\u0001\u0000\u0000\u0000\u063c\u011b\u0001\u0000\u0000"+ - "\u0000\u063d\u0640\u0003\u011e\u008f\u0000\u063e\u0640\u0003\u0124\u0092"+ - "\u0000\u063f\u063d\u0001\u0000\u0000\u0000\u063f\u063e\u0001\u0000\u0000"+ - "\u0000\u0640\u011d\u0001\u0000\u0000\u0000\u0641\u064c\u0005]\u0000\u0000"+ - "\u0642\u0644\u0003\u00b4Z\u0000\u0643\u0642\u0001\u0000\u0000\u0000\u0643"+ - "\u0644\u0001\u0000\u0000\u0000\u0644\u064d\u0001\u0000\u0000\u0000\u0645"+ - "\u0647\u0003\u0102\u0081\u0000\u0646\u0645\u0001\u0000\u0000\u0000\u0646"+ - "\u0647\u0001\u0000\u0000\u0000\u0647\u0648\u0001\u0000\u0000\u0000\u0648"+ - "\u064a\u0003\u017e\u00bf\u0000\u0649\u064b\u0003\u00b4Z\u0000\u064a\u0649"+ - "\u0001\u0000\u0000\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b\u064d"+ - "\u0001\u0000\u0000\u0000\u064c\u0643\u0001\u0000\u0000\u0000\u064c\u0646"+ - "\u0001\u0000\u0000\u0000\u064d\u064e\u0001\u0000\u0000\u0000\u064e\u0652"+ - "\u0005l\u0000\u0000\u064f\u0651\u0003\u0120\u0090\u0000\u0650\u064f\u0001"+ - "\u0000\u0000\u0000\u0651\u0654\u0001\u0000\u0000\u0000\u0652\u0650\u0001"+ - "\u0000\u0000\u0000\u0652\u0653\u0001\u0000\u0000\u0000\u0653\u0655\u0001"+ - "\u0000\u0000\u0000\u0654\u0652\u0001\u0000\u0000\u0000\u0655\u0656\u0005"+ - "m\u0000\u0000\u0656\u011f\u0001\u0000\u0000\u0000\u0657\u0658\u0003\u0122"+ - "\u0091\u0000\u0658\u065a\u0005s\u0000\u0000\u0659\u065b\u0003\u0100\u0080"+ - "\u0000\u065a\u0659\u0001\u0000\u0000\u0000\u065a\u065b\u0001\u0000\u0000"+ - "\u0000\u065b\u0121\u0001\u0000\u0000\u0000\u065c\u065d\u0005T\u0000\u0000"+ - "\u065d\u0660\u0003\u00f6{\u0000\u065e\u0660\u0005P\u0000\u0000\u065f\u065c"+ - "\u0001\u0000\u0000\u0000\u065f\u065e\u0001\u0000\u0000\u0000\u0660\u0123"+ - "\u0001\u0000\u0000\u0000\u0661\u066a\u0005]\u0000\u0000\u0662\u066b\u0003"+ - "\u0126\u0093\u0000\u0663\u0664\u0003\u017e\u00bf\u0000\u0664\u0665\u0003"+ - "\u0126\u0093\u0000\u0665\u066b\u0001\u0000\u0000\u0000\u0666\u0667\u0003"+ - "\u0102\u0081\u0000\u0667\u0668\u0003\u017e\u00bf\u0000\u0668\u0669\u0003"+ - "\u0126\u0093\u0000\u0669\u066b\u0001\u0000\u0000\u0000\u066a\u0662\u0001"+ - "\u0000\u0000\u0000\u066a\u0663\u0001\u0000\u0000\u0000\u066a\u0666\u0001"+ - "\u0000\u0000\u0000\u066b\u066c\u0001\u0000\u0000\u0000\u066c\u0670\u0005"+ - "l\u0000\u0000\u066d\u066f\u0003\u0128\u0094\u0000\u066e\u066d\u0001\u0000"+ - "\u0000\u0000\u066f\u0672\u0001\u0000\u0000\u0000\u0670\u066e\u0001\u0000"+ - "\u0000\u0000\u0670\u0671\u0001\u0000\u0000\u0000\u0671\u0673\u0001\u0000"+ - "\u0000\u0000\u0672\u0670\u0001\u0000\u0000\u0000\u0673\u0674\u0005m\u0000"+ - "\u0000\u0674\u0125\u0001\u0000\u0000\u0000\u0675\u0676\u0005i\u0000\u0000"+ - "\u0676\u0678\u0005w\u0000\u0000\u0677\u0675\u0001\u0000\u0000\u0000\u0677"+ - "\u0678\u0001\u0000\u0000\u0000\u0678\u0679\u0001\u0000\u0000\u0000\u0679"+ - "\u067a\u0003\u00c4b\u0000\u067a\u067b\u0005t\u0000\u0000\u067b\u067c\u0005"+ - "j\u0000\u0000\u067c\u067d\u0005b\u0000\u0000\u067d\u067e\u0005k\u0000"+ - "\u0000\u067e\u0127\u0001\u0000\u0000\u0000\u067f\u0680\u0003\u012a\u0095"+ - "\u0000\u0680\u0682\u0005s\u0000\u0000\u0681\u0683\u0003\u0100\u0080\u0000"+ - "\u0682\u0681\u0001\u0000\u0000\u0000\u0682\u0683\u0001\u0000\u0000\u0000"+ - "\u0683\u0129\u0001\u0000\u0000\u0000\u0684\u0685\u0005T\u0000\u0000\u0685"+ - "\u0688\u0003\u012c\u0096\u0000\u0686\u0688\u0005P\u0000\u0000\u0687\u0684"+ - "\u0001\u0000\u0000\u0000\u0687\u0686\u0001\u0000\u0000\u0000\u0688\u012b"+ - "\u0001\u0000\u0000\u0000\u0689\u068c\u0003\u00d2i\u0000\u068a\u068c\u0005"+ - "h\u0000\u0000\u068b\u0689\u0001\u0000\u0000\u0000\u068b\u068a\u0001\u0000"+ - "\u0000\u0000\u068c\u0694\u0001\u0000\u0000\u0000\u068d\u0690\u0005q\u0000"+ - "\u0000\u068e\u0691\u0003\u00d2i\u0000\u068f\u0691\u0005h\u0000\u0000\u0690"+ - "\u068e\u0001\u0000\u0000\u0000\u0690\u068f\u0001\u0000\u0000\u0000\u0691"+ - "\u0693\u0001\u0000\u0000\u0000\u0692\u068d\u0001\u0000\u0000\u0000\u0693"+ - "\u0696\u0001\u0000\u0000\u0000\u0694\u0692\u0001\u0000\u0000\u0000\u0694"+ - "\u0695\u0001\u0000\u0000\u0000\u0695\u012d\u0001\u0000\u0000\u0000\u0696"+ - "\u0694\u0001\u0000\u0000\u0000\u0697\u0698\u0005S\u0000\u0000\u0698\u069c"+ - "\u0005l\u0000\u0000\u0699\u069b\u0003\u0130\u0098\u0000\u069a\u0699\u0001"+ - "\u0000\u0000\u0000\u069b\u069e\u0001\u0000\u0000\u0000\u069c\u069a\u0001"+ - "\u0000\u0000\u0000\u069c\u069d\u0001\u0000\u0000\u0000\u069d\u069f\u0001"+ - "\u0000\u0000\u0000\u069e\u069c\u0001\u0000\u0000\u0000\u069f\u06a0\u0005"+ - "m\u0000\u0000\u06a0\u012f\u0001\u0000\u0000\u0000\u06a1\u06a2\u0003\u0132"+ - "\u0099\u0000\u06a2\u06a4\u0005s\u0000\u0000\u06a3\u06a5\u0003\u0100\u0080"+ - "\u0000\u06a4\u06a3\u0001\u0000\u0000\u0000\u06a4\u06a5\u0001\u0000\u0000"+ - "\u0000\u06a5\u0131\u0001\u0000\u0000\u0000\u06a6\u06a9\u0005T\u0000\u0000"+ - "\u06a7\u06aa\u0003\u0106\u0083\u0000\u06a8\u06aa\u0003\u0134\u009a\u0000"+ - "\u06a9\u06a7\u0001\u0000\u0000\u0000\u06a9\u06a8\u0001\u0000\u0000\u0000"+ - "\u06aa\u06ad\u0001\u0000\u0000\u0000\u06ab\u06ad\u0005P\u0000\u0000\u06ac"+ - "\u06a6\u0001\u0000\u0000\u0000\u06ac\u06ab\u0001\u0000\u0000\u0000\u06ad"+ - "\u0133\u0001\u0000\u0000\u0000\u06ae\u06af\u0003\u00f6{\u0000\u06af\u06b0"+ - "\u0005p\u0000\u0000\u06b0\u06b5\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003"+ - "\u00f4z\u0000\u06b2\u06b3\u0005w\u0000\u0000\u06b3\u06b5\u0001\u0000\u0000"+ - "\u0000\u06b4\u06ae\u0001\u0000\u0000\u0000\u06b4\u06b1\u0001\u0000\u0000"+ - "\u0000\u06b4\u06b5\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001\u0000\u0000"+ - "\u0000\u06b6\u06b7\u0003\u00b4Z\u0000\u06b7\u0135\u0001\u0000\u0000\u0000"+ - "\u06b8\u06c0\u0005d\u0000\u0000\u06b9\u06bb\u0003\u00b4Z\u0000\u06ba\u06b9"+ - "\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000\u06bb\u06c1"+ - "\u0001\u0000\u0000\u0000\u06bc\u06c1\u0003\u0138\u009c\u0000\u06bd\u06bf"+ - "\u0003\u00e8t\u0000\u06be\u06bd\u0001\u0000\u0000\u0000\u06be\u06bf\u0001"+ - "\u0000\u0000\u0000\u06bf\u06c1\u0001\u0000\u0000\u0000\u06c0\u06ba\u0001"+ - "\u0000\u0000\u0000\u06c0\u06bc\u0001\u0000\u0000\u0000\u06c0\u06be\u0001"+ - "\u0000\u0000\u0000\u06c1\u06c2\u0001\u0000\u0000\u0000\u06c2\u06c3\u0003"+ - "\u00fe\u007f\u0000\u06c3\u0137\u0001\u0000\u0000\u0000\u06c4\u06c6\u0003"+ - "\u0102\u0081\u0000\u06c5\u06c4\u0001\u0000\u0000\u0000\u06c5\u06c6\u0001"+ - "\u0000\u0000\u0000\u06c6\u06c7\u0001\u0000\u0000\u0000\u06c7\u06c9\u0003"+ - "\u017e\u00bf\u0000\u06c8\u06ca\u0003\u00b4Z\u0000\u06c9\u06c8\u0001\u0000"+ - "\u0000\u0000\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000"+ - "\u0000\u0000\u06cb\u06cd\u0003\u017e\u00bf\u0000\u06cc\u06ce\u0003\u0102"+ - "\u0081\u0000\u06cd\u06cc\u0001\u0000\u0000\u0000\u06cd\u06ce\u0001\u0000"+ - "\u0000\u0000\u06ce\u0139\u0001\u0000\u0000\u0000\u06cf\u06d0\u0005V\u0000"+ - "\u0000\u06d0\u06d1\u0003\u00b4Z\u0000\u06d1\u013b\u0001\u0000\u0000\u0000"+ - "\u06d2\u06d5\u0003\u0160\u00b0\u0000\u06d3\u06d5\u0005i\u0000\u0000\u06d4"+ - "\u06d2\u0001\u0000\u0000\u0000\u06d4\u06d3\u0001\u0000\u0000\u0000\u06d5"+ - "\u013d\u0001\u0000\u0000\u0000\u06d6\u06d7\u0005n\u0000\u0000\u06d7\u06d8"+ - "\u0003\u0140\u00a0\u0000\u06d8\u06d9\u0005o\u0000\u0000\u06d9\u06da\u0003"+ - "\u0142\u00a1\u0000\u06da\u013f\u0001\u0000\u0000\u0000\u06db\u06dc\u0003"+ - "\u00b4Z\u0000\u06dc\u0141\u0001\u0000\u0000\u0000\u06dd\u06de\u0003\u00d2"+ - "i\u0000\u06de\u0143\u0001\u0000\u0000\u0000\u06df\u06e0\u0005\u008b\u0000"+ - "\u0000\u06e0\u06e1\u0003\u00d2i\u0000\u06e1\u0145\u0001\u0000\u0000\u0000"+ - "\u06e2\u06e3\u0005n\u0000\u0000\u06e3\u06e4\u0005o\u0000\u0000\u06e4\u06e5"+ - "\u0003\u0142\u00a1\u0000\u06e5\u0147\u0001\u0000\u0000\u0000\u06e6\u06e7"+ - "\u0005W\u0000\u0000\u06e7\u06e8\u0005n\u0000\u0000\u06e8\u06e9\u0003\u00d2"+ - "i\u0000\u06e9\u06ea\u0005o\u0000\u0000\u06ea\u06eb\u0003\u0142\u00a1\u0000"+ - "\u06eb\u0149\u0001\u0000\u0000\u0000\u06ec\u06f2\u0005Y\u0000\u0000\u06ed"+ - "\u06ee\u0005Y\u0000\u0000\u06ee\u06f2\u0005\u008d\u0000\u0000\u06ef\u06f0"+ - "\u0005\u008d\u0000\u0000\u06f0\u06f2\u0005Y\u0000\u0000\u06f1\u06ec\u0001"+ + "\u0000\u0596\u0597\u0005]\u0000\u0000\u0597\u0598\u0005j\u0000\u0000\u0598"+ + "\u00eb\u0001\u0000\u0000\u0000\u0599\u059a\u0003\u0170\u00b8\u0000\u059a"+ + "\u00ed\u0001\u0000\u0000\u0000\u059b\u059f\u0003\u00f0x\u0000\u059c\u059f"+ + "\u0003\u00f8|\u0000\u059d\u059f\u0003\u00fc~\u0000\u059e\u059b\u0001\u0000"+ + "\u0000\u0000\u059e\u059c\u0001\u0000\u0000\u0000\u059e\u059d\u0001\u0000"+ + "\u0000\u0000\u059f\u00ef\u0001\u0000\u0000\u0000\u05a0\u05ac\u0005_\u0000"+ + "\u0000\u05a1\u05ad\u0003\u00f2y\u0000\u05a2\u05a8\u0005k\u0000\u0000\u05a3"+ + "\u05a4\u0003\u00f2y\u0000\u05a4\u05a5\u0003\u017e\u00bf\u0000\u05a5\u05a7"+ + "\u0001\u0000\u0000\u0000\u05a6\u05a3\u0001\u0000\u0000\u0000\u05a7\u05aa"+ + "\u0001\u0000\u0000\u0000\u05a8\u05a6\u0001\u0000\u0000\u0000\u05a8\u05a9"+ + "\u0001\u0000\u0000\u0000\u05a9\u05ab\u0001\u0000\u0000\u0000\u05aa\u05a8"+ + "\u0001\u0000\u0000\u0000\u05ab\u05ad\u0005l\u0000\u0000\u05ac\u05a1\u0001"+ + "\u0000\u0000\u0000\u05ac\u05a2\u0001\u0000\u0000\u0000\u05ad\u00f1\u0001"+ + "\u0000\u0000\u0000\u05ae\u05b4\u0003\u00f4z\u0000\u05af\u05b1\u0003\u00d2"+ + "i\u0000\u05b0\u05af\u0001\u0000\u0000\u0000\u05b0\u05b1\u0001\u0000\u0000"+ + "\u0000\u05b1\u05b2\u0001\u0000\u0000\u0000\u05b2\u05b3\u0005q\u0000\u0000"+ + "\u05b3\u05b5\u0003\u00f6{\u0000\u05b4\u05b0\u0001\u0000\u0000\u0000\u05b4"+ + "\u05b5\u0001\u0000\u0000\u0000\u05b5\u00f3\u0001\u0000\u0000\u0000\u05b6"+ + "\u05bb\u0005j\u0000\u0000\u05b7\u05b8\u0005r\u0000\u0000\u05b8\u05ba\u0005"+ + "j\u0000\u0000\u05b9\u05b7\u0001\u0000\u0000\u0000\u05ba\u05bd\u0001\u0000"+ + "\u0000\u0000\u05bb\u05b9\u0001\u0000\u0000\u0000\u05bb\u05bc\u0001\u0000"+ + "\u0000\u0000\u05bc\u00f5\u0001\u0000\u0000\u0000\u05bd\u05bb\u0001\u0000"+ + "\u0000\u0000\u05be\u05c3\u0003\u00b4Z\u0000\u05bf\u05c0\u0005r\u0000\u0000"+ + "\u05c0\u05c2\u0003\u00b4Z\u0000\u05c1\u05bf\u0001\u0000\u0000\u0000\u05c2"+ + "\u05c5\u0001\u0000\u0000\u0000\u05c3\u05c1\u0001\u0000\u0000\u0000\u05c3"+ + "\u05c4\u0001\u0000\u0000\u0000\u05c4\u00f7\u0001\u0000\u0000\u0000\u05c5"+ + "\u05c3\u0001\u0000\u0000\u0000\u05c6\u05d2\u0005c\u0000\u0000\u05c7\u05d3"+ + "\u0003\u00fa}\u0000\u05c8\u05ce\u0005k\u0000\u0000\u05c9\u05ca\u0003\u00fa"+ + "}\u0000\u05ca\u05cb\u0003\u017e\u00bf\u0000\u05cb\u05cd\u0001\u0000\u0000"+ + "\u0000\u05cc\u05c9\u0001\u0000\u0000\u0000\u05cd\u05d0\u0001\u0000\u0000"+ + "\u0000\u05ce\u05cc\u0001\u0000\u0000\u0000\u05ce\u05cf\u0001\u0000\u0000"+ + "\u0000\u05cf\u05d1\u0001\u0000\u0000\u0000\u05d0\u05ce\u0001\u0000\u0000"+ + "\u0000\u05d1\u05d3\u0005l\u0000\u0000\u05d2\u05c7\u0001\u0000\u0000\u0000"+ + "\u05d2\u05c8\u0001\u0000\u0000\u0000\u05d3\u00f9\u0001\u0000\u0000\u0000"+ + "\u05d4\u05d6\u0005j\u0000\u0000\u05d5\u05d7\u0005q\u0000\u0000\u05d6\u05d5"+ + "\u0001\u0000\u0000\u0000\u05d6\u05d7\u0001\u0000\u0000\u0000\u05d7\u05d8"+ + "\u0001\u0000\u0000\u0000\u05d8\u05d9\u0003\u00d2i\u0000\u05d9\u00fb\u0001"+ + "\u0000\u0000\u0000\u05da\u05e6\u0005h\u0000\u0000\u05db\u05e7\u0003\u00a6"+ + "S\u0000\u05dc\u05e2\u0005k\u0000\u0000\u05dd\u05de\u0003\u00a6S\u0000"+ + "\u05de\u05df\u0003\u017e\u00bf\u0000\u05df\u05e1\u0001\u0000\u0000\u0000"+ + "\u05e0\u05dd\u0001\u0000\u0000\u0000\u05e1\u05e4\u0001\u0000\u0000\u0000"+ + "\u05e2\u05e0\u0001\u0000\u0000\u0000\u05e2\u05e3\u0001\u0000\u0000\u0000"+ + "\u05e3\u05e5\u0001\u0000\u0000\u0000\u05e4\u05e2\u0001\u0000\u0000\u0000"+ + "\u05e5\u05e7\u0005l\u0000\u0000\u05e6\u05db\u0001\u0000\u0000\u0000\u05e6"+ + "\u05dc\u0001\u0000\u0000\u0000\u05e7\u00fd\u0001\u0000\u0000\u0000\u05e8"+ + "\u05ea\u0005m\u0000\u0000\u05e9\u05eb\u0003\u0100\u0080\u0000\u05ea\u05e9"+ + "\u0001\u0000\u0000\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb\u05ec"+ + "\u0001\u0000\u0000\u0000\u05ec\u05ed\u0005n\u0000\u0000\u05ed\u00ff\u0001"+ + "\u0000\u0000\u0000\u05ee\u05f0\u0005s\u0000\u0000\u05ef\u05ee\u0001\u0000"+ + "\u0000\u0000\u05ef\u05f0\u0001\u0000\u0000\u0000\u05f0\u05f6\u0001\u0000"+ + "\u0000\u0000\u05f1\u05f3\u0005\u00a4\u0000\u0000\u05f2\u05f1\u0001\u0000"+ + "\u0000\u0000\u05f2\u05f3\u0001\u0000\u0000\u0000\u05f3\u05f6\u0001\u0000"+ + "\u0000\u0000\u05f4\u05f6\u0004\u0080\u0012\u0000\u05f5\u05ef\u0001\u0000"+ + "\u0000\u0000\u05f5\u05f2\u0001\u0000\u0000\u0000\u05f5\u05f4\u0001\u0000"+ + "\u0000\u0000\u05f6\u05f7\u0001\u0000\u0000\u0000\u05f7\u05f8\u0003\u00b6"+ + "[\u0000\u05f8\u05f9\u0003\u017e\u00bf\u0000\u05f9\u05fb\u0001\u0000\u0000"+ + "\u0000\u05fa\u05f5\u0001\u0000\u0000\u0000\u05fb\u05fc\u0001\u0000\u0000"+ + "\u0000\u05fc\u05fa\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000\u0000"+ + "\u0000\u05fd\u0101\u0001\u0000\u0000\u0000\u05fe\u0604\u0003\u0106\u0083"+ + "\u0000\u05ff\u0604\u0003\u0108\u0084\u0000\u0600\u0604\u0003\u010a\u0085"+ + "\u0000\u0601\u0604\u0003\u0104\u0082\u0000\u0602\u0604\u0003\u00a8T\u0000"+ + "\u0603\u05fe\u0001\u0000\u0000\u0000\u0603\u05ff\u0001\u0000\u0000\u0000"+ + "\u0603\u0600\u0001\u0000\u0000\u0000\u0603\u0601\u0001\u0000\u0000\u0000"+ + "\u0603\u0602\u0001\u0000\u0000\u0000\u0604\u0103\u0001\u0000\u0000\u0000"+ + "\u0605\u0606\u0003\u00b4Z\u0000\u0606\u0105\u0001\u0000\u0000\u0000\u0607"+ + "\u0608\u0003\u00b4Z\u0000\u0608\u0609\u0005\u008e\u0000\u0000\u0609\u060a"+ + "\u0003\u00b4Z\u0000\u060a\u0107\u0001\u0000\u0000\u0000\u060b\u060c\u0003"+ + "\u00b4Z\u0000\u060c\u060d\u0007\u0010\u0000\u0000\u060d\u0109\u0001\u0000"+ + "\u0000\u0000\u060e\u060f\u0003\u00f6{\u0000\u060f\u0610\u0003\u00e6s\u0000"+ + "\u0610\u0611\u0003\u00f6{\u0000\u0611\u010b\u0001\u0000\u0000\u0000\u0612"+ + "\u0613\u0007\u0011\u0000\u0000\u0613\u010d\u0001\u0000\u0000\u0000\u0614"+ + "\u0615\u0005j\u0000\u0000\u0615\u0617\u0005t\u0000\u0000\u0616\u0618\u0003"+ + "\u00b6[\u0000\u0617\u0616\u0001\u0000\u0000\u0000\u0617\u0618\u0001\u0000"+ + "\u0000\u0000\u0618\u010f\u0001\u0000\u0000\u0000\u0619\u061b\u0005g\u0000"+ + "\u0000\u061a\u061c\u0003\u00f6{\u0000\u061b\u061a\u0001\u0000\u0000\u0000"+ + "\u061b\u061c\u0001\u0000\u0000\u0000\u061c\u0111\u0001\u0000\u0000\u0000"+ + "\u061d\u061f\u0005P\u0000\u0000\u061e\u0620\u0005j\u0000\u0000\u061f\u061e"+ + "\u0001\u0000\u0000\u0000\u061f\u0620\u0001\u0000\u0000\u0000\u0620\u0113"+ + "\u0001\u0000\u0000\u0000\u0621\u0623\u0005d\u0000\u0000\u0622\u0624\u0005"+ + "j\u0000\u0000\u0623\u0622\u0001\u0000\u0000\u0000\u0623\u0624\u0001\u0000"+ + "\u0000\u0000\u0624\u0115\u0001\u0000\u0000\u0000\u0625\u0626\u0005\\\u0000"+ + "\u0000\u0626\u0627\u0005j\u0000\u0000\u0627\u0117\u0001\u0000\u0000\u0000"+ + "\u0628\u0629\u0005`\u0000\u0000\u0629\u0119\u0001\u0000\u0000\u0000\u062a"+ + "\u0633\u0005a\u0000\u0000\u062b\u0634\u0003\u00b4Z\u0000\u062c\u062d\u0003"+ + "\u017e\u00bf\u0000\u062d\u062e\u0003\u00b4Z\u0000\u062e\u0634\u0001\u0000"+ + "\u0000\u0000\u062f\u0630\u0003\u0102\u0081\u0000\u0630\u0631\u0003\u017e"+ + "\u00bf\u0000\u0631\u0632\u0003\u00b4Z\u0000\u0632\u0634\u0001\u0000\u0000"+ + "\u0000\u0633\u062b\u0001\u0000\u0000\u0000\u0633\u062c\u0001\u0000\u0000"+ + "\u0000\u0633\u062f\u0001\u0000\u0000\u0000\u0634\u0635\u0001\u0000\u0000"+ + "\u0000\u0635\u063b\u0003\u00fe\u007f\u0000\u0636\u0639\u0005[\u0000\u0000"+ + "\u0637\u063a\u0003\u011a\u008d\u0000\u0638\u063a\u0003\u00fe\u007f\u0000"+ + "\u0639\u0637\u0001\u0000\u0000\u0000\u0639\u0638\u0001\u0000\u0000\u0000"+ + "\u063a\u063c\u0001\u0000\u0000\u0000\u063b\u0636\u0001\u0000\u0000\u0000"+ + "\u063b\u063c\u0001\u0000\u0000\u0000\u063c\u011b\u0001\u0000\u0000\u0000"+ + "\u063d\u0640\u0003\u011e\u008f\u0000\u063e\u0640\u0003\u0124\u0092\u0000"+ + "\u063f\u063d\u0001\u0000\u0000\u0000\u063f\u063e\u0001\u0000\u0000\u0000"+ + "\u0640\u011d\u0001\u0000\u0000\u0000\u0641\u064c\u0005^\u0000\u0000\u0642"+ + "\u0644\u0003\u00b4Z\u0000\u0643\u0642\u0001\u0000\u0000\u0000\u0643\u0644"+ + "\u0001\u0000\u0000\u0000\u0644\u064d\u0001\u0000\u0000\u0000\u0645\u0647"+ + "\u0003\u0102\u0081\u0000\u0646\u0645\u0001\u0000\u0000\u0000\u0646\u0647"+ + "\u0001\u0000\u0000\u0000\u0647\u0648\u0001\u0000\u0000\u0000\u0648\u064a"+ + "\u0003\u017e\u00bf\u0000\u0649\u064b\u0003\u00b4Z\u0000\u064a\u0649\u0001"+ + "\u0000\u0000\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b\u064d\u0001"+ + "\u0000\u0000\u0000\u064c\u0643\u0001\u0000\u0000\u0000\u064c\u0646\u0001"+ + "\u0000\u0000\u0000\u064d\u064e\u0001\u0000\u0000\u0000\u064e\u0652\u0005"+ + "m\u0000\u0000\u064f\u0651\u0003\u0120\u0090\u0000\u0650\u064f\u0001\u0000"+ + "\u0000\u0000\u0651\u0654\u0001\u0000\u0000\u0000\u0652\u0650\u0001\u0000"+ + "\u0000\u0000\u0652\u0653\u0001\u0000\u0000\u0000\u0653\u0655\u0001\u0000"+ + "\u0000\u0000\u0654\u0652\u0001\u0000\u0000\u0000\u0655\u0656\u0005n\u0000"+ + "\u0000\u0656\u011f\u0001\u0000\u0000\u0000\u0657\u0658\u0003\u0122\u0091"+ + "\u0000\u0658\u065a\u0005t\u0000\u0000\u0659\u065b\u0003\u0100\u0080\u0000"+ + "\u065a\u0659\u0001\u0000\u0000\u0000\u065a\u065b\u0001\u0000\u0000\u0000"+ + "\u065b\u0121\u0001\u0000\u0000\u0000\u065c\u065d\u0005U\u0000\u0000\u065d"+ + "\u0660\u0003\u00f6{\u0000\u065e\u0660\u0005Q\u0000\u0000\u065f\u065c\u0001"+ + "\u0000\u0000\u0000\u065f\u065e\u0001\u0000\u0000\u0000\u0660\u0123\u0001"+ + "\u0000\u0000\u0000\u0661\u066a\u0005^\u0000\u0000\u0662\u066b\u0003\u0126"+ + "\u0093\u0000\u0663\u0664\u0003\u017e\u00bf\u0000\u0664\u0665\u0003\u0126"+ + "\u0093\u0000\u0665\u066b\u0001\u0000\u0000\u0000\u0666\u0667\u0003\u0102"+ + "\u0081\u0000\u0667\u0668\u0003\u017e\u00bf\u0000\u0668\u0669\u0003\u0126"+ + "\u0093\u0000\u0669\u066b\u0001\u0000\u0000\u0000\u066a\u0662\u0001\u0000"+ + "\u0000\u0000\u066a\u0663\u0001\u0000\u0000\u0000\u066a\u0666\u0001\u0000"+ + "\u0000\u0000\u066b\u066c\u0001\u0000\u0000\u0000\u066c\u0670\u0005m\u0000"+ + "\u0000\u066d\u066f\u0003\u0128\u0094\u0000\u066e\u066d\u0001\u0000\u0000"+ + "\u0000\u066f\u0672\u0001\u0000\u0000\u0000\u0670\u066e\u0001\u0000\u0000"+ + "\u0000\u0670\u0671\u0001\u0000\u0000\u0000\u0671\u0673\u0001\u0000\u0000"+ + "\u0000\u0672\u0670\u0001\u0000\u0000\u0000\u0673\u0674\u0005n\u0000\u0000"+ + "\u0674\u0125\u0001\u0000\u0000\u0000\u0675\u0676\u0005j\u0000\u0000\u0676"+ + "\u0678\u0005x\u0000\u0000\u0677\u0675\u0001\u0000\u0000\u0000\u0677\u0678"+ + "\u0001\u0000\u0000\u0000\u0678\u0679\u0001\u0000\u0000\u0000\u0679\u067a"+ + "\u0003\u00c4b\u0000\u067a\u067b\u0005u\u0000\u0000\u067b\u067c\u0005k"+ + "\u0000\u0000\u067c\u067d\u0005c\u0000\u0000\u067d\u067e\u0005l\u0000\u0000"+ + "\u067e\u0127\u0001\u0000\u0000\u0000\u067f\u0680\u0003\u012a\u0095\u0000"+ + "\u0680\u0682\u0005t\u0000\u0000\u0681\u0683\u0003\u0100\u0080\u0000\u0682"+ + "\u0681\u0001\u0000\u0000\u0000\u0682\u0683\u0001\u0000\u0000\u0000\u0683"+ + "\u0129\u0001\u0000\u0000\u0000\u0684\u0685\u0005U\u0000\u0000\u0685\u0688"+ + "\u0003\u012c\u0096\u0000\u0686\u0688\u0005Q\u0000\u0000\u0687\u0684\u0001"+ + "\u0000\u0000\u0000\u0687\u0686\u0001\u0000\u0000\u0000\u0688\u012b\u0001"+ + "\u0000\u0000\u0000\u0689\u068c\u0003\u00d2i\u0000\u068a\u068c\u0005i\u0000"+ + "\u0000\u068b\u0689\u0001\u0000\u0000\u0000\u068b\u068a\u0001\u0000\u0000"+ + "\u0000\u068c\u0694\u0001\u0000\u0000\u0000\u068d\u0690\u0005r\u0000\u0000"+ + "\u068e\u0691\u0003\u00d2i\u0000\u068f\u0691\u0005i\u0000\u0000\u0690\u068e"+ + "\u0001\u0000\u0000\u0000\u0690\u068f\u0001\u0000\u0000\u0000\u0691\u0693"+ + "\u0001\u0000\u0000\u0000\u0692\u068d\u0001\u0000\u0000\u0000\u0693\u0696"+ + "\u0001\u0000\u0000\u0000\u0694\u0692\u0001\u0000\u0000\u0000\u0694\u0695"+ + "\u0001\u0000\u0000\u0000\u0695\u012d\u0001\u0000\u0000\u0000\u0696\u0694"+ + "\u0001\u0000\u0000\u0000\u0697\u0698\u0005T\u0000\u0000\u0698\u069c\u0005"+ + "m\u0000\u0000\u0699\u069b\u0003\u0130\u0098\u0000\u069a\u0699\u0001\u0000"+ + "\u0000\u0000\u069b\u069e\u0001\u0000\u0000\u0000\u069c\u069a\u0001\u0000"+ + "\u0000\u0000\u069c\u069d\u0001\u0000\u0000\u0000\u069d\u069f\u0001\u0000"+ + "\u0000\u0000\u069e\u069c\u0001\u0000\u0000\u0000\u069f\u06a0\u0005n\u0000"+ + "\u0000\u06a0\u012f\u0001\u0000\u0000\u0000\u06a1\u06a2\u0003\u0132\u0099"+ + "\u0000\u06a2\u06a4\u0005t\u0000\u0000\u06a3\u06a5\u0003\u0100\u0080\u0000"+ + "\u06a4\u06a3\u0001\u0000\u0000\u0000\u06a4\u06a5\u0001\u0000\u0000\u0000"+ + "\u06a5\u0131\u0001\u0000\u0000\u0000\u06a6\u06a9\u0005U\u0000\u0000\u06a7"+ + "\u06aa\u0003\u0106\u0083\u0000\u06a8\u06aa\u0003\u0134\u009a\u0000\u06a9"+ + "\u06a7\u0001\u0000\u0000\u0000\u06a9\u06a8\u0001\u0000\u0000\u0000\u06aa"+ + "\u06ad\u0001\u0000\u0000\u0000\u06ab\u06ad\u0005Q\u0000\u0000\u06ac\u06a6"+ + "\u0001\u0000\u0000\u0000\u06ac\u06ab\u0001\u0000\u0000\u0000\u06ad\u0133"+ + "\u0001\u0000\u0000\u0000\u06ae\u06af\u0003\u00f6{\u0000\u06af\u06b0\u0005"+ + "q\u0000\u0000\u06b0\u06b5\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003\u00f4"+ + "z\u0000\u06b2\u06b3\u0005x\u0000\u0000\u06b3\u06b5\u0001\u0000\u0000\u0000"+ + "\u06b4\u06ae\u0001\u0000\u0000\u0000\u06b4\u06b1\u0001\u0000\u0000\u0000"+ + "\u06b4\u06b5\u0001\u0000\u0000\u0000\u06b5\u06b6\u0001\u0000\u0000\u0000"+ + "\u06b6\u06b7\u0003\u00b4Z\u0000\u06b7\u0135\u0001\u0000\u0000\u0000\u06b8"+ + "\u06c0\u0005e\u0000\u0000\u06b9\u06bb\u0003\u00b4Z\u0000\u06ba\u06b9\u0001"+ + "\u0000\u0000\u0000\u06ba\u06bb\u0001\u0000\u0000\u0000\u06bb\u06c1\u0001"+ + "\u0000\u0000\u0000\u06bc\u06c1\u0003\u0138\u009c\u0000\u06bd\u06bf\u0003"+ + "\u00e8t\u0000\u06be\u06bd\u0001\u0000\u0000\u0000\u06be\u06bf\u0001\u0000"+ + "\u0000\u0000\u06bf\u06c1\u0001\u0000\u0000\u0000\u06c0\u06ba\u0001\u0000"+ + "\u0000\u0000\u06c0\u06bc\u0001\u0000\u0000\u0000\u06c0\u06be\u0001\u0000"+ + "\u0000\u0000\u06c1\u06c2\u0001\u0000\u0000\u0000\u06c2\u06c3\u0003\u00fe"+ + "\u007f\u0000\u06c3\u0137\u0001\u0000\u0000\u0000\u06c4\u06c6\u0003\u0102"+ + "\u0081\u0000\u06c5\u06c4\u0001\u0000\u0000\u0000\u06c5\u06c6\u0001\u0000"+ + "\u0000\u0000\u06c6\u06c7\u0001\u0000\u0000\u0000\u06c7\u06c9\u0003\u017e"+ + "\u00bf\u0000\u06c8\u06ca\u0003\u00b4Z\u0000\u06c9\u06c8\u0001\u0000\u0000"+ + "\u0000\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000\u0000"+ + "\u0000\u06cb\u06cd\u0003\u017e\u00bf\u0000\u06cc\u06ce\u0003\u0102\u0081"+ + "\u0000\u06cd\u06cc\u0001\u0000\u0000\u0000\u06cd\u06ce\u0001\u0000\u0000"+ + "\u0000\u06ce\u0139\u0001\u0000\u0000\u0000\u06cf\u06d0\u0005W\u0000\u0000"+ + "\u06d0\u06d1\u0003\u00b4Z\u0000\u06d1\u013b\u0001\u0000\u0000\u0000\u06d2"+ + "\u06d5\u0003\u0160\u00b0\u0000\u06d3\u06d5\u0005j\u0000\u0000\u06d4\u06d2"+ + "\u0001\u0000\u0000\u0000\u06d4\u06d3\u0001\u0000\u0000\u0000\u06d5\u013d"+ + "\u0001\u0000\u0000\u0000\u06d6\u06d7\u0005o\u0000\u0000\u06d7\u06d8\u0003"+ + "\u0140\u00a0\u0000\u06d8\u06d9\u0005p\u0000\u0000\u06d9\u06da\u0003\u0142"+ + "\u00a1\u0000\u06da\u013f\u0001\u0000\u0000\u0000\u06db\u06dc\u0003\u00b4"+ + "Z\u0000\u06dc\u0141\u0001\u0000\u0000\u0000\u06dd\u06de\u0003\u00d2i\u0000"+ + "\u06de\u0143\u0001\u0000\u0000\u0000\u06df\u06e0\u0005\u008c\u0000\u0000"+ + "\u06e0\u06e1\u0003\u00d2i\u0000\u06e1\u0145\u0001\u0000\u0000\u0000\u06e2"+ + "\u06e3\u0005o\u0000\u0000\u06e3\u06e4\u0005p\u0000\u0000\u06e4\u06e5\u0003"+ + "\u0142\u00a1\u0000\u06e5\u0147\u0001\u0000\u0000\u0000\u06e6\u06e7\u0005"+ + "X\u0000\u0000\u06e7\u06e8\u0005o\u0000\u0000\u06e8\u06e9\u0003\u00d2i"+ + "\u0000\u06e9\u06ea\u0005p\u0000\u0000\u06ea\u06eb\u0003\u0142\u00a1\u0000"+ + "\u06eb\u0149\u0001\u0000\u0000\u0000\u06ec\u06f2\u0005Z\u0000\u0000\u06ed"+ + "\u06ee\u0005Z\u0000\u0000\u06ee\u06f2\u0005\u008e\u0000\u0000\u06ef\u06f0"+ + "\u0005\u008e\u0000\u0000\u06f0\u06f2\u0005Z\u0000\u0000\u06f1\u06ec\u0001"+ "\u0000\u0000\u0000\u06f1\u06ed\u0001\u0000\u0000\u0000\u06f1\u06ef\u0001"+ "\u0000\u0000\u0000\u06f2\u06f3\u0001\u0000\u0000\u0000\u06f3\u06f4\u0003"+ "\u0142\u00a1\u0000\u06f4\u014b\u0001\u0000\u0000\u0000\u06f5\u06f6\u0005"+ - "Q\u0000\u0000\u06f6\u06f7\u0003\u014e\u00a7\u0000\u06f7\u014d\u0001\u0000"+ + "R\u0000\u0000\u06f6\u06f7\u0003\u014e\u00a7\u0000\u06f7\u014d\u0001\u0000"+ "\u0000\u0000\u06f8\u06f9\u0003\u0152\u00a9\u0000\u06f9\u06fa\u0003\u0150"+ "\u00a8\u0000\u06fa\u06fd\u0001\u0000\u0000\u0000\u06fb\u06fd\u0003\u0152"+ "\u00a9\u0000\u06fc\u06f8\u0001\u0000\u0000\u0000\u06fc\u06fb\u0001\u0000"+ "\u0000\u0000\u06fd\u014f\u0001\u0000\u0000\u0000\u06fe\u0701\u0003\u0152"+ "\u00a9\u0000\u06ff\u0701\u0003\u00d2i\u0000\u0700\u06fe\u0001\u0000\u0000"+ "\u0000\u0700\u06ff\u0001\u0000\u0000\u0000\u0701\u0151\u0001\u0000\u0000"+ - "\u0000\u0702\u070e\u0005j\u0000\u0000\u0703\u0708\u0003\u00acV\u0000\u0704"+ - "\u0705\u0005q\u0000\u0000\u0705\u0707\u0003\u00acV\u0000\u0706\u0704\u0001"+ + "\u0000\u0702\u070e\u0005k\u0000\u0000\u0703\u0708\u0003\u00acV\u0000\u0704"+ + "\u0705\u0005r\u0000\u0000\u0705\u0707\u0003\u00acV\u0000\u0706\u0704\u0001"+ "\u0000\u0000\u0000\u0707\u070a\u0001\u0000\u0000\u0000\u0708\u0706\u0001"+ "\u0000\u0000\u0000\u0708\u0709\u0001\u0000\u0000\u0000\u0709\u070c\u0001"+ "\u0000\u0000\u0000\u070a\u0708\u0001\u0000\u0000\u0000\u070b\u070d\u0005"+ - "q\u0000\u0000\u070c\u070b\u0001\u0000\u0000\u0000\u070c\u070d\u0001\u0000"+ + "r\u0000\u0000\u070c\u070b\u0001\u0000\u0000\u0000\u070c\u070d\u0001\u0000"+ "\u0000\u0000\u070d\u070f\u0001\u0000\u0000\u0000\u070e\u0703\u0001\u0000"+ "\u0000\u0000\u070e\u070f\u0001\u0000\u0000\u0000\u070f\u0710\u0001\u0000"+ - "\u0000\u0000\u0710\u0711\u0005k\u0000\u0000\u0711\u0153\u0001\u0000\u0000"+ - "\u0000\u0712\u0713\u0003\u0156\u00ab\u0000\u0713\u0714\u0005j\u0000\u0000"+ - "\u0714\u0716\u0003\u00b4Z\u0000\u0715\u0717\u0005q\u0000\u0000\u0716\u0715"+ + "\u0000\u0000\u0710\u0711\u0005l\u0000\u0000\u0711\u0153\u0001\u0000\u0000"+ + "\u0000\u0712\u0713\u0003\u0156\u00ab\u0000\u0713\u0714\u0005k\u0000\u0000"+ + "\u0714\u0716\u0003\u00b4Z\u0000\u0715\u0717\u0005r\u0000\u0000\u0716\u0715"+ "\u0001\u0000\u0000\u0000\u0716\u0717\u0001\u0000\u0000\u0000\u0717\u0718"+ - "\u0001\u0000\u0000\u0000\u0718\u0719\u0005k\u0000\u0000\u0719\u0155\u0001"+ - "\u0000\u0000\u0000\u071a\u0720\u0003\u00d4j\u0000\u071b\u071c\u0005j\u0000"+ - "\u0000\u071c\u071d\u0003\u0156\u00ab\u0000\u071d\u071e\u0005k\u0000\u0000"+ + "\u0001\u0000\u0000\u0000\u0718\u0719\u0005l\u0000\u0000\u0719\u0155\u0001"+ + "\u0000\u0000\u0000\u071a\u0720\u0003\u00d4j\u0000\u071b\u071c\u0005k\u0000"+ + "\u0000\u071c\u071d\u0003\u0156\u00ab\u0000\u071d\u071e\u0005l\u0000\u0000"+ "\u071e\u0720\u0001\u0000\u0000\u0000\u071f\u071a\u0001\u0000\u0000\u0000"+ "\u071f\u071b\u0001\u0000\u0000\u0000\u0720\u0157\u0001\u0000\u0000\u0000"+ "\u0721\u0728\u0003\u015a\u00ad\u0000\u0722\u0728\u0003\u015e\u00af\u0000"+ - "\u0723\u0724\u0005j\u0000\u0000\u0724\u0725\u0003\u00b4Z\u0000\u0725\u0726"+ - "\u0005k\u0000\u0000\u0726\u0728\u0001\u0000\u0000\u0000\u0727\u0721\u0001"+ + "\u0723\u0724\u0005k\u0000\u0000\u0724\u0725\u0003\u00b4Z\u0000\u0725\u0726"+ + "\u0005l\u0000\u0000\u0726\u0728\u0001\u0000\u0000\u0000\u0727\u0721\u0001"+ "\u0000\u0000\u0000\u0727\u0722\u0001\u0000\u0000\u0000\u0727\u0723\u0001"+ "\u0000\u0000\u0000\u0728\u0159\u0001\u0000\u0000\u0000\u0729\u072d\u0003"+ "\u00c2a\u0000\u072a\u072d\u0003\u0162\u00b1\u0000\u072b\u072d\u0003\u00c6"+ "c\u0000\u072c\u0729\u0001\u0000\u0000\u0000\u072c\u072a\u0001\u0000\u0000"+ "\u0000\u072c\u072b\u0001\u0000\u0000\u0000\u072d\u015b\u0001\u0000\u0000"+ "\u0000\u072e\u072f\u0007\u0012\u0000\u0000\u072f\u015d\u0001\u0000\u0000"+ - "\u0000\u0730\u0731\u0005i\u0000\u0000\u0731\u015f\u0001\u0000\u0000\u0000"+ - "\u0732\u0733\u0005i\u0000\u0000\u0733\u0734\u0005t\u0000\u0000\u0734\u0735"+ - "\u0005i\u0000\u0000\u0735\u0161\u0001\u0000\u0000\u0000\u0736\u0737\u0003"+ + "\u0000\u0730\u0731\u0005j\u0000\u0000\u0731\u015f\u0001\u0000\u0000\u0000"+ + "\u0732\u0733\u0005j\u0000\u0000\u0733\u0734\u0005u\u0000\u0000\u0734\u0735"+ + "\u0005j\u0000\u0000\u0735\u0161\u0001\u0000\u0000\u0000\u0736\u0737\u0003"+ "\u00dam\u0000\u0737\u0738\u0003\u0164\u00b2\u0000\u0738\u0163\u0001\u0000"+ - "\u0000\u0000\u0739\u073e\u0005l\u0000\u0000\u073a\u073c\u0003\u0166\u00b3"+ - "\u0000\u073b\u073d\u0005q\u0000\u0000\u073c\u073b\u0001\u0000\u0000\u0000"+ + "\u0000\u0000\u0739\u073e\u0005m\u0000\u0000\u073a\u073c\u0003\u0166\u00b3"+ + "\u0000\u073b\u073d\u0005r\u0000\u0000\u073c\u073b\u0001\u0000\u0000\u0000"+ "\u073c\u073d\u0001\u0000\u0000\u0000\u073d\u073f\u0001\u0000\u0000\u0000"+ "\u073e\u073a\u0001\u0000\u0000\u0000\u073e\u073f\u0001\u0000\u0000\u0000"+ - "\u073f\u0740\u0001\u0000\u0000\u0000\u0740\u0741\u0005m\u0000\u0000\u0741"+ + "\u073f\u0740\u0001\u0000\u0000\u0000\u0740\u0741\u0005n\u0000\u0000\u0741"+ "\u0165\u0001\u0000\u0000\u0000\u0742\u0747\u0003\u0168\u00b4\u0000\u0743"+ - "\u0744\u0005q\u0000\u0000\u0744\u0746\u0003\u0168\u00b4\u0000\u0745\u0743"+ + "\u0744\u0005r\u0000\u0000\u0744\u0746\u0003\u0168\u00b4\u0000\u0745\u0743"+ "\u0001\u0000\u0000\u0000\u0746\u0749\u0001\u0000\u0000\u0000\u0747\u0745"+ "\u0001\u0000\u0000\u0000\u0747\u0748\u0001\u0000\u0000\u0000\u0748\u0167"+ "\u0001\u0000\u0000\u0000\u0749\u0747\u0001\u0000\u0000\u0000\u074a\u074b"+ - "\u0003\u016a\u00b5\u0000\u074b\u074c\u0005s\u0000\u0000\u074c\u074e\u0001"+ + "\u0003\u016a\u00b5\u0000\u074b\u074c\u0005t\u0000\u0000\u074c\u074e\u0001"+ "\u0000\u0000\u0000\u074d\u074a\u0001\u0000\u0000\u0000\u074d\u074e\u0001"+ "\u0000\u0000\u0000\u074e\u074f\u0001\u0000\u0000\u0000\u074f\u0750\u0003"+ "\u016c\u00b6\u0000\u0750\u0169\u0001\u0000\u0000\u0000\u0751\u0754\u0003"+ @@ -14991,37 +14994,37 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0000\u0000\u0753\u0752\u0001\u0000\u0000\u0000\u0754\u016b\u0001\u0000"+ "\u0000\u0000\u0755\u0758\u0003\u00b4Z\u0000\u0756\u0758\u0003\u0164\u00b2"+ "\u0000\u0757\u0755\u0001\u0000\u0000\u0000\u0757\u0756\u0001\u0000\u0000"+ - "\u0000\u0758\u016d\u0001\u0000\u0000\u0000\u0759\u075a\u0005X\u0000\u0000"+ - "\u075a\u0760\u0005l\u0000\u0000\u075b\u075c\u0003`0\u0000\u075c\u075d"+ + "\u0000\u0758\u016d\u0001\u0000\u0000\u0000\u0759\u075a\u0005Y\u0000\u0000"+ + "\u075a\u0760\u0005m\u0000\u0000\u075b\u075c\u0003`0\u0000\u075c\u075d"+ "\u0003\u017e\u00bf\u0000\u075d\u075f\u0001\u0000\u0000\u0000\u075e\u075b"+ "\u0001\u0000\u0000\u0000\u075f\u0762\u0001\u0000\u0000\u0000\u0760\u075e"+ "\u0001\u0000\u0000\u0000\u0760\u0761\u0001\u0000\u0000\u0000\u0761\u0763"+ "\u0001\u0000\u0000\u0000\u0762\u0760\u0001\u0000\u0000\u0000\u0763\u0764"+ - "\u0005m\u0000\u0000\u0764\u016f\u0001\u0000\u0000\u0000\u0765\u0766\u0007"+ + "\u0005n\u0000\u0000\u0764\u016f\u0001\u0000\u0000\u0000\u0765\u0766\u0007"+ "\u0013\u0000\u0000\u0766\u0171\u0001\u0000\u0000\u0000\u0767\u0769\u0005"+ - "\u008b\u0000\u0000\u0768\u0767\u0001\u0000\u0000\u0000\u0768\u0769\u0001"+ + "\u008c\u0000\u0000\u0768\u0767\u0001\u0000\u0000\u0000\u0768\u0769\u0001"+ "\u0000\u0000\u0000\u0769\u076a\u0001\u0000\u0000\u0000\u076a\u076b\u0003"+ "\u013c\u009e\u0000\u076b\u0173\u0001\u0000\u0000\u0000\u076c\u076d\u0005"+ - "n\u0000\u0000\u076d\u076e\u0003\u00b4Z\u0000\u076e\u076f\u0005o\u0000"+ - "\u0000\u076f\u0175\u0001\u0000\u0000\u0000\u0770\u0771\u0005t\u0000\u0000"+ - "\u0771\u0772\u0005j\u0000\u0000\u0772\u0773\u0003\u00d2i\u0000\u0773\u0774"+ - "\u0005k\u0000\u0000\u0774\u0177\u0001\u0000\u0000\u0000\u0775\u0784\u0005"+ - "j\u0000\u0000\u0776\u077d\u0003\u00f6{\u0000\u0777\u077a\u0003\u0156\u00ab"+ - "\u0000\u0778\u0779\u0005q\u0000\u0000\u0779\u077b\u0003\u00f6{\u0000\u077a"+ + "o\u0000\u0000\u076d\u076e\u0003\u00b4Z\u0000\u076e\u076f\u0005p\u0000"+ + "\u0000\u076f\u0175\u0001\u0000\u0000\u0000\u0770\u0771\u0005u\u0000\u0000"+ + "\u0771\u0772\u0005k\u0000\u0000\u0772\u0773\u0003\u00d2i\u0000\u0773\u0774"+ + "\u0005l\u0000\u0000\u0774\u0177\u0001\u0000\u0000\u0000\u0775\u0784\u0005"+ + "k\u0000\u0000\u0776\u077d\u0003\u00f6{\u0000\u0777\u077a\u0003\u0156\u00ab"+ + "\u0000\u0778\u0779\u0005r\u0000\u0000\u0779\u077b\u0003\u00f6{\u0000\u077a"+ "\u0778\u0001\u0000\u0000\u0000\u077a\u077b\u0001\u0000\u0000\u0000\u077b"+ "\u077d\u0001\u0000\u0000\u0000\u077c\u0776\u0001\u0000\u0000\u0000\u077c"+ "\u0777\u0001\u0000\u0000\u0000\u077d\u077f\u0001\u0000\u0000\u0000\u077e"+ - "\u0780\u0005x\u0000\u0000\u077f\u077e\u0001\u0000\u0000\u0000\u077f\u0780"+ + "\u0780\u0005y\u0000\u0000\u077f\u077e\u0001\u0000\u0000\u0000\u077f\u0780"+ "\u0001\u0000\u0000\u0000\u0780\u0782\u0001\u0000\u0000\u0000\u0781\u0783"+ - "\u0005q\u0000\u0000\u0782\u0781\u0001\u0000\u0000\u0000\u0782\u0783\u0001"+ + "\u0005r\u0000\u0000\u0782\u0781\u0001\u0000\u0000\u0000\u0782\u0783\u0001"+ "\u0000\u0000\u0000\u0783\u0785\u0001\u0000\u0000\u0000\u0784\u077c\u0001"+ "\u0000\u0000\u0000\u0784\u0785\u0001\u0000\u0000\u0000\u0785\u0786\u0001"+ - "\u0000\u0000\u0000\u0786\u0787\u0005k\u0000\u0000\u0787\u0179\u0001\u0000"+ - "\u0000\u0000\u0788\u0789\u0003\u0156\u00ab\u0000\u0789\u078a\u0005t\u0000"+ - "\u0000\u078a\u078b\u0005i\u0000\u0000\u078b\u017b\u0001\u0000\u0000\u0000"+ + "\u0000\u0000\u0000\u0786\u0787\u0005l\u0000\u0000\u0787\u0179\u0001\u0000"+ + "\u0000\u0000\u0788\u0789\u0003\u0156\u00ab\u0000\u0789\u078a\u0005u\u0000"+ + "\u0000\u078a\u078b\u0005j\u0000\u0000\u078b\u017b\u0001\u0000\u0000\u0000"+ "\u078c\u078d\u0003\u00d2i\u0000\u078d\u017d\u0001\u0000\u0000\u0000\u078e"+ - "\u0793\u0005r\u0000\u0000\u078f\u0793\u0005\u0000\u0000\u0001\u0790\u0793"+ - "\u0005\u00a3\u0000\u0000\u0791\u0793\u0004\u00bf\u0013\u0000\u0792\u078e"+ + "\u0793\u0005s\u0000\u0000\u078f\u0793\u0005\u0000\u0000\u0001\u0790\u0793"+ + "\u0005\u00a4\u0000\u0000\u0791\u0793\u0004\u00bf\u0013\u0000\u0792\u078e"+ "\u0001\u0000\u0000\u0000\u0792\u078f\u0001\u0000\u0000\u0000\u0792\u0790"+ "\u0001\u0000\u0000\u0000\u0792\u0791\u0001\u0000\u0000\u0000\u0793\u017f"+ "\u0001\u0000\u0000\u0000\u00c9\u018e\u0193\u019a\u01a4\u01aa\u01b0\u01ba"+ diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index 5264a8e22..f4368af9a 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -969,6 +969,8 @@ case class PExplicitGhostStatement(actual: PStatement) extends PGhostStatement w case class PAssert(exp: PExpression) extends PGhostStatement +case class PRefute(exp: PExpression) extends PGhostStatement + case class PAssume(exp: PExpression) extends PGhostStatement case class PExhale(exp: PExpression) extends PGhostStatement diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index 74f2dd9bb..4725284e2 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -284,6 +284,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case statement: PGhostStatement => statement match { case PExplicitGhostStatement(actual) => "ghost" <+> showStmt(actual) case PAssert(exp) => "assert" <+> showExpr(exp) + case PRefute(exp) => "refute" <+> showExpr(exp) case PAssume(exp) => "assume" <+> showExpr(exp) case PExhale(exp) => "exhale" <+> showExpr(exp) case PInhale(exp) => "inhale" <+> showExpr(exp) diff --git a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala index 6404e0453..4b7950e42 100644 --- a/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/internal/PrettyPrinter.scala @@ -341,6 +341,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case Return() => "return" case Assert(ass) => "assert" <+> showAss(ass) + case Refute(ass) => "refute" <+> showAss(ass) case Assume(ass) => "assume" <+> showAss(ass) case Inhale(ass) => "inhale" <+> showAss(ass) case Exhale(ass) => "exhale" <+> showAss(ass) @@ -791,6 +792,7 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter { case Return() => "return" case Assert(ass) => "assert" <+> showAss(ass) + case Refute(ass) => "refute" <+> showAss(ass) case Assume(ass) => "assume" <+> showAss(ass) case Inhale(ass) => "inhale" <+> showAss(ass) case Exhale(ass) => "exhale" <+> showAss(ass) diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index 88e5caaa4..688bd6ec8 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -432,6 +432,7 @@ case class Defer(stmt: Deferrable)(val info: Source.Parser.Info) extends Stmt case class Return()(val info: Source.Parser.Info) extends Stmt case class Assert(ass: Assertion)(val info: Source.Parser.Info) extends Stmt +case class Refute(ass: Assertion)(val info: Source.Parser.Info) extends Stmt case class Assume(ass: Assertion)(val info: Source.Parser.Info) extends Stmt case class Inhale(ass: Assertion)(val info: Source.Parser.Info) extends Stmt case class Exhale(ass: Assertion)(val info: Source.Parser.Info) extends Stmt diff --git a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala index d5d97d8c6..5c39831ca 100644 --- a/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala +++ b/src/main/scala/viper/gobra/ast/internal/transform/OverflowChecksTransform.scala @@ -135,7 +135,7 @@ object OverflowChecksTransform extends InternalTransform { Seqn(genOverflowChecksExprs(Vector(base, idx)) :+ m)(m.info) // explicitly matches remaining statements to detect non-exhaustive pattern matching if a new statement is added - case x@(_: Inhale | _: Exhale | _: Assert | _: Assume + case x@(_: Inhale | _: Exhale | _: Assert | _: Refute | _: Assume | _: Return | _: Fold | _: Unfold | _: PredExprFold | _: PredExprUnfold | _: Outline | _: SafeTypeAssertion | _: SafeReceive | _: Label | _: Initialization | _: PatternMatchStmt) => x diff --git a/src/main/scala/viper/gobra/backend/BackendVerifier.scala b/src/main/scala/viper/gobra/backend/BackendVerifier.scala index 36f536228..873fd7179 100644 --- a/src/main/scala/viper/gobra/backend/BackendVerifier.scala +++ b/src/main/scala/viper/gobra/backend/BackendVerifier.scala @@ -84,17 +84,18 @@ object BackendVerifier { /** * Takes a Viper VerificationResult and converts it to a Gobra Result using the provided backtracking information */ - def convertVerificationResult(result: VerificationResult, backTrackInfo: BackTrackInfo): Result = result match { - case silver.verifier.Success => Success - case failure: silver.verifier.Failure => - val (verificationError, otherError) = failure.errors - .partition(_.isInstanceOf[silver.verifier.VerificationError]) - .asInstanceOf[(Seq[silver.verifier.VerificationError], Seq[silver.verifier.AbstractError])] + def convertVerificationResult(result: VerificationResult, backTrackInfo: BackTrackInfo): Result = + result match { + case silver.verifier.Success => Success + case failure: silver.verifier.Failure => + val (verificationError, otherError) = failure.errors + .partition(_.isInstanceOf[silver.verifier.VerificationError]) + .asInstanceOf[(Seq[silver.verifier.VerificationError], Seq[silver.verifier.AbstractError])] - checkAbstractViperErrors(otherError) + checkAbstractViperErrors(otherError) - Failure(verificationError.toVector, backTrackInfo) - } + Failure(verificationError.toVector, backTrackInfo) + } @scala.annotation.elidable(scala.annotation.elidable.ASSERTION) private def checkAbstractViperErrors(errors: Seq[silver.verifier.AbstractError]): Unit = { diff --git a/src/main/scala/viper/gobra/backend/Carbon.scala b/src/main/scala/viper/gobra/backend/Carbon.scala index 8c711baa3..fec619be4 100644 --- a/src/main/scala/viper/gobra/backend/Carbon.scala +++ b/src/main/scala/viper/gobra/backend/Carbon.scala @@ -7,6 +7,7 @@ package viper.gobra.backend import viper.carbon +import viper.carbon.CarbonFrontendAPI import viper.gobra.util.GobraExecutionContext import viper.silver.ast.Program import viper.silver.reporter._ @@ -20,19 +21,18 @@ class Carbon(commandLineArguments: Seq[String]) extends ViperVerifier { // directly declaring the parameter implicit somehow does not work as the compiler is unable to spot the inheritance implicit val _executor: GobraExecutionContext = executor Future { - val backend: carbon.CarbonVerifier = carbon.CarbonVerifier(reporter, List("startedBy" -> s"Unit test ${this.getClass.getSimpleName}")) - backend.parseCommandLine(commandLineArguments ++ Seq("--ignoreFile", "dummy.sil")) + val carbonApi: carbon.CarbonFrontendAPI = new CarbonFrontendAPI(reporter) val startTime = System.currentTimeMillis() - backend.start() - val result = backend.verify(program) - backend.stop() + carbonApi.initialize(commandLineArguments ++ Seq("--ignoreFile", "dummy.sil")) + val result = carbonApi.verify(program) + carbonApi.stop() result match { case Success => - reporter report OverallSuccessMessage(backend.name, System.currentTimeMillis() - startTime) + reporter report OverallSuccessMessage(carbonApi.verifier.name, System.currentTimeMillis() - startTime) case f@Failure(_) => - reporter report OverallFailureMessage(backend.name, System.currentTimeMillis() - startTime, f) + reporter report OverallFailureMessage(carbonApi.verifier.name, System.currentTimeMillis() - startTime, f) } result diff --git a/src/main/scala/viper/gobra/backend/Silicon.scala b/src/main/scala/viper/gobra/backend/Silicon.scala index 5440be1c0..7c3c68ead 100644 --- a/src/main/scala/viper/gobra/backend/Silicon.scala +++ b/src/main/scala/viper/gobra/backend/Silicon.scala @@ -19,19 +19,19 @@ class Silicon(commandLineArguments: Seq[String]) extends ViperVerifier { // directly declaring the parameter implicit somehow does not work as the compiler is unable to spot the inheritance implicit val _executor: GobraExecutionContext = executor Future { - val backend: silicon.Silicon = silicon.Silicon.fromPartialCommandLineArguments(commandLineArguments, reporter) + val siliconApi: silicon.SiliconFrontendAPI = new silicon.SiliconFrontendAPI(reporter) val startTime = System.currentTimeMillis() try { - backend.start() - val result = backend.verify(program) - backend.stop() + siliconApi.initialize(commandLineArguments) + val result = siliconApi.verify(program) + siliconApi.stop() result match { case Success => - reporter report OverallSuccessMessage(backend.name, System.currentTimeMillis() - startTime) + reporter report OverallSuccessMessage(siliconApi.verifier.name, System.currentTimeMillis() - startTime) case f@Failure(_) => - reporter report OverallFailureMessage(backend.name, System.currentTimeMillis() - startTime, f) + reporter report OverallFailureMessage(siliconApi.verifier.name, System.currentTimeMillis() - startTime, f) } result diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 0c5808975..5f8dd2cfc 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -4069,6 +4069,7 @@ object Desugar extends LazyLogging { stmt match { case PAssert(exp) => for {e <- goA(exp)} yield in.Assert(e)(src) + case PRefute(exp) => for {e <- goA(exp)} yield in.Refute(e)(src) case PAssume(exp) => for {e <- goA(exp)} yield in.Assume(e)(src) case PInhale(exp) => for {e <- goA(exp)} yield in.Inhale(e)(src) case PExhale(exp) => for {e <- goA(exp)} yield in.Exhale(e)(src) diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 628d681de..fe69309fa 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -2187,6 +2187,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole override def visitProofStatement(ctx: ProofStatementContext): PGhostStatement = super.visitProofStatement(ctx) match { case Vector(kind : String, expr : PExpression) => kind match { case "assert" => PAssert(expr) + case "refute" => PRefute(expr) case "assume" => PAssume(expr) case "inhale" => PInhale(expr) case "exhale" => PExhale(expr) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala index 70e0d7deb..22ebfe0c8 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala @@ -382,7 +382,7 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl => def validStatements(stmts: Vector[PStatement]): PropertyResult = PropertyResult.bigAnd(stmts.map { - case _: PUnfold | _: PFold | _: PAssert | _: PEmptyStmt => successProp + case _: PUnfold | _: PFold | _: PAssert | _: PRefute | _: PEmptyStmt => successProp case _: PAssume | _: PInhale | _: PExhale => failedProp("Assume, inhale, and exhale are forbidden in implementation proofs") case b: PBlock => validStatements(b.nonEmptyStmts) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala index 995936ef6..be6569263 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala @@ -17,6 +17,7 @@ trait GhostStmtTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def wellDefGhostStmt(stmt: PGhostStatement): Messages = stmt match { case n@PExplicitGhostStatement(s) => error(n, "ghost error: expected ghostifiable statement", !s.isInstanceOf[PGhostifiableStatement]) case PAssert(exp) => assignableToSpec(exp) + case PRefute(exp) => assignableToSpec(exp) case PExhale(exp) => assignableToSpec(exp) case PAssume(exp) => assignableToSpec(exp) ++ isPureExpr(exp) case PInhale(exp) => assignableToSpec(exp) diff --git a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala index 96da68382..ae4ccc88b 100644 --- a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala +++ b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala @@ -12,6 +12,7 @@ import viper.silver import viper.silver.ast.Not import viper.silver.verifier.{AbstractVerificationError, errors => vprerr, reasons => vprrea} import viper.silver.plugin.standard.termination +import viper.silver.plugin.standard.{refute => vprrefute} object DefaultErrorBackTranslator { @@ -19,7 +20,9 @@ object DefaultErrorBackTranslator { viperError: viper.silver.verifier.VerificationError, transformer: BackTranslator.ErrorTransformer ): VerificationError = { - val gobraError = transformer.lift.apply(viperError).getOrElse{ UncaughtError(viperError) } + val gobraError = transformer.lift.apply(viperError).getOrElse { + UncaughtError(viperError) + } if (viperError.cached) gobraError.cached = true gobraError } @@ -28,7 +31,9 @@ object DefaultErrorBackTranslator { viperReason: silver.verifier.ErrorReason, transformer: BackTranslator.ReasonTransformer ): VerificationErrorReason = { - transformer.lift.apply(viperReason).getOrElse{ UncaughtReason(viperReason) } + transformer.lift.apply(viperReason).getOrElse { + UncaughtReason(viperReason) + } } def defaultTranslate(viperReason: silver.verifier.ErrorReason): VerificationErrorReason = @@ -40,6 +45,8 @@ object DefaultErrorBackTranslator { InsufficientPermissionError(info) case vprrea.AssertionFalse(CertainSource(info)) => AssertionFalseError(info) + case vprrefute.RefutationTrue(CertainSource(info)) => + RefutationTrueError(info) case vprrea.AssertionFalse(CertainSynthesized(info)) => SynthesizedAssertionFalseReason(info) case vprrea.SeqIndexExceedsLength(CertainSource(node), CertainSource(index)) => @@ -122,6 +129,8 @@ class DefaultErrorBackTranslator( ForLoopError(info) dueTo translate(reason) case vprerr.AssertFailed(CertainSource(info), reason, _) => AssertError(info) dueTo translate(reason) + case vprrefute.RefuteFailed(CertainSource(info), reason, _) => + RefuteError(info) dueTo translate(reason) case vprerr.PostconditionViolated(CertainSource(info), _, reason, _) => PostconditionError(info) dueTo translate(reason) case vprerr.FoldFailed(CertainSource(info), reason, _) => @@ -153,35 +162,35 @@ class DefaultErrorBackTranslator( IfError(info) dueTo translate(reason) case vprerr.IfFailed(CertainSource(info), reason, _) => IfError(info) dueTo translate(reason) - case termination.FunctionTerminationError(Source(info) , reason, _) => - FunctionTerminationError(info) dueTo translate(reason) - case termination.MethodTerminationError(Source(info), reason, _) => - MethodTerminationError(info) dueTo translate(reason) - case termination.LoopTerminationError(Source(info), reason, _) => - LoopTerminationError(info) dueTo translate(reason) + case termination.FunctionTerminationError(Source(info), reason, _) => + FunctionTerminationError(info) dueTo translate(reason) + case termination.MethodTerminationError(Source(info), reason, _) => + MethodTerminationError(info) dueTo translate(reason) + case termination.LoopTerminationError(Source(info), reason, _) => + LoopTerminationError(info) dueTo translate(reason) } val transformAnnotatedError: VerificationError => VerificationError = x => x.info match { case _ / (an: OverwriteErrorAnnotation) => an(x) case _ / OverflowCheckAnnotation => - x.reasons.foldLeft(OverflowError(x.info): VerificationError){ case (err, reason) => err dueTo reason } + x.reasons.foldLeft(OverflowError(x.info): VerificationError) { case (err, reason) => err dueTo reason } case _ / AutoImplProofAnnotation(subT, superT) => GeneratedImplementationProofError(subT, superT, x) case _ / MainPreNotEstablished => - x.reasons.foldLeft(MainPreconditionNotEstablished(x.info): VerificationError){ + x.reasons.foldLeft(MainPreconditionNotEstablished(x.info): VerificationError) { case (err, reason) => err dueTo reason } case _ / ImportPreNotEstablished => - x.reasons.foldLeft(ImportPreconditionNotEstablished(x.info): VerificationError){ + x.reasons.foldLeft(ImportPreconditionNotEstablished(x.info): VerificationError) { case (err, reason) => err dueTo reason } case _ / InsufficientPermissionToRangeExpressionAnnotation() => - x.reasons.foldLeft(InsufficientPermissionToRangeExpressionError(x.info): VerificationError){ case (err, reason) => err dueTo reason } + x.reasons.foldLeft(InsufficientPermissionToRangeExpressionError(x.info): VerificationError) { case (err, reason) => err dueTo reason } case _ / LoopInvariantNotEstablishedAnnotation => x.reasons.foldLeft(LoopInvariantEstablishmentError(x.info): VerificationError) { case (err, reason) => err dueTo reason } @@ -192,11 +201,11 @@ class DefaultErrorBackTranslator( errorMapper.andThen(transformAnnotatedError) } - private val errorTransformer = backtrack.errorT.foldRight(defaultErrorTransformer){ + private val errorTransformer = backtrack.errorT.foldRight(defaultErrorTransformer) { case (l, r) => l orElse r } - private val reasonTransformer = backtrack.reasonT.foldRight(DefaultErrorBackTranslator.defaultReasonTransformer){ + private val reasonTransformer = backtrack.reasonT.foldRight(DefaultErrorBackTranslator.defaultReasonTransformer) { case (l, r) => l orElse r } diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala index 067334e5e..b7e986dc6 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierError.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala @@ -11,7 +11,7 @@ import viper.gobra.ast.frontend.{PReceive, PSendStmt} import viper.gobra.reporting.Source.Verifier import viper.gobra.util.Constants import viper.gobra.util.Violation.violation -import viper.silver.ast.SourcePosition +import viper.silver.ast.{SourcePosition} sealed trait VerifierError { def position: Option[SourcePosition] @@ -181,6 +181,13 @@ case class AssertError(info: Source.Verifier.Info) extends VerificationError { override def localMessage: String = "Assert might fail" } +case class RefuteError(info: Source.Verifier.Info) extends VerificationError { + + override def localId: String = "refute_error" + + override def localMessage: String = "Refute statement failed. Assertion is either unreachable or it always holds." +} + case class ExhaleError(info: Source.Verifier.Info) extends VerificationError { override def localId: String = "exhale_error" override def localMessage: String = "Exhale might fail" @@ -396,6 +403,13 @@ case class AssertionFalseError(info: Source.Verifier.Info) extends VerificationE override def message: String = s"Assertion ${info.origin.tag.trim} might not hold." } +case class RefutationTrueError(info: Source.Verifier.Info) extends VerificationErrorReason { + + override def id: String = "refutation_true_error" + + override def message: String = s"Assertion ${info.origin.tag.trim} definitely holds." +} + case class SeqIndexExceedsLengthError(node: Source.Verifier.Info, index: Source.Verifier.Info) extends VerificationErrorReason { override def id: String = "seq_index_exceeds_length_error" override def message: String = s"Index ${index.origin.tag.trim} into ${node.origin.tag.trim} might exceed sequence length." diff --git a/src/main/scala/viper/gobra/translator/Translator.scala b/src/main/scala/viper/gobra/translator/Translator.scala index 63334f790..cb20b5d9a 100644 --- a/src/main/scala/viper/gobra/translator/Translator.scala +++ b/src/main/scala/viper/gobra/translator/Translator.scala @@ -13,7 +13,7 @@ import viper.gobra.frontend.{Config, PackageInfo} import viper.gobra.reporting.{ConsistencyError, GeneratedViperMessage, TransformerFailureMessage, VerifierError} import viper.gobra.translator.context.DfltTranslatorConfig import viper.gobra.translator.encodings.programs.ProgramsImpl -import viper.gobra.translator.transformers.{AssumeTransformer, TerminationTransformer, ViperTransformer} +import viper.gobra.translator.transformers.{AssumeTransformer, TerminationDomainTransformer, ViperTransformer} import viper.gobra.util.Violation import viper.silver.ast.{AbstractSourcePosition, SourcePosition} import viper.silver.ast.pretty.FastPrettyPrinter @@ -38,7 +38,7 @@ object Translator { val transformers: Seq[ViperTransformer] = Seq( new AssumeTransformer, - new TerminationTransformer + new TerminationDomainTransformer ) val transformedTask = transformers.foldLeft[Either[Vector[VerifierError], BackendVerifier.Task]](Right(task)) { diff --git a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureEncoding.scala index 31e0047a7..67f37fa6c 100644 --- a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureEncoding.scala @@ -9,7 +9,7 @@ package viper.gobra.translator.encodings.closures import org.bitbucket.inkytonik.kiama.==> import viper.gobra.ast.{internal => in} import viper.gobra.reporting -import viper.gobra.reporting.BackTranslator.ErrorTransformer +import viper.gobra.reporting.BackTranslator.{ErrorTransformer, RichErrorMessage} import viper.gobra.reporting.Source import viper.gobra.theory.Addressability import viper.gobra.theory.Addressability.{Exclusive, Shared} @@ -137,6 +137,7 @@ class ClosureEncoding extends LeafTypeEncoding { * inhale closureImplements$[spec]([closure], [params]) */ private def specImplementationProof(proof: in.SpecImplementationProof)(ctx: Context): CodeWriter[vpr.Stmt] = { + val (exhalePos, _, _) = proof.vprMeta val inhalePres = cl.seqns(proof.pres map (a => for { ass <- ctx.assertion(a) } yield vpr.Inhale(ass)())) @@ -145,11 +146,10 @@ class ClosureEncoding extends LeafTypeEncoding { rest <- acc ass <- ctx.assertion (a) } yield vpr.And(rest, ass) ()) - } yield vpr.Exhale(assertions)() + } yield vpr.Exhale(assertions)(exhalePos) - def isSubnode(sub: vpr.Node, n: vpr.Node): Boolean = (sub eq n) || n.subnodes.exists(n => isSubnode(sub, n)) def failedExhale: ErrorTransformer = { - case errors.ExhaleFailed(offendingNode, reason, _) if isSubnode(offendingNode, exhalePosts.res) => + case e@errors.ExhaleFailed(_, reason, _) if e causedBy exhalePosts.res => val info = proof.vprMeta._2.asInstanceOf[Source.Verifier.Info] reason match { case reason: reasons.AssertionFalse => reporting.SpecImplementationPostconditionError(info, proof.spec.info.tag) diff --git a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala index 611748049..4a94e9d59 100644 --- a/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala +++ b/src/main/scala/viper/gobra/translator/encodings/closures/ClosureSpecsEncoder.scala @@ -8,7 +8,7 @@ package viper.gobra.translator.encodings.closures import viper.gobra.ast.internal.FunctionLikeMemberOrLit import viper.gobra.ast.{internal => in} -import viper.gobra.reporting.BackTranslator.ErrorTransformer +import viper.gobra.reporting.BackTranslator.{ErrorTransformer, RichErrorMessage} import viper.gobra.reporting.{GoCallPreconditionReason, PreconditionError, Source, SpecNotImplementedByClosure} import viper.gobra.theory.Addressability import viper.gobra.translator.Names @@ -313,10 +313,10 @@ protected class ClosureSpecsEncoder { } private var implementAssertionSpecOriginToStr: Map[Source.AbstractOrigin, String] = Map.empty - private def doesNotImplementSpecErr(callNode: vpr.Node, closureStr: String): ErrorTransformer = { - case vprerr.PreconditionInCallFalse(node@Source(info), reasons.AssertionFalse(Source(assInfo)), _) if (callNode eq node) && implementAssertionSpecOriginToStr.contains(assInfo.origin) => + private def doesNotImplementSpecErr(callNode: vpr.Node with vpr.Positioned, closureStr: String): ErrorTransformer = { + case e@vprerr.PreconditionInCallFalse(Source(info), reasons.AssertionFalse(Source(assInfo)), _) if (e causedBy callNode) && implementAssertionSpecOriginToStr.contains(assInfo.origin) => PreconditionError(info).dueTo(SpecNotImplementedByClosure(info, closureStr, implementAssertionSpecOriginToStr(assInfo.origin))) - case vprerr.PreconditionInAppFalse(node@Source(info), reasons.AssertionFalse(Source(assInfo)), _) if (callNode eq node) && implementAssertionSpecOriginToStr.contains(assInfo.origin) => + case e@vprerr.PreconditionInAppFalse(Source(info), reasons.AssertionFalse(Source(assInfo)), _) if (e causedBy callNode) && implementAssertionSpecOriginToStr.contains(assInfo.origin) => PreconditionError(info).dueTo(SpecNotImplementedByClosure(info, closureStr, implementAssertionSpecOriginToStr(assInfo.origin))) } diff --git a/src/main/scala/viper/gobra/translator/encodings/closures/MethodObjectEncoder.scala b/src/main/scala/viper/gobra/translator/encodings/closures/MethodObjectEncoder.scala index d5d368920..a4a0e7d9b 100644 --- a/src/main/scala/viper/gobra/translator/encodings/closures/MethodObjectEncoder.scala +++ b/src/main/scala/viper/gobra/translator/encodings/closures/MethodObjectEncoder.scala @@ -7,7 +7,7 @@ package viper.gobra.translator.encodings.closures import viper.gobra.ast.{internal => in} -import viper.gobra.reporting.BackTranslator.ErrorTransformer +import viper.gobra.reporting.BackTranslator.{ErrorTransformer, RichErrorMessage} import viper.gobra.reporting.{InterfaceReceiverIsNilReason, MethodObjectGetterPreconditionError, Source} import viper.gobra.translator.Names import viper.gobra.translator.context.Context @@ -102,7 +102,7 @@ class MethodObjectEncoder(domain: ClosureDomainEncoder) { in.MethodProxy(s"${Names.closureGetter}$$${meth.name}", s"${Names.closureGetter}$$${meth.uniqueName}")(meth.info) private def receiverNilErr(m: in.MethodObject, call: vpr.Exp): ErrorTransformer = { - case vprerr.PreconditionInAppFalse(offendingNode, _, _) if call eq offendingNode => + case e@vprerr.PreconditionInAppFalse(_, _, _) if e causedBy call=> val info = m.vprMeta._2.asInstanceOf[Source.Verifier.Info] val recvInfo = m.recv.vprMeta._2.asInstanceOf[Source.Verifier.Info] MethodObjectGetterPreconditionError(info).dueTo(InterfaceReceiverIsNilReason(recvInfo)) diff --git a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala index 6d30f79e2..dbbdb4e2d 100644 --- a/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala +++ b/src/main/scala/viper/gobra/translator/encodings/typeless/AssertionEncoding.scala @@ -14,6 +14,7 @@ import viper.gobra.translator.util.ViperWriter.CodeWriter import viper.gobra.util.Violation import viper.gobra.translator.util.{ViperUtil => vu} import viper.silver.{ast => vpr} +import viper.silver.plugin.standard.{refute => vprrefute} class AssertionEncoding extends Encoding { @@ -90,6 +91,7 @@ class AssertionEncoding extends Encoding { override def statement(ctx: Context): in.Stmt ==> CodeWriter[vpr.Stmt] = { case n@ in.Assert(ass) => for {v <- ctx.assertion(ass)} yield withSrc(vpr.Assert(v), n) + case n@ in.Refute(ass) => for {v <- ctx.assertion(ass)} yield withSrc(vprrefute.Refute(v), n) case n@ in.Assume(ass) => for {v <- ctx.assertion(ass)} yield withSrc(vpr.Assume(v), n) // Assumes are later rewritten case n@ in.Inhale(ass) => for {v <- ctx.assertion(ass)} yield withSrc(vpr.Inhale(v), n) case n@ in.Exhale(ass) => for {v <- ctx.assertion(ass)} yield withSrc(vpr.Exhale(v), n) diff --git a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala b/src/main/scala/viper/gobra/translator/transformers/TerminationDomainTransformer.scala similarity index 80% rename from src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala rename to src/main/scala/viper/gobra/translator/transformers/TerminationDomainTransformer.scala index 3c57baefc..c4fa13e08 100644 --- a/src/main/scala/viper/gobra/translator/transformers/TerminationTransformer.scala +++ b/src/main/scala/viper/gobra/translator/transformers/TerminationDomainTransformer.scala @@ -18,16 +18,12 @@ import viper.silver.reporter.{NoopReporter, Reporter} import viper.silver.plugin.standard.predicateinstance.PredicateInstancePlugin import viper.silver.verifier.AbstractError -class TerminationTransformer extends ViperTransformer { +// This class should be removed in the future because Viper already implements inference of +// imports for termination domains. However, at the moment, Viper performs the inference in +// `beforeVerify`, which is already too late. +class TerminationDomainTransformer extends ViperTransformer { override def transform(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = { - for { - progWithDecreasesDomains <- addDecreasesDomains(task) - transformedProg <- executeTerminationPlugin(progWithDecreasesDomains) - } yield transformedProg - } - - private def addDecreasesDomains(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = { // constructs a separate Viper program (as a string) that should be parsed // after parsing this separate Viper program, the resulting AST is combined with `task` @@ -59,8 +55,8 @@ class TerminationTransformer extends ViperTransformer { // we need at least `declarationImport` if there is any tuple decreases measure. However, we do not need to import // this file if we already import any other file with the domain for a particular type val imports = if (importsForMeasureTypes.nonEmpty) importsForMeasureTypes - else if (containsTerminationChecks) Seq(declarationImport) - else Seq.empty + else if (containsTerminationChecks) Seq(declarationImport) + else Seq.empty // if `allImport` is in the list of files that should be imported, we can ignore all others and instead only import // `allImport` val importsAll = imports.contains(allImport) @@ -95,25 +91,6 @@ class TerminationTransformer extends ViperTransformer { task.copy(program = newProg) } - private def executeTerminationPlugin(task: BackendVerifier.Task): Either[Seq[AbstractError], BackendVerifier.Task] = { - def applyPlugin(plugin: SilverPlugin, prog : vpr.Program): Either[Seq[AbstractError], vpr.Program] = { - val transformedProgram = plugin.beforeVerify(prog) - if (plugin.errors.isEmpty) { - Right(transformedProgram) - } else { - Left(plugin.errors) - } - } - - val terminationPlugin = new TerminationPlugin(null, null, null, null) - val predInstancePlugin = new PredicateInstancePlugin(null, null, null, null) - - for { - transformedProgram <- applyPlugin(terminationPlugin, task.program) - programWithoutPredicateInstances <- applyPlugin(predInstancePlugin, transformedProgram) - } yield task.copy(program = programWithoutPredicateInstances) - } - /** * Viper AST provider taking an in-memory Viper program (as a string) as input instead of reading it from a file. */ diff --git a/src/test/resources/regressions/features/refute/refute-fail-01.gobra b/src/test/resources/regressions/features/refute/refute-fail-01.gobra new file mode 100644 index 000000000..12c146b59 --- /dev/null +++ b/src/test/resources/regressions/features/refute/refute-fail-01.gobra @@ -0,0 +1,24 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package refutation + +func f() { + //:: ExpectedOutput(type_error) + refute 3 +} + +func g() { + x@ := 0 + //:: ExpectedOutput(type_error) + refute &x +} + +func nonPureFunc() bool { + return true +} + +func h() { + //:: ExpectedOutput(type_error) + refute nonPureFunc() +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/refute/refute-fail-02.gobra b/src/test/resources/regressions/features/refute/refute-fail-02.gobra new file mode 100644 index 000000000..31a41d7ad --- /dev/null +++ b/src/test/resources/regressions/features/refute/refute-fail-02.gobra @@ -0,0 +1,40 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package refutation + +func f() { + //:: ExpectedOutput(refute_error:refutation_true_error) + refute true +} + +func g() { + assume false + //:: ExpectedOutput(refute_error:refutation_true_error) + refute false +} + +requires x > 0 +func h(x int) { + //:: ExpectedOutput(refute_error:refutation_true_error) + refute x > 0 +} + +requires acc(x) +func i(x *int) { + //:: ExpectedOutput(refute_error:refutation_true_error) + refute acc(x) +} + +ensures res == x + 1 +pure +func inc(x int) (res int) { + return x + 1 +} + +func clientInc() { + x := 0 + y := inc(x) + //:: ExpectedOutput(refute_error:refutation_true_error) + refute y == 1 +} \ No newline at end of file diff --git a/src/test/resources/regressions/features/refute/refute-simple-01.gobra b/src/test/resources/regressions/features/refute/refute-simple-01.gobra new file mode 100644 index 000000000..dabab3ffc --- /dev/null +++ b/src/test/resources/regressions/features/refute/refute-simple-01.gobra @@ -0,0 +1,50 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package refutation + +func f() { + refute false +} + +requires x > 0 +func g(x int) { + refute x < 0 +} + +func h(x *int) { + refute acc(x) +} + +func i(cond bool) { + x := 0 + + if (cond) { + x := 1 + } + + refute x == 1 +} + +decreases +pure +func falseFunc() bool { + return false +} + +func clientFalseFunc() { + refute falseFunc() +} + +ensures res == x + 1 +decreases +pure +func inc(x int) (res int) { + return x + 1 +} + +func clientInc() { + x := 0 + y := inc(x) + refute y != 1 +} \ No newline at end of file